@@ -130,6 +130,7 @@ bool IsBuiltinFileFormat(const std::string &name) {
130
130
131
131
// TODO: support loading non-USD asset
132
132
bool LoadAsset (AssetResolutionResolver &resolver,
133
+ const std::vector<std::string> &search_paths,
133
134
const std::map<std::string, FileFormatHandler> &fileformats,
134
135
const value::AssetPath &assetPath, const Path &primPath,
135
136
Layer *dst_layer, const PrimSpec **dst_primspec_root,
@@ -169,11 +170,16 @@ bool LoadAsset(AssetResolutionResolver &resolver,
169
170
}
170
171
}
171
172
173
+ resolver.set_search_paths (search_paths);
174
+
175
+ // Use resolved asset_path's basedir for current working path.
172
176
// Add resolved asset_path's basedir to search path.
173
177
std::string base_dir = io::GetBaseDir (resolved_path);
174
178
if (base_dir.size ()) {
175
- DCOUT (fmt::format (" Add {} to asset search path." , base_dir));
176
- resolver.add_seartch_path (base_dir);
179
+ DCOUT (fmt::format (" Set `{}' to current working path." , base_dir));
180
+ DCOUT (fmt::format (" Add `{}' to asset search path." , base_dir));
181
+ resolver.set_current_working_path (base_dir);
182
+ resolver.add_search_path (base_dir);
177
183
}
178
184
179
185
Asset asset;
@@ -295,18 +301,20 @@ bool LoadAsset(AssetResolutionResolver &resolver,
295
301
std::string default_prim;
296
302
if (primPath.is_valid ()) {
297
303
default_prim = primPath.prim_part ();
304
+ DCOUT (" primPath = " << default_prim);
298
305
} else {
299
306
// Use `defaultPrim` metadatum
300
307
if (layer.metas ().defaultPrim .valid ()) {
301
308
default_prim = " /" + layer.metas ().defaultPrim .str ();
309
+ DCOUT (" layer.meta.defaultPrim = " << default_prim);
302
310
} else {
303
311
// Use the first Prim in the layer.
304
312
default_prim = " /" + layer.primspecs ().begin ()->first ;
313
+ DCOUT (" layer.primspecs[0].name = " << default_prim);
305
314
}
306
315
}
307
316
308
317
if (!layer.find_primspec_at (Path (default_prim, " " ), &src_ps, err)) {
309
- DCOUT (" layer = " << to_string (layer));
310
318
PUSH_ERROR_AND_RETURN (
311
319
fmt::format (" Failed to find PrimSpec `{}` in layer `{}`(resolved path: `{}`)" , default_prim,
312
320
asset_path, resolved_path));
@@ -319,6 +327,13 @@ bool LoadAsset(AssetResolutionResolver &resolver,
319
327
(*dst_primspec_root) = src_ps;
320
328
}
321
329
330
+ // save assetresolution state for nested composition.
331
+ layer.set_asset_resolution_state (
332
+ resolver.current_working_path_str (),
333
+ resolver.search_paths (),
334
+ resolver.get_userdata ()
335
+ );
336
+
322
337
(*dst_layer) = std::move (layer);
323
338
324
339
return true ;
@@ -362,7 +377,7 @@ bool CompositeSublayersRec(AssetResolutionResolver &resolver,
362
377
}
363
378
364
379
tinyusdz::Layer sublayer;
365
- if (!LoadAsset (resolver, options.fileformats , layer.assetPath , /* not_used */ Path::make_root_path (), &sublayer, /* primspec_root */ nullptr , options.error_when_no_prims_in_sublayer , options.error_when_asset_not_found , options.error_when_unsupported_fileformat , warn, err)) {
380
+ if (!LoadAsset (resolver, in_layer. get_asset_search_paths (), options.fileformats , layer.assetPath , /* not_used */ Path::make_root_path (), &sublayer, /* primspec_root */ nullptr , options.error_when_no_prims_in_sublayer , options.error_when_asset_not_found , options.error_when_unsupported_fileformat , warn, err)) {
366
381
PUSH_ERROR_AND_RETURN (fmt::format (" Load asset in subLayer failed: `{}`" , layer.assetPath ));
367
382
}
368
383
@@ -483,6 +498,7 @@ bool CompositeSublayers(AssetResolutionResolver &resolver,
483
498
namespace {
484
499
485
500
bool CompositeReferencesRec (uint32_t depth, AssetResolutionResolver &resolver,
501
+ const std::vector<std::string> &asset_search_paths,
486
502
PrimSpec &primspec /* [inout] */ , std::string *warn,
487
503
std::string *err,
488
504
const ReferencesCompositionOptions &options) {
@@ -492,7 +508,7 @@ bool CompositeReferencesRec(uint32_t depth, AssetResolutionResolver &resolver,
492
508
493
509
// Traverse children first.
494
510
for (auto &child : primspec.children ()) {
495
- if (!CompositeReferencesRec (depth + 1 , resolver, child, warn, err,
511
+ if (!CompositeReferencesRec (depth + 1 , resolver, asset_search_paths, child, warn, err,
496
512
options)) {
497
513
return false ;
498
514
}
@@ -508,7 +524,8 @@ bool CompositeReferencesRec(uint32_t depth, AssetResolutionResolver &resolver,
508
524
Layer layer;
509
525
const PrimSpec *src_ps{nullptr };
510
526
511
- if (!LoadAsset (resolver, options.fileformats , reference.asset_path , reference.prim_path ,
527
+ DCOUT (" reference.prim_path = " << reference.prim_path );
528
+ if (!LoadAsset (resolver, asset_search_paths, options.fileformats , reference.asset_path , reference.prim_path ,
512
529
&layer, &src_ps, /* error_when_no_prims_found */ true , options.error_when_asset_not_found ,
513
530
options.error_when_unsupported_fileformat , warn, err)) {
514
531
PUSH_ERROR_AND_RETURN (
@@ -552,7 +569,7 @@ bool CompositeReferencesRec(uint32_t depth, AssetResolutionResolver &resolver,
552
569
Layer layer;
553
570
const PrimSpec *src_ps{nullptr };
554
571
555
- if (!LoadAsset (resolver, options.fileformats , reference.asset_path , reference.prim_path ,
572
+ if (!LoadAsset (resolver, asset_search_paths, options.fileformats , reference.asset_path , reference.prim_path ,
556
573
&layer, &src_ps, /* error_when_no_prims */ true , options.error_when_asset_not_found ,
557
574
options.error_when_unsupported_fileformat , warn, err)) {
558
575
PUSH_ERROR_AND_RETURN (
@@ -590,6 +607,7 @@ bool CompositeReferencesRec(uint32_t depth, AssetResolutionResolver &resolver,
590
607
}
591
608
592
609
bool CompositePayloadRec (uint32_t depth, AssetResolutionResolver &resolver,
610
+ const std::vector<std::string> &asset_search_paths,
593
611
PrimSpec &primspec /* [inout] */ , std::string *warn,
594
612
std::string *err,
595
613
const PayloadCompositionOptions &options) {
@@ -599,7 +617,7 @@ bool CompositePayloadRec(uint32_t depth, AssetResolutionResolver &resolver,
599
617
600
618
// Traverse children first.
601
619
for (auto &child : primspec.children ()) {
602
- if (!CompositePayloadRec (depth + 1 , resolver, child, warn, err, options)) {
620
+ if (!CompositePayloadRec (depth + 1 , resolver, asset_search_paths, child, warn, err, options)) {
603
621
return false ;
604
622
}
605
623
}
@@ -620,7 +638,7 @@ bool CompositePayloadRec(uint32_t depth, AssetResolutionResolver &resolver,
620
638
621
639
Layer layer;
622
640
const PrimSpec *src_ps{nullptr };
623
- if (!LoadAsset (resolver, options.fileformats , pl.asset_path , pl.prim_path ,
641
+ if (!LoadAsset (resolver, asset_search_paths, options.fileformats , pl.asset_path , pl.prim_path ,
624
642
&layer, &src_ps, /* error_when_no_prims_found */ true , options.error_when_asset_not_found ,
625
643
options.error_when_unsupported_fileformat , warn, err)) {
626
644
PUSH_ERROR_AND_RETURN (
@@ -670,7 +688,7 @@ bool CompositePayloadRec(uint32_t depth, AssetResolutionResolver &resolver,
670
688
671
689
Layer layer;
672
690
const PrimSpec *src_ps{nullptr };
673
- if (!LoadAsset (resolver, options.fileformats , pl.asset_path , pl.prim_path ,
691
+ if (!LoadAsset (resolver, asset_search_paths, options.fileformats , pl.asset_path , pl.prim_path ,
674
692
&layer, &src_ps, /* error_when_no_prims_found */ true , options.error_when_asset_not_found ,
675
693
options.error_when_unsupported_fileformat , warn, err)) {
676
694
PUSH_ERROR_AND_RETURN (
@@ -812,10 +830,12 @@ bool CompositeReferences(AssetResolutionResolver &resolver,
812
830
return false ;
813
831
}
814
832
833
+ std::vector<std::string> search_paths = in_layer.get_asset_search_paths ();
834
+
815
835
Layer dst = in_layer; // deep copy
816
836
817
837
for (auto &item : dst.primspecs ()) {
818
- if (!CompositeReferencesRec (/* depth */ 0 , resolver, item.second , warn, err,
838
+ if (!CompositeReferencesRec (/* depth */ 0 , resolver, search_paths, item.second , warn, err,
819
839
options)) {
820
840
PUSH_ERROR_AND_RETURN (" Composite `references` failed." );
821
841
}
@@ -834,10 +854,12 @@ bool CompositePayload(AssetResolutionResolver &resolver, const Layer &in_layer,
834
854
return false ;
835
855
}
836
856
857
+ std::vector<std::string> search_paths = in_layer.get_asset_search_paths ();;
858
+
837
859
Layer dst = in_layer; // deep copy
838
860
839
861
for (auto &item : dst.primspecs ()) {
840
- if (!CompositePayloadRec (/* depth */ 0 , resolver, item.second , warn, err,
862
+ if (!CompositePayloadRec (/* depth */ 0 , resolver, search_paths, item.second , warn, err,
841
863
options)) {
842
864
PUSH_ERROR_AND_RETURN (" Composite `payload` failed." );
843
865
}
@@ -1116,6 +1138,7 @@ bool InheritPrimSpec(PrimSpec &dst, const PrimSpec &src, std::string *warn,
1116
1138
return detail::InheritPrimSpecImpl (dst, src, warn, err);
1117
1139
}
1118
1140
1141
+ #if 0
1119
1142
bool ReferenceLayerToPrimSpec(PrimSpec &dst, const Layer &layer,
1120
1143
const Path primPath,
1121
1144
const LayerOffset layerOffset) {
@@ -1143,7 +1166,9 @@ bool ReferenceLayerToPrimSpec(PrimSpec &dst, const Layer &layer,
1143
1166
1144
1167
return false;
1145
1168
}
1169
+ #endif
1146
1170
1171
+ #if 0
1147
1172
bool HasReferences(const Layer &layer, const bool force_check,
1148
1173
const ReferencesCompositionOptions options) {
1149
1174
if (!force_check) {
@@ -1171,6 +1196,7 @@ bool HasOver(const Layer &layer) { return layer.check_over_primspec(); }
1171
1196
bool HasSpecializes(const Layer &layer) {
1172
1197
return layer.check_unresolved_specializes();
1173
1198
}
1199
+ #endif
1174
1200
1175
1201
namespace {
1176
1202
0 commit comments