Skip to content

Commit 9a1d0af

Browse files
committed
[USDA parser] Fix parsing variantSet statement when it contains comments line.
[tusdcat] Fix composition logic.
1 parent 47fe53c commit 9a1d0af

File tree

3 files changed

+88
-49
lines changed

3 files changed

+88
-49
lines changed

examples/tusdcat/main.cc

+51-47
Original file line numberDiff line numberDiff line change
@@ -197,14 +197,15 @@ int main(int argc, char **argv) {
197197
}
198198

199199
// TODO: Find more better way to Recursively resolve references/payload/variants
200-
bool all_resolved = true;
201200
for (int i = 0; i < kMaxIteration; i++) {
202201

202+
bool has_unresolved = false;
203+
203204
if (comp_features.references) {
204205
if (!src_layer.check_unresolved_references()) {
205-
all_resolved = true;
206+
std::cout << "# iter " << i << ": no unresolved references.\n";
206207
} else {
207-
all_resolved = false;
208+
has_unresolved = true;
208209

209210
tinyusdz::Layer composited_layer;
210211
if (!tinyusdz::CompositeReferences(resolver, src_layer, &composited_layer, &warn, &err)) {
@@ -225,79 +226,82 @@ int main(int argc, char **argv) {
225226

226227
if (comp_features.payload) {
227228
if (!src_layer.check_unresolved_payload()) {
228-
all_resolved = true;
229+
std::cout << "# iter " << i << ": no unresolved payload.\n";
229230
} else {
230-
all_resolved = false;
231-
}
231+
has_unresolved = true;
232232

233-
tinyusdz::Layer composited_layer;
234-
if (!tinyusdz::CompositePayload(resolver, src_layer, &composited_layer, &warn, &err)) {
235-
std::cerr << "Failed to composite `payload`: " << err << "\n";
236-
return -1;
237-
}
233+
tinyusdz::Layer composited_layer;
234+
if (!tinyusdz::CompositePayload(resolver, src_layer, &composited_layer, &warn, &err)) {
235+
std::cerr << "Failed to composite `payload`: " << err << "\n";
236+
return -1;
237+
}
238238

239-
if (warn.size()) {
240-
std::cout << "WARN: " << warn << "\n";
241-
}
239+
if (warn.size()) {
240+
std::cout << "WARN: " << warn << "\n";
241+
}
242242

243-
std::cout << "# `payload` composited\n";
244-
std::cout << composited_layer << "\n";
243+
std::cout << "# `payload` composited\n";
244+
std::cout << composited_layer << "\n";
245245

246-
src_layer = std::move(composited_layer);
246+
src_layer = std::move(composited_layer);
247+
}
247248
}
248249

249250
if (comp_features.inherits) {
250251
if (!src_layer.check_unresolved_inherits()) {
251-
all_resolved = true;
252+
std::cout << "# iter " << i << ": no unresolved inherits.\n";
252253
} else {
253-
all_resolved = false;
254-
}
254+
has_unresolved = true;
255255

256-
tinyusdz::Layer composited_layer;
257-
if (!tinyusdz::CompositeInherits(src_layer, &composited_layer, &warn, &err)) {
258-
std::cerr << "Failed to composite `inherits`: " << err << "\n";
259-
return -1;
260-
}
256+
tinyusdz::Layer composited_layer;
257+
if (!tinyusdz::CompositeInherits(src_layer, &composited_layer, &warn, &err)) {
258+
std::cerr << "Failed to composite `inherits`: " << err << "\n";
259+
return -1;
260+
}
261261

262-
if (warn.size()) {
263-
std::cout << "WARN: " << warn << "\n";
264-
}
262+
if (warn.size()) {
263+
std::cout << "WARN: " << warn << "\n";
264+
}
265265

266-
std::cout << "# `inherits` composited\n";
267-
std::cout << composited_layer << "\n";
266+
std::cout << "# `inherits` composited\n";
267+
std::cout << composited_layer << "\n";
268268

269-
src_layer = std::move(composited_layer);
269+
src_layer = std::move(composited_layer);
270+
}
270271
}
271272

272273
if (comp_features.variantSets) {
273274
if (!src_layer.check_unresolved_variant()) {
274-
all_resolved = true;
275+
std::cout << "# iter " << i << ": no unresolved variant.\n";
275276
} else {
276-
all_resolved = false;
277-
}
277+
has_unresolved = true;
278278

279-
tinyusdz::Layer composited_layer;
280-
if (!tinyusdz::CompositeVariant(src_layer, &composited_layer, &warn, &err)) {
281-
std::cerr << "Failed to composite `variantSet`: " << err << "\n";
282-
return -1;
283-
}
279+
tinyusdz::Layer composited_layer;
280+
if (!tinyusdz::CompositeVariant(src_layer, &composited_layer, &warn, &err)) {
281+
std::cerr << "Failed to composite `variantSet`: " << err << "\n";
282+
return -1;
283+
}
284284

285-
if (warn.size()) {
286-
std::cout << "WARN: " << warn << "\n";
287-
}
285+
if (warn.size()) {
286+
std::cout << "WARN: " << warn << "\n";
287+
}
288288

289-
std::cout << "# `variantSet` composited\n";
290-
std::cout << composited_layer << "\n";
289+
std::cout << "# `variantSet` composited\n";
290+
std::cout << composited_layer << "\n";
291291

292-
src_layer = std::move(composited_layer);
292+
src_layer = std::move(composited_layer);
293+
}
293294
}
294295

295296
// TODO
296297
// - [ ] specializes
297298
// - [ ] `class` Prim?
298299

299-
if (all_resolved) {
300-
std::cout << "# of composition resolve iteration: " << (i + 1) << "\n";
300+
std::cout << "# has_unresolved_references: " << src_layer.check_unresolved_references() << "\n";
301+
std::cout << "# all resolved? " << !has_unresolved << "\n";
302+
303+
if (!has_unresolved) {
304+
std::cout << "# of composition iteration to resolve fully: " << (i + 1) << "\n";
301305
break;
302306
}
303307
}

src/ascii-parser.cc

+6-2
Original file line numberDiff line numberDiff line change
@@ -4336,6 +4336,10 @@ bool AsciiParser::ParseVariantSet(const int64_t primIdx,
43364336
Rewind(1);
43374337
}
43384338

4339+
if (!SkipCommentAndWhitespaceAndNewline()) {
4340+
return false;
4341+
}
4342+
43394343
// string
43404344
std::string variantName;
43414345
if (!ReadBasicType(&variantName)) {
@@ -4440,12 +4444,12 @@ bool AsciiParser::ParseVariantSet(const int64_t primIdx,
44404444
DCOUT(fmt::format("Done parse ParsePrimProps."));
44414445
}
44424446

4443-
if (!SkipWhitespaceAndNewline()) {
4447+
if (!SkipCommentAndWhitespaceAndNewline()) {
44444448
return false;
44454449
}
44464450
}
44474451

4448-
if (!SkipWhitespaceAndNewline()) {
4452+
if (!SkipCommentAndWhitespaceAndNewline()) {
44494453
return false;
44504454
}
44514455

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
#usda 1.0
2+
(
3+
defaultPrim = "isCoral"
4+
metersPerUnit = 0.0254
5+
upAxis = "Y"
6+
)
7+
8+
def Xform "isCoral"
9+
{
10+
def Xform "geometry" (
11+
variants = {
12+
string model = "isCoral"
13+
}
14+
prepend variantSets = "model"
15+
)
16+
{
17+
variantSet "model" = {
18+
"isCoral" (
19+
kind = "component"
20+
#prepend payload = @./isCoral.usd@</isCoral>
21+
) {
22+
string geomname = "./isCoral.usd"
23+
24+
}
25+
#"isCoral1" (
26+
# kind = "component"
27+
# prepend payload = @./isCoral1.usd@</isCoral1>
28+
#) {
29+
}
30+
}
31+
}

0 commit comments

Comments
 (0)