Skip to content

Commit ecfacac

Browse files
committed
save some state for AssetResolution to Layer and PrimSpec.
1 parent fe8af50 commit ecfacac

File tree

4 files changed

+135
-13
lines changed

4 files changed

+135
-13
lines changed

src/asset-resolution.cc

+16
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,17 @@ bool AssetResolutionResolver::find(const std::string &assetPath) const {
5858
}
5959
}
6060

61+
62+
// TODO: Only find when input path is relative.
63+
std::string rpath = io::FindFile(assetPath, {_current_working_path});
64+
if (rpath.size()) {
65+
return true;
66+
}
67+
6168
// TODO: Cache resolition.
6269
std::string fpath = io::FindFile(assetPath, _search_paths);
6370
return fpath.size();
71+
6472
}
6573

6674
std::string AssetResolutionResolver::resolve(
@@ -88,8 +96,16 @@ std::string AssetResolutionResolver::resolve(
8896
}
8997
}
9098

99+
DCOUT("cwd = " << _current_working_path);
91100
DCOUT("search_paths = " << _search_paths);
92101
DCOUT("assetPath = " << assetPath);
102+
103+
// TODO: Only find when input path is relative.
104+
std::string rpath = io::FindFile(assetPath, {_current_working_path});
105+
if (rpath.size()) {
106+
return rpath;
107+
}
108+
93109
// TODO: Cache resolition.
94110
return io::FindFile(assetPath, _search_paths);
95111
}

src/asset-resolution.hh

+13-1
Original file line numberDiff line numberDiff line change
@@ -189,10 +189,21 @@ class AssetResolutionResolver {
189189
_search_paths = paths;
190190
}
191191

