From c486f05b4dcee7794f00e698ca2e9adac9765e6b Mon Sep 17 00:00:00 2001 From: dstover11 Date: Mon, 9 Mar 2026 19:08:54 -0400 Subject: [PATCH 01/13] - Release of 2026.03.0 --- .clang-format | 31 + .github/workflows/ci.yml | 9 +- .github/workflows/create-usd-release.yml | 2 +- .gitignore | 10 +- CMakeLists.txt | 38 +- README.md | 13 +- _config.yml | 0 changelog.txt | 93 ++ cmake/FindGTest.cmake | 4 +- cmake/FindLibXml2.cmake | 4 +- cmake/FindOpenImageIO.cmake | 57 - cmake/FindTinyGLTF.cmake | 17 +- cmake/FindZLIB.cmake | 4 +- cmake/Finddraco.cmake | 2 +- cmake/Findfmt.cmake | 2 +- cmake/Findnlohmann_json.cmake | 46 + fbx/README.md | 23 +- fbx/src/CMakeLists.txt | 37 +- fbx/src/api.h | 28 +- fbx/src/fbx.cpp | 2 +- fbx/src/fbx.h | 3 +- fbx/src/fbxExport.cpp | 4 +- fbx/src/fbxImport.cpp | 932 +++++++++------ fbx/src/fbxResolver.cpp | 9 +- fbx/src/fbxResolver.h | 4 +- fbx/src/fileFormat.cpp | 8 +- fbx/src/fileFormat.h | 12 +- fbx/src/precompiled.h | 34 - fbx/tests/sanityTests.cpp | 2 +- fbx/tests/util.cpp | 4 +- fbx/tests/util.h | 4 +- gltf/README.md | 13 +- gltf/src/CMakeLists.txt | 77 +- gltf/src/api.h | 28 +- gltf/src/fileFormat.cpp | 6 +- gltf/src/fileFormat.h | 6 +- gltf/src/gltf.cpp | 160 ++- gltf/src/gltf.h | 7 +- gltf/src/gltfAnisotropy.cpp | 8 +- gltf/src/gltfExport.cpp | 178 +-- gltf/src/gltfExport.h | 2 +- gltf/src/gltfImport.cpp | 668 ++++++++--- gltf/src/gltfImport.h | 2 +- gltf/src/gltfResolver.cpp | 4 +- gltf/src/gltfResolver.h | 4 +- gltf/src/gltfSpecGloss.h | 1 - gltf/src/importGltfContext.h | 5 +- gltf/src/precompiled.h | 74 -- obj/README.md | 33 +- obj/src/CMakeLists.txt | 69 +- obj/src/api.h | 28 +- obj/src/fileFormat.cpp | 57 +- obj/src/fileFormat.h | 14 +- obj/src/obj.cpp | 81 +- obj/src/obj.h | 3 - obj/src/objExport.cpp | 35 +- obj/src/objImport.cpp | 371 +++++- obj/src/objImport.h | 2 + obj/src/objResolver.cpp | 6 +- obj/src/objResolver.h | 4 +- obj/src/plugInfo.json.in | 12 + obj/src/precompiled.h | 65 - ply/src/CMakeLists.txt | 69 +- ply/src/api.h | 28 +- ply/src/fileFormat.cpp | 7 +- ply/src/fileFormat.h | 10 +- ply/src/plyExport.cpp | 37 +- ply/src/plyExport.h | 2 +- ply/src/plyImport.cpp | 47 +- ply/src/plyImport.h | 2 +- sbsar/CMakeLists.txt | 13 +- sbsar/README.md | 44 + sbsar/src/CMakeLists.txt | 17 +- sbsar/src/api.h | 12 +- sbsar/src/assetPath/assetPathParser.cpp | 14 +- sbsar/src/assetPath/assetPathParser.h | 10 +- sbsar/src/assetResolver/sbsarAsset.cpp | 58 +- sbsar/src/assetResolver/sbsarAsset.h | 39 +- sbsar/src/assetResolver/sbsarImage.cpp | 15 +- sbsar/src/assetResolver/sbsarImage.h | 13 +- .../assetResolver/sbsarPackageResolver.cpp | 5 +- .../src/assetResolver/sbsarPackageResolver.h | 2 +- .../src/assetResolver/sbsarResolverCache.cpp | 9 +- sbsar/src/assetResolver/sbsarResolverCache.h | 7 +- sbsar/src/config/sbsarConfig.cpp | 9 +- sbsar/src/config/sbsarConfig.h | 4 +- sbsar/src/config/sbsarConfigFactory.h | 2 +- sbsar/src/config/sbsarConfigRegistry.h | 4 +- sbsar/src/plugInfo.json.in | 9 +- sbsar/src/sbsarEngine/sbsarAssetCache.cpp | 28 +- sbsar/src/sbsarEngine/sbsarAssetCache.h | 24 +- sbsar/src/sbsarEngine/sbsarEngine.cpp | 6 +- .../src/sbsarEngine/sbsarInputImageCache.cpp | 3 +- sbsar/src/sbsarEngine/sbsarPackageCache.cpp | 6 +- sbsar/src/sbsarEngine/sbsarPackageCache.h | 14 +- sbsar/src/sbsarEngine/sbsarRender.cpp | 33 +- sbsar/src/sbsarEngine/sbsarRender.h | 2 +- sbsar/src/sbsarEngine/sbsarRenderThread.cpp | 19 +- sbsar/src/sbsarEngine/sbsarRenderThread.h | 2 +- sbsar/src/sbsarfileformat.cpp | 216 +++- sbsar/src/sbsarfileformat.h | 14 +- sbsar/src/tokens.cpp | 67 +- sbsar/src/tokens.h | 46 +- sbsar/src/usdGeneration/sbsarLuxDomeLight.cpp | 2 +- sbsar/src/usdGeneration/sbsarMaterial.cpp | 71 +- sbsar/src/usdGeneration/sbsarOpenPBR.cpp | 222 ++-- sbsar/src/usdGeneration/sbsarOpenPBR.h | 5 +- sbsar/src/usdGeneration/sbsarSymbolMapper.h | 4 +- .../usdGeneration/usdGenerationHelpers.cpp | 69 +- .../src/usdGeneration/usdGenerationHelpers.h | 27 +- sbsar/test/test_sbsarConfig.cpp | 8 +- scripts/requirements.in | 8 + scripts/requirements.txt | 52 +- spz/src/CMakeLists.txt | 70 +- spz/src/api.h | 28 +- spz/src/fileFormat.cpp | 7 +- spz/src/fileFormat.h | 10 +- spz/src/spzExport.cpp | 55 +- spz/src/spzExport.h | 2 +- spz/src/spzImport.cpp | 18 +- spz/src/spzImport.h | 2 +- stl/src/CMakeLists.txt | 71 +- stl/src/api.h | 28 +- stl/src/fileFormat.cpp | 7 +- stl/src/fileFormat.h | 8 +- stl/src/stlExport.h | 1 - stl/src/stlImport.cpp | 16 - stl/src/stlImport.h | 1 - stl/src/stlModel.cpp | 1 + stl/src/stlModel.h | 8 +- .../Darwin/fbx/Megaphone_01_Lowpoly.jpg | Bin 120541 -> 123844 bytes .../Darwin/fbx/SimpleRobotwithUdims.jpg | Bin 79585 -> 84272 bytes test/baseline/Darwin/fbx/cube-colors.jpg | Bin 50035 -> 40333 bytes test/baseline/Darwin/fbx/cube.jpg | Bin 58793 -> 48259 bytes .../Linux/fbx/Megaphone_01_Lowpoly.jpg | Bin 110838 -> 113607 bytes .../Linux/fbx/SimpleRobotwithUdims.jpg | Bin 79629 -> 84331 bytes test/baseline/Linux/fbx/cube-colors.jpg | Bin 50074 -> 40335 bytes test/baseline/Linux/fbx/cube.jpg | Bin 58840 -> 48262 bytes .../Windows/fbx/Megaphone_01_Lowpoly.jpg | Bin 110838 -> 113607 bytes .../Windows/fbx/SimpleRobotwithUdims.jpg | Bin 79629 -> 84331 bytes test/baseline/Windows/fbx/cube-colors.jpg | Bin 50074 -> 40335 bytes test/baseline/Windows/fbx/cube.jpg | Bin 58840 -> 48262 bytes test/full_versions.json | 5 - test/pr_versions.json | 10 +- test/test.py | 2 +- utils/CMakeLists.txt | 33 +- utils/include/fileformatutils/api.h | 28 +- utils/include/fileformatutils/assetresolver.h | 17 +- utils/include/fileformatutils/common.h | 123 +- utils/include/fileformatutils/dictencoder.h | 6 +- utils/include/fileformatutils/featureFlags.h | 108 ++ utils/include/fileformatutils/geometry.h | 6 + utils/include/fileformatutils/images.h | 2 +- utils/include/fileformatutils/layerRead.h | 1 + .../fileformatutils/layerReadMaterial.h | 2 +- .../fileformatutils/layerReadMaterialUtils.h | 186 +++ .../fileformatutils/layerWriteOpenPBR.h | 13 + .../fileformatutils/layerWriteShared.h | 38 +- utils/include/fileformatutils/materials.h | 4 +- .../fileformatutils/neuralAssetsHelper.h | 12 +- utils/include/fileformatutils/resolver.h | 8 +- .../fileformatutils/sdfMaterialUtils.h | 14 +- utils/include/fileformatutils/sdfUtils.h | 28 +- utils/include/fileformatutils/test.h | 64 +- utils/include/fileformatutils/usdData.h | 21 +- utils/src/assetresolver.cpp | 50 +- utils/src/common.cpp | 70 +- utils/src/featureFlags.cpp | 57 + utils/src/geometry.cpp | 22 +- utils/src/images.cpp | 6 +- utils/src/layerRead.cpp | 39 +- utils/src/layerReadMaterial.cpp | 1061 +++++++++++------ utils/src/layerReadMaterialUtils.cpp | 261 ++++ utils/src/layerWriteMaterial.cpp | 152 ++- utils/src/layerWriteOpenPBR.cpp | 345 +++--- utils/src/layerWriteSdfData.cpp | 107 +- utils/src/layerWriteShared.cpp | 107 +- utils/src/resolver.cpp | 20 +- utils/src/sdfMaterialUtils.cpp | 187 ++- utils/src/sdfUtils.cpp | 79 +- utils/src/test.cpp | 982 +++++++++++---- utils/src/transforms.cpp | 2 +- utils/src/usdData.cpp | 8 +- utils/tests/CMakeLists.txt | 1 + utils/tests/data/baseline_writeASM.usda | 143 ++- utils/tests/data/baseline_writeOpenPBR.usda | 307 +++-- .../data/baseline_writeUsdPreviewSurface.usda | 80 +- utils/tests/data/test_invalidNetworks.usda | 452 +++++++ utils/tests/tests.cpp | 430 +++++-- version | 1 - version.json | 3 + 191 files changed, 7432 insertions(+), 3501 deletions(-) create mode 100644 .clang-format delete mode 100644 _config.yml delete mode 100644 cmake/FindOpenImageIO.cmake create mode 100644 cmake/Findnlohmann_json.cmake delete mode 100644 fbx/src/precompiled.h delete mode 100644 gltf/src/precompiled.h delete mode 100644 obj/src/precompiled.h create mode 100644 scripts/requirements.in create mode 100644 utils/include/fileformatutils/featureFlags.h create mode 100644 utils/include/fileformatutils/layerReadMaterialUtils.h create mode 100644 utils/src/featureFlags.cpp create mode 100644 utils/src/layerReadMaterialUtils.cpp create mode 100644 utils/tests/data/test_invalidNetworks.usda delete mode 100644 version create mode 100644 version.json diff --git a/.clang-format b/.clang-format new file mode 100644 index 00000000..4d9f4864 --- /dev/null +++ b/.clang-format @@ -0,0 +1,31 @@ +--- +BasedOnStyle: Mozilla +TabWidth: '4' +IndentWidth: '4' +AccessModifierOffset: -4 +ColumnLimit: 100 +AlignAfterOpenBracket: Align +AlignEscapedNewlines: Left +MaxEmptyLinesToKeep: 1 +AllowShortBlocksOnASingleLine: Empty +BreakBeforeBraces: Custom +BraceWrapping: + AfterCaseLabel: false + AfterClass: true + AfterControlStatement: Never + AfterEnum: true + AfterFunction: true + AfterNamespace: false + AfterObjCDeclaration: false + AfterStruct: true + AfterUnion: true + AfterExternBlock: true + BeforeCatch: false + BeforeElse: false + BeforeLambdaBody: false + BeforeWhile: false + IndentBraces: false + SplitEmptyFunction: false + SplitEmptyRecord: false + SplitEmptyNamespace: true +... diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cfa3f67a..f4606dc9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -205,8 +205,7 @@ jobs: "-DUSD_FILEFORMATS_ENABLE_FBX=$([[ "${{ matrix.config }}" == "ALL" || "${{ matrix.config }}" == "FBX" ]] && echo "ON" || echo "OFF")" "-DFBXSDK_ROOT=${{ env.FBX_INSTALL_DIR }}" "-DUSD_FILEFORMATS_BUILD_TESTS=ON" - "-DOpenImageIO_INCLUDE_DIR=${{ github.workspace }}/usd_build/include" - "-DOpenImageIO_INCLUDES=${{ github.workspace }}/usd_build/include" + "-DOpenImageIO_ROOT=${{ github.workspace }}/usd_build" "-DPython3_LIBRARY=" "-DPython3_INCLUDE_DIR=" "-DPython3_VERSION=3.10.11" @@ -218,12 +217,8 @@ jobs: else libFolder="lib" fi - platformArgs=( - "-DOpenImageIO_DIR=${{ github.workspace }}/usd_build/${libFolder}/cmake/OpenImageIO" - "-DOpenImageIO_LIB_DIR=${{ github.workspace }}/usd_build/${libFolder}/cmake/OpenImageIO" - ) - fullCmakeArgs="$baseArgs ${commonArgs[@]} ${platformArgs[@]}" + fullCmakeArgs="$baseArgs ${commonArgs[@]}" cmake $fullCmakeArgs - name: Build and Display Linker Command diff --git a/.github/workflows/create-usd-release.yml b/.github/workflows/create-usd-release.yml index 70144a15..6e575125 100644 --- a/.github/workflows/create-usd-release.yml +++ b/.github/workflows/create-usd-release.yml @@ -19,7 +19,7 @@ jobs: steps: - id: set-matrix run: | - OS_LIST="[\"windows-2022\",\"macOS-13\"" + OS_LIST="[\"windows-2022\"" if [[ "${{ github.event.inputs.usd_version }}" -gt 2400 ]]; then OS_LIST="$OS_LIST,\"macOS-14\"" fi diff --git a/.gitignore b/.gitignore index 71ce32ce..b38885de 100644 --- a/.gitignore +++ b/.gitignore @@ -33,6 +33,7 @@ *.out *.app +# Build artifacts *build*/ build-meta @@ -44,11 +45,13 @@ build-meta .vscode/* .idea +# All python cache directories and bytecode files +**/__pycache__ + # Generated documentation docs Testing bin -test/__pycache__ test/output test/assets/fbx/*.usd test/assets/gltf/*.usd @@ -56,5 +59,8 @@ test/assets/obj/*/*.usd test/assets/ply/*.usd test/assets/stl/*.usd -# .DS_Store +# macOS system files .DS_Store + +# local cache +*.cache diff --git a/CMakeLists.txt b/CMakeLists.txt index e91c7033..0f26d6e6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,9 @@ -cmake_minimum_required(VERSION 3.16.0) +cmake_minimum_required(VERSION 3.19.0) + project(usdFileFormats) -file(READ "version" VERSION) +file(READ "version.json" VERSION_JSON) +string(JSON VERSION GET "${VERSION_JSON}" version) string(REGEX MATCH "([0-9]*).([0-9]*).([0-9]*)" _ ${VERSION}) set(CPACK_PACKAGE_VERSION_MAJOR ${CMAKE_MATCH_1}) set(CPACK_PACKAGE_VERSION_MINOR ${CMAKE_MATCH_2}) @@ -97,26 +99,44 @@ endif () add_subdirectory(utils) +# Add a new file format to the build. This macro will add the relevant subdirectory and set the +# installation destination needed by that plugin's CMakeLists.txt so it installs into +# usd-fileformats-plugins/bin/plugin/usd +# +# New variables: +# - USD${FILEFORMAT}_DESTINATION: Where the fileformat libraries will be installed. This will +# typically be "plugin/usd" +# Example: USDFBX_DESTINATION +# +# @param SUBDIRECTORY_NAME The name of the subdirectory to add. This should be the same name as +# directory of the plugin, and will typically be all lowercase +macro(add_usd_fileformat SUBDIRECTORY_NAME) + string(TOUPPER ${SUBDIRECTORY_NAME} FILEFORMAT) + + set(USD${FILEFORMAT}_DESTINATION "plugin/usd") + add_subdirectory(${SUBDIRECTORY_NAME}) +endmacro() + if (USD_FILEFORMATS_ENABLE_FBX) - add_subdirectory(fbx) + add_usd_fileformat(fbx) endif() if (USD_FILEFORMATS_ENABLE_GLTF) - add_subdirectory(gltf) + add_usd_fileformat(gltf) endif() if (USD_FILEFORMATS_ENABLE_OBJ) - add_subdirectory(obj) + add_usd_fileformat(obj) endif() if (USD_FILEFORMATS_ENABLE_PLY) - add_subdirectory(ply) + add_usd_fileformat(ply) endif() if (USD_FILEFORMATS_ENABLE_SBSAR) - add_subdirectory(sbsar) + add_usd_fileformat(sbsar) endif() if (USD_FILEFORMATS_ENABLE_SPZ) - add_subdirectory(spz) + add_usd_fileformat(spz) endif() if (USD_FILEFORMATS_ENABLE_STL) - add_subdirectory(stl) + add_usd_fileformat(stl) endif() if (UNIX AND NOT APPLE) diff --git a/README.md b/README.md index d585dcab..e78d5be4 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ The following tools are needed: The following dependencies are needed: |Dependency|Version|Affects|Optional| |--|--|--|--| -| [Pixar USD](https://github.com/PixarAnimationStudios/USD) | 23.08 | all | no | +| [Pixar USD](https://github.com/PixarAnimationStudios/USD) | 23.08-25.11 | all | no | | [GTest](https://github.com/google/googletest.git) | 1.11.0 | all tests | yes | | [Eigen](https://gitlab.com/libeigen/eigen) | 3.4.0 | usdply, usdspz | no | | [FBX SDK](https://aps.autodesk.com/developer/overview/fbx-sdk) | 2020.3.7 | usdfbx | no | @@ -57,6 +57,13 @@ The following dependencies are needed: | [Spz](https://github.com/nianticlabs/spz) | fd4e2a5 | usdspz | no | | [Substance](https://developer.adobe.com/substance3d-sdk/) | 9.1.2 | usdsbsar | no | + +## Coding Standards +Linting standards are defined within ./.clang-format. All changes within pull requests are expected to now follow these standards. To ensure this, it is advised setup IDEs with format on save features. Alternatively, formatting can be run on all cpp and header files by running the following bash command: +``` +find . -iname '*.h' -o -iname '*.cpp' | xargs clang-format -i +``` + ## Build ### 1. Setup dependencies @@ -83,6 +90,8 @@ The following dependencies are needed: * `/lib64` to `LD_LIBRARY_PATH` in linux * `/lib/python` to `PYTHONPATH` +If USD was built with Python (default behavior with the build script), ensure the environment has access to the Python it was built with. In particular, on Windows, ensure that PATH includes the location of the Python dll used. (Alternatively, the Python dll can also be copied into `/bin`). + In linux you may need these other dependencies: ``` sudo apt update @@ -224,7 +233,7 @@ Our GitHub Actions setup includes two main workflows to support continuous integ ### 1. CI Build Workflow This workflow is triggered by any push or pull request to the main branch and ensures compatibility with Universal Scene Description (USD) versions: -- **Versions Tested:** Builds against the oldest (23.08) and newest (24.05) supported USD versions regularly. +- **Versions Tested:** Builds against the oldest (23.08) and newest (25.11) supported USD versions regularly. - **Weekly Builds:** The workflow builds against all supported USD versions to confirm ongoing compatibility. - **Post-Build Testing:** Following the build, each plugin undergoes sanity testing, including loading a cube to check basic functionality. - **Supported Plugins:** Currently supports FBXm GLTF, OBJ, PLY, and STL. Note: SBSAR plugin is not supported due to SDK constraints. diff --git a/_config.yml b/_config.yml deleted file mode 100644 index e69de29b..00000000 diff --git a/changelog.txt b/changelog.txt index 3d16a962..70904e08 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,96 @@ +v2026.03.0 March 6th, 2026 + +Features + fbx + - add generator metadata to USD + - support bitangents/tangents during import/export + gltf + - support khr_materials_volume_scatter extension + - add support for textures with brackets in their file names + - support EXT_materials_specular_edge_color & EXT_materials_clearcoat_color + - support bitangents/tangents during import/export + - add support for KHR_materials_coat extension + - Skip invalid IOR values < 1.0 + obj + - allow single value for ke material setting + sbsar + - expose uv texture repeat controls + - panorama support + - allow for unlimited cache + - relative image path resolution + stl + - support empty normals on import + utils + - increase MaterialX OpenPBR support + +Fixes + fbx + - fix mesh import when fbx mesh is a root node + - do not require `gtest` if tests are disabled + - bind meshes that have materials but no elementmaterials + - add 'triangulatemeshes' import option to allow control of whether triangulation should be performed + - fix material property mapping for non lambert/phong shader models + - fix FBX standard material import + - skeleton index validation / avoid default indexes / out of bounds checks + - fix skeletal animation for joints that only have curves on individual channels + - Handle color spaces correctly according to declared parameters + - Armature scale is applied only once through the USD hierarchy + gltf + - fix material index lookup when material is missing + - improved support for gltf scattering extension + - add generator metadata to USD + - fix various crashes + - fix inverted normal maps + - add input validation to prevent memory corruption vulnerabilities + - update readme to fix param name + obj + - replace backslash with slash in texture filepath + - fix crash on loading a file > 2gb + - adding computeNormals to SDF_FORMAT_ARG + - cpp 20 compilation fix + - Adjust FMT library dependency in the OBJ plugin to solve linker issues + ply + - fix reading gsplat sh coefficients + - fix export issues when not all meshes have uvs or normals + - remove clipping to SH0 for Gsplat + - fix GSplat import and export and add support to SH4 + sbsar + - switching the default normal format to sbsar + - specifying substance engine/framework for arm64 + - folder/subfolder support when parsing SBSAR files + - filter SBSAR by graph type + - increase default cache size to 2GB for smooth 4K texture handling + - tests fix double free error on Linux by removing getRenderThreadState() in destructor + - tag texture attributes with color space information for MaterialX/OpenPBR + - Fix conversion of sbsar displacement to OpenPBR + - Revamp heuristic fallbacks for procedural input image path resolution + - Add inverted uv scale for use with openpbr + - Correct normal scale / bias in directx style sbsar files for OpenPBR + spz + - remove clipping to SH0 for Gsplat + - fix GSplat import and export and add support to SH4 + stl + - reverse normals on export + - calculate geometric normals on import + utils + - improve shared file format args + - refactor input struct & material processing + - fix for crash in smooth normals computation + - add asset path to input:file property of UsdPreviewSurface and ASM shaders + - switch to `ND_UsdUVTexture_23` for texture reads in OpenPBR/MaterialX networks + - add type checking to `setAttributeDefaultValue()` to catch invalid data + - check for empty values when setting the default value and forgo the type check + - readLayer to correctly processes instancing setups + - OpenPBR oriented material reading + - add general `preserveExtraMaterialInfo` file format argument + - improvements on ASM to OpenPBR conversion + - updating third-party dependencies + +Build System + utils + - update test baseline images for 24.11 renderer changes + - updated the baselines images for the fbx plugins to match colorspace changes + v1.2.0 October 22nd, 2025 fbx: - fix mesh import when fbx mesh is a root node diff --git a/cmake/FindGTest.cmake b/cmake/FindGTest.cmake index f79a635f..f5334d43 100644 --- a/cmake/FindGTest.cmake +++ b/cmake/FindGTest.cmake @@ -38,7 +38,7 @@ if(USD_FILEFORMATS_FORCE_FETCHCONTENT OR USD_FILEFORMATS_FETCH_GTEST) CPMAddPackage( NAME googletest # using GTest here triggers errors GIT_REPOSITORY "https://github.com/google/googletest.git" - GIT_TAG "release-1.11.0" + GIT_TAG "v1.17.0" ) set(BUILD_SHARED_LIBS ON) @@ -49,4 +49,4 @@ else() else() find_package(GTest CONFIG) endif() -endif() \ No newline at end of file +endif() diff --git a/cmake/FindLibXml2.cmake b/cmake/FindLibXml2.cmake index 447e20dc..ff3f72f6 100644 --- a/cmake/FindLibXml2.cmake +++ b/cmake/FindLibXml2.cmake @@ -40,7 +40,7 @@ if(USD_FILEFORMATS_FORCE_FETCHCONTENT OR USD_FILEFORMATS_FETCH_LIBXML2) CPMAddPackage( NAME LibXml2 GIT_REPOSITORY "https://github.com/GNOME/libxml2.git" - GIT_TAG "ae383bdb74523ddaf831d7db0690173c25e483b3" # Release v2.10.0 + GIT_TAG "v2.13.0" ) set(LibXml2_FOUND TRUE) else() @@ -50,4 +50,4 @@ else() else() find_package(LibXml2 CONFIG) endif() -endif() \ No newline at end of file +endif() diff --git a/cmake/FindOpenImageIO.cmake b/cmake/FindOpenImageIO.cmake deleted file mode 100644 index 4a74f0ad..00000000 --- a/cmake/FindOpenImageIO.cmake +++ /dev/null @@ -1,57 +0,0 @@ -#[=======================================================================[.rst: ----- - -Finds the OpenImageIO library. -This find module will simply redirect to a find_package(CONFIG) hinted to look -into the pxr_ROOT. - - -Imported Targets -^^^^^^^^^^^^^^^^ - -This module provides the following imported targets, if found: - -``OpenImageIO::OpenImageIO`` - The OpenImageIO library - -Result Variables -^^^^^^^^^^^^^^^^ - -This will define the following variables: - -``OpenImageIO_FOUND`` - True if the system has the OpenImageIO library. - - - -#]=======================================================================] -if (TARGET OpenImageIO::OpenImageIO AND TARGET OpenImageIO::OpenImageIO_Util) - return() -endif() - -if(${OpenImageIO_FIND_REQUIRED}) - find_package(OpenImageIO PATHS ${pxr_ROOT} ${pxr_ROOT}/lib64 REQUIRED) -else() - find_package(OpenImageIO PATHS ${pxr_ROOT} ${pxr_ROOT}/lib64) -endif() - -# Ensure both OpenImageIO and OpenImageIO_Util targets are available -if(NOT TARGET OpenImageIO::OpenImageIO_Util AND TARGET OpenImageIO::OpenImageIO) - # Sometimes the Util library is named differently, try to find it - get_target_property(OIIO_LOCATION OpenImageIO::OpenImageIO LOCATION) - get_filename_component(OIIO_DIR ${OIIO_LOCATION} DIRECTORY) - - # Look for the util library in the same directory - find_library(OIIO_UTIL_LIB - NAMES OpenImageIO_Util libOpenImageIO_Util - PATHS ${OIIO_DIR} - NO_DEFAULT_PATH - ) - - if(OIIO_UTIL_LIB) - add_library(OpenImageIO::OpenImageIO_Util UNKNOWN IMPORTED) - set_target_properties(OpenImageIO::OpenImageIO_Util PROPERTIES - IMPORTED_LOCATION ${OIIO_UTIL_LIB} - ) - endif() -endif() diff --git a/cmake/FindTinyGLTF.cmake b/cmake/FindTinyGLTF.cmake index 664f0fca..7220dd18 100644 --- a/cmake/FindTinyGLTF.cmake +++ b/cmake/FindTinyGLTF.cmake @@ -29,22 +29,31 @@ if(TARGET tinygltf::tinygltf) endif() if(USD_FILEFORMATS_FORCE_FETCHCONTENT OR USD_FILEFORMATS_FETCH_TINYGLTF) + + find_package(nlohmann_json REQUIRED) + message(STATUS "Fetching TinyGLTF") include(CPM) set(TINYGLTF_BUILD_LOADER_EXAMPLE OFF) - set(TINYGLTF_INSTALL OFF) - set(TINYGLTF_HEADER_ONLY ON) + set(TINYGLTF_INSTALL ON) + set(TINYGLTF_HEADER_ONLY OFF) + set(_saved_BUILD_SHARED_LIBS_TinyGLTF ${BUILD_SHARED_LIBS}) + set(BUILD_SHARED_LIBS OFF) + CPMAddPackage( NAME TinyGLTF GIT_REPOSITORY "https://github.com/syoyo/tinygltf.git" - GIT_TAG "v2.8.21" # 4bfc1fc1807e2e2cf3d3111f67d6ebd957514c80 + GIT_TAG "v2.8.21" ) set(TinyGLTF_FOUND TRUE) add_library(tinygltf::tinygltf ALIAS tinygltf) + set(BUILD_SHARED_LIBS ${_saved_BUILD_SHARED_LIBS_TinyGLTF}) else() if (${TinyGLTF_FIND_REQUIRED}) find_package(TinyGLTF CONFIG REQUIRED) else() find_package(TinyGLTF CONFIG) endif() -endif() \ No newline at end of file +endif() + +target_link_libraries(tinygltf INTERFACE nlohmann_json::nlohmann_json) \ No newline at end of file diff --git a/cmake/FindZLIB.cmake b/cmake/FindZLIB.cmake index 87c31dfd..dfed929c 100644 --- a/cmake/FindZLIB.cmake +++ b/cmake/FindZLIB.cmake @@ -46,7 +46,7 @@ if(USD_FILEFORMATS_FORCE_FETCHCONTENT OR USD_FILEFORMATS_FETCH_ZLIB) CPMAddPackage( NAME ZLIB GIT_REPOSITORY "https://github.com/madler/zlib.git" - GIT_TAG "cacf7f1d4e3d44d871b605da3b647f07d718623f" # /tag/v1.2.11 + GIT_TAG "v1.3.1" ) set(ZLIB_FOUND TRUE) add_library(ZLIB::ZLIB ALIAS zlib) @@ -114,4 +114,4 @@ else() elseif(${ZLIB_FIND_REQUIRED}) message(FATAL_ERROR "Could not find ZLIB") endif() -endif() \ No newline at end of file +endif() diff --git a/cmake/Finddraco.cmake b/cmake/Finddraco.cmake index 5f3e7df1..94be1688 100644 --- a/cmake/Finddraco.cmake +++ b/cmake/Finddraco.cmake @@ -87,4 +87,4 @@ else() elseif(${draco_FIND_REQUIRED}) message(FATAL_ERROR "Could not find draco") endif() -endif() \ No newline at end of file +endif() diff --git a/cmake/Findfmt.cmake b/cmake/Findfmt.cmake index 7d1ed4b3..7e931f0a 100644 --- a/cmake/Findfmt.cmake +++ b/cmake/Findfmt.cmake @@ -34,7 +34,7 @@ if(USD_FILEFORMATS_FORCE_FETCHCONTENT OR USD_FILEFORMATS_FETCH_FMT) CPMAddPackage( NAME fmt GIT_REPOSITORY "https://github.com/fmtlib/fmt.git" - GIT_TAG "10.1.1" # f5e54359df4c26b6230fc61d38aa294581393084 + GIT_TAG "10.1.1" ) set(fmt_FOUND TRUE) else() diff --git a/cmake/Findnlohmann_json.cmake b/cmake/Findnlohmann_json.cmake new file mode 100644 index 00000000..a4d5ca61 --- /dev/null +++ b/cmake/Findnlohmann_json.cmake @@ -0,0 +1,46 @@ +# +# Copyright 2020 Adobe. All rights reserved. +# This file is licensed to you under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. You may obtain a copy +# of the License at http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software distributed under +# the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS +# OF ANY KIND, either express or implied. See the License for the specific language +# governing permissions and limitations under the License. +# +if(TARGET nlohmann_json::nlohmann_json) + return() +endif() + +message(STATUS "Third-party (external): creating target 'nlohmann_json::nlohmann_json'") + +# nlohmann_json is a big repo for a single header, so we just download the release archive +set(NLOHMANNJSON_VERSION "v3.11.3") + +include(CPM) +CPMAddPackage( + NAME nlohmann_json + URL "https://github.com/nlohmann/json/releases/download/${NLOHMANNJSON_VERSION}/include.zip" + URL_HASH SHA256=a22461d13119ac5c78f205d3df1db13403e58ce1bb1794edc9313677313f4a9d +) + +add_library(nlohmann_json INTERFACE) +add_library(nlohmann_json::nlohmann_json ALIAS nlohmann_json) + +include(GNUInstallDirs) +target_include_directories(nlohmann_json INTERFACE + "$/include" + "$" +) +target_compile_features(nlohmann_json INTERFACE cxx_std_11) + +set(nlohmann_json_FOUND TRUE) + +# Install rules +set(CMAKE_INSTALL_DEFAULT_COMPONENT_NAME nlohmann_json) +install(DIRECTORY ${nlohmann_json_SOURCE_DIR}/include/nlohmann DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) +install(TARGETS nlohmann_json EXPORT NlohmannJson_Targets) +install(EXPORT NlohmannJson_Targets DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/nlohmann_json NAMESPACE nlohmann_json::) +export(EXPORT NlohmannJson_Targets FILE "${CMAKE_CURRENT_BINARY_DIR}/NlohmannJsonTargets.cmake") + diff --git a/fbx/README.md b/fbx/README.md index 6cefd8ce..1f9f33e4 100644 --- a/fbx/README.md +++ b/fbx/README.md @@ -117,6 +117,14 @@ Note that PBR materials are not supported on export, only Phong The material network uses `MaterialX` nodes to express individual operations and has an `OpenPBR` surface, which has rich support for PBR oriented materials. +* `preserveExtraMaterialInfo`: Generate shading networks with extra data for transcoding. Default is `true` + When this is enabled, the generated shading networks might contain extra inputs that are outside of the respective + material surface schema, that are useful for transcoding purposes. For example, the `OpenPBR` surface does not have + an `occlusion` input for ambient occlusion, but we might want to express such a signal, if it was present in the + source asset, so that an exporter can pick-up said signal and use it when generating an output asset. + When `preserveExtraMaterialInfo` is `false`, the code will not generate these extra fields that are outside of the + schema, which won't affect renders, but can affect the transcoding abilities. + * `fbxPhong`: Forces phong to PBR material conversion. By default turned off: the plugin imports the diffuse component only, without specularities. The following converts PBR to phong. @@ -128,14 +136,23 @@ Note that PBR materials are not supported on export, only Phong The phong to PBR conversion follows https://docs.microsoft.com/en-us/azure/remote-rendering/reference/material-mapping. Keep in mind it is a lossy conversion. -* `fbxOriginalColorSpace`: Convert colors from sRGB to linear. Default: `""` +* `fbxOriginalColorSpace`: Specify the color space of the FBX data. Default: `""` (no conversion) + **Default behavior:** When not specified, the plugin performs **no color conversion** — color values + are passed through as-is and annotated as `raw` (unknown colorspace). This allows the client + application to handle color management according to its needs. + **When set to `sRGB`:** The plugin converts sRGB color values to linear on import, as USD expects + linear color data for rendering. The converted data is annotated as `raw` (linear). USD uses a linear colorspace, however, FBX colorspace could be either linear or sRGB. - The user can set which one the data was in during import. If the data is in `sRGB` it will be converted to linear - for USD. Exporting will also consider the original color space. See Export -> `outputColorSpace` for details. + The user can set which one the data was in during import. Exporting will also consider the + original color space. See Export -> `outputColorSpace` for details. ``` from pxr import Usd + # No conversion (default) - data passed through as-is + stage = Usd.Stage.Open("cube.fbx") + + # Convert sRGB to linear stage = Usd.Stage.Open("cube.fbx:SDF_FORMAT_ARGS:fbxOriginalColorSpace=sRGB") ``` diff --git a/fbx/src/CMakeLists.txt b/fbx/src/CMakeLists.txt index 8a6b2787..e35c23b8 100644 --- a/fbx/src/CMakeLists.txt +++ b/fbx/src/CMakeLists.txt @@ -22,6 +22,7 @@ PRIVATE target_include_directories(usdFbx PRIVATE + "${CMAKE_CURRENT_SOURCE_DIR}" "${PROJECT_BINARY_DIR}" ) @@ -39,32 +40,6 @@ PRIVATE fbxsdk::fbxsdk ) -target_precompile_headers(usdFbx -PRIVATE - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" -) - # Installation of plugin files mimics the file structure that USD has for plugins, # so it is easy to deploy it in a pre-existing USD build, if one chooses to do so. @@ -79,17 +54,19 @@ set_target_properties(usdFbx PROPERTIES RESOURCE ${CMAKE_CURRENT_BINARY_DIR}/plu set_target_properties(usdFbx PROPERTIES RESOURCE_FILES "${CMAKE_CURRENT_BINARY_DIR}/plugInfo.json:plugInfo.json") +# USDFBX_DESTINATION is set in the parent scope by the add_usd_fileformat macro + if(USDFBX_ENABLE_INSTALL) install( TARGETS usdFbx - RUNTIME DESTINATION plugin/usd COMPONENT Runtime - LIBRARY DESTINATION plugin/usd COMPONENT Runtime - RESOURCE DESTINATION plugin/usd/usdFbx/resources COMPONENT Runtime + RUNTIME DESTINATION ${USDFBX_DESTINATION} COMPONENT Runtime + LIBRARY DESTINATION ${USDFBX_DESTINATION} COMPONENT Runtime + RESOURCE DESTINATION ${USDFBX_DESTINATION}/usdFbx/resources COMPONENT Runtime ) install( FILES plugInfo.root.json - DESTINATION plugin/usd + DESTINATION ${USDFBX_DESTINATION} RENAME plugInfo.json COMPONENT Runtime ) diff --git a/fbx/src/api.h b/fbx/src/api.h index eb1d40a6..07dc65da 100644 --- a/fbx/src/api.h +++ b/fbx/src/api.h @@ -14,19 +14,19 @@ governing permissions and limitations under the License. #include "pxr/base/arch/export.h" #if defined(PXR_STATIC) -# define USDFBX_API -# define USDFBX_API_TEMPLATE_CLASS(...) -# define USDFBX_API_TEMPLATE_STRUCT(...) -# define USDFBX_LOCAL +#define USDFBX_API +#define USDFBX_API_TEMPLATE_CLASS(...) +#define USDFBX_API_TEMPLATE_STRUCT(...) +#define USDFBX_LOCAL #else -# if defined(USDFBX_EXPORTS) -# define USDFBX_API ARCH_EXPORT -# define USDFBX_API_TEMPLATE_CLASS(...) ARCH_EXPORT_TEMPLATE(class, __VA_ARGS__) -# define USDFBX_API_TEMPLATE_STRUCT(...) ARCH_EXPORT_TEMPLATE(struct, __VA_ARGS__) -# else -# define USDFBX_API ARCH_IMPORT -# define USDFBX_API_TEMPLATE_CLASS(...) ARCH_IMPORT_TEMPLATE(class, __VA_ARGS__) -# define USDFBX_API_TEMPLATE_STRUCT(...) ARCH_IMPORT_TEMPLATE(struct, __VA_ARGS__) -# endif -# define USDFBX_LOCAL ARCH_HIDDEN +#if defined(USDFBX_EXPORTS) +#define USDFBX_API ARCH_EXPORT +#define USDFBX_API_TEMPLATE_CLASS(...) ARCH_EXPORT_TEMPLATE(class, __VA_ARGS__) +#define USDFBX_API_TEMPLATE_STRUCT(...) ARCH_EXPORT_TEMPLATE(struct, __VA_ARGS__) +#else +#define USDFBX_API ARCH_IMPORT +#define USDFBX_API_TEMPLATE_CLASS(...) ARCH_IMPORT_TEMPLATE(class, __VA_ARGS__) +#define USDFBX_API_TEMPLATE_STRUCT(...) ARCH_IMPORT_TEMPLATE(struct, __VA_ARGS__) +#endif +#define USDFBX_LOCAL ARCH_HIDDEN #endif diff --git a/fbx/src/fbx.cpp b/fbx/src/fbx.cpp index 4a02965d..8e9875fe 100644 --- a/fbx/src/fbx.cpp +++ b/fbx/src/fbx.cpp @@ -12,8 +12,8 @@ governing permissions and limitations under the License. #include "fbx.h" #include "debugCodes.h" #include -#include #include +#include #include #include #include diff --git a/fbx/src/fbx.h b/fbx/src/fbx.h index cb81acbc..107977a4 100644 --- a/fbx/src/fbx.h +++ b/fbx/src/fbx.h @@ -11,15 +11,14 @@ governing permissions and limitations under the License. */ #pragma once #include +#include #include #include #include #include #include -#include #include - // Dev Notes // * FBX's `GetDirectArray()` can be troublesome when paired with `auto`! Better specify the full // type: diff --git a/fbx/src/fbxExport.cpp b/fbx/src/fbxExport.cpp index 94df7316..66b32307 100644 --- a/fbx/src/fbxExport.cpp +++ b/fbx/src/fbxExport.cpp @@ -952,7 +952,7 @@ exportFbxInput(ExportFbxContext& ctx, const ImageAsset& image = inputTranslator.getImage(input.image); FbxFileTexture* fbxTexture = FbxFileTexture::Create(ctx.fbx->scene, image.name.c_str()); - std::string path = ctx.exportParentPath + image.uri; + std::string path = ctx.exportParentPath + TfGetBaseName(image.uri); fbxTexture->SetFileName(path.c_str()); // File is in current directory. fbxTexture->SetTextureUse(textureUse); fbxTexture->SetWrapMode(getWrapMode(input.wrapS), getWrapMode(input.wrapT)); @@ -975,7 +975,7 @@ exportFbxInput(ExportFbxContext& ctx, return true; } else if (!input.value.IsEmpty()) { // using the sRGB colorspace should only be used for vec3 values - if (colorSpace == AdobeTokens->sRGB) { + if (ctx.convertColorSpaceToSRGB && colorSpace == AdobeTokens->sRGB) { exportFbxPropertyAsSRGB(input.value, property); } else { exportFbxProperty(input.value, property); diff --git a/fbx/src/fbxImport.cpp b/fbx/src/fbxImport.cpp index eaad37e8..84e915d0 100644 --- a/fbx/src/fbxImport.cpp +++ b/fbx/src/fbxImport.cpp @@ -10,6 +10,7 @@ OF ANY KIND, either express or implied. See the License for the specific languag governing permissions and limitations under the License. */ #include "fbxImport.h" + #include "debugCodes.h" #include #include @@ -38,6 +39,7 @@ struct ImportedFbxSkeleton { FbxNode* fbxParent = nullptr; std::vector fbxSkeletons; + FbxAMatrix parentGlobalInverse; }; struct ImportFbxContext @@ -61,6 +63,8 @@ struct ImportFbxContext std::unordered_map bonesMap; // Maps an FbxNode* to a skeleton index. No repeated entries expected. std::unordered_map skeletonsMap; + // Tracks which skeleton nodes have animations and will be handled by skeletal animation system + std::unordered_set animatedSkeletonNodes; // Stores Fbx data related to a skeleton. One per USD skeletonIndex std::vector skeletons; @@ -150,7 +154,7 @@ importFbxSettings(ImportFbxContext& ctx) // https://forums.autodesk.com/t5/fbx-forum/evaluating-with-animation-turned-off/td-p/7052419 class ScopedAnimStackDisabler { - public: +public: ScopedAnimStackDisabler(ImportFbxContext& ctx) : mCtx(ctx) { @@ -166,7 +170,7 @@ class ScopedAnimStackDisabler } } - private: +private: ImportFbxContext& mCtx; }; @@ -191,95 +195,101 @@ importFbxTransform(ImportFbxContext& ctx, scale = scaleH; }; - for (int animationStackIndex = 0; animationStackIndex < ctx.animationStacks.size(); - animationStackIndex++) { - // Set the current animation stack so that EvaluateLocalTransform will return the correct - // value - ctx.scene->SetCurrentAnimationStack(ctx.animationStacks[animationStackIndex].stack); - - AnimationTrack& track = ctx.usd->animationTracks[animationStackIndex]; - const ImportedFbxStack& fbxStack = ctx.animationStacks[animationStackIndex]; - - std::set keyFrameTimes; - - // Helper function to get the times of every keyframe from a particular animation curve - auto addFrameTimes = [&keyFrameTimes](const FbxAnimCurve* curve) { - if (curve != nullptr) { - // We found animation data, so we extract every keyframe to process below - int keyCount = curve->KeyGetCount(); - for (int keyIndex = 0; keyIndex < keyCount; ++keyIndex) { - keyFrameTimes.insert(curve->KeyGetTime(keyIndex)); + // Only import regular node animations if this is not an animated skeleton node + // Animated skeleton nodes get their animations from the skeletal animation system + bool isAnimatedSkeletonNode = + (ctx.animatedSkeletonNodes.find(fbxNode) != ctx.animatedSkeletonNodes.end()); + if (!isAnimatedSkeletonNode) { + for (int animationStackIndex = 0; animationStackIndex < ctx.animationStacks.size(); + animationStackIndex++) { + // Set the current animation stack so that EvaluateLocalTransform will return the + // correct value + ctx.scene->SetCurrentAnimationStack(ctx.animationStacks[animationStackIndex].stack); + + AnimationTrack& track = ctx.usd->animationTracks[animationStackIndex]; + const ImportedFbxStack& fbxStack = ctx.animationStacks[animationStackIndex]; + + std::set keyFrameTimes; + + // Helper function to get the times of every keyframe from a particular animation curve + auto addFrameTimes = [&keyFrameTimes](const FbxAnimCurve* curve) { + if (curve != nullptr) { + // We found animation data, so we extract every keyframe to process below + int keyCount = curve->KeyGetCount(); + for (int keyIndex = 0; keyIndex < keyCount; ++keyIndex) { + keyFrameTimes.insert(curve->KeyGetTime(keyIndex)); + } } - } - }; + }; - // For each animation layer, check every property for animation curves and extract the - // keyframes to process - for (FbxAnimLayer* animLayer : fbxStack.animLayers) { - for (auto property = fbxNode->GetFirstProperty(); property.IsValid(); - property = fbxNode->GetNextProperty(property)) { + // For each animation layer, check every property for animation curves and extract the + // keyframes to process + for (FbxAnimLayer* animLayer : fbxStack.animLayers) { + for (auto property = fbxNode->GetFirstProperty(); property.IsValid(); + property = fbxNode->GetNextProperty(property)) { - if (!property.IsAnimated(animLayer)) { - continue; - } + if (!property.IsAnimated(animLayer)) { + continue; + } - FbxAnimCurve* curve = property.GetCurve(animLayer); - FbxAnimCurveNode* curveNode = property.GetCurveNode(animLayer); + FbxAnimCurve* curve = property.GetCurve(animLayer); + FbxAnimCurveNode* curveNode = property.GetCurveNode(animLayer); - // Usually the curve has animation data, but sometimes it is null but at least one - // of the curveNode's channels do. For this reason, we check them all - addFrameTimes(curve); - int numChannels = curveNode ? curveNode->GetChannelsCount() : 0; - for (int channelIndex = 0; channelIndex < numChannels; ++channelIndex) { - addFrameTimes(curveNode->GetCurve(channelIndex)); + // Usually the curve has animation data, but sometimes it is null but at least + // one of the curveNode's channels do. For this reason, we check them all + addFrameTimes(curve); + int numChannels = curveNode ? curveNode->GetChannelsCount() : 0; + for (int channelIndex = 0; channelIndex < numChannels; ++channelIndex) { + addFrameTimes(curveNode->GetCurve(channelIndex)); + } } } - } - size_t numKeyFrames = keyFrameTimes.size(); - if (numKeyFrames > 0) { - node.animations.resize(ctx.animationStacks.size()); - } else { - continue; - } + size_t numKeyFrames = keyFrameTimes.size(); + if (numKeyFrames > 0) { + node.animations.resize(ctx.animationStacks.size()); + } else { + continue; + } - track.hasTimepoints = true; - ctx.usd->hasAnimations = true; + track.hasTimepoints = true; + ctx.usd->hasAnimations = true; - NodeAnimation& nodeAnimation = node.animations[animationStackIndex]; + NodeAnimation& nodeAnimation = node.animations[animationStackIndex]; - nodeAnimation.translations.times.clear(); - nodeAnimation.translations.times.reserve(numKeyFrames); - nodeAnimation.translations.values.reserve(numKeyFrames); + nodeAnimation.translations.times.clear(); + nodeAnimation.translations.times.reserve(numKeyFrames); + nodeAnimation.translations.values.reserve(numKeyFrames); - nodeAnimation.rotations.times.clear(); - nodeAnimation.rotations.times.reserve(numKeyFrames); - nodeAnimation.rotations.values.reserve(numKeyFrames); + nodeAnimation.rotations.times.clear(); + nodeAnimation.rotations.times.reserve(numKeyFrames); + nodeAnimation.rotations.values.reserve(numKeyFrames); - nodeAnimation.scales.times.clear(); - nodeAnimation.scales.times.reserve(numKeyFrames); - nodeAnimation.scales.values.reserve(numKeyFrames); + nodeAnimation.scales.times.clear(); + nodeAnimation.scales.times.reserve(numKeyFrames); + nodeAnimation.scales.values.reserve(numKeyFrames); - for (auto keyFrameTime : keyFrameTimes) { - GfVec3f translation; - GfQuatf rotation; - GfVec3f scale; - float time = keyFrameTime.GetSecondDouble(); - decomposeTransformation(translation, - rotation, - scale, - useGlobalTransform - ? fbxNode->EvaluateGlobalTransform(keyFrameTime) - : fbxNode->EvaluateLocalTransform(keyFrameTime)); + for (auto keyFrameTime : keyFrameTimes) { + GfVec3f translation; + GfQuatf rotation; + GfVec3f scale; + float time = keyFrameTime.GetSecondDouble(); + decomposeTransformation(translation, + rotation, + scale, + useGlobalTransform + ? fbxNode->EvaluateGlobalTransform(keyFrameTime) + : fbxNode->EvaluateLocalTransform(keyFrameTime)); - nodeAnimation.translations.times.push_back(time); - nodeAnimation.translations.values.push_back(translation); + nodeAnimation.translations.times.push_back(time); + nodeAnimation.translations.values.push_back(translation); - nodeAnimation.rotations.times.push_back(time); - nodeAnimation.rotations.values.push_back(rotation); + nodeAnimation.rotations.times.push_back(time); + nodeAnimation.rotations.values.push_back(rotation); - nodeAnimation.scales.times.push_back(time); - nodeAnimation.scales.values.push_back(scale); + nodeAnimation.scales.times.push_back(time); + nodeAnimation.scales.values.push_back(scale); + } } } @@ -422,9 +432,9 @@ importFbxMesh(ImportFbxContext& ctx, FbxMesh* fbxMesh, int parent) for (size_t i = 0; i < tangentCount; i++) { FbxVector4 tangent = tangentElement->GetDirectArray().GetAt(i); mesh.tangents.values[i] = GfVec4f{ static_cast(tangent[0]), - static_cast(tangent[1]), - static_cast(tangent[2]), - static_cast(tangent[3]) }; + static_cast(tangent[1]), + static_cast(tangent[2]), + static_cast(tangent[3]) }; } } else { // FbxGeometryElement::eIndexToDirect size_t tangentCount = tangentElement->GetIndexArray().GetCount(); @@ -433,9 +443,9 @@ importFbxMesh(ImportFbxContext& ctx, FbxMesh* fbxMesh, int parent) int tangentIndex = tangentElement->GetIndexArray().GetAt(i); FbxVector4 tangent = tangentElement->GetDirectArray().GetAt(tangentIndex); mesh.tangents.values[i] = GfVec4f{ static_cast(tangent[0]), - static_cast(tangent[1]), - static_cast(tangent[2]), - static_cast(tangent[3]) }; + static_cast(tangent[1]), + static_cast(tangent[2]), + static_cast(tangent[3]) }; } } } @@ -450,8 +460,8 @@ importFbxMesh(ImportFbxContext& ctx, FbxMesh* fbxMesh, int parent) for (size_t i = 0; i < binormalCount; i++) { FbxVector4 binormal = binormalElement->GetDirectArray().GetAt(i); mesh.bitangents.values[i] = GfVec3f{ static_cast(binormal[0]), - static_cast(binormal[1]), - static_cast(binormal[2]) }; + static_cast(binormal[1]), + static_cast(binormal[2]) }; } } else { // FbxGeometryElement::eIndexToDirect size_t binormalCount = binormalElement->GetIndexArray().GetCount(); @@ -460,8 +470,8 @@ importFbxMesh(ImportFbxContext& ctx, FbxMesh* fbxMesh, int parent) int binormalIndex = binormalElement->GetIndexArray().GetAt(i); FbxVector4 binormal = binormalElement->GetDirectArray().GetAt(binormalIndex); mesh.bitangents.values[i] = GfVec3f{ static_cast(binormal[0]), - static_cast(binormal[1]), - static_cast(binormal[2]) }; + static_cast(binormal[1]), + static_cast(binormal[2]) }; } } } @@ -562,7 +572,26 @@ importFbxMesh(ImportFbxContext& ctx, FbxMesh* fbxMesh, int parent) TF_WARN("Skin: %d first cluster does not have a first link.\n", i); continue; } - size_t skeletonIndex = ctx.skeletonsMap[firstlink]; + + // Use find() instead of operator[] to avoid creating default entries + // for nodes not in any skeleton, and validate skeleton index bounds + auto skelIt = ctx.skeletonsMap.find(firstlink); + if (skelIt == ctx.skeletonsMap.end()) { + TF_WARN("Skin %d first link node '%s' not found in skeletons map\n", + i, + firstlink->GetName()); + continue; + } + size_t skeletonIndex = skelIt->second; + + // Validate skeleton index before accessing + if (skeletonIndex >= ctx.usd->skeletons.size()) { + TF_WARN("Skeleton index %zu out of bounds (size %zu) for skin %d\n", + skeletonIndex, + ctx.usd->skeletons.size(), + i); + continue; + } ctx.meshSkinsMap[meshIndex] = skeletonIndex; ctx.usd->skeletons[skeletonIndex].meshSkinningTargets.push_back(meshIndex); @@ -570,8 +599,12 @@ importFbxMesh(ImportFbxContext& ctx, FbxMesh* fbxMesh, int parent) // set the mesh geomBindTransform based on the transform matrix // For some reason, FBX put this matrix on the cluster, but we should get the same // result no matter which cluster we look at. + // Factor out the skeleton parent's global transform to make the bind transform + // relative to the parent (armature) node. FbxAMatrix geomBindTransform; firstCluster->GetTransformMatrix(geomBindTransform); + const FbxAMatrix& parentInv = ctx.skeletons[skeletonIndex].parentGlobalInverse; + geomBindTransform = parentInv * geomBindTransform; mesh.geomBindTransform = GetUSDMatrixFromFBX(geomBindTransform); Skeleton& skeleton = ctx.usd->skeletons[skeletonIndex]; @@ -588,7 +621,19 @@ importFbxMesh(ImportFbxContext& ctx, FbxMesh* fbxMesh, int parent) continue; } - size_t jointIndex = ctx.bonesMap[link]; + // Use find() instead of operator[] to avoid creating default entries + // for nodes not in the skeleton, and validate bounds before accessing + // bindTransforms + auto boneIt = ctx.bonesMap.find(link); + if (boneIt == ctx.bonesMap.end()) { + TF_WARN("Cluster link node '%s' not found in skeleton bones map for skin %d " + "cluster %d\n", + link->GetName(), + i, + j); + continue; + } + size_t jointIndex = boneIt->second; // if the linkMode for any cluster is not eNormalize, then we will disable weight // normalization @@ -596,22 +641,37 @@ importFbxMesh(ImportFbxContext& ctx, FbxMesh* fbxMesh, int parent) if (FbxCluster::ELinkMode::eNormalize != clusterLinkMode) linkMode = clusterLinkMode; - // Set the bindTransform for the joint + // Set the bindTransform for the joint, factoring out the skeleton parent's + // global transform to avoid double-application through the USD hierarchy. FbxAMatrix linkTransform; cluster->GetTransformLinkMatrix(linkTransform); + linkTransform = parentInv * linkTransform; // XXX In theory different meshes could have different link transforms in the case // where they share the same skeleton/links. If that can happen, we'd end up with a // conflict trying to share the skeleton as USD stores the bindTransform on the // skeleton, not on the mesh. We haven't seen this yet though, so we don't try to // un-share the skeletons in this case, and instead just ovewrite the bindTransforms + + // Validate jointIndex is within bounds before writing + if (jointIndex >= skeleton.bindTransforms.size()) { + TF_WARN( + "Joint index %zu exceeds bind transforms size %zu for skin %d cluster %d\n", + jointIndex, + skeleton.bindTransforms.size(), + i, + j); + continue; + } skeleton.bindTransforms[jointIndex] = GetUSDMatrixFromFBX(linkTransform); int clusterControlPointIndicesCount = cluster->GetControlPointIndicesCount(); int* clusterControlPointIndices = cluster->GetControlPointIndices(); double* pointsWeights = cluster->GetControlPointWeights(); if (clusterControlPointIndices == nullptr) { - TF_WARN("No cluster control point indices for skin cluster: %d.\n", j); + // This is normal for some meshes, so don't warn about it as it can spam the + // console + // TF_WARN("No cluster control point indices for skin cluster: %d.\n", j); continue; } if (pointsWeights == nullptr) { @@ -620,9 +680,12 @@ importFbxMesh(ImportFbxContext& ctx, FbxMesh* fbxMesh, int parent) } for (int k = 0; k < clusterControlPointIndicesCount; k++) { int controlPointIndex = clusterControlPointIndices[k]; - if (controlPointIndex > indexes.size() || controlPointIndex > weights.size()) { + // Use >= instead of > to prevent off-by-one out-of-bounds access + if (controlPointIndex < 0 || + static_cast(controlPointIndex) >= indexes.size() || + static_cast(controlPointIndex) >= weights.size()) { TF_WARN("Control Point Index outside of index or weight bounds. index: %d " - " Index Size: %d Weight Size: %d", + " Index Size: %zu Weight Size: %zu", controlPointIndex, indexes.size(), weights.size()); @@ -692,8 +755,8 @@ importFbxMesh(ImportFbxContext& ctx, FbxMesh* fbxMesh, int parent) // If there are no element materials, FBX defaults to using the first material for the // whole mesh TF_DEBUG_MSG(FILE_FORMAT_FBX, - "Mesh[%s] has no material elements. Defaulting to use first material\n", - mesh.name.c_str()); + "Mesh[%s] has no material elements. Defaulting to use first material\n", + mesh.name.c_str()); FbxSurfaceMaterial* fbxMaterial = fbxNode->GetMaterial(0); const auto& it = ctx.materials.find(fbxMaterial); @@ -884,7 +947,8 @@ importPropTexture(ImportFbxContext& ctx, if (!FbxProperty::HasDefaultValue(prop)) { input.value = readPropValue(prop); } - if (colorSpace == AdobeTokens->sRGB) { + bool convertToLinear = (ctx.originalColorSpace == AdobeTokens->sRGB); + if (convertToLinear && colorSpace == AdobeTokens->sRGB) { input.value = srgbToLinear(input.value); } // It's handy to also print the value here, besides the texture information @@ -897,7 +961,11 @@ importPropTexture(ImportFbxContext& ctx, printPropValue(prop).c_str(), colorSpace == AdobeTokens->sRGB ? "(sRGB)" : "(raw)", textureFilename.c_str()); - input.colorspace = colorSpace; + // Set the colorspace annotation: + // - If conversion happened, data is now linear (raw) + // - If no conversion and originalColorSpace not set, use raw (unknown colorspace) + // - Otherwise, keep the semantic colorspace annotation + input.colorspace = convertToLinear ? AdobeTokens->raw : colorSpace; } static const FbxImplementation* @@ -1011,28 +1079,33 @@ _mapAutodeskStandardMaterial(const FbxSurfaceMaterial* fbxMaterial, TF_DEBUG_MSG(FILE_FORMAT_FBX, "Checking if %s is an Autodesk Standard Surface Material\n", fbxMaterial->GetName()); + // Determine the effective colorspace for color properties based on the originalColorSpace + // option. If originalColorSpace is set to sRGB, color data will be converted to linear and + // stored as raw. If originalColorSpace is not set, no conversion happens and data is passed + // through as raw (unknown colorspace - let the client application handle color management). + const TfToken& colorPropertySpace = + (ctx.originalColorSpace == AdobeTokens->sRGB) ? AdobeTokens->sRGB : AdobeTokens->raw; + // This will contain the properties that are directly mapped from the standard surface exactly - // as is. We need to note if they are One or Three channels and if they are sRGB or raw for - // later usage. - std::unordered_map> + // as is. We need to note if they are One or Three channels and the colorspace for later usage. + std::unordered_map> standardSurfToUsdProperty = { { "base_color", - { usdMaterial.diffuseColor, FbxPropertyNumChannels::Three, AdobeTokens->sRGB } }, + { usdMaterial.diffuseColor, FbxPropertyNumChannels::Three, colorPropertySpace } }, { "specular_color", - { usdMaterial.specularColor, FbxPropertyNumChannels::Three, AdobeTokens->sRGB } }, + { usdMaterial.specularColor, FbxPropertyNumChannels::Three, colorPropertySpace } }, { "metalness", { usdMaterial.metallic, FbxPropertyNumChannels::One, AdobeTokens->raw } }, { "specular_roughness", { usdMaterial.roughness, FbxPropertyNumChannels::One, AdobeTokens->raw } }, { "coat", { usdMaterial.clearcoat, FbxPropertyNumChannels::One, AdobeTokens->raw } }, { "coat_color", - { usdMaterial.clearcoatColor, FbxPropertyNumChannels::Three, AdobeTokens->sRGB } }, + { usdMaterial.clearcoatColor, FbxPropertyNumChannels::Three, colorPropertySpace } }, { "coat_roughness", { usdMaterial.clearcoatRoughness, FbxPropertyNumChannels::One, AdobeTokens->raw } }, { "coat_IOR", { usdMaterial.clearcoatIor, FbxPropertyNumChannels::One, AdobeTokens->raw } }, { "sheen_color", - { usdMaterial.sheenColor, FbxPropertyNumChannels::Three, AdobeTokens->sRGB } }, + { usdMaterial.sheenColor, FbxPropertyNumChannels::Three, colorPropertySpace } }, { "sheen_roughness", { usdMaterial.sheenRoughness, FbxPropertyNumChannels::One, AdobeTokens->raw } }, { "specular_anisotropy", @@ -1045,9 +1118,9 @@ _mapAutodeskStandardMaterial(const FbxSurfaceMaterial* fbxMaterial, { "transmission_depth", { usdMaterial.absorptionDistance, FbxPropertyNumChannels::One, AdobeTokens->raw } }, { "transmission_color", - { usdMaterial.absorptionColor, FbxPropertyNumChannels::Three, AdobeTokens->sRGB } }, + { usdMaterial.absorptionColor, FbxPropertyNumChannels::Three, colorPropertySpace } }, { "subsurface_color", - { usdMaterial.scatteringColor, FbxPropertyNumChannels::Three, AdobeTokens->sRGB } }, + { usdMaterial.scatteringColor, FbxPropertyNumChannels::Three, colorPropertySpace } }, }; // Make a set that has all the properties we want to validate to confirm this is a standard @@ -1096,19 +1169,22 @@ _mapAutodeskStandardMaterial(const FbxSurfaceMaterial* fbxMaterial, // If we got here then we assume this is one of the standard shader variants because it had all // of the properties we are expecting to see and use to map to USD for (auto& it : standardSurfToUsdProperty) { - auto property = getProp(it.first); - auto numChannels = std::get<1>(it.second); - auto colorSpace = std::get<2>(it.second); + FbxProperty property = getProp(it.first); + Input& input = std::get<0>(it.second); + FbxPropertyNumChannels numChannels = std::get<1>(it.second); + const TfToken& colorSpace = std::get<2>(it.second); if (numChannels == FbxPropertyNumChannels::One) { auto typedProp = static_cast>(property); - Input input; - importPropTexture(ctx, textures, fbxMaterial, typedProp, input, "r", colorSpace); - inputTranslator.translateDirect(input, std::get<0>(it.second)); + Input tempInput; + importPropTexture(ctx, textures, fbxMaterial, typedProp, tempInput, "r", colorSpace); + inputTranslator.translateDirect(tempInput, input); } else if (numChannels == FbxPropertyNumChannels::Three) { auto typedProp = static_cast>(property); - Input input; - importPropTexture(ctx, textures, fbxMaterial, typedProp, input, "rgb", colorSpace); - inputTranslator.translateDirect(input, std::get<0>(it.second)); + Input tempInput; + importPropTexture(ctx, textures, fbxMaterial, typedProp, tempInput, "rgb", colorSpace); + inputTranslator.translateDirect(tempInput, input); + } else { + TF_CODING_ERROR("Unknown number of channels"); } } @@ -1147,7 +1223,7 @@ _mapAutodeskStandardMaterial(const FbxSurfaceMaterial* fbxMaterial, emissionColorProperty, emissionColorInput, "rgb", - AdobeTokens->sRGB); + colorPropertySpace); // XXX @dcoffey I believe a more proper way to do this is to keep the emissive intensity as a // separate input because in UIs that use a color picker to modify this input you will lose @@ -1159,10 +1235,10 @@ _mapAutodeskStandardMaterial(const FbxSurfaceMaterial* fbxMaterial, auto opacityProperty = getProp(kOpacity); if (opacityProperty.IsValid()) { auto opacityTypedProp = static_cast>(opacityProperty); - FbxDouble3 opacityColor = opacityTypedProp.Get(); + GfVec3f opacityColor = readPropValue(opacityTypedProp); // Convert the opacity color to grayscale and use that as the opacity value - double grayscaleOpacity = (opacityColor[0] + opacityColor[1] + opacityColor[2]) / 3.0; + float grayscaleOpacity = (opacityColor[0] + opacityColor[1] + opacityColor[2]) / 3.0f; usdMaterial.opacity.value = grayscaleOpacity; usdMaterial.opacity.colorspace = AdobeTokens->raw; } @@ -1172,47 +1248,57 @@ _mapAutodeskStandardMaterial(const FbxSurfaceMaterial* fbxMaterial, bool _processHardwareShaderMaterial(const FbxSurfaceMaterial* fbxMaterial, - ImportFbxContext& ctx, - const std::unordered_map& textures, - Material& usdMaterial, - InputTranslator& inputTranslator) + ImportFbxContext& ctx, + const std::unordered_map& textures, + Material& usdMaterial, + InputTranslator& inputTranslator) { - TF_DEBUG_MSG(FILE_FORMAT_FBX, "Attempting hardware shader material processing for '%s'\n", - fbxMaterial->GetName()); - + TF_DEBUG_MSG(FILE_FORMAT_FBX, + "Attempting hardware shader material processing for '%s'\n", + fbxMaterial->GetName()); + + // Determine colorspace based on originalColorSpace option + const TfToken& colorPropertySpace = + (ctx.originalColorSpace == AdobeTokens->sRGB) ? AdobeTokens->sRGB : AdobeTokens->raw; + bool foundAnyProperties = false; - + FbxProperty prop = fbxMaterial->GetFirstProperty(); int propertyIndex = 0; - + while (prop.IsValid()) { auto propType = prop.GetPropertyDataType(); - + // Check for ColorAndAlpha properties (typical for 3ds Max materials) if (propType.GetType() == eFbxDouble4) { auto typedProperty = static_cast>(prop); FbxDouble4 colorWithAlpha = typedProperty.Get(); GfVec3f colorValue(colorWithAlpha[0], colorWithAlpha[1], colorWithAlpha[2]); - + // (3ds Max Physical Material stores base_color as the first ColorAndAlpha property) - if (colorValue != GfVec3f(0, 0, 0) && !usdMaterial.diffuseColor.value.IsHolding()) { + if (colorValue != GfVec3f(0, 0, 0) && + !usdMaterial.diffuseColor.value.IsHolding()) { usdMaterial.diffuseColor.value = colorValue; - usdMaterial.diffuseColor.colorspace = AdobeTokens->sRGB; - TF_DEBUG_MSG(FILE_FORMAT_FBX, " Found color at property index %d: (%f, %f, %f)\n", - propertyIndex, colorValue[0], colorValue[1], colorValue[2]); + usdMaterial.diffuseColor.colorspace = colorPropertySpace; + TF_DEBUG_MSG(FILE_FORMAT_FBX, + " Found color at property index %d: (%f, %f, %f)\n", + propertyIndex, + colorValue[0], + colorValue[1], + colorValue[2]); foundAnyProperties = true; } } - + prop = fbxMaterial->GetNextProperty(prop); propertyIndex++; } - + return foundAnyProperties; } // Fallback processor for materials with unknown ShadingModel that fail Lambert/Phong casting. -// This uses property-based detection to extract common material properties regardless of +// This uses property-based detection to extract common material properties regardless of // FBX material type classification. // Returns true if the material was successfully processed as a property-based material bool @@ -1222,31 +1308,43 @@ _processUnknownShadingModel(const FbxSurfaceMaterial* fbxMaterial, Material& usdMaterial, InputTranslator& inputTranslator) { - TF_DEBUG_MSG(FILE_FORMAT_FBX, - "Processing material '%s' with unknown ShadingModel using property-based approach\n", - fbxMaterial->GetName()); - + TF_DEBUG_MSG( + FILE_FORMAT_FBX, + "Processing material '%s' with unknown ShadingModel using property-based approach\n", + fbxMaterial->GetName()); + + // Determine colorspace based on originalColorSpace option + const TfToken& colorPropertySpace = + (ctx.originalColorSpace == AdobeTokens->sRGB) ? AdobeTokens->sRGB : AdobeTokens->raw; + bool foundAnyProperties = false; - + // Helper to safely extract color properties with multiple naming conventions - auto extractColorProperty = [&](const std::vector& names, Input& targetInput) -> bool { + auto extractColorProperty = [&](const std::vector& names, + Input& targetInput) -> bool { for (const std::string& propName : names) { auto property = FbxSurfaceMaterialUtils::GetProperty(propName.c_str(), fbxMaterial); if (property.IsValid()) { // Check for both FbxDouble3DT and ColorRGB types (more flexible) auto propType = property.GetPropertyDataType(); - TF_DEBUG_MSG(FILE_FORMAT_FBX, " Checking property '%s' (type: %s)\n", - propName.c_str(), propType.GetName()); - + TF_DEBUG_MSG(FILE_FORMAT_FBX, + " Checking property '%s' (type: %s)\n", + propName.c_str(), + propType.GetName()); + // Check if property is compatible with FbxDouble3 or FbxDouble4 (ColorAndAlpha) if (propType.GetType() == eFbxDouble3) { auto typedProperty = static_cast>(property); GfVec3f colorValue = readPropValue(typedProperty); if (colorValue != GfVec3f(0, 0, 0)) { // Skip if all zeros targetInput.value = colorValue; - targetInput.colorspace = AdobeTokens->sRGB; - TF_DEBUG_MSG(FILE_FORMAT_FBX, " Found color property '%s': (%f, %f, %f)\n", - propName.c_str(), colorValue[0], colorValue[1], colorValue[2]); + targetInput.colorspace = colorPropertySpace; + TF_DEBUG_MSG(FILE_FORMAT_FBX, + " Found color property '%s': (%f, %f, %f)\n", + propName.c_str(), + colorValue[0], + colorValue[1], + colorValue[2]); return true; } } else if (propType.GetType() == eFbxDouble4) { @@ -1256,22 +1354,32 @@ _processUnknownShadingModel(const FbxSurfaceMaterial* fbxMaterial, GfVec3f colorValue(colorWithAlpha[0], colorWithAlpha[1], colorWithAlpha[2]); if (colorValue != GfVec3f(0, 0, 0)) { // Skip if all zeros targetInput.value = colorValue; - targetInput.colorspace = AdobeTokens->sRGB; - TF_DEBUG_MSG(FILE_FORMAT_FBX, " Found ColorAndAlpha property '%s': (%f, %f, %f, alpha=%f)\n", - propName.c_str(), colorValue[0], colorValue[1], colorValue[2], colorWithAlpha[3]); + targetInput.colorspace = colorPropertySpace; + TF_DEBUG_MSG( + FILE_FORMAT_FBX, + " Found ColorAndAlpha property '%s': (%f, %f, %f, alpha=%f)\n", + propName.c_str(), + colorValue[0], + colorValue[1], + colorValue[2], + colorWithAlpha[3]); return true; } } else { - TF_DEBUG_MSG(FILE_FORMAT_FBX, " Property '%s' has incompatible type '%s', expected FbxDouble3 or FbxDouble4\n", - propName.c_str(), propType.GetName()); + TF_DEBUG_MSG(FILE_FORMAT_FBX, + " Property '%s' has incompatible type '%s', expected FbxDouble3 " + "or FbxDouble4\n", + propName.c_str(), + propType.GetName()); } } } return false; }; - + // Helper to safely extract scalar properties with multiple naming conventions - auto extractScalarProperty = [&](const std::vector& names, Input& targetInput) -> bool { + auto extractScalarProperty = [&](const std::vector& names, + Input& targetInput) -> bool { for (const std::string& propName : names) { auto property = FbxSurfaceMaterialUtils::GetProperty(propName.c_str(), fbxMaterial); if (property.IsValid() && property.GetPropertyDataType() == FbxDoubleDT) { @@ -1279,88 +1387,101 @@ _processUnknownShadingModel(const FbxSurfaceMaterial* fbxMaterial, if (scalarValue > 0.0) { // Skip if zero or negative targetInput.value = static_cast(scalarValue); targetInput.colorspace = AdobeTokens->raw; - TF_DEBUG_MSG(FILE_FORMAT_FBX, " Found scalar property '%s': %f\n", - propName.c_str(), scalarValue); + TF_DEBUG_MSG(FILE_FORMAT_FBX, + " Found scalar property '%s': %f\n", + propName.c_str(), + scalarValue); return true; } } } return false; }; - + // Debug: List all properties available on this material if (TfDebug::IsEnabled(FILE_FORMAT_FBX)) { - TF_DEBUG_MSG(FILE_FORMAT_FBX, "Debugging properties for material '%s':\n", fbxMaterial->GetName()); + TF_DEBUG_MSG( + FILE_FORMAT_FBX, "Debugging properties for material '%s':\n", fbxMaterial->GetName()); FbxProperty prop = fbxMaterial->GetFirstProperty(); int propertyCount = 0; while (prop.IsValid()) { const char* propName = prop.GetName(); auto propType = prop.GetPropertyDataType(); - TF_DEBUG_MSG(FILE_FORMAT_FBX, " Property[%d]: '%s' (type: %s)\n", - propertyCount++, propName, propType.GetName()); + TF_DEBUG_MSG(FILE_FORMAT_FBX, + " Property[%d]: '%s' (type: %s)\n", + propertyCount++, + propName, + propType.GetName()); prop = fbxMaterial->GetNextProperty(prop); } } - + // Try to extract diffuse/base color with the exact property names from FBX ASCII analysis const std::vector colorNames = { // 3ds Max Physical Material properties "3dsMax|Parameters|base_color", // PRIMARY: Properties confirmed in FBX ASCII - "DiffuseColor", // All materials have this exact property - "AmbientColor", // Fallback color property + "DiffuseColor", // All materials have this exact property + "AmbientColor", // Fallback color property // SECONDARY: Common variations - "base_color", "baseColor", "BaseColor", - "diffuseColor", "diffuse_color", - "Color", "color", "Diffuse", "diffuse" + "base_color", + "baseColor", + "BaseColor", + "diffuseColor", + "diffuse_color", + "Color", + "color", + "Diffuse", + "diffuse" }; - + if (extractColorProperty(colorNames, usdMaterial.diffuseColor)) { foundAnyProperties = true; } - + // Try to extract metallic with various naming conventions - const std::vector metallicNames = { - "3dsMax|Parameters|metalness", - "metallic", "Metallic", "metalness", "Metalness", - "metal", "Metal" - }; - + const std::vector metallicNames = { "3dsMax|Parameters|metalness", + "metallic", + "Metallic", + "metalness", + "Metalness", + "metal", + "Metal" }; + if (extractScalarProperty(metallicNames, usdMaterial.metallic)) { foundAnyProperties = true; } - + // Try to extract roughness with various naming conventions const std::vector roughnessNames = { - "3dsMax|Parameters|roughness", - "roughness", "Roughness", "specular_roughness", "SpecularRoughness", - "surface_roughness", "SurfaceRoughness" + "3dsMax|Parameters|roughness", "roughness", "Roughness", "specular_roughness", + "SpecularRoughness", "surface_roughness", "SurfaceRoughness" }; - + if (extractScalarProperty(roughnessNames, usdMaterial.roughness)) { foundAnyProperties = true; } - + // Try to extract emissive color with various naming conventions - const std::vector emissiveNames = { - "emissive", "Emissive", "emissive_color", "EmissiveColor", - "emission", "Emission", "emission_color", "EmissionColor" - }; - + const std::vector emissiveNames = { "emissive", "Emissive", + "emissive_color", "EmissiveColor", + "emission", "Emission", + "emission_color", "EmissionColor" }; + if (extractColorProperty(emissiveNames, usdMaterial.emissiveColor)) { foundAnyProperties = true; } - + if (foundAnyProperties) { - TF_DEBUG_MSG(FILE_FORMAT_FBX, - "Successfully processed material '%s' using property-based approach\n", - fbxMaterial->GetName()); + TF_DEBUG_MSG(FILE_FORMAT_FBX, + "Successfully processed material '%s' using property-based approach\n", + fbxMaterial->GetName()); return true; } - - TF_DEBUG_MSG(FILE_FORMAT_FBX, - "No recognizable properties found for material '%s'\n", - fbxMaterial->GetName()); + + TF_DEBUG_MSG(FILE_FORMAT_FBX, + "No recognizable properties found for material '%s'\n", + fbxMaterial->GetName()); return false; } @@ -1379,7 +1500,8 @@ normalizePathFromAnyOS(const std::string& path) std::replace(normalized.begin(), normalized.end(), '\\', '/'); // Remove any . or .. in the path, and fix up cases where we have consecutive separators - normalized = std::filesystem::u8path(path).lexically_normal().u8string(); + // and then convert path to string using utf8 representation + normalized = convertPathToString(std::filesystem::u8path(path).lexically_normal()); // Replace all backslashes with forward slashes again, as lexically_normal() will convert // to backslashes on Windows. @@ -1395,7 +1517,7 @@ normalizePathFromAnyOS(const std::string& path) static bool isAbsolutePathFromAnyOS(const std::filesystem::path& path) { - std::string filename = path.u8string(); + std::string filename = convertPathToString(path); // 1. Manually check for POSIX absolute paths (starting with '/') if (!filename.empty() && filename[0] == '/') { @@ -1442,7 +1564,7 @@ importFbxMaterials(ImportFbxContext& ctx) std::string baseName; std::string absFileName; // Only used when image is not embedded if (isEmbedded) { - baseName = normalizePathFromAnyOS(origAbsFileName).filename().u8string(); + baseName = convertPathToString(normalizePathFromAnyOS(origAbsFileName).filename()); } else { // GetRelativeFileName() will use the original OS path delimiters. We must normalize it // before adding it to the metadata. @@ -1451,7 +1573,7 @@ importFbxMaterials(ImportFbxContext& ctx) normalizePathFromAnyOS(fileTexture->GetRelativeFileName()); // Add the path to the metadata even if the file is not present on disk. - ctx.usd->importedFileNames.insert(filePathNormalized.u8string()); + ctx.usd->importedFileNames.insert(convertPathToString(filePathNormalized)); std::filesystem::path absFilePath; if (isAbsolutePathFromAnyOS(filePathNormalized)) { @@ -1478,8 +1600,8 @@ importFbxMaterials(ImportFbxContext& ctx) } } - absFileName = absFilePath.u8string(); - baseName = absFilePath.filename().u8string(); + absFileName = convertPathToString(absFilePath); + baseName = convertPathToString(absFilePath.filename()); } textures[texture] = i; @@ -1540,11 +1662,11 @@ importFbxMaterials(ImportFbxContext& ctx) // Try traditional Lambert/Phong casting FbxSurfaceLambert* lambert = FbxCast(material); FbxSurfacePhong* phong = FbxCast(material); - + if (lambert || phong) { // Traditional material processing - MOVED UP from below - TF_DEBUG_MSG(FILE_FORMAT_FBX, "Processing '%s' as Lambert/Phong material\n", - material->GetName()); + TF_DEBUG_MSG( + FILE_FORMAT_FBX, "Processing '%s' as Lambert/Phong material\n", material->GetName()); Input ambientFactor; Input diffuse; @@ -1561,157 +1683,166 @@ importFbxMaterials(ImportFbxContext& ctx) Input reflectionFactor; if (lambert) { - importPropTexture(ctx, - textures, - material, - lambert->AmbientFactor, - ambientFactor, - "r", - AdobeTokens->raw); - importPropTexture(ctx, textures, material, lambert->Diffuse, diffuse, "rgb"); - importPropTexture(ctx, - textures, - material, - lambert->DiffuseFactor, - diffuseFactor, - "r", - AdobeTokens->raw); - importPropTexture(ctx, textures, material, lambert->Emissive, emissive, "rgb"); - importPropTexture(ctx, - textures, - material, - lambert->EmissiveFactor, - emissiveFactor, - "r", - AdobeTokens->raw); - importPropTexture( - ctx, textures, material, lambert->NormalMap, normal, "rgb", AdobeTokens->raw); - importPropTexture(ctx, textures, material, lambert->Bump, bump, "r", AdobeTokens->raw); - - // For transparent textures, we only capture the R channel of the texture as we will - // map this directly to opacity if the texture exists. We do this because the USD - // Preview Surface only has a single-valued opacity property. - // HOWEVER, using the 'r' channel of the TransparentColor texture as an opacity value - // worked for some fbx scenes with separate opacity textures but some fbx scenes - // (possibly incorrectly) used the DiffuseColor texture as the TransparentColor texture. - // This lead to strange results. As a consequence, we are currently ignoring the - // TransparentColor property and will only use the TransparencyFactor and Opacity fbx - // properties on the material to map to the USD opacity property. importPropTexture(ctx, - // textures, material, lambert->TransparentColor, transparentColor, "r", - // AdobeTokens->raw); - - importPropTexture(ctx, - textures, - material, - lambert->TransparencyFactor, - transparencyFactor, - "r", - AdobeTokens->raw); - } - if (phong) { - importPropTexture(ctx, textures, material, phong->Specular, specular, "rgb"); - importPropTexture( - ctx, textures, material, phong->Shininess, shininess, "rgb", AdobeTokens->raw); - importPropTexture(ctx, - textures, - material, - phong->SpecularFactor, - specularFactor, - "r", - AdobeTokens->raw); - importPropTexture(ctx, - textures, - material, - phong->ReflectionFactor, - reflectionFactor, - "r", - AdobeTokens->raw); - } + importPropTexture(ctx, + textures, + material, + lambert->AmbientFactor, + ambientFactor, + "r", + AdobeTokens->raw); + importPropTexture(ctx, textures, material, lambert->Diffuse, diffuse, "rgb"); + importPropTexture(ctx, + textures, + material, + lambert->DiffuseFactor, + diffuseFactor, + "r", + AdobeTokens->raw); + importPropTexture(ctx, textures, material, lambert->Emissive, emissive, "rgb"); + importPropTexture(ctx, + textures, + material, + lambert->EmissiveFactor, + emissiveFactor, + "r", + AdobeTokens->raw); + importPropTexture( + ctx, textures, material, lambert->NormalMap, normal, "rgb", AdobeTokens->raw); + importPropTexture( + ctx, textures, material, lambert->Bump, bump, "r", AdobeTokens->raw); + + // For transparent textures, we only capture the R channel of the texture as we will + // map this directly to opacity if the texture exists. We do this because the USD + // Preview Surface only has a single-valued opacity property. + // HOWEVER, using the 'r' channel of the TransparentColor texture as an opacity + // value worked for some fbx scenes with separate opacity textures but some fbx + // scenes (possibly incorrectly) used the DiffuseColor texture as the + // TransparentColor texture. This lead to strange results. As a consequence, we are + // currently ignoring the TransparentColor property and will only use the + // TransparencyFactor and Opacity fbx properties on the material to map to the USD + // opacity property. importPropTexture(ctx, textures, material, + // lambert->TransparentColor, transparentColor, "r", AdobeTokens->raw); + + importPropTexture(ctx, + textures, + material, + lambert->TransparencyFactor, + transparencyFactor, + "r", + AdobeTokens->raw); + } + if (phong) { + importPropTexture(ctx, textures, material, phong->Specular, specular, "rgb"); + importPropTexture( + ctx, textures, material, phong->Shininess, shininess, "rgb", AdobeTokens->raw); + importPropTexture(ctx, + textures, + material, + phong->SpecularFactor, + specularFactor, + "r", + AdobeTokens->raw); + importPropTexture(ctx, + textures, + material, + phong->ReflectionFactor, + reflectionFactor, + "r", + AdobeTokens->raw); + } - if (ctx.options->importPhong) { - inputTranslator.translatePhong2PBR( - diffuse, specular, shininess, um.diffuseColor, um.metallic, um.roughness); - } else { - inputTranslator.translateDirect(diffuse, um.diffuseColor); - // Note, using reflectionFactor for metallic, and specularFactor for roughness, are very - // crude approximations for a Phong to PBR conversion. - inputTranslator.translateDirect(reflectionFactor, um.metallic); - inputTranslator.translateDirect(specularFactor, um.roughness); - } + if (ctx.options->importPhong) { + inputTranslator.translatePhong2PBR( + diffuse, specular, shininess, um.diffuseColor, um.metallic, um.roughness); + } else { + inputTranslator.translateDirect(diffuse, um.diffuseColor); + // Note, using reflectionFactor for metallic, and specularFactor for roughness, are + // very crude approximations for a Phong to PBR conversion. + inputTranslator.translateDirect(reflectionFactor, um.metallic); + inputTranslator.translateDirect(specularFactor, um.roughness); + } - inputTranslator.translateFactor(emissive, emissiveFactor, um.emissiveColor); + inputTranslator.translateFactor(emissive, emissiveFactor, um.emissiveColor); - // ignore specular color if there is a specular factor texture but no specular color - if ((specular.image >= 0) || (specularFactor.image < 0)) { - inputTranslator.translateFactor(specular, specularFactor, um.specularColor); - } + // ignore specular color if there is a specular factor texture but no specular color + if ((specular.image >= 0) || (specularFactor.image < 0)) { + inputTranslator.translateFactor(specular, specularFactor, um.specularColor); + } - // NOTE: as commented above, we are ignoring TransparentColor values so the - // condition in the 'if' statement below should always be false, in which case - // the 'else' block will be executed. + // NOTE: as commented above, we are ignoring TransparentColor values so the + // condition in the 'if' statement below should always be false, in which case + // the 'else' block will be executed. - // If there is a TransparentColor texture, we use it directly as the opacity channel - if (transparentColor.image >= 0) { - inputTranslator.translateDirect(transparentColor, um.opacity); - } else { - // There are FBX files where both the Opacity and TransparencyFactor properties are - // present (even though the Opacity property has been phased out and is not defined as a - // property of FbxSurfaceLambert). In some cases, both properties are present in the - // material definition and so it's unclear which should be used. We use the - // "TransparencyFactor" (ie 1.0) as is when both values are present and both equal 1.0. - // Otherwise, we convert TransparencyFactor to an opacity value by computing 1.0 - - // TransparencyFactor - FbxProperty opacityProp = material->FindProperty("Opacity", FbxDoubleDT, true); - FbxProperty transparencyFactorProp = - material->FindProperty("TransparencyFactor", FbxDoubleDT, true); - if (opacityProp.IsValid() && transparencyFactorProp.IsValid() && - 1.0 == opacityProp.Get() && 1.0 == transparencyFactorProp.Get()) { - // Use the transparencyFactor as is and treat it like an opacity value - inputTranslator.translateDirect(transparencyFactor, um.opacity); + // If there is a TransparentColor texture, we use it directly as the opacity channel + if (transparentColor.image >= 0) { + inputTranslator.translateDirect(transparentColor, um.opacity); } else { - // invert transparencyFactor and assign to usd opacity - inputTranslator.translateTransparency2Opacity(transparencyFactor, um.opacity); + // There are FBX files where both the Opacity and TransparencyFactor properties are + // present (even though the Opacity property has been phased out and is not defined + // as a property of FbxSurfaceLambert). In some cases, both properties are present + // in the material definition and so it's unclear which should be used. We use the + // "TransparencyFactor" (ie 1.0) as is when both values are present and both + // equal 1.0. Otherwise, we convert TransparencyFactor to an opacity value by + // computing 1.0 - TransparencyFactor + FbxProperty opacityProp = material->FindProperty("Opacity", FbxDoubleDT, true); + FbxProperty transparencyFactorProp = + material->FindProperty("TransparencyFactor", FbxDoubleDT, true); + if (opacityProp.IsValid() && transparencyFactorProp.IsValid() && + 1.0 == opacityProp.Get() && + 1.0 == transparencyFactorProp.Get()) { + // Use the transparencyFactor as is and treat it like an opacity value + inputTranslator.translateDirect(transparencyFactor, um.opacity); + } else { + // invert transparencyFactor and assign to usd opacity + inputTranslator.translateTransparency2Opacity(transparencyFactor, um.opacity); + } } - } inputTranslator.translateNormals(bump, normal, um.normal); } else { - // Elegant fallback: Try property-based processing for materials that failed Lambert/Phong casting - TF_DEBUG_MSG(FILE_FORMAT_FBX, "Lambert/Phong casting failed for '%s', trying fallback approaches\n", - material->GetName()); - + // Elegant fallback: Try property-based processing for materials that failed + // Lambert/Phong casting + TF_DEBUG_MSG(FILE_FORMAT_FBX, + "Lambert/Phong casting failed for '%s', trying fallback approaches\n", + material->GetName()); + // First check if it's a hardware shader const FbxImplementation* imp = LookForNonSupportedImplementation(material); if (imp) { - TF_DEBUG_MSG(FILE_FORMAT_FBX, "Detected hardware shader for '%s'\n", material->GetName()); + TF_DEBUG_MSG( + FILE_FORMAT_FBX, "Detected hardware shader for '%s'\n", material->GetName()); TF_DEBUG_MSG(FILE_FORMAT_FBX, " Language: %s\n", imp->Language.Get().Buffer()); - TF_DEBUG_MSG(FILE_FORMAT_FBX, " LanguageVersion: %s\n", imp->LanguageVersion.Get().Buffer()); + TF_DEBUG_MSG( + FILE_FORMAT_FBX, " LanguageVersion: %s\n", imp->LanguageVersion.Get().Buffer()); TF_DEBUG_MSG(FILE_FORMAT_FBX, " RenderName: %s\n", imp->RenderName.Buffer()); TF_DEBUG_MSG(FILE_FORMAT_FBX, " RenderAPI: %s\n", imp->RenderAPI.Get().Buffer()); - TF_DEBUG_MSG(FILE_FORMAT_FBX, " RenderAPIVersion: %s\n", imp->RenderAPIVersion.Get().Buffer()); - + TF_DEBUG_MSG( + FILE_FORMAT_FBX, " RenderAPIVersion: %s\n", imp->RenderAPIVersion.Get().Buffer()); + // Try to extract properties from hardware shader if (_processHardwareShaderMaterial(material, ctx, textures, um, inputTranslator)) { - TF_DEBUG_MSG(FILE_FORMAT_FBX, "Successfully processed hardware shader '%s'\n", - material->GetName()); + TF_DEBUG_MSG(FILE_FORMAT_FBX, + "Successfully processed hardware shader '%s'\n", + material->GetName()); continue; } - - TF_WARN("Hardware shader '%s' detected but no properties could be extracted\n", - material->GetName()); + + TF_WARN("Hardware shader '%s' detected but no properties could be extracted\n", + material->GetName()); continue; } - + // Try standard property-based fallback for non-hardware shader materials if (_processUnknownShadingModel(material, ctx, textures, um, inputTranslator)) { - TF_DEBUG_MSG(FILE_FORMAT_FBX, "Successfully processed '%s' using property-based fallback\n", - material->GetName()); + TF_DEBUG_MSG(FILE_FORMAT_FBX, + "Successfully processed '%s' using property-based fallback\n", + material->GetName()); continue; } - + // If we get here, the material couldn't be processed by any method - TF_WARN("Unable to process material '%s' - no recognizable properties found\n", - material->GetName()); + TF_WARN("Unable to process material '%s' - no recognizable properties found\n", + material->GetName()); } } ctx.usd->images = std::move(inputTranslator.getImages()); @@ -2129,13 +2260,16 @@ importFbxSkeleton(ImportFbxContext& ctx, const ImportedFbxSkeleton& importedSkel std::vector> framesInEachStack; framesInEachStack.resize(ctx.animationStacks.size()); - std::vector> animatedNodes; + // Track animated joints, avoiding duplicates across animation layers + std::map animatedJointsMap; size_t jointCount = 0; + // clang-format off std::function + size_t skeletonIndex, Skeleton& skeleton, FbxNode* fbxNode, const SdfPath& parentPath)> importFbxBone; + // clang-format on importFbxBone = [&](size_t skeletonIndex, Skeleton& skeleton, FbxNode* fbxNode, @@ -2164,9 +2298,13 @@ importFbxSkeleton(ImportFbxContext& ctx, const ImportedFbxSkeleton& importedSkel skeleton.jointNames.push_back(stem); skeleton.restTransforms.push_back(GetUSDMatrixFromFBX(localTransform)); - // The bindTransforms will be updated later when the skelelon clusters + // The bindTransforms will be updated later when the skeleton clusters // are processed but we still set them using the default global joint transform. - skeleton.bindTransforms.push_back(GetUSDMatrixFromFBX(globalTransform)); + // Factor out the skeleton parent's global transform so bind transforms are + // relative to the parent (armature) node, avoiding double-application through + // the USD hierarchy. + FbxAMatrix adjustedGlobal = importedSkeleton.parentGlobalInverse * globalTransform; + skeleton.bindTransforms.push_back(GetUSDMatrixFromFBX(adjustedGlobal)); // Here also register which nodes are animated, // and accumulate in a map the animation keys' times. @@ -2183,13 +2321,61 @@ importFbxSkeleton(ImportFbxContext& ctx, const ImportedFbxSkeleton& importedSkel fbxNode->LclTranslation.GetCurve(animLayer); const FbxAnimCurve* rotationCurve = fbxNode->LclRotation.GetCurve(animLayer); const FbxAnimCurve* scalingCurve = fbxNode->LclScaling.GetCurve(animLayer); + + // Also check curve nodes for individual channels (X, Y, Z) + // Sometimes GetCurve() returns null but individual channels have curves + FbxAnimCurveNode* translationCurveNode = + fbxNode->LclTranslation.GetCurveNode(animLayer); + FbxAnimCurveNode* rotationCurveNode = + fbxNode->LclRotation.GetCurveNode(animLayer); + FbxAnimCurveNode* scalingCurveNode = + fbxNode->LclScaling.GetCurveNode(animLayer); + + bool hasTranslationAnim = + (translationCurve != nullptr) || + (translationCurveNode && translationCurveNode->GetChannelsCount() > 0); + bool hasRotationAnim = + (rotationCurve != nullptr) || + (rotationCurveNode && rotationCurveNode->GetChannelsCount() > 0); + bool hasScalingAnim = + (scalingCurve != nullptr) || + (scalingCurveNode && scalingCurveNode->GetChannelsCount() > 0); + addAnimCurveFrameTimes(translationCurve, frames); addAnimCurveFrameTimes(rotationCurve, frames); addAnimCurveFrameTimes(scalingCurve, frames); - if (translationCurve != nullptr || rotationCurve != nullptr || - scalingCurve != nullptr) { - animatedNodes.emplace_back(fbxNode, jointPathToken); + // Also add frame times from curve node channels + if (translationCurveNode) { + for (unsigned int channeld = 0; + channeld < translationCurveNode->GetChannelsCount(); + ++channeld) { + addAnimCurveFrameTimes(translationCurveNode->GetCurve(channeld), + frames); + } + } + if (rotationCurveNode) { + for (unsigned int channeld = 0; + channeld < rotationCurveNode->GetChannelsCount(); + ++channeld) { + addAnimCurveFrameTimes(rotationCurveNode->GetCurve(channeld), frames); + } + } + if (scalingCurveNode) { + for (unsigned int channeld = 0; + channeld < scalingCurveNode->GetChannelsCount(); + ++channeld) { + addAnimCurveFrameTimes(scalingCurveNode->GetCurve(channeld), frames); + } + } + + // Add to map to track animated joints (avoids duplicates across layers) + // Use the more robust channel check instead of just checking for curves + if (hasTranslationAnim || hasRotationAnim || hasScalingAnim) { + // Only add if not already in the map + if (animatedJointsMap.find(fbxNode) == animatedJointsMap.end()) { + animatedJointsMap[fbxNode] = jointPathToken; + } } } } @@ -2216,19 +2402,36 @@ importFbxSkeleton(ImportFbxContext& ctx, const ImportedFbxSkeleton& importedSkel importFbxBone(skeletonIndex, skeleton, skel->GetNode(), SdfPath()); } - for (const auto& i : animatedNodes) { - skeleton.animatedJoints.push_back(i.second); + // Populate skeleton.animatedJoints. + // Don't add these to ctx.animatedSkeletonNodes yet because we don't know + // if this skeleton has skinned meshes. That happens during importFbxNodeHierarchy. + // We'll add them later in markAnimatedSkeletonNodes() if the skeleton has skinned meshes. + for (const auto& pair : animatedJointsMap) { + skeleton.animatedJoints.push_back(pair.second); } for (int animationStackIndex = 0; animationStackIndex < framesInEachStack.size(); animationStackIndex++) { AnimationTrack& track = ctx.usd->animationTracks[animationStackIndex]; + std::set& frames = framesInEachStack[animationStackIndex]; + + // Extend animation to cover the full stack duration by adding a final hold frame + // This ensures animations hold their final values to match the declared animation length + if (!frames.empty()) { + FbxTime lastKeyframeTime = *frames.rbegin(); + double lastKeyframeSeconds = lastKeyframeTime.GetSecondDouble(); + + // Allow a small tolerance + if (track.maxTime > lastKeyframeSeconds + 0.001) { + FbxTime stackEndTime; + stackEndTime.SetSecondDouble(track.maxTime); + frames.insert(stackEndTime); + } + } // Set the current animation stack so that EvaluateLocalTransform will return the correct // value ctx.scene->SetCurrentAnimationStack(ctx.animationStacks[animationStackIndex].stack); - - std::set& frames = framesInEachStack[animationStackIndex]; if (!frames.empty()) { track.hasTimepoints = true; ctx.usd->hasAnimations = true; @@ -2238,12 +2441,13 @@ importFbxSkeleton(ImportFbxContext& ctx, const ImportedFbxSkeleton& importedSkel SkeletonAnimation& skeletonAnimation = skeleton.skeletonAnimations[animationStackIndex]; skeletonAnimation.times.resize(frames.size()); skeletonAnimation.translations.resize(frames.size(), - VtArray(animatedNodes.size())); + VtArray(animatedJointsMap.size())); skeletonAnimation.rotations.resize(frames.size(), - VtArray(animatedNodes.size())); - skeletonAnimation.scales.resize(frames.size(), VtArray(animatedNodes.size())); + VtArray(animatedJointsMap.size())); + skeletonAnimation.scales.resize(frames.size(), + VtArray(animatedJointsMap.size())); size_t i = 0; - for (const auto& nodePair : animatedNodes) { + for (const auto& nodePair : animatedJointsMap) { FbxNode* fbxNode = nodePair.first; size_t j = 0; for (const FbxTime& frameTime : frames) { @@ -2268,6 +2472,43 @@ importFbxSkeleton(ImportFbxContext& ctx, const ImportedFbxSkeleton& importedSkel return true; } +// After skeleton and mesh import, mark which skeleton nodes should have their animations +// handled by the skeletal animation system (and thus skip node animation import). +// Only mark nodes for skeletons that have skinned meshes. +void +markAnimatedSkeletonNodes(ImportFbxContext& ctx) +{ + for (size_t skeletonIndex = 0; skeletonIndex < ctx.usd->skeletons.size(); skeletonIndex++) { + const Skeleton& skeleton = ctx.usd->skeletons[skeletonIndex]; + + // Only mark animated nodes for skeletons that have skinned meshes + // If there are no skinned meshes, the skeletal animation won't be exported, + // so we should let the regular node animation system handle it + bool hasSkinnedMeshes = !skeleton.meshSkinningTargets.empty(); + if (hasSkinnedMeshes) { + // This skeleton has skinned meshes, so mark its animated nodes + // to skip regular node animation import + for (const auto& pair : ctx.bonesMap) { + FbxNode* fbxNode = pair.first; + size_t jointIndex = pair.second; + size_t skeletonMapIndex = ctx.skeletonsMap[fbxNode]; + + if (skeletonMapIndex == skeletonIndex) { + // This bone belongs to this skeleton + // Check if it's in the animated joints list + TfToken jointToken = skeleton.joints[jointIndex]; + bool isAnimated = std::find(skeleton.animatedJoints.begin(), + skeleton.animatedJoints.end(), + jointToken) != skeleton.animatedJoints.end(); + if (isAnimated) { + ctx.animatedSkeletonNodes.insert(fbxNode); + } + } + } + } + } +} + // Import skeletons from fbx. // The only way of recognizing a skeleton is to check whether an fbx node has a skeleton attribute. // So traverse all nodes here, but only look at the skeleton roots for further processing. @@ -2306,6 +2547,16 @@ importFBXSkeletons(ImportFbxContext& ctx) } } + { + ScopedAnimStackDisabler animStackDisabler(ctx); + for (auto& skel : ctx.skeletons) { + if (skel.fbxParent) { + FbxAMatrix parentGlobal = skel.fbxParent->EvaluateGlobalTransform(); + skel.parentGlobalInverse = parentGlobal.Inverse(); + } + } + } + for (const ImportedFbxSkeleton& skeleton : ctx.skeletons) { importFbxSkeleton(ctx, skeleton); } @@ -2558,6 +2809,7 @@ importFbx(const ImportFbxOptions& options, Fbx& fbx, UsdData& usd) loadAnimLayers(ctx); importFBXSkeletons(ctx); importFbxNodeHierarchy(ctx); + markAnimatedSkeletonNodes(ctx); setSkeletonParents(ctx); } diff --git a/fbx/src/fbxResolver.cpp b/fbx/src/fbxResolver.cpp index d8343685..d71345e4 100644 --- a/fbx/src/fbxResolver.cpp +++ b/fbx/src/fbxResolver.cpp @@ -26,8 +26,7 @@ static std::mutex mutex; FbxResolver::FbxResolver() : Resolver("FbxResolver") -{ -} +{} void FbxResolver::readCache(const std::string& filename, std::vector& images) @@ -36,11 +35,13 @@ FbxResolver::readCache(const std::string& filename, std::vector& ima Fbx fbx; UsdData usd; TfStopwatch watch; - TF_DEBUG_MSG(FBX_PACKAGE_RESOLVER, "START TOTAL: %ld\n", static_cast(watch.GetMilliseconds())); + TF_DEBUG_MSG( + FBX_PACKAGE_RESOLVER, "START TOTAL: %ld\n", static_cast(watch.GetMilliseconds())); watch.Start(); VOID_GUARD(readFbx(fbx, filename, true, true), "Error reading FBX from %s\n", filename.c_str()); watch.Stop(); - TF_DEBUG_MSG(FBX_PACKAGE_RESOLVER, "STOP TOTAL: %ld\n", static_cast(watch.GetMilliseconds())); + TF_DEBUG_MSG( + FBX_PACKAGE_RESOLVER, "STOP TOTAL: %ld\n", static_cast(watch.GetMilliseconds())); ImportFbxOptions options; options.importGeometry = false; options.importMaterials = true; diff --git a/fbx/src/fbxResolver.h b/fbx/src/fbxResolver.h index 42a40f57..bbbd872b 100644 --- a/fbx/src/fbxResolver.h +++ b/fbx/src/fbxResolver.h @@ -18,10 +18,10 @@ namespace adobe::usd { /// \brief usdfbx custom asset resolver. class FbxResolver : public Resolver { - public: +public: FbxResolver(); - private: +private: /// \ingroup usdfbx /// \brief Reads images from the FBX file, /// opening it only with IMP_FBX_MATERIAL and IMP_FBX_TEXTURE diff --git a/fbx/src/fileFormat.cpp b/fbx/src/fileFormat.cpp index 52b9b1d0..41aa89c4 100644 --- a/fbx/src/fileFormat.cpp +++ b/fbx/src/fileFormat.cpp @@ -23,8 +23,6 @@ governing permissions and limitations under the License. #include #include -#include - using namespace adobe::usd; PXR_NAMESPACE_OPEN_SCOPE @@ -160,14 +158,16 @@ UsdFbxFileFormat::WriteToString(const SdfLayer& layer, const std::string& comment) const { // Write as USDA because we don't implement FBX export. - return SdfFileFormat::FindById(UsdUsdaFileFormatTokens->Id)->WriteToString(layer, str, comment); + return SdfFileFormat::FindById(FileFormatsUsdaFileFormatTokensId) + ->WriteToString(layer, str, comment); } bool UsdFbxFileFormat::WriteToStream(const SdfSpecHandle& spec, std::ostream& out, size_t indent) const { // Write as USDA because we don't implement FBX export. - return SdfFileFormat::FindById(UsdUsdaFileFormatTokens->Id)->WriteToStream(spec, out, indent); + return SdfFileFormat::FindById(FileFormatsUsdaFileFormatTokensId) + ->WriteToStream(spec, out, indent); } bool diff --git a/fbx/src/fileFormat.h b/fbx/src/fileFormat.h index 8fc518cc..9d5450b5 100644 --- a/fbx/src/fileFormat.h +++ b/fbx/src/fileFormat.h @@ -14,11 +14,11 @@ governing permissions and limitations under the License. #ifdef _MSC_VER // Disable warnings in the pxr headers. // conversion from 'double' to 'float', possible loss of data -# pragma warning(disable : 4244) +#pragma warning(disable : 4244) // conversion from 'size_t' to 'int', possible loss of data -# pragma warning(disable : 4267) +#pragma warning(disable : 4267) // truncation from 'double' to 'float' -# pragma warning(disable : 4305) +#pragma warning(disable : 4305) #endif // _MSC_VER #include "api.h" @@ -46,7 +46,7 @@ TF_DECLARE_WEAK_AND_REF_PTRS(FbxData); /// \brief SdfData specialization for working with FBX files. class FbxData : public FileFormatDataBase { - public: +public: bool animationStacks = false; bool phong = false; bool triangulateMeshes = true; @@ -60,7 +60,7 @@ class USDFBX_API UsdFbxFileFormat : public SdfFileFormat , public PcpDynamicFileFormatInterface { - public: +public: friend class FbxData; virtual SdfAbstractDataRefPtr InitData(const FileFormatArguments& args) const override; @@ -98,7 +98,7 @@ class USDFBX_API UsdFbxFileFormat const std::string& comment = std::string(), const FileFormatArguments& args = FileFormatArguments()) const override; - protected: +protected: static const TfToken animationStacksToken; static const TfToken assetsPathToken; static const TfToken originalColorSpaceToken; diff --git a/fbx/src/precompiled.h b/fbx/src/precompiled.h deleted file mode 100644 index 2d12ece9..00000000 --- a/fbx/src/precompiled.h +++ /dev/null @@ -1,34 +0,0 @@ -/* -Copyright 2023 Adobe. All rights reserved. -This file is licensed to you under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. You may obtain a copy -of the License at http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software distributed under -the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS -OF ANY KIND, either express or implied. See the License for the specific language -governing permissions and limitations under the License. -*/ -#pragma once - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include diff --git a/fbx/tests/sanityTests.cpp b/fbx/tests/sanityTests.cpp index cc7de75a..52875b58 100644 --- a/fbx/tests/sanityTests.cpp +++ b/fbx/tests/sanityTests.cpp @@ -47,4 +47,4 @@ TEST(Sanity, ExportCube) // Cleanup scene->Destroy(); -} \ No newline at end of file +} diff --git a/fbx/tests/util.cpp b/fbx/tests/util.cpp index c05bcf7c..0c41ad9b 100644 --- a/fbx/tests/util.cpp +++ b/fbx/tests/util.cpp @@ -181,9 +181,7 @@ getFbxNodeByPath(FbxScene* scene, std::string nodePath) // Verify that the first node in the path matches the root node's name if (nodePathVector[0] != rootNode->GetName()) { - TF_WARN("Root node \"%s\" not found in path %s", - rootNode->GetName(), - nodePath.c_str()); + TF_WARN("Root node \"%s\" not found in path %s", rootNode->GetName(), nodePath.c_str()); return nullptr; } diff --git a/fbx/tests/util.h b/fbx/tests/util.h index 7e77cc3c..1d434a33 100644 --- a/fbx/tests/util.h +++ b/fbx/tests/util.h @@ -21,7 +21,7 @@ governing permissions and limitations under the License. class FbxLoaderSingleton { - public: +public: /** * Get the singleton instance of FbxLoaderSingleton. */ @@ -47,7 +47,7 @@ class FbxLoaderSingleton return scene ? scene->GetFbxManager() : nullptr; } - private: +private: FbxLoaderSingleton(); std::recursive_mutex mFbxLoaderMutex; diff --git a/gltf/README.md b/gltf/README.md index 13698956..075ba63c 100644 --- a/gltf/README.md +++ b/gltf/README.md @@ -88,6 +88,7 @@ During material import, the ASM shading model is used as an intermediate transpo | ADOBE_materials_clearcoat_specular |✅| | ADOBE_materials_clearcoat_tint |✅| | EXT_materials_clearcoat_color |✅| +| KHR_materials_coat |✅| | KHR_materials_pbrSpecularGlossiness |✅| Anisotropy @@ -176,7 +177,15 @@ Mesh bounding box exported as min and max accessor bounds in glTF. The material network uses `MaterialX` nodes to express individual operations and has an `OpenPBR` surface, which has rich support for PBR oriented materials. -* `gltfAnimationStacks`: Import multiple animation tracks. Default is `false` +* `preserveExtraMaterialInfo`: Generate shading networks with extra data for transcoding. Default is `true` + When this is enabled, the generated shading networks might contain extra inputs that are outside of the respective + material surface schema, that are useful for transcoding purposes. For example, the `OpenPBR` surface does not have + an `occlusion` input for ambient occlusion, but we might want to express such a signal, if it was present in the + source asset, so that an exporter can pick-up said signal and use it when generating an output asset. + When `preserveExtraMaterialInfo` is `false`, the code will not generate these extra fields that are outside of the + schema, which won't affect renders, but can affect the transcoding abilities. + +* `gltfAnimationTracks`: Import multiple animation tracks. Default is `false` By default only the first animation track is imported. It is only recommended to use this parameter in order to convert from GLTF to another format that supports multiple @@ -187,7 +196,7 @@ Mesh bounding box exported as min and max accessor bounds in glTF. begins and ends. The exporter can then read this metadata to export the tracks properly. ``` from pxr import Usd - stage = Usd.Stage.Open("animAsset.gltf:SDF_FORMAT_ARGS:gltfAnimationStacks=true") + stage = Usd.Stage.Open("animAsset.gltf:SDF_FORMAT_ARGS:gltfAnimationTracks=true") stage.Export("animAsset.fbx") ``` diff --git a/gltf/src/CMakeLists.txt b/gltf/src/CMakeLists.txt index 7ba1ab90..4805da5a 100644 --- a/gltf/src/CMakeLists.txt +++ b/gltf/src/CMakeLists.txt @@ -1,5 +1,4 @@ add_library(usdGltf SHARED) - usd_plugin_compile_config(usdGltf) target_compile_definitions(usdGltf PRIVATE USDGLTF_EXPORTS) @@ -28,6 +27,7 @@ PRIVATE target_include_directories(usdGltf PRIVATE + "${CMAKE_CURRENT_SOURCE_DIR}" "${PROJECT_BINARY_DIR}" ) @@ -52,69 +52,6 @@ if(USD_FILEFORMATS_ENABLE_DRACO) ) endif() -target_precompile_headers(usdGltf - PRIVATE - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" -) - # Installation of plugin files mimics the file structure that USD has for plugins, # so it is easy to deploy it in a pre-existing USD build, if one chooses to do so. @@ -129,18 +66,20 @@ set_target_properties(usdGltf PROPERTIES RESOURCE ${CMAKE_CURRENT_BINARY_DIR}/pl set_target_properties(usdGltf PROPERTIES RESOURCE_FILES "${CMAKE_CURRENT_BINARY_DIR}/plugInfo.json:plugInfo.json") +# USDGLTF_DESTINATION is set in the parent scope by the add_usd_fileformat macro + if(USDGLTF_ENABLE_INSTALL) install( TARGETS usdGltf - RUNTIME DESTINATION plugin/usd COMPONENT Runtime - LIBRARY DESTINATION plugin/usd COMPONENT Runtime - RESOURCE DESTINATION plugin/usd/usdGltf/resources COMPONENT Runtime + RUNTIME DESTINATION ${USDGLTF_DESTINATION} COMPONENT Runtime + LIBRARY DESTINATION ${USDGLTF_DESTINATION} COMPONENT Runtime + RESOURCE DESTINATION ${USDGLTF_DESTINATION}/usdGltf/resources COMPONENT Runtime ) install( FILES plugInfo.root.json - DESTINATION plugin/usd + DESTINATION ${USDGLTF_DESTINATION} RENAME plugInfo.json COMPONENT Runtime ) -endif() \ No newline at end of file +endif() diff --git a/gltf/src/api.h b/gltf/src/api.h index ae923228..c3bc24e1 100644 --- a/gltf/src/api.h +++ b/gltf/src/api.h @@ -14,19 +14,19 @@ governing permissions and limitations under the License. #include "pxr/base/arch/export.h" #if defined(PXR_STATIC) -# define USDGLTF_API -# define USDGLTF_API_TEMPLATE_CLASS(...) -# define USDGLTF_API_TEMPLATE_STRUCT(...) -# define USDGLTF_LOCAL +#define USDGLTF_API +#define USDGLTF_API_TEMPLATE_CLASS(...) +#define USDGLTF_API_TEMPLATE_STRUCT(...) +#define USDGLTF_LOCAL #else -# if defined(USDGLTF_EXPORTS) -# define USDGLTF_API ARCH_EXPORT -# define USDGLTF_API_TEMPLATE_CLASS(...) ARCH_EXPORT_TEMPLATE(class, __VA_ARGS__) -# define USDGLTF_API_TEMPLATE_STRUCT(...) ARCH_EXPORT_TEMPLATE(struct, __VA_ARGS__) -# else -# define USDGLTF_API ARCH_IMPORT -# define USDGLTF_API_TEMPLATE_CLASS(...) ARCH_IMPORT_TEMPLATE(class, __VA_ARGS__) -# define USDGLTF_API_TEMPLATE_STRUCT(...) ARCH_IMPORT_TEMPLATE(struct, __VA_ARGS__) -# endif -# define USDGLTF_LOCAL ARCH_HIDDEN +#if defined(USDGLTF_EXPORTS) +#define USDGLTF_API ARCH_EXPORT +#define USDGLTF_API_TEMPLATE_CLASS(...) ARCH_EXPORT_TEMPLATE(class, __VA_ARGS__) +#define USDGLTF_API_TEMPLATE_STRUCT(...) ARCH_EXPORT_TEMPLATE(struct, __VA_ARGS__) +#else +#define USDGLTF_API ARCH_IMPORT +#define USDGLTF_API_TEMPLATE_CLASS(...) ARCH_IMPORT_TEMPLATE(class, __VA_ARGS__) +#define USDGLTF_API_TEMPLATE_STRUCT(...) ARCH_IMPORT_TEMPLATE(struct, __VA_ARGS__) +#endif +#define USDGLTF_LOCAL ARCH_HIDDEN #endif \ No newline at end of file diff --git a/gltf/src/fileFormat.cpp b/gltf/src/fileFormat.cpp index 6d637156..0d92965e 100644 --- a/gltf/src/fileFormat.cpp +++ b/gltf/src/fileFormat.cpp @@ -25,8 +25,9 @@ governing permissions and limitations under the License. // USD #include #include +#include #include -#include +#include PXR_NAMESPACE_OPEN_SCOPE @@ -287,7 +288,8 @@ UsdGltfFileFormat::WriteToString(const SdfLayer& layer, const std::string& comment) const { // Write USD as glTF: Defer to the usda file format for now. - return SdfFileFormat::FindById(UsdUsdaFileFormatTokens->Id)->WriteToString(layer, str, comment); + return SdfFileFormat::FindById(FileFormatsUsdaFileFormatTokensId) + ->WriteToString(layer, str, comment); } bool diff --git a/gltf/src/fileFormat.h b/gltf/src/fileFormat.h index a86b733a..ff0eb55e 100644 --- a/gltf/src/fileFormat.h +++ b/gltf/src/fileFormat.h @@ -41,7 +41,7 @@ class ArAsset; /// \brief SdfData specialization for working with glTF files. class GltfData : public FileFormatDataBase { - public: +public: bool animationTracks = false; bool computeBitangents = false; static GltfDataRefPtr InitData(const SdfFileFormat::FileFormatArguments& args); @@ -53,7 +53,7 @@ class USDGLTF_API UsdGltfFileFormat : public SdfFileFormat , public PcpDynamicFileFormatInterface { - public: +public: friend class GltfData; // If successful, returns true and fills in the assetPtr, baseDir and the isAscii flag @@ -98,7 +98,7 @@ class USDGLTF_API UsdGltfFileFormat const std::string& comment = std::string(), const FileFormatArguments& args = FileFormatArguments()) const override; - protected: +protected: static const TfToken assetsPathToken; static const TfToken animationTracksToken; static const TfToken computeBitangentsToken; diff --git a/gltf/src/gltf.cpp b/gltf/src/gltf.cpp index f666aa57..7eaaa3f6 100644 --- a/gltf/src/gltf.cpp +++ b/gltf/src/gltf.cpp @@ -11,19 +11,14 @@ governing permissions and limitations under the License. */ #include "gltf.h" #include "debugCodes.h" -#include -#include #include #include +#include +#include +#include #include #include #include -#include -#include -#include -#include -#include -#include #include #include @@ -135,24 +130,23 @@ preValidateGLB(const unsigned char* buffer, size_t bufferSize) { // GLB validation: check buffer size mismatch const uint32_t* header = reinterpret_cast(buffer); - + // Check if GLB file (magic number 'glTF') if (header[0] != 0x46546C67) { - TF_WARN("Binary file missing GLB magic number (expected 0x46546C67)", - header[0]); + TF_WARN("Binary file missing GLB magic number (expected 0x46546C67)", header[0]); return false; // Reject invalid binary files } - + // Get JSON chunk length and position uint32_t jsonChunkLength = header[3]; size_t jsonStart = 20; size_t binChunkStart = jsonStart + jsonChunkLength; - + // If there's a binary chunk, check buffer size match if (binChunkStart + 8 <= bufferSize) { const uint32_t* binChunkHeader = reinterpret_cast(buffer + binChunkStart); uint32_t actualBinSize = binChunkHeader[0]; - + // Parse JSON for declared buffer.byteLength std::string jsonStr(reinterpret_cast(buffer + jsonStart), jsonChunkLength); size_t buffersPos = jsonStr.find("\"buffers\""); @@ -162,21 +156,25 @@ preValidateGLB(const unsigned char* buffer, size_t bufferSize) pos = jsonStr.find(":", pos); if (pos != std::string::npos) { uint32_t declaredBufSize = std::stoul(jsonStr.substr(pos + 1)); - + // GLB chunks are padded to 4-byte boundaries // https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#glb-stored-buffer // Reject if mismatch exceeds alignment padding (potential size attack) - int sizeDiff = static_cast(actualBinSize) - static_cast(declaredBufSize); + int sizeDiff = + static_cast(actualBinSize) - static_cast(declaredBufSize); if (sizeDiff < 0 || sizeDiff >= 4) { - TF_WARN("Buffer size mismatch beyond alignment padding: JSON declares %u bytes, binary chunk is %u bytes (diff: %d)", - declaredBufSize, actualBinSize, sizeDiff); + TF_WARN("Buffer size mismatch beyond alignment padding: JSON declares %u " + "bytes, binary chunk is %u bytes (diff: %d)", + declaredBufSize, + actualBinSize, + sizeDiff); return false; } } } } } - + return true; } @@ -525,24 +523,28 @@ void readAccessorData(const tinygltf::Model& model, int accessorIndex, uint8_t* dst) { if (accessorIndex < 0) { - TF_CODING_ERROR("Accessor index %d is invalid (< 0). File should be rejected.", accessorIndex); + TF_CODING_ERROR("Accessor index %d is invalid (< 0). File should be rejected.", + accessorIndex); return; } if (static_cast(accessorIndex) >= model.accessors.size()) { - TF_CODING_ERROR("Accessor %d out of bounds (length %zu). File should be rejected.", - accessorIndex, model.accessors.size()); + TF_CODING_ERROR("Accessor %d out of bounds (length %zu). File should be rejected.", + accessorIndex, + model.accessors.size()); return; } const tinygltf::Accessor& accessor = model.accessors[accessorIndex]; - if (accessor.bufferView < 0 || static_cast(accessor.bufferView) >= model.bufferViews.size()) { + if (accessor.bufferView < 0 || + static_cast(accessor.bufferView) >= model.bufferViews.size()) { TF_WARN("Accessor %d has invalid buffer view index %d", accessorIndex, accessor.bufferView); return; } const tinygltf::BufferView& bufferView = model.bufferViews[accessor.bufferView]; if (bufferView.buffer < 0 || static_cast(bufferView.buffer) >= model.buffers.size()) { - TF_WARN("Buffer view %d has invalid buffer index %d", accessor.bufferView, bufferView.buffer); + TF_WARN( + "Buffer view %d has invalid buffer index %d", accessor.bufferView, bufferView.buffer); return; } const tinygltf::Buffer& buffer = model.buffers[bufferView.buffer]; @@ -555,24 +557,35 @@ readAccessorData(const tinygltf::Model& model, int accessorIndex, uint8_t* dst) // Validate buffer view bounds to prevent buffer over-read attacks if (bufferView.byteOffset >= buffer.data.size()) { TF_WARN("Buffer view %d has byteOffset %zu exceeding or equal to buffer size %zu", - accessor.bufferView, bufferView.byteOffset, buffer.data.size()); + accessor.bufferView, + bufferView.byteOffset, + buffer.data.size()); return; } if (bufferView.byteOffset + bufferView.byteLength > buffer.data.size()) { - TF_WARN("Buffer view %d extends beyond buffer bounds (offset %zu + length %zu > buffer size %zu)", - accessor.bufferView, bufferView.byteOffset, bufferView.byteLength, buffer.data.size()); + TF_WARN( + "Buffer view %d extends beyond buffer bounds (offset %zu + length %zu > buffer size %zu)", + accessor.bufferView, + bufferView.byteOffset, + bufferView.byteLength, + buffer.data.size()); return; } // Validate accessor count to prevent buffer over-read attacks size_t accessorStartOffset = accessor.byteOffset; - size_t accessorTotalSize = (elementStride == elementSize) ? - accessor.count * elementSize : - (accessor.count > 0 ? (accessor.count - 1) * elementStride + elementSize : 0); + size_t accessorTotalSize = + (elementStride == elementSize) + ? accessor.count * elementSize + : (accessor.count > 0 ? (accessor.count - 1) * elementStride + elementSize : 0); if (accessorStartOffset + accessorTotalSize > bufferView.byteLength) { - TF_WARN("Accessor %d data extends beyond buffer view bounds (accessor offset %zu + size %zu > view length %zu)", - accessorIndex, accessorStartOffset, accessorTotalSize, bufferView.byteLength); + TF_WARN("Accessor %d data extends beyond buffer view bounds (accessor offset %zu + size " + "%zu > view length %zu)", + accessorIndex, + accessorStartOffset, + accessorTotalSize, + bufferView.byteLength); return; } @@ -613,24 +626,28 @@ void readAccessorDataToFloat(const tinygltf::Model& model, int accessorIndex, float* dst) { if (accessorIndex < 0) { - TF_CODING_ERROR("Accessor index %d is invalid (< 0). File should be rejected.", accessorIndex); + TF_CODING_ERROR("Accessor index %d is invalid (< 0). File should be rejected.", + accessorIndex); return; } if (static_cast(accessorIndex) >= model.accessors.size()) { - TF_CODING_ERROR("Accessor %d out of bounds (length %zu). File should be rejected.", - accessorIndex, model.accessors.size()); + TF_CODING_ERROR("Accessor %d out of bounds (length %zu). File should be rejected.", + accessorIndex, + model.accessors.size()); return; } const tinygltf::Accessor& accessor = model.accessors[accessorIndex]; - if (accessor.bufferView < 0 || static_cast(accessor.bufferView) >= model.bufferViews.size()) { + if (accessor.bufferView < 0 || + static_cast(accessor.bufferView) >= model.bufferViews.size()) { TF_WARN("Accessor %d has invalid buffer view index %d", accessorIndex, accessor.bufferView); return; } const tinygltf::BufferView& bufferView = model.bufferViews[accessor.bufferView]; if (bufferView.buffer < 0 || static_cast(bufferView.buffer) >= model.buffers.size()) { - TF_WARN("Buffer view %d has invalid buffer index %d", accessor.bufferView, bufferView.buffer); + TF_WARN( + "Buffer view %d has invalid buffer index %d", accessor.bufferView, bufferView.buffer); return; } const tinygltf::Buffer& buffer = model.buffers[bufferView.buffer]; @@ -644,24 +661,35 @@ readAccessorDataToFloat(const tinygltf::Model& model, int accessorIndex, float* // Validate buffer view bounds to prevent buffer over-read attacks if (bufferView.byteOffset >= buffer.data.size()) { TF_WARN("Buffer view %d has byteOffset %zu exceeding or equal to buffer size %zu", - accessor.bufferView, bufferView.byteOffset, buffer.data.size()); + accessor.bufferView, + bufferView.byteOffset, + buffer.data.size()); return; } if (bufferView.byteOffset + bufferView.byteLength > buffer.data.size()) { - TF_WARN("Buffer view %d extends beyond buffer bounds (offset %zu + length %zu > buffer size %zu)", - accessor.bufferView, bufferView.byteOffset, bufferView.byteLength, buffer.data.size()); + TF_WARN( + "Buffer view %d extends beyond buffer bounds (offset %zu + length %zu > buffer size %zu)", + accessor.bufferView, + bufferView.byteOffset, + bufferView.byteLength, + buffer.data.size()); return; } // Validate accessor count to prevent buffer over-read attacks size_t accessorStartOffset = accessor.byteOffset; - size_t accessorTotalSize = (elementStride == elementSize) ? - accessor.count * elementSize : - (accessor.count > 0 ? (accessor.count - 1) * elementStride + elementSize : 0); + size_t accessorTotalSize = + (elementStride == elementSize) + ? accessor.count * elementSize + : (accessor.count > 0 ? (accessor.count - 1) * elementStride + elementSize : 0); if (accessorStartOffset + accessorTotalSize > bufferView.byteLength) { - TF_WARN("Accessor %d data extends beyond buffer view bounds (accessor offset %zu + size %zu > view length %zu)", - accessorIndex, accessorStartOffset, accessorTotalSize, bufferView.byteLength); + TF_WARN("Accessor %d data extends beyond buffer view bounds (accessor offset %zu + size " + "%zu > view length %zu)", + accessorIndex, + accessorStartOffset, + accessorTotalSize, + bufferView.byteLength); return; } @@ -850,37 +878,53 @@ readColor(const tinygltf::Model& model, // Incurs a double copy but handles reading accessors holding integer data with unknown size void -readAccessorInts(const tinygltf::Model& model, int accessorIndex, PXR_NS::VtArray& dst) +readAccessorInts(const tinygltf::Model& model, + int accessorIndex, + PXR_NS::VtArray& dst, + bool isScalar) { if (accessorIndex < 0) { - TF_CODING_ERROR("Accessor index %d is invalid (< 0). File should be rejected.", accessorIndex); + TF_CODING_ERROR("Accessor index %d is invalid (< 0). File should be rejected.", + accessorIndex); return; } if (static_cast(accessorIndex) >= model.accessors.size()) { - TF_CODING_ERROR("Accessor %d out of bounds (length %zu). File should be rejected.", - accessorIndex, model.accessors.size()); + TF_CODING_ERROR("Accessor %d out of bounds (length %zu). File should be rejected.", + accessorIndex, + model.accessors.size()); return; } const tinygltf::Accessor& accessor = model.accessors[accessorIndex]; - - // Validate accessor type for indices - must be SCALAR, not VEC2/VEC3/VEC4 - if (accessor.type != TINYGLTF_TYPE_SCALAR) { - TF_WARN("Accessor %d used as indices has invalid type %d (expected SCALAR type %d). Rejecting to prevent type confusion attack.", - accessorIndex, accessor.type, TINYGLTF_TYPE_SCALAR); + + // Accessor type can only be either SCALAR or VEC4, depending on + // whether mesh face indices or joint indices are being accessed. + if (isScalar && accessor.type != TINYGLTF_TYPE_SCALAR) { + TF_WARN("Accessor %d used as mesh index has invalid type %d (expected SCALAR type %d).", + accessorIndex, + accessor.type, + TINYGLTF_TYPE_SCALAR); + return; + } else if (!isScalar && accessor.type != TINYGLTF_TYPE_VEC4) { + TF_WARN("Accessor %d used as joint index has invalid type %d (expected VECTOR type %d).", + accessorIndex, + accessor.type, + TINYGLTF_TYPE_VEC4); return; } - + // Validate component type is one of the allowed unsigned integer types // glTF 2.0 spec: indices MUST be UNSIGNED_BYTE, UNSIGNED_SHORT, or UNSIGNED_INT // Using whitelist approach for security - reject anything not explicitly allowed if (accessor.componentType != TINYGLTF_COMPONENT_TYPE_UNSIGNED_BYTE && accessor.componentType != TINYGLTF_COMPONENT_TYPE_UNSIGNED_SHORT && accessor.componentType != TINYGLTF_COMPONENT_TYPE_UNSIGNED_INT) { - TF_WARN("Accessor %d used as indices has invalid component type %d. Only UNSIGNED_BYTE (5121), UNSIGNED_SHORT (5123), or UNSIGNED_INT (5125) are allowed for indices.", - accessorIndex, accessor.componentType); + TF_WARN("Accessor %d used as indices has invalid component type %d. Only UNSIGNED_BYTE " + "(5121), UNSIGNED_SHORT (5123), or UNSIGNED_INT (5125) are allowed for indices.", + accessorIndex, + accessor.componentType); return; } - + int componentSize = tinygltf::GetComponentSizeInBytes(accessor.componentType); if (componentSize == 1) { PXR_NS::VtArray temp(dst.size()); diff --git a/gltf/src/gltf.h b/gltf/src/gltf.h index 1f3fe690..2f510405 100644 --- a/gltf/src/gltf.h +++ b/gltf/src/gltf.h @@ -11,6 +11,8 @@ governing permissions and limitations under the License. */ #pragma once #include +#include +#include #include namespace adobe::usd { @@ -91,7 +93,10 @@ readColor(const tinygltf::Model& model, PXR_NS::VtArray& color, PXR_NS::VtArray& opacity); void -readAccessorInts(const tinygltf::Model& model, int accessorIndex, PXR_NS::VtArray& dst); +readAccessorInts(const tinygltf::Model& model, + int accessorIndex, + PXR_NS::VtArray& dst, + bool isScalar = false); void addToTimeMap(std::vector& globalTime, const PXR_NS::VtArray& time); diff --git a/gltf/src/gltfAnisotropy.cpp b/gltf/src/gltfAnisotropy.cpp index 962355f4..2c465e53 100644 --- a/gltf/src/gltfAnisotropy.cpp +++ b/gltf/src/gltfAnisotropy.cpp @@ -299,7 +299,8 @@ importAnisotropyData(ImportGltfContext& ctx, TF_DEBUG_MSG(FILE_FORMAT_GLTF, " texture.index: %d\n", anisotropy.texture.index); Input anisotropyInput; if (anisotropy.texture.index > -1) { - TF_DEBUG_MSG(FILE_FORMAT_GLTF, " calling importImage with index %d\n", anisotropy.texture.index); + TF_DEBUG_MSG( + FILE_FORMAT_GLTF, " calling importImage with index %d\n", anisotropy.texture.index); int imageIndex = importImage(ctx, anisotropy.texture.index, m.name, "anisotropy"); importTexture(ctx.gltf, imageIndex, @@ -342,7 +343,8 @@ importAnisotropyTexture(ImportGltfContext& ctx, const Image& anisotropySrcImage, std::unordered_map& cache) { - TF_DEBUG_MSG(FILE_FORMAT_GLTF, "importAnisotropyTexture for material '%s'\n", m.displayName.c_str()); + TF_DEBUG_MSG( + FILE_FORMAT_GLTF, "importAnisotropyTexture for material '%s'\n", m.displayName.c_str()); // Get Roughness image const tinygltf::Image* roughnessImage = nullptr; // Validate texture index before use to prevent signed/unsigned comparison bug @@ -385,8 +387,8 @@ importAnisotropyTexture(ImportGltfContext& ctx, if (usdAnisoLevelImageIndex < 0 && usdAnisoAngleImageIndex < 0) { processAnisotropyPixels(anisotropySrcImage, roughnessImage, - bilinearRoughnessSampling, roughness, + bilinearRoughnessSampling, anisotropyData, anisoLevelImage, anisoAngleImage); diff --git a/gltf/src/gltfExport.cpp b/gltf/src/gltfExport.cpp index 6ba1ee91..d586b5b7 100644 --- a/gltf/src/gltfExport.cpp +++ b/gltf/src/gltfExport.cpp @@ -17,45 +17,7 @@ governing permissions and limitations under the License. #include #include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include // TODO refine this description /** @@ -1180,6 +1142,31 @@ exportClearcoatExtension(ExportGltfContext& ctx, return false; } +bool +exportCoatExtension(ExportGltfContext& ctx, + InputTranslator& inputTranslator, + const Material& m, + tinygltf::Material& gm) +{ + ExtMap ext; + if (addTextureToExt(ctx, inputTranslator, ext, m.clearcoat, "coatTexture", "coatFactor")) { + addTextureToExt(ctx, + inputTranslator, + ext, + m.clearcoatRoughness, + "coatRoughnessTexture", + "coatRoughnessFactor"); + addTextureToExt(ctx, inputTranslator, ext, m.clearcoatNormal, "coatNormalTexture"); + addTextureToExt( + ctx, inputTranslator, ext, m.clearcoatColor, "coatColorTexture", "coatColorFactor"); + addFloatValueToExt(ext, "coatIor", m.clearcoatIor.value, 1.5f); + addMaterialExt(ctx, gm, "KHR_materials_coat", ext); + return true; + } + + return false; +} + bool exportEmissiveStrengthExtension(ExportGltfContext& ctx, InputTranslator& inputTranslator, @@ -1251,7 +1238,8 @@ exportSpecularExtension(ExportGltfContext& ctx, // glTF loaders that this material can be interpreted using the ASM/OpenPBR specular model. std::map extensions; std::map extObj; - // Empty objects seem to be serialized as null in glTF, so we need to add a dummy value for now. + // Empty objects seem to be serialized as null in glTF, so we need to add a dummy value for + // now. extObj["specularEdgeColorEnabled"] = tinygltf::Value(true); addExtension(ctx, extensions, "EXT_materials_specular_edge_color", extObj, false); ext["extensions"] = tinygltf::Value(extensions); @@ -1324,19 +1312,19 @@ exportAdobeClearcoatSpecularExtension(ExportGltfContext& ctx, } bool -exportClearcoatColorExtension(ExportGltfContext& ctx, - InputTranslator& inputTranslator, - const Material& m, - tinygltf::Material& gm) +exportAdobeClearcoatColorExtension(ExportGltfContext& ctx, + InputTranslator& inputTranslator, + const Material& m, + tinygltf::Material& gm) { ExtMap ext; if (addTextureToExt(ctx, inputTranslator, ext, m.clearcoatColor, - "clearcoatColorTexture", - "clearcoatColorFactor")) { - addMaterialExt(ctx, gm, "EXT_materials_clearcoat_color", ext); + "clearcoatTintTexture", + "clearcoatTintFactor")) { + addMaterialExt(ctx, gm, "ADOBE_materials_clearcoat_tint", ext); return true; } @@ -1748,9 +1736,11 @@ exportMaterials(ExportGltfContext& ctx) // by default and the clearcoat is redundant at best, if not wrong. bool exportClearcoat = !m.clearcoatModelsTransmissionTint; if (exportClearcoat) { - exportClearcoatExtension(ctx, inputTranslator, m, gm); - exportAdobeClearcoatSpecularExtension(ctx, inputTranslator, m, gm); - exportClearcoatColorExtension(ctx, inputTranslator, m, gm); + if (exportClearcoatExtension(ctx, inputTranslator, m, gm)) { + exportAdobeClearcoatSpecularExtension(ctx, inputTranslator, m, gm); + exportAdobeClearcoatColorExtension(ctx, inputTranslator, m, gm); + } + exportCoatExtension(ctx, inputTranslator, m, gm); } } @@ -1805,7 +1795,7 @@ exportMaterials(ExportGltfContext& ctx) ui->uri.c_str(), gi.bufferView); } else { - gi.uri = ui->uri; + gi.uri = TfGetBaseName(ui->uri); // Store the image in the tinygltf image struct, so that it will be written to the // location of the URI gi.image.resize(ui->image.size()); @@ -1930,66 +1920,76 @@ exportMeshes(ExportGltfContext& ctx) int tangentsAccessor = -1; std::vector gltfTangents; - + if (mesh.tangents.values.size() > 0) { - // If we have both tangents and bitangents, we need to reconstruct the proper tangent format with handedness in w + // If we have both tangents and bitangents, we need to reconstruct the proper tangent + // format with handedness in w if (mesh.bitangents.values.size() == mesh.tangents.values.size() && mesh.normals.values.size() == mesh.tangents.values.size()) { - + gltfTangents.resize(mesh.tangents.values.size()); for (size_t k = 0; k < mesh.tangents.values.size(); k++) { const PXR_NS::GfVec4f& usdTangent = mesh.tangents.values[k]; const PXR_NS::GfVec3f& normal = mesh.normals.values[k]; const PXR_NS::GfVec3f& bitangent = mesh.bitangents.values[k]; - + PXR_NS::GfVec3f tangentXYZ(usdTangent[0], usdTangent[1], usdTangent[2]); - + // bitangent - cross product: normal × tangentXYZ PXR_NS::GfVec3f expectedBitangent( - normal[1] * tangentXYZ[2] - normal[2] * tangentXYZ[1], - normal[2] * tangentXYZ[0] - normal[0] * tangentXYZ[2], - normal[0] * tangentXYZ[1] - normal[1] * tangentXYZ[0] - ); - - float dot = bitangent[0] * expectedBitangent[0] + - bitangent[1] * expectedBitangent[1] + - bitangent[2] * expectedBitangent[2]; + normal[1] * tangentXYZ[2] - normal[2] * tangentXYZ[1], + normal[2] * tangentXYZ[0] - normal[0] * tangentXYZ[2], + normal[0] * tangentXYZ[1] - normal[1] * tangentXYZ[0]); + + float dot = bitangent[0] * expectedBitangent[0] + + bitangent[1] * expectedBitangent[1] + + bitangent[2] * expectedBitangent[2]; float handedness = dot >= 0.0f ? 1.0f : -1.0f; - + // Validate the vectors are normalized - float tangentLength = std::sqrt(tangentXYZ[0]*tangentXYZ[0] + tangentXYZ[1]*tangentXYZ[1] + tangentXYZ[2]*tangentXYZ[2]); - float normalLength = std::sqrt(normal[0]*normal[0] + normal[1]*normal[1] + normal[2]*normal[2]); - float bitangentLength = std::sqrt(bitangent[0]*bitangent[0] + bitangent[1]*bitangent[1] + bitangent[2]*bitangent[2]); - - if (tangentLength < 0.001f || normalLength < 0.001f || bitangentLength < 0.001f) { + float tangentLength = + std::sqrt(tangentXYZ[0] * tangentXYZ[0] + tangentXYZ[1] * tangentXYZ[1] + + tangentXYZ[2] * tangentXYZ[2]); + float normalLength = std::sqrt(normal[0] * normal[0] + normal[1] * normal[1] + + normal[2] * normal[2]); + float bitangentLength = + std::sqrt(bitangent[0] * bitangent[0] + bitangent[1] * bitangent[1] + + bitangent[2] * bitangent[2]); + + if (tangentLength < 0.001f || normalLength < 0.001f || + bitangentLength < 0.001f) { TF_WARN("Degenerate tangent space vectors detected at vertex %zu " - "(tangent: %f, normal: %f, bitangent: %f). " - "Using default handedness +1.", - k, tangentLength, normalLength, bitangentLength); + "(tangent: %f, normal: %f, bitangent: %f). " + "Using default handedness +1.", + k, + tangentLength, + normalLength, + bitangentLength); handedness = 1.0f; } - - gltfTangents[k] = PXR_NS::GfVec4f(tangentXYZ[0], tangentXYZ[1], tangentXYZ[2], handedness); + + gltfTangents[k] = + PXR_NS::GfVec4f(tangentXYZ[0], tangentXYZ[1], tangentXYZ[2], handedness); } - + tangentsAccessor = addAccessor(ctx.gltf, - "tangents", - TINYGLTF_TARGET_ARRAY_BUFFER, - TINYGLTF_TYPE_VEC4, - TINYGLTF_COMPONENT_TYPE_FLOAT, - gltfTangents.size(), - gltfTangents.data(), - true); + "tangents", + TINYGLTF_TARGET_ARRAY_BUFFER, + TINYGLTF_TYPE_VEC4, + TINYGLTF_COMPONENT_TYPE_FLOAT, + gltfTangents.size(), + gltfTangents.data(), + true); } else { // Only tangents available, use them directly tangentsAccessor = addAccessor(ctx.gltf, - "tangents", - TINYGLTF_TARGET_ARRAY_BUFFER, - TINYGLTF_TYPE_VEC4, - TINYGLTF_COMPONENT_TYPE_FLOAT, - mesh.tangents.values.size(), - mesh.tangents.values.data(), - true); + "tangents", + TINYGLTF_TARGET_ARRAY_BUFFER, + TINYGLTF_TYPE_VEC4, + TINYGLTF_COMPONENT_TYPE_FLOAT, + mesh.tangents.values.size(), + mesh.tangents.values.data(), + true); } } diff --git a/gltf/src/gltfExport.h b/gltf/src/gltfExport.h index 4892b3a0..e712feb3 100644 --- a/gltf/src/gltfExport.h +++ b/gltf/src/gltfExport.h @@ -11,9 +11,9 @@ governing permissions and limitations under the License. */ #pragma once #include "gltf.h" -#include #include #include +#include namespace adobe::usd { diff --git a/gltf/src/gltfImport.cpp b/gltf/src/gltfImport.cpp index ef4042eb..481199e7 100644 --- a/gltf/src/gltfImport.cpp +++ b/gltf/src/gltfImport.cpp @@ -22,8 +22,7 @@ governing permissions and limitations under the License. #include #include -#include -#include +#include using namespace PXR_NS; @@ -300,7 +299,9 @@ importImage(ImportGltfContext& ctx, // Validate texture index to prevent out-of-bounds access if (textureIndex < 0 || static_cast(textureIndex) >= ctx.gltf->textures.size()) { TF_WARN("Invalid texture index %d for material '%s' (valid range: 0-%zu)", - textureIndex, materialName.c_str(), ctx.gltf->textures.size() - 1); + textureIndex, + materialName.c_str(), + ctx.gltf->textures.size() - 1); return -1; } @@ -323,6 +324,15 @@ importImage(ImportGltfContext& ctx, textureIndex); return -1; } + // Validate image index to prevent out-of-bounds array access + if (static_cast(imageIndex) >= ctx.gltf->images.size()) { + TF_WARN("Invalid image index %d for texture %d in material '%s' (valid range: 0-%zu)", + imageIndex, + textureIndex, + materialName.c_str(), + ctx.gltf->images.size() - 1); + return -1; + } const tinygltf::Image& image = ctx.gltf->images[imageIndex]; const std::string uriStem = TfStringGetBeforeSuffix(TfGetBaseName(image.uri)); @@ -394,9 +404,15 @@ importTexture(const tinygltf::Model* gltf, const TfToken& channel, const TfToken& colorSpace) { + // Validate texture index to prevent out-of-bounds array access + if (textureIndex < 0 || static_cast(textureIndex) >= gltf->textures.size()) { + // Invalid texture index - skip texture import silently + // (importImage already logged a warning) + return false; + } tinygltf::Texture texture = gltf->textures[textureIndex]; int samplerIndex = texture.sampler; - if (samplerIndex >= 0) { + if (samplerIndex >= 0 && static_cast(samplerIndex) < gltf->samplers.size()) { tinygltf::Sampler sampler = gltf->samplers[samplerIndex]; switch (sampler.wrapS) { case TINYGLTF_TEXTURE_WRAP_REPEAT: @@ -636,6 +652,48 @@ importClearcoat(const tinygltf::ExtensionMap& extensions, Clearcoat* clearcoat) return false; } +struct Coat +{ + double factor = 0.0; + tinygltf::TextureInfo texture; // r channel + double roughnessFactor = 0.0; + tinygltf::TextureInfo roughnessTexture; // g channel + tinygltf::NormalTextureInfo normalTexture; // rgb channels + double ior = 1.5; + double colorFactor[3] = { 1.0, 1.0, 1.0 }; + tinygltf::TextureInfo colorTexture; // rgb channels +}; + +bool +importCoat(const tinygltf::ExtensionMap& extensions, Coat* coat, const std::string& materialName) +{ + auto extIt = extensions.find("KHR_materials_coat"); + if (extIt != extensions.end()) { + const tinygltf::Value& coatExt = extIt->second; + readDoubleValue(coatExt.Get("coatFactor"), coat->factor); + readTextureInfo(coatExt.Get("coatTexture"), coat->texture); + readDoubleValue(coatExt.Get("coatRoughnessFactor"), coat->roughnessFactor); + readTextureInfo(coatExt.Get("coatRoughnessTexture"), coat->roughnessTexture); + readNormalTextureInfo(coatExt.Get("coatNormalTexture"), coat->normalTexture); + double coatIor = coat->ior; // preserve default + readDoubleValue(coatExt.Get("coatIor"), coatIor); + // Per spec, IOR must be >= 1.0 + if (coatIor >= 1.0) { + coat->ior = coatIor; + } else { + TF_WARN("Material '%s': Skipping invalid IOR value %f in KHR_materials_coat (must be " + ">= 1.0)", + materialName.c_str(), + coatIor); + } + readDoubleArray(coatExt.Get("coatColorFactor"), coat->colorFactor, 3); + readTextureInfo(coatExt.Get("coatColorTexture"), coat->colorTexture); + return true; + } + + return false; +} + bool importEmissionStrength(const tinygltf::ExtensionMap& extensions, double* emissiveStrength) { @@ -649,11 +707,21 @@ importEmissionStrength(const tinygltf::ExtensionMap& extensions, double* emissiv } bool -importIor(const tinygltf::ExtensionMap& extensions, double* ior) +importIor(const tinygltf::ExtensionMap& extensions, double* ior, const std::string& materialName) { if (auto extIt = extensions.find("KHR_materials_ior"); extIt != extensions.end()) { const tinygltf::Value& iorExt = extIt->second; - readDoubleValue(iorExt.Get("ior"), *ior); + double iorValue = *ior; // preserve default + readDoubleValue(iorExt.Get("ior"), iorValue); + // Per KHR_materials_ior spec, IOR must be >= 1.0 + if (iorValue >= 1.0) { + *ior = iorValue; + } else { + TF_WARN("Material '%s': Skipping invalid IOR value %f in KHR_materials_ior (must be >= " + "1.0)", + materialName.c_str(), + iorValue); + } return true; } return false; @@ -760,12 +828,23 @@ struct AdobeClearcoatSpecular bool importAdobeClearcoatSpecular(const tinygltf::ExtensionMap& extensions, - AdobeClearcoatSpecular* clearcoatSpecular) + AdobeClearcoatSpecular* clearcoatSpecular, + const std::string& materialName) { auto extIt = extensions.find("ADOBE_materials_clearcoat_specular"); if (extIt != extensions.end()) { const tinygltf::Value& coatExt = extIt->second; - readDoubleValue(coatExt.Get("clearcoatIor"), clearcoatSpecular->ior); + double clearcoatIor = clearcoatSpecular->ior; // preserve default + readDoubleValue(coatExt.Get("clearcoatIor"), clearcoatIor); + // Per spec, IOR must be >= 1.0 + if (clearcoatIor >= 1.0) { + clearcoatSpecular->ior = clearcoatIor; + } else { + TF_WARN("Material '%s': Skipping invalid IOR value %f in " + "ADOBE_materials_clearcoat_specular (must be >= 1.0)", + materialName.c_str(), + clearcoatIor); + } readDoubleValue(coatExt.Get("clearcoatSpecularFactor"), clearcoatSpecular->factor); readTextureInfo(coatExt.Get("clearcoatSpecularTexture"), clearcoatSpecular->texture); return true; @@ -774,28 +853,18 @@ importAdobeClearcoatSpecular(const tinygltf::ExtensionMap& extensions, return false; } -// Multi-vendor extension for supporting colored tinting of clearcoat -struct ClearcoatColor +// Extension for supporting colored tinting of clearcoat +struct AdobeClearcoatColor { double factor[3] = { 1.0, 1.0, 1.0 }; tinygltf::TextureInfo texture; // rgb channels }; bool -importClearcoatColor(const tinygltf::ExtensionMap& extensions, - ClearcoatColor* clearcoatColor) +importAdobeClearcoatColor(const tinygltf::ExtensionMap& extensions, + AdobeClearcoatColor* clearcoatColor) { - // The multi-vendor version of coat tinting takes priority over the - // old, Adobe-specific, version. - auto extIt = extensions.find("EXT_materials_clearcoat_color"); - if (extIt != extensions.end()) { - const tinygltf::Value& coatExt = extIt->second; - readDoubleArray(coatExt.Get("clearcoatColorFactor"), clearcoatColor->factor, 3); - readTextureInfo(coatExt.Get("clearcoatColorTexture"), clearcoatColor->texture); - return true; - } - - extIt = extensions.find("ADOBE_materials_clearcoat_tint"); + auto extIt = extensions.find("ADOBE_materials_clearcoat_tint"); if (extIt != extensions.end()) { const tinygltf::Value& coatExt = extIt->second; readDoubleArray(coatExt.Get("clearcoatTintFactor"), clearcoatColor->factor, 3); @@ -1133,7 +1202,7 @@ importMaterials(ImportGltfContext& ctx) } double ior = 1.5; - if (importIor(gm.extensions, &ior)) { + if (importIor(gm.extensions, &ior, m.displayName)) { importValue1(m.ior, ior); } @@ -1182,7 +1251,33 @@ importMaterials(ImportGltfContext& ctx) } Clearcoat clearcoat; - if (importClearcoat(gm.extensions, &clearcoat)) { + Coat coat; + if (importCoat(gm.extensions, &coat, m.displayName)) { + importInput(ctx, + m.displayName, + "coat", + m.clearcoat, + coat.texture, + AdobeTokens->r, + &coat.factor); + importInput(ctx, + m.displayName, + "coatRoughness", + m.clearcoatRoughness, + coat.roughnessTexture, + AdobeTokens->g, + &coat.roughnessFactor); + importNormalInput( + ctx, m.displayName, "coatNormal", m.clearcoatNormal, coat.normalTexture); + importValue1(m.clearcoatIor, coat.ior); + importColorInput(ctx, + m.displayName, + "coatColor", + m.clearcoatColor, + coat.colorTexture, + coat.colorFactor, + 1.0); + } else if (importClearcoat(gm.extensions, &clearcoat)) { importInput(ctx, m.displayName, "clearcoat", @@ -1202,30 +1297,30 @@ importMaterials(ImportGltfContext& ctx) "clearcoatNormal", m.clearcoatNormal, clearcoat.normalTexture); - } - - AdobeClearcoatSpecular clearcoatSpecular; - if (importAdobeClearcoatSpecular(gm.extensions, &clearcoatSpecular)) { - importValue1(m.clearcoatIor, clearcoatSpecular.ior); - importInput(ctx, - m.displayName, - "clearcoatSpecular", - m.clearcoatSpecular, - clearcoatSpecular.texture, - AdobeTokens->b, - &clearcoatSpecular.factor, - 1.0); - } - ClearcoatColor clearcoatColor; - if (importClearcoatColor(gm.extensions, &clearcoatColor)) { - importColorInput(ctx, - m.displayName, - "clearcoatColor", - m.clearcoatColor, - clearcoatColor.texture, - clearcoatColor.factor, - 1.0); + AdobeClearcoatSpecular clearcoatSpecular; + if (importAdobeClearcoatSpecular( + gm.extensions, &clearcoatSpecular, m.displayName)) { + importValue1(m.clearcoatIor, clearcoatSpecular.ior); + importInput(ctx, + m.displayName, + "clearcoatSpecular", + m.clearcoatSpecular, + clearcoatSpecular.texture, + AdobeTokens->b, + &clearcoatSpecular.factor, + 1.0); + } + AdobeClearcoatColor clearcoatColor; + if (importAdobeClearcoatColor(gm.extensions, &clearcoatColor)) { + importColorInput(ctx, + m.displayName, + "clearcoatColor", + m.clearcoatColor, + clearcoatColor.texture, + clearcoatColor.factor, + 1.0); + } } Sheen sheen; @@ -1342,8 +1437,9 @@ importMaterials(ImportGltfContext& ctx) importValue3(m.scatteringColor, volumeScatter.multiscatterColor); importValue3(m.scatteringDistanceScale, volumeScatter.scatteringDistanceScale); importValue1(m.scatteringDistance, volumeScatter.scatteringDistance); - // If we've imported the volume scatter extension, the attenuation color has been reinterpreted - // to include scattering and we need to erase the previously calculated absorption color. + // If we've imported the volume scatter extension, the attenuation color has been + // reinterpreted to include scattering and we need to erase the previously + // calculated absorption color. double absorptionColor[3] = { 1.0, 1.0, 1.0 }; importValue3(m.absorptionColor, absorptionColor); importValue1(m.absorptionDistance, 0.0); @@ -1485,13 +1581,17 @@ importMeshJointWeights(const tinygltf::Model& model, if (jointsIndices[i] >= 0) { if (jointsIndices[i] >= static_cast(model.accessors.size())) { TF_WARN("Joint accessor index %d out of bounds (length %zu) for mesh '%s'", - jointsIndices[i], model.accessors.size(), mesh.displayName.c_str()); + jointsIndices[i], + model.accessors.size(), + mesh.displayName.c_str()); return; } const tinygltf::Accessor& jointAccessor = model.accessors[jointsIndices[i]]; if (jointAccessor.type != TINYGLTF_TYPE_VEC4) { TF_WARN("Joint accessor %d has invalid type %d (expected VEC4) for mesh '%s'", - jointsIndices[i], jointAccessor.type, mesh.displayName.c_str()); + jointsIndices[i], + jointAccessor.type, + mesh.displayName.c_str()); return; } } @@ -1499,13 +1599,17 @@ importMeshJointWeights(const tinygltf::Model& model, if (weightsIndices[i] >= 0) { if (weightsIndices[i] >= static_cast(model.accessors.size())) { TF_WARN("Weight accessor index %d out of bounds (length %zu) for mesh '%s'", - weightsIndices[i], model.accessors.size(), mesh.displayName.c_str()); + weightsIndices[i], + model.accessors.size(), + mesh.displayName.c_str()); return; } const tinygltf::Accessor& weightAccessor = model.accessors[weightsIndices[i]]; if (weightAccessor.type != TINYGLTF_TYPE_VEC4) { TF_WARN("Weight accessor %d has invalid type %d (expected VEC4) for mesh '%s'", - weightsIndices[i], weightAccessor.type, mesh.displayName.c_str()); + weightsIndices[i], + weightAccessor.type, + mesh.displayName.c_str()); return; } } @@ -1579,7 +1683,9 @@ getIndices(const tinygltf::Model& model, { if (indicesIndex >= 0) { dst.resize(getAccessorElementCount(model, indicesIndex)); - readAccessorInts(model, indicesIndex, dst); + // Mesh indices can only be scalar + constexpr bool isScalar = true; + readAccessorInts(model, indicesIndex, dst, isScalar); } else { dst.resize(numVertices); @@ -1603,38 +1709,42 @@ importMeshes(ImportGltfContext& ctx) // Be aware of properly combining UV subsets const tinygltf::Primitive& primitive = gmesh.primitives[j]; - + // Get accessor indices before adding mesh (for early validation) int positionsIndex = getPrimitiveAttribute(primitive, "POSITION"); int normalsIndex = getPrimitiveAttribute(primitive, "NORMAL"); int tangentsIndex = getPrimitiveAttribute(primitive, "TANGENT"); int uvsIndex = getPrimitiveAttribute(primitive, "TEXCOORD_0"); int indicesIndex = primitive.indices; - + // Get vertex count for validation size_t vertexCount = getAccessorElementCount(*ctx.gltf, positionsIndex); - + // Pre-validate indices before loading mesh data bool skipLoadingData = false; if (indicesIndex >= 0) { PXR_NS::VtArray tempIndices; getIndices(*ctx.gltf, indicesIndex, vertexCount, tempIndices); - + if (!tempIndices.empty() && vertexCount > 0) { int maxIndex = *std::max_element(tempIndices.begin(), tempIndices.end()); if (maxIndex >= static_cast(vertexCount)) { - TF_WARN("Mesh '%s' primitive %zu has indices (max %d) exceeding vertex count (%zu). Creating empty mesh to prevent crash.", - gmesh.name.c_str(), j, maxIndex, vertexCount); + TF_WARN("Mesh '%s' primitive %zu has indices (max %d) exceeding vertex " + "count (%zu). Creating empty mesh to prevent crash.", + gmesh.name.c_str(), + j, + maxIndex, + vertexCount); skipLoadingData = true; } } } - + // Always add mesh (even if invalid) to maintain index consistency // If invalid, we'll leave it empty auto [meshIndex, mesh] = ctx.usd->addMesh(); ctx.meshes[i][j] = meshIndex; - + // Skip loading data if validation failed - leave mesh empty if (skipLoadingData) { continue; @@ -1654,8 +1764,8 @@ importMeshes(ImportGltfContext& ctx) // NORMAL is optional - only read if present if (normalsIndex >= 0) { - mesh.normals.values = - PXR_NS::VtArray(getAccessorElementCount(*ctx.gltf, normalsIndex)); + mesh.normals.values = PXR_NS::VtArray( + getAccessorElementCount(*ctx.gltf, normalsIndex)); readAccessorDataToFloat( *ctx.gltf, normalsIndex, reinterpret_cast(mesh.normals.values.data())); mesh.normals.interpolation = UsdGeomTokens->vertex; @@ -1663,8 +1773,8 @@ importMeshes(ImportGltfContext& ctx) // TANGENT is optional - only read if present if (tangentsIndex >= 0) { - mesh.tangents.values = - PXR_NS::VtArray(getAccessorElementCount(*ctx.gltf, tangentsIndex)); + mesh.tangents.values = PXR_NS::VtArray( + getAccessorElementCount(*ctx.gltf, tangentsIndex)); readAccessorDataToFloat( *ctx.gltf, tangentsIndex, reinterpret_cast(mesh.tangents.values.data())); mesh.tangents.interpolation = UsdGeomTokens->vertex; @@ -1672,35 +1782,40 @@ importMeshes(ImportGltfContext& ctx) // GLTF tangent format: (x, y, z, w) where w is handedness (+1 or -1) // Binormal = cross(normal, tangent.xyz) * tangent.w // Only compute bitangents if explicitly requested - if (ctx.options->computeBitangents && mesh.normals.values.size() == mesh.tangents.values.size()) { + if (ctx.options->computeBitangents && + mesh.normals.values.size() == mesh.tangents.values.size()) { mesh.bitangents.values.resize(mesh.tangents.values.size()); for (size_t k = 0; k < mesh.tangents.values.size(); k++) { const PXR_NS::GfVec3f& normal = mesh.normals.values[k]; const PXR_NS::GfVec4f& tangent = mesh.tangents.values[k]; PXR_NS::GfVec3f tangentXYZ(tangent[0], tangent[1], tangent[2]); float handedness = tangent[3]; - + if (std::abs(handedness) < 0.5f) { - TF_WARN("Invalid handedness value %f in tangent data, assuming +1", handedness); + TF_WARN("Invalid handedness value %f in tangent data, assuming +1", + handedness); handedness = 1.0f; } else { handedness = handedness >= 0.0f ? 1.0f : -1.0f; } - + // Compute bitangent using cross product: normal × tangentXYZ PXR_NS::GfVec3f crossProduct( - normal[1] * tangentXYZ[2] - normal[2] * tangentXYZ[1], // x = ny*tz - nz*ty - normal[2] * tangentXYZ[0] - normal[0] * tangentXYZ[2], // y = nz*tx - nx*tz - normal[0] * tangentXYZ[1] - normal[1] * tangentXYZ[0] // z = nx*ty - ny*tx + normal[1] * tangentXYZ[2] - + normal[2] * tangentXYZ[1], // x = ny*tz - nz*ty + normal[2] * tangentXYZ[0] - + normal[0] * tangentXYZ[2], // y = nz*tx - nx*tz + normal[0] * tangentXYZ[1] - normal[1] * tangentXYZ[0] // z = nx*ty - ny*tx ); mesh.bitangents.values[k] = crossProduct * handedness; } mesh.bitangents.interpolation = UsdGeomTokens->vertex; } else if (ctx.options->computeBitangents && mesh.normals.values.size() > 0) { - TF_WARN("Tangent and normal vertex counts don't match (%zu tangents, %zu normals). " - "Skipping bitangent computation.", - mesh.tangents.values.size(), - mesh.normals.values.size()); + TF_WARN( + "Tangent and normal vertex counts don't match (%zu tangents, %zu normals). " + "Skipping bitangent computation.", + mesh.tangents.values.size(), + mesh.normals.values.size()); } } @@ -1710,6 +1825,25 @@ importMeshes(ImportGltfContext& ctx) PXR_NS::VtArray(getAccessorElementCount(*ctx.gltf, uvsIndex)); readAccessorDataToFloat( *ctx.gltf, uvsIndex, reinterpret_cast(mesh.uvs.values.data())); + + // Validate UV coordinates - clean out NaN/Inf values + size_t invalidCount = 0; + for (auto& uv : mesh.uvs.values) { + bool invalid = std::isnan(uv[0]) || std::isinf(uv[0]) || std::isnan(uv[1]) || + std::isinf(uv[1]); + if (invalid) { + uv[0] = 0.0f; + uv[1] = 0.0f; + invalidCount++; + } + } + if (invalidCount > 0) { + TF_WARN("Mesh '%s' has %zu invalid UV coordinates (NaN/Inf). " + "These have been reset to (0,0) to prevent rendering issues.", + mesh.displayName.c_str(), + invalidCount); + } + // Flip V coordinates for glTF files to match USD convention for (auto& uv : mesh.uvs.values) { uv[1] = 1.0f - uv[1]; @@ -1733,6 +1867,26 @@ importMeshes(ImportGltfContext& ctx) getAccessorElementCount(*ctx.gltf, uvsIndex)); readAccessorDataToFloat( *ctx.gltf, uvsIndex, reinterpret_cast(uvs.values.data())); + + // Validate UV coordinates for extra UV sets - clean out NaN/Inf values + size_t invalidCount = 0; + for (auto& uv : uvs.values) { + bool invalid = std::isnan(uv[0]) || std::isinf(uv[0]) || + std::isnan(uv[1]) || std::isinf(uv[1]); + if (invalid) { + uv[0] = 0.0f; + uv[1] = 0.0f; + invalidCount++; + } + } + if (invalidCount > 0) { + TF_WARN("Mesh '%s' TEXCOORD_%d has %zu invalid UV coordinates (NaN/Inf). " + "These have been reset to (0,0).", + mesh.displayName.c_str(), + n, + invalidCount); + } + // Flip V coordinates for additional UV sets as well for (auto& uv : uvs.values) { uv[1] = 1.0f - uv[1]; @@ -1752,7 +1906,7 @@ importMeshes(ImportGltfContext& ctx) TF_WARN("GLTF TRIANGLE primitive has a number of indices not divisible " "by 3\n"); } - + break; case TINYGLTF_MODE_TRIANGLE_STRIP: { PXR_NS::VtArray stripIndices; @@ -1830,9 +1984,14 @@ importMeshes(ImportGltfContext& ctx) } } -// Traverses the glTF nodes to construct names appropriate for UsdSkel API consumption +// Traverses the glTF nodes to construct names appropriate for UsdSkel API consumption // (for the Skeleton::joints attribute), of the form: n0/n1/n2... -bool _buildSkeletonNodeNames(ImportGltfContext& ctx, int parentIndex, int nodeIndex, std::unordered_set& traversedNodes) { +bool +_buildSkeletonNodeNames(ImportGltfContext& ctx, + int parentIndex, + int nodeIndex, + std::unordered_set& traversedNodes) +{ if (traversedNodes.count(nodeIndex) > 0) { TF_WARN("Node index %d is already traversed, skipping", nodeIndex); return false; @@ -1881,11 +2040,12 @@ importSkeletons(ImportGltfContext& ctx) } } - // ctx.usd->skeletons was resized at the very start to match the size of ctx.gltf->skins, + // ctx.usd->skeletons was resized at the very start to match the size of ctx.gltf->skins, // but let's make sure it's still the same size. if (ctx.usd->skeletons.size() != ctx.gltf->skins.size()) { TF_CODING_ERROR("usd->skeletons size (%zu) does not match gltf->skins size (%zu)", - ctx.usd->skeletons.size(), ctx.gltf->skins.size()); + ctx.usd->skeletons.size(), + ctx.gltf->skins.size()); } // Then build the skeletons @@ -1907,14 +2067,16 @@ importSkeletons(ImportGltfContext& ctx) // Validate node index BEFORE using it to prevent out-of-bounds access if (nodeIndex < 0 || nodeIndex >= static_cast(ctx.gltf->nodes.size())) { - TF_WARN("Skin joint index %d out of bounds (must be 0-%zu) for skin '%s'", - nodeIndex, ctx.gltf->nodes.size() - 1, skin.name.c_str()); - + TF_WARN("Skin joint index %d out of bounds (must be 0-%zu) for skin '%s'", + nodeIndex, + ctx.gltf->nodes.size() - 1, + skin.name.c_str()); + // Create placeholder for bad joint index - skeleton.joints[jointIdx] = PXR_NS::TfToken("bad_index_node_" + - std::to_string(nodeIndex)); - skeleton.jointNames[jointIdx] = PXR_NS::TfToken("Bad Index Node " + - std::to_string(nodeIndex)); + skeleton.joints[jointIdx] = + PXR_NS::TfToken("bad_index_node_" + std::to_string(nodeIndex)); + skeleton.jointNames[jointIdx] = + PXR_NS::TfToken("Bad Index Node " + std::to_string(nodeIndex)); skeleton.restTransforms[jointIdx] = PXR_NS::GfMatrix4d(1); skeleton.bindTransforms[jointIdx] = PXR_NS::GfMatrix4d(1); continue; @@ -1927,7 +2089,8 @@ importSkeletons(ImportGltfContext& ctx) } if (nodeIt->second < 0 || nodeIt->second >= static_cast(ctx.usd->nodes.size())) { - TF_WARN("USD node index %d out of bounds (length %zu)", nodeIt->second, + TF_WARN("USD node index %d out of bounds (length %zu)", + nodeIt->second, ctx.usd->nodes.size()); continue; } @@ -1935,10 +2098,10 @@ importSkeletons(ImportGltfContext& ctx) usdNode.isJoint = true; const tinygltf::Node& node = ctx.gltf->nodes[nodeIndex]; - + // Recall all glTF nodes are going to be imported as USD nodes // but we still mark this node as a skeleton joint in the cache. - + PXR_NS::GfVec3d t = node.translation.size() ? PXR_NS::GfVec3d(node.translation[0], node.translation[1], node.translation[2]) @@ -1962,38 +2125,105 @@ importSkeletons(ImportGltfContext& ctx) skeleton.restTransforms[jointIdx] = m; } - // Validate inverse bind matrices accessor to prevent type confusion attacks + // Validate and read inverse bind matrices accessor + // Only process if inverseBindMatrices is provided (>= 0) if (skin.inverseBindMatrices >= 0) { + // Validate accessor index bounds if (skin.inverseBindMatrices >= static_cast(ctx.gltf->accessors.size())) { - TF_WARN("Inverse bind matrices accessor index %d out of bounds (length %zu) for skin '%s'", - skin.inverseBindMatrices, ctx.gltf->accessors.size(), skeleton.displayName.c_str()); + TF_WARN("Inverse bind matrices accessor index %d out of bounds (length %zu) for " + "skin '%s'", + skin.inverseBindMatrices, + ctx.gltf->accessors.size(), + skeleton.displayName.c_str()); continue; } + const tinygltf::Accessor& ibmAccessor = ctx.gltf->accessors[skin.inverseBindMatrices]; + + // Validate accessor type - must be MAT4 for inverse bind matrices if (ibmAccessor.type != TINYGLTF_TYPE_MAT4) { - TF_WARN("Inverse bind matrices accessor %d has invalid type %d (expected MAT4) for skin '%s'", - skin.inverseBindMatrices, ibmAccessor.type, skeleton.displayName.c_str()); + TF_WARN("Inverse bind matrices accessor %d has invalid type %d (expected MAT4) for " + "skin '%s'", + skin.inverseBindMatrices, + ibmAccessor.type, + skeleton.displayName.c_str()); continue; } + + // Validate accessor count matches joints count if (ibmAccessor.count != skin.joints.size()) { - TF_WARN("Inverse bind matrices accessor %d count %zu does not match joints count %zu for skin '%s'", - skin.inverseBindMatrices, ibmAccessor.count, skin.joints.size(), skeleton.displayName.c_str()); + TF_WARN("Inverse bind matrices accessor %d count %zu does not match joints count " + "%zu for skin '%s'", + skin.inverseBindMatrices, + ibmAccessor.count, + skin.joints.size(), + skeleton.displayName.c_str()); continue; } - } - PXR_NS::VtArray inverseBindMatricesFloat( - getAccessorElementCount(*ctx.gltf, skin.inverseBindMatrices)); - readAccessorData(*ctx.gltf, - skin.inverseBindMatrices, - reinterpret_cast(inverseBindMatricesFloat.data())); - for (size_t jointIdx = 0; jointIdx < skin.joints.size(); jointIdx++) { - skeleton.bindTransforms[jointIdx] = - PXR_NS::GfMatrix4d(inverseBindMatricesFloat[jointIdx]).GetInverse(); + // Validate buffer view index to prevent NULL pointer dereference + if (ibmAccessor.bufferView < 0 || + static_cast(ibmAccessor.bufferView) >= ctx.gltf->bufferViews.size()) { + TF_WARN("Inverse bind matrices accessor %d has invalid buffer view index %d for " + "skin '%s'", + skin.inverseBindMatrices, + ibmAccessor.bufferView, + skeleton.displayName.c_str()); + continue; + } + + // Validate buffer index + const tinygltf::BufferView& bufferView = ctx.gltf->bufferViews[ibmAccessor.bufferView]; + if (bufferView.buffer < 0 || + static_cast(bufferView.buffer) >= ctx.gltf->buffers.size()) { + TF_WARN( + "Inverse bind matrices buffer view %d has invalid buffer index %d for skin '%s'", + ibmAccessor.bufferView, + bufferView.buffer, + skeleton.displayName.c_str()); + continue; + } + + // Read inverse bind matrices and compute bind transforms + PXR_NS::VtArray inverseBindMatricesFloat( + getAccessorElementCount(*ctx.gltf, skin.inverseBindMatrices)); + readAccessorData(*ctx.gltf, + skin.inverseBindMatrices, + reinterpret_cast(inverseBindMatricesFloat.data())); + for (size_t jointIdx = 0; jointIdx < skin.joints.size(); jointIdx++) { + skeleton.bindTransforms[jointIdx] = + PXR_NS::GfMatrix4d(inverseBindMatricesFloat[jointIdx]).GetInverse(); + } } + // If inverseBindMatrices is not provided (-1), bind transforms remain at their default + // (identity) } } +// Helper function to get the expected GLTF type for animation output values +// Returns the expected TINYGLTF_TYPE_* constant for the given USD type +template +constexpr int +getExpectedGltfType() +{ + // Default: unsupported type + return -1; +} + +template<> +constexpr int +getExpectedGltfType() +{ + return TINYGLTF_TYPE_VEC3; // For translation and scale +} + +template<> +constexpr int +getExpectedGltfType() +{ + return TINYGLTF_TYPE_VEC4; // For rotation (quaternion) +} + template bool importChannel(const tinygltf::Model& gltf, @@ -2007,40 +2237,77 @@ importChannel(const tinygltf::Model& gltf, if (channel.target_path == name) { // Validate animation sampler accessors to prevent buffer overflow attacks if (sampler.input < 0 || sampler.input >= static_cast(gltf.accessors.size())) { - TF_WARN("Animation sampler input accessor index %d out of bounds (length %zu) for channel '%s'", - sampler.input, gltf.accessors.size(), name.c_str()); + TF_WARN("Animation sampler input accessor index %d out of bounds (length %zu) for " + "channel '%s'", + sampler.input, + gltf.accessors.size(), + name.c_str()); return false; } - + if (sampler.output < 0 || sampler.output >= static_cast(gltf.accessors.size())) { - TF_WARN("Animation sampler output accessor index %d out of bounds (length %zu) for channel '%s'", - sampler.output, gltf.accessors.size(), name.c_str()); + TF_WARN("Animation sampler output accessor index %d out of bounds (length %zu) for " + "channel '%s'", + sampler.output, + gltf.accessors.size(), + name.c_str()); + return false; + } + + // Validate input accessor type - must be SCALAR for animation timestamps + // This prevents buffer overflow when reading timestamps into float array + const tinygltf::Accessor& inputAccessor = gltf.accessors[sampler.input]; + if (inputAccessor.type != TINYGLTF_TYPE_SCALAR) { + TF_WARN("Animation sampler input accessor %d has invalid type %d (expected SCALAR type " + "%d) for channel '%s'", + sampler.input, + inputAccessor.type, + TINYGLTF_TYPE_SCALAR, + name.c_str()); + return false; + } + + // Validate output accessor type - must match expected type for the animation channel + // This prevents buffer overflow when reading values into typed array + const tinygltf::Accessor& outputAccessor = gltf.accessors[sampler.output]; + int expectedType = getExpectedGltfType(); + if (outputAccessor.type != expectedType) { + TF_WARN("Animation sampler output accessor %d has invalid type %d (expected type %d) " + "for channel '%s'", + sampler.output, + outputAccessor.type, + expectedType, + name.c_str()); return false; } int offset = values.times.size(); int count = getAccessorElementCount(gltf, sampler.input); int count2 = getAccessorElementCount(gltf, sampler.output); - + // Validate accessor element counts to prevent buffer access violations if (count <= 0) { TF_WARN("Animation sampler input accessor %d has invalid count %d for channel '%s'", - sampler.input, count, name.c_str()); + sampler.input, + count, + name.c_str()); return false; } if (count2 <= 0) { TF_WARN("Animation sampler output accessor %d has invalid count %d for channel '%s'", - sampler.output, count2, name.c_str()); + sampler.output, + count2, + name.c_str()); return false; } values.times.resize(offset + count); values.values.resize(offset + count2); - readAccessorDataToFloat(gltf, sampler.input, - reinterpret_cast(values.times.data() + offset)); + readAccessorDataToFloat( + gltf, sampler.input, reinterpret_cast(values.times.data() + offset)); readAccessorDataToFloat( gltf, sampler.output, reinterpret_cast(values.values.data() + offset)); - + // Safe to access array elements since we validated count > 0 minTime = std::min(minTime, values.times[offset]); maxTime = std::max(maxTime, values.times[offset + count - 1]); @@ -2073,8 +2340,9 @@ importNodeAnimations(ImportGltfContext& ctx) for (const tinygltf::AnimationChannel& channel : animation.channels) { if (channel.sampler < 0 || channel.sampler >= animation.samplers.size()) { - TF_WARN("Animation sampler index %d is out of bounds (max: %zu)", - channel.sampler, animation.samplers.size()); + TF_WARN("Animation sampler index %d is out of bounds (max: %zu)", + channel.sampler, + animation.samplers.size()); continue; } const tinygltf::AnimationSampler& sampler = animation.samplers[channel.sampler]; @@ -2084,7 +2352,8 @@ importNodeAnimations(ImportGltfContext& ctx) continue; } if (nodeIt->second < 0 || nodeIt->second >= ctx.usd->nodes.size()) { - TF_WARN("USD node index %d out of bounds (length %zu)", nodeIt->second, + TF_WARN("USD node index %d out of bounds (length %zu)", + nodeIt->second, ctx.usd->nodes.size()); continue; } @@ -2156,20 +2425,22 @@ importSkeletonAnimations(ImportGltfContext& ctx) continue; } if (nodeIt->second < 0 || nodeIt->second >= ctx.usd->nodes.size()) { - TF_WARN("USD node index %d out of bounds (length %zu)", nodeIt->second, + TF_WARN("USD node index %d out of bounds (length %zu)", + nodeIt->second, ctx.usd->nodes.size()); continue; } if (!ctx.usd->nodes[nodeIt->second].isJoint) { if (channel.target_node < 0 || channel.target_node >= ctx.gltf->nodes.size()) { - TF_WARN("Node index %d out of bounds (length %zu)", channel.target_node, + TF_WARN("Node index %d out of bounds (length %zu)", + channel.target_node, ctx.gltf->nodes.size()); } else { const tinygltf::Node& node = ctx.gltf->nodes[channel.target_node]; TF_DEBUG_MSG(FILE_FORMAT_GLTF, - "Found non skeleton node %d %s\n", - channel.target_node, - node.name.c_str()); + "Found non skeleton node %d %s\n", + channel.target_node, + node.name.c_str()); } continue; } @@ -2182,16 +2453,17 @@ importSkeletonAnimations(ImportGltfContext& ctx) return; } - // ctx.usd->skeletons was resized at the very start to match the size of ctx.gltf->skins, + // ctx.usd->skeletons was resized at the very start to match the size of ctx.gltf->skins, // but let's make sure it's still the same size. if (ctx.usd->skeletons.size() != ctx.gltf->skins.size()) { TF_CODING_ERROR("usd->skeletons size (%zu) does not match gltf->skins size (%zu)", - ctx.usd->skeletons.size(), ctx.gltf->skins.size()); + ctx.usd->skeletons.size(), + ctx.gltf->skins.size()); } for (size_t skinIdx = 0; skinIdx < ctx.gltf->skins.size(); skinIdx++) { const tinygltf::Skin& skin = ctx.gltf->skins[skinIdx]; - + Skeleton& skeleton = ctx.usd->skeletons[skinIdx]; // Determine the set of animated nodes affecting this skeleton @@ -2214,7 +2486,7 @@ importSkeletonAnimations(ImportGltfContext& ctx) for (size_t skelAnimIdx = 0; skelAnimIdx < skelAnimNodes.size(); skelAnimIdx++) { auto nameIt = ctx.skeletonNodeNames.find(skelAnimNodes[skelAnimIdx]); if (nameIt == ctx.skeletonNodeNames.end()) { - TF_WARN("Could not find skeleton node name for glTF node %d", + TF_WARN("Could not find skeleton node name for glTF node %d", skelAnimNodes[skelAnimIdx]); continue; } @@ -2226,8 +2498,7 @@ importSkeletonAnimations(ImportGltfContext& ctx) animationTrackIndex++) { const tinygltf::Animation& animation = ctx.gltf->animations[animationTrackIndex]; AnimationTrack& track = ctx.usd->animationTracks[animationTrackIndex]; - SkeletonAnimation& skeletonAnimation = - skeleton.skeletonAnimations[animationTrackIndex]; + SkeletonAnimation& skeletonAnimation = skeleton.skeletonAnimations[animationTrackIndex]; // Build a definitive time scale by inserting time points from every times array. // TF_DEBUG_MSG(FILE_FORMAT_GLTF, "Assembling animation time"); @@ -2239,7 +2510,8 @@ importSkeletonAnimations(ImportGltfContext& ctx) continue; } if (nodeIt->second < 0 || nodeIt->second >= ctx.usd->nodes.size()) { - TF_WARN("USD node index %d out of bounds (length %zu)", nodeIt->second, + TF_WARN("USD node index %d out of bounds (length %zu)", + nodeIt->second, ctx.usd->nodes.size()); continue; } @@ -2284,14 +2556,16 @@ importSkeletonAnimations(ImportGltfContext& ctx) continue; } if (nodeIt->second < 0 || nodeIt->second >= ctx.usd->nodes.size()) { - TF_WARN("USD node index %d out of bounds (length %zu)", nodeIt->second, + TF_WARN("USD node index %d out of bounds (length %zu)", + nodeIt->second, ctx.usd->nodes.size()); continue; } const Node& n = ctx.usd->nodes[nodeIt->second]; if (nodeIndex < 0 || nodeIndex >= ctx.gltf->nodes.size()) { - TF_WARN("Node index %d out of bounds (length %zu)", nodeIndex, + TF_WARN("Node index %d out of bounds (length %zu)", + nodeIndex, ctx.gltf->nodes.size()); continue; } @@ -2325,15 +2599,14 @@ importSkeletonAnimations(ImportGltfContext& ctx) node.translation[1], node.translation[2]) : PXR_NS::GfVec3f(0); - definitiveTranslations[skelAnimIdx].assign(definitiveTimes.size(), - restTranslation); + definitiveTranslations[skelAnimIdx].assign(definitiveTimes.size(), + restTranslation); } if (na.scales.values.size() > 1) { - interpolateData( - definitiveTimes, - na.scales.times, - na.scales.values, - definitiveScales[skelAnimIdx]); + interpolateData(definitiveTimes, + na.scales.times, + na.scales.values, + definitiveScales[skelAnimIdx]); } else { PXR_NS::GfVec3f restScale = node.scale.size() @@ -2351,18 +2624,18 @@ importSkeletonAnimations(ImportGltfContext& ctx) skeletonAnimation.scales.resize(definitiveTimes.size(), PXR_NS::VtArray(skelAnimNodes.size())); for (size_t defTimeIdx = 0; defTimeIdx < definitiveTimes.size(); defTimeIdx++) { - + skeletonAnimation.times[defTimeIdx] = definitiveTimes[defTimeIdx]; for (size_t skelAnimIdx = 0; skelAnimIdx < skelAnimNodes.size(); skelAnimIdx++) { - - skeletonAnimation.rotations[defTimeIdx][skelAnimIdx] = - definitiveRotations[skelAnimIdx][defTimeIdx]; + + skeletonAnimation.rotations[defTimeIdx][skelAnimIdx] = + definitiveRotations[skelAnimIdx][defTimeIdx]; skeletonAnimation.translations[defTimeIdx][skelAnimIdx] = - PXR_NS::GfVec3f(definitiveTranslations[skelAnimIdx][defTimeIdx]); + PXR_NS::GfVec3f(definitiveTranslations[skelAnimIdx][defTimeIdx]); - skeletonAnimation.scales[defTimeIdx][skelAnimIdx] = - PXR_NS::GfVec3h(definitiveScales[skelAnimIdx][defTimeIdx]); + skeletonAnimation.scales[defTimeIdx][skelAnimIdx] = + PXR_NS::GfVec3h(definitiveScales[skelAnimIdx][defTimeIdx]); } } } @@ -2528,9 +2801,15 @@ importNgpExtension(const tinygltf::Value& ngp, NgpData& ngpData) // We traverse the glTF nodes recursively from root to children and assign each node a usd index // We maintain a mapping from the gltf node index to the usd node index in `nodeMap` for reference. -int _traverseNodes(ImportGltfContext& ctx, std::vector& skinnedNodes, int& curUsdIndex, - int parentIndex, int nodeIndex, std::unordered_set& traversedNodes) { - +int +_traverseNodes(ImportGltfContext& ctx, + std::vector& skinnedNodes, + int& curUsdIndex, + int parentIndex, + int nodeIndex, + std::unordered_set& traversedNodes) +{ + if (traversedNodes.count(nodeIndex) > 0) { TF_WARN("Node index %d is already traversed, skipping", nodeIndex); auto it = ctx.nodeMap.find(nodeIndex); @@ -2541,7 +2820,7 @@ int _traverseNodes(ImportGltfContext& ctx, std::vector& skinnedNodes, int& return -1; } traversedNodes.insert(nodeIndex); - + // Get the next slot in the ctx.usd->nodes vector int usdNodeIndex = curUsdIndex; curUsdIndex++; @@ -2568,7 +2847,7 @@ int _traverseNodes(ImportGltfContext& ctx, std::vector& skinnedNodes, int& usdParentIndex = it->second; } } - + if (nodeIndex < 0 || nodeIndex >= ctx.gltf->nodes.size()) { TF_WARN("Node index %d is out of bounds (max: %zu)", nodeIndex, ctx.gltf->nodes.size()); @@ -2581,7 +2860,7 @@ int _traverseNodes(ImportGltfContext& ctx, std::vector& skinnedNodes, int& n.parent = usdParentIndex; return usdNodeIndex; } - + const tinygltf::Node& node = ctx.gltf->nodes[nodeIndex]; Node& n = ctx.usd->nodes[usdNodeIndex]; @@ -2590,20 +2869,24 @@ int _traverseNodes(ImportGltfContext& ctx, std::vector& skinnedNodes, int& n.displayName = node.name; // Validate translation vector size before accessing elements if (node.translation.size() >= 3) { - n.translation = PXR_NS::GfVec3d(node.translation[0], node.translation[1], node.translation[2]); + n.translation = + PXR_NS::GfVec3d(node.translation[0], node.translation[1], node.translation[2]); } else if (!node.translation.empty()) { - TF_WARN("Node '%s' has invalid translation size %zu (expected 3)", - node.name.c_str(), node.translation.size()); + TF_WARN("Node '%s' has invalid translation size %zu (expected 3)", + node.name.c_str(), + node.translation.size()); n.translation = PXR_NS::GfVec3d(0); } else { n.translation = PXR_NS::GfVec3d(0); } // Validate rotation vector size before accessing elements if (node.rotation.size() >= 4) { - n.rotation = PXR_NS::GfQuatf(node.rotation[3], node.rotation[0], node.rotation[1], node.rotation[2]); + n.rotation = + PXR_NS::GfQuatf(node.rotation[3], node.rotation[0], node.rotation[1], node.rotation[2]); } else if (!node.rotation.empty()) { - TF_WARN("Node '%s' has invalid rotation size %zu (expected 4)", - node.name.c_str(), node.rotation.size()); + TF_WARN("Node '%s' has invalid rotation size %zu (expected 4)", + node.name.c_str(), + node.rotation.size()); n.rotation = PXR_NS::GfQuatf(0); } else { n.rotation = PXR_NS::GfQuatf(0); @@ -2612,8 +2895,9 @@ int _traverseNodes(ImportGltfContext& ctx, std::vector& skinnedNodes, int& if (node.scale.size() >= 3) { n.scale = PXR_NS::GfVec3f(node.scale[0], node.scale[1], node.scale[2]); } else if (!node.scale.empty()) { - TF_WARN("Node '%s' has invalid scale size %zu (expected 3)", - node.name.c_str(), node.scale.size()); + TF_WARN("Node '%s' has invalid scale size %zu (expected 3)", + node.name.c_str(), + node.scale.size()); n.scale = PXR_NS::GfVec3f(1); } else { n.scale = PXR_NS::GfVec3f(1); @@ -2623,14 +2907,17 @@ int _traverseNodes(ImportGltfContext& ctx, std::vector& skinnedNodes, int& n.hasTransform = true; copyMatrix(node.matrix, n.transform); } else if (!node.matrix.empty()) { - TF_WARN("Node '%s' has invalid matrix size %zu (expected 16)", - node.name.c_str(), node.matrix.size()); + TF_WARN("Node '%s' has invalid matrix size %zu (expected 16)", + node.name.c_str(), + node.matrix.size()); } // Validate camera index before use if (node.camera >= 0) { if (static_cast(node.camera) >= ctx.gltf->cameras.size()) { - TF_WARN("Node '%s' references invalid camera index %d (max: %zu)", - node.name.c_str(), node.camera, ctx.gltf->cameras.size() - 1); + TF_WARN("Node '%s' references invalid camera index %d (max: %zu)", + node.name.c_str(), + node.camera, + ctx.gltf->cameras.size() - 1); } else { n.camera = node.camera; } @@ -2638,20 +2925,24 @@ int _traverseNodes(ImportGltfContext& ctx, std::vector& skinnedNodes, int& // Validate light index before use if (node.light >= 0) { if (static_cast(node.light) >= ctx.gltf->lights.size()) { - TF_WARN("Node '%s' references invalid light index %d (max: %zu)", - node.name.c_str(), node.light, ctx.gltf->lights.size() - 1); + TF_WARN("Node '%s' references invalid light index %d (max: %zu)", + node.name.c_str(), + node.light, + ctx.gltf->lights.size() - 1); } else { n.light = node.light; } } n.parent = usdParentIndex; - + // Validate mesh index before accessing meshUseCount/meshes vectors if (node.mesh >= 0) { if (static_cast(node.mesh) >= ctx.gltf->meshes.size()) { - TF_WARN("Node '%s' references invalid mesh index %d (max: %zu)", - node.name.c_str(), node.mesh, ctx.gltf->meshes.size() - 1); + TF_WARN("Node '%s' references invalid mesh index %d (max: %zu)", + node.name.c_str(), + node.mesh, + ctx.gltf->meshes.size() - 1); } else { ctx.meshUseCount[node.mesh]++; // If the node has a skin, add the mesh to the root node of the skeleton held by the @@ -2678,7 +2969,7 @@ int _traverseNodes(ImportGltfContext& ctx, std::vector& skinnedNodes, int& for (int childIndex : node.children) { if (traversedNodes.count(childIndex) > 0) { continue; // No loops - } + } if (childIndex < 0 || childIndex >= ctx.gltf->nodes.size()) { continue; // No bad indices } @@ -2690,7 +2981,8 @@ int _traverseNodes(ImportGltfContext& ctx, std::vector& skinnedNodes, int& int validCount = 0; n.children.resize(validChildren.size()); for (auto childIndex : validChildren) { - rtnIndex = _traverseNodes(ctx, skinnedNodes, curUsdIndex, nodeIndex, childIndex, traversedNodes); + rtnIndex = + _traverseNodes(ctx, skinnedNodes, curUsdIndex, nodeIndex, childIndex, traversedNodes); if (rtnIndex >= 0) { n.children[validCount] = rtnIndex; validCount++; @@ -2700,7 +2992,7 @@ int _traverseNodes(ImportGltfContext& ctx, std::vector& skinnedNodes, int& return usdNodeIndex; } -// Import nodes from tinygltf Model to UsdData. We traverse the glTF nodes recursively +// Import nodes from tinygltf Model to UsdData. We traverse the glTF nodes recursively // For nodes with mesh and skin, we add the mesh to the root node of the skeleton held by the skin. bool importNodes(ImportGltfContext& ctx) @@ -2710,7 +3002,7 @@ importNodes(ImportGltfContext& ctx) TF_WARN("No nodes in gltf"); return false; } - + int curUsdIndex = 0; int numNodes = ctx.gltf->nodes.size(); TF_DEBUG_MSG(FILE_FORMAT_GLTF, "Resizing USD nodes array to %d\n", numNodes); @@ -2726,7 +3018,8 @@ importNodes(ImportGltfContext& ctx) std::unordered_set traversedNodes; for (const tinygltf::Scene& scene : ctx.gltf->scenes) { for (int rootNodeIndex : scene.nodes) { - rtnIndex = _traverseNodes(ctx, skinnedNodes, curUsdIndex, -1, rootNodeIndex, traversedNodes); + rtnIndex = + _traverseNodes(ctx, skinnedNodes, curUsdIndex, -1, rootNodeIndex, traversedNodes); if (rtnIndex >= 0) { ctx.usd->rootNodes.push_back(rtnIndex); } @@ -2741,13 +3034,11 @@ importNodes(ImportGltfContext& ctx) int gltfSkinRootNodexIndex = nodeIndex; if (node.skin < 0 || node.skin >= ctx.gltf->skins.size()) { - TF_WARN("Skin index %d is out of bounds (max: %zu)", node.skin, - ctx.gltf->skins.size()); + TF_WARN("Skin index %d is out of bounds (max: %zu)", node.skin, ctx.gltf->skins.size()); continue; } if (node.mesh < 0 || node.mesh >= ctx.meshes.size()) { - TF_WARN("Mesh index %d is out of bounds (max: %zu)", node.mesh, - ctx.meshes.size()); + TF_WARN("Mesh index %d is out of bounds (max: %zu)", node.mesh, ctx.meshes.size()); continue; } @@ -2755,8 +3046,8 @@ importNodes(ImportGltfContext& ctx) // If the skin has a skeleton, find the parent node of the skeleton if (gltfSkeletonNodeIndex >= 0) { auto parentIt = ctx.parentMap.find(gltfSkeletonNodeIndex); - int gltfSkeletonNodeParentIndex = (parentIt != ctx.parentMap.end()) ? - parentIt->second : -1; + int gltfSkeletonNodeParentIndex = + (parentIt != ctx.parentMap.end()) ? parentIt->second : -1; // Check if the parent of the skeleton exists if (gltfSkeletonNodeParentIndex != -1) { @@ -2806,8 +3097,9 @@ checkMeshInstancing(ImportGltfContext& ctx) const std::vector& meshPrimitiveIndices = ctx.meshes[meshIdx]; for (int primitiveIdx : meshPrimitiveIndices) { if (primitiveIdx < 0 || primitiveIdx >= ctx.usd->meshes.size()) { - TF_WARN("Primitive index %d is out of bounds (max: %zu)", - primitiveIdx, ctx.usd->meshes.size()); + TF_WARN("Primitive index %d is out of bounds (max: %zu)", + primitiveIdx, + ctx.usd->meshes.size()); continue; } ctx.usd->meshes[primitiveIdx].instanceable = true; @@ -2848,7 +3140,6 @@ static const std::set supportedExtension = { // Vendor extensions "ADOBE_materials_clearcoat_specular", "ADOBE_materials_clearcoat_tint", - "EXT_materials_clearcoat_color", // Multi-vendor version of ADOBE_materials_clearcoat_tint "EXT_materials_specular_edge_color", getNerfExtString(), @@ -2858,6 +3149,7 @@ static const std::set supportedExtension = { // In-development extensions "KHR_materials_diffuse_transmission", "KHR_materials_volume_scatter", + "KHR_materials_coat", "KHR_materials_subsurface", // previous incarnation of KHR_materials_volume_scatter "KHR_materials_sss" // previous name of KHR_materials_subsurface }; diff --git a/gltf/src/gltfImport.h b/gltf/src/gltfImport.h index f9c566bc..247b85b7 100644 --- a/gltf/src/gltfImport.h +++ b/gltf/src/gltfImport.h @@ -12,8 +12,8 @@ governing permissions and limitations under the License. #pragma once #include "gltf.h" #include "importGltfContext.h" -#include #include +#include namespace adobe::usd { diff --git a/gltf/src/gltfResolver.cpp b/gltf/src/gltfResolver.cpp index 8211f0bd..f86d153a 100644 --- a/gltf/src/gltfResolver.cpp +++ b/gltf/src/gltfResolver.cpp @@ -15,6 +15,7 @@ governing permissions and limitations under the License. #include "gltf.h" #include "gltfImport.h" +#include #include using namespace PXR_NS; @@ -24,8 +25,7 @@ AR_DEFINE_PACKAGE_RESOLVER(GltfResolver, ArPackageResolver); GltfResolver::GltfResolver() : Resolver("GltfResolver") -{ -} +{} void GltfResolver::readCache(const std::string& resolvedPath, std::vector& images) diff --git a/gltf/src/gltfResolver.h b/gltf/src/gltfResolver.h index 6665219e..92f860e2 100644 --- a/gltf/src/gltfResolver.h +++ b/gltf/src/gltfResolver.h @@ -18,10 +18,10 @@ namespace adobe::usd { /// \brief usdgltf custom asset resolver. class GltfResolver : public Resolver { - public: +public: GltfResolver(); - private: +private: virtual void readCache(const std::string& filename, std::vector& images) override; }; diff --git a/gltf/src/gltfSpecGloss.h b/gltf/src/gltfSpecGloss.h index 6d3a95fb..69177e40 100644 --- a/gltf/src/gltfSpecGloss.h +++ b/gltf/src/gltfSpecGloss.h @@ -15,7 +15,6 @@ governing permissions and limitations under the License. #include #include - namespace adobe::usd { /// Convert a specular-glossiness material to a metallic-roughness material diff --git a/gltf/src/importGltfContext.h b/gltf/src/importGltfContext.h index b1f1d527..43e5ac76 100644 --- a/gltf/src/importGltfContext.h +++ b/gltf/src/importGltfContext.h @@ -25,9 +25,10 @@ struct ImportGltfContext const tinygltf::Model* gltf = nullptr; UsdData* usd = nullptr; std::string path; - std::unordered_map nodeMap; // maps glTF node index to USD node index + std::unordered_map nodeMap; // maps glTF node index to USD node index std::unordered_map parentMap; // maps glTF node index to parent glTF node index - std::unordered_map skeletonNodeNames; // maps glTF node index to skeleton node name + std::unordered_map + skeletonNodeNames; // maps glTF node index to skeleton node name std::vector> meshes; std::vector meshUseCount; diff --git a/gltf/src/precompiled.h b/gltf/src/precompiled.h deleted file mode 100644 index cc28696e..00000000 --- a/gltf/src/precompiled.h +++ /dev/null @@ -1,74 +0,0 @@ -/* -Copyright 2023 Adobe. All rights reserved. -This file is licensed to you under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. You may obtain a copy -of the License at http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software distributed under -the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS -OF ANY KIND, either express or implied. See the License for the specific language -governing permissions and limitations under the License. -*/ -#pragma once - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include diff --git a/obj/README.md b/obj/README.md index ea8acd6b..96e3b4bd 100644 --- a/obj/README.md +++ b/obj/README.md @@ -48,7 +48,7 @@ The generated USD will keep default units and up axis (1cm, +y). -Allows importing obj from ZBrush with vertex color (#MRGB tag) +Allows importing OBJ files with vertex color (#MRGB tag) * `objOriginalColorSpace`: USD uses linear colorspace, however, OBJ colorspace could be either linear or sRGB. The user can set which one the data was in during import. If the data is in sRGB it will be converted to linear while in USD. Exporting will also consider the original color space. See Export -> outputColorSpace for details. @@ -120,6 +120,14 @@ Also, the resulting meshes are unitless (obj does not support units). No adjustm The material network uses `MaterialX` nodes to express individual operations and has an `OpenPBR` surface, which has rich support for PBR oriented materials. +* `preserveExtraMaterialInfo`: Generate shading networks with extra data for transcoding. Default is `true` + When this is enabled, the generated shading networks might contain extra inputs that are outside of the respective + material surface schema, that are useful for transcoding purposes. For example, the `OpenPBR` surface does not have + an `occlusion` input for ambient occlusion, but we might want to express such a signal, if it was present in the + source asset, so that an exporter can pick-up said signal and use it when generating an output asset. + When `preserveExtraMaterialInfo` is `false`, the code will not generate these extra fields that are outside of the + schema, which won't affect renders, but can affect the transcoding abilities. + * `objPhong`: Turn on the full import of the Phong shading model. Default is `false` By default, the plugin imports the diffuse component only, without specularities, but you can force the import of the full phong model like this: @@ -132,6 +140,29 @@ Also, the resulting meshes are unitless (obj does not support units). No adjustm Keep in mind it is a lossy conversion. > Note: currently this only works when also providing assetsPath (TODO fix). +* `computeNormals`: Generate smooth vertex normals for meshes that don't have explicit normals in the OBJ file. Default is `false` + By default, the plugin only imports normals if they are present in the OBJ file (as `vn` lines). If an OBJ file has no explicit normals, + meshes will be imported without normal data, and renderers will compute normals at render time. You can force the generation of smooth vertex normals during import: + ``` + from pxr import Usd + stage = Usd.Stage.Open("asset.obj:SDF_FORMAT_ARGS:computeNormals=true") + stage.Export("asset.usda") + ``` + The generated normals are vertex-interpolated and computed by averaging face normals at shared vertices. This is useful for OBJ files exported without normals, + though be aware that smooth normals will not preserve high-frequency detail that would be captured in per-face-vertex normals. +* `groupOptions`: Control how OBJ groups are imported into USD. Default is `separateGroupsAsMeshes` + OBJ files can contain groups (`g` lines) that organize faces into logical collections. The `groupOptions` argument controls how these groups are translated to USD: + - `separateGroupsAsMeshes` (default): Each OBJ group becomes a separate USD Mesh prim. This preserves the original group structure but can be slow for files with many groups. + + - `combineGroups`: All groups are merged into a single USD Mesh. This is much faster for files with many groups and results in better rendering performance. Group information is discarded. + + - `separateGroupsAsSubsets`: All groups are merged into a single USD Mesh, but each group is preserved as a GeomSubset. This maintains group information while having a single mesh, though creating many subsets can still be slow. + Example using `combineGroups` for a file with many groups: + ``` + from pxr import Usd + stage = Usd.Stage.Open("sculpt.obj:SDF_FORMAT_ARGS:groupOptions=combineGroups") + stage.Export("sculpt.usda") + ``` ## Debug codes * `FILE_FORMAT_OBJ`: Common debug messages. * OBJ_PACKAGE_RESOLVER diff --git a/obj/src/CMakeLists.txt b/obj/src/CMakeLists.txt index 37a9d13a..43dce85c 100644 --- a/obj/src/CMakeLists.txt +++ b/obj/src/CMakeLists.txt @@ -40,68 +40,10 @@ PUBLIC target_include_directories(usdObj PRIVATE + "${CMAKE_CURRENT_SOURCE_DIR}" "${PROJECT_BINARY_DIR}/src" ) -target_precompile_headers(usdObj -PRIVATE - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" -) - # Installation of plugin files mimics the file structure that USD has for plugins, # so it is easy to deploy it in a pre-existing USD build, if one chooses to do so. @@ -116,18 +58,19 @@ set_target_properties(usdObj PROPERTIES RESOURCE ${CMAKE_CURRENT_BINARY_DIR}/plu set_target_properties(usdObj PROPERTIES RESOURCE_FILES "${CMAKE_CURRENT_BINARY_DIR}/plugInfo.json:plugInfo.json") +# USDOBJ_DESTINATION is set in the parent scope by the add_usd_fileformat macro if(USDOBJ_ENABLE_INSTALL) install( TARGETS usdObj - RUNTIME DESTINATION plugin/usd COMPONENT Runtime - LIBRARY DESTINATION plugin/usd COMPONENT Runtime - RESOURCE DESTINATION plugin/usd/usdObj/resources COMPONENT Runtime + RUNTIME DESTINATION ${USDOBJ_DESTINATION} COMPONENT Runtime + LIBRARY DESTINATION ${USDOBJ_DESTINATION} COMPONENT Runtime + RESOURCE DESTINATION ${USDOBJ_DESTINATION}/usdObj/resources COMPONENT Runtime ) install( FILES plugInfo.root.json - DESTINATION plugin/usd + DESTINATION ${USDOBJ_DESTINATION} RENAME plugInfo.json COMPONENT Runtime ) diff --git a/obj/src/api.h b/obj/src/api.h index 2880b5a8..ff8225a5 100644 --- a/obj/src/api.h +++ b/obj/src/api.h @@ -14,19 +14,19 @@ governing permissions and limitations under the License. #include "pxr/base/arch/export.h" #if defined(PXR_STATIC) -# define USDOBJ_API -# define USDOBJ_API_TEMPLATE_CLASS(...) -# define USDOBJ_API_TEMPLATE_STRUCT(...) -# define USDOBJ_LOCAL +#define USDOBJ_API +#define USDOBJ_API_TEMPLATE_CLASS(...) +#define USDOBJ_API_TEMPLATE_STRUCT(...) +#define USDOBJ_LOCAL #else -# if defined(USDOBJ_EXPORTS) -# define USDOBJ_API ARCH_EXPORT -# define USDOBJ_API_TEMPLATE_CLASS(...) ARCH_EXPORT_TEMPLATE(class, __VA_ARGS__) -# define USDOBJ_API_TEMPLATE_STRUCT(...) ARCH_EXPORT_TEMPLATE(struct, __VA_ARGS__) -# else -# define USDOBJ_API ARCH_IMPORT -# define USDOBJ_API_TEMPLATE_CLASS(...) ARCH_IMPORT_TEMPLATE(class, __VA_ARGS__) -# define USDOBJ_API_TEMPLATE_STRUCT(...) ARCH_IMPORT_TEMPLATE(struct, __VA_ARGS__) -# endif -# define USDOBJ_LOCAL ARCH_HIDDEN +#if defined(USDOBJ_EXPORTS) +#define USDOBJ_API ARCH_EXPORT +#define USDOBJ_API_TEMPLATE_CLASS(...) ARCH_EXPORT_TEMPLATE(class, __VA_ARGS__) +#define USDOBJ_API_TEMPLATE_STRUCT(...) ARCH_EXPORT_TEMPLATE(struct, __VA_ARGS__) +#else +#define USDOBJ_API ARCH_IMPORT +#define USDOBJ_API_TEMPLATE_CLASS(...) ARCH_IMPORT_TEMPLATE(class, __VA_ARGS__) +#define USDOBJ_API_TEMPLATE_STRUCT(...) ARCH_IMPORT_TEMPLATE(struct, __VA_ARGS__) +#endif +#define USDOBJ_LOCAL ARCH_HIDDEN #endif \ No newline at end of file diff --git a/obj/src/fileFormat.cpp b/obj/src/fileFormat.cpp index 6b852db5..44b6dc47 100644 --- a/obj/src/fileFormat.cpp +++ b/obj/src/fileFormat.cpp @@ -17,15 +17,12 @@ governing permissions and limitations under the License. #include "objImport.h" #include -#include #include #include #include #include #include -#include - PXR_NAMESPACE_OPEN_SCOPE using namespace adobe::usd; @@ -33,6 +30,8 @@ using namespace adobe::usd; const TfToken UsdObjFileFormat::assetsPathToken("objAssetsPath", TfToken::Immortal); const TfToken UsdObjFileFormat::phongToken("objPhong", TfToken::Immortal); const TfToken UsdObjFileFormat::originalColorSpaceToken("objOriginalColorSpace", TfToken::Immortal); +const TfToken UsdObjFileFormat::computeNormalsToken("computeNormals", TfToken::Immortal); +const TfToken UsdObjFileFormat::groupOptionsToken("groupOptions", TfToken::Immortal); TF_DEFINE_PUBLIC_TOKENS(UsdObjFileFormatTokens, USDOBJ_FILE_FORMAT_TOKENS); TF_REGISTRY_FUNCTION(TfType) @@ -68,6 +67,8 @@ UsdObjFileFormat::InitData(const FileFormatArguments& args) const argReadBool(args, phongToken.GetString(), pd->phong, DEBUG_TAG); argReadString(args, originalColorSpaceToken.GetString(), pd->originalColorSpace, DEBUG_TAG); + argReadBool(args, computeNormalsToken.GetString(), pd->computeNormals, DEBUG_TAG); + argReadString(args, groupOptionsToken.GetString(), pd->groupOptions, DEBUG_TAG); return pd; } void @@ -79,6 +80,8 @@ UsdObjFileFormat::ComposeFieldsForFileFormatArguments(const std::string& assetPa argComposeString(context, args, assetsPathToken, DEBUG_TAG); argComposeBool(context, args, phongToken, DEBUG_TAG); argComposeString(context, args, originalColorSpaceToken, DEBUG_TAG); + argComposeBool(context, args, computeNormalsToken, DEBUG_TAG); + argComposeString(context, args, groupOptionsToken, DEBUG_TAG); } bool @@ -115,11 +118,32 @@ UsdObjFileFormat::Read(SdfLayer* layer, const std::string& resolvedPath, bool me options.importMaterials = true; options.importImages = readImages; options.importPhong = data->phong; + options.groupOptions = data->groupOptions; WriteLayerOptions layerOptions(*data); obj.originalColorSpace = data->originalColorSpace; GUARD( readObj(obj, resolvedPath, readImages), "Error reading OBJ from %s\n", resolvedPath.c_str()); GUARD(importObj(options, obj, usd), "Error translating OBJ to USD\n"); + + // Generate normals if requested and missing + if (data->computeNormals) { + int processedCount = 0; + for (adobe::usd::Mesh& mesh : usd.meshes) { + if (mesh.normals.values.size() == 0) { + TF_DEBUG_MSG( + FILE_FORMAT_OBJ, "Computing smooth normals for mesh %s\n", mesh.name.c_str()); + adobe::usd::computeSmoothNormals(mesh); + processedCount++; + } + } + if (processedCount > 0) { + TF_DEBUG_MSG(FILE_FORMAT_OBJ, + "Computed normals for %d/%zu meshes\n", + processedCount, + usd.meshes.size()); + } + } + GUARD(writeLayer( layerOptions, usd, layer, layerData, fileType, DEBUG_TAG, SdfFileFormat::_SetLayerData), "Error writing to the USD layer\n"); @@ -151,8 +175,29 @@ UsdObjFileFormat::ReadFromString(SdfLayer* layer, const std::string& input) cons options.importMaterials = true; options.importImages = readImages; options.importPhong = data->phong; + options.groupOptions = data->groupOptions; GUARD(readObj(obj, input.c_str(), input.size()), "Error reading OBJ from string\n"); GUARD(importObj(options, obj, usd), "Error translating OBJ to USD\n"); + + // Generate normals if requested and missing + if (data->computeNormals) { + int processedCount = 0; + for (adobe::usd::Mesh& mesh : usd.meshes) { + if (mesh.normals.values.size() == 0) { + TF_DEBUG_MSG( + FILE_FORMAT_OBJ, "Computing smooth normals for mesh %s\n", mesh.name.c_str()); + adobe::usd::computeSmoothNormals(mesh); + processedCount++; + } + } + if (processedCount > 0) { + TF_DEBUG_MSG(FILE_FORMAT_OBJ, + "Computed normals for %d/%zu meshes\n", + processedCount, + usd.meshes.size()); + } + } + GUARD(writeLayer( layerOptions, usd, layer, layerData, "obj", DEBUG_TAG, SdfFileFormat::_SetLayerData), "Error writing to the USD stage\n"); @@ -193,14 +238,16 @@ UsdObjFileFormat::WriteToString(const SdfLayer& layer, const std::string& comment) const { // Write USD as OBJ: Defer to the usda file format for now. - return SdfFileFormat::FindById(UsdUsdaFileFormatTokens->Id)->WriteToString(layer, str, comment); + return SdfFileFormat::FindById(FileFormatsUsdaFileFormatTokensId) + ->WriteToString(layer, str, comment); } bool UsdObjFileFormat::WriteToStream(const SdfSpecHandle& spec, std::ostream& out, size_t indent) const { // Write USD as OBJ: Defer to the usda file format for now. - return SdfFileFormat::FindById(UsdUsdaFileFormatTokens->Id)->WriteToStream(spec, out, indent); + return SdfFileFormat::FindById(FileFormatsUsdaFileFormatTokensId) + ->WriteToStream(spec, out, indent); } PXR_NAMESPACE_CLOSE_SCOPE diff --git a/obj/src/fileFormat.h b/obj/src/fileFormat.h index c2dd9d70..0eaca66d 100644 --- a/obj/src/fileFormat.h +++ b/obj/src/fileFormat.h @@ -18,7 +18,6 @@ governing permissions and limitations under the License. #include #include -#include #include #include @@ -33,8 +32,11 @@ TF_DECLARE_WEAK_AND_REF_PTRS(UsdObjFileFormat); /// \brief SdfData specialization for working with obj files. class ObjData : public FileFormatDataBase { - public: +public: bool phong = false; + bool computeNormals = false; + TfToken groupOptions; // "separateGroupsAsMeshes" (default), "separateGroupsAsSubsets", + // "combineGroups" TfToken originalColorSpace; static ObjDataRefPtr InitData(const SdfFileFormat::FileFormatArguments& args); }; @@ -45,7 +47,7 @@ class USDOBJ_API UsdObjFileFormat : public SdfFileFormat , public PcpDynamicFileFormatInterface { - public: +public: friend class ObjData; virtual SdfAbstractDataRefPtr InitData(const FileFormatArguments& args) const override; @@ -83,15 +85,17 @@ class USDOBJ_API UsdObjFileFormat std::string* str, const std::string& comment = std::string()) const override; - protected: +protected: SDF_FILE_FORMAT_FACTORY_ACCESS; virtual ~UsdObjFileFormat(); UsdObjFileFormat(); - private: +private: static const TfToken assetsPathToken; static const TfToken phongToken; static const TfToken originalColorSpaceToken; + static const TfToken computeNormalsToken; + static const TfToken groupOptionsToken; bool ReadFromStream(SdfLayer* layer, std::istream& input, diff --git a/obj/src/obj.cpp b/obj/src/obj.cpp index 0802668c..225e638d 100644 --- a/obj/src/obj.cpp +++ b/obj/src/obj.cpp @@ -61,11 +61,11 @@ governing permissions and limitations under the License. using namespace PXR_NS; #if defined(_WIN32) && !defined(__CYGWIN__) - #define ftell64 _ftelli64 - #define fseek64 _fseeki64 +#define ftell64 _ftelli64 +#define fseek64 _fseeki64 #else - #define ftell64 ftello - #define fseek64 fseeko +#define ftell64 ftello +#define fseek64 fseeko #endif namespace adobe::usd { @@ -304,15 +304,15 @@ nextFloat3(const char*& p, const char* end, GfVec3f& x) return nextFloat(p, end, x[0]) && nextFloat(p, end, x[1]) && nextFloat(p, end, x[2]); } -/// Helper parsing function. `p` is the moving pointer into the data. allows for arguments to have 1 or three values +/// Helper parsing function. `p` is the moving pointer into the data. allows for arguments to have 1 +/// or three values bool nextFloat1or3(const char*& p, const char* end, GfVec3f& x) { if (nextFloat(p, end, x[0])) { if (nextFloat(p, end, x[1])) { return nextFloat(p, end, x[2]); - } - else { + } else { x[2] = x[1] = x[0]; return true; } @@ -320,7 +320,6 @@ nextFloat1or3(const char*& p, const char* end, GfVec3f& x) return false; } - /// Helper parsing function. `p` is the moving pointer into the data. bool nextInteger(const char*& p, const char* end, int& x) @@ -699,6 +698,13 @@ readObjIntermediate(ObjIntermediate& inter) // Don't care about comments // rep.comments.push_back(std::string()); // nextText(rep.comments.back()); + } else if (c0 == 'v' && c1 >= '0' && c1 <= '9') { + // Detect malformed vertex lines like "v56 ..." instead of "v 56 ..." + // This is corrupted data - missing space after 'v' command + TF_WARN("Malformed vertex line at offset %td: line starts with 'v%c' instead of 'v ' - " + "vertex will be skipped. This may cause face index errors.", + p - inter.data, + c1); } else { } lineCount++; @@ -837,16 +843,25 @@ reindexObjIntermediate(Obj& obj, size_t vOutOfRangeCount = 0; size_t vtOutOfRangeCount = 0; size_t vnOutOfRangeCount = 0; + size_t vSkippedNoVerticesCount = 0; // Track skipped points when no vertices exist // This needs to be called when ever we start a new object or group auto checkOutOfRange = [&]() { if (g) { + if (vSkippedNoVerticesCount) { + TF_WARN( + "Object '%s', group '%s': %zu face points reference vertices but no vertices " + "exist in the file - these points were skipped.", + o->name.c_str(), + g->name.c_str(), + vSkippedNoVerticesCount); + } if (vOutOfRangeCount) { - TF_DEBUG_MSG(FILE_FORMAT_OBJ, - "Object %s, group %s: Invalid vertex indices: %lu\n", - o->name.c_str(), - g->name.c_str(), - vOutOfRangeCount); + TF_WARN("Object '%s', group '%s': %zu out-of-range vertex indices replaced with " + "fallback vertex 0. This may cause visual artifacts.", + o->name.c_str(), + g->name.c_str(), + vOutOfRangeCount); } size_t numVertexIndices = g->indices.size(); if (vtOutOfRangeCount) { @@ -898,6 +913,7 @@ reindexObjIntermediate(Obj& obj, vOutOfRangeCount = 0; vtOutOfRangeCount = 0; vnOutOfRangeCount = 0; + vSkippedNoVerticesCount = 0; }; auto addObject = [&]() { checkOutOfRange(); @@ -978,9 +994,16 @@ reindexObjIntermediate(Obj& obj, const GfVec3i& p = sum.points[pOffset + pointId]; if (p[0] != 0) { int index = p[0] > 0 ? p[0] - 1 : vOffset + p[0]; - if (static_cast(index) >= sum.vertices.size()) { + if (index < 0 || static_cast(index) >= sum.vertices.size()) { vOutOfRangeCount++; - continue; + // Use vertex 0 as fallback to preserve mesh topology. + // Using 'continue' here would skip adding an index, causing + // face vertex count mismatch (inconsistent mesh data). + if (sum.vertices.empty()) { + vSkippedNoVerticesCount++; + continue; // No valid fallback available + } + index = 0; } if (verticesMap[index]) { int existingIndex = verticesIndexMap[index]; @@ -1002,11 +1025,15 @@ reindexObjIntermediate(Obj& obj, } if (p[1] != 0) { int index = p[1] > 0 ? p[1] - 1 : vtOffset + p[1]; - if (static_cast(index) >= sum.uvs.size()) { + if (index < 0 || static_cast(index) >= sum.uvs.size()) { vtOutOfRangeCount++; - continue; - } - if (uvsMap[index]) { + // Use UV 0 as fallback to preserve array consistency. + // Using 'continue' here would skip adding an index, causing + // UV index count mismatch with vertex indices. + if (!g->uvs.empty()) { + g->uvIndices.push_back(0); + } + } else if (uvsMap[index]) { int existingIndex = uvsIndexMap[index]; g->uvIndices.push_back(existingIndex); } else { @@ -1041,11 +1068,15 @@ reindexObjIntermediate(Obj& obj, } if (p[2] != 0) { int index = p[2] > 0 ? p[2] - 1 : vnOffset + p[2]; - if (static_cast(index) >= sum.normals.size()) { + if (index < 0 || static_cast(index) >= sum.normals.size()) { vnOutOfRangeCount++; - continue; - } - if (normalsMap[index]) { + // Use normal 0 as fallback to preserve array consistency. + // Using 'continue' here would skip adding an index, causing + // normal index count mismatch with vertex indices. + if (!g->normals.empty()) { + g->normalIndices.push_back(0); + } + } else if (normalsMap[index]) { int existingIndex = normalsIndexMap[index]; g->normalIndices.push_back(existingIndex); } else { @@ -1691,7 +1722,7 @@ class BufferControl int flushCount; std::fstream& file; - public: +public: BufferControl(size_t bufferSize, std::fstream& file) : bufferSize(bufferSize) , flushCount(0) @@ -1717,7 +1748,7 @@ class BufferControl file.write(buffer, p - buffer); p = buffer; } - auto result = fmt::format_to_n(p, maxLineSize, format, args...); + auto result = fmt::format_to_n(p, maxLineSize, fmt::runtime(format), args...); if (result.size <= maxLineSize) { p += result.size; return true; diff --git a/obj/src/obj.h b/obj/src/obj.h index c6eaede3..e5ac758e 100644 --- a/obj/src/obj.h +++ b/obj/src/obj.h @@ -19,10 +19,7 @@ governing permissions and limitations under the License. /// mtl: http://paulbourke.net/dataformats/mtl/ /// pbr-extension: http://exocortex.com/blog/extending_wavefront_mtl_to_support_pbr -#include -#include #include -#include #include #include #include diff --git a/obj/src/objExport.cpp b/obj/src/objExport.cpp index e1afa1e9..d55bf0bd 100644 --- a/obj/src/objExport.cpp +++ b/obj/src/objExport.cpp @@ -14,38 +14,7 @@ governing permissions and limitations under the License. #include #include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include #include -#include -#include -#include -#include -#include -#include -#include using namespace PXR_NS; @@ -71,7 +40,7 @@ writeObjMap(const UsdData& usd, ObjMap& map, const Input& input) if (input.image >= 0) { const ImageAsset& image = usd.images[input.image]; map.defined = true; - map.filename = image.uri; + map.filename = TfGetBaseName(image.uri); map.image = input.image; // XXX note that mtl doesn't support uv rotation so we only handle translation and scale @@ -215,7 +184,7 @@ exportObj(const ExportObjOptions& options, const UsdData& usd, Obj& obj) const ImageAsset& usdImage = usd.images[i]; ImageAsset& image = obj.images[i]; image.name = usdImage.name; - image.uri = usdImage.uri; + image.uri = TfGetBaseName(usdImage.uri); image.format = usdImage.format; image.image = usdImage.image; } diff --git a/obj/src/objImport.cpp b/obj/src/objImport.cpp index e5b93af7..0140af94 100644 --- a/obj/src/objImport.cpp +++ b/obj/src/objImport.cpp @@ -14,24 +14,23 @@ governing permissions and limitations under the License. #include #include #include -#include -#include #include -#include -#include -#include -#include #include -#include #include -#include -#include -#include -#include -#include #include using namespace PXR_NS; + +PXR_NAMESPACE_OPEN_SCOPE +// clang-format off +TF_DEFINE_PRIVATE_TOKENS(_groupOptionsTokens, + (combineGroups) + (separateGroupsAsSubsets) + (separateGroupsAsMeshes) +); +// clang-format on +PXR_NAMESPACE_CLOSE_SCOPE + namespace adobe::usd { void @@ -238,74 +237,328 @@ importObj(const ImportObjOptions& options, Obj& obj, UsdData& usd) if (options.importGeometry) { int current_material = -1; bool convertToLinear = (obj.originalColorSpace == AdobeTokens->sRGB); + + // Determine group handling mode + // Default is "separateGroupsAsMeshes" if empty or unspecified (backwards compatible) + bool useCombineGroups = options.groupOptions == _groupOptionsTokens->combineGroups; + bool useSeparateGroupsAsSubsets = + options.groupOptions == _groupOptionsTokens->separateGroupsAsSubsets; + bool useSeparateGroupsAsMeshes = + options.groupOptions.IsEmpty() || + options.groupOptions == _groupOptionsTokens->separateGroupsAsMeshes; + + // Warn if an unrecognized groupOptions value was provided and default to + // separateGroupsAsMeshes + if (!options.groupOptions.IsEmpty() && !useCombineGroups && !useSeparateGroupsAsSubsets && + !useSeparateGroupsAsMeshes) { + TF_WARN("Unrecognized groupOptions value '%s'. Expected 'combineGroups', " + "'separateGroupsAsSubsets', or 'separateGroupsAsMeshes'. Defaulting to " + "'separateGroupsAsMeshes'.", + options.groupOptions.GetText()); + useSeparateGroupsAsMeshes = true; + } + for (const ObjObject& o : obj.objects) { auto [nodeIndex, node] = usd.addNode(-1); node.name = o.name; - for (const ObjGroup& g : o.groups) { - // Skip empty groups - if (g.faces.empty()) { - TF_DEBUG_MSG( - FILE_FORMAT_OBJ, - "Skipping empty group %s on node %s - %zu verts, %zu faces, %zu indices\n", - g.name.c_str(), - node.name.c_str(), - g.vertices.size(), - g.faces.size(), - g.indices.size()); + if (useCombineGroups || useSeparateGroupsAsSubsets) { + // Combine all groups into a single mesh + // With separateSubgroups, also create GeomSubsets for each group + // First, count total sizes to pre-allocate + size_t totalVertices = 0; + size_t totalFaces = 0; + size_t totalIndices = 0; + size_t totalUvs = 0; + size_t totalUvIndices = 0; + size_t totalNormals = 0; + size_t totalNormalIndices = 0; + size_t totalColors = 0; + // Track if any group has these attributes (groups without them get placeholder + // values) + bool hasUvs = false; + bool hasNormals = false; + bool hasColors = false; + + for (const ObjGroup& g : o.groups) { + if (g.faces.empty()) + continue; + totalVertices += g.vertices.size(); + totalFaces += g.faces.size(); + totalIndices += g.indices.size(); + if (g.uvs.size()) { + hasUvs = true; + totalUvs += g.uvs.size(); + totalUvIndices += g.uvIndices.size(); + } + if (g.normals.size()) { + hasNormals = true; + totalNormals += g.normals.size(); + totalNormalIndices += g.normalIndices.size(); + } + if (g.colors.size()) { + hasColors = true; + totalColors += g.colors.size(); + } + } + + // Skip if no geometry + if (totalFaces == 0) { + TF_DEBUG_MSG(FILE_FORMAT_OBJ, + "Skipping object %s - no faces after combining groups\n", + o.name.c_str()); continue; } + auto [meshIndex, mesh] = usd.addMesh(); node.staticMeshes.push_back(meshIndex); - mesh.name = g.name; + // Leave name empty - uniquifyNames() will set it to "Mesh" as the default, since + // all meshes are combined into a single mesh mesh.doubleSided = true; - mesh.faces = g.faces; - mesh.indices = g.indices; - mesh.points = g.vertices; - if (g.uvs.size()) { - mesh.uvs.indices = g.uvIndices; - mesh.uvs.values = g.uvs; + + // Pre-allocate + mesh.points.reserve(totalVertices); + mesh.faces.reserve(totalFaces); + mesh.indices.reserve(totalIndices); + if (hasUvs) { + // Reserve +1 for placeholder UV at index 0 (used by groups without UVs) + mesh.uvs.values.reserve(totalUvs + 1); + mesh.uvs.indices.reserve(totalUvIndices); + // Add placeholder UV at index 0 for groups that don't have UVs + mesh.uvs.values.push_back(GfVec2f(0.0f, 0.0f)); + } + if (hasNormals) { + // Reserve +1 for placeholder normal at index 0 (used by groups without normals) + mesh.normals.values.reserve(totalNormals + 1); + mesh.normals.indices.reserve(totalNormalIndices); + // Add placeholder normal at index 0 for groups that don't have normals + mesh.normals.values.push_back(GfVec3f(0.0f, 1.0f, 0.0f)); + } + + VtVec3fArray combinedColors; + if (hasColors) { + combinedColors.reserve(totalColors); + } + + // Track offsets for index remapping + int vertexOffset = 0; + int uvOffset = hasUvs ? 1 : 0; // Start at 1 if we added a placeholder UV + int normalOffset = + hasNormals ? 1 : 0; // Start at 1 if we added a placeholder normal + int faceOffset = 0; + + // Track which faces belong to each group (for creating GeomSubsets) + struct GroupFaceRange + { + int startFace; + int faceCount; + int material; + }; + std::vector groupFaceRanges; + + // Combine all groups + for (const ObjGroup& g : o.groups) { + if (g.faces.empty()) + continue; + + // Track group face range for subset creation + if (useSeparateGroupsAsSubsets) { + groupFaceRanges.push_back( + { faceOffset, static_cast(g.faces.size()), g.material }); + } + + // Append vertices (using push_back for USD version compatibility) + for (const auto& v : g.vertices) { + mesh.points.push_back(v); + } + + // Append faces + for (const auto& f : g.faces) { + mesh.faces.push_back(f); + } + + // Append indices with offset + for (int idx : g.indices) { + mesh.indices.push_back(idx + vertexOffset); + } + + // Append UVs if present + if (hasUvs) { + if (g.uvs.size()) { + for (const auto& uv : g.uvs) { + mesh.uvs.values.push_back(uv); + } + for (int idx : g.uvIndices) { + mesh.uvs.indices.push_back(idx + uvOffset); + } + uvOffset += g.uvs.size(); + } else { + // Group has no UVs but others do - add placeholder indices + for (size_t i = 0; i < g.indices.size(); i++) { + mesh.uvs.indices.push_back(0); + } + } + } + + // Append normals if present + if (hasNormals) { + if (g.normals.size()) { + for (const auto& n : g.normals) { + mesh.normals.values.push_back(n); + } + for (int idx : g.normalIndices) { + mesh.normals.indices.push_back(idx + normalOffset); + } + normalOffset += g.normals.size(); + } else { + // Group has no normals but others do - add placeholder indices + for (size_t i = 0; i < g.indices.size(); i++) { + mesh.normals.indices.push_back(0); + } + } + } + + // Append colors if present + if (hasColors) { + if (g.colors.size()) { + if (convertToLinear) { + for (const auto& c : g.colors) { + combinedColors.push_back(GfVec3f( + srgbToLinear(c[0]), srgbToLinear(c[1]), srgbToLinear(c[2]))); + } + } else { + for (const auto& c : g.colors) { + combinedColors.push_back(c); + } + } + } else { + // Group has no colors but others do - add default white + for (size_t i = 0; i < g.vertices.size(); i++) { + combinedColors.push_back(GfVec3f(1.0f, 1.0f, 1.0f)); + } + } + } + + // Track material for the combined mesh + if (g.material >= 0) { + current_material = g.material; + } + + vertexOffset += g.vertices.size(); + faceOffset += g.faces.size(); + } + + // Set interpolation modes + if (hasUvs) { mesh.uvs.interpolation = UsdGeomTokens->faceVarying; } - if (g.normals.size()) { - mesh.normals.indices = g.normalIndices; - mesh.normals.values = g.normals; + if (hasNormals) { mesh.normals.interpolation = UsdGeomTokens->faceVarying; } - if (g.colors.size()) { + if (hasColors) { auto [colorSetIndex, color] = usd.addColorSet(meshIndex); - if (convertToLinear) { - VtVec3fArray mutableColors = g.colors; - for (auto& c : mutableColors) { - c[0] = srgbToLinear(c[0]); - c[1] = srgbToLinear(c[1]); - c[2] = srgbToLinear(c[2]); - } - color.values = mutableColors; - } else { - color.values = g.colors; - } + color.values = std::move(combinedColors); color.interpolation = UsdGeomTokens->vertex; } - // Set extent. - // SetExtent(vertexValues, mesh); - if (g.subsets.size() == 0) { - mesh.material = g.material; - } else if (g.subsets.size() == 1 && g.faces.size() == g.subsets[0].faces.size()) { - mesh.material = g.subsets.back().material; - } else { - for (const ObjSubset& s : g.subsets) { - // const auto& material = obj.materials[s.material]; + + // Create GeomSubsets for separateGroups mode + if (useSeparateGroupsAsSubsets && groupFaceRanges.size() > 1) { + for (const auto& range : groupFaceRanges) { auto [subsetIndex, subset] = usd.addSubset(meshIndex); - subset.material = s.material; - subset.faces = s.faces; + subset.material = range.material; + // Create face indices for this subset + subset.faces.resize(range.faceCount); + for (int i = 0; i < range.faceCount; i++) { + subset.faces[i] = range.startFace + i; + } } - } - if (mesh.material < 0) { + TF_DEBUG_MSG(FILE_FORMAT_OBJ, + "Created %zu subsets for mesh '%s': %zu verts, %zu faces\n", + groupFaceRanges.size(), + mesh.name.c_str(), + mesh.points.size(), + mesh.faces.size()); + } else { + // Set material (use the last encountered material for the combined mesh) mesh.material = current_material; + TF_DEBUG_MSG( + FILE_FORMAT_OBJ, + "Combined %zu groups into single mesh '%s': %zu verts, %zu faces\n", + o.groups.size(), + mesh.name.c_str(), + mesh.points.size(), + mesh.faces.size()); + } + + } else if (useSeparateGroupsAsMeshes) { + // Legacy behavior: create a mesh per group + for (const ObjGroup& g : o.groups) { + // Skip empty groups + if (g.faces.empty()) { + TF_DEBUG_MSG(FILE_FORMAT_OBJ, + "Skipping empty group %s on node %s - %zu verts, %zu faces, " + "%zu indices\n", + g.name.c_str(), + node.name.c_str(), + g.vertices.size(), + g.faces.size(), + g.indices.size()); + continue; + } + auto [meshIndex, mesh] = usd.addMesh(); + node.staticMeshes.push_back(meshIndex); + + mesh.name = g.name; + mesh.doubleSided = true; + mesh.faces = g.faces; + mesh.indices = g.indices; + mesh.points = g.vertices; + if (g.uvs.size()) { + mesh.uvs.indices = g.uvIndices; + mesh.uvs.values = g.uvs; + mesh.uvs.interpolation = UsdGeomTokens->faceVarying; + } + if (g.normals.size()) { + mesh.normals.indices = g.normalIndices; + mesh.normals.values = g.normals; + mesh.normals.interpolation = UsdGeomTokens->faceVarying; + } + if (g.colors.size()) { + auto [colorSetIndex, color] = usd.addColorSet(meshIndex); + if (convertToLinear) { + VtVec3fArray mutableColors = g.colors; + for (auto& c : mutableColors) { + c[0] = srgbToLinear(c[0]); + c[1] = srgbToLinear(c[1]); + c[2] = srgbToLinear(c[2]); + } + color.values = mutableColors; + } else { + color.values = g.colors; + } + color.interpolation = UsdGeomTokens->vertex; + } + // Set extent. + // SetExtent(vertexValues, mesh); + if (g.subsets.size() == 0) { + mesh.material = g.material; + } else if (g.subsets.size() == 1 && + g.faces.size() == g.subsets[0].faces.size()) { + mesh.material = g.subsets.back().material; + } else { + for (const ObjSubset& s : g.subsets) { + // const auto& material = obj.materials[s.material]; + auto [subsetIndex, subset] = usd.addSubset(meshIndex); + subset.material = s.material; + subset.faces = s.faces; + } + } + if (mesh.material < 0) { + mesh.material = current_material; + } + current_material = mesh.material; } - current_material = mesh.material; } } } diff --git a/obj/src/objImport.h b/obj/src/objImport.h index f1afca61..10b6ac40 100644 --- a/obj/src/objImport.h +++ b/obj/src/objImport.h @@ -21,6 +21,8 @@ struct ImportObjOptions bool importMaterials; bool importImages; bool importPhong; + PXR_NS::TfToken groupOptions; // "separateGroupsAsMeshes (default)" , "separateGroupsAsSubsets", + // "combineGroups" }; /// \ingroup usdobj diff --git a/obj/src/objResolver.cpp b/obj/src/objResolver.cpp index bc56c5ce..c78de822 100644 --- a/obj/src/objResolver.cpp +++ b/obj/src/objResolver.cpp @@ -10,10 +10,9 @@ OF ANY KIND, either express or implied. See the License for the specific languag governing permissions and limitations under the License. */ #include "objResolver.h" -#include "obj.h" #include "objImport.h" -#include #include +#include using namespace PXR_NS; namespace adobe::usd { @@ -22,8 +21,7 @@ AR_DEFINE_PACKAGE_RESOLVER(ObjResolver, ArPackageResolver); ObjResolver::ObjResolver() : Resolver("ObjResolver") -{ -} +{} void ObjResolver::readCache(const std::string& filename, std::vector& images) diff --git a/obj/src/objResolver.h b/obj/src/objResolver.h index 0fe88f90..23cf4e7d 100644 --- a/obj/src/objResolver.h +++ b/obj/src/objResolver.h @@ -16,10 +16,10 @@ namespace adobe::usd { class ObjResolver : public Resolver { - public: +public: ObjResolver(); - private: +private: virtual void readCache(const std::string& filename, std::vector& images) override; }; diff --git a/obj/src/plugInfo.json.in b/obj/src/plugInfo.json.in index 0eb5c8d4..f2ca4c6a 100644 --- a/obj/src/plugInfo.json.in +++ b/obj/src/plugInfo.json.in @@ -20,6 +20,18 @@ "displayGroup": "Core", "documentation:": "Is the original colorspace in linear or sRGB", "type": "string" + }, + "computeNormals": { + "appliesTo": [ "prims" ], + "displayGroup": "Core", + "documentation:": "Generate smooth normals if missing from OBJ file", + "type": "bool" + }, + "groupOptions": { + "appliesTo": [ "prims" ], + "displayGroup": "Core", + "documentation:": "How to handle OBJ groups: 'separateGroupsAsMeshes' (default) - each group as separate mesh, 'combineGroups' - merge all groups into single mesh, 'separateGroupsAsSubsets' - single mesh with groups as GeomSubsets", + "type": "string" } }, "Types": { diff --git a/obj/src/precompiled.h b/obj/src/precompiled.h deleted file mode 100644 index 3cb6d03a..00000000 --- a/obj/src/precompiled.h +++ /dev/null @@ -1,65 +0,0 @@ -/* -Copyright 2023 Adobe. All rights reserved. -This file is licensed to you under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. You may obtain a copy -of the License at http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software distributed under -the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS -OF ANY KIND, either express or implied. See the License for the specific language -governing permissions and limitations under the License. -*/ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include diff --git a/ply/src/CMakeLists.txt b/ply/src/CMakeLists.txt index 788207b2..1c71c36a 100644 --- a/ply/src/CMakeLists.txt +++ b/ply/src/CMakeLists.txt @@ -20,6 +20,7 @@ PRIVATE target_include_directories(usdPly PRIVATE + "${CMAKE_CURRENT_SOURCE_DIR}" "${PROJECT_BINARY_DIR}" ) @@ -35,65 +36,6 @@ PRIVATE fileformatUtils ) -target_precompile_headers(usdPly -PRIVATE - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" -) - # Installation of plugin files mimics the file structure that USD has for plugins, # so it is easy to deploy it in a pre-existing USD build, if one chooses to do so. @@ -108,17 +50,18 @@ set_target_properties(usdPly PROPERTIES RESOURCE ${CMAKE_CURRENT_BINARY_DIR}/plu set_target_properties(usdPly PROPERTIES RESOURCE_FILES "${CMAKE_CURRENT_BINARY_DIR}/plugInfo.json:plugInfo.json") +# USDPLY_DESTINATION is set in the parent scope by the add_usd_fileformat macro if(USDPLY_ENABLE_INSTALL) install( TARGETS usdPly - RUNTIME DESTINATION plugin/usd COMPONENT Runtime - LIBRARY DESTINATION plugin/usd COMPONENT Runtime - RESOURCE DESTINATION plugin/usd/usdPly/resources COMPONENT Runtime + RUNTIME DESTINATION ${USDPLY_DESTINATION} COMPONENT Runtime + LIBRARY DESTINATION ${USDPLY_DESTINATION} COMPONENT Runtime + RESOURCE DESTINATION ${USDPLY_DESTINATION}/usdPly/resources COMPONENT Runtime ) install( FILES plugInfo.root.json - DESTINATION plugin/usd + DESTINATION ${USDPLY_DESTINATION} RENAME plugInfo.json COMPONENT Runtime ) diff --git a/ply/src/api.h b/ply/src/api.h index 19ad933f..307044f0 100644 --- a/ply/src/api.h +++ b/ply/src/api.h @@ -14,19 +14,19 @@ governing permissions and limitations under the License. #include "pxr/base/arch/export.h" #if defined(PXR_STATIC) -# define USDPLY_API -# define USDPLY_API_TEMPLATE_CLASS(...) -# define USDPLY_API_TEMPLATE_STRUCT(...) -# define USDPLY_LOCAL +#define USDPLY_API +#define USDPLY_API_TEMPLATE_CLASS(...) +#define USDPLY_API_TEMPLATE_STRUCT(...) +#define USDPLY_LOCAL #else -# if defined(USDPLY_EXPORTS) -# define USDPLY_API ARCH_EXPORT -# define USDPLY_API_TEMPLATE_CLASS(...) ARCH_EXPORT_TEMPLATE(class, __VA_ARGS__) -# define USDPLY_API_TEMPLATE_STRUCT(...) ARCH_EXPORT_TEMPLATE(struct, __VA_ARGS__) -# else -# define USDPLY_API ARCH_IMPORT -# define USDPLY_API_TEMPLATE_CLASS(...) ARCH_IMPORT_TEMPLATE(class, __VA_ARGS__) -# define USDPLY_API_TEMPLATE_STRUCT(...) ARCH_IMPORT_TEMPLATE(struct, __VA_ARGS__) -# endif -# define USDPLY_LOCAL ARCH_HIDDEN +#if defined(USDPLY_EXPORTS) +#define USDPLY_API ARCH_EXPORT +#define USDPLY_API_TEMPLATE_CLASS(...) ARCH_EXPORT_TEMPLATE(class, __VA_ARGS__) +#define USDPLY_API_TEMPLATE_STRUCT(...) ARCH_EXPORT_TEMPLATE(struct, __VA_ARGS__) +#else +#define USDPLY_API ARCH_IMPORT +#define USDPLY_API_TEMPLATE_CLASS(...) ARCH_IMPORT_TEMPLATE(class, __VA_ARGS__) +#define USDPLY_API_TEMPLATE_STRUCT(...) ARCH_IMPORT_TEMPLATE(struct, __VA_ARGS__) +#endif +#define USDPLY_LOCAL ARCH_HIDDEN #endif \ No newline at end of file diff --git a/ply/src/fileFormat.cpp b/ply/src/fileFormat.cpp index 566833bb..13dad3d6 100644 --- a/ply/src/fileFormat.cpp +++ b/ply/src/fileFormat.cpp @@ -24,7 +24,6 @@ governing permissions and limitations under the License. #include #include -#include #include #include @@ -196,14 +195,16 @@ UsdPlyFileFormat::WriteToString(const SdfLayer& layer, const std::string& comment) const { // Write USD as PLY: Defer to the usda file format for now. - return SdfFileFormat::FindById(UsdUsdaFileFormatTokens->Id)->WriteToString(layer, str, comment); + return SdfFileFormat::FindById(FileFormatsUsdaFileFormatTokensId) + ->WriteToString(layer, str, comment); } bool UsdPlyFileFormat::WriteToStream(const SdfSpecHandle& spec, std::ostream& out, size_t indent) const { // Write USD as PLY: Defer to the usda file format for now. - return SdfFileFormat::FindById(UsdUsdaFileFormatTokens->Id)->WriteToStream(spec, out, indent); + return SdfFileFormat::FindById(FileFormatsUsdaFileFormatTokensId) + ->WriteToStream(spec, out, indent); } PXR_NAMESPACE_CLOSE_SCOPE diff --git a/ply/src/fileFormat.h b/ply/src/fileFormat.h index 481a9fb9..85f268b2 100644 --- a/ply/src/fileFormat.h +++ b/ply/src/fileFormat.h @@ -11,8 +11,8 @@ governing permissions and limitations under the License. */ #pragma once #include "api.h" -#include #include +#include #include #include #include @@ -39,7 +39,7 @@ TF_DECLARE_WEAK_AND_REF_PTRS(UsdPlyFileFormat); /// \brief SdfData specialization for working with ply files. class PlyData : public FileFormatDataBase { - public: +public: bool points = false; bool withUpAxisCorrection = true; PXR_NS::VtFloatArray gsplatsClippingBox = { -2, -2, -2, 2, 2, 2 }; @@ -53,7 +53,7 @@ class USDPLY_API UsdPlyFileFormat : public SdfFileFormat , public PcpDynamicFileFormatInterface { - public: +public: friend class PlyData; virtual SdfAbstractDataRefPtr InitData(const FileFormatArguments& args) const override; @@ -91,7 +91,7 @@ class USDPLY_API UsdPlyFileFormat std::string* str, const std::string& comment = std::string()) const override; - protected: +protected: static const TfToken pointsToken; static const TfToken pointWidthToken; static const TfToken withUpAxisCorrectionToken; @@ -101,7 +101,7 @@ class USDPLY_API UsdPlyFileFormat virtual ~UsdPlyFileFormat(); UsdPlyFileFormat(); - private: +private: bool ReadFromStream(SdfLayer* layer, std::istream& input, bool metadataOnly, diff --git a/ply/src/plyExport.cpp b/ply/src/plyExport.cpp index d5f4ae11..ad1869e5 100644 --- a/ply/src/plyExport.cpp +++ b/ply/src/plyExport.cpp @@ -11,44 +11,16 @@ governing permissions and limitations under the License. */ #include "plyExport.h" #include "debugCodes.h" +#include +#include #include #include #include #include #include +#include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include #include -#include -#include -#include -#include -#include -#include -#include using namespace PXR_NS; @@ -317,7 +289,8 @@ traverseNodesAndFindMaxNumSHCoeffs(UsdData& usd, int nodeIndex) } for (size_t i = 0; i < node.children.size(); i++) { - maxNumSHCoeffs = std::max(maxNumSHCoeffs, traverseNodesAndFindMaxNumSHCoeffs(usd, node.children[i])); + maxNumSHCoeffs = + std::max(maxNumSHCoeffs, traverseNodesAndFindMaxNumSHCoeffs(usd, node.children[i])); } return maxNumSHCoeffs; } diff --git a/ply/src/plyExport.h b/ply/src/plyExport.h index 33322632..56b27a0d 100644 --- a/ply/src/plyExport.h +++ b/ply/src/plyExport.h @@ -10,8 +10,8 @@ OF ANY KIND, either express or implied. See the License for the specific languag governing permissions and limitations under the License. */ #pragma once -#include #include +#include namespace adobe::usd { diff --git a/ply/src/plyImport.cpp b/ply/src/plyImport.cpp index 55c3ab10..4f779b98 100644 --- a/ply/src/plyImport.cpp +++ b/ply/src/plyImport.cpp @@ -11,29 +11,17 @@ governing permissions and limitations under the License. */ #include "plyImport.h" #include "debugCodes.h" -#include -#include -#include #include #include #include #include +#include #include -#include -#include #include -#include -#include -#include -#include #include -#include #include -#include -#include -#include -#include #include +#include #include using namespace PXR_NS; @@ -93,7 +81,7 @@ struct FloatOrHalfLoader this->getPropertyDataPtr(element, target); } - private: +private: std::vector scratchData; std::vector* dataPtr = nullptr; }; @@ -157,7 +145,8 @@ importPly(const ImportPlyOptions& options, PLYData& ply, UsdData& usd) auto [meshIndex, mesh] = usd.addMesh(); mesh.asPoints = options.importAsPoints || !ply.hasElement("face"); - // Will check later. An asset is a Gsplat only if it contains points and has all the Gsplat-related fields. + // Will check later. An asset is a Gsplat only if it contains points and has all the + // Gsplat-related fields. mesh.asGsplats = mesh.asPoints; int numHighOrderSHCoeffs = 0; @@ -205,7 +194,8 @@ importPly(const ImportPlyOptions& options, PLYData& ply, UsdData& usd) gsColorCoeff1 = gsColorCoeff1Loader.getPropertyDataPtr(element, "f_dc_1"); gsColorCoeff2 = gsColorCoeff2Loader.getPropertyDataPtr(element, "f_dc_2"); } catch (std::exception& e) { - TF_DEBUG_MSG(FILE_FORMAT_PLY, "Invalid Gaussian splatting color data: %s\n", e.what()); + TF_DEBUG_MSG( + FILE_FORMAT_PLY, "Invalid Gaussian splatting color data: %s\n", e.what()); mesh.asGsplats = false; } } else { @@ -240,8 +230,7 @@ importPly(const ImportPlyOptions& options, PLYData& ply, UsdData& usd) } else { mesh.asGsplats = false; } - if (mesh.asGsplats && element.hasProperty("opacity")) - { + if (mesh.asGsplats && element.hasProperty("opacity")) { try { gsOpacity = gsOpacityLoader.getPropertyDataPtr(element, "opacity"); } catch (std::exception& e) { @@ -456,23 +445,20 @@ importPly(const ImportPlyOptions& options, PLYData& ply, UsdData& usd) // We filter out useful convention info from the comment. bool useZup = false; - // The input source is probably Z-up if the comment contains these words. - const std::vector zUpTokens = { - std::regex("\\bZ-axis up\\b"), - std::regex("\\bBlender\\b"), - std::regex("\\bArtec\\b"), - std::regex("\\bRhinoceros\\b") - }; + // The input source is probably Z-up if the comment contains these words. + const std::vector zUpTokens = { std::regex("\\bZ-axis up\\b"), + std::regex("\\bBlender\\b"), + std::regex("\\bArtec\\b"), + std::regex("\\bRhinoceros\\b") }; - for (const std::string& comment : ply.comments) - { + for (const std::string& comment : ply.comments) { if (!useZup) { for (const std::regex& pattern : zUpTokens) { if (std::regex_search(comment, pattern)) { useZup = true; break; } - } + } } } @@ -482,8 +468,7 @@ importPly(const ImportPlyOptions& options, PLYData& ply, UsdData& usd) usd.upAxis = UsdGeomTokens->y; } - if (mesh.asGsplats && options.importGsplatClippingBox.size() >= 6) - { + if (mesh.asGsplats && options.importGsplatClippingBox.size() >= 6) { PXR_NS::GfVec3f minPos(std::numeric_limits::max()); PXR_NS::GfVec3f maxPos(-std::numeric_limits::max()); for (size_t i = 0; i < mesh.points.size(); i++) { diff --git a/ply/src/plyImport.h b/ply/src/plyImport.h index 02c5bf47..7c4f440e 100644 --- a/ply/src/plyImport.h +++ b/ply/src/plyImport.h @@ -10,8 +10,8 @@ OF ANY KIND, either express or implied. See the License for the specific languag governing permissions and limitations under the License. */ #pragma once -#include #include +#include namespace adobe::usd { diff --git a/sbsar/CMakeLists.txt b/sbsar/CMakeLists.txt index fb117931..2297e75c 100644 --- a/sbsar/CMakeLists.txt +++ b/sbsar/CMakeLists.txt @@ -11,7 +11,9 @@ option(USDSBSAR_ENABLE_FIX_STORM_16BIT "Enables fix storm 16bit textures issues" # Tests options (avaible only on windows) option(USDSBSAR_TEST_UNDEFINED_LIBS "Raise error if at the end of compilation libs are not correctly linked" ON) # Cache settings -set(USDSBSAR_CACHE_SIZE 1000000000 CACHE "" STRING) +# Asset cache: Stores rendered texture data. Increase for high-resolution workflows. +# Recommended: 1GB for HD, 2GB for 2K/4K, 4GB+ for 8K +set(USDSBSAR_CACHE_SIZE 2000000000 CACHE "" STRING) # 2GB for high-res rendering support set(USDSBSAR_IMAGE_CACHE_SIZE 1000000000 CACHE "" STRING) set(USDSBSAR_PACKAGE_LIMIT 10 CACHE "" STRING) @@ -81,9 +83,18 @@ endif() # find dependent packages find_package(ZLIB REQUIRED) + +# The engine has a default if this is not set +# Manually setting this for arm64 mac os as +# the default was not being set correctly +if(CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64") + set(SUBSTANCE_FRAMEWORK_ENGINE_VARIANT neon_blend) +endif() + include(substance_engine) add_subdirectory(src) if(USD_FILEFORMATS_BUILD_TESTS) add_subdirectory(test) endif(USD_FILEFORMATS_BUILD_TESTS) + diff --git a/sbsar/README.md b/sbsar/README.md index 0484b0e2..28c31301 100644 --- a/sbsar/README.md +++ b/sbsar/README.md @@ -121,6 +121,50 @@ def Material "SbsarGraphName" ( The thumbnail path format of the graph can be `./path/sbsar.sbsar[thumbnails/{graphName}.png]`. You can also specify it with the file name and the `thumbnail.png` (i.e. `./path/sbsar.sbsar[thumbnail.png]`), which returns the thumbnail of the material graph that matches the name of the SBSAR. If no such graph exists the thumbnail of the first graph is returned. +### Graph Type Filtering + +SBSAR files can contain different types of graphs (materials, environment lights, etc.). To prevent importing the wrong type of SBSAR in the wrong context, you can use the `graphTypeFilter` file format argument to filter which graphs are loaded. + +**Valid filter values:** +- `material` - Only load material graphs +- `light` - Only load light/environment graphs +- (no filter) - Load all graphs (default behavior) + +**Example: Loading a Material SBSAR with Filter** +```usda +def Material "WoodMaterial" ( + prepend references=@./wood.sbsar:SDF_FORMAT_ARGS:graphTypeFilter=material@ +) +{ + # This will only succeed if wood.sbsar contains material graphs +} +``` + +**Example: Loading an Environment SBSAR with Filter** +```usda +def DomeLight "SkyDome" ( + prepend references=@./sky.sbsar:SDF_FORMAT_ARGS:graphTypeFilter=light@ +) +{ + # This will only succeed if sky.sbsar contains light/environment graphs +} +``` + +**Error Handling:** +If the SBSAR file doesn't contain graphs of the requested type, the import will fail with a clear error message: +``` +SBSAR package 'wood.sbsar' does not contain any light/environment graphs. +Package contains: 3 material graph(s). +This SBSAR file cannot be used in this context. +``` + +This feature is especially useful when: +- Building import tools that need to validate SBSAR types before use +- Preventing user errors when dragging/dropping SBSAR files +- Creating asset libraries with type-safe SBSAR references + +**Note:** When no filter is specified, the plugin loads all graphs in the SBSAR file (backward compatible behavior). + ## Sample data There are samples in the data directory that show how you can interact with Substance materials in USD. diff --git a/sbsar/src/CMakeLists.txt b/sbsar/src/CMakeLists.txt index ff3b1d49..5a3a32d7 100644 --- a/sbsar/src/CMakeLists.txt +++ b/sbsar/src/CMakeLists.txt @@ -1,7 +1,6 @@ set(PLUGIN_NAME usdSbsar) add_library(${PLUGIN_NAME} SHARED ${SRC}) - set(PUBLIC_HEADERS api.h) target_sources(${PLUGIN_NAME} @@ -42,7 +41,11 @@ target_sources(${PLUGIN_NAME} target_include_directories(${PLUGIN_NAME} PUBLIC .) # target properties -set_target_properties(${PLUGIN_NAME} PROPERTIES CXX_STANDARD 17) +if (CMAKE_CXX_STANDARD) + set_target_properties(${PLUGIN_NAME} PROPERTIES CXX_STANDARD ${CMAKE_CXX_STANDARD}) +else() + set_target_properties(${PLUGIN_NAME} PROPERTIES CXX_STANDARD 17) +endif() if (USDSBSAR_FORCE_EXTERNAL_USD) set(_boost_include_dir "${_usd_testing_root}/include/boost-1_78") @@ -157,13 +160,15 @@ set_target_properties(${PLUGIN_NAME} PROPERTIES RESOURCE ${CMAKE_CURRENT_BINARY_ set(_resource_list ${CMAKE_CURRENT_BINARY_DIR}/plugInfo.json:plugInfo.json generatedSchema.usda schema.usda) set_target_properties(${PLUGIN_NAME} PROPERTIES RESOURCE_FILES "${_resource_list}") +# USDSBSAR_DESTINATION is set in the parent scope by the add_usd_fileformat macro + if(USDSBSAR_ENABLE_INSTALL) # Install the plugInfo.json file for the specific plugin install( TARGETS ${PLUGIN_NAME} - RUNTIME DESTINATION plugin/usd COMPONENT Runtime - LIBRARY DESTINATION plugin/usd COMPONENT Runtime - RESOURCE DESTINATION plugin/usd/${PLUGIN_NAME}/resources COMPONENT Runtime + RUNTIME DESTINATION ${USDSBSAR_DESTINATION} COMPONENT Runtime + LIBRARY DESTINATION ${USDSBSAR_DESTINATION} COMPONENT Runtime + RESOURCE DESTINATION ${USDSBSAR_DESTINATION}/${PLUGIN_NAME}/resources COMPONENT Runtime PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} COMPONENT Devel) # Install the master plugInfo.json file for the install directory Note that this @@ -172,7 +177,7 @@ if(USDSBSAR_ENABLE_INSTALL) # /resources/plugInfo.json install( FILES ${CMAKE_CURRENT_SOURCE_DIR}/plugInfo.root.json - DESTINATION plugin/usd + DESTINATION ${USDSBSAR_DESTINATION} RENAME plugInfo.json COMPONENT Runtime) endif() diff --git a/sbsar/src/api.h b/sbsar/src/api.h index 67b647da..3c85f5b0 100644 --- a/sbsar/src/api.h +++ b/sbsar/src/api.h @@ -22,16 +22,12 @@ governing permissions and limitations under the License. #else #if defined(USDSBSAR_EXPORTS) #define USDSBSAR_API ARCH_EXPORT -#define USDSBSAR_API_TEMPLATE_CLASS(...) \ - ARCH_EXPORT_TEMPLATE(class, __VA_ARGS__) -#define USDSBSAR_API_TEMPLATE_STRUCT(...) \ - ARCH_EXPORT_TEMPLATE(struct, __VA_ARGS__) +#define USDSBSAR_API_TEMPLATE_CLASS(...) ARCH_EXPORT_TEMPLATE(class, __VA_ARGS__) +#define USDSBSAR_API_TEMPLATE_STRUCT(...) ARCH_EXPORT_TEMPLATE(struct, __VA_ARGS__) #else #define USDSBSAR_API ARCH_IMPORT -#define USDSBSAR_API_TEMPLATE_CLASS(...) \ - ARCH_IMPORT_TEMPLATE(class, __VA_ARGS__) -#define USDSBSAR_API_TEMPLATE_STRUCT(...) \ - ARCH_IMPORT_TEMPLATE(struct, __VA_ARGS__) +#define USDSBSAR_API_TEMPLATE_CLASS(...) ARCH_IMPORT_TEMPLATE(class, __VA_ARGS__) +#define USDSBSAR_API_TEMPLATE_STRUCT(...) ARCH_IMPORT_TEMPLATE(struct, __VA_ARGS__) #endif #define USDSBSAR_LOCAL ARCH_HIDDEN #endif diff --git a/sbsar/src/assetPath/assetPathParser.cpp b/sbsar/src/assetPath/assetPathParser.cpp index 9c97e9b9..37bf08b1 100644 --- a/sbsar/src/assetPath/assetPathParser.cpp +++ b/sbsar/src/assetPath/assetPathParser.cpp @@ -72,7 +72,7 @@ parsePath(const std::string& packagedPath, ParsePathResult& output) // TF_STATUS("Trimmed Path: %s", trimmedPath.c_str()); std::vector delimiter_split; splitByDelimiter(trimmedPath, '/', delimiter_split); - if (delimiter_split.size() != 3) { + if (delimiter_split.size() < 3) { TF_RUNTIME_ERROR("Path format error, invalid path count %lu: %s", delimiter_split.size(), trimmedPath.c_str()); @@ -82,10 +82,11 @@ parsePath(const std::string& packagedPath, ParsePathResult& output) TF_RUNTIME_ERROR("Path format error, only assets at /graphs supported"); return ParsePathResult::PE_INVALID_FORMAT; } - output.graphName = delimiter_split[1]; + // The last component should be "images?..." + // Everything between "graphs" and "images" is the graph name, which may include subfolders std::vector parameter_string_split; - splitByDelimiter(delimiter_split[2], '?', parameter_string_split); + splitByDelimiter(delimiter_split.back(), '?', parameter_string_split); if (parameter_string_split.size() != 2) { TF_RUNTIME_ERROR("Path format error, only a single ? support %zu", parameter_string_split.size()); @@ -96,6 +97,13 @@ parsePath(const std::string& packagedPath, ParsePathResult& output) return ParsePathResult::PE_INVALID_ASSET_TYPE; } + // Reconstruct graph name from middle components (may include subfolders) + // e.g., "graphs/folder/subfolder/graphname/images" -> "folder/subfolder/graphname" + output.graphName = delimiter_split[1]; + for (size_t i = 2; i < delimiter_split.size() - 1; ++i) { + output.graphName += "/" + delimiter_split[i]; + } + std::vector parameter_split; splitByDelimiter(parameter_string_split[1], '#', parameter_split); output.inputParameters = ""; diff --git a/sbsar/src/assetPath/assetPathParser.h b/sbsar/src/assetPath/assetPathParser.h index cfac0c38..55c5e4c6 100644 --- a/sbsar/src/assetPath/assetPathParser.h +++ b/sbsar/src/assetPath/assetPathParser.h @@ -55,17 +55,17 @@ USDSBSAR_API ParsePathResult::ParseError parsePath(const std::string& packagedPath, ParsePathResult& output); // generate a path from a parsed path -ParsePathResult::ParseError +USDSBSAR_API ParsePathResult::ParseError generatePath(const ParsePathResult& parsedResult, std::string& output); //! Helper to read JSValue -bool +USDSBSAR_API bool getAsFloat(const PXR_NS::JsValue& v, float& res); -bool +USDSBSAR_API bool getAsInt(const PXR_NS::JsValue& v, int& res); -bool +USDSBSAR_API bool getAsDoubleArray(const PXR_NS::JsValue& v, std::vector& res); -bool +USDSBSAR_API bool getAsIntArray(const PXR_NS::JsValue& v, std::vector& res); } diff --git a/sbsar/src/assetResolver/sbsarAsset.cpp b/sbsar/src/assetResolver/sbsarAsset.cpp index ad59dd41..905d48ff 100644 --- a/sbsar/src/assetResolver/sbsarAsset.cpp +++ b/sbsar/src/assetResolver/sbsarAsset.cpp @@ -11,81 +11,43 @@ governing permissions and limitations under the License. */ #include -#include #include PXR_NAMESPACE_USING_DIRECTIVE namespace adobe::usd::sbsar { -namespace { -uint32_t -_computePixelBufferSize(const SubstanceTexture& texture) -{ - size_t bytePerPixel = SbsarImage::getBytePerPixel(texture.pixelFormat); - return texture.level0Height * texture.level0Width * bytePerPixel; -} - -std::shared_ptr -copyBuffer(const SubstanceAir::RenderResultImage& img) -{ - auto tex = img.getTexture(); - size_t data_size = _computePixelBufferSize(tex); - size_t buffer_size = sizeof(SbsarAsset::AssetHeader) + data_size; - auto buffer = std::shared_ptr(new char[buffer_size], std::default_delete()); - auto* header = reinterpret_cast(buffer.get()); - char* data = buffer.get() + sizeof(SbsarAsset::AssetHeader); - header->level0Width = tex.level0Width; - header->level0Height = tex.level0Height; - header->pixelFormat = tex.pixelFormat; - header->channelsOrder = Substance_ChanOrder_RGBA; - header->mipmapCount = tex.mipmapCount; - - memcpy(data, tex.buffer, data_size); - return buffer; -} -} - -SbsarAsset::SbsarAsset(const std::shared_ptr& renderResultImage) - : mRenderResultImage(renderResultImage) -{ - size_t data_size = _computePixelBufferSize(mRenderResultImage->getTexture()); - mBufferSize = sizeof(SbsarAsset::AssetHeader) + data_size; -} - -const SubstanceTexture& -SbsarAsset::getSubstanceTexture() const -{ - return mRenderResultImage->getTexture(); -} +SbsarAsset::SbsarAsset(const std::string& packagePath, const std::string& packagedPathNoExt) + : mPackagePath(packagePath) + , mPackagedPathNoExt(packagedPathNoExt) +{} size_t SbsarAsset::GetSize() const { - return mBufferSize; + TF_CODING_ERROR("SbsarAsset::GetSize not implemented"); + return 0; } std::shared_ptr SbsarAsset::GetBuffer() const { - if (!mBuffer) { - mBuffer = copyBuffer(*mRenderResultImage); - } - return mBuffer; + TF_CODING_ERROR("SbsarAsset::GetBuffer not implemented"); + return nullptr; } std::pair SbsarAsset::GetFileUnsafe() const { - TF_RUNTIME_ERROR("SbsarAsset::GetFileUnsafe not implemented"); + TF_CODING_ERROR("SbsarAsset::GetFileUnsafe not implemented"); return { nullptr, 0 }; } size_t SbsarAsset::Read(void* buffer, size_t count, size_t offset) const { - TF_RUNTIME_ERROR("SbsarAsset::Read not implemented"); + TF_CODING_ERROR("SbsarAsset::Read not implemented"); return 0; } diff --git a/sbsar/src/assetResolver/sbsarAsset.h b/sbsar/src/assetResolver/sbsarAsset.h index fcecbd34..9d5984e4 100644 --- a/sbsar/src/assetResolver/sbsarAsset.h +++ b/sbsar/src/assetResolver/sbsarAsset.h @@ -10,42 +10,29 @@ OF ANY KIND, either express or implied. See the License for the specific languag governing permissions and limitations under the License. */ #pragma once +#include #include -#include +#include +#include namespace adobe::usd::sbsar { -//! Asset representing a substance texture. -//! If GetBuffer() is called, the buffer will be copied from the RenderResultImage. -class SbsarAsset final : public PXR_NS::ArAsset -{ - public: - struct AssetHeader - { - unsigned short level0Width; - unsigned short level0Height; - unsigned char pixelFormat; - unsigned char channelsOrder; - unsigned char mipmapCount; - }; - explicit SbsarAsset(const std::shared_ptr& renderResultImage); +//! Asset representing the parameters to render a sbsar texture. +class USDSBSAR_API SbsarAsset final : public PXR_NS::ArAsset +{ +public: + explicit SbsarAsset(const std::string& packagePath, const std::string& packagedPathNoExt); - const SubstanceTexture& getSubstanceTexture() const; + const std::string& GetPackagePath() const { return mPackagePath; } + const std::string& GetPackagedPathNoExt() const { return mPackagedPathNoExt; } size_t GetSize() const override; - //! This function makes a copy of the buffer from the RenderResultImage. - //! Prefere use getSubstanceTexture() to access to the texture data. std::shared_ptr GetBuffer() const override; size_t Read(void* buffer, size_t count, size_t offset) const override; std::pair GetFileUnsafe() const override; - private: - std::shared_ptr mRenderResultImage; - //! Buffer containing the header + image data in a continuous buffer. - //! It is mutable because in GetBuffer(), the first call will copy the buffer in - //! mRenderResultImage to mBuffer. - mutable std::shared_ptr mBuffer; - //! Buffer size in bytes - size_t mBufferSize; +private: + std::string mPackagePath; + std::string mPackagedPathNoExt; }; } diff --git a/sbsar/src/assetResolver/sbsarImage.cpp b/sbsar/src/assetResolver/sbsarImage.cpp index f4e01d33..0ae72012 100644 --- a/sbsar/src/assetResolver/sbsarImage.cpp +++ b/sbsar/src/assetResolver/sbsarImage.cpp @@ -152,8 +152,7 @@ SbsarImage::getBytePerPixel(unsigned char pixelFormat) SbsarImage::SbsarImage() : mFilename() -{ -} +{} SbsarImage::~SbsarImage() {} @@ -166,13 +165,13 @@ SbsarImage::GetFilename() const int SbsarImage::GetWidth() const { - return mSbsarAsset->getSubstanceTexture().level0Width; + return mRenderResultImage->getTexture().level0Width; } int SbsarImage::GetHeight() const { - return mSbsarAsset->getSubstanceTexture().level0Height; + return mRenderResultImage->getTexture().level0Height; } PXR_NS::HioFormat @@ -324,6 +323,10 @@ SbsarImage::_OpenForReading(const std::string& filename, // Store the file name mFilename = filename; + // Render the textures + mRenderResultImage = adobe::usd::sbsar::renderSbsarAsset(mSbsarAsset->GetPackagePath(), + mSbsarAsset->GetPackagedPathNoExt()); + unsigned char pixelFormat = _GetPixelFormat(); const bool isSRGB = [&]() -> bool { switch (sourceColorSpace) { @@ -356,13 +359,13 @@ SbsarImage::_OpenForWriting(const std::string& /*filename*/) const char* SbsarImage::_GetBuffer() const { - return reinterpret_cast(mSbsarAsset->getSubstanceTexture().buffer); + return reinterpret_cast(mRenderResultImage->getTexture().buffer); } unsigned char SbsarImage::_GetPixelFormat() const { - return mSbsarAsset->getSubstanceTexture().pixelFormat; + return mRenderResultImage->getTexture().pixelFormat; } TF_REGISTRY_FUNCTION(TfType) diff --git a/sbsar/src/assetResolver/sbsarImage.h b/sbsar/src/assetResolver/sbsarImage.h index b1579c4c..d5b28058 100644 --- a/sbsar/src/assetResolver/sbsarImage.h +++ b/sbsar/src/assetResolver/sbsarImage.h @@ -16,10 +16,13 @@ governing permissions and limitations under the License. #include #include +#include #include #include +#include + PXR_NAMESPACE_OPEN_SCOPE class ArAsset; PXR_NAMESPACE_CLOSE_SCOPE @@ -34,7 +37,7 @@ PXR_NAMESPACE_CLOSE_SCOPE class SbsarImage final : public PXR_NS::HioImage { - public: +public: static uint32_t getBytePerPixel(unsigned char pixelFormat); using Base = HioImage; @@ -62,7 +65,7 @@ class SbsarImage final : public PXR_NS::HioImage const StorageSpec& storage) override; bool Write(const StorageSpec& storage, const PXR_NS::VtDictionary& metadata) override; - protected: +protected: virtual bool _OpenForReading(std::string const& filename, int subimage, int mip, @@ -71,13 +74,15 @@ class SbsarImage final : public PXR_NS::HioImage virtual bool _OpenForWriting(std::string const& filename) override; //! @} HioImage overrides - private: +private: const char* _GetBuffer() const; unsigned char _GetPixelFormat() const; std::string mFilename; bool mIsColorSpaceSRGB; - std::shared_ptr mSbsarAsset; PXR_NS::HioFormat mFormat; int mBytePerPixel; + + std::shared_ptr mSbsarAsset; + std::shared_ptr mRenderResultImage; }; diff --git a/sbsar/src/assetResolver/sbsarPackageResolver.cpp b/sbsar/src/assetResolver/sbsarPackageResolver.cpp index 3de6943c..f00eaf72 100644 --- a/sbsar/src/assetResolver/sbsarPackageResolver.cpp +++ b/sbsar/src/assetResolver/sbsarPackageResolver.cpp @@ -12,8 +12,10 @@ governing permissions and limitations under the License. #include "sbsarPackageResolver.h" #include "sbsarDebug.h" #include +#include #include #include +#include #include #include #include @@ -141,9 +143,8 @@ SBSARPackageResolver::OpenSbsarAsset(const std::string& packagePath, .Msg("Opening sbsar asset %s %s\n", packagePath.c_str(), fixedPackagedPath.c_str()); std::string packagedPath_no_ext = fixedPackagedPath.substr(0, fixedPackagedPath.size() - 11); - std::string cache_path = packagePath + packagedPath_no_ext; - return renderSbsarAsset(packagePath, packagedPath_no_ext); + return std::make_shared(packagePath, packagedPath_no_ext); } std::shared_ptr diff --git a/sbsar/src/assetResolver/sbsarPackageResolver.h b/sbsar/src/assetResolver/sbsarPackageResolver.h index 5e2d37a7..5435c110 100644 --- a/sbsar/src/assetResolver/sbsarPackageResolver.h +++ b/sbsar/src/assetResolver/sbsarPackageResolver.h @@ -25,7 +25,7 @@ class ArAsset; //! the interface to read the underlying texture. class SBSARPackageResolver : public PXR_NS::ArPackageResolver { - public: +public: SBSARPackageResolver(); virtual ~SBSARPackageResolver(); diff --git a/sbsar/src/assetResolver/sbsarResolverCache.cpp b/sbsar/src/assetResolver/sbsarResolverCache.cpp index 3b4b6c94..2b88d318 100644 --- a/sbsar/src/assetResolver/sbsarResolverCache.cpp +++ b/sbsar/src/assetResolver/sbsarResolverCache.cpp @@ -27,8 +27,7 @@ SBSARResolverCache::SBSARResolverCache() = default; struct SBSARResolverCache::_Cache { - using _Map = - tbb::concurrent_hash_map>; + using _Map = tbb::concurrent_hash_map>; _Map _pathToEntryMap; }; @@ -70,8 +69,7 @@ SBSARResolverCache::findCachedAsset(const std::string& path) } void -SBSARResolverCache::addCachedAsset(std::string& path, - std::shared_ptr& asset) +SBSARResolverCache::addCachedAsset(std::string& path, std::shared_ptr& asset) { _CachePtr currentCache = _GetCurrentCache(); if (currentCache) { @@ -89,7 +87,6 @@ void SBSARResolverCache::dumpStats() { _CachePtr currentCache = _GetCurrentCache(); - if (currentCache) { - } + if (currentCache) {} } } diff --git a/sbsar/src/assetResolver/sbsarResolverCache.h b/sbsar/src/assetResolver/sbsarResolverCache.h index 3d77df5e..b9a6e7e5 100644 --- a/sbsar/src/assetResolver/sbsarResolverCache.h +++ b/sbsar/src/assetResolver/sbsarResolverCache.h @@ -20,7 +20,7 @@ PXR_NAMESPACE_CLOSE_SCOPE namespace adobe::usd::sbsar { class SBSARResolverCache { - public: +public: static SBSARResolverCache& GetInstance(); SBSARResolverCache(const SBSARResolverCache&) = delete; @@ -28,11 +28,10 @@ class SBSARResolverCache void BeginCacheScope(PXR_NS::VtValue* cacheScopeData); void EndCacheScope(PXR_NS::VtValue* cacheScopeData); std::shared_ptr findCachedAsset(const std::string& path); - void addCachedAsset(std::string& path, - std::shared_ptr& asset); + void addCachedAsset(std::string& path, std::shared_ptr& asset); void dumpStats(); - private: +private: SBSARResolverCache(); struct _Cache; diff --git a/sbsar/src/config/sbsarConfig.cpp b/sbsar/src/config/sbsarConfig.cpp index dc1fd2cd..1d424b31 100644 --- a/sbsar/src/config/sbsarConfig.cpp +++ b/sbsar/src/config/sbsarConfig.cpp @@ -64,16 +64,17 @@ SbsarConfig::~SbsarConfig() = default; void SbsarConfig::init() { - m_assetCacheSize = 1'000'000'000; - m_inputImageCacheSize = 1'000'000'000; - m_packageCacheSize = 10; + m_assetCacheSize = 2'000'000'000; // 2 GB - increased for high-res rendering support + m_inputImageCacheSize = 1'000'000'000; // 1 GB + m_packageCacheSize = 10; // 10 packages } void SbsarConfig::setAssetCacheSize(std::size_t size) { if (size == 0) { - TF_STATUS("SbsarConfig: Asset cache size is 0, which means the cache is unlimited and never cleared!"); + TF_STATUS("SbsarConfig: Asset cache size is 0, which means the cache is unlimited and " + "never cleared!"); } m_assetCacheSize = size; } diff --git a/sbsar/src/config/sbsarConfig.h b/sbsar/src/config/sbsarConfig.h index 5f1f90ff..059479eb 100644 --- a/sbsar/src/config/sbsarConfig.h +++ b/sbsar/src/config/sbsarConfig.h @@ -31,7 +31,7 @@ class SbsarConfig : public TfRefBase , public TfWeakBase { - public: +public: SbsarConfig(); virtual ~SbsarConfig(); @@ -46,7 +46,7 @@ class SbsarConfig USDSBSAR_API std::size_t getInputImageCacheSize() const; USDSBSAR_API std::size_t getPackageCacheSize() const; - private: +private: std::atomic m_assetCacheSize; //! In bytes std::atomic m_inputImageCacheSize; //! In bytes std::atomic m_packageCacheSize; //! Max number of packages diff --git a/sbsar/src/config/sbsarConfigFactory.h b/sbsar/src/config/sbsarConfigFactory.h index 9a4f0c5f..42ba7264 100644 --- a/sbsar/src/config/sbsarConfigFactory.h +++ b/sbsar/src/config/sbsarConfigFactory.h @@ -24,7 +24,7 @@ PXR_NAMESPACE_OPEN_SCOPE class USDSBSAR_API SbsarConfigFactory : public TfType::FactoryBase { - public: +public: virtual ~SbsarConfigFactory(); SbsarConfigRefPtr New() { return TfCreateRefPtr(new SbsarConfig); } }; diff --git a/sbsar/src/config/sbsarConfigRegistry.h b/sbsar/src/config/sbsarConfigRegistry.h index 531633bf..90f42de4 100644 --- a/sbsar/src/config/sbsarConfigRegistry.h +++ b/sbsar/src/config/sbsarConfigRegistry.h @@ -28,11 +28,11 @@ class USDSBSAR_API SbsarConfigRegistry SbsarConfigRegistry(const SbsarConfigRegistry&) = delete; SbsarConfigRegistry& operator=(const SbsarConfigRegistry&) = delete; - public: +public: SbsarConfigRegistry(); SbsarConfigRefPtr getSbsarConfig(); - private: +private: SbsarConfigRefPtr m_sbsarConfig; }; diff --git a/sbsar/src/plugInfo.json.in b/sbsar/src/plugInfo.json.in index 401e05cd..2a3de84a 100644 --- a/sbsar/src/plugInfo.json.in +++ b/sbsar/src/plugInfo.json.in @@ -37,6 +37,12 @@ "displayGroup": "Core", "documentation:": "Whether to write MaterialX shader", "type": "bool" + }, + "preserveExtraMaterialInfo": { + "appliesTo": [ "prims" ], + "displayGroup": "Core", + "documentation:": "Whether to include extra inputs for transcoding", + "type": "bool" } }, "Types": { @@ -72,7 +78,8 @@ }, "SbsarImage" : { "bases": ["HioImage"], - "imageTypes": ["sbsarimage"] + "imageTypes": ["sbsarimage"], + "precedence": 1 }, "SbsarConfig": { "assetCacheSize": ${USDSBSAR_CACHE_SIZE}, diff --git a/sbsar/src/sbsarEngine/sbsarAssetCache.cpp b/sbsar/src/sbsarEngine/sbsarAssetCache.cpp index 66ff33b1..b3b008b3 100644 --- a/sbsar/src/sbsarEngine/sbsarAssetCache.cpp +++ b/sbsar/src/sbsarEngine/sbsarAssetCache.cpp @@ -25,7 +25,16 @@ governing permissions and limitations under the License. PXR_NAMESPACE_USING_DIRECTIVE namespace adobe::usd::sbsar { + namespace { + +uint32_t +_computePixelBufferSize(const SubstanceTexture& texture) +{ + size_t bytePerPixel = SbsarImage::getBytePerPixel(texture.pixelFormat); + return texture.level0Height * texture.level0Width * bytePerPixel; +} + std::string computeKey(const adobe::usd::sbsar::ParsePathResult& pathResult) { @@ -34,8 +43,8 @@ computeKey(const adobe::usd::sbsar::ParsePathResult& pathResult) } } -std::shared_ptr -RenderResultCache::getAsset(const std::string& usage) +std::shared_ptr +RenderResultCache::getRenderResultImage(const std::string& usage) { auto it = m_assets.find(usage); if (it == m_assets.end()) { @@ -47,7 +56,9 @@ RenderResultCache::getAsset(const std::string& usage) } void -RenderResultCache::addAsset(const std::string& usage, const std::shared_ptr& asset) +RenderResultCache::addRenderResultImage( + const std::string& usage, + const std::shared_ptr& asset) { m_assets[usage] = asset; } @@ -80,7 +91,7 @@ RenderResultCache::computeSize() { m_size = 0; for (const auto& asset : m_assets) { - m_size += asset.second->GetSize(); + m_size += _computePixelBufferSize(asset.second->getTexture()); } } @@ -108,15 +119,15 @@ AssetCache::hasRenderResult(const adobe::usd::sbsar::ParsePathResult& pathResult return m_assets.find(hash) != m_assets.end(); } -std::shared_ptr -AssetCache::getAsset(const adobe::usd::sbsar::ParsePathResult& pathResult) +std::shared_ptr +AssetCache::getRenderResultImage(const adobe::usd::sbsar::ParsePathResult& pathResult) { std::string hash = computeKey(pathResult); auto asset = m_assets.find(hash); if (asset == m_assets.end()) return nullptr; asset->second.updateLastAccessTime(); - return asset->second.getAsset(pathResult.usage); + return asset->second.getRenderResultImage(pathResult.usage); } VtValue @@ -137,7 +148,8 @@ AssetCache::addRenderResult(const adobe::usd::sbsar::ParsePathResult& pathResult renderResult.computeSize(); // Before adding a new entry, check the cache size and clean the cache if necessary to ensure // there is enough space - if (getSbsarConfig()->getAssetCacheSize() > 0 && (m_size + renderResult.getSize() > getSbsarConfig()->getAssetCacheSize())) + if (getSbsarConfig()->getAssetCacheSize() > 0 && + (m_size + renderResult.getSize() > getSbsarConfig()->getAssetCacheSize())) cleanCache(); renderResult.updateLastAccessTime(); std::size_t assetCount = renderResult.getAssetCount(); diff --git a/sbsar/src/sbsarEngine/sbsarAssetCache.h b/sbsar/src/sbsarEngine/sbsarAssetCache.h index 26697185..e663a813 100644 --- a/sbsar/src/sbsarEngine/sbsarAssetCache.h +++ b/sbsar/src/sbsarEngine/sbsarAssetCache.h @@ -13,8 +13,6 @@ governing permissions and limitations under the License. #pragma once #include -#include - #include #include #include @@ -31,13 +29,14 @@ struct ParsePathResult; struct CacheStats; //! \brief class to store a full render result for a specific graph and parameters. -class RenderResultCache +class USDSBSAR_API RenderResultCache { - public: +public: void updateLastAccessTime(); std::chrono::time_point getLastAccessTime() const; - std::shared_ptr getAsset(const std::string& usage); - void addAsset(const std::string& usage, const std::shared_ptr& asset); + std::shared_ptr getRenderResultImage(const std::string& usage); + void addRenderResultImage(const std::string& usage, + const std::shared_ptr& asset); PXR_NS::VtValue getNumericalValue(const std::string& usage); void addNumericalValue(const std::string& usage, const PXR_NS::VtValue& value); @@ -45,9 +44,9 @@ class RenderResultCache void computeSize(); std::size_t getAssetCount(); - private: +private: //! Key : usage of the asset - std::unordered_map> m_assets; + std::unordered_map> m_assets; //! Key : usage of the value std::unordered_map m_numericalValues; //! Time of creation of the assets or the last time it was used. @@ -61,16 +60,17 @@ class RenderResultCache //! The cache size is controled by CacheSize. When the cache is full, 10% of the oldest render //! result are erased. //! @see RenderResultCache, CacheSize -class AssetCache +class USDSBSAR_API AssetCache { - public: +public: AssetCache() = default; ~AssetCache() = default; //! Check is a render result for a combo graph + parameters exist in the cache. bool hasRenderResult(const ParsePathResult& pathResult); //! Return corresponding asset if it exist in the cache, return nullptr otherwise. //! Update time creation of the corresponding render result. - std::shared_ptr getAsset(const ParsePathResult& pathResult); + std::shared_ptr getRenderResultImage( + const ParsePathResult& pathResult); //! Return corresponding asset if it exist in the cache, return nullptr otherwise. //! Update time creation of the corresponding render result. PXR_NS::VtValue getNumericalValue(const ParsePathResult& pathResult); @@ -80,7 +80,7 @@ class AssetCache //! Erase all the cache. void clearCache(); - private: +private: //! Erase 10% of the cache. void cleanCache(); //! Key: Package hash + graph name + input parameters. diff --git a/sbsar/src/sbsarEngine/sbsarEngine.cpp b/sbsar/src/sbsarEngine/sbsarEngine.cpp index ac88edb5..a79bf171 100644 --- a/sbsar/src/sbsarEngine/sbsarEngine.cpp +++ b/sbsar/src/sbsarEngine/sbsarEngine.cpp @@ -23,12 +23,12 @@ governing permissions and limitations under the License. #ifdef _WIN32 // Windows engine selection code -# include -# include +#include +#include EXTERN_C IMAGE_DOS_HEADER __ImageBase; #else // _WIN32 // Linux and mac -# include +#include #endif // _WIN32 #ifdef _WIN32 diff --git a/sbsar/src/sbsarEngine/sbsarInputImageCache.cpp b/sbsar/src/sbsarEngine/sbsarInputImageCache.cpp index de185465..cc9f32a3 100644 --- a/sbsar/src/sbsarEngine/sbsarInputImageCache.cpp +++ b/sbsar/src/sbsarEngine/sbsarInputImageCache.cpp @@ -37,8 +37,7 @@ struct InputImageCacheData std::size_t size; explicit InputImageCacheData() : lastAccessTime(std::chrono::steady_clock::now()) - { - } + {} void updateLastAccessTime() { lastAccessTime = std::chrono::steady_clock::now(); } }; diff --git a/sbsar/src/sbsarEngine/sbsarPackageCache.cpp b/sbsar/src/sbsarEngine/sbsarPackageCache.cpp index c667e600..12e84e29 100644 --- a/sbsar/src/sbsarEngine/sbsarPackageCache.cpp +++ b/sbsar/src/sbsarEngine/sbsarPackageCache.cpp @@ -169,8 +169,7 @@ struct PackageCacheData explicit PackageCacheData() : lastAccessTime(std::chrono::steady_clock::now()) - { - } + {} void updateLastAccessTime() { lastAccessTime = std::chrono::steady_clock::now(); } }; @@ -268,8 +267,7 @@ GraphInstanceData::GraphInstanceData(std::shared_ptr : m_package(package) , m_instance(graphDesc) , m_lastInputParameters(inputParameters) -{ -} +{} SubstanceAir::GraphInstance& GraphInstanceData::getGraphInstance() diff --git a/sbsar/src/sbsarEngine/sbsarPackageCache.h b/sbsar/src/sbsarEngine/sbsarPackageCache.h index 1f5120ed..d2b71ed3 100644 --- a/sbsar/src/sbsarEngine/sbsarPackageCache.h +++ b/sbsar/src/sbsarEngine/sbsarPackageCache.h @@ -31,7 +31,7 @@ namespace adobe::usd::sbsar { //! package is removed. Since the returned shared_ptr will presist even when the cache is cleared. //! \param resolvedPackagePath The complete path to the package the should be opened //! \param outContentHash If valid, will be used to return the hash of the package -std::shared_ptr +USDSBSAR_API std::shared_ptr getSbsarFromPackageCache(const std::string& resolvedPackagePath, size_t* outContentHash = nullptr); using ParameterListPtr = std::shared_ptr>; @@ -40,7 +40,7 @@ using ParameterListPtr = std::shared_ptr package, const SubstanceAir::GraphDesc& graphDesc, const std::string& inputParameters); @@ -60,7 +60,7 @@ class GraphInstanceData const std::string& getLastInputParameters() const; void setLastInputParameters(const std::string& inputParameters); - private: +private: // Keep a reference to the package to avoid it being deleted while the graph instance is used. std::shared_ptr m_package; SubstanceAir::GraphInstance m_instance; @@ -74,11 +74,11 @@ class GraphInstanceData //! when the cache is cleared. //! \param resolvedPackagePath The complete path to the package the should be opened. //! \param sbsarParameters Graph name and other sbsar's input parameters. -std::shared_ptr +USDSBSAR_API std::shared_ptr getGraphInstanceFromPackageCache(const std::string& resolvedPackagePath, const ParsePathResult& sbsarParameters); //! \brief Find a graph in the package with a given name -const SubstanceAir::GraphDesc* +USDSBSAR_API const SubstanceAir::GraphDesc* findSelectedGraph(const std::string& graphName, const SubstanceAir::Graphs& graphs); } diff --git a/sbsar/src/sbsarEngine/sbsarRender.cpp b/sbsar/src/sbsarEngine/sbsarRender.cpp index a51e22ad..42629624 100644 --- a/sbsar/src/sbsarEngine/sbsarRender.cpp +++ b/sbsar/src/sbsarEngine/sbsarRender.cpp @@ -10,7 +10,6 @@ OF ANY KIND, either express or implied. See the License for the specific languag governing permissions and limitations under the License. */ -#include #include #include #include @@ -61,7 +60,9 @@ applyParameterValue(InputInstanceBase* i, SubstanceIOType type, const JsValue& v std::vector a; getAsDoubleArray(v, a); if (a.size() != 2) { - TF_RUNTIME_ERROR("SbsarRender: cast 'Substance_IOType_Float2', incorrect data size, the size is {}", a.size()); + TF_RUNTIME_ERROR("SbsarRender: cast 'Substance_IOType_Float2', incorrect data " + "size, the size is {}", + a.size()); return false; } f->setValue(Vec2Float(static_cast(a[0]), static_cast(a[1]))); @@ -76,7 +77,9 @@ applyParameterValue(InputInstanceBase* i, SubstanceIOType type, const JsValue& v std::vector a; getAsDoubleArray(v, a); if (a.size() != 3) { - TF_RUNTIME_ERROR("SbsarRender: cast 'Substance_IOType_Float3', incorrect data size, the size is {}", a.size()); + TF_RUNTIME_ERROR("SbsarRender: cast 'Substance_IOType_Float3', incorrect data " + "size, the size is {}", + a.size()); return false; } f->setValue(Vec3Float( @@ -92,7 +95,9 @@ applyParameterValue(InputInstanceBase* i, SubstanceIOType type, const JsValue& v std::vector a; getAsDoubleArray(v, a); if (a.size() != 4) { - TF_RUNTIME_ERROR("SbsarRender: cast 'Substance_IOType_Float4', incorrect data size, the size is {}", a.size()); + TF_RUNTIME_ERROR("SbsarRender: cast 'Substance_IOType_Float4', incorrect data " + "size, the size is {}", + a.size()); return false; } f->setValue(Vec4Float(static_cast(a[0]), @@ -124,7 +129,9 @@ applyParameterValue(InputInstanceBase* i, SubstanceIOType type, const JsValue& v std::vector a; getAsIntArray(v, a); if (a.size() != 2) { - TF_RUNTIME_ERROR("SbsarRender: cast 'Substance_IOType_Integer2', incorrect data size, the size is {}", a.size()); + TF_RUNTIME_ERROR("SbsarRender: cast 'Substance_IOType_Integer2', incorrect data " + "size, the size is {}", + a.size()); return false; } ii->setValue(Vec2Int(a[0], a[1])); @@ -139,7 +146,9 @@ applyParameterValue(InputInstanceBase* i, SubstanceIOType type, const JsValue& v std::vector a; getAsIntArray(v, a); if (a.size() != 3) { - TF_RUNTIME_ERROR("SbsarRender: cast 'Substance_IOType_Integer3', incorrect data size, the size is {}", a.size()); + TF_RUNTIME_ERROR("SbsarRender: cast 'Substance_IOType_Integer3', incorrect data " + "size, the size is {}", + a.size()); return false; } ii->setValue(Vec3Int(a[0], a[1], a[2])); @@ -154,7 +163,9 @@ applyParameterValue(InputInstanceBase* i, SubstanceIOType type, const JsValue& v std::vector a; getAsIntArray(v, a); if (a.size() != 4) { - TF_RUNTIME_ERROR("SbsarRender: cast 'Substance_IOType_Integer4', incorrect data size, the size is {}", a.size()); + TF_RUNTIME_ERROR("SbsarRender: cast 'Substance_IOType_Integer4', incorrect data " + "size, the size is {}", + a.size()); return false; } ii->setValue(Vec4Int(a[0], a[1], a[2], a[3])); @@ -336,8 +347,8 @@ renderGraph(Renderer& renderer, for (const SubstanceAir::string& usage : o->mDesc.mChannelsStr) { lastSbsarParameters.usage = usage; - if (auto previousAsset = assetCache.getAsset(lastSbsarParameters)) - renderResult.addAsset(usage.c_str(), previousAsset); + if (auto previousAsset = assetCache.getRenderResultImage(lastSbsarParameters)) + renderResult.addRenderResultImage(usage.c_str(), previousAsset); else { VtValue previousValue = assetCache.getNumericalValue(lastSbsarParameters); if (!previousValue.IsEmpty()) @@ -358,10 +369,10 @@ renderGraph(Renderer& renderer, std::shared_ptr renderResultImage( dynamic_cast(res.release()), SubstanceAir::deleter()); - std::shared_ptr asset = std::make_shared(renderResultImage); + TF_AXIOM(renderResultImage); for (const SubstanceAir::string& usage : o->mDesc.mChannelsStr) { - renderResult.addAsset(usage.c_str(), asset); + renderResult.addRenderResultImage(usage.c_str(), renderResultImage); } } } diff --git a/sbsar/src/sbsarEngine/sbsarRender.h b/sbsar/src/sbsarEngine/sbsarRender.h index e49fd32f..cadd8f13 100644 --- a/sbsar/src/sbsarEngine/sbsarRender.h +++ b/sbsar/src/sbsarEngine/sbsarRender.h @@ -21,7 +21,7 @@ namespace adobe::usd::sbsar { //! \param instanceData Graph instance to renderer. //! \param sbsarParameters Input parameters that will be set to the graph instance. //! \param assetCache Cache where all the render's result are stored. -void +void USDSBSAR_API renderGraph(SubstanceAir::Renderer& renderer, GraphInstanceData& instanceData, const ParsePathResult& sbsarParameters, diff --git a/sbsar/src/sbsarEngine/sbsarRenderThread.cpp b/sbsar/src/sbsarEngine/sbsarRenderThread.cpp index 8a856673..ba703e65 100644 --- a/sbsar/src/sbsarEngine/sbsarRenderThread.cpp +++ b/sbsar/src/sbsarEngine/sbsarRenderThread.cpp @@ -62,7 +62,7 @@ std::unique_ptr g_state; RenderThreadState* getRenderThreadState() { - if (!g_state) { + { std::lock_guard _l(renderInitMutex); if (!g_state) { // Jumping through some hoops because of some kind of overridden @@ -154,7 +154,7 @@ template bool resultIsValid(const T& elem) { - if constexpr (std::is_same_v>) + if constexpr (std::is_same_v>) return elem != nullptr; else if constexpr (std::is_same_v) return !elem.IsEmpty(); @@ -165,8 +165,8 @@ template T findResultInCache(const ParsePathResult& parseOutput, RenderThreadState* state) { - if constexpr (std::is_same_v>) - return state->assetCache.getAsset(parseOutput); + if constexpr (std::is_same_v>) + return state->assetCache.getRenderResultImage(parseOutput); if constexpr (std::is_same_v) return state->assetCache.getNumericalValue(parseOutput); } @@ -176,10 +176,11 @@ template bool resultExistInTheOtherCache(const ParsePathResult& parseOutput, RenderThreadState* state) { - if constexpr (std::is_same_v>) + if constexpr (std::is_same_v>) return resultIsValid(state->assetCache.getNumericalValue(parseOutput)); if constexpr (std::is_same_v) - return resultIsValid>(state->assetCache.getAsset(parseOutput)); + return resultIsValid>( + state->assetCache.getRenderResultImage(parseOutput)); } //! Ask to the cache if the asset or a value is already exist for the given paths, if not request a @@ -243,10 +244,11 @@ requestRender(const std::string& packagePath, const std::string& packagedPath) } } -std::shared_ptr +std::shared_ptr renderSbsarAsset(const std::string& packagePath, const std::string& packagedPath) { - return requestRender>(packagePath, packagedPath); + return requestRender>(packagePath, + packagedPath); } VtValue @@ -296,7 +298,6 @@ RenderThreadState::RenderThreadState() RenderThreadState::~RenderThreadState() { TF_DEBUG(SBSAR_RENDER).Msg("SbsarRenderThread: Releasing\n"); - RenderThreadState* s = getRenderThreadState(); std::unique_lock guard(lock); shutDown = true; guard.unlock(); diff --git a/sbsar/src/sbsarEngine/sbsarRenderThread.h b/sbsar/src/sbsarEngine/sbsarRenderThread.h index 60555631..e36fe716 100644 --- a/sbsar/src/sbsarEngine/sbsarRenderThread.h +++ b/sbsar/src/sbsarEngine/sbsarRenderThread.h @@ -30,7 +30,7 @@ namespace adobe::usd::sbsar { //! \param packagedPath A complexe string generate by generateSbsarInfoPath() that //! containt all information to run a rendering with the substance engine. //! \see generateSbsarInfoPath() -USDSBSAR_API std::shared_ptr +USDSBSAR_API std::shared_ptr renderSbsarAsset(const std::string& packagePath, const std::string& packagedPath); //! \brief Resolve a request coming from the USD asset system: render a sbsar output value with the diff --git a/sbsar/src/sbsarfileformat.cpp b/sbsar/src/sbsarfileformat.cpp index 6d167dd2..085b2f80 100644 --- a/sbsar/src/sbsarfileformat.cpp +++ b/sbsar/src/sbsarfileformat.cpp @@ -23,11 +23,11 @@ governing permissions and limitations under the License. #include #include +#include #include #include #include #include -#include #include #include @@ -55,8 +55,7 @@ SBSARFileFormat::SBSARFileFormat() SBSARFileFormatTokens->Version, // versionString SBSARFileFormatTokens->Target, // target SBSARFileFormatTokens->Extension) // extension -{ -} +{} SBSARFileFormat::~SBSARFileFormat() = default; @@ -91,6 +90,62 @@ stringsMatchIgnoreCase(const std::string& packageName, const std::string& graphN [](unsigned char l, unsigned char r) { return std::tolower(l) == std::tolower(r); }); } +//! Validate graph type filter and check if package contains matching graphs. +//! Returns the expected GraphType and whether to continue processing. +std::pair +validateGraphTypeFilter(const std::string& graphTypeFilter, + const SubstanceAir::PackageDesc* packageDesc, + const std::string& packageName) +{ + GraphType expectedType = GraphType::Unknown; + + // Parse and validate the filter value + if (!graphTypeFilter.empty()) { + if (graphTypeFilter == "material") { + expectedType = GraphType::Material; + } else if (graphTypeFilter == "light") { + expectedType = GraphType::Light; + } else { + TF_WARN( + "SBSAR: Invalid graphTypeFilter value '%s'. Valid values are 'material' or 'light'.", + graphTypeFilter.c_str()); + } + } + + // If no valid filter, continue processing + if (expectedType == GraphType::Unknown) { + return { expectedType, true }; + } + + // Pre-scan graphs to validate against filter + std::vector foundTypes; + bool hasMatchingGraph = false; + + for (const SubstanceAir::GraphDesc& graphDesc : packageDesc->getGraphs()) { + GraphType graphType = guessGraphType(graphDesc); + foundTypes.push_back(graphType); + if (graphType == expectedType) { + hasMatchingGraph = true; + } + } + + if (!hasMatchingGraph) { + // Generate helpful error message + std::string foundTypesStr = describeGraphTypes(foundTypes); + std::string expectedTypeStr = graphTypeToString(expectedType); + + TF_RUNTIME_ERROR("SBSAR package '%s' does not contain any %s graphs. " + "Package contains: %s. " + "This SBSAR file cannot be used in this context.", + packageName.c_str(), + expectedTypeStr.c_str(), + foundTypesStr.c_str()); + return { expectedType, false }; + } + + return { expectedType, true }; +} + bool SBSARFileFormat::CreateLayerData(const SdfAbstractDataRefPtr& sdfDataPtr, const std::string& resolvedPath, @@ -114,6 +169,13 @@ SBSARFileFormat::CreateLayerData(const SdfAbstractDataRefPtr& sdfDataPtr, } std::string packageName = TfStringGetBeforeSuffix(TfGetBaseName(resolvedPath)); + // Validate graph types if filter is set + auto [expectedType, shouldContinue] = + validateGraphTypeFilter(sbsarData.graphTypeFilter, packageDesc.get(), packageName); + if (!shouldContinue) { + return false; + } + // Create all prim SdfPath defaultPrimPath; // Create a class prim for the materials in the package @@ -125,6 +187,17 @@ SBSARFileFormat::CreateLayerData(const SdfAbstractDataRefPtr& sdfDataPtr, const MappedSymbol graphName = symbolMapper.GetSymbol(getGraphName(graphDesc)); GraphType graphType = guessGraphType(graphDesc); + + // Skip graphs that don't match filter + if (expectedType != GraphType::Unknown && graphType != expectedType) { + TF_DEBUG(FILE_FORMAT_SBSAR) + .Msg("SBSARFileFormat: Skipping graph %s (type %s, expected %s)\n", + graphName.usdName.c_str(), + graphTypeToString(graphType).c_str(), + graphTypeToString(expectedType).c_str()); + continue; + } + SdfPath primPath; if (graphType == GraphType::Material) { @@ -187,10 +260,130 @@ parseFileFormatArguments(const SBSARFileFormat::FileFormatArguments& args) argReadBool(args, "writeUsdPreviewSurface", data.writeUsdPreviewSurface, "SBSAR"); argReadBool(args, "writeASM", data.writeASM, "SBSAR"); argReadBool(args, "writeOpenPBR", data.writeOpenPBR, "SBSAR"); + argReadBool(args, "preserveExtraMaterialInfo", data.preserveExtraMaterialInfo, "SBSAR"); + + // Parse graphTypeFilter + argReadString(args, "graphTypeFilter", data.graphTypeFilter, "SBSAR"); return data; } +/// Resolve an image asset path authored on a parameter of an SBSAR file. +/// +/// Resolution strategy: +/// 1. Use SdfAssetPath::GetResolvedPath() if available (USD-correct). +/// 2. Resolve package-relative paths if the SBSAR itself is packaged (USDZ). +/// 3. Accept absolute filesystem paths directly. +/// 4. Apply BEST-EFFORT filesystem heuristics: +/// - relative to the SBSAR file +/// - relative to current working directory (CWD) +/// +/// IMPORTANT: +/// Anchor-relative paths (./foo.png) cannot be resolved correctly without +/// the authoring layer context. +/// XXX : Heuristic fallbacks are NOT guaranteed +/// to be correct and should be removed once USD exposes the layer context. +/// +/// \return empty string on failure. +std::string +resolveSbsarImageInputAssetPath(const SdfAssetPath& imageAssetPath, + const std::string& resolvedSbsarPath, + const std::string& parameterName) +{ + std::string resolvedPath; + // 1. Prefer USD-resolved path if already available + if (!imageAssetPath.GetResolvedPath().empty()) { + resolvedPath = imageAssetPath.GetResolvedPath(); + TF_DEBUG(FILE_FORMAT_SBSAR) + .Msg("SBSAR: Using pre-resolved image path: %s\n", resolvedPath.c_str()); + return resolvedPath; + } + const std::string& imagePath = imageAssetPath.GetAssetPath(); + // 2. Reject unsupported package-relative image paths + if (ArIsPackageRelativePath(imagePath)) { + TF_WARN("SBSAR: Image path '%s' for parameter '%s' is package-relative " + "and cannot be resolved without authoring layer context.", + imagePath.c_str(), + parameterName.c_str()); + return {}; + } + // 3. SBSAR inside a package (USDZ) + if (ArIsPackageRelativePath(resolvedSbsarPath)) { + const std::string& packageAnchor = ArSplitPackageRelativePathOuter(resolvedSbsarPath).first; + std::string imageIdentifier = ArJoinPackageRelativePath(packageAnchor, imagePath); + if (std::string resolved = ArGetResolver().Resolve(imageIdentifier); !resolved.empty()) { + TF_DEBUG(FILE_FORMAT_SBSAR) + .Msg("SBSAR: Resolved image inside package: %s\n", resolved.c_str()); + return resolved; + } + TF_WARN("SBSAR: Failed to resolve image '%s' relative to packaged SBSAR '%s'", + imagePath.c_str(), + resolvedSbsarPath.c_str()); + return {}; + } + // 4. Absolute filesystem paths are accepted directly + try { + std::filesystem::path fsImagePath(imagePath); + if (fsImagePath.is_absolute()) { + TF_DEBUG(FILE_FORMAT_SBSAR) + .Msg("SBSAR: Using absolute image path: %s\n", imagePath.c_str()); + return imagePath; + } + } catch (const std::exception& e) { + TF_WARN( + "SBSAR: Image path '%s' is not a valid filesystem path: %s", imagePath.c_str(), e.what()); + return {}; + } + // 5. HEURISTIC FALLBACKS (best-effort, NOT USD-correct) + // 5.1 Relative to SBSAR file location + { + std::filesystem::path sbsarPath(resolvedSbsarPath); + std::filesystem::path baseDir = sbsarPath.parent_path(); + std::filesystem::path candidate = baseDir / imagePath; + std::error_code ec; + candidate = std::filesystem::weakly_canonical(candidate, ec); + if (!ec && std::filesystem::exists(candidate)) { + TF_DEBUG(FILE_FORMAT_SBSAR) + .Msg("SBSAR: HEURISTIC resolved image relative to SBSAR: %s\n", + candidate.string().c_str()); + return candidate.string(); + } + } + // 5.2 Relative to current working directory (CWD) + { + std::filesystem::path candidate = std::filesystem::current_path() / imagePath; + std::error_code ec; + candidate = std::filesystem::weakly_canonical(candidate, ec); + if (!ec && std::filesystem::exists(candidate)) { + TF_DEBUG(FILE_FORMAT_SBSAR) + .Msg("SBSAR: HEURISTIC (CWD) resolved image: %s\n", candidate.string().c_str()); + return candidate.string(); + } + } + // 5.3 Relative to parent of SBSAR directory + { + std::filesystem::path sbsarPath(resolvedSbsarPath); + std::filesystem::path baseDir = sbsarPath.parent_path().parent_path(); + + std::filesystem::path candidate = baseDir / imagePath; + + std::error_code ec; + candidate = std::filesystem::weakly_canonical(candidate, ec); + + if (!ec && std::filesystem::exists(candidate)) { + TF_DEBUG(FILE_FORMAT_SBSAR) + .Msg("SBSAR: HEURISTIC resolved image relative to SBSAR parent dir: %s\n", + candidate.string().c_str()); + return candidate.string(); + } + } + TF_WARN("SBSAR: Failed to resolve image '%s' for parameter '%s' (SBSAR: %s)", + imagePath.c_str(), + parameterName.c_str(), + resolvedSbsarPath.c_str()); + return {}; +} + bool SBSARFileFormat::Read(SdfLayer* layer, const std::string& resolvedPath, bool metadataOnly) const { @@ -229,6 +422,15 @@ SBSARFileFormat::ComposeFieldsForFileFormatArguments(const std::string& assetPat FileFormatArguments arguments; SdfLayer::SplitIdentifier(assetPath, &sbsarPath, &arguments); + // Ensure the SBSAR path is fully resolved for use as an anchor + std::string resolvedSbsarPath = ArGetResolver().Resolve(sbsarPath); + if (resolvedSbsarPath.empty()) { + resolvedSbsarPath = sbsarPath; // Fall back to original if resolution fails + } + TF_DEBUG(FILE_FORMAT_SBSAR) + .Msg("SBSARFileFormat::ComposeFieldsForFileFormatArguments: resolved SBSAR path : %s\n", + resolvedSbsarPath.c_str()); + ParameterListPtr sbsarParameters = getParameterListFromPackageCache(sbsarPath); SymbolMapper symbolMapper; VtDictionary dict; @@ -245,7 +447,7 @@ SBSARFileFormat::ComposeFieldsForFileFormatArguments(const std::string& assetPat if (parameter->isImage()) { const auto& imageAssetPath = paramValue.Get(); std::string resolvedImageAssetPath = - ArGetResolver().Resolve(imageAssetPath.GetAssetPath()); + resolveSbsarImageInputAssetPath(imageAssetPath, resolvedSbsarPath, parameterName); std::size_t hash = addImageToInputImageCache(resolvedImageAssetPath); dict[parameterName] = VtValue(hash); } else { @@ -309,14 +511,16 @@ SBSARFileFormat::WriteToString(const SdfLayer& layer, const std::string& comment) const { // Fall back to USDA - return SdfFileFormat::FindById(UsdUsdaFileFormatTokens->Id)->WriteToString(layer, str, comment); + return SdfFileFormat::FindById(FileFormatsUsdaFileFormatTokensId) + ->WriteToString(layer, str, comment); } bool SBSARFileFormat::WriteToStream(const SdfSpecHandle& spec, std::ostream& out, size_t indent) const { // Fall back to USDA - return SdfFileFormat::FindById(UsdUsdaFileFormatTokens->Id)->WriteToStream(spec, out, indent); + return SdfFileFormat::FindById(FileFormatsUsdaFileFormatTokensId) + ->WriteToStream(spec, out, indent); } bool diff --git a/sbsar/src/sbsarfileformat.h b/sbsar/src/sbsarfileformat.h index 188e8401..7080d818 100644 --- a/sbsar/src/sbsarfileformat.h +++ b/sbsar/src/sbsarfileformat.h @@ -12,6 +12,7 @@ governing permissions and limitations under the License. #pragma once #include "api.h" +#include #include #include #include @@ -21,17 +22,24 @@ governing permissions and limitations under the License. namespace adobe::usd::sbsar { struct SBSAROptions { + SBSAROptions() + { + adobe::usd::applyMaterialModelDefaults(writeUsdPreviewSurface, writeASM, writeOpenPBR); + } + PXR_NS::VtDictionary sbsarParameters; std::uint32_t depth = 0; bool writeUsdPreviewSurface = true; bool writeASM = true; bool writeOpenPBR = false; + bool preserveExtraMaterialInfo = true; + std::string graphTypeFilter = ""; // "material", "light", or "" (no filter) }; } // To avoid trouble when registering class we use pixar name space. PXR_NAMESPACE_OPEN_SCOPE -#define SBSAR_FILE_FORMAT_TOKENS \ +#define SBSAR_FILE_FORMAT_TOKENS \ ((Id, "sbsar"))((Version, "1.0"))((Target, "usd"))((Extension, "sbsar")) TF_DECLARE_PUBLIC_TOKENS(SBSARFileFormatTokens, SBSAR_FILE_FORMAT_TOKENS); @@ -58,7 +66,7 @@ class SBSARFileFormat : public SdfFileFormat , public PcpDynamicFileFormatInterface { - public: +public: // SdfFileFormat API. USDSBSAR_API virtual bool IsPackage() const override; USDSBSAR_API virtual std::string GetPackageRootLayerPath( @@ -133,7 +141,7 @@ class SBSARFileFormat std::ostream& out, size_t indent) const override; - protected: +protected: SDF_FILE_FORMAT_FACTORY_ACCESS; virtual ~SBSARFileFormat(); SBSARFileFormat(); diff --git a/sbsar/src/tokens.cpp b/sbsar/src/tokens.cpp index eb7c5473..6ec83420 100644 --- a/sbsar/src/tokens.cpp +++ b/sbsar/src/tokens.cpp @@ -14,41 +14,38 @@ governing permissions and limitations under the License. PXR_NAMESPACE_OPEN_SCOPE -UsdSbsarTokensType::UsdSbsarTokensType() : - pngFormat("png", TfToken::Immortal), - RES_1024x1024("10", TfToken::Immortal), - RES_128x128("7", TfToken::Immortal), - RES_16x16("4", TfToken::Immortal), - RES_1x1("0", TfToken::Immortal), - RES_2048x2048("11", TfToken::Immortal), - RES_256x256("8", TfToken::Immortal), - RES_2x2("1", TfToken::Immortal), - RES_32x32("5", TfToken::Immortal), - RES_4096x4096("12", TfToken::Immortal), - RES_4x4("2", TfToken::Immortal), - RES_512x512("9", TfToken::Immortal), - RES_64x64("6", TfToken::Immortal), - RES_8x8("3", TfToken::Immortal), - sbsarFormat("sbsar", TfToken::Immortal), - allTokens({ - pngFormat, - RES_1024x1024, - RES_128x128, - RES_16x16, - RES_1x1, - RES_2048x2048, - RES_256x256, - RES_2x2, - RES_32x32, - RES_4096x4096, - RES_4x4, - RES_512x512, - RES_64x64, - RES_8x8, - sbsarFormat - }) -{ -} +UsdSbsarTokensType::UsdSbsarTokensType() + : pngFormat("png", TfToken::Immortal) + , RES_1024x1024("10", TfToken::Immortal) + , RES_128x128("7", TfToken::Immortal) + , RES_16x16("4", TfToken::Immortal) + , RES_1x1("0", TfToken::Immortal) + , RES_2048x2048("11", TfToken::Immortal) + , RES_256x256("8", TfToken::Immortal) + , RES_2x2("1", TfToken::Immortal) + , RES_32x32("5", TfToken::Immortal) + , RES_4096x4096("12", TfToken::Immortal) + , RES_4x4("2", TfToken::Immortal) + , RES_512x512("9", TfToken::Immortal) + , RES_64x64("6", TfToken::Immortal) + , RES_8x8("3", TfToken::Immortal) + , sbsarFormat("sbsar", TfToken::Immortal) + , allTokens({ pngFormat, + RES_1024x1024, + RES_128x128, + RES_16x16, + RES_1x1, + RES_2048x2048, + RES_256x256, + RES_2x2, + RES_32x32, + RES_4096x4096, + RES_4x4, + RES_512x512, + RES_64x64, + RES_8x8, + sbsarFormat }) +{} TfStaticData UsdSbsarTokens; diff --git a/sbsar/src/tokens.h b/sbsar/src/tokens.h index dd869ef0..6646d6d9 100644 --- a/sbsar/src/tokens.h +++ b/sbsar/src/tokens.h @@ -16,21 +16,20 @@ governing permissions and limitations under the License. /// \file usdSbsar/tokens.h // XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX -// +// // This is an automatically generated file (by usdGenSchema.py). // Do not hand-edit! -// +// // XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX -#include "pxr/pxr.h" #include "./api.h" #include "pxr/base/tf/staticData.h" #include "pxr/base/tf/token.h" +#include "pxr/pxr.h" #include PXR_NAMESPACE_OPEN_SCOPE - /// \class UsdSbsarTokensType /// /// \link UsdSbsarTokens \endlink provides static, efficient @@ -49,67 +48,68 @@ PXR_NAMESPACE_OPEN_SCOPE /// \code /// gprim.GetMyTokenValuedAttr().Set(UsdSbsarTokens->pngFormat); /// \endcode -struct UsdSbsarTokensType { +struct UsdSbsarTokensType +{ USDSBSAR_API UsdSbsarTokensType(); /// \brief "png" - /// - /// Png extension name + /// + /// Png extension name const TfToken pngFormat; /// \brief "10" - /// + /// /// Image resolution of 1024x1024 pixels const TfToken RES_1024x1024; /// \brief "7" - /// + /// /// Image resolution of 128x128 pixels const TfToken RES_128x128; /// \brief "4" - /// + /// /// Image resolution of 16x16 pixels const TfToken RES_16x16; /// \brief "0" - /// + /// /// Image resolution of 1x1 pixels const TfToken RES_1x1; /// \brief "11" - /// + /// /// Image resolution of 2048x2048 pixels const TfToken RES_2048x2048; /// \brief "8" - /// + /// /// Image resolution of 256x256 pixels const TfToken RES_256x256; /// \brief "1" - /// + /// /// Image resolution of 2x2 pixels const TfToken RES_2x2; /// \brief "5" - /// + /// /// Image resolution of 32x32 pixels const TfToken RES_32x32; /// \brief "12" - /// - /// Image resolution of 4096x4096 pixels + /// + /// Image resolution of 4096x4096 pixels const TfToken RES_4096x4096; /// \brief "2" - /// + /// /// Image resolution of 4x4 pixels const TfToken RES_4x4; /// \brief "9" - /// + /// /// Image resolution of 512x512 pixels const TfToken RES_512x512; /// \brief "6" - /// + /// /// Image resolution of 64x64 pixels const TfToken RES_64x64; /// \brief "3" - /// + /// /// Image resolution of 8x8 pixels const TfToken RES_8x8; /// \brief "sbsar" - /// - /// Sbsar extension name + /// + /// Sbsar extension name const TfToken sbsarFormat; /// A vector of all of the tokens listed above. const std::vector allTokens; diff --git a/sbsar/src/usdGeneration/sbsarLuxDomeLight.cpp b/sbsar/src/usdGeneration/sbsarLuxDomeLight.cpp index b8fbfb7a..8e31af81 100644 --- a/sbsar/src/usdGeneration/sbsarLuxDomeLight.cpp +++ b/sbsar/src/usdGeneration/sbsarLuxDomeLight.cpp @@ -104,7 +104,7 @@ addLuxDomeLight(SdfAbstractData* sdfData, SdfAssetPath path = SdfAssetPath(generateSbsarInfoPath(usageString, graphName, sbsarHash, params)); setAttributeMetadata(sdfData, texAttrPath, SdfFieldKeys->Hidden, VtValue(true)); - setAttributeDefaultValue(sdfData, texAttrPath, path); + setAttributeDefaultValue(sdfData, texAttrPath, path, SdfValueTypeNames->Asset); } return lightPath; diff --git a/sbsar/src/usdGeneration/sbsarMaterial.cpp b/sbsar/src/usdGeneration/sbsarMaterial.cpp index 370c493a..d1d5dc51 100644 --- a/sbsar/src/usdGeneration/sbsarMaterial.cpp +++ b/sbsar/src/usdGeneration/sbsarMaterial.cpp @@ -18,6 +18,7 @@ governing permissions and limitations under the License. #include #include +#include #include #include #include @@ -49,7 +50,7 @@ setupPysicalSize(SdfAbstractData* sdfData, // TODO the dynamically computed evaluation of the physical size is not yet implemented. GfVec3f physicalSize( graphDesc.mPhysicalSize.x, graphDesc.mPhysicalSize.y, graphDesc.mPhysicalSize.z); - setAttributeDefaultValue(sdfData, paramPath, physicalSize); + setAttributeDefaultValue(sdfData, paramPath, physicalSize, SdfValueTypeNames->Float3); TF_DEBUG(FILE_FORMAT_SBSAR) .Msg("setupPysicalSize: %f %f %f\n", graphDesc.mPhysicalSize.x, @@ -81,6 +82,17 @@ initDefaultMaterialInputs(SdfAbstractData* sdfData, SdfPath textureAssetPath = createShaderInput(sdfData, materialPath, textureAssetName, SdfValueTypeNames->Asset); setAttributeMetadata(sdfData, textureAssetPath, SdfFieldKeys->Hidden, VtValue(true)); + // We set the color space on the attribute that will carry the texture asset path + // This is an important clue for the OpenPBR/MaterialX shading network, as the texture + // reading nodes there do not have a field for the color space. That space is specified + // on the attribute that holds the asset path. + // XXX: In the future we should switch these tokens to GfColorSpaceNames, which + // specifies a larger set of color spaces. For now we stick to "srgb_texture" and "raw", + // which are MaterialX supported and recognized color space names. + const TfToken& colorSpace = + isColorUsage(usage) ? MtlXTokens->srgb_texture : AdobeTokens->raw; + setAttributeMetadata( + sdfData, textureAssetPath, SdfFieldKeys->ColorSpace, VtValue(colorSpace)); // Not setting a default value here, so that it has to be overwritten in the payload // reference } @@ -95,8 +107,8 @@ initDefaultMaterialInputs(SdfAbstractData* sdfData, setAttributeMetadata(sdfData, biasAttrPath, SdfFieldKeys->Hidden, VtValue(true)); const auto [scale, bias] = getNormalMapScaleAndBias(normalFormat); - setAttributeDefaultValue(sdfData, scaleAttrPath, scale); - setAttributeDefaultValue(sdfData, biasAttrPath, bias); + setAttributeDefaultValue(sdfData, scaleAttrPath, scale, SdfValueTypeNames->Float4); + setAttributeDefaultValue(sdfData, biasAttrPath, bias, SdfValueTypeNames->Float4); } } } @@ -127,7 +139,7 @@ setMaterialTexturePaths(SdfAbstractData* sdfData, // The "./" makes the path anchored on this layer and it is resolved relative to it // inside of the same SBSAR package. SdfAssetPath path = SdfAssetPath("./" + sbsarPath); - setAttributeDefaultValue(sdfData, textureAssetPath, path); + setAttributeDefaultValue(sdfData, textureAssetPath, path, SdfValueTypeNames->Asset); } } } @@ -152,8 +164,10 @@ setMaterialValues(SdfAbstractData* sdfData, std::string infoPath = generateSbsarInfoPath(usage, graphName, sbsarHash, jsParams); TF_DEBUG(FILE_FORMAT_SBSAR) .Msg("Using engine to get value for %s\n", usage.c_str()); - setAttributeDefaultValue( - sdfData, textureAssetPath, renderSbsarValue(packagePath, infoPath)); + setAttributeDefaultValue(sdfData, + textureAssetPath, + renderSbsarValue(packagePath, infoPath), + defaultIt->second.type); } } } @@ -163,7 +177,8 @@ void setMaterialNormalScaleAndBias(SdfAbstractData* sdfData, const SdfPath& materialPath, const SubstanceAir::GraphDesc& graphDesc, - const JsValue& jsParams) + const JsValue& jsParams, + const SBSAROptions& sbsarData) { // If we don't have concrete information on the normal format, we don't author an explict scale // and bias to adjust for that and instead rely on the default that was authored with the @@ -188,8 +203,20 @@ setMaterialNormalScaleAndBias(SdfAbstractData* sdfData, SdfPath biasAttrPath = createShaderInput(sdfData, materialPath, biasName, SdfValueTypeNames->Float4); const auto [scale, bias] = getNormalMapScaleAndBias(normalFormat); - setAttributeDefaultValue(sdfData, scaleAttrPath, scale); - setAttributeDefaultValue(sdfData, biasAttrPath, bias); + std::string materialPathStr = materialPath.GetString(); + TF_DEBUG(FILE_FORMAT_SBSAR) + .Msg("Adjusting normal map scale and bias for material %s\n", + materialPathStr.c_str()); + setAttributeDefaultValue(sdfData, scaleAttrPath, scale, SdfValueTypeNames->Float4); + setAttributeDefaultValue(sdfData, biasAttrPath, bias, SdfValueTypeNames->Float4); + // XXX @dcoffey There's a gap here with OpenPBR which doesn't use these input + // connections as it sets the scale and bias directly in the Shader node. This means + // that if the normal format is changed via the sbsar parameters, the change won't be + // impact the scale / bias. It's a little abmbigous what the user goal of toggling the + // normal format via the sbsar parameters even is here, so for now we're going to accept + // this gap. There's also an argument that we shouldn't even be adjusting the scale and + // bias if the user changes the normal format via the sbsar parameters, since the user + // may be trying to "correct" the render, which setting these fields will counteract } } } @@ -202,15 +229,21 @@ addMaterialTransform(SdfAbstractData* sdfData, const SdfPath& materialPath) { SdfPath uvScalePath = createShaderInput(sdfData, materialPath, uv_scale_input, SdfValueTypeNames->Float2); - setAttributeDefaultValue(sdfData, uvScalePath, GfVec2f(1.0f, 1.0f)); + setAttributeDefaultValue(sdfData, uvScalePath, GfVec2f(1.0f, 1.0f), SdfValueTypeNames->Float2); + + SdfPath uvScaleInversePath = + createShaderInput(sdfData, materialPath, uv_scale_inverse_input, SdfValueTypeNames->Float2); + setAttributeDefaultValue( + sdfData, uvScaleInversePath, GfVec2f(1.0f, 1.0f), SdfValueTypeNames->Float2); SdfPath uvRotationPath = createShaderInput(sdfData, materialPath, uv_rotation_input, SdfValueTypeNames->Float); - setAttributeDefaultValue(sdfData, uvRotationPath, 0.0f); + setAttributeDefaultValue(sdfData, uvRotationPath, 0.0f, SdfValueTypeNames->Float); SdfPath uvTranslationPath = createShaderInput(sdfData, materialPath, uv_translation_input, SdfValueTypeNames->Float2); - setAttributeDefaultValue(sdfData, uvTranslationPath, GfVec2f(0.0f, 0.0f)); + setAttributeDefaultValue( + sdfData, uvTranslationPath, GfVec2f(0.0f, 0.0f), SdfValueTypeNames->Float2); } //! \brief Add standard material networks according to the compilation options. @@ -231,7 +264,8 @@ addStandardMaterial(SdfAbstractData* sdfData, // Set the default UV channel name SdfPath uvChannelNamePath = createShaderInput(sdfData, materialPath, uv_channel_name, SdfValueTypeNames->String); - setAttributeDefaultValue(sdfData, uvChannelNamePath, std::string("st")); + setAttributeDefaultValue( + sdfData, uvChannelNamePath, std::string("st"), SdfValueTypeNames->String); setAttributeMetadata(sdfData, uvChannelNamePath, SdfFieldKeys->Hidden, VtValue(true)); // Expose the texture wrap modes for texture reading nodes. This is shared by ASM and @@ -241,8 +275,10 @@ addStandardMaterial(SdfAbstractData* sdfData, createShaderInput(sdfData, materialPath, uv_wrap_s_name, SdfValueTypeNames->Token); SdfPath uvWrapTPath = createShaderInput(sdfData, materialPath, uv_wrap_t_name, SdfValueTypeNames->Token); - setAttributeDefaultValue(sdfData, uvWrapSPath, AdobeTokens->repeat); - setAttributeDefaultValue(sdfData, uvWrapTPath, AdobeTokens->repeat); + setAttributeDefaultValue( + sdfData, uvWrapSPath, AdobeTokens->repeat, SdfValueTypeNames->Token); + setAttributeDefaultValue( + sdfData, uvWrapTPath, AdobeTokens->repeat, SdfValueTypeNames->Token); VtTokenArray wrapModes = { AdobeTokens->repeat, AdobeTokens->mirror, AdobeTokens->clamp, AdobeTokens->black }; @@ -262,7 +298,8 @@ addStandardMaterial(SdfAbstractData* sdfData, // Add Refractive MaterialX Implementation if (options.writeOpenPBR) { - addOpenPbrShader(sdfData, materialPath, graphDesc); + NormalFormat initialNormalFormat = getDefaultNormalFormat(graphDesc); + addOpenPbrShader(sdfData, materialPath, graphDesc, initialNormalFormat); } } @@ -352,7 +389,7 @@ addMaterialPrim(SdfAbstractData* sdfData, setMaterialValues( sdfData, materialPath, graphDesc, graphName, sbsarHash, jsParams, packagePath); // Set normal scale and bias depending on the normal format - setMaterialNormalScaleAndBias(sdfData, materialPath, graphDesc, jsParams); + setMaterialNormalScaleAndBias(sdfData, materialPath, graphDesc, jsParams, sbsarData); } return materialPath; diff --git a/sbsar/src/usdGeneration/sbsarOpenPBR.cpp b/sbsar/src/usdGeneration/sbsarOpenPBR.cpp index 6459c8ac..87f482a8 100644 --- a/sbsar/src/usdGeneration/sbsarOpenPBR.cpp +++ b/sbsar/src/usdGeneration/sbsarOpenPBR.cpp @@ -15,8 +15,10 @@ governing permissions and limitations under the License. // File format utils #include +#include #include #include +#include #include @@ -36,6 +38,7 @@ TF_DEFINE_PRIVATE_TOKENS(_tokens, (WsNormal) (Surface) (Displacement) + (HeightLevel) ); // clang-format on @@ -138,10 +141,20 @@ static std::map _materialMapBindings = { // thin_film_ior (no source info) // * Emission - // emission_luminance (no source info) (is set to 1 if we have "emissive" input) + // emission_luminance (no source info) (is set to 1000 if we have "emissive" input) { "emissive", { OpenPbrTokens->emission_color, SdfValueTypeNames->Color3f, "out", AdobeTokens->sRGB } }, + // * Displacement + // height, heightLevel and heightScale are sbs inputs that have the same names as ASM inputs + // but not OpenPBR native. We keep the ASM naming of the material inputs which are connected + // to a seperate displacement shader. + { "height", { TfToken("height"), SdfValueTypeNames->Float, "out", AdobeTokens->raw } }, + { "heightLevel", + { TfToken("heightLevel"), SdfValueTypeNames->Float, "out", AdobeTokens->raw } }, + { "heightScale", + { TfToken("heightScale"), SdfValueTypeNames->Float, "out", AdobeTokens->raw } }, + // * Geometry { "opacity", { OpenPbrTokens->geometry_opacity, SdfValueTypeNames->Float, "out", AdobeTokens->raw } }, @@ -153,75 +166,73 @@ static std::map _materialMapBindings = { // geometry_coat_tangent (no source info) }; +static const std::string heightStr = "height"; +static const std::string heightLevelStr = "heightLevel"; +static const std::string heightScaleStr = "heightScale"; + SdfPath bindTexture(SdfAbstractData* sdfData, const SdfPath& parentPath, const BindInfo& bindInfo, const SdfPath& uvOutputAttrPath, const SdfPath& textureAssetAttrPath, - const SdfPath& uAddressModeAttrPath, - const SdfPath& vAddressModeAttrPath) + const NormalFormat& initialNormalFormat) { TF_DEBUG(FILE_FORMAT_SBSAR) .Msg("bindTexture: Binding texture channel %s\n", bindInfo.name.GetText()); - TfToken shaderType; + auto name = bindInfo.name; + Input input; + // XXX hardcoding this to repeat since we don't have the wrap mode info from the SBSAR at this + // point and these are typically always repeating textures + input.wrapS = AdobeTokens->repeat; + input.wrapT = AdobeTokens->repeat; + input.scale = kDefaultTexScale; + input.bias = kDefaultTexBias; + if (name == OpenPbrTokens->geometry_normal || name == OpenPbrTokens->geometry_coat_normal) { + if (initialNormalFormat == NormalFormat::DirectX || + initialNormalFormat == NormalFormat::Unknown) { + input.scale = kDirectXNormalTexScale; + input.bias = kDirectXNormalTexBias; + } else { + input.scale = kOpenGLNormalTexScale; + input.bias = kOpenGLNormalTexBias; + } + } + if (bindInfo.sdfType == SdfValueTypeNames->Color3f) { - shaderType = MtlXTokens->ND_image_color3; + input.channel = AdobeTokens->rgb; + input.colorspace = AdobeTokens->sRGB; } else if (bindInfo.sdfType == SdfValueTypeNames->Float3) { - shaderType = MtlXTokens->ND_image_vector3; + input.channel = AdobeTokens->rgb; } else if (bindInfo.sdfType == SdfValueTypeNames->Float) { - shaderType = MtlXTokens->ND_image_float; + input.channel = AdobeTokens->r; } else { TF_CODING_ERROR("Unsupported texture type %s", bindInfo.sdfType.GetAsToken().GetText()); return {}; } - // Note, there is currently no support for the color space choice. Also no support for a - // fallback value. Bias and scale are also not supported. - SdfPath resultPath = createShader(sdfData, - parentPath, - TfToken("file" + bindInfo.name.GetString()), - shaderType, - "out", - {}, - { { "texcoord", uvOutputAttrPath }, - { "file", textureAssetAttrPath }, - { "uaddressmode", uAddressModeAttrPath }, - { "vaddressmode", vAddressModeAttrPath } }); - - return resultPath; + SdfPath textureOutput = createMaterialXTextureReader( + sdfData, parentPath, name, input, uvOutputAttrPath, textureAssetAttrPath); + + return textureOutput; } bool addUsdOpenPbrShaderImpl(SdfAbstractData* sdfData, const SdfPath& materialPath, const GraphDesc& graphDesc, - const std::map& mapBindings) + const std::map& mapBindings, + const NormalFormat& initialNormalFormat) { TF_DEBUG(FILE_FORMAT_SBSAR) .Msg("addUsdOpenPbrShaderImpl: Adding OpenPBR/MaterialX Implementation\n"); // Create top level inputs to control the UV coordinate channel and the UV address modes. - // Note, this is an unfortunate duplication of the similar setup for ASM and UsdPreviewSurface - // based networks. For those two scenarios we need three tokens for the named UV primvar and - // wrap modes, where here we need an int for the UV index and two strings for the address modes. - SdfPath uvChannelIndexPath = - createShaderInput(sdfData, materialPath, "uvChannelIndex", SdfValueTypeNames->Int); - setAttributeDefaultValue(sdfData, uvChannelIndexPath, 0); - - VtTokenArray addressModes = { TfToken("periodic"), TfToken("clamp") }; - SdfPath uAddressModePath = - createShaderInput(sdfData, materialPath, "uaddressmode", SdfValueTypeNames->String); - setAttributeDefaultValue(sdfData, uAddressModePath, "periodic"); - setAttributeMetadata( - sdfData, uAddressModePath, SdfFieldKeys->AllowedTokens, VtValue(addressModes)); - - SdfPath vAddressModePath = - createShaderInput(sdfData, materialPath, "vaddressmode", SdfValueTypeNames->String); - setAttributeDefaultValue(sdfData, vAddressModePath, "periodic"); - setAttributeMetadata( - sdfData, vAddressModePath, SdfFieldKeys->AllowedTokens, VtValue(addressModes)); + SdfPath uvChannelNamePath = + createShaderInput(sdfData, materialPath, uv_channel_name, SdfValueTypeNames->String); + setAttributeDefaultValue( + sdfData, uvChannelNamePath, std::string("st"), SdfValueTypeNames->String); // Create a scope for the OpenPBR implementation SdfPath scopePath = @@ -231,13 +242,13 @@ addUsdOpenPbrShaderImpl(SdfAbstractData* sdfData, SdfPath txOutputPath = createShader(sdfData, scopePath, _tokens->TexCoordReader, - MtlXTokens->ND_texcoord_vector2, + MtlXTokens->ND_geompropvalue_vector2, "out", {}, - { { "index", uvChannelIndexPath } }); + { { "geomprop", uvChannelNamePath } }); #ifdef USDSBSAR_ENABLE_TEXTURE_TRANSFORM - SdfPath uvScaleInputPath = inputPath(materialPath, uv_scale_input); + SdfPath uvScaleInputPath = inputPath(materialPath, uv_scale_inverse_input); SdfPath uvRotationInputPath = inputPath(materialPath, uv_rotation_input); SdfPath uvTranslationInputPath = inputPath(materialPath, uv_translation_input); @@ -257,44 +268,81 @@ addUsdOpenPbrShaderImpl(SdfAbstractData* sdfData, SdfPath uvOutputPath = txOutputPath; #endif // USDSBSAR_ENABLE_TEXTURE_TRANSFORM + auto createTextureReader = [&](const std::string& usage, const BindInfo& bindInfo) -> SdfPath { + // Get the path of the texture attribute on the Material prim + std::string texAssetName = getTextureAssetName(usage); + SdfPath textureAssetAttrPath = inputPath(materialPath, texAssetName); + + // Create the texture reader + SdfPath texResultPath = bindTexture( + sdfData, scopePath, bindInfo, uvOutputPath, textureAssetAttrPath, initialNormalFormat); + return texResultPath; + }; + + auto createMaterialInput = [&](const std::string& usage, float defaultValue) -> SdfPath { + SdfPath path; + if (hasUsage(usage, graphDesc)) { + auto it = mapBindings.find(usage); + if (it != mapBindings.end()) { + path = createTextureReader(usage, it->second); + } + } + if (path.IsEmpty()) { + path = createShaderInput(sdfData, materialPath, usage, SdfValueTypeNames->Float); + setAttributeDefaultValue( + sdfData, path, VtValue(defaultValue), SdfValueTypeNames->Float); + } + return path; + }; + + SdfPath heightLevelAttrPath; + SdfPath heightScaleAttrPath; + if (hasUsage(heightStr, graphDesc)) { + heightLevelAttrPath = createMaterialInput(heightLevelStr, 0.5f); + heightScaleAttrPath = createMaterialInput(heightScaleStr, 1.0f); + } + // Create texture sampling nodes InputValues inputValues; InputConnections inputConnections; bool enableSubsurface = false; for (const auto& usage : mapped_usages) { if (hasUsage(usage, graphDesc)) { + if (usage == heightLevelStr || usage == heightScaleStr) { + // these are handled above when "height" is present so skip + continue; + } + auto it = mapBindings.find(usage); if (it != mapBindings.end()) { const BindInfo& bindInfo = it->second; + SdfPath texResultPath = createTextureReader(usage, bindInfo); + + if (usage == heightStr) { + SdfPath heightLevel = + createShader(sdfData, + scopePath, + _tokens->HeightLevel, + MtlXTokens->ND_subtract_float, + "out", + {}, + { { "in1", texResultPath }, { "in2", heightLevelAttrPath } }); + + SdfPath displacementOutputPath = createShader( + sdfData, + scopePath, + _tokens->Displacement, + MtlXTokens->ND_displacement_float, + "out", + {}, + { { "displacement", heightLevel }, { "scale", heightScaleAttrPath } }); + + createShaderOutput(sdfData, + materialPath, + "mtlx:displacement", + SdfValueTypeNames->Token, + displacementOutputPath); - // Get the path of the texture attribute on the Material prim - std::string texAssetName = getTextureAssetName(usage); - SdfPath textureAssetAttrPath = inputPath(materialPath, texAssetName); - - // Create the texture reader - SdfPath texResultPath = bindTexture(sdfData, - scopePath, - bindInfo, - uvOutputPath, - textureAssetAttrPath, - uAddressModePath, - vAddressModePath); - - if (isNormal(usage)) { - // Route normal map through a normal map node - // TODO: We need to make sure we can handle DirectX and OpenGL style normal - // maps. By default we can assume DirectX style maps, but we have a setup that - // uses scale and bias for the other networks to control how the texture maps - // are decoded to support both. - SdfPath wsNormalPath = createShader(sdfData, - scopePath, - _tokens->WsNormal, - MtlXTokens->ND_normalmap, - "out", - {}, - { { "in", texResultPath } }); - - inputConnections.emplace_back(bindInfo.name.GetString(), wsNormalPath); } else { inputConnections.emplace_back(bindInfo.name.GetString(), texResultPath); } @@ -306,9 +354,9 @@ addUsdOpenPbrShaderImpl(SdfAbstractData* sdfData, if (usage == "emissive") { // The luminance should be part of of the `scale` or `value` of the // emission_color input texture reader, but that is missing. - // Still we need to turn emission on by setting the luminance to 1.0, + // Still we need to turn emission on by setting the luminance to 1000.0, // otherwise emission is turned off. - inputValues.emplace_back(OpenPbrTokens->emission_luminance, 1.0f); + inputValues.emplace_back(OpenPbrTokens->emission_luminance, 1000.0f); } } } @@ -341,35 +389,21 @@ addUsdOpenPbrShaderImpl(SdfAbstractData* sdfData, createShaderOutput( sdfData, materialPath, "mtlx:surface", SdfValueTypeNames->Token, surfaceOutputPath); -// TODO: add support to map the "height" usage to the displacement -// We should check for "height" usage and then create the corresponding `texResultPath` and connect -// it here. We might want to look for uniform heightLevel and heightScale to remap the height into -// the right range. -#if 0 - SdfPath displacementOutputPath = createShader(sdfData, - scopePath, - _tokens->Displacement, - MtlXTokens->ND_displacement_float, - "out", - { { "scale", 1.0f } }, - { { "displacement", heightResultPath } }); - - createShaderOutput( - sdfData, materialPath, "mtlx:displacement", SdfValueTypeNames->Token, displacementOutputPath); -#endif - return true; } -} + +} // namespace namespace adobe::usd::sbsar { bool addOpenPbrShader(SdfAbstractData* sdfData, const SdfPath& materialPath, - const SubstanceAir::GraphDesc& graphDesc) + const SubstanceAir::GraphDesc& graphDesc, + const NormalFormat& initialNormalFormat) { - return addUsdOpenPbrShaderImpl(sdfData, materialPath, graphDesc, _materialMapBindings); + return addUsdOpenPbrShaderImpl( + sdfData, materialPath, graphDesc, _materialMapBindings, initialNormalFormat); } } diff --git a/sbsar/src/usdGeneration/sbsarOpenPBR.h b/sbsar/src/usdGeneration/sbsarOpenPBR.h index af4a17e8..ce5f6372 100644 --- a/sbsar/src/usdGeneration/sbsarOpenPBR.h +++ b/sbsar/src/usdGeneration/sbsarOpenPBR.h @@ -16,6 +16,8 @@ governing permissions and limitations under the License. #include +#include "usdGenerationHelpers.h" + namespace adobe::usd::sbsar { /// @brief Adds an OpenPBR/MaterialX material network to the material @@ -30,6 +32,7 @@ namespace adobe::usd::sbsar { bool addOpenPbrShader(PXR_NS::SdfAbstractData* sdfData, const PXR_NS::SdfPath& materialPath, - const SubstanceAir::GraphDesc& graphDesc); + const SubstanceAir::GraphDesc& graphDesc, + const NormalFormat& initialNormalFormat); } diff --git a/sbsar/src/usdGeneration/sbsarSymbolMapper.h b/sbsar/src/usdGeneration/sbsarSymbolMapper.h index 259f0b72..8fdcf597 100644 --- a/sbsar/src/usdGeneration/sbsarSymbolMapper.h +++ b/sbsar/src/usdGeneration/sbsarSymbolMapper.h @@ -30,7 +30,7 @@ struct MappedSymbol /// @details Guarantees the same Usd Symbol doesn't occur multiple times in the same mapper. class SymbolMapper { - public: +public: SymbolMapper(); virtual ~SymbolMapper(); @@ -43,7 +43,7 @@ class SymbolMapper /// @return The mapped symbol. MappedSymbol GetSymbol(const std::string& substanceSymbol); - private: +private: // Existing mappings std::map mapped_symbols; diff --git a/sbsar/src/usdGeneration/usdGenerationHelpers.cpp b/sbsar/src/usdGeneration/usdGenerationHelpers.cpp index 3456864f..39927b71 100644 --- a/sbsar/src/usdGeneration/usdGenerationHelpers.cpp +++ b/sbsar/src/usdGeneration/usdGenerationHelpers.cpp @@ -95,6 +95,11 @@ const std::vector uniform_usages = { "IOR", const std::vector normal_usages = { "normal", "coatNormal" }; +const std::unordered_set color_usages = { "absorptionColor", "baseColor", + "coatColor", "emissive", + "scatteringColor", "scatteringDistanceScale", + "sheenColor", "specularEdgeColor" }; + const std::map reserved_label_map = { { "$time", "Time" }, { "$outputsize", "Output Size" }, { "$randomseed", "Random Seed" }, @@ -215,6 +220,7 @@ const std::map default_channels = { const std::vector default_resolutions = { 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 }; const std::string uv_scale_input("uvscale"); +const std::string uv_scale_inverse_input("uvscaleinverse"); const std::string uv_rotation_input("uvrotation"); const std::string uv_translation_input("uvtranslation"); @@ -262,6 +268,50 @@ guessGraphType(const SubstanceAir::GraphDesc& graphDesc) return GraphType::Unknown; } +std::string +graphTypeToString(GraphType type) +{ + switch (type) { + case GraphType::Material: + return "material"; + case GraphType::Light: + return "light/environment"; + case GraphType::Unknown: + return "unknown"; + } + return "unknown"; +} + +std::string +describeGraphTypes(const std::vector& types) +{ + std::map counts; + for (GraphType type : types) { + counts[type]++; + } + + std::vector parts; + if (counts[GraphType::Material] > 0) { + parts.push_back(std::to_string(counts[GraphType::Material]) + " material graph(s)"); + } + if (counts[GraphType::Light] > 0) { + parts.push_back(std::to_string(counts[GraphType::Light]) + " light graph(s)"); + } + if (counts[GraphType::Unknown] > 0) { + parts.push_back(std::to_string(counts[GraphType::Unknown]) + " unknown graph(s)"); + } + + if (parts.empty()) { + return "no graphs"; + } + + std::string result = parts[0]; + for (size_t i = 1; i < parts.size(); ++i) { + result += ", " + parts[i]; + } + return result; +} + std::pair getDefaultValueNames(const std::string& channelName) { @@ -314,6 +364,12 @@ isNormal(const std::string& usage) return false; } +bool +isColorUsage(const std::string& usage) +{ + return color_usages.find(usage) != color_usages.end(); +} + JsValue convertSbsarParameters(const VtDictionary& sbsarParameters) { @@ -801,7 +857,7 @@ setupProceduralParameters(SdfAbstractData* sdfData, TfToken paramToken = getInputParamToken(symbolMapper, input->mIdentifier); SdfPath paramPath = createAttributeSpec(sdfData, primPath, paramToken, targetType); - setAttributeDefaultValue(sdfData, paramPath, defaultValue); + setAttributeDefaultValue(sdfData, paramPath, defaultValue, targetType); setAttributeMetadata(sdfData, paramPath, SdfFieldKeys->Custom, VtValue(true)); bool isHidden = @@ -857,8 +913,11 @@ convertStringToVtValue(const SubstanceAir::string& val_str) SrcType value; stringstream sstr(val_str); sstr >> value; - if constexpr (std::is_same_v || std::is_same_v || - std::is_same_v) + + if constexpr (std::is_same_v || + std::is_same_v) + return VtValue(std::string(val_str.data(), val_str.size())); + else if constexpr (std::is_same_v || std::is_same_v) return VtValue(value); else return VtValue(DstType(&value.x)); @@ -968,7 +1027,7 @@ addPresetVariant(SdfAbstractData* sdfData, TfToken paramToken = getInputParamToken(symbolMapper, val.mIdentifier); SdfPath paramPath = createAttributeSpec(sdfData, presetVariantPath, paramToken, targetType); - setAttributeDefaultValue(sdfData, paramPath, targetValue); + setAttributeDefaultValue(sdfData, paramPath, targetValue, targetType); setAttributeMetadata(sdfData, paramPath, SdfFieldKeys->Custom, VtValue(true)); } @@ -998,7 +1057,7 @@ addResolutionVariantSet(SdfAbstractData* sdfData, const TfToken paramToken = getInputParamToken(symbolMapper, std::string("$outputsize")); SdfPath paramPath = createAttributeSpec(sdfData, resVariantPath, paramToken, SdfValueTypeNames->Int2); - setAttributeDefaultValue(sdfData, paramPath, GfVec2i(xres, yres)); + setAttributeDefaultValue(sdfData, paramPath, GfVec2i(xres, yres), SdfValueTypeNames->Int2); setAttributeMetadata(sdfData, paramPath, SdfFieldKeys->Custom, VtValue(true)); addPresetVariant( diff --git a/sbsar/src/usdGeneration/usdGenerationHelpers.h b/sbsar/src/usdGeneration/usdGenerationHelpers.h index 47f2f535..8fe3a3f3 100644 --- a/sbsar/src/usdGeneration/usdGenerationHelpers.h +++ b/sbsar/src/usdGeneration/usdGenerationHelpers.h @@ -55,6 +55,11 @@ extern const std::map default_channels; /// Input parameter name for UV scale transformation extern const std::string uv_scale_input; +/// Input parameter name for UV scale inverse transformation. This parameter is only used for +/// OpenPBR networks since the Place2D works differently than used in the other ASM and +/// UsdPreviewSurface networks. +extern const std::string uv_scale_inverse_input; + /// Input parameter name for UV rotation transformation extern const std::string uv_rotation_input; @@ -97,6 +102,18 @@ enum class GraphType GraphType guessGraphType(const SubstanceAir::GraphDesc& graphDesc); +/// @brief Convert GraphType enum to string representation. +/// @param type GraphType to convert +/// @return String representation ("material", "light/environment", or "unknown") +USDSBSAR_API std::string +graphTypeToString(GraphType type); + +/// @brief Generate a human-readable description of a collection of graph types. +/// @param types Vector of GraphType values to describe +/// @return String like "2 material graph(s), 1 light graph(s)" +USDSBSAR_API std::string +describeGraphTypes(const std::vector& types); + /// @brief Get the default value attribute names for a given channel. /// @param channelName Name of the texture channel /// @return Pair of strings representing the default value attribute name and the texture influence @@ -124,12 +141,20 @@ hasUsage(const std::string& usage, const SubstanceAir::GraphDesc& graphDesc); bool hasInput(const std::string& identifier, const SubstanceAir::GraphDesc& graphDesc); -/// @brief Determine if a usage string represents a normal map. +/// @brief Determine if a usage string represents a normal map /// @param usage Usage string to check /// @return True if the usage represents a normal map bool isNormal(const std::string& usage); +/// @brief Determine if a usage string represents a color output +/// @param usage Usage string to check +/// @return True if the usage represents a color +/// +/// This is useful to choose the right color space +bool +isColorUsage(const std::string& usage); + /// @brief Convert SBSAR parameters from VtDictionary to JsValue format. /// @param sbsarParmeters Dictionary of SBSAR parameters to convert /// @return JsValue containing the converted parameters diff --git a/sbsar/test/test_sbsarConfig.cpp b/sbsar/test/test_sbsarConfig.cpp index 7cc00b3e..e7729fd4 100644 --- a/sbsar/test/test_sbsarConfig.cpp +++ b/sbsar/test/test_sbsarConfig.cpp @@ -19,7 +19,7 @@ using namespace adobe::usd::sbsar; class SbsarConfigFixure : public ::testing::Test { - protected: +protected: virtual void SetUp() {} virtual void TearDown() { PXR_NS::getSbsarConfig()->init(); } }; @@ -29,9 +29,9 @@ TEST(SbsarConfig, getCacheSize) PXR_NS::SbsarConfigRefPtr sbsarConfig = PXR_NS::getSbsarConfig(); ASSERT_TRUE(sbsarConfig); - EXPECT_EQ(sbsarConfig->getAssetCacheSize(), 1'000'000'000); - EXPECT_EQ(sbsarConfig->getInputImageCacheSize(), 1'000'000'000); - EXPECT_EQ(sbsarConfig->getPackageCacheSize(), 10); + EXPECT_EQ(sbsarConfig->getAssetCacheSize(), 2'000'000'000); // 2GB for high-res support + EXPECT_EQ(sbsarConfig->getInputImageCacheSize(), 1'000'000'000); // 1GB + EXPECT_EQ(sbsarConfig->getPackageCacheSize(), 10); // 10 packages } TEST_F(SbsarConfigFixure, setAssetCacheSize) diff --git a/scripts/requirements.in b/scripts/requirements.in new file mode 100644 index 00000000..1a11f9ab --- /dev/null +++ b/scripts/requirements.in @@ -0,0 +1,8 @@ +# Use this file to generate the frozen requirements in requirements.txt +# uv pip compile --emit-index-url --python 3.10 --universal requirements.in -o requirements.txt +# Pick the latest manylinux_2_28_x86_64 pyside6 wheel that is compatible with glibc 2.28 on RHEL8 +pyside6==6.9.3 +pyopengl +pytest +opencv-python +numpy diff --git a/scripts/requirements.txt b/scripts/requirements.txt index 703146d5..8a58aff2 100644 --- a/scripts/requirements.txt +++ b/scripts/requirements.txt @@ -1,5 +1,47 @@ -pyside6 -pyopengl -pytest -opencv-python -numpy \ No newline at end of file +# This file was autogenerated by uv via the following command: +# uv pip compile --emit-index-url --python 3.10 --universal requirements.in -o requirements.txt +--index-url https://pypi.org/simple + +colorama==0.4.6 ; sys_platform == 'win32' + # via pytest +exceptiongroup==1.3.0 ; python_full_version < '3.11' + # via pytest +iniconfig==2.3.0 + # via pytest +numpy==2.2.6 ; python_full_version < '3.11' + # via + # -r requirements.in + # opencv-python +numpy==2.3.4 ; python_full_version >= '3.11' + # via + # -r requirements.in + # opencv-python +opencv-python==4.11.0.86 + # via -r requirements.in +packaging==25.0 + # via pytest +pluggy==1.6.0 + # via pytest +pygments==2.19.2 + # via pytest +pyopengl==3.1.10 + # via -r requirements.in +pyside6==6.9.3 + # via -r requirements.in +pyside6-addons==6.9.3 + # via pyside6 +pyside6-essentials==6.9.3 + # via + # pyside6 + # pyside6-addons +pytest==8.4.2 + # via -r requirements.in +shiboken6==6.9.3 + # via + # pyside6 + # pyside6-addons + # pyside6-essentials +tomli==2.3.0 ; python_full_version < '3.11' + # via pytest +typing-extensions==4.15.0 ; python_full_version < '3.11' + # via exceptiongroup diff --git a/spz/src/CMakeLists.txt b/spz/src/CMakeLists.txt index 55f428fe..f8c69977 100644 --- a/spz/src/CMakeLists.txt +++ b/spz/src/CMakeLists.txt @@ -18,6 +18,7 @@ PRIVATE target_include_directories(usdSpz PRIVATE + "${CMAKE_CURRENT_SOURCE_DIR}" "${PROJECT_BINARY_DIR}" ) @@ -34,65 +35,6 @@ PRIVATE fileformatUtils ) -target_precompile_headers(usdSpz -PRIVATE - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" -) - # Installation of plugin files mimics the file structure that USD has for plugins, # so it is easy to deploy it in a pre-existing USD build, if one chooses to do so. @@ -107,17 +49,19 @@ set_target_properties(usdSpz PROPERTIES RESOURCE ${CMAKE_CURRENT_BINARY_DIR}/plu set_target_properties(usdSpz PROPERTIES RESOURCE_FILES "${CMAKE_CURRENT_BINARY_DIR}/plugInfo.json:plugInfo.json") +# USDSPZ_DESTINATION is set in the parent scope by the add_usd_fileformat macro + if(USDSPZ_ENABLE_INSTALL) install( TARGETS usdSpz - RUNTIME DESTINATION plugin/usd COMPONENT Runtime - LIBRARY DESTINATION plugin/usd COMPONENT Runtime - RESOURCE DESTINATION plugin/usd/usdSpz/resources COMPONENT Runtime + RUNTIME DESTINATION ${USDSPZ_DESTINATION} COMPONENT Runtime + LIBRARY DESTINATION ${USDSPZ_DESTINATION} COMPONENT Runtime + RESOURCE DESTINATION ${USDSPZ_DESTINATION}/usdSpz/resources COMPONENT Runtime ) install( FILES plugInfo.root.json - DESTINATION plugin/usd + DESTINATION ${USDSPZ_DESTINATION} RENAME plugInfo.json COMPONENT Runtime ) diff --git a/spz/src/api.h b/spz/src/api.h index 163eb236..77046219 100644 --- a/spz/src/api.h +++ b/spz/src/api.h @@ -14,19 +14,19 @@ governing permissions and limitations under the License. #include "pxr/base/arch/export.h" #if defined(PXR_STATIC) -# define USDSPZ_API -# define USDSPZ_API_TEMPLATE_CLASS(...) -# define USDSPZ_API_TEMPLATE_STRUCT(...) -# define USDSPZ_LOCAL +#define USDSPZ_API +#define USDSPZ_API_TEMPLATE_CLASS(...) +#define USDSPZ_API_TEMPLATE_STRUCT(...) +#define USDSPZ_LOCAL #else -# if defined(USDSPZ_EXPORTS) -# define USDSPZ_API ARCH_EXPORT -# define USDSPZ_API_TEMPLATE_CLASS(...) ARCH_EXPORT_TEMPLATE(class, __VA_ARGS__) -# define USDSPZ_API_TEMPLATE_STRUCT(...) ARCH_EXPORT_TEMPLATE(struct, __VA_ARGS__) -# else -# define USDSPZ_API ARCH_IMPORT -# define USDSPZ_API_TEMPLATE_CLASS(...) ARCH_IMPORT_TEMPLATE(class, __VA_ARGS__) -# define USDSPZ_API_TEMPLATE_STRUCT(...) ARCH_IMPORT_TEMPLATE(struct, __VA_ARGS__) -# endif -# define USDSPZ_LOCAL ARCH_HIDDEN +#if defined(USDSPZ_EXPORTS) +#define USDSPZ_API ARCH_EXPORT +#define USDSPZ_API_TEMPLATE_CLASS(...) ARCH_EXPORT_TEMPLATE(class, __VA_ARGS__) +#define USDSPZ_API_TEMPLATE_STRUCT(...) ARCH_EXPORT_TEMPLATE(struct, __VA_ARGS__) +#else +#define USDSPZ_API ARCH_IMPORT +#define USDSPZ_API_TEMPLATE_CLASS(...) ARCH_IMPORT_TEMPLATE(class, __VA_ARGS__) +#define USDSPZ_API_TEMPLATE_STRUCT(...) ARCH_IMPORT_TEMPLATE(struct, __VA_ARGS__) +#endif +#define USDSPZ_LOCAL ARCH_HIDDEN #endif \ No newline at end of file diff --git a/spz/src/fileFormat.cpp b/spz/src/fileFormat.cpp index daa61259..9309f944 100644 --- a/spz/src/fileFormat.cpp +++ b/spz/src/fileFormat.cpp @@ -23,7 +23,6 @@ governing permissions and limitations under the License. #include #include -#include using namespace adobe::usd; using namespace spz; @@ -169,14 +168,16 @@ UsdSpzFileFormat::WriteToString(const SdfLayer& layer, const std::string& comment) const { // Write USD as SPZ: Defer to the usda file format for now. - return SdfFileFormat::FindById(UsdUsdaFileFormatTokens->Id)->WriteToString(layer, str, comment); + return SdfFileFormat::FindById(FileFormatsUsdaFileFormatTokensId) + ->WriteToString(layer, str, comment); } bool UsdSpzFileFormat::WriteToStream(const SdfSpecHandle& spec, std::ostream& out, size_t indent) const { // Write USD as SPZ: Defer to the usda file format for now. - return SdfFileFormat::FindById(UsdUsdaFileFormatTokens->Id)->WriteToStream(spec, out, indent); + return SdfFileFormat::FindById(FileFormatsUsdaFileFormatTokensId) + ->WriteToStream(spec, out, indent); } PXR_NAMESPACE_CLOSE_SCOPE diff --git a/spz/src/fileFormat.h b/spz/src/fileFormat.h index f201e4bb..3a879e40 100644 --- a/spz/src/fileFormat.h +++ b/spz/src/fileFormat.h @@ -11,8 +11,8 @@ governing permissions and limitations under the License. */ #pragma once #include "api.h" -#include #include +#include #include #include #include @@ -38,7 +38,7 @@ TF_DECLARE_WEAK_AND_REF_PTRS(UsdSpzFileFormat); /// \brief SdfData specialization for working with spz files. class SpzData : public FileFormatDataBase { - public: +public: bool gsplatsWithZup = false; PXR_NS::VtFloatArray gsplatsClippingBox = { -2.0, -2.0, -2.0, 2.0, 2.0, 2.0 }; static SpzDataRefPtr InitData(const SdfFileFormat::FileFormatArguments& args); @@ -50,7 +50,7 @@ class USDSPZ_API UsdSpzFileFormat : public SdfFileFormat , public PcpDynamicFileFormatInterface { - public: +public: friend class SpzData; virtual SdfAbstractDataRefPtr InitData(const FileFormatArguments& args) const override; @@ -88,7 +88,7 @@ class USDSPZ_API UsdSpzFileFormat std::string* str, const std::string& comment = std::string()) const override; - protected: +protected: static const TfToken gsplatsWithZupToken; static const TfToken gsplatsWithClippingToken; @@ -96,7 +96,7 @@ class USDSPZ_API UsdSpzFileFormat virtual ~UsdSpzFileFormat(); UsdSpzFileFormat(); - private: +private: bool ReadFromStream(SdfLayer* layer, std::istream& input, bool metadataOnly, diff --git a/spz/src/spzExport.cpp b/spz/src/spzExport.cpp index 59eb5fbb..0fbbc2c6 100644 --- a/spz/src/spzExport.cpp +++ b/spz/src/spzExport.cpp @@ -11,44 +11,15 @@ governing permissions and limitations under the License. */ #include "spzExport.h" #include "debugCodes.h" +#include +#include #include #include #include #include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include #include -#include -#include -#include -#include -#include -#include -#include using namespace PXR_NS; @@ -85,9 +56,7 @@ findMaxSHCoeffSize(const UsdData& usd, int nodeIndex) } void -aggregateMeshInstance(SpzTotalMesh& totalMesh, - const Mesh& mesh, - const GfMatrix4d& modelMatrix) +aggregateMeshInstance(SpzTotalMesh& totalMesh, const Mesh& mesh, const GfMatrix4d& modelMatrix) { size_t currentMeshPointsSize = mesh.points.size(); size_t offset = totalMesh.points.size(); @@ -99,7 +68,8 @@ aggregateMeshInstance(SpzTotalMesh& totalMesh, totalMesh.points[offset + i] = GfVec3f(modelMatrix.Transform(mesh.points[i])); } - const size_t numPointOpacities = std::min(currentMeshPointsSize, mesh.opacities[0].values.size()); + const size_t numPointOpacities = + std::min(currentMeshPointsSize, mesh.opacities[0].values.size()); memcpy(totalMesh.opacity.data() + offset, mesh.opacities[0].values.data(), numPointOpacities * sizeof(mesh.opacities[0].values[0])); @@ -139,17 +109,16 @@ traverseNodesAndAggregateMeshes(const UsdData& usd, { const Node& node = usd.nodes[nodeIndex]; GfMatrix4d modelMatrix = node.worldTransform * correctionTransform; - + for (int meshIndex : node.staticMeshes) { const Mesh& mesh = usd.meshes[meshIndex]; if (!mesh.asGsplats) continue; aggregateMeshInstance(totalMesh, mesh, modelMatrix); } - + for (size_t i = 0; i < node.children.size(); ++i) { - traverseNodesAndAggregateMeshes( - usd, totalMesh, correctionTransform, node.children[i]); + traverseNodesAndAggregateMeshes(usd, totalMesh, correctionTransform, node.children[i]); } } @@ -189,7 +158,8 @@ exportSpz(const UsdData& usd, spz::GaussianCloud& gaussianCloud) std::size_t numGsplatsSHCoeffs = 0; for (size_t i = 0; i < usd.rootNodes.size(); ++i) { - numGsplatsSHCoeffs = std::max(numGsplatsSHCoeffs, findMaxSHCoeffSize(usd, usd.rootNodes[i])); + numGsplatsSHCoeffs = + std::max(numGsplatsSHCoeffs, findMaxSHCoeffSize(usd, usd.rootNodes[i])); } // We only store SH coefficients up to the degree with complete bands (i.e., 0, 9, 24, or 45 @@ -201,8 +171,7 @@ exportSpz(const UsdData& usd, spz::GaussianCloud& gaussianCloud) totalMesh.shCoeffs.resize(numGsplatsSHCoeffs); for (size_t i = 0; i < usd.rootNodes.size(); ++i) { - traverseNodesAndAggregateMeshes( - usd, totalMesh, correctionTransform, usd.rootNodes[i]); + traverseNodesAndAggregateMeshes(usd, totalMesh, correctionTransform, usd.rootNodes[i]); } gaussianCloud.numPoints = totalMesh.points.size(); diff --git a/spz/src/spzExport.h b/spz/src/spzExport.h index 30fd7434..62265bdf 100644 --- a/spz/src/spzExport.h +++ b/spz/src/spzExport.h @@ -10,8 +10,8 @@ OF ANY KIND, either express or implied. See the License for the specific languag governing permissions and limitations under the License. */ #pragma once -#include #include +#include namespace adobe::usd { diff --git a/spz/src/spzImport.cpp b/spz/src/spzImport.cpp index cac3a641..b6717c04 100644 --- a/spz/src/spzImport.cpp +++ b/spz/src/spzImport.cpp @@ -13,27 +13,17 @@ governing permissions and limitations under the License. #include "debugCodes.h" #include #include +#include +#include #include #include #include #include #include -#include -#include #include -#include -#include -#include -#include #include -#include #include -#include -#include -#include -#include -#include -#include +#include using namespace PXR_NS; using namespace spz; @@ -125,7 +115,7 @@ importSpz(const ImportSpzOptions& options, const spz::GaussianCloud& gaussianClo // we need to convert it to a column-major order that we // use for USD. // Also, SPZ stores SH coefficients in an Array-of-Structs (AoS) format, - // packing the SH coefficients for each point together, while USD expects + // packing the SH coefficients for each point together, while USD expects // a Struct-of-Arrays (SoA) format, packing one coefficient for all points together. const size_t spzShIndex = shRowIndex * 3 + shColIndex; for (size_t i = 0; i < shCoeffs.values.size(); i++) { diff --git a/spz/src/spzImport.h b/spz/src/spzImport.h index e4dc8d63..5ac0dcbc 100644 --- a/spz/src/spzImport.h +++ b/spz/src/spzImport.h @@ -10,8 +10,8 @@ OF ANY KIND, either express or implied. See the License for the specific languag governing permissions and limitations under the License. */ #pragma once -#include #include +#include namespace adobe::usd { diff --git a/stl/src/CMakeLists.txt b/stl/src/CMakeLists.txt index bcda4d0e..38f603de 100644 --- a/stl/src/CMakeLists.txt +++ b/stl/src/CMakeLists.txt @@ -20,6 +20,7 @@ PRIVATE target_include_directories(usdStl PRIVATE + "${CMAKE_CURRENT_SOURCE_DIR}" "${PROJECT_BINARY_DIR}" ) @@ -37,66 +38,6 @@ PRIVATE fileformatUtils ) -target_precompile_headers(usdStl -PRIVATE - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" -) - # Installation of plugin files mimics the file structure that USD has for plugins, # so it is easy to deploy it in a pre-existing USD build, if one chooses to do so. @@ -111,17 +52,19 @@ set_target_properties(usdStl PROPERTIES RESOURCE ${CMAKE_CURRENT_BINARY_DIR}/plu set_target_properties(usdStl PROPERTIES RESOURCE_FILES "${CMAKE_CURRENT_BINARY_DIR}/plugInfo.json:plugInfo.json") +# USDSTL_DESTINATION is set in the parent scope by the add_usd_fileformat macro + if(USDSTL_ENABLE_INSTALL) install( TARGETS usdStl - RUNTIME DESTINATION plugin/usd COMPONENT Runtime - LIBRARY DESTINATION plugin/usd COMPONENT Runtime - RESOURCE DESTINATION plugin/usd/usdStl/resources COMPONENT Runtime + RUNTIME DESTINATION ${USDSTL_DESTINATION} COMPONENT Runtime + LIBRARY DESTINATION ${USDSTL_DESTINATION} COMPONENT Runtime + RESOURCE DESTINATION ${USDSTL_DESTINATION}/usdStl/resources COMPONENT Runtime ) install( FILES plugInfo.root.json - DESTINATION plugin/usd + DESTINATION ${USDSTL_DESTINATION} RENAME plugInfo.json COMPONENT Runtime ) diff --git a/stl/src/api.h b/stl/src/api.h index d29c3b17..301c37bb 100644 --- a/stl/src/api.h +++ b/stl/src/api.h @@ -14,19 +14,19 @@ governing permissions and limitations under the License. #include "pxr/base/arch/export.h" #if defined(PXR_STATIC) -# define USDSTL_API -# define USDSTL_API_TEMPLATE_CLASS(...) -# define USDSTL_API_TEMPLATE_STRUCT(...) -# define USDSTL_LOCAL +#define USDSTL_API +#define USDSTL_API_TEMPLATE_CLASS(...) +#define USDSTL_API_TEMPLATE_STRUCT(...) +#define USDSTL_LOCAL #else -# if defined(USDSTL_EXPORTS) -# define USDSTL_API ARCH_EXPORT -# define USDSTL_API_TEMPLATE_CLASS(...) ARCH_EXPORT_TEMPLATE(class, __VA_ARGS__) -# define USDSTL_API_TEMPLATE_STRUCT(...) ARCH_EXPORT_TEMPLATE(struct, __VA_ARGS__) -# else -# define USDSTL_API ARCH_IMPORT -# define USDSTL_API_TEMPLATE_CLASS(...) ARCH_IMPORT_TEMPLATE(class, __VA_ARGS__) -# define USDSTL_API_TEMPLATE_STRUCT(...) ARCH_IMPORT_TEMPLATE(struct, __VA_ARGS__) -# endif -# define USDSTL_LOCAL ARCH_HIDDEN +#if defined(USDSTL_EXPORTS) +#define USDSTL_API ARCH_EXPORT +#define USDSTL_API_TEMPLATE_CLASS(...) ARCH_EXPORT_TEMPLATE(class, __VA_ARGS__) +#define USDSTL_API_TEMPLATE_STRUCT(...) ARCH_EXPORT_TEMPLATE(struct, __VA_ARGS__) +#else +#define USDSTL_API ARCH_IMPORT +#define USDSTL_API_TEMPLATE_CLASS(...) ARCH_IMPORT_TEMPLATE(class, __VA_ARGS__) +#define USDSTL_API_TEMPLATE_STRUCT(...) ARCH_IMPORT_TEMPLATE(struct, __VA_ARGS__) +#endif +#define USDSTL_LOCAL ARCH_HIDDEN #endif \ No newline at end of file diff --git a/stl/src/fileFormat.cpp b/stl/src/fileFormat.cpp index b6f246ae..6549a1c3 100644 --- a/stl/src/fileFormat.cpp +++ b/stl/src/fileFormat.cpp @@ -20,7 +20,6 @@ governing permissions and limitations under the License. #include #include -#include #include PXR_NAMESPACE_OPEN_SCOPE @@ -122,14 +121,16 @@ UsdStlFileFormat::WriteToString(const SdfLayer& layer, const std::string& comment) const { // Write USD as SBSM: Defer to the usda file format for now. - return SdfFileFormat::FindById(UsdUsdaFileFormatTokens->Id)->WriteToString(layer, str, comment); + return SdfFileFormat::FindById(FileFormatsUsdaFileFormatTokensId) + ->WriteToString(layer, str, comment); } bool UsdStlFileFormat::WriteToStream(const SdfSpecHandle& spec, std::ostream& out, size_t indent) const { // Write USD as SBSM: Defer to the usda file format for now. - return SdfFileFormat::FindById(UsdUsdaFileFormatTokens->Id)->WriteToStream(spec, out, indent); + return SdfFileFormat::FindById(FileFormatsUsdaFileFormatTokensId) + ->WriteToStream(spec, out, indent); } PXR_NAMESPACE_CLOSE_SCOPE diff --git a/stl/src/fileFormat.h b/stl/src/fileFormat.h index a7cb90f4..ae34f99d 100644 --- a/stl/src/fileFormat.h +++ b/stl/src/fileFormat.h @@ -11,8 +11,8 @@ governing permissions and limitations under the License. */ #pragma once #include "api.h" -#include #include +#include #include #include #include @@ -29,7 +29,7 @@ TF_DECLARE_WEAK_AND_REF_PTRS(UsdStlFileFormat); /// \brief SdfFileFormat specialization for working with stl files. class USDSTL_API UsdStlFileFormat : public SdfFileFormat { - public: +public: virtual bool CanRead(const std::string& file) const override; virtual bool Read(SdfLayer* layer, @@ -52,12 +52,12 @@ class USDSTL_API UsdStlFileFormat : public SdfFileFormat std::string* str, const std::string& comment = std::string()) const override; - protected: +protected: SDF_FILE_FORMAT_FACTORY_ACCESS; virtual ~UsdStlFileFormat(); UsdStlFileFormat(); - private: +private: }; PXR_NAMESPACE_CLOSE_SCOPE diff --git a/stl/src/stlExport.h b/stl/src/stlExport.h index b95f2aa3..38ce8926 100644 --- a/stl/src/stlExport.h +++ b/stl/src/stlExport.h @@ -25,7 +25,6 @@ struct ExportStlOptions StlFormat readStlExportFormat(const UsdData& data); - /// \ingroup usdstl /// \brief Export USD data to a stl model. bool diff --git a/stl/src/stlImport.cpp b/stl/src/stlImport.cpp index 33c7db9e..34094b59 100644 --- a/stl/src/stlImport.cpp +++ b/stl/src/stlImport.cpp @@ -13,24 +13,8 @@ governing permissions and limitations under the License. #include "stlModel.h" #include -#include #include -#include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include using namespace PXR_NS; using namespace adobe; diff --git a/stl/src/stlImport.h b/stl/src/stlImport.h index 877d0d91..561e1f63 100644 --- a/stl/src/stlImport.h +++ b/stl/src/stlImport.h @@ -19,7 +19,6 @@ using namespace adobe::usd; namespace usdStl { - /// \ingroup usdstl /// \brief Import stl data into a USD data cache. bool diff --git a/stl/src/stlModel.cpp b/stl/src/stlModel.cpp index 497ff46d..c85865d4 100644 --- a/stl/src/stlModel.cpp +++ b/stl/src/stlModel.cpp @@ -15,6 +15,7 @@ governing permissions and limitations under the License. #include #include #include +#include using namespace PXR_NS; diff --git a/stl/src/stlModel.h b/stl/src/stlModel.h index 9c9dd713..0cd273a2 100644 --- a/stl/src/stlModel.h +++ b/stl/src/stlModel.h @@ -10,6 +10,7 @@ OF ANY KIND, either express or implied. See the License for the specific languag governing permissions and limitations under the License. */ #pragma once +#include #include #include #include @@ -57,8 +58,7 @@ struct StlVec3f : x(_x) , y(_y) , z(_z) - { - } + {} }; struct StlFacet @@ -69,10 +69,10 @@ struct StlFacet class StlModel { - private: +private: std::vector facets; - public: +public: void AddFacet(StlFacet facet); StlFacet GetFacet(int facetIndex) const; int FacetCount() const; diff --git a/test/baseline/Darwin/fbx/Megaphone_01_Lowpoly.jpg b/test/baseline/Darwin/fbx/Megaphone_01_Lowpoly.jpg index f53b46a868963546800e5052a70983c3f48694ef..ebda7b534640204797b3a7c4e92d2ee7699266f4 100644 GIT binary patch literal 123844 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 literal 120541 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

9RGWWf2w)z$A2%Ng{sbnt$Bx%7 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 Rw^Q-ARa^hMzUd#Q{{hKB&7S}O diff --git a/test/baseline/Darwin/fbx/SimpleRobotwithUdims.jpg b/test/baseline/Darwin/fbx/SimpleRobotwithUdims.jpg index 447847203825fd6bf95590dfb6c41bd2636887cb..a9db21d4f600ad2e9ac168a78a24f62fd84309a5 100644 GIT binary patch literal 84272 zcmeFZ2UJsCw=TRxz)%e!(jiC@lqN_~S}4*)1W{^0L{yrHNDESeC?FtRKv9Ym0cp|^ zkX{6&Hvws(Nl&N&LUOn7`+jBIaqmCw_{TlxeBb$h9GF3N$zE&C`OIfNbFPqokY@nK zt6I8R00aU65bz&Bo&a8efBhH#kQ)FdYKmHD0~EppP%uHDOb~JlBprN4sz09$`0EEk z0i~om0i&j&rDFsrAW$d;C6tPak`g@A4?G4?GEp&~ky1Nx>V^%B-<3uBS z(?s-BGBz%%0x+ZM(PB!+6|bE>nVQeXVfg}F&~N>X#_4B;ZEOu(of4OC^IXB|2?EX zM)ZF+puqoEBl`P*{yrY^I6x1DfC~m?0+0Y1Kpp}jKpI5=?SK9Y^zh_L z;|5E5MF#G{4@|R3wDM%Yj&0WZm)Huvl>V4)C|bHEPFT27=Y2Jr>>ugMwYY(m;G9Qq{2)@jtD-v zS5<@8bDEN`O)|HwG&yU)Y~XtO6P9X%Dp1Xd&byahZBrt}5Z;FfsmB=@j14y3&{4XK zE1j7Rp;|!|rYj+FE{ztJiP&$~Dy*HqR8)lNwN)HlTR%0K*~?K?^`r4)%n#^_3!K!E zdeSzQ!?tqJdBgBCD%^nnmuFAS@auzzpJhVd{K&YgQOgQja882`i(~FtL-l$0h90nU z%xMiE^I-+R9VcW-)U)(3`;=e3r!uq!jeb=twhKNvXByGhU>q|Pf1fW88c6+(kCz5( z{iADEXe~;4I;0liqmZFNKS}~{lk>$bh3ni8bouG~Gj!IA=^f4A=cv#3!CI^tku&kr zC7xMS-wlZj1TMfUf(&5Iah0mL%;%lZ4NLSBcHw8}gY?iBZd(s}7Fi$%x<`7LM%Fq; z%O5LAsm&-FB2B)Y(Bu#T_X-_yV`!(f`i(#7+JT!0rRIU{ctzZ193|Fs_^z&37@LA~v4w}nlT zV;;XfF}5OCncz9Y>#RxzumFY-RYZT$+A}h6ejC%MMF!U9d`15-_TNa|`ETjL&?B$o z=VV|$)K?I>D~R^mDS1w`hwfIY50$N-@0XO-I}(@clhGM9-8VF!2<48ya?w(k+vevh z{*5kP;B0`*-Q!#`@Sq#cvXxmoeXfK}OD$^v|8%NyBrYE3yd6PP{T?$R=b%GsU3(d4XFIB4TA^hB?q9)kn zr}M_c2h|lRGScnmBCrmCLY_6@{OFnwMF%6EEpm~m=2JIYGlnJKjlY;q@UG9L2h?+m znn@yAw9VfmxXuF?%fZtTYpx#5)r9Rcgpcx{qWHW~0VShR-{`pH0G6=+usXEM0yQz?E>xOPB|hIA-*8w6)OJ9cFt z2iE^REl|OL9^Yn7x*!u<&kU!Wvb@*{zUEL#8oyyCHbT< zXxVAOITlMJA)Q#@>#0PCoUgoH!Hey`WaqR9&rZpDZVP zxh&~WHi}|z-=LZV#rXBpc#NYO*Hy%89^OUhJlomjAOp%rFa_7GXT4Ztiw`FdY!FnDO|sJRAwDNw++0>=PpqeTnAx*>smJf` z&0~d>*df0f=rsda>vT*cFz=Q_3f<)DLLKL@agNf`bGjE%_mGmKNecpEv zN%a-*wJ1DnF9@%h9r+Qj8DI3WteaJt!+D`U%*>H-qAX5BaLd9{VC-j?Oo`04nu8KT z?o4UuEpfnKhp2a)q;i2Mx^0JN3zB%W^JXCyx&D=!3^@Lv3X>A;cH^d%U;KsY_@ds>Zr(4M zZp8Jv;d0TB_bUc>CiKErCxWjySgJWWahG-)$#`?~%l+t2{`^S?IGk>%|J>g0!qLvt zI+FT@uMy0YSnBx;NG+AlB(}C!)&)9r&dJ^CvWRQs4U<4SgAbjD$_BJ0Q{2(bbEd{ z?PvK9%Qk73J;$jca=Ofy_c+}>_u*y134SBNb_v=l4+mx19ITj9w9eiXfz>-qaa05& zgclp3OPXdvmUkjbR0Zx|=D2j}j_2oliaIb;+jPxGEZVL)kH3=v+2bzace51pjg(yH2kJ(p?3OAkE-yv`;=b#vnMpq7=6^4+ZuZv-Kr-+W7L^h=o$~p zVF4PmCmQ1@{Wao6ZZq3P=Q>YV+-fdKpnYui>eC@TaR0VL(;bbU)_&{L;`7U~Cm(xW z_<4~ieBSgG?`uexCBbvT6(hH$bwEg2ap>cqW4?Ozdqkz{4{m8KsfAB#`f0qbSVTwy zXGv#iXTzn&8&3BcT(^OHm7WKsJx?xNf(r8?sC`|I1N_;Ex`C+VvzL5NWBKCBZu9k* z)!0vA7d79uB((tGpsi_d(B6p}0$JDi9&`|f$->RU3zEU-Ka3zd#Ir(JrBi_0bXBjLL#om)S82! zZ9GsA)5M@}i<&&Mue+cbVbZ!GX6yZq_tvTI(_JSloAN#TU~l_iJ5EP@n9ka1+>QF9 zOVhMuU>Vs!3y_}V{Kut>|2M=3mDk5f_4n!{rprUZ7I2kKaC(WfgtL!ju3ul>bN}<-TMXBe}a$1=L!Z(Vl{gjwPs;m8K-(AeW%_?V=1eg4(yE-mYAg5e3C z_O)63^@q>Wm+!cZ-u$w;GjMDVeOG(@nsnZ3o<~^Q&~5ZawGw8gXa{`1r&jHVny7`R zKZUyO;E#yqdVyYubP9i)fu1)ijEwjg(AhBiZ1x!+UKK&*s|P~GX>?xeX!}jvgPL?S z#iHq?+kKbpDaWUR&BEd*k`M-@-bAijbm!(u$5ZhOi{G{x;pKG*e-IkDtJ+6}c$x*m^N1 zy^PPI^g84qj|?z^`23g*q}R`;5(UbUBx^&+|HU_>+8f8;AR=Y4t~-=RoWMcc9_WLC z3jV`Lh_7r8Veq;>44WDvlQXqQLQqR&!@>$4-l;fcIV~T&xlS?F4$be_bLP4=>~YT4 z>_KGftJwC3kb}#Aqu&2Ygah$QfDBN6IZh->;WYL<30|{#Jp2RG=GFb~$8N2a9TY-6 z#n{Q)1LLcfLys2R*)A4WpB?CUl%gx#4ZjrjAJJ!YvNxfw%Z0WeJ!Atb+3qyxk(h=Zd4A3Z=r256@c2RqhB zb7Y`64N5v)i`@QIzuykxmg?_=*lCjAP0|4ve$=1TZ|J`Comn|Mwja2%3nOS z4)Jx(bRa2}4myjObX^;i+~w-lyE>9zhG*O0IXmR;?U9=iahG+#NkzSpn+Eb2-u*A9 zu2b=74;jJ^pZIsKi1U_f7x`P8?PEttKaU_HfqF*!lx zL)e)*-K_YqeAjmN2VS1kFX^O!dw{oA27X(k1TRsLW`@?Y#>4kccV|^py3T%+IUO#k}*QqG=a+g!(LlXx^_J>~Q$7M-}k3O+l-ZN#Yn@<>*yR9lu1S8W@5@uSI!~)@ONCurE zNO<>V7=VdmBW^{J2-dhXXlFRd8#Dx8NrEB8fh*`p;0M&15=DS5&{$F&z#~NjL&ySn ziqatI;P(|>Q6%r|NRy^84-0s z>)s{-@H3b{o=O!KUBBIp+>B3yezQJUOx^G7gUm}3w+)UK?13$|KR%@lNcqQ|A^-S1 z;Y7qACt{ic;1b9`E+zxuV_0JTxZ`izRr<&1fs|X;+dasm+25z1l{{EtCj$ZCh$+vq zAhx++c#(d7d#=6AZYh$_vXUy7fJ* zz5fYqa1}RFiY-pRJ+@rESPZUXhr1P>QI+V@^3%eCA}1BjiZ8=!ZUQS$D4Jx5Czx50+DB_#`6@ z%TADiYoFiTHgjZ+qOdf-o&%Z1Ff|;>E(x$Vt-@4xzbfF&xiuR9iQ&^@zSoc#hRKsv;2`NtRMiUitPOgT%vet2(3Uk0@jk#J84uu z>XwK{h7{}82CKwhkjKif1y#C##C8ez2Vw-kt`f2(1HAsN_5Km=DegRlcLtntJj56* zsL~YswIA%KQEnZRfvbS}i>HVsRr)kqix&*8w%(MUdtQ>VW&Lz0oPV=B5A8ctcky@4 z@}@ZYHNL6|u2L?a0Hs9WK(ARvr5s1;FM`{ANtB=CG2WD@waRy}=uQk&a>E{3Gc6lA zai)A4Nn|^O2YZxNj;@`$#mTcD=;0O8;_zv#BYPaR@{BY9DE2;Ap>u|-*9>>ZFNL7Y zhJEknTcM5Yu|Z;wi25FBlLkURg1JfXMzYCu!dp^3&cY6zwV-QT*lB?)mgo6JXg{T$&jDOp0ljCxkZ1lfjt{zEG@exkm!Iyl zPanmawZRY>hyWz|e<9BU7yc(B0*eHHS`0%*pZ_i39oyh8a!!@z_k}Dw$YkI`E>8p? z^jpUI^E5tmn_=vn&CeR4qzl*8n)9EWuj-6SQ0;n!57Y#tZ`=9<2MA?Mwcju3LR6?F zY6`x0pHv1R3St_4k@H`P5+IL2wIUADgZ5C|-T#Ur{r^+u57EA{i|7eJ4yNvbs}v*J zT)zhg%YyxP1CaW@{8ArD=aGE&(9fFf!bMwTV6_kW3rM2^QUU{bPYsc*mx$oBtFHgE zi~do9`CqVbiqo)i;6nBXA{g2ThEQsOoHWWbXwiuP(auzXLl&1~%05`w{UV(n6F)C{$Bwk1(mEazN!DcHlX(LrU!l;Q72S0J6#; zK%#NQ9^xsP{rmqYwF5&4Xy@kv3qS<&hasQ%!>0Aamk*Nw{pUk{6c3eOlC0-c8OEnl zM-L34_J3b(>M_NrE}{s90&p*NWu6SU*6*BBMV#}!hNYX%tj{?cfPCRXkPIOv)(1`R ziJ~*efB~m7;7|WISpCnR%KwGg{C)_L6_t#GKG>nVe-~m)h~P%56|3I?wdQPqXpP*Apbw*#H#-!dp`M{_)uFI0n`jaMp<5 zfvkSb7>^_+mw|DN?O!&I{rVlp^l(dH9K-wqyI`&p*}n`L9Id7{AeNGVbrE2-A&o}; z>Gt|~0OC(V@`uqHfkmRn8b6;M_CYJ)H&yA%{lM5F0ZStW0dl$m!SV^FI_aUDx`HwB z0+BLCJsWH4>HLA;zpH-=)CIxgvSfrW7v%t|8#_&}p`_^hOK7w#XEFS#Sm>hGzRjTT zqgaUru9)~><7a%F2?{+ipB^ea$osg$ufw`>(bmt&YY`>aT}iX&eQy%#9kU+q#<6{h zVOv5~Cg(Sb%!@$ein6!UD1RvHgO-so|9&~;GGO+Pir1;;W#}vq;qHTSu$pF6yv^b3>{;_iJK`Wr} zCsspR|eMaRwbai)v=1` z&hfFIE2lEgw}1aqr6;PG7vuCW_GicG+HP)x;?EG!$y(|sdYcsJ>fYg|RlndPKQOF~ z>|0diof}Y6WMQq0RUI^w;a@czVOTR+7s{Y6o48k5Q&uZ4FD-cZ7$7uT9p{h%`>4>T zNx!NMLU(;oH9t1Gi-PMo9d4Rie~VI-iFj~m=~XA1xQ3rZnK#YdeEUIX{eAJ*1gCe= z^e-`Xm~oeOlN*jtd=>E(xsSGWW_@i7mlYU@H)V@!FY0BXS6et$3OHU*zEoFzSLxjZeWtQ5-ELU1^^P*yyhE4o@+;)3ssT_l8G zy%mA-&!LX9Nz~d;Tng(X2ng-|e&MPwL$)KEN~atpGO8*}P^&+7;V>1`?^FC$o?*rn zNow493!MPoRowR8F`g77UQpB`&UO|5@y&xTPG4{8hKbX)=$&r)grh$5{6Wx@1g3+} z?TvSyQrGRusV#zO%MGTqIiqbtzWVJI!Y!8kGNtDG+K{PTGmrJW;=m!~%Gg%cJ=xbA+fe zDa^%87lD}w^}T-%B9d5_!*^i#{p~+s^!<18A5te7_#^x_?qM?T^ud<*1Hq;gR?L+3 z{19X;t)th5_=^JMDL@+Rh42LN&=A@Lwo8nr!TyXPkZt+)sByO@1XWC#{Vax=u(Hyl zyH-Yb?hfm?jk{J^HD0+lrF3~DkxuxXGgU2{{Qk@5_vH2l#kT-|3xiKYx8odNlj^(O z`RHk*Qk40$er1fzCJow#A%A2!cM`SvT(yt$K>ShT*EgEppL)4R50+}AyaLf|Ff)R+}Fu5hoYq#rg822 zZXOsP!Ah^h;^mP_FQbap(EFZm7lDrIVcBFgp-3`dHoTdhVv?jIvCGvJZYy9bB%bwl zCRFRh4{U^hTGRPR5$KtR1-9%cGs9Ewsb5nVxU~yM4FsGmy_v1MZ+Q`Xf9{l(uDz0tB zC_O-Fsnwdn{{&H2F9;viyo!Mlo*R1eVt9#Ck#P8mUe0YjuE|w}glN91fnBGB$nmMO zRU)|>gUXm#=>ZiLLh6wyVSlzex&0N9>k}w*HnPggvoWEcH-#$k3gUM2>0`C! zYSJgVl)p2ZZN$=b>*-Y01XC4P4efHdz?(%%D}lYJfYizp1s^)H38r%_rK?FC(G#t6 zS&`$X{0BA6WDFN@r9uBI9?J z>dWV$veh?*YlSnu&&1dmOWXN_=_7(W70Mo+9)1lt{1u4?(#XJW4kU*yb^qV9D*b)%RshFTQ+y)r*$zgVAjD!q65V|q3z#UN1ZU3byR>^N8rxi#fE>8 z@b>qt16fk}XV&rAFO?L=0y)IYd`P~CSeGPqtMYtiXHTO_gHZ`DuachjQ9e`MS1AKl z{?_bCSl!D!&g^XpXD15HysM!h@jJQ-4t5DTJWV+@C^(Lvo*dWX8rRFUZm)GnFn!o0 zGm$f8p>My}KLz;v5d{gtSnJ5@lyWSnvZ9|G_9>lq$kFwfgClO|d>!_P&~k`%>K1L@ z^gRofcUt7{TFUO=rp+Csdnqef6<%*TWHw3~)CB~hk-4(IYLt;;WL?4zIQ ztuL`2U%q@D+I0$l_w}mX+l=6!2bJ5C26i-+Uu%+j?hmd9NZnvkHHN6Nv-1Qjw;vo+ z0gu5z-ZBj%cxMKK<&Sl`Z>hFp%W9HmwNCbbE74ojwxf@cjuB&?)P7vQ-GZZr#XBN- zi&CF}0kEKs`^7uM>V!2VOq2fC5_9(V`!_r;@Vx0eL7B=$ytA}W*@s0;>M6FtvaK)P zaEtl?Q|`SAlse6eD96wU0KXAq;iSR)MnqqFBczFC{?f#ADiObP&tHE7yMY9UjSGm3M!?8%pky63V zf`Ds}3{xdEDP2OFs+Z`~`c90**D6f8K3wFNk{c~!id$-T%Vb+cD$yKmkM5)*MnL;A{=p!Y0teGqdlvP*a#?j%; ziO~ipif4}R(gl|eNj@w)Di2%i-0NICcV@JVV*r+*BlO+S(U3_5wthXR@E1wAe`g)j zd>H?+D8q52f68Gz;&r-{Q=a$55N+;Y69(?$OXhdp3I^YcG@E3BTKq}AC;~WdA#7Jw znc@YOS5+C(s6QfVqW78VNdZHUEy@2*-WoIm#z^MoU4tR1w37n?yy0;v&AVwdf6L+_ zjkeXv))PYIRTL{1zP8F+bbYr|u8{m?YXy;<<;e$sHu^}AK*_X$1>;*h!_4&!HG zLKRdGs-N>AViB||-01MV=Y)t{OLVwp3J>qtJYKsM&S_Qa;OcC9@#>UjeiUR7JG}cA z>tm&GZe*%if3RSe=PH*|j?Dc5NkD}(EGaXVHYkHQ=`eE07D$w3D#49Bzgwc|KzZI$ z?t{`3p6wO+lzSyzZtlEmT%q3wbUi#UuAY#tRg0;&v+F8Wdd6S$P-dUgQtl<0&>PXA z+q-49sO}bjyguyZT%1uI;F~=s8OAvsI_{$=AE(>T@z!L3hW6)V)2(dcH3?h3ZzXw( z%I~jOoUd->tF||pZBRPwGN>K8zx8l^KAF(ddSJ*4iPdUx&E<<2kS;{`*h7oTaYAcB ztk^~N+gj8yEwPq5-&;O?%DE71_mIliQxLJqkO{2`pRo?h3gfuh>@S_9_{v+ldA2}5 zJyn@rtRfc1E)f5KJ5ozE?IgyWV4P=PLM_X_tIWU9bzm~y7UyOw5YJT+l-d~`kMPaE zrk;HC_=4&sXT7HJuYqMnE=x@>NQXZT@+yH1cR-JGyGxqN=;ZYaIww413LVF(#-|%VPM}Z0M8*(;jgy0K1_P>F~*^KV|ubJ-@iR4 z;If>vC$BuSGkLA_?G71W zbxdUKSIg88l29_FF zx@M-Sek}Lvddn3&mZ;6kD^M8+*1g;cSLuy_JK8z(%-o>tc=_kd@=e z`cx&=BWLB5_}ApuaOIW)qR8`0#vBfUwlA>}P^A)SZO+n?T!4_#HYHV$PsksQ+X!p> z*}?kOwr0Mf(ynLG@M`&R+mO#&Ej{T>o7y)vw}5_JYGC1R2cLs@(S7qVqt4Dwng?}5 z_aB}%)?!`Dd(5!r#QSG8SiLp;2q9XZY7wZof zagTM!DdCj4Ta{Jb{IOll{gaJUldtv;6Ta9<+24YO)DlMVtcU0FYb9N5X1>a~J-Eip zT4F_E>T`*idLhnm@FyW`VcziC(k(n|uHeEO1DS7E`(TP5*wnDY7lDhLtqLvM&?-H! z^SveDSvk_%%~j_4UFJ_38{;~H&l^ruq~e|CkRkJ7xA0o!Ui3^Ioa2@&ru%Z5JXcx# z6i7bn61UF1=`^r8|0YQ%nAzMbz~d0vntFopQu`x%q6z;i>7DxLcB~6MYW&we(w^qB zuB5N>DYe<;TY7FX>a${JaNQHl>?p5TO{Pm!NN(Q?m2xpo3RaWBAF`}}>Yt3qI-k48 z$~GXf9h8!1C+Ir4Y*Ad^GUzbc*X%=cioJWi7A^|-E_pfoWKNdd6s)N991zW*__oqH z7HNOa^4=pzMuJ?U!1V}Ih^S;ilNsLO^i|V3p5c6tJc>o9bMf<)sNl*-(onR7n1moxPdZo5Ht&9A6{FsQ zRXd%53ymQ>wBFG=XasYz)+>uJ+NkGhHxm_lqZ?a5p{Jd2YIgcm*0-9`GL(0EigvMF zW#R?LYD?-phdUC5?tXIPmt-g!pdf`BQmWm9H28;K5ZdP?83>0uSQ72c0;GR42uP&# z#bsg+MeRQc-~7L|D`P*>8W}jG0f|1_zdO+nok=~QO5Kkm18Opm3BJt(OzQSjfFKC4 z+$^ct1%M6GK%P)?%F~og%w4f?#kGYoFRV*k&&FyTzpi98YFiem z9?0L2lr3jc&|O%LEvb(G2_U7xeSoRdW~-P}8${#0alaxEsHusUkr5Je24_9Vz>8;7 zde$_kjyqjTI_3rC-7W?xm+we9rf`*8eJ`9e_ZCzIOF7}yMHPjz;us6%80N-wWb8C_EaQ%z51yP2a$bA#)7VkvqG#^FNnMXQj zY}~sNBIZ*j!$O^3=fK_(B%2Egrt$}y2F50;&%L71A0C|RtTZ+>Z`1KU?ah~t>ADK+ zZ*rhN6QxQM8&kNqFtc~8TjvR>CgoC{zEaQ+1_Uklnjg<16|3evtQl`FmwZMo#A$@B z9S0H_;rxBRXT&GM^A-~pX9Fe$TWV~TLSfF}2L{>cPdcOPZs6T0=5i zO@k90&USUhwZM9v5c+J}(e=SyXIk$~nRNq$I1}9DiT_`o;8K=tiJB{gh>Y?Y-EK z0bF=^Gc)ljfeBC7=ow+}t2ukh0e`WP3^<{>Le71#6sr>}E-5d&0Cn|FlgrLpCb@5` z%0@A(`N+P{y{7@7wbz93oZHRQEN5{_qmQHDM72R-sR>JcerlrbhY5X5_RledgxQr* z3&)iNQ@QzZzsh4s_fVX}UV8g>35wOA%Mkg&o=IQKe4X#_60K*?dLZ*(s@p-=ksmtK z+Zyf*XXs3ob~bH&nw-={bEjgNH!j^$4~Xu0x#?P%Dcwb@DXJ;mC>F)gbOjP}q~dTc z-M^P@9NTOw-rkb>vQo;gdgQSr^0O~L!XS8jEm-&75iHc*>dC1`l%HFwGdMhzzUM50Cd@y*F^7d&|x+$6Q1>u9PllINHEbHgd(>K1l+ zP-qXN9elwm7Z+OCHE02fwwy4)Pz1VCbV9><22Q`?Fa93YB_AX<%W3(fJkPJFZM^9x z*p2s1{L%WN9>M)}>9Fix5HHQ1y~($dfW-i%jAn)VJw-lp1v#~e@`OWeT^X z?%p;xpN}cgl@utgVeVP`t_vK(uk;(AKGARi=CZv>at(lMlnk7JeUsWDrDW_P;sIxg z$O|ghrzd-tz@{**B^`F8@bda50TaRkXvwdI)3nnx-hl&{ypDWEp zZTW$wbPULl;Ev3zth{^#JI{LwTic#Bvr!4ULLh2JX;;LzR-N4%0Fo91lY(Pp66qAO zb}K^`8yGJ=hSL$kvmz8No!(^7oXBSUVnluZk%n^(d&8OV_2lg;*3>g!L;`q+aR|%U zRgGbH-4t!-vs;ScMhkL6A2Um&0#764_-iVvt76_EWmf`R0|1pwf?pmFS6dx#l|y#q z_|}dCTTBxK^~S?k?t;dXOzsKo9R2&==e~{Y8OI^dQo|OLn=nn$gzYC4{ni%dzA}Vt zsgf{~R&8Ast|tb|zxQAf{k+TTxM;Tiyms=9N00bxx9M+KN`(T*H1_#O`?-X3%w}1d zvFB{>qvs=rq;69q%42*tUOjZBr8j>8XW@Tj`8 zm``=!eml(XW&m6`8KAy9KK=z7XDU|)|KLs))B_w5)-3&2`_Ha5bpKzm!%~*l4$Jx%`3?Unb65*^tIMfVJ zP#$IFyTolX0#ryTqRs^YWW8oz#5V6?*yY|T8e4cR}(!N(16DbP4VHlzr? zd*6|L91wLQx0^Ld`*_>kO%=gSxc>7tAzbHKBy2+94H+mCFLkSod{?=pHLryq$(!GcXtpU@yz`CP1bEkY z_%!oEL`M4IQ}}H^5$I%@kJO6;ZI`7(4{&3PJ#?U~`+^P&)oP>^2*+k=C)*_97qzHg z?SOpn64+_tc{z<<+(29EMCUQ4_dp3`cuN)q(S{9?Zx7)su7^H`uxNB_>s8&YJ>>C2 zuyYavc9QQgsAFgdquQhSvyna#@6Z<&(GOsOUKLYSWS8greM6E<8mpa5X=cxba8GD$e z_vTyAWjN!82z0J@g0>%foS|}7SAZ>;grvTWdet5jR12HUGc{zDdCa*ufW3Bo@T&aG z)z1eP)FDT*xZWH3F0+-*>o&gK)s@eP!nu;kQdRGqNzZNEl_mnsdd~_SEQ(DzEvjE% z>x0=FM!p9NQQIU}RrFPJ{1)c1brq4zkg6NS0C0qeJ?+Ij} z!6 zq#ZETPCGdsAPfa)|7e#{j~m=xS7i=@uKsQdfwxUh$g=x-j)n&6R1(~puSfR3M#UdN zwU@NoLv2m9D<$ehVrc}9`pW@7a|Hy!7zqdq?e*g7RU?dXQuFpH2)`q@M)wq@Xt`)M zrwj7{`uEPY17ZI&GnERL8wC9(ee@p2DoV)PerOwPOoJz=@YWNJ$FE~yL=1h(#bh}g zWLG>uS(hR}xfv^4+a=lj_GfBoeekZxEoa(#`>3`liK@g!gkNj<3GC&Ga+y?g(CuqK z!kmtl&IZv0l*3;|{S? zqNgU|f-%u>N`hb^NwM-V>Y>7;527>ooVNzfq^i{!FCG2h(FgpVFYx2WaTHtaLIv3-BF0vbSpVI8r5~Q-28KaQ_Nz@|1UGgcM4kG%AO#R8sP9ymj`V zbGm;YJ9t3^vE%U zUVXm1n?@ZLGYVP(4T!i>?HoH`?~aA_t`TMw{9cnjeZcn_UgOwm^C%AUOI#Jv#71Om zC+RIUZ62NWH6R1o&T;`rs$YKx`u|D}_)ibf%Mi!m8X;b{UI2a5G^@ynm&)7V$>CZD+S9+x6D>VGbNhFQg=o- zFo8ANRIr%8+6T)}!`_WvpZ$w6x*p1yWkn!n=@I^VDrA>hI<7!qm=OFIRJ4N?fGrR zUl6yKyysc1_toiI7psU@W93yDlE1Ye!N(M$qnCoeO zOVe=e>tnNSIcT;f6^T#{-B}l=-fTa_2yZ)UeTdj=x!a2^3Kqjg6v`GD@9YllNV0Y~KPX-p>7jF>S-#Or z*P*C~6$)r$Q7;L2di8<_hZmjyM!#ytphh zFe-Ux>)iO@xPB#j18`_J`>5Uqn@X>rzOv1}=HYV!*Ha&{@Nnbq1%nKyJc>zk_04Q+ zjcmu7%t^L{q=?t9mtsZ&F0WD!5rv8z{n%qCpEdsfGqMoGojRjI=3 z@tcjcM=$Pjt#YhyI)6{tXVRJBolSS5?W{-IOyieHmteEvWO66a24pS8Igwf9)fYwWnsMyxa5p7#CgfCwJUHV>Q8hW^j@L2SWAKsv2&g>{~4Rj@;vvGo$oR#x1X;uin9t-cLJ})lA5h zD&45P(R>l`jlYq*L=i((OPqFDv~AUwihpK9;m4)9}|alYEs zER8P0suXY!EFgQNUr=3JPG7k;^6R~9+7F(tA~RZ)AByYFkP zt{b-(eZs;#fT$b#tF-}gs_-%oGVyni;811!uA+_H=`lEl)c4M+B6xfa!6qgj(){!x zogoYt^zWaU>ET3r;&<;6E0TbXUyx2|zaT*W&#a6hK(`_7q$JiL(7EmmnyyuazFH*X z_JCb^Wr7i_qMsIjrG@dJRN(xlaYxU+M4^!>^HUwu%-+xJp?HJYqOi?6M&eD}e(0`~ zVwX8lpwN2xw%7m?{V2A_Y*Pl#?6A-J*?`5%>#48X&z~rZt6QiDi?$x4d|aCHR1 zZ=HxNs9t`e<~G}Xo7$tE-rD?4szFV^EDIZJ$9>rv-A6bJ@8A(ASE_Ws_@ljiFINi4 zc6%F=sso!$BP%Y)8fV@&Vm=ov@+xln$7cpFJ9c%!Soa^5a`votUXe~_XSQ9ua$sF4 zwD^ZpEF%J6I(+EjxH;c*>54lqQapHhA2T4{=y0Y3vV~{PJ9h`N7t|UVg6C=;w;tQ& zQbaH=S5)CfUw(X3_%_eMJk}VuSFFfA#^qq4mT9fPzV@T;tv3s!w;KxZUa!mjgm$}8 z)i1lMm@Ij#I9kKQ&hz8tjJuzHt#;_9rJU7We`MnzzOkMewlZ#Buoz|v>{uaNrAl&{ zA%j&Lmxz9Zw3E+#b>3k{{IiK9aBqdmW=sF4)Tzj1H?XH{2i#z>WU&-}!?>v`&6dKN zH4>JLlg!;4PHN0ag5uv~_w2C>>Rx^9h`5}68R2gEpptS%D=*B0-#MS~WL}&qIsN9GR%G`h zL38FCz+-r|pnI^K=lPdmx`IK*#vFnvfH71!4LT5T89wgQBHW0euRVtg9$tFhl7g%* z!*8}wr-+%YyYOmZp`xH-Cbzo}gjrOg}VLIXc9U}?2^CE-#E*u+c=U9+d) zr@r*pMk;D8H5LdJpe=uxi(Gy8XF2u~;RC5~|G1-mhZU@s(EYpDOWw^$fvpzlejG?c zd+3)m8pAtwBY$;lFIXOnP#6O2V0jjDV0+}?dmaNP)WJia>gR!JF`?;FL9Oa%l$DGE zCiG#to{f)EKk7KJli^8=xtMF0j2GL}f{)o=p;L<*j1;7vDXDV&Qqawrg!)_!7wjZe zk%vK$LPfC$eFWxXzO#2Ofte;7y?cT+TEor9#(}=F%PGBaQR6=E+gUo4Hn3`bKiIsW zPyj9AoRu(zrMZ>)xtFfYP2)T-Slu_#WehNW9Vkr=AS8V)2nH7tR$FhgRX7+K?Q_<} zxNynjib{FAtl3^Gi|K6n+Wkp_km}wS5;~>$7|x5cYhge&u|Wj77vn?|z6=UJ$xZyh z>0{c=&+Zaiv&_8Xw^2obIcEi)vv|7`!%|UW%tT@vPHKc$?dMHW8~#<6AMt z8j+_)dUrb0>qP%zWl*^|=lzPnag;ip5FpgsoUBBgV#jADv~)YUoJ^jxQa}sQEr?qF z>?lGzPTwqjD<5K3J4vT)bVM0W@3P28<@@eHu4^ehc3PIMS2eISs1FUzH zLd$EUnJhOYa=8L5_2ILdFVdW^Z%tVY-5oF}9+*nC&tXhv~jOjGoIx9b_?*Dvow8NPnT zs4NedQrQGAqE%Jaao`sX7E#-e9LmKr>6{T4EUDwfZmp=+c}#u}fC_G{8~0FX(rUWU zw!6^Z;DcrV64t~OhUXG3@a@U4=e}J0T@Egsc~*qfmb+KNuMNm_dD?e>LmfCbf8Uz; z@vfhn&Gba)DC&q2w)8Q}2mJmGGH@#Ut9^Z$k}V!~J5p3p_MVP-eE*%#pF@A9Ykd4w zZB_R8V4!Nu?%uxXld@okpU{1-S-a+A#aT>%uk1{OOlD}h!!pl0Hccbfag=`4qVD4y zq|`5`+f_kyzL`$*(aCSo09-YVl8@=RDwFiw-?}_P+b{2ed~8;g@t*~#NEH!G-d8g4 z#O0U@RG`%V8z@lOXgEnt_;?=F6f6Q1pY^gp{@CXS>HKnNNI7|l00^0(y%Ke{VSnHNl zP-~i5irR2@n7B14Jm8@#i=-k%nBS=yl9|vOiPIW==pxSEl9(g#Yy%tAk|5tD$lUgV z?+(0}2%ob;%uNMH4myl$w;l6OJSfO`R54iKFEBQyYOwb)j;=F?;kKfV{59M2;^Sva z>veWQ2Fe)(p$cj;%w0}y^cDMZ8+WTJzJ$(J1sVfoH#PWl1!6FvJQ^qGvH)~Zq(6gw ziimf)_?bbqkxXe_(N;zUXJWxNTTQwCN4ikKg-vIj2M%YG7RUDT> zIOBnh*m3S})ddMh1((jtcZuF^pdF9Zn%Ao@wPd7w89*68vr`|YBG=#4e)5Z(7xNO6 zYWpL+s>A9T^myFY-tp~m(LEa-VD$qVpcrvcXTW(!T%)~CaioBF1~;nS?3f}{e>Zjf6j#gOY`;4@ zi)>r=rxk^F?HOhhKbk$8w|*o-(yl)hhq zvkt_*ZTcVFy=OpE+tx0;LJ<)#Gy!Q*L{MoKib@GKiijX62ndlTO+Zw734-({Ag~1~ z(vd2LA|R2jpwe6DK{`l64UmL8ai6o#-sdgf{c-QP-+BMZa%HW#=2~;iF`n^^XIz2N z0P_@hUQ*%JwOEQ60!_d54xgiUVQYU~Jac_C{>%+ygf#eh6nj&qt4KW_PYSNw9EoyR-q#47>o zA8;4UW;5oDRH9*^6_Yj zyba(%N&W7E|Nn$zy;qKyk-Hr=ql}pA-VsB8PMB!lVHgC?(Hmt%-Y6|7A5!0i+>yXN zI=I9DiiGx{w#VVA4r?&En}5_Yx?`K90&2NQWfLLf3wRB$i_591eMhcRyE@9)lgw*N z;(~VaoNZ?oH%n+iu2VIfmY9L(ZYbs@3lYudE_Tg(+w9YPmjYdQW%YbhqTmDZMqF@9b^_j4)VsB(xV+TFmE zX?Uxd#;HbN7Ub_r6tWtN>!?4mv;~Ea8yUj1^-ii1y#owc3xdr3Ps7xl!%Xe)C}xu@ z8y|u6P>F0W&R~C|XJMO25ZqCma*X+O-Usr}NS;y<^R5NqO|7=_AmmK)n6`SHQ-oYU0!{j9c z5^f;J;70%cR`y(WlMsxC%ot~{4&U07j6&&1m z>AC-xW5-Kj!vi)|4zUl*J&Xe)Us-3C8V(rNSveGpxySQ8jXZ5c3ci=J2CK-Lt4gW% zNOTCv8JSP$;_>zS&h@gfw6!F2^DJ!2(6FE=-KaVzu#a9ueL7Oc3M?f_EXkc?qpl?Sp{lH- z_>+=2DWCYH8GTsB=xEXYLTLe6l9Yc9;n>37x8R5_a;Q-F|dTc%m049#V%2`R1 z_@M3Tu}zU*n-=o9)W0{~($yE#BC(@Kwf3BfkC*C{azHKgEKKu3rmt2`gf()b}B>f-5nbW5x!eg zm>GGCKc;?aJkdH6BDa(Bclg}K>ff8pr^3VBh8iyYh*y;Ivcb18dBwBIyi>C;i)J@F zBl3E|`*G{xr&)Bqu+-=*^+i zv+fdk^^#POjOOLOQLQtV4^{Vo&CJi+&j@*(>BYfvL@?sLPmZJA1}Y>)ijcKF{6OoS z+xt4+qLPQ1=8n`TSNDnJ^EPLAc&E%CP$7h9BtNggpQhW0~9q6pb`v;m}>udJf9yJMn6Xn|YmyP=C?k z>2q{8k{AP-+=m&08jKcIT)!M7pRm88fcpgx8^sTNagI1&tQ@cUwiI-;1 zJXjiQiE{O+`$sfg%B!pz!aS21j6+*jm@H%D$G94t1-9pHTq-Kq7L>Tl2?3vsFp+A) zDFY_gVKb>rR7TPaK5lJ8iLS#`woME*Uq#J2JLe&gKVPxAq?FEH=wmG@A>KHi7WwX3_VXlhlI6p@D+03WcmAIJ$jfYZNFMw6R056d+iky zbvLtxLKy4wRg(Fi6^AE}Be&>&=PlYo%l!cet(k9-1a#e>AE38V)Q^7`N1%sdpDA9vomj(R6?iqs>WO-V)uZRg7Z z5~yrL3t?_IHU;e`-x{4~2(d%G%V}Xb`!uvgi_jl(-#rnDu~9lwQFb?jwIE-CXxC}o z_1sEi_;}@q=m$DYKHv2o!#>}mwjmIOUys)EYKf+bKgu^EMb#z1EMi^gMp4198(4>4 zNj_k-7u5gy>MT8EGf4f6ML1l|Mgg*S;Q79*+@mK64O@#I4Trm(HLpC(>v>g^i>?;q zh1L~mH&}^Nvms>7$tb4T{Zol*7&`%=dE9b1QuL}R;8g7Yfv~n=?)X;fp5||+$yxF2 zt1WD;AC#AvNBP&XB{D7PwCNK2GT^bmGS4@8UV)$H~^jd`5-qe0r$N?MUf6SFasN zJ3-@n{FimToJR4sreXgBRHBDeCg1#0pa?`)&QM={0Xq+nRe*=r{?85p6={4qnO~fs z`GczTO5b{O`S02ke@f;4gJB3Os1Cx~LV;k9Isv88Iozfo6QltkcTH|P2gJ$%h|i^+ zMEn~&(7ik2=+Cbv#&n%tA1*oHiuw-5aCpTW~JvU#R9kgaL1 z|MyHU8ab0mkSpbdB7dK>18Xq;zj!!pc(M}EN#e}o@@{)?5(|Ccfcl(wHQ zZ@Ys|_fNqYGGuJN7`aqT_3MF=5&v$?*!*7#Cvpwg^$8om3Yw)|M}9)AfHHz-qI(ZC zrcL){(+4c1LZEc zm?)D#5%1jp;Q6}(=I?;xTl6tyfhFih>Qf)&*ACj;J=^tng4G{(jNw%58mL*k{H()A zadywsraJ|{MFPqPuhh1Iybd_<2Xlrs-0uX$uvS(^tm>s&Fg^Rr6+TiP@oFy(_L zcfHZTyvzJ)$Yn^j^wld>8sR%h{mzB(!P;_9V2lDBQ}3w@7&4({jN% zFo6a=R3SHnN{>Az*{JCvR}$Loy}Ffs?gFn#lH!_6#TkQ8RU<6|Fm80ecit} znCC~#TT<9MWq2^jR;aGEFd%bRUeW8!Byh@TV9N4ZtY(nT2TZD7xV*TErifS%M{4Ph zkq4}>j%!XV8?O`krX7Xmd$d?9%RZE*wnfWHCE2+H9p{z%oSm-=f(t+@i2r}u zYtQvzh1JOAW}G`!7V+tUmb{0*{b_Nmm0qPdtaa-^w*~y9#<(^^n+dE#iG6;%xQPXg zmkYFCBs+13C>Xz)cQu@^Gj3HM9!$I-G%0g$Jny zm5C{uwf5azc9w7Rg+HXcmV-0it793`$S^P-9wc4ok$h0q^@DJOHzfxi=!n_Ms;aeX zj5F=A$ChPR#cKDYm6h+9^BEaS^4*80&jQtx98?2fitT}bC;n#gXq-B{8CHM3^#JHgS znaHCM=vq@s(wNjJ4&_F3O3Q1E9U52=6e0ZlAX{x}pEs-&>*$?(C8xnrx-h@NX~I~m zVL4-gS0H(<+xlC!aSm>Asd&7QMqe zj*3YUtm#JGh@bCWJHIZE;;^Q2q-Z?v{pkhIa=W{5OI_Nf;w*W;$D(U%J=0Pny3aU zPajw7j#h2ht@j@*lJq-em4O-=8C8d!}V%A5(X;H^|e9U~Aqi$`5 zLXS)Rd!Dr1Qf6O9p+M1h0L0hdzXpZ>;F*I{-> zPUzfF4>|&p|EjeNbbuSFgf#lmTI`!NT90jNpfATi4)1%#>G%7&s{h?389#cXuK+!9 z$G;8Z>etM5ey1L7+Q*8j(on37~&{to%- z=m8C`7gwW2rd`B=#=!mem|%oRYdx;3zU#brp+q4b+TzB$3*H&u_>IbE2!a7DNh%;< z)ytk_^;ROe&8Ebfm-2jbfiA*|e!cIFos*4~%x7I@IXS%z*I2{4V+9Fp1|we%RN=mx zL*%~^>;L4_{CO?^vCjX62dSV?#uPbVcZ2jK{jS?C)V$$>3yLf&yde1?X6jf>cY}xX zu-LIV7Zq)DgPQo}9CY35Wj|RiTdxlIJaU4$N`H`g5Ka#&ZuLeHDBrPz`ppt{3=xg? z#M3NVRQAA1Zl|!QikCaE53=TqhX;;qJ@y)sZKXsq%r!mj5}_>O(h*7wgDQSHf#e4k|@2m zccD+kktninRWi?E!T*??~L#w-r=+ zF93Rg1Kv@euqy}nOfLo-$3(-(7qKWg6Qq$fj zuq19Gzz?H3U>j1j=-xYE5ZK66vJV)955qcX@As(!ND>87d{_e?qjF*2?VwsvbBd7s zqRHM3z|Eea1+d@*gc(7KatBRjA}#GgEwj)L_cQc7c!+USiz5}O%rH>H1n!U8yT3e| zxV?9O)b?BOeB8vLzYTx}OamAo7{M4A0dJoP1Gp3uYM4?yS-hU&dl*dAHW?KEeQN(T zM2AouRDcY)$aESPBce?N!& z_>go~Q6$3w;E5H3J9_x?ZD`SXkoP93I1&y1<^YofMv%8R%lud{%Q6LIwn*fJEqYwP zMKU$K2WH}_MZb0KA(C^`UB~`ge>2%(z$v-gzS(KBavkrhBuLuc{*CaxvX))&0=3Ub zBiiyevfa#9x+ohNmpESQGLn>TEZ9w79l zhS)pWlQnpO!y8wdIBn!!HWfNOx`JC*>UMO>)Z`wJ#QUvusflo{YBLbu>}ZjpUZj;& zs9f#7>goiYE{Da*ey?+RTHFcFPU*(R#<-?^Z%WTECF#Dae4m0_TDsiugm=i6$W2GCDeZ#m36YhB<*--&LPoTy~?ckC5M{*tk-4 zjrq*6FXEB8pD3S41>ayvv%7m{8F`U#!;% z<~TF2bfo+RQ;5U!Li?P11?pJ{%wSR8W7y8eY`4o|5;RMCtkqBRUr#9SLJ8{d`)58c zed0fOf_6>nKg8gw6Ci~1Ls4cycmi^yE54!v3?08BAh_1Ybp+4~{fo17Tfw~R&k^~V zb{RtW!=B9+(r`{R(8hJlzppnS9s3 zHkW!MW|L$g?T=k?vVTJNw)BehSRFOfXaN8nliAwu@qi;$1+LZeZ?NCC?yXq;!2{Cv5953T*^(q-qh@gEP`C?K-F zkXioJ&e>r57POf1Io`1>sWLE-7K(FwDD(pJ>{i7{{UL+b+^3E`f~PC-k#7)Mnj{W- zKWT9Egb$Q4MTqHjIomxg?ZeosjM-5VblyjL{x)f|lvVMuES@PW%ri+NI4ksll9>u@ zR(g-+#L5w)^${enIAQ$BSYD|3zeaarxiK8Cp_2>@6eEjp-%p5d+~h<08&`Q*hEoL<1hTgtNC|c0 z>60-AJ9mm^A7a|sP8}VYv6=kRU8b0K!u~wYSl;ML*091jBIwsB{{U2eVSfMmzr2xz z>J2GMuF^R-Gt^5q#jk^>Sv$vL~>NY5L+7;ao$#al7 zKg#+;)K~Aqva{1u@ayu*^WxP%A$(Fw4u8kZpts;|9IQhOTkkGnT$} zHD+YE(lhKsqx#J77xAxhYJ(8vV0Cv&dws>(q55#Vz0ldxJh3UQ{5irsS=u+l@hfV? z)y8Kx`wy!?UwanoXRC7B!fg`9vNEx#{?uYl*usAT2JPke8}?LiV?o5?`Vw~5yOZ=c zR8r(h^cpA(^%YR&&xw*0!4Txae=d!+rS#XQ2vz!N=I)3Dsnx{D4GLAs_TRBD3Xcds zTO!N~Pr^PB;J#i(kWIFGVrnnWIv20S&Pi*!l5sCkvoIouM^xZEfEv0{gb=qU)Ms4S zm#Ji92=TxD*9p+ew0e$fED%6(lD+`g+8-5&o;_s0r4D5Iw1H1ne{>>so8AyOvS6#+ zyK=Cb74?}O7VK@i5cgikp}+isR_l3<%#d0+*%dUedkUrgZx6(3e)MpMJ*I6Z_-Xa+ zL_YN&5gYIAog+fa4~NFUj~xkxw(>V@A4K7`S~RZ8OT-UNl;J;BvK96Yk+%6>)ko6B zUNg7hj~KDX3vg;P46H%gwD-on(O=T`TkjcYA)ho)bn4V!iJsw9QS{rIU8o$pS2QwJ z5%gx&N7PGqISdUv$Jure7a+4BSJdE{cGq*Pa+1ks1IF2lpEwx!&R>41?KWOILl+8k zr#9k9R+*%>dL>~3wb=9!HK}0kV#+JD&Dk@d^WV3-?Cg@kpm0Aq=INw}){%W#5 z=qKSM4f{9|#YBp2uA(MPp!Qo|tO%)5FT6*IRqw!vF(vEX>2Z)%C_I!E@%r)b4fDVY zRxi^J1@6yE(TTqLGYz5YrA-L}%~RX`O}G=9Q`wYQ-27DtO(jy^`2)5}e8j64Z=VVn zT{aA>_Za;E0<~r(1F3au@q&!F817`trz+6a%|8K0f7-GCMg9UD1RNVCgr|ZGqzeR8 zy^>IQVuzd6CnS^C8GKJyQToT%#8MdlQ2Q>~_?*H}(sS>#?#URrE+Y5<9dI?%p zQBDW41!kPI!(o(a^097qF(#P<`;I<;+HwswM*)>0^DMS96@-Avm+r6+okBx`-#)b$ z*_1FI+&YGmlzpKt!h?MoF_jthj)yj(&x}^3w+c>*M|ti-Z3S3g@(J3SJ-K&H!ZO9p z5ItK3QM3sRWWT5nfLQbk#TN$cWkAa&ZMv6x``v*Y22eV!rOfZxh}sez1=#;PxkgZt zZBd&BXQafVf82ZzTJdQ{QJ=9u-nagNe~K72PfkWByCNvmNico!`D=2eRyCkdGNj z{fd_+DL-{f)1ve~ZRPFf{lab^byb%F0aPA2|1k-b)a~o@b)egK zAPrstV$IZe!#g=k+~e&6q=4z5h7?#o`Aoho&@~%s^K|5-9xc&$WzW7~A?Pt1zdfX4 zf*&}ncOvtJQJWHk%-6yt)a#A0QW?EG2=O5g@CXhPExtBtd_g1cob;18l!e0kCrWL$iWf3wiQzWez7v&BnV(!+lstpB3*@+YKc9sNuYprFqeCavnV7-anC zU8usO=<$z2+g~KuDVAN!3RiNP-eNXlT7=mL>#~#b!pWw^u3tFK~CvU<;%pE_(!y9H+3FP$vg z?Ze{+>WT@P0q<22&lJ49C+=D}$Gv7tzuZ5SGL7HHAM^Cgp=8!=%w-r?ADU7VvVe$V zBoXhC!r~>3Hxg}UKlTSIT(Y-4bSUm8?OgwHiwDunHXC-H@drcB9X@ny#ZUelE5k-A zA+KW)#}>8jEQUJ!{%QeXx z$F+hy3KwJC7;Da;@y1sgg0Zt6-)m$JKV1A-_FPpiOC-TwD7dg#(m`@S^L&|| zHXM|0Poz)}qdW34(c|U)Kq(bSc!I?U`S2TASHu{S?9?lgUtEqANwtkkcVScNJ8;lY z_Wq+Mm?qt z&NwS2F?Y)wTvO<3vg2@<)o^^sehAvp`qe?_Vmq}?7P(C)4O_qVr}W;RvUnC?fv(W^ zA{ScG6sUvY%h-EIavUOZY=dP_gd+>Veu9=TIgSbf?o9ahSUB03$n#|qerQ4PcvZr^ z-t}eDE0eL|FWG~(tj6!#5pgssk|L$$@5@$}7MJY1P8(9zx0 zoBmtGkFz`u_R}f@%1AGvIML7x>GqwPyc&G>i+)63$uRXbjXN^od+ZHF{3SMZXqM&z zwpU{px;OSqUW=H}xEfrnn)Vy;Z3>kUuLN0vmQNB!LNIN`0g ze2FL=Bcf=oB2gvZ!a)LG?Q1-TdoH^f-|T5H{^7aifx{Bhp%x?j!Hu-* zQdCAK!jL8@iO8fzc#vf+xkPrKT!1sF)9EV4eVtb1)i0-683|~W_&A!+nR^{`Oa6mJ z+=E0R7)8vDL0|9`$!PqWb2)b}`B>UK_o*1^e3qVVRxAXBub~pqI>O$g6Q{vvO_UK;ptZ)YM$3|f`2`Zr6`R1xssrD`O2(px!%QVKO-hI zcz!M^H8{k(WRK1_f6`=bjeaY3O{nq$^rM5JqYz)r?AB1HW38kZrr%wonq_O3)8L&g zUGA7W06u*4M838y>HOTx)nnBL4;}3txWvLcq3xktScdw9 zoJU7$e>*oe-7BuT-UL12tr?%i6)Qe%`(V4udQtJXGl{NsW}S;oI5TFe8mRAn}RM_0S4gwp^?u*t> zFD}usKC-4oP}#6xljxwm2G+YV0E2iy>(&2oX#W&pGiXx#%S55bVx<7NZ|7NKDkse{{ce|@jmgXvwmJ-LaKg-Y%&BiYTBtDe1`a}&Bj>pb(Bs?yVNPR? zEwIy1+(^h7B)J-4y6`bSm-YJ{ldhI`jrJ*CyjzGFkibzFOj4)|x;15$VV}De7x5Kc z&fGP<NRPA0{c&_0tw9@#-p>U#>TSFNk zs7x zzDX=fJ|#ZOwB=4rDM?@Hle2OZ{Tin2T=A|ln0Dt6P`jW6!pQ(G3Ytcdz@U<>h`Of)^ZFrm9+;SP#NhgF=1S-1Hk|4Xa7-Cq_d& zWOnS56j8VO6i!-7_mAORx`w_xI2J8>4Nj$qymWN`8p-)$Oj4O)<-?Aemw3?lOcNl! zlSEqif}eWY-2d1~-`hH(NlA5OT@^ZODoJy9-pTgj!^_*}mreMD6VdYDj9z_GkoBpG{U#Kh!B40WGK@|2Bqt_sIkeHLGl zzaZ>zLCE(an)IMODk!HODTvrfSVogZptGpKjLDi#b>>}&p~gx4oC;BcvsR$mEi3fe zN#VyT#6xZ)>iR152I|cF&!_Dp%ajrI>!VoJ0pM^^sc>S%>PA^v^}Eu3`>8T)WrqW( z4v{2h)vK(E71or;4AZeGE+yk~7(X%Kx)uNxyZ-$(&em{;rv?V$0ha>D47-0?Y2Uf` z)6FcJO%3m%<7pluES^okXK7N&gpgeW#A)Y<;Feo8z>!+Lh0T)TCkgAbK~m z1KwE9+=f^-+`|Tu8zQsT#bUy<*Fg+2j*A&(6TVp{t=*aZQXX@sRju{$o zII~7%F*!=5^1gWqWjI4dM5!jn5W%xuX`KpMlPr#gU4_Hy0?AX&v&sG;ti#gQF~-5k zcP5N-UYS~|1RuR~gmw#fEPijv@^%O|(85N6_3Ddxn#qQ$fVzXC(KFA=1cV0p+AQPG zi*(m$J~{3A{ItO3!TaSW#Y-Xh=g|K*DPUwy>VWD*6Xf4jE$R? z8O^rn{TcnELc;M;dF;Gq_9cbK8dXDD&kQx^$06@jWyCFN8;JM}c96!T4eHLP?TSWw zx#suQk7xDzT)BO?v<}YUj9-V^e;eCCgqrvBZmi7z++51rmoU{N%{6+vepu@S!$2y5 zV6Tf^oWUc>QVz(i0ba-sU3aPM2Kq~tTd-B6m-{31=5GK(Mgy>R-I>^bwNtd)hu(IS zn^+MbBV601a9w7j_vg>2@u5>PNTz%FBtBJ_?sd^brh!X6g_GsI1>!|Kl;mQe*Rj$ox$sbF<-?Af>wU?NIy0MG2D zNe4qk2g7q}XX?t0V)UX!CVK8t8vJV%>3BOiF}0;QYlfO%mIm)g9dxB$T|n;84WMV) zIv9FDQldmrOBxnXWaAM>#8h{JvfFdFOSn@lVzo;udoek7)lXn@+m_jR>GzC-?+U*Y z_sA;h;&*7vZ-${3Q_cbK4kQ_ogy>%MRyiQE{PU3mKB|q#?E@rmA|vI=E|ds5$43RD z*A5Y^s2tlfyO1;na!0TNgk5aBoh-WEPPG9I;+2j9hfcpPm87+hO6~%!*?t=_M8X zD4(ZrX|(Z7jAvWE=QFGQ3_aleP21$Oc!(h9M4 z3MqhIHM+oz;L8FE2qVNp^Bk!z@dVQEwDRuj~@epNo}(Grlqe??QTWN`Ly!g2q6 z*4!+M$DkMuz*v~ViaIqfReZ#iiQ~&53O17`xfuE+$tK&nbEDjt-@fF`##b4VjP4j+ z5UpmP=f$MjyZ^M}((6CT*p(i58eXVH=1lqFOhU*}xx3J-OkjsoNSUDqd+lwd%4n*o z+cqzRBDu@-Q`kU*?{VZVbh-ydoLRcEqdbqqsJt6zF;F;FyAMOSQxRfcymY+h2k~&< zB#~i5zHVw1Y(Q?_(y=-1nZgmZ{kl8a32mrSPN^dd-=3TM*YUFgncSw-ii8F%Nei3` z64hBX9N%*1c)gqRE#j?LK$FMJ=lv3erhdZl8WlB_T?scsd(Gko*Y}+c{-NZhjQD!z zKgY2Cj9>qs&z~}+17N_BERF~AH%NDt9xeV)_6W+&mI2v$D@$bY%x|-?YWneV-)M}mETLtQ4orE(3%+g{jn0z5w z$zppTA!Oe8d6RmcES{u zFffAFQZznwa1-wk;5^wLm?9U`K6$MM;37eTHOQhNo6*xi3990~Z0$+Avb;9R!x(XGHM5}4dik&i&c?I8%% zLP6>3KdH&<)__HKB$m3eCxR(`xdsxKvFAaWBz?nIvDtUeVFZAl zr6(XC+5>;;It%1ufv%H8|LCDAdP^bKjSC^4=RR$zE20JcP*U6ykgo;y6c@_KcD{4JzLe{?)UKnC_5rIg$9EnBgW9H zGRg;cw1T5FrGV|K_uJWpUcH4-$VT+qfleeL4H%YbTVMY7r01nUU2B$?8$2aHdM)Os z{`MAe@W=yN;ge69-Ne&=K=)Q<5L@e|fXTK6JWeBJhF8GhZ7)oqGPDCf5eI3>X$#mF zpb4g6C5lMF{6qMbu#dzpR0*eM;$$EXJ->mDr^?{h7B<+RZBA)e7Vt=q zo~P@eSN{v{+R_AHcg6k$_|0A#=$O~#eq9w(>g37_-Kz95i<~h012RO#eS1|IA-0fM zm=Hm}?3j7!33p(YoA}6Y7+URWBlj7r8=UTo85NlLvDcS3O+1g?h%c>&ZO;Hzfe-<`~uf0Nvc|i1vKdr`8s%$Hvvb-5j9vr z4c)gF9UvNusTQ-ebs)hCAJQF94aHieh9|=Pz3d9c+;X%@o_K4FnE5#1f8OQpQF-;K zZ?VE7Drix{%zDtPq4p=Yvz}U*T5C9L3!XiSo8NX0%r`&PW|cQ+IL{R$H4=l{*#GnX zBM)-t^&p=1^J&b>95%E@Am5y&U?(~xZWSqGsm}R5f7*yWlIJuxBcC~}a_c}X4}=D9 zjoXWF7do&D;TkF)^tIMPyq`KZbl4Z^jQnR_h#l?$!Sp<`$F>Q2zSZKp6zq4Q zATd0M0cG~0S=u)#6;xT|rcUiK^y-~oypV$dzzd?v>_QE3L~h^+zJ)rw$R{)AxKnXl zEq6cEaAmh%C`)B0#WsqJj!d6xEe|QS#l3WSd{6!Tk}fXu+(?U~4gJ^B1}hu>BLc?( zWh<@-{TZPPD8FJ+6fV$cF=%lTbV5~~ET;JTfE&#Hif*UC1l$I(e;ZzEho?-6a(VFt z?WTvXg4KpE*!K>^Hu(al^az5Yj%hr-g~en5bJmsWO;}t936Dd2C{EFWyx+HXMRTZxY3-D=004 zMM~|bo=tnF8H+z)#Hk23npvBc-o16mKtNJp^pdb04}I%iq_?k1IJookn~Z1!VcpK? zI(^-gubKXf*0ga1rGQ*FtNQH+{&{1ndG~D4c4dJpG8XJM^&75ToxO3g-yH7~3|m99 zPv38q7c*79*a}gdk>lAY=7f6G;fFP*mJY-LQhl?AXO7X;yOCL0Oz!wZyS4qB=d`ls z_2O9zhwaZ^dGm!+zasim=OE-`52yzJ=iRLT{+ftRIWmXnM82ERc$HiF%2(XHp!kQX z-rs6>p)*Ux*=lQBhYi)uPbx)Z&&l<*Gy3kAVOH2@m8c3)Bv-)7(gH#bKK|4OQ2e$o zkL9*AoC(56vD$3NZs?(``Y=fX*Ux!-b+=ZVY~WOUhYW`b{N!DoL~%7=`lQw#{6@Qm zqOwH=V%M(MA`m}RBpJ?YMBKWok zI_Mt|92>Id2>qYJ)(Ev>;5+4nZJpUMjo1ed*T1M5gc*@i#dIkk)312u%<(>Wl|6Lr zt;rRUH^SlK68B>aM7kZGrfYV8d3VPvF2We64Uch_rq%3$BZ-r)psZMUBMpv2{&SNL zbpp_p47s&oK_-k*Y@wgMrHa5e0TnelLcYSF#Nrg>c4SQ&hId7-JnBPiTt|Sw#uEpD z^a5cFC!9*sbInjd+s+}jfh^^!D3#Ggjq;KTsL-28l0%m-@-o)4A&S9Z8*MR&o&|RT zT_*mfRQu2G@1Ok*QJ?P*_3=?HH_Vg&;%^wVgeY7_&ztvP*AKh{uvB{E4*WVq#72#+ zs4D_6_0Ot zd3$38WQtWgF&2s!M%?ib@L9?*#4pYA9Srm(p48L{WrU{B=W>%nJxVfj9{S#@Om+W#5sqpgR>+*3O9p*f#jBjFnk3rxFIquV zS73eq#4!06{6%Y|+$mL~Q8Zi2-_?uI?O(T-yV@P2zcT5$q_@JycP&P_;1)05t)aFL zmzkWylLlYt9v^%DkPIjE*PHOa3o$J(=@Rcc(Rcir9$iH!-?beDrzTG3_%ntr!jGEx zmCUMD-rUt@$c}-8UqffL(m-1XA1t*wMc|^`r*8~*VGjjt11->JR03|s$OP>S$Ja@AY|IEYmfJXr9EfsQ8#M!4<5 zOcfmM#h=*dad*vCU47T~Ak1F;v5kvMWK5$a`!TVy-X8%)GtjCSY1EGIa|U0Ekw$Rm z<9#!3#{F)|_LT>H21?PT5kELchz6bJ`On+-VR_8^PjzI_?B6h5^yGyoN(7f; zE4%EMai4_WG^<)7XUNmO7boxn=buckk^ndLx`JvBy8YHJb~AiqRs+ zYK-k1m_u&sSktbIQ5j?38V*p~kOD%<J^_8+BuA07X&gYZ8G8!SY$;7$-Rhv>a`+V0Kn4Ij$ZDRW#O7ID z*x?7znFRJav_(5En{SilrA3-N{v(XjKFdoQeP;01A=6a6*!8bpFTYJMeb26Z>&y8x zcsqd99LeD+dl66+n6aKy&Avz%YuXkcB>Iam(TW19yF@y3Y2S8`ujOQiWE|7pmVzC8U1Ol`-pJ;?H4l{J)(sy-dco_anw#h(Q-tYO7X;JiwBkHAe>9t*=OAG z^g$ucOh)%En4f$_9rExhyK_y=VED7kmNGldexRiP82~wJj?WF}NmlqMUzrvIUOqUN zb@oE5&DDHMXLo_P9hIY$A4TPIa`g5sU!JNCW>R{Jl@T>he-~i)dbMNYrde~1aOGB? zec^Z_2v7}2qb7MWlQV*iY+h(chT+4a&kbn_g`p1E8TQUbo|IrN#nqP%y9=pVLgY|| zM;@Wjs#X}4<2|vsp_r58L#6*vUftywZ!O4^V_=_&Ng3Vd3cbf*ur~K|+*0Royv}dY z25(-_ZZQ(~g}F}@dKwX?Gk|+%ZOvPol|HtmiMiTo z`WoL9wC}$lH~n7&h7gX_I^+Qv$6zEsM!?#p!V&Bi2WnP^=hF|_@i==fSiO5!CLzt9 zxv6b5Vr+}wpLnuxvb$+8Q88NeJj2>9bcXuhxiFO+I#Vq`{AF|6Ey7c9}LMnlG zcH~tB@i9^_m7U6c&#gzu>(xd|!L8>BZvKrIvy&z?C8jVbQxD4=S#9-j#|ytL72H>o z5O;9Y@xJuB0i-{4HJubOXTB)hM|6w@t=VZEw7w`Bgjqjnnl{Jl5MdTD{kS~Q__eHT zs|nsHWVqn;5h;b$8v|csK2Ih4%FOQB`SVhtKEkPWV=PKX+=}}5Z8nUu5JigbXB~f` zo_lwW`^g-UGZ5dU!akbGMy_!AZ7kOLAuQ!Iye`$r9NC0b-IiJ`)4x#Ti&g3MVD`DtQ;U`s3N(J#= z_2KLMQ9?9{v(OQ^NCipRwU0V>S6A6--wvT<;?k-Eg(DnMPZvv(7~cZmh5&6QE$c-XWDr>==>fJZ|GqPH9Y_$xirsI|>?9C#wd4M=hY@I-i@ z;6*7+?7)oaPoz?fI$*mH%LO6_H6R2{$R_|$N@8zr0$-CrQt)ykmUM>%JfHYA2;Feg z>*_A_#tcP1MLq|BIS=6dUF1wI*CfgMm$60F6VBs*J0}Hbv3U${h@snaF1@W) zG*)TW@Cqj9)kbF`bl3TQTpJS(&6;}rPQ^DNMqjPt9B7+OH4-5WJt69E6rd3gtfiBE zHdY&OmW7|5S!%*}E>5$^2oI-zh?&%3n~!PYdu5*J`raVx#+EN44QKmtm<#Ni(p_(_ zMmGnl3%@{!pAz!>zSzKboBi(i0VoAO#P&UbP1-tA!htT>obAgw9xg^#SgE@3R}DVX z!Ie-Z3vGsFs|GZC6c35EF6G2IzL2tZ7VFK;nA6WJc*Dz2gSIEv&f+rl+7xTkB=09n zWN181l)HP!{J;s?vR}UEm;N<7B-^ZEe^43csx-w@y$54A+t8Y{xUO-bz#-PVrsQT) zS~94hZ8$Y^rj0M)5sXZZ5YvAD@gspUU^L=*xmU)Kd49|+RHxJ~g}29HP1D}g_weys zf_XV6#qox!5!!(+I745dl&`=2)N>QQn=a<)BCK*dBqw&Ujd{v1V}><;EBv7cQJb-*jssQ`CSihMZ@%S#)_+(Qn~N`9 z4DUQ|w{mwX&=iOo^16~gZ|k+Q^C8AtMYlK z)?U{-XMg+8{-xwfGM_xpoTJ?19{11(uiXb0@%}WhZ#_-~IhqiR9au?Q$W7dSTCjj? zYPrRtf0o+7gM8<7YxO@6!KJiE<&~WJ-cUnNZ;d2%9dE81&6bSu&bcXPe}90e!x*Xj z#Nj8EpDXQ;Ez+d=eA}sA+fg6#J4!R^+UGR4GQU@kkB)Ya=Eclw-QN9rn{H#i)nrs1 zKU9#jxCaL6lvls64>AuL*K5|C%%gB1A6Ykf{%j>GD)+W=S2QQ-g+O;9 zLsd)tgcb8DJD)bc;;s+>P`-#OhxVnr;dJnZ@7 z9)`|fh5dT8+uC8|d~-S?yj~62IBwMMDc--lymcp+oTqb4n)&B_($$m?6THceF1M!4 zlIfF*vwf=%oq;rhTboLofN$C<*;B=6LYVoP#e*`T|4IWGEjoJ>_z!hFuv6y-fFJ0@ zdBFDM1PW;E)2xWy_-rOK1o1j-yyC`}ihkdvSmrM&dOs5yh2D6YC>wKt*7#~`#O+)N^xE%@wjdnT);SzNpa%AUk~bD(Pf;@b63 z{hL6gNJ?;0y%BN0XIZqzck)ahVc0lzXu*zzPY?H_~c#vHMEj+lrdcm1z{MmMhg* zj`45iolzaUVZG_f_iRbY*R_>v%I8cOHd!dAXq{+i{YjJ~l^6_>MRa_Fp1?XDwpLK3YEJNob(WE6PurXL5$i#%Wl3$gpliyyvWEIQ*vchm) z>s_H;_d_PV*w9~=mmVnaU9?Dqp#fGLOs=J|2i<7yW2{T1O{Qv(SHCvG2c9>%$jUl_ zey$BKvM1Ku1Es1bV4uVtOnJ5E(URN8;z4pOllNsRS@z}SSB%|hA6(X18QTui0adfo z?N9rqe;^)fp>TfGt-Kae=?yF~{7Z>jdUxo_n1=d8%B0^FuJTtDb(43RRCXRtAbo8b z-nJ_Zu5@+%tQlRrQDca@8w>pf|4*JKC{4tc;)U)-4kC#0WbZ$a?|zUAK0uU0Vjn9z z6BrPz=@yynJ~33!PvnlBbt_7cUF>X3-8m;z$b9z|lkD7sT=_&+G2Q)~dS$9LIe+F| z@G0s|(r~%xi!TY)lx;uxI}vAC6|8v@|4-n$e&q59j9ZZ&3z8v%7)ca zHQ#0OTK86k2xUr|_g9@gaYkICag`}sOlCdeyZv#`7s?8tQTGnuE8_00MW_V>!s_F& z)-Qg9Oo{awko+v{6%Qp(yE?}&6wBlU@bsEVeRemMj$QFgQuwxh`3K#mTuePH*{AKX z>u;LWVBNJMmuQC*T~!9s1PRG_gHFI57_rjG5Rc>cuekj*p>7m1`v9CCuyJdAncNDd z$g8cRhn`_8NUgPQhYst;U2HnssF&k#Nw+cf#F>N?Z3qtzpMhck;TI+nNA}V za4C~v)l~<@3*bKvoPkC55wP8r$-LlI*k7-5pw}(4>A^xCK;YyE2yXFT4>*4krbn*8 z%hMWTY_BPO;%rHBW1kSL9OP}WDjl!y^QrOiwfVk&Ufkfv^1bUFl$1zO;hh*Qc4raQ zzSbB*rhSV*NvbkBC-XYf`HW8FobkL#S!IB7ok3He@=?uKJCI;48c0jZc$qq zeZqQElMpSxeMI3&bUG0XRvc!gM#uU2}@E*rz z-ezk!x(i;6RaQfHdL zs6%^#Z$c{n1~~qL21L9`dOzJYJwT-(uc$HkZA_+hy64y2VzL5^?ln;YDtRF|E;(L25%&hEt8mJ7;9YHtI4WZLWS4AL=^G z@EJJypdt`0Ma_cdaB)A-LvChz1RhCsAh77@*J3M(u!MUxW947t@W$TIx+`#Jr~Y0Q z`S4@>A=28AWI71hzR8}xUfwP8ZaJ|e0a)EDUJd?)FApcRE=n-g8WE{h#dGlcHzT@3 zZ-!OK>wEq>(VPC2Xh{0C86Ykir_Y z@e*0b@eXU;u04Xa2#O2(V^E7>;Q24!zz7LQOYJBx0kfahfbSfZKHe zK2@o^8NQ3hdr~EP=U6mCV(h=wUupHt?LkHwY zoY?gV?tyn=YB~H3=VxZ8LJ+3_j)n=J<_04K*LT{q;38bZCk91B1>HJVLoItXZo0t{9`w3 zF|5wP>?9FPq3e+e{Xl}I;H}=uK;Q6R{6ACI_m-}jz7x>1z5B%RbLI!p&jpW-jrgiUyLD$tT=s>`aUJ56{#Cl zS#8(*aNO*i2ZV? z*Y>OGnKH>I!TbyJrGnr0P~#tunCiESL7;oGWV-xZO5$I z_1soOZ%qDytfd@CbtB4h!BJlO13{INd+7G#;M5&7N3TAbt@zzxL`WDNNoAg)OGiInWojT6mG8xXieAKq zy>N_!YvhyZdu^=^aArBiX~@$3bwp!`mN$6^f8N~#CCqW65HbGTAm<2@)*dgxf_*os zHltDt`{WE=L_D$LC;(fN_2aD*PDA3YN5`?&1IOD?K#FZLOKbaFs{um^m{?f4!@C78 z8r*JkO3WTOa}X3>Ho`ln-Ct;3SK417D{p&^ZIn{zVf@J~a=z1Xop@8>>7X?O1Z1B7 z-Yz?QOS<8v$H}_rKNgz6`R8F4NyZY{H4)VRE5C=nU-nF$lG-7p204(&>3)prcoR+}ihIz@>n^ zCkFSKyFQ-P_?f}?eY+t} zXO=&y3eEFFLSS>8v}2vb=ek6OW=~*0`+Yz8QUEK=#ZD4C?;tUv~<8)bwW zmrdB|x|HZU_m>MkaXK7Um;B|+mpoHQ@D)=A!nmh1Ih?k!TjoNILa zR%6;j6*k!If7q-H|Jg%K)^Sv?Ae?bg)wRpUN>R8 zkv8$uSwP2_<_p|cjTIAiIccW$_rR(CU`^!Zb%*#eqnU)rJ&%T-Lrw$7Q5zx89Da3# zpe1hpL(KNSn|Z>p9RR$;wVv7X{by7-O6K~JVU!QR90G2ZcnZKcCY?inT~QG3NLL%h z4_Z6E7p_&VfCT@hGCxXa8G8X?DaF70DM^3U+0UBZl+`=5LU~o*>(f_yHdv9)*)>e* zZWrW^Th{45l$!6it<#b!R)gez#SB3y>zJjLi#y93lXc2N)xGUf(#qAtyygmLEo9tt zQVG8-vg77VkD~EsVrU_Dk|6Yu1}^m$M2>p$G+?sAxzIDoAS#PK=udhE(pOkCf@lbG z!d76-&nLgAqnOyu%v386f7_-4O{>?Mq&z}rmC7yiZ^YpJIsyzaR4 zA*KSDm!w)n43c%D9rze792he!?NT6SZ%u`kt^|gq9knl*-DiQISSVL$-DozPQ+Fh< z6(U}SX_OqkbaN1;P}*FQTC)}M+0Y4n=B`uaz=Qg6H<5P^=Mu+luGAZM{rph9^E~7+ zVDw=1Z3DOa$UN&HoVZwy1Y5h)O`frkD+kY>=$YF`=tvTTvY z8L4-qljXYY=#MK{o+vCI-}v0Ts_JAc^Fz8#Y=iqrG4dU}Qry{Mm%!t5)pqV?G)qD8 z=NksgBR`IKWuJmT9w%&jQUC!DK8jlgQ*wwEi)wML#e_~4J%VAHKB+WXTIRZOEQpGz zl_zusC(Vq<{cFR7jx#>dhD{XUHfg?)&;MHL_TN#!{m;G(5g%!ILGAb&dc^C(Hx1&! zj5FZIpzv$MD0t9&*W{|fmf>in@(Q(P6x!1wZ{579eb&H+&48gCfa*!)iD(fRY==ppEn_C#A4gS3di zepa0sR>ZWQszc(`RtTt+PTjenER)J0-1m)aiZT$up0^9p ziUX;S({v=RlDFB2Meu8?bM+J)*XL)#v9x2Mtado6CLlZ6pj>2qZ(~{I+CnO0nMcWS z&nladkv6}e2Xs4)zEpH}Hf+s*Ci%%shJV}le(QG{>%4}29kISMwSliUdTv993!x%w zHszI{De$zyNt^c-m#YP?zC&}@4`RKAyC(DVhEjJp^nJKKj&-U{8bSH{I3e<;^bE~x zk3J4F?0@wG-lN(VGQIK}J>O{yjwNdeA|(?dx&0GIB`;yf#|Htan>B>X?IUZd+C1&3 zADX6<%~%O?ubSrc7d#3Tlg>NdBd)2>FK8AIhD{79r@uHmF+S18Rd~ODZF!Y&JIlJs zE6nDjpEk?&?}4)mG#_pF8I%uNr6t|*GklS%!d2V;V@>_m7voQDf|vMzT=jQ=3WXdL z+ZtRIF9cE;kc;Fq@MQ!a_58s4_lC4?Qt+!ctC6Qbt4UF+GOItw$M10sk02 z{_m#up&!^2^~}Jnqok!j34Aq*|_Ae$6u5CC}1a#(d1_7zDEao-DnX zrS#h26-wsuQ@&Pw(MWsh{P}Tq{<(SQg>R6(@(>L{LcvQ6C&Ee9w7M0jCRn?KCPVcl z8|@<>9)2#w#o5IC#9Hc?zM$9QGe}?;gum@F#OuEB28c*hvl$q+;3<%RgaogtQ)Eqv zDKT;wI#nw9jY))vX6)_Ql*6N3Sq!2gm2``$3^`nMzcAcyEbCMbsYxdZo6(&)Z>ATw zTy=ERR`B>BHq22plyA-fpat)P+onHuMkz=h%g~&&bl7&<1!+V9|9djC{I1 z;wgHd&=c43xgGL4(t%GB>T&aswJ6+-%GYbD#fwycpMP$+(c~^h(~>Q58c)bj*XVlH z-GzO`tFFyZ0D1@zJBS07ZuGzWhi*6RgSDaKYOw|O3PTbSjxyr^If7jrQVrZ4u*3d~+yvc*0gT*7T$T6+5< zaI}Y(Z8P*Yd^usy2?VBFzag}5e;{ws0MNAyLCE=Lh)(lXMv{gJx}oTw-5j%2b*C(6 z=;l+3(6;?g+KB@Ts2mMsJl)FKpD-<$>|FS` z^*nYPWM?3gLlY~9(Bu_J;M!MvvIOGEAISYUbE~0Xmf2-lh5%+NMn4O>>gcY}}+uZeAjvzmOU>?LCjdP`>q ztLQ(6eE>5l%rlULay^RGw6(>GoU}KSgJ0%)z-4X3d;4c*3vPH983*a!aaR+Muy3;0 zh1IXb8KoS{k1mwHSSWcO0?083|FK&&)f+3{ViyT?{ z7Xm*Gl5C%08V4*~9F1=yeg(sw5YhkC(kn$1WY@Aw_OAQSG!EbEVx+Z_{F~i1FFDB; zsl@u(+I-l3)LdJocl%HqCH&cn_?j1NLN2sI3^^okB9HVp)m`*IkBh$IdwzfHT>IDA zcX#FKwz?ol&lZ1n^4hk)geJ|iCCF+*YdOHWo{egXd34tQ-uO{c3T3xj&;mM9_;&?( z10$5<9*DQ(+eM*ORX0JN$JyGIP}jVq)-+0!NBAOY}FU8$@n+oT!8H+l3n=V;5{AdpA+{gG+vkZ4nK@QN)Qhh1~ zPMJf8K|loEf;hsW@b&S^TH=jwwC}r-P?7r;1x*Xn-`i%jnfISpJ}I|Jisv0mxmvsCLUJ#o31 ztcQG|I<{jv52=t(7sN}-=A7<^Sia;D725yrT@wEI$~-7b5!6{D7#^P?Fj|CUU7W|2B_BUdY0kN9Gv9M?Vg2Zl%K*&NwLS*fRD*0JK+k!yQ*U<@sRkdf z(SDP!5$iywuWli<_xImBZ?|aX!Hxp;`hIEMj$Zim?0mTUgU~IboBOXo4W~2QT%Grq zN}74RmJ8z1!bZH9HZ0#6I+qX^FGk9_>z%-|Kn6zH#Rh$)hk*d6^7z~el^anY=zfU) zz84V%W+#llXdU^L(Ds;RH$cmAm!<0U@AHYf@t9LTd!Xc+e`?*L2*8}jr=uLvqaZZ% z?Nja&o5jRDkV(qB55xhU*27(wO-01aJ`c+J2!yH}NzCl~2!Z!Xew9k{BTy`%9^-Fa zlQ2!4XgkV&A#}wGLQ04Zwjeou_4mq8BeZ;rdgafRYy$9W4zZIaL{84j8K3ac^DLos z%bR~E#$HqB;skGygQR4CVM*m0`Z8ewC^ik;(OEIK?_~DG7?XmG~Iid}3ub53iGa`O`WTl;jgl+r& zs{0K$7u}xRek~roi-*%xwMB#}dW&N$!;QAVf~Ope!fSgv&bDgX-fzczUIc?K(}Pq?-5YK%rzv(EYqF3XxEfKF2`?Pv4%B~c?e{vHNB*c<9%hZP5 zJrcs(RV~boPNLZlg&^2{%W=dnioX#4G@h;;1VAMl@9-bk&XJ6atItYju?L6%jA=iw zpc)-IrC_kV21>@WeBC0_Jy8qGu*Z4zJkI>+TCz|@K)6YU%PmvZ z?Y|jRu#Eb{)+VrKxv@TiSzIn|KS%M^$|H}7j~6JaD9A_04F4l0m7^0$6?5ycI%{j$ zusmldp)>(2~Cp*bx#Hd2!*aP`M`NSBu>V`6*7%7a|I8-}-mG#=mZd`Tq`E(NVy*qQ6hZ9SO^& z+LGPFa^^H zT#ZLOG2#!HJLrac7@#C6nr;AYX}udDGeE;<9{i3ak`q-7QSqfUCg2pd<|Db5lr9*_ z)H-F;Nn*0LP(jS$Obd{^*>R#u7kTdP*;9U_NjK?Q0FW>sQ1Emskp8v0 z$v!5GrG351h(Ce!i2XU)^ayUbq9`bOr}Y8c^Of5hR#t^-caw#s1#S3UbmJBDJmAID zCy;v>zQU`93bxny$#*(aNAaOwKt_7bdY0zBqz%7EWgE7FKbt!A%rHT&X}c)?Q2i)Cjk5}qG3cu$Qs#TycRQnzM&2O;k2BRyEp`A@lzik=bx#rC&!WEcr3+|G%{*U z;t^acveF(Yy~bY%hV&oY=f)*dYd?As&cX`+B|!U^JNl3R9RD0nAdLNDvN-wqbLtrW zI5v#`XSxp4N*ue+x%(Q-(4}a|KHvV!t(X}2lPQLeHC|YOhsc<#uT#>Em$4VHdvQ@>)K<@^En26c^jZpZjCxH_U*f1iX0Rx^mWF8nSH+ogDpgF_EXOnbM z%WyBDR1?gs45V=Y7)_I57x1OpwbYj0&g1Q)@5tXnY)eAxr`Z=^i;vy2VM$t?C3aO`I901*g&W;J}8!iRHz(`33Y^&R-nXMtkD5 z1QE1raF@B7=WN*LU?F>#^KNGu9ob8(Md{0h&(v7qP7 zBWO4|#O66|;Vp=_9Z(lZ_yZBf?$o&Hh``u&+us$-({zImZW)TC~vg^LzOARywi$hkwg-~dcn3aATD3Do1ZDqLxX0Y z1)6MV*U&Q+aDExTNin=iBgN3Y#L<(@Em(PA+veAjiGbc~Md6e8s@W6o3?i^w&xL;7 zlafd}add8jNso?v`k#reJep<&W!_x8XRNP@5Ls*YgWs29>ryYDY7qKphyC0##YhH~lV?MieGf3ld0IdmzHu>FD_Bbayk}Pu^CRTA zXIyeT=1{$6uoizm2`JY(PLkQEx{jk6X9`6&t7CRaLjvSqe-s&Ccu7G7Nt;xSz`5DMvh?QtYT>m&IB z_)tp)@wOrKaBt3)cg#@n|&Q0z#x-#g>uzo~^Doq6H^7?lmBaS+qW(F%WUXBOq}~KynIMiX_&ZdZZ*I@-tGO?(%!a-`^PNQko)y=mPecZ z2rJ);uLiSPmNvt%eT7^U#*BO#uW6VcHMLG@eQwa>&>@czLB2Hl=vYnA{#p`jcG&A& z2(Ytb#ruGk0qSB!X!Ncr!!Mpp-#C)P6<7zN*+{g>o8OEiZ5<*SDqp})FEq<=&?Sd{ z0AGXmg=loovX;Q{!;y)&Yk5TPahra@JyV7mER~CMdw2-vfQXnnMyij%bCL3u986@cQ~IMMv5RL zJPqb=A%+fXKX2K~T`2m{PU7BD{5b05hrI80n8+PtGiS}$e0P=AMwxb28{tb8b|RU# zRQK4(#caC4G}*V6G5$VSB!l3yj~=b)8Z}b}ARbrU`h_I<6~}>aLWgOI*Y$z@3M2Ou zU?Fvm43RP-guX>7P$edJ2r_kXZ(5#sA?^J(C*NMTNcdVaEvPGP`<^?b_BQOdKfckO zSoQ7)sxxD_^<3=L-q})wkLqm6K_S^+8?NbU&#j>|6NhfD5#DJ)#Hww*UrL^Go;pEv z3SXw)$XTj!+=|EeZGT&puDY3V^%E8cq!5fSR|f8cZdse~HX_QVt<*!z0e$Z&4p3C- zDB$MdE73ITzxY24z$0FQZpQ%1A1MA)f!Y;K0A>o_2mSkf-qfwffb;AuqeF{?t#E^H z8N`7e8ez|dS{SEJ9ufms&bOm;vFk0Fw3UGQ72Ej7I>A)>Uev9qbo3>(L0Ic@8r z=3X^!r55!j8i^vFyblJ8jHeBt5g_I1UZe83ZNK=qpK%a%Gb%O9yQ%>~my{fg?4TC~ z{t`$cqEx2qUrS}UYxOY7%9ZkqpA*xkH#-$_$ZQGj?={u9fqblUJC997Wb z7lIXKQP z1Mf*eT%WD$59R<*lN+e<+-&=>5iE}&6GC{qUv8$`Q^-K?1{!WdSR(%bTvBmt@`{x zy~ZN#=wZppLl}ldJF!8JSkr)W-|BtHH50FX`EOk3>pSJ1F7?!lZnL}9e)q^UkkIAF z9gI1ilWKT8Mn=<)trRSJswBQ6Dbv2SSD>k3!9sQ}C!`;s0$MjO;Gi8F8eOF2gQ6xI zC~BI1#wmTA0bt?v0WJYZHkwh^>-6%_O7sC$ZfID4f z_cNPq!f3AXcAa$u$C$ypb2XXyobZzb$i65z2cUKT_lE+aqI$*#x9JDaE19DE&xkdX;Gt>p(B4t!S z-RsJUw0zC(7CH7wtCzXeHP{4$ei=Zc-X;jDzkKs)<37)N9p|?) z8@~H&s+Lz29;}Z*dvSM)ujTHi1heM?zA%syuQ&Xa>@w#tYtO-x?2_-F>SB}JEnTv1 z&|F(_PCO*Yale!{Mni)MbciZ2@)k;h4};{Y!2NwB?TkyTbwRTr=WEcx+|CY^Sxj0( zw161Evk=yDQ7V8uKrM?GrI-6vU~JWF!~V*Za7wM8_34NDBy>^h`K8ySP&z7j2o0W9 zLpZV%(XK_(hl8p;EPL;n!IZTjZ-l_9Jmf}I*2zz=#2y_^a!k2d_=uT~+(qFM3Lf|a zIRe`^mIo3o88<=sm2;+B%`al#Cjt-^>_KX!f^IOZ;}|O`q6i|V=wFpo+K)l?h!;;t zGkK~b$966b77zV$QSOk8H-Vlnw_Q4v-$LmOU+;nh4^Y)WKlt@FS}o{fSg--QIi`oW z8ItKVRlyTigBTa8y{BCa5v1T&4=7AcT#&vS<#GfDvMCfvTTCDyrM)@G2cWx>e;`j& z#5XiliBV;-DAR%2Rv%i?R~~k!Y|6NbL$&ww*hJV|*5A3qKTY)jHi07__g{g&r}B_z zNpStX`j&@NGQFsiMUyU%!#=EA+cw}c_WiYuo(Iq;Y37bhqAp;M(`Qe}G?kgfPZ?*! zhf1l+h&aUWTSVOcRuOvL4;-Hnnj+v}ngfQ`&QLKpEd$`RIFS2kVfIXb+Gd6Q0|63P zfcly+YqH0Uk^}kxuG7>^a5n!F--IKMY5|Zs$GQo=GxY(Txdl15T-fxu3&tXk0US+*4UtIAxJyC(|5| z)RB>U8@hd-cx4JkW=FrX%atu9aT0JKp^LPt>(giUu`?+m?^yKtE-lm*smrh1lF>T7 zZ>J^44C4|ncu5b9jZHumW>p0Iz`PG1U>~$S!G>#6Sy3U>VxYm}G$m5Y>l1{HhG}k% zbA%%6M`#(R&%|{y+ANe)VpLhWeDpo<2t~(ZY@`7~`+&HE8Pjh`1DNSjebY*CczW925pwnOqz@;2oo@Aka#Rj-d=}p7Tm?VumR|fL&eN^brC$AWyd1lwn=+3;Y;X7B*H{6^$>f63ty8P+ z9>OsTi2{%X1mUDy9A@*u^f5q`E+zT@f$#&ved0QK^bbU@i&zS(ctFqsO#){4|Gx8o zx=XAu0-7phLeWLee$@g)*1~AVsB%PxNTn5}5572o@x^qID9TdLJ>0lBYx%KP$)kPI@4O8;_7A^xNgyzxR@viQ9}gt=N&cs3O4ec7QN zcG{xu>3l^3NOH2^3Jcyg45u}RGI=BL6l9nHV7VofX{-dg2fE#-+kh|M0tU#K=s;_I zg|LO+;G)|np!nvEKO&YvV4f`laS0yPV##Ph({1iw?%;lIMg;1iPp35d3V6DG{0h4B zsoK4jMf-Y9_Y@*!WfWyR%>q0mqE>RtR6^(PF|UgrLP~B|k%nUMnJOk37l>0i(njir zfr^ixaZK=gI3^kp$0yqkozt^z6gTKR^zD7#Daazo2g>W*L1TMqSOk^HjD{V6Op_mA z1kpXk_yo$D8N6dJgp(!+Z^ZyJXHVM$8GsrHTppkW&^<+XG-U~J-scuUm{LY{`RiK% z)413gDEa=?R@X)<*gsa!3(&_ZPuf**w*Hr2M7xTcsX6WAqY~l16&PcdYLt=j>K<{Zj5}^+?Um43qd@n!ig%5Tet>3;e`YQ0 zz{mE~^H8smFbz1t-xxLxhWE;^N`I%F>v+;+RIq3kYBBe@Pbub{xEnfe`e>4Dv1RWQ zi&gix)nBkxH6hTgHX7W41d^z#=-VSXoZoe)nO_+qlxH$dibnaUl(&<;;w?fyB*L@u|pbQLYJXv%|>Y6Vf2suwe_*#fd* z;aU>N#^DAGESQhnX5j3(1>>G@B_b=Xd~#4!JJRKFv)@;YzPg*f*U*nO&dd%%Yy zP1!{7V)-SkC|m@79RI(RYl{y<~t1Yl5T!0?4VoOdza zjPn)p^Z&pR7(FZoBCoLGgy@{jM$Py!e~<$|5>Q$=qc0iBmi+aT0@{+8SghV0x# zzfE|13^Kl-h;zg6(mLvuGtA1Yzj!u0uH%g=C0~=JH#)hT>dul?mftRRbh+wOe*BPN zKc-^Q3gyN!cYOlrny7g(ETE}ckNRm*1yKm1djXm>2Kj0us8AQgVFr!hx_!m zQ*K&ba;DpD`VSCih8-N`7_w0cJuR)RZ7N{j)yEADCtqR!+gJ&SzP*eMfy8DO2r z$Qk!<70b>W4t`kKVo|wPl{&WFv8a^F6nRq5Jo=KyQPDZ}aI<5-Zw;`~5$f6YQ#BX~ z2zHcFUwARWSk8p#-;84;BMh(=pFh5glQMp4TvMgOIpwm$(dC61gE3vU@Qgnd6Q1@x zSsT`3&x#5rtqjzktR$&~p%8h~NT22!T-e*t!L0zXtevI`w3F-3wf4vEPCRQxIsu0( zZ&+RMJ~Uowex_ea0J6t~FOB7GwP&SCAaNFf?h0nahCVzoE5*~(Z`=K@OO>r`r&;>? zqEq7K)JJ=j3OX*XL*)wA6R%`LZpMXZt@a_DKytn)a5W7rTTzmS9rH_>ixPC9a2RDc zzx6X7k{;)N9X8SO@ra>D4?`HrkXWBNvlfr8m~PaRFzTe($I4R;(yRwcR*TIjx@AOo zxQyTLaT9Fx5TBj#MWd)|ziMRPalekD=j@WW3)%MMMzIpH5gLehZaU_}j>_jQEeXZl zDI2qnbRWFh37M#D;uCced}S^TL8wuKNcVS|ra7sAP6soHB-=Oc?CGY)poTdMWkuaN1(dWKkx9?DHfL!%5%8;UEL$<%#TL;A_a4rTP zSIb);pLVrMNw#p=^Bg^4Ij6jCD5bg5H5xw>%&hL7* zJ(g03<>4JN*E=mH|^t%~!% zb9|#)#W2;;5i$iElYXnkp7Pw(GzSx8CLPXxs8BBOM)iF-VV%R4Xcx}D+sC)@GcEC5 z(pQaX9WsKj#)1kaCy_+D^;7q{3G~5-h-L*cKi*U)E_CAUStq7+3Kt#~<$vGVMYA=z z2XYN3O86Vn<5wK3UqGjn){eUA=nSF8eb0d?!BxFs;(|$8*QeVhN5@~sX8{HC)dY&r zD2VMUeBZh;3@Bx~_Un;;7EK=i94*M=WZ7Tm81&QnQ>fhT;i*OTyo~jzYE@bB5FAX&-P=vGwc#ndr7AVV_i~ZY986 z*~V;j(cTV0Z@&%i@R)hK@&F$1z=sbdgEILQH{;C{?iJoFIR5IZmezj|eM0vT`xx9z zKCWV|Dd7o@QR8qC^2chEIWeJW`k1p?RWjMFW!TN_y~~(poE7X*8_&Q9c!nYKYX`dt5%vTg`rVIx#58j zGy&$szX=5OU!&u3d{xun=(BC11zgt@%^n&I1&j2}-N7369)F}<{qxqGj=z^>sS^LC zWJWosl)H{q@nd`;8jt=0krsezdfn`HF8M5a(G9WZI#39uG?T&p6J3Js;dyBxm2^9> zaKxZ4?RPfobG#iIf0n$I1=u=u&WN=P7!0-%uSy8fQaZ3Y^!sFM{B&$E9Z4cdHupW* zf7YbARA9`_9#+Not)ky=(!Z%*nH*Q>TBBE1U^6mVlDVJ%c0vc-im@NWjKP<#UEFW1 zF4N5qPnX%42LE`JYNnjrKnObS2jgAspPa=G-0oANbaS~ReUt0aD4TG3^cW@M=Nt8q zRQ)Tp*MbkCH421l>h7ad@#|TFgSMwnVuD21RGiM+LP>0fi4oy zuV7kDZBECZ9$en+*{~mL5&lxhusedfNzNyf#@d~&C6&g^mDBn^S67#Z_Zx@0xhq`# zSP7dOwb1eQ4tSWz==kZgXQk~##}2Q;x4uODP3RBjziEvBNX+=B(1)S>2qoP3iD3|B z9ibW*A*C#dG;GlX*+^%|_sjXIOHZ%Gdouo3e)K$`v;2Z;DaBjuVUPx8xOz~ZV0@Ci42l>&T?uMc|WHvZT)-wSGa zv3nD_D)TF>*Gm2r)K*K?6|_RUBOs1B`}25@BBhLoDhXALvTraQU#dt!ZIP9y-HQvN zV$YU05x2JuJy0>Bnu!c~OCXB%ZQqn}<*vit&oCT#b4=rnMZ1$c1TruF zn%M_T+tVcKY)1~bE1EE)G)bwi-0!eVH{qZO(5Au;Pe&3gB5Sre>lpS~o1cTbi<@N-`vu#!p1M^JlfMLOl4QRK56-Wyc;z{oSb0H0$_ziZTQfhGe_$Tl+yHX7?+m6 zjY};zU>hw?K*~y6HG>_s-)9>szj_nU{gwWeMx~^9Z0J|Vmx(NhF$G&R;}or{Udn}I zs$ZYnTiB-A-^q2C(X*a~dLw?~aMBtq(+!QMSh6PI-P}&CF3W74bT>0{546IS#k-`cf2JbN3W6DVT9YU>%AnFov zYo+MQuOH)$-bnu@`TU*CL(OSEGb&of3R0do|OG#y5obN@meKSrcfiVCrW07Fld(x@t%8k$aA$ zquJm5r^lnA8!*ZO3hVP2Kom;bf8V%O5 z&qh%-W#8{%o~>5an#2SjCsM#n7?Qh#djNiS>paK$!P5hx`JY!z$0YT;n zxfbu(Yz4=>nb7sbyS)@_Dsx3Mqb%J<5d1)%z9#>w=wDK zy{c&KB5_x`iOyO3r&&jd%T|b|n?Cpz!4(dT$10&TUgZ0+cG*?acFneJlW?l!&*px< z3e9orGqsUJmPU1VLbQ;>R3lhSy(H>nbx-9Qmu5mZ)e{us*jyiDp4MH%?+Y|t?vwVj z_VDv$bKY|-{*kXfEkCyKh+|?(Eh3$8^bT9c3^U1o50qI-&=ds_<=OLtgjX08a&1lm z9TkBP#8ce(MK`yEv4mNvu?w1YMuZn(xt~7Auj+lS?o;dxY#*{%c`ztiQx_eWVeP=w z?&vOU_HfeP2s&*8K{fnW5{#ge6u3}uKl*U@{?%&4-U$#1eSw97YAXv!`Ad=LO)!@C z6IE70$bL1UX(|Mc2l0^(UM||6m$fz@nW_%wB6rNU3LGhVi@ecHJJGkc`9-huYD7mM zpm!_?6En%4ZZ1V9!!bx{KlP&V zNwa>V|5n_aheO@=f8!(BvWzW6OhPJKi=~9oW=WP7WSt~2G)-N$kuf8(B`Jk)F|vdh z!i*`)O!i8WZDg!7QrTx@`DB*s`CQ-MdVHVfevaq9kNfz3|Ke~sa5&HRd7kgr`?Ua( zthXbVn}9McLRUzIw z*oyiZkHzS1T;;6imo%o3ecW4*5Xs+bUd_9de3(Irnq(bYR~svR0@o|lBb3;bzGZ{eJ;1*ahA#rV%HLQ=Ic3f`$YTksT~wEj}M>SrjDKGHwhQ#}9a z6{Fxeo1Dpo+$wx_&w6*je<2t7Kc9kP>v`ZqHUh>;(|~LaVMD;Kr7t;1cuSvcyHy#w z7|#X|>J*TE-3%XqzW^`T6{-S+6b0c=7F&XmBnw^;5739btWdZi+C{97y7%~z=)Ae{{vCf%8T|%lGaPe-|+}f_wE(!6050%6FnnZS7^mTA}_oea1h0 z$AKc_C)#p?L72$%xRadEIWUd7s{RAt9tqucF8nNHAq!n`p044=>*E(5BDS`cGw z9kXj0f&BnUa#8F}aMU@aD72=LC`8%?VcHxKT9k&|rs_j>9fEvYQxU8~Fk;EnZv}>=zO2S{{J-W#He$2|u_9Xe1lTWIzNC<^S++{jYd>3hsf% z4C#d3I0GcTj9E1)+rLazLlP^%w`ZsFT>0FQo@#HfmA*C1vtm>sP-L1Y>gv?k5hNZN zdpas;aJ=GV83ga@E5yl8nN;)Fy;t(=W?IT1*1mK+Fto4@k33tfq^IFSNls+eO7iC+ zTj-Mi?8<1f$PBwX zUU|bUWBHA?)bsW3hs(mZ$Fy$SESg@1MELFjQp2)>-I?7TDfYi3UOp+(+~G?7BapLO zk0dL!qjR-g-1=IfhD0@H#_g@a20qEx*t_Y+Qg<68O2pbP-K?WZe9z3CgJ#mNeCiJI0ToE@#^$7w43>5A+ZrB=Oxgg>JIL6yT*(- zFhpF7_wdD%9C5X^IczcbioSKmmiW$;%vq5bKRp;SrF_pu=?>)M6&jKU8b`2VLt9OMQ2&$InjeUdZIJAsr7TSdzd5nt9Q1hCPu1iIiH& z?zkxma1lI{}=Y3+;BV?{$2_NDJ2A2uj4q%AtQ6;#jc` zW?4eKN_?xI)p6dH7K(GC9AIWo0Ya-<%X~4Foo*3Z4ds4xRI_z9CgH1*LK|;^*j!N6N3MRrTzDv9PlbApbduU1cRuVa{JG4$z!)J)bMUT)JC-I z;*6w3YRSd@JgMa$fb;L(7Yi>$2xHXFlM}xnM{-|2uT79p&m3r#nVRGgcbqAoS7o`2 zGmAY`K9=w6h!viLLNV^H_pT`w7z|(QxYM1N?ALO_PpoIp_)*xQ6||{;BU0dOGSzb) za(5$X+F8lFkzCf1@B1Mq6|B6h>pg#%+BBv$+Pn%)xIo&rEkQC)Xf#-38z-OKXxZIq z8NAf*bQ)<|DI~TBy4R~G;kRpTcA#eBIwK+h!fADR5s@F^JR22JNz$_w zJbY5?r8`P@KpT7_P_;iKLNwG^2;r~S+?s|>maKEMpQTPX+4p;tJi4~m-6lv&{-k8p zp~h3`s?B$b4`xDu9@a>rvB6P?W-m)Cm5tK}c8$;6k(rG`jn{-0;k5FX7?(8>fKQH+Dv`9wqXx^^P+>RV$wPhGXsd zVqM$TxnFoRY()su#S+7S(T`bGKdmK78Bu!@7;h6#l)LZV)+!b7TZeKu7{Xfb+lHwd z9jz8<&u>;$?ZUIXU%zyJN;Mt2C4bicVWo7*HkCs+Ay5qt^gh}C;Yv7b$=3}dCHDSI z{ROpU{WG`iHOItAO#9eZPI}cMJap=?rmAKO1j6;U2=COm(h*Fe=Y&6>n0`JULS%75mD0 z+*%QmLbis8uwvm)=l^?)4&=2>6A0{!OYjZEfU$ETOwK~y1TX9{pFQvusI;LLOu2rU zriUL7S8IKRJk{-D-ckbgT_e|KoDU;x#j*p{6Bc&n9)d3DGHFYx?5*W7C-d~AW<;sI zMbM{=ucKyJ4*OV2-?zG0c2Ar<=wI#o-Q=&hh>iHF@+$-iA5>3FEZn|2bG`9Iy0R3d0WHx=jBru&9tu%`VgBdNV{p>Fr}$|yH^O}#JAA}*d} zd^%(&=13HLg>Cyr?xZA>9Vprd9>Js+f-OJ3|e zDL+DovgYRX&SJ$;%F7kf_!xgNzsYPS^FAK65I{d!pgXW`i4fWd#>~u3?Y#1ujUenOoOI?$P=(s%?S_jpP zBiXu-!Xk#ajD#Nzk&Ej$Tvy96y#8Qd+p4kYYqadxnbnVT+wWBNXeCBKW`F(*$FB^b z6=z823A6fSfRXm6r_t2_!o7}8s<>q^(?s#=*_9P^e`9dl(^In%=aNDcZ+zuYM_i!u zc>;-F;QR4BoqF_iI1?_9)v@6uCEV0s3D4o_L`7+&<6rh@l9U+%X+JjTWg>0oOU9AE z>~BBO1k<|r$)7`6!|(85Tpx_Ok_s6i1<;(DB)AI!R^;%hQ3lzGl-#M%#D`t?1Oq| zxV97{$5Y;rALEq#`e8t7DccjD0x z?^x@<@9y`YSugD-JgI>_A#K(!I5ezb>bJMs-w*cwkBYtGCTbrd-d}$5qa98DIBX!uqUqIGBOrP@p`RxaT`~7`0;qJSy?Hyl-W0P}pzbz#LRyE!KNiHc zDnBwW~`*Z)TM}^gU;4oKMFoe)(-Xk~x;Mwz0%?E#iGUD*m z1(c@Au-jXE*jdV(eePsiGV1`sDLET;*g!4j}Bo)$B8{P|aYjrBnFA0JD1rsoI!4sd>~ z@d9_DTTy7mN(DI0uHLfCU0{yHePg-{x8FSN4%i2YV-YK$5n+`2xK{&77rI+ zB&v*IkFZsbmX9Oaa<#h;%9!RKsBAxQ$YJa=j`ztW6?{-EF}8jIvOcQ)GIvw~snayzXI zMgnpT^v(`8Ke-b|-&ma(Kc4j+bcJJ5$Z^OYZyF0!G#{8oX}jzf-jV{Zy4$!;JdAb& zk?J|}z)BAY?mqv8=TPV|XCA(s_v&oLtEscN>^L>jqhpg}z41{A6X)t}I2qM0$Hdkx z*{uC#^(2p?N3KG49v7~=yc3ZU-X_$lb?mc*`cL6G6tvY!lJ<_uPES~ILl}KhzAKvf zhxQod2FIj0X_S0!`SV2O!>dWez4+$=WQv@u&A z`#c^{C)9x;4?yC#(r!FLtI0P-7}*-Z-`E#bA~N=JUjAs^cyNT=d&A2qMx+I9GBfLt zXb{MHscbgc!LPi`o_t*^=3&*vxb*6v{P!8$iz1}5`~k@CV25LF47R4^YvExFEf${f z1WZ10aQs55a*dL=FQ-tNfhSt-(+BI4JUETFRXYa(yR9@t`FQH$Zd2AYA zJhp8ntkx*u&85}Hf?GAAtB^>uY`N@jYM~ibLaaIh!>cRlvZI;Xz|9e-p@0D+RXfrN zOy@TxI_1*`ZBL)24>pfhw@+w%xpL%rn`k7YYXGc-@(H`SiSi14QuzAE5VLaI%?@S9U z`HgE=mak@fcb4Rta{^PUW*ip_ZV&N}GRJas)8O=Wr5u*Qsq?1t2b4}EzE1)TL5S$M zMy1-~RCQaMI_m2tvR$=-A+ab|qWCw?-ByZ7&h&v!+Pa1voEL|1Ku*GFI?Fc61Ww@@ z08cCC7$JSyGwoIfs6*juYNFS5Z{%0J&n^8>f8-VGqu?{U^Sk}Q3F=U6EJ{x>U?rw{ zE;#pl3WibrLgPu9t!hyHuJr?`nsAYOzBBf(pEok*M*f(cD7y0aFG%F(RgKXyplqXI zpg1J#%bHi``@KkocJ&?5C#Lfafx&-1Y}QOwYCm%GotPeLN>MPB@)BhB6x=KE7-gIZ zY-~!#pgtYeGyEYZeQownjh%6=TGRQdP1_++Zj@=zM82t`RtWhD2(foazUS5yb5Ps+ z&B0a6tdv*d6#;u~WS6&TGcJAFX9lUCt{L@rr4+zqu`V1ZP!uJvAKIyrr~jZpa$xgw z@6OIgk5PLvK%&N#Z8nUos=!ry^di?m`H15&vFEsP0^}M8u~-3)#oHT{8nNcp^=xO> zWKM~-sdPhRMtAr&8wzJ_6YOo&6Dfu}Zlzl5x53Gcm4wU4Xf|>JQjAP{I)e!Q* zIHd;m8d2j_#%a}tqVzCWZv%MoxF-v*MSf)Civ$h=MWGyG+5POZ!wjtk*MW7>lx#>< z+`z?$;;q|FK{;TQXzURyS!pToj`8@jFpn!g_36W|2`cCmRFc5ntP14(t*3=fgT8#l zb)50+ri9M!4xbx=6WY~H%64piv#+P!;^VTX+ivVXb0^2_)B77)NNval+^7{tEBo90 z&FTz5;QHY{PRfyojs00@xe)Vun+>)-(jzF8?PWaT5+0StYU1sW8&59Ig#UxfN&83~0XOX|Z+VYAn!|!0CsR!PT4J0c8bF=izk&z}ZxRIJ7m6^I zOy?!_P*9-I$6R^j+zNJczIyENvb426u?5_o!F?lvob>pz-qPwPsL+bZF%Nv(apGyi z3ctYcveDqJsKMnM4xOfJLi}!?(cft&0R-i-InUi1njF_elE0m{vmDkCc)@J37*~3z zj~~k&iC-jb&vMJTs1{{n{PuZCnxcWcGRWfQ)qprR1_#>dXlQZTrrOFJ*p3s=LUfk% zIAZ5p$oc~!wt`lULCM39kK(N9BjDKHagN(NzrA92ve24o9~6wi0NGM`ScIwy5IA#M z=(N#>PIs0NxbPM(q74bk_wlvHC@!d62|#iI1Z~4E5(k=SgR9zJ-N%art;2pbZ8Y#p zK=UcT=^AycMSU{|M`Ou>>$@Y^9G@iEg>@V@9<2_C$pmMi%f>ME&g^nFaqz>5?%>t0 zn7Gp@vmELbT;Ct;Sp1*59q6xv8##b0bHbs^>Ig`>8-t1=_raH-itS||!b?203p`1i zjw;-M{3?ZWStH7kSrHqrKffoMjuu8)TV4BC9*8^s4NV91OAVm=V^L^^FxJ#DCA)|{ ziuW%If=iL|MSpc%>Zux=Gk=&pssCoUkj-yNVvvY#5`|%G0oi0NZO3zq)GH(V7Q(K= z#wa|6^yx_oR|5-WJGViVuJ}$-;-;=VFtBwR3PZUX8HB^+gSR^CqrRhdF<2);erEhM z%|oj8zTI=Q=y#RS8f{637($aJ`Pjf9m|GhwSDvM&9p(P<%WlxPqqza|y}`!@6YkLT zhB*5evJ{An+;aw>X%8a62_VO7l;48?nS&JtKkexh{#^=*DoeL;1fTnQ9M|vJx{1qH zP#%2nCM(CpQrEVreq=94nV=sqc)5w=lu|kAIabL#DcbAJB-_3#a`?>jOkU7HVoAbT6d!GKmWPsz<_3Jx!t8^Uf%(-%I+s@n2Xnr0U9JwVHsC>C;;a@n_UNQQ$b0^Q- zk^Z#8%Qj3gC5tidc&fA7fY*l2DVUtJ-+OS?t5q}TvG5Eisz5LDS+Ftp>Fg97m`zPz zIEPRSE`T)?E)SVVt2uFZtBR$BrOTDO{UTo*82?aO`sQTd!JAPI_6p*ovG7EDcP-q}OpQ@Pt2*2A(g{Q83Y1A2XjJ=DGUo<4n#)&1l(s@0Wngt=x4gC_wxK0jd zn==camA=R?KE3B0M8F5JwOn}pN-`KP8t1D9a!xC~h_2YfuP|{N(wCfvj8V2rk3$67 z!_8+}^F9xp>p|^%xiKsKr+w{SJ?*ON0T8ayM)uG;JVis1Ba=VvvzHZfWAj|t0IdN` zP^%Ix)~U-2qlOKAnnR&)w;FkFk369G@=M=yPiv?m=y>1C4aWCt0ATZxeHYX8!0nXOKQhKNLw*}-Cwsg|+jKl}Obpy|l7Sl=psqWB4XTSqRoGuHd zTkJW{OnaWf=TXjQz#{`ZMOrPfwl~mgcu{Ob6X_TB z$x-YMj%D?nMfpoU!`H{_gEmT$bEHSr*tu!PY-U_+%mR0x;0wH7cd3-!HN)zA_nt;> zKI+Fx1Ep8JSxqG$USJ6AR9!Z=%|u3aZyZ4pMNp6(-xyUVCNfwwA zLL(Jig<5lz)2t+cz|JRt(FHbdiRcinQ$%dY`OZiw8X%=za~y$2$ub%|CkrCCAJ4E& zJ9+pxM16KSkGM47mw1@XLMd3%-SoDal&zSJGG>iT zX2W33a@fMXiYuueR{hABn6jSPs>n#8Vy+G04mtI}^{-<#ixB88;04!C@DVOb-S5cG zW|_<;B{n-Mw|^CYftp*4V?6l2e5;!9V#ZI2%9hnVoR~3&W4Y%~`LnxM=QMnabY$&v zAm1!>xxs?A0=>b-a46sms$^?pP}1+~IR5R$!AfyK9R+9CD;nQ~ggpOM7vyl%cF%sN zvyj^~C2%Vh5nhY6PD##N8Pc0CAz5ih9ilJ4r2sL-_AI^!bu=37C+UTZFhfR#QDZ)N zb;vbU1^lVGBS@GBHlN59C=GJ zWnR8?c+Uy737Zp=3zmDmz)V7BV{^mcEv>hwqfAft!l6vV zyOu7!qv~WcX$d%OK(|w%O*dFO(R&`YZH}s0m)B{Ykd+gpc4;UdYpGFcdEeBuejITu z_G^3i_qMuN{0n>=0oWh8D9H(JH%C7p)hKuZmz;*rq$ANBNn5n|e9`_N8B@J)23FA8 zO=S0=oc>!{j}ZEm#=%beg()DWRL0!___nPAn9bHnEv`=UQ+|3|-Pk;3)7MjZRe#zn zt0*MpaNV&_$-CZPY|nt0PbJVu*^9*-0t*Y5pzikh3Owzo$67vRnT_c$$?@PC`Jy!; z#S=l$N`qfzJe`g7D47@Gg|<>p+e@NyQ?fs#v4udkqMQjV0U>3~Rd?>7svDrnr^b-< z8OK`Xi!nvZTiwp7pF9kg+PXK=PECc1UaM$n$bYj(jqZtVZ{jO+BcL+v8|tO(jj_OY zV^3yN(@!KgUnK%}^}jPOPs{{{Sp^Vb??W?3ixQLSkvljz*(X%t8DG7z)PMt}zM zSm&CY&xB$ivb|yC@Vxo#ZwjfImfLs!(f4_E^N$<+X|6&3r`lNTE>MKq8i1cJpsLoH zKO#@}J)%cA7)Pw!wh{qy=lrvL+Tg~XKA$;SM;7JZS1RZBchWv(nOucdVkNkD1g!$g ze&e*egWXg`_EL4de@OYs5Y}H1qf%ymIFb zYxr{lV3fY}n|oL=I3;Q&j@1VYnD~@jc&afzWs@dr5;CQN**4RfYotSc82a&`)f9cOJ z%Du;~Fvh)Yg!m1(_XPIIDFs~L7W95!$CNxqp{rq#k?+6)sjmlgQ*MT*xqG$r8={sL zZ<4>IIz}z>%!uG=uh=#}VR&B zTVVyKVV|%JE>4UHs;yQk`9(Aj0thCgKW7A#E(ab7PE~u zo(&l+5tlN4Z4g@WWKSwen}RwnwUk?i=j{@sE3Q3)n@2f({Ce5&qOmJv>*-8ZX<5*e z#-J(CE)Y|l6l@Zi*2@vo3A+fJH- z)ow4I9``0lnzc}neoUr3n{;5ch@QBx`}0L*GbnDagr0+HSLeptC)?zG{t)^>sNYu; zS%N*t5fGV<$1pTE2QUMuone_UTbu4ROpfvLZRyt^yI>RIrEawqW7Fl3=Em%NnN#wa zQ97O)vOVLA*!RpNo;;290?01qo#hu}!;$SxXJ9#owo%BY++Qa0{O}dvEw4(=F}jD-3@&pRHlD!! z@Tqe}c{%piFq={xv$j60{fhM0c0bhpMtBB2CMJ;R=8SE`0O2fnnkv19+4mqD_GMPx!e8iwn!j~k|9(#FpDD5|3dfQ4Je$}lQTpoMyp0&z91+Sd5?1ctvWR{;J_S{9QkS}QCK|`PLkv0+$F=upbTF~>KYU7UBbXR?(Sh@==(TsFIdh{Ok8`rl{#H_Xu6SWIXI5o zT%8~2zEg&nm>NTPcu&ny`W;IqsGt{&?cW16*?9$?IuKnA%y*5ndcGeDQ==))F|vxw z&iWV4yQyv_mW^as+J{S4N|2gv)VDO%wI~mytdSnfeXI?$hF)T$JNlB$liC$@lG1q! zF|szNbqEjE^q$G%i$Ba}C-O(|+1h`gK1Y~0nAT+o{ldS?cW@fP9oJ1Zwsdf!lMI|Y zP8q=62hd9<2IlK)e?hkK&Ns9ujYM2>mTF^sBa?d7>I^=GdS(48%+Z4UMhhgnqeS!B zdK))~bjfjZV7(%_$1`sv?(*CR7r`Al6G%Z8J#W3EYRA>Ruife~W54tI%~)&;S6=Xr zu$y-qJcDRRJqaw7*(b$V$aSJIX)-+9!4-5i%QoSVOsO%$rJsD|X0s71?O@bei`m8I z*ePEx@1E*8(|(4u+GQ%_C;mF<6c1vu;sg>th37Dxf4bA%Q+dgmgKod;N>8oA#5)Zx zS(s-8HB$2e(J~46z_MmU@Guz^I9-mCx>U5XsxFHrwBv#3SAuOC?RU5} zOaezIuumDu3ch$kQ@;Vo8UWTx|MInEvmGvtp*kx$Rs}KmFH-}zZ;Uh!J)Uax#3Xrw zc`)BIqLYbLE2vM8!Cbbx5WzmH1K`N#9yr0!O%*8cF0-qN(}ZMSVfu12oK+(g648q) zN9LwgxXt}K8y*ma)>ci-tQh@p=jDQ`>qJ&%>4eYRNCV|a?CpQ5>i!KKv?9bsY&o5$ z_Lg021Aw%25p}kJSUx{BYEEf0O7JxY%BFv7Cwf&n&=eT+R!VIB2=|TKSGL0d-Y zCT|%c&E$PvnCl*y#on>_08o$H42p0?jGO6&g8~^Wh>*y{Wzo$-fmCO<0WE%AnFgMU zy?cUiC+Jk;wk=$DZ4=5KO*GoqbW)_*H0$;Ga9QYceJ!xNdOe>zE>If)cN^`VXL|C| zwXEp;ZEY*l#7PQTN>nEoxmJl!lt-La+=n?+XTPoFMo|3Y>)x@U8b|ogX=pS9+Krd8 zQpOD-cJX%S%H+gU^8DC0UX)_IS{upvlm`MeZy?gi!O^L&?Jm5%<;IyI{bux$E;yK$VRTJ1f5&6K$K-*I^~y z68G!EfN_hLE9b1>vB6p|0{t|yD#S3`bk%7e<{M}`3-1lthy%EsnT=>*ietq5@s7sO zo3U;0lbD;-%+jlbCW5pJUcfZb%zY?q&1bJcsM}yOj0j3)K9eI$kXzS!qjictZ#?ll z(}XIbq(Q9oL4Q&>%e}KtmY~FQ1CnM4DU*7prVKxhS%;C*g20#~F?jPKF|aH@q$4-6 zv_ehov_%(VaLMY7DDwP;7f)7&+FiufL5+b8MPBsfb`B^!R9(64=n7bn?jnRef-@(uY+RGlV$VesOmMqv5;sa1pd;9 zakL%04KFS^beQYIMX}E8S13J)Ci8Xb+akcZeNu(s*b;4kKBIb)0;IG0l7DzWOXdft z#W;p^w}K0AnNE+ZW)X^P3HkU?_GAdB8iwWwcxB;k**h!$Cz1R4jM*iTPk1_|K^)u$Dj` zajt>D5D0T{3B-j0`MNh>mgGOqSUcM6(l;PC^(j~q-z9$6bI+KMe(!sGP@I|4W+NoH zK;0LBm&e@8jModvt=Bss;^D||l`6R|d-A12bPKdlvO&v$QtC*%zaWDN zEf9QV(mT8;0(+F7Z6(e-2KZGYpH6^pJ{jy$=9Dy$)a9mZ&VOJ+OVn+7u<0>K(wma# zt$1Ea84X31O$GJbcAbffb`8jZz>kNaLH8gR=U878;DaC66v$)Nq#DDMX^P?L4+^Y? z$?B4)+27=Nww#yQ#q;LWyrMa)101oG@MB>P>U(}7{3C{DC$vZ8>;`(bKm90l8`Cb> z@tH9OAh8$N5a7|VvmLn*I!;Ob)-kF6F$uysW%#WtjvZgdQdA*{NdIKB=kq1PllVZs zvS7yru~e+1ZkMz_Q}jtuNOpwhFJA=4>pbVWV|2jFIZx@XCjrWF*wE=1TYF{3jeK{UN#61v)YF62CbDMC@+Bp=EjTi1-PVIhi3^v zny1Mkh~(>@byma#wka#id(5d)QWnD(N@zp7eSF79M;UD+#0J(LAs)p=ER?;;!gti% z$7yO90GBw>ZnzZIP5)L{D+`@OH5lP3v*cb*KF|H-tU8hi8lqfOGP@z}*jvWHrhGcQ z%Rf~0s_>HY=;q9i?iz;j489$agx`%1s!4;(S?HAmamSYQt+aTqob0r<3D^Z%3Mq#? zp?98xqf{XqwmP$(;9rT?_>+!y2kLyg~R?zL>L9&aV}WmFnkCu~=vKI$T+e6U8F5?{rf6^mN<&`8~!Ptn^ zA)YbYs1vW!DSmm71ec%i22$Sz+6-tODxIJf7#l%;-Yt)Jc{^lCUvX_hQ$YQ9|0yBh zzckVhymSA)xp8mstrGZIJzAYDKhf$SsA)d9&rq zc8zRSPw#GL(^3}dde`-#wL=>(7?#3zQF{i%Rj%#znh2h9tEHVp`lY3i5I#dxXr;<>l+s^$U>-pjF&)YcW{)QuD1inD6_@)hg;p?E#nEVbHjwijJaBm zV6%6yR?~W}rhwikAXbEUX15Yl#)DOfOP&02s!yWS$PrSttZ7l_-cys_hvVG#XKHza z-OMf;yAw~g<;%fUKoJ@d94$Tl3GV+yJ^m~B&lF6bfCq}xKpW7%*F=uDi=(??$EP++ za?EB3?M50HTjoYB6RL`ZH*-Aa4k6}n8bdsfK%~Z#3d|Ff(d5Qpd)vmx6JC5L`T!4^ z9*T~M*{pN4@iGOQVB{}Im-di0YHie zyVkg~G%JPKRFqZbK<7pAiA38wEUyFKhIwYi7#t@IvuAj{_k>r!HT(qa1|jhm#-XjD zvV3k3Ie;`*Z=sFenvO>LJ))0ZJ23n4)kmp>4NiJq{6H)m37^g6SXpIc`4!K5GSBLKIZ-e`C) zx&la?{|n+gXi#;tjMO+}QvNW*r~4)2e1ltV8n2--=AGE@#s8>;|GOamPd*3<5@>8Y zJaB-r*vsi=mMs=@cLQeboQP7+k9P!-u!?4szwUh#b+ficR9`$#&e&?d>ExcFWi5xF zOW_WHF&AHVHd1G3Ams(JD#L3QvavGOzCjumC}Mb65%!~cR7voZ+`1P*9@Dk;aUNsg z@Dg(kE(!?SeKDxI{?JDMCeINc!n(3-#~cUpwB2@itscJQlkV)K(a?C(_t z@~UYKWQ&Nc?xb)7<)sVrxz5RJZ~ceDq(dDFI*XbbhKze{^g=4VDv?(UB%fa`IL^Yj z4hgTH7KoF%QP|sg)7{Cq9fB#N3c$SsCSJ&%%?1^r52zMT&AU6`V!r!IZ*D%(I`$fM3<3H|$EIYI?){g%QKV7I{2BfmVl)s0~ zX!c)_b8OvqnurI6`njv$*b(p2Z|v4QY}jn6oee&?-wdFt$u|b2dnbtZGr)#4C6VEv z84`mL`Yi!&RX;9B5bT%d)CjgQ@T&o!b8Z)mY{Zu{0`nNA4M0B7J{M8yJ?=gnovKRz zJG~Vl!V8gkQG)QAV!Umj$dR&E#a08atjr({suhiuT~=HRChh$~>uf+^U{>%EoJZp0 zGI*N&EGsF1&_1OE^8Kg8c;LV$v@S zTIpjHSVqYP%j-RSq($^A%g?k|KEWf|s}oc6s`>oh+0W#1YULf{&5X%O3BzTPj!F!t zXBLF%-3YIBmr|;bTcAyzGWODl1wkBBN(_VVnAgxooi(X}@@(nrL_J4#UxE}x_I=q& zP7A#>vJBY^qLb=oojrv?x!&%@oiB`EL%$srNRt189Pr^2|AH(YW>@|Nxoq1u58W>aI%+rZrK%Re2%BSVjV z_e!m-c=`5iP62W@!#(n9l30+YX8gLk<9#}}qH zI}p5J(CXOb>U}?HaVIG;=mS)(2Gnjyy}c;JYXI;YZ9ooJil+(8a9yxk{T9#~ z?D+wl8Lp2YNm>Jv%D@D9_5>x7stv$4ibgD)X3l|?o5C}&Xe^;nA#8Si)0-ikM+1sY zX$CpfsfA+9nx#ta4W28%*~)Yriv>QE05BU4aU_8UXC5G0Y0Q~}{;uB#v8EKH-=W%( z=CiES*_N>8@VAeHacAyn9UeQ=`Y9Hs{Xfma|Nq7s{|m@LXq~d?`X9eHUSK-L!vba{ zfSLz~Sd+jz$=r{!(nOlm$;{coX1j)za;KYNFgd_?z2<^`zd;G=e5*>vB^^?gf6zO4 z7d!2$t6Yf2F2(JZDbV=; zR(=Y&NRWa5Uwc7Q@cN4|o@tLg272&rhi!Jic{gHZd9uK*yFX>|Q-?r`M=k^jsIiCE z**w^@zqgVaxVQ9}ISb66_*EF_{ZlAPxCfJRM#zj2%9FvMfrF4lbSy%$EUg#~)s9Z; zF(CB@h6~3(|3PXd$xe(;STh3}nn<~7l^#!YDY*xVZC#+hK%_D*i|4|z?ShW|*r?+W z9y%3lEy7f>KGW`bjwI7V-g9_~t$NF!;}ng^js6Yw1I1x`MK7F-<$R* VKTuya=CxQm>0hOC2>mtsKLCHrB)9+o literal 79585 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 diff --git a/test/baseline/Darwin/fbx/cube-colors.jpg b/test/baseline/Darwin/fbx/cube-colors.jpg index 846780b1607d1ad872da11d09ba8e5df92280e28..0c5cdebe990ed5ad91537d5494af7751808bd771 100644 GIT binary patch literal 40333 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 literal 50035 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 diff --git a/test/baseline/Darwin/fbx/cube.jpg b/test/baseline/Darwin/fbx/cube.jpg index 33dd63533298839e16b47cc6c06df02890f78fbe..5e41950032a4a2853175d929acc5c6592112b6fb 100644 GIT binary patch literal 48259 zcmd>nd0bQ1w*Ni}5I`g%I3rQ9LeUl#ZUq!h9I;+Yuxf3s6)jq+9dN<{OHM3WTBk_W zYiotXq6M{zwzg_3#yJkHNreg(6*O2tP^JJOB!}O3pJ3Z}hj)9mz3-3TeVxGJv)vt3?U5ukF*t&)%flI_|~~)b9XZ3l2cc&c`xn#57vITdCS(nZTsls?Vo1t z+WlE}&Yrzre0lh*ua6u(_RZ-tXV0D2U$}VbYJS0w*9wb%x_gpTJ zjZMv#7Ar%nvqd~KIk7yaPgwSVaCC+g@e33v4SZs^@dx}#ri=$HFxyG}gB3=AgrA}nbm ztd#^3tw`nm|I0u82VCjRT+4uM)%rH#Jizi}>ln+lrp!ZiC-&d2SyR&Cosc_HkIGEX zx;IaB8h7pZ=sRaVyHRp)+R_&$&mZ>O>+!Rinx6UL*2_OJ+={1eepOZ#|I{W)LW>D8%ce!jg)?vmc1(K zFWl|wx_~y~Z*8U{u+1-zc-H<@4s(X@IIE4k`>gk> zQpJWi%gPadZ6g=VOn`0Fx45!RHKlPIRo-=+>m)l09i4U(~ z8SmB?*APIj;RNndxP~qzmi}pWSB-ED7Tjcd4pY@eT=vtIkOrL8^*kxO^Tak%`4=*r z?>imu9o*~Jz?VG>ByUBzbH2m`Bah5fSyj$;IJ`xL1mP{64;a=cM)64le?1try zZDdXHoj6>!q>Y>%D61V`V)cr8hP(YhSkG7nM){mO<BFHd5!FZR;Guua4WGv#dP+ELN|8 z=<3{aZJmSp)$9fh9u$_8aA$+?7CLJuUbu!}YEyBVt!FkqZav%3*Y>7OIZSxl3S3&9 z`!-wWfx1;u&$JO-F@5!R*tJWrrT;XnX)ms}*&OshKrJ8>UyEq-~;Iu=+A#6}|bs&tq-JQb2g<3&Ps|m3QkRL?@h&e`qnmdE0OJ zCXGxVat3&?2YBEwv0dPLvC<8KrzVp`+o*l?;{=x!!VrEFNo4;lu&`+V7=rYT_tG~` zvt7{ia;0EEKXRPb<*~tFFy3|_TRXlEXdpX(Jh_dWzAyNyQOw=xqObAaPsY;BVR38}BXfKY5BfMXg16k&07M{GT@kWQO?)gs#){`}>{4?^0=t^#7P ztogklOW%4LSNfq0i15ZQ@B9$Em(~WKKi)=udaFIF%xg~o;?&J zrc1rY{dk}{@#-z>^}k+T*Kg3EyNAF2G9!0)9^sefJUY#hR)4~K+-W15*V>V}s@K{g z+DJk9B(1dOp2|lQ<4h(Jk*X`@P|T>!d?+)REYUiHRCykECtD}`W0W^D3Am+aaFZrJ|l z%vIbv0PY&5E4!mZh_?3AdFmR&3lhYwtz`2mxi`VG3Rku0fN~2n40iS*u_D#8S~nH` z#R_;%4XEUkW1Y0jRhXYzdrQFL7A{j)zF)BT@=+-|EW&snX&v6l*Xr7xu zULOY!nn2zja*bMaY*dK?4mo>tu|~M~AsY{qSh2h34YuZrQy;&>jQ5i=MZ+~!FS#@6OV*Or?{*ZNB&pQsH0UV) z4zK%-8?Y+HpXCHA?4P!gH*497U!&X1Oj_lLE`;a4OogIc-WgVRCgD>w*)5fF?upf(uWb5&FBy$TXP1DKtlM(&YTyD!b5~1q-l{(&r2pT^7L3BeKaVJa9HM8Z# zKIEua>q8EcZ(laHk>GM5zzI$Hbyc_7jXvbWFYe&5_=<;+APp`tw~;C%bGMb(*ptZ! z9hcuma^-FZt!v418<0$+00s0N*}HN#xtl6^75pSc-_ra&88*8*x}M&}+t+%-bElB& z|HB=wI&fe}=3#O=^@yz8W;Hs^9ehN08Mqh(9*>6d8qJIzkF z<%khgy3)D_Y=W-nq|Dk+=fyRK=jVtmKM666mpww2%YLD;gm8RJNRt7m^JHxmP-p)* z6{{1*QlL9WFnG^j_}6 z1jdwO6(c#}fj}p-57S2;(SR4g+EFTBA59&Af~nzC0+|9*x~mC(c$-vF5HJeZ0H^?F zc-nZl3aM}=VWMO)pHjh`k}g(XQ~7pUR*vP!G?V-LDp(D2$gE7&cJj*pN`M7ya9Y(3 zC=f{M?EnZqk39W%3E{WN!tGZlxvKJ>-2|stLk3(kYn@K@9_d4F;sdtTYhAYVhTYim zJQBLIdNBfbynhZ`eoNI;9w`@|v?nlYy05geSEy-`15Cgc_w-`?rBOUVd>=O|8oG_!=3P#xYF<2 zNK2TZnB^~IpUJhyeASciPy&edfA~k|AUMlG#8wr@X2-hW^PI_MBpJyBGF{*X-p*pg zLkGF1yCVOZ>Ivex1##Wz@RLAMEUA>cGm(KJxhkm)R=1M&>@p%yh7ev37b3Np*>Dh* zWF&o$k#ecqJ*=ZWkhv|d4g~g8C$zgq??WkumL?DjbMHuJGCV#xR#YAJDSYC8qz&hy z6B=;$p5&R}?0ejKRmXLeR=B13RjV@FmO%dQS?~XmWSojp#*zW&%?R?w-uN-()mC*w zjl5&vN?%<2)m=+N$yIF=$UtTqLWaGn>ON)Tr_@=-lEK+K;q0ru3g929ZR8sAMtcfj z)-aW)?C=xUD!HpXGC?#T#zccCf!RV$*gU`-+);!*|5L3yM| z<-1prUubi9KnHo}pk?efi_vKd(RyE1J>f1XyoN;5*{RW%Bbq=KJg>|=%=C$kG$471 zKuuOjl$@ajjB!GNc2K`N5MHjEa6vO{B!Uh$&tHqkHF}d1ZMS8|Ju-BbIu&EYw#&q ze0zdHx^caftek>e5}L!tO(*Za8(|dvCd2e4jat`_$6J%z2*n@~<)L4gaG@}O|6IL) z_CheLYkXXc$_of2nc0zyx~$%fSF$LYMx@dVL3!zu0x#W9dFlK|hLk{YYY=$pF!0hg z@|L)bOqq7uz-Le2W{H(F^UMHMfLM$a$iNr=9#SMhA@{E+rw*``- z;j$_eEt&1yrX6T-0h(m;y4tR}z)b?oM1remU0RfB$by>rt$cWW6>rOn@1bLrjm@NBdkW=m`mG81X-8u zg5drDIHb9x>hW7Y`e*3mH0M=SpFXK_*-44bZ*&_8=+@dzWBpX;rE84H2O_f@ra!im zy~ic!isjsoT`Y^+$et^^<+2KQ;;3em0ZJ^C!|AFgC=C6ISL65H;63G4ZP#fNs%+AbgBm7>n2^DgcT2G5hp z1DRHb)A)8;I)i@=MYWaTQ*xMF@D_Q8yK1h%5-UD_$eu6MR!z|r+{dVg*qgH5BzRkO zRy|LDZJOM|&4?APnAe&`tEDzFN158vlO+C){RXvI;@@axds|Lv5i(htQHH$c5eU#4 z0#tK2=jk+KPdJsiAGk~tN-oz+o~GU@I{T7``R+DoZ=ba+K@x5gbK~6kC$9l4vHe#v|jlGcW8MV**mbV z7p=4bbdTq3PXW=Ob(fjgw`8sTG@e{z1S)O2K$C*XT9?r^*pArvwbo|(cnC4fGR7~daqzFsbqz#5D~1zbBDf5YhXF54sr@=zw8jCl6-_gf7UzKLg*CzWyb#d2xAUD1Lx zy417WicAO}D=DwlI@jx)6;*P{HvXbLx*?RT;HotRkb>nBhl?qKf6`G8JGhiZ-e*S8 z3Vb@5tuB(m89z^8-WyU8O-r#*fhoPmHjT7$JB&`R4S4{pl4@BBNh#8n`|zZwvs`8g z{|$LxYn9=4y2ozJ@^1h@p;Fg0!2P~x@<$Pu0{)z-*+y5w%y`8nZ^XyFzsK*6%0Ea7 zdf_kdD*w5XB9s(|880X|u0MrbsDg`H%}lqLj%3KT$S_DiRK;=mLV&>J1&(^oLB0N| z@AaK~s_8zU{5lDwwHvsXf^x5KDfdcraIetE;$BC14+!dD`-eGDukd#2Wfp6l#Q{Fd z;O^b2C?jxiauPqfby=x78B2*(=LFF#(%pxYx`p9&u}DI`On^u=KpUtkX`?9LfYzP^%D4oq3X?*97lE&D#Y`;PWYIEtM#4I`8#7 z6JSG@+z!=f57^sO#YlZ_3*6JGvAh@y(wHNf)Wa;!hFKb^ukFEWQ5BAvSHx*9H)yJ?c%_HOeqg0&cO(Wc{%#P1Lpz`ep)ZznVx2Xqivtf~I+Dm>&O3msPYbF+@9Ok`{ z3TaF8IWjKZ&xDIc$$6$n6I)(yPZ0Ub3Q&K5tG5nFPr%fZ_o|{}x;psjC`ODMa2^2*@ zbnG6=xHm()kIu%;Ox(e?=zl%S;uio|w}67)up{>Exq;+`Bwy$RiVT zR(ePq;Cz`0)HOHP@CyP(lVrKT(E%^oRXm6E)%kPfPtAy7CQw~iF9Y9mdN(-HU}LTD zb9Gd9CI1{5->*qrWq=dBJEA$DNZJ4rdOA4XvIF`vd#NdoCS=^fika>HS;R|V>W)K9 z$NbK6V6$Ey<*l+Vq_j@$msQ1&C1YM~vgyuHX6yBlo%QFr-DJ!Ut??yCEU`|{$qpj% zqQdl+W&53nQ#N)73x+y9C-QuB3vveB#F1t}HrH%g21=)CfTItXk<`P7ahtfLoW^Q} zXh3X=8iCvi=n7KnG;#HkG7!WMw$QS443)F{Q3azG&B``1m5dQe*%>K;3@u{&g70-i z9{vY!{YCH^#o)8Lhe17u?p1SL)klj}MRvW&BDua=gXAjkLnvQYLE9cx*+Hb4CUW@#rycI(BSMua zn!Ux~i|qvo#0b&U8H-S91w(q8;G@X~IJ)4^hJF@~N_^s8#Y_pn0!evj?kv{O0(EEV z40!Ez)qp7vxL`owk8V{b?VPowd@cESvN68I)*$x|O7_siHK5X2tvuc;ZP-peimuWh zY$IV>w`=U194jEPx;P3t5-@o#_0D`7KZO~rhCoI?V^X&x<-80ef6LfLo1{_e<}~wU z$_lD~;DII+B;bBcvJV7L4xVWGDS^4AIAl9VhF@$F*FnIL4lGh;w-`k&4o@7BJ6Ax` zfUVW+BwG%tPg!MCpeS&-c7C@53m+V2daNr_N&wOxLsC*K7qqVHXP&f&Q6jYdT%#=- zkhgwj$uORkj{uzIMg*OFDhPu*!%-?{Y9BJoZ$5jFH<2JM2+ z27@AW`eI&sORQ7>d8u-*E|6;FUPH^%3mtymZ#WRxQOo%E@dB;fG?D@=#n)1!c)Sz- ztP^-Zps4FB*#PoqR6Q@J*YL}=t_kP{L^R9P5TT?E&3}ULwh>FnoOw+f?1xiMxW5z5 zwxrAtW%yO05D4GTGu%dx?geq#QGBw$5imPAP&9T% zeKHq8ws->erb3_tlmyYb2(3HGEYMNvnO6nR3?doRglcENRKv(sJQpJO-n&#>*G9bI zoyq_ks#w`wJhsFTkZ%LYhJcl%h`T^h%6o5eEm%d8x>$@S*y$uAzR9LQNq&t@JWKm7 zAIICckvw+=uUQ8k6DC7hwih_8yHM7OSgF#w{SCmoxdoCqGk9HrOs}S)b%;w7!_Fw6 z`Zn1N0JwJtv(_^{JCHw+>RjHWQKahV&~%-OPMB=1KdXAi zQ&JHEz)aEkW9fR0<$cw3A-vWZWoI<_q)|VtRL+oHhTPyfJ-B{()D1Ah98p(#sVnHE z9#Hj30NNG6x7Lz1Sxtg-_r$${Xs*g?f;%FK^_gQXgJR{8sY%BgT*2>E8>LWvX@|{2 zvkD8w=^?fc%6Q+#oisXm9KAP`HIyZYy3P>bmAW!Mb4IHS{iMGBhklXv#_xP$HdB$wyXxA9c}Y59JTKL(6oh6z}VS zUjiL?RD{LfiCZBWr9K1T=4e&Kq5mjUMWR6F($JJ|jZOt{*h@$K%J-v%@WfbsKrXG- zj3~0_&Pcik;cdC#!yeGfeq3CrMJk##oT9P}d4Jl7OwAS50PzU=fUl?SiYj2LK2lMy zb=x`|bv2xCVtsNlnp5{aZjzPnCNX<5Q^htE&4c$Dv@$g+P%#(eQbyUrVVGHG31b0ljhmv`+tsI@gyLZS8aIbI>QHPy(yKYs~pl*6Up z2Yys_J976VvJ?ub!S72IXKc@r5kVVEG@<0)|H7tvPE{mcMxXJ0nL=+vD;RF}jvAeq zLV2gq7xC}s+~yj*dB<)ozUl@b%(R3<_aB7I%Imf6_q*MG5W#_y_erqpys$FgMpw0{ ztK?m-vy&`pnlRnTfyye27wvAY$}dbWGCD7vnA8J*9Lk6XPzoyVG&DXvKc9LgP1iuq z#fH(iLzfw~NM1o?_4)>4I_+kHd!jaqKue}C5bqb@ z3?gql9euP?-U*J?=^)A==#1?^NK0gnW^oSvs|eb^GCWQe|59oRiQ{92HT}Rgj^Ta5 z!IN@mM~c&qB{5lIndTZg*Zs#n0J;BA<+mo) zhkFT0zjJ%@>(a4ON;ww@j^|f~a@d_5+^2SUs?()B1H@fsHf?_CZ7j?`dvYP1m_<=~ za8H$m5<=1G?1?-r0fQ+Wdhtc;ym}vIZhU1)(GnS*dpLNgbzbp7ZHIx~OptT9ZS%<& zhgQzJVYcb)V39AqsI$+r;xi8=t3f@_s|L7AbhK_p?9lG4pp^dWe`xbb&==QyYL+3{ zu7MNj?D5vM&=yFJ**T#J}C6v z2o%jjBf~%G0o#*oRC&EOjt$;VMgqEO09{+Si|6@sdOk-ZRM$0iXnau)C&2zA{KJ2T z#urEXUVo*1FE#pJK`5H!hkMi5_)z7W6;PZB;ubGj;ZKIU|5N)PHfJEmtF&PG0 zDkE_W`gG+SI8#GaORV!2#aS!h4UKAMuD{u4fT`KZ@~+RbmkW<+Q8Iqbeyr{AY_~U+ zV(2{qxY%%73*7T@ExwKQrw1Zp&kD|s%ijCtKVKYKCHU4VDU#QFKh zus~4%rjNJln0#t zpj@hvcX=f;c`3^I?PPCdOH-7t+|1AFk`Zo3jbJr8FPqrv1ux4y4-hJE*YIB1#>SP? zLfXCh7;08DE#iwD=vK;03N$qRRw^!E8W4HW&KefWyG|PJnP-5)+I3PS>rG*P`WTyz3i(yi zSsfBGOTg7H@PLr0l-A5MaHyvfMAxHRl-bZ7Fr^{76Wzk6B2wwk*P}~{a~C83L7geZ zAlV~8vEW`p%W_1D{hMal9a^7HfqKuPYD7VS-zMX?-~z5uCp^>AT)k43+hVh5-4A4z zOyaqV@Q~hYFq9vw{)T8@c5W$$Srhjw8S0sOTN8fxxXGWEEXag&4Uzh)c3%OMEMZ>R zHew^#WuLhhP{{#doaW3D=)Y*lCQ6TF@tD*|s=?Z50RLlY_rVJSTRaGmP^l(}h9P4_ zAYu70EI|PQkb#Lx>vb(*B@|^G=?abbp%s6E&vX>`cPE-`k;;eqh?$sY>}W#Y`LA;C zz?03W(8l(NI24fn@SAl|jw}I-1!u3&yr-R(JejbY4BPyq0E+ zFV<}wUxthWDPyj81DlQ5?3zAYii%ESc z9nXWzX7^87ZdJ!Eq-}>?wC~NDcuYV}%Fp#}_Crm`AI8sqrM#y65F98&4QIK>TF6nu_?i01`erNx>M(&culGg0H#kK- zfoyosL6V(fj)qr*rq3mE|==L{ba_NYSz1|nl;G26ICxXH`&rGnkx9i1(Tf%fuRuYcKOpm zYbd~P`Cm(`-v=|y=Q~f(Y1YXfviS`%dtw`jGm3VkH#XbU78(8EfEaykRHok6U{gK$ zO_C|oREW;fHC0fA^dvYAy_}Ol5ld@|+PTkx6}?xg8*Zrv3fbg^B)xzrdcf3OD;(`5*B!IU4*_&~^ysd2jexkcacBsgI$f*k zZt{=R*TX3u{25LWX9<}&uW6(GaGHG*o5or*sGjuh5^}c(2-lOeuY>H~&0oPE<5RJ`Ysf1bqcZX$)Aj&+1GbYq-;^-x z%2qJ#tE#8=nyMhpKDq?_tBWw7A44cV>tCfWEWWXl4!DjRZ*6XD_RA`%J&pW>glXvGAHD_giEXx}xLWj*e@fd2(u!zR!YWJUfAWUbXRt49xbP*8TH5 zI)m(9oi|cwLB6t0m>nFLUeJ@M+Tj4)!=yv|=NE{G8IBeNa+7O?sB3qGTQBg9pTIZ% z28pIb;2Qx#>zZmb>-Ro#nFEbx7#u2;D>LcdVq5#gp>sW)cCMWgM02{!;_3sL(m9xd zFgm?Y4IbD7g7e7=i80ox6g)Lx?(}H~G7S3EbT2`4>FL44H4QE9wljQiI=kXD;`58Md&nP?QA7hlU4NrvbmYn!Nx~!$kodBhaBh z&+VpLoL>n`4_Efbs}QiCHdjNkYWSYa*uX~dr&Uj%&j_%vI3X3d{C&)5irPS zm%?xa<;dH4t$w<4bYQyl9lQnkIbI6iE1}StjqFpkj?vU0hOtSmP=8Tc}6z;K}Eq zzQTM-&P8OPFdFHqljq2bbe90_-j>@;wq|XIpuyw;=88H5Yi<6 zD|vbB{Tsp!Zzsokwl0W3XB>ZC{d#d-0BZaFWafqtK3UqpM~5=X&`Rq{JP%T6dqX9? z%d;EEv;SVw`W<2Yo0mlQEAz%Ot8dGF`p4*UkJ4+qstO$c5tcq0PXw$bS^bvUMuP2C z$$fUky)B)Df+mAZPP%_XaQE#bhaz*AR~DpfAXDewla_M1m@sgDt%uVxv}^G%CIjfo zxOSg|OnqS7xIj^7#B-;?rvRAV8~F^*0I}7}4^oBeDNGVL+<-Og<6}J z8i&t8weox98p)mTSGdye>NMAfH|5KyAj;iK+7m0Wb^v@wK=1@WnH?Ce2Mf&^90FAe z)2435WoFzohV?UC6#2HbBx9W7V3oXU?40s^ED8Ju`)ELS%u@MJByJa2k6zd!i_uZ0anVsXmf}L&Z z2Ce(Xyl5b_@4`&be~n4rWe4OS(ULa)!lRQS&T{995e1aF{7(xZo& z&Vm}9qEUA{fV=|4m|qzSFy~WbwJTKm`@LJcO0A#%8qwz;E24FlkYRkxa3P|f5F$E{ zM)V7)^-<~ozhi*kXz|J&_CnT2ADGSoqP&0=~7GeV2<|CH*c%&4MlWh99hWk(}r|MB<8LH?{+j7v>p#|s*GqnO(Rm!`3GzZjOAnyk+upc2-FZ9Fg zfq>Qhel>T$q3Hi&pv$T&Z3w1mIhUqo2!&<{g+qSLvi~tHl~&jA9^V5GHVSF^9h#PF zXj<+zX|wrf%E1d}F|>Z3(pzy`?ybFOpwrIBaYhq0DbCaYBHRlVn-{pqLyA;jR zK+9Q}s)2UeDXap0p%300Dcg39n)=0A_7%v&70ANh>A;6+5{{!ucsNbMXa9_leO=O{ z5k1JD_316!F&`?#Z-z^^DvX5$ikA4!D}rpw)TxyrXdBsslO26!-cx}ktxLS5JHZmBU-MY!r zAfOHnrp;!0r9L|rXXmZ=;S~j8Qc7_rx2aXJDlQ5s-$2+ls1%MmA`jkUzZl;mXvNgyO^$W23FZ}`Z1i9{gMtn1yGOpk$S|hv?sx1Q=ljr zoRwfevtqDrCWq;AZ!Me>MoIzs2Apj5W%xzVo;{V+DVC{QPys3bQd!MTM(RkQ;g<~o0z!9I_mg%BwrgBP|K)es;L%^=ziEy#tpa>S z-s5VnMV5mfcawSJ^HTKp*bA`W)0`K2<22y1`T$cY-*X@8nU$Z8$F`Cw3ynOsIw1PO zqtbBy<9xmNMS&o+YC(3RSrOa2n8tnW_jW6y%&TDQ#}X&ONaM`Y~lb zU4KZH&eRoRgd(ZkioxR`5Ta#M^|LB?OoVct6;itK{Uun3GuBv_Ed%ol>*0|QU`xSF z{|xr>oA;y~HEU>Nqpd|&?!$Z%SOw~=ZUm``j{A;_15D1DdBTJ+YHX1E%vi#vQ9`#l zcT#1(RY@a`@{zr!j*UO71`aM$H>AqDynm0yAWuq1GL2GEf2`V%@=iy~WEi>>+bn1# zH6&6Nx{tC@%qUP6I{4pY=KswnrPbJXOB*=f zZ%uBMosppUy|O93HVpLXBBD%cgf8I2j2qdkW2^XnKuKZgMW1Z!p3KE0i1uw{%uvXK zV39alL(Ep|=t8*P$1Vii`Lx;ZMd6k;=Rr9Q*y%%0y@9;E9vx=7LoT?_J-B9G zcYUb?5ywQVl%hJ=Ebloa*z9+sQQNV9cUifX*2c0wJI1Iw%4Md(Qr~aoa+*wl#R(Cu z>H;nuHK7OZ-zY;B)UCG^iq9NhSv)N&+&6|BXtnE3J~O@N_c4;(KC`taKyW8bUX2nP zT%bzpUQfpg8nv!6Z4{JeA=HkHHUkk6b^;>m1VHS}Ix2!c01q|Skw+JX8?{`^!GRgCZ&z<&#Pkv1BLGF&3e=0aF};MTj}XK{~IFw0nd#> z&Ft>&saqwS#_|1@_*xeAT|ZSwnQSLcOb8UMPED;wMZ%7z7SjlQ+0X1uGak953Sw`e z#>WI+mZz%~v}7QA(<VjE@=J&iqTvb+>kbH%cl*3r~u#s|E#+G-G`9v^u*1^EQFEqYt32{#v&@ z);XsY`SmRX7Pkk?z8MaN7yhs@8jX%BSSL*}TLVukL?C%;6poNukQ-x{+`XoH%J}FN z^>1?0zp2@~449esjT+?QwFwb+Y-}GZgwuLH4*O4c_9<&sLnNED`4EK-(8YykqzWwi zt_)pIvbSV8Wfp_Y;KN;tx3Y@6K)kopD7){Yo=@IYv4&J$3L#_jCcB_R!Z=^hi*F#3aztj}qB}9JPcj*$wV;8!I~mHYo=8Dn`E=96pP^Cy<3K}~ zpL=s+)aB1iQX9-8j4p4cX8R#f(;7emd-Pxa+ut~{>dDe=@rdmPYUU<8^ zozsLeQ#NLy&N4F?mK)JI68^8jermApfWEC=R@%HQY7F|_+8!vj zpbP(nzd*mgr~GZzirJ0)45O1N$BJ3j@IL6#ttv=~Zop(&^9fW~`{iBZYb?N|uT$6f zWkcpTnxVL=dircs%^liCsPoj!5PS`k%}NiAX^eGQ@1K1Ks^aVC@=LIJ>oG3+*B0-; z1G#?NvQKm*uT6~LB_NGUvT_Sq4NaIKcY7<3As5=0Fry|l>%_JVaHT|RcS#W4KqyG5;?O(fC+;L< zUR_!pP<3awM7uB{!Zc@^0*rscR z?CK-S!A3$b{B9K}ktgwBQy7x^#9oq3J3T=ci|bHyPvx5nh0*bn8rd0)1srH2%X!&_ zSSM*=E&myE#mfJ-Rl0iDq(~^c4Zy<7u+`>Ll8w#Lb{GP0+fSw|zF}oQBWEPhRIWX4eCLkmLcUig2YFbZNm97QZ7R0x}@gNk6pRm0zIJ%@3 zP^BDV#h&K7u*(u#x0YC!9k1wa3F+No$Ukz3Gz)>G)Km8kdg5iuo*nE#vTKqRcRC5VU4)T}};0z=T>qV+K@rbLZg(iwq`$xdC| z8S8d}l6VPEd-^X8SAzZxWQ9kO*?$XE10Amg#MM|vlv6_VBqcekL41}21^XvF` zRl#~8Fp}F-N5a@*dr7UfW7s!PGD0UmQ0u|QlK$NeqCcbtDQwNIMe!E0yUMbieCNm- zJ^m>~O#u+0O#eqqAYQ(-n=D*kc^4sr{NE%F0UisH&LUE7gKqfCyLPLQqBru;Ci9^j zVCFSOqo#F+H8&qzseDex(}oK0nHPPV%$Yex?fDoNdBs z71l?0px^I!jGFHAfbO-Wx#qo4=94F@%=&Vwf_Stj;yz>9Hu4I}KD6{hnNcyqQT6`{~5gA;!L zmHz!Je_H_Rz~4|{7BtXKd7t()o^%f^WL6S1(hAX~TGW6R)PP85p8~LigL^@%UbnGn zmFLI|H4=HZcwUxmZX;guZg+SYrMs(N(aC6kG|Q{ftS{rh>a%-XVCfvxg#U(ZMB$#8 zt-6csk*S-goJTwFJ+6X!WLuC)bmuG(xOWEBrQrANWOqQ~dDWA;IwhOy!%VW`OilEC zk>}G;c)WBh9;I2Vb9{kaff<+k1yGwM|9uiXvQDT6-Soax()}W=4;qMD08=Qq=SP`P zTxBMRuBQBOpAXk|*wcI>i{5WHe|A}w`a4kE3Xyr98FZc9iuoaKloTfdh$r~x-;0K~ z7KSp}UZz?c#m@ZYzky?nN4EM*%MLK$?A!t=LiYg5_R-c4v6T%hOjdwq$`WSW=;jkg zZ78~@!!Eb1Qa+DTE|gdLQ04_kC_#UuP!>c!U(p|nfxubuv#L)d)qf&THALaey+1s& zpjVeV1jB_$Epc?tm&IP}3PHg-M`FTBYpnAsV~R6*X>zl|C`gOoffVRokMOFY1@IJR zq4Z{Cvhp}^%^)elt)gufQg~w?z2}`h>~gleLEEvr+T4d8z#4idGAf&%i`exsBK>#L zV5D33tC_kY4$z!eh?6~~3 zIhWPLe*$awL!Gb(vymLsa9*pZyh4MYsz)S}7W6o&4NE=Ei^|tzQ_J61<2Gl}kcJ##FRRsvbeeO*k)QlBKeW&d|$h#KQOY>1hz8;Z&pXc_I zmq*i`1qhJpd74+zaGv*okHdMrE~}&Q17(y6W0IBrR&_<7c!GDnUuuJItnF)i|Pgz6lDcUv(^|>2;L{?s_mHZpM_V+8h|MHdB!Y0?~ zF<~T*nvBRs(+wy#+5RjrHiOK&ki7T-J&D5EO)8s={L;6zWSbe69OHm4)c1x#DNtjk z#IK36(NG`A$|KP(L4vuuR7OXoJN@!NjnKi!#qcW=Mde_W_|HIi*=S#josI8|r@ciw z@%sDY{2yP*Lp?A3PJZ4cd7R8_Ex-4K&|TJ>3_LJoJ(awH?MMtIw-~$E~oc>HMcTI=hU^He-%T z9dkl+n~qTpsBBTbLdRNPAG3({pwg4$`1F5O8vYSPn(@gN*BZ=dEe}kx=`gT?shr)B z$yQEiGSlN$geLO{yQBrsJ=QSNf>Ejwn=6HO&vRG0RiVsWY*d08SnYr{E)TQ^D>0oM zDBpppY>+#*;ZoXsa((f(LPy=v0eo~E;16$p(Gk`kQ9C{HEAS;rCt=s$*Wb`oLew3rfE$B61Y1TF)1?ifOIznpa|+7R^^YM)iCa+)qz)DK2vP3P z5!W@G)}=1S+b534Iu$Up7JpA-JmpdJFvg6SDayF5AQC6p@_wqPo-C7LkfH0Q1~oe5 zT{qR4S?p5(wny1YbzB2lVTUr)^3^yd&Dmn85E_*_@A%qqn{)<;QT5&4@hwV7bh()Q zv+h`hlR$I+z8d&PL;xLl)CXM-oy5w=ZvE1xV<`Jsf;gL37jBbG1WCmp`DiPqqwiq% zK(b~gizy?YT_ZHJv4Ld^^Q=LzAMCV3kMTpA#cZXq&M%DcrgKMM`aWsXMG(~v5spd4 zwsX^VP~1+(E~kVczJzh9KRCW>EFpo2gYnAiS%sxkj*e-RfroP1AIXbaw@r7IJ1{D> z+#mEIf@C1(K#S1s>U)pHem3mV3ddk3y{ow|?}X>(qOshmp_;>C0h2PL(&#W)GQ#RE zMx$QY@QpIs#*f30|INswEFI?*fRUrydtKH)XRWiSaiUqpqnqS+n9}u$#C-KxT6fPw zv<0KA#Z>#1^lw^gqcl{NcI%Z}#u^~yZb>uC4450p>T9}3Mba)a8mh6)%Kgoo3S?=p z@p3Vp83qSLED1aNmPJZTw4c7pK$5XLwo~|NJFqc9gr(F3+x+HprvB`!J1c9W@34G! z@-oW#S)8x*$Sx>u9f3#-@njS5)n;(IA3IwX((YXr&Mgj?d-uI$$F7`MA(Xs#o=I7b zTirljocwN}==2UR%t@7+F!zmo<}l-kmFjvHTajKKSLR1&#ZVS63MoE{6NJ#{iBG%$ zt7C&^H`CjhHf&Iaw<`y<5iw>4o3$MSKWX5zKs+nL2@a_EBXZY2c0MUVSzYQa_t~9j zuwrwi$4@WgXgYdwcHsD%DMxWS4&r|G20D_ClLWS;9a*%9TIb1c7b!61pqW5&%GHZ` z1uob9K(bUXOetQ8iG+sgyBVY2W!sU~o-$)c2YPUs3+d!=Kv*2gWZEK?+5BEx+#1cF zOXG7K1N_)mH~29e^LRg;)Z3|nZFHP1C&1{$x2Qqw~tidkP zE+3V8m*C(U*ildLpBN?-#h5(i*-)l~!=3{kGFe*-``_A-(PQ*Q&|C^PcCP5%wprrQ+-W0Fs#%y{TrD9C1<0K)(tx_ zdxXDnCr5fMX~bTKIz;H(w~nhD=$@L2;%psuF+kZ#7{lvE)3b9Z6~!ERTy8wTJ97)O z+;{z-7N@Q;Xb`W@E!1Qe(!(*Q!@BmU)T$dWHQk3ZEbi@gQ)l@vH6xwT-6u~Xg6Y{s zsFI>bm@w@EwF*0>-_EYb6cCl%kD2iI2-6v6jN1wg!!Kb|0e%M_EBB)-3bjhWUnq-f zt_UBY*-tyXh7m@mw^xW^1I%Vi8-504{4# zwE8VfjMAa6A9NNOGFX(E+1bl#m*P9EZh^dVaXWF|K!WJppQCayGpCuY(tF%#%w%y2 zEge&b(x}F%EgaIvq;y?htTkql zd_P=?L00`9+(!X3BQqO%ifGYdd6$b9(TXn*sMLex$1E691$f7)o;yB-Ol-wa}Ct;Na7V@dF%bP6w;v#^E#}#~0@P%WC~m^#J{w9!jbd z4+N})(J#?4q{E2#8ZfF%1S0vDvU-YI>yDJ+h**rYlqEuM4aO-pQg1y4r)DGZ{nR)4oOC%1JLOOcMfHRQ=ek{(sm4|tI9Q+r462P`u-pPB_ zcFckGjsFn(+Xwgyy4e}4ps|cNTi&F$uZuk4W{Z}!q*OvQVb@Q89O8sFKx!z9z0+?g zuyv>mLSR+W$TxsGZ)l*r^9z@Wk!#MM}`$Z^R(sekdlOppG|H?|bN38;ItcVAK z?T1ipr#}Lj)A4$^7ryG~QO)?z|4u|#Hrv0^o?^(pP4#chz{c{b2iSx{2V{oDDHZwo zHYC!aEFI<<_V&%R>EyHfCC4bhhC;$gyrLQyeo>zd)#md>&sMXWa6HA$XWQY|y8t*V zq*<{qzVyP$6EzKvF8ZjHj%y(I`l49qj+}s~#d&G;+o4M6K1j{O1Ji~)7LEEB#}oJf zdjuvFh$hU(F>*{|QTWBYB2F_(P2Wy3Jfn}IwrK*Woc1f(N?sg|uixqrxM&DHK;`g; zOl_(8UHx$#L#vX|d3HH{FCvb2Bh)0J*M`BV=VdlFM>6hb=nwy2d4;}{r zoLh(tJkjWEDXZicvH0czGxJ7nzdv@+!*j=Wvaf#zcSV97V3Y>qa}!Zv;u|}hd&qDi zXe9aw^vr_ihs{j6C|svcMr(5~aHd{y8IJm; z%MN_gn&{iik_<9!aWPCfqjcqV0I-MA3Fpb~z}NnTGTy#o$gl6I{1+FuA5Z`@(-W)y zBs=5K89hC8MrO^p7iU79(--F4)RBz;#khMeAPW2W`X<8`RH90vU&b&%(!C#YE~*~y zeM|h?w=#dR->9aii%k8-3uv7cU%_2LYiU^GW#Cf~`C46avxJ%=gn21Q~6@-jG73FyQUW@<4z5_>4R zeEiL3%qoN=1<)s7dwW+q^X%lk9_;Gkm1m*lfs+N1RVa-B^g!%hzEXOGom0#r>=?#3 zt)K+!6f0?gub;x+pZbL*hh|}LE5NboZWwgp$2@@|(GoJo1h_w($Gg1~4!FNZPZyfP z^z*xw2gt>d6BL_qF16Fz1u5$3G$l_?hojC3H#tt>n-dmR4e}e4Ehz##zbT8yeRrL7 zaA6T#eQvKqw5>iUYbiYtcRo3+ZV{px5S?JEb(~6OQl=iIVX$bJ?c3I#>=Wa-Dgr z{a^~Cqy?XF>aL!}7m2)lzxJ2M|IWdHF~(tUX|K`U4zA9!5_PTd-iU+*?fHJSO@mXjs;~)Pf}ljn!|~CT~Q^ ze{e&l6q}z!m!45(LDwCWwTvFQ1-ICxG-WTOCj=dS`zL%G4F2Tk4L(wzL&Kqvn%?jD z(k8Z?9$}KM8^L2v1C%JwHzV9Ci;Jfk&rx*?7Yt7J$3(glPD9y-;v7T%;r*)&1vu%1 z9u?I?mdQ#JA;nEj*XQ=O8))TIA=_epQ16R*;ENOo4P4@%Q$-`{(y)aVj1+9Ru_Tg1*uFH*rUn;-58zlP7!~I} zc137K;j379&3B?ZY|QfNlt?u_ZtMjtk)K&Q>;h4(>cZn{ zCgSV?IN>xy*B3~G`e@6CN#%8oIIR~9?QNJE2^BrXVanrmH>|C24$w5taFFJN+I?#;-_mNRfi?JUQ6Rlj+0V%9tAGr0FADz)D{-%&6E4Cp^prn*I))Ga&LxC1 z#{LYKz!waJ({F_-V218cEAj1nH2D8tb=Mx&)S2eLkVpWLh)BHwQ9-fQsg5uTXh^KB zinYM5tru*K7A@GZf{Kb@IH8Q9wh~)#7%vdIwu_zCM#Xv=l%Tkx^%ABqf{K7*1w;`9 zB!ndF?>#|kyYoELtn|U^IQoQUh zMDM#7i9Pu_7JU~Bk+5JMI(%WTfm6j@hy-_RME;hJVU8*JXVR2r4&?iddfZp*WmBZB zH)-?D`xcmM5FbC{;zmemHg>+yZn)Jx7S0)qL+apH1F>#4ZpQY$a9ebeFQt+c2P*zLb)N}7%d0n7d8<8^hKGJK>otT#89 zyCh+xybgD|Y@sTR?nCmaq}oIB4MnZ&sG(BHZ?Spr8Dy#S-1(E&maGRLuHS7zvE;mq z4dBas5At8>2IDoZbQlk9Sb1m zOz6Rshlm=EjYJtfc-!0$Hz9YZ-tO!%*%@r;H+G1z)MWp~7S4M><%Ewz4SC@c(^^9$ zv~A@*!3rNUa6+|E`h3n^I?;wo%G}OApQl#`r=9?hpQBl;zyzVA-3y;8TPsx(uA9xD z&5j)rmg7Akfb#3Nh}%ut>7vydArG<!RwkyLOjgI(DJHKe+E!~=EBpG9b_v8z1q#}&>=Ib962G~kT{6Zlf0Byy zR~V2yZbqwzzh@AFfgOhA6*g3YquTY_(gUJ#6*cP+eisBl>iB?6MgS%)ISv=uGW`81 zLZXwQy6iz+Q*X#8D(4S#6Bnr$46ccK44-ZbQ4Mqm`McGaWLI34uY`B?Ib^at4|_P# zEW(d3efy%V^es`%s2(-ciF8gLL%WX1iX+&DP{6}wMzr95Mer@kDnJpYf6F`5c(V%X zNin+Oh(EJekDiB!)aV%xI7u`4|FRZ&kUrx(ulNK-zisS8-X=@2H-G{`b*nfmthJg1 zk%M(#+8toX>RoyQuQU^43^Dty$d+0dB75vtegZuqd_$A|u+B_o>~|L*8Pl|oYtVf! z8Iy7VwjV%mU!Opq2D$Ji_AU2)eLRmaB%*8)>udfuWitH_d7{3i!qs1I{S3Q7-deHt z(Sx8QUp+|CeUGxZjePAd!}9pN!yJZ!>`>zteh#HJTc6r_h0WV2YxYCG0VlW*)wGvn zgIP?)<;SCH-YrYK=VoA~DItN&=8I#_k7|mCcmFg~08i9hg=k3JiE5XGAP}^8RS{+% zxqJ=_4`VZS$bDF_3-eH)BI|HrWAzOxpt$geDxce76IGrY{n@pZlC|HXVT33$8LtPK z4mMpE_54viQ`1||AJsFTzn*`Q)fo$&sm4kFD>FZXU#t8sy1Y# zjv?hWS+p!%m;t^BVp_P1NQ#A4l|c=jb1?h#Of;GM3d{p1TMk%c;<2Qof{FS_ELM#X z+9~QTu8d6pt7a|ox&x>oe1Q1w*bUOH=n|G!nnKGm3q^TQ`5x7Gxk8|bZTK0qpry+j z40RXi^DFAn1B4Gv+gTD`@IOi+xr!FS&gw*P&WIHWt(~!yMZN&}d*cgKsbSE=P!s!x zvbZA7#vdzGt*8eI^Gpd__GmUG)-C+p92PSTXN8@^MaJe?ec^*gcC5ju{ejf|eEA*t zoB@R)hY^Rspp*BWG?NH}s*L#uBlV)lKB)-oCIOPD(?|vC^ZB4>rJGHvy?P}rD~$Tn zh(fQ|#63cX+XmooFz+T=G2D3%`vWv+^v@o*MwK5f1X=NrbOKGu4b@f&h#d3(5pvkf zuhIOIsr-DsMqnxfrqwrRlBujiuMskp725&ib-aQcEvT=kX?yq(DQ3c5hp6o84)`cs z<`pkaMft`9cCW4~=IJLL`ZCW*ASf}a_c%_2VZD4MyaaCnNb3>i;3Zigpmsc#)IXS2 z`&{Ww?pDg;@imV<6h6{5Uck)2sES~RbVkkMHhgsl@&Hu@uZ4xq%*`bpItxm|4otVN zv9goliV3>-NE6AooeR38iJ^8_FyohZ6qkO2{SLr#ra7f^8P@HbBVC%iG-IRP5|O3_ z=f*4_F`S#|C|j9(!m7NAragZLYof~iC#>9e>cPu|(CJYzclYUT2IC4dzd}{qN&>h4 zQT<)5L5NjopII$mEQaocuAD>P?&8Zy!z$|MOISq46+Y=}aA(E$iB=&Ly7lSh$qi8b zfGKS=vLR4Q$Qg9jj!nGREdgHoI<)Fi^!Ixr)gs>KY$UuaJY0^Jfu{RJNlk+Xu=khJs zcOXM3Ja7m#j(uv7BmEVoS7IW%ay^5=zmk5WHxZ4^KA0_8T#VqC&TKuckd{Kv8XE;# z8|zB?H8icn6mVQr3dLOhd`=}tNxrN_5RR0UG4U80>Dn#lloUWR9k5$+cimlLzyd_$ zTEU6;EoaQ~b8rpH$c@SI8i&v8G>0uNKnN&t~e24b(0-0HCx42LGpec$7H|mDV@2 zR}7WfB2c8lkew?ex$U?nAr`M|v$hoUD90w`&3hq11$`$YwTAjc+P|BmtwSHrD`+o+ zal2Kb$>N_77(fNvyhtpt_PZs*ArQosd`vL2JV*4V!0i}p1(=`_==ttCB`Ud8PmP)e z!zs1cS|)I3o`L=XL0}-Y^z;?N^_!$`-uR;7;Sj#v`#-mxr~4vt1vu*f%MpJSnN|#d zM5D|b^t&#i&>*!>kLD&J13Cn#{fQZXMk;VSqQ{Jdt7}Jo(7x?#*P^Lj`m5?u&NE99 zK^D1w0&qW(Yay*QTgZ>o9VHda`QzMr}Zzzu)65)H4avCPDI+ArAbZzPLhjH0cW zRiDM?e3M9Ur>OB;-1HPwXY?0LNH5o{hL_vTQMR!|S|>&G<%Keo9>$h%$3MLq9n!6oo$#Sj2W9Y13|FW@dil1b-A|}J zS$sw}`?m9*deGGl?`G-u>OogJ&^gi$e|uGbk|X5*6}75bjNH~7QS0f8)HGByQTs$c zHC*VdpVP&=941_OWE5EaS<(3N7JtEz%*rI89JTy*2kZZxLq@p6$FM=vu!gOt*{jP; z5-5e|)gxE<-ADa9Ab<1c?R*jtxN%~_>L%{0Jd3@utgWsR<+>oWt+~FX=4PycwUzL2 z7?2XvKeG)AqJ3--z=~q|;N5z->u4ps%VWJFi9_#sKSB9H_R50nFhbPD_w_rouIU zy;Q^3E&fLBonxQ3BoW5iP#C|c9=dnxdg(!+9Z$2@w;~Rv3oi4oYF6vQcHAO4VLdkCLEAhUmMy8<0$Zx+Al{ znc^YkTPmZ^yj8Cyle0|l(#Z#FX=c0VM8^?;xt<}X;6=hcIkcgWRP zGQv68=PZB^rh8&nGHT>S+xhuo6P@iyVluKufp$H*3~b&j+AjE+`eX!%aO@=z;5*FO3IR=BrjJ#aJU&>6-O=%%V3;%F7i@c{oLU0 zCz3vdU!GNu^!0!i0T%v(&A2Q+3H^7Q5A5odmQ*YPgmmyf++Ln+#ucazbr8h|&DJah zkm?tiTuxQEk*P9Xr*JqRaAe^kGMK_e$Ox#lN+E3;VRbWJCpiyrqhaB{627QbZR1la zDl!|P9b2C+af#iB)8MN~7KNiZ+Mlo2v_DXBm?}eKnV^leZ-Pxkk($>Pk{&e|HoCC} zb+|3)Z|rqP?b8F-X~n}4Q>qME0WV30U;?)otZ5*Y@R?gVZ6u|#emdy z=`J=k#Ci=|GX@HVr`O}_+rvAgXl0si(HYFMz`u@dascTaHvTF4s$#mT!KUa0KKYg& zrBIzlb;vaUw}4j_HZ$M7P1SWRIl?R0q(&Z_65%F849&8_VVQS{3awRGk#CnW)0nJq zo+v>>3;W&3&I1d}Zy4wa1}jUF;smbgWpx!?`-vR;LGTh|Ax5xm`!)pP15ow$lUmHX zHiB(E(S8x1BG|`=5kA10f=cmGaw*I&dMTq<5pLgSAM10yV9e7-&Hi};7+-Y09B=m; z_*R(f3+-!J-KRL8H^R{HIU9k9DDo3w_~Ak##TNcrtvbbO^&3U)BaTCEZv7-S!lLAHGpBKkIiZ1&$XA%0OJ>R4;pPP{tBIj&OUc2^}InOK#}gkR#sWT?r>Z3h?PNb1_Hc z3Fm=(ehP&M;kg@QQ%?* z$=NUnKAmXmQC1MsrOc(3GU$q-MREc4Ls;u-^Yq8!PA3*N*`njG?0Anm%0;lS310ac zBvL&C)8MnP+Pc~ADdq+BA*DpC>-1;e*HwgzmKU!#a7wJ^3Hlt2grZS?CM`Wrm3rj( zdZNsM?0n2zdY%$+sQ3I*6q)4M?S({0#Lw?W$&W@oP(Ey)&&SXCRt}-hgF#g7z4E9tKzDPx z^@5J#=j$kUPT|9w`s8hF4;N*iE`AE~PXE;ZHTD|@TkTl9jLTxd>VX4XUSo3xOW_kn zz}4oI9F@~Ylm^=49n3YeNWiC*ruoFfnZf85?I*3oK&Vvex z$ZN|_kSP?Fw4y8Q&cH{|^BnP44R(P5x_W}^QC3rn%Zp`cfI~co^6aU^Z(bhjeUh}` z==inwCCIiCZ_M70DMy^|okocMZ&^TqwZ#ljZcObe!cvJrQGe9|R;AJ_L4O;cP~LFA zI+FB5*<@`Dl1^DwRS{Bcg`0{jw@u-~*ENr%m-nz$?GVgWYPZWMl}_Kjt_`PL`UxkR zLeLq$jGeWnfQV>g_Jos7t6}Lchh;vL8n}{^X=35JK>2RKD7z9A_3hV9pA^VKxDK~UjB_qIe+btiVW5{+hQC%JFpPctxFynZb z8E(p{&#le(WbJ14yy-(;OBFDlvlCH}CDR5{9wRT05%DpxARJu2BuNjAFi7n&Sc6qG z+X3qb{F79SH;j*v)@ysW?tnfj!pyrd35>aw1{4o#y%{3rP-z;tp-Svq>L#wgcX zRV@m~Qwc*^SdUg|M;H3OE z!3(l;H5aJe&5XBQ_LT_xrc)ELnplku;e)66mQ_?YigqesFblE-jx+o zZrFz;KYijrGIcuXC7z5(idOQXlSBZ%^aq12mhs9QXoiQ{g$^i;JJ{3!S$vK-r4kmj zmq!QXd}NmaB$W`22~yZCzlA+udH8@N$dvddxy~4F_edGRVppBfvuMH1y(sc-_XyR^ zh=7{J2p|idDqrFr{f)KC^d!H$dSs`lDiQIrmx!Uza@lTG4E!klep7M0<_$JE!32bP zrt)A|^#r*fRqDZu%Fup8(oE302NvQrF^utSBH$?On_RkwEnTB3(AFyY`M40q_Q7?b z#r?huji!G4^|pie4hX=;{MQKF8sD zm*grGemnJG1G#$mUmajMA|Lc@|1{(xPO(!Dy>LH%OIL%)Z^dr z{`2H)zX&u==3}`lyBP&@^?a@n9uPNofwyJ%B6$Q~qR2)-g|zF2+B&#udxzgURnky zLk~rG>cng#V6!j0=NLK+x=d+-e(^qw9o{xl?RoNaSSz^iVciLc7D$}qX|OHi%{hIl z3iNOgF1@ZcuU5EJs>0wVJbfB&j)5#DMp?pbX2Wilw_&dApR`-V#&E$;zZ{JXi9u|| z(p$;qwF<}6DsDD=qxO*e68JCQfG8Q%8vCZ0xn}(?n$=Gf{a&5|UkXOGVlBRjf?)X~ zV}niE2Y{eL@rMdKOz^hPSfGvhf`KaDmT<@(0$6m^`P!BDr39ba0~&v-sbk$`FiI4f z(^(TspL>i;DSSF50)@i@z_gcD`aSh$lTvME$OM;Aq^*cLXZJX$e+NMQLX~^W&(D-R z*l%^NAqVwJEZV=i8{_1UP1Kpt2DqP~BM#I59aL(#2s~jP1TMf{jvnTSVBw_cY!Np$ zC|qm`5Kus_zkvgS!bQnv8qZirOx2vj91&T-d23?f=TMv-dJ2dB7Vw#UD4DKs5v6TW zdw6s(YX-BBx^gU9aGfH+xQ-jt6v54#Fe{;-DorXV~EsYIYYd#>@yp4GB z186{=fn@ISnuy?wLPW%DY+(OKA>NPcfUpSs=oQkM{oFuOz|~Q#sfB720cm=9I$rKT zL|YNq@B(o7Ig^9-trBS%{Pd3x`R-HoosXemGFUz1PW%GCkJ{iyUBbY5$Sin;i#C~pd z>m4A@rLyQG><#rGk`QFAv4^!M5R@Gw*q}qZ6hgtjne|!hqD+s!5o1nR{s53f`3b(6PgY9P5VuBm;TC6M`WIL(}{kVx*!UGc)2r`1Ob zq6KIEw88MBX4zcWfxwtB06bDvrN_o{;VA=>1|!%z(C45<&L%6G#q3* z2>uDL2a>}kc0HzCiJ)}+>T1n3wTFYufkK_4v_F&xj~|EL2{r%6m5UwmZ?co(&v>Ip zz;kyHo2UxA7tNlTSZD3r&OLOv4l8vY!+DBuB^?xeD zp+NLK`~-UeON4kP`%GbV16=V#del8U6)eZKn9o0w+oIo(f0GEm!7tUP3mc}_Bz}@@ zQ%>14^|tr8O^fI=Z`?cM0{@hWZ5V%j|C6(pTzRB+fHC#Ix>=s&yl$9zaEs)lxH0C* zcYcq)#qYZ+_T2lZpQYf-4_17+pz3B-L-`v~s+H*rZe5IyS^4Vmoj2Z|ZvUCe{et+q zw%Kejj*YTN=bzV^ov1jBUm4?yTIDqdwQVZpP<`{*BF=0G7r=&xd+Nhu++W)_z2D6W zb^W@bj4S%$IDDla9)sG@ZpO_E^|mj>X8B~R)6H%+^LmS}o7tHIyV>P-CT%uX8^^|2 zq*3Sf=Dw5{X1kxh=Agb!r5)PMaKorhV}g2+Rhre!`XGCIf1~kl2ucUz%X|EBIB@&K z;P?Y0JhRD*hw;ZH#-voUyWXlfUaPeBiO2W5?;~7ik~YtS&n>um2WND@t+z%UfLVrS zKW7%f?(RzZ9fJMyw_v+fc8<_0g|m;p@WW>>jDhUO@mSoj$#@+%OzOR%#_V2X)#TSk zS^F4mH&hyvGR^MAPe*|lvik;&LfJfD`g9OFYgDv=yNxOg^T(Uu^x2_(W@PudGjHqb zyR4JAXU6pCQ&b!C?4XXD-Am~po!L96 z>gM@jy#t_8(W`0X&b%XkIskoVR!$!}2&daSGsAB3SM9w(m$Z4l(j=Ge(BlD~{{8`e z&()igCh>2UE`S${_1(w~= z%TWU;NPj67!A5=7$+#FvFKPr>pw+)zFDEbn;-5pKSnV9o&w0=AGw!y* z?4EDc=xXO%Mf~cy&uj;eTQ#;bS90Sey!?48XP#`rDl62xaIG@MKN2%aUd-6U+Vjdf z=@9Gp-R#()hk;#@@tH+c<1M)bzl*P~m2cfN>a&pBdgp3marpMQlD37qrr*83_l-&C zzpJ_w`t9#8HD>NHHBFh8xM^hGmZm$={#}C)s)Ij(hVW|?_MhAC|6i^m>AwEoBFcI9swg>t?lyGl3Si#`-K$uucMdbyrTcw1+D!@SM=uv{dql(Ur7fEgAJ2- z6OK3tXCpyG@1pVi|I0u2KOAIj2M4(z=N73fL4lVYL>u12zJHJ~|3EqC75>bsggLd% zdyAF6FBdQTKsBe1YyPO^%=(|d-jkm{_`O97YTqa@Esu?HtG>7EwU%jvcYHdR%{2;R zRSx2s_xthlW3uE8F(?8S{nKxS< zf*-mO*c^-~p*`O6YVx0$OpBy-f9vEkF zVX%YX(AiH8{Vw^?L6Tw|r0CN!!`gF0`QqX_DLoO_B(b9&%lGEWTGbUcyF|8;!!pS% z8QDU6Qpjk9}~o}J9nKf~_9cjs&CRwX%iFk9@HMnBJ5KM{v&Gp+=8;)9Pz zNgU*Uk3vg-1HBYuZC%@vw#Uic#K{f9$-QE^$Ui!^D#`X{j*Hgv!b;I2CVthx5}D|a zBVeyX`3uKYwXaMO+gmPj^o{s72f3p0!!ds1FAOr`2ta1C_7dB+SwMs9ci61pl5V0u zhhscXf^f}m^F^O7!X*#mi|;!xIZBc&JOfC$931gSYh8(yMcj z+B!?yU|*B%9x8enmSmhoIo5vT+g#D7Y-9hA-U0?p_gUaj%3m5@So=zVgA7+* z;e^rZKJ3lkHQmHMJFz@7fzF+E>-gX1*U9LzyEw?D;ee;i)>*`vmHf-I6CK3X`P?v| zwzTbx>84)iFAT)8O|+PB(c7O~^mDk53|#cU5?1tAIxm{7>tGN%8^v`QTX@TACk*ot z4EVPH4;@$MyohXZopFoGvPu~1j3qpoA#^s;D+{FC#sjH7VxLd3zHi8^pQ!1ImDG8N zuQifF%ZB-)$2kEkK2r}z?Lr8UXnP-2k8u+-%X!S zIp^tw-)84dc>Fg&8G-Lx#$|9vze|$ zfLPUSBX>B91PWtEVdGC=<3~`m4|Y-$ll(Xou@>S`o#9C+^8Z2DQV7QY!p6q_0#+&e z@_m^&L62uIoM3BTS&UQ5wg~ecQ^X>%<9=N8oAjD5P)5NuYZV>oAt<3Z2)K|QBpXOX z)Pbd0p>rWvnqJ0okn{w-`-{ReFXNO?vkl3_yV%Dh>pZZN{$CV2m(T;VZ3m8Y9(XE_aE5K@FQ@|Y#con3gZ03U$?QGR}O6+Gw5)?lbI)XXDs-E2tA%c<#6BXEFmr8D`nLmILLye^So_$VU)C` z6BFp7d6qDW_6j%R%M3U&Ql8*R5{WN~a^1Ao{6Gw0`s0t~MNzK%NYyoa5YzbAD}ht+ z8B+9Bt85n87R0J%k>w=FwNdZk;)R{iHB=~MSHhy0Esc8VI=RIj!xSr8Y&nv2X3X}x zIg*Re^llgAjNa|;@4CZe)Qu*ttPy|6CzBzU8}Y#v=?^(wgI*%Z zQIFAdkVROdTyhwN$C`3(02wNmmIjeu4M#=Qb&bzkHuVYeh4g^lwcakX;-hDu$!*fR zUhs?1yIzUUkxYE9*%l?47|-6+bf2DbMblZ+b2=OQH5t0E+FYUNa3w5<+0vwU_w@th zxw1Q&fZi!5$PRK_Z%>SI8U9s*b{6@7_^k?Io(YVz^6N9?E@9#^)wE7x8be z_>wEL>%&@nnJ#oiT{^YXw|l8~QI52>#zCa>_-h~8Kj9y4Th-to(?<0q;^g#yE@Wj@ z1I3P`U4@VAhmSePxIcHe=YEMbhpv_znRqBgsd}K0IbpQ(^lzl%hd#$CXW=5l zu&OTW1BDouD1BlgZ=U$)elq#nv1;XvBJgYSQYWt;93;3wjKh)KNZJmjcSNDCK}-x{ zET)Mh%A-7pDV8hoJ;ZCRrdto7pk3m6656|FyU3g4$%>p&o@5qTai>w#-PClO*W^pi zsSaSZ50fDmY835{C34fm5OOwBFQk+6jqJ9+ZM)}_-IhxqC_Em&^9v~$cUL)&{qs0# z+e9WGuCVhv$qO2v82NePGMe?8)Z>+~LB9|k$Md~{&O14ZX37macv+1A@{wWul+?gKhr?Ub4MLXe9> zlVImBYW%R%33blJUZs$W#$tt+Ug|c#fK@eoPCislvqnkQrdL}VfQ)8o{e6w!v8-fk z^G_srSB)*o<)MEgIs1Apz*;T+QhQzFcOqpIKY+ZT8w*TiaZ`bb_hXfL{8sX8Zg~v( zRXKy(NnVWco35TtzHol-eHXGH-_5I3$Sqnr?Z=0omWH zb!8#sSMrV`@tm$0d!Mk>dCm)gmGDAkt-jrL@0vyj@x*S@&~CfhHX>kpD3#YW-6=}K zYGYhpm{J0mc#;%s_15jV6f)u&=U*Rh@0F64wu4*;1in3O%W)m&eFtRYN#+k(?Z@vW z;}Lhhj1UGW6xOS_1$=8if4PI?-Mpybwh#E{rL4sE6GZhCzVw_rpKX3=w3~w**lQ$IzS_cEupWi)%5eIGG|&Hq$&#T%GV&6 z@WNSS6=>qN#$T!z)|1hFz$a_HtX!GU0*v@2S8T`r+P7ASSesEdT99Z~1fRxfl%L7 z^o&9ZSr@PUF-qd;bq}fK;#Ubcx3463G~K7=YGc9N`IHsX_3k^RAkN|IP&Z>K7LuXg z#K#FnTb`3Z+_!-twr)$=qkW+0K;Mcb_3jioi%cZ%1tEEu1t3Ho8bYEZJw^fheG!D6 zG~>yb2&wzOMGfzzt6lM;u*>`lD_)ao`KA#^^|I3IfL72yBoOg9UzDq}2J23m?4QUO zzH$+-VDHWOd%o~>L9U-fTr^!ZUO#w}Ka+IIV zN-i?_pObCRJq)D)3OoS9g0gU%TEM9qHj!1+DzGsHvL&1jZ(S=}3U(Sbgzo_0ylAM0 zm`F6LYV~gQb_Y?4S!BqCdpf8a^1i==7%WlD(F74(;C`XThNS+C)L21b}O=D02Zv-o7VYx*uUO^K}6yFb<$&P+9I z*XR`EO-xNi$BA!Sr;#yQod z3TiV)+Twrco(PKQ9K|R+{}P@~+Bu{>Ou{t14(Yx|Oh_os`c0=vh%WdinqCK$N1OB> z3d$ukh3!+cfS_tAJ-JFUxa*pJPDWBjC!URx)ZLA8T_a!BjJ3zEZR_x%8+pkm|8cBJ z*ZU>oNG|>Yu(~QLtb^`HEI(B>k1^&Yh)^`D2vMC?&Rmc!kyZhZaqq~@?}M!0D}H4`50T)pm*OP&$s&6mLf&TP1Y8O5cx*v%#e(9Tv{}k zC89tJ9*WZPK(On=h{~aSfJiwiIg`7o2^cU+3q|`}#bYLRU9f0vkjwD2J>Y8bB#DIh zr4+WfjiK6Im*j$+ytjdr=0zo9H^$K=r}p&ZlBG)j^SrsRCe31x=_9G*p zcKP#wZtyFWL@Y%+BksA;BvI0DP%a+7H0aj>ovF2bh{6pgbyhXkuR{ zboeXIzZq0deKT4jtswU`P{bmSPy5{BS@ASJM9UxlPAhuYd0QT-P0o=uR4csd?Mhm- z+#hCgZ3TH$>ZKdadUh9h?tS@HN=DLMmAtu1(f&bFE>~8om#$X-$a58&$mnDCTw4zF zK>G-UDGUB3xy-&)(Xsw~m97DqaJ4!auqN-zH;O7`w_!R39}K1%ma;0K5NtAojJVNA zOD^{v;TnWPJee19Z$2at^0y}~l>(ltG-@4WHc$o;MXzJR4SO-L20b*^!q!1D*|ZI~ zT>Oc&ucJ>i_r=F5u(VFx^)McJ2(a?HS;(Ig zuH92lXZ*1|^;sBDAyPE{ThxVph@E%Qa2skYqk1!SEzOZ8ySIb*>x8U9 zF%s+0e+)Go^RUbkQXsxk<76}byvp{u3bk_|NVrLd*3=XVK};Uh)pe(?W-3pYHbU?Z zMwRHx3_k*%sw6w7^-4PjHE1KL(@qQNE)$*4BpS^qoM~pAcu)$lBS+!%as`;iW6YW+ zplu8k7oc-63wsjY$n;jKu50>xDkDsfY3~Ly#~zTOM>AV?lDw2IAI_VL5xEmPwUp4L zG7I09v*;e$0}+bO>%d{44ahL9^ErHQjch6S!#}`(9p3zYl%6 zVyOyStww64sjAbJ#El60XEi2?CLceRKyZ{GkzK$E`RrX;L!yG^P2c&@`j>0M{0 z^>*#m6H0z`irk3ucatVy!6R41?A-TbCZA?oyz$(YHK79X6qKib5;1DbbA?`w{{H_PnHvwBjx-~G73cb>izaS}lj9?c~BG9uJ2Es#w&u2T=f{!=UUo zaQkc^zBy#*<@^VN5nl;P?4T}9U~xh&BiPoFHhxcz>jVxgNS}E@n-^ct=~!gVVYa0} zEfVvjq+F>WvH)O|&4n({MuWk>u*^X+6rH|{--7BG?+%KD;UrIY>8oih5`pUAw>Y!& zX(v?LuT($bTB{AZ=PQ8S?<8FxJrReZnzSw22M?W!xY8-SBAl5B7XTmjrN zMW@E19G5P%Lh0NNWyTJs{SaAZY^~lsN77^I)hg6=s5zMwcoj7W!zgKOA#(Nt2f3E$ zOxjutP1>)(qIv}Y`{zk}tl04dxD>6evvs!pBAP6Dw_AlEN$d9U=DZUl>DGa_;2Mdi}!evu-YJ(h28z_<;-tSShdz86tGWMWzag|Z-{*aWwxzDt+SNP zrx}07h-;{IpRnlAD7hKvK5!3Z{ny~{v?Rp9biWNsE0lN0zW`R9B!G)|%BA;tGt&Gx z{?){Emw9Z4f3{Ep{N7;oCa^Ylm4fvE4hP3%93KJZHACaJvooBk9?}y?HCUkwHs94{ zu*C|Q_p)-x4D3XNcMG?HyQ1mUr&)ma4qYW(9Zh-bGrhE37B?P$MxLv=0l_TY`LGbl zUUI!T7TKJ6;9p=wi*7v$xm;yCOkTX+ta^ZwC?vbuk|c5<;9+c>Wf6Rt5#6F`fa#$0 z-f9l0Fk?~Q2A~~eJLT30R#`uuOqg$DkWaWrQoVmf5@zCb#=8JJi zSUzkX8xP>+sRM9=VPqY`qTyFf-{&e!&N@HGbx_hN%ELPAAIQ=u$X=Vs$2-^zyw)i-1(xV9&XTvccM{$kfZEXeyA3vcVqB*WV_=`* z5!IG=didMZUHtd-1Qudkx^@r$EuA^RJd+V;ageQq+OXrQQX4LZiq^&;8?q26FX;u_!k}r!}4gJsgZE>IGtT*2yPP{Wi_6kB27wRO8zLdG$OQ z3SY%#;cUp7yfz8o1nW@LGVw>$U`4<6Kp@Om>ZiF(CX;-|XZEj93v@skczoOcq~6!iX`6tqxV#~G})I)%?5wQ(C> zyV0QcxWk>t(p3FKCLL>?e-FIMZPR*gYLpqJ!BYUfIxiU(;tn6RWj~Cm2a!22C1F`#?iL zu95CXZ>N48bh?>?z8XX20}YgqpJ-N>u9NCRQD(vd>8!8iZH5m7;?;1r+lgx!M&oO{T(My7NExu50FM zk5hl=`=^2KNvV_QnEW*gpY-!Bu-_G(50-4t zZ!`9s{UGeYOYT$JT%M-c$Z>N~ygfF6`p+=m);udYN`)@aS)uS5uo6xPLRyR>@&9LwRa?oFV`bkbqKLhzd3I()&BHJ?FCHX&-+~%o%*d)$dXGp|Cjoz1K!Jn!>D^Zc6f}g8!hWqHOrD{2IqCow z&JLiQ%o$+&?ZfvCbz;>)hS4)v|7Eja%mzPq-F%ltrUpOvi80#8Ek(rJ(p}uO{=b_H z&MRp*YxD|}F_vC`M>buEw2H8f6t`Lz-9y_Js%6YAF@Og1lo*$@KrN1y7USZsR9?+- z?U1&IRW{rPyv@-vD-!(Kz>H{ANzl z6Sm01Z==558*zxE-EI1yFZ`+XyV!|j9@#|JZRr)|`u>y7hSOw%$jg9oa2W~(tmw3? zD2K@hyoX+Z3fsX5&r>aIq*^%ki57;@{mGes>{$j$YsR<}pSPJ_Al-vfC0lUmy$ONZF4&bjY$NEl^&I5u= z*5rdQuD87s2D<<~h$)AtKY$k(-Gx#7Ij}1a^)~{_Gp9Eet>nrM=sj-9xz4mH)wMIH z1WW2FEIDrLASUndpl3W(Du2uYtiMk*E8!x!t=|mNyn$5|SAnmC-xrer-91rwo-30G z+Su!wz?oUc8;f`lMc_;$c+5xP^KE$HuE2(BWQ2vu1vcH)IIuofTFVW=)o15wb8VlK z9b?5MOChM&$`+@cXMfC*T;fV~&>B{M3=NEdT=4AOEaVH5N$@Xby#V3GG%qdZ`k+$S zAd9`mpU-hw?Vp5qLWgu1>LA--Zgij9T=mdHfK53M3Voy<;7-n94Nbm`&sZ@spdN|+ zM0jD27`ch8-`6ZyI352$(J4e#ijf46aPa$ytEs=$uIC_rkG4LMy2M9rCCqPPX2=B zagp;84kai22o;z$1HS^Q$~QVa0-vO)$8t#=v^BVP|J5Rm_)B)67ct0?##9lpmk zq09Il+)YiO{(Iv2ZPNM>CM>(!KEmP^2tDsZnK?B4Pgdc5Lbr^#~{Y#Mg^BP znY`3Hd^fgAua|D-V}Im7hBA>W1W-hVqJ63C5$3l-$ZAQe(bka!rj|=fjrMoR*w|{T ztQHc5X*8ADA((M+Mx2QWfCzDQ51~Qf9pYbTXy^+L=h%-H2@teB+1M)W`368vvF1kQP&+Lw9b%VyIl6s&jbTu<`tEj63Y zm04HlJ%3`01#K?XCUf>Tn~qgjc<{msZN~h2@!*x~nt>sSABKOa8TehiQ=ShXN3K;^ zv<+Z|vzSuATb*r68NRFOU;l9Jup8ZJ-X2fZ>tYnRCsclRef&be=C{PzbI zWRc1Lngsfj?O=aq%_a)_v@9rc+I;vs<5!+)2^5OJz_SzE(n#QpNAd95jHq0?b{V#o zYL_gazT%z@IRGj4df@kMy;EkPPhB_;`Np_Lh!)g6C-6*eLkP1lK#;<~rAcVeSL)vq zRtmiNfuidt!Liv#ZMs@8>Fx2kT2p2b=Eq>4yaQDem{AmN+)CbfiRaL&Xfoc!d&X9a zs~+*&^zEOMS*xv0=rIlY%D*rd{d+aOsduxuTL`NIpythmJgpMn2%(QeUGh?e&tPMw zgUl31a=6yP_R|7?1oq?ib}HyK;t8gACRI$fKQ#Ti{!(q@n<4ENCnTX{)aa#&x&pjb zIGz0YAa`+s1h1{pyMOWi3Om;dW3Hf8t+LNoc%L*b;mr3r^btOw-|`KbnRmoO`%=qX z#6bIqYCG?BMKkb(f1y3r?5-L3gMVQ@n;fnFMl*0U9^y){W^aIT^xe2-`?U=^XpjE70rMj=ByGD)B%~;nJ&>-%wsmT4pQ}ysX8~4&lW(7 zZ<(+j=Hk^b#L}MB3n)P3 zkWj&K`KRy*75*$l3a5fd%SWy`-5ekkL2{igLVKNIo(TVO@Lr-(U<3r9l%~ew$N8s_ zHU!?j4951DY-zzsGIYz9DA#_p(rtJ3GEq$M3SxpJmW7Zu$2Wv?>Z^s2Ht~FY<1u89 zZ=Nc9U=;8+W~_r9sEnAAA9xvJ*Ie-2#kt2=JsPP$4 zl+Z$HYG=36X?wHEUFHsl%vb}lRC%gsId*u;A?*_WrW^is&KGs<5@%j&!(@QV^=IYR z?3{TiqJ{HObe$>>YeB>Rb8_Ni>&kFrS)(|&>(o$x-2r|3SJ-qLgE&CVwgM{P56$3y zyl4brL7#NJjSV%HP$RF}`3Ih^!oD3QZ@zRUPUJLr*H%1+(Rf;1s~P;2Jk&u(uc+kd z8}MYkKTM?CV{^3)P2ya&FY``s+8X?^b(y~X%dypB;wteQ&7iMoSY$M^yAdiM*w5e% zIl$r|M2o7SfVO__6j0NSEy2T23km@Gy6Mb-g1B584`aOP`zoqR?x!<_ZzJ^}4#IzG zi=M7wv{J~I>Vx({Ci2gO(_bJ%`{=knBG_$=pXHnFKl7S(p6IfKi|aeF<9#^tb@JBS1MDxA8iR8~R* zCALA(8skZNZBvQRP>_zmn_7%(4>#F*lJvUeB?9j)@}78@z(W_mDS&?VU#_;S6y&@O zYqlQ>2Mf*8w$_Z2W>e;T)c6Rh$ntPKzIBSsP#NTM-0o3>Ki(7nao>_`+)UsIt?T~~xKO!rWIyE$=JD+=K& z{pq8Rxsg=;tET&e2|+GiNKfw#p*|_zi2l!T`DHQ|$>l}CZy%D2gEWsvc9A=?3pzeQ zPnBJGONdc?rKNf~vP;5~j!$S(U^vRo{(7nYn%MwbCB|iXbQ$1CyE8pP^&T2BH_A0V z%Un$Tnk`gWQLAUlp*1N0FZCjS{*aP~F9es{8qF2{rJ}Cv zw7z}N-sI>qxRCS#T*z_`%sjZST4lzDHzgl+`)bN=HbUfJ!FNsNsAJ=lXz#FmzQCEG zpubOTEU6U@c=viT`z4?V9Uj17NoW>=1xUHA8PabKXD;R7y|@2ZmT4_HfDjsDl4VxZ zR1{PKd`m(RLiq>Ej+TTlan8t@l2ljoD?W#CsLC%OQEn$PsR?o%mk7@OV6feYpzqDk zBHw>17M7|PQ6)Gy>nxC=`Xk8Ydcm?1qqR);2g=apCz~r1ITMwnZ^p&~YL}y254~ra zVl2y}Chn|~%yK?Ggw(xL$?c-9zh84Kow!MiVxByZOg89674*xzljc~c4h1aulO+aa zLnZX+xI4eoocJ*WS$@Gj1Xu@nbZZWusVfv3Oby{X5JJw=QvMO+a=f6G-)?0QO_B6! z0vd($h{64MHqC-4K;4^Oo51TbRPTE$e1Dh4HZ+#=UN9v0Y-`1{Q_b_Q#L&m;G;y!E zze?eohTt=gwRa@bR)I`(Kk~W?g>UKR0-@Du(tU9`AF^N!U3Sk{Hky+mHCdwEBDKaU z>}LH>Wco5ehLJ{^t_GZ0e%_{~TsV;&tgyn}f0>M~~(i>$578oy9%n1(K%!(wq!D_p_rj|t9)mbJ&KPXpfyF#P`^Tp0I7I*& zt^rct$2P0(UG%^D#wF>{Q0SmSAdvSV9`ZUsKyt`G;C(cb_&2CI&rCqhP++ zaYz}&-3lpf;u4_RX<1piV?s&;eK(2fyUO8-XLDThQ0KcRp!n-Qb^AluIp-Il7h43? z_bh^omf;CHY5+OwB&~&q!Lkf7i-@9OO4G|!w9D@DX^qUnZtOI~(I^?M)^qr#pUA9n zf>DQ!s*=rZAG0^K>?lCQ8R}^QYYEpW8_f0Obg#rvn@oif!ijjyD>LTN_t-ydf9!Iu zHru9asIFFY3)pP13dzV2(BI|vfiF55up*QPDcX6Zo>oY=Fej2=TY-W-tCwFW+5vUk zv@5{qiqNn)F>!=#Ee)17F7t z&N3>+%tk!<>zfHHK~csZqujnaiH`-=i*IWN9nQ$iROTOpG79@Ofp0RGBvB(cw?M~> zr_dht7;nfd(W30Bd#Bo#ic){n!{i*b4g(0k$ni&!}*2E%p1-w&j zMh>0H;5dWdsRl;54H$>&^t|(nPD2>IQJrYK3M%?c@0syIb)jIxm2~khpb4^yS6*7*XLs`nfok*{s2(B-;oo_kpu z&1DObd2widPyK|A%`MC|=0&;n=tB?Ol%-AvX+QUJw@eFLi_eYE7sUBkc_3j=>T=NI zexWrX%I&!TTVeu22cIF+J_-LJG17ok1DQN+8G=@oVJ)$0W-O~R$xRtnJO7zmr1Azv z6~tpL2+F%qk|OMsZ)02z9ie$TtSr^36w6(XJA(;xFm8*YOE4D!58;V-(8cK^#JET? zFibr)C_&fxz2QR)P1M2@&JU2AV0Oct8=8o*CaMp|P<{B-0&iqJso=NYWUBe46Ke|) z;T+}NriNPl(->+6P@S)ErA9HIZ;t#yLYvDl)RvxL26%~C;dFXo?*w-ag72lIK&U_3 zNDl4ZUGK4N?jpLq!-uSvOOX_RUV@B)+QTUyXU;I^&}w!4Y`YYl{8{5`3XUT7;H9Bc z9FIUMIE@rwE4-;0{H2WcD6+_#<0?$@WP{btZFBodX+BNkDdS%QEvpyQp=zEOFKW8Y z*BUZQIU2I@2%YG{vOZta8&Q!Jqp)Sfz7^i-Z|Q^P1s7NC#YiUnpDNl2@uo@9T2V>D+DOcgntWz;7Kq%tAJ>fgwWc~kuZ zudA)943dP;lw*3*9_g3vvThqVBiow7g^_*z!hg>)>Kw#32v0YaWb##&a+C5R4&Tk% z$ma3EH#I@mx@B6yA~HHQH1(74bI!Y?Bw}K@%MLUbY<9WUT4mGVm46#S4K{wL=aIdu z%1(g@xr_#qUd~Bud|DneH8(RZhYCdFPBLS;IUplWOrY^%Kf8$>yrG4<3q_T63bP`x z0G)zx;CDsH%s~j9C1EVu+o!IYX`8b1@L^8x*>%d$#I0mPb^yEUj;6QXJ+!7GA4VSf z+Lw{6-a%iRx2JN*R@j|sub{d2@>6B2Sh3?kw6z_ib&iAl;$JHhzuATHdo#0r6G_wb zizv)B08R23mx*LghYnDPqiDEn!JvZA8oXtXmj?d9@0vja8YMz2oZx8u9Z!xP!c15V z64KH}mZolGs-@S;!+50O6Pv5AVN}}OphsFVj-a{c)WO>PME zn=P)<|6CazYm5(V#pbGxqE~m-r7;dLQ_iaq)%tGxwFPYMJsUEbrenJ=vAf~oSIulG zi5U+`*wPeUSfc3Z4V#U(FDfvUDS8fzs0N90SC={;;zWuO@cVuJf8T>+nzma!$*oO= zv?$qLh_k)52_;XNE~5#p{s{wPV@-8JyqcSeL(XdDb@ghb-hF;Y{Z=)Ztt~aFxZ>BI zM;HroIw$p??@K_;&u4+=X1(X_Hzm2cNxW|HU4UFSID=-3fQlMLkNScHHK#4kuSHh9 z`Dp$2N$Oixbl&VKe1ftFcna0d>C2-a*i`g4k=RqQ~tE)iB)Ht95ud zw%X3wBMS@2O~czr@pi z7QKs_s3%&5CeV9CLQT9{e4yUz3!gW=U8QHsW2Pp}m<76#rvN zjAaUM@6=6XttKF@FrVf&sO~W5Tcoww2!(g~|CLC%)%(18DdJP%bPiy-rAm1;nI(b9 zASe(1o<-)lL(IVv>(rK1+BDhJgq3pMd=lxSy5Ka`G8o-JD!IE1kMo!hd>S}C_OMvd z&7123$wl=~C%_X?g+gV*UQP*l286~#SFtMRe36@_*3Xv_#4Bwy`@hqGK zy5XFqn!No=EVL59BP4q0J6xMvWuo(erZsQ~cRL~9Tpl@*{PZc56K7~ddU#=Ge4UtR z&yp>+2O&hx;1ApZ3S|`KzKp`2A6p|T5CObSHNU2uze>zbsOLY#+jRBFBYd)f4n)Pc zZ2369355x4a^K%%B?8T=i0dy5rTkctzo>ccjM~}uL8+CY#`yy1N3zbMg_A2ZIUlCz zD8$3csMD}zOA8CL`!Uy_ZTr*dt}%^|{ewL#VZ#omS-=~O^{rPXBw(nSy;vjo9cZ%% z#yKs5nl=NP-s|*_N8AsaEg|WPnl<(#Ci~PHQU-U&<1qBnvK>rcF9+F0ue97H>Ivd^ zyG!#iI=Pzy|5<0H;0>m^dG_yg86WH}Aw#e(1RiKan|GIV8^_XAOVLFom;a!&N>^Vj|gMyA<+f`$I+@ zWHcL2w=_~tzYHOaL=7`x0J*(s$eu*0)vm;FF9mN4$_twj#Z*XfGO#P~yQcj_-W@Ad zqJw4ymFI2n+JmUdJ=zk&9O~%Q zr@e^;;vlb=lusrLC!-25TdVHEeY^3wm$6JJX+S>Mg&qu|phU2x#7KtEOeldmRNbgh z^!Vg*zBV1NP+0c__=987Tx`uK0P{W2E<@{pVTp|NfeoX)L;}wT8-mZ4j^4X!xe*&*^24 zw$Py_T2VvEKsa;I=#%ybq9tCm;69p(64+T=WMzu3zH^yE$dC2i$x0DWeqGOMaU(Ap z;7~BIUAq~Jf?R$LUR<`ln%?C#duu|;U0D@XdU;a{cjLHU1Ib}(9mZ_4dM+~+KT5>B z$8=_2=Vi9KM~UhrTSAokx~W(b`6%7I3h^cPE%Xl#HT`z5E2`~=il!!b%01)8=L&Tq z+64NJFMW9vu*B}COJ3`aLYmLEHjR#QKQVL}o-Nhoe=iMTGCCTk$Weln)i>!ot{QBM zvjJ^sg&X2E9arf+88j8}Uc}QZ;$RO)VRT5 zt+A9GAXh&x%?j@=mspeH9SmIC)-+c+&}s_ zpVJ;giye*E9zGdWjX1R_dyN4ijJmJ;wwR8w`M4F&b8*($6c|IW1*Ya3Vd5S-f@CrP z5~Eg37Mx&RI|^1DIg;HQo+dzil-|A7!K4i(!n3ba3gz zp~DnDz0ZRpQ}J&Nigsx2z=-VtPhZWT-q+0YkTWiNiF@H*E|l_g0uzdKVYdc3XEwr= zI}x4KAR6tl7g3_NJap>s(>!W<=T*Lt_Tni4b01pF~8bgfq;k}gh5 z!94#jCFXwtwRj8DAywMTi_&lOI?1yMv}~m8`zT1#byXO|0B=^tDSG&fg{lzQ8|n8o z!~Vbk2&D5IT?uSKZ$~ zfWjjB2T1CVEw%)$GFt#uha*#0;g2>EL8;&K)nFb)G?LSEF9D@#4nnc~VzgbWLYdUX zFJ5~CT_-v&kX~iQ>~e3eoxi4U*Xs$VqJ*@8 zNIIoLE;}Xklua>8aj1dr!RBS3_4gZokxTC`y?ZL zZ#cPbUqwR~ICJl%=(Hp}N~0ae70=t_F-MOhJbW*=-bE8UPG>+Xx>4V;-FCs2R!C=c zdkza!Hf*m#y_rQ~F74%X4S`l?q5tk!HnZ5y9k9npUhR(DZs&`wAe9rtmQiFTXB?kkC%g-KT9>ng$&8K7O`+X%6|j)+qIte#OYaJL zwp{5aO#goXRm#ZT*Sg2$LiY1ldrSJ>FU;tL!-+;D-6P}4TS_VmGOczQ>7JVnz}j&^ z>2;fkDb3$V#kp`c%6;4|G{bNmhJ6qfBgR)lap8Yi^Y5DBe`pJ8MO~hH2eWGcMkTIl zOX*_n9RRux4L6Pzk(8Dl5EEs*8U39O)@e=n*$HI73FE7*=oEaV%5}Pk*EP?DH8tWs zUxX1#xWzwUCJ74wiTfwYrY|f_G0`ghjpQf*w*%$bso3Q%cNd@;qJcZ;hB1u|9_+5$ zFya5K=K4bHvKNhlUq+k29petT&5)myts)Ncpo#|oS`B)S zytxeSQ*&9+Yf(PdO@~>6q&+r}1dQXH1@@7&Tl`&8V1+oI%#661h)KFP{*(^0BIwk7 zUyx~|Uowr{t~o0)He`qYbhanG52OJDaP5y}D5p6G^5a7)tTHIG@J2@6uL2e=+kiG}Gn=&-X;AGRL2Imb5 z|1}Q%_fo<8<;O6!S@azeHilu8FSfzvqvvIhj7RBuLki=C@b}ro>314DqWWG?(?_*1&+-D!ihx!Qs`XO?^ zGpO>>?7g`&Of*KDa9o&B>psq}=SsxHbeAog^Wo_={6t<&jn_s;A__-Gxdr+;h(zS^ zGY130n*2b()ru~?;vR9=C|KL_y64T2W=vdrJ{qbvmcpp(&P8J?uy@=|BnEn$){sy$ zHN3c4Wc`MSHVaNxJYV$swYy!9{Ld%-&T-cGyC5wwGW}`VM4QEq==*L5LivX&771wa zO&bv_eHY>m*fQLXk?wMy@+r`&@X?>QQDb1<1S#$!|874)jYiAuXpK`Vpn;n6gmq7B zcHY-vj|U*dvAB>l8sf zF1P+6$KugNT^TgWVblxm-wtaOAToD@WOGcEDEBn_=P}1zslmXN8Kw-6k-XjR3_{3c zh&@a`C;%LlP>rLPxockhKwn{p8ZaLyk}U4Nmc*Hc4~8IUEjwXv7>%k53Fu!dY!L9(`x9sHOV^Sru5a!Y8AYN8JVQ zX3Y4SiVJiF(78#C7w2Otde3Gn?nqgUN+K{CH}p9Z+3S9GM1c-<@qpn?(#POB=+vNS z^t|1Jr4!Iwv<6I@bsBoLuckMhxrx^FnYSSvXRd?NT+drZy(dnQG*f~cg*whY`F+fw z`8^du23taQ(PL)OV;0HmlVi&zt%oA6B%=E~scl#waOx+Jpu-gyoE)y8Mt1uF!_|9o z+;;RT!wtJ`U;W9TZ;mg=J>a4Q7~2@8JCERKqeFC?&{cRZ7eJ$-s`_{-I*HWy3+b!M zUxQTL#)j4+UWA9Di;&MP@O^jkQ)HM7KuJF0!E8PN z=^2)B=U~-TXL^}9zEZv#gdYBZ;mf|Lw z*XFH_L^JF40M|`4BSS?xTj5ULtJlklr-AC6w6x6#TB5%wHtkI`86so;=ee#*aUPSp z5o?@*SOu0VqB`gzp1S5tSzD2S^WX_$ydx+SwE~sL-zBY~!%?#%uKFd@N^kM7!u&Oe zX*95VHa1t`P)#{*ck>NKw597Zs?H-&cQ9%YEkk`GRhvw_QR^2YnbM`gWTfM`J-0!7 zHpw}L=39?k0r8bLDjvuL+AuUEtx`NQG%{Cc<(tmdPX@cuYW*?p?%V?IknVK#U>EhT z{(Eq*I{uoc=&5nuNA=Iw?6JA$ywRq|N{TWpN$cn2{OQdQODcRzYL%kO~P$1g=9R)0i> zRjonBy`5oU%V}eOBH7nh+{5Bm(0uzvpDTm{d?_o@mPpm(6m*1=oB}_+)#P8K z$mo358>Suz1vuGV_AKL)sl+;)5<%$^yeRF3v`p{e^BPWP6Tu2D!`lIEulzrOw(Vla zzCG-E<9lXQ>kPMRD`mEC_3b4ow4laK#(DE1jr11?+7Aeo7@I|3%nd87MZ5HQyF2bx6UrrH04fB&LA!7LH z@Jq<_T`o}>#3fHvbl>IejLSXj70oaMAS4voP|uIMhUS^yDF3t_%=Y0;xGL{_{Qi&o zfV@P`DFF&b%*vy56czj>{F8>SLdEEZAiEM*rz z#nOnU`J&sbHI)4oRQGeQTB-OA%*kQ}``f!6GEtTRv6aIk?`Q@wpJ1k6(vOw~gB$k>@s8qqH3)` zsfv5Sm0;m_$7IQA`^N_)l%W)j(?rQ(^4|HqoJ`EjAWN&E`BBt1+KQIa90w-_6Qh9M zlHU(>(qNUc9Jl7U&pw1epj9GxN2QL;qt0^>c*aC4*gx=)!_8k#vAQFP_R*`N++OUZ ziv!_oPmx1+;qTXbQ7VGZwWxb6+^LycItRI&?%oeK3Um*|_)chc;%X4kR>FJ21!)oX z$R4icD^pgrWi=VSt@hogSSax{9A|(>_G>G3oVljwjc}Y#OQ+$4)>SGqAv>C)T+2tI zo%Y?{m(jS!Z7Sa-t)&6@M#OnkXaUG<8%O$QLuNz5$2FmJOi?FMZ$5;H?~~iW<${mO zH^e>SBTyK|T*{JLN3USApSzbbip5V}F?)lq zBx=#n1Jk4!KNF2W)76nSt%!!VTVSt5wCPfmryj$Ijjcy7``Z#tB6pa)rq;Le!St6B zUW+s5MY+oI*w_bnBZ|Z@7L!TqS<9#dDwUDV{wBYl>L*Q);1-Z%dQ8lq{3XASM*E_Q z!Yv@Wm6iBu9cG@?)kYi2(;iXv@+Q!*vlk;S!Cah|q7fwS@f(3m{IEQ%$-eH5D74(SykeIYg`r9IN-jVN;CFoKb;AR@5}>K2pxJJVgUG=W zsH}UmSEJm2I|E(AiAR=zfq(mc3hXcwa-Z=%R+*hE*wk-p!bZ)6Wm3<3eW?jae`=NU zSnSY$embM2LNBnkGDflok11yPK8o($o@RVc;?>%TRVDODhE9P0SBW&9CK9 zbWMZyWfLlN^an=PC1sql)B6WDrzGRsP&D}7ODq->$CGJsIS8{Er{*IMg)lRcr&959 zdRn76JI8J5)qr0y!6hqxQS|z~t)`+@&!08bgqVLGIkGC9*pbCS*HZsT`w?d!{hk{B z=6Aie$tM$~qN}1*MsJ_n(VAVSZ$FjZyHcmMvUDn5%f75`3ObNI4|9+{1Dw?=#;QTX(cA6oGAul2_Os5MlML<Tl#m7;3l~3DWulG_vh^G~a{VhxjTs#$R)FGF^5;~rNH3m=JNHc{H!XExLaKh4gR&Yps36#J=i-M?ri_oY+$~9`x~;1dZ^UE-)(egJTH+(BK*-E^gixO>@q%W zH?5t+X`2m<(KtW#A%#PHpB6d;FTu2vFxGI|j3ihIyE<8U38D|PKJ6+BG#tvEL+wNZ ziiIEABlfGvT-mQ=o`x`@Lj5MXpCRtmjQMRFtG1rGzw45X~=FOb&Nw< zt=fkk_PE&*h+2zwHI9XEdtd`^yE4$Pc~}>R)ENuL+JUtVJ}ahiT6<^mikTohrmf zZR_yPxKRlVR@Ig+nc|&WsjPr%Jwz%@1~^xDHOqvNc8s-3-ljLf%g4UgM@Jx~BhgYW$m;_zNVSnFDvy5&sNM zulHI~5ifE|x1CMigzC;4&5isk?~cuhI(@9)oOJq;Z;of#9MyW~x2bYEbs339E6l>Ru|Y}_4F zMelT<7I%RyO9C9!Nf?#XrH2>ZKqn24Y7!$UFAp@TvTdIe(T6X3M61$YB-lVLzT*Wt z9W(2H9uzmj;WR=udi)6n{IC<9cqA0Xlj1mc&9c+@Ua%#g67r zf)Ns*=+Av@Kkch{%R6I63jDU8&^?f`%0HH%o$qZ|QY%dg`HDfB%*A0W@5~m1HMo00 zcRxm=|6YQ7O>jTESIW=v=;)wPzi-_<&YXu;{GV|>{sxFm^L8Lkr%_Hg6K%Xf9ksF{ zin2Np^F0#XX^GB+>(f9qtf51cD&&ZdL&0%K1;hSeAqpmvYoGb6byraUFUZ!JtmqKG zzo(Pj1Dug&XIh*k-oC(ISey`MLPU#^qv~PLULy-9tSk$z$KNbGVD~_65&nBMGJZ(kYO$sMg1%#Dr1Fw@3PnYv(ju$4qj_HMH=^3=0~)|x zqOu$P=#OL+Wcr2cauI-vXYTxF#7NSzuKV?p0`Nyux@7+eKhE4k3M0w(p&q}ogP)!J zD|G+1egF7LCgXZ4#tYot?pBGbu5q`KANJ*WSL3%j8X5CFW8cO- zeC$rV2hV-{Q;?vn3jg0^{GA8Qpl;bJ2^8&nXfRg$7)t2xQ%uom5swSQ%l}VxUjo+D znYMjGfQTY--yte0R$Es_76~WTRz#~nU0T=Fq7^$9R1g&;C)8T1RU@KxtdL;Qf>RZ( zRNOFHt-&=YR8Y~NpaCPYC6I*V_}}jVy8JWW%=g#MT-SeHGd5&7$$8)BeV+TdpUuXk zQFEn_fLrdZ#y_`XY!MFiumM@Xgn+t*mQN!bY|@Knc8@o2Ur%VY0_U9*6&GQ|`W!Xc zLXfByF+M?1>4K0n=-?*ON-8(1C}FMbJiLPs+-PAHJ4Ei^ccCtcy&A#apW`k#GPe3c zH{J<A#2SJ3uYHW|JlvHUJ8;BQxu%0;itP z=kO4unJ8A4qUfu8Uo*;A{{E7RVUaF0oDLy%%15}p=9{M?*XtxxQN}D5HhU@oB8u*T zR!IK%j|(~93h1>VNR4a$6{Q=VN*M2=dn^#(%x3ir+z%9ze~gU*uz#&7sN9Bfz=iD< zZ*qG~c6L)fzZm;Wa-Q2$c|D_=5Ox{)wvAQ*!S#wK9&Sh9bqJosBC$(U#QqIvFKR^R25Hf@!J40C$jI_W<_NOL`m8|azr4WtkeKEJ;LP<Ool-k0vSqc9x?GECCf`%gZ$x zMA}L6?X!W$u&erJY$Y89W997qfaweiJ|t2lhg|ORVa(l;Q(9PyJsn%|Oc#P(9Q?~J zLf5|*eCr(8z}H&9)!*Y(2l25mw#r8TExoOy8^{qkl;kULH!x}_BTlrN&8^femWDNTKQNHTQtb}-30md?z-9*R1dB#F1`$RyJsY@Co*T%Kbb+s@AIll zfKZ3YGH`xXFH}FuhtZrjghGd(;Jf1kvwnAGhpRaw%XUFF>VL;uy5%pU3*bUmk}UI? zyhVXEa0$>E|9tQL_9DPKdL=-HjNRY?B_Xf6ObTxU~!BiCf?1p=MJIP8k z@KGfrdO8YD62DONT=BFcwfw$Pm8Aa^Qvb<)n68B`^50QJg{1Q1_ zrGj#iR!5kl>>mKSeFi!USMtZbpQPwC;st9>irh= zdo_lhOMR~fduHT)64IZe&Po$VmKUhC5;)SB;^JUT$lGhx!=*BtdmGWEx?{W3<@S9r znxILhbS-=qRP{Ag_}MnPjP%#MBR9eb_o42}jdq5Qq@Zz!wIS!3(J*qR_iO$NeKwe8Z#YSDfXBky^3hAh3~3DsXL*@c%G3ckf1zictl-nGD5P1UZzK5Q z7M^@bMX)ONG<>9F)ogO7`@EP~_7u?Rq>#r}ocaS^i#X;yOaU(u>{CWUAy+?L8JNSH zJ6)$hkCFOVm@4x-|3$;>{Va%7*_#R+tBPx3AYa#TB-oO+^L|eRUk=-MGHr4rE5+^Q z!XPt8=v~ypEv804$m%Xi+9ETyrSum9(!=XOXMLTBq*bEN9i(9xb>}l9bouC?sO6G4 znfeRDK=qwnUBFJP_r=@KM25JlufVQ@ExSST!&ibT`;KtxC82^K-c`WsgJ=Zi^$IC~ z|FoQ{f9fL!)QczCeWZ-*O9}+zS3OvVTSDY0aYcw2gF{KaLa+Ba7O~+-J($V+($8R( z@zI1c{CXVAY=4T(HZ)ZvW9&Yfvd#w6-TV7~GO(bCM!1ZZ0gnxx92cL88@P#re4A8i zKs=$lD9b~qMG6K2EB11eJr0Z+=g1VJL^{^S901*G8Ns}vymen!=} z=#0^`9vKVHTY@qXra<-AcBLxJTF3o2q+%rkvK~rZf!@-Gx|b_PFDo;;G5EZ(H1s4it+p0zKN6$Bk(fMdV9L-9O#B;(cnK8 zzY}Mt_xwaHxgKW^L5GMXSMj&Xg0TH-%{mDk06%Lfo*E5pYOQqGl9c>>Ea98K(JKxj z8oMqKNfO!M&|V;yCWbeAx(?RDtt5n(U&NRCxw;&fiR*VLhaB1ov&um7CZJC;Ma1dm6?6;jBw#fXLOP=KPC0ndHGxjLxa z5peIOw^|YP;*rP=Buq?U$g751NEVPA9f1@w>w0%H(^|V6Sas#meiiTZH*0{{%^C1m5HCx@}00;CLQJ5cRByT(NCo`NU~yTL?P05c}3 z$oU2{BMe#IVoZb{DB$o3IA#>(b1aP<2@5Ke$IWj5vpGxQg<6~TmrPn3aMYAEB4D51K~Ns5HdRQ3L*?nNhVlK*V}F6u)jv*3{-btzt@NDpct!;hM=VKq zi+zUZtc6JxO`-HJ78|t4g+$i~=Z+Um`UX%H@FLtVl9bYHQ97p|EI0i?kBk`-RZCx2 zA!4xPod>d{Or*$PQG}Ug^Hs&0sT(`>btHjuAebLN?J3~zElD*pDcmxUv-<tCfF*#-9d4oEk4y9M zEG!L2fh|(Ny+4dhTPMn@ffF`m2v!;yKeKyOS!A9hfv|w+kYsoqmxP5jg;bLYa$?+J zT_(OZ00#I$u1uv@r8hwsqwYh3FjtNq3oLpl%@4m6u;LCgH|#|0%TK0AEM= z(3;aJ*|eT)%mzun>g#Fi07r}Ky8(sTAvhCj@RlD>;#O^SxUU{-49FsUbW;E$(}2FG zg(r^u*LtC<0LwZ}+dmEjYL=!(bc8-Y&5GU#sMcMT?!mRYN8~ouDB4O%;GlATz!8F0 zgpVfvC-QyvvKAb%^tpO{z{LdAAx@6N zR=&Qk+(QN9lMzEFa@{6RChY(;AvEHt-p!e{0jvlv_L<&x#A%|@VT^uE6C~0(*9gZ9 zO*S^EM^-X7Q7-X|z#LUWU~IyBR#KR?iF}3)`Xx_cs%diBgHj*Ksg$vYkwN~*uGep6Anc}>$g}#1@vmKg=k1* z3dG2AI@(M6L}M{R3oe>ZOB*x=&B$39?FHchmez_kQsL7fQz3O?1p1c}Pj?f%mKi?M zYjt8+&+EIe1~k@S+$8o8qtzpSP*g`ub^9)ejc^%+6PpxeeyEW%5{W?yC&Ite?jN)X z;6=h@1qFl`gXCKZ@q%@Fat@*v>lbd3&Eze(IS*J^qTf!s&vE4t54k7p%f>?;8Z-AFuxgn84;*y{X-Ex@#A(4!(vQ(KM(}44Nd*f*k7h%X5EpXmH zvd~r=2XE#tkDyUXFixQx?-(DvM|SZx)DJ!+Sz<fcDr*1}ZS_y)TeT-j^+&VLf?uS`FxGvLWSJ?woNvbN$OBGnKywdPFI}Yz*i5H;Rj`N;Od1*d=IS zbbd9`u#xC~g6WE7+2^^ssVsqX`kOSd$coM$eE?%IA_jP6`h$?{kSYrr8{-KsH25ljBs#R6%1a?gwAkK!-6R0$^}{eLY*KWfk04_VfISN z?I%f*|3t+-LE~B46tte#ifdQr@cdH~(GIxai43h(D%WZ$#drP*{=$ z0mm7z!YXtOdSl-+RLr2*-037b*`kJ_8!vY3{o-VF0*ypqM~gHFJW?eip_nKhA2Q|$ z1zG4#wYLHNErEG@R@5v`=?S6+!`X>s=!s_an>Y(K2OE_Zi-GEso8z^VLm0MBcsQ{_Qsq(qAWb|F3F zs{-Ok8tU$BC|fsQO#$?z`=zvXL_ry@q`L-J7*NGmK~JGHX;xHFW8f81;s!1?Xe~9m zqa+LhO@uLSj6Zc_mzsWt2rcZFdOM5qL1-W!X+BDZpo7NvNTc*Dy1k4+3%jqW1D>k` z&ytCj!~DolEkdSE5{FnCk%#hKKL_lM0(&z%IuUl2v|jF>TBnd!NjmxcXkVM&u2&g6 z%?YT<-)(b05lxWtQZ}nb0U_fmZB~I69{P_c?|=0qdlGJvloU&}deB_4#Ifl!<01d; zsXZKifi?D;cvH+A0Q~8Q#@|q*OWfR0_kESqL}ZlJoQapkuwNip_eb(x_(Q~2N_uu` z!0n(c|MCNI5L7Pc*h(!je)Iaqkd&NrU}dKj){~@O6)AT9tKi94z;maDZq)15W#!HI!k&<347Mneb z@BBFOEPmHToe5ll`=vZ0T#w8~XxrE8SCb7cGF77%5H(vEe&dgu&)G-^nw4%sNd^GYY=cDzgpSq1{{7|xdFC=^jn%8oq~MwL;5$!*+;}&xv~neOaZ}K zfL0r~b!)C862NwY!l}-Ngxu`_j^!7ji~ZAu?tswO1X^xPY9|JmZn`fLWrbmqt_Sl4 zHsAsDs+?)0@%3D}g)atDB-xM=HQ<7Vz;4Y+LOPt-TF@wFw8!A7+morKrBc#NXA;^;tP_=!oT+^bcCSHHoSBDC4_?z55vs|FPv6_0 zQCKP%RIr>@ zfiLyV(M8D;w^t*Dd511cLQAsJ8^tM>aw7H<5CrPFT5m&l@AT)W(|NoQTMX!M1Nk!} zAw+5mDvbh&z#&?aM1t$d-f4^mO&!oS>dM#C&$49t#{`Jze8})KcB0kTlr$uFt%2??kQLfK&7>#{`6Gfh%<8)DJm=sT!B+g zWYRHm3?1%yJS6*$Mr7rYNnGJAns1M*HY*yeSm(HLRh5hiJmbi>bY-L~0pVKS^fFmd z#tQ-bhQUN;>=de_Z*N4`0O@rm3=z8hW6;zNNM$1QM9vt3wJM0>tDRb?3c;B*#V-zZ zzSPA?_Bd(&>U=bAI{dT>T`_RP4bg!056(Wo%F>wp)d%jODwF)7x9R)$p*|gh;gNsP zKtSI)4&tRqdN*}7=|$wrQ$OIhZ&7gQK)#XsaQ?Jnm9zmw=N*hFbDi@9mJ*hAPgNqC zi)cqKOkgxPz14{bGY1oew*wJ~#W#o-kZpunTLKwmAzKGYDDpj4twOgf$lG0MVI>Xf z3YCt#)aRKQxCB5!@4ngTa5pzo8J@A2f@6m##2Hp0$1rY-kK?rKVQOaVvv@bs=5ZJ* zDQJC*x=U0@(WC%%WzhwwuL*TpLvVj5KWIiw`3jfgT1YtY8uT^A_Mm?&gX$J5`)Uf0 zF1sDAxX0%}8`oCs0Qx$v?#3HNq-+?qhcljW8<`OeZ_@k#UJdpM1_Syp9p#K_oNNwA ztRWnNGqL^aKyXfjfyLWw6Ci~j?A4(PKhf$@#QVX~jznV(8kcYHnD2FyhpG&`?M@{x zK6~IFwij-IPZaJ?FMCGGue*Az6KYQP9jB0rLqW}9MhQHMjNflLr{!GN497cS7GQ{1!I2r zxtI}QxySC8oqI{8V_6XVoHPmc7kwPY_*B3Uyql~Z3$zI4?Az+1Mt53!3PF*zO*9D5 z_r!Sw1!1v=9lO%#4$IqbN4yYIyH5FC@#f7>-GQl!en@5Q&za$kH=W7!?6+I`E*%BN zlM#%^H3s9xyvhFX^1+1X{`1CQV_IZy*YtK!fge+;{p1*U=I2q4@jFSmC>kP-zdj2H z$0Vo$`BoxuVc!do_0gZxgSFs*z-2r*<3Y~Z2v4AYtl0weU{o&*ItJB)^r)a3b06wV z-*R2v!23n-Ah<8dLaoim3$hRie+b{22_0g;BvZEx~dpe{+$;rt)fiJUU*w)CW?x2EMw=PYW;H7~WrL=H2k z(0ugB+~O1YAW2GkE-g5XCNN-~hK>I~G=oLb3JXOt=<|uc< zBnzXV6TPUf(dKzT_zozjO)Ub-bigRtmcDgBgTIRBr>`WQa6z~Zp|#A=Z2VQ}X6 zNdgZwy8nB|zJROnF@c5X0)+V0Cw+6n(J=&_NU&BxCI|-llk^SWLKyw6u*YCn>eLPT z604oeR4>?sy{kw7EAj(6+@j!r1A4P^5=zFtgaGIbl>cSmZeYG*!!yDf9CXd|!-~^o zXyCSgEZ3n{nSm%!wyWKbJk40kmBfF6vz$O{rQy({^JAdA@HP41d3$<5mD%hxzlcBK z{ZaYpg8%1Y?>ir443Ur3pTr4*6KPh;do`4VYaFlSq^Sbczc&&zL!e0a)^X_Q3cRT7ilZhoT?VJtK< z+_+6}3LY|MTdWEp4ViUZzdA2o^8kf4qoo_@Md%jGfLDOs^kJRZdw)6U$ZTib%#O?x zLjnZToq8wJvvhU3OSiISj~w1#Ac_)i@Gq@miXJ!Z;=v*=aa(Hyw~LD4Bu@_&7#Gi_ zO88niyk&jW;iPH%iLLi>(m6#MVQ=1sj$q@eRVx@YbA{gmBZbg`>HtL38i$M&kickA zSMwZc|L?}2Rgr+y5E9kNsLnTAnN<0*w~1F`CV_=-h*a9dK~dSE9euxT0-1-Zk%O)r zKGbK~-bOP}AH3IMvwFbC>AQ`nOb}>Lxj8-EA**7wHt;UIhn${bKU8CY!~sfJ^_|HR zS4Do|P*{s!{a})n_Amc(=skF5GgACT@c*66UOzfNRWq`d&hh}Jj1D>(kQ*`2Ny|dY=FRAJ^+*mQ% z`n9e=&@>qWNtrk`iD`SU}iJ>A>O4A%b4$Rm(4c`aE2qfO+WA{d8wG z0gg}ZoBpUtU5>!l+)35CAEnF*=I{YvdpxVtsql8R?<5q1b^5phGz*Ip*(#+L|AMBgeks?Vj4_F zlNbhQ@9TN%aLGrN{;G=BKMe6I%!+< zxZ@v1?#Btil;ayk7$GI;e&yM;7WFzHJOuzy;8$Kq#3RdL2x?3ZU=Cg<4!H6@gD`XI z74FzzjKq5jtue&q=y$&y+V$1?-T$NTN+Gz#> zQ`uKSVu^(RG?GX-m~eTAx@+W;Af&*hK(OJ7!Hb7P4#S)h4vtnP1Why-IB%H&q8H_f z9(iETUpo!w$c7+KMmG)~=uhgmy-h89o3x!Jev4lP0yUed^rFKO>#M`?ZTT+DpPclX6( zdsOx@a6OTE(8v}VEo(lS8ePL;bdD+uhCgzw5@e929NkQBd{qtr0p(|2dEOh6Y$sx^ zKc!bXQA?-#06;K%9s|I_GsM7?81!nqP24eiNO~nQTyA~^rV5>WcaxCaRBq`q5sGqh zS%S?{>U9Oo4&Ix=m^pyC8^8}?JJ7fbUL;=p6ft1?IxA+(5RUTO8eKh(_hu^7)6`^m zPIKB?Q%27qO1nucR@U(k5_c@JzT9AhFKy!`O_H1u#rJw$9K$)Ug7m4IRNEF<;6 zJN}(L{1;3NdxE%XYOaT~j`VN_F~^Omt47j_Ck^c0FH?Z;4v}=(m#-o7iDvl*Vy@qbt%}V(>69Z&Z78thJaIoW}Gn6Y<8AYvlySb|&%F%FQ4-YOrN5kTL*Bb$wExQ*$+{Lsu4D!1GM_L)EE=G2I zmr|47s?yki*_K`-mVphDfwB*rx9u#xy}^(I!cY5^tmO}F0I036$ejk}!3nesX(BNA zqAnZxb@kI~?%V8wQyAh$UcmDYRSVTc4xjC4#)SxE!FY*`L8{COnp@>`r{06`9El4+ zHB1Ud2X{_kwWs#i6f5Ifk4x4InuimGeQ2Z(da_G1kCHR{10l=ku~-qvMwsqY6*sqV z*8NjtfZ>nw;p1gX$!l2-$4~gWlP=px+By@SScK4q(;DAiFTh$zZX~`yE`o!@im{ST zDJfr5iQ7VQKPE2Yc!UlyZO(O7v?Y}Pe%aD`kgVN!w$aRmd#ZZS1&c$PJs(0iS|-g+ z`PVS=UmTmEeCs{r?@XN@NV8u(xGQ(gx~^ zMTWd6WTc`NFhxhG4Jk}p>nTaXN^hkWY?HFN^tGaRsKGeD)6s5T zovr7nkTXdvP!_}>5bYrR;94@;BSJBpgf#?x*{mDLx0Z6wXz~m6tT(O+WObQOtT-$S zw!t^7!z8Lc)al&|0fw1kD`a=x)NH1nCREiuBHUKB>S@r&)c52a`eMa1a73pCK+5H| z2#2s0X^?(;`ZOxw9rEM14dt!BgcMOY)Fc0{I{fO{nUb3?drPg>MQHw#$HEg|#J=I8M)mR!qkeOJJFU@Xwge3B` zP&3zPkBTr+704_%x*&$zyE*qyk(T8V4#&s&i2=+$B9lhjKQF0hkaX$_i!0xORhHaH zd5(-12d~JBPyzrpF223f+XY{_LA_O7BBLK+j0z@|P>tlPuku5L=a~=(jO2fFhN?WbnApai;oua@OPUC+G(zK}HZxz) zC@9J6_Yi_m%7o!Es!Up8VS`ABQKhrgnOBQGpOD_+;K~|Ip%9_vWDo&z#Rl6?7^kXW z8f@xaI9VzNm(R9`fW&`8s|K(_Nk@-&4a8f2NgbE;=wZmjk|4h8OsH`wACET{ zt3?VU%D5aqHI&L!*Ha{2Ivl_IJ*hwA$?h;$KBfY>e<#MqpAZzozn>JDr>U}C=*H`P zx(UO>pmO}FjYsmVm}c=k+}*?@ryHt)>qJ07O~jbddi&SZq2fS0vK$c8nFXhW`=OWv zIZUj$n`YoNLiF-+ZIVx>i@D(E`+UQ>yqiXqfk@^9-I z6KPHj&*@3X!NDyF3;1WqN;~phi@(Yi^VlTcRB5(8IU4 z?OYB|uy7g<8HX6#T{(Y)noyh~ag9B%iAHn!nUto*5;Cr6XqjZ&T|)pNJknM~sC*Sf z_ya+NFDVWZ76TIUFxCSkRB3^)U%JbM{2SEJwg-OGg~!mZ8N(p&mXS#Muv8Hl7ml+q z=ENg7gF_}gC&e)?KOehL1?0GTxd^3y<&v)7eV~W;-oB(F1|M29uOCbm^4*7;n@C3; zF-j-idma}{kiy&`6FsrzyoG7YTZadBn9QoafCOntvRMx}uL`sbC0zEr;PLvp=Q1@J zMZC-_3Ov5i3jKC(YK^%GEI}2b27}c40GS{+jyge*jRMl1X~s!>+Js%M6M>n&1lfVg ztbQneV?PUlsw$GXS32Aa!O^Nx>62mGmJwc{US9&=Znp<+hZT!m(mMpNtYL!;mJK*u z3J6KaLfBVFwA;Betrm&Fg*X-auLAT#3Kng~vie*t@?vBkwDOS&)Q0OAwPDa6zDFlk0@ z{dr)mAeGK$_g881sF~~XaItz1J6b&7C{~U&Gf?nD5Kzz6Ef^8O!b z`I!wEQ+!6K0Y%Z{lMHZ5ZzfEm-qd*A{{e?;n*ekgU}6hhwv3oG7nrmGZ4Ve%HFv6D zae5Lzi!pg0gP--yf8tc#pu}!SLt*T3=yK$-b(?S^7HBTa*fG+6Yfx1_+EiEIPLuog z^H9M}JS^$zFab{{IxY@%%qQoLd^BxdKNzV@fN)EKKTO&-Ay%d9cj2X?287YNAA2Dr z>mDO3&*a9^?plu7EkKu^<)t9mL2xa>M6Yo0Sfc?nt&8nKLIh)4*n1pdaW&X1nvRm@ zL1}6dgutK$huh>#iNbV?=nQ<@;PntG-YL#^gtB4Ln4f z8KLRvxp3LEGhpoB(5U&g#(dzYS*OS;J3vht;S0{p6E`{`dYe5#W8O?jbC8rp&XYD! zZS83;;OSLTdk0$tPraxF=H*lAYGs@lHb_^3-P$ z?Gj*mAxneg-(V5Rm;s&h-fkT_MCVH3#$}I`7Ncx1!Xe`tpkC#8u2I}Nte}U!ay$cW zcveNVl~Gu1NI72^a>*KtG*A`F9dLN;D`c5AT6-IAlgao3WCkJ9fQW7K0C4b=s;T2f^|c{y=VQ9`)vAK1TNq zO2He?kT-H%-8f%hjs8enZ1h7~*E{M8wXB$i(*;=EGT!@R4(RbB9F{C6nKK|>UBZrEcs3OHaLkFI zlLm>3btm-VWm*2mvqg5cV=di2$ShGTO-JXrv8~68yvNt zkL6cEsD1>chr*r;(9UUVpmG$$`UJC z`q%d>@jh0K%;65Nd8r@!1D3-yUcJV~p+m6+DQJh(6==*~h}Wl%w1^qL32x8TsWoKe zlaw@MdpC-yWJZu&wAWvM_>w9#26RQWM+YCZ(JmyzyKz|TwDq#wYmU9nD#IPVbG(_Q z3q7F;7t!iR7f83gE?+8Uz|5hqpT`KnDmnx)L$7<%Gl z@>~b!!@1>nY^2^>mIqW?>5G{P-S0&)2CEwnFlo(R9EoedPQEDK8>vRke-v6K&R)jk z8_X(mXTO3lQH##g{UKxkQqN$vaZA7nR~L5^?ud znmzI=9nPph)v*b1g4AVVF&ArjU|;KwpYzd+xHtwI0~Y%CkF{P9gm%4;KNnaa@x70q zCxRg0oFO5QA+pL`OUhQG?xM5!Myq*w^G1tfWUMG~blefa+fvd(Zo9^6_y^P5W$_N- z3GCj0bjR>S)ir}ebkWP^z86$?bK@j1-85mkUkB4Y{FTBqA!hGu?9`g-XyS{Vms-Cj zMEC2Ng8O;YG)a5HJq&T|oGj@;{HBBXYz$R4*{>UKlwa?30ixP#$lRe>%WLBZj^8y8 z`1)@ipY@^k%mao4-oE@LpHE`D(0q`tvxm|uH z0@tHE{>7)bGeJt&VC0`cYQ4%ZE`UKOdx^A`hQT07m1&D%bzu7a@cIz3dN*N~AosJS z>*GCC5VG%3ZO~zaI8Whe!@@6G(qyxUR2XdCqlffb116mgby&T(-lic#oD3lO)KzHZ zjR#NAR$<7TygC@DEQcj39kvf+%)ensu1x{_9Ohz!zTTUvL!UQQT{o(ZF2^VXiCb4z zq%wL_=hm@J>_&+|$v|@Vg*x6)#a=oxV@|ecDF9@VkUs10cZJmu!;fZg5e0jD=9DsSiK6c%1dn_l>{3ff!wP$ zq4JG$Hrw6-2j_^^j5e+~250EU$O&4%8n8E3rcVL81PJxu3LM)a9)H}r0Caa4&>yh_T_vQpew>+A9*EoMVA$hw2V~$ptZv>Cmss}kL3V0 zd20z2&|u1MUYp=MgLCurrk-#tcI4U3RNM()F};hLD(Ujw(hbG1hJP=C zm`S7F0h$8*fmJw3>v3#mzo3!v>+jr9g^b*%9sQ&jWFxuETC6VxAoG9N&slF%gE9s0F&sHi3N?h8a#G6``xb9C< z;#ziU)9;n|YiN=7&f#SE*Y1)oAeA>#!4kLG7aD7jRR0%F($$bZ5YV~d2qf%~51y?R zWFxvc>lmaY@dfbmdZO29AiODuf)KCZ5DpmJSs%o$fKq3qgov<0Nv>b94(#+f|5co* z4oAoX{)ZjdI89nm#+lY3@0rTT67Pi28W75~sfQ8$9fXRNvjvXVyv`+Huqn=z!E2x9 z7`_vYFLy20WLabI7$@udHTEF99_n~))@SXuZ2*)p@`mo! zHI$n`>TQypEAbN@rUIs+S_6X_1Ey6nL(&D7hx&T>&f`mEljK65QdtHk*$jr%3&-mK zqtl(&ohvudSMeu#OJ9AwDnFF(`Y^NMV`|afQZy~uOfA}Ns7Xo0_D_mpuBnO-P;Y?) z*}-Iz_`|?4`cw3D7&Tb!WeMl4s~8;JPC02Pp@Yv5!|M>Nnqh+XgsipwCO>3vSU5>G zH@dgHQANDgLP*?xqYX(ZB!Z!>B4zqm^d8KN6!OVLRS_yMqYMaGylx@$s<1v1ty171 zAFz}weIv-U|401nA<(+oK}MjFO~|dv;dKr4Z4HwQ^g^_7&T+i7=h%4zP~|Xc>)xYi z$Py&!bbN7hEb+xYfxM?wW2`JMhu1fE5dgzkUUd=PN!!4d38NL{eej3iy@0 zXC-Au9QijWF??IqRr%m_m+ogo=L;NnwkT#Gfraux1lKzVr%=h#exjR*uLXH>F7j}G zAtonhm#_@zCTGvmxKPKd4*-1wAIpcpskPMHlMfLZAedLtsRel=L*6seiCA;YwVwlc z!l<%=g;GeNlZI-(7;)63Ct)ZwxrsU5-T?d}pWRbz#^QwQr+kjbH-lhC{qmu_b+AuwTA=%K#H97FmE^mTtkbsYDR*z}(H+bkme zK75hg4dfZjyTDXVC`xQ?s2&(1j@l(HC@0w{p^g{qYnzat08O4!it&@O9NxeyFGwMr z@FwI^7FdqYAtE`L;7<+7IOyUc4nm!`DP6FMzK7_-K=~jdzIb^GwIanMqY}`ZsvFrH zRM#6BDE$UENi~YvbSJzA(Rphn@8KeMo=8D@91Fcc+~}Zw+x|OBnXbZj9F}w(lOTZG zZq4Gko->%ES#PQk7p(1tD%M_$wFj+`=>?Sc6{AQ>N?*o$;Wa=HsAm+8frSTD89V7=*QYXb|Augm-Rg^w`PkJ4z&- zLVd9#uE6n~7Leio3p)6%$ew`6;(q4JdrMr~pfN?@gUg@-hfs$u6dsb`8Pie639as~ zs0{)Wg7Ms+FSQ#12$nV0fTZUEBxr8Shrp{GGFwZsb%gH`o`YMN9O}t(AT@%ASDgsl z$s5`qvf2GuaWbq(D1y$(tv(+KV)gf}=tJ%F6|W_fTQ5Z>{yij|s5MBsB$;r!XGNBw zjt^}*Cin9=i+U!|F5 zPM82YYLB7n`a_b5K!goI{(dts$J&%<_+kBb+xLN-+#bPWmu5k89fk^hanXX4vX;EE zh1p1r+`}TO14nhuo@!`rQx?@AR!ea*N7U6=nXOb`jT$2gDCN>zu;|aIJ(_5ET5G%UIwMyTdAFT=@-u1D z1R=G+aruKQ2*N4haZGk;Lr7E76Q@0c~~eP>>4yt13(GE!$&(8RLEke+H!R_-q7f0Ao9eO zyhoaoctsTo$&=NUGT>>6jwE|)r0n{W5YBXgi{PX+lz&N8Eh8NKitR{JdLF@h2*HvF z_CPmRN!%K!s*?=BgGUrHx-J8qK2W2zf#7e#1sWR=L5pnRW%8MhV?>MCgd0$XY%%fw zVAlnwtOfivO0c$9p)Frhf8~xV-)9>pC2XZeoiZU<+wMz6w8V7;Y!qzrTk~U|%6q-9 z%;du@|8iStf#Z@*&(;#TVN(gUj$<(C#sg%fK>(TQV$d~9~sfh?tI{m5`9e#ZW z4-OJza|a3-+|(Gvv0TJKLNfBmS7Esh)tJ32lIxlpPkOSO1ah@$EXl!ntKXIa2Z(l; z;o%z!kAadkFe5W1qySs+9iD-^kwd}caxqKF+NSWfY^GKap_-M*IW!nOuuEDDm_#V4 z1ZuK~JcbR~0|!dNs?(@oB{D^Y1|-XJ&&!*f@h2)d0kHZs7L)tC=WkOI*M7#=1|{+G^&X|H}Y@HS)BQRi}puWa8!_2WUW%l57;`$ zn(KyANC2#Mo6rquKokIZQd5=B1xV~NQa_d>QMX3Y5nWDb7-7Kh4$2Dhy^c#Xr_!Bw zx=)8s+<3KusvKHxba;6nZ@oe4}t)aIG*s)8P@IcAX|bx8HCn16Uue=cbU%F2FfxXG?!w8xi^B!u$FzAb+#3eXe$LQv8;0^GcoO4DfS|v8 z(0gsqUihL3XoDDEfwO1klY7upLU`>00vor(;$pxjd{EKRT@WQE?xy~>-2E&V zT+Cv4)ZgR@^|nq`ExaDe-=GSIEK&~>)Y7_ir&e1^6xMI8=Q^b>n*g7#>tIbU%N>x3 zfdtm5JusO+QQrCDU>MRfnh!|VoQ@CUdE7zpKK4R)WGHWMaVaEdeJF(Oq6n%cm+(pa z4%^7Hn2pqHzA6eqdVU99Q3bmcO4DJCKDQh7<4R(Qe=k|CBLveKlIjDt^$Mr8JaAV7 zUk{O9`+@S_?oUi9;2d?2+Sp7Kf6W0@nFRf z06PVb-N4Y9q3tRu?hXA1r9iK#Z0=j3*BUsz_KTp6`SS&>XDfpHA7#yt5cNAd#lc14 z|6F&W3OCk;=)vzA(P0xBh)7ixp8H&YS31D@5xfSZzly}cdWm4-h=JYiTk{h|BGg8qUFzWd_8`M)tJf`7A@GcNF=T@4Dw4Ip{s$*!C>zL#tM5zd9$XT*f>acY94H&2eRyhnwk@6* z@^i42%P(F=`1EPj2yW(4kR~QQ-8m9LX_5%PjF|uyXzH;> zR4PGu-1Gh^iS$hYQWes@P0 zK`Zo{J2l{gz;io!oj;T*iTs3f01WI4r;GyEx{I+yJE_kS?+}}J8^oX!?5t8ST@Ql( zu#HWVctRdXVR0)cW874=u|C9Y6%n_UF^wf0_|;c&0FE~#c{?&P>_Ct%fPYA&_n!$4(=-f>D74DSqryG@Q9H@A4EUJKu*h7$A0 z-%zZ83}DxdRBZ)z2WWNe2k{85c(}NCqyp$HTaY=Fe?hR1NYg}O_K?#p+ewvOjW0K_ zD+xrK$ci3G+}z>`hlmr-sU19=Ld8B2Yw96#Wf~Y2e=4@Ik=EbuMxASg`X1bWAvkS7 zK96dZC|+Iy0!iJdy&4Ep8@?y7oj|J=_&%f&q=n9#x=pSl?wtwVUkDIhrINw>!Ql@NO-_H1OQo0MTu^2=PVtp$>1$ zG_dHvltwB&84v(sowGa~52v7j#^1HYB`jE@7S(6hw=^}LSK z0MjqdU7L9lj=fKmcqp$`cLZoBurP?z^yKM2P$i^W*)$Dyb=CM};Iknn!u=6LhM1bA z2^c868cIVij^K6Rm4@;=SV67yc^`qkU6hZn0Wf?#^7EiyboKDA_#F}pK~#`b^)bN) zi3?s9Ob>yz*#SYqUrV0@^xSFDIXkJ#>sR>E08+uYIM}W8F%?L|z~Xi?RX~Xg5J77T zNc>-7L80>({5!#iqi7MmcuTDL7b7$l@BBBllK*4=EqzF3_HH6*=MxU?FhDz@f~FoM z8m1{ETJ2mK)l!Z13uWMh@9Wn>3ADq;L&*p@+XHR@w;*&2f=|U09KbXR-_cM3U7Q7o zwehn!H1sQ7ASBZCx!eOOLog>3V0WUo?WAh;Y8=$Ybb$aInP_`lrwDv(AC2N(_p{A? zsMtE>I$1&;UP$Lsu_z{YEr*^cM-KR!-0VvFMH3R)AU`McA)A=ZKJ_ z@TPz^#)3SB!6xS)S88Pd_*hO(V{i`sJ#yyT-341pvK&lmRbiH(7QBaG5p!j|eFyV= z`&yj78RPptBB1I*P4>@&ZVP_q?Q82X;kaRm-FQNXRoezUph zzrc|;^y>H!qfy!8>#%QA!MHe+T_l+Fn42CN`p zWA(k^jiGgJXC7zY)jn?8BJ1+khhDc*F0upiY7ZD!j5xmk?F8oxrz888u5o&>_1fHr z^Y-6aGiF}jGouHW&OZKAN7M6YdBQRn&#zumpYCIBRj!vJ(c!S*CABk#VlF;Wmt{$f zaiX3mV;erV%<_zef}8*Jn^WD8$XSaYldR?%rHR^pEN zC#*yqw~{>Ok&&sLskMruxN9`njD5&;e|@eixo&6y5BG+J`Se@nmVvuB?z*3o>q4TP zrs2B9+;ta{74ArhYONvWVNrGu_2rSa_Mj#pBoX*0={9p=22*KbM>8#VH<8?33fq1! z?k>9yLeg?~+*0`1x{qfS;pHOM$;@zDp{}(u=3$K8L&IIRsqLz;ZWm^}q$(Q&x$CMe z++|g4dlfEwtmU#$SXg1)9E5o$Xce(yixkUN(|UKAxI6s+*7Nlra?8flb9Wbpy9>qL z-8E~lYQNr{!aOX=?xDR*|L*RJmC0zUG{g8F`n*4PUpp! zlx-h5M*pcF9AZwOZQW_IA3gCS;74#jq6&9<5N9J^)Ju(Dp=l z$i)A4^IRZq-;xc%N~|X

ew(1jN$Rji9 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 diff --git a/test/baseline/Linux/fbx/SimpleRobotwithUdims.jpg b/test/baseline/Linux/fbx/SimpleRobotwithUdims.jpg index d9bd6f72c039fac7860507ac6d9032416e7b4a19..1b153f906eb861252978696fcf19ef249395ac38 100644 GIT binary patch literal 84331 zcmeFZ2UJsCyEVE)fY3ve-V_i70YQq=0-_WVK@^m(0@6gJgOo%Nklq9oq(~K!CcSqM z5b3=akxoJl5R$v~eZMl!9p|1i?)cAF&iG+SFj?8`wboPSGoQIa7$eL9v^P~XQ~?MC z03hHuK$rwxf&cp_e-Ro1Ix?bKXd@It2N2OgpmY#ID32wo79l#-UYa#dF4`VCbzb&Z>M@9F8^e_&u}ZejVv%G$=(*~Qh( z-NW;R|Eqw&px416F|lvr;uGG!OH9wm%*xLBnEUBVNoiSmMP*fWb4zPmd&k$#u7Sa! z;gQj?@rn6`#ibw1KUY@QFgv?@`v-^EqhkmF{p&*iF`>Vk4>)lM5iv2881`#E5F&T* zAC!)mlC zuNnPyLVukPVFI9nLck4!(g6s703eP5K_HC?Me&b+fF55yjY9k|O~ne16M(!>bRqur zX(|C|Mj_sJ{o`-ve{>b#E4>Fw1R(AOaxMdT;OKjX0Q7SMg3zOH|D3h|pPMW`i~v}` zkM8H-DP#zM74y8=DIJ>V|8D8O@jm0j5x;gc6;C0JTw9bEApn^Kpo9QM4^wbotN$%s z6=8sURERyV9fGvplDf!Aye*od1MlMwYCvmij}JEAQJ24pE}5GRB3Uyk zNS8;T9hwY{6BfSSDmSyQDlZSwY%f2#waGA@*~?m4Io6aNJqBHKfa5z;Y0P6-%_|1& zw{(h(Lba(@+`iWgzd3qZBpLj6EaS0CEfegAeHwIF1ZiOg)#5rBdcwlGs5*f749f=| z+9AF~zDy6XPFd+?$WY_cU8$Dq;B&fgKfJF|FM24>k|z)9NA{J6i+sUstb3k+BT`{D zsFvGHHbaGK6c3=Mmx@~pHaVVXoTKW`P~R-3vNd@B@!C=!tksMbF&8)c#Vw2En+}c| z%MQ4Q6MzK+bcGT+)4vP4W$fX^BJk4VC_VU<^Ujm+%Z!jCjT22|6H`5{@z`2oYKsv$ zj{LJG|MUQD!;5C(vDEQoY~R9!?QGK4xNQ6#fx{`;Ifh zYAvSvDawy3a^O@3j5IJ@L6_jgiS~%Q#YrOOpH~h8c$p{kGst%Bt#%d?rRgV3C&$;M zE8^Yexa^fk07gIuqQu=_xbczz2<;-9R0+VwqPOsGWB(PYyZ$Xb7<%G<>Q4Zcg1z|= z`+Oemdtdx<*3kWmYeS`*Lj7V=nkORCeUj><_YZXpCWATRu3t9R;CM6@c5bVi3pkIG ze0-Wq0G{-~>1??S;{Mbt@)VUAd)tNGN!+=68M?0l}6lJBwCl_zA2%Qq4QvnX1= zg|iC*m&?H6+#8Or^wrqiHoDr7f<6s&%ff~D^OnSIXMMX=fKjsnH^g(|{Ke)A{?O61cNamAk4?`Ba;+G{#jQIMh zsriOCSpc4Y+&!%HX@AdB$QrR#~+;}@+zj^Ulj^6~?W=8xL=B!PSfx(U~zQG-8LPpZv=KRTcx|iLU(&&-g z#dmLwn)xoC(@Nvii)`9d6sdXom|Okj-aabq5 zwDm%*vN;h%FCC@l%@fXy{kpO?C0kv5HYzMvmy9R+Wr`9%zHQJ_RpaS=jLc-UwDOOu z*T}vhodb1d-M4{Rk0&S*<@D7k=+d|{?Nf{EHJ8H{-3BfXEnaQ+=>ZJzy&&dHp*(5; zBZCr|%li5CXE_)oUI=x$-9NK+1G9S2uYNB#<_fOdl22T>+wb0&T;cbY%4;ORC7T1Z zMH6?_kDJV|-Yy9lxsAkK+Q{;I&%`TK?+>uvPkjEC_KKLS60`Mgs^ zbLpPp_$3bSMplvO`lq|^!)Socudrrrb^`E_I}kztF#e}T1UHGtYrak9*OK<46Ec-m z(N7%D7w1eQQF1=wTD~6tBTKzZAmmJ0$2k z-2d)_kwbN#0na<;dc|I$EHh6!;)r)|I5j0)%Hu4BEW1EX+3;VvcM4^2j1KtkGR+Og z+P_P;PygBwAD)GHQaCQQ=)U=Ap~_nX?cYNAkv}-}#J%;nu4Ofa5xsC59yL*(U1V~5 z_qOWU!O}cVZT%R9!wV0e&Q(>ug6@Y5;>n^jKFm439kYz3`+6pq zZ`fC^B3>x|c zAFBD1gjro}r_sJ;o&rdwW0e<5+X(=TaYKO=%jgc`$ra8k9g9kAj@}nWN#$qB)dk7dIwCN{a9F;$)O)WWEO|Iw_#Y6x&>__tZ4%>_!Fgd_E?wzS*Jc^MftX%a8Z7tul2C#jH*z>;#+Hi`D9F=2T{JZ1fUf` z05}jUg;*;BK(?t(01}1(= zRvDW!-yoI-=z1B;LB%!wUQzRhDEq$3_@0={s;EVr?~+yQ_oH;sKSt~%#* z2azTTG@uJWI_KvwVmlSzj)G(FGZBE@wba920${F0NdPDopacEdI4A)qPJ`ml)FO6Q z8V)=D^5O*d(Vq6n5;6ebM(2MZ0IAmrK)o9FS16?Tzpwqj*M$h#ToHu#Va8)YZowMl z&jK9axMQ(X3;`JH17EDH0N3yyxQ56RHb5JDUw?LYlN;QqW)v+>uAF;kEj6YO7Uivu zW=eL@bt`=LCNk@)m`0zvOE#_8z(^;Wt?0lw$_Ue0!kBmql(msl#HRfPXCO4!2cH~ z4N<$Z&j`W4PyJH;2`k)^CJ5LZJbdWVdS`KmQxLir+ahekl`7IUA1G|+WtHNYV;Lg& z__affjpgG!4##%ZOkDJ%IF-`?XB+$cDGw)VMZ5^< z!m2kWXFb+-q9dqf9W%jLTZ?Y+U%)iHcJVTJ+Fp|LV9l@~F3S|~vI=nRLA1$IXIEIn z&*)8%5&%`txA+b&#FFydnsYUd~K+J;^^2kFVAkGH!#1z)r;fnaZ31HCZ;|& z{aO?OcxGrb5tx-_eROh$x$!M0K)`cKoe~9aTKiW6)g+v1Lr7ULD&2M%H^*Nugd;}- zQt=^%z$rg^zr@6bnf7BqSW!C57HwT^cbrv4rE>DfAsHL_sGUDUk@#1MFv#xqD|v5u znCoIbv@H=HER|YjYkF?fCEWQ2)_yTuTN^{;|8cFJXZUkzFpd8QkN6ATcjwnVpVeMn z;HI9L20MRRj)fB<`|aSAz-G_{in;sn zR1o4ORz(05hk%;d+0#1r+Y zgW%|=W{!BD6^MKTasWm9fh*{!4=P9${{d?JU`Cm)qj=N|Yb}f5k_o*|T z{qxKgIWke{_Ko(LIXHi#qAt2OGT$4*9U?EcfS|^9=y`P)GTX7~msrk4a$xI6TVLEu zY|r^rmeq#$pHH?I**_s3CJpkLOE#Iuu-TS7*&M_lry)yGG`n-Xev>MF1^dpHp7SFk zQf91n%%+TqS3YR6H!zr3%iQgBr_P^VPG%~2CTWzf{Xmm4c+rd&8`LV|hOzCD%|uOR?V+CP-Io3(MwEqKkJ%>>}&Ozj;4kmDnbLXiHmdc^-}PGEH9zJptVo?dOR zj69;RRRGw48`-$g&|3iykJlnena(jJc{wEPE0pjY?QBM_^<^B4acQ5 z@xX^le1Rz~#ks0&he z9@=-o{oml)18SHD_YsRql%+4=T_~#mU_`$F1k#UK?;j0{T7wvo!#t`*H8S%k?Sl4Ed<-ros1qp2j1W zZlbqO{Wl1}-h(vwpcz@1O+!fJS2kdS&arbH*KoWCfPw^wl0aG-?A1OZ;fMf$Ypx^r z_YV4>g7pC9O(m)eD@epHnD&~<)&wDfzoRUp@ zMRwqihJW+(nD`}WFd zJYq=`{qxkr0J#FnJ#Kq*5&)hN0^o^=PNV5$uEHVOQGDPcF%rF?_8Y5ZxPxHxt+%#~9{t=?6zoao)#IH1lyZS4QnH>XQXlx)Abs5AT|3t%% zmQivy0a>&lkxokOiCY@%Z&-zbF{K^FL3_yKTMBIY5A_jknrZ)3qI|i6IIBb*qdp)0 zBW^%2T{T97&r*FcoUx>)hW6v@w35rTpVDH$`0-tH(Tuc7GJe;iqJ_4XW>%KmbyMhS z`b_9K&*-`_ms$4A&??m>%SUk!)k(7=N-}MeXx@EVt$rOtQXMunYdC!r-&11W?2}?3 zqcmgTWog{*-P+>a9YrnlJCINST6wFWgGj^gg0}BPi@XWg=*qDHH~)+H(P_qj7&0XQ zH3B>=KbqGu}~&<`46NT#N0~A$|#S#v^+NP#gd!2_OQ1{NMsNJr>z)XwqJ`U}CP_FIn@T zfIog$r!rzjqP*N)_SGsy@vi7I`mXP5ONNtt6%scbE~_zYJO#WF7_oz0bcEk_HcqBb z)Z6@{ikDQ~NdBiTmq?m6lKiD8$q{O@>LDqAuQN3o*3BZ)<04y|V$?m~f)(EbikC)_ zwulMd1=H+m(bxqa(~+$Mxe~ki!ob9PBlmZBzxVJO)F*Imhx|B^ch?_zUOBXEtt)4B z(ZMotc?o)sdwljF2{Zi0@O>%`&i<28?Z6c?mi6k}{z%52rw&vDtERFT(#SkjOPR;; zOJiHiu~W*T9pLJ0%yIf8Y{+3o)*u&0xX1@)zgeDutW=2o%yZP7cFnEgA(7hbCLzWC zPZDrQCPaREvr#4hW z;G$7?@Z$NKz}HGJ8iA#$MC^dQg7#>(PPX4sP8=0wTXNRG@F;Huh&01i%eQ)4#=rs&|o1;)I5!u7> z55`%qe4mO>mc@ltI36Lahs@(I6o>){rFwebek5i6<)e{$#*y=1M)MDA>(5{qb!<$} zNv~KEfLo=dMtOPmx_xSN@t&ng-I#|lO4U(c;yuit!~aMt*B~I4$%2`KMlyop6;iwN zCv?;yzFoQGqTpK!p-Np_A^?sJdkjk4{5UNFaMx=u;YbID4hQ*q3;~EaLf7Ei%oqs3 z>ZDd0yy?YXeefR>=l;v^`nTdUb=(Ypy@3Wfrr5g|#s-`!qRnuAy(itcM3kH)>(vbq z3TggM7wA_f$kdx4Iz)h|aqW)@DL%nsPHuas%zcp#=MY;k<1{hoREU3Rd68)Hmgwt| z1XF>k-4P$zfq9Ev`?LzbWju!VY2eI+WxW!-TVvlW0$BzR8NFpt7RkP*Z)YdBTE25W zd0vd_Y+2&8lw6(<+L{e&#-BeXQ$kiKWw4kyFf{%BTv-}C14n)$fMsryxRHx{f{{eh z)@rkT4M*=bI!#S_2y0YX#IUB1%HMT86Ii#vx&gMv_53tFaI7MwY)Q(Wurl}6H_HSY z6=MeFZ_Tg{eh;35(_rt;Hw3leszX-r@IJ{pMdq3s5h>i^V>$JWf@g)>7V%p<2MV$y zTWk8$ju#6CSlTOLc8V;$lVTbEV&&8tg;%Pag}qBkv|AGs_@Wg6udT>)2F zhwxgn%m7V$x2m2TLsw(&}C}kShI_x(UXRjeP976o_jF+Iv3c`_jkCcQ zp4W?GeH`Y%u9z*Hw|8+iP`qjWRKu0B)7-1hN_T*mnawocsejU_b(C%9-9p}%!b|0T z=bBKkj#MLv&n?aK=bVzeH21pHf5xXNC}s4tJY7IP7(pn-CFNJ8}Qyoy2= zfpDA?gm*Ww$@uJ()n8y8$BS(8MlRL=72X}Y4O&Cdrhh=ge+2OOFCFstP5h!=xxb?j zgE?5}r&$DG{3Em+3S|UJfw|061!S)w5GBa=xGrycDMP3MUtu9NsWfNmxik__Ap$cYxAvY zk}G?+Mn2bsTqC@<;Z-UzP7^bFccj*AA(GaX4d$0GMJ`(VXmNd*xw@eEV~>QEXO@T0 z_N#s~Y~Y4wV0{Yvy2yEhx%h<+-Q-P4dnM@h$3hov8f&|`)WAe}Uuv`@t3$DoWbdc7 z1c}=fGBVXE`Hs%+xwm#DpHHSr=A{oSoDIHJ`xKE1ofD);6NEycMVwbawR~C{ z4YL_G3AAdsWK=iu^n)kEhL?gM|I*i{iK|Q+-d{K7W6taH`x$-QV#a%7YogMn$UXD0kZBuk4tWK)b*5r- zuM9bclRaMDk{iT;g@>+iV^3-gXV|ApPNx!(^=jX&96P3N_w1QTGb8cF#1V^kdPU^n zT?{|IriEj!+&7+o!v;(YxP}|G9QvK8)x~!$x}3LAJwI`9h4PKx!4!ULf%D6^yjssF z&tCr0DD84fU`IQ&p`;?HUSez(TQhGG7&k8#s=w3u(GE|wOOg;Ik7S}XnYP~A$u9^h zyos95>WGP#ss5PK-Fm^{^i%!i3gBq*;Mr-W)a=W|&5l5vCTX7IoMy7Fmo}Y;(+>IE zh&=aa<>w`(6_ZQR$z3IQ7!r` zDTOe$96E6=fU5OAHk9Ix|5e_qQ%j3jc;K6R94HBy(1G?lIgf#;0fd@=;OHwC6lVwFq+q6^+y1e@*}RtA5&4`+z!eUz0ZGvO~(B!0cT@$;yT z1$0McUacjP&bJRqS0)@uXBXR&F)5!Si2bmrSrINO^7)C4(bux*IazPR`Vx6vVZ|AT1ZV~h2}G#W z`>5`Ii#K@o%zxV7@oJ)mXhGqYXya8MJEK8)g`DnO+lmWzc1(;6-(qhzg(y3)9A&2{ zeb$%koG92Vmvq;Gzrk5zRE#ik+E!0?Y-D*a3r#4WHA)SXzJyP0lo2X9(t^TL;r6~7k93|#nvC2hXcFddpDf=DEpq3X&ZC81m zDfu&kV7yx;<~$5vzrqwgY-pmzC_q8^M!J)%XigFr`;X47WEP4LrNS; z(s5zI&o3ElEQz{3noE4h{{T?1y^vFu0!HM_^6K*FCtwP^a8dVcSM{Y8wdYQ(PM;}a z1fe}hYvil=SvE=b*$_qQ!SkUD9j{!<2*9h}mTJq|5}8(RxZ(9s(%h_7^u+;FY^YiY zD{o2QckxfN<0UIHch&}sJg)G-&YaMD`ywgVbyoidS3N2H%d6p;DTm z)@cK0V_1H?9=F@A@x1f>th$sHRjj`^rV_RutvngIi}&h-Qbcd>rIG$wBEPbDj5^B; zV}x+jcJL5@M`}Qoip-?TrmAWRWzM-7$TPDhunBuAi>APraG2h8fG|g*}!Pk{YJ{d?!C(>-61JT z1#a!?Ay@MFneSb&lm&e}qw;&9u+kXuR!7yBDF&>(;RfUPP~LYI9av_u-THQ&hd0ch zS%lsyp58GsD*5Rw$Zxo|Xshroga4iGrI}loJ^|KP?WX%Lz=}40^vmasTuVz!;u14k ziE@h1v}znB>XH3Sf)fUvtyfqcLpCQ~HNf%g*X-q$FB)#Y=6Ux4NoLKgI(d80GW4lT zeDy(@14FOlC!;C(XbsExm906yt#&UTP2-Zcr9zOF8E-pms1M_aDRV^;+BE5E$$2=X zf#^%&y7%P7PMsfZw!CjR?FgQC{^SvQFUIMcK%xb|H8i;zquu6nP1)IfA^EZA%PIbp zgX0AyrHRzqs>(#=VsgE+hxUB*%5zX7ZEP7PwPojqkVl4LO(5A)xV@;W@JZ6Sh%5@l zWTe7Df)L|3OM#-eTUvZ7v$rEhT=R znNZIaJcs`NiN7lG?DIr#F4h_kbINBs>Uj*nT}(#{rLzrFN!Ik3Et}qHYu~Er`GI)l zM?U8wuNbVAJE?Kb#O1LYYe^^jP{|ZUi-*ljHtrO`z9+<2RNt6Xk?pi|f4X{3qF7&_ zSn{rl5SJ2-q&hv`r28x1&9il6_wIdLAJPd zWSTAVPrX;qRR9P1%!YO7t$g$R2h5iZZWZ!ZPf69fA7s9CeB{Uz;YvHL_V%!@uF=m- zXzPlhm&Z+%x7LX+PP7E;x>zUHUQb~ZiXisB8R2lon%+>pD3u1AEP7+6E`73xaYrGz zthUNuZ(vTXL=)oboUvNo-;~A#aOZ%!C+@Z}yckY&P)f7&A(ud(8J-T*RZe8?Xr7xH zPdi~szcIXzPeZRABcokJ3$rDR&8Tmj$vlyh0({^~WcRo+X=Gh=+jt*A$ZyV)$}u_> z7Oal*whyg96rlyuxD9AC?jx~OutB4TLEw{1!3GWUKZIHQ z?*aTjs{g+T+`9=;Rkd7Cyht;juzvgOu6$ldQ)9njL>zBtu0r|q~vS+hcjkVTJBCwnHIY_ZqXxRQcKZ~ z!ipovx{E>>BlzWXbYS0RIphs@r;V_;zv~uFyxw+w7^e2lSqN5A=1aQd$HaWA%6dj) zbL?aM_)U~&gC9V}GI|)2tt4TRdIQNT1-)ZpO~8%_ zteJkgvbx^p*)taEfm@p8mz(`GghKo8JWqQL5TO+8Zlm8@f09qT!eRei0j9kK!nOK( z7Ol#imjnQ{zkjSlLfJs6+NJhJJW_cTj}*%XJPTjTGcX39r30qsHVMF$1AMX)sn{!d z%RHR?(6gt7AGEAmWNXE3jz@w&YF>Qdn`KFrV)@x!qLoe4C|~jMGZzylVtWiD>u>$NU>!*^6k!6#=E5A3f~t8ba2P z23nlBSZm=+ZrWOA>ye;VQ#$EX26^s-vf4_g#52v^3*GF(Mk;^|b0XCCg=y+fZAs_@ z3?FleL0A0sOR!hI&1Q6k@(P%14$vNVGBl`G51O?@k+}z zyCB!n`I%PEB(jfVT0=V3#?lFL!u-3U9Y{L`i-vQVt{}G!=2(h>0(xbT#hZ#eSxN;t z0Pg_IxQGA(6O*-hkNyAuOm#y**(M_)`9fPySMf{MY@D|LKu}Yl<01 zeXwH}eAny_Kh_!Fbbve-)Pb#u`H{MOK}=}>>g+j@{t^O^pOH)L20K?b|6o24R~sA( z8R_6Hv&1dW#V;OLgp>*2;k&*td~TrBCi9j06TK(ZBO@310?tKs2sK@dJk#6?2{=)- zxsdML%RI5rVlL9rn)LCAtLTf%xpyK5ptt=`O08#tL5I{!|x>iW4Vm}9`TJsfoZ`3UlaB-f^*r_bfr?7pZ zc?wiGeieDPxvYtGc~dehbr8TseqgQt^$ThlC7;nEYx%v4v&8|LU{h|ybDJ?Tp-PMI8&Y9F;MJuiG6KhTRsoF{`VCpROTqp-V9<^5)c2Huj` z9Puw9c-7kaO7!>Wg>wf_mOcEt-A@bW8-&!7?>u{Uu6CE|jFMOZJ!U!Z@G zbtC42xuwTa_z;Lca)nmbRD>@Gbtx13EB)E_COU8IB&!3eaxMgIWhzE@9)C!KN7kQ5 zeyRr>gvejUj1K)bq{fZ@LX8uE8x+8)8u}7gz#4I@Y7c7xZhOGq-}B=-&}N3w$e(!R zcR}cm+`*5bk=;f906&)Ul@#Ls%_-i@2vIR91!o} zHDBcf(U`)Q^u9Ca6cu?Vw}&ZF?R3}0S&5qidwU8j`_x}Xz$SU$5`a>X66cDDq}u!{ z7G5`HmL9-I0HdfOA`hG6q@f)4z^UYWgtk^EM_r%E9?(>PYMj55nkakx@AL;D&laJIjOg+L+}%<#=^24d=Ck zIAj__OPIqPc&r{Kyf`yK)^x;XU9fRp_0ix3`rC{@dA~hW#H7IsneZk;c0Rfc<@ORD zu4G26lOk_&omp8s&Mt7a0p6Y`j|}C_O08Nu`5vQZJLW079p9phDo{8n+cl#02&nOd zu}1KOjVg{@pZh$S65>fc>)M5UoHW+wv)H=|eKg|LKL2jE41;|`-&4_`r01HfORWv^ zZAm@eUp1x^flUg!!PMXO^auVW0hCl}Ko4se)+7MNv%dv4n8Vio*M&X<<^&+348*^w z|K9jFk_g1VA`LTdSyQ33+Xg?o`4G2l*pMQUaB9*Gq2Enswb5X zXK2}Oc;+D*+Yv)LK(zUU0|jTmHV^>5?N)iFpK4c#BWnt6>|@j{+c#XUOn{w*osO1K zuti#mq!Oy>8)Dv&Jyb^7kl82p2?yJ|8Rek4m;U4N{?&V zt}L%9y-41bt1>(W(3~{C^scPJpFx073DbKMIHYD(>%=1EecwPfOgRHsGhn|yk>&pF zhMYwuu3<}a+mZ3JzAKx(^X<1i*0DOURFA|N#@PyPvu9q&JCVvtT)g>0KkBaTEfx}h z&py`B4)1Hs7RfLU-(Lc-xAOYpxsww63`E+dm)srK!!V;tm8Qp{~ygnBwXgRP4Cm)+G zRU)mdvZtB7LqA0uT5VZ2B$6K&+T|VUasL}d`jtk6p&}Wt8rp20>KReBw-}n}67eOf zdd2}2K$!=n%u4J(#Gu6WL5W%jK01OrC!}W9TlQNk+QDH3%0o$Pki(!h`cIG8fwjT+ z-5a*Rrfk|Tk1+c;_XsHR>xH@r#3@Mt;4UcP3@SW`K&}b0R<*Q;N1oaO2|2%8N6?+n zgSCPAa%}E=kM31k#r!$D2UbDOrG6%t4Tt-TX~*wHJP_x!>j4wy=lLtp%Skz3AMetcGh5m}X8K6a zL$%HNKrw$FLA#2%ZdF-1AQteM_j5w@WNmrK6Dk?DtFqn>jXFE7B{0pDdo!3{lQ-2(Rhs|3`?O8m!7np;*75gbe zjZSsR%E-FY#SV1EQy;`7V=3)2TYTJ(7P~8aT16iK_fFH~m8!!&WH5A`Rurzi7-*B* ziWek~Db?SJyUXr*?bMtihHP<1&pa$mg@qKcagxHox9hnf7AZe6hiZAVR#T`NLZ->>(`*gTeA94v8q9_J zlF`iye)5oNm2^*>*#fcs^T=al0%^ z4y=3x(x8Q;sB@Mbyg8sUaUDc}V1@Q2GDdkN^7sP&4Fq%ezseg^L2nd1HOFfyaZZH6 z3nf7vMD%_6l;j{V{u&*f%Az#>Xu`r;xGSszzJHiABg0nnQws#tswpNr?o^4})C-h_ zpHD@m6bG=yM`kMB$U6D0G-el8Gu|tPSS-ULh4ycLZmB4 z%I*)2YWLL|@s}lbBp6*0sTIgllNaOL6nh;HWw}Gq1z8nr8lwAp4y6dg`p+Mt8$w;} zrS5i@+Dx2iQL?v@4;C6^mq*YpC1@Jg`G3u^)3%YGG6$fmsR7leK_TAa(xG|Z%!`LN z*jr@rGI1qUubULZ3qDi2T2j_0`_LqR+KP2CHMEt!)4HH$2>kraa2Fk4my0zs3e?oP zd%Yn^yC(3#kJsp50+PWkZwtwVcy19;u{te6a=A)+Yi1X5bLnDYb=SwZWw3#|BW(4|x-$Al>DL&R zJ?ZBuXGf`=CXBDAuRlcN-_P2V)=Wy5$ls~G({dT`j>S;6YAlE`m`)kpv>4nhA6xwy zUPxWp8mm?sWnNiz+4y<~OZi6!SR-RuNRVvjy1nReLiT-RXi<*E3nK zn7Z7jwLTh(=2DmP%54phHQMln>A-#lH6=suViPb)jR&$*8Tv!=%8M-CHx`nzzmSS3 z+ZSYF1YU1hl}5~L%?R$3l-J(n=&Os-aOQBQivO_$aMut0Db|B96kO#*BoF{YP#{73 zO;HW8_g(uG($G7v#Lelg1L6!X{L<_(B`8}8`1h~PG|__J80rm*`z?K%uys2~;2)VW zVCbBs_k3v$#c0nLhHTf<;_jjkL84Kv+W^N~V76*{aRA}*Eav-zZAm!2%^_2fHlw@y z3vcJCDI>$1J4WG#?ca4jquZ5WGhAYQn>a*%^{SJy^L&pfnQH@;nZess?V5fmMrNi? zOQ{--XJ|vuz!4~WszkrYvxCp>jzo~%j&=k|=Rz{Ml!!D_tU=$1!D66bSnTXr5w*J& z%Qe0jm$3?IYbGoA2)hSocOBe6!n#u^Fi&R~M|i6`y(nWj*xs{ih}bU^J$Y@391v-; zIok=@!O-VjcnCQNXp0EKu(wQ@jqkI|anr7rSE5H>XTL3YmuF)TqlZ2ymg5*_w=q=C zG?Qi77^{Eh$w=$zYy^02*5`imaK2O7FSRb0EOxIrO2yU6E&FQ5<4-H=of>H==QTE; zJ+cACjhP{969)OqA@_kj6GWT%mt13w(Wwj;fG>^=I4b8G-0uZ)E zNlsmm=*~Y}{*ubb$Np-UabO6+*Gv}(1F80K?xP2x)ihBN|qvc-pGMwOdUDT-3PYmdrB*-M)EI;>3x>p zk1(UM6Q8QRw05vC2mNsRQXUYM5@W&Lu8Ekxs~v)XS!=z^s7SOcx3GIf(NZ@`>WW@3 z7AM1?eC*S`RnU>G)Ut!OhSN(hRQhi9H{##r_MT5zP$2g%A7={BQ^qHq$#f^}U#o9V+>JbJ%JBK}-ObV! z(MJ&=iEOqY){&Hddl@f6?-jbfx>OnQvsLCZMXsmG+to{;>TH@XkerprkLsnpwfW8z z;F0sn`)odT`+>9@q$|*1UrTpRZgTvF@cSOevxvH?_rcV4MM%Zff%_zn0+&6M6gSb} z#}O8iS&tk`$I+>u72*3*&$h6$rd01b{S5`>+u79nPIQCfh66>11JxZKSk8*T4Rk?h zF3u3skqqeW%hu znS-9!!UxVjIj^5&IjweX+Jj+a5;1|B+!P!vSw)qw{Z9ZpF; zLa|`w=!Yc$o!-CCc@+kOB9P5r2fgb4qJH{Q1ocmU`0GJ0?T!3D4ti~HgMH-m0KhlL z1CCb~I0ZY+eTFExmtb}I7zK8CAzf9Vx?}pv?_1~S4XZu-!Q-$+w&9hxrtM*(XxXzU zQx%Q@qiqi=u3^AKK)gD;wJFU|x; z4BAYnwV$4we3GB>tb8!vmv?+zN&6r>ma;3F+Eh+m=9amT$i(@Q2KBw5fih}7sI0Oi zeYc%6Rr#Ux*5k_Zs^IxbKRuxIt_qI^Z!|KPQ-x+R3-Bn6@TIm+5%eq*IXkF4k}07f z+(s*FkIUa>t|`;XrVQr$v2CyZ#O8eB^2EUteIX!% zGCcu`kOw@v&PtrR-Y+nIRP5aFF6ZO{gIPaP7_@8nj$^y0@s4LZ0QA&j#}|{zECUyB z54t1I#Q9wo?BwG$Q`nNAnVzbo$TBdysB}eR+gp2)axcQbHIjBs(Wq1!lRuIn|J*Oz ztYq@~m(ojtLKd{`(SbZg#LFm!*k*2E-|H}Nw=DrN&SXF{;hJ|tF<16cQQ@Us`->_J z>|2jK#g+NQ930LXm;=W-YT!rR!5^q)uZ&0^`@G?M6G-d%q|t^yu3J+c>^jQtXh^;y z+Uj70OxYx=#yWhkIv*vyjnIJG6>7 zIZCB`SonXqd-Hgx+qZB0Ga-aV2-!x6%GP4ZI<#1lh$6&P_9iCDmStSZ9zrOxWM4wb zmSpTgW#7g+WQ~k%8e@#-)OCHo_jO&*ec!L=_4@su`}_Jne__mgKIiA0^E}SucpvZM zeV{A*%Bwaz9ZV`X=gpnIjKqHD>#u?R1ce?ETk0Jk>3SK+AcRkn4-3hx2qlJQ&KGmt z*CQnFp9{r#t8YSmWe$PW3CEa17o~OIyhwD!h&-WNs@hF9?uPblsO z$Ox%f(6yxPtGJCXzmvNJ{+|mZE)x;d0E4a8U-+SigA&;BrH~=rGn*}sH0G*%U|xO) z+`iC`0r4wbQ!%Rnp@YMMFyKQ`f4fJ56d#!TY*=vP@oVI$UV$mn{-Zyyz45B*O+*BO zy++V;fWQ-u(Ctq!?sj8SpS$6SZAw(F3QA(26j}9{5J_cs``3m?)2UzM2TqR9R~%o_ zv3_8B6P~4dXiL-6q9xwMN{Bqs?NB3GR#DdTAS&G4HY?v^;T&tes#EsRu%?qk!2InP zy#mQAS@bo%HvXQMk50e;0Ih$tu1ow8>$t!8u5`5?A^a1=O!8zg>({EUp&mCUbwxg) zlaO-5=Q~B(#a18Pljv_iV8qnfi*LJLFZbHn!h=7XfFp`>`DA5M%P=}^HusKL-X$3 z%C_k-t>{~5hUBVuzBAXIy3f>MCJ*2D?%X?;kiGD5X~D5dJk=u~rE_}^%NcWHj`rjA zu_K=t;~ejlRE0YKNa4TE^+F=?Oy5iB4!LRvBFxr#+trYha)AJX@#H6b?K}{lqaOCQ zSAVmV>vdKoiqlHp6}|sO_Vt$g@_I8{mxP?+9wm#BQ)U(h&f*~QyUF6Fjzd(NzPmw{ zBBh-Vh9_$F6UBpB3)1J(Sd!Re7fC07(7Fa7`EielVnS0Dzk-Ha~&(9!Cpspqq*cLo6&~M}Wt#c?Y7g z<0fj5t0;9I>|ntpc3Z`<6h@Z)JuLp$lOX=-0c7M-qGmM^^F3RV*iQ+BjxEL^5U{+` zK;(_l?LbcfxbKAoAG{`wK&`EH?PVn-kG5kU9`d*vHd=@qkOEF}Wp2E

hWM(O;0J(h$3$MmOk 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 R6YE+C5d4p)HSoVC{vVD(aaI5T literal 79629 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 N!eay#9`^rl0st+Qz~le` literal 50074 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

@1iEtyLdt#3Qde|( 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 diff --git a/test/baseline/Linux/fbx/cube.jpg b/test/baseline/Linux/fbx/cube.jpg index 76ae334075e0052d28a7f0db3f91ae510ae21fe2..ae07415a1e0e8bb6cd4f32344f36019926765406 100644 GIT binary patch literal 48262 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 literal 58840 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 BLdpOD diff --git a/test/baseline/Windows/fbx/Megaphone_01_Lowpoly.jpg b/test/baseline/Windows/fbx/Megaphone_01_Lowpoly.jpg index 8755f63ee726c54510bd55b8e28c1da2f0a1fa26..15edf44440d57dbdc6de604f5b403a9b3b03b90e 100644 GIT binary patch literal 113607 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 literal 110838 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%0Db$CKzs|51IRRHUwP^$%Bl$+I`u|i$S2tT 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

ew(1jN$Rji9 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 diff --git a/test/baseline/Windows/fbx/SimpleRobotwithUdims.jpg b/test/baseline/Windows/fbx/SimpleRobotwithUdims.jpg index d9bd6f72c039fac7860507ac6d9032416e7b4a19..1b153f906eb861252978696fcf19ef249395ac38 100644 GIT binary patch literal 84331 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

hWM(O;0J(h$3$MmOk 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 R6YE+C5d4p)HSoVC{vVD(aaI5T literal 79629 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 N!eay#9`^rl0st+Qz~le` literal 50074 zcmeEu3sh6*w(cJS1Q3Y`Dk>TkE!3(g+NxMsu~zZX8mwBaT2kNip%ldzmaHgR)GCpx z)mkC3)`EQ)ZEf*I16svLYf_s7)JyGLIn6f;wmQ_@Ynz2|G5fDppVCCVWChENIU`s z!a#xRd%?#TqgUI=$ix2$JcOQJ-Xb4gzjhsnhd?Ow@DzG^d3xf?G<-%p1HC%-9x~cH zXv$nspXA`Eby@p;!k#-?)aj+48u|{Mw`{$yU*|3%UAy&rB0S>B{==SrX84Ga(PN$; zJ1%bggo#t9O@DdD%vWa3U$Ah|;>6eASe~+C<*L(`*Y`uFI>EIwWRdtYh~Ae`L*hn@%Ej&rs|s7 z#s^InYjcau?hp{+?+e{Fp+C$A6Bl@RdI~*7bUp%)Rrr5lpr=>wA>JKFPZ7;c4(b!N z&L{Y}to=uee8Yym)X-_(vY-4q_Z?Q%uaQp4J){4#39bK+X7u}nexHx)SK==eV8eug zgdr}%I7kH1cqsk;{^#!{_}dEpc7(rU!QbKVZ$$VT4gW^NztQk-H2fP4|3SXGr#TyJ|)b+4>phcR;fG1(?{`_r$uNIMnZkrA!l;yWm1$^6!KmEv=U8PeO;t7v(-gDNFnUmY+dCZxn&{i=^_nr zX)ba(nlM#YbPX>sjwtPV))w}ii`>a3FSzyDMDeC7!@;9Iw|H&AM zKL@kbm%gKSexJUNTOZ(kYA~oG7dh~xEgWARWpt4f(PR%>6pG&rF*QGF>!)rNRM6px zZOeCa9bJUqdZ2PQ?^Ca{FO~+#ZDAQ)M^0^zQmvm^?;;&X;euBTp6Z6XE@JCf@9Y{^ z6v=gzy9n+O%2aN{6eitDb`gJBLmYm3Mg^9`m#zA-qG6KW5yh@&Y+*Y0Y$7n6XE5l< z35Cwh-}%t>XdAU4k{hYzeN&jb7yt0~YK=(C1>*gcSk%ZO|5Yxsxl;?By@$-Ude#l`-pz;p zh{1k~b?Rf2U|>&Smb2nL-@}{p@#pLn%+W4|E|S~a$wkaA5;T$QVk@_@4U@3v&x~mp zC296(o7F_7ax2p?De7%zo_Jk_tq*-CEo-x<8mHyG97`qqGV{7o9Z zi2g$EEOJEGFji&jx0t=2RQXD*`ucDf;xV%{2YVJY*ZH(Ok27phpssRCu3D`I6NTaRvY3XC5L5gpI{?AcfnBF*+e$m+IUWPyZ?)H{$pgez8{)fz25O~kuz)KdHJs= z_-TSDjLKhE`TiXCyr=tORoPF{@LYwh?gMXVKJ3i1#Hzi1(D3Js*}3N zz?a;i2BumR##9%vi(v}k)P9yo#kh&q))&_Hk(W*2A{*}ShhI!2*l*7#F`BV0&ULYb zts0ew{VRZ;B$4db(WDExGlS?T;+T`EO<(8&x8FhZbixTUl8UF-~ryhm@mp^pA{ zV4lZN4CE;cWSrGS-u1GPn2d~X1e|pu*^2wLV=J>NEU#4%rXjnO`SgoKk1$*wiOb`f zo$GiyZr1s9JUfwW)K$JKX_$Z+J`>m=!f5Ko*x5JIr5*CQ4wre~etPb;xWY&-T)Widdp_zlT!ZsTZ;AI9s6kh^|TfcnVdLWT>s z`m;4~oQQ zZ6Eexi^4^+>tiY-tE!x1m`%}Nk{PV6kA&;Eir*SnIk=^#L|1G?^hsd!v&dnDuji9& zeQhr zC+-LEgSWVCAScvIOs_So7 z&U_T85M1It2ja7t`0VAC&UbmQ^crV6tn2dRV*(8BJ$b{#`xQq_g;%0g_Yf8MSt~R? zAMrjX@EvWj0xFIm+8WqVVl`EOHTSb%2I(PJ6dY~D2 zVd2l{oXoA)r3i9oKSVsQuq=?n1scZw*Y8r)A(i|;pw2d3w%+ysg{^GE zU9GL3-q|(0NX!LRxS=&H$rdK(I^L7mqvY#DV0|5*ss|1WnW`VzhDq3nXI^yU?JCMY z&XMQY%5A!aNrt!Cc}f2Tx#8T%Q@k(2<+wI*c3-UVQE`Df-uImVrfM_qgUN1bb(4n* z+j5rc*wRJ^d|^X?)xdl%@GS4E5OW{K6%BwzZw7Wz5EkefOp!M5kv2jQ=w=jH1J7kx z+1KW)uIE;Mz}^$J!R-dDbPuL-4`W%#xH-=|OiQ>Fd+_hk8-bV`S;qS!pp2W|Aj5C1 zqGUtJhf?PR92|J6jq}ijLL>;F4mg+nX%`23F6zDQ}meRVMHY{GiV8)mWTI{#Qqy66S=b=d~B_vua_zcb3Vq>8akRX1d= z9(DG}ge3`DheQzWo5$rP!se-b zd%KJ5Jjq{VS`t|6hp|HqB1b~JXYF7nn+znuf<6H*vKyDgRC`P$5gyND3;L7yk?3ZR z^Jb#SEb`$v(Fu(x-t*G&o+j>=vPaoEY0$cLTS)3*S$-C3hV5V3+lmq)JerdkP=s_H zY!%O*Q4ahhp(2AVE^!gV!Ojd1~Y!-*!H!o`fl3Ec&|_Lo52)Lvlzfj73H|AL;M3s z$hZ7WR$Wbp)w!ZvYp+}9FnF4ml&F%LRE>Cfc}bm}Q~l10rj#TY07$v)H2X*;`)j zU>k=C+Ra{JEayy|Vy8ejyEO${_5gD{e2u@!sB4)i(oVm%jZt-B3;Cj%uP~LVs}nsw zFRJ6&JuPNwr-YuTS+(|o2(Y3R=iB+XiUKlib!sEOrmhqym)C$5n(q`FrJZ^XI?bwX zG5RXJj7)04Ua{&gaczMP#*(3Rk=gW{bOVfZ1Nxs%q?69o&}9Uj?ZRBOEF3nzLyb!U{lH9oJropvf-=yTy58C{Yt zZNKnB3x$~WaeUkRx4i{Nra*A$56`WPmE@DqhIBY8BNAk+^_o7=E(>L@56U4KlVaRSD<5`UV zix}m=J}DO*;zqa29NTPD8(6iAOeeF)xAHo8*t79o$5gqJ3@c;eB0O%5EkU%9GJ1=q zUDmleK22}ucM6jG)bMO?o;^tBj8D_)d&n%of|VoEbTW2w#Z-(Y>uepbD3HZubk(%m zEXub#QY0!xsUW!*9E?f$?mB$?pf2BDr{+)K>erL%cv+2I=rDL4qb?ZM#Ar0_o?KE_ z!NHb>NISn=o{NptKZ`$Vq(NV5^QYGEBe9~<U%LuXLj8lmYcU;c_ycCY#!rPQ#MRi>IpV$I z=({mk-fPT8xJ`^sU#9)mN8^{|UI!)v>oA!vT3MdysBxJ4HI~gqrdTz8GB~PfKmV@s z$z)bjwsT@)xG0ACl6k3=Bfod1>G}^SfN<=55-9ZT|+cJ zK1Jt9KjOJyp4nd;M|BpNj8ZF z%4Lbz%UHu4i=ZFCuzvtw0C=g9iZx!s@L<7+kPwYf>j69?e&p@0BjAXI=Sa-BHstF! zwot#^5%2j~R9eO?vd6#D&+Y7<7mnYy4iiL2F1NAU$V|5%gY8q7n*81kAmzd?Cpe}U z8+8eu3xE9$&}Xbo^tc*6*QRcAi1`zmcH`B%vDA!n?mfYhpxn^ro@$eYmv+u#VofDA z{2E@`B@8|}+6=&~p|5MK_hQx9=fiNjlgT!ADxX%6=W#n3Fu`o+b^K?fAT*((k~yy& zRE(j>0hTqEP=vqKM_wxJav(idQpJbYt}ecct3;C-{io~;ex#s>E{_M57T-fE|K_9;RW8OjLb8p_nUs{&1cQ>FQ4Z>tpAQ7P#;doH*^`o%Vn@sDTgb5wzN@&+ z%i$!uzG-f*aWpeml;N{wN&E@!ZIFaLv(_%Jhn0FFmybBs%q8>Q%ANybbT2V`;IP{r z;u0=`wDz`0a&7U#7jyG#WelPiol#xjoA{orvR_YSAiyU5H|<@A($tdM7?V6le@rk7C$ zkiGl@bythv73yon9N<-(Y%_QU6cihI#)vi2_}! za@+75i+R8L*1qh`RLp9DO)r(yWJtY81a-YaxE@7U@J|B(Ra0*+p})S9IR3$lC#LJP zvV$a689rs5N^b`8UTh8)L?(EV$===(9t%Rc-e-4_7v9T}jRq-LF-M)$bdJoNezCb; z+PTwm3#AZqXE3ArWO&=!X5jAcUOKSP%KNEm8K2*zX_uJZ0RDon{1lz6p9}Dl-3D!K zx}V1A&75*joMdurdf5%E$W>)zoCMxhcAd@9X}qo*YwGOcM#l6T-tUrcZ+RFQ5;7y3 zaJdpOaHl{qA~m@@-(u-$(i){*j2Y!6`43#=);1!~6el&=Tx4kR9chzPZnaED|_l^CnKnJ!G9D%p3#(dUX8&fPhgWGqp-)FvO)w9Tfz6lkka*l!DjT`T1 z<>NRph?d_=aqtF9Gh@=$()Sy!J#&m4#nh6fdu_SLKe(NS6W4$?dc{q?SvT=}=DMTKx$9}2-#$kV;uO5TP!|}-0t?{0ouia91 zgdf2e^tKVb=2O3!?IJfJ+`w^$NG02*{b8dX?w1!)TxN?<0C=#Q{UwYymjOG^r{W$j z^mpfe&S+NMbWPb8P}+BNDUW?<*7!yUq!$5!K*YX&Bu5$Szc1d?g1nK>22{eo;yo*0 zo2TqIy5fPGtx^!g6_qJM>Yb2TXJ{m__5uAZLax=|wJ||SwWDM2sWmVa{v`Q|dSVIJ zigXL4P1eL?m1aL*X9p6-dwoASLo(XQ>XECR&uF}#Cd#$*AA(L6m#8#WkXqo-PsQ*X zhchF;37~jD#W~iB*(NLCPH~;jF_k*leI#)#^)zev5hNnQ=OVzhbcYbQyAeaCBng{o zj=c$E`e_TC%gJuPs~k4Z?ON)yIT6Bf5itcLF;Z1{L$KgLCy-Q7JY8%lUgyKN7`fRN z@4fZq-zro_n}t(+3}5_)g2HWQjE|2zNC(w@eO(T{p&sVIp%Y%D+^mR{`MspxLqQ9DNz_ZJ1MESk&EUfQ>9(6BE94q z`L&CGQw}}oMy%T_O~2xGdU=_;$+nCM#5FVv)K?V`6J!tQSz&UpVdu!=3F3TY2v*5b z^)9mbGMHwwCAOkU+VugY^#wlnnTtgKKJyl0OmcM^dqo;?QDV0?Q;t>*muXeG$c&@S zz;utTSyp3hOiZyI;bh+?wr6o^Dyuf{C3!Wa##%;e2ag{dD1egca7%!Jfn&4pYs@<3PN;?Fu9}E5{9p@WND8I}=9?O^tNF0LKIHOK0Z=%Uq z3W*ol!EcL-B=Ct}EBNZjhkWw&$MebAe0#*~ou~MVl9mMBLqTOO_A_Xm(hG`;Fek#J z5VWz)gOI{_?))RI^o@UQF_rRrJwmkc>AE}8j_yP;^$~v@JQOC~pBzaS#^@ht+W9>E z`>Xd_v*-q2922Hz7>g`S$mduYF-^5C8 z!&U3R6DO;4Ptax90{>uDTAR2DTgD}~FuZndJ*V5_y0x>~4g z7vUR&_Oa@uTGn9^90-mX0hs#jw_M%QV}gUhu@#>(vYJwZ_s)0(=B9E@k3`|*i0EYC zRAl4rG%xb{If_UwQp=@{*R&t8xDEK7F1Q;J1Ydl1b1az-H;H2)GN}O+QL__HgY=4<%GG0}U3VZ+qZ~!etyB)} zmv5#ZX;s8-FnBLGvclNNv&KTl7V^Uf@O*x4O4vcN2!2qbE^({~7JM`y1^^Yy|CW)j z*a^RRmHy=-2HYV}7(KH9QDi?%p%<`8r`H~Bu`svE;){}G#1rZydONU;Ia>m_;g1Q% zJ#TijLjPE!@mreF$j`@^a!LUD9JBJ7i^TAxcL#qTCvaOlcI-)UJ=xsBsTb zCr^+$%Hj6DFWneZ%?h#q(S&L!GoDR`XY}ss8SjZu^p`k=aQg!1NNR$60aU30%jvdX zQ})x4NFjtgBy1A-1MoJtF!|v)*%7m} zb1)S}+WAGLZ6vRZy{Mmy0JF1)zKTbHoCs*4ZZf_=bc@xx$Smc+kKr7E5}95H06++u zGq$-h1>n&%Ot5kocFRq>7!b8_*(2~LRYGEq3HFDw85W6=mmTr4eT;WW{p_)Cvcs^6Uo@ z0?Xs@{1IyW!)HT`GkRd%5o7NvBVJrmXLhFyvy@Sbs0YNXWpj)LWZ{dDC|IXlwSSmk z*RUQiZg8Rb_Y#GJ5|P`hn^ZrnHF(c4SdB1MRa5OqjsL~D^(q8WD;o(vnbZZT3dd(a zK}r-p18*n>@nELdM@oz2PK&rc5dm?puy%$}4t~OJGA?LYM^T7u_EwF`h_bT;xr*Rik^D#e52*eoPjV zWE)<=zx3adn2pF+3iV%-SbQgY9LV!AVhJ_T`~|`)a<$#Dnp$?Ln-(XUY8(h*#8A&axr;uQ(j_|k|$reJsOSq{I zr<@|1oaok4d_+h^;EYMXDpJq)L}KMvo{>-CK&c}eQT`78xE()(hL%F z06}O~EJE4#_91x9N?-*~D2G+OhnilA*$kb2*sb?+?M9AK-;s998oLj>SPV<}Vleb~ zFqx*>)tdH+ui={)8SPsEiNb{LihZf9Rj0pWmUe5HZ82J?dZhEWl5UOCV2?ONV@lnR zksklF!2h}d%|igYS*RS`H=x3VUmkQ!kQIaE0<^NCvG^rH*3-I#7#13$smZGG->gAK zeo>P9PG+L;i9{sz>{r6%rW|d_`k%A&4I^(U2Y?I(OnD!SnudK?yT*$q?;grf@A1Kc7y`zV z3!0y5@O-3{3!?nRT6?e{D&Y58R7zJyhNyqWe_u1T@?P~dC5Zd+t1u&)bx&c3B4u!q zjb!%NYKEZ+8N{1kBNbr|Vn z$rJxG$@xdhL;vdielO!XJ*W(G*`QpYPb$mAo+1eC8!S-wQN-pLOW^-udx<`aar|baK@3@TAJ&@Zu@jYYnw0sy6uH!xtD_t6 z;v+f}mvG<#uXZA&_K)W0Ywhj?>Hvr0v6cZ9)DV`0i-8P5aDzO??Hi+sjRB{tC<9 zlD^M@prG+hBpToNw<)y-Z4+xm5f_66Pm__}vJ%j4-#k=MWtAWq6WXezyF~0{wFw0o z-)Rfh(flZt9HBDQAA&an#c5%j6hf1>*GiBHh)bg!DY!jsYt~rf4HybAaL(A8YDR4b zD=3q8nJ@pr+AJ~IZz%_zFJO8_cvvPl6uH=liNvs((I2X_vk2%1I^r%PV|Al>Aob%4X*XlbwatIMd#a5GIT`6R?kx2Yy1Yf0g6@16%oT z6h;u5mC?ptxb-Az&_G9{9@q^JcQ|gxd-rWXvfIk44Gn^A&r*KQ81RWI1QuR}Xzr9> z{)Q}gu?y_mmYNC)X~(dH-*mjLk#kmq*f@3K8fRRMwCl25xry7v$I;d7dNo(xlx{|u zUS}6++2;Qy&yrC6^xk870ck>A4Gt*$j8vD7zpd1nv20}7-uT^ z>`_|jH7;TNJ*v!i+Oxu2`PASGVLFs%f)T^x5Uky7TjLY*T9!R6!XvzgGnFpcRb?Nl ztDwtT;whHE_&(Ro++s~pJA1WUxUm85~Mug)hVAvx1 zT2C+NM$*XS14ImIRXq9w$8uU--wUx-DT3+xZclEbP>AIZ>3;a=9Tr-Zy3|%7ohx$J zJ{SI8cX?fezJe{}+xHABd$9TfGJAAIgT!P39Nv4=kh%;`?zZw686?nW4PMnHxwla~ zL4IW0ky~S>RaJ!Yc}Q$gb2&&Y{#kZ2R={C^kt3!*tEv{+DG5&-VR5pDoFXt3!?_Zb z3`X@mgt_*c`qUJ|vS({=GYHy0bg*!Yqr#bVMfuE^RW-#nxQp&W?TcjT?4pv`3KQ38 z3y?k&wzXG{JN`P~F?b&PSJwQmKl6NPTxg0L3i$6LggtKs97jUQm{f%gf{bJY>0OoI)=+Hfa3!={h}h}Qvk8UVC%Ip zYb2PiGcy7GsG*TRj z+J@d{z{?E_0;L^5D%vM!VMFQ7BzKcgSNM0RO8Gxg@|`1Yfu1bedZgLJp&s&do6)ZY z(hCwj3XNOvQI_4{Sqk-LC?d;wWxpvO^t=IQIIny{(~dy$gw3O9UWM!9+aCnvL$EsOWA!?8}7E>%XD;854f>sNDxnXU* z_xFKr-kp;@;-aSg9$K2$_sst8m>@q%JUJ#tr?)j4x{;gTrsuksGd5S*{`fo}K`}nD zb4T6Pm48wt|Fs?eUJ$_d1fD;MJdKdlu&l3W{3q>+2Bm1?lWRwkGsiQuJ-?%$tgaqQ z=E=I?{ngewi^l);TW)$1liHXr4QYy_acy4;MAjX{(pU+vyPXPFevu}BFfXK0izcee z9^7Zdcy&o#W$T&Iz-X^3hki0ym&IpLDcQG+E?0z`00qa5HQQAUD4Rz@Te6!d2Vadw z5y}QT%~@r|)*{yDT`on1m0IWL{_C-WsHN>$kTw$4vZ&a7F0zeC&w^hlkxzQ1qP`u{ z>bBd>#a-zNR!IZnJqHYy-Hj0BLj5bCA`0v%53*zg>S*)pv8;)LV+0wexanyZNng+2 z8RR10=$r<*bCE1PSYRswQ~7T=2o2_5G1ncn)F;qt@N!}UUd^}FtI>n0_{}<3z9`sZDKPhM?!kZ4(iJX$*bE^Q`L7MWwmP@ z#BS$v5sbYzOmZ~Drqcq7n{_-(MHHd5+jcO0{hjN}kkPyW`{Z@@+kAF}a8?Mol-A}) zuCI^X2bNhqr2ZUPGTKc(6g@-*WJ&qC60Qjw=&%I~PAvh!mf?oswWWfBq|V-xsaC9Y zw1kiok6X7tTI2t0w^NV57Z%3A9)5PN4OPB&<7}C#gkvr^z9e(!j4f*$1agzj&r=y&r+jWDC$aW&xjQ8?HCy-@}`l(BY5Kq>O!L&4ajC_7eqqN zO@$7*%c*V_T6t7FO+zYlz3+9E%prtHXCgvsja?!9lDvMVU<9xhqKojQ;2K_$n_CHl zyS6Tx-N!mIk`i_bj(P%$?1i{skq@jjiO*L|(6m3b`Xo*88meQeg{i*|LOz31>p_xK zKBh!P$zs#J2w^<&rj>wy^5=igE`!MikHJvm?)E&b$e>%cTpH442#gApP5mGyQRsb( zDiRG`wB!x)eGb;J9P&W<_6T9O)owS=0tI>&6?&NVwNa_iJ3icjQcO?vI_Nut7MhE7 zHWjS!{apFwhL{Lp^mG`RQw;lsKG#=XlFoyhZg{V(9Cex}yJ&SXnD$}ilNUxg-UcOu z$`ZOPZa%HmO-(McO0FuO8sWxw^h32(T4*kJfuV4>kw}e7e8 zg;YjKVGdRUDx3WSe64620o+RqYoCm zjxIh(Z2_^LDhGZ1AVy^8-*MymA-7K#gw!L@>ALah5;Se42=;e`BIeHOW|5N3Y-BZa zB|<<+C<^X z-zceyiHcF;o2`k|He)MFep3#g_u^+Uh!B(he0+o%d%pDPomkyf<>15f0Mk@=k-tF- zkH1HWr(}+Lew{RAMj-Xi+dO(o=FM^Ach1{jcIUH!{_3W5NMBup!sSi2lzXYb@)s_b zHF0tBCTf4$JCM1~0n&9aH*-l$9yqsf%k5y#UF zj~9-=5C+Hj84Oc6XQ2XNX&8z3T3(E4i|ilK!XS$X_p6bw4o8G5N+sOl$4NHA=J|Yk z#Oa-;_DZutP9g3|% z2p3;GMO89aM@Wz6mwx{D=4LJ3FnMG9%}Huc{*(bwm?-0f$s)2MP7|!RQKke zQn)M3Zo6@vv`70dUL8Sy+J*}I;}+|m6)iBO|LM)4_mS#QPN)9fAc|Rz?8c_hO@5KQ z)@E+9VklUnHaQx3R{XtUnqYG@LM0>rG;Wwc6}^IE9sIsPWS0wGC}17VI9ujU!LBHt z=J)Fm;iIPGzIo_n)A-lS(CWgV*@7qbP590TtF|`br9?}AI%lU~;^<<03CsOartCPj zZbEU-O84KNXO6}X(oFa3t;5Uqk}ptr7R=e&5se`JK~P~s=YDtEy`jC64ZNfZRI^W% z4@594>TQs-M$>N9uC!_$r=x}N4(LjnLA5^iG-BsncO4=LNe}uvE+w#Us#-N_#}BMm zwXiV>O*1DtRPw1w~l6H)%fKC-5xO`cxeQ+1Kj3`&Gfvn{* zEp#z<9&$%V!TX?KGHFo68I=NE1JWRrC;Z5f>#Eh19o_Z*@LQfqBkSx=J zGe(T)=_0okXa*LAU8ic`uK_UJl|%FfDE;S^kW$3 z9cYt${kZ~$`QGA;5Wa*^s1RyRT(xkP7YYwnPO53YIw;p}=7n3xulbYJ+Uiur7)QMK zozp;QE%Srba*ia;b^}Yobtiy%|2L>cAT+&@CPi4hUiJo>FX)kme_Ew~T}=4jd?9n} zjoe=m3qMBcaJEeHQd)#C=LAR_U(n=$r?me*jn(He7p&GF$=oa1P=V~K%Uj4f8VPgM zw_swM%e3~IlEywDj0w8km8lB(6=l@j1fBX;G^ox;{jJTnldt2HRRgSX+|YaM7lgBGt*&Wci7l#UKU|U~XMdfznvVdds zr1Vl~TG>dP{R1c)P-AZAe~4ziv{@eg5s=BcXAT7^h3J&$5pK2yqX4$?_W<( zx)ASu^JEIVoIgx~_~y5hk-QY6FG%;MM27O1L$OF1J!&S{;sZ7Soj`g2Q%w8cSlDCj z^v9F1v4^m~53h|id>Y#uobbsq6+&SjSY!~rz}l2Hz zAd_8t-2RrFebEU_F#fgLxnKu zQ;9o)=DhJ-LCgpzgI3!&3JYQYw&4$g1xG!Qubk$U@!mh5v|x+NI4|gpv`7Zw-ue|R z&a7a{aG~K>G`<0pf3~SEDWgNWyg~W(jv{EKk9EU;$GrY%bG@=x4Z_}qsxK)=n)4j! zRYpP~umg6NWwVZo3=8)odF=-196BPsdz^uJVaOnUR|?W}xlA5KTx&DGPxS*-o6BV- z>M|}m-h0m3blTN`zM2TLO;XJsg77FVu;{G-(dR~&-B9T8+1TPSHq@ig3lQ6Y1p8ye zwQ6|UXE%mWY~4#fJDZ1ooiA=2a@>2iMOI>8j<5Vh)UGX+Xg$zK56Brc4s^LVtN7IA$QnE^wkUGp2T0|o zp+(U1a!W=Te!8=$uXrk$pV#)0!W*C|3u7BF;!>QVfm(nT$WZZe>Lu;+M&ca6H)PJ% zw`25-36*@yd}}WjHLb|=(dsj3GL#tNz4wjDEmdF61y|disUGdvXYfAOu7tB1QK9^S zzOcZKmdw`5^w>V7rhWOs8k$5{*8y5J-%QSiK~}TTq`Hn~9LaWxS=#-L!K4}G+W!a_ z|7bz~WqCM-g-r_CJpujeBRG_!1D4f9Q$wI(NPQxqfEJl%!kh;m?xKa}^nJYd0CO2< zvEr22{K=^CO=fnH1wTYP#nsE9WM}H)*;pM_0GT{g*hORDioT-i@i32FWXkrp(^L`@ zPQ87UsW?D`Q1CvyL-DcyMIfrW=|?ghe9Dh}5!ZJutox~WPtp1~sN1 z$vAg0XLL)Py+&=4b~fUC2*_jPxRE_6mzQ?=Sh7mRHXyZ%{62c^K3)zw_tT~nZUQf_ zl6HGLGyAv@Nm;ies#+wEZx(*1=8t%bkY_IPs)6N9Mwq{mpP*J-`Sr@-U+&Hw!?T5w zE6V8Z)7>Wltc9?w1IJMCv^pRO{I&Q8^YSl02F@kdfU)m8nE=~xkvZ-dwaZMK9>X4J z{JU?Yz$V9#16I&;9Fv)eNJ7(Cr*x~N6gBa)4hhPCQv(WYVGr=){Y>3D$z=}pkSS%? zO*BjxynN$+GgfeDwegDzkR3V<>Ei1tmpDOENrh84n;kOgA0 zJ8Nb6?ttmFvs!Tsa7Wl28H8YT8{_n>5fRFnj85x%8>~SWQd|km556bg1ejXI0L~99 zhke|mK#9e7P7~z%)L3b2MK|)ZG6lT?FOs*U(TY%>HZFd>G@8x1$qtov|Mqf;#Kdic zgnn|DtRy$L=?Ue?@?GW?{yIp1^+hgLrI~AJwwJW%Dh)vP_vzSJT zKs5p-INKI-Y0nBrI?ZJkO&qm0kdklVGgHc(H{4FPznA`&4;Ct$#P7&A0u;8Ur{7}_ zci$^N zb5L1Gr@)+}d_s1Tk>GSyO0`S}$p(U2qdS7locu{E%TOPgsXEby<;T=13M$}+H>hxI z6buYMaeMxKo-IQINVVPQ)S`{K#-L{1OVQrP-ZwQ1oO)@Ah9?yRRm6|jypQBQj?!#_!0HY^o|NXJ z{}25I8~H|#*{<<6v>~J?7`cBVSx&im{x z)SxoeGL+xSH0{kxD@@mv(e0)f1a*jOj#9x-zXqsHThn2WX(Qt46IA~3VANx(d5<-g zfAMD79gv!sM4`vM6~LGU>KbY29Rs3}ft?C7(z7W4h71>KOB_g&g&iv)aSccZrRten z1{r2M+I2t7klVVLuR>br!3rI>(Enb~w=`V@YZ}!$9P#QvWcTk5SbG_~x{AVY&`f)W zMKX)3V5@n_g?O)Vt+_Sa2|O#Hq!H(jpPEqK2pAL6OAb332{=~gHstc@eh5S zpja;ma>p|WSv_-WA-MJ<&pQDxi9+s2rm|88NuVwn#5{;f0+j_sG1TywB@ncN?t42} z2we-N|$?;J=@?552}c*=GYH4zCmrKfS!~dA_Lo> zWIuer#BEnIC#zLR<`&X7v&k%Z6$HCqSKvQaQ-J6XV1&S!pCAR4*w-g|aPqS@{=;E{ z{axTUIN>lxbrv+S+Yu`#djP3^RGO&T7bSMkgBE%;B0s4#Z8cX2gLy50!GWSA{a;NLwn*Q~!wYwr~NPtjDv|Mga?sc>_!I+2?e@q*M6J0E zJdSV2h#{HwM|&O>GsU-2a%}qm&u~z?aV<*OI|(vp0;=SK?hlnKA@>6wAMvKbs6P|BEegM(#&4Q+5h%{Yf~Kkn4^;Us1He@#TY+ zd6quPfoDWV#_KRk_9$HTOxnT$j7v!NlC^&aSQMYec2x%D8Du4 zya)(rNEFT!I9MfcYUxl_(+&7{_iu0N#Lf?3GouZy>}ZHoSASi}nCe+;wJ-lAZIc{%sbO@GFeGp^tLNT~pW% zwi@~UaI54pwtMIk#xQ3s`Qam-0g2?5-8S^sNrM;G^YtiKccr@F1e<3nDA81fE(85p zQ%($snShYeBCF!gk(U*4MUa`_C8Wb{EBYbcbC@9EF}6|xiRdydoS^43vPD(JZ6wbq z!`yW0|CX`zg7UO@nqj|q`oik}aVZ(?1cS|{1nihwX!V}6G_>XZS_$P%9 z&;(0?h?_d7;yx{m%2l5^;be(pN*cg~hE?HNLjq0vnW+kq9l3lA8-#$qC;&p8MbrK= zFsQXua4M;+k^fxUqmy>5gB>I7(Jyzj759H8@o|*y@hSQL@s;OKRV#EzN`|la={w4f zMEFHeCKa;_StbP(#ngxsnRr3n#BqINDQekIpZFIP1IC zMNXkuHEwbR=HmBKN|Kg}iddRYmHl(vNHL8)$%^knQ3SW$uX#jF{s)tINP99LSqtI^ z2r)7($=$_&zF6|1ggr|S@cn`BK8h!gc<%F$m~cC^uRpYd&O!H8#rC}<8+n!i`4sda zevxt@a(yh%tjX|%V8OE3_o$k`66_gr*YB}|W6x6cdcRm!*cLkSId8P+GNr5>eTxlk zu(M|rkIsrZSgo_>^CC*>TS#>_Bys+C+-6kY?Swr}AU{8N?`6C_Y zhlo*Q6Putjvt9mwvI}T7ZFKgZ?83L0YRA$47$S~jgF&Gs_L0Htu(6fc(ub(>EudzY zU`4e0AW2Z!6l!#^oa2x{;3Uo|1#?X~>{d-Z9xUViNn3zO5SBD?WmMhi-XTR|vWQ#4NBufI)t0M$|b=2?#)Em49{&Kr@u{~WH z`g0lERPweaK=BAs+85ncU52<|j`t2l*`E(Ww_lDDB^N%@-hz;@@N!9o2;C|d z*YePihTh>L&(Z+GyjO#)`8}&-BKd^E1P)3%cu6U`qWDN#7X*`k1eI6Y_^7xIX{4zV zgcO|VYAtTypHqfC3^m=zX7@cH#XS6^yEO2ko9Ob3*gu~+yCZ);jaNdO%11MtJX&d8 z(5f2)9E1P&p>lB}m5ZSsi_vY8d((k_M>JADVyhbvIccFQ=ss=ENl*@qr1rGLEgS#Z zmIGaELzp%jX@>|cMuEnAL(F%%c6PI-eFVE7D#ho%CLBBUP(H1R8Ny%SkplgAqQ<6J z9R{Sid7@fYhV1F)x8bTLGw%Tg@^X#3Nsqpj>big-oU=iMvy!Jz=RtMyLcdCDm>I-u-khE~l}U+EI)8Gi$+@3X zg1V|0)q@b6V;pXwtYlF==m`oEi!X9=ISTpx+H44_+e7N=Y)_`Sb>O_4uvf@;x~VkJ z^Q$-D*#XE#Pd&mQT3nPPVHWLoNbW!Zb_>FI)WtYZJ=8H>|2zbJ@F=^P;${=R)q;yH-_ahoy{MYHGnrnsu~f#e2%?-n@u|s=SV#_#Wh2BE zx2$q0g_%XZ(xuQx!z_{Yf;N=saU-o5G#E99>wqBYTb8tfj~phH_H4GUmZSzmo0CT8 ze$3HMXo6==w0YWeo>;UUWlD~=1aY-kR1ZUvwjUFFot!0 zMydzSY~)j2q;(qd<>4~f1LP+uf%`N#P4Gud`IC@DzwW=isy$iWvZSnpgR_L*Ea}PW zX@6wLA6qki& zRWp4KpBV&ZWLIkvq?V4WT9V8l>A?$-2vG`yqdHuZv{T3f8H$|!hu@^n7I;~aj&`I^ z+O!yGEqHX@LyntPLj4>S1<@e~g!w?7J5SmI-ckUG%1Z0(!cr$hXDYO~b0YS`+&^7! ze<`gB%rp$~MIh~rmXDSU91%pY$#QFQ=nzIDT&oT?{wjIV&2_vs)W*?g%|N%SaYvN_ zZG?4UY&~)rG_L!G_y<(lrzKhnd` zQ0qE>&Z1s2~{o=HcTL^xr=0LLh3tHKYM>=mZtsZ%S%9qw5r>Q!ezglT!k}m6z-f~&+oxF z<@|osvB$h|z1ZH&OJQwSXMH;^Ca%hCH+d)r{ncS9`0z)gd1dDY8J2hZU_`c5^KYtB8sa22@(16Pt~8KXMMyiANt1idMzi68k<>(2KRDJpDHp zf4c|{_FPpLScEv*WAJ_l?@8Rnmxv2%dY)xW4>W#*RzsM}Gwry?I4pt}`Fbo09s{_b z4!QYaK;bs>GL>ThYs_ybHiLBd)t9D$3RR2TCpUd7gJ^Z#Q-(M3gg!y7;!|a})t-0+ zC#o%;?Pz3`l`xTgX@0=yV!Te8b%*G<(b$b(1m~Qg-c%FbVPOa>{m_+8WwudO?&kW`{_ zRd|!R7^53-OZiM)d2VGgyl)!__A^6D(2;@B37a$l>wiX84&=CofS0mTRYIHX=cv!3 znEF@SR@W{`W$wF6&`h#?x2(*emh(q}Z|W0oQOMJx5+}O@+-qOfIKl~U8xp=$cRRD< z1N4!X_bp*yP6VYVeR&H}OW50X-aVKEgMaY#J7)@FZGr>}xUEk>$J1Je8{k59+R^2PMrw^|?2O%O9lSaT4Br>)ibr zK)owBS^ek>81WPH%Nj7nq5YQP^qV~e*_#XxNJih{;tOjKTME#cVQB`Y<391*8}GkJ zrY^rM8O>!N6b*kEZl>$eRoZFh19}|m3)$2PoFc5oSt{w8zL@?xRHMMFt7GZu0BNfF zkj6XzCL;qF;n1K0Ee~U*K5d~1HBUTh`_C3V-C~Y3K;sL&$9;Sy&E4i^5LSB>-WH-- z{`~Je>A-riyID4UyEvZ~zr&~QlI(6v*cfMuVBwl67FfU6!DrJgoQk%h4D4;f4Sww@ zI_k!}>w0Di&%R*rx~{*8Mr_ntBF81G<|Dt~5GPrOBpKafzSWFapXF#oi$=aoL!XED za%T`Eu86~Br`wls#%Jksal1cLU($p|vX3DSRpc_eZK%->|MHU>J)Q_6fqpmo&2U*0 z0@4-HL6Y*aJ}a}rgvh0ODbeH3UnwpJ-f=7G0#frR=4i3Y(4}9 zp|$t2?Xf!rQ9WbdRSs}RCq$3Wl;LAa73f%u4y?yUV?GN5W*}dkH5Hw2kd6lKzpawf zqf*ZbYl`5G6UoVpJUl5B3QIK}0_<*I46M07q>Qr`o2A``44-^jRk{iwa4?9aTK(tk z@aW(`ijRri(UE-tI^R4|4Iig9(g&t?f4QDEnB~CBmzL{r^3Sjq<~+O(7Kk7ctNsuX z?b_shKwKc^H3*c#?c%(@u-&W!_Rx#Wzc~TVy`$8)NE5K~?&Q;$XOkI>s_-}hoO*u? zs>^fdV6OaXOzgc;AY5T(4JIMlt=Hgj?lpLJtni6NX1gL>3j+UAJ~F7$AoBSMr^Ti8 zSXuUy=6hHmi=G~oVl+KergUrxwv9h0b0 zg-8#Hp{=*$N-9vNmqH1FC(_-Ty}TIB6$1J4QU>f3^4RVNsQ9`)e3*6p=~stS~Aj9x_Tu0fB{*61rnB zPkDmec%X8Fh){sc8nq-%9Tm+qWbo4(taLOj6c3|e;UOIg5>k;-&;bEC%P_22{_ba? z)o%CgYwvIGe}32HKQ%69)>`lTKIg;z0H**U?_61~Y4=Pb`e_g<*YFk$afegV#Y=_1@B=*u=~U{+_mB-eiD{@doI} zIQdWzG6Hxjyjqo}B(&Q%OA@`TsLw#5+V|Xfj_fh_*h)11%>do0BH?+Wv@v6JVIv>n zPNrETH3P^F!hN){#>je9{4W6!a<)|su!Kub;>G+^WjTl>3)Z|)2_b=k*00>9xVad+;lx_ZZV&5%fF`fZQtdG zdOg;tgHPgk8?>1jn05mRvGqiK5QwnT3Jrj5;g!iu{x15v_D(W#u~&*4d8G$xKQ7K| zM6~@Ltg_hq`DB%8A|@n~gHO367^{X|DDx=Lrow zBmR5p2%8mO0QoTU>O4q=*&RgI>*n1v8R7QMNm9zE3xz6MG@0Da_s8LOKi9J=;oDnMHbGq6{(?H2h)0(1%uEa6QWaIm-J1)o9f zq8A*O?~O|C=cEOigJik|81|wiWqDZyGW%}(z?_OIfc54o!VJZziBFJEqwdE(Q2}!C z&Ru`ZQO3y0jz`he+u2dIQ+Azz;i#ro21mDXH> z>M+!AOA!Rq7XwCW$t@H=HZ)foAq+oigq6qMZnmxt8gT6=ig*~&<1y$VoP=u;Bm|pm z0o|BoBQA7O_x`Umr`SiSVUv|kh4d3ReKx}G)Kr32lO_}5erw~XV4GDQ@CLR7K3c2^ z*hi-~%k)*YzzjGAO%RDS?D-AM1(5({${*0Ue5JV9nrVO<_F5cUtT~%tL(Z|^Pv3AZ z*p|KS39Tq=hmx5bTx5lw>d)*qXYnXiattd~>Ve?z2=_A!IV}VgXZyzL09~jV`Vh6F zqg;x#Xb=VN8Um4aD?(clTMD;-J}F-Zs&!=6U+qJEhQkrrcprp{k5m{Cq3*s}f>tLxbXX*VJPN zrRxx}W2rVS=9Z{ko0==AI|`-MmWHc=Y1d%{eo8(mk)shca_vbg7-%c8b9w%MC5&db z=lpSdE)A#WPF}-eBn0Vc<@pCtJGnj?^cd#Dr=3Rdo^-RII<*@u%VCDgynupOr=&7H zdH2Hu+4rX^%O~VH4Ave2ZgnYuI7EgmFi(aJ|DDfOtb|eRF_11#n?E(ZS+x<1S=%jmuFIjnSWPF8~6eD;~p^%@7lH+4f%Rtm27MS{>Vj$47aq5WDNm$&Shi+ z3s6)ZzI;L!vQw2w`FfCJv|WNPKuUtI20)ztMQ5*ovFx(h7yZvD>b$=~f|x8N860*5 z$iey7zub|<9Tx@OFw=w{#z9!nP=5KA9yTZHhRZ4E;=-qKN zncF+0C))Npm+^8j9!8zbAkh%;IC@@&M?$BgbF!)qO)>@mheT2Q>g`|;!V~e=-2F-Y zk||wBCyrX3ZXY}g8xeUej}7Ru-$}}d74|`sHvyyxXz1Awh6D5=CPRys93D}LqFGL3 zhD(b6QP=!Cg!|IR!%>rYa#wC6=MTHMayWn;Voniz@XfB95O$eLL+;pQb9ro~C=2LgoQh>(=ZkL4KI6#=v@$jG<9w;fYG1B)ULX9({ zwkcx)S`ck_)J=y?tmZ(Y`CwYS;sPcp^;JObp_AstiylB(6?HoL?MqDkAt#5#UnN%n z$Rk9sQ>&mx;)bYNCrgW zvh6yk*KV<|6j(V0kd+vAx|f9SVMx#rcnQN-yjTS(i8kkvD*$vZf>8dL>jvyCz)eP{ zB$L)Qf7+qt<+vxBLO`ULp;b-A>^F3KMg4Tzg)>&Iz$${YeL)T*%toa6{ zUchkals;e#%n1oW2kMrKkg(M@xRw12E|RL-hGTvEoF|4x<%6tix1!=>DrLxAT;6TZV8yAs^_Gi?IXMU!Bap_L@K)m15&t#}>_dlHk$3lU$$2ShZ=p$=1 z6h=?F_nst(Ktq9QyJV*qM6>~rLZtB{tpxbw2>=7H#T;M~Nc{)SLfA`8%2Osb=FD1b zbtalAHr>ETjTRVO+cy=7a4=}4@U0b_lHj{c>mcQ1COcnx6RID-!HATroiH|wu({_L zCs^Ra^t#y$cQweo5w`vmG6QhC{)h{0i?;I+WiB9i(P-h};SFP;lNt@I{6%67G z3JdjSfU3G2MhyGI4Z*py2on!8sC5Dj-g63DaL7QD*Hu&~!##RpU8AOEuBL~7PMgGm% z8PV$mA4mufG8+y%zc7h;efk=C6y|fxnZC9rxxit6!0BY1B1(@2m)}G{4IYw6)83L5 zWBGi-+(1GIa#w+@$-WrvRwCEa1DYS&LUP*RiT4H1>mLLFgAY|nf8_wye1sxB0GP}e zvr>pe<+!RD(0hA)A+xG&6RN8rg%4jY)OLXHMHB&KvecJ^tl_*Hz*D>A#>0!}KJZ8X zq6^i%U{-MOb%3X8bu2Mz3k;NTgS0;O(0fLZSeCm@LGnW|F)Awd;eb^}Q@mTRgLq?O|fI(aw2S^#BYP$og{-4o4)7GY=u!j$l~ zBC+J}R9MXpkg~Ya(5k9hSO=lS$T#J+0Um3Sz78gFv9H*Kadijobt{i*DZ%i5A=PzO zl${`Uv?#`~g?4zKyDAuBW5j?a_A=i9cPge-xe$1_l+Dw`3$HRW<8Kt|@zOZoF9vEC z0(}SK_An}&Mx|#UZhrCNF!i9QbkMKN*9Q$}^G#93K!TdlVbjJef04$=ur{%zGMa(k%9k&Fm16=X7wXzd#IU&Ji?Q;B?j`kLW(Z(%IZ6Z?P}NWHNB z1$G@?m2>b~0FBdEb~sNCfRvk}vscYP{4>ls2&1$zG;wJB2)?o;26rwd zbz=i0k+!MUvXVK~*?q|WEebF(s2|E|Q#QttG_JKIFyCjE`--w&Ff0t}d-MwYty*~a zkjD2uA(~+$%H}c`G9ymWvkMDQ>F+hQcq5wDbG~;*IG1#QdRmz~r-mg+>dm-Cy`3ect zr-Mx9Ek>zEf)s7hk`AdGj{H!9FGJ>eat0FpXg3%m((bU}8^t2+0vgRH5X%d5?(8jj zW8fPbn8P}Ix3Ztq&wcSmy8`F|U!}?14Csn;PkaFD3llvy6<}Hf$n5fhxNrpfGU)})-RdxTF(OR{govmwrN1f9RT|FBY;;>drLlq@+p^Q*u7ll zneP#GI4*vRt>_OBKlIDuaXM47I(k&6ew4t6EoTSY?qB_1{~vlTLJ>nNJTllU9FURR zQZ|beDuhDfnjvvvVFd(Sf#E;~t_4H#;O}49En3P=1*&0abK0p7gbM|0_wq*~bw}#6 z9+NS*j@3bzB4PB^#bV5ugb_i|1uOM_fRGB(67Z%Jf2v zHY}vhf|?#cD~=eSSmTFb%bjtiIznestP4t z&O)j~8pA*T52f+9qUrkqUjJFdS)WiabJxcmo?|EUeWP<*WgQkua2Vkn{{UYm~@t0KlL#8O+&sKaItBS0miHttSEQ zMaYt+22Xh87|yFHJB|pfd(1DbGSC!q0OO#Akr5=!`^qw%9${LQub(PY0Co^4Sfw>_ zuq!_oC371uH|W|fblUzJC=xMP#J;ACNCv6q6(w3*n8FRQTrt$OJ8WpNgbb4;5T)>f zL5$@X_uj*hjmPw>IW&oRdqNzAGWe$2t>57v@r9XXmno#SgLyN5q~SF$2*)NnWI+BM ziXOaeX4rd6>2Vd^m?g^i;>V76uy ziZ%y=0p1uxaEp8fG!b|`D_Yb6GEN`l^vhz=5OF~cc-dD8xVO3$V!?;G`cc>^!mN)Z zhb(+sm_eU&7zK=MWF%UzHfqGsoB}AHh?6aAPlvcjW6 z%Y0tDIR&}2aEIAG2$5md%vIQ)k+x(+C34KLm>;58wu6v=70(_eE6LwW$=nWfp_k1b zZdxODVJ@>6qMQDPj?(8=C@Y3bjxqWEQN{2PXCR;(lPo_^X7^^;&aMBs?d+)TIq;ci zJ0L4aE-eqKh$h*^mD^C2b%S3sugC>Cl8@ zf41B{+(Dh(9kT&*yCb|~_ifHZ)`$$ltjdrn%vYNLLe~{qj-0^K_RVMDapy9}H?_HC zmYEF(4DaiXynHc&Z5PUP{)re`^_a*%z%x*IYyomx;2B6y8{?VpafZuADWnM2{#pt! zHJh(#J(2DZ8ZbrC~$ma=Hpb1vIFy`HIx&d00My;!i{uhH9(mCIf zfSk8=?b>`edLW#gFB!=JM1JmPKv09W>9sV+vz!hb@&lRMxU|mzxAvwLpS1z0%EOpC zu*58yC2E3WxKbym&SdHgDEwdin9`^79iMHn@pV8AV~iguS8?f#it-_3u@N+A;9q zB`oY{yWYNmsPcLt!!Fv+k$HQd6uFOe>i&=a3UlQ33hjk(DH$eRV4YLy;=e-Xj-tT~ zU{&zYr4=v<;2$~z;+0yf-O^;$(DPG+45;r2KX{ zzY9bb+gqZ`$n9am4g#A10iH`^oyQ|{{ha$7Bez@PfcRxPOiI| zfITO7^lt;jtXa&ss@jeLrq8>#^7+sn!(e^ee65PeC=w_q2X+J~=;slel>kuK2LcI3 z)@>(mZP#EZYLJ8FF5MGX0YNIAI3gLPW(c3`fE_aq21|3`zP&tvTt)IP=QR-+bkNgw z6f*h_MvYBk@s+j*zU2T0m^NRO_n>&^Bs-M&9sk}}4AW>P4wp_DrRAE?c8PG+o8KkW z3EYK83==J#IDQKyEAW%Zg#hvXIadLUqXeM){PU8lZcAq(;@ehx4LCC^WJvRX0IO?g zPM@Abmc_Cfq`o3`4n=X9tedt6NoM@yE8`7f zs-ZAcj*=ms*XFz@TIx3k(H8DNv#SiF`hL0$gkqbr5hYlGp@^2)xFUQJrucIPbK%W) ztGqF2c&G;ecDU*I4FCf|g;XFonNg!RLZN4;1F{Orxo2rRtQoS8dRC~;*izF7fOy|= zUIrs*UyjPG%Rwy<%0my8oB# zRnQE5d|*GIdlf38A8Y|f#H^J$vGB~gA2|yV^au3-T~P(!b_~LV={TohKtt>ng+3<& z+0;TYR&k!$8Nq3rv&<5eIt|Re&APN*)$sNCqo~>D*a}#DO{)y9c?y z9(yn3Q%UJepTN>eyXDJ)^CaDhKEHYBiUn|J<%$J`cA^g+sN6!%i4ayr9 z4`@4_YDTxWh43 zMpKCu?g9MQ5>gpjTWk|*$eLGh7~O){DS|QswfYL8TS1@gP)Q6F_=usTnm3FnQWOS# zvA!7tFJo0@=KBHpSWk4wIM`6FZZ<5rU;~HVJ=JNy+TNQacpgSTrn9F!TR%kcjmI*MV3VBpqC6Cvy!ne_~6o*j8 zjy?0R6B#hmhdJr?()g=C;i$ojU0=!SJU0QH5fA9lgU=S9Ax`?DA4qBA&IL)>Ef#^z zevQORnSq94Al3D_*+!*n`I3g8ioWvI5>tX`ZXK%KESp|TF-lVujgOR$r52DzH=acCcjH~+AMIrTS%phqH>Es;nv(Q2fkG)`x&ErM z5F^qS!vW|z5HpQPHT|2ug^nN47>D#wqHUYfwo^;#p=OEjvASXjd49i|TaM5&NUk_! z$)I;0`xiOMDD4JYm53erq*vZ&rZ_uC+r6;@ebnxWY#QR~U1lCm)wEq*NeqcYko38I@3_h%5k>1g4T&Sn>cvPAO-V})q$&FY zxXpYM=cz4hQ_l)<56Ka|;@@#2H`ltBo_bT%QClAbWZN~r6DXAF?pnc93pRtN8ftCGK;-U>Ai0k6 zZlo8c>bXXi5EQO2fJU$ywD&^ZV!onpn2R-#)(N??LcSI85W8v1_khw^0Ob1rgi7>Ps8s%(Mq@Y zM9)SFC+Y|vd~zsf#fsPowJ;V&JWH}}t#~}swkf%K1t8gLp~%u3ZJ|`;a1CyIi#gL= zSi(V+kHmaQ@<&>XhaEyV<6$xgFwyPvx{`zkAQi<0yM1R;)p+Vc4BI@Jxt1Wg9j}%e zO{6D#?K*N1n|yMtZve7fOY%K-GwRI!7(lfRq2x}>vKyunGd)CQ z=?K?ma8!B?{2nlzHl_$2I#7p)tAe^^*+&7B9qJKN(*gH41%{&|LyXPsD&q$_#fvO< zP-EK?`*>PJF@gd;|0qFaHQ+~xjS&g9ZQO%Xpv;bB*tuWBreq{ax0~ACj={GfIp?#SMB`T2L=($~zK$q)RH-o6GdjlyhfSeA%o9f3R-=XL%s zY+7DKb@xN}_|hbMTWYl39h_&eqKMO00w`)lv%o<=YQ*qvh^O+dZGu2mktYV80W;i8 z1lw6LXC;0mau_LYG=)YSR+}IoUdV05ZS2QG)b8UVcokcOY|JxX7aJm#!Z#t9tn*TFM5^H`n+F2D zRZSd4{f@nMo6Ddgu!Jq>jehd3*?89wamdhRXl38$p(L>^d?Pll4$#?(tLhP8#3pn7 zeQuxxC52#6O`8x51{9SdfP6aGGtH8Y)gXfKYBAsNAVnUFZ|vWR9d(A(q_D&EZ4rjc zRsIFnd+4S$w+KPK z7PLE`HbPLlw=px9)cC!F;wMy}_S$n4*(G^S zs9EV)We(sEha}eGK2$tCF<&Z%*{UyQb>7oqv-b1pm(|&?F

@1iEtyLdt#3Qde|( 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 diff --git a/test/baseline/Windows/fbx/cube.jpg b/test/baseline/Windows/fbx/cube.jpg index 76ae334075e0052d28a7f0db3f91ae510ae21fe2..ae07415a1e0e8bb6cd4f32344f36019926765406 100644 GIT binary patch literal 48262 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 literal 58840 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 BLdpOD diff --git a/test/full_versions.json b/test/full_versions.json index fa8d7d88..6a75a786 100644 --- a/test/full_versions.json +++ b/test/full_versions.json @@ -5,11 +5,6 @@ {"os": "windows-2022", "usd_version": "2405"}, {"os": "windows-2022", "usd_version": "2408"}, {"os": "windows-2022", "usd_version": "2411"}, - {"os": "macOS-13", "usd_version": "2308"}, - {"os": "macOS-13", "usd_version": "2311"}, - {"os": "macOS-13", "usd_version": "2405"}, - {"os": "macOS-13", "usd_version": "2408"}, - {"os": "macOS-13", "usd_version": "2411"}, {"os": "macOS-14", "usd_version": "2405"}, {"os": "macOS-14", "usd_version": "2408"}, {"os": "macOS-14", "usd_version": "2411"}, diff --git a/test/pr_versions.json b/test/pr_versions.json index 3c390640..dded205f 100644 --- a/test/pr_versions.json +++ b/test/pr_versions.json @@ -1,12 +1,10 @@ { "include": [ {"os": "windows-2022", "usd_version": "2308"}, - {"os": "windows-2022", "usd_version": "2411"}, - {"os": "macOS-13", "usd_version": "2308"}, - {"os": "macOS-13", "usd_version": "2411"}, - {"os": "macOS-14", "usd_version": "2408"}, - {"os": "macOS-14", "usd_version": "2411"}, + {"os": "windows-2022", "usd_version": "2411"}, + {"os": "macOS-14", "usd_version": "2408"}, + {"os": "macOS-14", "usd_version": "2411"}, {"os": "ubuntu-22.04", "usd_version": "2308"}, - {"os": "ubuntu-22.04", "usd_version": "2411"} + {"os": "ubuntu-22.04", "usd_version": "2411"} ] } diff --git a/test/test.py b/test/test.py index d3ffde98..77dc2b73 100644 --- a/test/test.py +++ b/test/test.py @@ -80,7 +80,7 @@ def render(file, outputfile): def run_usdchecker(file, results_file): """ - run the usdchecdker on the file and save the results + run the usdchecker on the file and save the results Parameters: file (str): File path to the asset to be checked. results_file (str): File path where the results should be saved. diff --git a/utils/CMakeLists.txt b/utils/CMakeLists.txt index 9c209245..6d0572bd 100644 --- a/utils/CMakeLists.txt +++ b/utils/CMakeLists.txt @@ -13,18 +13,32 @@ endif() add_library(fileformatUtils SHARED) target_compile_definitions(fileformatUtils PRIVATE USDFFUTILS_EXPORTS) +if(DEFINED USD_FILEFORMATS_DEFAULT_WRITE_USDPREVIEWSURFACE) + target_compile_definitions(fileformatUtils PRIVATE + USD_FILEFORMATS_DEFAULT_WRITE_USDPREVIEWSURFACE=$) +endif() +if(DEFINED USD_FILEFORMATS_DEFAULT_WRITE_ASM) + target_compile_definitions(fileformatUtils PRIVATE + USD_FILEFORMATS_DEFAULT_WRITE_ASM=$) +endif() +if(DEFINED USD_FILEFORMATS_DEFAULT_WRITE_OPENPBR) + target_compile_definitions(fileformatUtils PRIVATE + USD_FILEFORMATS_DEFAULT_WRITE_OPENPBR=$) +endif() usd_plugin_compile_config(fileformatUtils) -set(HEADERS +set(_UTILS_HEADERS "assetresolver.h" "common.h" "debugCodes.h" + "featureFlags.h" "dictencoder.h" "geometry.h" "transforms.h" "images.h" "layerRead.h" "layerReadMaterial.h" + "layerReadMaterialUtils.h" "layerWriteShared.h" "layerWriteMaterial.h" "layerWriteOpenPBR.h" @@ -37,15 +51,17 @@ set(HEADERS "usdData.h" ) -set(SOURCES +set(_UTILS_SOURCES "assetresolver.cpp" "common.cpp" "dictencoder.cpp" + "featureFlags.cpp" "geometry.cpp" "transforms.cpp" "images.cpp" "layerRead.cpp" "layerReadMaterial.cpp" + "layerReadMaterialUtils.cpp" "layerWriteShared.cpp" "layerWriteMaterial.cpp" "layerWriteOpenPBR.cpp" @@ -59,24 +75,25 @@ set(SOURCES ) if (USD_FILEFORMATS_ENABLE_PLY OR USD_FILEFORMATS_ENABLE_SPZ) - list(APPEND HEADERS + list(APPEND _UTILS_HEADERS "gsplatHelper.h" ) - list(APPEND SOURCES + list(APPEND _UTILS_SOURCES "gsplatHelper.cpp" ) endif() # Prepend paths -list(TRANSFORM HEADERS PREPEND "include/fileformatutils/") -list(TRANSFORM SOURCES PREPEND "src/") +list(TRANSFORM _UTILS_HEADERS PREPEND "include/fileformatutils/") +list(TRANSFORM _UTILS_SOURCES PREPEND "src/") + # Add sources to target target_sources(fileformatUtils PRIVATE "README.md" - ${HEADERS} - ${SOURCES} + ${_UTILS_HEADERS} + ${_UTILS_SOURCES} ) target_include_directories(fileformatUtils diff --git a/utils/include/fileformatutils/api.h b/utils/include/fileformatutils/api.h index 61749dfd..2dfbcabb 100644 --- a/utils/include/fileformatutils/api.h +++ b/utils/include/fileformatutils/api.h @@ -14,19 +14,19 @@ governing permissions and limitations under the License. #include "pxr/base/arch/export.h" #if defined(PXR_STATIC) -# define USDFFUTILS_API -# define USDFFUTILS_API_TEMPLATE_CLASS(...) -# define USDFFUTILS_API_TEMPLATE_STRUCT(...) -# define USDFFUTILS_LOCAL +#define USDFFUTILS_API +#define USDFFUTILS_API_TEMPLATE_CLASS(...) +#define USDFFUTILS_API_TEMPLATE_STRUCT(...) +#define USDFFUTILS_LOCAL #else -# if defined(USDFFUTILS_EXPORTS) -# define USDFFUTILS_API ARCH_EXPORT -# define USDFFUTILS_API_TEMPLATE_CLASS(...) ARCH_EXPORT_TEMPLATE(class, __VA_ARGS__) -# define USDFFUTILS_API_TEMPLATE_STRUCT(...) ARCH_EXPORT_TEMPLATE(struct, __VA_ARGS__) -# else -# define USDFFUTILS_API ARCH_IMPORT -# define USDFFUTILS_API_TEMPLATE_CLASS(...) ARCH_IMPORT_TEMPLATE(class, __VA_ARGS__) -# define USDFFUTILS_API_TEMPLATE_STRUCT(...) ARCH_IMPORT_TEMPLATE(struct, __VA_ARGS__) -# endif -# define USDFFUTILS_LOCAL ARCH_HIDDEN +#if defined(USDFFUTILS_EXPORTS) +#define USDFFUTILS_API ARCH_EXPORT +#define USDFFUTILS_API_TEMPLATE_CLASS(...) ARCH_EXPORT_TEMPLATE(class, __VA_ARGS__) +#define USDFFUTILS_API_TEMPLATE_STRUCT(...) ARCH_EXPORT_TEMPLATE(struct, __VA_ARGS__) +#else +#define USDFFUTILS_API ARCH_IMPORT +#define USDFFUTILS_API_TEMPLATE_CLASS(...) ARCH_IMPORT_TEMPLATE(class, __VA_ARGS__) +#define USDFFUTILS_API_TEMPLATE_STRUCT(...) ARCH_IMPORT_TEMPLATE(struct, __VA_ARGS__) +#endif +#define USDFFUTILS_LOCAL ARCH_HIDDEN #endif diff --git a/utils/include/fileformatutils/assetresolver.h b/utils/include/fileformatutils/assetresolver.h index b20b0372..6cf66fcb 100644 --- a/utils/include/fileformatutils/assetresolver.h +++ b/utils/include/fileformatutils/assetresolver.h @@ -12,8 +12,8 @@ governing permissions and limitations under the License. #pragma once #include "pxr/usd/ar/packageResolver.h" #include "usdData.h" -#include #include +#include namespace adobe::usd { @@ -27,9 +27,11 @@ struct AssetMap }; // Singleton class for managing asset caching. -class AssetCacheSingleton { +class AssetCacheSingleton +{ public: - static AssetCacheSingleton& getInstance() { + static AssetCacheSingleton& getInstance() + { static AssetCacheSingleton instance; // Instantiated once, when first accessed. return instance; } @@ -45,10 +47,11 @@ class AssetCacheSingleton { void populateCache(const std::string& resolvedPackagePath, std::vector&& images); // acquire the asset map for a specific package - AssetMap* acquireAssetMap(const std::string& resolvedPackagePath, - const std::string& resolvedPackagedPath, - std::stringstream& ss, - std::function&)> readCache); + AssetMap* acquireAssetMap( + const std::string& resolvedPackagePath, + const std::string& resolvedPackagedPath, + std::stringstream& ss, + std::function&)> readCache); private: AssetCacheSingleton() = default; diff --git a/utils/include/fileformatutils/common.h b/utils/include/fileformatutils/common.h index b7cf04f9..7acd5568 100644 --- a/utils/include/fileformatutils/common.h +++ b/utils/include/fileformatutils/common.h @@ -21,6 +21,14 @@ governing permissions and limitations under the License. #include +#if PXR_VERSION >= 2508 +#include +#define FileFormatsUsdaFileFormatTokensId SdfUsdaFileFormatTokens->Id +#else +#include +#define FileFormatsUsdaFileFormatTokensId UsdUsdaFileFormatTokens->Id +#endif + /// We defined these tokens to skip linking to usd imaging, which is heavy. // XXX Split this list into categories for easier maintenance // clang-format off @@ -54,15 +62,31 @@ governing permissions and limitations under the License. (sRGB) \ (st) \ (in) \ + (in1) \ + (in2) \ + (bg) \ + (fg) \ + (mix) \ (file) \ (scale) \ (bias) \ (fallback) \ (rotation) \ (translation) \ + (index) \ + (rotate) \ + (offset) \ (normals) \ (tangents) \ (varname) \ + (texcoord) \ + (uaddressmode) \ + (vaddressmode) \ + ((defaultValue, "default")) \ + (outx) \ + (outy) \ + (outz) \ + (outw) \ (UsdUVTexture) \ (UsdPrimvarReader_float2) \ (UsdTransform2d) \ @@ -79,12 +103,15 @@ governing permissions and limitations under the License. (transmission) \ (min) \ (max) \ - (originalColorSpace) + (originalColorSpace) \ + (AmbientOcclusionAsColor) \ + (AmbientOcclusionBaseColor) // clang-format on /// Tokens for MaterialX nodes // clang-format off #define MATERIAL_X_TOKENS \ + (mtlx) \ (OpenPBR) \ (srgb_texture) \ (ND_image_vector4) \ @@ -97,14 +124,23 @@ governing permissions and limitations under the License. (ND_multiply_color3) \ (ND_multiply_vector2) \ (ND_multiply_float) \ + (ND_mix_color3) \ (ND_add_vector3) \ (ND_add_color3) \ (ND_add_vector2) \ (ND_add_float) \ + (ND_subtract_float) \ (ND_place2d_vector2) \ (ND_separate4_vector4) \ (ND_convert_float_color3) \ + (ND_convert_color3_vector3) \ (ND_normalmap) \ + (ND_UsdUVTexture_23) \ + (ND_displacement_float) \ + (ND_geompropvalue_vector2) \ + (geomprop) \ + (periodic) \ + (clamp) \ (ND_open_pbr_surface_surfaceshader) // clang-format on @@ -232,10 +268,17 @@ governing permissions and limitations under the License. (baseWeight) \ (coatDarkening) \ (coatRoughnessAnisotropy) \ + (coatNormal) \ (coatTangent) \ (emissionLuminance) \ (fuzzWeight) \ + (fuzzColor) \ + (fuzzRoughness) \ + (specularRoughness) \ (specularWeight) \ + (specularRoughnessAnisotropy) \ + (subsurfaceColor) \ + (subsurfaceRadius) \ (subsurfaceRadiusScale) \ (subsurfaceScatterAnisotropy) \ (subsurfaceWeight) \ @@ -244,6 +287,9 @@ governing permissions and limitations under the License. (thinFilmThickness) \ (thinFilmWeight) \ (thinWalled) \ + (transmissionWeight) \ + (transmissionColor) \ + (transmissionDepth) \ (transmissionDispersionAbbeNumber) \ (transmissionDispersionScale) \ (transmissionScatter) \ @@ -292,6 +338,7 @@ governing permissions and limitations under the License. // clang-format on PXR_NAMESPACE_OPEN_SCOPE + TF_DECLARE_PUBLIC_TOKENS(AdobeTokens, USDFFUTILS_API, ADOBE_TOKENS); TF_DECLARE_PUBLIC_TOKENS(MtlXTokens, USDFFUTILS_API, MATERIAL_X_TOKENS); TF_DECLARE_PUBLIC_TOKENS(UsdPreviewSurfaceTokens, USDFFUTILS_API, USD_PREVIEW_SURFACE_TOKENS); @@ -304,19 +351,19 @@ TF_DECLARE_PUBLIC_TOKENS(AdobeNgpTokens, USDFFUTILS_API, ADOBE_NGP_TOKENS); TF_DECLARE_PUBLIC_TOKENS(AdobeGsplatBaseTokens, USDFFUTILS_API, ADOBE_GSPLAT_BASE_TOKENS); PXR_NAMESPACE_CLOSE_SCOPE -#define VOID_GUARD(x, ...) \ - { \ - if ((x) == false) { \ - TF_RUNTIME_ERROR(__VA_ARGS__); \ - return; \ - } \ +#define VOID_GUARD(x, ...) \ + { \ + if ((x) == false) { \ + TF_RUNTIME_ERROR(__VA_ARGS__); \ + return; \ + } \ } -#define GUARD(x, ...) \ - { \ - if ((x) == false) { \ - TF_RUNTIME_ERROR(__VA_ARGS__); \ - return false; \ - } \ +#define GUARD(x, ...) \ + { \ + if ((x) == false) { \ + TF_RUNTIME_ERROR(__VA_ARGS__); \ + return false; \ + } \ } namespace adobe::usd { @@ -349,31 +396,31 @@ argComposeFloatArray(const PXR_NS::PcpDynamicFileFormatContext& context, const PXR_NS::TfToken& token, const std::string& debugTag); -void USDFFUTILS_API +bool USDFFUTILS_API argReadString(const PXR_NS::SdfFileFormat::FileFormatArguments& args, const std::string& arg, std::string& target, const std::string& debugTag); -void USDFFUTILS_API +bool USDFFUTILS_API argReadString(const PXR_NS::SdfFileFormat::FileFormatArguments& args, const std::string& arg, PXR_NS::TfToken& target, const std::string& debugTag); -void USDFFUTILS_API +bool USDFFUTILS_API argReadBool(const PXR_NS::SdfFileFormat::FileFormatArguments& args, const std::string& arg, bool& target, const std::string& debugTag); -void USDFFUTILS_API +bool USDFFUTILS_API argReadFloat(const PXR_NS::SdfFileFormat::FileFormatArguments& args, const std::string& arg, float& target, const std::string& debugTag); -void USDFFUTILS_API +bool USDFFUTILS_API argReadFloatArray(const PXR_NS::SdfFileFormat::FileFormatArguments& args, const std::string& arg, PXR_NS::VtFloatArray& target, @@ -419,7 +466,47 @@ split(const std::string& str, char delimiter); bool USDFFUTILS_API createDirectory(const std::filesystem::path& directoryPath); +/** + * Writes out a block of data at a given path + * + * @param assetsPath The filepath to write the data + * @param data The file data. This buffer must be at least size bytes + * @param size The size of the raw data buffer + * + * @return Whether the image was successfully written + */ +bool USDFFUTILS_API +writeDataToDisk(const std::filesystem::path& filepath, const void* data, size_t size); + std::string USDFFUTILS_API getLayerFilePath(const std::string& layerIdentifier); +std::filesystem::path USDFFUTILS_API +convertStringToPath(const std::string& str); + +#if __cplusplus >= 202002L +std::filesystem::path USDFFUTILS_API +convertStringToPath(const std::u8string& str); +#endif + +std::string USDFFUTILS_API +convertPathToString(const std::filesystem::path& path); + +/// converts u8 literal to a std::string +#if __cplusplus >= 202002L +// C++20: u8"..." → const char8_t*, need reinterpret_cast +inline std::string USDFFUTILS_API +u8_literal(const char8_t* s) +{ + return std::string(reinterpret_cast(s)); +} +#else +// C++17: u8"..." → const char*, no cast needed +inline std::string USDFFUTILS_API +u8_literal(const char* s) +{ + return std::string(s); +} +#endif + } diff --git a/utils/include/fileformatutils/dictencoder.h b/utils/include/fileformatutils/dictencoder.h index cf85f504..f710aee0 100644 --- a/utils/include/fileformatutils/dictencoder.h +++ b/utils/include/fileformatutils/dictencoder.h @@ -16,7 +16,9 @@ governing permissions and limitations under the License. namespace adobe::usd { -USDFFUTILS_API void writeDict(const PXR_NS::VtDictionary& dict, std::ostream& output); -USDFFUTILS_API PXR_NS::VtDictionary readDict(std::istream& input); +USDFFUTILS_API void +writeDict(const PXR_NS::VtDictionary& dict, std::ostream& output); +USDFFUTILS_API PXR_NS::VtDictionary +readDict(std::istream& input); } \ No newline at end of file diff --git a/utils/include/fileformatutils/featureFlags.h b/utils/include/fileformatutils/featureFlags.h new file mode 100644 index 00000000..633c024f --- /dev/null +++ b/utils/include/fileformatutils/featureFlags.h @@ -0,0 +1,108 @@ +/* +Copyright 2026 Adobe. All rights reserved. +This file is licensed to you under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. You may obtain a copy +of the License at http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under +the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS +OF ANY KIND, either express or implied. See the License for the specific language +governing permissions and limitations under the License. +*/ +#pragma once +#include "api.h" + +#include + +/// Runtime feature flags for USD file format plugins. +/// +/// These use OpenUSD's TfEnvSetting to allow toggling behavior at runtime via +/// environment variables, without requiring a separate branch or recompilation. +/// +/// There are two categories of flags: +/// +/// 1. Material model configuration -- controls which material representations +/// are written by default. These are not experimental; they are stable +/// configuration knobs. +/// +/// 2. Experimental feature flags -- gates for in-development code paths that +/// are not yet ready for production use. +/// +/// === Adding a new feature flag === +/// +/// 1. Declare the flag in this header (inside PXR_NAMESPACE): +/// +/// extern PXR_NS::TfEnvSetting USD_FILEFORMATS_MY_FLAG; +/// +/// 2. Define the flag in featureFlags.cpp: +/// +/// TF_DEFINE_ENV_SETTING(USD_FILEFORMATS_MY_FLAG, false, +/// "Description of what this flag controls"); +/// +/// 3. Use the flag in plugin code: +/// +/// #include +/// +/// if (adobe::usd::isFeatureEnabled(USD_FILEFORMATS_MY_FLAG)) { +/// // alternative code path +/// } +/// +/// === Activating at runtime === +/// +/// export USD_FILEFORMATS_MY_FLAG=1 +/// +/// Or via PIXAR_TF_ENV_SETTING_FILE (see TfEnvSetting docs). + +PXR_NAMESPACE_OPEN_SCOPE + +// --------------------------------------------------------------------------- +// Material model configuration +// +// These flags control which material representations are written by default. +// They are fully independent -- any combination is valid (0=off, 1=on). +// File format arguments (e.g. "writeOpenPBR=true") still override these +// defaults on a per-file basis. +// --------------------------------------------------------------------------- + +/// When true, UsdPreviewSurface material networks are written. +extern PXR_NS::TfEnvSetting USD_FILEFORMATS_WRITE_USDPREVIEWSURFACE; + +/// When true, AdobeStandardMaterial (ASM) material networks are written. +extern PXR_NS::TfEnvSetting USD_FILEFORMATS_WRITE_ASM; + +/// When true, OpenPBR / MaterialX material networks are written. +extern PXR_NS::TfEnvSetting USD_FILEFORMATS_WRITE_OPENPBR; + +// --------------------------------------------------------------------------- +// Experimental feature flags +// +// These gate in-development code paths. Each flag should be specific enough +// that its name reflects what it affects. +// --------------------------------------------------------------------------- + +/// Gates experimental OpenPBR processing code paths (e.g. new writer/reader +/// logic that is not yet production-ready). This is separate from the material +/// model selection above -- USD_FILEFORMATS_WRITE_OPENPBR controls *whether* +/// OpenPBR is written, while this flag controls *how* it is processed. +extern PXR_NS::TfEnvSetting USD_FILEFORMATS_EXPERIMENTAL_OPENPBR_PROCESSING; + +PXR_NAMESPACE_CLOSE_SCOPE + +namespace adobe::usd { + +/// Query whether a specific feature flag is enabled. +/// Wraps TfGetEnvSetting for a consistent, readable call site. +template +inline T +isFeatureEnabled(PXR_NS::TfEnvSetting& setting) +{ + return PXR_NS::TfGetEnvSetting(setting); +} + +/// Apply material model defaults from environment variables to the three +/// write-material booleans. Call this in the default constructor of any struct +/// that carries writeUsdPreviewSurface / writeASM / writeOpenPBR fields. +USDFFUTILS_API void +applyMaterialModelDefaults(bool& writeUsdPreviewSurface, bool& writeASM, bool& writeOpenPBR); + +} diff --git a/utils/include/fileformatutils/geometry.h b/utils/include/fileformatutils/geometry.h index 164dcbbc..457f5ddb 100644 --- a/utils/include/fileformatutils/geometry.h +++ b/utils/include/fileformatutils/geometry.h @@ -81,6 +81,12 @@ checkAndPrintMeshIssues(const UsdData& usdData); USDFFUTILS_API void createTriangulationIndices(Mesh& mesh); +/// \ingroup utils_geometry +/// \brief Compute smooth vertex normals for a mesh by averaging face normals at shared vertices. +/// The generated normals are vertex-interpolated. +USDFFUTILS_API void +computeSmoothNormals(Mesh& mesh); + /// \ingroup utils_geometry /// \brief Triangulate an existing mesh with all its primvars and subsets. // Note, the triangulation is done with a simple fan triangulation and hence diff --git a/utils/include/fileformatutils/images.h b/utils/include/fileformatutils/images.h index a3b344c3..f7398e78 100644 --- a/utils/include/fileformatutils/images.h +++ b/utils/include/fileformatutils/images.h @@ -33,7 +33,7 @@ namespace adobe::usd { /// class USDFFUTILS_API Image { - public: +public: int width; int height; int channels; diff --git a/utils/include/fileformatutils/layerRead.h b/utils/include/fileformatutils/layerRead.h index 9eb115b8..34717608 100644 --- a/utils/include/fileformatutils/layerRead.h +++ b/utils/include/fileformatutils/layerRead.h @@ -51,6 +51,7 @@ struct USDFFUTILS_API ReadLayerContext std::vector> subsetMaterialBindings; PXR_NS::UsdGeomXformCache xformCache; std::string debugTag; + bool warnAboutMissingAssets = true; }; /// \ingroup utils_layer diff --git a/utils/include/fileformatutils/layerReadMaterial.h b/utils/include/fileformatutils/layerReadMaterial.h index e29e868f..eccdeb45 100644 --- a/utils/include/fileformatutils/layerReadMaterial.h +++ b/utils/include/fileformatutils/layerReadMaterial.h @@ -19,6 +19,6 @@ namespace adobe::usd { /// Read Material at UsdMaterial prim USDFFUTILS_API bool -readMaterial(ReadLayerContext& ctx, const PXR_NS::UsdPrim& prim, int parent); +readMaterial(ReadLayerContext& ctx, const PXR_NS::UsdPrim& prim); } \ No newline at end of file diff --git a/utils/include/fileformatutils/layerReadMaterialUtils.h b/utils/include/fileformatutils/layerReadMaterialUtils.h new file mode 100644 index 00000000..7ae4ed67 --- /dev/null +++ b/utils/include/fileformatutils/layerReadMaterialUtils.h @@ -0,0 +1,186 @@ +/* +Copyright 2025 Adobe. All rights reserved. +This file is licensed to you under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. You may obtain a copy +of the License at http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under +the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS +OF ANY KIND, either express or implied. See the License for the specific language +governing permissions and limitations under the License. +*/ +#pragma once +#include "layerRead.h" + +#include +#include +#include + +#include + +namespace adobe::usd { + +/// Reading UsdShade material networks can get complicated, so we've created some machinery here to +/// make it easier to setup the parsing of these networks. The type of network topology we expect +/// is something like this: +/// +/// +-------------+ +/// | | +/// Constant --> | | +/// | | +/// +-----------+ +---------+ | | +/// | TexCoords | --> | TexRead | --> | Surface | +/// +-----------+ +---------+ | Shader | --> Material +/// | | +/// +-----------+ +---------+ | | +/// | TexCoords | --> | TexRead | --> | | +/// +-----------+ +---------+ | | +/// | | +/// +-------------+ +/// +/// We have a central surface shader (UsdPreviewSurface, ASM or OpenPBR) and for its inputs we +/// expect either: +/// 1. No input +/// 2. A constant value (can use UsdShade connections) +/// 3. A small linear chain of shading nodes that express the reading of a texture. +/// +/// The no input (1.) and constant (2.) cases are pretty straight forward, but the texture reading +/// case (3.) can get pretty complicated, even when we assume a linear chain of nodes (no branching +/// or multiple connected inputs per node). +/// +/// The complication arises from UsdPreviewSurface and ASM using one set of nodes to express the +/// texture reading (Usd* shading nodes), while OpenPBR uses a different set of nodes (MaterialX). +/// We can have more than the depicted minimal case of two nodes in the chain. We can also have +/// optional nodes that might or might not be present. +/// +/// +/// So to make this more managable we've split the parsing of the texture chains into two concerns: +/// 1. The types of the nodes, the order in which they are expected and whether they're optional +/// 2. Extracting and converting the settings on a node and following to the next in the chain +/// +/// The 2. part is done via handler functions (ShaderHandler below), which deal with a single +/// type (or class of nodes). There needs to be one such function for each type of node we might +/// encounter. That handler is given the UsdShadeOutput that is used downstream in the network. +/// +/// \example Shader handler function for the UsdPrimvarReader node +/// ```cpp +/// bool +/// handleUsdPrimvarReader(InputContext& ctx, const UsdShadeOutput& shaderOutput) +/// { +/// UsdShadeShader shader(shaderOutput.GetPrim()); +/// +/// std::string texCoordPrimvarStr; +/// getShaderInputValue(shader, AdobeTokens->varname, texCoordPrimvarStr); +/// +/// // Rest of node processing to fill in ctx.input +/// +/// return true; +/// } +/// ``` +/// +/// The 1. part is done via a ShaderHandlerMappings vector, which is an ordered list of expected +/// shader types with their respective handler functions and whether that shader type is optional or +/// not. +/// +/// \example Shader handler mapping for Usd* type nodes on UsdPreviewSurface or ASM +/// ```cpp +/// ShaderHandlerMappings handlers = { +/// { {TfToken("UsdPrimvarReader_float2")}, handleUsdPrimvarReader }, +/// { {TfToken("UsdTransform2d")}, handleUsdTransform2d, kOptional }, +/// { {TfToken("UsdUVTexture")}, handleUsdUVTexture } +/// }; +/// ``` +/// +/// With these two pieces of information (and a bit more) an InputContext can be constructed, which +/// can then be given to readSurfaceInput() to either read a constant value or extract a textured +/// input by following a shader chain. +/// +/// \example Invoke the readSurfaceInput() function to parse an input on a surface shader +/// ```cpp +/// // Read diffuse color input and populate the material.diffuseColor Input struct +/// InputContext ctx{readLayerContext, TfToken("diffuseColor"), handlers, material.diffuseColor}; +/// readSurfaceInput(ctx, surfaceShader); +/// ``` +/// +/// The shader handler implementations can use followConnectedInput() to follow one of their inputs +/// (e.g. texture coordinate input) up the chain. + +/// Each node handler gets called with the InputContext and the output attribute on shader node +using ShaderHandler = std::function; + +/// Constant to use when declaring a shader handler as optional. This is clearer than a raw "true". +constexpr bool kOptional = true; + +/// The handler mapping struct expresses that all nodes listed in nodeNames should be handled by +/// this handler function. If isOptional is true, this type of nodes and its handler can be skipped. +/// Non-optional nodes must not be skipped. +struct USDFFUTILS_API ShaderHandlerMapping +{ + PXR_NS::TfTokenVector nodeNames; + ShaderHandler handler; + bool isOptional = false; +}; + +/// We have a linear order of expected ShaderHandlerMapping. Some mappings are optional and can be +/// skipped, but for each input we expect to travers a linear sequence of nodes in order. +using ShaderHandlerMappings = std::vector; + +/// Small context struct to simplify the node handler interface +/// * readLayerContext is needed when reading texture images +/// * surfaceInputName is the name of the original surface input we're tracing (mostly for errors) +/// * handlerMappings is used to decide which code to call when encountering a certain node type +/// * input is a reference to the Input struct we're filling in for this chain of nodes +/// * handlerIndex is the position in the handlerMappings from where the search should start +/// This index is monotonically increasing as we traverse the linear chain of nodes. +/// Optional handlers are checked, but might be skipped, and each manadatory handler is check and +/// if the right shader type is not found triggers an error. +struct USDFFUTILS_API InputContext +{ + ReadLayerContext& readLayerContext; + const PXR_NS::TfToken& surfaceInputName; + const ShaderHandlerMappings& handlerMappings; + Input& input; + uint32_t handlerIndex = 0; +}; + +/// Given an InputContext check if the surface has that input, handle the case of a constant value +/// or if connected, trigger the upstream processing. +USDFFUTILS_API bool +readSurfaceInput(InputContext& ctx, const PXR_NS::UsdShadeShader& surface); + +/// Given an InputContext, a shader and an input name, follow the connection on that input and +/// trigger the shader handling upstream. Returns false if either nothing was connected or if the +/// upstream handling failed. +/// This function is meant to be used by individual shader handlers to follow the input chain. +USDFFUTILS_API bool +followConnectedInput(InputContext& ctx, + const PXR_NS::UsdShadeShader& shader, + const PXR_NS::TfToken& inputName); + +/// Reads an image specified by the assetPath and stores it in the ReadLayerContext. +/// Returns the image index in the internal store. If the image has been found before, it returns +/// the previous index. +USDFFUTILS_API int +readImage(ReadLayerContext& ctx, const PXR_NS::SdfAssetPath& assetPath); + +/// Checks if the shader has the named input and if so extracts the associated default value. +/// Returns true if a value was extracted. Note, that this will follow UsdShade connections to +/// constant values. +template +bool +getShaderInputValue(const PXR_NS::UsdShadeShader& shader, const PXR_NS::TfToken& name, T& value) +{ + PXR_NS::UsdShadeInput input = shader.GetInput(name); + if (input) { + PXR_NS::UsdShadeAttributeVector valueAttrs = input.GetValueProducingAttributes(); + if (!valueAttrs.empty()) { + const PXR_NS::UsdAttribute& attr = valueAttrs.front(); + if (PXR_NS::UsdShadeInput::IsInput(attr)) { + return attr.Get(&value); + } + } + } + return false; +} + +} diff --git a/utils/include/fileformatutils/layerWriteOpenPBR.h b/utils/include/fileformatutils/layerWriteOpenPBR.h index 3bd86586..9b3eec11 100644 --- a/utils/include/fileformatutils/layerWriteOpenPBR.h +++ b/utils/include/fileformatutils/layerWriteOpenPBR.h @@ -13,6 +13,7 @@ governing permissions and limitations under the License. #include "api.h" #include "layerWriteShared.h" #include "sdfMaterialUtils.h" +#include "usdData.h" namespace adobe::usd { @@ -22,4 +23,16 @@ writeOpenPBR(WriteSdfContext& ctx, const OpenPbrMaterial& material, MaterialInputs& materialInputs); +// Ideally this function woulde be private, however because the sbsar format is using a pretty +// different implementation than those that use the above entry point, and we still want to share +// the implemenation of this function, we need to make it public. In the future if the sbsar plugin +// goes through a refactor, we should consider making this private again. +USDFFUTILS_API PXR_NS::SdfPath +createMaterialXTextureReader(PXR_NS::SdfAbstractData* sdfData, + const PXR_NS::SdfPath& parentPath, + const PXR_NS::TfToken& name, + const Input& input, + const PXR_NS::SdfPath& uvResultPath, + const PXR_NS::SdfPath& textureConnection); + } diff --git a/utils/include/fileformatutils/layerWriteShared.h b/utils/include/fileformatutils/layerWriteShared.h index c26e4fad..177be6f8 100644 --- a/utils/include/fileformatutils/layerWriteShared.h +++ b/utils/include/fileformatutils/layerWriteShared.h @@ -21,18 +21,22 @@ namespace adobe::usd { struct WriteLayerOptions { - WriteLayerOptions() {} + WriteLayerOptions() + { + applyMaterialModelDefaults(writeUsdPreviewSurface, writeASM, writeOpenPBR); + } WriteLayerOptions(const PXR_NS::FileFormatDataBase& fileFormatData) : writeUsdPreviewSurface(fileFormatData.writeUsdPreviewSurface) , writeASM(fileFormatData.writeASM) , writeOpenPBR(fileFormatData.writeOpenPBR) + , preserveExtraMaterialInfo(fileFormatData.preserveExtraMaterialInfo) , assetsPath(fileFormatData.assetsPath) - { - } + {} bool writeUsdPreviewSurface = true; bool writeASM = true; bool writeOpenPBR = false; + bool preserveExtraMaterialInfo = true; bool pruneJoints = false; bool animationTracks = false; bool createRenderSettingsPrim = false; @@ -135,7 +139,7 @@ struct USDFFUTILS_API OpenPbrMaterial Input geometry_coat_tangent; /// The OpenPBR spec is only concerned with BXDF properties and hence does not have a - /// displacement input. But his can be expressed in MaterialX via displacement shader and + /// displacement input. But this can be expressed in MaterialX via displacement shader and /// directly in other material models. Input displacement; @@ -186,9 +190,29 @@ struct USDFFUTILS_API OpenPbrMaterial /// /// It implements a channel-by-channel mapping where there is a correspondence between the /// UsdPreviewSurface and ASM channels in the Material struct and the OpenPBR inputs. It also -/// transfer many channels that do not exist in OpenPBR, but that are required to implement previous -/// behaviors. The documentation for these is on the OpenPbrMaterial struct. -OpenPbrMaterial +/// transfers many channels that do not exist in OpenPBR, but that are required to implement +/// previous behaviors. The documentation for these is on the OpenPbrMaterial struct. +USDFFUTILS_API OpenPbrMaterial mapMaterialStructToOpenPbrMaterialStruct(const Material& material); +/// @brief Converts an OpenPbrMaterial struct into a Material struct +/// +/// This implements the inverse of mapMaterialStructToOpenPbrMaterialStruct() +USDFFUTILS_API Material +mapOpenPbrMaterialStructToMaterialStruct(const OpenPbrMaterial& material); + +/// @brief Create custom attributes to carry extra non-OpenPBR fields +/// +/// This covers: normalScale, useSpecularWorkflow, opacityThreshold, clearcoatModelsTransmissionTint +/// and isUnlit +USDFFUTILS_API void +createExtraConstantAttribute(PXR_NS::SdfAbstractData* sdfData, + const OpenPbrMaterial& material, + const PXR_NS::SdfPath& surfaceShaderPath); + +/// OpenPBR emission values are in nits, but ASM value are not scaled to the surface area. As an +/// approximate conversion we apply a factor to get the output into a usable range. +static constexpr float kAsmToOpenPbrEmissionFactor = 1000.0f; +static constexpr float kOpenPbrToAsmEmissionFactor = 1.0f / kAsmToOpenPbrEmissionFactor; + } diff --git a/utils/include/fileformatutils/materials.h b/utils/include/fileformatutils/materials.h index e4f98c3d..50d3bd4c 100644 --- a/utils/include/fileformatutils/materials.h +++ b/utils/include/fileformatutils/materials.h @@ -36,7 +36,7 @@ namespace adobe::usd { /// * actually generating image data is optional. class USDFFUTILS_API InputTranslator { - public: +public: /// @param[in] exportImages: Whether to actually generate image data. /// @param[in] inputImages: Input images InputTranslator(bool exportImages, @@ -141,7 +141,7 @@ class USDFFUTILS_API InputTranslator ImageFormat format, bool intermediate = false); - private: +private: std::string mDebugTag; bool mExportImages; std::unordered_map mCache; diff --git a/utils/include/fileformatutils/neuralAssetsHelper.h b/utils/include/fileformatutils/neuralAssetsHelper.h index ebe15669..1e47933f 100644 --- a/utils/include/fileformatutils/neuralAssetsHelper.h +++ b/utils/include/fileformatutils/neuralAssetsHelper.h @@ -12,8 +12,8 @@ governing permissions and limitations under the License. #pragma once #include "api.h" -#include #include +#include #include namespace adobe::usd { @@ -24,10 +24,12 @@ USDFFUTILS_API void float32ToFloat16(const float* inputData, std::uint16_t* outputData, std::size_t numElements); template -T maxOfFloatArray(const T* inputData, std::size_t numElements); +T +maxOfFloatArray(const T* inputData, std::size_t numElements); template -T infNormOfFloatArray(const T* inputData, std::size_t numElements); +T +infNormOfFloatArray(const T* inputData, std::size_t numElements); USDFFUTILS_API void unpackMLPWeight(const float* in, float* out, const std::size_t d1, const std::size_t d2); @@ -36,7 +38,9 @@ USDFFUTILS_API void packMLPWeight(const float* in, float* out, const std::size_t d1, const std::size_t d2); USDFFUTILS_API bool -decompress(const std::uint8_t* inputData, std::size_t inLen, std::vector& decompressedData); +decompress(const std::uint8_t* inputData, + std::size_t inLen, + std::vector& decompressedData); USDFFUTILS_API bool compress(const std::uint8_t* inputData, std::size_t inLen, std::vector& outputData); diff --git a/utils/include/fileformatutils/resolver.h b/utils/include/fileformatutils/resolver.h index e6c77dad..e65fc505 100644 --- a/utils/include/fileformatutils/resolver.h +++ b/utils/include/fileformatutils/resolver.h @@ -11,8 +11,8 @@ governing permissions and limitations under the License. */ #pragma once #include "api.h" -#include "pxr/usd/ar/packageResolver.h" #include "usdData.h" +#include namespace adobe::usd { @@ -28,7 +28,7 @@ namespace adobe::usd { /// class USDFFUTILS_API Resolver : public PXR_NS::ArPackageResolver { - public: +public: Resolver(const std::string& name); ~Resolver(); @@ -50,11 +50,11 @@ class USDFFUTILS_API Resolver : public PXR_NS::ArPackageResolver static void populateCache(const std::string& resolvedPackagePath, std::vector&& images); - protected: +protected: virtual void readCache(const std::string& resolvedPackagePath, std::vector& images) = 0; - private: +private: // Name of resolver std::string mName; }; diff --git a/utils/include/fileformatutils/sdfMaterialUtils.h b/utils/include/fileformatutils/sdfMaterialUtils.h index 49ac6ee6..91cfa02f 100644 --- a/utils/include/fileformatutils/sdfMaterialUtils.h +++ b/utils/include/fileformatutils/sdfMaterialUtils.h @@ -81,8 +81,7 @@ struct KeyVtValuePair KeyVtValuePair(const std::string& key, const PXR_NS::VtValue& value) : first(key) , second(value) - { - } + {} // Convenient constructor to create the key from char* and the VtValue from an arbitrarily typed // value @@ -90,8 +89,7 @@ struct KeyVtValuePair KeyVtValuePair(const char* key, const T& value) : first(key) , second(value) - { - } + {} // Convenient constructor to create the key from a TfToken and the VtValue from an arbitrarily // typed value @@ -99,8 +97,7 @@ struct KeyVtValuePair KeyVtValuePair(const PXR_NS::TfToken& key, const T& value) : first(key.GetString()) , second(value) - { - } + {} }; struct InputTypePair @@ -147,6 +144,7 @@ addMaterialInputTexture(PXR_NS::SdfAbstractData* sdfData, const PXR_NS::SdfPath& materialPath, const PXR_NS::TfToken& name, const std::string& texturePath, + bool isColorTexture, MaterialInputs& materialInputs); /// Create shader prim spec with inputs and one output @@ -203,7 +201,7 @@ struct ShaderInfo // shader definition registry (Sdr) module. Unfortunate, the ASM terminal nodes are not found there. class ShaderRegistry { - public: +public: static ShaderRegistry& getInstance() { static ShaderRegistry m_instance; @@ -235,7 +233,7 @@ class ShaderRegistry return m_openPbrInputRemapping; } - private: +private: ShaderRegistry(); ~ShaderRegistry() = default; diff --git a/utils/include/fileformatutils/sdfUtils.h b/utils/include/fileformatutils/sdfUtils.h index fff6c129..026c30f3 100644 --- a/utils/include/fileformatutils/sdfUtils.h +++ b/utils/include/fileformatutils/sdfUtils.h @@ -12,6 +12,7 @@ governing permissions and limitations under the License. #pragma once #include "api.h" +#include "featureFlags.h" #include #include @@ -172,29 +173,44 @@ setAttributeMetadata(PXR_NS::SdfAbstractData* data, /// \ingroup utils_layer /// Set the default value of an attribute +/// +/// typeName is used to ensure that the value has the type that matches the type name of the +/// property. A coding error will be issued in case of a mismatch and the default value will not be +/// set. USDFFUTILS_API void setAttributeDefaultValue(PXR_NS::SdfAbstractData* data, const PXR_NS::SdfPath& propertyPath, - const PXR_NS::VtValue& value); + const PXR_NS::VtValue& value, + const PXR_NS::SdfValueTypeName& typeName); /// \ingroup utils_layer /// Set the default value of an attribute +/// +/// typeName is used to ensure that the value has the type that matches the type name of the +/// property. A coding error will be issued in case of a mismatch and the default value will not be +/// set. USDFFUTILS_API void setAttributeDefaultValue(PXR_NS::SdfAbstractData* data, const PXR_NS::SdfPath& propertyPath, - const PXR_NS::SdfAbstractDataConstValue& value); + const PXR_NS::SdfAbstractDataConstValue& value, + const PXR_NS::SdfValueTypeName& typeName); /// \ingroup utils_layer /// Set the default value of an attribute +/// +/// typeName is used to ensure that the value has the type that matches the type name of the +/// property. A coding error will be issued in case of a mismatch and the default value will not be +/// set. template void setAttributeDefaultValue(PXR_NS::SdfAbstractData* data, const PXR_NS::SdfPath& propertyPath, - const T& value) + const T& value, + const PXR_NS::SdfValueTypeName& typeName) { const PXR_NS::SdfAbstractDataConstTypedValue inValue(&value); const PXR_NS::SdfAbstractDataConstValue& untypedInValue = inValue; - setAttributeDefaultValue(data, propertyPath, untypedInValue); + setAttributeDefaultValue(data, propertyPath, untypedInValue, typeName); } /// Set the time sampled values for an animated attribute @@ -312,7 +328,7 @@ PXR_NAMESPACE_OPEN_SCOPE /// \brief SdfData specialization. class USDFFUTILS_API FileFormatDataBase : public SdfData { - public: +public: FileFormatDataBase() { // It's very important to create the pseudo root spec right away as there are codepaths that @@ -322,11 +338,13 @@ class USDFFUTILS_API FileFormatDataBase : public SdfData // notifications. Creating this here mimics how regular USDA layers are created and ensures // the pseudo root is always created and available in all code paths. adobe::usd::createPseudoRootSpec(this); + adobe::usd::applyMaterialModelDefaults(writeUsdPreviewSurface, writeASM, writeOpenPBR); }; bool writeUsdPreviewSurface = true; bool writeASM = true; bool writeOpenPBR = false; + bool preserveExtraMaterialInfo = true; std::string assetsPath; /// Parse common settings from the file format arguments diff --git a/utils/include/fileformatutils/test.h b/utils/include/fileformatutils/test.h index 74fad2c8..6747f398 100644 --- a/utils/include/fileformatutils/test.h +++ b/utils/include/fileformatutils/test.h @@ -26,6 +26,8 @@ governing permissions and limitations under the License. #include #include +#include + #define TEST_TOKENS \ (invalid)(r)( \ g)(b)(a)(rgb)(rgba)(repeat)(clamp)(wrapS)(wrapT)(mirror)(sourceColorSpace)(result)(raw)(sRGB)(st)(file)(scale)(bias)(normals)(tangents)(varname)(UsdUVTexture)(UsdPrimvarReader_float2)(UsdTransform2d)(( \ @@ -36,22 +38,21 @@ PXR_NAMESPACE_OPEN_SCOPE TF_DECLARE_PUBLIC_TOKENS(TestTokens, USDFFUTILS_API, TEST_TOKENS); PXR_NAMESPACE_CLOSE_SCOPE -#define ASSERT_PRIM(...) assertPrim(__VA_ARGS__) -#define ASSERT_NODE(...) assertNode(__VA_ARGS__) -#define ASSERT_MESH(...) assertMesh(__VA_ARGS__) -#define ASSERT_POINTS(...) assertPoints(__VA_ARGS__) -#define ASSERT_MATERIAL(...) assertMaterial(__VA_ARGS__) -#define ASSERT_ANIMATION(...) assertAnimation(__VA_ARGS__) -#define ASSERT_CAMERA(...) assertCamera(__VA_ARGS__) -#define ASSERT_LIGHT(...) assertLight(__VA_ARGS__) -#define ASSERT_DISPLAY_NAME(...) assertDisplayName(__VA_ARGS__) -#define ASSERT_VISIBILITY(...) assertVisibility(__VA_ARGS__) +#define ASSERT_PRIM(...) ASSERT_TRUE(assertPrim(__VA_ARGS__)) +#define ASSERT_NODE(...) ASSERT_TRUE(assertNode(__VA_ARGS__)) +#define ASSERT_MESH(...) ASSERT_TRUE(assertMesh(__VA_ARGS__)) +#define ASSERT_POINTS(...) ASSERT_TRUE(assertPoints(__VA_ARGS__)) +#define ASSERT_MATERIAL(...) ASSERT_TRUE(assertMaterial(__VA_ARGS__)) +#define ASSERT_ANIMATION(...) ASSERT_TRUE(assertAnimation(__VA_ARGS__)) +#define ASSERT_CAMERA(...) ASSERT_TRUE(assertCamera(__VA_ARGS__)) +#define ASSERT_LIGHT(...) ASSERT_TRUE(assertLight(__VA_ARGS__)) +#define ASSERT_DISPLAY_NAME(...) ASSERT_TRUE(assertDisplayName(__VA_ARGS__)) +#define ASSERT_VISIBILITY(...) ASSERT_TRUE(assertVisibility(__VA_ARGS__)) #ifdef DO_RENDER -# define ASSERT_RENDER(...) assertRender(__VA_ARGS__) +#define ASSERT_RENDER(filename, imageFilename) ASSERT_TRUE(assertRender(filename, imageFilename)) #else -# define ASSERT_RENDER(...) \ - { \ - } +#define ASSERT_RENDER(...) \ + {} #endif // XXX This duplication of structs is highly suspicious @@ -165,23 +166,23 @@ struct USDFFUTILS_API LightData // ImageAsset texture }; -USDFFUTILS_API void +[[nodiscard]] USDFFUTILS_API ::testing::AssertionResult assertPrim(PXR_NS::UsdStageRefPtr stage, const std::string& path); -USDFFUTILS_API void +[[nodiscard]] USDFFUTILS_API ::testing::AssertionResult assertNode(PXR_NS::UsdStageRefPtr stage, const std::string& path); -USDFFUTILS_API void +[[nodiscard]] USDFFUTILS_API ::testing::AssertionResult assertMesh(PXR_NS::UsdStageRefPtr stage, const std::string& path, const MeshData& data); -USDFFUTILS_API void +[[nodiscard]] USDFFUTILS_API ::testing::AssertionResult assertPoints(PXR_NS::UsdStageRefPtr stage, const std::string& path, const PointsData& data); -USDFFUTILS_API void +[[nodiscard]] USDFFUTILS_API ::testing::AssertionResult assertMaterial(PXR_NS::UsdStageRefPtr stage, const std::string& path, const MaterialData& data); -USDFFUTILS_API void +[[nodiscard]] USDFFUTILS_API ::testing::AssertionResult assertAnimation(PXR_NS::UsdStageRefPtr stage, const std::string& path, const AnimationData& data); -USDFFUTILS_API void +[[nodiscard]] USDFFUTILS_API ::testing::AssertionResult assertCamera(PXR_NS::UsdStageRefPtr stage, const std::string& path, const CameraData& data); -USDFFUTILS_API void +[[nodiscard]] USDFFUTILS_API ::testing::AssertionResult assertLight(PXR_NS::UsdStageRefPtr stage, const std::string& path, const LightData& data); -USDFFUTILS_API void +[[nodiscard]] USDFFUTILS_API ::testing::AssertionResult assertDisplayName(PXR_NS::UsdStageRefPtr stage, const std::string& primPath, const std::string& displayName); @@ -195,15 +196,24 @@ assertDisplayName(PXR_NS::UsdStageRefPtr stage, * @param expectedActualVisibility If the prim is expected to be visible or invisible, when the * effective visibility is computed with UsdGeomImageable::ComputeVisibility() */ -USDFFUTILS_API void +[[nodiscard]] USDFFUTILS_API ::testing::AssertionResult assertVisibility(PXR_NS::UsdStageRefPtr stage, const std::string& path, bool expectedVisibilityAttr, bool expectedActualVisibility); -USDFFUTILS_API void +[[nodiscard]] USDFFUTILS_API ::testing::AssertionResult assertRender(const std::string& filename, const std::string& imageFilename); +/// Compares a USD layer against a baseline USDA file. +/// If generateBaseline is true, exports the layer to the baseline path instead of comparing. +/// If dumpOnFailure is true, writes the actual output next to the baseline when comparison fails. +[[nodiscard]] USDFFUTILS_API ::testing::AssertionResult +assertUsda(const PXR_NS::SdfLayerHandle& sdfLayer, + const std::string& baselinePath, + bool generateBaseline = false, + bool dumpOnFailure = false); + template bool extractUsdAttribute(PXR_NS::UsdPrim prim, @@ -220,7 +230,7 @@ extractUsdAttribute(PXR_NS::UsdPrim prim, // Class to catch messages from the USD library class UsdDiagnosticDelegate : public PXR_NS::TfDiagnosticMgr::Delegate { - public: +public: UsdDiagnosticDelegate() { PXR_NS::TfDiagnosticMgr::GetInstance().AddDelegate(this); } ~UsdDiagnosticDelegate() override @@ -256,7 +266,7 @@ class UsdDiagnosticDelegate : public PXR_NS::TfDiagnosticMgr::Delegate const std::vector& GetWarnings() const { return m_warnings; } - private: +private: std::vector m_errors; std::vector m_fatalErrors; std::vector m_statuses; diff --git a/utils/include/fileformatutils/usdData.h b/utils/include/fileformatutils/usdData.h index 8beaa4df..55615aaf 100644 --- a/utils/include/fileformatutils/usdData.h +++ b/utils/include/fileformatutils/usdData.h @@ -122,7 +122,7 @@ struct USDFFUTILS_API Subset { PXR_NS::VtIntArray faces; // indices to a subset of geom faces PXR_NS::VtIntArray indices; // subset of geom indices - int material; + int material = -1; }; /// \ingroup utils_geometry @@ -163,6 +163,7 @@ struct USDFFUTILS_API Mesh PXR_NS::VtFloatArray weights; int material = -1; std::vector subsets; + PXR_NS::VtIntArray patchIds; bool doubleSided = false; bool instanceable = false; bool asPoints = false; @@ -296,10 +297,11 @@ enum USDFFUTILS_API ImageFormat struct USDFFUTILS_API ImageAsset { + // name acts like a display name, whereas uri is the string used in brackets in unresolved USD + // packages. (example: if USD has @asset.fbx[image.png]@, uri would be image.png) std::string name; - // Images are referenced differently than nodes, so they do not have display names - std::string uri; + ImageFormat format = ImageFormatUnknown; std::vector image; }; @@ -340,6 +342,17 @@ constexpr float kDefaultUvRotation = 0.0f; constexpr PXR_NS::GfVec2f kDefaultUvScale = PXR_NS::GfVec2f(1.0f); constexpr PXR_NS::GfVec2f kDefaultUvTranslation = PXR_NS::GfVec2f(0.0f); +// In order to decode tangent space normals from a normal map that is stored as [0,1] colors, the +// `n = 2*c - 1` formula is applied. As scale and bias on the texture node, this manifests as these +// constants. +// +// Note that there are two common encoding convention. The one used by USD and MaterialX is the +// OpenGL convention. The DirectX convention has the green/y coordinate flipped. +constexpr PXR_NS::GfVec4f kOpenGLNormalTexScale = PXR_NS::GfVec4f(2.0f, 2.0f, 2.0f, 1.0f); +constexpr PXR_NS::GfVec4f kOpenGLNormalTexBias = PXR_NS::GfVec4f(-1.0f, -1.0f, -1.0f, 0.0f); +constexpr PXR_NS::GfVec4f kDirectXNormalTexScale = PXR_NS::GfVec4f(2.0f, -2.0f, 2.0f, 1.0f); +constexpr PXR_NS::GfVec4f kDirectXNormalTexBias = PXR_NS::GfVec4f(-1.0f, 1.0f, -1.0f, 0.0f); + /// \ingroup utils_materials /// \brief Material Input data struct USDFFUTILS_API Input @@ -552,7 +565,7 @@ class USDFFUTILS_API UniqueNameEnforcer { std::unordered_map namesMap; - public: +public: void enforceUniqueness(std::string& name); }; diff --git a/utils/src/assetresolver.cpp b/utils/src/assetresolver.cpp index 1a4189b0..f905c03f 100644 --- a/utils/src/assetresolver.cpp +++ b/utils/src/assetresolver.cpp @@ -23,13 +23,13 @@ namespace adobe::usd { // Ideally, when available, use that one instead of defining our own. class ImageArAsset : public ArAsset { - public: +public: explicit ImageArAsset(const std::vector&& data) - : _data(data){}; + : _data(data) {}; const std::vector& getData() const { return _data; } virtual size_t GetSize() const override { return _data.size(); } - private: +private: std::vector _data; virtual std::shared_ptr GetBuffer() const override @@ -49,19 +49,21 @@ class ImageArAsset : public ArAsset } }; -void AssetCacheSingleton::garbageCollectCacheExcluding(const std::string& excludedPath) { +void +AssetCacheSingleton::garbageCollectCacheExcluding(const std::string& excludedPath) +{ using namespace std::chrono_literals; - + auto currentTime = std::chrono::steady_clock::now(); std::lock_guard lock(mAssetCacheMutex); // Garbage collect entries in the cache older than 60 seconds for (auto it = mAssetCache.begin(); it != mAssetCache.end();) { std::chrono::seconds timePassed = - std::chrono::duration_cast(currentTime - it->second.creationTime); + std::chrono::duration_cast(currentTime - it->second.creationTime); if (timePassed > 60s && it->first != excludedPath) { TF_DEBUG_MSG( - UTIL_PACKAGE_RESOLVER, "Removing cached items for package '%s'\n", it->first.c_str()); + UTIL_PACKAGE_RESOLVER, "Removing cached items for package '%s'\n", it->first.c_str()); it = mAssetCache.erase(it); } else { ++it; @@ -69,12 +71,17 @@ void AssetCacheSingleton::garbageCollectCacheExcluding(const std::string& exclud } } -void AssetCacheSingleton::clearCache(const std::string& resolvedPackagePath) { +void +AssetCacheSingleton::clearCache(const std::string& resolvedPackagePath) +{ std::lock_guard lock(mAssetCacheMutex); mAssetCache.erase(resolvedPackagePath); } -void AssetCacheSingleton::populateCache(const std::string& resolvedPackagePath, std::vector&& images) { +void +AssetCacheSingleton::populateCache(const std::string& resolvedPackagePath, + std::vector&& images) +{ std::lock_guard lock(mAssetCacheMutex); auto it = mAssetCache.find(resolvedPackagePath); @@ -88,17 +95,23 @@ void AssetCacheSingleton::populateCache(const std::string& resolvedPackagePath, } } -AssetMap* AssetCacheSingleton::acquireAssetMap(const std::string& resolvedPackagePath, - const std::string& resolvedPackagedPath, - std::stringstream& ss, - std::function&)> readCache) { - AssetMap* assetMap = nullptr; +AssetMap* +AssetCacheSingleton::acquireAssetMap( + const std::string& resolvedPackagePath, + const std::string& resolvedPackagedPath, + std::stringstream& ss, + std::function&)> readCache) +{ + AssetMap* assetMap = nullptr; std::lock_guard lock(mAssetCacheMutex); - + auto it = mAssetCache.find(resolvedPackagePath); if (it != mAssetCache.end()) { - TF_DEBUG_MSG( - UTIL_PACKAGE_RESOLVER, "%s: %p::%s Cached file", resolvedPackagedPath.c_str(), this, ss.str().c_str()); + TF_DEBUG_MSG(UTIL_PACKAGE_RESOLVER, + "%s: %p::%s Cached file", + resolvedPackagedPath.c_str(), + this, + ss.str().c_str()); assetMap = &it->second; } else { TF_DEBUG_MSG(UTIL_PACKAGE_RESOLVER, @@ -116,5 +129,4 @@ AssetMap* AssetCacheSingleton::acquireAssetMap(const std::string& resolvedPackag return assetMap; } - -} // namespace adobe::usd \ No newline at end of file +} // namespace adobe::usd diff --git a/utils/src/common.cpp b/utils/src/common.cpp index 1f15faa4..c3220b28 100644 --- a/utils/src/common.cpp +++ b/utils/src/common.cpp @@ -20,6 +20,7 @@ governing permissions and limitations under the License. #include #include #include +#include #include #include #include @@ -128,7 +129,7 @@ argComposeFloatArray(const PcpDynamicFileFormatContext& context, } } -void +bool argReadString(const PXR_NS::SdfFileFormat::FileFormatArguments& args, const std::string& arg, std::string& target, @@ -141,21 +142,26 @@ argReadString(const PXR_NS::SdfFileFormat::FileFormatArguments& args, debugTag.c_str(), arg.c_str(), it->second.c_str()); + return true; } + return false; } -void +bool argReadString(const PXR_NS::SdfFileFormat::FileFormatArguments& args, const std::string& arg, PXR_NS::TfToken& target, const std::string& debugTag) { std::string targetStr; - argReadString(args, arg, targetStr, debugTag); - target = PXR_NS::TfToken(targetStr); + if (argReadString(args, arg, targetStr, debugTag)) { + target = PXR_NS::TfToken(targetStr); + return true; + } + return false; } -void +bool argReadBool(const PXR_NS::SdfFileFormat::FileFormatArguments& args, const std::string& arg, bool& target, @@ -168,10 +174,12 @@ argReadBool(const PXR_NS::SdfFileFormat::FileFormatArguments& args, debugTag.c_str(), arg.c_str(), target ? "true" : "false"); + return true; } + return false; } -void +bool argReadFloat(const PXR_NS::SdfFileFormat::FileFormatArguments& args, const std::string& arg, float& target, @@ -184,10 +192,12 @@ argReadFloat(const PXR_NS::SdfFileFormat::FileFormatArguments& args, debugTag.c_str(), arg.c_str(), it->second.c_str()); + return true; } + return false; } -void +bool argReadFloatArray(const SdfFileFormat::FileFormatArguments& args, const std::string& arg, VtFloatArray& target, @@ -209,7 +219,9 @@ argReadFloatArray(const SdfFileFormat::FileFormatArguments& args, debugTag.c_str(), arg.c_str(), it->second.c_str()); + return true; } + return false; } void @@ -278,6 +290,19 @@ createDirectory(const std::filesystem::path& directoryPath) return true; } +bool +writeDataToDisk(const std::filesystem::path& filepath, const void* data, size_t size) +{ + std::ofstream file(filepath, std::ios::out | std::ios::binary); + if (!file.is_open()) { + TF_WARN("Could not open file %s for writing.", filepath.c_str()); + return false; + } + file.write(reinterpret_cast(data), size); + file.close(); + return true; +} + // Retrieves the file path associated with a given layer identifier. // Parses the layer identifier to extract the outer and inner paths, // and returns the inner path if available; otherwise, returns the outer path. @@ -291,4 +316,33 @@ getLayerFilePath(const std::string& layerIdentifier) return inner.empty() ? outer : inner; } -} \ No newline at end of file +std::filesystem::path +convertStringToPath(const std::string& str) +{ +#if __cplusplus >= 202002L + return std::filesystem::path(str); +#else + return std::filesystem::u8path(str); +#endif +} + +#if __cplusplus >= 202002L +std::filesystem::path +convertStringToPath(const std::u8string& str) +{ + return std::filesystem::path(reinterpret_cast(str.c_str())); +} +#endif + +// convert a path to a string in a c++ version dependent way +std::string +convertPathToString(const std::filesystem::path& path) +{ +#if __cplusplus >= 202002L + return std::string(reinterpret_cast(path.u8string().c_str())); +#else + return path.u8string(); +#endif +} + +} // namespace adobe::usd diff --git a/utils/src/featureFlags.cpp b/utils/src/featureFlags.cpp new file mode 100644 index 00000000..fc3ca289 --- /dev/null +++ b/utils/src/featureFlags.cpp @@ -0,0 +1,57 @@ +/* +Copyright 2026 Adobe. All rights reserved. +This file is licensed to you under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. You may obtain a copy +of the License at http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under +the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS +OF ANY KIND, either express or implied. See the License for the specific language +governing permissions and limitations under the License. +*/ +#include + +#ifndef USD_FILEFORMATS_DEFAULT_WRITE_USDPREVIEWSURFACE +#define USD_FILEFORMATS_DEFAULT_WRITE_USDPREVIEWSURFACE true +#endif + +#ifndef USD_FILEFORMATS_DEFAULT_WRITE_ASM +#define USD_FILEFORMATS_DEFAULT_WRITE_ASM true +#endif + +#ifndef USD_FILEFORMATS_DEFAULT_WRITE_OPENPBR +#define USD_FILEFORMATS_DEFAULT_WRITE_OPENPBR false +#endif + +PXR_NAMESPACE_OPEN_SCOPE + +TF_DEFINE_ENV_SETTING(USD_FILEFORMATS_WRITE_USDPREVIEWSURFACE, + (bool)(USD_FILEFORMATS_DEFAULT_WRITE_USDPREVIEWSURFACE), + "Write UsdPreviewSurface material networks by default"); + +TF_DEFINE_ENV_SETTING(USD_FILEFORMATS_WRITE_ASM, + (bool)(USD_FILEFORMATS_DEFAULT_WRITE_ASM), + "Write AdobeStandardMaterial networks by default"); + +TF_DEFINE_ENV_SETTING(USD_FILEFORMATS_WRITE_OPENPBR, + (bool)(USD_FILEFORMATS_DEFAULT_WRITE_OPENPBR), + "Write OpenPBR / MaterialX material networks by default"); + +TF_DEFINE_ENV_SETTING(USD_FILEFORMATS_EXPERIMENTAL_OPENPBR_PROCESSING, + false, + "Enable experimental OpenPBR processing code paths"); + +PXR_NAMESPACE_CLOSE_SCOPE + +namespace adobe::usd { + +void +applyMaterialModelDefaults(bool& writeUsdPreviewSurface, bool& writeASM, bool& writeOpenPBR) +{ + writeUsdPreviewSurface = + PXR_NS::TfGetEnvSetting(PXR_NS::USD_FILEFORMATS_WRITE_USDPREVIEWSURFACE); + writeASM = PXR_NS::TfGetEnvSetting(PXR_NS::USD_FILEFORMATS_WRITE_ASM); + writeOpenPBR = PXR_NS::TfGetEnvSetting(PXR_NS::USD_FILEFORMATS_WRITE_OPENPBR); +} + +} diff --git a/utils/src/geometry.cpp b/utils/src/geometry.cpp index 683b4011..2939585f 100644 --- a/utils/src/geometry.cpp +++ b/utils/src/geometry.cpp @@ -90,15 +90,15 @@ checkFiniteFloats(const VtArray& array, std::vector& invalidIndices) // in local scope to use as a reusable staging buffer for the message. // It also expects a string path, which is used in the message. // It also expects a bool foundError, which it sets to true if an Error is encountered. -#define LOG_ISSUE(level, format, ...) \ - if (issues != nullptr) { \ - int n = snprintf(tempBuffer, tempBufferSize, format, ##__VA_ARGS__); \ - if (n > 0 && n < tempBufferSize) { \ - issues->push_back(Issue{ level, path, tempBuffer }); \ - } \ - } \ - if (level == Issue::Level::Error) { \ - foundError = true; \ +#define LOG_ISSUE(level, format, ...) \ + if (issues != nullptr) { \ + int n = snprintf(tempBuffer, tempBufferSize, format, ##__VA_ARGS__); \ + if (n > 0 && n < tempBufferSize) { \ + issues->push_back(Issue{ level, path, tempBuffer }); \ + } \ + } \ + if (level == Issue::Level::Error) { \ + foundError = true; \ } bool @@ -755,8 +755,8 @@ computeSmoothNormals(Mesh& mesh) continue; } if ((size_t)(faceVertexIndex + numFaceVertices) >= totalNumFaceVertices) { - TF_WARN("Invalid mesh topology: offset {} into indices for face {} is larger than " - "total indices {}", + TF_WARN("Invalid mesh topology: offset %d into indices for face %zu is larger than " + "total indices %zu", faceVertexIndex + numFaceVertices, faceIdx, totalNumFaceVertices); diff --git a/utils/src/images.cpp b/utils/src/images.cpp index a1d75be7..b2d620d0 100644 --- a/utils/src/images.cpp +++ b/utils/src/images.cpp @@ -28,8 +28,7 @@ Image::Image() : width(0U) , height(0U) , channels(0U) -{ -} +{} Image::~Image() {} @@ -590,7 +589,8 @@ extractFilePathFromAssetPath(const std::string& assetPath) std::string usage = getSbsarUsageFromParameters(parameters); if (!usage.empty()) { // graphs/CardBoard/images -> CardBoard - std::string graphName = std::filesystem::path(subpath).parent_path().filename().u8string(); + std::string graphName = + convertPathToString(std::filesystem::path(subpath).parent_path().filename()); subpath = graphName + "_" + usage; } diff --git a/utils/src/layerRead.cpp b/utils/src/layerRead.cpp index 76a9ad11..3f89680a 100644 --- a/utils/src/layerRead.cpp +++ b/utils/src/layerRead.cpp @@ -144,8 +144,7 @@ readScope(ReadLayerContext& ctx, const UsdPrim& prim, int parent) node.path = prim.GetPath().GetString(); node.markedInvisible = isMarkedInvisible(ctx, prim); readTransform(ctx, prim, node, parent); - UsdPrimSiblingRange children = - prim.GetFilteredChildren(UsdTraverseInstanceProxies(UsdPrimAllPrimsPredicate)); + UsdPrimSiblingRange children = prim.GetFilteredChildren(UsdTraverseInstanceProxies()); for (const UsdPrim& p : children) { readPrim(ctx, p, nodeIndex); } @@ -161,8 +160,7 @@ readUnknown(ReadLayerContext& ctx, const UsdPrim& prim, int parent) prim.GetTypeName().GetText(), prim.GetName().GetText()); - UsdPrimSiblingRange children = - prim.GetFilteredChildren(UsdTraverseInstanceProxies(UsdPrimAllPrimsPredicate)); + UsdPrimSiblingRange children = prim.GetFilteredChildren(UsdTraverseInstanceProxies()); bool skipAddingNode = false; if (prim.GetPrimTypeInfo() == UsdPrimTypeInfo::GetEmptyPrimType()) { @@ -330,8 +328,7 @@ readXform(ReadLayerContext& ctx, const UsdPrim& prim, int parent) readXformInternal(ctx, pair.second, prim, parent); } - UsdPrimSiblingRange children = - prim.GetFilteredChildren(UsdTraverseInstanceProxies(UsdPrimAllPrimsPredicate)); + UsdPrimSiblingRange children = prim.GetFilteredChildren(UsdTraverseInstanceProxies()); for (const UsdPrim& p : children) { readPrim(ctx, p, nodeIndex); } @@ -452,14 +449,14 @@ readMeshOrPointsData(ReadLayerContext& ctx, Mesh& mesh, int meshIndex, const Usd } } } - + // Try reading bitangents first (new format), then fallback to binormals (old format) if (!readPrimvar(primvarsAPI, TfToken("bitangents"), mesh.bitangents)) { if (!readPrimvar(primvarsAPI, TfToken("binormals"), mesh.bitangents)) { // Try as authored attributes UsdAttribute bitangentsAttr = prim.GetAttribute(TfToken("bitangents")); UsdAttribute binormalsAttr = prim.GetAttribute(TfToken("binormals")); - + if (bitangentsAttr.IsAuthored()) { bitangentsAttr.Get(&mesh.bitangents.values, 0); TfToken interpolation; @@ -543,8 +540,7 @@ readMeshOrPointsData(ReadLayerContext& ctx, Mesh& mesh, int meshIndex, const Usd if (prim.IsA()) { UsdShadeMaterialBindingAPI::BindingsCache bindingsCache; UsdShadeMaterialBindingAPI::CollectionQueryCache collQueryCache; - UsdPrimSiblingRange children = - prim.GetFilteredChildren(UsdTraverseInstanceProxies(UsdPrimAllPrimsPredicate)); + UsdPrimSiblingRange children = prim.GetFilteredChildren(UsdTraverseInstanceProxies()); for (const UsdPrim& child : children) { if (child.IsA()) { ctx.subsetMaterialBindings.back().push_back(""); @@ -623,8 +619,10 @@ readMeshOrPointsData(ReadLayerContext& ctx, Mesh& mesh, int meshIndex, const Usd int shIndex = 0; while (true) { Primvar shCoeffs; - if (!readPrimvar( - primvarsAPI, TfToken(std::string("fRest") + std::to_string(shIndex)), shCoeffs) || !shCoeffs.values.size()) + if (!readPrimvar(primvarsAPI, + TfToken(std::string("fRest") + std::to_string(shIndex)), + shCoeffs) || + !shCoeffs.values.size()) break; auto [pointSHCoeffSetIndex, pointSHCoeffSet] = ctx.usd->addPointSHCoeffSet(meshIndex); @@ -808,7 +806,6 @@ readSkelRoot(ReadLayerContext& ctx, const UsdPrim& prim, int parent) } // Process animation data - int boneCount = skeleton.restTransforms.size(); const UsdSkelAnimQuery& skelAnimQuery = skelQuery.GetAnimQuery(); if (skelAnimQuery.IsValid()) { std::vector times; @@ -905,8 +902,7 @@ readPointInstancer(ReadLayerContext& ctx, const UsdPrim& prim, int parent) protoInstanceAttr.Get(&protoIndices, time); const int meshesBeforePrototypesAdded = ctx.usd->meshes.size(); - UsdPrimSiblingRange children = - prim.GetFilteredChildren(UsdTraverseInstanceProxies(UsdPrimAllPrimsPredicate)); + UsdPrimSiblingRange children = prim.GetFilteredChildren(UsdTraverseInstanceProxies()); for (const UsdPrim& p : children) { readPrim(ctx, p, nodeIndex); } @@ -1247,7 +1243,10 @@ readPrim(ReadLayerContext& ctx, const UsdPrim& prim, int parent) else if (prim.IsA()) f = readSkelRoot; else if (prim.IsA()) - f = readMaterial; + // The readMaterial function doesn't use the parent index + f = [](ReadLayerContext& ctx, const UsdPrim& prim, int /*parent*/) { + return readMaterial(ctx, prim); + }; else if (prim.IsA()) f = readCamera; else if (prim.IsA()) @@ -1278,7 +1277,7 @@ resolveMaterialBindings(ReadLayerContext& ctx) int index = it->second; ctx.usd->meshes[i].material = index; TF_DEBUG_MSG(FILE_FORMAT_UTIL, - "%s: mesh[%d].material = %d: %s\n", + "%s: mesh[%zu].material = %d: %s\n", ctx.debugTag.c_str(), i, index, @@ -1306,7 +1305,7 @@ resolveMaterialBindings(ReadLayerContext& ctx) int index = it->second; ctx.usd->meshes[i].subsets[j].material = index; TF_DEBUG_MSG(FILE_FORMAT_UTIL, - "%s: mesh[%d].subset[%d].material = %d: %s\n", + "%s: mesh[%zu].subset[%zu].material = %d: %s\n", ctx.debugTag.c_str(), i, j, @@ -1419,7 +1418,7 @@ splitAnimationTracks(UsdData& usd) node.animations.resize(usd.animationTracks.size()); // For each track, filter all timepoints that are within range - for (int animationTrackIndex = 0; animationTrackIndex < usd.animationTracks.size(); + for (size_t animationTrackIndex = 0; animationTrackIndex < usd.animationTracks.size(); animationTrackIndex++) { AnimationTrack& track = usd.animationTracks[animationTrackIndex]; float mainMinTime = track.minTime + track.offsetToJoinedTimeline; @@ -1427,7 +1426,7 @@ splitAnimationTracks(UsdData& usd) auto filterTimeValues = [&track, mainMinTime, mainMaxTime](const auto& srcTimeValues, auto& dstTimeValues) { - int t = 0; + size_t t = 0; for (const float time : srcTimeValues.times) { if (srcTimeValues.values.size() <= t) { diff --git a/utils/src/layerReadMaterial.cpp b/utils/src/layerReadMaterial.cpp index 065755ab..288efd38 100644 --- a/utils/src/layerReadMaterial.cpp +++ b/utils/src/layerReadMaterial.cpp @@ -10,471 +10,800 @@ OF ANY KIND, either express or implied. See the License for the specific languag governing permissions and limitations under the License. */ #include - -#include -#include -#include +#include #include -#include -#include -#include -#include -#include -#include - -using namespace PXR_NS; +PXR_NAMESPACE_USING_DIRECTIVE namespace adobe::usd { -// Populates the absolute path, base name, and sanitized extension for an SBSAR asset by resolving -// the absolute path from the provided URI. -void -populatePathPartsFromAssetPath(const SdfAssetPath& path, - std::string& resolvedAssetPath, - std::string& name, - std::string& extension) +// The following helpers read special inputs as attributes. These are used to read values that are +// not native shader inputs on some of the surface shaders. + +// Natively supported on ASM, but not OpenPBR +// Note used by UsdPreviewSurface networks +float +_readNormalScale(const UsdShadeShader& surface) { - // Make sure we have a resolved path, either coming from SdfAssetPath value or by running it - // throught the resolver. - resolvedAssetPath = path.GetResolvedPath().empty() - ? ArGetResolver().Resolve(path.GetAssetPath()) - : path.GetResolvedPath(); - // This will extract the inner most path to the asset: - // path/to/package.usdz[path/to/image.png] -> path/to/image.png - std::string innerAssetPath = getLayerFilePath(resolvedAssetPath); - // This helper function will detect "funky" paths, like those to SBSAR images and convert them - // to good usable file paths - std::string filePath = extractFilePathFromAssetPath(innerAssetPath); - // Strip the path part since we only want the filename and the extension - std::string baseName = TfGetBaseName(filePath); - name = TfStringGetBeforeSuffix(baseName); - extension = TfGetExtension(baseName); + float value = 1.0f; + surface.GetPrim().GetAttribute(AsmTokens->normalScale).Get(&value); + return value; } +// Natively supported on UsdPreviewSurface, but not ASM and OpenPBR bool -readImage(ReadLayerContext& ctx, const SdfAssetPath& assetPath, int& index) +_readUseSpecularWorkflow(const UsdShadeShader& surface) { - std::string resolvedAssetPath, name, extension; - populatePathPartsFromAssetPath(assetPath, resolvedAssetPath, name, extension); - - // Check in the cache if we've processed this image before - if (const auto& it = ctx.images.find(resolvedAssetPath); it != ctx.images.end()) { - index = it->second; - TF_DEBUG_MSG(FILE_FORMAT_UTIL, - "%s: Image (cached): %s\n", - ctx.debugTag.c_str(), - resolvedAssetPath.c_str()); - return true; - } + bool value = false; + surface.GetPrim().GetAttribute(UsdPreviewSurfaceTokens->useSpecularWorkflow).Get(&value); + return value; +} + +// Natively supported on UsdPreviewSurface, but not ASM and OpenPBR +float +_readOpacityThreshold(const UsdShadeShader& surface) +{ + float value = 0.0f; + surface.GetPrim().GetAttribute(UsdPreviewSurfaceTokens->opacityThreshold).Get(&value); + return value; +} + +// Custom attribute not natively supported by any surface +// Note used by UsdPreviewSurface networks +bool +_readClearcoatModelsTransmissionTint(const UsdShadeShader& surface) +{ + bool value = false; + surface.GetPrim().GetAttribute(AdobeTokens->clearcoatModelsTransmissionTint).Get(&value); + return value; +} - // The image is new. Make sure we don't get name collisions in the short name - if (const auto& itName = ctx.imageNames.find(name); itName != ctx.imageNames.end()) { - itName->second++; - name += "_" + std::to_string(itName->second); - TF_DEBUG_MSG(FILE_FORMAT_UTIL, - "%s: Deduplicated image name: %s\n", - ctx.debugTag.c_str(), - name.c_str()); +// Custom attribute not natively supported by any surface +// Note used by UsdPreviewSurface networks +bool +_readUnlit(const UsdShadeShader& surface) +{ + bool value = false; + surface.GetPrim().GetAttribute(AdobeTokens->unlit).Get(&value); + return value; +} + +// ------------------------------------------------------------------------------------------------- +// UsdPreviewSurface & ASM network node handlers +// +// Note, an ASM network uses the same nodes as UsdPreviewSurface that ship with USD. We expect that +// each input on the surface can either use a constant value or a simple linear chain of nodes to +// read a texture value: +// +// TexCoords (UsdPrimvarReader_float2) +// | +// V +// TexCoordXform (UsdTransform2d) [OPTIONAL] +// | +// V +// TexRead (UsdUVTexture) (* include scale & bias and channel selection) +// | +// V +// UsdPreviewSurface (UsdPreviewSurface) or ASM Surface (AdobeStandardMaterial_4_0) +// +// * Note that these surfaces will automatically apply the normal map transform for normal inputs. +// +// ------------------------------------------------------------------------------------------------- + +bool +handleUsdPrimvarReader(InputContext& ctx, const UsdShadeOutput& shaderOutput) +{ + UsdShadeShader shader(shaderOutput.GetPrim()); + + TfToken texCoordPrimvar; + std::string texCoordPrimvarStr; + getShaderInputValue(shader, AdobeTokens->varname, texCoordPrimvarStr); + + // Supports both string and token type values for the varname + // string is the correct type, but token was added to support slightly + // incorrect assets. + if (!texCoordPrimvarStr.empty()) { + texCoordPrimvar = TfToken(texCoordPrimvarStr); } else { - ctx.imageNames[name] = 1; + getShaderInputValue(shader, AdobeTokens->varname, texCoordPrimvar); } - - auto [imageIndex, image] = ctx.usd->addImage(); - if (extension == "sbsarimage") { - // SBSAR images are a special cases where the data is stored raw and must be transcoded to a - // different image in memory - extension = getSbsarImageExtension(resolvedAssetPath); - image.uri = name + "." + extension; - transcodeImageAssetToMemory(resolvedAssetPath, image.uri, image.image); + int uvIndex = getSTPrimvarTokenIndex(texCoordPrimvar); + if (uvIndex >= 0) { + ctx.input.uvIndex = uvIndex; } else { - auto asset = ArGetResolver().OpenAsset(ArResolvedPath(resolvedAssetPath)); - if (!asset) { - TF_WARN( - "%s: Unable to open asset: %s\n", ctx.debugTag.c_str(), resolvedAssetPath.c_str()); - return false; - } - image.uri = name + "." + extension; - image.image.resize(asset->GetSize()); - memcpy(image.image.data(), asset->GetBuffer().get(), asset->GetSize()); + TF_WARN("Texture reader %s is reading primvar %s. Only 'st' or 'st1'..'stN' is supported " + "(Input %s)", + shader.GetPrim().GetPath().GetText(), + texCoordPrimvar.GetText(), + ctx.surfaceInputName.GetText()); } - image.name = name; - image.format = getFormat(extension); - ctx.images[resolvedAssetPath] = imageIndex; - index = imageIndex; - - TF_DEBUG_MSG(FILE_FORMAT_UTIL, - "%s: Image (new): index: %d uri: %s\n", - ctx.debugTag.c_str(), - imageIndex, - resolvedAssetPath.c_str()); - return true; } -void -applyInputMult(Input& input, float mult) +bool +handleUsdTransform2d(InputContext& ctx, const UsdShadeOutput& shaderOutput) { - if (mult == 1.0f) { - return; - } + UsdShadeShader shader(shaderOutput.GetPrim()); - if (input.image != -1) { - input.scale *= mult; - } else if (input.value.IsHolding()) { - GfVec3f v = input.value.UncheckedGet(); - v *= mult; - input.value = v; - } else if (input.value.IsHolding()) { - float v = input.value.UncheckedGet(); - v *= mult; - input.value = v; - } + getShaderInputValue(shader, AdobeTokens->rotation, ctx.input.uvRotation); + getShaderInputValue(shader, AdobeTokens->scale, ctx.input.uvScale); + getShaderInputValue(shader, AdobeTokens->translation, ctx.input.uvTranslation); + + return followConnectedInput(ctx, shader, AdobeTokens->in); } -template +// Handle texture-related shader inputs such as file paths and wrapping modes. bool -getShaderInputValue(const UsdShadeShader& shader, const TfToken& name, T& value) +handleUsdUVTexture(InputContext& ctx, const UsdShadeOutput& shaderOutput) { - UsdShadeInput input = shader.GetInput(name); - if (input) { - UsdShadeAttributeVector valueAttrs = input.GetValueProducingAttributes(); - if (!valueAttrs.empty()) { - const UsdAttribute& attr = valueAttrs.front(); - if (UsdShadeUtils::GetType(attr.GetName()) == UsdShadeAttributeType::Input) { - valueAttrs.front().Get(&value); - return true; - } - } + UsdShadeShader shader(shaderOutput.GetPrim()); + + SdfAssetPath assetPath; + if (getShaderInputValue(shader, AdobeTokens->file, assetPath)) { + ctx.input.image = readImage(ctx.readLayerContext, assetPath); } - return false; + getShaderInputValue(shader, AdobeTokens->wrapS, ctx.input.wrapS); + getShaderInputValue(shader, AdobeTokens->wrapT, ctx.input.wrapT); + getShaderInputValue(shader, AdobeTokens->minFilter, ctx.input.minFilter); + getShaderInputValue(shader, AdobeTokens->magFilter, ctx.input.magFilter); + getShaderInputValue(shader, AdobeTokens->scale, ctx.input.scale); + getShaderInputValue(shader, AdobeTokens->bias, ctx.input.bias); + getShaderInputValue(shader, AdobeTokens->sourceColorSpace, ctx.input.colorspace); + + // Default to 0th UVs unless overridden in handlePrimvarReader + ctx.input.uvIndex = 0; + + // The name of the output on the texture reader determines which channel(s) of the texture we + // read. + ctx.input.channel = shaderOutput.GetBaseName(); + + return followConnectedInput(ctx, shader, AdobeTokens->st); } -// Fetches the first value-producing attribute connected to a given shader input. -// If 'expectShader' is true, verify that the connected source is a shader and that the connection -// exists. Returns true and sets outAttribute if a suitable attribute is found. +// These handlers are used both for UsdPreviewSurface networks and also ASM networks +const ShaderHandlerMappings usdPreviewSurfaceHandlers = { + { { AdobeTokens->UsdUVTexture }, handleUsdUVTexture }, + { { AdobeTokens->UsdTransform2d }, handleUsdTransform2d, kOptional }, + { { AdobeTokens->UsdPrimvarReader_float2 }, handleUsdPrimvarReader } +}; + +// ------------------------------------------------------------------------------------------------- + bool -fetchPrimaryConnectedAttribute(const UsdShadeInput& shadeInput, - UsdAttribute& outAttribute, - bool expectShader) +readUsdPreviewSurfaceMaterial(ReadLayerContext& ctx, + OpenPbrMaterial& material, + const UsdShadeShader& surface) { - if (expectShader) { - if (!shadeInput.HasConnectedSource()) { - TF_WARN("Input %s has no connected source.", shadeInput.GetFullName().GetText()); - return false; - } - } - UsdShadeAttributeVector attrs = shadeInput.GetValueProducingAttributes(); - if (attrs.empty()) { + TfToken shaderId; + surface.GetShaderId(&shaderId); + if (shaderId != AdobeTokens->UsdPreviewSurface) { return false; } - if (attrs.size() > 1) { - TF_WARN("Input %s is connected to multiple producing attributes, only the first will be " - "processed.", - shadeInput.GetFullName().GetText()); - } - outAttribute = attrs[0]; - if (expectShader) { - UsdShadeAttributeType attrType = UsdShadeUtils::GetType(outAttribute.GetName()); - if (attrType == UsdShadeAttributeType::Input) { - TF_WARN("Input %s is connected to an attribute that is not a shader.", - shadeInput.GetFullName().GetText()); - return false; - } - } - return true; + + int useSpecularWorkflow = 0; + getShaderInputValue(surface, UsdPreviewSurfaceTokens->useSpecularWorkflow, useSpecularWorkflow); + material.useSpecularWorkflow = useSpecularWorkflow != 0; + getShaderInputValue( + surface, UsdPreviewSurfaceTokens->opacityThreshold, material.opacityThreshold); + + bool success = true; + auto input = [&ctx, &surface, &success](const TfToken& inputName, Input& input) { + InputContext inputContext = { ctx, inputName, usdPreviewSurfaceHandlers, input }; + success &= readSurfaceInput(inputContext, surface); + }; + input(UsdPreviewSurfaceTokens->diffuseColor, material.base_color); + input(UsdPreviewSurfaceTokens->emissiveColor, material.emission_color); + input(UsdPreviewSurfaceTokens->specularColor, material.specular_color); + input(UsdPreviewSurfaceTokens->normal, material.geometry_normal); + input(UsdPreviewSurfaceTokens->metallic, material.base_metalness); + input(UsdPreviewSurfaceTokens->roughness, material.specular_roughness); + input(UsdPreviewSurfaceTokens->clearcoat, material.coat_weight); + input(UsdPreviewSurfaceTokens->clearcoatRoughness, material.coat_roughness); + input(UsdPreviewSurfaceTokens->opacity, material.geometry_opacity); + input(UsdPreviewSurfaceTokens->displacement, material.displacement); + input(UsdPreviewSurfaceTokens->occlusion, material.occlusion); + input(UsdPreviewSurfaceTokens->ior, material.specular_ior); + + return success; } -// Handle texture-related shader inputs such as file paths and wrapping modes. -void -handleTextureShader(ReadLayerContext& ctx, const UsdShadeShader& shader, Input& input) +bool +readASMMaterial(ReadLayerContext& ctx, OpenPbrMaterial& material, const UsdShadeShader& surface) { - SdfAssetPath assetPath; - if (getShaderInputValue(shader, AdobeTokens->file, assetPath)) { - readImage(ctx, assetPath, input.image); + TfToken shaderId; + surface.GetShaderId(&shaderId); + if (shaderId != AdobeTokens->adobeStandardMaterial) { + return false; } - getShaderInputValue(shader, AdobeTokens->wrapS, input.wrapS); - getShaderInputValue(shader, AdobeTokens->wrapT, input.wrapT); - getShaderInputValue(shader, AdobeTokens->minFilter, input.minFilter); - getShaderInputValue(shader, AdobeTokens->magFilter, input.magFilter); - getShaderInputValue(shader, AdobeTokens->scale, input.scale); - getShaderInputValue(shader, AdobeTokens->bias, input.bias); - getShaderInputValue(shader, AdobeTokens->sourceColorSpace, input.colorspace); - // Default to 0th UVs unless overridden in handlePrimvarReader - input.uvIndex = 0; + // Note, we currently only support fixed values for normalScale. No texture support. + bool scatter = false; + getShaderInputValue(surface, AsmTokens->scatter, scatter); + getShaderInputValue(surface, AsmTokens->normalScale, material.normalScale); + + bool success = true; + auto input = [&ctx, &surface, &success](const TfToken& inputName, Input& input) { + InputContext inputContext = { ctx, inputName, usdPreviewSurfaceHandlers, input }; + success &= readSurfaceInput(inputContext, surface); + }; + input(AsmTokens->baseColor, material.base_color); + input(AsmTokens->roughness, material.specular_roughness); + input(AsmTokens->metallic, material.base_metalness); + input(AsmTokens->opacity, material.geometry_opacity); + input(AsmTokens->specularLevel, material.specular_weight); + input(AsmTokens->specularEdgeColor, material.specular_color); + input(AsmTokens->normal, material.geometry_normal); + input(AsmTokens->height, material.displacement); + input(AsmTokens->anisotropyLevel, material.specular_roughness_anisotropy); + input(AsmTokens->anisotropyAngle, material.anisotropyAngle); + input(AsmTokens->emissiveIntensity, material.emission_luminance); + input(AsmTokens->emissive, material.emission_color); + input(AsmTokens->sheenOpacity, material.fuzz_weight); + input(AsmTokens->sheenColor, material.fuzz_color); + input(AsmTokens->sheenRoughness, material.fuzz_roughness); + input(AsmTokens->translucency, material.transmission_weight); + input(AsmTokens->IOR, material.specular_ior); + input(AsmTokens->absorptionColor, material.transmission_color); + input(AsmTokens->absorptionDistance, material.transmission_depth); + if (scatter) { + material.subsurface_weight = Input{ VtValue(1.0f) }; + input(AsmTokens->scatteringColor, material.subsurface_color); + input(AsmTokens->scatteringDistance, material.subsurface_radius); + input(AsmTokens->scatteringDistanceScale, material.subsurface_radius_scale); + } + input(AsmTokens->coatOpacity, material.coat_weight); + input(AsmTokens->coatColor, material.coat_color); + input(AsmTokens->coatRoughness, material.coat_roughness); + input(AsmTokens->coatIOR, material.coat_ior); + input(AsmTokens->coatNormal, material.geometry_coat_normal); + + // Non-OpenPBR inputs + input(AsmTokens->coatSpecularLevel, material.coatSpecularLevel); + input(AsmTokens->ambientOcclusion, material.occlusion); + input(AsmTokens->volumeThickness, material.volumeThickness); + + material.useSpecularWorkflow = _readUseSpecularWorkflow(surface); + material.opacityThreshold = _readOpacityThreshold(surface); + material.clearcoatModelsTransmissionTint = _readClearcoatModelsTransmissionTint(surface); + material.isUnlit = _readUnlit(surface); + + return success; } -UsdShadeShader -handleTransformShader(ReadLayerContext& ctx, const UsdShadeShader& shader, Input& input) +// ------------------------------------------------------------------------------------------------- +// OpenPBR/MaterialX network node handlers +// +// Note: that we use a MaterialX network with its nodes and have an OpenPBR surface node. +// We only support a specific node subset and topology that we parse here. We expect that each input +// on the surface can either use a constant value or a simple linear chain of nodes to read a +// texture value: +// +// TexCoords (ND_texcoord_vector2) +// | +// V +// TexCoordXform (ND_place2d_vector2) [OPTIONAL] +// | +// V +// TexRead (ND_image_vector4, ND_image_color3, ND_image_vector3, ND_UsdUVTexture_23) +// | +// V +// Convert (ND_convert_color3_vector3) (* only with ND_UsdUVTexture_23 and ND_normalmap) [OPTIONAL*] +// | +// V +// Normalmap (ND_normalmap) (* only with geometry_normal and geometry_coat_normal) [OPTIONAL*] +// | +// V +// ChannelSelect (ND_separate4_vector4) (* only float input w/ ND_image_vector4) [OPTIONAL*] +// | +// V +// Scale (ND_multiply_float, ND_multiply_color3, ND_multiply_vector3) [OPTIONAL] +// | +// V +// Bias (ND_add_float, ND_add_color3, ND_add_vector3) [OPTIONAL] +// | +// V +// AmbientOcclusionBaseColor (ND_mix_color3) [OPTIONAL] +// | +// V +// OpenPBR Surface (ND_open_pbr_surface_surfaceshader) +// +// ------------------------------------------------------------------------------------------------- + +bool +handleTexcoordVector2(InputContext& ctx, const UsdShadeOutput& shaderOutput) { + UsdShadeShader shader(shaderOutput.GetPrim()); - UsdShadeShader nextShader; - getShaderInputValue(shader, AdobeTokens->rotation, input.uvRotation); - getShaderInputValue(shader, AdobeTokens->scale, input.uvScale); - getShaderInputValue(shader, AdobeTokens->translation, input.uvTranslation); + TfToken shaderId; + shader.GetShaderId(&shaderId); + if (shaderId == MtlXTokens->ND_texcoord_vector2) { + // Note, we have no information on how to map this index to a name of a texcoord primvar + ctx.input.uvIndex = 0; + getShaderInputValue(shader, AdobeTokens->index, ctx.input.uvIndex); - UsdShadeInput stInputCoordReader = shader.GetInput(AdobeTokens->in); - UsdAttribute stSourcesInner; - if (fetchPrimaryConnectedAttribute(stInputCoordReader, stSourcesInner, true)) { - nextShader = UsdShadeShader(stSourcesInner.GetPrim()); + return true; + } else if (shaderId == MtlXTokens->ND_geompropvalue_vector2) { + // try to map the geomprop to a uv index + int index = 0; + TfToken geomprop; + std::string geompropStr; + if (getShaderInputValue(shader, MtlXTokens->geomprop, geompropStr)) { + index = getSTPrimvarTokenIndex(TfToken(geompropStr)); + } else if (getShaderInputValue(shader, MtlXTokens->geomprop, geomprop)) { + index = getSTPrimvarTokenIndex(geomprop); + } + ctx.input.uvIndex = index; + return true; } - return nextShader; + return false; } -void -handlePrimvarReader(ReadLayerContext& ctx, const UsdShadeShader& shader, Input& input) +bool +handlePlace2dVector2(InputContext& ctx, const UsdShadeOutput& shaderOutput) { - TfToken texCoordPrimvar; - std::string texCoordPrimvarStr; - getShaderInputValue(shader, AdobeTokens->varname, texCoordPrimvarStr); - - // Supports both string and token type values for the varname - // string is the correct type, but token was added to support slightly - // incorrect assets. - if (!texCoordPrimvarStr.empty()) { - texCoordPrimvar = TfToken(texCoordPrimvarStr); - } else { - getShaderInputValue(shader, AdobeTokens->varname, texCoordPrimvar); - } - int uvIndex = getSTPrimvarTokenIndex(texCoordPrimvar); - if (uvIndex >= 0) { - input.uvIndex = uvIndex; - } else { - TF_WARN("Texture reader %s is reading primvar %s. Only 'st' or 'st1'..'stN' is supported", - shader.GetPrim().GetPath().GetText(), - texCoordPrimvar.GetText()); - } + UsdShadeShader shader(shaderOutput.GetPrim()); + + getShaderInputValue(shader, AdobeTokens->rotate, ctx.input.uvRotation); + GfVec2f scale(1.0f); + getShaderInputValue(shader, AdobeTokens->scale, scale); + // For the place2d node, the scale is not a multiplier, but the overall scale and so we need to + // invert the value + ctx.input.uvScale[0] = scale[0] != 0.0f ? 1.0f / scale[0] : 0.0f; + ctx.input.uvScale[1] = scale[1] != 0.0f ? 1.0f / scale[1] : 0.0f; + getShaderInputValue(shader, AdobeTokens->offset, ctx.input.uvTranslation); + + return followConnectedInput(ctx, shader, AdobeTokens->texcoord); } -void -readInput(ReadLayerContext& ctx, const UsdShadeShader& surface, const TfToken& name, Input& input) +bool +handleImage(InputContext& ctx, const UsdShadeOutput& shaderOutput) { - UsdShadeInput shadeInput = surface.GetInput(name); - if (!shadeInput) { - return; + UsdShadeShader shader(shaderOutput.GetPrim()); + + SdfAssetPath assetPath; + if (getShaderInputValue(shader, AdobeTokens->file, assetPath)) { + ctx.input.image = readImage(ctx.readLayerContext, assetPath); + + UsdShadeInput fileInput = shader.GetInput(AdobeTokens->file); + if (fileInput) { + TfToken mtlxColorSpace = fileInput.GetAttr().GetColorSpace(); + ctx.input.colorspace = + mtlxColorSpace == MtlXTokens->srgb_texture ? AdobeTokens->sRGB : AdobeTokens->raw; + } } - UsdAttribute attr; - if (fetchPrimaryConnectedAttribute(shadeInput, attr, false)) { - UsdShadeSourceInfoVector sources = shadeInput.GetConnectedSources(); + TfToken shaderId; + shader.GetShaderId(&shaderId); + if (shaderId == MtlXTokens->ND_UsdUVTexture_23) { + // The name of the output on the texture reader determines which channel(s) of the texture + // we read. + ctx.input.channel = shaderOutput.GetBaseName(); - // Attempt to retrieve the constant value from the attribute. - auto [shadingAttrName, attrType] = UsdShadeUtils::GetBaseNameAndType(attr.GetName()); - if (attrType == UsdShadeAttributeType::Input) { - if (!attr.Get(&input.value)) { - TF_WARN("Failed to get constant value for input %s", name.GetText()); - return; + } else if (shaderId == MtlXTokens->ND_image_color3 || + shaderId == MtlXTokens->ND_image_vector3) { + ctx.input.channel = AdobeTokens->rgb; + } else { + // Note, if a single float channel is read via a ND_image_vector4 node, which is then + // followed by a ND_separate4_vector4 node to extract one out of 4 RGBA channels, then the + // handler for that node will set input.channel to the appropriate value + } + + if (shaderId == MtlXTokens->ND_UsdUVTexture_23) { + GfVec4f defaultValue; + if (getShaderInputValue(shader, AdobeTokens->fallback, defaultValue)) { + if (ctx.input.channel == AdobeTokens->r) { + ctx.input.value = defaultValue[0]; + } else if (ctx.input.channel == AdobeTokens->g) { + ctx.input.value = defaultValue[1]; + } else if (ctx.input.channel == AdobeTokens->b) { + ctx.input.value = defaultValue[2]; + } else if (ctx.input.channel == AdobeTokens->a) { + ctx.input.value = defaultValue[3]; + } else if (ctx.input.channel == AdobeTokens->rgb) { + ctx.input.value = GfVec3f(defaultValue[0], defaultValue[1], defaultValue[2]); + } else { + TF_WARN("ND_UsdUVTexture_23 node at %s has a default value, but the channel is not " + "valid: '%s' (input %s)", + shader.GetPath().GetText(), + ctx.input.channel.GetText(), + ctx.surfaceInputName.GetText()); } - } else { - // Process the shader connected to this attribute - UsdShadeShader connectedShader(attr.GetPrim()); - TfToken shaderId; - connectedShader.GetShaderId(&shaderId); - - if (shaderId == AdobeTokens->UsdUVTexture) { - handleTextureShader(ctx, connectedShader, input); - - UsdShadeInput stInput = connectedShader.GetInput(AdobeTokens->st); - - // The name of the output on the texture reader determines which channel(s) of the - // texture we read. - input.channel = shadingAttrName; - - // Process the connected source of the 'st' input. - if (fetchPrimaryConnectedAttribute(stInput, attr, true)) { - VtValue srcValue; - if (attr.Get(&srcValue)) { - TF_WARN( - "Texture read shader does not support a fixed UV value for input %s", - name.GetText()); - } else { - // Handle the shader connected to the UV coordinate. - UsdShadeShader stShader(attr.GetPrim()); - stShader.GetShaderId(&shaderId); - - if (shaderId == AdobeTokens->UsdTransform2d) { - UsdShadeShader nextShader = handleTransformShader(ctx, stShader, input); - if (nextShader) { - stShader = nextShader; - stShader.GetShaderId(&shaderId); - } - } - - // This is not an "else if", since we can move the stShader - // if we encounter a UV transform. - if (shaderId == AdobeTokens->UsdPrimvarReader_float2) { - handlePrimvarReader(ctx, stShader, input); - } else { - TF_WARN("Unsupported shader type %s for UV input %s", - shaderId.GetText(), - name.GetText()); - } - } - } else { - TF_WARN("Failed to fetch connected attribute for UV input %s", name.GetText()); - } + } + } else if (shaderId == MtlXTokens->ND_image_color3 || + shaderId == MtlXTokens->ND_image_vector3) { + GfVec3f defaultValue; + if (getShaderInputValue(shader, AdobeTokens->defaultValue, defaultValue)) { + ctx.input.value = defaultValue; + } + } else if (shaderId == MtlXTokens->ND_image_vector4) { + GfVec4f defaultValue; + if (getShaderInputValue(shader, AdobeTokens->defaultValue, defaultValue)) { + // The ND_image_vector4 node is used to read a texture as RGBA and then extract a single + // channel. So the default value has to extract the same thing. + // Note, that the channel should have been set by the handleSeparate4Vector4() + // function. + if (ctx.input.channel == AdobeTokens->r) { + ctx.input.value = defaultValue[0]; + } else if (ctx.input.channel == AdobeTokens->g) { + ctx.input.value = defaultValue[1]; + } else if (ctx.input.channel == AdobeTokens->b) { + ctx.input.value = defaultValue[2]; + } else if (ctx.input.channel == AdobeTokens->a) { + ctx.input.value = defaultValue[3]; } else { - TF_WARN( - "Unsupported shader type %s for input %s", shaderId.GetText(), name.GetText()); + TF_WARN("ND_image_vector4 node at %s has a default value, but the channel is not " + "valid: '%s' (input %s)", + shader.GetPath().GetText(), + ctx.input.channel.GetText(), + ctx.surfaceInputName.GetText()); } } - } else { - // If no connections were found, get the shader's input value directly - if (!getShaderInputValue(surface, name, input.value)) { - TF_WARN("Failed to get input value for %s", name.GetText()); + } + + auto fromMaterialXAddressMode = [](const std::string& addressMode) -> TfToken { + if (addressMode.empty()) { + return TfToken(); + } else if (addressMode == "periodic") { + // "periodic" maps to "repeat", which is also the default. So we suppress it + return TfToken(); + } else if (addressMode == "clamp") { + return AdobeTokens->clamp; + } else if (addressMode == "mirror") { + return AdobeTokens->mirror; + } else if (addressMode == "constant") { + return AdobeTokens->black; + } else { + TF_WARN("Unknown addressmode '%s'", addressMode.c_str()); + return TfToken(); } + }; + + if (shaderId == MtlXTokens->ND_UsdUVTexture_23) { + // The inputs on the node are called wrapS and wrapT, but are using string values like the + // uaddressmode and vaddressmode on other MaterialX texture nodes. + std::string wrapS, wrapT; + getShaderInputValue(shader, AdobeTokens->wrapS, wrapS); + getShaderInputValue(shader, AdobeTokens->wrapT, wrapT); + ctx.input.wrapS = fromMaterialXAddressMode(wrapS); + ctx.input.wrapT = fromMaterialXAddressMode(wrapT); + getShaderInputValue(shader, AdobeTokens->scale, ctx.input.scale); + getShaderInputValue(shader, AdobeTokens->bias, ctx.input.bias); + + if (ctx.surfaceInputName == OpenPbrTokens->geometry_normal || + ctx.surfaceInputName == OpenPbrTokens->geometry_coat_normal) { + // In MaterialX, the ND_normalmap node, which is downstream of the ND_UsdUVTexture_23 + // will decode the normal from the raw texture value, assuming the OpenGL convention, + // using a scale and bias of 2 (kOpenGLNormalTexScale) and -1 (kOpenGLNormalTexBias). + // That means it would be redundant to have this on the ND_UsdUVTexture_23 node. + // + // We still want to have these values in our Input struct, especially if we're trying to + // differentiate it from a DirectX encoded normalmap and/or a normal strength + // multiplier. So we apply the affine transform to the usually neutral scale and bias + // value to recover the expected decoding values. + // + // Note that this mirrors the process in the OpenPBR writing code. + ctx.input.scale = GfCompMult(kOpenGLNormalTexScale, ctx.input.scale); + ctx.input.bias = + GfCompMult(kOpenGLNormalTexScale, ctx.input.bias) + kOpenGLNormalTexBias; + } + + return followConnectedInput(ctx, shader, AdobeTokens->st); + } else { + std::string uaddressmode, vaddressmode; + getShaderInputValue(shader, AdobeTokens->uaddressmode, uaddressmode); + getShaderInputValue(shader, AdobeTokens->vaddressmode, vaddressmode); + ctx.input.wrapS = fromMaterialXAddressMode(uaddressmode); + ctx.input.wrapT = fromMaterialXAddressMode(vaddressmode); + + return followConnectedInput(ctx, shader, AdobeTokens->texcoord); } } bool -readUsdPreviewSurfaceMaterial(ReadLayerContext& ctx, - Material& material, - const UsdShadeShader& surface) +handleConvertColorToVector(InputContext& ctx, const UsdShadeOutput& shaderOutput) { - TfToken infoIdToken; - surface.GetShaderId(&infoIdToken); - if (infoIdToken != AdobeTokens->UsdPreviewSurface) { - return false; - } - - readInput( - ctx, surface, UsdPreviewSurfaceTokens->useSpecularWorkflow, material.useSpecularWorkflow); - readInput(ctx, surface, UsdPreviewSurfaceTokens->diffuseColor, material.diffuseColor); - readInput(ctx, surface, UsdPreviewSurfaceTokens->emissiveColor, material.emissiveColor); - readInput(ctx, surface, UsdPreviewSurfaceTokens->specularColor, material.specularColor); - readInput(ctx, surface, UsdPreviewSurfaceTokens->normal, material.normal); - readInput(ctx, surface, UsdPreviewSurfaceTokens->metallic, material.metallic); - readInput(ctx, surface, UsdPreviewSurfaceTokens->roughness, material.roughness); - readInput(ctx, surface, UsdPreviewSurfaceTokens->clearcoat, material.clearcoat); - readInput( - ctx, surface, UsdPreviewSurfaceTokens->clearcoatRoughness, material.clearcoatRoughness); - readInput(ctx, surface, UsdPreviewSurfaceTokens->opacity, material.opacity); - readInput(ctx, surface, UsdPreviewSurfaceTokens->opacityThreshold, material.opacityThreshold); - readInput(ctx, surface, UsdPreviewSurfaceTokens->displacement, material.displacement); - readInput(ctx, surface, UsdPreviewSurfaceTokens->occlusion, material.occlusion); - readInput(ctx, surface, UsdPreviewSurfaceTokens->ior, material.ior); + UsdShadeShader shader(shaderOutput.GetPrim()); - return true; + return followConnectedInput(ctx, shader, AdobeTokens->in); } bool -_readClearcoatModelsTransmissionTint(const UsdShadeShader& surface) +handleNormalMap(InputContext& ctx, const UsdShadeOutput& shaderOutput) { - bool value = false; - // Check for a custom attribute that carries an indicator where the clearcoat came from - surface.GetPrim().GetAttribute(AdobeTokens->clearcoatModelsTransmissionTint).Get(&value); - return value; + UsdShadeShader shader(shaderOutput.GetPrim()); + + return followConnectedInput(ctx, shader, AdobeTokens->in); } bool -_readUnlit(const UsdShadeShader& surface) +handleAmbientOcclusionBaseColorMap(InputContext& ctx, const UsdShadeOutput& shaderOutput) { - bool value = false; - // Check for a custom attribute that carries an indicator where the clearcoat came from - surface.GetPrim().GetAttribute(AdobeTokens->unlit).Get(&value); - return value; + UsdShadeShader shader(shaderOutput.GetPrim()); + + // create a new input context that reads the 'bg' input of the ND_mix_color3 node + InputContext inputContext = { + ctx.readLayerContext, AdobeTokens->bg, ctx.handlerMappings, ctx.input, ctx.handlerIndex + }; + return readSurfaceInput(inputContext, shader); } bool -readASMMaterial(ReadLayerContext& ctx, Material& material, const UsdShadeShader& surface) +handleAmbientOcclusionMap(InputContext& ctx, const UsdShadeOutput& shaderOutput) { - TfToken infoIdToken; - surface.GetShaderId(&infoIdToken); - if (infoIdToken != AdobeTokens->adobeStandardMaterial) { - return false; - } + UsdShadeShader shader(shaderOutput.GetPrim()); - material.clearcoatModelsTransmissionTint = _readClearcoatModelsTransmissionTint(surface); - material.isUnlit = _readUnlit(surface); + // create a new input context that reads the 'fg' input of the ND_mix_color3 node + InputContext inputContext = { + ctx.readLayerContext, AdobeTokens->fg, ctx.handlerMappings, ctx.input, ctx.handlerIndex + }; + return readSurfaceInput(inputContext, shader); +} - // Note, we currently only support fixed values for emissiveIntensity and sheenOpacity - // No texture support yet. - float emissiveIntensity = 0.0f; - float sheenOpacity = 0.0f; - bool scatter = false; +bool +handleConvertFloatToColor(InputContext& ctx, const UsdShadeOutput& shaderOutput) +{ + UsdShadeShader shader(shaderOutput.GetPrim()); - auto getConstShaderInput = [&](const TfToken& inputName, auto& var) { - VtValue val; - if (getShaderInputValue(surface, inputName, val)) { - if (val.IsHolding>()) { - var = val.UncheckedGet>(); - } + // create a new input context that reads the 'in' input of the ND_convert_float_color3 node + InputContext inputContext = { + ctx.readLayerContext, AdobeTokens->in, ctx.handlerMappings, ctx.input, ctx.handlerIndex + }; + return readSurfaceInput(inputContext, shader); +} + +bool +handleSeparate4Vector4(InputContext& ctx, const UsdShadeOutput& shaderOutput) +{ + UsdShadeShader shader(shaderOutput.GetPrim()); + + auto outputNameToChannelToken = [](const TfToken& outputName) -> TfToken { + if (outputName == AdobeTokens->outx) { + return AdobeTokens->r; + } else if (outputName == AdobeTokens->outy) { + return AdobeTokens->g; + } else if (outputName == AdobeTokens->outz) { + return AdobeTokens->b; + } else if (outputName == AdobeTokens->outw) { + return AdobeTokens->a; } + + TF_WARN("Unknown output name '%s'", outputName.GetText()); + + return AdobeTokens->r; }; - getConstShaderInput(AsmTokens->emissiveIntensity, emissiveIntensity); - getConstShaderInput(AsmTokens->sheenOpacity, sheenOpacity); - getConstShaderInput(AsmTokens->scatter, scatter); - - readInput(ctx, surface, AsmTokens->baseColor, material.diffuseColor); - readInput(ctx, surface, AsmTokens->roughness, material.roughness); - readInput(ctx, surface, AsmTokens->metallic, material.metallic); - readInput(ctx, surface, AsmTokens->opacity, material.opacity); - // Note, this is a specially supported attribute from UsdPreviewSurface that we transport via - // ASM, so that we do not loose this information - readInput(ctx, surface, UsdPreviewSurfaceTokens->opacityThreshold, material.opacityThreshold); - readInput(ctx, surface, AsmTokens->specularLevel, material.specularLevel); - readInput(ctx, surface, AsmTokens->specularEdgeColor, material.specularColor); - readInput(ctx, surface, AsmTokens->normal, material.normal); - readInput(ctx, surface, AsmTokens->normalScale, material.normalScale); - readInput(ctx, surface, AsmTokens->height, material.displacement); - readInput(ctx, surface, AsmTokens->anisotropyLevel, material.anisotropyLevel); - readInput(ctx, surface, AsmTokens->anisotropyAngle, material.anisotropyAngle); - if (emissiveIntensity > 0.0f) { - readInput(ctx, surface, AsmTokens->emissive, material.emissiveColor); - applyInputMult(material.emissiveColor, emissiveIntensity); + // Note, this node goes together with a ND_image_vector4. The handleImage() function will + // not set the channel in that case, so that the channel choice here takes effect. + ctx.input.channel = outputNameToChannelToken(shaderOutput.GetBaseName()); + + return followConnectedInput(ctx, shader, AdobeTokens->in); +} + +bool +handleMultiply(InputContext& ctx, const UsdShadeOutput& shaderOutput) +{ + UsdShadeShader shader(shaderOutput.GetPrim()); + + TfToken shaderId; + shader.GetShaderId(&shaderId); + if (shaderId == MtlXTokens->ND_multiply_float) { + float scale = ctx.input.scale[0]; + getShaderInputValue(shader, AdobeTokens->in1, scale); + ctx.input.scale[0] = scale; + } else if (shaderId == MtlXTokens->ND_multiply_color3 || + shaderId == MtlXTokens->ND_multiply_vector3) { + GfVec3f scale(ctx.input.scale[0], ctx.input.scale[1], ctx.input.scale[2]); + getShaderInputValue(shader, AdobeTokens->in1, scale); + ctx.input.scale[0] = scale[0]; + ctx.input.scale[1] = scale[1]; + ctx.input.scale[2] = scale[2]; + } else { + TF_CODING_ERROR("handleMultiply called for unexpected node of type %s", shaderId.GetText()); + return false; } - if (sheenOpacity > 0.0f) { - readInput(ctx, surface, AsmTokens->sheenColor, material.sheenColor); - // XXX sheenOpacity can't really be multiplied into the color. We currently drop this value + + return followConnectedInput(ctx, shader, AdobeTokens->in2); +} + +bool +handleAdd(InputContext& ctx, const UsdShadeOutput& shaderOutput) +{ + UsdShadeShader shader(shaderOutput.GetPrim()); + + TfToken shaderId; + shader.GetShaderId(&shaderId); + if (shaderId == MtlXTokens->ND_add_float) { + float bias = ctx.input.bias[0]; + getShaderInputValue(shader, AdobeTokens->in1, bias); + ctx.input.bias[0] = bias; + } else if (shaderId == MtlXTokens->ND_add_color3 || shaderId == MtlXTokens->ND_add_vector3) { + GfVec3f bias(ctx.input.bias[0], ctx.input.bias[1], ctx.input.bias[2]); + getShaderInputValue(shader, AdobeTokens->in1, bias); + ctx.input.bias[0] = bias[0]; + ctx.input.bias[1] = bias[1]; + ctx.input.bias[2] = bias[2]; + } else { + TF_CODING_ERROR("handleAdd called for unexpected node of type %s", shaderId.GetText()); + return false; } - readInput(ctx, surface, AsmTokens->sheenRoughness, material.sheenRoughness); - readInput(ctx, surface, AsmTokens->translucency, material.transmission); - readInput(ctx, surface, AsmTokens->IOR, material.ior); - readInput(ctx, surface, AsmTokens->absorptionColor, material.absorptionColor); - readInput(ctx, surface, AsmTokens->absorptionDistance, material.absorptionDistance); - if (scatter) { - readInput(ctx, surface, AsmTokens->scatteringColor, material.scatteringColor); - readInput(ctx, surface, AsmTokens->scatteringDistance, material.scatteringDistance); - readInput(ctx, surface, AsmTokens->scatteringDistanceScale, material.scatteringDistanceScale); + + return followConnectedInput(ctx, shader, AdobeTokens->in2); +} + +// Note, we currently can't express that a normal input should have a ND_normalmap, but must not +// have a ND_separate4_vector4 node. Or that a float input needs a ND_separate4_vector4 followed by +// a ND_image_vector4 or just a ND_ND_UsdUVTexture_23 node. These could be modeled by different +// handler mappings and then switching depending on the surface input. + +// clang-format off +const ShaderHandlerMappings materialXHandlers = { + { { MtlXTokens->ND_normalmap }, + handleNormalMap, + kOptional }, + { { MtlXTokens->ND_mix_color3 }, + handleAmbientOcclusionBaseColorMap, + kOptional }, + { { MtlXTokens->ND_convert_color3_vector3 }, + handleConvertColorToVector, + kOptional }, + { { MtlXTokens->ND_add_float, MtlXTokens->ND_add_color3, MtlXTokens->ND_add_vector3 }, + handleAdd, + kOptional }, + { { MtlXTokens->ND_multiply_float, MtlXTokens->ND_multiply_color3, MtlXTokens->ND_multiply_vector3 }, + handleMultiply, + kOptional }, + { { MtlXTokens->ND_separate4_vector4 }, + handleSeparate4Vector4, + kOptional }, + { { MtlXTokens->ND_UsdUVTexture_23, MtlXTokens->ND_image_vector4, MtlXTokens->ND_image_color3, + MtlXTokens->ND_image_vector3 }, + handleImage }, + { { MtlXTokens->ND_place2d_vector2 }, + handlePlace2dVector2, kOptional }, + { { MtlXTokens->ND_texcoord_vector2, MtlXTokens->ND_geompropvalue_vector2 }, + handleTexcoordVector2 } +}; + +// This is a custom handler sequence to handle ambient occlusion input connections to base color +const ShaderHandlerMappings materialXAmbientOcclusionHandlers = { + { { MtlXTokens->ND_mix_color3 }, + handleAmbientOcclusionMap }, + { { MtlXTokens->ND_convert_float_color3 }, + handleConvertFloatToColor }, + { { MtlXTokens->ND_UsdUVTexture_23, MtlXTokens->ND_image_vector4, MtlXTokens->ND_image_color3, + MtlXTokens->ND_image_vector3 }, + handleImage }, + { { MtlXTokens->ND_place2d_vector2 }, + handlePlace2dVector2, kOptional }, + { { MtlXTokens->ND_texcoord_vector2, MtlXTokens->ND_geompropvalue_vector2 }, + handleTexcoordVector2 } +}; +// clang-format on + +// ------------------------------------------------------------------------------------------------- + +bool +readOpenPbrMaterial(ReadLayerContext& ctx, OpenPbrMaterial& material, const UsdShadeShader& surface) +{ + TfToken shaderId; + surface.GetShaderId(&shaderId); + if (shaderId != MtlXTokens->ND_open_pbr_surface_surfaceshader) { + return false; } - readInput(ctx, surface, AsmTokens->coatOpacity, material.clearcoat); - readInput(ctx, surface, AsmTokens->coatColor, material.clearcoatColor); - readInput(ctx, surface, AsmTokens->coatRoughness, material.clearcoatRoughness); - readInput(ctx, surface, AsmTokens->coatIOR, material.clearcoatIor); - readInput(ctx, surface, AsmTokens->coatSpecularLevel, material.clearcoatSpecular); - readInput(ctx, surface, AsmTokens->coatNormal, material.clearcoatNormal); - readInput(ctx, surface, AsmTokens->ambientOcclusion, material.occlusion); - readInput(ctx, surface, AsmTokens->volumeThickness, material.volumeThickness); - return true; + bool success = true; + auto input = [&ctx, &surface, &success]( + const TfToken& inputName, Input& input, const ShaderHandlerMappings& handlers) { + InputContext inputContext = { ctx, inputName, handlers, input }; + bool result = readSurfaceInput(inputContext, surface); + if (!result) { + TF_WARN("Failed to read input %s on OpenPBR surface %s", + inputName.GetText(), + surface.GetPath().GetText()); + success = false; + } + }; + +#define INPUT(x) input(OpenPbrTokens->x, material.x, materialXHandlers); + INPUT(base_weight) + INPUT(base_color) + INPUT(base_diffuse_roughness) + INPUT(base_metalness) + INPUT(specular_weight) + INPUT(specular_color) + INPUT(specular_roughness) + INPUT(specular_ior) + INPUT(specular_roughness_anisotropy) + INPUT(transmission_weight) + INPUT(transmission_color) + INPUT(transmission_depth) + INPUT(transmission_scatter) + INPUT(transmission_scatter_anisotropy) + INPUT(transmission_dispersion_scale) + INPUT(transmission_dispersion_abbe_number) + INPUT(subsurface_weight) + INPUT(subsurface_color) + INPUT(subsurface_radius) + INPUT(subsurface_radius_scale) + INPUT(subsurface_scatter_anisotropy) + INPUT(fuzz_weight) + INPUT(fuzz_color) + INPUT(fuzz_roughness) + INPUT(coat_weight) + INPUT(coat_color) + INPUT(coat_roughness) + INPUT(coat_roughness_anisotropy) + INPUT(coat_ior) + INPUT(coat_darkening) + INPUT(thin_film_weight) + INPUT(thin_film_thickness) + INPUT(thin_film_ior) + INPUT(emission_luminance) + INPUT(emission_color) + INPUT(geometry_opacity) + INPUT(geometry_thin_walled) + INPUT(geometry_normal) + INPUT(geometry_coat_normal) + INPUT(geometry_tangent) + INPUT(geometry_coat_tangent) +#undef INPUT + + // handle collecting the ambient occlusion input by following the base_color input but using a + // differnt set of handlers to control the shade path traversal + input(OpenPbrTokens->base_color, material.occlusion, materialXAmbientOcclusionHandlers); + + // Non-OpenPBR inputs + input(UsdPreviewSurfaceTokens->displacement, material.displacement, materialXHandlers); + input(AsmTokens->anisotropyAngle, material.anisotropyAngle, materialXHandlers); + input(AsmTokens->coatSpecularLevel, material.coatSpecularLevel, materialXHandlers); + input(AsmTokens->volumeThickness, material.volumeThickness, materialXHandlers); + material.normalScale = _readNormalScale(surface); + material.useSpecularWorkflow = _readUseSpecularWorkflow(surface); + material.opacityThreshold = _readOpacityThreshold(surface); + material.clearcoatModelsTransmissionTint = _readClearcoatModelsTransmissionTint(surface); + material.isUnlit = _readUnlit(surface); + + return success; } +// ------------------------------------------------------------------------------------------------- + bool -readMaterial(ReadLayerContext& ctx, const UsdPrim& prim, int parent) +readMaterial(ReadLayerContext& ctx, const UsdPrim& prim) { - auto [materialIndex, material] = ctx.usd->addMaterial(); - ctx.materials[prim.GetPath().GetString()] = materialIndex; + OpenPbrMaterial material; material.name = prim.GetPath().GetName(); material.displayName = prim.GetDisplayName(); + UsdShadeMaterial usdMaterial(prim); - // We give preference to the Adobe ASM surface, if present, and fallback to the standard - // UsdPreviewSurface - UsdShadeShader surface = usdMaterial.ComputeSurfaceSource({ AdobeTokens->adobe }); - bool success = false; - if (surface) { + // We have a priority order of surface types: + // 1. OpenPBR/MaterialX (mtlx) + // 2. ASM (adobe) + // 3. UsdPreviewSurface (the universal fallback) + UsdShadeShader surface = + usdMaterial.ComputeSurfaceSource({ MtlXTokens->mtlx, AdobeTokens->adobe }); + if (!surface) { + TF_WARN("No surface shader for material %s", prim.GetPath().GetText()); + return false; + } + + bool success = readOpenPbrMaterial(ctx, material, surface); + if (!success) { success = readASMMaterial(ctx, material, surface); if (!success) { success = readUsdPreviewSurfaceMaterial(ctx, material, surface); } - } else { - TF_WARN("No surface shader for material %s", prim.GetPath().GetText()); } - printMaterial("layer::read", prim.GetPath(), material, ctx.debugTag); + // Question: when the reading fails, should the material be removed from the UsdData? + // Currently we keep a partially parsed Material in there. + auto [materialIndex, outputMaterial] = ctx.usd->addMaterial(); + ctx.materials[prim.GetPath().GetString()] = materialIndex; + outputMaterial = mapOpenPbrMaterialStructToMaterialStruct(material); + + printMaterial("layer::read", prim.GetPath(), outputMaterial, ctx.debugTag); return success; } diff --git a/utils/src/layerReadMaterialUtils.cpp b/utils/src/layerReadMaterialUtils.cpp new file mode 100644 index 00000000..81d6c426 --- /dev/null +++ b/utils/src/layerReadMaterialUtils.cpp @@ -0,0 +1,261 @@ +/* +Copyright 2025 Adobe. All rights reserved. +This file is licensed to you under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. You may obtain a copy +of the License at http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under +the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS +OF ANY KIND, either express or implied. See the License for the specific language +governing permissions and limitations under the License. +*/ +#include + +#include +#include + +#include +#include +#include + +PXR_NAMESPACE_USING_DIRECTIVE + +namespace adobe::usd { + +// Fetches the first value-producing attribute connected to a given shader input. +// If 'expectShader' is true, verify that the connected source is a shader and that the connection +// exists. Returns true and sets outAttribute if a suitable attribute is found. +bool +_fetchPrimaryConnectedAttribute(const UsdShadeInput& shadeInput, + UsdAttribute& outAttribute, + bool expectShader) +{ + if (expectShader) { + if (!shadeInput.HasConnectedSource()) { + TF_WARN("Input %s has no connected source.", shadeInput.GetAttr().GetPath().GetText()); + return false; + } + } + UsdShadeAttributeVector attrs = shadeInput.GetValueProducingAttributes(); + if (attrs.empty()) { + return false; + } + if (attrs.size() > 1) { + TF_WARN("Input %s is connected to multiple producing attributes, only the first will be " + "processed.", + shadeInput.GetAttr().GetPath().GetText()); + } + outAttribute = attrs.front(); + if (expectShader) { + if (UsdShadeInput::IsInput(outAttribute)) { + TF_WARN("Input %s is connected to an attribute that is not a shader output.", + shadeInput.GetAttr().GetPath().GetText()); + return false; + } + } + return true; +} + +// Given an InputContext and a shader output, find the right handler based on the type of the shader +// node and call that handler. Return false if the output was not valid, a handler could not be +// found or the upstream handling failed. +bool +_handleShader(InputContext& ctx, const UsdShadeOutput& shaderOutput) +{ + UsdShadeShader shader(shaderOutput.GetPrim()); + if (!shader) { + TF_WARN("Prim %s is not a shader prim (input %s)", + shader.GetPath().GetText(), + ctx.surfaceInputName.GetText()); + return false; + } + + TfToken shaderId; + shader.GetShaderId(&shaderId); + + TF_DEBUG_MSG( + FILE_FORMAT_UTIL, "Handle shader %s at %s", shaderId.GetText(), shader.GetPath().GetText()); + + if (ctx.handlerIndex >= ctx.handlerMappings.size()) { + TF_CODING_ERROR("handlerIndex out of range"); + return false; + } + + const uint32_t numHandlers = ctx.handlerMappings.size(); + for (; ctx.handlerIndex < numHandlers; ++ctx.handlerIndex) { + const ShaderHandlerMapping& handlerMapping = ctx.handlerMappings[ctx.handlerIndex]; + for (const TfToken& handlerId : handlerMapping.nodeNames) { + if (handlerId == shaderId) { + // Advance the index, now that we've found this handler + ctx.handlerIndex++; + return handlerMapping.handler(ctx, shaderOutput); + } + } + + // We can't continue over a non-optional node + if (!handlerMapping.isOptional) { + TF_WARN( + "Expected shader of type %s (or equivalent) but got %s for prim at %s (input %s)", + handlerMapping.nodeNames[0].GetText(), + shaderId.GetText(), + shader.GetPath().GetText(), + ctx.surfaceInputName.GetText()); + return false; + } + } + + TF_WARN("Unexpected shader of type %s for prim at %s (input %s)", + shaderId.GetText(), + shader.GetPath().GetText(), + ctx.surfaceInputName.GetText()); + + return false; +} + +bool +readSurfaceInput(InputContext& ctx, const UsdShadeShader& surface) +{ + UsdShadeInput shadeInput = surface.GetInput(ctx.surfaceInputName); + if (!shadeInput) { + return true; + } + + // fetchPrimaryConnectedAttribute will return the current shadeInput as an attribute if there is + // no connection, but the attribute exists + UsdAttribute attr; + if (_fetchPrimaryConnectedAttribute(shadeInput, attr, false)) { + if (UsdShadeInput::IsInput(attr)) { + // Attempt to retrieve the constant value from the attribute. Not having a value is the + // same as the input attribute not existing + attr.Get(&ctx.input.value); + } else { + return _handleShader(ctx, UsdShadeOutput(attr)); + } + } + + return true; +} + +bool +followConnectedInput(InputContext& ctx, const UsdShadeShader& shader, const TfToken& inputName) +{ + UsdShadeInput input = shader.GetInput(inputName); + if (!input) { + TF_WARN("No input %s on node %s (input %s)", + inputName.GetText(), + shader.GetPath().GetText(), + ctx.surfaceInputName.GetText()); + return false; + } + + UsdAttribute attr; + if (_fetchPrimaryConnectedAttribute(input, attr, true)) { + return _handleShader(ctx, UsdShadeOutput(attr)); + } else { + TF_WARN("Expected valid shader input on %s for node %s (input %s)", + inputName.GetText(), + shader.GetPath().GetText(), + ctx.surfaceInputName.GetText()); + return false; + } +} + +// Populates the absolute path, base name, and sanitized extension for an SBSAR asset by resolving +// the absolute path from the provided URI. +void +_populatePathPartsFromAssetPath(const SdfAssetPath& path, + std::string& resolvedAssetPath, + std::string& filePath, + std::string& name, + std::string& extension, + bool warnAboutUnresolvedAssets) +{ + // Make sure we have a resolved path, either coming from SdfAssetPath value or by running it + // throught the resolver. + resolvedAssetPath = path.GetResolvedPath(); + if (resolvedAssetPath.empty()) { + resolvedAssetPath = ArGetResolver().Resolve(path.GetAssetPath()); + if (resolvedAssetPath.empty()) { + // As a fallback we continue with the unresolved path + resolvedAssetPath = path.GetAssetPath(); + if (warnAboutUnresolvedAssets) { + TF_WARN("Continuing with unresolved path '%s'", resolvedAssetPath.c_str()); + } + } + } + + // This will extract the inner most path to the asset: + // path/to/package.usdz[path/to/image.png] -> path/to/image.png + std::string innerAssetPath = getLayerFilePath(resolvedAssetPath); + // This helper function will detect "funky" paths, like those to SBSAR images and convert them + // to good usable file paths + filePath = extractFilePathFromAssetPath(innerAssetPath); + // Strip the path part since we only want the filename and the extension + std::string baseName = TfGetBaseName(filePath); + name = TfStringGetBeforeSuffix(baseName); + extension = TfGetExtension(baseName); +} + +int +readImage(ReadLayerContext& ctx, const SdfAssetPath& assetPath) +{ + std::string resolvedAssetPath, filePath, name, extension; + _populatePathPartsFromAssetPath( + assetPath, resolvedAssetPath, filePath, name, extension, ctx.warnAboutMissingAssets); + + // Check in the cache if we've processed this image before + if (const auto& it = ctx.images.find(resolvedAssetPath); it != ctx.images.end()) { + TF_DEBUG_MSG(FILE_FORMAT_UTIL, + "%s: Image (cached): %s\n", + ctx.debugTag.c_str(), + resolvedAssetPath.c_str()); + return it->second; + } + + // The image is new. Make sure we don't get name collisions in the short name + if (const auto& itName = ctx.imageNames.find(name); itName != ctx.imageNames.end()) { + itName->second++; + name += "_" + std::to_string(itName->second); + TF_DEBUG_MSG(FILE_FORMAT_UTIL, + "%s: Deduplicated image name: %s\n", + ctx.debugTag.c_str(), + name.c_str()); + } else { + ctx.imageNames[name] = 1; + } + + auto [imageIndex, image] = ctx.usd->addImage(); + if (extension == "sbsarimage") { + // SBSAR images are a special cases where the data is stored raw and must be transcoded to a + // different image in memory + extension = getSbsarImageExtension(resolvedAssetPath); + transcodeImageAssetToMemory(resolvedAssetPath, image.uri, image.image); + } else { + auto asset = ArGetResolver().OpenAsset(ArResolvedPath(resolvedAssetPath)); + if (asset) { + image.image.resize(asset->GetSize()); + memcpy(image.image.data(), asset->GetBuffer().get(), asset->GetSize()); + } else { + if (ctx.warnAboutMissingAssets) { + TF_WARN("%s: Unable to open asset: %s\n", + ctx.debugTag.c_str(), + resolvedAssetPath.c_str()); + } + } + } + + image.name = name; + image.uri = filePath; + image.format = getFormat(extension); + ctx.images[resolvedAssetPath] = imageIndex; + + TF_DEBUG_MSG(FILE_FORMAT_UTIL, + "%s: Image (new): index: %d uri: %s\n", + ctx.debugTag.c_str(), + imageIndex, + resolvedAssetPath.c_str()); + + return imageIndex; +} + +} diff --git a/utils/src/layerWriteMaterial.cpp b/utils/src/layerWriteMaterial.cpp index f89bbfc3..8db7f31b 100644 --- a/utils/src/layerWriteMaterial.cpp +++ b/utils/src/layerWriteMaterial.cpp @@ -64,7 +64,7 @@ _createStReader(SdfAbstractData* sdfData, const SdfPath& parentPath, int uvIndex getSTTexCoordReaderToken(uvIndex), AdobeTokens->UsdPrimvarReader_float2, "result", - { { "varname", getSTPrimvarAttrToken(uvIndex) } }, + { { "varname", getSTPrimvarAttrToken(uvIndex).GetString() } }, {}); } @@ -99,6 +99,7 @@ _createTextureReader(SdfAbstractData* sdfData, const TfToken& name, const Input& input, const SdfPath& stResultPath, + const std::string& texturePath, const SdfPath& textureConnection) { // Note, we're setting the texture path directly on this texture reader, which means the @@ -109,7 +110,8 @@ _createTextureReader(SdfAbstractData* sdfData, // attribute on the material and connect all corresponding texture readers to that attribute // value. - // Only emit scale and bias if they are not the default values + // Only emit scale and bias if they are not the default values. Empty values for + // scale/bias will be ignored VtValue scale, bias; if (input.scale != kDefaultTexScale) { scale = input.scale; @@ -117,6 +119,7 @@ _createTextureReader(SdfAbstractData* sdfData, if (input.bias != kDefaultTexBias) { bias = input.bias; } + InputValues inputValues = { { "fallback", _createFallbackValue(input.value) }, { "sourceColorSpace", _checkToken(input.colorspace) }, { "wrapS", _checkToken(input.wrapS) }, @@ -124,7 +127,9 @@ _createTextureReader(SdfAbstractData* sdfData, { "minFilter", _checkToken(input.minFilter) }, { "magFilter", _checkToken(input.magFilter) }, { "scale", scale }, - { "bias", bias } }; + { "bias", bias }, + { "file", VtValue(SdfAssetPath(texturePath)) } }; + InputConnections inputConnections = { { "st", stResultPath }, { "file", textureConnection } }; return createShader(sdfData, @@ -169,8 +174,21 @@ _setupInput(WriteSdfContext& ctx, } else { std::string texturePath = createTexturePath(ctx.srcAssetFilename, ctx.usdData->images[input.image].uri); - SdfPath textureConnection = addMaterialInputTexture( - ctx.sdfData, materialPath, materialInputName, texturePath, materialInputs); + // For UsdPreviewSurface we can detect color inputs with the type directly. For the ASM + // shader we need to both check the type to be Float3 and also to have "Color" or + // "emissive" in the name to differentiate from the normal inputs, which are also + // Float3. + const std::string& inputName = materialInputName.GetString(); + bool isColorTexture = inputType == SdfValueTypeNames->Color3f || + (inputType == SdfValueTypeNames->Float3 && + (inputName.find("Color") != std::string::npos || + inputName.find("emissive") != std::string::npos)); + SdfPath textureConnection = addMaterialInputTexture(ctx.sdfData, + materialPath, + materialInputName, + texturePath, + isColorTexture, + materialInputs); // Create the ST reader on demand when we create the first textured input SdfPath stReaderResultPath; @@ -188,7 +206,7 @@ _setupInput(WriteSdfContext& ctx, ctx.sdfData, parentPath, name.GetString(), input, stReaderResultPath); SdfPath texResultPath = _createTextureReader( - ctx.sdfData, parentPath, name, input, stResultPath, textureConnection); + ctx.sdfData, parentPath, name, input, stResultPath, texturePath, textureConnection); inputConnections.emplace_back(name.GetString(), texResultPath); } @@ -203,6 +221,43 @@ _setupInput(WriteSdfContext& ctx, } } +Input +_createEmissiveColorInput(const OpenPbrMaterial& material) +{ + if (material.emission_luminance.isEmpty() || material.emission_color.isZeroInput()) { + return {}; + } + + // Note, we do not handle the case where emission_luminance is driven by a texture + float luminanceValue = 0.0f; + if (material.emission_luminance.image >= 0) { + TF_WARN("emission_luminance driven by a texture. Can't be folded into emissiveColor."); + luminanceValue = 1.0f; + } else if (material.emission_luminance.value.IsHolding()) { + luminanceValue = material.emission_luminance.value.UncheckedGet(); + // Multiply by a factor to convert OpenPBR's emission_luminance. + // Without this, emission might be very blown out. + luminanceValue *= kOpenPbrToAsmEmissionFactor; + } + + Input emissiveColor = material.emission_color; + if (emissiveColor.isEmpty()) { + emissiveColor.value = GfVec3f(luminanceValue, luminanceValue, luminanceValue); + } else if (emissiveColor.image == -1) { + // Fold the luminance multiplier into the constant color value + GfVec3f colorValue = GfVec3f(1.0f); + if (emissiveColor.value.IsHolding()) { + colorValue = emissiveColor.value.UncheckedGet(); + } + emissiveColor.value = luminanceValue * colorValue; + } else { + // Fold the luminance multiplier into the texture scale + emissiveColor.scale *= luminanceValue; + } + + return emissiveColor; +} + void writeUsdPreviewSurface(WriteSdfContext& ctx, const SdfPath& materialPath, @@ -224,7 +279,7 @@ writeUsdPreviewSurface(WriteSdfContext& ctx, const InputToMaterialInputTypeMap& remapping = ShaderRegistry::getInstance().getUsdPreviewSurfaceInputRemapping(); auto writeInput = [&](const TfToken& name, const Input& input) { - if (!input.isEmpty()) + if (!input.isEmpty()) { _setupInput(ctx, materialPath, parentPath, @@ -235,11 +290,11 @@ writeUsdPreviewSurface(WriteSdfContext& ctx, inputConnections, remapping, materialInputs); + } }; writeInput(UsdPreviewSurfaceTokens->diffuseColor, material.base_color); - // XXX Multiply with emission_luminance? Also, what about the units (OpenPBR is in nits)? - writeInput(UsdPreviewSurfaceTokens->emissiveColor, material.emission_color); + writeInput(UsdPreviewSurfaceTokens->emissiveColor, _createEmissiveColorInput(material)); if (material.useSpecularWorkflow) { writeInput(UsdPreviewSurfaceTokens->useSpecularWorkflow, Input{ VtValue(1) }); } @@ -287,6 +342,28 @@ writeUsdPreviewSurface(WriteSdfContext& ctx, } } +Input +_createEmissiveIntensityInput(const Input& emission_luminance) +{ + if (emission_luminance.isEmpty()) { + return {}; + } + + // Note, we do not handle the case where emission_luminance is driven by a texture + float luminanceValue = 0.0f; + if (emission_luminance.image >= 0) { + TF_WARN("emission_luminance driven by a texture. Can't be folded into emissiveColor."); + luminanceValue = 1.0f; + } else if (emission_luminance.value.IsHolding()) { + luminanceValue = emission_luminance.value.UncheckedGet(); + // Multiply by a factor to convert OpenPBR's emission_luminance. + // Without this, emission might be very blown out. + luminanceValue *= kOpenPbrToAsmEmissionFactor; + } + + return Input{ VtValue(luminanceValue) }; +} + void writeAsmMaterial(WriteSdfContext& ctx, const SdfPath& materialPath, @@ -307,21 +384,20 @@ writeAsmMaterial(WriteSdfContext& ctx, const InputToMaterialInputTypeMap& remapping = ShaderRegistry::getInstance().getAsmInputRemapping(); auto writeInput = [&](const TfToken& name, const Input& input) { - _setupInput(ctx, - materialPath, - parentPath, - name, - input, - stReaderResultPathMap, - inputValues, - inputConnections, - remapping, - materialInputs); + if (!input.isEmpty()) { + _setupInput(ctx, + materialPath, + parentPath, + name, + input, + stReaderResultPathMap, + inputValues, + inputConnections, + remapping, + materialInputs); + } }; - // Currently unused inputs - // Input useSpecularWorkflow; - writeInput(AsmTokens->baseColor, material.base_color); writeInput(AsmTokens->roughness, material.specular_roughness); writeInput(AsmTokens->metallic, material.base_metalness); @@ -332,14 +408,17 @@ writeAsmMaterial(WriteSdfContext& ctx, if (material.normalScale != 1.0f) { writeInput(AsmTokens->normalScale, Input{ VtValue(material.normalScale) }); } + // combineNormalAndHeight = false (flag) (no source info) + writeInput(AsmTokens->height, material.displacement); // heightScale (no source info) // heightLevel (no source info) writeInput(AsmTokens->anisotropyLevel, material.specular_roughness_anisotropy); // Note, this is just a pass through. OpenPBR does not support an anisotropy angle input writeInput(AsmTokens->anisotropyAngle, material.anisotropyAngle); - writeInput(AsmTokens->emissiveIntensity, material.emission_luminance); + writeInput(AsmTokens->emissiveIntensity, + _createEmissiveIntensityInput(material.emission_luminance)); writeInput(AsmTokens->emissive, material.emission_color); writeInput(AsmTokens->sheenOpacity, material.fuzz_weight); writeInput(AsmTokens->sheenColor, material.fuzz_color); @@ -369,19 +448,12 @@ writeAsmMaterial(WriteSdfContext& ctx, writeInput(AsmTokens->coatSpecularLevel, material.coatSpecularLevel); writeInput(AsmTokens->coatNormal, material.geometry_coat_normal); // coatNormalScale (the scale is part of the coatNormal `scale` or `value`) + writeInput(AsmTokens->ambientOcclusion, material.occlusion); // Note, this is just a pass through. OpenPBR does not support a volumeThickness input writeInput(AsmTokens->volumeThickness, material.volumeThickness); // volumeThicknessScale (the scale is part of the volumeThickness `scale` or `value`) - // Note, ASM does not support an opacityThreshold. But without storing it here, the - // information is lost and can't be round tripped. So we store it, even though we know it - // won't affect the result of the material - if (material.opacityThreshold > 0.0f) { - writeInput(UsdPreviewSurfaceTokens->opacityThreshold, - Input{ VtValue(material.opacityThreshold) }); - } - // Create Adobe Standard Material shader SdfPath outputPath = createShader(ctx.sdfData, parentPath, @@ -394,22 +466,6 @@ writeAsmMaterial(WriteSdfContext& ctx, ctx.sdfData, materialPath, "adobe:surface", SdfValueTypeNames->Token, outputPath); SdfPath surfaceShaderPath = parentPath.AppendChild(AdobeTokens->ASM); - if (material.isUnlit) { - // Author a custom attribute to leave an indicator that this material should be unlit - SdfPath p = createAttributeSpec( - ctx.sdfData, surfaceShaderPath, AdobeTokens->unlit, SdfValueTypeNames->Bool); - setAttributeMetadata(ctx.sdfData, p, SdfFieldKeys->Custom, VtValue(true)); - setAttributeDefaultValue(ctx.sdfData, p, true); - } - - if (material.clearcoatModelsTransmissionTint) { - // Author a custom attribute to leave an indicator where the clearcoat came from - SdfPath p = createAttributeSpec(ctx.sdfData, - surfaceShaderPath, - AdobeTokens->clearcoatModelsTransmissionTint, - SdfValueTypeNames->Bool); - setAttributeMetadata(ctx.sdfData, p, SdfFieldKeys->Custom, VtValue(true)); - setAttributeDefaultValue(ctx.sdfData, p, true); - } + createExtraConstantAttribute(ctx.sdfData, material, surfaceShaderPath); } } diff --git a/utils/src/layerWriteOpenPBR.cpp b/utils/src/layerWriteOpenPBR.cpp index 21eaf098..5d22d5f7 100644 --- a/utils/src/layerWriteOpenPBR.cpp +++ b/utils/src/layerWriteOpenPBR.cpp @@ -27,17 +27,15 @@ const std::string stPrimvarNameAttrName = "stPrimvarName"; SdfPath _createMaterialXUvReader(SdfAbstractData* sdfData, const SdfPath& parentPath, int uvIndex) { - // XXX The MaterialX texcoord reader function has an index to specify which set of UV - // coordinates to read, but it does not have the ability to specify a primvar by name. So we - // currently default to the first set, but there is something to be figured out about how to - // connect a named primvar to a UV coordinate index in MaterialX. - // Maybe ND_geompropvalue_vector2 with geomprop="st" will do the trick. Note, that the shared - // stPrimvarNameAttrName input attribute is of type Token, but `geomprop` is of type String + // Map the index to a unique name for the texture uv coordinate reader and map the index to + // one of st, st1, st2, ... for use as the geomprop value. return createShader(sdfData, parentPath, getSTTexCoordReaderToken(uvIndex), - MtlXTokens->ND_texcoord_vector2, - "out"); + MtlXTokens->ND_geompropvalue_vector2, + "out", + { { "geomprop", getSTPrimvarAttrToken(uvIndex).GetString() } }, + {}); } // If a texture coordinate transform is needed for the given input a transform will be created and @@ -70,7 +68,6 @@ _createMaterialXUvTransform(SdfAbstractData* sdfData, "out", { { "scale", scale }, { "rotate", input.uvRotation }, { "offset", input.uvTranslation } }, { { "texcoord", uvReaderResultPath } }); - ; } std::string @@ -93,156 +90,124 @@ _toMaterialXAddressMode(const TfToken& wrapMode) } SdfPath -_createScaleAndBiasNodes(SdfAbstractData* sdfData, - const SdfPath& parentPath, - const std::string& baseName, - const SdfPath& textureInput, - int numChannels, - bool isColor, - const GfVec4f& scale4, - const GfVec4f& bias4) +createMaterialXTextureReader(SdfAbstractData* sdfData, + const SdfPath& parentPath, + const TfToken& name, + const Input& input, + const SdfPath& uvResultPath, + const SdfPath& textureConnection) { - TfToken scaleShaderType, biasShaderType; - VtValue scale, bias; - if (numChannels == 1) { - float s = scale4[0]; - if (s != 1.0f) { - scale = s; - scaleShaderType = MtlXTokens->ND_multiply_float; - } - float b = bias4[0]; - if (b != 0.0f) { - bias = b; - biasShaderType = MtlXTokens->ND_add_float; - } - } else if (numChannels == 3) { - GfVec3f s = GfVec3f(scale4[0], scale4[1], scale4[2]); - if (s != GfVec3f(1.0f)) { - scale = s; - scaleShaderType = - isColor ? MtlXTokens->ND_multiply_color3 : MtlXTokens->ND_multiply_vector3; + // Normal and tangent map textures need a bit of special processing in MaterialX + const bool isNormalMap = + name == OpenPbrTokens->geometry_normal || name == OpenPbrTokens->geometry_coat_normal; + const bool isTangentMap = + name == OpenPbrTokens->geometry_tangent || name == OpenPbrTokens->geometry_coat_tangent; + + // Most texture inputs are for color and single float inputs on the OpenPBR surface shader + // and these inputs need to support channel selection from packed RGBA texture and also + // scale & bias support to adjust the read texel values. That is why we're using a + // ND_UsdUVTexture_23 shader, which was designed to emulate the UsdUVTexture node that we've + // been using before. + TfToken outputName = input.channel; + static const GfVec4f defaultFallback(0.0f, 0.0f, 0.0f, 1.0f); + GfVec4f fallback = defaultFallback; + if (outputName == AdobeTokens->r) { + if (input.value.IsHolding()) { + fallback[0] = input.value.UncheckedGet(); } - GfVec3f b = GfVec3f(bias4[0], bias4[1], bias4[2]); - if (b != GfVec3f(0.0f)) { - bias = b; - biasShaderType = isColor ? MtlXTokens->ND_add_color3 : MtlXTokens->ND_add_vector3; + } else if (outputName == AdobeTokens->g) { + if (input.value.IsHolding()) { + fallback[1] = input.value.UncheckedGet(); } - } - - SdfPath textureOutput = textureInput; - if (!scale.IsEmpty()) { - textureOutput = createShader(sdfData, - parentPath, - TfToken(baseName + "_scale"), - scaleShaderType, - "out", - { { "in1", scale } }, - { { "in2", textureOutput } }); - } - if (!bias.IsEmpty()) { - textureOutput = createShader(sdfData, - parentPath, - TfToken(baseName + "_bias"), - biasShaderType, - "out", - { { "in1", bias } }, - { { "in2", textureOutput } }); - } - - return textureOutput; -} - -SdfPath -_createMaterialXTextureReader(SdfAbstractData* sdfData, - const SdfPath& parentPath, - const TfToken& name, - const Input& input, - const SdfPath& uvResultPath, - const SdfPath& textureConnection, - bool isNormalMap, - bool convertToColor) -{ - int numChannels = input.numChannels(); - TfToken shaderType; - VtValue defaultValue; - if (numChannels == 1) { - // If we want to extract a single channel we read the RGBA version of the texture in linear - // color space. - shaderType = MtlXTokens->ND_image_vector4; + } else if (outputName == AdobeTokens->b) { if (input.value.IsHolding()) { - // We're always using a RGBA texture reader (ND_image_vector4), so the fallback value - // has to match, even if we only care about a single channel. - float f = input.value.UncheckedGet(); - defaultValue = GfVec4f(f); + fallback[2] = input.value.UncheckedGet(); } - } else if (numChannels == 3) { - // We differentiate between two types of texture readers depending on the type of input on - // the surface shader. A mismatch in types will lead to errors. - if (name == OpenPbrTokens->geometry_normal || name == OpenPbrTokens->geometry_coat_normal || - name == OpenPbrTokens->geometry_tangent) { - shaderType = MtlXTokens->ND_image_vector3; - } else { - shaderType = MtlXTokens->ND_image_color3; + } else if (outputName == AdobeTokens->a) { + if (input.value.IsHolding()) { + fallback[3] = input.value.UncheckedGet(); } + } else if (outputName == AdobeTokens->rgb) { if (input.value.IsHolding()) { - defaultValue = input.value; + const GfVec3f& vec3 = input.value.UncheckedGet(); + fallback = GfVec4f(vec3[0], vec3[1], vec3[2], 1.0f); } } else { - TF_CODING_ERROR( - "Unsupported texture type for %d channels on input %s", numChannels, name.GetText()); + TF_CODING_ERROR("Unsupported texture type for channel %s on input %s", + outputName.GetText(), + name.GetText()); return SdfPath(); } // In MaterialX, each input attribute on a node can have an associated color space. We - // explicitly mark the "file" input with a color space if we know that we got a sRGB texture. - // Note, this will become the "colorSpace" metadata on the input attribute. + // explicitly mark the "file" input with a color space if we know that we got a sRGB + // texture. Note, this will become the "colorSpace" metadata on the input attribute. InputColorSpaces inputColorSpaces; if (input.colorspace == AdobeTokens->sRGB) { inputColorSpaces["file"] = MtlXTokens->srgb_texture; } - InputValues inputValues = { { "default", defaultValue }, - { "uaddressmode", _toMaterialXAddressMode(input.wrapS) }, - { "vaddressmode", _toMaterialXAddressMode(input.wrapT) } }; - InputConnections inputConnections = { { "texcoord", uvResultPath }, - { "file", textureConnection } }; - - // Note, we're setting the texture path directly on this texture reader, which means the - // path is duplicated on each texture reader of the same texture for each of the different - // sub networks. This is currently needed since some software is not correctly following - // connections to resolve input values. - // Once that has improved in the ecosystem we could author the asset path once as an - // attribute on the material and connect all corresponding texture readers to that attribute - // value. + // The inputs on the node are called wrapS and wrapT, but are using string values like the + // uaddressmode and vaddressmode on other MaterialX texture nodes. + InputValues inputValues = { { "wrapS", _toMaterialXAddressMode(input.wrapS) }, + { "wrapT", _toMaterialXAddressMode(input.wrapT) } }; + if (fallback != defaultFallback) { + inputValues.emplace_back("fallback", fallback); + } + + GfVec4f scale = input.scale; + GfVec4f bias = input.bias; + if (isNormalMap) { + // In MaterialX, the ND_normalmap node, which is downstream of the ND_UsdUVTexture_23 will + // decode the normal from the raw texture value, assuming the OpenGL convention, using a + // scale and bias of 2 (kOpenGLNormalTexScale) and -1 (kOpenGLNormalTexBias). That means it + // would be redundant to have this on the ND_UsdUVTexture_23 node. + // + // We have these decoding scale and bias values in our Input struct, especially if we're + // trying to differentiate it from a DirectX encoded normalmap and/or a normal strength + // multiplier. So we apply the inverse affine transform using the OpenGL decoding values, + // which yields a scale of 1 and a bias of 0, if it was indeed the OpenGL convention. In the + // case of something else it will yield a transformation to something that can be decoding + // with the OpenGL convention. Thus we can represent DirectX encoding and multipliers. + // + // Note that this mirrors the process in the OpenPBR reading code. + scale = GfCompDiv(scale, kOpenGLNormalTexScale); + bias = GfCompDiv(bias - kOpenGLNormalTexBias, kOpenGLNormalTexScale); + } + if (scale != kDefaultTexScale) { + inputValues.emplace_back("scale", scale); + } + if (bias != kDefaultTexBias) { + inputValues.emplace_back("bias", bias); + } + + InputConnections inputConnections = { { "st", uvResultPath }, { "file", textureConnection } }; + SdfPath textureOutput = createShader(sdfData, parentPath, name, - shaderType, - "out", + MtlXTokens->ND_UsdUVTexture_23, + outputName.GetString(), inputValues, inputConnections, inputColorSpaces); - // Extract the single channel from the 4 channel reader - if (numChannels == 1) { - std::string out = input.channel == AdobeTokens->r ? "outx" - : input.channel == AdobeTokens->g ? "outy" - : input.channel == AdobeTokens->b ? "outz" - : "outw"; + if (isNormalMap || isTangentMap) { + // The rgb output of the ND_UsdUVTexture_23 is of type color3, but the ND_normalmap node + // for normal maps and the tangent map input on the surface require vector3. So we inject a + // simple type conversion node for correctness. textureOutput = createShader(sdfData, parentPath, - TfToken(name.GetString() + "_to_float"), - MtlXTokens->ND_separate4_vector4, - out, + TfToken(name.GetString() + "_as_vector"), + MtlXTokens->ND_convert_color3_vector3, + "out", {}, { { "in", textureOutput } }); } if (isNormalMap) { - // The texture reader for a normal map reads a texture map in tangent space, which needs to - // be transformed into world space. Route normal map through a normal map node - // Note, we skip the usual scale and bias of 2 and -1 for the normal map data and send the - // data directly into the normalmap node. + // The texture reader for a normal map reads a texture map in tangent space, which needs + // to be transformed into world space. Route normal map through a normal map node. textureOutput = createShader(sdfData, parentPath, TfToken(name.GetString() + "_to_world_space"), @@ -250,28 +215,6 @@ _createMaterialXTextureReader(SdfAbstractData* sdfData, "out", {}, { { "in", textureOutput } }); - } else { - if (!input.hasDefaultScaleAndBias()) { - bool isColor = shaderType == MtlXTokens->ND_image_color3; - textureOutput = _createScaleAndBiasNodes(sdfData, - parentPath, - name.GetString(), - textureOutput, - numChannels, - isColor, - input.scale, - input.bias); - } - } - - if (convertToColor && numChannels == 1) { - textureOutput = createShader(sdfData, - parentPath, - TfToken(name.GetString() + "_to_color"), - MtlXTokens->ND_convert_float_color3, - "out", - {}, - { { "in", textureOutput } }); } return textureOutput; @@ -313,8 +256,13 @@ _setupOpenPbrInput(WriteSdfContext& ctx, std::string texturePath = createTexturePath(ctx.srcAssetFilename, ctx.usdData->images[input.image].uri); - SdfPath textureConnection = addMaterialInputTexture( - ctx.sdfData, materialPath, materialInputName, texturePath, materialInputs); + bool isColorTexture = inputType == SdfValueTypeNames->Color3f; + SdfPath textureConnection = addMaterialInputTexture(ctx.sdfData, + materialPath, + materialInputName, + texturePath, + isColorTexture, + materialInputs); // Create the ST reader on demand when we create the first textured input SdfPath uvReaderResultPath; @@ -332,18 +280,8 @@ _setupOpenPbrInput(WriteSdfContext& ctx, SdfPath stResultPath = _createMaterialXUvTransform( ctx.sdfData, parentPath, name.GetString(), input, uvReaderResultPath); - bool isNormalMap = - name == OpenPbrTokens->geometry_normal || name == OpenPbrTokens->geometry_coat_normal; - // geometry_opacity expects a color, but our input opacity is a float input - bool convertToColor = name == OpenPbrTokens->geometry_opacity; - SdfPath texResultPath = _createMaterialXTextureReader(ctx.sdfData, - parentPath, - name, - input, - stResultPath, - textureConnection, - isNormalMap, - convertToColor); + SdfPath texResultPath = createMaterialXTextureReader( + ctx.sdfData, parentPath, name, input, stResultPath, textureConnection); inputConnections.emplace_back(name.GetString(), texResultPath); } @@ -398,8 +336,8 @@ writeOpenPBR(WriteSdfContext& ctx, materialInputs); }; -#define INPUT(x) writeInput(OpenPbrTokens->x, material.x); - INPUT(base_weight); +#define INPUT(x) writeInput(OpenPbrTokens->x, material.x) + INPUT(base_weight); // has no UsdPreviewSurface or ASM equivalent INPUT(base_color); INPUT(base_diffuse_roughness); INPUT(base_metalness); @@ -440,8 +378,82 @@ writeOpenPBR(WriteSdfContext& ctx, INPUT(geometry_coat_normal); INPUT(geometry_tangent); INPUT(geometry_coat_tangent); + + // We handle ambient occlusion for OpenPBR with a custom shader graph created below (if + // necessary) + writeInput(UsdPreviewSurfaceTokens->occlusion, material.occlusion); #undef INPUT + // Non-OpenPBR inputs + // When in transcoding mode (preserveExtraMaterialInfo=true) we write these fields to not loose + // any information when reading the USD data again and exporting to a format that supports these + // inputs. + // When not transcoding we do not write them, since a MaterialX / OpenPBR renderer will not use + // these fields and might even fail to validate. + if (ctx.options->preserveExtraMaterialInfo) { + // TODO turn into proper displacement setup + writeInput(UsdPreviewSurfaceTokens->displacement, material.displacement); + writeInput(AsmTokens->anisotropyAngle, material.anisotropyAngle); + writeInput(AsmTokens->coatSpecularLevel, material.coatSpecularLevel); + writeInput(AsmTokens->volumeThickness, material.volumeThickness); + } + + // first check if we have connections for both base_color and occlusion + auto baseColorIt = + std::find_if(inputConnections.begin(), inputConnections.end(), [&](const auto& p) { + return p.first == OpenPbrTokens->base_color.GetString(); + }); + auto occlusionIt = + std::find_if(inputConnections.begin(), inputConnections.end(), [&](const auto& p) { + return p.first == UsdPreviewSurfaceTokens->occlusion.GetString(); + }); + + // If there are connections to base_color and occlusion to be added to the OpenPBR shader, we + // generate an OpenPBR subgraph that feeds the base_color and occlusion + // inputs to an ND_mix_color3 shader node and then connect the ND_mix_color3 output to the + // OpenPBR base_color input. The occlusion input is first converted from a float to a color3 + // with the ND_convert_float_color3 shader node. + if (baseColorIt != inputConnections.end() && occlusionIt != inputConnections.end()) { + // capture the input paths for the base_color and occlusion connections + SdfPath baseColorConnection = baseColorIt->second; + SdfPath occlusionConnection = occlusionIt->second; + + // Remove both the base_color and occlusion connections. We'll create a new base_color + // connection below where an ND_mix_color3 node will be created to combine the base_color + // and occlusion sources which will then be input source for the OpenPBR base_color input. + inputConnections.erase(baseColorIt); + occlusionIt = + std::find_if(inputConnections.begin(), inputConnections.end(), [&](const auto& p) { + return p.first == UsdPreviewSurfaceTokens->occlusion.GetString(); + }); + if (occlusionIt != inputConnections.end()) + inputConnections.erase(occlusionIt); + + // convert ambientOcclusion float to color3 + SdfPath occlusionColorOutput = createShader(ctx.sdfData, + parentPath, + AdobeTokens->AmbientOcclusionAsColor, + MtlXTokens->ND_convert_float_color3, + "out", + {}, + { { "in", occlusionConnection } }); + + // Provide base_color and occlusion color as inputs to the ND_mix_color3 node. + // Note: We use a fixed value of 0.0 for the "mix" input which means that the "bg" input is + // connected to the base color source and "fg" is connected to the ambient occlusion source. + SdfPath ambientOcclusionBaseColor = + createShader(ctx.sdfData, + parentPath, + AdobeTokens->AmbientOcclusionBaseColor, + MtlXTokens->ND_mix_color3, + "out", + { { "mix", 0.0f } }, + { { "bg", baseColorConnection }, { "fg", occlusionColorOutput } }); + + // add the connection from the ND_mix_color3 output to the OpenPBR base_color input + inputConnections.emplace_back("base_color", ambientOcclusionBaseColor); + } + // Create OpenPBR surface shader SdfPath outputPath = createShader(ctx.sdfData, parentPath, @@ -453,6 +465,9 @@ writeOpenPBR(WriteSdfContext& ctx, createShaderOutput( ctx.sdfData, materialPath, "mtlx:surface", SdfValueTypeNames->Token, outputPath); + SdfPath surfaceShaderPath = parentPath.AppendChild(MtlXTokens->OpenPBR); + createExtraConstantAttribute(ctx.sdfData, material, surfaceShaderPath); + // TODO: create displacement setup } } diff --git a/utils/src/layerWriteSdfData.cpp b/utils/src/layerWriteSdfData.cpp index 881f2d66..9751541d 100644 --- a/utils/src/layerWriteSdfData.cpp +++ b/utils/src/layerWriteSdfData.cpp @@ -32,6 +32,7 @@ governing permissions and limitations under the License. #include #include +#include #include using namespace PXR_NS; @@ -56,6 +57,8 @@ TF_DEFINE_PRIVATE_TOKENS(_tokens, // Render settings ((render, "Render")) ((primarySetting, "PrimarySetting")) + // Geometry subsets + ((subsetFamilyMaterialBindFamilyType, "subsetFamily:materialBind:familyType")) ); // clang-format on @@ -139,7 +142,7 @@ _writeCamera(SdfAbstractData* sdfData, const SdfPath& parentPath, const Camera& auto createAttr = [&](const TfToken& name, const SdfValueTypeName& type, const auto& value) { SdfPath p = createAttributeSpec(sdfData, primPath, name, type); - setAttributeDefaultValue(sdfData, p, value); + setAttributeDefaultValue(sdfData, p, value, type); }; if (camera.markedInvisible) { @@ -178,7 +181,7 @@ _writeNgp(SdfAbstractData* sdfData, const SdfPath& parentPath, const NgpData& ng type, uniform ? PXR_NS::SdfVariabilityUniform : PXR_NS::SdfVariabilityVarying); - setAttributeDefaultValue(sdfData, p, value); + setAttributeDefaultValue(sdfData, p, value, type); }; createAttr(ngpPrimPath, @@ -261,7 +264,7 @@ _writeLight(SdfAbstractData* sdfData, const SdfPath& parentPath, const Light& li SdfPath lightPath = SdfPath(); auto createAttr = [&](const TfToken& name, const SdfValueTypeName& type, const auto& value) { SdfPath p = createAttributeSpec(sdfData, lightPath, name, type); - setAttributeDefaultValue(sdfData, p, value); + setAttributeDefaultValue(sdfData, p, value, type); }; switch (light.type) { @@ -415,7 +418,7 @@ _writeXformAttributes(SdfAbstractData* sdfData, const SdfPath& primPath, const N if (node.markedInvisible) { SdfPath p = createAttributeSpec( sdfData, primPath, UsdGeomTokens->visibility, SdfValueTypeNames->Token); - setAttributeDefaultValue(sdfData, p, UsdGeomTokens->invisible); + setAttributeDefaultValue(sdfData, p, UsdGeomTokens->invisible, SdfValueTypeNames->Token); } VtArray xformOpOrder; @@ -427,7 +430,7 @@ _writeXformAttributes(SdfAbstractData* sdfData, const SdfPath& primPath, const N xformOpOrder.push_back(_tokens->xformOpTranslate); if (hasTranslation) { - setAttributeDefaultValue(sdfData, p, node.translation); + setAttributeDefaultValue(sdfData, p, node.translation, SdfValueTypeNames->Double3); } // XXX currently the translations is stored as GfVec3f, but needs to be authored as GfVec3d _writeTimeSamples(sdfData, p, nodeAnimation.translations); @@ -439,7 +442,7 @@ _writeXformAttributes(SdfAbstractData* sdfData, const SdfPath& primPath, const N xformOpOrder.push_back(_tokens->xformOpOrient); if (hasRotation) { - setAttributeDefaultValue(sdfData, p, node.rotation); + setAttributeDefaultValue(sdfData, p, node.rotation, SdfValueTypeNames->Quatf); } _writeTimeSamples(sdfData, p, nodeAnimation.rotations); } @@ -450,14 +453,14 @@ _writeXformAttributes(SdfAbstractData* sdfData, const SdfPath& primPath, const N xformOpOrder.push_back(_tokens->xformOpScale); if (hasScale) { - setAttributeDefaultValue(sdfData, p, node.scale); + setAttributeDefaultValue(sdfData, p, node.scale, SdfValueTypeNames->Float3); } _writeTimeSamples(sdfData, p, nodeAnimation.scales); } if (node.hasTransform && node.transform != GfMatrix4d().SetIdentity()) { SdfPath p = createAttributeSpec( sdfData, primPath, _tokens->xformOpTransform, SdfValueTypeNames->Matrix4d); - setAttributeDefaultValue(sdfData, p, node.transform); + setAttributeDefaultValue(sdfData, p, node.transform, SdfValueTypeNames->Matrix4d); xformOpOrder.push_back(_tokens->xformOpTransform); } @@ -467,7 +470,7 @@ _writeXformAttributes(SdfAbstractData* sdfData, const SdfPath& primPath, const N UsdGeomTokens->xformOpOrder, SdfValueTypeNames->TokenArray, SdfVariabilityUniform); - setAttributeDefaultValue(sdfData, p, xformOpOrder); + setAttributeDefaultValue(sdfData, p, xformOpOrder, SdfValueTypeNames->TokenArray); } } @@ -494,18 +497,18 @@ _createGeomSubset(SdfAbstractData* sdfData, UsdGeomTokens->elementType, SdfValueTypeNames->Token, SdfVariabilityUniform); - setAttributeDefaultValue(sdfData, p, UsdGeomTokens->face); + setAttributeDefaultValue(sdfData, p, UsdGeomTokens->face, SdfValueTypeNames->Token); // Face indices p = createAttributeSpec(sdfData, subsetPath, UsdGeomTokens->indices, SdfValueTypeNames->IntArray); - setAttributeDefaultValue(sdfData, p, subset.faces); + setAttributeDefaultValue(sdfData, p, subset.faces, SdfValueTypeNames->IntArray); // family type = materialBind p = createAttributeSpec(sdfData, subsetPath, UsdGeomTokens->familyName, SdfValueTypeNames->Token, SdfVariabilityUniform); - setAttributeDefaultValue(sdfData, p, UsdShadeTokens->materialBind); + setAttributeDefaultValue(sdfData, p, UsdShadeTokens->materialBind, SdfValueTypeNames->Token); return subsetPath; } @@ -526,14 +529,15 @@ _writePrimvar(SdfAbstractData* sdfData, setAttributeMetadata( sdfData, primvarAttrPath, UsdGeomTokens->interpolation, VtValue(primvar.interpolation)); - setAttributeDefaultValue(sdfData, primvarAttrPath, primvar.values); + setAttributeDefaultValue(sdfData, primvarAttrPath, primvar.values, typeName); if (!primvar.indices.empty()) { // The indices are stored in a sibling attribute TfToken indicesAttrName("primvars:" + primvarName + ":indices"); SdfPath primvarIndicesAttrPath = createAttributeSpec(sdfData, primPath, indicesAttrName, SdfValueTypeNames->IntArray); - setAttributeDefaultValue(sdfData, primvarIndicesAttrPath, primvar.indices); + setAttributeDefaultValue( + sdfData, primvarIndicesAttrPath, primvar.indices, SdfValueTypeNames->IntArray); } return primvarAttrPath; @@ -554,7 +558,8 @@ _writePrimvars(SdfAbstractData* sdfData, const SdfPath& primPath, const Mesh& me } _writePrimvar(sdfData, primPath, "normals", SdfValueTypeNames->Normal3fArray, mesh.normals); _writePrimvar(sdfData, primPath, "tangents", SdfValueTypeNames->Float4Array, mesh.tangents); - _writePrimvar(sdfData, primPath, "bitangents", SdfValueTypeNames->Float3Array, mesh.bitangents); + _writePrimvar( + sdfData, primPath, "bitangents", SdfValueTypeNames->Float3Array, mesh.bitangents); } auto indexedName = [](const std::string& baseName, int index) -> std::string { @@ -600,7 +605,8 @@ _writePrimvars(SdfAbstractData* sdfData, const SdfPath& primPath, const Mesh& me UsdGeomTokens->extent, SdfValueTypeNames->Float3Array, PXR_NS::SdfVariabilityVarying); - setAttributeDefaultValue(sdfData, extentAttrSpec, mesh.clippingBox.values); + setAttributeDefaultValue( + sdfData, extentAttrSpec, mesh.clippingBox.values, SdfValueTypeNames->Float3Array); } } } @@ -617,7 +623,7 @@ _writePoints(SdfAbstractData* sdfData, const SdfPath& parentPath, const Mesh& me auto createAttr = [&](const TfToken& name, const SdfValueTypeName& type, const auto& value) { SdfPath p = createAttributeSpec(sdfData, primPath, name, type); - setAttributeDefaultValue(sdfData, p, value); + setAttributeDefaultValue(sdfData, p, value, type); return p; }; @@ -671,7 +677,7 @@ _writeMesh(SdfAbstractData* sdfData, SdfVariability variability = uniform ? PXR_NS::SdfVariabilityUniform : PXR_NS::SdfVariabilityVarying; SdfPath p = createAttributeSpec(sdfData, primPath, name, type, variability); - setAttributeDefaultValue(sdfData, p, value); + setAttributeDefaultValue(sdfData, p, value, type); }; if (mesh.markedInvisible) { @@ -726,6 +732,20 @@ _writeMesh(SdfAbstractData* sdfData, // Subsets if (mesh.subsets.size()) { + TF_DEBUG_MSG(FILE_FORMAT_UTIL, + "write mesh subsets: %zu subsets for mesh %s\n", + mesh.subsets.size(), + meshName.c_str()); + + // Set the subsetFamily:materialBind:familyType for this mesh to declare the subsets a + // partition. Note that the "materialBind" part has to match the familyName on the subsets + // themselves, which is also "materialBind". See the schema documentation for more info: + // https://github.com/PixarAnimationStudios/OpenUSD/blob/v25.11/pxr/usd/usdGeom/schema.usda#L1354 + createAttr(_tokens->subsetFamilyMaterialBindFamilyType, + SdfValueTypeNames->Token, + UsdGeomTokens->partition, + true); + for (size_t i = 0; i < mesh.subsets.size(); i++) { const Subset& subset = mesh.subsets[i]; TfToken subsetName = TfToken(meshName + "_sub" + std::to_string(i)); @@ -830,7 +850,7 @@ _writeNurb(SdfAbstractData* sdfData, const SdfPath& parentPath, NurbData& nurb) auto createAttr = [&](const TfToken& name, const SdfValueTypeName& type, const auto& value) { SdfPath p = createAttributeSpec(sdfData, primPath, name, type); - setAttributeDefaultValue(sdfData, p, value); + setAttributeDefaultValue(sdfData, p, value, type); }; createAttr(UsdGeomTokens->uOrder, SdfValueTypeNames->Int, nurb.uOrder); @@ -904,7 +924,7 @@ _writeCurve(WriteSdfContext& ctx, const SdfPath& parentPath, const Curve& curve) SdfVariability variability = uniform ? PXR_NS::SdfVariabilityUniform : PXR_NS::SdfVariabilityVarying; SdfPath p = createAttributeSpec(ctx.sdfData, primPath, name, type, variability); - setAttributeDefaultValue(ctx.sdfData, p, value); + setAttributeDefaultValue(ctx.sdfData, p, value, type); return p; }; @@ -1024,7 +1044,6 @@ _writeNode(WriteSdfContext& ctx, const SdfPath& primPath, const Node& node) // Instanced meshes second. They need a name resolution to make sure they are unique UniqueNameEnforcer enforcer; - int i = 0; for (int meshIndex : node.staticMeshes) { const Mesh& mesh = ctx.usdData->meshes[meshIndex]; if (mesh.instanceable) { @@ -1144,7 +1163,7 @@ _writeSkeleton(SdfAbstractData* sdfData, const SdfPath& parentPath, const Skelet SdfVariability variability = uniform ? PXR_NS::SdfVariabilityUniform : PXR_NS::SdfVariabilityVarying; SdfPath p = createAttributeSpec(sdfData, primPath, name, type, variability); - setAttributeDefaultValue(sdfData, p, value); + setAttributeDefaultValue(sdfData, p, value, type); }; createAttr(UsdSkelTokens->joints, SdfValueTypeNames->TokenArray, skeleton.joints, true); @@ -1199,7 +1218,7 @@ _writeSkeletonAnimation(SdfAbstractData* sdfData, UsdSkelTokens->joints, SdfValueTypeNames->TokenArray, SdfVariabilityUniform); - setAttributeDefaultValue(sdfData, p, skeleton.animatedJoints); + setAttributeDefaultValue(sdfData, p, skeleton.animatedJoints, SdfValueTypeNames->TokenArray); SdfPath rotAttrPath = createAttributeSpec( sdfData, primPath, UsdSkelTokens->rotations, SdfValueTypeNames->QuatfArray); @@ -1257,17 +1276,6 @@ _writeMaterial(WriteSdfContext& ctx, const SdfPath& parentPath, const OpenPbrMat return materialPath; } -void -_writeImage(const std::string& assetsPath, const ImageAsset& image) -{ - std::string filename = assetsPath + "/" + image.uri; - std::ofstream file(filename, std::ios::out | std::ios::binary); - if (!file.is_open()) - return; - file.write(reinterpret_cast(image.image.data()), image.image.size()); - file.close(); -} - // Processes animation tracks, putting animation track data in the metadata void _writeAnimationTracks(const WriteLayerOptions& options, UsdData& data) @@ -1278,7 +1286,7 @@ _writeAnimationTracks(const WriteLayerOptions& options, UsdData& data) // Ignore all animation tracks beyond the first one if we aren't importing multiple tracks int firstTrackWithTimepoints = -1; - for (int trackIndex = 0; trackIndex < data.animationTracks.size(); trackIndex++) { + for (size_t trackIndex = 0; trackIndex < data.animationTracks.size(); trackIndex++) { AnimationTrack& track = data.animationTracks[trackIndex]; if (!track.hasTimepoints) { continue; @@ -1293,9 +1301,8 @@ _writeAnimationTracks(const WriteLayerOptions& options, UsdData& data) } // Calculate offsetToJoinedTimeline for each track, ignoring empty tracks - float offsetToJoinedTimeline = 0.0f; int prevTrackIndex = -1; - for (int trackIndex = 0; trackIndex < data.animationTracks.size(); trackIndex++) { + for (size_t trackIndex = 0; trackIndex < data.animationTracks.size(); trackIndex++) { AnimationTrack& track = data.animationTracks[trackIndex]; if (!track.hasTimepoints) { continue; @@ -1426,6 +1433,8 @@ _writeLayerSdfData(const WriteLayerOptions& options, const std::string& sourceFileType, const std::string& debugTag) { + TfStopwatch phaseSW; + // Get the raw pointer for efficiency while we hold the ref pointer SdfAbstractData* sdfData = get_pointer(sdfDataPtr); @@ -1454,6 +1463,7 @@ _writeLayerSdfData(const WriteLayerOptions& options, _writeMetadata(sdfData, usdData, rootNodePath, sourceFileType, renderSettingsPath); + phaseSW.Start(); if (!usdData.materials.empty()) { ctx.materialMap.resize(usdData.materials.size()); TfToken materialsPrimName("Materials"); @@ -1468,10 +1478,17 @@ _writeLayerSdfData(const WriteLayerOptions& options, printMaterial("layer::write", materialPath, material, ctx.debugTag); } } + phaseSW.Stop(); + TF_DEBUG_MSG(FILE_FORMAT_UTIL, + "_writeLayerSdfData materials time: %ld ms (%zu materials)\n", + static_cast(phaseSW.GetMilliseconds()), + usdData.materials.size()); + phaseSW.Reset(); // This map is filled with paths to prototypes as we process instanceable meshes ctx.meshPrototypeMap.resize(usdData.meshes.size()); + phaseSW.Start(); if (!usdData.nodes.empty()) { ctx.nodeMap.resize(usdData.nodes.size()); @@ -1485,6 +1502,13 @@ _writeLayerSdfData(const WriteLayerOptions& options, _writeNonParentedNodes(ctx, rootNodePath, usdData.nodes); } } + phaseSW.Stop(); + TF_DEBUG_MSG(FILE_FORMAT_UTIL, + "_writeLayerSdfData nodes time: %ld ms (%zu nodes, %zu meshes)\n", + static_cast(phaseSW.GetMilliseconds()), + usdData.nodes.size(), + usdData.meshes.size()); + phaseSW.Reset(); // Write skeletons after nodes, as we sometimes want skeletons to be parented to the nodes if (!usdData.skeletons.empty()) { @@ -1515,14 +1539,11 @@ _writeLayerSdfData(const WriteLayerOptions& options, SdfPath skeletonPath = _writeSkeleton(sdfData, skelRootPath, skeleton); ctx.skeletonMap[i++] = skeletonPath; - int meshChildIndex = 0; for (int meshIndex : skeleton.meshSkinningTargets) { const Mesh& mesh = ctx.usdData->meshes[meshIndex]; // Note, skinned meshes are never emitted as instanced _writePointsOrMesh(ctx, skelRootPath, mesh, skeletonPath); - - meshChildIndex++; } if (!skeleton.skeletonAnimations.empty()) { @@ -1539,7 +1560,11 @@ _writeLayerSdfData(const WriteLayerOptions& options, if (!options.assetsPath.empty() && usdData.images.size()) { TfMakeDirs(options.assetsPath, -1, true); for (const ImageAsset& image : usdData.images) { - _writeImage(options.assetsPath, image); + std::filesystem::path filepath = std::filesystem::path(options.assetsPath) / image.uri; + if (!writeDataToDisk(filepath, image.image.data(), image.image.size())) { + TF_WARN( + "Could not write image %s to %s", image.uri.c_str(), options.assetsPath.c_str()); + } } } diff --git a/utils/src/layerWriteShared.cpp b/utils/src/layerWriteShared.cpp index 84c24051..c0d3bac3 100644 --- a/utils/src/layerWriteShared.cpp +++ b/utils/src/layerWriteShared.cpp @@ -13,7 +13,7 @@ governing permissions and limitations under the License. #include #include -#include +#include using namespace PXR_NS; @@ -115,6 +115,17 @@ createTexturePath(const std::string& srcAssetFilename, const std::string& imageU return srcAssetFilename.empty() ? imageUri : srcAssetFilename + "[" + imageUri + "]"; } +void +convertAsmEmissionToOpenPbrEmission(OpenPbrMaterial& pbrMaterial, const Material& material) +{ + if (material.emissiveColor.isEmpty() || material.emissiveColor.isZeroInput()) + return; + // NOTE: we are ignoring the cases where coatOpacity and sheenOpacity might not be 0 (see ASM to + // OpenPBR conversion doc for details) + pbrMaterial.emission_luminance = Input{ VtValue(1000.0f) }; + pbrMaterial.emission_color = material.emissiveColor; +} + OpenPbrMaterial mapMaterialStructToOpenPbrMaterialStruct(const Material& material) { @@ -166,6 +177,7 @@ mapMaterialStructToOpenPbrMaterialStruct(const Material& material) result.subsurface_color = material.scatteringColor; result.subsurface_radius = material.scatteringDistance; result.subsurface_radius_scale = material.scatteringDistanceScale; + // subsurface_scatter_anisotropy (no source info) // fuzz result.fuzz_weight = Input{ fuzz ? VtValue(1.0f) : VtValue() }; @@ -186,7 +198,10 @@ mapMaterialStructToOpenPbrMaterialStruct(const Material& material) // thin_film_ior (no source info) // emission - result.emission_luminance = Input{ emission ? VtValue(1.0f) : VtValue() }; + // Note, OpenPBR's emission_luminance is in different units than ASM's emissiveIntensity and + // hence we use a factor to convert + result.emission_luminance = + Input{ emission ? VtValue(kAsmToOpenPbrEmissionFactor) : VtValue() }; result.emission_color = material.emissiveColor; // geometry @@ -223,4 +238,92 @@ mapMaterialStructToOpenPbrMaterialStruct(const Material& material) return result; } +Material +mapOpenPbrMaterialStructToMaterialStruct(const OpenPbrMaterial& material) +{ + Material outputMaterial; + + outputMaterial.name = material.name; + outputMaterial.displayName = material.displayName; + + // OpenPBR inputs + outputMaterial.diffuseColor = material.base_color; + outputMaterial.metallic = material.base_metalness; + outputMaterial.specularLevel = material.specular_weight; + outputMaterial.specularColor = material.specular_color; + outputMaterial.roughness = material.specular_roughness; + outputMaterial.ior = material.specular_ior; + outputMaterial.anisotropyLevel = material.specular_roughness_anisotropy; + outputMaterial.transmission = material.transmission_weight; + outputMaterial.absorptionColor = material.transmission_color; + outputMaterial.absorptionDistance = material.transmission_depth; + outputMaterial.scatteringColor = material.subsurface_color; + outputMaterial.scatteringDistance = material.subsurface_radius; + outputMaterial.sheenColor = material.fuzz_color; + outputMaterial.sheenRoughness = material.fuzz_roughness; + outputMaterial.clearcoat = material.coat_weight; + outputMaterial.clearcoatColor = material.coat_color; + outputMaterial.clearcoatRoughness = material.coat_roughness; + outputMaterial.clearcoatIor = material.coat_ior; + outputMaterial.emissiveColor = material.emission_color; + outputMaterial.opacity = material.geometry_opacity; + outputMaterial.normal = material.geometry_normal; + outputMaterial.clearcoatNormal = material.geometry_coat_normal; + + // Non-OpenPBR inputs + outputMaterial.displacement = material.displacement; + outputMaterial.occlusion = material.occlusion; + outputMaterial.anisotropyAngle = material.anisotropyAngle; + outputMaterial.clearcoatSpecular = material.coatSpecularLevel; + outputMaterial.volumeThickness = material.volumeThickness; + if (material.normalScale != 1.0f) { + outputMaterial.normalScale = Input{ VtValue(material.normalScale) }; + } + if (material.useSpecularWorkflow) { + outputMaterial.useSpecularWorkflow = Input{ VtValue(1) }; + } + if (material.opacityThreshold != 0.0f) { + outputMaterial.opacityThreshold = Input{ VtValue(material.opacityThreshold) }; + } + outputMaterial.clearcoatModelsTransmissionTint = material.clearcoatModelsTransmissionTint; + outputMaterial.isUnlit = material.isUnlit; + + return outputMaterial; +} + +void +createExtraConstantAttribute(PXR_NS::SdfAbstractData* sdfData, + const OpenPbrMaterial& material, + const SdfPath& surfaceShaderPath) +{ + auto createCustomAttr = + [&](const TfToken& attrName, const SdfValueTypeName& typeName, auto defaultValue) { + SdfPath p = createAttributeSpec(sdfData, surfaceShaderPath, attrName, typeName); + setAttributeMetadata(sdfData, p, SdfFieldKeys->Custom, VtValue(true)); + setAttributeDefaultValue(sdfData, p, defaultValue, typeName); + }; + + // The custom attributes below are not part of OpenPBR, but are needed for accurate round + // tripping + if (material.normalScale != 1.0f) { + createCustomAttr(AsmTokens->normalScale, SdfValueTypeNames->Float, material.normalScale); + } + if (material.useSpecularWorkflow) { + createCustomAttr( + UsdPreviewSurfaceTokens->useSpecularWorkflow, SdfValueTypeNames->Bool, VtValue(true)); + } + if (material.opacityThreshold != 0.0f) { + createCustomAttr(UsdPreviewSurfaceTokens->opacityThreshold, + SdfValueTypeNames->Float, + material.opacityThreshold); + } + if (material.isUnlit) { + createCustomAttr(AdobeTokens->unlit, SdfValueTypeNames->Bool, VtValue(true)); + } + if (material.clearcoatModelsTransmissionTint) { + createCustomAttr( + AdobeTokens->clearcoatModelsTransmissionTint, SdfValueTypeNames->Bool, VtValue(true)); + } +} + } diff --git a/utils/src/resolver.cpp b/utils/src/resolver.cpp index 03d91a21..585adc5d 100644 --- a/utils/src/resolver.cpp +++ b/utils/src/resolver.cpp @@ -9,11 +9,11 @@ the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTA OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ -#include #include #include #include #include +#include #include #include #include @@ -69,11 +69,13 @@ Resolver::OpenAsset(const std::string& resolvedPackagePath, const std::string& r ss << threadId; AssetMap* assetMap = AssetCacheSingleton::getInstance().acquireAssetMap( - resolvedPackagePath, resolvedPackagedPath, ss, - [this](const std::string& path, std::vector& images) { - readCache(path, images); // Assuming 'readCache' is a member function of the 'Resolver' class - } - ); + resolvedPackagePath, + resolvedPackagedPath, + ss, + [this](const std::string& path, std::vector& images) { + readCache(path, + images); // Assuming 'readCache' is a member function of the 'Resolver' class + }); if (assetMap) { TF_DEBUG_MSG(UTIL_PACKAGE_RESOLVER, " : %s \n", resolvedPackagedPath.c_str()); auto it = assetMap->assets.find(resolvedPackagedPath); @@ -86,13 +88,11 @@ Resolver::OpenAsset(const std::string& resolvedPackagePath, const std::string& r void Resolver::BeginCacheScope(VtValue* data) -{ -} +{} void Resolver::EndCacheScope(VtValue* data) -{ -} +{} void Resolver::clearCache(const std::string& resolvedPackagePath) diff --git a/utils/src/sdfMaterialUtils.cpp b/utils/src/sdfMaterialUtils.cpp index 7eb8ee98..9f520df7 100644 --- a/utils/src/sdfMaterialUtils.cpp +++ b/utils/src/sdfMaterialUtils.cpp @@ -22,7 +22,7 @@ _setShaderType(SdfAbstractData* data, const SdfPath& shaderPath, const TfToken& { SdfPath p = createAttributeSpec( data, shaderPath, UsdShadeTokens->infoId, SdfValueTypeNames->Token, SdfVariabilityUniform); - setAttributeDefaultValue(data, p, shaderType); + setAttributeDefaultValue(data, p, shaderType, SdfValueTypeNames->Token); } SdfPath @@ -119,7 +119,7 @@ addMaterialInputValue(SdfAbstractData* sdfData, if (inserted) { TfToken inputToken("inputs:" + name.GetString()); SdfPath path = _createShaderAttr(sdfData, materialPath, inputToken, type); - setAttributeDefaultValue(sdfData, path, value); + setAttributeDefaultValue(sdfData, path, value, type); it->second = path; return path; } @@ -131,12 +131,23 @@ addMaterialInputTexture(SdfAbstractData* sdfData, const SdfPath& materialPath, const TfToken& name, const std::string& texturePath, + bool isColorTexture, MaterialInputs& materialInputs) { VtValue value = VtValue(SdfAssetPath(texturePath)); TfToken texturePathInputName(name.GetString() + "Texture"); - return addMaterialInputValue( + SdfPath inputAttrPath = addMaterialInputValue( sdfData, materialPath, texturePathInputName, SdfValueTypeNames->Asset, value, materialInputs); + // We set the color space on the attribute that will carry the texture asset path + // This is an important clue for the OpenPBR/MaterialX shading network, as the texture + // reading nodes there do not have a field for the color space. That space is specified + // on the attribute that holds the asset path. + // XXX: In the future we should switch these tokens to GfColorSpaceNames, which + // specifies a larger set of color spaces. For now we stick to "srgb_texture" and "raw", which + // are MaterialX supported and recognized color space names. + const TfToken& colorSpace = isColorTexture ? MtlXTokens->srgb_texture : AdobeTokens->raw; + setAttributeMetadata(sdfData, inputAttrPath, SdfFieldKeys->ColorSpace, VtValue(colorSpace)); + return inputAttrPath; } SdfPath @@ -194,7 +205,7 @@ createShader(SdfAbstractData* data, TfToken inputToken("inputs:" + inputName); SdfValueTypeName inputType = shaderInfo.getInputType(inputToken); SdfPath p = _createShaderAttr(data, shaderPath, inputToken, inputType); - setAttributeDefaultValue(data, p, inputValue); + setAttributeDefaultValue(data, p, inputValue, inputType); // Set the colorSpace metadata if we a specific value for this input const auto it = inputColorSpaces.find(inputName); @@ -247,25 +258,25 @@ ShaderRegistry::ShaderRegistry() // Initialize shaderInfos // clang-format off m_shaderInfos = { - { AdobeTokens->UsdUVTexture, {{ - { TfToken("inputs:file"), SdfValueTypeNames->Asset }, - { TfToken("inputs:st"), SdfValueTypeNames->Float2 }, - { TfToken("inputs:wrapS"), SdfValueTypeNames->Token }, - { TfToken("inputs:wrapT"), SdfValueTypeNames->Token }, - { TfToken("inputs:minFilter"), SdfValueTypeNames->Token }, - { TfToken("inputs:magFilter"), SdfValueTypeNames->Token }, - { TfToken("inputs:fallback"), SdfValueTypeNames->Float4 }, - { TfToken("inputs:scale"), SdfValueTypeNames->Float4 }, - { TfToken("inputs:bias"), SdfValueTypeNames->Float4 }, - { TfToken("inputs:sourceColorSpace"), SdfValueTypeNames->Token } - }, { - { TfToken("outputs:r"), SdfValueTypeNames->Float }, - { TfToken("outputs:g"), SdfValueTypeNames->Float }, - { TfToken("outputs:b"), SdfValueTypeNames->Float }, - { TfToken("outputs:a"), SdfValueTypeNames->Float }, - { TfToken("outputs:rgb"), SdfValueTypeNames->Float3 } - }}}, - { AdobeTokens->UsdTransform2d, {{ + { AdobeTokens->UsdUVTexture, {{ + { TfToken("inputs:file"), SdfValueTypeNames->Asset }, + { TfToken("inputs:st"), SdfValueTypeNames->Float2 }, + { TfToken("inputs:wrapS"), SdfValueTypeNames->Token }, + { TfToken("inputs:wrapT"), SdfValueTypeNames->Token }, + { TfToken("inputs:minFilter"), SdfValueTypeNames->Token }, + { TfToken("inputs:magFilter"), SdfValueTypeNames->Token }, + { TfToken("inputs:fallback"), SdfValueTypeNames->Float4 }, + { TfToken("inputs:scale"), SdfValueTypeNames->Float4 }, + { TfToken("inputs:bias"), SdfValueTypeNames->Float4 }, + { TfToken("inputs:sourceColorSpace"), SdfValueTypeNames->Token } + }, { + { TfToken("outputs:r"), SdfValueTypeNames->Float }, + { TfToken("outputs:g"), SdfValueTypeNames->Float }, + { TfToken("outputs:b"), SdfValueTypeNames->Float }, + { TfToken("outputs:a"), SdfValueTypeNames->Float }, + { TfToken("outputs:rgb"), SdfValueTypeNames->Float3 } + }}}, + { AdobeTokens->UsdTransform2d, {{ { TfToken("inputs:in"), SdfValueTypeNames->Float2 }, { TfToken("inputs:rotation"), SdfValueTypeNames->Float }, { TfToken("inputs:scale"), SdfValueTypeNames->Float2 }, @@ -345,6 +356,11 @@ ShaderRegistry::ShaderRegistry() }, { { TfToken("outputs:out"), SdfValueTypeNames->Color3f } }}}, + { MtlXTokens->ND_convert_color3_vector3, {{ + { TfToken("inputs:in"), SdfValueTypeNames->Color3f } + }, { + { TfToken("outputs:out"), SdfValueTypeNames->Float3 } + }}}, { MtlXTokens->ND_multiply_float, {{ { TfToken("inputs:in1"), SdfValueTypeNames->Float }, { TfToken("inputs:in2"), SdfValueTypeNames->Float } @@ -363,12 +379,25 @@ ShaderRegistry::ShaderRegistry() }, { { TfToken("outputs:out"), SdfValueTypeNames->Float3 } }}}, + { MtlXTokens->ND_mix_color3, {{ + { TfToken("inputs:fg"), SdfValueTypeNames->Color3f }, + { TfToken("inputs:bg"), SdfValueTypeNames->Color3f }, + { TfToken("inputs:mix"), SdfValueTypeNames->Float } + }, { + { TfToken("outputs:out"), SdfValueTypeNames->Color3f } + }}}, { MtlXTokens->ND_add_float, {{ { TfToken("inputs:in1"), SdfValueTypeNames->Float }, { TfToken("inputs:in2"), SdfValueTypeNames->Float } }, { { TfToken("outputs:out"), SdfValueTypeNames->Float } }}}, + { MtlXTokens->ND_subtract_float, {{ + { TfToken("inputs:in1"), SdfValueTypeNames->Float }, + { TfToken("inputs:in2"), SdfValueTypeNames->Float } + }, { + { TfToken("outputs:out"), SdfValueTypeNames->Float } + }}}, { MtlXTokens->ND_add_color3, {{ { TfToken("inputs:in1"), SdfValueTypeNames->Color3f }, { TfToken("inputs:in2"), SdfValueTypeNames->Color3f } @@ -381,6 +410,21 @@ ShaderRegistry::ShaderRegistry() }, { { TfToken("outputs:out"), SdfValueTypeNames->Float3 } }}}, + { MtlXTokens->ND_UsdUVTexture_23, {{ + { TfToken("inputs:file"), SdfValueTypeNames->Asset }, + { TfToken("inputs:st"), SdfValueTypeNames->Float2 }, + { TfToken("inputs:wrapS"), SdfValueTypeNames->String }, + { TfToken("inputs:wrapT"), SdfValueTypeNames->String }, + { TfToken("inputs:fallback"), SdfValueTypeNames->Float4 }, + { TfToken("inputs:scale"), SdfValueTypeNames->Float4 }, + { TfToken("inputs:bias"), SdfValueTypeNames->Float4 } + }, { + { TfToken("outputs:r"), SdfValueTypeNames->Float }, + { TfToken("outputs:g"), SdfValueTypeNames->Float }, + { TfToken("outputs:b"), SdfValueTypeNames->Float }, + { TfToken("outputs:a"), SdfValueTypeNames->Float }, + { TfToken("outputs:rgb"), SdfValueTypeNames->Color3f } + }}}, { MtlXTokens->ND_image_vector4, {{ { TfToken("inputs:texcoord"), SdfValueTypeNames->Float2 }, { TfToken("inputs:file"), SdfValueTypeNames->Asset }, @@ -418,10 +462,26 @@ ShaderRegistry::ShaderRegistry() { TfToken("outputs:out"), SdfValueTypeNames->Float } }}}, { MtlXTokens->ND_normalmap, {{ - { TfToken("inputs:in"), SdfValueTypeNames->Float3 } + { TfToken("inputs:in"), SdfValueTypeNames->Float3 }, + { TfToken("inputs:scale"), SdfValueTypeNames->Float }, + { TfToken("inputs:normal"), SdfValueTypeNames->Float3 }, + { TfToken("inputs:tangent"), SdfValueTypeNames->Float3 }, + { TfToken("inputs:bitangent"), SdfValueTypeNames->Float3 } }, { { TfToken("outputs:out"), SdfValueTypeNames->Float3 } }}}, + { MtlXTokens->ND_displacement_float, {{ + { TfToken("inputs:displacement"), SdfValueTypeNames->Float }, + { TfToken("inputs:scale"), SdfValueTypeNames->Float } + }, { + { TfToken("outputs:out"), SdfValueTypeNames->Token } + }}}, + { MtlXTokens->ND_geompropvalue_vector2, {{ + { TfToken("inputs:geomprop"), SdfValueTypeNames->String }, + { TfToken("inputs:default"), SdfValueTypeNames->Float2 } + }, { + { TfToken("outputs:out"), SdfValueTypeNames->Float2 } + }}}, { MtlXTokens->ND_open_pbr_surface_surfaceshader, {{ { TfToken("inputs:base_weight"), SdfValueTypeNames->Float }, { TfToken("inputs:base_color"), SdfValueTypeNames->Color3f }, @@ -464,21 +524,25 @@ ShaderRegistry::ShaderRegistry() { TfToken("inputs:geometry_coat_normal"), SdfValueTypeNames->Float3 }, { TfToken("inputs:geometry_tangent"), SdfValueTypeNames->Float3 }, { TfToken("inputs:geometry_coat_tangent"), SdfValueTypeNames->Float3 }, + // XXX Non-OpenPBR inputs we support for round-tripping purposes + // XXX turn displacement into actual MaterialX displacement + { TfToken("inputs:displacement"), SdfValueTypeNames->Float }, + { TfToken("inputs:occlusion"), SdfValueTypeNames->Float }, + { TfToken("inputs:anisotropyAngle"), SdfValueTypeNames->Float }, + { TfToken("inputs:coatSpecularLevel"), SdfValueTypeNames->Float }, + { TfToken("inputs:volumeThickness"), SdfValueTypeNames->Float }, }, { { TfToken("outputs:out"), SdfValueTypeNames->Token } }}}, // Adobe Standard Material surface node { AdobeTokens->adobeStandardMaterial, {{ - { TfToken("inputs:baseColor"), SdfValueTypeNames->Float3 }, + { TfToken("inputs:baseColor"), SdfValueTypeNames->Color3f }, { TfToken("inputs:roughness"), SdfValueTypeNames->Float }, { TfToken("inputs:metallic"), SdfValueTypeNames->Float }, { TfToken("inputs:opacity"), SdfValueTypeNames->Float }, - // XXX ASM doesn't actually have an opacityThreshold, which is a UsdPreviewSurface concept - // But we use it to carry the information about the threshold for transcoding uses - { TfToken("inputs:opacityThreshold"), SdfValueTypeNames->Float }, { TfToken("inputs:specularLevel"), SdfValueTypeNames->Float }, - { TfToken("inputs:specularEdgeColor"), SdfValueTypeNames->Float3 }, - { TfToken("inputs:normal"), SdfValueTypeNames->Float3 }, + { TfToken("inputs:specularEdgeColor"), SdfValueTypeNames->Color3f }, + { TfToken("inputs:normal"), SdfValueTypeNames->Normal3f }, { TfToken("inputs:normalScale"), SdfValueTypeNames->Float }, { TfToken("inputs:combineNormalAndHeight"), SdfValueTypeNames->Bool }, { TfToken("inputs:height"), SdfValueTypeNames->Float }, @@ -487,27 +551,27 @@ ShaderRegistry::ShaderRegistry() { TfToken("inputs:anisotropyLevel"), SdfValueTypeNames->Float }, { TfToken("inputs:anisotropyAngle"), SdfValueTypeNames->Float }, { TfToken("inputs:emissiveIntensity"), SdfValueTypeNames->Float }, - { TfToken("inputs:emissive"), SdfValueTypeNames->Float3 }, + { TfToken("inputs:emissive"), SdfValueTypeNames->Color3f }, { TfToken("inputs:sheenOpacity"), SdfValueTypeNames->Float }, - { TfToken("inputs:sheenColor"), SdfValueTypeNames->Float3 }, + { TfToken("inputs:sheenColor"), SdfValueTypeNames->Color3f }, { TfToken("inputs:sheenRoughness"), SdfValueTypeNames->Float }, { TfToken("inputs:translucency"), SdfValueTypeNames->Float }, { TfToken("inputs:IOR"), SdfValueTypeNames->Float }, { TfToken("inputs:dispersion"), SdfValueTypeNames->Float }, - { TfToken("inputs:absorptionColor"), SdfValueTypeNames->Float3 }, + { TfToken("inputs:absorptionColor"), SdfValueTypeNames->Color3f }, { TfToken("inputs:absorptionDistance"), SdfValueTypeNames->Float }, { TfToken("inputs:scatter"), SdfValueTypeNames->Bool }, - { TfToken("inputs:scatteringColor"), SdfValueTypeNames->Float3 }, + { TfToken("inputs:scatteringColor"), SdfValueTypeNames->Color3f }, { TfToken("inputs:scatteringDistance"), SdfValueTypeNames->Float }, { TfToken("inputs:scatteringDistanceScale"), SdfValueTypeNames->Float3 }, { TfToken("inputs:scatteringRedShift"), SdfValueTypeNames->Float }, { TfToken("inputs:scatteringRayleigh"), SdfValueTypeNames->Float }, { TfToken("inputs:coatOpacity"), SdfValueTypeNames->Float }, - { TfToken("inputs:coatColor"), SdfValueTypeNames->Float3 }, + { TfToken("inputs:coatColor"), SdfValueTypeNames->Color3f }, { TfToken("inputs:coatRoughness"), SdfValueTypeNames->Float }, { TfToken("inputs:coatIOR"), SdfValueTypeNames->Float }, { TfToken("inputs:coatSpecularLevel"), SdfValueTypeNames->Float }, - { TfToken("inputs:coatNormal"), SdfValueTypeNames->Float3 }, + { TfToken("inputs:coatNormal"), SdfValueTypeNames->Normal3f }, { TfToken("inputs:coatNormalScale"), SdfValueTypeNames->Float }, { TfToken("inputs:ambientOcclusion"), SdfValueTypeNames->Float }, { TfToken("inputs:volumeThickness"), SdfValueTypeNames->Float }, @@ -565,45 +629,36 @@ ShaderRegistry::ShaderRegistry() // Initialize asmInputRemapping // XXX This is incomplete m_asmInputRemapping = { - { AsmTokens->absorptionColor, { AsmTokens->absorptionColor, SdfValueTypeNames->Float3 } }, + { AsmTokens->absorptionColor, { AsmTokens->absorptionColor, SdfValueTypeNames->Color3f } }, { AsmTokens->absorptionDistance, { AsmTokens->absorptionDistance, SdfValueTypeNames->Float } }, { AsmTokens->ambientOcclusion, { AsmTokens->ambientOcclusion, SdfValueTypeNames->Float } }, { AsmTokens->anisotropyAngle, { AsmTokens->anisotropyAngle, SdfValueTypeNames->Float } }, { AsmTokens->anisotropyLevel, { AsmTokens->anisotropyLevel, SdfValueTypeNames->Float } }, - { AsmTokens->baseColor, { AsmTokens->baseColor, SdfValueTypeNames->Float3 } }, - { AsmTokens->coatColor, { AsmTokens->coatColor, SdfValueTypeNames->Float3 } }, + { AsmTokens->baseColor, { AsmTokens->baseColor, SdfValueTypeNames->Color3f } }, + { AsmTokens->coatColor, { AsmTokens->coatColor, SdfValueTypeNames->Color3f } }, { AsmTokens->coatIOR, { AsmTokens->coatIOR, SdfValueTypeNames->Float } }, - { AsmTokens->coatNormal, { AsmTokens->coatNormal, SdfValueTypeNames->Float3 } }, + { AsmTokens->coatNormal, { AsmTokens->coatNormal, SdfValueTypeNames->Normal3f } }, { AsmTokens->coatOpacity, { AsmTokens->coatOpacity, SdfValueTypeNames->Float } }, { AsmTokens->coatRoughness, { AsmTokens->coatRoughness, SdfValueTypeNames->Float } }, { AsmTokens->coatSpecularLevel, { AsmTokens->coatSpecularLevel, SdfValueTypeNames->Float } }, { AsmTokens->dispersion, { AsmTokens->dispersion, SdfValueTypeNames->Float } }, { AsmTokens->emissiveIntensity, { AsmTokens->emissiveIntensity, SdfValueTypeNames->Float } }, - { AsmTokens->emissive, { AsmTokens->emissive, SdfValueTypeNames->Float3 } }, + { AsmTokens->emissive, { AsmTokens->emissive, SdfValueTypeNames->Color3f } }, { AsmTokens->height, { AsmTokens->height, SdfValueTypeNames->Float } }, { AsmTokens->heightScale, { AsmTokens->heightScale, SdfValueTypeNames->Float } }, { AsmTokens->IOR, { AsmTokens->IOR, SdfValueTypeNames->Float } }, { AsmTokens->metallic, { AsmTokens->metallic, SdfValueTypeNames->Float } }, - { AsmTokens->normal, { AsmTokens->normal, SdfValueTypeNames->Float3 } }, + { AsmTokens->normal, { AsmTokens->normal, SdfValueTypeNames->Normal3f } }, { AsmTokens->normalScale, { AsmTokens->normalScale, SdfValueTypeNames->Float} }, { AsmTokens->opacity, { AsmTokens->opacity, SdfValueTypeNames->Float } }, - // The reason why opacityThreshold is present in this mapping is as follows: - // We have an opacityThreshold input on the central Material struct, but there is no such field on ASM. - // By injecting an entry here, the rest of the material utilities will happily put a opacityThreshold - // value on an ASM shader. Eclair will just ignore it. - // There are materials in GLTF where we take the alphaCutoff and store it in the opacityThreshold, if - // we didn't store in on the ASM material, it would be lost if we were to write a GLTF material again. - // That is why we allow this extra attribute/value that means nothing to ASM itself, but it carries - // information that is otherwise lost. - { UsdPreviewSurfaceTokens->opacityThreshold, { UsdPreviewSurfaceTokens->opacityThreshold, SdfValueTypeNames->Float } }, { AsmTokens->roughness, { AsmTokens->roughness, SdfValueTypeNames->Float } }, - { AsmTokens->scatteringColor, { AsmTokens->scatteringColor, SdfValueTypeNames->Float3 } }, + { AsmTokens->scatteringColor, { AsmTokens->scatteringColor, SdfValueTypeNames->Color3f } }, { AsmTokens->scatteringDistance, { AsmTokens->scatteringDistance, SdfValueTypeNames->Float } }, { AsmTokens->scatteringDistanceScale, { AsmTokens->scatteringDistanceScale, SdfValueTypeNames->Float3 } }, - { AsmTokens->sheenColor, { AsmTokens->sheenColor, SdfValueTypeNames->Float3 } }, + { AsmTokens->sheenColor, { AsmTokens->sheenColor, SdfValueTypeNames->Color3f } }, { AsmTokens->sheenOpacity, { AsmTokens->sheenOpacity, SdfValueTypeNames->Float } }, { AsmTokens->sheenRoughness, { AsmTokens->sheenRoughness, SdfValueTypeNames->Float } }, - { AsmTokens->specularEdgeColor, { AsmTokens->specularEdgeColor, SdfValueTypeNames->Float3 } }, + { AsmTokens->specularEdgeColor, { AsmTokens->specularEdgeColor, SdfValueTypeNames->Color3f } }, { AsmTokens->specularLevel, { AsmTokens->specularLevel, SdfValueTypeNames->Float } }, { AsmTokens->translucency, { AsmTokens->translucency, SdfValueTypeNames->Float } }, { AsmTokens->volumeThickness, { AsmTokens->volumeThickness, SdfValueTypeNames->Float } }, @@ -617,24 +672,24 @@ ShaderRegistry::ShaderRegistry() { OpenPbrTokens->base_metalness, { AsmTokens->metallic, SdfValueTypeNames->Float } }, { OpenPbrTokens->specular_weight, { OpenPbrMaterialInputTokens->specularWeight, SdfValueTypeNames->Float } }, { OpenPbrTokens->specular_color, { AsmTokens->specularEdgeColor, SdfValueTypeNames->Color3f } }, - { OpenPbrTokens->specular_roughness, { AsmTokens->roughness, SdfValueTypeNames->Float } }, + { OpenPbrTokens->specular_roughness, { OpenPbrMaterialInputTokens->specularRoughness, SdfValueTypeNames->Float } }, { OpenPbrTokens->specular_ior, { AsmTokens->IOR, SdfValueTypeNames->Float } }, - { OpenPbrTokens->specular_roughness_anisotropy, { AsmTokens->anisotropyLevel, SdfValueTypeNames->Float } }, - { OpenPbrTokens->transmission_weight, { AsmTokens->translucency, SdfValueTypeNames->Float } }, - { OpenPbrTokens->transmission_color, { AsmTokens->absorptionColor, SdfValueTypeNames->Color3f } }, - { OpenPbrTokens->transmission_depth, { AsmTokens->absorptionDistance, SdfValueTypeNames->Float } }, + { OpenPbrTokens->specular_roughness_anisotropy, { OpenPbrMaterialInputTokens->specularRoughnessAnisotropy, SdfValueTypeNames->Float } }, + { OpenPbrTokens->transmission_weight, { OpenPbrMaterialInputTokens->transmissionWeight , SdfValueTypeNames->Float } }, + { OpenPbrTokens->transmission_color, { OpenPbrMaterialInputTokens->transmissionColor , SdfValueTypeNames->Color3f } }, + { OpenPbrTokens->transmission_depth, { OpenPbrMaterialInputTokens->transmissionDepth , SdfValueTypeNames->Float } }, { OpenPbrTokens->transmission_scatter, { OpenPbrMaterialInputTokens->transmissionScatter, SdfValueTypeNames->Color3f } }, { OpenPbrTokens->transmission_scatter_anisotropy, { OpenPbrMaterialInputTokens->transmissionScatterAnisotropy, SdfValueTypeNames->Float } }, { OpenPbrTokens->transmission_dispersion_scale, { OpenPbrMaterialInputTokens->transmissionDispersionScale, SdfValueTypeNames->Float } }, { OpenPbrTokens->transmission_dispersion_abbe_number, { OpenPbrMaterialInputTokens->transmissionDispersionAbbeNumber, SdfValueTypeNames->Float } }, { OpenPbrTokens->subsurface_weight, { OpenPbrMaterialInputTokens->subsurfaceWeight, SdfValueTypeNames->Float } }, - { OpenPbrTokens->subsurface_color, { AsmTokens->scatteringColor, SdfValueTypeNames->Color3f } }, - { OpenPbrTokens->subsurface_radius, { AsmTokens->scatteringDistance, SdfValueTypeNames->Float } }, + { OpenPbrTokens->subsurface_color, { OpenPbrMaterialInputTokens->subsurfaceColor, SdfValueTypeNames->Color3f } }, + { OpenPbrTokens->subsurface_radius, { OpenPbrMaterialInputTokens->subsurfaceRadius, SdfValueTypeNames->Float } }, { OpenPbrTokens->subsurface_radius_scale, { OpenPbrMaterialInputTokens->subsurfaceRadiusScale, SdfValueTypeNames->Color3f } }, { OpenPbrTokens->subsurface_scatter_anisotropy, { OpenPbrMaterialInputTokens->subsurfaceScatterAnisotropy, SdfValueTypeNames->Float } }, { OpenPbrTokens->fuzz_weight, { OpenPbrMaterialInputTokens->fuzzWeight, SdfValueTypeNames->Float } }, - { OpenPbrTokens->fuzz_color, { AsmTokens->sheenColor, SdfValueTypeNames->Color3f } }, - { OpenPbrTokens->fuzz_roughness, { AsmTokens->sheenRoughness, SdfValueTypeNames->Float } }, + { OpenPbrTokens->fuzz_color, { OpenPbrMaterialInputTokens->fuzzColor, SdfValueTypeNames->Color3f } }, + { OpenPbrTokens->fuzz_roughness, { OpenPbrMaterialInputTokens->fuzzRoughness, SdfValueTypeNames->Float } }, { OpenPbrTokens->coat_weight, { AsmTokens->coatOpacity, SdfValueTypeNames->Float } }, { OpenPbrTokens->coat_color, { AsmTokens->coatColor, SdfValueTypeNames->Color3f } }, { OpenPbrTokens->coat_roughness, { AsmTokens->coatRoughness, SdfValueTypeNames->Float } }, @@ -652,6 +707,12 @@ ShaderRegistry::ShaderRegistry() { OpenPbrTokens->geometry_coat_normal, { AsmTokens->coatNormal, SdfValueTypeNames->Float3 } }, { OpenPbrTokens->geometry_tangent, { OpenPbrMaterialInputTokens->tangent, SdfValueTypeNames->Float3 } }, { OpenPbrTokens->geometry_coat_tangent, { OpenPbrMaterialInputTokens->coatTangent, SdfValueTypeNames->Float3 } }, + // Non-OpenPBR inputs + { UsdPreviewSurfaceTokens->displacement, { AsmTokens->height, SdfValueTypeNames->Float } }, + { UsdPreviewSurfaceTokens->occlusion, { AsmTokens->ambientOcclusion, SdfValueTypeNames->Float } }, + { AsmTokens->anisotropyAngle, { AsmTokens->anisotropyAngle, SdfValueTypeNames->Float } }, + { AsmTokens->coatSpecularLevel, {AsmTokens->coatSpecularLevel, SdfValueTypeNames->Float } }, + { AsmTokens->volumeThickness, { AsmTokens->volumeThickness, SdfValueTypeNames->Float } }, }; // clang-format on } diff --git a/utils/src/sdfUtils.cpp b/utils/src/sdfUtils.cpp index a97727cd..6adf7a36 100644 --- a/utils/src/sdfUtils.cpp +++ b/utils/src/sdfUtils.cpp @@ -68,6 +68,52 @@ _prependListOp(SdfAbstractData* data, const SdfPath& specPath, const TfToken& fi data->Set(specPath, field, SdfAbstractDataConstTypedValue(&listOp)); } +bool +_checkValueMatchesTypeName(const VtValue& value, + const SdfValueTypeName& typeName, + const SdfPath& path) +{ + // XXX This should be replaced with SdfValueTypeName::CanRepresent(), which was added on + // 09/16/25, when we upgrade to a more modern version of USD. + if (value.GetType() == typeName.GetType()) { + return true; + } + + TF_CODING_ERROR("Input value '%s' of type '%s' is incompatible with attribute '%s' of " + "type '%s' (%s)", + TfStringify(value).c_str(), + value.GetType().GetTypeName().c_str(), + path.GetName().c_str(), + typeName.GetAsToken().GetText(), + path.GetText()); + + return false; +} + +bool +_checkValueMatchesTypeName(const SdfAbstractDataConstValue& value, + const SdfValueTypeName& typeName, + const SdfPath& path) +{ + // XXX This should be replaced with SdfValueTypeName::CanRepresent(), which was added on + // 09/16/25, when we upgrade to a more modern version of USD. + if (TfSafeTypeCompare(typeName.GetType().GetTypeid(), value.valueType)) { + return true; + } + + TfType valueType = TfType::FindByTypeid(value.valueType); + // Note that we can't use TfStringify to print the value here, since it is not compatible with + // SdfAbstractDataConstValue. + TF_CODING_ERROR("Input value of type '%s' is incompatible with attribute '%s' of " + "type '%s' (%s)", + valueType.GetTypeName().c_str(), + path.GetName().c_str(), + typeName.GetAsToken().GetText(), + path.GetText()); + + return false; +} + } // end anonymous namespace namespace adobe::usd { @@ -187,9 +233,14 @@ createAttributeSpec(SdfAbstractData* data, const SdfValueTypeName& typeName, SdfVariability variability) { + assert(primPath.IsPrimOrPrimVariantSelectionPath()); SdfPath propertyPath = primPath.AppendProperty(attrName); - data->CreateSpec(propertyPath, SdfSpecTypeAttribute); + + bool hasAttr = data->HasSpec(propertyPath); + if (!hasAttr) { + data->CreateSpec(propertyPath, SdfSpecTypeAttribute); + } TfToken typeNameToken = typeName.GetAsToken(); data->Set(propertyPath, SdfFieldKeys->TypeName, SdfAbstractDataConstTypedValue(&typeNameToken)); @@ -198,7 +249,9 @@ createAttributeSpec(SdfAbstractData* data, propertyPath, SdfFieldKeys->Variability, SdfAbstractDataConstTypedValue(&variability)); } - _appendChild(data, primPath, SdfChildrenKeys->PropertyChildren, attrName); + if (!hasAttr) { + _appendChild(data, primPath, SdfChildrenKeys->PropertyChildren, attrName); + } return propertyPath; } @@ -215,18 +268,35 @@ setAttributeMetadata(SdfAbstractData* data, } void -setAttributeDefaultValue(SdfAbstractData* data, const SdfPath& propertyPath, const VtValue& value) +setAttributeDefaultValue(SdfAbstractData* data, + const SdfPath& propertyPath, + const VtValue& value, + const PXR_NS::SdfValueTypeName& typeName) { assert(propertyPath.IsPropertyPath()); + assert(typeName); + // We can always write an empty value + if (!value.IsEmpty() && !_checkValueMatchesTypeName(value, typeName, propertyPath)) { + return; + } data->Set(propertyPath, SdfFieldKeys->Default, value); } void setAttributeDefaultValue(SdfAbstractData* data, const SdfPath& propertyPath, - const SdfAbstractDataConstValue& value) + const SdfAbstractDataConstValue& value, + const PXR_NS::SdfValueTypeName& typeName) { assert(propertyPath.IsPropertyPath()); + assert(typeName); + // The type check is only valid if the incoming value is not of type void. + // We can always write an empty value. + if (!TfSafeTypeCompare(value.valueType, typeid(void))) { + if (!_checkValueMatchesTypeName(value, typeName, propertyPath)) { + return; + } + } data->Set(propertyPath, SdfFieldKeys->Default, value); } @@ -350,6 +420,7 @@ FileFormatDataBase::parseFromFileFormatArgs(const SdfLayer::FileFormatArguments& argReadBool(args, "writeUsdPreviewSurface", writeUsdPreviewSurface, debugTag); argReadBool(args, "writeASM", writeASM, debugTag); argReadBool(args, "writeOpenPBR", writeOpenPBR, debugTag); + argReadBool(args, "preserveExtraMaterialInfo", preserveExtraMaterialInfo, debugTag); argReadString(args, "assetsPath", assetsPath, debugTag); } diff --git a/utils/src/test.cpp b/utils/src/test.cpp index 64b282c8..38f995ae 100644 --- a/utils/src/test.cpp +++ b/utils/src/test.cpp @@ -11,8 +11,9 @@ governing permissions and limitations under the License. */ #include +#include #include - +#include #include #include #include @@ -36,14 +37,254 @@ PXR_NAMESPACE_CLOSE_SCOPE using namespace PXR_NS; -int +const float LIGHT_INTENSITY_EPSILON = 0.1f; + +/** + * ASSERT_EQ_VAL(actual, expected, msg, ...) + * + * Checks that `actual` and `expected` are equal. + * - For ints, floats, vectors uses `fuzzyEqual` for comparison. + * - For other types, uses `operator==`. + * - If an extra argument is provided, it's forwarded to `fuzzyEqual`. + * + * Returns: + * - success: execution continues. + * - failure: returns ::testing::AssertionFailure() with a detailed message. + * + * Example usage: + * ASSERT_EQ_VAL(value, expectedValue, "Value mismatch"); + * ASSERT_EQ_VAL(floatValue, expectedFloatValue, "Float value mismatch", 0.001f); + * ASSERT_EQ_VAL(value, expectedValue, "Value mistach", &failingIndex); + */ + +inline std::string +ToString(const VtValue& v) +{ + std::ostringstream ss; + VtStreamOut(v, ss); + return ss.str(); +} + +#define ASSERT_EQ_VAL(actual, expected, msg, ...) \ + do { \ + auto _res = AssertEqValHelper( \ + (actual), (expected), std::string(msg), __FILE__, __LINE__, ##__VA_ARGS__); \ + if (!_res.first) { \ + ::testing::AssertionResult ar = ::testing::AssertionFailure(); \ + ar << _res.second; \ + return ar; \ + } \ + } while (0) + +/** + * ASSERT_GE_VAL(actual, expected, msg) + * + * Checks that `actual` is greater than or equal to `expected`. + * If the check fails, returns a ::testing::AssertionFailure() + * with a detailed message including: + * + * Returns: + * - success: execution continues. + * - failure: returns ::testing::AssertionFailure() with a detailed message. + * + * Example usage: + * ASSERT_GE_VAL(value, 10, "Value should be at least 10"); + */ +#define ASSERT_GE_VAL(actual, expected, msg) \ + do { \ + if (!((actual) >= (expected))) { \ + std::ostringstream oss; \ + oss << msg << ": " << actual << " is not >= " << expected << "\n At " << __FILE__ \ + << ":" << __LINE__; \ + return ::testing::AssertionFailure() << oss.str(); \ + } \ + } while (0) + +/** + * ASSERT_CHECK(expr, ...) + * + * Macro wraps AssertCheckHelper. + * Evaluates the expression and returns a GoogleTest AssertionResult + * with an optional message. + * + * Returns: + * - success: execution continues. + * - failure: returns ::testing::AssertionFailure() with a detailed message. + * + * Example usage: + * ASSERT_CHECK(9 != 8, "Expected valid pointer"); + * ASSERT_CHECK(assertVec(vecA, vecB), "Vector mismatch"); + * ASSERT_CHECK(assertVec(vecA, vecB)); + * ASSERT_CHECK(prim); + * ASSERT_CHECK(prim, "Expected valid prim at path /World/MyPrim"); + */ +#define ASSERT_CHECK(expr, ...) \ + do { \ + auto _res = AssertCheckHelper((expr), __FILE__, __LINE__, ##__VA_ARGS__); \ + if (!_res.first) { \ + ::testing::AssertionResult ar = ::testing::AssertionFailure(); \ + ar << _res.second; \ + return ar; \ + } \ + } while (0) + +/** + * AssertCheckHelper(T&& expr, Msg&&... msg) + * Assertion helper that evaluates `expr` and returns a GoogleTest + * `AssertionSuccess()` or `AssertionFailure()`. Supports: + * 1. bool + * 2. ::testing::AssertionResult + * 3. Expressions returning bool (like x > y) + * 4. USD objects/handles (e.g. UsdPrim) + * + * Behavior: + * - If `expr` is true, returns `AssertionSuccess()`. + * - If `expr` is false, returns `AssertionFailure()` with a detailed message. + * - If `expr` is an `AssertionResult`, its `.message()` is included automatically. + * - Optional `msg` arguments are streamed into the failure message. + * - File and line information is appended automatically. + * + * Returns: + * - `::testing::AssertionSuccess()` if the expression is true. + * - `::testing::AssertionFailure()` with optional message and location if false. + */ +template +std::pair +AssertCheckHelper(T&& expr, const char* file, int line, Msg&&... msg) +{ + using DecayedT = std::decay_t; + bool ok = false; + + // Handle void expressions + if constexpr (std::is_void_v) { + std::ostringstream oss; + ((oss << msg), ...); + oss << " (ASSERT_CHECK called with a void expression!)" + << " At " << file << ":" << line; + return { false, oss.str() }; + } + // Raw pointers + else if constexpr (std::is_pointer_v) { + ok = (expr != nullptr); + } + // USD primitives + else if constexpr (std::is_same_v) { + ok = expr.IsValid(); + } + // (e.g expressions like x > y, smart pointers, ::testing::AssertionResult, etc) + else { + ok = static_cast(expr); + } + + if (ok) + return { true, "" }; + + std::ostringstream oss; + + if constexpr (std::is_same_v) { + oss << expr.message() << " " << std::endl; + } + + // Append any user-provided messages + ((oss << msg), ...); + oss << " At " << file << ":" << line; + + return { false, oss.str() }; +} + +struct ArchSystemResult +{ + int exitCode; + std::string output; // includes both stdout and stderr +}; + +/** + * utf8ToWstring + * + * Converts a UTF-8 encoded std::string to a wide-character std::wstring. + * + * On Windows, many APIs dealing with file paths, environment variables, + * or process creation (e.g., `_wfopen`, `_wstat`, `_wpopen`) expect + * `wchar_t*` (UTF-16) strings. If a file path or argument contains non-ASCII + * chars then passing a UTF-8 `std::string` will lead to errors. + * + * */ +inline std::wstring +utf8ToWstring(const std::string& str) +{ +#if defined(_WIN32) + if (str.empty()) + return L""; + int size_needed = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), (int)str.size(), NULL, 0); + std::wstring wstrTo(size_needed, 0); + MultiByteToWideChar(CP_UTF8, 0, str.c_str(), (int)str.size(), &wstrTo[0], size_needed); + return wstrTo; +#else + return std::wstring(str.begin(), str.end()); +#endif +} + +ArchSystemResult archSystem(const std::string& command) +/** + * Executes a system command and captures both its output and exit code. + * + * This function runs a shell command using the native platform mechanism: + * - On Windows, it uses `cmd /c` with `_popen()` to execute the command. + * - On macOS and Linux, it uses `popen()` directly. + * + * In both cases, standard error (stderr) is redirected to standard output (stdout), + * so the captured output includes all text printed by the command. + * + * @param command The system command to execute (e.g., "ls -l" or "dir"). + * + * @return An `ArchSystemResult` struct containing: + * - `exitCode`: The exit code returned by the process (or -1 if execution failed). + * - `output`: The combined standard output and standard error of the command. + * + * @note The command runs synchronously — the function will block until it finishes. + * @note On Windows, the exit code is obtained from `_pclose()`, and on Unix-like systems from + * `pclose()`. + * + */ { + ArchSystemResult result; + result.exitCode = -1; + std::array buffer{}; + std::string output; + #if defined(_WIN32) - return _wsystem(ArchWindowsUtf8ToUtf16(command).c_str()); + // convert command to wide string for UTF-8 support + std::wstring wCommand = utf8ToWstring(command + " 2>&1"); + std::unique_ptr pipe(_wpopen(wCommand.c_str(), L"r"), _pclose); + if (!pipe) { + result.output = "Failed to open pipe"; + return result; + } + + while (fgets(buffer.data(), (int)buffer.size(), pipe.get()) != nullptr) + output += buffer.data(); + + FILE* rawPipe = pipe.release(); + result.exitCode = _pclose(rawPipe); + #else - return system(command.c_str()); + std::string fullCmd = command + " 2>&1"; + std::unique_ptr pipe(popen(fullCmd.c_str(), "r"), pclose); + if (!pipe) { + result.output = "Failed to open pipe"; + return result; + } + + while (fgets(buffer.data(), buffer.size(), pipe.get()) != nullptr) + output += buffer.data(); + + FILE* rawPipe = pipe.release(); + result.exitCode = pclose(rawPipe); #endif + + result.output = output; + return result; } template @@ -72,7 +313,7 @@ readPrimvar(UsdGeomPrimvarsAPI& api, const TfToken& name, Primvar& primvar) * fuzzyEqual for integer types is just the == operator */ template -constexpr typename std::enable_if::value, bool>::type +[[nodiscard]] constexpr typename std::enable_if::value, bool>::type fuzzyEqual(IntLike a, IntLike b) { return a == b; @@ -83,8 +324,9 @@ fuzzyEqual(IntLike a, IntLike b) * parameter, epsilon, that defaults to 1e-6 */ template -constexpr typename std::enable_if::value, bool>::type -fuzzyEqual(FloatLike a, FloatLike b, FloatLike epsilon = 1e-6) +[[nodiscard]] constexpr + typename std::enable_if::value, bool>::type + fuzzyEqual(FloatLike a, FloatLike b, FloatLike epsilon = 1e-6) { return std::abs(a - b) < epsilon; } @@ -100,10 +342,10 @@ fuzzyEqual(FloatLike a, FloatLike b, FloatLike epsilon = 1e-6) * - Vec has a static dimension field */ template -typename std::enable_if::value && - std::is_arithmetic()[0])>::type>::value, - bool>::type +[[nodiscard]] typename std::enable_if::value && + std::is_arithmetic()[0])>::type>::value, + bool>::type fuzzyEqual(const Vec& a, const Vec& b, size_t* failingIndex = nullptr) { for (size_t i = 0; i < Vec::dimension; ++i) { @@ -117,34 +359,85 @@ fuzzyEqual(const Vec& a, const Vec& b, size_t* failingIndex = nullptr) return true; } -#define ASSERT_ARRAY(...) assertArray(__VA_ARGS__) +// Trait to detect GfVec types automatically +template +struct is_gfvec : std::false_type +{}; + +template +struct is_gfvec()[0])>> + : std::true_type +{}; + +/** + * AssertEqValHelper + * + * Compares two values `actual` and `expected` and returns a ::testing::AssertionResult. + * Different comparison methods are used based on the value types: + * 1. Integer types (int): + * - Calls `fuzzyEqual for ints. + * 2. Floating-point types (float): + * - Calls `fuzzyEqual` for aproximate comparison. + * - If an additional argument is passed, it's used as the epsilon for comparison.' + * 3. Vector-like or container types (std::vector): + * - Calls 'fuzzyEqual' for element-wise comparison. + * - If an additional argument is passed, it's used as a failing index pointer. + * Returns: + * - ::testing::AssertionSuccess() if values are equal according to the comparison rules. + * - ::testing::AssertionFailure() with a detailed message, failure location, and + * actual and expected values. + */ +template +std::pair +AssertEqValHelper(const T& actual, + const U& expected, + const std::string& msg, + const char* file, + int line, + Args&&... args) +{ + bool equal = false; + + if constexpr ((std::is_arithmetic_v && std::is_arithmetic_v) || + (is_gfvec::value && is_gfvec::value)) { + equal = fuzzyEqual(actual, expected, std::forward(args)...); + } else { + equal = (actual == expected); + } + + if (equal) { + return { true, "" }; // Success + } + + std::ostringstream oss; + oss << msg << " mismatch: " << actual << " vs " << expected << "\n" + << " At " << file << ":" << line; + + return { false, oss.str() }; +} + template -void -assertArray(VtArray& actual, +[[nodiscard]] ::testing::AssertionResult +assertArray(const pxr::VtArray& actual, const ArrayData& expected, const std::string& name) // test a subset of the array { - ASSERT_EQ(actual.size(), expected.size) << name << " does not have the expected number of elements"; - ASSERT_GE(actual.size(), expected.values.size()) << "There are fewer " << name << " than elements to be checked."; - bool arraysMatch = true; + ASSERT_EQ_VAL(actual.size(), expected.size, name + " element count"); + ASSERT_GE_VAL(actual.size(), + expected.values.size(), + "There are fewer " + name + " than elements to be checked."); size_t i; for (i = 0; i < expected.values.size(); i++) { - if (!fuzzyEqual(actual[i], expected.values[i])) { - arraysMatch = false; - break; - } + ASSERT_EQ_VAL( + actual[i], expected.values[i], name + " element at index " + std::to_string(i)); } - ASSERT_TRUE(arraysMatch) << "Variable: " << name << ". Elements at [" << i - << "] differ. Actual = " << actual[i] - << ", Expected = " << expected.values[i]; + + return ::testing::AssertionSuccess(); } -#define ASSERT_VEC(...) assertVec(__VA_ARGS__) -template -void -assertVec(const GfVec& actual, - const GfVec& expected, - std::string msg = "") +template +[[nodiscard]] ::testing::AssertionResult +assertVec(const GfVec& actual, const GfVec& expected, std::string msg = "") { if (msg != "") { // Add a space after the message if it's not empty @@ -152,15 +445,14 @@ assertVec(const GfVec& actual, } // If the vectors are not equal, idx will be set to the index where they differ - size_t idx; + size_t idx = 0; + + ASSERT_EQ_VAL(actual, expected, msg + " Vector dimension", &idx); - ASSERT_TRUE(fuzzyEqual(actual, expected, &idx)) - << msg << "Elements at [" << idx << "] differ. Actual = " << actual[idx] - << ", Expected = " << expected[idx]; + return ::testing::AssertionSuccess(); } -#define ASSERT_QUATF(...) assertQuatf(__VA_ARGS__) -void +[[nodiscard]] ::testing::AssertionResult assertQuatf(const PXR_NS::GfQuatf& actual, const PXR_NS::GfQuatf& expected, std::string msg = "") // test a quaternion of floats @@ -170,36 +462,45 @@ assertQuatf(const PXR_NS::GfQuatf& actual, msg += ": "; } - ASSERT_TRUE(fuzzyEqual(actual.GetReal(), expected.GetReal())) - << msg << "Real elements differ. Actual = " << actual.GetReal() - << ", Expected = " << expected.GetReal(); + ASSERT_EQ_VAL(actual.GetReal(), expected.GetReal(), msg + "Real elements"); + ASSERT_CHECK(assertVec( + actual.GetImaginary(), expected.GetImaginary(), msg + "GfQuatf imaginary component")); - ASSERT_VEC(actual.GetImaginary(), expected.GetImaginary(), msg + "GfQuatf imaginary component"); + return ::testing::AssertionSuccess(); } -void +::testing::AssertionResult assertPrim(PXR_NS::UsdStageRefPtr stage, const std::string& path) { + ASSERT_CHECK(stage); UsdPrim prim = stage->GetPrimAtPath(SdfPath(path)); - ASSERT_TRUE(prim); + ASSERT_CHECK(prim); + + return ::testing::AssertionSuccess(); } -void +::testing::AssertionResult assertNode(UsdStageRefPtr stage, const std::string& path) { + ASSERT_CHECK(stage); UsdPrim prim = stage->GetPrimAtPath(SdfPath(path)); - ASSERT_TRUE(prim); + ASSERT_CHECK(prim); UsdGeomXform xform(prim); - ASSERT_TRUE(xform); + ASSERT_CHECK(xform); + + return ::testing::AssertionSuccess(); } -void +::testing::AssertionResult assertMesh(PXR_NS::UsdStageRefPtr stage, const std::string& path, const MeshData& data) { + ASSERT_CHECK(stage); UsdPrim prim = stage->GetPrimAtPath(SdfPath(path)); - ASSERT_TRUE(prim); + ASSERT_CHECK(prim); + UsdGeomMesh geomMesh(prim); - ASSERT_TRUE(geomMesh); + ASSERT_CHECK(geomMesh); + UsdGeomPrimvarsAPI primvarsAPI(geomMesh); VtIntArray faceVertexCounts; @@ -225,36 +526,46 @@ assertMesh(PXR_NS::UsdStageRefPtr stage, const std::string& path, const MeshData readPrimvar(primvarsAPI, UsdGeomTokens->primvarsDisplayColor, displayColor); readPrimvar(primvarsAPI, UsdGeomTokens->primvarsDisplayOpacity, displayOpacity); - ASSERT_ARRAY(faceVertexCounts, data.faceVertexCounts, "faceVertexCounts"); - ASSERT_ARRAY(faceVertexIndices, data.faceVertexIndices, "faceVertexIndices"); - ASSERT_ARRAY(points, data.points, "points"); - ASSERT_ARRAY(normals.values, data.normals.values, "normals.values"); - ASSERT_ARRAY(normals.indices, data.normals.indices, "normals.indices"); - ASSERT_ARRAY(uvs.values, data.uvs.values, "uvs.values"); - ASSERT_ARRAY(uvs.indices, data.uvs.indices, "uvs.indices"); - ASSERT_ARRAY(displayColor.values, data.displayColor.values, "displayColor.values"); - ASSERT_ARRAY(displayColor.indices, data.displayColor.indices, "displayColor.indices"); - ASSERT_ARRAY(displayOpacity.values, data.displayOpacity.values, "displayOpacity.values"); - ASSERT_ARRAY(displayOpacity.indices, data.displayOpacity.indices, "displayOpacity.indices"); + ASSERT_CHECK(assertArray(faceVertexCounts, data.faceVertexCounts, "faceVertexCounts")); + ASSERT_CHECK(assertArray(faceVertexIndices, data.faceVertexIndices, "faceVertexIndices")); + ASSERT_CHECK(assertArray(points, data.points, "points")); + ASSERT_CHECK(assertArray(normals.values, data.normals.values, "normals.values")); + ASSERT_CHECK(assertArray(normals.indices, data.normals.indices, "normals.indices")); + ASSERT_CHECK(assertArray(uvs.values, data.uvs.values, "uvs.values")); + ASSERT_CHECK(assertArray(uvs.indices, data.uvs.indices, "uvs.indices")); + ASSERT_CHECK(assertArray(displayColor.values, data.displayColor.values, "displayColor.values")); + ASSERT_CHECK( + assertArray(displayColor.indices, data.displayColor.indices, "displayColor.indices")); + ASSERT_CHECK( + assertArray(displayOpacity.values, data.displayOpacity.values, "displayOpacity.values")); + ASSERT_CHECK( + assertArray(displayOpacity.indices, data.displayOpacity.indices, "displayOpacity.indices")); + if (normals.indices.size()) { - ASSERT_EQ(normals.interpolation, data.normals.interpolation); + ASSERT_EQ_VAL(normals.interpolation, data.normals.interpolation, "Normals interpolation"); } - if (uvs.indices.size()) { - ASSERT_EQ(uvs.interpolation, data.uvs.interpolation); + if (uvs.indices.size() && uvs.interpolation != data.uvs.interpolation) { + ASSERT_EQ_VAL(uvs.interpolation, data.uvs.interpolation, "Normals interpolation"); } if (displayColor.indices.size()) { - ASSERT_EQ(displayColor.interpolation, data.displayColor.interpolation); + ASSERT_EQ_VAL(displayColor.interpolation, + data.displayColor.interpolation, + "DisplayColor interpolation"); } if (displayOpacity.indices.size()) { - ASSERT_EQ(displayOpacity.interpolation, data.displayOpacity.interpolation); + ASSERT_EQ_VAL(displayOpacity.interpolation, + data.displayOpacity.interpolation, + "DisplayOpacity interpolation"); } + return ::testing::AssertionSuccess(); } -void +::testing::AssertionResult assertAnimation(PXR_NS::UsdStageRefPtr stage, const std::string& path, const AnimationData& data) { + ASSERT_CHECK(stage); UsdPrim prim = stage->GetPrimAtPath(SdfPath(path)); - ASSERT_TRUE(prim); + ASSERT_CHECK(prim); // We only test the animation samples given in the data. This means that the data can have fewer // samples than the actual USD, so that the entire animation doesn't have to be copied into the @@ -262,69 +573,72 @@ assertAnimation(PXR_NS::UsdStageRefPtr stage, const std::string& path, const Ani for (auto pair = data.orient.begin(); pair != data.orient.end(); pair++) { float time = pair->first; - GfQuatf orientValue; extractUsdAttribute( prim, TfToken("xformOp:orient"), &orientValue, UsdTimeCode(time)); - ASSERT_QUATF(orientValue, - data.orient.at(time), - std::string("xformOp:orient[") + std::to_string(time) + "]"); + ASSERT_CHECK(assertQuatf(orientValue, + data.orient.at(time), + std::string("xformOp:orient[") + std::to_string(time) + "]")); } for (auto pair = data.scale.begin(); pair != data.scale.end(); pair++) { float time = pair->first; - GfVec3f scaleValue; extractUsdAttribute( prim, TfToken("xformOp:scale"), &scaleValue, UsdTimeCode(time)); - ASSERT_VEC(scaleValue, - data.scale.at(time), - std::string("xformOp:scale[") + std::to_string(time) + "]"); + ASSERT_CHECK(assertVec(scaleValue, + data.scale.at(time), + std::string("xformOp:scale[") + std::to_string(time) + "]")); } for (auto pair = data.translate.begin(); pair != data.translate.end(); pair++) { float time = pair->first; - GfVec3d translateValue; extractUsdAttribute( prim, TfToken("xformOp:translate"), &translateValue, UsdTimeCode(time)); - ASSERT_VEC(translateValue, - data.translate.at(time), - std::string("xformOp:translate[") + std::to_string(time) + "]"); + ASSERT_CHECK(assertVec(translateValue, + data.translate.at(time), + std::string("xformOp:translate[") + std::to_string(time) + "]")); } + + return ::testing::AssertionSuccess(); } -void +::testing::AssertionResult assertCamera(PXR_NS::UsdStageRefPtr stage, const std::string& path, const CameraData& cameraData) { const bool WARN_IF_ATTRIBUTE_NOT_FOUND = false; + ASSERT_CHECK(stage); UsdPrim prim = stage->GetPrimAtPath(SdfPath(path)); - ASSERT_TRUE(prim); + ASSERT_CHECK(prim); // The transformations for cameras in our USD assets tend to be stored by a parent node. We // first verify that the camera's transform is correct by extracting it from the prim's parent UsdPrim parent = prim.GetParent(); - ASSERT_TRUE(parent); + ASSERT_CHECK(parent); GfVec3d translation; GfQuatf rotation; GfVec3f scale; if (extractUsdAttribute(parent, TfToken("xformOp:translate"), &translation)) { - ASSERT_VEC( - translation, cameraData.translate, path + "'s parent translation does not match\n"); + ASSERT_CHECK(assertVec( + translation, cameraData.translate, path + "'s parent translation does not match")); } else if (WARN_IF_ATTRIBUTE_NOT_FOUND) { TF_WARN("No translation attribute found for %s\n", path.c_str()); } + if (extractUsdAttribute(parent, TfToken("xformOp:orient"), &rotation)) { - ASSERT_QUATF(rotation, cameraData.orient, path + "'s parent rotation does not match\n"); + ASSERT_CHECK( + assertQuatf(rotation, cameraData.orient, path + "'s parent rotation does not match")); } else if (WARN_IF_ATTRIBUTE_NOT_FOUND) { TF_WARN("No rotation attribute found for %s\n", path.c_str()); } + if (extractUsdAttribute(parent, TfToken("xformOp:scale"), &scale)) { - ASSERT_VEC(scale, cameraData.scale, path + "'s parent scale does not match\n"); + ASSERT_CHECK(assertVec(scale, cameraData.scale, path + "'s parent scale does not match")); } else if (WARN_IF_ATTRIBUTE_NOT_FOUND) { TF_WARN("No scale attribute found for %s\n", path.c_str()); } @@ -332,75 +646,74 @@ assertCamera(PXR_NS::UsdStageRefPtr stage, const std::string& path, const Camera // Next, we check the camera data itself UsdGeomCamera camera(prim); - ASSERT_TRUE(camera) << path << " could not be cast to camera\n"; + ASSERT_CHECK(camera, "camera at path: " + path); GfVec2f clippingRange; if (camera.GetClippingRangeAttr().Get(&clippingRange)) { - ASSERT_VEC( - clippingRange, cameraData.clippingRange, path + "'s clipping range does not match\n"); + ASSERT_CHECK(assertVec( + clippingRange, cameraData.clippingRange, path + "'s clipping range does not match")); } else if (WARN_IF_ATTRIBUTE_NOT_FOUND) { TF_WARN("No clipping range attribute found for %s\n", path.c_str()); } float focalLength; if (camera.GetFocalLengthAttr().Get(&focalLength)) { - ASSERT_FLOAT_EQ(focalLength, cameraData.focalLength) - << path << " focal length does not match\n"; + ASSERT_EQ_VAL(focalLength, cameraData.focalLength, path + " focal length"); } else if (WARN_IF_ATTRIBUTE_NOT_FOUND) { TF_WARN("No focal length attribute found for %s\n", path.c_str()); } float focusDistance; if (camera.GetFocusDistanceAttr().Get(&focusDistance)) { - ASSERT_FLOAT_EQ(focusDistance, cameraData.focusDistance) - << path << " focus distance does not match\n"; + ASSERT_EQ_VAL(focusDistance, cameraData.focusDistance, path + "'s focus distance"); } else if (WARN_IF_ATTRIBUTE_NOT_FOUND) { TF_WARN("No focus distance attribute found for %s\n", path.c_str()); } float fStop; if (camera.GetFStopAttr().Get(&fStop)) { - ASSERT_FLOAT_EQ(fStop, cameraData.fStop) << path << " fStop does not match\n"; + ASSERT_EQ_VAL(fStop, cameraData.fStop, path + " fStop does not match"); } else if (WARN_IF_ATTRIBUTE_NOT_FOUND) { TF_WARN("No fStop attribute found for %s\n", path.c_str()); } float horizontalAperture; if (camera.GetHorizontalApertureAttr().Get(&horizontalAperture)) { - ASSERT_FLOAT_EQ(horizontalAperture, cameraData.horizontalAperture) - << path << " horizontal aperture does not match\n"; + ASSERT_EQ_VAL( + horizontalAperture, cameraData.horizontalAperture, path + "'s horizontal aperture"); } else if (WARN_IF_ATTRIBUTE_NOT_FOUND) { TF_WARN("No horizontal aperture attribute found for %s\n", path.c_str()); } TfToken projection; if (camera.GetProjectionAttr().Get(&projection)) { - ASSERT_EQ(projection, TfToken(cameraData.projection)) - << path << " projection does not match\n"; + ASSERT_EQ_VAL(projection, TfToken(cameraData.projection), path + "'s projection"); } else if (WARN_IF_ATTRIBUTE_NOT_FOUND) { TF_WARN("No projection attribute found for %s\n", path.c_str()); } float verticalAperture; if (camera.GetVerticalApertureAttr().Get(&verticalAperture)) { - ASSERT_FLOAT_EQ(verticalAperture, cameraData.verticalAperture) - << path << " vertical aperture does not match\n"; + ASSERT_EQ_VAL(verticalAperture, cameraData.verticalAperture, path + "'s vertical aperture"); } else if (WARN_IF_ATTRIBUTE_NOT_FOUND) { TF_WARN("No vertical aperture attribute found for %s\n", path.c_str()); } + + return ::testing::AssertionSuccess(); } -void +::testing::AssertionResult assertLight(PXR_NS::UsdStageRefPtr stage, const std::string& path, const LightData& lightData) { + ASSERT_CHECK(stage); UsdPrim prim = stage->GetPrimAtPath(SdfPath(path)); - ASSERT_TRUE(prim); + ASSERT_CHECK(prim); // The transformations for lights in our USD assets tend to be stored by a parent node. We // first verify that the light's transform is correct by extracting it from the prim's parent UsdPrim parent = prim.GetParent(); - ASSERT_TRUE(parent); + ASSERT_CHECK(parent); GfVec3d translation; GfQuatf rotation; @@ -408,133 +721,137 @@ assertLight(PXR_NS::UsdStageRefPtr stage, const std::string& path, const LightDa // The transformations for lights in our USD assets tend to be stored by a parent node if (lightData.translation) { - ASSERT_TRUE( - extractUsdAttribute(parent, TfToken("xformOp:translate"), &translation)) - << "Expected translation attribute not found for " << path << "\n"; - ASSERT_VEC(translation, - lightData.translation.value(), - path + "'s parent translation does not match\n"); + ASSERT_CHECK( + extractUsdAttribute(parent, TfToken("xformOp:translate"), &translation), + "Expected translate attribute at " + path); + ASSERT_CHECK( + assertVec(translation, lightData.translation.value(), path + " parent translation")); } + if (lightData.rotation) { - ASSERT_TRUE(extractUsdAttribute(parent, TfToken("xformOp:orient"), &rotation)) - << "Expected orient attribute not found for " << path << "\n"; - ASSERT_QUATF( - rotation, lightData.rotation.value(), path + "'s parent rotation does not match\n"); + ASSERT_CHECK(extractUsdAttribute(parent, TfToken("xformOp:orient"), &rotation), + "Expected orient attribute at " + path); + ASSERT_CHECK(assertQuatf(rotation, lightData.rotation.value(), path + " parent rotation")); } + if (lightData.scale) { - ASSERT_TRUE(extractUsdAttribute(parent, TfToken("xformOp:scale"), &scale)) - << "Expected scale attribute not found for " << path << "\n"; - ASSERT_VEC(scale, lightData.scale.value(), path + "'s parent scale does not match\n"); + ASSERT_CHECK(extractUsdAttribute(parent, TfToken("xformOp:scale"), &scale), + "Expected scale attribute not found for " + path); + ASSERT_CHECK(assertVec(scale, lightData.scale.value(), path + " parent scale")); } // Next, we check the light data itself if (prim.IsA()) { UsdLuxSphereLight sphereLight(prim); - ASSERT_TRUE(sphereLight) << path << " could not be cast to sphere light\n"; + ASSERT_CHECK(sphereLight, "UsdLuxSphereLight for path " + path); if (lightData.color) { PXR_NS::GfVec3f color; - ASSERT_TRUE(sphereLight.GetColorAttr().Get(&color)) - << path << " is missing expected color attribute\n"; - ASSERT_VEC(color, lightData.color.value(), path + " color does not match\n"); + ASSERT_CHECK(sphereLight.GetColorAttr().Get(&color), + "Expected color attribute at " + path); + ASSERT_CHECK(assertVec(color, lightData.color.value(), path + " color")); } if (lightData.intensity) { float intensity; - ASSERT_TRUE(sphereLight.GetIntensityAttr().Get(&intensity)) - << path << " is missing expected intensity attribute\n"; - ASSERT_FLOAT_EQ(intensity, lightData.intensity.value()) - << path << " intensity does not match\n"; + ASSERT_CHECK(sphereLight.GetIntensityAttr().Get(&intensity), + "Expected intensity attribute at " + path); + ASSERT_EQ_VAL( + intensity, lightData.intensity.value(), path + " intensity", LIGHT_INTENSITY_EPSILON); } if (lightData.radius) { float radius; - ASSERT_TRUE(sphereLight.GetRadiusAttr().Get(&radius)) - << path << " is missing expected radius attribute\n"; - ASSERT_FLOAT_EQ(radius, lightData.radius.value()) << path << " radius does not match\n"; + ASSERT_CHECK(sphereLight.GetRadiusAttr().Get(&radius), + "Expected radius attribute at " + path); + ASSERT_EQ_VAL(radius, lightData.radius.value(), path + "'s radius"); } } else if (prim.IsA()) { UsdLuxDistantLight distantLight(prim); - ASSERT_TRUE(distantLight) << path << " could not be cast to distant light\n"; + ASSERT_CHECK(distantLight, "Distant light for path " + path); if (lightData.color) { PXR_NS::GfVec3f color; - ASSERT_TRUE(distantLight.GetColorAttr().Get(&color)) - << path << " is missing expected color attribute\n"; - ASSERT_VEC(color, lightData.color.value(), path + " color does not match\n"); + ASSERT_CHECK(distantLight.GetColorAttr().Get(&color), + "Expected color attribute at " + path); + ASSERT_CHECK( + assertVec(color, lightData.color.value(), path + " color does not match\n")); } if (lightData.intensity) { float intensity; - ASSERT_TRUE(distantLight.GetIntensityAttr().Get(&intensity)) - << path << " is missing expected intensity attribute\n"; - ASSERT_FLOAT_EQ(intensity, lightData.intensity.value()) - << path << " intensity does not match\n"; + ASSERT_CHECK(distantLight.GetIntensityAttr().Get(&intensity), + "Intensity attribute at " + path); + ASSERT_EQ_VAL(intensity, + lightData.intensity.value(), + path + "'s intensity", + LIGHT_INTENSITY_EPSILON); } // Distant lights don't have a radius } else if (prim.IsA()) { UsdLuxDiskLight diskLight(prim); - ASSERT_TRUE(diskLight) << path << " could not be cast to disk light\n"; + ASSERT_CHECK(diskLight, "Disk light for path " + path); if (lightData.color) { - PXR_NS::GfVec3f color; - ASSERT_TRUE(diskLight.GetColorAttr().Get(&color)) - << path << " is missing expected color attribute\n"; - ASSERT_VEC(color, lightData.color.value(), path + " color does not match\n"); + GfVec3f color; + ASSERT_CHECK(diskLight.GetColorAttr().Get(&color), + "Expected color attribute at " + path); + ASSERT_CHECK(assertVec(color, lightData.color.value(), path + " color")); } if (lightData.intensity) { float intensity; - ASSERT_TRUE(diskLight.GetIntensityAttr().Get(&intensity)) - << path << " is missing expected intensity attribute\n"; - ASSERT_FLOAT_EQ(intensity, lightData.intensity.value()) - << path << " intensity does not match\n"; + ASSERT_CHECK(diskLight.GetIntensityAttr().Get(&intensity), + "Expected intensity attribute at " + path); + ASSERT_EQ_VAL(intensity, + lightData.intensity.value(), + path + "'s light intensity", + LIGHT_INTENSITY_EPSILON); } if (lightData.radius) { float radius; - ASSERT_TRUE(diskLight.GetRadiusAttr().Get(&radius)) - << path << " is missing expected radius attribute\n"; - ASSERT_FLOAT_EQ(radius, lightData.radius.value()) << path << " radius does not match\n"; + ASSERT_CHECK(diskLight.GetRadiusAttr().Get(&radius), + "Expected radius attribute at " + path); + ASSERT_EQ_VAL(radius, lightData.radius.value(), path + "'s radius"); } } else if (prim.IsA()) { - ASSERT_TRUE(false) << "Rectangle lights are not supported yet on import\n"; + return ::testing::AssertionFailure() + << "lights are not supported yet on import; Rectangle lights at " << path; /* Uncomment this once we support import of rectangle lights - UsdLuxRectLight rectLight(prim); ASSERT_TRUE(rectLight); - ASSERT_VEC(rectLight.color, lightData.color); ASSERT_FLOAT_EQ(rectLight.intensity, lightData.intensity); + ADD_FAILURE() << "Rectangle lights not supported yet: " << path << "\n"; + return false; // Rectangle specific attributes ASSERT_FLOAT_EQ(rectLight.length[0], lightData.length[0]); ASSERT_FLOAT_EQ(rectLight.length[1], lightData.length[1]); */ } else if (prim.IsA()) { - ASSERT_TRUE(false) << "Dome lights are not supported yet on import\n"; + return ::testing::AssertionFailure() + << "Dome lights are not supported yet on import; Dome lights at " << path; /* Uncomment this once we support import of dome lights - UsdLuxDomeLight domeLight(prim); ASSERT_TRUE(domeLight); - ASSERT_VEC(domeLight.color, lightData.color); ASSERT_FLOAT_EQ(domeLight.intensity, lightData.intensity); - - // Add texture test once we support this on import + // Add texture test once we support this on import */ } else { - ASSERT_TRUE(false) << "Expected a supported light, but encountered a prim of type \"" - << prim.GetTypeName().GetString() << "\" at \"" << path << "\"\n"; + return ::testing::AssertionFailure() + << "Encountered prim of type " << prim.GetTypeName().GetString() << " at " << path; } // Spotlights use shaping APIs @@ -545,145 +862,152 @@ assertLight(PXR_NS::UsdStageRefPtr stage, const std::string& path, const LightDa if (lightData.coneAngle) { float coneAngle; - ASSERT_TRUE(shapingAPI.GetShapingConeAngleAttr().Get(&coneAngle)) - << path << " is missing expected angle attribute\n"; - ASSERT_FLOAT_EQ(coneAngle, lightData.coneAngle.value()) - << path << " cone angle does not match\n"; + ASSERT_CHECK(shapingAPI.GetShapingConeAngleAttr().Get(&coneAngle), + "Cone angle attribute at " + path); + ASSERT_EQ_VAL(coneAngle, lightData.coneAngle.value(), path + "'s cone angle"); } if (lightData.coneFalloff) { float coneFalloff; - ASSERT_TRUE(shapingAPI.GetShapingConeSoftnessAttr().Get(&coneFalloff)) - << path << " is missing expected softness attribute\n"; - ASSERT_FLOAT_EQ(coneFalloff, lightData.coneFalloff.value()) - << path << " cone falloff does not match\n"; + ASSERT_CHECK(shapingAPI.GetShapingConeSoftnessAttr().Get(&coneFalloff), + "Cone falloff attribute at " + path); + ASSERT_EQ_VAL(coneFalloff, lightData.coneFalloff.value(), path + "'s cone falloff"); } } + return ::testing::AssertionSuccess(); } -void +::testing::AssertionResult assertDisplayName(PXR_NS::UsdStageRefPtr stage, const std::string& primPath, const std::string& displayName) { + ASSERT_CHECK(stage); UsdPrim prim = stage->GetPrimAtPath(SdfPath(primPath)); - ASSERT_TRUE(prim) << primPath << " not found when verifying prim had proper display name\n"; - ASSERT_EQ(prim.GetDisplayName(), displayName) - << primPath << " has incorrect display name; expected \"" << displayName << "\" but got \"" - << prim.GetDisplayName() << "\"\n "; + ASSERT_CHECK(prim, "Proper dislay name for prim at " + primPath); + ASSERT_EQ_VAL(prim.GetDisplayName(), displayName, primPath + " display name"); + + return ::testing::AssertionSuccess(); } -void +::testing::AssertionResult assertVisibility(PXR_NS::UsdStageRefPtr stage, const std::string& path, bool expectedVisibilityAttr, bool expectedActualVisibility) { + ASSERT_CHECK(stage); UsdPrim prim = stage->GetPrimAtPath(SdfPath(path)); UsdGeomImageable imageable(prim); - ASSERT_TRUE(imageable) << "Test setup error: " << path << " is not an imageable prim"; + ASSERT_CHECK(imageable, "imageable prim at path: " + path + " "); // Visibility attribute should always be present, even if it's not written explicitly - ASSERT_TRUE(imageable.GetVisibilityAttr().HasValue()) - << "Unexpected error: " << path << " missing visibility attribute"; + ASSERT_CHECK(imageable.GetVisibilityAttr().HasValue(), + "Visibility attribute on prim at path: " + path); // Check visibility attribute TfToken visibility; imageable.GetVisibilityAttr().Get(&visibility); - ASSERT_EQ(expectedVisibilityAttr, visibility == UsdGeomTokens->inherited) - << path << " has visibility attribute " - << (expectedVisibilityAttr ? "inherited" : "invisible") << " that is expected to be " - << visibility.GetString(); + ASSERT_EQ_VAL(expectedVisibilityAttr, + visibility == UsdGeomTokens->inherited, + path + "'s visibility attribute"); - // Check actual visibility + // Check computed (actual) visibility visibility = imageable.ComputeVisibility(); - ASSERT_EQ(expectedActualVisibility, visibility == UsdGeomTokens->inherited) - << path << " is computed as " << visibility.GetString() << " but is expected to be " - << (expectedVisibilityAttr ? "visible" : "invisible"); + ASSERT_EQ_VAL(expectedActualVisibility, + visibility == UsdGeomTokens->inherited, + path + "'s computed visibility"); + + return ::testing::AssertionSuccess(); } -void +::testing::AssertionResult assertPoints(PXR_NS::UsdStageRefPtr stage, const std::string& path, const PointsData& data) { + ASSERT_CHECK(stage); UsdPrim prim = stage->GetPrimAtPath(SdfPath(path)); - ASSERT_TRUE(prim); + ASSERT_CHECK(prim); UsdGeomPoints geomPoints(prim); - ASSERT_TRUE(geomPoints); + ASSERT_CHECK(geomPoints); VtVec3fArray points; geomPoints.GetPointsAttr().Get(&points, 0); - ASSERT_EQ(points.size(), data.pointsCount); -} + ASSERT_EQ_VAL(points.size(), data.pointsCount, "points count"); -#define ASSERT_INPUT(...) assertInput(__VA_ARGS__) -#define ASSERT_INPUT_FIELD(...) assertInputField(__VA_ARGS__) -#define ASSERT_INPUT_PATH(...) assertInputPath(__VA_ARGS__) + return ::testing::AssertionSuccess(); +} template -void -assertInputField(const UsdShadeShader& shader, const std::string& name, const T& value) +[[nodiscard]] ::testing::AssertionResult +assertInputField(const pxr::UsdShadeShader& shader, const std::string& name, const T& value) { - auto attr = shader.GetInput(TfToken(name)); + auto attr = shader.GetInput(pxr::TfToken(name)); if (attr) { auto valueAttrs = attr.GetValueProducingAttributes(); if (valueAttrs.size()) { T actual; valueAttrs.front().Get(&actual); - ASSERT_EQ(actual, value) - << "Input field " << name << " for shader " << shader.GetPath().GetString() - << " doesn't match (" << typeid(value).name() << ")"; - return; + ASSERT_EQ_VAL( + actual, value, "Input field " + name + " for shader " + shader.GetPath().GetString()); } } + return ::testing::AssertionSuccess(); // TODO check if attr missing } // Cannot reuse assertInputField for this since SdfAssetPath equality fails for ::resolvedPath, // so here we match only the ::assetPath. -void -assertInputPath(const UsdShadeShader& shader, const std::string& name, const std::string& value) +[[nodiscard]] ::testing::AssertionResult +assertInputPath(const pxr::UsdShadeShader& shader, + const std::string& name, + const std::string& value) { - auto attr = shader.GetInput(TfToken(name)); + auto attr = shader.GetInput(pxr::TfToken(name)); + if (attr) { auto valueAttrs = attr.GetValueProducingAttributes(); if (valueAttrs.size()) { - SdfAssetPath actualAssetPath; + pxr::SdfAssetPath actualAssetPath; valueAttrs.front().Get(&actualAssetPath); - const std::string actual = TfNormPath(actualAssetPath.GetAssetPath()); - ASSERT_EQ(actual, value); - return; + const std::string actual = pxr::TfNormPath(actualAssetPath.GetAssetPath()); + ASSERT_EQ_VAL( + actual, value, "Input path " + name + " for shader " + shader.GetPath().GetString()); } } + return ::testing::AssertionSuccess(); // TODO check if attr missing } -void +::testing::AssertionResult assertMaterial(PXR_NS::UsdStageRefPtr stage, const std::string& path, const MaterialData& data) { const std::string currentDir = TfAbsPath("."); const SdfPath materialPath = SdfPath(path); + + ASSERT_CHECK(stage); UsdPrim prim = stage->GetPrimAtPath(materialPath); - ASSERT_TRUE(prim); + ASSERT_CHECK(prim); + UsdShadeMaterial material(prim); - ASSERT_TRUE(material); + ASSERT_CHECK(material); SdfPathVector connections; UsdShadeShader shader; UsdAttribute surface = material.GetSurfaceAttr(); surface.GetConnections(&connections); - ASSERT_TRUE(connections.size() > 0); + ASSERT_CHECK(connections.size() > 0); const SdfPath shaderPath = connections[0].GetPrimPath(); shader = UsdShadeShader(stage->GetPrimAtPath(shaderPath)); TfToken shaderId; shader.GetShaderId(&shaderId); - ASSERT_TRUE(shaderId == TfToken("UsdPreviewSurface")); + ASSERT_CHECK(shaderId == TfToken("UsdPreviewSurface")); auto assertInput = [&](const TfToken& name, const InputData& data) { UsdShadeInput shadeInput = shader.GetInput(name); if (!shadeInput) - return; + return ::testing::AssertionSuccess(); if (shadeInput.HasConnectedSource()) { UsdShadeInput::SourceInfoVector sources = shadeInput.GetConnectedSources(); for (UsdShadeConnectionSourceInfo source : sources) { @@ -691,26 +1015,31 @@ assertMaterial(PXR_NS::UsdStageRefPtr stage, const std::string& path, const Mate const UsdShadeShader textureShader = UsdShadeShader(stage->GetPrimAtPath(sourcePath)); if (sourcePath == materialPath) { - ASSERT_INPUT_FIELD(textureShader, name, data.value); + ASSERT_CHECK(assertInputField(textureShader, name, data.value)); } else { const SdfPath textureShaderPath = textureShader.GetPath(); TfToken uvTextureId; textureShader.GetShaderId(&uvTextureId); - ASSERT_EQ(uvTextureId.GetString(), std::string("UsdUVTexture")); - + ASSERT_EQ_VAL(uvTextureId.GetString(), + std::string("UsdUVTexture"), + "Shader at path " + textureShaderPath.GetString() + + " is not a UsdUVTexture"); const std::string assetPath = TfNormPath(currentDir + "/" + data.file); - ASSERT_INPUT_PATH(textureShader, "file", assetPath); + ASSERT_CHECK(assertInputPath(textureShader, "file", assetPath)); // TODO? ASSERT_IMAGE(ctx, assetPath, input.image); - ASSERT_INPUT_FIELD(textureShader, "wrapS", data.wrapS); - ASSERT_INPUT_FIELD(textureShader, "wrapT", data.wrapT); - ASSERT_INPUT_FIELD(textureShader, "scale", data.scale); - ASSERT_INPUT_FIELD(textureShader, "bias", data.bias); - ASSERT_INPUT_FIELD(textureShader, "fallback", data.value); - ASSERT_EQ(data.channel, source.sourceName); + ASSERT_CHECK(assertInputField(textureShader, "wrapS", data.wrapS)); + ASSERT_CHECK(assertInputField(textureShader, "wrapT", data.wrapT)); + ASSERT_CHECK(assertInputField(textureShader, "scale", data.scale)); + ASSERT_CHECK(assertInputField(textureShader, "bias", data.bias)); + ASSERT_CHECK(assertInputField(textureShader, "fallback", data.value)); + ASSERT_EQ_VAL(data.channel, + source.sourceName, + "Source name for shader at path " + + textureShaderPath.GetString()); UsdShadeInput stInput = textureShader.GetInput(TestTokens->st); if (!stInput) - return; + return ::testing::AssertionSuccess(); if (stInput.HasConnectedSource()) { UsdShadeInput::SourceInfoVector sources = stInput.GetConnectedSources(); for (UsdShadeConnectionSourceInfo source : sources) { @@ -721,16 +1050,18 @@ assertMaterial(PXR_NS::UsdStageRefPtr stage, const std::string& path, const Mate stShader.GetShaderId(&shaderId); if (!data.uvRotation.IsEmpty() || !data.uvScale.IsEmpty() || !data.uvTranslation.IsEmpty()) { - ASSERT_TRUE(shaderId == TestTokens->UsdTransform2d); - ASSERT_INPUT_FIELD(stShader, "rotation", data.uvRotation); - ASSERT_INPUT_FIELD(stShader, "scale", data.uvScale); - ASSERT_INPUT_FIELD(stShader, "translation", data.uvTranslation); + ASSERT_CHECK(shaderId == TestTokens->UsdTransform2d); + ASSERT_CHECK( + assertInputField(stShader, "rotation", data.uvRotation)); + ASSERT_CHECK(assertInputField(stShader, "scale", data.uvScale)); + ASSERT_CHECK( + assertInputField(stShader, "translation", data.uvTranslation)); } else { std::string shaderName = stShader.GetPrim().GetName().GetString(); if (shaderName == "texCoordReader") { - ASSERT_TRUE(shaderId == TestTokens->UsdPrimvarReader_float2); + ASSERT_CHECK(shaderId == TestTokens->UsdPrimvarReader_float2); } else { - ASSERT_TRUE(shaderId == TestTokens->UsdTransform2d); + ASSERT_CHECK(shaderId == TestTokens->UsdTransform2d); } } } @@ -740,31 +1071,190 @@ assertMaterial(PXR_NS::UsdStageRefPtr stage, const std::string& path, const Mate } else { VtValue actualValue; shadeInput.Get(&actualValue); - ASSERT_TRUE(actualValue == data.value); + ASSERT_CHECK(actualValue == data.value, + "Actual value = " + TfStringify(actualValue) + + ", expected value = " + TfStringify(data.value)); } + return ::testing::AssertionSuccess(); }; - ASSERT_INPUT(TestTokens->useSpecularWorkflow, data.useSpecularWorkflow); - ASSERT_INPUT(TestTokens->diffuseColor, data.diffuseColor); - ASSERT_INPUT(TestTokens->emissiveColor, data.emissiveColor); - ASSERT_INPUT(TestTokens->specularColor, data.specularColor); - ASSERT_INPUT(TestTokens->normal, data.normal); - ASSERT_INPUT(TestTokens->metallic, data.metallic); - ASSERT_INPUT(TestTokens->roughness, data.roughness); - ASSERT_INPUT(TestTokens->clearcoat, data.clearcoat); - ASSERT_INPUT(TestTokens->clearcoatRoughness, data.clearcoatRoughness); - ASSERT_INPUT(TestTokens->opacity, data.opacity); - ASSERT_INPUT(TestTokens->opacityThreshold, data.opacityThreshold); - ASSERT_INPUT(TestTokens->displacement, data.displacement); - ASSERT_INPUT(TestTokens->occlusion, data.occlusion); - ASSERT_INPUT(TestTokens->ior, data.ior); + + ASSERT_CHECK(assertInput(TestTokens->useSpecularWorkflow, data.useSpecularWorkflow)); + ASSERT_CHECK(assertInput(TestTokens->diffuseColor, data.diffuseColor)); + ASSERT_CHECK(assertInput(TestTokens->emissiveColor, data.emissiveColor)); + ASSERT_CHECK(assertInput(TestTokens->specularColor, data.specularColor)); + ASSERT_CHECK(assertInput(TestTokens->normal, data.normal)); + ASSERT_CHECK(assertInput(TestTokens->metallic, data.metallic)); + ASSERT_CHECK(assertInput(TestTokens->roughness, data.roughness)); + ASSERT_CHECK(assertInput(TestTokens->clearcoat, data.clearcoat)); + ASSERT_CHECK(assertInput(TestTokens->clearcoatRoughness, data.clearcoatRoughness)); + ASSERT_CHECK(assertInput(TestTokens->opacity, data.opacity)); + ASSERT_CHECK(assertInput(TestTokens->opacityThreshold, data.opacityThreshold)); + ASSERT_CHECK(assertInput(TestTokens->displacement, data.displacement)); + ASSERT_CHECK(assertInput(TestTokens->occlusion, data.occlusion)); + ASSERT_CHECK(assertInput(TestTokens->ior, data.ior)); + + return ::testing::AssertionSuccess(); } -void +::testing::AssertionResult assertRender(const std::string& filename, const std::string& imageFilename) { const std::string imageParentPath = TfGetPathName(imageFilename); TfMakeDirs(imageParentPath, -1, true); - const std::string command = "HYDRA_ENABLE_HGIGL=0 usdrecord \"" + filename + "\" \"" + imageFilename + "\""; - int result = archSystem(command); - ASSERT_EQ(result, 0); -} \ No newline at end of file + + // Build the platform-appropriate command +#if defined(_WIN32) + // On Windows, set env var via `set` and `&&` + const std::string command = + "set HYDRA_ENABLE_HGIGL=0 && usdrecord \"" + filename + "\" \"" + imageFilename + "\""; +#else + // On Unix-like systems, use inline env var syntax + const std::string command = + "HYDRA_ENABLE_HGIGL=0 usdrecord \"" + filename + "\" \"" + imageFilename + "\""; +#endif + + ArchSystemResult result = archSystem(command); + ASSERT_EQ_VAL(result.exitCode, 0, "usdrecord exit code:\n" + result.output); + + return ::testing::AssertionSuccess(); +} + +::testing::AssertionResult +assertUsda(const SdfLayerHandle& sdfLayer, + const std::string& baselinePath, + bool generateBaseline, + bool dumpOnFailure) +{ + ASSERT_CHECK(sdfLayer, "SdfLayer is invalid"); + + if (generateBaseline) { + std::cout << "Updating USDA baseline " << baselinePath << std::endl; + sdfLayer->Export(baselinePath); + } + + SdfLayerRefPtr baselineLayer = SdfLayer::FindOrOpen(baselinePath); + ASSERT_CHECK(baselineLayer, "Failed to load baseline layer from " + baselinePath); + + std::string layerStr; + sdfLayer->ExportToString(&layerStr); + std::string baselineStr; + baselineLayer->ExportToString(&baselineStr); + + // Skip the header (up to and including the doc string) which contains version/date info + auto skipHeader = [](const std::string& str) -> size_t { + // Find the end of the doc string: look for closing ''' + size_t docStart = str.find("doc = '''"); + if (docStart != std::string::npos) { + // Find the closing ''' (skip past the opening ''') + size_t docEnd = str.find("'''", docStart + 9); + if (docEnd != std::string::npos) { + // Skip to next newline after closing ''' + docEnd = str.find('\n', docEnd + 3); + if (docEnd != std::string::npos) { + return docEnd + 1; + } + } + } + return 0; // If we can't find the pattern, compare from start + }; + + // Normalize asset paths to ignore build-specific directories + auto normalizeAssetPaths = [](const std::string& str) -> std::string { + std::string result = str; + size_t pos = 0; + + // Find patterns like: asset inputs:xxx = @/path/to/file.glb[texture.png]@ ( + // But exclude patterns with dots in the input name like: asset inputs:file.connect + while ((pos = result.find("asset inputs:", pos)) != std::string::npos) { + // Find the equals sign + size_t equalsPos = result.find(" = ", pos); + if (equalsPos == std::string::npos) + break; + + // Check if there's a dot between "inputs:" and " = " (would indicate .connect, etc) + std::string inputName = + result.substr(pos + 13, equalsPos - (pos + 13)); // "inputs:" is 13 chars + if (inputName.find('.') != std::string::npos) { + pos = equalsPos + 3; + continue; // Skip this one, it has a dot (like file.connect) + } + + // Find the opening @ + size_t atStartPos = result.find("@", equalsPos); + if (atStartPos == std::string::npos || atStartPos > equalsPos + 10) { + pos = equalsPos + 3; + continue; + } + + // Find the closing @ + size_t atEndPos = result.find("@", atStartPos + 1); + if (atEndPos == std::string::npos) + break; + + // Extract the full path between the @ symbols + std::string fullPath = result.substr(atStartPos + 1, atEndPos - atStartPos - 1); + + // Keep only the filename part (after last / or \) + size_t lastSlash = fullPath.find_last_of("/\\"); + std::string normalizedPath = + (lastSlash != std::string::npos) ? fullPath.substr(lastSlash + 1) : fullPath; + + // Replace the full path with just the filename + result.replace(atStartPos + 1, atEndPos - atStartPos - 1, normalizedPath); + + pos = atStartPos + normalizedPath.length() + 2; + } + + return result; + }; + + size_t layerStart = skipHeader(layerStr); + size_t baselineStart = skipHeader(baselineStr); + + std::string layerContent = normalizeAssetPaths(layerStr.substr(layerStart)); + std::string baselineContent = normalizeAssetPaths(baselineStr.substr(baselineStart)); + + if (layerContent != baselineContent) { + if (dumpOnFailure) { + std::cout << "Layer content has length: " << layerContent.size() + << "\nBaseline content has length: " << baselineContent.size() + << " (compared without header)" << std::endl; + + const std::string searchStr = "baseline_"; + const std::string replaceStr = "output_"; + std::string outputPath = baselinePath; + size_t pos = outputPath.find(searchStr); + if (pos != std::string::npos) { + outputPath.replace(pos, searchStr.length(), replaceStr); + } else { + return ::testing::AssertionFailure() + << "Expected '" << searchStr << "' in baseline path '" << baselinePath + << "'"; + } + std::fstream out(outputPath, std::ios::out); + out << layerContent; + out.close(); + std::cout << "Output dumped to " << outputPath << " (without header)" << std::endl; + + // Very poor person's diff operation. Can we do better without bringing + // in a diff library? + for (size_t i = 0; i < layerContent.size(); ++i) { + if (i >= baselineContent.size()) { + std::cout << "Size difference. Output has more characters than baseline" + << std::endl; + break; + } + if (layerContent[i] != baselineContent[i]) { + std::cout << "Mismatch at char " << i << " (after header)" << std::endl; + std::cout << "Remainder in output:\n" << &layerContent[i] << std::endl; + std::cout << "Remainder in baseline:\n" << &baselineContent[i] << std::endl; + break; + } + } + } + + return ::testing::AssertionFailure() << "Output of layer " << sdfLayer->GetIdentifier() + << " does not match baseline " << baselinePath; + } + return ::testing::AssertionSuccess(); +} diff --git a/utils/src/transforms.cpp b/utils/src/transforms.cpp index f300c972..504a657a 100644 --- a/utils/src/transforms.cpp +++ b/utils/src/transforms.cpp @@ -9,9 +9,9 @@ the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTA OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ -#include #include #include +#include #include using namespace PXR_NS; diff --git a/utils/src/usdData.cpp b/utils/src/usdData.cpp index 10f71b44..462f1f2d 100644 --- a/utils/src/usdData.cpp +++ b/utils/src/usdData.cpp @@ -181,7 +181,7 @@ printMaterial(const std::string& header, { TF_DEBUG_MSG( FILE_FORMAT_UTIL, - "%s: %s material { %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n", + "%s: %s material { %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n", debugTag.c_str(), header.c_str(), path.GetAsString().c_str(), @@ -735,9 +735,9 @@ UniqueNameEnforcer::enforceUniqueness(std::string& name) void removeBrackets(std::string& name) { - name.erase(std::remove_if(name.begin(), name.end(), - [](char c) { return c == '[' || c == ']'; }), - name.end()); + name.erase( + std::remove_if(name.begin(), name.end(), [](char c) { return c == '[' || c == ']'; }), + name.end()); } void diff --git a/utils/tests/CMakeLists.txt b/utils/tests/CMakeLists.txt index 2b7d87d2..1acc77a7 100644 --- a/utils/tests/CMakeLists.txt +++ b/utils/tests/CMakeLists.txt @@ -19,3 +19,4 @@ target_link_libraries(utilsTests add_test(NAME utilsTests COMMAND utilsTests WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) + diff --git a/utils/tests/data/baseline_writeASM.usda b/utils/tests/data/baseline_writeASM.usda index 12fdfa08..fdc4bc86 100644 --- a/utils/tests/data/baseline_writeASM.usda +++ b/utils/tests/data/baseline_writeASM.usda @@ -9,9 +9,11 @@ def Xform "Scene" { def "Materials" { - def Material "GeneralTestMaterial" + def Material "GeneralTestMaterial" ( + displayName = "General Test Material" + ) { - float3 inputs:absorptionColor = (0.25, 0.5, 1) + color3f inputs:absorptionColor = (0.25, 0.5, 1) float inputs:absorptionDistance = 111 float inputs:ambientOcclusion = 0.01 ( customData = { @@ -37,8 +39,8 @@ def Xform "Scene" } } ) - float3 inputs:baseColor = (1, 2, 3) - float3 inputs:coatColor = (1, 1, 0) + color3f inputs:baseColor = (1, 0.5, 0.25) + color3f inputs:coatColor = (1, 1, 0) float inputs:coatIOR = 1.33 ( customData = { dictionary range = { @@ -47,7 +49,7 @@ def Xform "Scene" } } ) - float3 inputs:coatNormal = (0.66, 0, 0.66) + normal3f inputs:coatNormal = (0.66, 0, 0.66) float inputs:coatOpacity = 0.55 ( customData = { dictionary range = { @@ -56,7 +58,7 @@ def Xform "Scene" } } ) - float inputs:coatRoughness = 0.66 ( + float inputs:coatRoughness = 0.44 ( customData = { dictionary range = { double max = 1 @@ -72,7 +74,7 @@ def Xform "Scene" } } ) - float3 inputs:emissive = (1, 2, 3) + color3f inputs:emissive = (1, 0.5, 0.25) float inputs:emissiveIntensity = 1 float inputs:height = 1.23 ( customData = { @@ -98,8 +100,8 @@ def Xform "Scene" } } ) - float3 inputs:normal = (0.33, 0.33, 0.33) - float inputs:normalScale = 0.666 + normal3f inputs:normal = (0.5, 0.5, 0.5) + float inputs:normalScale = 0.5 float inputs:opacity = 0.8 ( customData = { dictionary range = { @@ -108,7 +110,7 @@ def Xform "Scene" } } ) - float inputs:opacityThreshold = 0.75 ( + float inputs:roughness = 0.66 ( customData = { dictionary range = { double max = 1 @@ -116,17 +118,9 @@ def Xform "Scene" } } ) - float inputs:roughness = 0.44 ( - customData = { - dictionary range = { - double max = 1 - double min = 0 - } - } - ) - float3 inputs:scatteringColor = (1, 0.5, 1) + color3f inputs:scatteringColor = (1, 0.5, 1) float inputs:scatteringDistance = 222 - float3 inputs:sheenColor = (0, 1, 1) + color3f inputs:sheenColor = (0, 1, 1) float inputs:sheenOpacity = 1 ( customData = { dictionary range = { @@ -135,7 +129,7 @@ def Xform "Scene" } } ) - float inputs:sheenRoughness = 0.99 ( + float inputs:sheenRoughness = 0.5 ( customData = { dictionary range = { double max = 1 @@ -143,7 +137,7 @@ def Xform "Scene" } } ) - float3 inputs:specularEdgeColor = (1, 0, 1) + color3f inputs:specularEdgeColor = (1, 0, 1) float inputs:specularLevel = 0.5 ( customData = { dictionary range = { @@ -174,53 +168,74 @@ def Xform "Scene" { def Shader "ASM" { + custom bool clearcoatModelsTransmissionTint = 1 uniform token info:id = "AdobeStandardMaterial_4_0" - float3 inputs:absorptionColor.connect = + color3f inputs:absorptionColor.connect = float inputs:absorptionDistance.connect = float inputs:ambientOcclusion.connect = float inputs:anisotropyAngle.connect = float inputs:anisotropyLevel.connect = - float3 inputs:baseColor.connect = - float3 inputs:coatColor.connect = + color3f inputs:baseColor.connect = + color3f inputs:coatColor.connect = float inputs:coatIOR.connect = - float3 inputs:coatNormal.connect = + normal3f inputs:coatNormal.connect = float inputs:coatOpacity.connect = float inputs:coatRoughness.connect = float inputs:coatSpecularLevel.connect = - float3 inputs:emissive.connect = + color3f inputs:emissive.connect = float inputs:emissiveIntensity.connect = float inputs:height.connect = float inputs:IOR.connect = float inputs:metallic.connect = - float3 inputs:normal.connect = + normal3f inputs:normal.connect = float inputs:normalScale.connect = float inputs:opacity.connect = - float inputs:opacityThreshold.connect = float inputs:roughness.connect = bool inputs:scatter = 1 - float3 inputs:scatteringColor.connect = + color3f inputs:scatteringColor.connect = float inputs:scatteringDistance.connect = - float3 inputs:sheenColor.connect = + color3f inputs:sheenColor.connect = float inputs:sheenOpacity.connect = float inputs:sheenRoughness.connect = - float3 inputs:specularEdgeColor.connect = + color3f inputs:specularEdgeColor.connect = float inputs:specularLevel.connect = float inputs:translucency.connect = float inputs:volumeThickness.connect = + custom float normalScale = 0.5 + custom float opacityThreshold = 0.75 token outputs:surface + custom bool unlit = 1 + custom bool useSpecularWorkflow = 1 } } } - def Material "TextureTestMaterial" + def Material "TextureTestMaterial" ( + displayName = "Texture Test Material" + ) { - asset inputs:baseColorTexture = @textures/color.png@ - asset inputs:coatNormalTexture = @textures/normal.png@ - asset inputs:coatOpacityTexture = @textures/color.png@ + asset inputs:ambientOcclusionTexture = @textures/occlusion.png@ ( + colorSpace = "raw" + ) + asset inputs:baseColorTexture = @textures/color.png@ ( + colorSpace = "srgb_texture" + ) + asset inputs:coatNormalTexture = @textures/normal.png@ ( + colorSpace = "raw" + ) + asset inputs:coatOpacityTexture = @textures/color.png@ ( + colorSpace = "raw" + ) float inputs:emissiveIntensity = 1 - asset inputs:emissiveTexture = @textures/color.png@ - asset inputs:normalTexture = @textures/normal.png@ - asset inputs:roughnessTexture = @textures/greyscale.png@ + asset inputs:emissiveTexture = @textures/color.png@ ( + colorSpace = "srgb_texture" + ) + asset inputs:normalTexture = @textures/normal.png@ ( + colorSpace = "raw" + ) + asset inputs:roughnessTexture = @textures/greyscale.png@ ( + colorSpace = "raw" + ) token outputs:adobe:surface.connect = def NodeGraph "ASM" @@ -235,25 +250,44 @@ def Xform "Scene" def Shader "baseColor" { uniform token info:id = "UsdUVTexture" + asset inputs:file = @textures/color.png@ asset inputs:file.connect = token inputs:sourceColorSpace = "sRGB" float2 inputs:st.connect = float3 outputs:rgb } + def Shader "roughness_stTransform" + { + uniform token info:id = "UsdTransform2d" + float2 inputs:in.connect = + float inputs:rotation = 15 + float2 inputs:scale = (1.5, 0.75) + float2 inputs:translation = (0.12, 3.45) + float2 outputs:result + } + def Shader "roughness" { uniform token info:id = "UsdUVTexture" + float4 inputs:bias = (0.1, 0, 0, 0) + asset inputs:file = @textures/greyscale.png@ asset inputs:file.connect = + float4 inputs:scale = (0.55, 1, 1, 1) token inputs:sourceColorSpace = "raw" - float2 inputs:st.connect = + float2 inputs:st.connect = + token inputs:wrapS = "black" + token inputs:wrapT = "black" float outputs:r } def Shader "normal" { uniform token info:id = "UsdUVTexture" + float4 inputs:bias = (-0.75, -0.75, -0.75, 0) + asset inputs:file = @textures/normal.png@ asset inputs:file.connect = + float4 inputs:scale = (1.5, 1.5, 1.5, 0.75) token inputs:sourceColorSpace = "raw" float2 inputs:st.connect = float3 outputs:rgb @@ -273,6 +307,7 @@ def Xform "Scene" { uniform token info:id = "UsdUVTexture" float4 inputs:bias = (0.1, 0.2, 0.3, 0) + asset inputs:file = @textures/color.png@ asset inputs:file.connect = float4 inputs:scale = (1, 2, 0.5, 1) token inputs:sourceColorSpace = "sRGB" @@ -285,7 +320,9 @@ def Xform "Scene" def Shader "coatOpacity" { uniform token info:id = "UsdUVTexture" + asset inputs:file = @textures/color.png@ asset inputs:file.connect = + token inputs:sourceColorSpace = "raw" float2 inputs:st.connect = float outputs:g } @@ -293,28 +330,44 @@ def Xform "Scene" def Shader "coatNormal" { uniform token info:id = "UsdUVTexture" + float4 inputs:bias = (-1, 1, -1, 0) + asset inputs:file = @textures/normal.png@ asset inputs:file.connect = + float4 inputs:scale = (2, -2, 2, 1) token inputs:sourceColorSpace = "raw" float2 inputs:st.connect = float3 outputs:rgb } + def Shader "ambientOcclusion" + { + uniform token info:id = "UsdUVTexture" + asset inputs:file = @textures/occlusion.png@ + asset inputs:file.connect = + token inputs:sourceColorSpace = "raw" + float2 inputs:st.connect = + float outputs:r + } + def Shader "ASM" { uniform token info:id = "AdobeStandardMaterial_4_0" - float3 inputs:baseColor.connect = - float3 inputs:coatNormal.connect = + float inputs:ambientOcclusion.connect = + color3f inputs:baseColor.connect = + normal3f inputs:coatNormal.connect = float inputs:coatOpacity.connect = - float3 inputs:emissive.connect = + color3f inputs:emissive.connect = float inputs:emissiveIntensity.connect = - float3 inputs:normal.connect = + normal3f inputs:normal.connect = float inputs:roughness.connect = token outputs:surface } } } - def Material "TransmissionTestMaterial" + def Material "TransmissionTestMaterial" ( + displayName = "Transmission Test Material" + ) { float inputs:translucency = 0.543 ( customData = { diff --git a/utils/tests/data/baseline_writeOpenPBR.usda b/utils/tests/data/baseline_writeOpenPBR.usda index 527eb4dc..b7ae7078 100644 --- a/utils/tests/data/baseline_writeOpenPBR.usda +++ b/utils/tests/data/baseline_writeOpenPBR.usda @@ -9,11 +9,11 @@ def Xform "Scene" { def "Materials" { - def Material "GeneralTestMaterial" + def Material "GeneralTestMaterial" ( + displayName = "General Test Material" + ) { - color3f inputs:absorptionColor = (0.25, 0.5, 1) - float inputs:absorptionDistance = 111 - float inputs:anisotropyLevel = 0.321 ( + float inputs:ambientOcclusion = 0.01 ( customData = { dictionary range = { double max = 1 @@ -21,7 +21,15 @@ def Xform "Scene" } } ) - color3f inputs:baseColor = (1, 2, 3) + float inputs:anisotropyAngle = 0.777 ( + customData = { + dictionary range = { + double max = 1 + double min = 0 + } + } + ) + color3f inputs:baseColor = (1, 0.5, 0.25) color3f inputs:coatColor = (1, 1, 0) float inputs:coatIOR = 1.33 ( customData = { @@ -40,7 +48,7 @@ def Xform "Scene" } } ) - float inputs:coatRoughness = 0.66 ( + float inputs:coatRoughness = 0.44 ( customData = { dictionary range = { double max = 1 @@ -48,18 +56,20 @@ def Xform "Scene" } } ) - float inputs:emissionLuminance = 1 - color3f inputs:emissive = (1, 2, 3) - float inputs:fuzzWeight = 1 - float inputs:IOR = 1.55 ( + float inputs:coatSpecularLevel = 0.88 ( customData = { dictionary range = { - double max = 3 - double min = 1 + double max = 1 + double min = 0 } } ) - float inputs:metallic = 0.22 ( + float inputs:emissionLuminance = 1000 + color3f inputs:emissive = (1, 0.5, 0.25) + color3f inputs:fuzzColor = (0, 1, 1) + float inputs:fuzzRoughness = 0.5 + float inputs:fuzzWeight = 1 + float inputs:height = 1.23 ( customData = { dictionary range = { double max = 1 @@ -67,16 +77,15 @@ def Xform "Scene" } } ) - float3 inputs:normal = (0.33, 0.33, 0.33) - float inputs:opacity = 0.8 ( + float inputs:IOR = 1.55 ( customData = { dictionary range = { - double max = 1 - double min = 0 + double max = 3 + double min = 1 } } ) - float inputs:roughness = 0.44 ( + float inputs:metallic = 0.22 ( customData = { dictionary range = { double max = 1 @@ -84,10 +93,8 @@ def Xform "Scene" } } ) - color3f inputs:scatteringColor = (1, 0.5, 1) - float inputs:scatteringDistance = 222 - color3f inputs:sheenColor = (0, 1, 1) - float inputs:sheenRoughness = 0.99 ( + float3 inputs:normal = (0.5, 0.5, 0.5) + float inputs:opacity = 0.8 ( customData = { dictionary range = { double max = 1 @@ -96,9 +103,16 @@ def Xform "Scene" } ) color3f inputs:specularEdgeColor = (1, 0, 1) + float inputs:specularRoughness = 0.66 + float inputs:specularRoughnessAnisotropy = 0.321 float inputs:specularWeight = 0.5 + color3f inputs:subsurfaceColor = (1, 0.5, 1) + float inputs:subsurfaceRadius = 222 float inputs:subsurfaceWeight = 1 - float inputs:translucency = 0.123 ( + color3f inputs:transmissionColor = (0.25, 0.5, 1) + float inputs:transmissionDepth = 111 + float inputs:transmissionWeight = 0.123 + float inputs:volumeThickness = 0.987 ( customData = { dictionary range = { double max = 1 @@ -110,103 +124,144 @@ def Xform "Scene" def NodeGraph "OpenPBR" { + def Shader "AmbientOcclusionAsColor" + { + uniform token info:id = "ND_convert_float_color3" + float inputs:in.connect = + color3f outputs:out + } + + def Shader "AmbientOcclusionBaseColor" + { + uniform token info:id = "ND_mix_color3" + color3f inputs:bg.connect = + color3f inputs:fg.connect = + float inputs:mix = 0 + color3f outputs:out + } + def Shader "OpenPBR" { + custom bool clearcoatModelsTransmissionTint = 1 uniform token info:id = "ND_open_pbr_surface_surfaceshader" - color3f inputs:base_color.connect = + float inputs:anisotropyAngle.connect = + color3f inputs:base_color.connect = float inputs:base_metalness.connect = color3f inputs:coat_color.connect = float inputs:coat_ior.connect = float inputs:coat_roughness.connect = float inputs:coat_weight.connect = + float inputs:coatSpecularLevel.connect = + float inputs:displacement.connect = color3f inputs:emission_color.connect = float inputs:emission_luminance.connect = - color3f inputs:fuzz_color.connect = - float inputs:fuzz_roughness.connect = + color3f inputs:fuzz_color.connect = + float inputs:fuzz_roughness.connect = float inputs:fuzz_weight.connect = float3 inputs:geometry_coat_normal.connect = float3 inputs:geometry_normal.connect = float inputs:geometry_opacity.connect = color3f inputs:specular_color.connect = float inputs:specular_ior.connect = - float inputs:specular_roughness.connect = - float inputs:specular_roughness_anisotropy.connect = + float inputs:specular_roughness.connect = + float inputs:specular_roughness_anisotropy.connect = float inputs:specular_weight.connect = - color3f inputs:subsurface_color.connect = - float inputs:subsurface_radius.connect = + color3f inputs:subsurface_color.connect = + float inputs:subsurface_radius.connect = float inputs:subsurface_weight.connect = - color3f inputs:transmission_color.connect = - float inputs:transmission_depth.connect = - float inputs:transmission_weight.connect = + color3f inputs:transmission_color.connect = + float inputs:transmission_depth.connect = + float inputs:transmission_weight.connect = + float inputs:volumeThickness.connect = + custom float normalScale = 0.5 + custom float opacityThreshold = 0.75 token outputs:out + custom bool unlit = 1 + custom bool useSpecularWorkflow = 1 } } } - def Material "TextureTestMaterial" + def Material "TextureTestMaterial" ( + displayName = "Texture Test Material" + ) { - asset inputs:baseColorTexture = @textures/color.png@ - asset inputs:coatNormalTexture = @textures/normal.png@ - asset inputs:coatOpacityTexture = @textures/color.png@ - float inputs:emissionLuminance = 1 - asset inputs:emissiveTexture = @textures/color.png@ - asset inputs:normalTexture = @textures/normal.png@ - asset inputs:roughnessTexture = @textures/greyscale.png@ + asset inputs:ambientOcclusionTexture = @textures/occlusion.png@ ( + colorSpace = "raw" + ) + asset inputs:baseColorTexture = @textures/color.png@ ( + colorSpace = "srgb_texture" + ) + asset inputs:coatNormalTexture = @textures/normal.png@ ( + colorSpace = "raw" + ) + asset inputs:coatOpacityTexture = @textures/color.png@ ( + colorSpace = "raw" + ) + float inputs:emissionLuminance = 1000 + asset inputs:emissiveTexture = @textures/color.png@ ( + colorSpace = "srgb_texture" + ) + asset inputs:normalTexture = @textures/normal.png@ ( + colorSpace = "raw" + ) + asset inputs:specularRoughnessTexture = @textures/greyscale.png@ ( + colorSpace = "raw" + ) token outputs:mtlx:surface.connect = def NodeGraph "OpenPBR" { def Shader "texCoordReader" { - uniform token info:id = "ND_texcoord_vector2" + uniform token info:id = "ND_geompropvalue_vector2" + string inputs:geomprop = "st" float2 outputs:out } def Shader "base_color" { - uniform token info:id = "ND_image_color3" + uniform token info:id = "ND_UsdUVTexture_23" asset inputs:file ( colorSpace = "srgb_texture" ) asset inputs:file.connect = - float2 inputs:texcoord.connect = - string inputs:uaddressmode = "periodic" - string inputs:vaddressmode = "periodic" - color3f outputs:out + float2 inputs:st.connect = + string inputs:wrapS = "periodic" + string inputs:wrapT = "periodic" + color3f outputs:rgb } - def Shader "specular_roughness" + def Shader "specular_roughness_uv_transform" { - uniform token info:id = "ND_image_vector4" - asset inputs:file.connect = + uniform token info:id = "ND_place2d_vector2" + float2 inputs:offset = (0.12, 3.45) + float inputs:rotate = 15 + float2 inputs:scale = (0.6666667, 1.3333334) float2 inputs:texcoord.connect = - string inputs:uaddressmode = "periodic" - string inputs:vaddressmode = "periodic" - float4 outputs:out + float2 outputs:out } - def Shader "specular_roughness_to_float" + def Shader "specular_roughness" { - uniform token info:id = "ND_separate4_vector4" - float4 inputs:in.connect = - float outputs:outx + uniform token info:id = "ND_UsdUVTexture_23" + float4 inputs:bias = (0.1, 0, 0, 0) + asset inputs:file.connect = + float4 inputs:scale = (0.55, 1, 1, 1) + float2 inputs:st.connect = + string inputs:wrapS = "constant" + string inputs:wrapT = "constant" + float outputs:r } def Shader "coat_weight" { - uniform token info:id = "ND_image_vector4" + uniform token info:id = "ND_UsdUVTexture_23" asset inputs:file.connect = - float2 inputs:texcoord.connect = - string inputs:uaddressmode = "periodic" - string inputs:vaddressmode = "periodic" - float4 outputs:out - } - - def Shader "coat_weight_to_float" - { - uniform token info:id = "ND_separate4_vector4" - float4 inputs:in.connect = - float outputs:outy + float2 inputs:st.connect = + string inputs:wrapS = "periodic" + string inputs:wrapT = "periodic" + float outputs:g } def Shader "emission_color_uv_transform" @@ -221,92 +276,117 @@ def Xform "Scene" def Shader "emission_color" { - uniform token info:id = "ND_image_color3" + uniform token info:id = "ND_UsdUVTexture_23" + float4 inputs:bias = (0.1, 0.2, 0.3, 0) asset inputs:file ( colorSpace = "srgb_texture" ) asset inputs:file.connect = - float2 inputs:texcoord.connect = - string inputs:uaddressmode = "clamp" - string inputs:vaddressmode = "mirror" - color3f outputs:out + float4 inputs:scale = (1, 2, 0.5, 1) + float2 inputs:st.connect = + string inputs:wrapS = "clamp" + string inputs:wrapT = "mirror" + color3f outputs:rgb } - def Shader "emission_color_scale" - { - uniform token info:id = "ND_multiply_color3" - color3f inputs:in1 = (1, 2, 0.5) - color3f inputs:in2.connect = - color3f outputs:out - } - - def Shader "emission_color_bias" + def Shader "geometry_normal" { - uniform token info:id = "ND_add_color3" - color3f inputs:in1 = (0.1, 0.2, 0.3) - color3f inputs:in2.connect = - color3f outputs:out + uniform token info:id = "ND_UsdUVTexture_23" + float4 inputs:bias = (0.125, 0.125, 0.125, 0) + asset inputs:file.connect = + float4 inputs:scale = (0.75, 0.75, 0.75, 0.75) + float2 inputs:st.connect = + string inputs:wrapS = "periodic" + string inputs:wrapT = "periodic" + color3f outputs:rgb } - def Shader "geometry_normal" + def Shader "geometry_normal_as_vector" { - uniform token info:id = "ND_image_vector3" - asset inputs:file.connect = - float2 inputs:texcoord.connect = - string inputs:uaddressmode = "periodic" - string inputs:vaddressmode = "periodic" + uniform token info:id = "ND_convert_color3_vector3" + color3f inputs:in.connect = float3 outputs:out } def Shader "geometry_normal_to_world_space" { uniform token info:id = "ND_normalmap" - float3 inputs:in.connect = + float3 inputs:in.connect = float3 outputs:out } def Shader "geometry_coat_normal" { - uniform token info:id = "ND_image_vector3" + uniform token info:id = "ND_UsdUVTexture_23" + float4 inputs:bias = (0, 1, 0, 0) asset inputs:file.connect = - float2 inputs:texcoord.connect = - string inputs:uaddressmode = "periodic" - string inputs:vaddressmode = "periodic" + float4 inputs:scale = (1, -1, 1, 1) + float2 inputs:st.connect = + string inputs:wrapS = "periodic" + string inputs:wrapT = "periodic" + color3f outputs:rgb + } + + def Shader "geometry_coat_normal_as_vector" + { + uniform token info:id = "ND_convert_color3_vector3" + color3f inputs:in.connect = float3 outputs:out } def Shader "geometry_coat_normal_to_world_space" { uniform token info:id = "ND_normalmap" - float3 inputs:in.connect = + float3 inputs:in.connect = float3 outputs:out } + def Shader "occlusion" + { + uniform token info:id = "ND_UsdUVTexture_23" + asset inputs:file.connect = + float2 inputs:st.connect = + string inputs:wrapS = "periodic" + string inputs:wrapT = "periodic" + float outputs:r + } + + def Shader "AmbientOcclusionAsColor" + { + uniform token info:id = "ND_convert_float_color3" + float inputs:in.connect = + color3f outputs:out + } + + def Shader "AmbientOcclusionBaseColor" + { + uniform token info:id = "ND_mix_color3" + color3f inputs:bg.connect = + color3f inputs:fg.connect = + float inputs:mix = 0 + color3f outputs:out + } + def Shader "OpenPBR" { uniform token info:id = "ND_open_pbr_surface_surfaceshader" - color3f inputs:base_color.connect = - float inputs:coat_weight.connect = - color3f inputs:emission_color.connect = + color3f inputs:base_color.connect = + float inputs:coat_weight.connect = + color3f inputs:emission_color.connect = float inputs:emission_luminance.connect = float3 inputs:geometry_coat_normal.connect = float3 inputs:geometry_normal.connect = - float inputs:specular_roughness.connect = + float inputs:specular_roughness.connect = token outputs:out } } } - def Material "TransmissionTestMaterial" + def Material "TransmissionTestMaterial" ( + displayName = "Transmission Test Material" + ) { - float inputs:translucency = 0.543 ( - customData = { - dictionary range = { - double max = 1 - double min = 0 - } - } - ) + float inputs:transmissionWeight = 0.543 token outputs:mtlx:surface.connect = def NodeGraph "OpenPBR" @@ -314,10 +394,11 @@ def Xform "Scene" def Shader "OpenPBR" { uniform token info:id = "ND_open_pbr_surface_surfaceshader" - float inputs:transmission_weight.connect = + float inputs:transmission_weight.connect = token outputs:out } } } } } + diff --git a/utils/tests/data/baseline_writeUsdPreviewSurface.usda b/utils/tests/data/baseline_writeUsdPreviewSurface.usda index 1028fe3a..72a16e05 100644 --- a/utils/tests/data/baseline_writeUsdPreviewSurface.usda +++ b/utils/tests/data/baseline_writeUsdPreviewSurface.usda @@ -9,7 +9,9 @@ def Xform "Scene" { def "Materials" { - def Material "GeneralTestMaterial" + def Material "GeneralTestMaterial" ( + displayName = "General Test Material" + ) { float inputs:ambientOcclusion = 0.01 ( customData = { @@ -19,7 +21,7 @@ def Xform "Scene" } } ) - color3f inputs:baseColor = (1, 2, 3) + color3f inputs:baseColor = (1, 0.5, 0.25) float inputs:coatOpacity = 0.55 ( customData = { dictionary range = { @@ -28,7 +30,7 @@ def Xform "Scene" } } ) - float inputs:coatRoughness = 0.66 ( + float inputs:coatRoughness = 0.44 ( customData = { dictionary range = { double max = 1 @@ -36,7 +38,7 @@ def Xform "Scene" } } ) - color3f inputs:emissive = (1, 2, 3) + color3f inputs:emissive = (1, 0.5, 0.25) float inputs:height = 1.23 ( customData = { dictionary range = { @@ -61,7 +63,7 @@ def Xform "Scene" } } ) - normal3f inputs:normal = (0.33, 0.33, 0.33) + normal3f inputs:normal = (0.5, 0.5, 0.5) float inputs:opacity = 0.8 ( customData = { dictionary range = { @@ -78,7 +80,7 @@ def Xform "Scene" } } ) - float inputs:roughness = 0.44 ( + float inputs:roughness = 0.66 ( customData = { dictionary range = { double max = 1 @@ -123,13 +125,28 @@ def Xform "Scene" } } - def Material "TextureTestMaterial" + def Material "TextureTestMaterial" ( + displayName = "Texture Test Material" + ) { - asset inputs:baseColorTexture = @textures/color.png@ - asset inputs:coatOpacityTexture = @textures/color.png@ - asset inputs:emissiveTexture = @textures/color.png@ - asset inputs:normalTexture = @textures/normal.png@ - asset inputs:roughnessTexture = @textures/greyscale.png@ + asset inputs:ambientOcclusionTexture = @textures/occlusion.png@ ( + colorSpace = "raw" + ) + asset inputs:baseColorTexture = @textures/color.png@ ( + colorSpace = "srgb_texture" + ) + asset inputs:coatOpacityTexture = @textures/color.png@ ( + colorSpace = "raw" + ) + asset inputs:emissiveTexture = @textures/color.png@ ( + colorSpace = "srgb_texture" + ) + asset inputs:normalTexture = @textures/normal.png@ ( + colorSpace = "raw" + ) + asset inputs:roughnessTexture = @textures/greyscale.png@ ( + colorSpace = "raw" + ) token outputs:displacement.connect = token outputs:surface.connect = @@ -145,6 +162,7 @@ def Xform "Scene" def Shader "diffuseColor" { uniform token info:id = "UsdUVTexture" + asset inputs:file = @textures/color.png@ asset inputs:file.connect = token inputs:sourceColorSpace = "sRGB" float2 inputs:st.connect = @@ -165,6 +183,7 @@ def Xform "Scene" { uniform token info:id = "UsdUVTexture" float4 inputs:bias = (0.1, 0.2, 0.3, 0) + asset inputs:file = @textures/color.png@ asset inputs:file.connect = float4 inputs:scale = (1, 2, 0.5, 1) token inputs:sourceColorSpace = "sRGB" @@ -174,19 +193,36 @@ def Xform "Scene" float3 outputs:rgb } + def Shader "roughness_stTransform" + { + uniform token info:id = "UsdTransform2d" + float2 inputs:in.connect = + float inputs:rotation = 15 + float2 inputs:scale = (1.5, 0.75) + float2 inputs:translation = (0.12, 3.45) + float2 outputs:result + } + def Shader "roughness" { uniform token info:id = "UsdUVTexture" + float4 inputs:bias = (0.1, 0, 0, 0) + asset inputs:file = @textures/greyscale.png@ asset inputs:file.connect = + float4 inputs:scale = (0.55, 1, 1, 1) token inputs:sourceColorSpace = "raw" - float2 inputs:st.connect = + float2 inputs:st.connect = + token inputs:wrapS = "black" + token inputs:wrapT = "black" float outputs:r } def Shader "clearcoat" { uniform token info:id = "UsdUVTexture" + asset inputs:file = @textures/color.png@ asset inputs:file.connect = + token inputs:sourceColorSpace = "raw" float2 inputs:st.connect = float outputs:g } @@ -194,12 +230,25 @@ def Xform "Scene" def Shader "normal" { uniform token info:id = "UsdUVTexture" + float4 inputs:bias = (-0.75, -0.75, -0.75, 0) + asset inputs:file = @textures/normal.png@ asset inputs:file.connect = + float4 inputs:scale = (1.5, 1.5, 1.5, 0.75) token inputs:sourceColorSpace = "raw" float2 inputs:st.connect = float3 outputs:rgb } + def Shader "occlusion" + { + uniform token info:id = "UsdUVTexture" + asset inputs:file = @textures/occlusion.png@ + asset inputs:file.connect = + token inputs:sourceColorSpace = "raw" + float2 inputs:st.connect = + float outputs:r + } + def Shader "UsdPreviewSurface" { uniform token info:id = "UsdPreviewSurface" @@ -207,6 +256,7 @@ def Xform "Scene" color3f inputs:diffuseColor.connect = color3f inputs:emissiveColor.connect = normal3f inputs:normal.connect = + float inputs:occlusion.connect = float inputs:roughness.connect = token outputs:displacement token outputs:surface @@ -214,7 +264,9 @@ def Xform "Scene" } } - def Material "TransmissionTestMaterial" + def Material "TransmissionTestMaterial" ( + displayName = "Transmission Test Material" + ) { float inputs:opacity = 0.45700002 ( customData = { diff --git a/utils/tests/data/test_invalidNetworks.usda b/utils/tests/data/test_invalidNetworks.usda new file mode 100644 index 00000000..146fb5b4 --- /dev/null +++ b/utils/tests/data/test_invalidNetworks.usda @@ -0,0 +1,452 @@ +#usda 1.0 +( + defaultPrim = "Scene" +) + +def Xform "Scene" +{ + def "Materials" + { + # Please note: only one defect per network, since a single issues can mask the detection + # of other issues + + # ------------------------------------------------------------------------------------------ + # UsdPreviewSurface & ASM networks + # ------------------------------------------------------------------------------------------ + + def Material "MissingTexCoordReader1" + { + token outputs:surface.connect = + + def Shader "UsdPreviewSurface" + { + uniform token info:id = "UsdPreviewSurface" + color3f inputs:diffuseColor.connect = <../diffuseColor.outputs:rgb> + color3f inputs:emissiveColor.connect = <../emissiveColor.outputs:rgb> + token outputs:surface + } + + def Shader "diffuseColor" + { + uniform token info:id = "UsdUVTexture" + asset inputs:file = @textures/color.png@ + # XXX No inputs:st + # float2 inputs:st.connect = ... + float3 outputs:rgb + } + } + + def Material "MissingTexCoordReader2" + { + token outputs:surface.connect = + + def Shader "UsdPreviewSurface" + { + uniform token info:id = "UsdPreviewSurface" + color3f inputs:diffuseColor.connect = <../diffuseColor.outputs:rgb> + token outputs:surface + } + + def Shader "diffuseColor" + { + uniform token info:id = "UsdUVTexture" + asset inputs:file = @textures/color.png@ + # XXX Invalid inputs:st + float2 inputs:st.connect = + float3 outputs:rgb + } + } + + def Material "InvalidSurfaceInput1" + { + token outputs:surface.connect = + + def Shader "UsdPreviewSurface" + { + uniform token info:id = "UsdPreviewSurface" + color3f inputs:diffuseColor.connect = <../texCoordReader.outputs:result> + token outputs:surface + } + + # XXX connecting a color3f input directly to a float2 output on a UsdPrimvarReader_float2 + # node is invalid + def Shader "texCoordReader" + { + uniform token info:id = "UsdPrimvarReader_float2" + string inputs:varname = "st" + float2 outputs:result + } + } + + def Material "InvalidSurfaceInput2" + { + token outputs:surface.connect = + + def Shader "UsdPreviewSurface" + { + uniform token info:id = "UsdPreviewSurface" + color3f inputs:diffuseColor.connect = <../stTransform.outputs:result> + token outputs:surface + } + + # XXX connecting a color3f input directly to a float2 output on a UsdTransform2d node + # is invalid + def Shader "stTransform" + { + uniform token info:id = "UsdTransform2d" + string inputs:varname = "st" + float2 outputs:result + } + } + + def Material "MultipleTexCoordTransform" + { + token outputs:surface.connect = + + def Shader "UsdPreviewSurface" + { + uniform token info:id = "UsdPreviewSurface" + color3f inputs:diffuseColor.connect = <../diffuseColor.outputs:rgb> + token outputs:surface + } + + def Shader "diffuseColor" + { + uniform token info:id = "UsdUVTexture" + asset inputs:file = @textures/color.png@ + float2 inputs:st.connect = <../diffuseColor_stTransform.outputs:result> + float3 outputs:rgb + } + + def Shader "diffuseColor_stTransform" + { + uniform token info:id = "UsdTransform2d" + float2 inputs:in.connect = <../diffuseColor_stTransform2.outputs:result> + float2 outputs:result + } + + # XXX a second transform is not supported + def Shader "diffuseColor_stTransform2" + { + uniform token info:id = "UsdTransform2d" + float2 inputs:in.connect = <../texCoordReader.outputs:result> + float2 outputs:result + } + + def Shader "texCoordReader" + { + uniform token info:id = "UsdPrimvarReader_float2" + string inputs:varname = "st" + float2 outputs:result + } + } + + def Material "TexCoordLoop" + { + token outputs:surface.connect = + + def Shader "UsdPreviewSurface" + { + uniform token info:id = "UsdPreviewSurface" + color3f inputs:diffuseColor.connect = <../diffuseColor.outputs:rgb> + token outputs:surface + } + + def Shader "diffuseColor" + { + uniform token info:id = "UsdUVTexture" + asset inputs:file = @textures/color.png@ + float2 inputs:st.connect = <../diffuseColor_stTransform.outputs:result> + float3 outputs:rgb + } + + def Shader "diffuseColor_stTransform" + { + uniform token info:id = "UsdTransform2d" + # XXX This loop should not throw the code for a loop + float2 inputs:in.connect = <../diffuseColor_stTransform.outputs:result> + float2 outputs:result + } + } + + # ------------------------------------------------------------------------------------------ + # OpenPBR/MaterialX networks + # ------------------------------------------------------------------------------------------ + + def Material "MissingTexCoordReader3" + { + token outputs:mtlx:surface.connect = + + def Shader "OpenPBR" + { + uniform token info:id = "ND_open_pbr_surface_surfaceshader" + color3f inputs:base_color.connect = <../base_color.outputs:out> + token outputs:out + } + + def Shader "base_color" + { + uniform token info:id = "ND_image_color3" + asset inputs:file = @textures/color.png@ + # XXX No inputs:st + # float2 inputs:texcoord.connect = ... + color3f outputs:out + } + } + + def Material "MissingTexCoordReader4" + { + token outputs:mtlx:surface.connect = + + def Shader "OpenPBR" + { + uniform token info:id = "ND_open_pbr_surface_surfaceshader" + color3f inputs:base_color.connect = <../base_color.outputs:out> + token outputs:out + } + + def Shader "base_color" + { + uniform token info:id = "ND_image_color3" + asset inputs:file = @textures/color.png@ + float2 inputs:texcoord.connect = <../base_color_uv_transform.outputs:out> + color3f outputs:out + } + + def Shader "base_color_uv_transform" + { + uniform token info:id = "ND_place2d_vector2" + float2 inputs:offset = (0.12, 3.45) + # XXX No inputs:st + # float2 inputs:texcoord.connect = ... + float2 outputs:out + } + } + + def Material "InvalidSurfaceInput3" + { + token outputs:mtlx:surface.connect = + + def Shader "OpenPBR" + { + uniform token info:id = "ND_open_pbr_surface_surfaceshader" + color3f inputs:base_color.connect = <../subtract_color.outputs:out> + token outputs:out + } + + def Shader "subtract_color" + { + # XXX ND_subtract_color3 is an unsupported node + uniform token info:id = "ND_subtract_color3" + color3f inputs:in1 = (1, 2, 0.5) + color3f inputs:in2 = (.5, 2, 1) + color3f outputs:out + } + } + + def Material "IncorrectScaleInputs" + { + token outputs:mtlx:surface.connect = + + def Shader "OpenPBR" + { + uniform token info:id = "ND_open_pbr_surface_surfaceshader" + color3f inputs:base_color.connect = <../base_color_scale.outputs:out> + token outputs:out + } + + def Shader "base_color_scale" + { + uniform token info:id = "ND_multiply_color3" + # XXX The continuing connection has to be on `in2` and not `in1` + color3f inputs:in2 = (1, 2, 0.5) + color3f inputs:in1.connect = <../base_color_bias.outputs:out> + color3f outputs:out + } + + def Shader "base_color" + { + uniform token info:id = "ND_image_color3" + asset inputs:file = @textures/color.png@ + float2 inputs:texcoord.connect = <../texCoordReader.outputs:out> + color3f outputs:out + } + + def Shader "texCoordReader" + { + uniform token info:id = "ND_texcoord_vector2" + float2 outputs:out + } + } + + def Material "WrongScaleAndBiasOrder" + { + token outputs:mtlx:surface.connect = + + def Shader "OpenPBR" + { + uniform token info:id = "ND_open_pbr_surface_surfaceshader" + color3f inputs:base_color.connect = <../base_color_scale.outputs:out> + token outputs:out + } + + # XXX The order is wrong, from the direction of the OpenPBR surface, the bias node needs + # to come first and then the scale node. Having just the scale node is fine, but having + # it be followed by a bias node is not correct. + def Shader "base_color_scale" + { + uniform token info:id = "ND_multiply_color3" + color3f inputs:in1 = (1, 2, 0.5) + color3f inputs:in2.connect = <../base_color_bias.outputs:out> + color3f outputs:out + } + + def Shader "base_color_bias" + { + uniform token info:id = "ND_add_color3" + color3f inputs:in1 = (0.1, 0.2, 0.3) + color3f inputs:in2.connect = <../base_color.outputs:out> + color3f outputs:out + } + + def Shader "base_color" + { + uniform token info:id = "ND_image_color3" + asset inputs:file = @textures/color.png@ + float2 inputs:texcoord.connect = <../texCoordReader.outputs:out> + color3f outputs:out + } + + def Shader "texCoordReader" + { + uniform token info:id = "ND_texcoord_vector2" + float2 outputs:out + } + } + + # Same as WrongScaleAndBiasOrder, but for a float input + def Material "WrongScaleAndBiasOrder2" + { + token outputs:mtlx:surface.connect = + + def Shader "OpenPBR" + { + uniform token info:id = "ND_open_pbr_surface_surfaceshader" + float inputs:specular_roughness.connect = <../specular_roughness_scale.outputs:out> + token outputs:out + } + + # XXX The order is wrong, from the direction of the OpenPBR surface, the bias node needs + # to come first and then the scale node. Having just the scale node is fine, but having + # it be followed by a bias node is not correct. + def Shader "specular_roughness_scale" + { + uniform token info:id = "ND_multiply_float" + float inputs:in1 = 2.0 + float inputs:in2.connect = <../specular_roughness_bias.outputs:out> + float outputs:out + } + + def Shader "specular_roughness_bias" + { + uniform token info:id = "ND_add_float" + float inputs:in1 = -1.0 + float inputs:in2.connect = <../specular_roughness_to_float.outputs:outx> + float outputs:out + } + + def Shader "specular_roughness_to_float" + { + uniform token info:id = "ND_separate4_vector4" + float4 inputs:in.connect = <../specular_roughness.outputs:out> + float outputs:outy + } + + def Shader "specular_roughness" + { + uniform token info:id = "ND_image_vector4" + asset inputs:file = @textures/roughness.png@ + float2 inputs:texcoord.connect = <../texCoordReader.outputs:out> + float4 outputs:out + } + + def Shader "texCoordReader" + { + uniform token info:id = "ND_texcoord_vector2" + float2 outputs:out + } + } + + def Material "MultipleTexCoordTransform2" + { + token outputs:mtlx:surface.connect = + + def Shader "OpenPBR" + { + uniform token info:id = "ND_open_pbr_surface_surfaceshader" + color3f inputs:base_color.connect = <../base_color.outputs:out> + token outputs:out + } + + def Shader "base_color" + { + uniform token info:id = "ND_image_color3" + asset inputs:file = @textures/color.png@ + float2 inputs:texcoord.connect = <../base_color_uv_transform.outputs:out> + color3f outputs:out + } + + def Shader "base_color_uv_transform" + { + uniform token info:id = "ND_place2d_vector2" + float2 inputs:texcoord.connect = <../base_color_uv_transform2.outputs:out> + float2 outputs:out + } + + # XXX a second transform is not supported + def Shader "base_color_uv_transform2" + { + uniform token info:id = "ND_place2d_vector2" + float2 inputs:texcoord.connect = <../texCoordReader.outputs:out> + float2 outputs:out + } + + def Shader "texCoordReader" + { + uniform token info:id = "ND_texcoord_vector2" + float2 outputs:out + } + } + + def Material "TexCoordLoop2" + { + token outputs:mtlx:surface.connect = + + def Shader "OpenPBR" + { + uniform token info:id = "ND_open_pbr_surface_surfaceshader" + color3f inputs:base_color.connect = <../base_color.outputs:out> + token outputs:out + } + + def Shader "base_color" + { + uniform token info:id = "ND_image_color3" + asset inputs:file = @textures/color.png@ + float2 inputs:texcoord.connect = <../base_color_uv_transform.outputs:out> + color3f outputs:out + } + + def Shader "base_color_uv_transform" + { + uniform token info:id = "ND_place2d_vector2" + float2 inputs:offset = (0.12, 3.45) + float inputs:rotate = 15 + float2 inputs:scale = (0.6666667, 1.3333334) + # XXX This loop should not throw the code for a loop + float2 inputs:texcoord.connect = <../base_color_uv_transform.outputs:out> + float2 outputs:out + } + } + } +} diff --git a/utils/tests/tests.cpp b/utils/tests/tests.cpp index 3a090ffd..602530c1 100644 --- a/utils/tests/tests.cpp +++ b/utils/tests/tests.cpp @@ -12,6 +12,8 @@ governing permissions and limitations under the License. #include #include +#include +#include #include #include @@ -21,22 +23,20 @@ governing permissions and limitations under the License. #include #include -#include -#include - -// Run with this turned on to (re-)generate the baselines -#define UPDATE_USDA_BASELINES 0 - -#if UPDATE_USDA_BASELINES -# define ASSERT_USDA(usdaLayer, baselinePath) \ - { \ - std::cout << "Updating USDA baseline " << baselinePath << std::endl; \ - usdaLayer->Export(baselinePath); \ - assertUsda(usdaLayer, baselinePath); \ - } -#else -# define ASSERT_USDA(usdaLayer, baselinePath) assertUsda(usdaLayer, baselinePath) -#endif + +// Set to true to (re-)generate USDA baselines, false to compare against them +constexpr bool UPDATE_USDA_BASELINES = false; + +// Set to true to dump the output next to the baselines if a comparison fails +constexpr bool DUMP_FAILED_USDA_OUTPUT = false; + +// Macro to compare against or generate a USDA baseline +#define ASSERT_USDA(usdaLayer, baselinePath) \ + ASSERT_TRUE(assertUsda(usdaLayer, baselinePath, UPDATE_USDA_BASELINES, DUMP_FAILED_USDA_OUTPUT)) + +// if running locally from VSCode, replace the empty assetDir with the commented out line below +std::string assetDir = ""; +// std::string assetDir = std::filesystem::current_path().string() + "/utils/tests/"; PXR_NAMESPACE_USING_DIRECTIVE @@ -45,80 +45,38 @@ using namespace adobe::usd; // This class is here to expose the protected SdfFileFormat::_SetLayerData function to this test class TestFileFormat : public SdfFileFormat { - public: +public: static void SetLayerData(SdfLayer* layer, SdfAbstractDataRefPtr& data) { SdfFileFormat::_SetLayerData(layer, data); } }; -void -assertUsda(const SdfLayerHandle& sdfLayer, const std::string& baselinePath) -{ - ASSERT_TRUE(sdfLayer); - SdfLayerRefPtr baselineLayer = SdfLayer::FindOrOpen(baselinePath); - ASSERT_TRUE(baselineLayer) << "Failed to load baseline layer from " << baselinePath; - - std::string layerStr; - sdfLayer->ExportToString(&layerStr); - std::string baselineStr; - baselineLayer->ExportToString(&baselineStr); - - if (layerStr != baselineStr) { - EXPECT_TRUE(false) << "Output of layer " << sdfLayer->GetIdentifier() - << " does not match baseline " << baselinePath; - - std::cout << "Layer output has length: " << layerStr.size() - << "\nBaseline has length: " << baselineStr.size() << std::endl; - - std::filesystem::path basePath(baselinePath); - std::string dumpPath = basePath.filename().string(); - std::fstream out(dumpPath, std::ios::out); - out << layerStr; - out.close(); - std::cout << "Output dumped to " << dumpPath << std::endl; - - // Very poor person's diff operation. Can we do better without bringing - // in a diff library? - for (size_t i = 0; i < layerStr.size(); ++i) { - if (i >= baselineStr.size()) { - std::cout << "Size difference. Output has more characters than baseline" - << std::endl; - break; - } - if (layerStr[i] != baselineStr[i]) { - std::cout << "Mismatch at char " << i << std::endl; - std::cout << "Remainder in output:\n" << &layerStr[i] << std::endl; - std::cout << "Remainder in baseline:\n" << &baselineStr[i] << std::endl; - break; - } - } - } -} - -void +Material& fillGeneralTestMaterial(UsdData& data) { Material& m = data.addMaterial().second; m.name = "GeneralTestMaterial"; + m.displayName = "General Test Material"; + // Set every input to a constant value m.useSpecularWorkflow = Input{ VtValue(1) }; - m.diffuseColor = Input{ VtValue(GfVec3f(1.0f, 2.0f, 3.0f)) }; - m.emissiveColor = Input{ VtValue(GfVec3f(1.0f, 2.0f, 3.0f)) }; + m.diffuseColor = Input{ VtValue(GfVec3f(1.0f, 0.5f, 0.25f)) }; + m.emissiveColor = Input{ VtValue(GfVec3f(1.0f, 0.5f, 0.25f)) }; m.specularLevel = Input{ VtValue(0.5f) }; m.specularColor = Input{ VtValue(GfVec3f(1.0f, 0.0f, 1.0f)) }; - m.normal = Input{ VtValue(GfVec3f(0.33f, 0.33f, 0.33f)) }; - m.normalScale = Input{ VtValue(0.666f) }; + m.normal = Input{ VtValue(GfVec3f(0.5f, 0.5f, 0.5f)) }; + m.normalScale = Input{ VtValue(0.5f) }; m.metallic = Input{ VtValue(0.22f) }; - m.roughness = Input{ VtValue(0.44f) }; + m.roughness = Input{ VtValue(0.66f) }; m.clearcoat = Input{ VtValue(0.55f) }; m.clearcoatColor = Input{ VtValue(GfVec3f(1.0f, 1.0f, 0.0f)) }; - m.clearcoatRoughness = Input{ VtValue(0.66f) }; + m.clearcoatRoughness = Input{ VtValue(0.44f) }; m.clearcoatIor = Input{ VtValue(1.33f) }; m.clearcoatSpecular = Input{ VtValue(0.88f) }; m.clearcoatNormal = Input{ VtValue(GfVec3f(0.66f, 0.0f, 0.66f)) }; m.sheenColor = Input{ VtValue(GfVec3f(0.0f, 1.0f, 1.0f)) }; - m.sheenRoughness = Input{ VtValue(0.99f) }; + m.sheenRoughness = Input{ VtValue(0.5f) }; m.anisotropyLevel = Input{ VtValue(0.321f) }; m.anisotropyAngle = Input{ VtValue(0.777f) }; m.opacity = Input{ VtValue(0.8f) }; @@ -132,6 +90,9 @@ fillGeneralTestMaterial(UsdData& data) m.absorptionColor = Input{ VtValue(GfVec3f(0.25f, 0.5f, 1.0f)) }; m.scatteringDistance = Input{ VtValue(222.0f) }; m.scatteringColor = Input{ VtValue(GfVec3f(1.0f, 0.5f, 1.0f)) }; + m.clearcoatModelsTransmissionTint = true; + m.isUnlit = true; + return m; } void @@ -139,20 +100,26 @@ fillTextureTestMaterial(UsdData& data) { // Add some images to use auto [colorId, colorImage] = data.addImage(); - colorImage.name = "color.png"; + colorImage.name = "color"; colorImage.uri = "textures/color.png"; colorImage.format = ImageFormat::ImageFormatPng; auto [normalId, normalImage] = data.addImage(); - normalImage.name = "normal.png"; + normalImage.name = "normal"; normalImage.uri = "textures/normal.png"; normalImage.format = ImageFormat::ImageFormatPng; auto [greyscaleId, greyscaleImage] = data.addImage(); - greyscaleImage.name = "greyscale.png"; + greyscaleImage.name = "greyscale"; greyscaleImage.uri = "textures/greyscale.png"; greyscaleImage.format = ImageFormat::ImageFormatPng; + auto [occlusionId, occlusionImage] = data.addImage(); + occlusionImage.name = "occlusion"; + occlusionImage.uri = "textures/occlusion.png"; + occlusionImage.format = ImageFormat::ImageFormatPng; Material& m = data.addMaterial().second; m.name = "TextureTestMaterial"; + m.displayName = "Texture Test Material"; + // Set different inputs to specific texture setups // Color textures @@ -166,7 +133,7 @@ fillTextureTestMaterial(UsdData& data) // Wrap mode, scale & bias, UV transform input.wrapS = AdobeTokens->clamp; input.wrapT = AdobeTokens->mirror; - input.scale = GfVec4f(1.0f, 2.0f, 0.5, 1.0f); + input.scale = GfVec4f(1.0f, 2.0f, 0.5f, 1.0f); input.bias = GfVec4f(0.1f, 0.2f, 0.3f, 0.0f); input.uvRotation = 15.0f; input.uvScale = GfVec2f(1.5f, 0.75f); @@ -180,8 +147,16 @@ fillTextureTestMaterial(UsdData& data) input.image = normalId; input.channel = AdobeTokens->rgb; input.colorspace = AdobeTokens->raw; + // GLTF files sometimes scale the normals + const float nmScale = 0.75f; + input.scale = GfVec4f(2.0f, 2.0f, 2.0f, 1.0f) * nmScale; + input.bias = GfVec4f(-1.0f, -1.0f, -1.0f, 0.0f) * nmScale; m.normal = input; m.clearcoatNormal = input; + // Put DirectX convention decoding values on the clearcoat normals + m.clearcoatNormal.scale = GfVec4f(2.0f, -2.0f, 2.0f, 1.0f); + m.clearcoatNormal.bias = GfVec4f(-1.0f, 1.0f, -1.0f, 0.0f); + // XXX test normal map scale the way GLTF can create } // Greyscale maps @@ -190,14 +165,34 @@ fillTextureTestMaterial(UsdData& data) input.image = greyscaleId; input.channel = AdobeTokens->r; input.colorspace = AdobeTokens->raw; + + // Wrap mode, scale & bias, UV transform for the single channel case + input.wrapS = AdobeTokens->black; + input.wrapT = AdobeTokens->black; + input.scale = GfVec4f(0.55f, 1.0f, 1.0f, 1.0f); + input.bias = GfVec4f(0.1f, 0.0f, 0.0f, 0.0f); + input.uvRotation = 15.0f; + input.uvScale = GfVec2f(1.5f, 0.75f); + input.uvTranslation = GfVec2f(0.12f, 3.45f); m.roughness = input; } + // Occlusion maps + { + Input input; + input.image = occlusionId; + input.channel = AdobeTokens->r; + input.colorspace = AdobeTokens->raw; + + m.occlusion = input; + } + // Single channel from RGB map { Input input; input.image = colorId; input.channel = AdobeTokens->g; + input.colorspace = AdobeTokens->raw; m.clearcoat = input; } } @@ -207,12 +202,150 @@ fillTransmissionMaterial(UsdData& data) { Material& m = data.addMaterial().second; m.name = "TransmissionTestMaterial"; + m.displayName = "Transmission Test Material"; - // Set transmission, but not opacity. For UsdPreviewSurface this should be mapped as an inverse + // Set transmission, but NOT opacity. For UsdPreviewSurface this should be mapped as an inverse // to opacity m.transmission = Input{ VtValue(0.543f) }; } +void +fillTransmissionMaterialAsUsdPreviewSurfaceBaseline(UsdData& data) +{ + Material& m = data.addMaterial().second; + m.name = "TransmissionTestMaterial"; + m.displayName = "Transmission Test Material"; + + // Set opacity to the inverse of the above transmission, since this is how this should be read + // from a UsdPreviewSurface representation + m.opacity = Input{ VtValue(1.0f - 0.543f) }; +} + +void +compareInputs(const std::string& inputName, + const Input& input, + const Input& baseline, + const UsdData& data, + const UsdData& baselineData) +{ + EXPECT_EQ(input.value, baseline.value) << inputName; + // Comparing the `image` member is a bit involved, since it is an index into the owning UsdData + // Either both image indices are invalid or both are valid + EXPECT_EQ(input.image == -1, baseline.image == -1) << inputName; + if (input.image != -1 && baseline.image != -1) { + ASSERT_TRUE(input.image < data.images.size()) << inputName; + ASSERT_TRUE(baseline.image < baselineData.images.size()) << inputName; + const ImageAsset& image = data.images[input.image]; + const ImageAsset& baselineImage = baselineData.images[baseline.image]; + EXPECT_EQ(image.name, baselineImage.name) << inputName; + EXPECT_EQ(image.uri, baselineImage.uri) << inputName; + EXPECT_EQ(image.format, baselineImage.format) << inputName; + } + EXPECT_EQ(input.uvIndex, baseline.uvIndex) << inputName; + EXPECT_EQ(input.channel, baseline.channel) << inputName; + EXPECT_EQ(input.wrapS, baseline.wrapS) << inputName; + EXPECT_EQ(input.wrapT, baseline.wrapT) << inputName; + EXPECT_EQ(input.minFilter, baseline.minFilter) << inputName; + EXPECT_EQ(input.magFilter, baseline.magFilter) << inputName; + EXPECT_EQ(input.colorspace, baseline.colorspace) << inputName; + EXPECT_EQ(input.scale, baseline.scale) << inputName; + EXPECT_EQ(input.bias, baseline.bias) << inputName; + EXPECT_EQ(input.uvRotation, baseline.uvRotation) << inputName; + EXPECT_EQ(input.uvScale, baseline.uvScale) << inputName; + EXPECT_EQ(input.uvTranslation, baseline.uvTranslation) << inputName; +} + +void +compareMaterials(const Material& material, + const Material& baseline, + const UsdData& data, + const UsdData& baselineData) +{ + EXPECT_EQ(material.name, baseline.name); + EXPECT_EQ(material.displayName, baseline.displayName); + + EXPECT_EQ(material.clearcoatModelsTransmissionTint, baseline.clearcoatModelsTransmissionTint); + EXPECT_EQ(material.isUnlit, baseline.isUnlit); + +#define COMP_INPUT(x) compareInputs(#x, material.x, baseline.x, data, baselineData); + COMP_INPUT(useSpecularWorkflow) + COMP_INPUT(diffuseColor) + COMP_INPUT(emissiveColor) + COMP_INPUT(specularLevel) + COMP_INPUT(specularColor) + COMP_INPUT(normal) + COMP_INPUT(normalScale) + COMP_INPUT(metallic) + COMP_INPUT(roughness) + COMP_INPUT(clearcoat) + COMP_INPUT(clearcoatColor) + COMP_INPUT(clearcoatRoughness) + COMP_INPUT(clearcoatIor) + COMP_INPUT(clearcoatSpecular) + COMP_INPUT(clearcoatNormal) + COMP_INPUT(sheenColor) + COMP_INPUT(sheenRoughness) + COMP_INPUT(anisotropyLevel) + COMP_INPUT(anisotropyAngle) + COMP_INPUT(opacity) + COMP_INPUT(opacityThreshold) + COMP_INPUT(displacement) + COMP_INPUT(occlusion) + COMP_INPUT(ior) + COMP_INPUT(transmission) + COMP_INPUT(volumeThickness) + COMP_INPUT(absorptionDistance) + COMP_INPUT(absorptionColor) + COMP_INPUT(scatteringDistance) + COMP_INPUT(scatteringColor) +#undef COMP_INPUT +} + +TEST(FileFormatUtilsTests, materialStructConversions) +{ + // Note, only Material -> OpenPbrMaterial -> Material needs to be preserving all information + // OpenPbrMaterial can carry additional information that would not correctly round trip + + { + UsdData data; + fillGeneralTestMaterial(data); + ASSERT_EQ(data.materials.size(), 1); + Material& baselineMaterial = data.materials[0]; + + OpenPbrMaterial openPbrMaterial = + mapMaterialStructToOpenPbrMaterialStruct(baselineMaterial); + Material outputMaterial = mapOpenPbrMaterialStructToMaterialStruct(openPbrMaterial); + + compareMaterials(outputMaterial, baselineMaterial, data, data); + } + + { + UsdData data; + fillTextureTestMaterial(data); + ASSERT_EQ(data.materials.size(), 1); + Material& baselineMaterial = data.materials[0]; + + OpenPbrMaterial openPbrMaterial = + mapMaterialStructToOpenPbrMaterialStruct(baselineMaterial); + Material outputMaterial = mapOpenPbrMaterialStructToMaterialStruct(openPbrMaterial); + + compareMaterials(outputMaterial, baselineMaterial, data, data); + } + + { + UsdData data; + fillTransmissionMaterial(data); + ASSERT_EQ(data.materials.size(), 1); + Material& baselineMaterial = data.materials[0]; + + OpenPbrMaterial openPbrMaterial = + mapMaterialStructToOpenPbrMaterialStruct(baselineMaterial); + Material outputMaterial = mapOpenPbrMaterialStructToMaterialStruct(openPbrMaterial); + + compareMaterials(outputMaterial, baselineMaterial, data, data); + } +} + TEST(FileFormatUtilsTests, writeUsdPreviewSurface) { SdfLayerRefPtr layer = SdfLayer::CreateAnonymous("Scene.usda"); @@ -234,7 +367,7 @@ TEST(FileFormatUtilsTests, writeUsdPreviewSurface) // be updated all the time layer->SetDocumentation(""); - ASSERT_USDA(layer, "data/baseline_writeUsdPreviewSurface.usda"); + ASSERT_USDA(layer, assetDir + "data/baseline_writeUsdPreviewSurface.usda"); } #ifdef USD_FILEFORMATS_ENABLE_ASM @@ -259,7 +392,7 @@ TEST(FileFormatUtilsTests, writeASM) // be updated all the time layer->SetDocumentation(""); - ASSERT_USDA(layer, "data/baseline_writeASM.usda"); + ASSERT_USDA(layer, assetDir + "data/baseline_writeASM.usda"); } #endif // USD_FILEFORMATS_ENABLE_ASM @@ -284,5 +417,146 @@ TEST(FileFormatUtilsTests, writeOpenPBR) // be updated all the time layer->SetDocumentation(""); - ASSERT_USDA(layer, "data/baseline_writeOpenPBR.usda"); -} \ No newline at end of file + ASSERT_USDA(layer, assetDir + "data/baseline_writeOpenPBR.usda"); +} + +const SdfPath generalTestMaterialPath("/Scene/Materials/GeneralTestMaterial"); +const SdfPath textureTestMaterialPath("/Scene/Materials/TextureTestMaterial"); +const SdfPath transmissionTestMaterialPath("/Scene/Materials/TransmissionTestMaterial"); + +void +defaultBaselineProcessor(Material&) +{} + +template +void +readAndCompareMaterial(const UsdStageRefPtr& stage, + const SdfPath& materialPath, + BaselineGenerator baselineGenerator, + BaselineProcessor baselineProcessor) +{ + UsdPrim materialPrim = stage->GetPrimAtPath(materialPath); + ASSERT_TRUE(materialPrim); + + UsdData usdData; + + ReadLayerOptions options; + ReadLayerContext ctx; + ctx.stage = stage; + ctx.usd = &usdData; + ctx.options = &options; + ctx.debugTag = "Test"; + ctx.warnAboutMissingAssets = false; + EXPECT_TRUE(readMaterial(ctx, materialPrim)); + + ASSERT_EQ(usdData.materials.size(), 1); + const Material& material = usdData.materials[0]; + + UsdData baselineData; + baselineGenerator(baselineData); + ASSERT_EQ(baselineData.materials.size(), 1); + Material& baselineMaterial = baselineData.materials[0]; + baselineProcessor(baselineMaterial); + + compareMaterials(material, baselineMaterial, usdData, baselineData); +} + +TEST(FileFormatUtilsTests, readUsdPreviewSurface) +{ + UsdStageRefPtr stage = UsdStage::Open(assetDir + "data/baseline_writeUsdPreviewSurface.usda"); + ASSERT_TRUE(stage); + + auto usdPreviewSurfaceBaselineProcessor = [](Material& baselineMaterial) { + // UsdPreviewSurface doesn't support a couple of inputs, so we clear them + baselineMaterial.specularLevel = {}; + baselineMaterial.normalScale = {}; + baselineMaterial.clearcoatColor = {}; + baselineMaterial.clearcoatIor = {}; + baselineMaterial.clearcoatSpecular = {}; + baselineMaterial.clearcoatNormal = {}; + baselineMaterial.sheenColor = {}; + baselineMaterial.sheenRoughness = {}; + baselineMaterial.anisotropyLevel = {}; + baselineMaterial.anisotropyAngle = {}; + baselineMaterial.transmission = {}; + baselineMaterial.volumeThickness = {}; + baselineMaterial.absorptionDistance = {}; + baselineMaterial.absorptionColor = {}; + baselineMaterial.scatteringDistance = {}; + baselineMaterial.scatteringColor = {}; + baselineMaterial.clearcoatModelsTransmissionTint = false; + baselineMaterial.isUnlit = false; + }; + readAndCompareMaterial( + stage, generalTestMaterialPath, fillGeneralTestMaterial, usdPreviewSurfaceBaselineProcessor); + + readAndCompareMaterial( + stage, textureTestMaterialPath, fillTextureTestMaterial, usdPreviewSurfaceBaselineProcessor); + + readAndCompareMaterial(stage, + transmissionTestMaterialPath, + fillTransmissionMaterialAsUsdPreviewSurfaceBaseline, + usdPreviewSurfaceBaselineProcessor); +} + +TEST(FileFormatUtilsTests, readASM) +{ + UsdStageRefPtr stage = UsdStage::Open(assetDir + "data/baseline_writeASM.usda"); + ASSERT_TRUE(stage); + + readAndCompareMaterial( + stage, generalTestMaterialPath, fillGeneralTestMaterial, defaultBaselineProcessor); + + readAndCompareMaterial( + stage, textureTestMaterialPath, fillTextureTestMaterial, defaultBaselineProcessor); + + readAndCompareMaterial( + stage, transmissionTestMaterialPath, fillTransmissionMaterial, defaultBaselineProcessor); +} + +TEST(FileFormatUtilsTests, readOpenPBR) +{ + UsdStageRefPtr stage = UsdStage::Open(assetDir + "data/baseline_writeOpenPBR.usda"); + ASSERT_TRUE(stage); + + readAndCompareMaterial( + stage, generalTestMaterialPath, fillGeneralTestMaterial, defaultBaselineProcessor); + + readAndCompareMaterial( + stage, textureTestMaterialPath, fillTextureTestMaterial, defaultBaselineProcessor); + + readAndCompareMaterial( + stage, transmissionTestMaterialPath, fillTransmissionMaterial, defaultBaselineProcessor); +} + +TEST(FileFormatUtilsTests, invalidNetworkReading) +{ + UsdStageRefPtr stage = UsdStage::Open(assetDir + "data/test_invalidNetworks.usda"); + ASSERT_TRUE(stage); + + UsdPrim materials = stage->GetPrimAtPath(SdfPath("/Scene/Materials")); + ASSERT_TRUE(materials); + + for (UsdPrim materialPrim : materials.GetChildren()) { + UsdShadeMaterial material(materialPrim); + ASSERT_TRUE(material); + + std::cout << "Reading bad network at " << materialPrim.GetPath().GetText() << std::endl; + + UsdData usdData; + + ReadLayerOptions options; + ReadLayerContext ctx; + ctx.stage = stage; + ctx.usd = &usdData; + ctx.options = &options; + ctx.debugTag = "Test"; + ctx.warnAboutMissingAssets = false; + // This material is bad and we expect a failure to read the network + EXPECT_FALSE(readMaterial(ctx, materialPrim)); + + // XXX This is worth debating, whether or not we should have a partial material in the scene + // We current continue with a partial material + ASSERT_EQ(usdData.materials.size(), 1); + } +} diff --git a/version b/version deleted file mode 100644 index 26aaba0e..00000000 --- a/version +++ /dev/null @@ -1 +0,0 @@ -1.2.0 diff --git a/version.json b/version.json new file mode 100644 index 00000000..6115de7f --- /dev/null +++ b/version.json @@ -0,0 +1,3 @@ +{ + "version": "2026.03.0" +} From 8223197a7d43e2466f5fe03895b1278986df60ad Mon Sep 17 00:00:00 2001 From: dstover11 Date: Tue, 10 Mar 2026 11:22:17 -0400 Subject: [PATCH 02/13] - Adding MacOS-15 requirements to PR builds - Adding build targets for USD 25.08 in PR builds - Adding build targets for USD 25.11 in PR builds --- test/pr_versions.json | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/test/pr_versions.json b/test/pr_versions.json index dded205f..f4590275 100644 --- a/test/pr_versions.json +++ b/test/pr_versions.json @@ -1,10 +1,20 @@ { - "include": [ - {"os": "windows-2022", "usd_version": "2308"}, - {"os": "windows-2022", "usd_version": "2411"}, - {"os": "macOS-14", "usd_version": "2408"}, - {"os": "macOS-14", "usd_version": "2411"}, - {"os": "ubuntu-22.04", "usd_version": "2308"}, - {"os": "ubuntu-22.04", "usd_version": "2411"} - ] + "include": [ + { "os": "windows-2022", "usd_version": "2308" }, + { "os": "windows-2022", "usd_version": "2411" }, + { "os": "windows-2022", "usd_version": "2508" }, + { "os": "windows-2022", "usd_version": "2511" }, + { "os": "macOS-14", "usd_version": "2408" }, + { "os": "macOS-14", "usd_version": "2411" }, + { "os": "macOS-14", "usd_version": "2508" }, + { "os": "macOS-14", "usd_version": "2511" }, + { "os": "macOS-15", "usd_version": "2408" }, + { "os": "macOS-15", "usd_version": "2411" }, + { "os": "macOS-15", "usd_version": "2508" }, + { "os": "macOS-15", "usd_version": "2511" }, + { "os": "ubuntu-22.04", "usd_version": "2308" }, + { "os": "ubuntu-22.04", "usd_version": "2411" }, + { "os": "ubuntu-22.04", "usd_version": "2508" }, + { "os": "ubuntu-22.04", "usd_version": "2511" } + ] } From 3deee8773c61ae66cae1d1aeb1382a144d0680e6 Mon Sep 17 00:00:00 2001 From: dstover11 Date: Tue, 10 Mar 2026 11:36:01 -0400 Subject: [PATCH 03/13] updating the USD package system to include MacOS15 platform support --- .github/workflows/create-usd-release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/create-usd-release.yml b/.github/workflows/create-usd-release.yml index 6e575125..f678f609 100644 --- a/.github/workflows/create-usd-release.yml +++ b/.github/workflows/create-usd-release.yml @@ -21,7 +21,7 @@ jobs: run: | OS_LIST="[\"windows-2022\"" if [[ "${{ github.event.inputs.usd_version }}" -gt 2400 ]]; then - OS_LIST="$OS_LIST,\"macOS-14\"" + OS_LIST="$OS_LIST,\"macOS-14\", \"macOS-15\"" fi OS_LIST="$OS_LIST,\"ubuntu-22.04\"]" echo "matrix=$OS_LIST" >> $GITHUB_OUTPUT From 13375692eeb5d55b380750de0bd98b8324aaee67 Mon Sep 17 00:00:00 2001 From: dstover11 Date: Tue, 10 Mar 2026 12:28:29 -0400 Subject: [PATCH 04/13] Adding support for the following platforms: - macos-26 - macos-26-intel - windows-25 - ubuntu-24.04 Updating the PR Matrix to build supported platforms against 2508 and 2511 Updating the full build matrix to include new supported platforms --- .github/workflows/create-usd-release.yml | 6 +-- test/full_versions.json | 52 +++++++++++++++++------- test/pr_versions.json | 25 ++++++++---- 3 files changed, 56 insertions(+), 27 deletions(-) diff --git a/.github/workflows/create-usd-release.yml b/.github/workflows/create-usd-release.yml index f678f609..cf848db1 100644 --- a/.github/workflows/create-usd-release.yml +++ b/.github/workflows/create-usd-release.yml @@ -19,11 +19,11 @@ jobs: steps: - id: set-matrix run: | - OS_LIST="[\"windows-2022\"" + OS_LIST="[\"windows-2022\", \"windows-2025\"" if [[ "${{ github.event.inputs.usd_version }}" -gt 2400 ]]; then - OS_LIST="$OS_LIST,\"macOS-14\", \"macOS-15\"" + OS_LIST="$OS_LIST,\"macOS-14\", \"macOS-15\", \"macos-26\", \"macos-26-intel\"" fi - OS_LIST="$OS_LIST,\"ubuntu-22.04\"]" + OS_LIST="$OS_LIST,\"ubuntu-22.04\", \"ubuntu-24.04\"]" echo "matrix=$OS_LIST" >> $GITHUB_OUTPUT build: diff --git a/test/full_versions.json b/test/full_versions.json index 6a75a786..1d9d8bde 100644 --- a/test/full_versions.json +++ b/test/full_versions.json @@ -1,17 +1,39 @@ { - "include": [ - {"os": "windows-2022", "usd_version": "2308"}, - {"os": "windows-2022", "usd_version": "2311"}, - {"os": "windows-2022", "usd_version": "2405"}, - {"os": "windows-2022", "usd_version": "2408"}, - {"os": "windows-2022", "usd_version": "2411"}, - {"os": "macOS-14", "usd_version": "2405"}, - {"os": "macOS-14", "usd_version": "2408"}, - {"os": "macOS-14", "usd_version": "2411"}, - {"os": "ubuntu-22.04", "usd_version": "2308"}, - {"os": "ubuntu-22.04", "usd_version": "2311"}, - {"os": "ubuntu-22.04", "usd_version": "2405"}, - {"os": "ubuntu-22.04", "usd_version": "2408"}, - {"os": "ubuntu-22.04", "usd_version": "2411"} - ] + "include": [ + { "os": "windows-2022", "usd_version": "2308" }, + { "os": "windows-2022", "usd_version": "2311" }, + { "os": "windows-2022", "usd_version": "2405" }, + { "os": "windows-2022", "usd_version": "2408" }, + { "os": "windows-2022", "usd_version": "2411" }, + { "os": "windows-2022", "usd_version": "2508" }, + { "os": "windows-2022", "usd_version": "2511" }, + + { "os": "windows-2025", "usd_version": "2508" }, + { "os": "windows-2025", "usd_version": "2511" }, + + { "os": "macOS-14", "usd_version": "2408" }, + { "os": "macOS-14", "usd_version": "2411" }, + { "os": "macOS-14", "usd_version": "2508" }, + { "os": "macOS-14", "usd_version": "2511" }, + + { "os": "macOS-15", "usd_version": "2408" }, + { "os": "macOS-15", "usd_version": "2411" }, + { "os": "macOS-15", "usd_version": "2508" }, + { "os": "macOS-15", "usd_version": "2511" }, + + { "os": "macos-26", "usd_version": "2508" }, + { "os": "macos-26", "usd_version": "2511" }, + + { "os": "macos-26-intel", "usd_version": "2508" }, + { "os": "macos-26-intel", "usd_version": "2511" }, + + { "os": "ubuntu-22.04", "usd_version": "2308" }, + { "os": "ubuntu-22.04", "usd_version": "2311" }, + { "os": "ubuntu-22.04", "usd_version": "2405" }, + { "os": "ubuntu-22.04", "usd_version": "2408" }, + { "os": "ubuntu-22.04", "usd_version": "2411" }, + + { "os": "ubuntu-24.04", "usd_version": "2508" }, + { "os": "ubuntu-24.04", "usd_version": "2511" } + ] } diff --git a/test/pr_versions.json b/test/pr_versions.json index f4590275..85f51022 100644 --- a/test/pr_versions.json +++ b/test/pr_versions.json @@ -1,20 +1,27 @@ { "include": [ - { "os": "windows-2022", "usd_version": "2308" }, - { "os": "windows-2022", "usd_version": "2411" }, { "os": "windows-2022", "usd_version": "2508" }, { "os": "windows-2022", "usd_version": "2511" }, - { "os": "macOS-14", "usd_version": "2408" }, - { "os": "macOS-14", "usd_version": "2411" }, + + { "os": "windows-2025", "usd_version": "2508" }, + { "os": "windows-2025", "usd_version": "2511" }, + { "os": "macOS-14", "usd_version": "2508" }, { "os": "macOS-14", "usd_version": "2511" }, - { "os": "macOS-15", "usd_version": "2408" }, - { "os": "macOS-15", "usd_version": "2411" }, + { "os": "macOS-15", "usd_version": "2508" }, { "os": "macOS-15", "usd_version": "2511" }, - { "os": "ubuntu-22.04", "usd_version": "2308" }, - { "os": "ubuntu-22.04", "usd_version": "2411" }, + + { "os": "macos-26", "usd_version": "2508" }, + { "os": "macos-26", "usd_version": "2511" }, + + { "os": "macos-26-intel", "usd_version": "2508" }, + { "os": "macos-26-intel", "usd_version": "2511" }, + { "os": "ubuntu-22.04", "usd_version": "2508" }, - { "os": "ubuntu-22.04", "usd_version": "2511" } + { "os": "ubuntu-22.04", "usd_version": "2511" }, + + { "os": "ubuntu-24.04", "usd_version": "2508" }, + { "os": "ubuntu-24.04", "usd_version": "2511" } ] } From fe2abc70f6e043e94c411df4d228bbe193decd20 Mon Sep 17 00:00:00 2001 From: dstover11 Date: Tue, 10 Mar 2026 13:32:29 -0400 Subject: [PATCH 05/13] - Updating checks to be more broad for various operating systems --- .github/workflows/create-usd-release.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/create-usd-release.yml b/.github/workflows/create-usd-release.yml index cf848db1..96695259 100644 --- a/.github/workflows/create-usd-release.yml +++ b/.github/workflows/create-usd-release.yml @@ -102,13 +102,13 @@ jobs: brew cleanup - name: Install Additional Dependencies (Ubuntu) - if: env.exists == 'false' && matrix.os == 'ubuntu-22.04' + if: env.exists == 'false' && contains(matrix.os, 'ubuntu') run: | sudo apt-get update sudo apt-get install -y build-essential libgl1-mesa-dev libglew-dev libxi-dev libxrandr-dev - name: Install Additional Dependencies (Windows) - if: env.exists == 'false' && matrix.os == 'windows-2022' + if: env.exists == 'false' && contains(matrix.os, 'windows') run: | choco install cmake --installargs 'ADD_CMAKE_TO_PATH=System' From 20bee06ec005a07b9e43788ba69db4ff292b5173 Mon Sep 17 00:00:00 2001 From: dstover11 Date: Tue, 10 Mar 2026 13:56:05 -0400 Subject: [PATCH 06/13] Verifying ssl is setup within the python environment --- .github/workflows/create-usd-release.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/create-usd-release.yml b/.github/workflows/create-usd-release.yml index 96695259..2c086cf4 100644 --- a/.github/workflows/create-usd-release.yml +++ b/.github/workflows/create-usd-release.yml @@ -82,6 +82,12 @@ jobs: python-version: "3.10.11" id: setup-python + - name: Upgrade pip + setuptools + if: contains(matrix.os, 'macos-26-intel') + run: | + python -m pip install --upgrade pip setuptools + python -c "import ssl; print('SSL OK:', ssl.OPENSSL_VERSION)" + - name: Install Ninja (Unix) if: env.exists == 'false' && matrix.os != 'windows-2022' run: | From bf0130ba16fcd00f49090a128bb8a85aea100561 Mon Sep 17 00:00:00 2001 From: dstover11 Date: Tue, 10 Mar 2026 14:05:10 -0400 Subject: [PATCH 07/13] - Fixing up various OS checks to include newer versions and to be more generic - Adding MatX common dep packages for Linux --- .github/workflows/create-usd-release.yml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/create-usd-release.yml b/.github/workflows/create-usd-release.yml index 2c086cf4..ec419f5a 100644 --- a/.github/workflows/create-usd-release.yml +++ b/.github/workflows/create-usd-release.yml @@ -112,6 +112,7 @@ jobs: run: | sudo apt-get update sudo apt-get install -y build-essential libgl1-mesa-dev libglew-dev libxi-dev libxrandr-dev + sudo apt-get install -y libx11-dev libxinerama-dev libxcursor-dev libxi-dev - name: Install Additional Dependencies (Windows) if: env.exists == 'false' && contains(matrix.os, 'windows') @@ -189,14 +190,14 @@ jobs: Invoke-Expression $python_cmd - name: Remove Specific Folders Unix - if: env.exists == 'false' && matrix.os != 'windows-2022' + if: env.exists == 'false' && contains(matrix.os, 'windows') == 'false' run: | rm -rf ${{ github.workspace }}/usd_build/build rm -rf ${{ github.workspace }}/usd_build/share rm -rf ${{ github.workspace }}/usd_build/src - name: Remove Specific Folders Windows - if: env.exists == 'false' && matrix.os == 'windows-2022' + if: env.exists == 'false' && contains(matrix.os, 'windows') run: | powershell -Command "& { Remove-Item -Path ${{ github.workspace }}\usd_build\build -Recurse -Force @@ -228,13 +229,13 @@ jobs: } - name: Package Build Artifacts Unix - if: env.exists == 'false' && matrix.os != 'windows-2022' + if: env.exists == 'false' && contains(matrix.os, 'windows') == 'false' run: | cd ${{ github.workspace }}/usd_build zip -r ../usd-${{ github.event.inputs.usd_version }}-${{ matrix.os }}.zip * - name: Package Build Artifacts Windows - if: env.exists == 'false' && matrix.os == 'windows-2022' + if: env.exists == 'false' && contains(matrix.os, 'windows') run: | powershell -Command "& { Set-Location ${{ github.workspace }}\usd_build From 370da17d0ee53882186a53bfada16e202f544c29 Mon Sep 17 00:00:00 2001 From: dstover11 Date: Tue, 10 Mar 2026 14:20:57 -0400 Subject: [PATCH 08/13] - Updating Mac 26 intel to fix python environment issue --- .github/workflows/create-usd-release.yml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/.github/workflows/create-usd-release.yml b/.github/workflows/create-usd-release.yml index ec419f5a..76358c3f 100644 --- a/.github/workflows/create-usd-release.yml +++ b/.github/workflows/create-usd-release.yml @@ -76,10 +76,18 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Set up Python - if: env.exists == 'false' + if: env.exists == 'false' && matrix.os != 'macos-26-intel' + uses: actions/setup-python@v5 + with: + python-version: "3.10.11" + id: setup-python + + - name: Set up Python + if: env.exists == 'false' && matrix.os == 'macos-26-intel' uses: actions/setup-python@v5 with: python-version: "3.10.11" + architecture: "x64" id: setup-python - name: Upgrade pip + setuptools From c98c928ffd1adfb77187c2513746ae1a1b212278 Mon Sep 17 00:00:00 2001 From: dstover11 Date: Tue, 10 Mar 2026 14:37:53 -0400 Subject: [PATCH 09/13] Removing the extra python setup which is not needed and updating the package which sets up python --- .github/workflows/create-usd-release.yml | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/.github/workflows/create-usd-release.yml b/.github/workflows/create-usd-release.yml index 76358c3f..8fdffbe1 100644 --- a/.github/workflows/create-usd-release.yml +++ b/.github/workflows/create-usd-release.yml @@ -76,18 +76,10 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Set up Python - if: env.exists == 'false' && matrix.os != 'macos-26-intel' - uses: actions/setup-python@v5 - with: - python-version: "3.10.11" - id: setup-python - - - name: Set up Python - if: env.exists == 'false' && matrix.os == 'macos-26-intel' - uses: actions/setup-python@v5 + if: env.exists == 'false' + uses: actions/setup-python@v6 with: python-version: "3.10.11" - architecture: "x64" id: setup-python - name: Upgrade pip + setuptools From 7d9355d595f9d6810dc33203e9748f0a067de4de Mon Sep 17 00:00:00 2001 From: dstover11 Date: Tue, 10 Mar 2026 15:37:42 -0400 Subject: [PATCH 10/13] More build system updates --- .github/workflows/create-usd-release.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/create-usd-release.yml b/.github/workflows/create-usd-release.yml index 8fdffbe1..a6865b97 100644 --- a/.github/workflows/create-usd-release.yml +++ b/.github/workflows/create-usd-release.yml @@ -9,7 +9,7 @@ on: usd_version: description: "USD Version to build" required: true - default: "2411" + default: "2511" jobs: prepare-matrix: @@ -57,7 +57,7 @@ jobs: $releaseExists = $false "exists=false" | Out-File -FilePath $env:GITHUB_ENV -Append Write-Output "Release not found: $releaseName -- Creating new one" - gh release create "$releaseName" --title "$releaseName" --notes "USD built with the following parameters: --build-shared --openimageio --tools --python --debug-python --usd-imaging --build-variant release --use-cxx11-abi=0 (linux)" + gh release create "$releaseName" --title "$releaseName" --notes "USD built with the following parameters: --build-shared --openimageio --tools --usd-imaging --build-variant release --use-cxx11-abi=0 (linux)" } else { $releaseExists = $true } @@ -77,7 +77,7 @@ jobs: - name: Set up Python if: env.exists == 'false' - uses: actions/setup-python@v6 + uses: actions/setup-python@v5 with: python-version: "3.10.11" id: setup-python @@ -186,7 +186,7 @@ jobs: if ("${{runner.os}}" -eq "Linux") { $abi_arg = "--use-cxx11-abi 0" } - $python_cmd = "python $file `${{ github.workspace }}/usd_build` --build-shared --openimageio --tools --python --debug-python --usd-imaging --build-variant release $abi_arg $generator" + $python_cmd = "python $file `${{ github.workspace }}/usd_build` --build-shared --openimageio --no-materialx --no-examples --tools --python --usd-imaging --build-variant release $abi_arg $generator" Invoke-Expression $python_cmd - name: Remove Specific Folders Unix From ee7b85a33f110b594bbe1ca150b7d4d7633739e8 Mon Sep 17 00:00:00 2001 From: dstover11 Date: Tue, 10 Mar 2026 15:53:04 -0400 Subject: [PATCH 11/13] Updating build flags for usd --- .github/workflows/create-usd-release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/create-usd-release.yml b/.github/workflows/create-usd-release.yml index a6865b97..98604782 100644 --- a/.github/workflows/create-usd-release.yml +++ b/.github/workflows/create-usd-release.yml @@ -186,7 +186,7 @@ jobs: if ("${{runner.os}}" -eq "Linux") { $abi_arg = "--use-cxx11-abi 0" } - $python_cmd = "python $file `${{ github.workspace }}/usd_build` --build-shared --openimageio --no-materialx --no-examples --tools --python --usd-imaging --build-variant release $abi_arg $generator" + $python_cmd = "python $file `${{ github.workspace }}/usd_build` --onetbb --no-examples --draco --openimageio --no-materialx --tools --build-variant release $abi_arg $generator" Invoke-Expression $python_cmd - name: Remove Specific Folders Unix From 7611fb8da628d9965f37f89779945d0fbe195a53 Mon Sep 17 00:00:00 2001 From: dstover11 Date: Tue, 10 Mar 2026 16:27:10 -0400 Subject: [PATCH 12/13] Removing USD support for: ubuntu-24.04 as USD does not officially support this OS yet. macos-26-intel as there is no supported python setup for this OS currently. --- .github/workflows/create-usd-release.yml | 4 ++-- test/full_versions.json | 8 +------- test/pr_versions.json | 8 +------- 3 files changed, 4 insertions(+), 16 deletions(-) diff --git a/.github/workflows/create-usd-release.yml b/.github/workflows/create-usd-release.yml index 98604782..f415aad1 100644 --- a/.github/workflows/create-usd-release.yml +++ b/.github/workflows/create-usd-release.yml @@ -21,9 +21,9 @@ jobs: run: | OS_LIST="[\"windows-2022\", \"windows-2025\"" if [[ "${{ github.event.inputs.usd_version }}" -gt 2400 ]]; then - OS_LIST="$OS_LIST,\"macOS-14\", \"macOS-15\", \"macos-26\", \"macos-26-intel\"" + OS_LIST="$OS_LIST,\"macOS-14\", \"macOS-15\", \"macos-26\"" fi - OS_LIST="$OS_LIST,\"ubuntu-22.04\", \"ubuntu-24.04\"]" + OS_LIST="$OS_LIST,\"ubuntu-22.04\"]" echo "matrix=$OS_LIST" >> $GITHUB_OUTPUT build: diff --git a/test/full_versions.json b/test/full_versions.json index 1d9d8bde..7e50e9bd 100644 --- a/test/full_versions.json +++ b/test/full_versions.json @@ -24,16 +24,10 @@ { "os": "macos-26", "usd_version": "2508" }, { "os": "macos-26", "usd_version": "2511" }, - { "os": "macos-26-intel", "usd_version": "2508" }, - { "os": "macos-26-intel", "usd_version": "2511" }, - { "os": "ubuntu-22.04", "usd_version": "2308" }, { "os": "ubuntu-22.04", "usd_version": "2311" }, { "os": "ubuntu-22.04", "usd_version": "2405" }, { "os": "ubuntu-22.04", "usd_version": "2408" }, - { "os": "ubuntu-22.04", "usd_version": "2411" }, - - { "os": "ubuntu-24.04", "usd_version": "2508" }, - { "os": "ubuntu-24.04", "usd_version": "2511" } + { "os": "ubuntu-22.04", "usd_version": "2411" } ] } diff --git a/test/pr_versions.json b/test/pr_versions.json index 85f51022..beb413d5 100644 --- a/test/pr_versions.json +++ b/test/pr_versions.json @@ -15,13 +15,7 @@ { "os": "macos-26", "usd_version": "2508" }, { "os": "macos-26", "usd_version": "2511" }, - { "os": "macos-26-intel", "usd_version": "2508" }, - { "os": "macos-26-intel", "usd_version": "2511" }, - { "os": "ubuntu-22.04", "usd_version": "2508" }, - { "os": "ubuntu-22.04", "usd_version": "2511" }, - - { "os": "ubuntu-24.04", "usd_version": "2508" }, - { "os": "ubuntu-24.04", "usd_version": "2511" } + { "os": "ubuntu-22.04", "usd_version": "2511" } ] } From 7f5e8538d4f11feb05ec322856ac15aecddfe6ae Mon Sep 17 00:00:00 2001 From: dstover11 Date: Tue, 10 Mar 2026 17:03:25 -0400 Subject: [PATCH 13/13] Fixing a typo that is causing an error in the fbx sdk --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f4606dc9..a6bed32b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -180,6 +180,7 @@ jobs: FBX_OUTFILE_CORRECTED=$(echo "${{ env.FBX_OUTFILE }}" | sed 's/_mac.pkg/_macos.pkg/') sudo installer -pkg $FBX_OUTFILE_CORRECTED -target / -verboseR sudo mv "/Applications/Autodesk/FBX SDK/" "/Applications/Autodesk/FBXSDK" + sudo sed -i '.bak' 's/mLefttChild/mLeftChild/g' "/Applications/Autodesk/FBXSDK/2020.3.7/include/fbxsdk/core/base/fbxredblacktree.h" else # Linux FBX_INSTALL_DIR=${{ github.workspace }}/FBX_SDK_INSTALL chmod +r ${{ env.FBX_OUTFILE }}.tar.gz

7dl9$eeT%v9E~L84tR`K31*CiUIk}f+aHO8rN zS#Ik%4LAXp#TdJcpUo|oZB;Z@p?O%Cq50$Ao@Xosjdx=)GKx6O$Z58Yl$R|qo^78D zX*1`k z|9`LE@p)K{P9}TKtJoK;SBu&D)skFiF5rN-nyu+AyB1{&oX56@#SYrX-9wIu4dZm+ zKe3a%dTDis=2`45=?}~oF(bRnZmD{n4X=w@SbKR3E2=fsY_7>ji}_^Wyed=g>X_#7 zlizs#ldqrEKYDuh)V7iZ58G7_Jgt0x`SJ`oU;pfnyM=!oF#d6e4IWn|^#HFjz4-m}-h(8&1Up~L3Kj-RkNX?g10`3v?J9UPt9uU)_4 z;pycaa5wN?P;f|S%!Amt_=LoV=}(?M%gB8GBI|Wt{+oirx9{GUmX%jjR#ktgX>Mt4 zYbSo~_|{AA``JG*_-lwdG5Pz?)bz~k9AkN9b&a_WZm?hg{J%Q-pAGuIwFhcAjE|om z&M)}4Juto?=s#S7Uts6{E!)lP1h4o@svfv6By}_`_j8l5n*Le(j;nWiM5NUXs2YsF zP5MWR{+~4{`d@0%e>Ld8+QS&uJvduPoK#? zUvXi%b57!Pmj75!TaZTUSqy--yU7E_(+Q$C4MK{F*Ysq)GfNZleQzw;M=NAIZs&LG zZ717&`uxets{nD}IM(OwNUQ8|W(VKmWkhnrAs*0VXh;#5JvWaOtr)dxCAlk>x_HX7 z9Czj3OPoT{j@Xq(w-3-@7j{Z#+WWVueST3gj&TQ&nZ_AGp@F0QxVKItgOtG$l1JF} z5dO-6dqMYl%Z-hy?8$qr{Q~?Bn4D|ctN!^^lH$YSd_bfRu!Ug+0I7fbUq}yb3lAv$ z!vknX7`FyaHB{ob+Ylm#1tpU{&-3?HjOc0cfE(bw(e90Tqbh^#Z~EvDjIyrD^y>Vm zn4g`vj95TZOPWkIo1M1c3ca!}6ve)I^QOKC`h2{{?C-DaQ8!}tcOOk_5vbd*N)+4w znkeNhvEu>;FP_(`tQ6fYX#Y5(`3wLbiFCXF0|@tJ?6`TkCRjwpkw3dyu0xIApZs!j zg%*Wq!GgQd3#^iYA@&V=agzE#<+-FI?Y&+Z)Er-xW7B5_Dh^JH^zwjf2~VuQ^oeu? z?07H~Zmd3AbJylFY-7j&h_Mm?4oUpJn{42vp7u;a!s1uwytjT(eq#DujZ5_kPxoKJgpl(*3d+>=gKF03*AAx}B|&ay31MqOyiM zXuHzt(mvnfT+5P-LxC>F3zg|cBUi)`RFFwB zfNlKQwD#$p9a8#P^jb8@#x85C@u|`k`(1>ehFS>=2DSWY^miKETz@|=$uH*}ciG>& zAP^!F&8V# z8Om?fYjaqWq_T!Mi^_+ho__!~{(l7eLyRCn)%XR-M2l)p3JkPyjxKY*5vhdjO*C>xz+vZ=qPCw! z<@7Q00`RQx$?C_y=8S8|qdqknt)DJ6&yUkw?9{$Il$!unO?{d^ch=s-tQ{np9tVQ` z9yZ7ij}iBF+{{l6#jDUme}@K8a83Z52XJx;*Kk|ecJz!lRHb{pvj)T2UcAwV#UM%F^c1$To^(q#!BcgOlTE zaBU-VJ|J*c?G`n>JOt?obB@~OztPzkQaR2Gp3fA%To?TG+*C|^svO= z$+GStO6Q{@$GKft`Y}pk&Joa>p+D(H6P~P>8OPp7DS*Rm6fs&6?JkpHlUV1%5N!_1 zj1*?%B<^ULuR+}}^dcZonuDXkTAR++ZrhxLtJ)6hJzQAz$tH;%#|Ia%;f&!4LW^|( z6`8z7;hX0H^))$VA;azY4 zJ+VG~(~t*5OR?3tO`I3y$nB(SDs_zFstLXAT^6Z74*YoEnK!#qHjE#+(R0`LQ1cJ< zmG;MqU=oqPqI=P;t?V_2VxqHJa$EWkihO{XjnShgw6bnBEn!UF!2wrcl z$w+>8x4*K6kfzQOFZflxuQL1NvAC}B5p!Ri@Apd7ogUoYw4&$!WPRl1%)4bnR`~3 z5YE8??Kua^YRdZzUY)aIWX72&VSP15pE|wz0&p^+vHKNFa$_vMnxG)Kovx-JjQUEC zsr;xFy)8V5ickaz&8#ye43|9mZpJ`cgj$pG){5ueIlCD$56YJm!uK#z5_PYTSKk`C z1WaT+W4cKu-SQdLvjezlDC2Nf2BMv?!>d7$;ga*htE7oqtD_3e^tRs3e(=clXP_y{ zO5x;V;%O^iy$hw}TLzntXeVa%Zr&>V@+I0Qp8OGGa_8R^7@&LBxx%CLbaWg6;O+=M zByE9Gq`So#IPQ9mM1|a~SMKWdDi~EfnBnCfa*a>+g3DKjtH237^1Z)T^O55lp_;2w zu;mh>RV%sN#hzMLspa^RTKUpAGVSja50sn%uAz?7&Ghz`T@I$ZK2mFZSFFv_8xg_AR-~Ir>d>SfMlI{Kro&P9sEh znQbS9w;$K`QxKPxXagcm*n!Z@a|O-qGVOkH6~^2^SpZJJZ|XE+w@xo*rp zy-Fz$$#E*mczt(RHZS((YV0x35%{v!M9IP?!+Csk-WjB{$QTWUJU927IKt-_ZhZH9 z&ujPd=aaODEK=2Pd#BB=pE2JTg&)Nr$I$F;D`%h>WBe7GezZg`a)7Hr@2ba6@_-?9 zyQ>LfDaHipQ}B^%#2^kD2BWsJchWCDFu2%rm*#%99?YH~A)K7qCS*LJ{{$gyqV`dd z>bNr)r*#s85`bE=f^8Pq)QW860iSumg85`E0v2x0DM1|!&Thk2$`H}AqgZ$IkHHES zz80-R14$K#cvtO#qM|^oxEBwQ=4!ivPz;O~G1wf|@m@y4*!q3pqPp231`RUzqtHoO zonQQxbe9U9uVpPyg?&ly>LQ&fv%IC@mG5kgwu$ay3z;Z##S`^g(N5x}~B~ z|E`Itsqvl8KEZFQ!!0EDK?=ed^smX5d3S2Wb_wO~$~0g<`43!{CC&q4fe0Uezdu7S zQ>a|r^elM}Mn}+4w>0UTsTUq~V?L6@UeX`rL(&bq@@{8*()M4n*+1mCZLgp8@7NLj zR2YphugWCRs4#3O~oL?7wKt^ z{IytCyPh#SRo{AS_c?9j-35D)-{Qim$ux0T``p-$=sylte3bz!z5r{DC^(N%)}L^T zt*m;anJJPUu>4GJi9(oulH44HIuG8bOOwu3)|S`x7A?|>)zbIS7Ih}G$Sk^YAP{5fKW;_!3!x5M*0nIQi;R}T`ZFO1NnLVQMsE$upYG}cGYI4Pra=lnqAg%sSd8l%2LAZL~nwFaaC}VT2+tArh0Ss!9=MW#ZwI^*$g>T@YWl_hz z3@&Y+;12SDax_hoq0kb!t0&x;;nq$(2Hr{Twaf#pm|=9}paCKVjnFMFM{FAf@0i+b zidxXQZzhxU?7A0*?ZDVvbh1HMq6b6w<1!Fw+5PXy-U!YFvA2I{_GqJ2`895O8MOY? zHh5GbJwFtEvim`)G)jme<#ZAkF;^{@AJeKpT#=}Z~>gor%Xr3wdn7`El7*{BHWyaR9Sd6seV0#R+s zZN3k=(jR3K--;Exsn?HDv28^@dm0%JFLd?i0!S^k87F6zX5YWuKYzNaw(`rvlZ92) zRmou?dAH3iv=4kBYTr8ecm7B3Ps1Qn-O3ScNqAGFYWm7Wx|A<{<oPJpx1IeFwjsxGW1a#bN54!BbQ7AB=RT4=)dN0i z?#~Qu$Njdbe_Yk=+~~Jjl(su0hug1pEJ&gyHd}J5Q=%#+h1+noVy zu3pQJea8!jss5FQN{6W!;tG=c9+(feMrOM2H@RxGMzXpzomEfkjR7LBgd zqL+vkWDfc(YaK6sXUV)P@(c<$&8F`Q#)~_xm}#OlXQ5)&YD2pPB|mtn_8!U3e)`Lc z-%8C|-r6K@3Tsebx9>`iu4i5I z*nk%Lw2f@Ia7C@9&0t#J;&0V7(wW=-;9m?jRY-ILH9eXM30iMQFM(&3WSna~o`WeZ zscrdlJivRf=h371I5n@g)%>?y&h#@B_g=e|Y-Ef0YV(Ldx28Ns@gHyjcTEiwnIg+F zWu7#)Y0)roDsn+PXkghZvs3EW23a@P!yp+~P3}mAP%2+=OiL&ac(7)bB-uJ-^ael2 zd~82y^Yi9(X$?j$^`z>nZ5?8<3g2=}>EH9h&mP{^3YY%(0`iDCE$-G*y6-445$lQA z@k5~2YrO{7V!Gv9M0)nyC4(b=^4{|K&OsTeur(fFIs>P=#Tm)SXVPRQMja*O2h70RcN5nEyJGc*%cv*&|*e>yKL=YIxo(DHN6>pL6lC&KrRUJ?XYGsDbA4w}^-wYS43hceBc zREfL`d!{5lJa@^M-=Yfi}yu2L9mJKc=E7t<#P2v<#f)Bd$l>20?-$Oe%`~XQ*!E~+P`M5C!9yI%t%Hkb zNDe8%D7x@~I2dVh<>kxC`ye*Q6W+CkiSfa$&ogsz}?N& zR3hJYGis{%mqjzdRaPhveuWXnJW3}fm3J0tw&uu?4SyWI^tqDo`C;HixjhCNeI0(c zeGu?*=7L$y**z z&Q-?yMsGjqu;#F!tKhRQ=JF^;S>xYG55eBR(tTYME{+=~FD?42S3a=?858dA0j7jh z!y{H$ApFonqq0{&omdKCoz|{uf8=&XhxzoK)kvnSi^59*JV1Mp3y~j17^Fz#_aJ$h1k^q*`Eb{h_r>qRaw%+mFla(ZXYEK>t+l9Q z_bN^@n6$ae1!Z(#HgqIQv(;Mkd|%Glg3Z$eI#Y%tX#iust71+vxL>4TlFq-C1!uX~ zQ$V3ki7T44VG6EpiPHa5K2LP>TVaj+H{!)Mbo7TIA~a3R@7g6_C@eVeo)CZVa2%y(K)uCDM%tTwFy?_ebd$e6pW=u|#H%WB(GWjhu4y zcm|H2;O$dyGm-h=Isp{jyx`QB>5Aawq2x#B#*`Q?#b3NUt`|Ct1eYQZb6I+94O{HB zS$c3dWzO0?)Zu zz&{m(<@Hu!)f2BwX4Kp(qjX%s+lo{BH}0A80MaBz(HB~!W~0yB1ClNNl5% zpPa+Crl-m0lf}*Wl>;!y42l9_{5evDeR;sxURfE}ET3m>*y8QF%{fBX^7@O`QqKDh z+O4}E(zIiAmmN6yx3GIBr0-pYZMZRPxWYI_cGHQu`DU3RzoeU2tlq`G>}iNCl29bf zFh5zCWFEdgvIOh=p_^OKe*MIS#2^(Fq;N2iN=oJ;T}@Mx!ZnM*Ti2?6E<8C$o{sC9 z2z-31?)L!YAch&c-stx_ z6g9p@Lle0q3t&T{QuHA=pN0eUAlfkF$i?KIa#8}8Zbuo~HQi*~e=%dda)@}pP7)6- zeK-8v=Q{a!RS$uv{a6!^}^Dg9sKS66e5x<6vFPz%V zCsX-#mIMVn{pig8s6CcGG%mJ-_GAeorCveugFNdp_eRv74ln35uIdU#D!-fwc}g`h zy#p_D)+sC!SF+ZDj{RQ-fQ9RYig16)Cd5Om4rHZ@qxP7_SM^Pu^p zerdSPpFcaO#l%wkv_woX_}l(O%lp#biu?HQ!0-q@I&Ptf?$fBOQ^Oc|U?Ss}3l?+d zSUli-|H9hV3x+!PHqZ4Mj3R978Q0f`t*4VpZmrT3EFX`8{n%|IPMw90qYjo{{vzK1 z(=*dYlUA0af@$0^TS5I0D&CAUXc`vu1GtmfAR~yboy?(>tTOT9sLkf6>2++O3HJ+A z7B8;L1Df{+Mb59taU!s&K3J1?gFscam_~)gS115;W5$X5LkxuZ1TrSn9$yOge*YaY zmUL2mI=7K~3_`0@e#+cVdEHvy0KdRIhdJpL?L>9Sp*DZ1MAfHv)8+E6U%z|rgjnsV zvOQnbZ3Q8LtQ`qz1T~YkDP+GwwhZKm5ma|L<3!MdIz1{kG`2j^zIb?_zS_;K^WayBfwnHqk2%zB79ov#Y4^(vaGVJg=+E9_jn}H+$5HPqd$V z7MRD!9k&%f^ZyZgWf?O)K!JDRp^PRn|Lk=tR{W8vO;1yf& z2ffe&yswvRNE1Cp4~i-GleV6~$uzwU&UDPCHk4g~Br%wAY{jn6*=?#JyXXzsf56b? zBdLhC(Ek?Wgzg#O3Ki1lbP!BwP$IX!;f0jbdh-vxOX&yif|}&tZpdNliFeoPKIQE9 z3o|6K)wddzD9-e_jdcX~mOnaD3q%sb?{adAxJSH@a6?bSFp?lRFz!YZpg)=!Os9 zZJzATfLr=6Mt91pY`-387ac4(C94?~V&accR@zkNcI0f~B%y?Vu_eKfcOcG@P9r=H z$4>gc1-qDAFSZ@-fKU%B>8^uHonLzn!*(hp$gy4UA*f2 zs}c3e2kRFw%Q+5U`nfU7koa^B;#GuWhEuNK`rKKz{0QHd3~m@igU@f;3haSaIX8e6 z={}3up*#SAh^nd;yhsXUhQh)om+>Ng9yHJ$*U7?lMQNF4R;{5qek(tK3t@Uptlk`! zRR7PzMr_K)RMZ|TcNz~ESVxV;u%pB_ZbsB^C`EAM|8N1h0lU^ zRf}6m>5V!tO_nHosyJQcH;s|aJgn%4dnyh|Z+LO|bdsGwn#=+=VkQs^PpB!9P9siZGd1@LefEekt1551 zU}y?{Nm*kP#wT`9u-=L@|*Gh)2x7;#^mAL5YJj%Nic zKmYXV+WTyO*nYCE_Iw!+um})29AfkXfa2s<$i}P_^~5fXc2FbC%@`=0ROxfoI-egh z_MVaFM4l&AOubwQP`^{_HoS9p`up9_CaQo9cpJ9NgP0<)#cvy1o8epM_5Fz#D|n!2 zLhk9Uj7iLsbJ6Nsc8x5bd|UfkyU_;m95#{OroFv`pV1-K{gq)Y_O_=}>hotywRB@x z@3Gq#dZMmhz7VDI5J>)iV^!cRImjiRgH!`8f;)0(nCSyD81u{z;1VOg#c91ot3+&m zNUsGEHAHG8Y@KuRXx{lDMLc+Ef|L^Ov1#VrpbYw6r{cutv$~?PT1!Dvi_iF0qh3f` z%`1wlEgYFuk>>7(q7%9wvWWnxfYg*$^kX#LK~Id0p`Upd^m@Jl*%!GZ@>{yamb_c9 zPpVh_TzwUEp?A$i@?2H=uw75MC4OX%C0(C8HaI^d!2FO;aTpzm3eg}&qsK>!8eCs7 zVz?qrZ^ypL>F8uOQp&Db8IplY`VmgFrLB#=cG!4jZQ2&c%W0ME<4AG=1Ov7Na$B?N zC4Iuj!fpfIYX&{7;1P&n`F>+k zS*_RH9&}|_*6(&5LZyi#UH{@X+Ww8P;BrtDpN-omTvwt~6#j~lx$@x5E?{L3)PgP^ zFc@Ujzq8>d)(1Cqkt=cT!0}y~s%-V1ibRvns~>kVjzdOL$-qWxUW0`R*U}vF#rx|2 zs0dZjBF?`;@pv2UL zjE8yZD37j29G)3wAF9qeMD441{^0Yd(~Nx-@)<=2JKl!__aItE723J#baWE>hFemW zN35i4E%~kuoNdNPel|&x81mv<4)aBsinhCnmm{`%jcGNMMGt@PzQL&f@vJyEV#i}A z+JfgmK78XT9?_%sOOu*%zwX?oPUNVYR0R)!azw$MlWzA9Yc|=)vJYVeTPAf*bP`$p zB_G&k-70jwM1v&}8$a<^z9qpKlg;uso=m>F>fjqLS>*O>%;d)v?0ZMoDC`MrX(n4T z#vFtOjsFuAcllYpx)g5NhxI0ayKt=tMQ^S;V^<8-fo(R9ek2KoO{^z0s0L%3Yn~d} zXZ?wfHL=_=9kZn8`|)EDzOFx9p6oI&U+_vdt#Ec6+4l3lh0;aNi9(foLGRC{@_=80 z%$vQ2kIDI51i}^Z@BJ}AFw5d!|{%;!*!`02HP!nv~EAKY_6SlBrfi@^H*#<%aqgl(AuN@FU_jYg6N8>ga< zRK`HS{UcgjAGGDy5v<|?m$-_Pbi9xg!fzhDX8?nn(ID`ujBSrn@kEnKrqeJxhK5aR zBe2Achd^=v7YG-N;rgSrDhjJMSpV0NI94CCBa1XlhrAqO9(sl}yn^h8$k&fdh(JQ8 zj$@sGLXFHSFmz=u;w|6f43}UwhZ79%lf5RzIkS&8Qw%xCQNTIC!!98k%VGuA?yoLyz}csC*XHUxS}{Vh!uG( zRFNBT9Pl6DiU^`>W+3&W1d3J-^09pT(%WVgWO_S&i%K7KVD)gBUj;sYW`*HFZO;6QjdL{1Eqd}UBXuf!j-6_cZ{ZQ z<-Kuq-4@iMB6Le7=&Y-d@Q~SeyXl=$0D?qGMAA>{#fIX)JUP}IxFmAv>xGO6`1$HR za!C>w&UV_noNaRVmt8q_@9mK9qzdF6)KMxkJisfvDd#})+J$RI5I=5^ z=-Y9*S2n}f%_`l$yf9Ot)bqj8#TT|8AMsyCDh3ZQ6*&2I+mm!i_nlp}B@ zAJpMD739~wYhTCf?2Q_cnJB2tm@ANBEvvD3Y+^^n3P%#xa}4S6aVAz1G_7X0?XSVi zO*D8O3g}wo@4X9eP-I9oDDlo;&b%rnJIPqH^qI7B6rcziK|E%@ZKW!F|KrNRk~&=uEN>c`eL2vp~vX~6CUkIsbE2~FQ4f@+MoEoaW0J2Sz>G5 zEP6A0){Fk}Q!1iwDax(FhOPK#ykm^Q%z`F@TeuXMLiIEnaRYk?Caao}(d)``Jv6do z?SSFZ_AwAUQPNf&sB`30W%ij`qcIuKU$>HFe?RC-p_lSb#+C|SZHzKxVkF$SO}On1 zVr-X+pLHtrAkye-)I7~@{-1ZjuM3~HCW^pk?%N6pG=)jsIMO!Bev zx>^P*oBBx9=SQf3^X%REtycDxkXUmIb?^U7ahFQZ8Ty_7Aic7 zhMW^$sl{LD4i{!TaV>u(qp_oa&};DQ%h3JeofXM)vhNGJ5i@A!jhfOv?D$WFyvv}= z&{z{<;mD?qgQaOc<5Fv8O;CJ;zSmGvc86$<4zvMcaCC5NxGbbHvvNSX?6r;9=eL3z zZMIt)?&IfCd-}^s;$YaBnxAX+HYkDt8b^ZMy0+#T%P{5Lrg;Jhe2AK zLJgE184jhi!~_$@@mOWH3{@{7>yn#Lody*tF2wAk-c$}#x}%$aDM;f`Om;O6%NyXxm&PrD4s390`>K3O}C6qCEcU7UjN*MROGf_ z;pZ6VYqF*7FL+e+-Dv3M0ry%DKj_^iZHo+*wgNKbJa(*O0{%p-_;@GY67uBTXG}2YfLU~2ep`)bY$W+ zH`5}TA;kDVb2Ii=<@5r>GVuC@o}@+QX6g4&yWJW-ebU$l|Dy-SIdes@kI%c&Uxr_-xBo1zgGsi0aC5Q>jPM?ccAORUdqW`xeHeCuNY+Rg zd-Y%2!h$W5S@6$wo@oH+Q!jkBJsgJiZ{eKV~=<1ejf?{WdLKD ziiO=A;B>{46*<^0Pk2+E9p5FetcAI(epbudOHKWoveEK(%Z;-i-#l%V6IMKUR;V4r zj~1#Za&AM5L@EU1Trz|!QY1i`<}7BeY3TuT)ArA=9lf{ewr{4Ntb$D)M>%!%3PIx` z9c2p3Ta#Ny4zSZO+YGP?94v{v451GcB^RRoAXkjptGLvy%EYrUG7TykDDcNQ0e?zN zL<-fuvIpjA!;1HyO0{{rZPhL|7rqO+9U?70MRvny!BsrsK!2pbjLf$QYu$ZkLL}ZH z)0791#-Od>Lol9cO)vN`C0t%>Y1j14+WT?gtCqcXPsbmxyxfMcg97!cHVWN(DJEy< zktMD?cz}64>U~~0^8Htn&wk>> z*w;meOsLbIw!NLbce}Oe_Vvdj4gKF*SE7`nOwjh6RJ51Nwlpj~rS*%_@yA(bK8E5a zH?_{zlPH%a55hVo4jDz=F{YFeiN2`)I;3X3gyU8T3?HhmD;Lw|c;EA*Z}Ii>&5GZ? zs%@>Xin}WYBX!baCccZi;WH0U;o?*6Gl-x{6^eN}m!{6P6BEG=Lhsr2h( zQqXvb^w3A^O8YPLsn2}v!_mH}oi}n7LWJX*Mvkr>#EXfJ>YpWt6KF~(R!bMXT2Fv6}s3?O%*Zt=cczv61M3e;fjvn#E<&IR`kOxot$@t-em0@ zDf$|lap`zOA%=0v&}!76Riw>dTT<5U_scOyfjb$M?bita=R1;q#_w0(9ReIBolSVr z<20^p>>#K{C(`K`<3IC&d?{cF3<_Fc9S)ZSZ=e^gpvZv-sC2^#)G=fkwD&;5Esg-5 z2*&b&R8JThItid>9{tvGJBc$u$bB92ppv)}EX3c3`5??z*8t-IJ@O#5 zo*qQT@PM!90SXwD(rCj{!-^B=solioGCX9C<3qv)dBE!p+jEzJ)=_LBw%1 zM`9@+3tD>O*m1jI@myglU6Y%z-a=_?-sa6Un0W4f)qvzR8LXt z1e9HFK!EJ5R#hC=7>e{_p(_lKz);vo+1@SSK_?LrEFB1P3UYq(fCS3-;HNxbFHp>t z1*rpE87vWMSRho&in0c}H)<~-mV59r4`^EgC!rpN&aX0zR}5em*g6a%_fb4i5&O#x zOd)YERU=;k9%I4AlNbKfx4ogXT;<7^1rN^uZp^OnuRS>JcP>>73J;^b z!v%>*VH0Un^u%#59EUIJh>b9}Ek_ZI$OCIza$uht=oax@6)%~?f++@iLf%8fxN@xg z%*9G$mdjM)#Hjv>hSE}oa#~PZ7 zKH@J*yq#XM3bm-H)b?f8hnopJ83p7IoYuDw)&aR5mjOpWjOXY<**5>9uTdh^=65vP1ZJJB? z*aq}hg=|##X9oCmjtNwI6am7-*2Cw0D^` zxoN6Werpy#)cfcu-aBA1vtP{3=!2mmnXhruzHkv1^~1!YB#X)8*EQLX&cBOprJ^9$7oQ5g*!L28{)jFw*#bn=bv{^ugKxW z&$S+oc<5O4wH#u;t1aT(_87OQ<$o$`9sGW?yHopgXWag;v#*L9qp*oT{sp21R`_~` zm6;Hjq>1S%N?I%__P!^NdUm7KT-0UG=~bV-y-}x5YwB>TM@`P|2TwYscDvmzRo!wK z#{EJl9nIE!P;P%EGg$S;LAW|z^Zw&Ip|JadckzhYQ@*7v%~h@|#8)t?h$TB*gZK7M zwi$^X?~g{FO*B8&a5+jkV=LL*Up{eyBJ5H1TqU(CqxEuBs9Up=-lis1ubH#koOz`n z{4o6tj(JY=71RGZwdla`*OkZV8)FwU|7^rLn*6AJobsv_PVnUBZD4V^5H3R7fhjBO zHsHk7HI99h{8eSjTkd&)jHvnzF*FcHLMM>sF=G2t{Q4rJqtx~>y1DVI_${&)g)|YszAfc~Z0-va?oo)tdA>Tij7&6HW$)%I`xS?avy}7OahjfjjV0~VS|x$BPP-2FU@nUccp7=e++SB z4KH%Q>kwBt@}&e9B8lGYN=4B9S0Q8752at+J$7?S1&io&XLB9!VjXoyM6sRw^eISg zU08%*J#g((u)PfFD|*K)@zd%O*8mppKRz=IVXGEY!x#@JECMdO1Z$kZ2C%R>V>xkA zhvrk@dq|5B*!W>oPCZuaE?&$zg%3JoG2TG=jb(lP`yF^kT0}EOn5@vqFHES&0Q$xm zi?o;1?;(oqGYLxWuon_M5=ieFIvw{pwyf*)ZtU574q6YwWPXtduXBql1|I^_cz_9~ zzM9EqU=#zV8}-CTP|lVqgk$F@WDgsg_Ne_DoR@V6HjuyUcmO3Iy}5gd#XSUk%Vu7u z*S!$5N+Ga6nX@L@Ipwe?=!G(>r9KbXUTwLQ4P{elvQzL|bchSjsB+MFCAu`2($29_ zg~PKL#XppVE91@?UK-s79ZH|S{3cWH9h8-Gmr#er$}Q~g7J-x;9&i~KJJ5Xm3*95G zSlWJ6m6SVps?=ynKOj-Z;SeQW{r4iQVI3omJP%n^ANJOtMiI4CY*a~jD%WPHPAzvt zw(duRN9ME_?NjwJN|nO5;(+qY@RVBUZl`eAixS*P;nqHl#ly?M)z z-1#BSA})Xa@Z)b)k0#XV0|`rk3fHZYgno%?y=z1}UZ$Vl-lq6j=uh&=-ebWGRg+t} zX*~mbzs;Fz?b+KHEi7vQL$g&rLm4O%8wfgH5Zf#&!)BO)*eJXpg0F38Ke*@bK_Pn? z`H%-B0Y|vo9C*NVDm#-Qn(?A4s3IjBzN0M=%!3a~IthFn_a7|-b&Puz?$$5vQ>2V0*m3|mj<63#NCjZ^? z5&5Xxm6G{)XhnJ-Bq>|Uoi(rzN=rC?%h-eOQyBC;^^LMmoufs1XK4aHO1`m)2Cc@o=m{u-_ z5n920701g)34Txh%nl{zPWcXv-H2@ZbMt%fO5G1)=ioSUBH&+1^9x&A$SY|27}^D0Dyc2S3Urz>CK(xpS1& zHeTQ30jQB~!Cz#HN2q{xG-@9faSC8hay~DSZNR|EBOPwn?hR?MmyLvn5+#pR{uD@- z+TR>)1MuD64PQtR|3$n`9o^Ek`>~yqXN}88yG4)X$>?^Wyp-=Z?%heaAEaMvbl`hy zI>zuc_NeI$EazesgiZ(W{QJX@ErM)MSc4r6*U1BZV#M|%{5qxnPlqOd6$Q=24O{*j z66BOl^@JvEfvbR%r&)LfBoES3gl1*AU9Y0YZGh6-4(SL($;55<43SL(7ath z|6(B^aUF6+DTQmYzaiCp8Jg>}qg%#aKv?DtVDD=@h1Q#$+0B^@L^Xr z`Og|{6>^vbVz{RPG;Ro#L`1O~XV;}belb7Gfx9GFA_cQvEza{(D@0C16@advA|0EY zCI2Jsuz+;}8$XBPx(`tPzWMc@d0BK6niC%3$(KDNk@Fc&ycCJGX|)wNWO4}ddpifn z-R{MRWr&He5p8VYI3Vc~Ddbh9w|oy8B<`0jBQ~e$tN@H$FL*!=%9kco+DJ;Xj7dFii3 zIYwmRTKwGpj)RIHESCplAi*Uh{_pfI9^*5I-eJL6NdxcVg^-QHIaeUI!mmI8xQLCP zALu~35Hhc%^hcqgNXtX-*OOMXJQN9*fP1E%O)SZWpL;~5O((Ez=$egHOca`Noy691 z@gq9v;wBL?K4X%f`zu0Llk^;Vb)gJMELEVl$WX|{lzFeW3-=m~v{EoV35VpJ@mN=F zPO;$^^i9fr9#CQYFg%a}KpVcdvv-UWM1qOLvmn8xwz_`}0Xk^5XPtO5X(QL<`w@)6 zM7NxPi1~5_XVAUxE(rnFTGR#mmL~<6msbJY`-1T>E}}O|(Zo20TY?(I3k$}_vsZ{z zj5y>MZYw9C_X2L<2_7(uo5cvS)v&9iRXm(4L11~XY$4MmMB(Uj{^3LXxG%U*0c^7| z4>-*OPC=eTfd>>|-vB%5-Al5pNme(%H5Gq&7Zx$!8wFhw8uvz;D#rh9VJqvq3=3G}IQ8RdrzE<8LrJwKI^E*S%!9raHNkG$24vIq3jtMk3 zh|q=xCr&-en0-nq81foDRaJiz?ofmbPq^rX3d^%i*C-WGEH8Fi#8O?Sfzld!p7Dno z{42FXURYI~XmCCEg?gN&+GTO3!bz0_&(B?X99sf=Bw9IOb>5>3 z#1G*SMYqVlX_FvY{H6OE3sN^X{5J2*rvDA;q3qikjbvfASuSP9)=I0~pQu|T>Y$!} zGVM%9JHAJo*;~|39LSVqB+b1l<@ElNQotS!o*N5%YUcd zcl5LxvIscw*XaIbW@FI5C0OI#{3j58Q)pHnbYge|NjHFu@i3gh#dq`HpqLUeS5>2A zed7xu`%AOs-_;iyX@b3k-3vVUmE6K;$Fe9;o>N8Yp+=-DgsWEYLh>yswfET^0?7&Z z$cn_q!$)idap9*K1NTvgV98b1%XwjJ*5kj~7VwX;+_OQCc~ z1(@7pbQoNZgu#>Ek*M_2|BQX1pmwvPXWcO8y2IpBXc_+XK+jVnbMWVD|WX|jrEHL)#mJ0xxb{F z1ZIzON869f3TAVEP_|%wkb+#YTcu12>Jav=t|=k>g<8%zgw#LF@GJ5oI+-;1>UfxVzsz`qH6AkKa43T%}% zNrX!EM}XeD{Y0LTI_1XJQ{=HWn<=mZh|;CpJXs1sEtY!VClU`dVpj}aM1}y?3*TTR zovVcMhB(Uj2iia=PVXWl@35>I`GjopOKZcX+7Z>_Yy<$A3%r+GYLMSD=bO17W#8gV zblOoU&8II>(ytW1a{;3t(ep5yE*km|E5_=x7D;e41|QU&y+wAkNIY6`=4k*2=+=nh;y* zIxn#5z13k)3JfbsGE?S!;=9Vme;v`7FBGZ51_`zaTGLvxy z0>%pT-5vIdG}>b!b|K+bA=^o z_d2Lo{EfxQn*@TYkoBovH7%>Yx(P4gQD|gASzD5Dk|6E^L83l?lmf>`Z-Kj`yqz*V z(2HN}{u8n1PFG|X*wsbx~?mv=9LsY_OVVNs<8T9CPt{(z^)q8d2%`Bi5Ar zdI#|?;3JT;)>9rKrsb4osB6uO44ST3^lQmjm23&Y;y*!w+x#mATs9KfwEBRlRsSZ= zgE&;nA%1{x4WYTWg77`q4YC|{>q+0(*hf3!RLfoH8W6^2hcynN9UwPditGH{+*yW z5g_9=rh!%jfVK|4@s`p#qLuG$=lN$uJ()3s+#W|LJ%nR#o=r^ajUF7k`9V7n(y+PjPW z=0@rp+X?MkU5yw2slV6}8Pz4f6?Uzil(aFW*X-t_yiG661|C{vVV+*P`O|DXB%cKF z2ftpp<(K$aYTop8UveT1y+-uR+p9E(DJ^LyUBUV_;J_ER5p)?G!e zbZ>mgxX8Ex5dd^+ssMoQy$Hx9prIgilp;TgcvfQFw-hZ*M70}eu1%-)BzdeQ`Mb5M znT>QV8#veKFT{Li^J5@Hv*Nt%|+*=u7Ke_-Iy}s@2wm^v;QD^6@g(#oQ zw{ae2J8~)W4S9<7G^<;r&4m(w&P3Opvp%;#I_5xM>1KYezvS;5AXZiroJR^H`#Yg7 z%?8$Pb!*-DIamn?NBDOJM4d8-GEY21^{12|d%aD+qekN}vS>f};pRw=GOhN>vl{pt zprV}^=htcMrWJ1aJ9Gor)umtUCZv4(x1#N8HZjLugcvt z&D{J#A7RKwrlY|XCbOBzcru@*KLmYAP53PinZHeoa$Zgz*C4cUwUQI2q+fck@nTCn zWx8Q&?q2`Ri8ICSLcP|_s~;;JC>CrqE0tceox1ycfyrE=>_FGQ7{^8aGALf?{bvhS zxC!QN-kNnxHK4Srqou0NJ^J*G5sL{I)%(n#vX7_miT4{h-5W_tHI(lo3K;FRrflzd z@}hVSW%L-n@e#ss#=q|0_GhzLe`hQy_v%=C?c0cRvBsxg*i08+YWorQV{P8?E0%Xp zj-A{xzJWPwejH|~kI2bG5MHVHYedhLt57yL#PTs{6&^v(F~VecCUS?I(+kx8vT+xA zd<;~Rzo7p=P_8mPm|Vsda#a3K0nWLUD=6Ydt!FaG^(G^p5q0<+1&!TuRH8nB%KeZc zEvPt@DFOxC4UC}Fxj|SL?2QG#5(Q9YSn?s8ArsJX+QjUhB}&GmoFNo+ogz|B$2;)5 zSWmxY$<-r^fp_JIaI7K$aj$>PrQ)Sbat8EN$)k`psjs=bZioXMNIKAa5Gq>u$-rmf zp4@)e29M!j9_9oIHrhqFTx-edl_Q)9^2i|ay9y;8RD{g~^?&wrdl{Ojg6P+UjRBlZ zzoVkRPEH1VW4z%u>qAh{Mk2fG*EhoZhfNGs<%}>61V;R`UZ?^UENza!3*CgLYf1mW zDd04@(p?b28XnO=*!A2#MJ9g&Y&;S>(s(>9+anCE5F0Tdi%OzA1=o}<7hqTLd9sZ{ zS}{uMW@ro8m-`IYczf-Mt!nKAHa*pDlg_)U%&7ULgL}T7)kzNBS&?aAHn#t(;nU1i ztDYW&+-;1jR#t^LK-Om@di^zIUz@X2(HZeW(GJ*38+sVi@(QX3+p55|NLFKfXfY87 zd$mVR*^{9B;;V`Dlfzr>w0l05H;V<0;;^kk&5H+4T2a2HK7E5ej&b9A>fM4mHB)Z| z_dVrTwnx@P`!3MA?>VH1>0LH$uv!M6WB0fa7Xs=OiJ=MdpbULWu977nuFtUNIOJ?r zg?QPxECrDg`a&UXxrCVZS$$9xicElxL!__aOt?dkS7Kx#+#qkF!1_5w=;gt&3A3M# zPuv8tFGCkM~>8ba~^JTn*Uii2NxcO7qF5 zli|Uma*+MP==q{qa1_Xc#+^i81k=UmrK>^?i5U-O;8tHu_{67soL#!xg)-N6Tdksp zwxM=aMt=R<-;V7yix>H`>B-Gy^yAoBZ(on=O`GCiNKGkLxYDoaAuO?s32{{h?_Y@h z=b0|0#KzC6&59eYT(F{Lx9zKs2V~vZ%TcZO8sxKQ?aeHCN%X-EKO(r~ojGf2*vX4p{v^8$tjWc83pe6g6|Kgei^0n~R*4g}kH@Xcyaq-Q1 zuK3m&tX^y+)aC9x7Ff;d~c5&wA2xI=Tl|?kQI)oc$=o@J-NCxd$>-Hb(8Wp7I^bfI()koQ>o$63P#_ zpEqXH4fjiz$hb)!$g1F_5-bKJX%MLa9F_lz9HKmA-OG~xV3L;vWBmC{oo_7K#|px) zpTrP$`i~`q%M_X{0Jyd3J1e$iCj1(Mg$8(1U#3{s%nBv?-5~cN`~j2vH+*JDG3qxD zf(6SOTdW|~M5|9tED&d&!~XH<1|D9@)Dh8W!#@$a9pRrFO7t6g9E>fV2?r)6p#-@t zGB2x)_FYZ@K#Z@$xoy^yL{yr5GE=>eQ3Rk&|AmqS5h~gsBSWo9&XUK%(>xIA>=E=D zhuFs`8v=+sM)_s{JDR~4k0KN|h4ceEosxrFT2qQxMRiz5y5(jRBCc4U*O%VPB8eS!p7e_S*i%DH``e{+q+MpCmTv1rg&-JdGCWg<@adc`&9CcLrH6|4g%=ejBGWabJ?R4 zn0f{_XV7^Hh#^gJ-7MqE{RnfjL~^v4(rHclJCx{(TtyD>U5(l)$!}nO40Z?n%LYy{ ztO)wwcc`u{dcjIl1S0C+fybngybCj`x(X4=W;Y2aHsNv|7C`LA=YoJ$r^jcb)liS9 z_AR6A#5O`wvf$);bL=th4pj=w=veA=3n5vbg50g>0b=Ara8 z#&dz24qoh2g_K8~@#O0(QDWdwRFK6@x-G_W?*Rsmi? zM}=N>kS`vLjYdJ+pFNM_isval9?7(Qt|(#e(3UG7hwB`#wOt(#s1;@JSvmPbz*7gc zFZYU9oZqp0$+5W<$YBeY-;bt<^+|o(kFLKuD58m-9~U>O$MnUIznm`vhVAqoIBs>52a{Pyu%i-AO%U+4OKY4TU?nC-#9ofOpk>NK6r~P)PGXkv)T< z6+0XDUvXoS=2a(2e8t@SV^ZY2Kd{gvHoiA#{uAUk4q4mec(kXPiKaUfd%$h1?Q1tlPmrGs><)b}^88O5P5AvjW( z*K>Jo)})(#e1+Wgm%a0XadANKWs?iIB87G+J z|Kq3nyD>=3tC4dks{^0URDZ{_XP0;oxb7m#H3fsB{smfy)Kmd#1%MI%|2GJ#xg+{L zWU+$waqHzMi0)RO`X!hMHs+m1czb;SMy5HyWa}yvIQI(ziT^ObfA;r3RFQH5HooEz z<$oQ5eM~P5BI9Jl>YXJSXfHu#)ioU}J33qf5>EOI5D+TYtl2NAAdR>R^rph;xBH2B zTq={*lL{xmOFBUQqcYibV|Vu_gzdjE|J{w6Y*A-78(;Pd(f`8utQ<>}hnoY%ZSupp5V4ja zk&TD_fXEk(1NbyXvuh=6umr5h$${^v9g3UT0L#6MF!=9cexnSB;@UEBLCaraiFGKH zL5WUMIvoSwkT$>ZIv(5#JIpy%&Xv1Ht0E4;@W~|F$WuWumRR&0EW-y|MKVm%QPpIp z;t&c)o8vnO%!y2^qTKHovg}fNSP0^ztPC=iRg9XJ1yvThg5#s!PP^l`WxWNC10CAzOeOO zv2yO#BQfPWOzh`BKDRJ>jk_IL81ZjLnxl4TYouF%OoJ;rN*Prb-b zi%n8Z@!XBIwI@4-oq`gCzC*aWsLzaXWhJS>M8_!_?N0HPuLpULVS!g_n?SL(*yz0E zY{{qQr#_4?C~?iB*bjmIKhEVF3wOLNSeTu2ZgKQpuN|-MEz{W{Rti7;)IBfz!dCaV z_1B0aIfo&ae9P22Dq&>)hf3)YVh0;aKcTfv5KRiGkmvs^Rjgosj z2>z@Mpx0kWECTf-n{pCaOQAu{9jT*pT>+lJ(2u=ks)jZG+N=ND|5X0_bQWOxC*s1? zD%XShkU){K-cb~-679zz5gB4}<-^vbn8YG{oTy-SfAOkwL@8IIis)J6gLtU*ly7dF zvi3~moIZb81DSg0O zAZCRB<``5k8Ia*2u+zi;*F%WnkjfEnDi!)(%1$L$n>0#wZ2gBz%+kVr&$;_})1G>s z0eo7QPkp!}rF)O6vQn0em|jkjpcItXPzowqdwXrjC6S5M0`bHqbO9o zO<>-^E2U0%64!RHN+|UXWwZ{OF5mN|+MRYx^MDu?jmw{yyw)`T{>7x|&) z+WpTO9!1~tdFuQzX7kyn&O7`F^66LTTx-a_w*u9&U;`<-wt-K1r^vb6$)_N1w<8wo z@gb2^Pe9J(@Msm-=qJEK7=-i_c>~|!dI%lAzC$_;Qu*}-urWwB!#T=QQy8uY>HcgH zc4Yileu&XJ6~e_Yk0Lik@tc322-;@@ypWBcGXc4DUxXjVZLY%8;nct*v?(-~`i^l{ zDRZ6&otxfu4(`&+5BiD3Dohd1_W>KNT7NZiG{D^>I3$bE)X_kp4G)kcGm><`3vG+qk8a?fdw2#+3ZtkOfI0s4)7Hpk?fBtZb&h@NUAc$BUzq z1BujH6HURcoQK_si}8>L!Fg&`?1IGJ=s$hCEZ-$>}9v}DAX9W zWad>?nt@t71^zd^yxixQz7%Bz)7*W|o%7O5Z)Z9Y81TXsP;)_y$rxL3-_G0mW} zpYKPMRi*Z89*g9JBW4kywS0ZpLcJBFVfIgiw6VuA8h$G$h$G{)#Y$K$#&7x_N{tOfeSs#OJ>`V!5sWAE`^3dIB$*ki40vg zst?8AV(RGVcG*@Ad32w6t?{GoQ2f>gVBK^d;mx)6fxeAJ*^hrB3hTc%B6ERK*ESR0 zRenZ$vEWIMYbN?ObwxO1xXhRg3T0sMM-e0hpV^tS-aBaw)YT`(#A~#mDPRtL+ z*gyp=5VOfZ-|YSXiAa!`3^E%qd0j|Cp{}U%Mi;6^t&_Tz5E}n?Mn{St{3T=gllNFp zD1_UW5FHX%!P)%NlZQDZZ_bPB&q)|GQ&M?6{gtODTs6_NZ?>0(CQ15UFMMFP%HC;qBZ$BWq|!rAp}v5 zqRr^-UmUC$dkHTvNd#tT3=*(9_Fn~Y%267%6B04Dn-w1(2<)wt&NWt8cG1xM^}bIU z#1}e?8Wxqlc3a(a(95@b?d~3tZxTDDd#PpGqlK!$wAG$LrKw3zuYHVu$#|Sne_3;^ zcGU;M_$vWL6d>LV^8;!bdg6J41%=sca=}dT9?=G2+>^HS3EeqCj|T4D|J1>6cv#Gy zZec@9djF)QM=P%3Siv%(OHM$tr?;d^bo2dz14hew|gb@uSQYhH?Gijv5z% zH_QHy?LiC3JcZY7ikxMt5F%8)=WqBrNs)?AytCt)-%h&CD4P-C!a)+ED=rjK`y+o|~H07A(iGSBre6XJ}A*T7v6AseN1039^Y%4t{3L`;RQ zI+r){b?7fIg<-z?2r9>hp_cT8fx2*EWB$opo{6!Z_bT+fv@cTk#$0fDQnE1sb@ZE^ ziaU$jgQkPXr<73!o0?J$@OrmG#U`Rr(8ow*<7qbt`#O5d+L~aED~#aa*Gm^ykiMtO zG^cDUsKJglMp1TT#g6Uy%Jrnxv3FKIebD&Bna{`TFlB=k{SR6`Bpw@6x0!MJxbtVz znX{qy5TbyxQ-N8SYzE9^D_g%FHjx{P8MnT-^tM2{xyl;WWQ27=9gLE{Q!(L0`nn6H zdt%~rwqV9ky(GTLdOTJ>?|n}Y2KJFQ_9MhciyC_lK8l>NggDu^RwxgIvKo4qDmJ6y z_Uk*?QUg>48=Vgo)#1he3T*7r)(HOJP~)o39o-JoPZUtI2Ap-DjPcwJKM~GVL`v## zB)CHW%6RZ6BnBn~nV8Y2x57$K{s3)do6X;HoTiI6@yYq7iyNy>dG}|6TL`AZTbvl9 zotl5GXQct}lJ|;+`h=Es?gcpo#$g^`3yx8&2>(I_jWbHZ&~9t;^pSCEfP}jhL>U(fWxOn8-P{p=MS22pC#r8FvacpM(2KE*;LCs2}22&?O^ zpJ$anLUz6MRgZM$fK>l7O=(pB#6ZECBn%Tv{U_|C_ zM_v|a-i^HS*>WXXY^NOhHh?nxj?JL~78}Xt`+|9NG5AI8h+!8`leapJDqMLw?D2Mf zDzZdCe-Cy!gK_A7gf_9al(WEaoQ7x$mLlGm#_fz?*aB%*w2-~kQT&gpD4>KD#@pZr z?#fqV`%DPq!uEUG&ieS|HJ)=)-gh!eW~@_oGiR7x>OSAgazrGB^F=aqhJLNgyh7z& zE00zs@$2qQ1ckfeYSlV$d{hB(B|N7k8DCqAC$fRzbgz)DUs0#D8oZ;}yRvHH^B00m zX@uC7q0vsnNYQ}eLL^@bTc0c}yY=QL@-nZ##|P#Y#|G}%cId=fn)DmCag;NO+cvv$ z6)Pk0mK1h>cnR_wu2Jdw$7XDSTm?DN6u9_(;m~ax*Zf>r9@?3T{62L%$W0PF}j}ck7wAH}GaDUdOteor>%~&a1}m0&X3W+l)hT z^Y}X+2AFa0cjG2TCgEUht_(uTvX=@A-qYT?5s>Y51FarHy&t0+dwk!^x`-uNI#HjS#?Y`~lgHoT6DdKWraIsOFYnaRASHkaQS4O)= z=)Nw&8eefuxOzsz(WL8bpG^1HoNgI*{5sM*Q!`F|#o}*=oJ};(G#z?Nz%x;zVJo-7 zPe*#fKkN0g=dW@+4<|Nkx$r|HVR38&)Ox*}N_$+UTzQbV_~Y-TvCEerQuB@g*|{!E zG!a-2dW$7qvg^4CC5I}Tv7@NXm-ZNM)Pi|ar#EDKlUqUI@8j4e&F>5fyxKZ&@Zr88 zfpDjbDU&$X?Vw+0rwsU|bRI5tbqkrGf*2qgg!zQp7UsggA*_o7L*!>v{Czb5zg-(EJDn>thB*5gIptJF zEA{`0T*tBa=SY|L(ad+B`BgFr+(%d&A zlxrL!AoOoc#XxOYmiQf@H+hag${Gz5Ew0|jZFY^$K8`wEhkCou6*c1~_OL94xP6+M zF@CNP4O8UIrl~W3H)d6Vio`0awj+5yDx1Fi?pX?+!5i=MAlCQ=2Okd$TBg-e(ZSc_ zy4)b-{jWX*Wu=wYb4N)r)^nm?yPwoLvv2pCZ^#5P?K9Kj;qJ?Goo1Ci>lU+qco46> z+^h`jU%@X^tAoxE!dK228I{p7ZG?ACjd5E-8HNF{8ck=&1z=eiRrHz32ZteYE0Lsp zdxe}o`O_FnQL$?rqzu<4AWwtXk2#Z5E99!kJ_efwK;yWJ59&9TkAX8qgFnCqD~cJn zHPv+}lHd3c|8%{*th>#t2az9zy?so4N9rKb7EgKH@^o83iYH@rLEcv4ib-qu#q8Nl zTdzH3t%#VBdCAQo)@CnaoL4@LoVCW5u1uS=Q$vruK)(m{35(?Y)jL0S`Ul~zoe-$r zHrvLbwWDKWcz(qM6JD(hd{4C|gm~k#qY6ZY!2S&|s*;2Xw(;jkLp;RG(4h_myIB6O z*o7U|8fin5X%vZ$puZF#*-Y`ZB}Dl?#?)-T)RjU!iClj28|1Abqf+-_6HwW6oF((o z+TR~@$Zx0(!7~29cpI_u`mdRn{XL@10HBXSk@E_RAN4J zu~RP!&NOXm+(%bPQvA~yc z44SPulWd~lNRJ`sDpr&va6PM)u()<|PnT1~>uaPUvoBC%7z}T4@5=*=z{WQcKWxIO zv*za5WSis`#s@1Mp}arV!k@U`X-E2Os!tmA^cr;8wxqcF8+EI)IOOiZ4Pq59Pw7r^ zk?7BAd|Ak0AuYnfTksH8&7`pNA+GI>&a^hx1sQrjFnX|LTd-iPsLUp(+G5S0y+Mih zR|+?!ruM9T`O!aNgJxW8cgyiNq%Wz)8^2GV^Wy1sn<=yQV6n$P{82gA%KiF}Q&Hc- z7Y&6JTC|%VNHd&^RBegDE&>hsRo=g^S~XAk0!qZ`ucZ|eMw8Oq%Jf+w{_jDJt|ruV z7p#bFN?Rxyjy#VqfOC<644jg=do58qi;R4@%UJk3x`G^p@Izgy^h*tuC^oY?d!T7T zN#fG5b#?qS_LG#KNCkYCAzjpMZcw18g^J$Pis%=`Rxk9$70NSCYWhrlT^!<13K;r? z9BmQDR?a-4u2hGvS}=m#rBkWfkzx6sL&k9*FLqiUxU1+zur!9t_e8w<^i5XA#)ffA z#tj1R(Dq6CXeUIFCrv`@*}Jnb-iAi>Gjqw-K&wvHXPDUED1^qKF&6l|`Gb@qpaJJ4 z!2X=^v1)7-lB-Bl0K2rJsdV^8z;3qx$a`Jxea__Q3FMrOFhN8qqk~w(T(*8TuM>!O zr?tl2NVnP?4tRpm)+GNgkn9w$|B28J9CzPKt!otBez|A1U8xf#)XKQv(zfGAo+ssO zzDCF`J+yqmv>w7pm~8qh=;et z#)wnZ_A)O&@9Kx;ck10Tqkjwx_?>s#mgauVB#j_3Kl@mV^rOF*Hx2+)-rRhehhBy^ zCze~UJaK*D5J+le5CwqmevXkdl3|)#e+!ILr@20c(dbe;((rANhipt`Cj-iedEzgE z13!`PWkA_$0WA&x6npcJ%hO8Gx=11uw+@5vNk#jMDd34)d(iEK5brdt(JDk_KtHFRGw8|1RLf@raXs2~R_ zQcqk6Hi!{~dx|!Q8G&O>dSsw%n4%EukBp+X;BQ}y&Kl+Mitr_LC$I60xD=DXr@jr=q1*a&Q75t)fiVBkJ~77)s&IgvfpT`lM!6vy{LE^ ztjQG*0Ypf1r4nd1AnsZ(go{FQlY1;vlq83iBXgFk`Q*A^FC*Qh+~<9_*0g_sEA1&T z&UMRifubyTW=GM5mCfs2xH02gquvChYek5&!JVZWGt<*&mCfqp_FC)SOD|a;W1X-h z=}pg@PzVG|53zj{kZS7H8f>WYqdNZa5jHZH|Cy=BSner*>S{H70o@83G;;y)#Z*tg zP&XVdZnId?GB(ALkB3y@I0{33EYm^`WoBjtM@T=R+h0sgscLD0X-{dL6E6qfo^Fb6 z-YvZ);8c+A><~J=O^6gaHHse=^Fx=WsaY!BThs z$sFM12S+!|vxpqVspB1BWV{UhnF%{Pbs-Z3U2A*B z87~V@+|2jXn-7?%X>UB z0v6{C)G8USig@skF$oZE2nqYX>2cc`>`s^|p+|*+tr%VoZZEu^j_&F1Q>=207RCLe za2cOeWKZm_{OBNd7rZHGA{tj04GX_^7P;1iiHgLbNj7e4pR}ge2Y2wpGlS{7be=@5 z?KlA5V{wvnYj*YF7rB|Q;y!fRU#^*wne!_1M&moFVLwZ<>996eu*vH(3!k(~sSO5QY&j9+dlS1!|IrzsBZ3qJFH(9sXhuS1{n(M8~e{^T&hP zzBv8O(sz70CV;62rZg8Sz&~8XXdIG)(C7K?kHzlzq^LIC8E>adN@dK)Yk;BYrfxeo zvp8P!r8A4kSQ%n{mA)(v(YY_0q6qQAvBOcxTiIitrT7@RA>lL>% zt&)U~3Ue#{^6!p2dPE5J`@%SQ;h5;f<>vg2f|FkF5)Q1uJX!Tmb}zXUN~>a+1x~;< zcc;%XyzaE6ZFcc#hhw*+ZcQUsVaAH0V6UB0m@b@K#r!RFefNJsx197`SorlEm3NjC zA>AWQIKm(P!PGhj(tClsqP@6=L;N@jS0Cf3w7{vS0#*R?y#EW?%6riGVU9{O4))tg zKd?;LrWS>AXul-DAB=njh9Sdf1Ns=mTV1#d1uM8|GX|*(>COPRQ^+BH8gm^675*Hb z`mTb|Nv478G~5Op0)9w=2dEoAaULfkXT}_RBvt{2DHD+=IY6z+}O| z4|F?Og9_v9xeh5`0u{FeR4zlv=yIK+M{piMuK<8TZ|w9oJ`Xq)Fw zODi&ruzX)*aVyK?kE&y5^S4|?u+wo>M`zi{SF?U18+2c?dabo8JNToWGHj!@re-H# z9K8CIaY`w3g+Yxuq=%LQ_(t#1$mydChT55PP8ZP!Fg45!8MhHNi_4Q`1o?H`D&$zT zg-^Td-Xw4Z`XN)yH$cKJ|O=_u8!AQf+NUaxLK{B)b_n&m1>2=)k zxkme`ul&Wvx7Za+3n`Ht=AUR>W`Zs^fc;_2eFJ{8DbvRK`K%WeiN|GZ`Whr z`#hS#jqEecjnw4c1bTPk?DS!;$?`;c&DCDwwT8Y*8C;#wNp#3p&sB z@*W=SiHS%taB=cDt<+4g*kAcx`S*bXe+0gLj`T*X>Y)yS7tZ<(;reGQZVK$04KZaM zp)w(q6V~SH^29;GFtjgOFAp~I1?F7OvUEl$>-%+UjU(rdM#TlQGEuhg+-qB|^ZP5Sl4hF^Nz9yNA-lkCqs0CstLJ z31QbZu7oc?0(MFU9V^_MCS!{i^ZP6Lr=)6w^==)9tO8<0>Bjw5#2Sv25+53xa*lmi zx&{4WRV8|wemxfnrpcx!e5UK;llDo84NVr*h3pKQBKqc?Dz}xjOJiTYexW{pOUo($ z+AoXVURsjzG(x9**1k=NgQd4G@j-+K;4sW6BDhH{wtUYD?kt27Av_(QsupO8KN zG9HvhEP$jqpsfRLZ1D6IqEbu#WkAfL>C$bWLjYrg6#4_$$^NHwnm7WTf|Je|K(QOm z*!1WEWT3re&y{wq&lTHtG@hmG_x$aAbu6NM*N!B4BvXs`zw}6tEHSZ?zZ&j_2~VVI zZCSyIJEzI!hnGvP^Lil)3>As)D_QP%Q+sNXE!tl8R=(ek8(8>AJh-u1fA4JMLq+4d z@Pjc^FA?8s$Mz5;2EVkY){o|$y|}Nn8o38GQdHn8i2s58CdJZMMhdW8Ss7GhMWH>v zm@WNb6T=N^xK>{V<>)nVJXnwZT@kIYr2YV9Y4-mGpUHo-Vak7p@&v1|1DN9D^}AK$ zT!>2zWsen~lbprc0}B`$mb~of3)ui>;P z-+Li`C3J7q>UR+8mq?PsL(tYw`lT+aQq`oevsQ8Vl7#Z2hO(Hp#%eEChO0~ObjN!( zwy*Zg`l@6n{|#w_@Cl>ZYL(!1P3GAc{V=1xvrZAcls@{=-tGRLu7|2x{1Vos8if>RZn|XD zdg(TMYO8K3S3nY76^QN_K0GTu6!@a`NfFKS2rc=&s^~H1JHN<1$uo41Fpcf$``C47 zx$4c^ucDpu>JKw5K3{o5iDCQ z)2{#4H8RXbPb*vOlq@cwUeuX_V>~~N-8kXWv{|!w)eFHEZl7RG4bkBLXveY%;1zmxB zd>STRMCoUNna3SFDSuUHMHU3q7u1W4mgAcGC9a4J#lH*}l>1Yp6nqA)AA5eqLAtRI zJuKbFYG5>;CXCT!>f{m^Z2@1VUM^ZGXwRv0`@(fMx|HCj8N2iQ{j6+3)}mP>>1a!Jztvor5%QD*eX&^Z~jy4n`Q%2Dd1?zp1E z20vPQ9KSxgp+69ww!rYW(c^iU_O*X`=NRj|(}CXo@#^I-7M-J%UtLRo{_xddmHi8q z2olP#ICB5WfCp&I3=HPyT2J{A#2N;9A?ZK>U5j+0c7y?4B$89p)YdbcnHV=M+STv?BgQ-@GIDB)}%)4 z^C12j!EW(nGkF~tNY(Xxd0@c|3$iwklf+e_N3MnLy z_&sHh#PK_7{LGW-rn?KWU30qQcTCx7ICpwe$!>5d??>FRQoyj z`dO32qfE@!E1-(~4K1!vejo^9RV#4knu{A4Tpl6j{h`$g`+GLo9(Y2;0}B~ zayTj*1W}DFeASjyin3hD6mtG=YsM|s2(b3H+LD5(cCRVk#!}x>zVd{~7tUS{YFA^o zrKCmt`8wa{aSS(OaN_Q3CKrjdjCJMhjp*fuAFm*qzI{oKvN+pzFf(04>|`yR5HEj1 z3qJRtCp+FOGU$}jkI(I@3>rD=MAe4ZFYvS1VNo$zQ2Z63WB2VDLl>lceD#1zOb0u6zivXL!4!=*g|#TlwNsHA3*b;eW{Q72rlcTG&*RG1hV1GNyA-D41umz6LD6e0{C3itWHdaDkepm!FjG^8SQx5C&R3E`RaXwg1mF?0m&08wJ^SzM!~BKIN__D|SuLQAPqP$cvrv^!%nvHC%?T+Sl0=J&SZB4ea1hLm% zYAmCPAIW3n1q|H~OQB8Fmn;!p8>Mo)W){liV z%B}bYOw=JDC%p^&g6h6O?C)Tge?JN+Z@NHH1$aOef&0?Jj(9Pwnljw~Uvw_QkKhy; zHx1$yO{y4M@5m&Z%G0Z$x??@5GnoAj!d-IqAP0ecG+g$j0q z{ZAx#)C39JO&z2F<6;5XIl&b;lP?F!2W1)#q7UNd51YI7<_h{*5Iad-i7PX{q#5bg z!gXbxWrl*ORupz=kn^WY$#t2Srguz;dAsgvx~p|=!DVN)vE5a&-_*CBA=k3RCcmvy zFTrx6di5nc!B}|D;7ELM)HUZGSM3wIw&yRH-d=R`$?0S6)a4UDq|ZG=?vM5UZSQ7} z`C2n(r+#@jV};X^*!Cp@`Yo-YA`iVC>=mk2=Ulc=8%SarOyT>A?_%enwn7^RpsR%& zJ}@~1!7D6R1EhL;I_BGz8Olx@J_`18{eB(1Pb?w(JY!bK#{7(G3tB78(~Fb5t$*4# zkmY1=A`(R{-{swL{r8-ko#yYReOvzOX5oo9L#BR{T#qgo zA&?qtrNs=80aQ&prEeex$pSh?@V!V8*7Xy)4gKj*vFK=`z%0ncpcr{AfThWHL@x3r zrmYH%M%jQq7&_Xa@W4$d7%R)QfI+KtytZB8pY>46;0NQ1XN-0!Ww-`+2wUOF3a|G5 z;6beDxkBXzZD%knUCc@zhc|0e0I$%6fnJTaK{-R3j@q-qv;&!|>KnUdu z^T+=LFjf9}0)4u4UNb#H^jv<+2o1o)rJF)DUdnrKwad$j*{VCF@0GT?vA&Hr+05Hl ze(IF>TuQHjbj=}6K~mI9ha0y-C!9IY{9V`XoTqkw_<_x{mmPYr^!B&wevt&x#le^5 z#H25Lv=dU$B}Ab)K1Jgir4ALnHC>e%lit@Y#7?Gd(4q)Jdw;9h8Agp=p1#;-{F(hM zjcX^?B68nK8l(A5_KdKXAN>Vab%V&I4glK7v>gs4mbmUI9$Q2z_Seyxqr?kM^IQV3HEzR4jl^g^5Q zkzRHg`UuhoJ$?)%4Rj0vFWO4ppyWKvF-yXH$FD1-RCbg5I1aNWm2G_nM?w3q(I8C9 z9fLY)5!8QGKa*X7>h1>7Q@>$D&jy*IY7p6UJ`v-6m&2=ur^z8FuJ&QSWzO^BVmP;b zJ#eN8uf}k0{6_0(S*@e*L}^d8FmPcdM% z8>CFVMzzX=nP~P%%qvz9l6KaR`l*FE>#Q{zpz4 z1lDmAg8Io;OcMoD@HE{+Sn%*EEDAA}y2XCTPAobGo? zAc_dMzvE9E+6pU5)qQeX|8M=@UtX4cIdCBDiryrbM-!as&=#M?x6Yp+6zCk$8sH^dd+Qsu6?``KJX|< z1+Sp(k#X-qD$^+~8V1xLHNHLwa{=s>=+Cj&fIOfMW*d!h*-!x&mEdE5tlG%NK=K*J z9~DYd=*~{H|-xZoa$}OYKO=SuSBtn%C={ij(T^4H$Ih$J&eDxeP73YW`$VjzMyng=Xypr)%-?KF&K%2|Ndn zKW6S~V0JmN?L3sUxMlm_0pYQ(72_+eB5AeqGfe@rVXkgQ&n$dJ=wOu$CaxbGRV&Hu z^Tp2rOULSRU@a~yxId`K=Ao(tg;QF}+3{Qxpy<;7hqE^ihqC?O$H$|REMtozMiiB; z#ZtCWDoG-hovCCG2^owTkv&9DJQ1UW%2qN)w!v5`iHxOYFlMI6GMNeEj+uFWSMSev zIex$6_#NNl`}xzsG48qV`?{|4b-vE?e1(3C1ely7#@~*(L@5JB6&m|h)2WG=NX30! zV8*wGMBLOX3po+CZQk}-SG{3wN(t+d@oiosBfaHqzRKn7iwDy?kRSCEkmr!o+07Yq zp#53*)p@Ss;1+Il#*Nkvp|{6HD1_x@bZzqOEq&!htBc4sxg8uD?>>BWO7OVIQgtjR z46-5|SqCp62#Pz1a#C)%pV+ts0v>lMfD9k$;^m&YjU*W7V-j%<3P zBs+29a6Pr*y+*^SPVj(@*Z&*z%YU)_bLKmlnV=j&leFBbzpyg$M9FJ#_#FKP zCMy1H#C-K{{4@zV3!rbu_X0Qe-JIM!2v{^=XNHKAtvAg1mq*3Bh(8+~#Dii-STpF3 zNvXS4_j^*^ z&nu2KSKc$4M0BmMWf4Mj$YV}T_)D!6j3xso17)o1T)I!4Gd;zgplPP%iBNW8+kYQb zfDIbP0qk26YF0N7Fd)2lDUHtYUV^m3$aPRa2wiO@Oa(Mk%zx0~bpZ7yN4!AW_24+o zM)Wj1Cold%C+W@L17=GY8bVYnFwP$&Gs)TLnMUd3Dd zv1@|N*GFJ*4*E}wo}|f+B|fPX?6aP$vw)KVr-Z|w4Zq~^pEid!h$)kb7zcIjEaf+- zb|t)G@yifU@Bp;kjvJf?DDU(*&@lit5AvPkCaD;(2_W8q$V%!Oy|Pm54{5tbM}pS{ zd~C_Szgp;U6c;fI+AEb>W%u}#@HwG9$TG9bX`@UfsGHvJ><UEIJb$lRFq!U z8dZH5&}?sNjY{D^;%p!!*T!pjMc{8cw6ZW@a;YJa_kkspTiSABm^N{`{ zY@hRA9&!I%dz z_LHRE-0tlVLxyu$%&4}JF`o`^y_S5b5}&zP#j@UNIm==MS1a0T5+LuCm@^7cq z6#EA@dxAvXGIEme3at*cu0L>`G;|V~9=hScx92-B0ErW5s#^KA`lkVsLVz!(3kP{Q zZv^?YHHVog`!KQonNS#3#$J}eIj9$sycr}Iw*~0|L33V9=(r4F!0<`iP)Ht)uLSAXRfIE0$;TYffZCw z)Wkom&KUDd*Y5@WR>yDC2)9hs{ua45-0$2PaJy6Wv5V~Q``*Dyji%DYhyUS^$j--p z|5RMr(!b-dwcNxb|5JYHyL4nk@Ut^J^|jh5Y}QFBWx}_J0rQ$o(XzC@FkfEP-Mlm3 zw)r(>NF3F6(+jOFZ9bina5%fR?H?>|NEvo_enG&;*8*bT1hu)O76gJ9!>rc3R_J%; zN=OvYjM$2B^)BKlcxl<~+-=1~Da3X(;tPmF?xGgq7@_)~Ka0+#Y+Qcz zCU5nMUDfl_!w12+>x1}0Vfx+S$}?^ku@La%FWPfhh?FBig>J1GpCtaNu3K@9Y6%Rx z<}r6!!b79WY0Qr3@u+Mw_LEjqn&@wFP#=MgRuEzn6fsRtCHbkaC3@{yVHs<@c0CU7 zZP?W(q@*hpz6g^f>Am1gtywA2%=9FV?8%;=aJ30$&}eRtxJHw&oYh64|CRz4n34a0 z0OYt1@65>9awqlVkBvOnC%MuQ4|7FDbMJlI#r+)%!>06ZRHts>Dd0>)k(Obu}dOf^SqyK5) z!pN${>3J0kaT5_owtbYDLFK{M5t4tqJ11&IJY0@wci&J3_VIEf)mIJp@OB7h<%HnH$*VH zZ=uSKQ_%Y0aofe!V|*pf#+jz!u=f4@i|xZ&!yyDI6$U=ZNXo^wiEH#d`4j0$Up2j` z3IV#RsvyJ%<53%6dWp%0;S}+WM84`y&;b98l+bTi!hXVS1)a(3+T6V*m6d1;^L#GX z#Tm-to^zeBe`bkCkPQ^RpiLMdB(hm&$d(qL>V>Lj=(6sM<*aGF~;#@7W?_ld11V0%&Z+FkH39y|;Oxj4shr#PV`&?m+M z4G06VTmnKCYUz%B*xj6(W`415GWm?+hWlt}=o0D8$`9QJFRf$a=RY@Ws9J6f84{hh zMv@pE|H=C`6!LKf!09O41om5Gg0MkkXVWSlKz+|4F~l@Jtz8^?$oSFf1(@_gu`G<9 zWfjw2j^6FPb5wV=Sdrz-!KE98fx!M=n$xSiIJ@)}q(Xq{r{w2pzEMd|lu-6pV)uv$ zg)m40!f8-Ew|K~Hh$ zF45sS6DrZsWN)?4iyDDTgpdfY(b^j;ZQAGF+;I=CVxIts=~H_HwI0gI!H|!Uw2MM% zKM=ku3XUsFWx=CXy|4}6^J_x=dMN#6K*=#~YG<)%$C_~GNJE_07CrfH)1^+5{2WRC zhWSOE1xiI7!|V~purM^s-(0z(#g}=s{iDbbw#O97--Tojrg`yV@S^_n0v9{wAsIGpTl5IygX zE&!dbTu?kV^w}C4Sd4cL&*RxqvvpS~K;XaGW;BBD2?u57Jm|GlNf$u^hd)4V|NCnA z61EkXUH-aPIE3f}a+Q)}Yzj4D-}{<7_{ZUY^o*-O4_vI@T6PTQEyRC|ivu%DN;Dj? z&?g7%2$(B$whZbOYmWg|p^Fc?$%ut5HW%>#Hr7}vJmXp|%)~_rF&lvIGrv^oGXPwd zYHfn&qNZU=2K*J?!g>@x_Lr&Jh)A(^W-o3`Shfxbbn~IjKCI2)LP$kw$crFDOV;F` zOJz|`AAc)gGkVo;`SPv(mq8Xh=9-xu9+DN~?CkpuQkU^Nr73X0+PcHippTKuXMiB& zPZ#&(lwqIS@ijm{(|Qvm(_iQCNZ^m~u`s@tAZrz#-3~5)f=j=QxDhlLT&L{1tw4%hr- zjg@gYVk3CqHcR%_f-Z9xgxg5m=$@&a+|*rOf6Ju)BhaKagm(q1em6LPo|FWiY?JI zH{Gx&jg|7#RA5gLyM;Wr>*{|(9$naXSU4EX%@a*#T$GSH-e?`6SQ+uG=WubYq)tR- z(ADxYC-1#(;QsEGQ#P{QCpsJntfX+V+23iwSUGO?!z2BGE`0-15u-9)%XI(xK(T)j zs3Zw9D?eH9@3{5exi3y4bL&d%ha7oNY7R5AO^z{nA!Kz@gEwgQOg1(6o%6!E^ur%M zQcyPahp*p1V56fhRxw9c#)#HbK4J)>?Zz(#HAYT4buB&*I}*CuSaSOw{=fx7$CYcj zXH&8|U{QVD3#Z;?jBZ`Y?T7aTc=CYD)A};EqWGou!+$>hsF+0rcqK%=W^9LJW$PaSbENN5P@U5$&r8p48Sx#xT>|MkG>)u`dl23lSVrmxZD&>Zo| zNoi=zIYZ$#%2-}^vznFU22Po88q?GJfJx7?GcNw_{c%yK+^pDPC(JZV2)?=J!176M zx0W>Vh=}CzXTNuehB-pz9J*`vKEeh{7M*eQw5G?Bcz~%{hcffnY}^)3>OIV{VE-s| z?y2CYIHP2K9<4Jd&qjlG;OG{3l2GLf=0r<#4!Lzh3H+>PXh-u@tUq8`h1S3P0oS7vCwz!f$h0gE07~ml%a zyTo1|`1{)Kh+Sjj?rZ4;)nnCRQmwpSZs=$f;p(nI$qW&G44~x^3*b=Qr1Lh%S#SsE z6DJYKdJ9rx@!J|G-%ZbK>gS+N6Z1r0|0AwmtS0Vwe@-_v`}zDk81exKI5H!VO)l_H z3-b7mubCh8kW5~xd9uSmRD8s=-Nt1p3b@x@m$QFf%06O+=iz~wK&GW+2^w$?)zw^T+~%#T(E=O?ndEu}xN#yl~R+9eh7y^Vot*l}&SL+*DV zDF7zOZYYS#TjnFYCs;tFGiQa+<=-BU%Gvg#xh?}^R!$4Xs&jw{v-*d-#kXHHcaS_< z6lgT{sM5=`a~I`!NL-wP;&Q)am~Qx)LAfKzn?z^n(B8golnllRY~Qzqy+TW_e;USy zN#73TOd}F%F_)Qm#d%`$Y&zeT862W#_%BQ*nELbWi%EJ=Y;R@NJTJOn&AqlPCLH(N z_GakP9+M+yVPX@7`E`|Z%JICqD%97&Smy%&sOR&sC1p`kCHTrfo}%pCY}u%Rf>=bBAY{vcD%SWd+ctRlrcssim{JsL?$MM*cbx%8}m9pj@| zliIf2#VN(2ZmcH73Rw^Tg6HW%@*AT3ZJf0ZT!K(d8Jknd9%*%9w%LaKG{4H#?3JgH zw^XrE%JZ*|i}6z4Jdcs>2@6xWITx!|usJ{ZiCZ85kN*BLVqJKSD+1Cr1~!*Xgdwcl zT%mv01#T5Hr?;H@aa}qInSG;mXDM{#I47hecT>p$?xp;7n{>>n=lV~W268`mSOiB< zlKbo{l-+O3eG;Y|U_#woQ~MG$RxQ=JTiTcdaUNWk3_=^KdrF&YT=xRF2e6vlE#)!Q z3sdUjgrfHZRUePB)vVLO#nzWcSG`WmfX&cpr0%D7YkO-+aMg?Q5|`Vs4QrwJ2Dm~2 zGz%ye1!%4kqY9Z-;{1QCmH#ovqrUV(tYfE=fuWUL|bLPpaqDPKJBXPVF-FPAw<Et{aYkbULWs>1Ezfj_XLP53^W; zY^>~%+VCT^HcBeasda2=k-cc>p%SdqpE=+($E!aBbY6@7$zwAa0~Cxh#ncGVofXx$>Rf($Ljf*ZB+71?BqS z!tGg0*{hB9Z-*QHQ73ZRi!Ek|;Y=f7AwTsmY|F;P4X~oDh3~~n@SJuMiW&I7Zt zcoww+K^tzJ`9Bc()Mn1qTb6+eR74g^b5c_xX*K_a$lp|=~CTcG!#$?oG;Ei@d)`7eF>^=p3OYrhzoguwVf z<`e5) zbza3ySAp<#f37Hx3l(s1(}+8U4v-z{H0M-pv7m*CxGNjv7~risuF0X32c;f`7`4#V zrqE(!ORcx5DCo=BP1lLR7al>TUY}9h&WH$hU_X&K_V_Osc}@jgg_WK7uPuy5z(Z^T zeIC3N|Lk~!j)M}$ky0^MXCzTY`$wn_}V{p(2gpD z#rLk~#7_Vr2^G*XWfLajeDG42G>BYSRX?&U>2q{&j?IP~H;YG|!znpnXF;RL6gE)c zEDAM8&Vn}5e0+fD;Sg6G!0X6$fuI@Kn=dXLc-t=|&F0L6ua-)_H~Nm~V~^8_#BTwj z#weLPcs#wX(lH)~;Fd~$#he7TXd>!HPPgNhOH+G+7(x&BBNh}DtGLI7u-+!F(>45Sw(r!sVhTpDRECoJ zf0ar;;)ieZH`#g+&doW##83S*o|n6A^hi;|+}90RAu^#<8oR)Zx*IdVyoqZ+7&}V> zV9k4(DSWgQId?YvUzoi@WU2JoC070;c^~$n^$2yKr+tMRjD@`~U`-Vs5k8bzTSn^F z2yL!{;zl^+9y=@0SHsg0cvK|=xS78Ro-E$F9Ln_h1XC}uNO8CppYWcUaHK*|rYC=_ zCCh3d57uW9(TgjcNjPYL4APVPc*HZ<*?7J*&#xs>=B3Eqf8Nc*V7ne990C<@_dLFF zoE)$HQ8)r+O;4J<7aK55&4{$yE%WX}SdxyNC>cJzASZcf3T&l9Sky+++++L!**<*XDgu=Gc)R+gX01_P0`{q_U(tGzC_MRxoMA7q+Fm5Q_Z z9(o_EHn;z-xJlDE*U~FWzXMv^0%Rr>3ykSe0pp$o6z=fbOavgKNDZjpU!FtJH~&HrKA0G z>v&D5`j|BQ^~^&y53dFMmBxMfK-d7sWWY+`3N-J@xv^;X4*_G*g%uBjyUQXi_ZA#ZU)itW*r+9}ssS7WMv3mjK zkk|F<(g-r^wN;e?ul9Z_kKX%I>imq}G3(v|)2A8}m^>Q^yU-H@Hx$tgJpxc&hAUVj$w(*wTH^zM$**W>Nkb z9?5oo%_$}(;R!LsbfKnj2q6`!(ZtQK;~2QV_Hy4iRUnkf*$TZJo2OlTm8^A?G}dZu zc#QbiE+lH(mxAno4>euyYM+bDA>XX^49f96poihlpnj)JkNQ-ydktSPq;f9*^Ko65 z=1bxKWIZfzc;aJQe9647_~YQ)$;S!tIn1p>RmkpKfjd{@2i3Shp^;-7_uP&baB}?O z9!0KL4D7I-&dY=&1nV;!*RpLK;c2))P$!qjr1W*=m&lHu%70>6R%iWkPC0TM<=-}> z_pM~u;{4k8#(RBwg5tcnTb}VxB}NJ^E4$FHHng=j!k`7A{MJD?9I#!LriF&}-q9>V&De_`z z+@j^;sOIta*W!OpnMK0_M3-qiBKP|}l-yHJBmO{NFe5~Rs`F1b)6pp2Rq6ygX=ix= z&@OnKO@4acM&tdadyZwNyG6erVXn-sl`Vj_-Jg&PMJ@)n{Ka3e2=-IJWuZX?&8xwU zuShW4yLL+7;rHSZAfUC~ zSdrqdLMAMOOj;27YS8d|n;=z5<*)We_1ouq3qjW2IXK(QL=e!JkrA z=la4y0R(4e3MK5gTbBAz#PM!B@zEXNwR|l4te1M0u;}M03p!&J$=!Z7@ULKE7gCPeS!A1PvTju_& z`~EM?ZVA$u&0rHic6l8yxP%&Jtbdia>GytMJ^A8LvqN_@3%D)8vWuE-B>{xiwb1@GTxzYon*F*y2#21EPv zx8upE1|_!kw1b$i1OH~`&ZcNOAu=|P?*dV(0&lyNzy-zaVvwjCXM!$+v1VFFgoj(! zF!AYCObeY(qy%5PB5>WgvbqS7X3{9sqR876T^h2oY!zhS01U>xa`=D4V4WA}svh?Y zkHPicnkE;KW~4LV?>)ZC_WKoL<1)6|hPqHV z>o^(}@8bBjseOc?vyi@IP^VouKOgA-a5CZWKGBV3fD(0tqp@L~@UJGqt=x^n?tFbP z&=^6B7OF`IUT_b?WoSQK+P4Aw-3{m=_abw14sB%z-{6G8T?wnm{YsOk~WQ#}9q(gVR30FUhfrQVEIp2J= zq`yQcj$J!Xxxo&(;#@crm-!DfQT_VEhay2RJ_-VWU2F$w$>O_q`i({{4m*gcge+-;1}MyBT)$Sg z8Vmwf!&>4xzm({4L?Ofeh3!P=FtW2Y9MP$rQ>vpkjOaU{ zVOD1t1C>CM5=vuqhQgkWnV(|flriTx*;!@ivM!($F<14CSA6s`SZxp2k5Grs8}`!d zTvJjr26hT+mxb9#L~#5DLtyE@;hz!fU4_Vf&ZAuzbkR^S%V zgDQpF_H#%qd}6!Wg7-lvoFgWb4}(0EXL4|iA_wRsc%VUiNiZP-2&UsJ;4%wTl}TJ! zFzB}36eLXiM)*GbiMc-%(}5U;FOs=RjB&oKhfti(k)NJrv$#o&)Vmm4Mu6oWRV6#l z-r00>-7{x<&n78he3^AALJ_X+`spWC!XadX zR9!a47mzU-&f`?EN9DnE>4qGciLXI`iZtAa(+Sx!z_+i02FX}OQ{NBApP&m|NuTQs z&j8gU@HhAIWobM|@LJ$Jjx*zR91zMvGg|>ZDuP?bbV?8LGE zC`^v89uzlg`qP$J5jkytNhFKz4Wb`}r(nJV)zVlTsIEDPbWnN_o(vAI1Eu)F;yzK0 z_?wb^R%IPfq){lp=B*Caww|bJnf-P>YNZe8SwM*8OfCQ17984aZH=|E%TWwzk^viB zGF#sW|Gmm9m5kwEDmzvHq9SJbB@v6q6hxAuSPJK6u2@!!jlU2er4xq44B}Y*=;h|` zVkodQfY1itJtU^|obT`|!FVCJZ{tebEl?Lduu_Yv;s?DV!W(DI@BQ-h2g1&<4pBmg+&K-*`*9eyWHr zZ~ec|e$IR5;YAM^Qx55RyXll+bnleaCH(&=LsjDi3atnMLUXp67C0YN(FXQs7VaC5rx}=KH+?Y zeuFccJT=3J+38rKH^RT@XMIaN`1FlK1&*}k{tP6x1K%O_b;sNL_KCjq>IQ_**MWe=0`&xS)beYp(j(nMUky`7NB-v zjp$dV_*bBE^y!6XCJ2ndkq*w=cSG2EI#>aH_Fn_p4V>2v^hH7;8Rs$;SW1ygcnx z2yUL)gX$Nly?V>F{(%KFe`fU9Q7q20Wl0GheTnbf(q)MPte@GYz)^U z8;7YRT501Wy;{F4kB_->Q;a;5Kv~h>pABPB|0KjkG0LLzifDO=9j0<2Df>AylJBU1jzn7Jm*ws`aYw(jc?B-thd%! zA<*aup?LhpL2p-^mtUY+W?g1v+xZ=#hU_zFT9=74Ks}wafomlQj&E|?h>1$doU+|B z!ElToVhPg$&$=SGkCms*PZ?06%;>65J_~naP7O8upu03SK8jQo?Nb(JF_taangT7i zhF}$yJF&T41>ya>n8s6ne~V&~UzVmDHll+pEp8lmI@|4>8g!50ayzRlyW{4To2Elz zUW}Zt4%2;i2@)t7sw?`9_sB{dP0HUcW34-TPxi(cJbUajweJRX@85M1;k)*|fB7lI z&SpnU$dkay4h#Q2@BN^TZdGF9CBO0yK$(?Oz{gi!;f9*< zh~DVq=q*QLLN-qpck`wqo!9aom`5LiMMO^>f?61LDVFL<9eB}IoD9Z>!rxtOH(iYA zQ9BIb7$Ct#sC(Cw3WeDM=n^@o0HwMQHMI2K@sF>acSj|+9@lzQZt;b}UX6F!YPfM9 z{&%}H-vFX8!$i=|G+wo!xFOg;UaN)$&P1UCnAzrvCU$+ESFWu?M+QGP_hq3}Ac>yB zk|$9Cv(95CUtH&SM5Xjf59_#ZcIXbo1zNv@)1>t40s2-JVtqK#_8okOks5-7 z>JO9k)$fnDP~Ral&3&%=`^#@XoN0gL?D%3NEl^)FobYkT-Nxv1hGxW`ihYdKq?LuoKWu+KyU$WseqF=1X)?JL; zh<@AN-u&?0nJbAq%HNha@4ldDnp9QJQuY&3DKgNnQuW0Lz4U)$`Gpfx90aBuWudw`LrS1^-A8nM~J0L`tVn+ zCSvkzq^#}(^3E&2O0P&~@qM{)JoE&EJ_IQB)U=L&VU)1nyi)1lZiJ%waYo$HRk(aW zy9S4ScYMG9_L-Ka^UbFo6K~lVf>jg#+?__=+fNP)KipBj(|w;-uH&=wmqZI3s9Scf zOkQ+LoN-$TkzYj7+#76loBeVGl{Z5Sm)LgSE(TT#+UM*EIn?i&Y!@(Q^pW}j*s)5% zi&ldqfGsQ^jtdi=>HKIuFt${2;XMPmuCd%8H7y_!W6;Dy}>bw#nn6Vrm4C&DsJ*=M@3c6jrXyJ_a_j zp<9%3q2&WSKQ05doRdx`iroQ&2Q<6Y%(;q=0-iG7y4N6jxY<2LNo1|7#& zTPoW}30osoRUA0Nd}{K_*QWMn;;>4m-3w7rcl4^wjiV`pu8`6Bm4+pi`~5q0hSIZujac z&h5SVRc7g?2@K4nOGY++?1iukX!5VwIH(>uW2eaCNA* zXr({zh_HrqxfK34@|pnG9h(D6tALQdm=gAfFiIO%P!ic&rtP1>7ssP3gAn3EIcRX> z{Dwm|{ba5aTpnuieEq;7$+<1KD8xeBEA*2`FC{Vo{^nZ4tH##$kt>8m9l<&G8UeHS z=?q)fC!m^{AMr?1@x`9rDcH$_@53W>!>frdaCMRB=N@hzp59ZQ#{>NXHxW%-qMe>8 z@*2mu4R0nqJn~|r1+9!<`RK{ zj3p(=MX2m?k!!KkYY~sR8YU0jg9^Hvap`n2Pr0VH%pWu#OCFW|SZkL_I>9|SYJU7B z48sMGKOH9v(oyd4-MDs4v8?vJ=of6CdYl{t7E$cdy;dupW4}3vYWaq#Be1y;>{{8} zTxb??>sq$Qqi>hshRF#>3t{U@yePpxmU_YwwY_621}U-L55k^81}DRm_>NF6OYc@+ z7gEwv7TPw(JW2>t<=b%cU(WeH4NyL}C2pM1kaLl1{APRcC_Wiu!Ibj4M)8HMS32Rl zaXZW22ojOgkMVFzO^gi`7gZH#3KF6f1H9!(smy4$2g_c$#K>JXGK^i4k`Sk13`5j!b#FY@U z4xrKcFi<*Q$Zbk>v4Zy_s356Q1WGEKE1++}O&6iInTu_x3I}5COYra{|5s2nqu7Ai z?Oqg=?+&Qa)!yM1dz3qbVl<8$Jb6no(7pN@0;NbW$$VnF?t z=!fe(3zB5n5e`tZPy|Y?{la%B@%RcB2$HG-sFY$KWgMl=!n4QRutcvMl-5*u`;f|52Sb8x8dIp3{zDk(R4^67P@AdZ|r zlW@p?95y&O0Xk1e)_CPvSTEjt7heE2v%$LW?|$wRRb-(=kw_3`y8vzMa@-;{o;Dh> zF*r_HUKboKmG%QOQ~cNP5N92GGMWu$2kwn$j(R>gh;Z&>4HCWk#uAQNTJL=nBZx5MRPXg81UM*5&PEXXFAtO^a|U zyB#21T(_zV8~6_3Se3w7$7LC}`I19pOHuh~;^|>RZ}QW=r(5^>F8gHpaHWP%_a1vx zE>fzFP(Uy7_=1MmA$%O8&2m-J|2!uoIW;x;WxYa#fA#TA?b>%}d+*|Db$dc1 zBzg!Z5-=~A2n7h=Gft-h>7-g4Gv2|!Kv2e1MLCYuHHI3zVaGn~8R#AOI6(Z^%RGPB zwp3F2|A&1Q1>9*rI-=WMEX{d%O3Jz{ZeaMb(4*-#Q7{d=g+bp25l_`;Q|#W1KBF`&RK>Yb&2CflD=aVF9>3Yv z>imk1&=~isPw90q4LPOnn1H3s6%Ivakwdday;RR%7)`l6nn3+Pet6}K`ZrL-M_;W< zBF?TXC0LjO5$WoXn6GbDa1NMcL`)nx0QZs-5^# zq=%P%CZ7k4tKBX_3!Q$S2&{2OKSwqHuks_Ouu^%vjuIR%J*UL^Ef z*@{UTN`!-SJ2io{**4gG_3D)lsg4bQizYxJ2>%ut>Wo&&E&~ju1@K53Xi6qZ+kneo z9on=aa(GuxIN&_oZI&QeA?_@UJ_WlCrULxO!s*+78;}G zU8J#JHA4HtA)y)s4qDTOM)>W}U6HqoO8T_@EIM_-AOmIsau0I4l}@;Ut9Ri8=*oM* zjY_F4bjfblhGO9f2+6zd?4?wr7`_J=J;<0mzebL&D186Ck7*!=u>f>udPPqF_x%yH z>B+p{;0U9S>WDw{9mT;gi9wVK8hodT_tjwVR|r_}+Eb<$m_Q~41n#K4{ulQCZy26a zg8sJ3#b?3=AKd{dqva^JHV(uGS10ES^J_Lv1ex}HpDBxu;CzdTZcd&c5}iCwaiu?P zwl@D|cQE_d)rU?dSCj&My{exj;4qg&ph-YX+=1Mt>#~Bu{naOE9`by#6 zZ-d0TEO&5_$tz8IH4Str2x&FkdZcuYH)ibI992xn&Us383mm)e9ysQFTXCo}Y}ZXU zsyns&#pc#C3CejTq;pts{MK0^`uzE7SuxSR;JUsG9&6P%H#Ph%qkl@6b;gk| z4)J;w5J6k#F4W8edDme;oq31h-$$LV?2t_OcqB34ui`&qFR@hwxUZEMmu3!$ z{e+v!2(W4n>qgvFj=mSFU&!4p@tkkM%`SQx$P2tal;4s+GtNw@xv7;sW89F@btR3hW+m~fUfT}_fwVxblfaf>>~UJ zUiq3&zaN{EUAcZ0&S!?VX0>!8@+qfuhZAsD)s)}TuPSN&ggZFYIgp1O#U!}<%?FHG zlZfBgx1UTM#opoTt8Hw#Hf*V@ys`uHNSR3Zc0JP9lHEa3NU^{YwX3t!@5PdEyYQ8f>&5C^eeaj;bbDv5Um`V6XEqV5|Lf!}apid!x3D@jXU4}8XWt})id~BzYmj;h@VvMkdLWtM7u%Z9thKTT7 z>=>aM{lIm!^%PUj!kpq>FRXpQ z>0=B$Tr|!6F^nGXrg~@9PPk4&*(^I!J%B_NbMC}6qxaPWvtlz_yxq{Mz}gNrD5$_) z&7o@ZtT@PyFlFJ8r5q}C4bh;V%3K0-Dmt1;yyD7kxOCtYy#2H8&j-vccjC(3tr_ti z7gD?3oy+_gYa?Ms0@GpEJMQU64EBZdMOFyJkcgF9B`0he*8>vJl=|Gm$PRb@g-P+R za_#!uD+~6h?c(^Q$5c;wxLK^`7wHqK?Lt)C1JriCY8kn4(S>W=5)Sl6Co^WuYETzn z6DAMBgs*_T903`v*-&cDk1&^LCM+Uv=|TIlCosdD?V2H zW56L&tIfqYRgB8i6$5E6h|+7C)-tuDndFE zCyTCRkZDq4@jQ1i%v>a~Ni7HvJ%CBB62#@hbvBaZKe8gk8O69-h{ z`XjbaK6^lQ*fb3DAFKiqF@KuamXps#)#9&6^6B3|ILj~Ai&9CQnw$Dq9EfJ{T94e7 z5MffHE{bdg@q@T^pyQ2jvE03j5Akt>&%r$UD_-bamp$)6vjBf_JOlPUjE_>dGUIz8 zX9?bSXJL;1x>Q=?B6KHYYZyJzX2U9yAK%`-BJ!O&+f(Fm1z^B^hf1==95A!%AglE^ zg(=3?W{|c8j>i(yFt+6Zrk9^N*+)E|r#`GL^4WA~f6Si3`JVw-vt%#j``_Fm4yN`j zBUx+w?MOx#S<1(S^Y|u2>=qh){@G4`@x%0XR`jzh}Qvu99`OWPP1sK}v|11SotPZPd=x;Juq4n2Tu8;EjgJ~-1HTvvtov6bSX==xw zV&qIt&wttDziCKp9>16h4q=R-g5)Pw&sj?QNnxducVOR(a0;@cbUxPv@Qh#S)mt+R zl+>GBhGALGHjN{?QAOf2@co30nZVF9Vynv=GQx4vHe_hn-Eo9MyOMiwvspmw%9J8E z=dQVZSeSGRBTU9RI1IN--qy!r3jZRoFdrWshIbXF#0mshwZ#Mf<3 z(lSnLI?BqS{3?}B87R+GxpVaB;P1ZWQt1y}3zZfJk)Ht0G81S!9&l9r*<>*o3f$VO zAxfT2Y5MPr0yMw*yp8iuddFS^<4Wx)QEO&)*CPj`*zbNGj*D0=m0off7xkG{Z2|8o z$XYkuu)pAeFhQUyp$N8>>L!!4>FdH{;7v^ZtsoM!%U_*41m4PJFx;x@3P@1Dlqfac z3AQ_bzO5zyRy@+OLFC6lQMGhz=2~sZ)}w>x3c>+Idx4zYBwFC>S}zuAS;+_T?JhiD zO=9DGUpzDHs|(L;IP~+U)QW|FVGS(b<^bcCpO6Mt^X^ER57Ko1{%nsqPlsMrFa-;#!a^wM7# zh+H(Z#EWAMaVVV>IzEu z23&YYyKy78Ahp3jHo(-*z6PDctjyl690kV8G>lr;_;Q9N(N|%;mU^Bbe~f>dKZ}p*sIEq=&o8GTVqtkEXfOtvS(sNO6oDC-C(( z>M)bu*+?z!KD&36Aa#~oGS^`tLYiI%5xo8WND0z4wRlT8{#EwBuxJS@L=o^UUPM43 zZ@V0P3pdDUy6z6XA?GgAzfKx$(t($+w$%NxhTMvgW#J_kC=mWUr!Iq!2-#8=2c#Fm zqYXu8gde!sb$jv~*Q3h&z4acGLS#>H&WS(|{*#CKABco)21{Q;c&LvPEZpY5VKL=R zpNsWNXKmEUVGfOj5)3nSF%G5P6KKD_^Cf}P9$pTYxl<1q76-&G>Jkrm4^|%E^aiCd zB(`3IIs1ypo$XL~RdAzdpZMSfj;hUg)rMqUa=MM&m^1(w7%t<}W z-z|8GJ%%yJ8~Li8(5?$8psumoGh0IvD26%m^S2Any{362CvFXme8<+mlCu2_E5&tG zR$((tZTJ7a`v2gy|CJZ?fBXqCj^L{t=gNJ7B3L%$gdaqAc(<2I@2#viV!zBo7*+Pt zw1@_~&=1$4_()le65HHXvbkd!&3qa`8&CS#oiFptlF98W6=ElVJV}zS20!BPI7&c^ z=2?<*6+}2|o#HiMj4EAm(fr-;QumYu2m9=m;ZSv+2W00m&c0r#a;qJau26C)E7b4w z!7hq>pGInlhLvS^T;6~3@R#{LAa1Y@w@j~FvHV*^7}^d4FWENmfKKt_K#NQXNA}VL z3@oQDGDj6k#6hk~z|9XRrTuzJod`}&eEuwJ{Nc2~Mko{F(FejQ0AbT5K3#(p$~hqB zkza+ogD#* z6%$exY%faASBlNb3leIL>l-e?f4uhGJ689?&Hd*;FdWz*I1Wh2M7y`$qzxehSgrR2 zd`i1)gK+RIxObfnn}gS_A$s@PSc&@RmC+E(-O$qkqj+Q&cGm-k&(+?l$S(PLZ*{I( zF7sPU12-&z;3ZNz0zi*dcqsqBe{`fs(v*rKrXt$#NtUvW zHj*SQ6fu=#i%G~}%!smvj})JXNwTFeVg}hJ#!|^TmW*Z0OeKWtvP>7oe9yacpWpBN z&bfd0Ip4?qS3T;{G-IyodcR)J)yoCF@`AM8Q*{-+pY#bVqh_UL&J!bAaFEa?m#=lv zLiHegu28?Pg1`BtHNW;=|1mMUx>Ed!jmMU~ttmP!h&4BR+`Hgi?PDe$vn>;|nH8l~ zS*_=mFWKWbihky^jssz(*E>03Zvw5!^e@ycs_q%PpB@L%RUHjn=vqPp-6z4Pxwpa^^Zz@-!Md{-=6OwR9 zSWZVi!fGfP@#s&FN|Sn^5F@dKhfe^70gD+)TGvlf6J3TYqUtb&&8+j5{>4C^m0p__ z|LW_WM%dBO{C8Su(~h*Ngq5c9j9kw?v5&Z@aM;l^-G|Y;GF)5p67#Tb>q<5#J;GL0 zJQf`dgNiX+g*!QG;zp54m1MU1JRBbrn>CVHQGhy$--^Twf?+eheqg= zt6%=e0P$!yeMM@z;kR=M63h2Fq&KDLj9PI5OtZ# z;=@SX96zW<&Wq(xXJd;qVm6XD$uJ(`HctG-xi+zMJ4(-a)g^X-ldO+YzfC9INyS8R zP+R|n``8MZvM2;|)dqo+q&kzA1<(*||H~~B?aoN}deNT*6fC%OK+ny$8KT9}#pTWY zv!VwtHyGQ&m+Ydobi<|ZW4?vVJ?@mw^x|%uqW->lBkP=c7*bc=HYhbSxQLL_$T{~Yk8?u5sYysJbR6&dyMA42>Q&9E^t}-l z@3n)7Z(e6bqqdiC0#cfdL?@oD^iRqQ*T2v6<1}5OEcRiK#j9n&4^= zpX69RTu6%T<7m8x)$E@1pRTD8w4-T`m@Z$SRQxF1ZSJ{@Of}gsED-) zMfHaL+%05pW%33>q+QqiQLTB~fiae208DUqvN8HW-egYNMZC<`PlHoaG~StJrl$BQ zHZY_6r(Sy+ruA^ zBdin4s6Epc=3?rCo2niTYEpEJeo*63c&#aSvJA2MQ3V|z9&q}K==yluK=q&0)&{%SRfo2^AA4ZvBO-$S1RAL1d6otFw(0<}VR|!A)%i=E@~52Of0fPl|0p z)5QCmZ>H5R7+n{!TKRF((sXhjQ zgzi}Ys7G{(yO>Z96S_#@2>3o(IfXa`e-=segDUC^NsUeeK=~)kbcNanmzBB#ZCp4V zR(<;D^Up!GxH{l7*kJoV$v@CmtUF+IOURJl#&|oaX2~Beh)~i zj|z3Ph&Lb)ayj(o0pCE36cT?9R(UFScX#Dq2m6ig*gb!^d0QlY_Vr*%IJpd0uOrVA zBtm}aH{Zh{oW2$-qyM4uhaRym!F%fONyA-(NS#V7!M=bGATG& z@UF!ZK5-f%Hz^wvp6+(aE6Qa)n(p^vZIm-BYk$lSMqAGck{>?V_w1GZ zmAw5D;&2y<9?7q)j>|3-b5hO1OF5>(ktfY}Ui>fsy;@`dPy>viO!yo@FK-jMRv*H}E+dhY;^-rwVW zp9)$H^7A;Y_bS3w6_HOI-Y5XWwc=w2O~wPeUW9fl zI7JfPBOZsflMG|0O|ZdK+dMA=mrY#(&Ig)EJK>Y%MhR_s&!nEenp}!{BC%w%Y(R8E z3gMg&f8vrzYD7%GSjuxmlg_4z)WCSZUiP)fiGA>eGj*P_spgP(!DL9#Bj4%ISBA%p z4ou1;5$&MEnY_i*NP#Lj{!?OR=1=*=*yBLKA_yv|0bz&P01k)IQ(emnBCVBLGZo@d zV5g6>-HeR@b4*SHMS(UyBa6I3%M48>@VICKi*?~=NMgR`Bav;Wc0$4U$e|uJ=DV(M zP+f&zxdz+BmAA-Klt%^NN;`h}E$fM!NSk|zyOxiN4tEo!J&VIq#PU9Fx2t-ISNYsu zZPtyBc?n>80Io%=Vg?NiE7z^~RA2USrOe?L;kk_9l}z{Vj+Q&lNX&n!SP2Fgy=wI2 z3hAjtngK}I8d?bj*@`JR#cfOvg!z`#Nl_K~6o_1q^nP6@u<6iC zhp&jXAS%4&eME=+p8{SQ>;0`%4qkOaRRK0_e=fkrk#s1HW?DUYm3>+!YK9L)`>0+n zitkZN_njS&B;Sm`<<}UO+_LS`=`PfzlcyTq><@qQW>q*!QsNZq#?WNuAG8G=h_o*f z9mA8O?qdrx;~+Mo1uU|kxP<4I*oW=;a3VMfmN;s1@jlG*StkH64{d!cEGY zk+e0H#=1QQU|WAx8v91@&V5-!l2L-hwPNau< zgHu*D=|ObVjm`k{`uFVO6Q0af;$Q-}KIx9edZU^bbl;=XD}=M!e}YY83o zOF|0zam}VTNN7`=02{4PCy!*nXbbp-*r>}~kF<+iZ%wBS{03WdOPea0qYQ|1d`uVD z2MLAyd5SG)#Ii<*ES1-{sUsWd6>lTZE<)dcQCf)5XVwwon{>b8t~R*`jSkwNkCj)H zfYDnHQ0i1L*4twrQp(Bo%nhQ$h--dFk+)-X+(8C;tM^i3(pyh3?xehwde2~V<1RD0 z@Y)O;*Go^>ifC8U%)Df`f_hV+)W0)UiW1-d_iY{kR}m_&Ji>b7kiE1iX&!l?NazUd zsMCYR%q>-QjKYz2jza`#2SL;JeOY-wi26MPpE%~{!y~Uo2;6~|K*IH!UIx|WUnol` zDRLe!4;BxS64YKIA7OE81m;E9v_z0@Mw0GSzhtGcpOBa)|Kr}k3b#@~YdxHyOK!WSUl)gmE z7c91=f5*MOl5a|Tx8LWLN;A!vt!yqQ+^E_VcVx{wvER}?X-z!|wxied>uuiy%-%Ew zcf1?h-ePjkLo$%zIsMFJ-1?XDrHv@bqhlWDZL4p+a6JN8Ag~%;)Zx5AgDzazl>(+m zZdEy>zeWzCIhI13T|B!d748u)z-5C3S>7$Bs5D8-J;G<2jQ}ghFMH`f*~{-r760Ie zdSB6eA0sIW`~SR3Bv-CtM;}mBULs@Q+Z$cUSV-*&RIxnYMN+AUxGou22pETyYlyc# zm$h<+zmnY(Xtl@Z_#}(MDR)S#*jF%-?zWIfC41foBJX)tDLr=)JW{-gTQW`~Im<^x z_;>7_#EwfPa6T((lT)74^hEK?y<2M&5HP|?=m#aRq8)iOicv&#&S~tsbs*HoFB^eB*SNa9HzG&q^t2wm5|g;T$Ox1mDpnVQet_O@HFD6N28Ht{pZv?+=dasX%b0Q4J? zg`vnAh<%w&$7~i^tz_TqzR?%>yEhxkjq}7xlMWH`*kbufszS?!y3$T;WXNd` zPcIlRn;Lch)ig~j&ZbwGzoWl(^o~x{m)&vUbYp3F%rxopO_W;d7&o5@1po6bJ)Kek z6(>L$JjHe#`Sbhid)B0*LQ&EP@+gN;WOJL z)2i(1#fQXZEsOJQD54)s5jG?45Y4ud3DXkj37a-)cuc8RUtKURf23-)^Br63OIm-L z+tzerCxTM&{bcz=&E{BDGedH{({%C3+*!n!cU4DbE+?r;Rm;<7N^)P)r^>QUpG@EB z>}TsA^ob|WrfQyQyzn;KL;5?m3B&nwU^QD8<{^=SOm9c}ljHEuqPutKvVofyp;HP; z?%xJZYdLuhb_A-l@!xv5{IHU^Cm{?HZ9X8Df&GAz!x|l+Eup1}SUl@=u)$i#@nSix4w=XLaWEf6P4c}IQwO7TK*@`BE-8{ zRRR_#yq;8eV(ork7}6ijm{Qtz;pl77rP2Sz5>q3agx? zS`Gb3DxM^vq2-UeA@>-4E84W;xhJ3Xe2h;=UhGsp(KkP}zdeBPcBXrZK6yZSO4oZ7 z{Uz?dkOci-28sXq3mR-`z!q?p%NY}|Bg2Wdk=#-Ws{=VrF$W9-37GqXKz<8u5DDd_ zHK1h)k=LS6Mm7O~t|`yh4iIf2{J~FySRv{-CY*(mprAHiD&|kION!dd(zP8h(9dPgQF&9fBnUXCs?p(7A@8>&k{I2niZ)jgZ)?UeT z{TH6-N`5CXQ>B@-#ShXB?r+90hKp(s7SBsx^elA87*38SfoVORZP)zQP{8C*^2((@ zhxoDZ)uL1MmbKO9>Qv zn4HQX*fwyS+ZlYFjS~hO`=s1~hlfYF&L7pH_IRoux$$^&U1&z^4F=FeXD2Fqflk7(G5YmFPEDJsqF@D9YE0 z{d;i2-{r~)A6GqJ_BpL|lI93fz^)Czg@t8<4 zNGFlwTXUrdgRGEq*?f#N0;CzfGbUR6FjbC^^)Yz0f^O;Hgy!j9A0HjAb&b}IH!YIm z{jjy0zsWfXQ8TFpQ>H0WFcz;nac z!RTM$ZXQ;-x72zCjw-uZUg8u^O12^QQ*h!+kx^22xUObTMC2SfnG2@y8`makN%%Pt zv(|i@p;84dV?ofrxC|Q5qy7K*5Bn#+s*N`WnTX;DP}h#FnMZ99Rw16s{y&@8n@wD|o?GzLaD20X^jd}#KY zbHx^8I~XW}VVwBTIOo>pVVu|fzWZGV^iqa~npW>csZT#~I4QZ^Bx~rr^bbR@z3o@5 zCrg-4XS|wpFf-|Yxn~1~ciE}v%C|WeMXQD9s#@Cnw7w_QvAwh%C-g3yJm|9LF8X8A zV;porCyBXPHPm*4ixbhXOXH(=m|PvVs7?7`q58#1!%n%9k4lDv-mX4=JKnkZem;5z zg{WQZ4K(!?3oi8qDzD%!*0_b%T3)QFWHPG)PR6?MXD6(DHQnO$5*)8?dwA0PcmZnF zBh(g&W$@8g$AT+33E3=EfHf2JlHx*Ks;imk6=(7eO|yO}aHjqTMfec@0($}a zjd<9`)&@~j8H<}=wmzKih;%eDRn;K-lxzZSYN_ryULl{?X55msySDe6qF4dSV*2pV zTibF`WIYPxV9W6ruR9En36uLx?D)gVd{QhFUvIV+(q`llBPcLsIlVvNHy1q!^P>Y`mV$?T&M`F;wP5o$KA_C4XatZs79= zpF;lv-0SMMV8783_u7CKDUX#mR4t}Anxot_vIBM##=^=i7`eA*lAZ=G`+%B=q~fu3 ziV3g;c{KVf!sPWw-KvF2S!&(H=2`SgrcL^hU3dB;xC zS2ncT5~g;e#PXyg2#y~VQKvF~V&5zLC^V`Gm3y{ekh^jb0%M-wZ%#ryDcv zYEN!DAY>!v&KfuvC@Ma#kZQ2LoVs`W*-hcWHvj)(6L4ZkEQNu0p9y|Q4k7@nMU;}* z9NQ0+hpjpfMQdJarNz`4i~M`&PQwlj7^xb`gX{ukZQO|UX$Dgn$$m?t1440?v#m`H z996xhr{6I#a&$$q*-QueAiX3OH(}pd{sJ1))jw7;i2Ife#cf%e7?2JNvwCpY+vo?Q z=o;r5LTe!%tSV#Rwh}KOxqN2X74#-#uyJ3$V;%La&6=oZuRWITC-ZQ!o}gjWFp7AX zm$^mKwrS}L7$kqx?02P?%X=;b9C9A%@Y(Z1F-U7ewlMTjMIvX}F7fpDn%TF!XKL2g zvavG`HWA;$kM_KC6=C!ISI8e<%6jI#SNm?Z0zfn#D46~_AB#SD#EeTtxg;Hb3L5SX z&$KMI;8?Y&OSMqMwW44*`|C1;&B}!+!6Wr0xOwe1jc}8qYtWYx0%9)^_|H{ZbM7d(D+@7RvOsUFJQ#9qmQGFXL)!HP|c zD03~$TvUKCYv;q!nR&5Jp_mC8Proq5vNOweNt_h%Iv==s&ZahQxdF2(?d(d1$@bj? zHtr?>J(kthw?)pqdLNw0q@$3gV$qoto1W1`Wv4cIn|)KMgou%A;iNAmo#o<#M zwNd(jo!keq!6I>ZS&<#26GxOT=6@f32b(2?=8`=)oROjNZZAjuwnl6BVvm_ncYnEJ zM$Qn<(=bmV)Odi;`WxL(`x+`s=!E*RK3RCbFYn91r;MsHhns60624Xsw?t)JE738 z)W|6vOi`NnvAld{8xk?A`|c@9e3v}>1Y7D>oC1JYR|-!j;eyRIB2Y9o;L#4+S8n_4o{TXDi4PE$^K$^5;$EmT~W3aBj?(;mgEM{PERX`4N7!y4H33A`=JP7vz4LBWg@LFpK$r5}S)csqmw% zwLsJ9*Rm*n0p^~aI})?`muv=}x@Q@ZU7njUAEAQ9MS>#&bgcQdBV&`?1yF+WtqQc> zUwP^9MX+tsKE51-MeSMH6Hl*X{AMv+Nt|nDtX@h z^!;2(tCH2~w6-8W*~hON!cFY|$8~{qXO1RgAe&4{p#a7t5}jcUpQ~mV!m4GMrFlA;@Y;1Ep8t?oKlvk7FBG?jWTF=MBR=dRN$yNTNY z;3IeKL@sVz^`wHm%ia=Ls_>OdSVrUdYmX~)(IdSE~vnu&Gr+IuDsrpavDC?yKq3x^#f+3{%RyhV54{(o{6~==%giEUooPt zpo)5~HI;3)u}hmq#PY7Aa|34v`^7S~d`dWA*2q4Ydzg1{18EIuRW0#v#qy#PNb;zM zSoa#@j)UgQMEl^qQ18M@#T2%HfIgL|a`6IG+g`}425G|~-zyRWljPdMurZ9#Hl+`e z^;l0GAO!qI)3!huLUERIxszoVmInfH8+2By?u4b2^bUCMM9<%ai!0~e ziZSfAo_lYTTi)1ww_5G9rTml8K*Q`wrdJ}Ncvoob)U8=X@2@qbpM;a4chSZbohtA{ z&Cct86s#RL_ey4$Lq&hf7MNpWp`8BhcQ%ABE&mADlS;|sgu6Z87Oq=xxFcH=6=o4a z(vz_FZZjL&w0_^;=eCPo2U9-a*i_Ul{rQR~F*~;(B*->|6WXPujNnDpQAv`P9!v3y z?$oiC-V4IKCi+>VRh{nMvZlu;lzqIL9h;-`U0kTI z|Mn~oQZ!1K8~o~cZKy#)?Btl5TQF&qAb$522Xax%i$Vhnz0&h?15JfFKqtfg6c|b- zhX$%w7^YRE>9+a>2KpUL8M0MRu~GZ@t8vw{|7C)f?tLd_VanInZO3oZ{51wUh&T0= zIsImmWk*hqd%?l=BMs*1PmUy|J)o|J%Uubn=9f^R{i4kvuxOD_9?Tb%=Z`v-6?l*~ zAoui!E%_H;Ye|(v%-OxC)1hw5!>9c6oV~PiCuRIYpidfERm9GJa;maqcB59xSIWtw zkre5gP0$jlWX{Y~Axm95Wq${q{S2Ji#0d28Vu9Q;2)Zl~<5r zq+X#L(lRQLmauW@)qm}EI(>M7A9a_{>BLgRxuTI2@R^<4p` zc_c{LEJ_ z0QnCU5tNU!zq8MR{AYS=8x|C4;6ZItp)U z!%U;<-Z) zzFjS_l_y?+vXc3@=+u!*Wj{F}OJ>Eph12_VDIkr!e%`o{p=_!yxj2F>EE^-n!Z0wh zfYYUF<<*{*>?y1(2)k7BX$J<9&VJ#N{*PF`+|la{_%)Ehio)=3a?@KeP0Ck^R-ySw zMRR&DH=KC*po?Cw$%z}-I7X5z2YD#DB!RTRG@(Bnon#^jE&p-R#1Zv+&GuaJRNYrn zz48o1PRvJQyAGi z{&Y9J6WtuDEMS;XJMd6jXn}Iuq}}4xB*|uk`}JOv|^s zpOs!_mgdUKpsn?;+YIS6pPt`#XQ6{WK0U-=_FFRDvlD*v-eLVWah-?(RJu;-4+Kox3l zQ%%s`B&BQWx;5TLEj#6Re}1EW>8{F&H8=kDSVjF`Zsh+GC;i`QsL3G|=(q;d{|Ja( zXQHZnWBIa~j#@Vbj;R2(R*^b z-CTP9lzXW1fLd@YBV|{7@mk4(qu=~ykieJd=OjbAVUrY?@ z+&de6P-1ZxV2XY>lH(n7CPuLE?IOO+<2(;7UrmqsRs#)ZrYrl#fVDBE zt7A{+zy|)m;NcQWY;c2tyEr0qgj{dNKyMxJB5mla2^knpHr&tdA{A zNhfwj?|qj%l-Q^40J;7s7XQaWJ0$}PgyFDaBl#gkzHT3q(xQury+F|U zz-4GPXYgnWO|QnOu25G%rjF3Jr&x4AGm@x4RJoDs>7wyOMh)s6i+;|?yg8*GUvwS) za|UQ;>rprtfuV3Lng(Q6%eX{GX%Gk_P>c{CBG@`W%*T2vM?r2T_!AaE zypyO1QKK6(urcwY!)ShCH_^Jt!%w8mo;J~X;{+^=38FQ;0lkgru9;Zw4)QHbl8Z!b zm}aBd8kqL5=Bm3e)H}nPioMviFc@0d=V8`#7+=~;{b7-Kx~=+J)6QEvUlgOT?EnC@ z9G!WjDzQ>#rc1au+D11Z$+7k2)}8Ql6&`!VnG8vbq9-^wR&=Iz?oDhsP|Z)<_&J$T zSEBDk*mUP6{Uti;-yHsixrm{ya8Kn*8Fn<6DXpE96u@0Ijwv&YG0|B*J1KvHAEsyt zx94j%aJP&*jy>W*8VN+-K%4s$XyrkI`|>^DWqi+`ms1VKGrR|_^1AN?-bF9aqnr)8 zF6pIQD-BssMd{fJemY`wv@C`|g;psCS$slIos1}zAZNqE~?OVH!3ihX-cuA_st zFh54iS6wNPjHpgipPQUn`aMozZINhmZhYeZpc-hrles_91*mU#b4k>(;FwTFzdz;F+ zTW->{$)En_s)_Rar z;I3Yy32~=(0EkeJxD{T%L}78Ifc&|LPhz;~vChIekKgj2uvl3;=+-LWa@~F_nM=}BL2q)xDK@ft)!AiBd|(L5A;J96~JOA#k!BuT{OGf z8Tp9QdBn$$Pra{V#J33BZ*vOMT({LpIl=PWY@lN4Gqe7DtuF>aU8jg?e>sJRjV-SS z_=rqD0Pv1Hua%QCu@l2invxx*NfR}YFk$t_o!!59vAfIv8C2uQ<}2?ke;>bB)wtq@ zud7e1|Br3k6rNrFV3IFXLM)*)o_#Hx(v-^CkOZ~sD2UEN(=4aIno)hIUF zAmj!!&F;qQpECuHBR>^NG+uOi`j2o2GYW6R8aah}AC#H&+wY(xVKPF6DtJi^n0S&D zT>C7#MazMg)RcrAGr8=_UrWbtBw)ekj1#L*kXG09%u5z}_KoPWHK4GXkiJKIdW=9K zOxA?*-0KP5!BrCASX|9QJmHxSWWbM2QFyeCAkH(8`K##_(H8dU01MSaqdS|?iDq)} z{i1>^TtZoM*8VC62y3EB*Q@IG`PA6(2aV-!vK!OK;u-ku&V*bO>z7~0HCRofnA2YA zWEMz4E)R+cpltxt0~`)9KXfR2giQ5E1r8r>Jn(9A7ReZ$iB)8!PkNRPS-wIdfHNnF zCEjhcXD9+eLL2Lp`;~UNQpejzF|CTf4ueZA2OI-F;(BIjQY`ZpB^C?WGGo{xi@zqZ z8|tux+cIXGMfMP;S;gDR2WJUuQ$bvos!o4EHnpvI;*BspDf;3EBU)5I?e@{mdFK=7 zL3WFtvLV}*a{77$H;lI%@;ID+Y_llv*wX4izm2Y9pxb(l|v(etzi_F&B< zyWt~%H)t2689q%PmThn_C_ym539_1aGTngo>Sww|desX*7mt1Up1R|nYo%v#RB}B5 zJ4y`!sn5C-OZRZG+%!qs0+U{}Q!Bgf; z1hah1S@(*~?RSG6Zd!HE^G>I%6?oF!eC{e~Td=>kqLMvh>q9%u$Etj*jC0T9j$b(HqaIiT3{TbM z(VsM>tAsMKOwRI7oQpvQCN7Yfh+V5sJ;SzQl(FZ3zQ%#_YJpd4{MM~H5gK3@3<1O)uF!0K_fsrGTM;17N)kK%7cC*&soNVR%x z{5sV#d2qS?*VQC`V>-(1zdua6U?6i!Tp55}SLtIUhxIm5P>7&WN&lhWQ~6JMUO(8) z`~2_9@BOE2qHcGeR&s7=tV#7rJKe^2$JRnCnk*)P`cXeIHpa%) zketj+1G+&fikJ;mG?G-hX(n!?#&~&)`69Xh+>fy7k~PLrelJz7GATNJOc#-+g+G6Nd1XJ zffYw!IpqnldD_qY3XuM$CEwIdZnJmly2~aM@3riB^3TCvH{9R9f4^_@v+{_e+BoUf zSP;Yx5J0YYT|S?-$#gmyBA+rc&CpBMi47cenLZ`Ib?zgRXLY*p%wzGc2^tj;N$C}_`iAZ|%<==eU#nh!e7gL8QE7McQImo%$ye)F`~Fnv zth*9^Pw)Tfv5;5-wBhRfmBbpAWp{CRh0AIrPM?Mx6KRfCGnKr~d+OG{P-@S|^D!Gd zm2goD&KB}%srE{lb%k$6J_n3X1@04ct4H-s_voc%^O>A(&Bebe%Gi z@*yNK*926lO)ua!>Sxu${d|Q48po?bd>D$37P-A9P)SkbSlK#NqDeWV$-=G^?XQGh_LyO;U^EViEF^oF zRlFKO{8{3I{UU3fNAuK+7Vtw=^ zm0cNcM>Y^1$`2=_$rWk8K#8ev1CpGBs5OTS=f};HH-itEwH0>GdafN;^~$5dzHceF zw*BevrP3=S1I5{Swt5>UI1vX!9%Aa$XCs?Uq)KpMJZjPpptRxvHsWJuZ zbkv*vhj1kr<@}P(H_2q#b6&hV(t?0m1E5#^7b;w&?fY6WXfN@fkGF4{!4q3lUx*|B zKJpSBaQV{ZlMe8^`_`iYzJ=zWfllC;}7b^XjU>S zPbXi_*slDKM7zXJRpT;=L9n4h?!Zz2j_ZrygwZ09W;tU{bdZkmmrDz;13kzJE%0{i z9j?t8HnDH$?(+^ktn^l9PuqNIszRDkYJyZz!FY+6FzvB~=$yEd3!Ue3LWL1GD`{Gau?(xNCOqR(YfR;UcRa)0`#ggwY83W%Juxc{T4kw?5V8M)HH{@76wEGj{2F^EA)AFU?||^ZpC{lYAB03C%QkYIe|U{~mt60v{HkgF+3!B}8r(avtKUE$KW5>c9Sp~;B7F)8YSxh#ca5Onx)jZ5 zZ8K00$Ewq@jWfc;_-Y@dnds{&0#N`I?nRcp&DNXzxDe(WcCYn93H;*$EiBr)vNNy< zyUBB8FMCF$l~2I6pj21Dg+PYCr+pv~csF4cbo35%Y`Q`;dk^);>r>Uv%wjI2onY%1 zIZZNmA01YUEv6pyOHpj9Q{cI~QcF+t#%@A)dLG#bws{Lq8QbO&u}$ zbu!sDc|+l$LI7W`G5O<#_R$%n0Jk>Nog0^qZe$Mh3$G&2Aw|bd6aPG9Ge4RY7J3Q( zJ*5Io3R@Ah04EFXQl!Y8XT0KcqAPWdXZD`gnqXM(7)UM7rFw02o=ESVw?9Ar67w-l zq&Ncb78VA&LK(CW9P15KF>!Dqd#$;jJAkXW!Q2>&^M1s!`JU z0h`vracZhk1h=^dH%V*^F%m}7coZek9k9c3H;ktVQ&SZ=_aE_XRVF#@$*!TUH~fQL z-GV&xM+OInI9HvA9i7^gS$Kbwy-!M{7r5Z^O@}L*u{+51N+2?UIe=$@5*}v=^B8-R z#%aJwO**LVhvqkXkyXU%e>S_w0Bn@dG2pk-KBzYDdHzpFTwL)2Q-0X_tGA)*;bUgh z-0_gr_isrqDk3e*dLn;hO_3ai-@>BeSce%@#fN4U`X0CU5$XX4C06ppUH4Vhz}O6?o_Y+Zrp8COC{;pQlqOpx?1wh; z+4sFKYs?g(`~)qNeZ|g`4t=Gk6l4B08I`aXRPe{@dJekw>9=87ReAY$ZuI2_(}&F^ zfgn2?yyQ{w2otilMFT8p7*@!I&@E=l$UfMT*YOxjufq@ojgFnrkLp~)pgAxkrp4%? z6%Z$07UPYFBQ3r?{&gFkXSE>bwTa+f6M3d2ZtM~rB~CKg3iXdNMOzGQkW0Yq1QIt7 zH>TS^TRuuW(zSqH>jLsisW*5t+d#;5x^FK3YCr~6_Dc8sCzBJrD+$bKJ#37@M$I_- zKZ;jMx&p%v+x9SwLm_m-405nVBtORM|K(mt&=JP3{Id{GmLh7DMYHOZdTX|%m**BB zb1clpfS>x?iCO|1Wjhc;Djw<9uU-a?4e;u|pwv1wXn3N9A4A6}%C?2f*`UOJ{~nI> zza{w413Jj=-%~Q!1|~<3Xi%k;Fp>Per)NHJz62R;uZQ#=l!LzT9h}E+a0>k!vEe1n=FPs{m=;aMw>nzr&Oc%FtoWiUvGtRKD z$H|=w%4n?E#PVD>bj`UzVmv)9Ho|w^(C7j-tsI-iKm}*L<9{-{W1Wa5y9`?{E=)^& zA_s{HeK0X*IcaCd-KU(6DNbgH+eHnH_HCG z$sp_YJ8PxV`Y_+oztNwtn-N-LmR_HBAV`j$bd0Kf>zp!%n=nM1R9n|XY@oZbH~EmETk6pVoGZY+etX$o~{b zL)`5WRDWAU`5asKwdQwfdRPO_sddd4v{z;Db}2j0+K5Cd=9nBc;- z?$&^YNa`Ra2P+i~`VjdRCA--o{h$IuF$ngq?fX@;@AZUY)tggqymn%$$&%o~KR^S4 zo1+Q-LKox&I2NQm7AvS|EGLM&R&m1TkE1U1y@u;mFN zxeX5r0D2MfnImK!ud%M2R*<^{CZ?Ij4rH%Rf=%^dKYJp1Qc3&S z4c7u^M?y%mcbL*=o8#8jd(V7&;}yTQ<~sWGe-&8z|EA;7BNSvOxFU_4n2;@=Q)U5S z;$}>|`Q(8#;iEn}?T>bc$BiCbzHEXOw1J`YOczlF4r0|Qry8bC;=1w_me8>W>BjLY zmW^5Hx@YPY@CF)>w$?KlMJ`H7LjXYu`?NxO|WlemmU6vMD4s)sy5q#qIBBivY*% zG*EG9repD^@%+&Rkdtd{yf7vLVomwIk}rC-SNkPrg^y7{v|3cSiF+d_u{Z6--C?p4 zN(A=Jh$K>vnaT>qOjdLfm;hv7E0G`SDOZ0yC_;D{_PrFJtmy0kdZ{I5kWqV+-)c=? z)1w^!`rvUXpfz_V9fG4{#XAZ4E->x!LJ@Z(Xes18Yo``_8$}jf9M7yx zoq;O8-Y09{Tc6fu96jjsJ<^I@v$*wk&%#k3y-7E;R$I>@OSJ;&LGA|TXc~p#n++;@ z6d#bZh-xsN#axU0=37RJ_VLm3t)aY@lv9wH#+Q}FZk*_{@gWy+2Cj{BwxlQK zbdRa2UvG=udd9K>L!%Akhb(2k@Cm+Dl=nlwK*K>%TX#6gmjrxu3`#wAz*3mdeG{qY zFV0)5T&xE_@Vo~vYg0yA4~q_E4K|t?mz18~T~!{9OJXVcR%pb^HMQlYzAps-x&ixY z!cYk~j|V1Dn4)qVBl_2*0In(Q=b3Xp zbEcTJtQRda8zXZ9a)p|r3c8WlX`SRtNRXj} z&q3ct5(z4uUc52euelWg-0qvm(>En;2q#eJ*i(by84SG&2EVXiz0@y8tS7lE_U>kk z`gKckLK}rVopGp~#ofaYCHK65c2|+z#3tR=w!e!ARe7Lz)x&`i=WF9E-EkO%# z);dqnjMjh>++otl5wb_cEZ6%Et<~@6*YtXkS6YmKs^a5LBw0Fecg0(~cZzF2su1rwt-j_Wi z?-N+0YGIWbA(&CXgF__(*=9UdOR9V^-%MnYP6J7D9=U?hG@*qmbcdc|USyp<6?^&J zXQ5J}DT-A#fs^k@Jxo@LExkYrJO^9l@G;UYObHy=*&B*KccC>2>XEqVgH zk6cFVR0L?Fe_9i8wuVL@m2DM>Qv$^tg(L!64Ej)>QL=-fTwM zjJNI!NIO6*xm_`9usO%%d^OS}umXb%D-K@Km@a~X6~@v0#sU!l?ctO@IzmL9D-uO6 zGxL!UT66ifd^fP!=Oju4i7#++n^%LO5x9A}jx3+)9@$^H*pqBY-4f#4`>cgqJfm{8 z)EcDEJ`RuA4`(w*bLE>pi_sEiQ3NM`iLq%0tGx(S6RT*-d4b)S;(#w%*#~@o4?i6G zm#B*oWu2!#Gh>ssdt#V3M*o;KqSY`WnahkL$E;$2A+8Q11fd2!S?J0?ApTU&uk`B# z3q=_+><+Lb>L2B!7nSuCN}=e#EU}w|N5tKlcRa_zY=ZX7kz!ir>HD!KW>#4Shlj{s zYrfh4ze2$NpJ3_#{jW8P1#<~vYvLU$joOi+1KcJ|4aMgY(<`2;x$Y`B!Fj6tGw=Fc z9p!TTwy%Wxh`S?a^(S-jQR}XK<&HjATG5bdh+BLc5=#8L4@bPJYs|Du2nxsNQ(jBh z{Jjc*^LD-9dsxY+NFG3EoPbH^Wu@W0&anmrjB}ouRpp+)tn~LRO=ShoN0=CEd#U$q zJ~Zx*+&|%{*Sjui%eE=+JMV7yz*N;Nl5;4{g*eL2`o~Y|hAYhKHw3SLukari=iBMmh(C`^|w5rN2bQ0d7_lH{L zIj^1{q&@#@aPjf{WyY(Q?tVS<*SM0O8|#MVXfcU(dGlZAEv|r0h`vX95lRwMePfB; zbi>w>J*xA#%l<_JwBe}8t)sXvlP8_LFedYAw;F3Z9=P0y*q?44cPsCoKR`FNuUWf0 z2~EfSYv1fjscpOL}R$g}&N~bir@YLI~zYa`DsRS`NQ{*b>%Jh*>~(5U~(Nazlxzk(If8!XXQi6 z$lqHP-mju|QNA|6JY+D4`C6og;JulG>^;jI_-1LTw+4AZ~*6L2!c7 zltHcloJQM1`Yud21tbK;R2@TgaI0#rtfYpRUx+ zw@@4-8FxlSP8#*sSE~DEee3$Pe71?v4AvufvqNM@*+cpc`8$Tjr&jT)G(l^mhlOWC zd-R8Ftw&+#)Rx$1(~Y{>Nm5lwRAkiKD!1pn^J9J?8wmtd8NV|It69QH`WjyDe|bm& za``7M)&J74{=0Td1`JH%HRSKkNN>nWcS9u=)0rPhfr8EZ(|>ZSGa7KTNx( zmwlHu%Mr=rElOK!59T&2_l7Z}e?QM2n`lE1V)=K|C)4@*dPg4|8^`_f!|S;Dww*a{ z=DJ$!$&IG9IxiJRM_u~0;!yDemdmdmZP|DEz0#>$i@=7*Q)!s8rO&W`aWTrlywvHM zQJC(Q4VbdkUI^|Bn|-dJ9nh@RaF9HTTXULycwu4M0bw^AbayeP zuSX1deL>#~;R1wQRYz7a*crW?z_^Bi&zwa*z#bJF3YEqz%rB*zJ<0GKY(WTCp`vjj zRrBNb5QAN>YnmR=yHSq>mB;;VJ@mzFQTnd(f1$QYbG!~7v@>YFOsvh+#on`W6n$>9 z^(x2VZYgF8?ZfFil?vY9UtsbO?` zpK!?*uluA?H$<~6u4-|$OW9GJ(9d7nfm0o!tm6EM?Yc@xEDNfBR&r@`|r zyj~&<@c}K>!ZYbeSv^W|8bMo-?u>ScX8=@>Bgv9g(3L14avKR3&f~jmF-)qOyti6t z1Emy0VVx2#D*tz24+zL@Ue~@QqP8!|^`lP%O^&!xhM&|DeQH^=>bAOz(pvxrbk%dT z=s0@RTLAiC6cDE=Nj+9=LwK9y2c$^ok)S|@L}l#oVw;rE>hRq|HW?5-vTvFl`)5a)-k6?F8wGAc6X6Upy2v}4r2xN}_pfXHt zF{y&^om36!Ir9esqB4Z-W^ACF`7%Y{{Lx-Ra?Kf(;!x2mFdaZ!Wp5z882I#IwhP#n zV&~TjV%1NG?*WqDKZZ~UqkIPi_8~MMut&8@bF(6Ces>p9I~YLZ`IIqT@5CipSOC;3 z;33G4FGa(T*qvqyozdo{0)#5bdYpBDWa1-g$m3^ddGKE^r3Wz&VM#Cj{7Jw2eL-;h zzcgJ``esuKd=fT_Fj7tL4!}KAgV9O4Xy!t~R_P59hiPUsJ+hLXlu)0iCzuORA*`qK zgg+0{7PLtT!c$2&K`tVtpJ(;ndlGbp6(QGpT$@@4=I0&Ib!cdxcN=yrOc*rxSiIV8 zt2FmrbZvR+w}QIvE`3B>fc*eU7c#^^X~fDIl!Dj~=cOBT&y3dW5xOR(e5P@4U!I5A z1Q>68uV-blfK>Pa`1^Pz`DFfP2rbMD5-5R~CLdDNS$cnQy(pkgsJvJ+Xf8!R;o<4K zGnwKUZ;o;hKIT$X6+XMB-Nerd45Ye~bOn~b3mRa{)zD$Aqyy3eMoZKLx>hg{?U)F$ z1|%#int1OzD7Slkrvm7;ukjleC9g)V^j{jXG}ELCwu=>uB8Wtx$-Id-{r=Z?Q%6(3 zv6hf=WZbGIct}w#m{mKnStBrT@)k&%#oFfvyzsF$tQE!ASD*2~e85q>emvZuW%M{p$?l`NI{1nG7xGgds3bIV7Nz=(7cXV zc41ogWcJxH+(=VsW@)gl$CHnfZ+El)dT;BTc{zKzgized(6)(`*haMUpZ5bkGk?<$ zFj?Ia8paa6`z%R^e#=)$J6YdPXI(0HDhYWw9r^3-+R+J8v3q@;_}rh`)^8=T9-&KR zA8M3)v|bR;+{$u*XFUIpK+V6qUjFHw^H2U0-9Ux*7|-uUuz0r(l!wh1E@lP{RuqAN zxy?6Gfy0Xei3#Uh2`b#}hNVh`#!YP#l}@Lt`PTP^7vZD1vA9sP-xm0V_OUKMR)R`> zVE`D)s^Q@{4-R{)xftub`Ez?9h<}*nmB1*b5c4#^gm{`EO}i_{jpOTM#?xl~!VH{K z%CQsf)}@kTI@jwMzrQW}*x4Q^A8cuA#!g=Na6zGutWpF8a6#k*wsQrzX6`zA3s;6e z)mUEgzRV`uJnhOmOW9AK4u37ZYh~hhb>wROAKZzVD9@jE#Zj!llRrm6Hl`sl0&2Wu zV|W%_BM*rcZYy;UBit(E;Rbx68{t0;Up*91+Dk)hKaaCIw`|0E)_-$+s^|ifCjQrV zxr`+H0~}qI43TF+5=9vbTSdy*l-)J>31enZTfTM{c0+K$Ua@gzsKw>JziQN^MH2bL(3#{pP%0~@$L)GYRxcWFa z5q0bR{g~KVYMlJgI3BU3UT;3IGn;NKdR8r9Y?eAfN&GxN4{=uu-HE&9)t9Nkk%rFGKr=L##a zeWqvL4REuK;|~ZTV%mV0YxZDAdrN97B2$R#rNzze`|wKvh}cwJoaB*AHOFo zEz79cMTKxfu|W|HjSTxhWgGmq=10vcR(iQlt_Q(c`No{3!{M#U9bCmaA#f_ncXBng ztTgEOd}e4N=yIE>S3~4?55p_#T}Lxh!Dz&OEEhX%wLA3>U5U5HlX z$rrVw!PZ(MT;oK`+4P6KdK1%=dV`kbCU1)$6z9)uEX@dUeE~xr1hP=s7O-^5U?(4; z@1?doko|?}#vRcg1C&Hj@%%vmJR6C7CATB0$J?KWR3Gxe*+%9X6hC2=VPhW-%zP6o zRud#TbfzQ@O{?^YLz7XPsO_*8JyG#gLEC~(2v0-mHq`@PCp`wthoymmQBS_C7IW(qQ<)9ftBX z@!H^#?_<6`&cOHP;67>hv7K7^-tRvgXnnLbZtXWwsV6!&9{SC12ClYIy$ca?)a}dPjf}RcCfyc-Yb(rJ{XySi18PzL1BH z?iUA6Oh*Q2iT5kpHhSm10D18XE2sB70nh zEOE5i1r;bhIN?kF{=P~;-hV$?moL;ubY^|`KabyX!gO&S%j6@5&F=~`k{IB#WbUC?r4`_^hQ7HAsElY-$*@eSQ@%r#Zma7 zriju*-72+EO8bx^K(D9tW0k?j()9*uWBztI#3W6tR*z&7ucSy)rNd zq%LtAGYAA27O1(%8mE+dV%>PG98L<-kqE%09f%a3$Pqnm)5ciKz!zj7UM?rLV5wl3 z$Av}T&5>Kk*|rxXT$+VI|J0FC8Zix_Q17A5ie64`xx_DrZzLt^t+JJI^qqrbJE2G9 zV0%t?Cwgm$O3+lRxqi6992Gj8#5azYAEfm5lW&mbs*r9XHT$s6SAN({z0YR@lsGiI z2|y$34ia0=6_HYV+~_R>M0EXPY$)eM>+s(%s(w^_DucMEyzo3QVXKpG0QJfG43SGB zIw;l#1Wp#qjY)QGIgK6usGbgrk{F)e;#dNCF*^}(f*BXC;*%>oVQ+FQak*Wx)erI^ zj4UlF&+lQL7&1RIv*Lg3n*+R?@ps~drpRuJG4E0c1iLP2JH)3-1eKb_;*5Jzld!-r zfn6`f&GPNyHBn;sQXxUv6gEtC}a%nu5360szYpW>}^?%AG;$9o2Un`yfLylHd( zt_0tadVH&%@4zK_PyHYaeK7ccL-n)i-zL{(Xz=a=eq~exN5>;8p-q4!>=$oQ>rf3vUhjCeYb=0hQZ3; zAWxEhcTgjhpZDu=+4)UpD~E%SS9iprQSyUO$cG=#9v6EB{kHX6#&4NDQD4IDKh_6E zgGWdiT{&1L7$RGdH^yit<`#YV&ck{b-f^v*-(g|$dAOza`GMDue}nnFbU9U&mB+w-nl}{ezNZPQ9{t>(>}PY(w-jy?*7&z1Cu^YY$MDe@_;Vv`^>+6 z-2YSv!YAR-j@{WE_AZhF=r(?8*8dx3?oYZ*HRa%7)! zJ8CWRHs{oi9VLf%-*20ZcYrTw2S6nvLkS6TsUqJL=ZqTPp@1n{7RpYnDK9A9Eh!=t zLBw|M*Wy_H-@IP-MC=|G`nF%f5!Y%rx8x7>pPO{;i=*aVO`2<8JxZA@pc&tj8!v0i!r`k~a_(>&_|Zbgwr8}aUZDRgVm4CQe`E*$J& zs7WzmZ7(Qd)A`FxW&7jRK_+8JZ8LqVHiS_F;%ci@3 zHk2D_HSiH15^J7@_$pSv2)1QC&C;c(Jm=wbEAO#3H~41dhMDCpJ$+_PdY`rI*`xeh z)Uh{_b>WlGMC)uq9S_B;G@E%gP?L zgl%6r+q;$f@Z)UOln*}UZVbWEUG%jw@Zh7|bqca$=pY2lkL1m?4Zq=60T`rpH=cXG z;-$5gkYKGl)$f4)aZ-h6z&!;yaS8|QR*O{on&z(t&_UFI)b3PLOTD6-R8UHWiD$hP@{jN)w5yC z4EQZI9o<-)pGWpIWcJqX1XJ|yV1xbP1i#Mc51E2_B~0`1Qg6)Jm;E%tPaWF8@pp-E zX2wL{4pZBBPdops&$C3cjERg?{&w}w#j@9dko{2pl><^ms#4Iu7Zw3uT`FT(5 ziyNxSb}w>Hy9a3%9cpb;vRm~gfdIK!pmLbhOcGjjpc7HMs33Tl7Y{<#shwK@V-=uX z+b|T~1DHf$R^@olIsu}CH>i2=bW-L+C#Etzi$@zyHtkna=krYDqt{QW~IALz>9(?UyzKuvQb(i$fH*{$JkgAp)`%W`+1ACt*rMWY`cYY3tN&aRxDXPJd3SK z>arZ95i_tayDEvRmeBI?+W7CM>PC=y0==!5L_tEEq;Oe)ok!$sI|>QKl;WxdJoTBT zfM3a%ZWZD4cMgX4`0x43a#i{STy8(}5llo<0BVSV-%DH2AX%_b2L@U;7L#12HXp*` z^7SEv__Kg_4=p$hZ4(=I`5KfJ&icY7PVBTEDN3w#uL!8j!j6eP-&-=%?cdptbOZ^E z`;|r*b)Ti0#S$;s3+lCugfryJLqQGMb_#lBtP`htZh80zt+JSkNuF$!K z{dA^_xCX=TwL8Ta`bxG7v(K9Cz2>1(?{;O#SS0KEohQnOgSYiGHQ`3w<_nR zUDvcxX#ZP1lj35{@Q9s{`hQFG@`9DG-LPW|I7a(Q=K%GyUT46ZY*z?~mDfU&sWhlG zc`?`D`{!%5X`PY3(!5q;nKSCmKA1`*ah>)7w;P0*=M$!lp1y96OA6s*d*uhdM2)x^ zc}u>rEJMU^_BeZcZSy_@H~fMTI3SSHpP@2AE5c(aA~x#W%RyS2GOh}^6MwxF&)u-o zIm_p1zSqyL!t`x_-i&;*wl@x#8}-U+(0DZD?^`IUj^9nEiL7%Yzx#(M`lY!6S;MY} z8xqEDE3=BZ-Inrm^`nt3k4J>Am$W4OI5OhjjSl}us#D1g%na*5#h^h*wZ!O>O#Fw) zhlJHCJdik;^C|O}5e_$Y?ufF{8S`^f53L_6m*cVk!RHf1Yfi-bd`f9UW6@X8iHHUZ zsiq#wo9oRgxQEq65=AZ@Idq@}*r=VfM|`S2NPyWg+gH(aw<`U~^zKTs!X+?<*Q@fO zrp)Q$%7@2_Wrat#TZ?A5%-XstO}oqouKG~8RFN}Kw}E0INE9gXk>#MT`6~$NkHlK& zb!5l7-=x2YSu)-o^<(`DEpF>aD!~U(BwpF zr6GlgOmL3zf!s}>fk!9@qZDOyBpN;+CCJzmk}gCmyOc>?p>k1ltTOB1M_<1Svm^Oh z5ODBQ=GU||iGDi-*}6AC_Ocp6smGq8XR}(mT_wWY1u(4jOMn){Tiu7?hVkL^vwZAY zToszY81-gSH1AJ!8rX;`87yj2BSmYtf^H5vMi9WXxm}-k4@s<+I`>Kag}9bmF?@TM zPF<~B;;QwucHdaLey49~N*vN#(gKdlUxN)aAe^w;07`2!KteeFJi?i9(L?Om-UOtO z6Zq4#rYjBoi_MtLq-u{rFumbkjrGvXYfQ3Ogd)=SSbty2vsIopU5x32^Ung35D0Yc z=Oo>u>>v}M1Q9}r?wHpW!qWjTsP}=pa2x4g1W`{=_3)U=@uR9GRXFPdv8h7;&`Gm{ z({eW9`L@&H(C`i77Ny?b{^NT3&vpdVNQ8)JJQt?K{s9+6t(4BljX0N&t-Aw*&$%;oL(ZQc_w9Q1ZOUV` zd$Mgx#1E{5#eh$;0B@*#G4A~C|9@zZmi zO)vJpP`U_%!B4;>Wp5_cpf z#THDLd}o(la?oi!Gv|C=vLohy;zR&PqVHsIABNp;1>gGv%!~kM(iVb2Qc=Js&-A}s zd%s_lF*ACqV#OnI=-xp2CJS+HH=}-GK2v-Gs~S9MC`M(9X3vbYCTR*xH6a>^n+h%Uv5lAFz!=S-8lJdF zYaz}tRK{ks>t@58+1DD?E*A1`Pwo|aOLsR#rH6wJG63D= zvE&DnSn|D`O7dwwJ4HA9o^)Rs*>+gE@3{}@CUHGUK7Ly4p!AL^@~uXIc>y}OcGplQ z04N(;E>>sJ*MZ8cTo?ohB^_MTJiVlXl;qMcJt8;)EQ&jGo+W`XzqE6r&j~G#e18Q; zF-!75_&j{fLW-D*nV@#tI_Ev-&1Mb4sOG%2C@a#k zpW_p;Zg9aoJm$^kSA9#P;mxvxAVrsvVu~6TENFfyqvEw%1(j#d^@sim^no*Nh!G;I zdMo7359(aFgBG2}jwN^zlk?3Wchy|+ROd2fb8T+>GL{CP+bXU;J#1B-aUg`MKC|R zT)xSF)m=Wscs&7Ney+=DF33*>{)gQsOu0 zfOQQoP?1_fy-!L0Eym~svdVLIG-a=g(0)@Vbhewi;nI-m(+4~{WA_Bt2P`3|nwg{Z zSTO;(%6CR5-Cdg28ddnAlFE2FL07IXP7pm`{=SB8EcQ;35~^kl_KFLVmjJn#>qROV zCOZjZ13fwQ6Q|r`NZ0w9p2JIiX|2b^0$O7uu+j)M3ZCaDt~1eaeX%CtU);+7`4s&R z@cF+ucB2_dC|mL+(ft&gBw($CVC6WcneLh}CDh~Nvpkcp+&=4;b=GLbeDqH{)l9QY zqcn|o$NL4sVYBTOb@`ndfLqBBfCAFwP}*ki`S_$@j?P@+S|AO)sPttwjS(vNX{#$ zOPZg4B4>kCwuQOT$-Ph}=t6=3*tdNwggTb5CDzKjbcGmBKr>ewlW1R-((Nz>oi;#4 zYI>d0^L%>0KknCdLEfo|))M1(4LNm&+a_JyzYN`m%>qem-?=m0S%nmLx+H0%8(YmvP-f55jbG z3+eUMr0=XKv@&gBJ4w64x0jQ=YosLUL?dw0)q|&i)Rt=U=}I3c#LT^2x3ujrr^9yL zO0v?I?75QFT{!dxFl1D~Ww-GflIHaYfZCU2)dFA|1HN&M1%2-fMU|MmZ`BAFpe7p1 zap}Y;NNxOn1MYrBJz@(_=z+*vNKFR(QxG$~3L5WF>a>+)2jZ%rQ!~G)8p=2A69ZAz zAY~KzVun{E=tTvDLu~;EGgw(o=SI>rI4iCLOZwKc$7#*<2jM^JGq#@E(`RY2vE}p7 zl8^3TeioPe^*k^!-(P&kXVXjPYfd*y18vs@ox6UqcB7$b;a`qLI}|U(S^qbyY8f+@ z%V#ajtBAh~u>pC_Y^(Mvs0D$)0MXWY3T;i#%<|E#arTNR#-EEISC&LfT{@R~WNdW3(>0_-0evby z4h_l@=%?i_BH{~Jz%7KQ(tQoXL}Zlk^&)X?a8#2=c>ww@LtxFJEo{a@AEsTt&d(!v zm&`-G?dJZ=N_w|!=W7c`Ygtv)r%zo4AcV4rEnA=(S#XG=Q{Kty( z_ zqf)Gr=awFa^Hg~=_nIPiCZ zX~ZmQ)ZeWz0P5oESSHoJfYWNn~P*NKJSn6-wD*r;?H?TPG*p|Q3HYzb9 zFW~d(CXre1@TasQQZ&$LwjsghT`xkk6>O#(2P3rP>zzUwb%^;xMJ{4LetL^$`_TM! z#2UsmYMeG!8-0bXEj=|zKS)|=i}p?l!X`I;$Q9;o@C)IRbB6LaWiow3lLTqa=~^E+ zUatleb7NnypU)`capvXJTQ9~PZx$kYqS~l{GXDb{@+8WT!Oq+^-WKw;COETTi$4i2 z*HG%L*1_T_o5b23WA)$b+8PJ_@X^ajE!zO`gULNP6y6(%*?Lsadu-eXw{&o4Gr&h2 zP`AOW0nV)b41F8rV}Kq+6`=1JsEZ9A5j0YS@a?mchx!-GRjwI-E6Vi{1>~4Ts9d!4 zvQ6`dtqO_EY}Z)!vW=kU-ij?{Q(F{7FaDde>3j|(z zusH`ndFztAWT8aDEzVBp`Ug4nIRz^{3#;jnK46yEA|PYpgnM(qxEk^aYfWLFhDMgv`;2?s4{K zu~vp~g7Q~=ShWu>r}yDRu<)5^$gX&&#udvjzi|;bAgpoY_>ax zd{khEL%NI71l3)QaS#RQUavvJ=(+jTeG`-(pf1apFJ5(pW~XfC5n{V`>PET2-}S&6 z)1}vo3=L?O3G58BO8C6BP$uY$x&T-#vgagUZ@DV;uyLyudjO2pLJf*?hRTH1N>EOB z2N*)T6mvtEp)#|>zzu{vc8(zGCpg`B3ocV~QiN&4D3etnwt%Pv5hXEo378?2K}hve z>3$I}O(3rC{hV0Yf)-#?De%@ox)JpXw6lu#s^w7LS|->q@!=Rf+}7ZHEtr78FJ{zr z&z%)mj4_4Yx2+KCNN1U-tza;Qs_ELprz(GmUv6u%NwnN&Wmri%>s(*6x+nLR;KBMw z@-*VQEr4!$_V~(H`k=-^7&YJNU+XQ_$jqtjuNif_pao%dCp;s%^0z3h{B1GVq=0SN z@7<33-t7eAzv4i4h**7dKevYu(N;(Qn(UjHwPu~$*3t%Fw1V)3&mI-~I6T*0#{Hp6 z@<>90PLcGSZL`X+;_n+hQrNCue<&-E6L%1!bUQy-VUF~~_40k4A=4YXx>D_S z?LCKxTN`I&ygeWGXC^le+1O>vZTPZ_`e@DRgrVibOU9*rz<6QC#&7I?7)NSP|KrB2 z!}iW^S3v*Glu|$#T};Zc@&op3fJ~G!CFlmGM!(Cx{Ge#My^iZ#Ua%isP2 z^xfmp$0mGR=UW<9V*de4xqdAX4C|%N?6dq5@M%oo_SFIPw< zbJLn01mUiT1CK5x9uW4a-|yOhe;DVs>p@2c<%4dn2Qk(_Wp9rhV?l z>d5=($|6R3i@hjD@GRqLaKJ_}JE>^s@=FLroocgUo{$-+P?&x_jqLTI-wLKbGW?F3gLfI_#?qVmbc=k)tK`{auwR2KMG|`%#pRU;W z1SDHK!!_ANlOI~vBlLCn^q*Gj)kZ#mm>hylM^AZxKbLgYwRQ(0w?K)(r=#n;nFv)U z0a~+Lz_>@zk$2R;eAzF>JbNo>^=|j(68^CDr$xi>SrU$|%y#A&lx$bS=R7J+vpiC7 zVs_#muvNtIVbgH^p9W0g;9VK12(^~8Vrn;iFKD^lDngMS!ug;x9IIQ4GFy&EV@&HQ z`6v0gt>cAR5x2kkPEJmF<}Z7$Znqx!KKY?R{Og*w|CEpb;xzt6pZWjC*C-{xE|S47 zq3@L4&1F&a=%R{zDujP0>}wQ#PPClx z?TRJ3`fY1L7tJJ7`K7NnlgEpEVGh&Ne`ZSgOuZkxo^u!n?sp{QJ3^`2y;%9UpZwK)Gv#gMd$CrfvGNgpk+YLa?2>;ITWx zkD%*59;5vF%)W(^H0$iN^~3Lcd#qqLfBqL+f?857-C8dB8Bqu1R%}sedt<|Cr|P4H z;~^-c;7_Yph(bcBPXt5Fs&zV1=~a!cr1<%sKiImo=xE;#*!kaJ@GnV6>$bXRgeY!3 zN8PbT%C-k+#xHA@3OYPAc6|(~wfJ~+^SXExPU(Y7;GOlDRbiYxJ?;p4D;^i5z*Gmw z^UV!YqZdB|)_$ZHMlz^*P8&F4mX8So8I-#|UC(4=zsqBfEEaCY6&(4@`Sz8Pmo)9L zy{kNOtB%6>5G5aUk?AlJJ0-#)ZJ+ttxUkI8Fo11;PGU{mMCgI=9t7O5^?W9avU_k5 zpQv^x%gn08M)$p_EX&ZeA;+FxM5^ifvhe2?eUu264LrSoHbs&0UV^3(nfCBgt(dXF zbD{#4hYORvz0dJEc;tJEa8Xlvh?7~9cxqjM2j9;>y2s_#l~oPjlsf#-!+|5k7vUY% z&~Ct!+6Z}I>GDhIwj%RCP$)`2LgZn=UGCO(Bsq4ifV3lw&?|TK0I6I^yt_#7cB>Ux zmzI)3KXI67Rg{7Bw0JnXgQz1ttkn>Wji*(jU0bp}Jsg?7bx@0fZ~?N#NG=aiG$|Ye z2uOyI>Z+w+sdsS+Nw>*P#BzV6fj)@_BbD8%aH#r=@rX;Io1- zW594sRlaUEvgvDjB`K&2v58{XE2=vUg5a=1^K#W(p^s&TD%33eS^iU6JD1miQFWSP ztCAK@54P+gTdt9UP1}BkaS2#7V4(C{=w#_`!n2tsMjCzJY&2lr%cSSY+CuCGQfYUS z3<#GOw)^?wt>>V3TXgW833)!zAB~@_5aRP5a|BFgX(@BBE+GasT;^{vOiEZ zlx_nB5rR1;Js`x!-vrU@pKp`Ru0GxUA~>DzZ^E?B-!>3FYqIyW;oy^(1M@p;Y>5xn zHC<>}xMWXL8+Ts|qZTBwuxS(<*s3@q8(b%_F$JWhR>?7?ziNQ9(9MnfSfqxpxL z#6;GD=HvyRZF5)`(W&g`vz{abvmX~7GtH$+ypznA+MWWNHT*q@&oD8u=J7d|?|l4lE0L99dzBUemcD)(dcA5$_LRj3 zLDVU9vRv^cl+6d!Ay9C25S6hr+|ForDll37!EqF066T6Ud0EvJ<7^?22XOrRi-7Fw zl&xw(`HZc3ebvO5Cd%(}!+scA2W-E*d?Q&3BQWEx!FE|OHH5g0tem%~%-ag$$o}Hb zVwK3hfb2YTh|6{!XmKm%LW9`;`z00$6%|OlKp$})nDbe^ZZQ-k2;SKw?h&&Zn#K7Z zHp2BV^6Y9XwVf#61D3O^IndoBGSF*LYPf=RbOWgR+z2p;A=r3AZ=bvI#g((wcvS13 zB$Fxa_E<1}nP!IC?i-BKu`xj6E@t>7b>%cN$20D5F`apM<_bw^NqKb*rH`k>xSlb( zD)B&XLg|o$pf#&MlPyGy1X`}$Qz+F4@>xA9-45LlC|7TEtdx3iTBw4BG%h=VzCr3E zw$8m2BUJIlB}Ll8T5yW_&nImq*pPYrvhbo3@&DhzO*Y=RzZV~!$hlK z%kf9zP%wg?4pUe_Xj9%}>$K-$L?MG6V2T`ZTM94yqI-OV8~XU^v{&TL^pZQ7AA5JE z9*B4mvRpInaSQx0;E&hs{eA%(lAYaj_dN&j)4;P5R5pRcRBAnOp10}@1xm2c$p*Q0 zANhQ@|Il@QYYh}D$cyALSJa?~%9Y_qW0WN9WTZc;IF?W}{ovz_dcEvZDdFiDDa>Q2 z3fNO8qjBi5uqorYf~n`yHR4QWkn_-jB@|(Ac&_Hw0@AM97wMVX&|mLEAguq$JvYP~ zTdAyTS7GH16w^EcZ-I0R82S4@CqNL_!74Z+-|PVr^addXzC}%M)HA247_<(4^rh|H z)L{9#RH9aoV$HV3SB+^WMu?Va7OL#s!jhIcytRZ9f{9RdKo1|1gp01*YA1z{KDlEQ zIr6KMj`F>A_kNoC2kh9?H!!ssN}_c380{_ZIS5#Az#!VUro&=01$!?I(q5T%X}nOR zw7hXJ>u!h?kGZtMf@g9%y&mjOzkL(lo1gazjGn;6DlzA9c^{-p3$r|6NWBacb1kn- zPr0G1OMl3pdMa)n2tvxS>=iiMa!p3W{^OTP;Aan^tEgRZNKU{|WVv(#{_XSkc?ZN# zQeW{?TdfDTkeNRnNj(|1?5%{(gHcdWqa+@HiFolUKwL!wgZR>zLl{XD z!j+wjlNZw#G)d9R&SLMx0=HqpCs9^eWr*+nf@i+?m8ufJ`aUU;Y95lf0)-@jIvUem zu(71YHsc;J12YHmc=eE+h9ash*-3Oa$3K|Ex#^~iJP=}=ezz8HV}05wtkN+yIy>u& zUw9kh4MVyG4`LUiR<)$(p}VWb^1gsWoE8h9Zc!uM!_k%dkWQ!q(0gXb(f8q+@=KqQ z*v?Hudw5}mAEA7qogSXFi;h+4slsJn7d@-1><%NXSpkjZ`W2{Hq})|dn^<>CIDc*D z6ye0G#~@{!-!w*&7XZSka!=O`O}_g&pn~!EkgzV=eJ1DWGCPcLttooK7q^o2q@gMH zjglD54{!@48PGX?4?BsWg0dmIgPf7-s!;R4`jNYZy?#ei_kH~<9^d`4X)x4mVX^(z z?k1~0qX`pFqpp5+>TtC%@8lb7i;1~a7T`Z)n?BJiFQSIo&o3>_eVYgfnDjsKeZqfY z;?y@xSXdY`!}9z41=E4%w}y2!Mr-T;k9TqZRcE+P(&+7F zoA90RdsFB4as0xux2EdtKN-F3Rj+v9`r^yGcN;*9D>>OGbzeOt9|h>3^w3l<7;Ggh zCzCIvhs6lZyk_PL2V2lV6{IHD9k{=)Gz?aF+#Mcnco15H8?(Ua7sf}W#G#vF9pxJ) zR#iYqW)8}TY)8FI-zZw{Tu>+54=uu#$RUiudi%3o1{=h$Y6+MQido|@@8<@Nm6_cM zv7=8&v?Lv00jfRV3WPEkx~8>~U!)JCYEZ#27qyCf8lbOJygS}<1t8&s-vg4T2*g3A zAnGmLj3TVS=%?eG+0)!A7ZF5vjnbZ-K4_BNcpm^>xgM6;K0#yCW)Wl_<}?{)reKZ;iqH@ z!k|v)G+<(Os$n;D1C((C6@=b; z+C{|sZmGrsAI(~T_7-&W#_9y!9bo>R>y=9_BRh@MXQ<(Q4NBoj;8baTD_0NBqVFAv zVyQ@h&J8~kl@)F9I4A_+?{U;3K-l9{_j-8V;Q#|y0NF4FymsE$GDvMp5xZb(p~poy zG`GQ*lTw<9Ri0^#d_c@TIbu1kZ~8yl`_iDM(skX?sHi9bQBV+~qN0tEZUs?>M5Pfm zMo_y!K!}RU5FxFA1PBR&%mS@!p@oJtGK&zA1e75WLPFbajEoTwLXuWySxX@-Ly~>J zzE$V`ICnaA&bhbtKDB>Rl_FVdec!j<_j#Y;{JC>enN2Gx?4HFK+a7-G4sQK&_E6+o zozKC*>7Ihj!eb;}J0@v#58U67``NXUG@;OnsP@f>z1))j+RsPfOZYaX&_SgSv(BbHgqB+2wz?^xQ>L`^Y+mVc^MV|&VpN5Zij~R{D`4&f_Fh&@Gd5J{0{XJJe=I{^WbBFAe_)6IKY z93g&tm8|CLx$m+)Oh!~imT-Gpg{0KpIOB2?I^Jdv=jY;3huBch(-r>j9_JnT20b_Y z!XM*jb?j-Q?&mM3^A2<#*r+|(7i)r2V%r8#r*fK9btt~G$TSA-JmYYEDBiij%7WwBOG;ceHXO&u1L-L9Ve!|GX%jxfz6v zd_LV0ACzZO+~49F_Ia0mj9&U=RBXleYi*?_1-fxIXE$P(89zNAar=$VZwx3LGb4|K z&ng@n)Ww<&LxhK_W9l4QXbJ5{=$dAu-#+4>_F@mBfRLM4*ZStzY=mTWP?zzYn%O-* zj>!dWif@3o)l`H1p-oKa5LmoxL3Y8xB`gpRI*HjC5;Me0U@}@zGdMYrmw(wOvbHAr zdi7+}jlmF;xzq|m+`+K%x}KjyjvfRNTn~TW!+yCvZtojyI9sC^sxGjA@L60#V9K** z&zx;$D2-TwxC@Fbp%DQWj4r7O{S-im5*hjtFBTWxlqqGOiLnH%{s{7@N5s$1DhLP+ zEcXL`tH!w(%e3E*Os-in{pfDf|nhc_7<})HHj(3(VUg@fqh>5{IC+B zZ5#@SM;Blz6g#U|t!}5ApY!^#9|K#t+}0xBYQRyh@{cWOZhkQG;o0+N4@QH>AB=jJ zMcs1?ymV}N$p2P4^zRUz{}0*Kzq|X?E`d@qRKzj#`XF;V=xQTFD%wCLea{|XuMIz$ z_p-G&(rS|@Iriss$!=PC*PfibH~g->$M>DUuI1@>W0-o00dK5@!C_|8mxbV0+rF~4 z2f#F^Yp?vf0o-nyvpABt4UVXOKub$Wi6Bha5$4uRH9G7g1YWN_N3B^f^*eF4CTQKn zUf0lIl+KhyWxBXz=kE@Y&%gtB?Xr^=FsV(gzlYEduyuX_RsuVJv%7ykIV-%JanW6> z$osxda?{R>JrD@asrrz>giju56EJjnkGLxu)OUD6ycJVSJ=_5#S1vW41+hRu4%QXf zEiTf`0R9kA7*=LH=CKlTS0TJp?wFtXVVRaLbwJF*gGweP{7H1(|rF; z-A;yZtSl-ca>RIcC@PKSSVLs_P%F;yP@3m6PLU<5BM4cJMRqf0B~Z$kXy(-z9_*$S zDhK*OAnfP^zm2;`wPn&rYM1O0Qs;ojPoZ)NA^pP(CX>omXdz?AS}_Mnc-n-*+9*;~Y| z9jBLY6LyyNe6(|4cT7=rJzSO<;91A1f7-XeGW36?E{lo|q>!(KN5>cv+4WDCcKosh zBeJ}WAA8V%Z^Wq94}&Y(&_XIB7`Ku1Xikt@CMPoMbpS=q+$@qmYglm_Rqg^ zj6Q@50^8#Pqit=Ashl-9=Zbt@Iz>J50bukDefDwS=k!9^-y3a?fr`q$euso8rbO-! zme)4c1RMB}v(5T@L-OsoRYo}sa#_faQ$sgU^s^c<13K9SG8`I>+vf%)V@ETqvscoh z2P}G28*GXh>INtKsE5<&a@CRasgJTNedTq~%?t(F#NTe|_zm04tD^&^&C``2&s>3( zlT@a&kVP9_YhhJHhREnG?QGsDZ(GuO07D**iVim7g*R9`h&{SlX7dl&D_V0$>{iN> z#b=j{e;H5;9=BcbK>vWuHuc^^^Ph|>kLK-C72UKuXM3_9|^ zRh>WxWXM&MF>W1Til`ixtlj&nV_#g#5!fcx$u)v@^iqa5+1k>Jy>ycs#*=P; zvtYW>wiQq8uMLX_nY@?L$X3f2qE(vL4*PlVIGEUH(YKRFO?x7+we8Y>VXZK)rgS#r<9>21)Zh6VbJD0!>^Fy>Pn4fs7@niRzNa?(>iU9^H;ji?s zDpEMvnfW2_x~ylEdAFVR0Vl$CAIYsE-^HvCQZ_bK2?8pf8NPZnI*OdpB@e%9elYiu zauKCT=Y@$7%enWp|kNB+>xsYk>p)EALdjB&43@*4T+@aw6J;X?IwCQ94-XyblA~i zI7-G!@?UHla_2kieVpT0U4-WN`*AzEX&2>PHgCm5SG z{9Qi{TNTgv0squ;rj7w+?Y3D^Ge~gJ^BOxDMvkEr!pvnJn@m+gwz zdMDou!u)n=hj|};?R*fpdd1Lr_fa<-?v#EU&%Q)e2WkJ*6rLkueNjQz4{gk`Cw0!x zetENE#~-roPM@>s8V#43iHgo@txWR9g>~`(%b@zp8yz9u47bJg*PzAI!Wr>itFK)* zTJO1sf3^Ag!-P4DZ&#<5gzsCf4H70~XvGt-GZX3ElKO1m4%~(@Q29x*f3}92O)49B z6ZAb7jog*u4UlcGghghY{*Mtnb7ax2=c;e2>SEc*&{V(~D7QYW{$(Zgdc;kTE@e4T zYmZ`F;At_)qC{RJZzfPDV}2=vw-Ip^nyjcFqpUj&5*0d23AOGUnh}aXVXs_sc1pjd zV)$}jM8OvTf~2{2C(L>DK49xpQ7 z9x3i$Fgv0cw6Xo|8oN4pj^u$-ZT`P&YyV^FuYYfOr3Q^?0-#rr=CN<((l@}#p4=W& z%aU3f`}1Jqc-mR%+t3fpBL$~ho{6#ZtvB0zOovnT8h7-MKB#&d*D&+4`c-*|(aX~I zoEKW}c^vU@I8K1y5lRv5qj3Bi+QCx7^#l8hF!0UirRRxKN9yHJ+$yKj zGSjuj-}OWm9&vGaN0lk!u;2BwXj@AW`llIfVVJ3LrE{9S$XbI6Dn9UOQ?R%3Xo+ctKsU2TnB z+&;}ty6IEk1gOC=E&Mc@DPEQ2H%HO9WJ4UU{XFK4t)3S(2LKW)x&s!b*!}JHH$1mr{tqEBVN5g4`Gpm z^|Gj0JE?Sse;_rCHmZs9+&=@S;CL200al0C}e* z0=M9<(Fc!c+k3cMr*0tLVRS1|)!|C2vR9g1PpP3g`5-ppLjz6(d}>X^2u|ak#)5c! zhr+JciE?5zAOUA)iGCX;@JgiY z4SIl;#L(yJf$Gbx#TDY8Q5ULyfLQ{`Q+n~3FK-<+hlmsu4+fjBhjeb?R#AT^>9G>$ z@ePx}^>Ur+FavJx^vCqn*bTspRNU4ed+sX4QSPg&%ha3pQvPD{Vi^fKNm_{&;y2Og zU`Z#@Rv>~3KseQ1IyG_gcm-`0Tn^j;x4D0X437;o%J3+}UO1}Tx3KjB&AN0NSh#&` zIVfl9jH;X@GW_PrJb!FA*Ye#2$m(L(9QrC-fJstD&01oBqYuVl4bJS@GjSO2DkX)x zIn>k7w_RD$Vbx{+K`i)jLj2?<<%(<(!5_v$R?2nWZ6PICPS$v#d zs2p#qGEm>uZ1knkk!TijR(_QO4aM0DB~Su__kb(fowbD;J%mw72D*jsxHb?|QIt6* z(WWLZ9p`4W8*%MnqqOP}`=@}t^MsSvp=>BHdZP6OSg8%N1Q;|v2t-T?xLc5Ym6{&r zCR^f>O&XhqpPQER(iwq79l0cByw?t&;Sk}#Ez|o+>7Kkm(zZ;rb6&^yVG4i?Xa#(f zCmpt?c+}+!A?=T(p>bjp@?OSUtI|ep(5^_ITRYJsu&G1BiZORXB*qTit2t_^jcj1=!=QLQ@k1ZgS45(7H92YX7OD1NI&2M*VO6arz<-%w!_ zZingt`fhw@52?MPZPACBX6GoFPYGxNAu_yGDqShV z+;`e~Y}$SEG)@a*WZBLVgw@qSO7oH^=^tV{QOb~UDz2;4H(Tetn=J0^_k9LVyC3s| zw3GqH*-mjKbYTo81Ls6T!Mqm|^AOEyc$vgNwRL|ZGz|^_y3xo4-JF-ZbhZ`lj92+q zPc&5|My5qPpL4>;QLabIwkHE~X2Xdh)7*<>lupN}p1M%8o3@c@D(j$d0XDuxJKTCfl%jH8fBITthe=T$ zEq7q3A~URINvs)c?b#E?ChlFZHFdN)c%hGFcL?3!q$~BabW2{we%g5J^r6$6PoUKc zcNW_KeuOzP@u=d0_IuRzIgJ~z1FZ`(=zO;B(8b?$c#Y5J?nM2HK9WEzVSNEv$Gfz8 z&ySf?l}ik!`>TA^hq)^wIn2-RFq54ChU(%+PHGs+7al8i{PmX0x>$NE5%pt}K=VeW zT%s3sVt|goQb^yD+}<-a<-Os|_Dg$Te0AsmMg(=C=%+%M9CX`809G5*mntb&tEa9r|@{Y(0XRW*ME0Y1^)+#_1*G^(RU4~ra^ z&JBK=JDV`<-OIHTNuRf?9Kk4$aAyC2X78tu7mvDc@FiaVHAG`_OYgyo!pLY`_G5{6 z@I6A6cW};>!Q06T7#&8NF|e|y++lEZI^DBJ?O~e=mg*#oYy6dILY?;IWSrwc3l-^j z>DE39jqqrcxOxAF-t$bi{E=UKLv6w8qn`28aev<0144$@=H`TGDeZveslKM&UI}ze z0M}r9C29@|7})p~jYiKQHyILgWIt5=T8w?p;QH0lzr;e)(Gi2ie)?k#vgejkUK|~8iEf5}{xA=(KKyaL- z{yP)@yhl_Akw84U!!N)`T}BIl*C0nlKHXOmzfX}-I;_yTNRFVv-xS_ak=C*nVw~VL z_HTo1%D&P0R2?;j&j4Ghjsl8BKWOew7_eTD3r$Yl8^yr4O_B@ce&NC*r@lSI1i$mt z;uZ|86C;LkJY-~vtwn$581tua6MbI|!b$r{Gh z%6Voc&Y=O`nFxJ8(OV2Vi8aQsC|%;x$GKHKr39_Tg8MprDrKgm`B{JMpD{PcfdIK{ z-V4cKpk`Gjw0GJ+<2$%KQ|`V_BObNpLVq-v6mcq5XA!>&giM6qrzEpy34A3t#T4o7 z1oCANft4^W7*NrzGSFlptGF`A-haz; z_<+twFO_~2Fb%U<3ZvoJ>R)-mtPC=sdX0$q_*Ar1?dA<60HkG;F?QMMny;xjFZ@k7 zoNl@a?I6U>A(KO^Xxid13dh>>mDj*e(~Hz++@7#m+t&5kGa_W0<;=^a08JPENoPl# zsbU-?l`#SFEm0=PtZCT?=5*_kbV;YZ`D&;pixVeZTKSk3Yde(HDvR4Ev^U=@c8V)| z^*H2{TRFn$FgNSH#tzk+vi4sUkKYAO;|7M&L&Ob?39pG;4ofq`JO0eTgL5>iG1j?h zEW|@lOnyVAuR%KDaGB>VS<1k*Ia_t0dp2Kb|6&dZur4Awgl8=S4+pGi+Xj+*Pf{FD zqEt?5U@cQ6Y2?i^;kkBvz2z)%$$JnHD`H`Lz9@}r0H^R-spgvzVsRU6aZ0Q)Bm1xE zrhT0^MB!K3F*i-mv8H`?wqCzjJ!Kyr;)6?*={A4p>+=s*{-h&jLI6$^Qow+XF;>OX z<_w#e3f9WOwOl5x7!2WUh+w2~aY(2Plh|m!1;%#zq1(;3AjhL2PQ-{$?|JBalN3pl zg%Sk1@U~82+dS_pfR{qAnPucfoGnUIL&x~LM3qfOO|JnZcUWD0i~h-buC|!qgoC&D zb~<^Sy64IZD1F1<=5YVsu0NKebb5T2|JF{&jQ3WUkB$Us53&y?_aB^}p6>+h(h1aj zhN&#+M4kNIxJnt5j+%RH=lTG3l`n@VofgdTg(Pv#O%v-(_i-DHauCF_=;@Nqq@Augp_;?}6dCs#VRw2hFXe zZGkB1b|QVUXA>?%T4=QBIl%f@k-jVRR}Lq(`GJqi7R>f-2L>z}Tn+^NWnWVbiji+Q zdlATNc#0ZC3fjs$IGejUOP=r965Yui8;tp*YkNP|7VwppulC3YsTZH;&YgYsxs*_I zY4LQ^ZI@-;zU^9{lm3q1qyIuz&{E)M0+z1P&ZyHsL+fs&I+)Hs&4#m6%HKG-m5^4} zyuUw|j35l(p2+aP*!_8rsZk!>{Eu&1YZL{sYs8*0Sq0%AeBODZq5&FkZ^{o%>UP@7 zfOU^>V53&KuG)2hWqzI#ZIaW#)w!!(T?6doB{%4uUx#$nj`H0z;XxHhm&Fz>>9&eUK&D6^%$j+!)&X{|`;g5D|D}UfJL3Y=h!foxRSw%lq?dbsq>Bpco zxSjB5rYuxXL~Mc!^Ew#GlCLyYG+VJhX%+Q|1kl?1In92TUjM#$rZJ}j=&3P~=Nz(g z6v#K18^iX=ykK-9ZijeJiyM?UCcFjZbPU-R8Sr3I66YK{R%DF4;_r0}mp%`3I$a!M zWN*IvS)y<;*WVnzT2MZrEYGMqKR6-w@hmaoYJCC4)Uwz0$bIOuEH6#7T%`~5ZZQH` zK+VDwxO6a#uJ%aen~U^QK%}}x7a_O%?}yli2=8Q1=tY=7yNry;s2WKzJ0|jDRoP^H zCzWeV#2!a|ktluzy*q(E$X(XY(pXa$JCs;ql`2x^TN5kO$z(J2r|n0-=~t1eOY`Rh zW}$Z2^wWqV0V#WQj@lF&BMc?*x%T2n=7x~;{Nxf!so!WwgYtmRJODRVAhbAW|6RyX z=9R257X?ZSK=ZB(9lfm-=3;BZ78t;2PWuFsDK`s0T@O1sTp8&SCc;(%+`(=!@!pjC zYDrreQSU(%@WHJ4+R+0&K~ad+4YsVe62%&D*hOrzmzP%&;QLodaAqD-d~n=Prs zbokkKaMvRR5Wd4lQ2})xg`-kHL;ZM!w*Jj~NRonaf!8*aznRL#fw1g!Y}k4BDH>q*96wM}R3>y_ZgfoPrFy|Cd2*WX_2U{bzl*jl6K zB;(pQug{5xrvae;RBOsAK#2|P3oV2UwZ7X z38OnB6ZZdf`*ZE(RTNY}a{l+HNo{Hd#QqG(gl_rFQU@(HAMAzCeW*O#~)E4pOU^9_1D{a+DW{^Rra|97}_t210A zY;OzQ6DqGGKVREn^n0UNY<%zN)nYxcete0@GYqTkLB>sEJ9H{w>gJVUw>nTamKq?)*;sJ@j-63h;;iIg*%spR8MQ zmL3(zU2>~pOWy$itG6^%+avE(|Jw0X+gHA3yJ<(YzAOiCg?jZ9n#Gc(DhzhNg>xXr zfg)STJpiehnG1y%XF0mgh92FP{WEr7oPO9IwKgs~I93)eop1KTiM_IhPiCJh@V+N^ z%l2r!fPP0o4mc`4AQ$D7!9Ya_!hpn`{@U zsr0qi-#YEqpSl1)Co>YR)7?+h_mkA(ml^x<8$~=>YB_C-BEwa+Q|<_ zp^Z>6jjGMvONVINkzpAxzDOJDOj8*$04F-3i6pT072a&fn+=zB*~|&|(pEISQSAmJ ziAS9v6yW2n>(^x?%GY;eV*pQk)pz;Uvq{aP~COS&jzBp2cO zw)O2{`}#2i8vTs+{Nx80|9Bg$F>THV4f1qdND85z=pd7w`_R-RW<55*TJ+Rj?z@oo z0=EtPjzan{Q*VJZJUtdTTd`z<%pLBFDN zw&E@Vm(^eB=alBVw0k02J@&t|uZTg-U5i|krgyxG4`z4(el*A!qO@{PbHU z=jXs>>8NHvBcc`v9cqNFvN;1XcemK)OVa?&t$NDjLv{FPP)U}CI1~!{|ByIk{SDRf zfE##os^h0MUjuWRS>9Vm#V4eD2}KL4N2;LO&r4o>CF^a3C>^7_K$y;;tOnD-8uq6X zwj;*`W+H`qY6O!#>PK}H?r(^4$V*zVD)=dsLqUg(?tlikS{m>Lb&azRAc~?3v6D(N z8Oxnq)zwn9mskemWdqev;Q7Y4s~W)y^H16v;|FnDd+5E(?$n9GD?myAn#r0l zNv@WTc%A5{9Kua?bAG+4(g0{hgs+$g((aAuB5kE#|Lx@ zFE?KkQRG68Wx}~|6*A5`f%*{Xcih|bLtC3!jAFW1C5v}57RGcK-4sW8*&F!!fIvDy zm!P9+jS+Mtb9=A5?c+MZnqB3`x8J>Qu)g`p58F|UpF33>J}bs3!{Le-uqchT?~&`%3p>9GvMX@e<;fxEk}+>MA`a@oFrao>pG5GMEU zc!B<#_e|V_rL~%OOh78Xz`CPk2(oW0Z?*Jd=`YKHIybz^PlQgQ@1S~a8uIGq{4De4 z3Lbe!i$V4S?A+Qil%2e=sVsNbTtxLO*|k3&|7K1B)YS=h=v|UV<3zl4JF-KbYSZFc z>K)uml}pQ;vP)ElAnS$M`}g}Ah8j|C)^W?qhTr)!uJQqvpvSEnQxncKwAS_74HvvJ zohDyEch6dNcn>Z67c_=dYMQ7{FHIwCcNJ#(Tn zgDdrY5lbNONi+K4_bJ)vA@uYs%_`6+>ljcO9d$@7;A8e$XD7C}Z>YUn5{zLR6<&j> zUV^5-i20}1(cIqHwmMtWR?%T%Kvb-((9SL4ms%F1YKUs(&Tb_9gr0V6ci^dZc&w6T;QKWuUb)^D2^;??I#==|`ZE~B zCxF%3c0y(UCqAIAnyKaLH8kqXbVBwg`ao>T8LWQr{vn$RS?ui9I2Yq3u}eb3*4?ZSW3p{BKH`QMBA?P?By zd;w92t1hJDfP-9-S#Pb0H+SQdGLhOSHLu$6nsw#z)K8--TNtazOR^5*q|IfI9hmaEcS1}3HC=#*u8U`*mQGR^R0OEk1q>=PaR#i!g;qo9 zN3if$FAARe^2fY68TgF|p9nX0wBqFF2iR&0*@`?V@#Rs4sXKLzRZ9XR7bkgae-wLwPHT3Zj<&4X4pR%140z z!c5|0nmdp^836mQfTO)F1lV3KZucW8Zv45Q!)9ma01X^|C8RGyVi^w+x^Al*f!!+p z$j&5tkS(Hb?1?ycsR<@3YjSU0x7}j=H`Fy|yu^ri6}wKg6ETE)+dd;YG9G{KcHVw} zER;D=RZKoRAvO^S8F&15_8Kg>ubIjpNTS-zJCg~07CEQ-ZDa<14;>%B+H*_`p8c8OeCrLb$4 zg0L4oi-gjPElED-436o{jnAsFz&T=9;0&o6EL&H0S3n!r5Sb0E8SH}H+V_UUc;-dg z)nuoRL-xsR!j%CFUVlk*!<&-k=Lx+hdA)8Oej$@KSdQ5hmGu})FE}34Mf@*ym;X`r j-amimf2EW3pHK6jPxGJ0=s#)&_|LWbceHjfe;fR7R<*Oq literal 110838 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%0Db$CKzs|51IRRHUwP^$%Bl$+I`u|i$S2tT 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