[Bf-blender-cvs] [61a9ee88a34] universal-scene-description: USD import: handle context-dependent UDIM paths.
Michael Kowalski
noreply at git.blender.org
Fri Sep 30 02:17:11 CEST 2022
Commit: 61a9ee88a34d2db3fed7a50b2fa9aad030bb5f18
Author: Michael Kowalski
Date: Thu Sep 29 20:16:07 2022 -0400
Branches: universal-scene-description
https://developer.blender.org/rB61a9ee88a34d2db3fed7a50b2fa9aad030bb5f18
USD import: handle context-dependent UDIM paths.
This change helps address the issue where contex-dependent
UDIM texture paths (e.g., '0/foo.<UDIM>.png') were not getting
resolved by the call to SdfLayer::::ComputeAbsolutePath().
To work around this limitation, I updated the code to compute
the absolute path on just the parent directory portion of
the UDIM file path. This makes the simplifying assumption that
context-dependent asset paths are essentially relative paths,
which might not always be correct. It's not clear how
else to efficiently address this without performing a
potentially expensive search.
===================================================================
M source/blender/io/usd/intern/usd_reader_material.cc
===================================================================
diff --git a/source/blender/io/usd/intern/usd_reader_material.cc b/source/blender/io/usd/intern/usd_reader_material.cc
index 606a8395929..3376a930926 100644
--- a/source/blender/io/usd/intern/usd_reader_material.cc
+++ b/source/blender/io/usd/intern/usd_reader_material.cc
@@ -752,10 +752,37 @@ void USDMaterialReader::load_tex_image(const pxr::UsdShadeShader &usd_shader,
* necessary for UDIM paths). */
file_path = asset_path.GetAssetPath();
- /* Texture paths are frequently relative to the USD, so get
- * the absolute path. */
- if (pxr::SdfLayerHandle layer_handle = get_layer_handle(file_input.GetAttr())) {
- file_path = layer_handle->ComputeAbsolutePath(file_path);
+ if (!file_path.empty() && is_udim_path(file_path)) {
+ /* Texture paths are frequently relative to the USD, so get
+ * the absolute path. */
+ if (pxr::SdfLayerHandle layer_handle = get_layer_handle(file_input.GetAttr())) {
+
+ /* SdfLayer::ComputeAbsolutePath() doesn' work for context-dependent paths
+ * where the file name has a UDIM token (e.g., '0/foo.<UDIM>.png').
+ * We therefore compute the absolube path of the parent directory of the
+ * UDIM file. */
+
+ char file[FILE_MAXFILE];
+ char dir[FILE_MAXDIR];
+ BLI_split_dirfile(file_path.c_str(), dir, file, sizeof(dir), sizeof(file));
+
+ if (strlen(dir) == 0) {
+ /* No directory in path, assume asset is a sibling of the layer. */
+ dir[0] = '.';
+ dir[1] = '\0';
+ }
+
+ /* Get the absolute path of the directory relative to the layer. */
+ std::string dir_abs_path = layer_handle->ComputeAbsolutePath(dir);
+
+ char result[FILE_MAX];
+ /* Finally, join the original file name with the absolute path. */
+ BLI_path_join(result, FILE_MAX, dir_abs_path.c_str(), file, nullptr);
+
+ /* Use forward slashes. */
+ BLI_str_replace_char(result, SEP, ALTSEP);
+ file_path = result;
+ }
}
}
More information about the Bf-blender-cvs
mailing list