192-
void add_seartch_path(const std::string &path) {
192+
void add_search_path(const std::string &path) {
193193
_search_paths.push_back(path);
194194
}
195195

196+
//
197+
// Asset is first seeked from the current working path(directory) when the Asset's path is a relative path.
198+
//
199+
void set_current_working_path(const std::string &cwp) {
200+
_current_working_path = cwp;
201+
}
202+
203+
const std::string &current_working_path_str() const {
204+
return _current_working_path;
205+
}
206+
196207
const std::vector<std::string> &search_paths() const { return _search_paths; }
197208

198209
std::string search_paths_str() const;
@@ -278,6 +289,7 @@ class AssetResolutionResolver {
278289
private:
279290
//ResolvePathHandler _resolve_path_handler{nullptr};
280291
void *_userdata{nullptr};
292+
std::string _current_working_path{"./"};
281293
std::vector<std::string> _search_paths;
282294
mutable size_t _max_asset_bytes_in_mb{1024*1024}; // default 1 TB
283295

src/composition.cc

+38-12
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ bool IsBuiltinFileFormat(const std::string &name) {
130130

131131
// TODO: support loading non-USD asset
132132
bool LoadAsset(AssetResolutionResolver &resolver,
133+
const std::vector<std::string> &search_paths,
133134
const std::map<std::string, FileFormatHandler> &fileformats,
134135
const value::AssetPath &assetPath, const Path &primPath,
135136
Layer *dst_layer, const PrimSpec **dst_primspec_root,
@@ -169,11 +170,16 @@ bool LoadAsset(AssetResolutionResolver &resolver,
169170
}
170171
}
171172

173+
resolver.set_search_paths(search_paths);
174+
175+
// Use resolved asset_path's basedir for current working path.
172176
// Add resolved asset_path's basedir to search path.
173177
std::string base_dir = io::GetBaseDir(resolved_path);
174178
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);
177183
}
178184

179185
Asset asset;
@@ -295,18 +301,20 @@ bool LoadAsset(AssetResolutionResolver &resolver,
295301
std::string default_prim;
296302
if (primPath.is_valid()) {
297303
default_prim = primPath.prim_part();
304+
DCOUT("primPath = " << default_prim);
298305
} else {
299306
// Use `defaultPrim` metadatum
300307
if (layer.metas().defaultPrim.valid()) {
301308
default_prim = "/" + layer.metas().defaultPrim.str();
309+
DCOUT("layer.meta.defaultPrim = " << default_prim);
302310
} else {
303311
// Use the first Prim in the layer.
304312
default_prim = "/" + layer.primspecs().begin()->first;
313+
DCOUT("layer.primspecs[0].name = " << default_prim);
305314
}
306315
}
307316

308317
if (!layer.find_primspec_at(Path(default_prim, ""), &src_ps, err)) {
309-
DCOUT("layer = " << to_string(layer));
310318
PUSH_ERROR_AND_RETURN(
311319
fmt::format("Failed to find PrimSpec `{}` in layer `{}`(resolved path: `{}`)", default_prim,
312320
asset_path, resolved_path));
@@ -319,6 +327,13 @@ bool LoadAsset(AssetResolutionResolver &resolver,
319327
(*dst_primspec_root) = src_ps;
320328
}
321329

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+
322337
(*dst_layer) = std::move(layer);
323338

324339
return true;
@@ -362,7 +377,7 @@ bool CompositeSublayersRec(AssetResolutionResolver &resolver,
362377
}
363378

364379
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)) {
366381
PUSH_ERROR_AND_RETURN(fmt::format("Load asset in subLayer failed: `{}`", layer.assetPath));
367382
}
368383

@@ -483,6 +498,7 @@ bool CompositeSublayers(AssetResolutionResolver &resolver,
483498
namespace {
484499

485500
bool CompositeReferencesRec(uint32_t depth, AssetResolutionResolver &resolver,
501+
const std::vector<std::string> &asset_search_paths,
486502
PrimSpec &primspec /* [inout] */, std::string *warn,
487503
std::string *err,
488504
const ReferencesCompositionOptions &options) {
@@ -492,7 +508,7 @@ bool CompositeReferencesRec(uint32_t depth, AssetResolutionResolver &resolver,
492508

493509
// Traverse children first.
494510
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,
496512
options)) {
497513
return false;
498514
}
@@ -508,7 +524,8 @@ bool CompositeReferencesRec(uint32_t depth, AssetResolutionResolver &resolver,
508524
Layer layer;
509525
const PrimSpec *src_ps{nullptr};
510526

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,
512529
&layer, &src_ps, /* error_when_no_prims_found */true, options.error_when_asset_not_found,
513530
options.error_when_unsupported_fileformat, warn, err)) {
514531
PUSH_ERROR_AND_RETURN(
@@ -552,7 +569,7 @@ bool CompositeReferencesRec(uint32_t depth, AssetResolutionResolver &resolver,
552569
Layer layer;
553570
const PrimSpec *src_ps{nullptr};
554571

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,
556573
&layer, &src_ps, /* error_when_no_prims */true, options.error_when_asset_not_found,
557574
options.error_when_unsupported_fileformat, warn, err)) {
558575
PUSH_ERROR_AND_RETURN(
@@ -590,6 +607,7 @@ bool CompositeReferencesRec(uint32_t depth, AssetResolutionResolver &resolver,
590607
}
591608

592609
bool CompositePayloadRec(uint32_t depth, AssetResolutionResolver &resolver,
610+
const std::vector<std::string> &asset_search_paths,
593611
PrimSpec &primspec /* [inout] */, std::string *warn,
594612
std::string *err,
595613
const PayloadCompositionOptions &options) {
@@ -599,7 +617,7 @@ bool CompositePayloadRec(uint32_t depth, AssetResolutionResolver &resolver,
599617

600618
// Traverse children first.
601619
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)) {
603621
return false;
604622
}
605623
}
@@ -620,7 +638,7 @@ bool CompositePayloadRec(uint32_t depth, AssetResolutionResolver &resolver,
620638

621639
Layer layer;
622640
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,
624642
&layer, &src_ps, /* error_when_no_prims_found */true, options.error_when_asset_not_found,
625643
options.error_when_unsupported_fileformat, warn, err)) {
626644
PUSH_ERROR_AND_RETURN(
@@ -670,7 +688,7 @@ bool CompositePayloadRec(uint32_t depth, AssetResolutionResolver &resolver,
670688

671689
Layer layer;
672690
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,
674692
&layer, &src_ps, /* error_when_no_prims_found */true, options.error_when_asset_not_found,
675693
options.error_when_unsupported_fileformat, warn, err)) {
676694
PUSH_ERROR_AND_RETURN(
@@ -812,10 +830,12 @@ bool CompositeReferences(AssetResolutionResolver &resolver,
812830
return false;
813831
}
814832

833+
std::vector<std::string> search_paths = in_layer.get_asset_search_paths();
834+
815835
Layer dst = in_layer; // deep copy
816836

817837
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,
819839
options)) {
820840
PUSH_ERROR_AND_RETURN("Composite `references` failed.");
821841
}
@@ -834,10 +854,12 @@ bool CompositePayload(AssetResolutionResolver &resolver, const Layer &in_layer,
834854
return false;
835855
}
836856

857+
std::vector<std::string> search_paths = in_layer.get_asset_search_paths();;
858+
837859
Layer dst = in_layer; // deep copy
838860

839861
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,
841863
options)) {
842864
PUSH_ERROR_AND_RETURN("Composite `payload` failed.");
843865
}
@@ -1116,6 +1138,7 @@ bool InheritPrimSpec(PrimSpec &dst, const PrimSpec &src, std::string *warn,
11161138
return detail::InheritPrimSpecImpl(dst, src, warn, err);
11171139
}
11181140

1141+
#if 0
11191142
bool ReferenceLayerToPrimSpec(PrimSpec &dst, const Layer &layer,
11201143
const Path primPath,
11211144
const LayerOffset layerOffset) {
@@ -1143,7 +1166,9 @@ bool ReferenceLayerToPrimSpec(PrimSpec &dst, const Layer &layer,
11431166

11441167
return false;
11451168
}
1169+
#endif
11461170

1171+
#if 0
11471172
bool HasReferences(const Layer &layer, const bool force_check,
11481173
const ReferencesCompositionOptions options) {
11491174
if (!force_check) {
@@ -1171,6 +1196,7 @@ bool HasOver(const Layer &layer) { return layer.check_over_primspec(); }
11711196
bool HasSpecializes(const Layer &layer) {
11721197
return layer.check_unresolved_specializes();
11731198
}
1199+
#endif
11741200

11751201
namespace {
11761202

src/prim-types.hh

+68
Original file line numberDiff line numberDiff line change
@@ -3252,6 +3252,28 @@ class PrimSpec {
32523252
return _properties;
32533253
}
32543254

3255+
const std::string &get_current_working_path() const {
3256+
return _current_working_path;
3257+
}
3258+
3259+
const std::vector<std::string> &get_asset_search_paths() const {
3260+
return _asset_search_paths;
3261+
}
3262+
3263+
void set_current_working_path(const std::string &s) {
3264+
_current_working_path = s;
3265+
}
3266+
3267+
void set_asset_search_paths(const std::vector<std::string> &search_paths) {
3268+
_asset_search_paths = search_paths;
3269+
}
3270+
3271+
void set_asset_resolution_state(
3272+
const std::string &cwp, const std::vector<std::string> &search_paths) {
3273+
_current_working_path = cwp;
3274+
_asset_search_paths = search_paths;
3275+
}
3276+
32553277
private:
32563278
void CopyFrom(const PrimSpec &rhs) {
32573279
_specifier = rhs._specifier;
@@ -3272,6 +3294,9 @@ class PrimSpec {
32723294
_variantChildren = rhs._variantChildren;
32733295

32743296
_metas = rhs._metas;
3297+
3298+
_current_working_path = rhs._current_working_path;
3299+
_asset_search_paths = rhs._asset_search_paths;
32753300
}
32763301

32773302
void MoveFrom(PrimSpec &rhs) {
@@ -3293,6 +3318,9 @@ class PrimSpec {
32933318
_variantChildren = rhs._variantChildren;
32943319

32953320
_metas = std::move(rhs._metas);
3321+
3322+
_current_working_path = rhs._current_working_path;
3323+
_asset_search_paths = rhs._asset_search_paths;
32963324
}
32973325

32983326
Specifier _specifier{Specifier::Def};
@@ -3321,6 +3349,15 @@ class PrimSpec {
33213349
std::vector<value::token> _variantChildren;
33223350

33233351
PrimMeta _metas;
3352+
3353+
///
3354+
/// For solving asset path in nested composition.
3355+
/// Keep asset resolution state.
3356+
/// TODO: Use struct. Store userdata pointer.
3357+
///
3358+
std::string _current_working_path{"./"};
3359+
std::vector<std::string> _asset_search_paths;
3360+
33243361
};
33253362

33263363
struct SubLayer
@@ -3576,6 +3613,28 @@ struct Layer {
35763613
///
35773614
bool find_primspec_at(const Path &path, const PrimSpec **ps, std::string *err) const;
35783615

3616+
3617+
///
3618+
/// Set state for AssetResolution in the subsequent composition operation.
3619+
///
3620+
void set_asset_resolution_state(
3621+
const std::string &cwp, const std::vector<std::string> &search_paths, void *userdata=nullptr) {
3622+
_current_working_path = cwp;
3623+
_asset_search_paths = search_paths;
3624+
_asset_resolution_userdata = userdata;
3625+
}
3626+
3627+
void get_asset_resolution_state(
3628+
std::string &cwp, std::vector<std::string> &search_paths, void *&userdata) {
3629+
cwp = _current_working_path;
3630+
search_paths = _asset_search_paths;
3631+
userdata = _asset_resolution_userdata;
3632+
}
3633+
3634+
const std::vector<std::string> get_asset_search_paths() const {
3635+
return _asset_search_paths;
3636+
}
3637+
35793638
private:
35803639
std::string _name; // layer name ~= USD filename
35813640

@@ -3601,6 +3660,15 @@ struct Layer {
36013660
mutable bool _has_unresolved_specializes{true};
36023661
mutable bool _has_over_primspec{true};
36033662
mutable bool _has_class_primspec{true};
3663+
3664+
//
3665+
// Record AssetResolution state(search paths, current working directory)
3666+
// when this layer is opened by compostion(`references`, `payload`, `subLayers`)
3667+
//
3668+
mutable std::string _current_working_path{"./"};
3669+
mutable std::vector<std::string> _asset_search_paths;
3670+
mutable void *_asset_resolution_userdata{nullptr};
3671+
36043672
};
36053673

36063674

0 commit comments

Comments
 (0)