From 9b698ab850ba1f5093c7b957488b554dde3cd725 Mon Sep 17 00:00:00 2001 From: roopavr-adsk <134624277+roopavr-adsk@users.noreply.github.com> Date: Thu, 6 Jun 2024 16:29:24 -0400 Subject: [PATCH 1/7] HYDRA-1033 : Support for controlled unit test disabling (#134) * First pass at adding support for include/exclude of running unit test via ctest labels * Re-enable test with OSX skip tags * disable mayaDisplayModes test * Update README * Move set_property to a function. Add "default' labels on all tests. * added support for exclusion by filename. addressed comments * update json file * Update README.md --- build.py | 68 ++++++++++++++++- cmake/test.cmake | 50 ++++++++++++- .../mayaUsd/render/mayaToHydra/CMakeLists.txt | 73 +++++++------------ test/lib/mayaUsd/render/mayaToHydra/README.md | 37 ++++++++++ tests-to-run.json | 7 ++ 5 files changed, 185 insertions(+), 50 deletions(-) create mode 100644 tests-to-run.json diff --git a/build.py b/build.py index 8b0bfd4a22..deb5603649 100755 --- a/build.py +++ b/build.py @@ -37,6 +37,15 @@ import tarfile import time import zipfile +import json + +########################################################### +# mapping for platform string from python builtin str +platform_mapping = { + "darwin": "osx", + "windows": "win", + "linux": "lin" + } ############################################################ # Helpers for printing output @@ -635,6 +644,40 @@ def Package(context): ############################################################ # InstallContext class InstallContext: + + kFilesToExclude = [] + kPluginsToExclude = [] + kPluginsToInclude = [] + kPlatformToInclude = [] + kPlatformToExclude = [] + allLabelsToInclude = [] + + ctestArgs = list() + + # get list of labels to pass to ctest-args + def get_ctest_labels(self): + try: + with open("tests-to-run.json", 'r') as file: + ctest_labels_config = json.load(file) + except json.JSONDecodeError as e: + print(f"Failed to decode JSON: {e}") + except FileNotFoundError as e: + print(f"File not found: {e}") + except Exception as e: + print(f"An error occurred: {e}") + + for key, values in ctest_labels_config.items(): + if key == "plugins_to_include": + self.kPluginsToInclude = values + if key == "plugins_to_exclude": + self.kPluginsToExclude = values + if key == "platforms_to_include": + self.kPlatformToInclude = values + if key == "platforms_to_exclude": + self.kPlatformToExclude = values + if key == "files_to_exclude": + self.kFilesToExclude = values + def __init__(self, args): # Assume the project's top level cmake is in the current source directory self.mayaHydraSrcDir = os.path.normpath( @@ -716,12 +759,33 @@ def __init__(self, args): self.stagesArgs.append(arg) # CTest arguments - self.ctestArgs = list() for argList in args.ctest_args: for arg in argList.split(","): self.ctestArgs.append(arg) - # Redirect output stream to file + # get labels to be passed for ctest + self.get_ctest_labels() + + # add -E args for test file to be excluded by name + if self.kFilesToExclude: + self.ctestArgs.append(f'{"-E"} {"|".join(self.kFilesToExclude)}') + + # add -L args, test with following labels to run + if self.kPluginsToInclude: + self.ctestArgs.append(f'{"-L"} {"|".join(self.kPluginsToInclude)}') + + # Determine the current platform + current_platform = platform.system().lower() + exclPlatform = [] + for a in self.kPlatformToExclude: + if platform_mapping.get(current_platform) in a: + exclPlatform.append(a) + + allExcludeLabels = self.kPluginsToExclude + exclPlatform + # add -LE args, test with following labels to be skipped + if allExcludeLabels: + self.ctestArgs.append(f'{"-LE"} {"|".join(allExcludeLabels)}') + self.redirectOutstreamFile = args.redirect_outstream_file try: diff --git a/cmake/test.cmake b/cmake/test.cmake index c5bf6b674d..52abe999ec 100644 --- a/cmake/test.cmake +++ b/cmake/test.cmake @@ -32,6 +32,54 @@ if(MayaUsd_FOUND) endif() endif() +function(find_labels label_set label_list) + string(REPLACE ":" ";" split_labels ${label_set}) + list(LENGTH split_labels len) + if(len GREATER 0) + list(GET split_labels 1 labels_value) + # we expect comma separated labels + string(REPLACE "," ";" all_labels ${labels_value}) + set(local_label_list "") + foreach(label ${all_labels}) + list(APPEND local_label_list ${label}) + endforeach() + set(${label_list} ${local_label_list} PARENT_SCOPE) + endif() +endfunction() + +function(get_testfile_and_labels all_labels test_filename test_script) + # fetch labels for each test file + string(REPLACE "|" ";" tests_with_tags ${test_script}) + list(GET tests_with_tags 0 filename) + # set the test file to input as no labels were passed + set(${test_filename} ${filename} PARENT_SCOPE) + list(LENGTH tests_with_tags length) + math(EXPR one_less_length "${length} - 1") + if(length GREATER 1) + set(collect_labels "") + foreach(i RANGE 1 ${one_less_length}) + list(GET tests_with_tags ${i} item) + find_labels(${item} label_list) + list(APPEND collect_labels ${label_list}) + endforeach() + set(${all_labels} ${collect_labels} PARENT_SCOPE) + else() + set(${all_labels} "" PARENT_SCOPE) + endif() +endfunction() + +function(apply_labels_to_test test_labels test_file) + set_property(TEST ${test_file} APPEND PROPERTY LABELS "default") + list(LENGTH test_labels list_length) + if(${list_length} GREATER 0) + # if(NOT ${test_labels} STREQUAL "") + foreach(label ${test_labels}) + set_property(TEST ${test_file} APPEND PROPERTY LABELS ${label}) + message(STATUS "Added test label \"${label}\" for ${test_file}") + endforeach() + endif() +endfunction() + function(mayaUsd_get_unittest_target unittest_target unittest_basename) get_filename_component(unittest_name ${unittest_basename} NAME_WE) set(${unittest_target} "${unittest_name}" PARENT_SCOPE) @@ -94,7 +142,7 @@ endif() # separate_argument_list before passing to this func # if you start with a cmake-style list. # -function(mayaUsd_add_test test_name) +function(mayaUsd_add_test test_name) # ----------------- # 1) Arg processing # ----------------- diff --git a/test/lib/mayaUsd/render/mayaToHydra/CMakeLists.txt b/test/lib/mayaUsd/render/mayaToHydra/CMakeLists.txt index f54ee68148..3345b4d701 100644 --- a/test/lib/mayaUsd/render/mayaToHydra/CMakeLists.txt +++ b/test/lib/mayaUsd/render/mayaToHydra/CMakeLists.txt @@ -1,4 +1,10 @@ # Interactive Unit test scripts (launched with maya.exe instead of mayapy.exe) +# Unit test can be disabled with ctest labels. +# Adding labels to the unit test follows this convention: +# testMyTestFile.py|depOnPlugins:lookdev,mtoa,newPlugin|skipOnPlatform:[osx,win,lin] +# See accompanying README.md for currently supported list of label mapping. +# only single platform exclusion is supported currently. +# For specifying exclusion based on plugin dependency, look at: test_to_run.json set(INTERACTIVE_TEST_SCRIPT_FILES testImageDiffing.py testMtohCommand.py @@ -12,17 +18,17 @@ set(INTERACTIVE_TEST_SCRIPT_FILES testStageAddPrim.py testTransforms.py testRefinement.py - testMaterialXOnNative.py + testMaterialXOnNative.py|depOnPlugins:lookdevx testNewSceneWithStage.py # To be reenabled after investigation - #testMayaDisplayModes.py + #testMayaDisplayModes.py|skipOnPlatform:osx testMayaShadingModes.py testMayaDisplayLayers.py testMayaIsolateSelect.py testMayaLights.py testUSDLights.py testUVandUDIM.py - testArnoldLights.py + testArnoldLights.py|depOnPlugins:mtoa testLookThrough.py testObjectTemplate.py testStandardSurface.py @@ -37,7 +43,7 @@ set(INTERACTIVE_TEST_SCRIPT_FILES testGrid.py testUsdTextureToggle.py # To be reenabled after investigation - #testDataProducerSelHighlight.py + testDataProducerSelHighlight.py|skipOnPlatform:osx testPassingNormalsOnMayaNative.py testViewportFilters.py cpp/testColorPreferences.py @@ -88,47 +94,15 @@ set(INTERACTIVE_TEST_SCRIPT_FILES_DISABLE_VP2_RENDER_DELEGATE cpp/testUsdStageFromFile.py ) -# Unit test scripts run with mayapy.exe (no UI, so no image diffing and not possible to set Hydra Storm as the renderer) -set(TEST_SCRIPT_FILES -) - -foreach(script ${TEST_SCRIPT_FILES}) - mayaUsd_get_unittest_target(target ${script}) - mayaUsd_add_test(${target} - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} - PYTHON_MODULE ${target} - ENV - "MAYA_PLUG_IN_PATH=${CMAKE_INSTALL_PREFIX}/lib/maya" - "LD_LIBRARY_PATH=${ADDITIONAL_LD_LIBRARY_PATH}" - "IMAGE_DIFF_TOOL=${IMAGE_DIFF_TOOL}" - - # LD_LIBRARY_PATH needs to be set for the idiff executable because its - # RPATH is absolute rather than relative to ORIGIN, meaning the RPATH - # points to the absolute path on the machine where idiff was built. - # This absence of relative paths for RPATH comes from OpenImageIO. - # We introduce a second workaround to avoid Maya using usd's libpng, - # because both use incompatible versions of libpng. This is done by - # setting LD_LIBRARY_PATH to IDIFF_LD_LIBRARY_PATH only when we run - # idiff using Python's subprocess module. - "IDIFF_LD_LIBRARY_PATH=${ADDITIONAL_LD_LIBRARY_PATH}:${PXR_USD_LOCATION}/lib64:${PXR_USD_LOCATION}/lib" - - # Maya uses a very old version of GLEW, so we need support for - # pre-loading a newer version from elsewhere. - "LD_PRELOAD=${ADDITIONAL_LD_PRELOAD}" - ) - - # Assign a CTest label to these tests for easy filtering. - set_property(TEST ${target} APPEND PROPERTY LABELS mayaHydra) -endforeach() - # Use mesh adapter for mesh support instead of MRenderItem. using Interactive (Maya.exe with UI) foreach(script ${INTERACTIVE_TEST_SCRIPT_FILES_MESH_ADAPTER}) - mayaUsd_get_unittest_target(target ${script}) + get_testfile_and_labels(all_labels test_filename ${script}) + mayaUsd_get_unittest_target(target ${test_filename}) set(target "${target}_meshAdapter") mayaUsd_add_test(${target} INTERACTIVE WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} - PYTHON_SCRIPT ${script} + PYTHON_SCRIPT ${test_filename} ENV "MAYA_PLUG_IN_PATH=${CMAKE_INSTALL_PREFIX}/lib/maya" "LD_LIBRARY_PATH=${ADDITIONAL_LD_LIBRARY_PATH}" @@ -139,16 +113,18 @@ foreach(script ${INTERACTIVE_TEST_SCRIPT_FILES_MESH_ADAPTER}) ) # Assign a CTest label to these tests for easy filtering. - set_property(TEST ${target} APPEND PROPERTY LABELS mayaHydraMeshAdapter) + apply_labels_to_test("${all_labels}" ${target}) + endforeach() # Disable VP2 render delegate and use interactive Maya with UI. foreach(script ${INTERACTIVE_TEST_SCRIPT_FILES_DISABLE_VP2_RENDER_DELEGATE}) - mayaUsd_get_unittest_target(target ${script}) + get_testfile_and_labels(all_labels test_filename ${script}) + mayaUsd_get_unittest_target(target ${test_filename}) mayaUsd_add_test(${target} INTERACTIVE WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} - PYTHON_SCRIPT ${script} + PYTHON_SCRIPT ${test_filename} ENV "MAYA_PLUG_IN_PATH=${CMAKE_INSTALL_PREFIX}/lib/maya" "LD_LIBRARY_PATH=${ADDITIONAL_LD_LIBRARY_PATH}" @@ -159,16 +135,18 @@ foreach(script ${INTERACTIVE_TEST_SCRIPT_FILES_DISABLE_VP2_RENDER_DELEGATE}) ) # Assign a CTest label to these tests for easy filtering. - set_property(TEST ${target} APPEND PROPERTY LABELS MayaHydraInteractive) + apply_labels_to_test("${all_labels}" ${target}) + endforeach() # Use Maya.exe with UI, interactive tests. -foreach(script ${INTERACTIVE_TEST_SCRIPT_FILES}) - mayaUsd_get_unittest_target(target ${script}) +foreach(script ${INTERACTIVE_TEST_SCRIPT_FILES}) + get_testfile_and_labels(all_labels test_filename ${script}) + mayaUsd_get_unittest_target(target ${test_filename}) mayaUsd_add_test(${target} INTERACTIVE WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} - PYTHON_SCRIPT ${script} + PYTHON_SCRIPT ${test_filename} ENV "MAYA_PLUG_IN_PATH=${CMAKE_INSTALL_PREFIX}/lib/maya" "LD_LIBRARY_PATH=${ADDITIONAL_LD_LIBRARY_PATH}" @@ -191,7 +169,8 @@ foreach(script ${INTERACTIVE_TEST_SCRIPT_FILES}) ) # Add a ctest label to these tests for easy filtering. - set_property(TEST ${target} APPEND PROPERTY LABELS MayaHydraInteractive) + apply_labels_to_test("${all_labels}" ${target}) + endforeach() # C++ unit tests diff --git a/test/lib/mayaUsd/render/mayaToHydra/README.md b/test/lib/mayaUsd/render/mayaToHydra/README.md index f32dc05913..6779cbe543 100644 --- a/test/lib/mayaUsd/render/mayaToHydra/README.md +++ b/test/lib/mayaUsd/render/mayaToHydra/README.md @@ -96,6 +96,43 @@ To create a reference snapshot, an easy way is to first write your test, and the :warning: **Important note** : While there *is* an `assertSnapshotEqual` method, its use is discouraged, as renders can differ very slightly between renderer architectures. +# Adding labels for tests +ctest allows attaching labels to tests to determine whether a test needs to be run or not. + +For example, you might have some tests that are all related to 'performance', so you label them with 'performance'. Other tests might be about 'security', so you label them 'security'. Later, when you want to run your tests, you can tell CTest to only run the tests with a certain label. Say you only want to run your 'performance' tests. You can tell CTest to do this by using the `-L` option followed by 'performance'. CTest will then only run the tests that have the 'performance' label, and ignore the rest. Similarly, tests can be excluded by passing arguments to `-LE` flag. + +To add label in MayaHydra test suite +1. For any particlar unit test of interest in [CMakeLists.txt](./CMakeLists.txt), add the required labels with the following convention: + `testMyTestFile.py|depOnPlugins:lookdev,mtoa,newPlugin|skipOnPlatform:[osx,win,lin]` +2. Where the label groups follows the unit test name and are separated by `'|'`. You may have multiple label groups. +3. The label groups are of key:values type. They label key can be any meaningful string and has correspondence to the accompanying [json file](../../../../../../maya-hydra/tests-to-run.json) +4. The label values are comma separated lists. The values are added to the test via cmake's `set_tests_properties` + +MayaHydra currently is filtering tests based on dependent plugins and platform on which to run them. + +To add flags to ctest commandline, modify the corresponding [JSON file](../../../../../../maya-hydra/tests-to-run.json) to indicate which test to run or skip. +For ex: if you want to run only tests tagged with "lookdevx" then edit the json file like so: `"plugins_to_include": ["lookdevx]`. If the include list is empty, all tests are run by default. Similarly, edit `"plugin_to_exclude"` in the json file to skip test with certain labels. + +Note that for platform dependent runs, we only support exclusion mode for a single platform. So if you tag the test `skipOnPlatform:osx`, it skips on MacOS. No corresponding changes to json file is required in this case. + +Label mapping +As mentioned earlier in (4), the label key/values in CMakeLists have a correspondence to the values in [JSON file](../../../../../../maya-hydra/tests-to-run.json). For ex: +A line in CMakeLists.txt like so: +`testMyNewTestFile|depOnPlugins:lookdevx,mtoa` would have a corresponding JSON file like so: +`"plugins_to_include": ["lookdevx","mtoa"]` + +`testAnotherTestFile||depOnPlugins:bifrost` would have a corresponding JSON file like so: +`"plugins_to_exclude": ["bifrost"]` + +Similar pattern applies for exclusion/inclusion of tests by filenames except that there is no correpsonding change required in CMakeLists.txt as the pattern matching is by the test name. + +Note that `depOnPlugins` key string is only used as cue while adding values in the JSON. The variables in the JSON file and the label values in the CMakeLists.txt are what get used by ctest for label matching. +`"files_to_exclude": ["testStandardSurface"]` + +The supported values for platform exclusion are: "osx", "win", "lin". + + + # Utilities Utility files are located under [/test/testUtils](../../../../testUtils/). Note that at the time of writing this (2023/08/16), many of the utils files and their contents were inherited from the USD plugin, and are not all used. diff --git a/tests-to-run.json b/tests-to-run.json new file mode 100644 index 0000000000..dcaf04dbb2 --- /dev/null +++ b/tests-to-run.json @@ -0,0 +1,7 @@ +{ + "files_to_include": [], + "files_to_exclude": [], + "plugins_to_include": [], + "plugins_to_exclude": [], + "platforms_to_exclude": ["osx"] +} \ No newline at end of file From c47d2e0ac02d470a54cd50e57511f476d22b62c0 Mon Sep 17 00:00:00 2001 From: roopavr-adsk <134624277+roopavr-adsk@users.noreply.github.com> Date: Mon, 10 Jun 2024 10:35:38 -0400 Subject: [PATCH 2/7] This PR contain fixes for bugs with aiSkyDomeLight when using Arnold Render Delegate. (#135) 1. Fixes black renders when the dome light is selected. 2. Fixes light param updates not working. --- .../adapters/aiSkydomeLightAdapter.cpp | 27 ++++++++++++------- .../adapters/renderItemAdapter.cpp | 13 --------- .../adapters/renderItemAdapter.h | 12 +-------- .../sceneIndex/mayaHydraSceneIndex.cpp | 19 ++++++++++--- 4 files changed, 34 insertions(+), 37 deletions(-) diff --git a/lib/mayaHydra/hydraExtensions/adapters/aiSkydomeLightAdapter.cpp b/lib/mayaHydra/hydraExtensions/adapters/aiSkydomeLightAdapter.cpp index 0f94c8257a..7dc58be067 100644 --- a/lib/mayaHydra/hydraExtensions/adapters/aiSkydomeLightAdapter.cpp +++ b/lib/mayaHydra/hydraExtensions/adapters/aiSkydomeLightAdapter.cpp @@ -104,7 +104,8 @@ class MayaHydraAiSkyDomeLightAdapter : public MayaHydraLightAdapter // We are not using precomputed attributes here, because we don't have // a guarantee that mtoa will be loaded before mayaHydra. - if (paramName == HdLightTokens->color) { + if (paramName == HdLightTokens->color || + paramName == UsdLuxTokens->inputsColor) { const auto plug = light.findPlug("color", true); MPlugArray conns; plug.connectedTo(conns, true, false); @@ -150,23 +151,29 @@ class MayaHydraAiSkyDomeLightAdapter : public MayaHydraLightAdapter } } return VtValue(GfVec3f(r,g,b)); - } else if (paramName == HdLightTokens->intensity) { + } else if (paramName == HdLightTokens->intensity || + paramName == UsdLuxTokens->inputsIntensity) { return VtValue(light.findPlug("intensity", true).asFloat()); - } else if (paramName == HdLightTokens->diffuse) { + } else if (paramName == HdLightTokens->diffuse || + paramName == UsdLuxTokens->inputsDiffuse) { MPlug aiDiffuse = light.findPlug("aiDiffuse", true, &status); if (status == MS::kSuccess) { return VtValue(aiDiffuse.asFloat()); } - } else if (paramName == HdLightTokens->specular) { + } else if (paramName == HdLightTokens->specular || + paramName == UsdLuxTokens->inputsSpecular) { MPlug aiSpecular = light.findPlug("aiSpecular", true, &status); if (status == MS::kSuccess) { return VtValue(aiSpecular.asFloat()); } - } else if (paramName == HdLightTokens->exposure) { + } else if (paramName == HdLightTokens->exposure || + paramName == UsdLuxTokens->inputsExposure) { return VtValue(light.findPlug("aiExposure", true).asFloat()); - } else if (paramName == HdLightTokens->normalize) { + } else if (paramName == HdLightTokens->normalize || + paramName == UsdLuxTokens->inputsNormalize) { return VtValue(light.findPlug("aiNormalize", true).asBool()); - } else if (paramName == HdLightTokens->textureFormat) { + } else if (paramName == HdLightTokens->textureFormat || + paramName == UsdLuxTokens->inputsTextureFormat) { const auto format = light.findPlug("format", true).asShort(); // mirrored_ball : 0 // angular : 1 @@ -178,7 +185,8 @@ class MayaHydraAiSkyDomeLightAdapter : public MayaHydraLightAdapter } else { return VtValue(UsdLuxTokens->automatic); } - } else if (paramName == HdLightTokens->textureFile) { + } else if (paramName == HdLightTokens->textureFile || + paramName == UsdLuxTokens->inputsTextureFile) { // Be aware that dome lights in HdStorm always need a texture to work correctly, // the color is not used if no texture is present. @@ -220,7 +228,8 @@ class MayaHydraAiSkyDomeLightAdapter : public MayaHydraLightAdapter // SdfAssetPath requires both "path" "resolvedPath" return VtValue(SdfAssetPath(fileTextureName, fileTextureName)); - } else if (paramName == HdLightTokens->enableColorTemperature) { + } else if (paramName == HdLightTokens->enableColorTemperature || + paramName == UsdLuxTokens->inputsEnableColorTemperature) { return VtValue(false); } return {}; diff --git a/lib/mayaHydra/hydraExtensions/adapters/renderItemAdapter.cpp b/lib/mayaHydra/hydraExtensions/adapters/renderItemAdapter.cpp index 941fa0d6ef..0dddc8b718 100644 --- a/lib/mayaHydra/hydraExtensions/adapters/renderItemAdapter.cpp +++ b/lib/mayaHydra/hydraExtensions/adapters/renderItemAdapter.cpp @@ -154,19 +154,12 @@ void MayaHydraRenderItemAdapter::UpdateFromDelta(const UpdateFromDeltaData& data dirtyBits |= HdChangeTracker::DirtyPrimvar; // displayColor primVar } - const bool displayStatusChanged = (_displayStatus != data._displayStatus); - _displayStatus = data._displayStatus; const bool hideOnPlayback = data._ri.isHideOnPlayback(); if (hideOnPlayback != _isHideOnPlayback) { _isHideOnPlayback = hideOnPlayback; dirtyBits |= HdChangeTracker::DirtyVisibility; } - //Special case for aiSkydomeLight which is visible only when it is selected - if (_isArnoldSkyDomeLightTriangleShape && displayStatusChanged){ - SetVisible(IsRenderItemSelected()); - dirtyBits |= HdChangeTracker::DirtyVisibility; - } else if (visibChanged) { SetVisible(visible); dirtyBits |= HdChangeTracker::DirtyVisibility; @@ -523,12 +516,6 @@ void MayaHydraRenderItemAdapter::SetPlaybackChanged() } } -bool MayaHydraRenderItemAdapter::IsRenderItemSelected() const -{ - return (MHWRender::DisplayStatus::kActive == _displayStatus) || - (MHWRender::DisplayStatus::kLead == _displayStatus); -} - HdCullStyle MayaHydraRenderItemAdapter::GetCullStyle() const { // HdCullStyleNothing means no culling, HdCullStyledontCare means : let the renderer choose diff --git a/lib/mayaHydra/hydraExtensions/adapters/renderItemAdapter.h b/lib/mayaHydra/hydraExtensions/adapters/renderItemAdapter.h index 636802d95b..67e9db4647 100644 --- a/lib/mayaHydra/hydraExtensions/adapters/renderItemAdapter.h +++ b/lib/mayaHydra/hydraExtensions/adapters/renderItemAdapter.h @@ -113,9 +113,6 @@ class MayaHydraRenderItemAdapter : public MayaHydraAdapter MAYAHYDRALIB_API const MColor& GetWireframeColor() const { return _wireframeColor; } - MAYAHYDRALIB_API - MHWRender::DisplayStatus GetDisplayStatus() const { return _displayStatus; } - MAYAHYDRALIB_API GfMatrix4d GetTransform() override { return _transform[0]; } @@ -139,19 +136,16 @@ class MayaHydraRenderItemAdapter : public MayaHydraAdapter UpdateFromDeltaData( MRenderItem& ri, unsigned int flags, - const MColor& wireframeColor, - MHWRender::DisplayStatus displayStatus) + const MColor& wireframeColor) : _ri(ri) , _flags(flags) , _wireframeColor(wireframeColor) - , _displayStatus(displayStatus) { } MRenderItem& _ri; unsigned int _flags; const MColor& _wireframeColor; - MHWRender::DisplayStatus _displayStatus; }; /// We receive in that function the changes made in the Maya viewport between the last frame @@ -192,9 +186,6 @@ class MayaHydraRenderItemAdapter : public MayaHydraAdapter MAYAHYDRALIB_API bool GetIsRenderITemAnaiSkydomeLightTriangleShape() const {return _isArnoldSkyDomeLightTriangleShape;} - MAYAHYDRALIB_API - bool IsRenderItemSelected() const; - private: MAYAHYDRALIB_API void _RemoveRprim(); @@ -216,7 +207,6 @@ class MayaHydraRenderItemAdapter : public MayaHydraAdapter bool _visible = false; MColor _wireframeColor = { 1.f, 1.f, 1.f, 1.f }; bool _isHideOnPlayback = false; - MHWRender::DisplayStatus _displayStatus = MHWRender::DisplayStatus::kNoStatus; bool _isArnoldSkyDomeLightTriangleShape = false; GfBBox3d _bounds;//Bounding box }; diff --git a/lib/mayaHydra/hydraExtensions/sceneIndex/mayaHydraSceneIndex.cpp b/lib/mayaHydra/hydraExtensions/sceneIndex/mayaHydraSceneIndex.cpp index 8e7d7e88db..869b8dbda1 100644 --- a/lib/mayaHydra/hydraExtensions/sceneIndex/mayaHydraSceneIndex.cpp +++ b/lib/mayaHydra/hydraExtensions/sceneIndex/mayaHydraSceneIndex.cpp @@ -183,6 +183,16 @@ namespace { return mayaPath; } + bool IsTexturedSkyDomeRenderItem(const SdfPath& name) + { + static const std::string _aiTexturedSkyDome("texturedSkyDome"); + if (name.GetString().find(_aiTexturedSkyDome) != std::string::npos) { + // This render item is an texturedDomeLighnt + return true; + } + return false; + } + SdfPath _GetPrimPath(const SdfPath& base, const MDagPath& dg) { return base.AppendPath(GetMayaPrimPath(dg)); @@ -474,7 +484,10 @@ void MayaHydraSceneIndex::HandleCompleteViewportScene(const MDataServerOperation MayaHydraRenderItemAdapterPtr ria = nullptr; if (!_GetRenderItem(fastId, ria)) { const SdfPath slowId = _GetRenderItemPrimPath(ri); - if (slowId.IsEmpty()) { + + // Maya/MtoA adds texturedSkyDome mesh object for VP2. + // We do not want that to be translated to Hydra + if (slowId.IsEmpty() || IsTexturedSkyDomeRenderItem(slowId)) { continue; } // MAYA-128021: We do not currently support maya instances. @@ -500,18 +513,16 @@ void MayaHydraSceneIndex::HandleCompleteViewportScene(const MDataServerOperation } MColor wireframeColor; - MHWRender::DisplayStatus displayStatus = MHWRender::kNoStatus; MDagPath dagPath = ri.sourceDagPath(); if (dagPath.isValid()) { wireframeColor = MGeometryUtilities::wireframeColor( dagPath); // This is a color managed VP2 color, it will need to be unmanaged at some // point - displayStatus = MGeometryUtilities::displayStatus(dagPath); } const MayaHydraRenderItemAdapter::UpdateFromDeltaData data( - ri, flags, wireframeColor, displayStatus); + ri, flags, wireframeColor); ria->UpdateFromDelta(data); if (flags & MDataServerOperation::MViewportScene::MVS_changedMatrix) { ria->UpdateTransform(ri); From dc8af2ef51994c102e48969e0c44c394123679cc Mon Sep 17 00:00:00 2001 From: lilike-adsk <134404162+lilike-adsk@users.noreply.github.com> Date: Thu, 13 Jun 2024 16:31:27 -0400 Subject: [PATCH 3/7] add missing space in resource path for Mac/Linux (#137) --- modules/mayaHydra.mod.template | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/mayaHydra.mod.template b/modules/mayaHydra.mod.template index 9d1ffb968f..8deb2f43e7 100644 --- a/modules/mayaHydra.mod.template +++ b/modules/mayaHydra.mod.template @@ -14,5 +14,5 @@ icons: plug-ins: lib/maya presets: scripts: -resources: +resources: ${PXR_OVERRIDE_PLUGINPATH_NAME}+:=lib/usd From a9d0fea43f0b38a1af1fff483b12c2045d102168 Mon Sep 17 00:00:00 2001 From: debloip-adsk <145056365+debloip-adsk@users.noreply.github.com> Date: Thu, 13 Jun 2024 16:32:06 -0400 Subject: [PATCH 4/7] HYDRA-845 : Selection highlighting for point instancing of meshes (#132) * Working point instancer highlighting with the different nested/propagated cases * Add PrimsRemoved support * Refactor SceneIndexPath method to return multiple selections + instances * Use _CreateShMirrors in ctor * Individual instance highlighting * Propagate dirtying from original prims to selection highlight mirrors * Allow multiple selections per prim across multiple conversions * Base prototype selection highlight support * Cleanup * Cleanup of wireframe selection highlight scene index * Use refinedWire vs refinedWireOnSurface in appropriate cases * Hardcode wireframe color for now * Refactor method to get selection highlight path of a prim * Rework selection highlight repathing data sources * Cleanup GetPrim * Rename methods for collecting affected SdfPaths * Cleanup * Reduce GetPrim calls * Move out some utility functions out of class * Cleanup * Reorder methods * Minor cleanup * Renaming methods and variables * Cleanup GetChildPrimPaths, PrimsAdded and PrimsRemoved * Change access of maps * Propagate selection data sources to prototypes * Refactor _PrimsDirtied * Handle prototype ancestor selection * Highlight instancers if ancestor is highlighted * Fix dirtying issue with selection highlight not following prims * Remove obsolete methods * Cleanup * Reorder methods to build selection highlight mirror graph * Cleanup * Fix prim dirtying for masks and selection highlights * Avoid accumulating values in maps indefinitely * Extract out common code for creating instancer highlight into a method * Bring back original wireframe highlight color code * Add comments to document certain behaviors * Extract out traversal method * Adjust comment * Only highlight instancers through ancestors for non-prototypes * Small check to avoid dirtying needlessly * Rebuild instancer highlights * Update existing selection highlighting doc * Start documenting point instancing selection highlighting * Add doc paragraph on nested/composed instancers * Doc corrections * Correct comment * Add doc to describe current behaviors * Update behavior to be more consistent and update comments * Add images to documentation * Clarify nesting and composition of instancers * Add scene structure examples * Add test for point instancer selection highlight * Ensure other instancers are not highlight when selecting top instancer ancestor * Add instance highlight test * Delete USD stage * Fix USD stage * Fix point instancer and instance tests * Add prototype selection test * Cleanup test files * Minor doc correction * Use TfSmallVector for PrimSelectionInfoVector * Rename ConvertUfeSelectionToHydra * Add comment on FindFullySelectedAncestorsInclusive * Remove no longer used code * Accumulate selection dirtied notifs * Allow multiple prim paths for the lead UFE object * Revert data producer example * Various cleanups * Clean wireframe scene index header * Header cleanups * Remove SdfPath forward declaration * Fix Linux warning * Rename instancerHighlightUsers * Fix disrespected axiom * Cleanup test and add some comments * Better document the USD conversion of UFE to Hydra paths * Update current limitations * Add comments in wireframe scene index * Work around non-const schema getters for USD versions before 24.05 * Update test to compare selected paths from scene index observer and intended selections + adjust asserts vs expects * Add images of selection highlight results * Update implementation doc for point instancer/instance and add section on prototype highlight * Change an axiom to a verify * Add back reserve call in selectionSceneIndex * Minor doc corrections * Add verify for instance selection numeric path component * Fix mask verification * Cleanup testMergingSceneIndex edits * Add comment on fully selected when instance selecting * Add more comments to test * Minor adjustments to test * Add another comment in test * Rename _IsInstancingRoot * Rework prototype roots vs hierarchies * Whitespace fix * Update comments on PathInterface * Refactor pushHydraSelectionsToPathVector * Minor doc clarifications * Rename PrimSelectionInfo to PrimSelection * Rename isLeadPrim to isLeadObjectPrim * Rename ConvertUfePathToHydraSelections to UfePathToPrimSelections * Reformat comment * Add back SceneIndexPath method * Revert unrelated tests changes * Rename hydra selections to prim selections * Add SceneIndexPaths method for multi prim paths * Extract out code blocks into anonymous namespace funcs * Expose selection highlight mirror tag in wireframe scene index public API * Add mermaid graph to visualize instancer relationships --- doc/images/instanceSelectionHighlight.png | Bin 0 -> 35868 bytes doc/images/instanceTranslations.png | Bin 0 -> 2076 bytes doc/images/instancedBy.png | Bin 0 -> 1307 bytes doc/images/instancerTopology.png | Bin 0 -> 1737 bytes .../pointInstancerSelectionHighlight.png | Bin 0 -> 36285 bytes doc/images/prototypeSelectionHighlight.png | Bin 0 -> 43988 bytes doc/selectionHighlightingArchitecture.md | 242 +++++- ...fvpBlockPrimRemovalPropagationSceneIndex.h | 4 +- .../sceneIndex/fvpMergingSceneIndex.cpp | 10 +- .../sceneIndex/fvpMergingSceneIndex.h | 2 +- .../sceneIndex/fvpPathInterface.cpp | 34 + .../sceneIndex/fvpPathInterface.h | 48 +- .../sceneIndex/fvpPathInterfaceSceneIndex.h | 2 +- .../sceneIndex/fvpSelectionSceneIndex.cpp | 62 +- .../sceneIndex/fvpSelectionSceneIndex.h | 2 +- ...pWireframeSelectionHighlightSceneIndex.cpp | 729 +++++++++++++++++- ...fvpWireframeSelectionHighlightSceneIndex.h | 58 +- lib/flowViewport/selection/fvpSelection.cpp | 55 +- lib/flowViewport/selection/fvpSelection.h | 17 +- .../mhLeadObjectPathTracker.cpp | 33 +- .../hydraExtensions/mhLeadObjectPathTracker.h | 6 +- .../mhWireframeColorInterfaceImp.cpp | 2 +- .../sceneIndex/mayaHydraSceneIndex.cpp | 14 +- .../sceneIndex/mayaHydraSceneIndex.h | 2 +- .../mhDirtyLeadObjectSceneIndex.cpp | 10 +- .../sceneIndex/mhDirtyLeadObjectSceneIndex.h | 2 +- .../sceneIndex/registration.cpp | 91 ++- lib/mayaHydra/mayaPlugin/renderOverride.cpp | 2 +- .../mayaUsd/render/mayaToHydra/CMakeLists.txt | 1 + .../render/mayaToHydra/cpp/CMakeLists.txt | 1 + .../testPointInstancingWireframeHighlight.cpp | 390 ++++++++++ .../testPointInstancingWireframeHighlight.py | 50 ++ .../CubeModel.usda | 190 +++++ .../NestedAndComposedPointInstancers.usda | 85 ++ .../PyramidModel.usda | 109 +++ 35 files changed, 2092 insertions(+), 161 deletions(-) create mode 100644 doc/images/instanceSelectionHighlight.png create mode 100644 doc/images/instanceTranslations.png create mode 100644 doc/images/instancedBy.png create mode 100644 doc/images/instancerTopology.png create mode 100644 doc/images/pointInstancerSelectionHighlight.png create mode 100644 doc/images/prototypeSelectionHighlight.png create mode 100644 test/lib/mayaUsd/render/mayaToHydra/cpp/testPointInstancingWireframeHighlight.cpp create mode 100644 test/lib/mayaUsd/render/mayaToHydra/cpp/testPointInstancingWireframeHighlight.py create mode 100644 test/testSamples/testPointInstancingWireframeHighlight/CubeModel.usda create mode 100644 test/testSamples/testPointInstancingWireframeHighlight/NestedAndComposedPointInstancers.usda create mode 100644 test/testSamples/testPointInstancingWireframeHighlight/PyramidModel.usda diff --git a/doc/images/instanceSelectionHighlight.png b/doc/images/instanceSelectionHighlight.png new file mode 100644 index 0000000000000000000000000000000000000000..7c0faa96dc6257a0bdd413c0fffcbe6757e54c54 GIT binary patch literal 35868 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 Y|M|Jt0~31YNHG9`r>mdKI;Vst0FV7=W&i*H literal 0 HcmV?d00001 diff --git a/doc/images/instanceTranslations.png b/doc/images/instanceTranslations.png new file mode 100644 index 0000000000000000000000000000000000000000..e154d700c4e539eb90469b998926a62f0b3d6552 GIT binary patch literal 2076 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 literal 0 HcmV?d00001 diff --git a/doc/images/pointInstancerSelectionHighlight.png b/doc/images/pointInstancerSelectionHighlight.png new file mode 100644 index 0000000000000000000000000000000000000000..1097cf5668ed3363c0a3f9ce30ab5d2593fd926f GIT binary patch literal 36285 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 MvW>B|B_j3sf2y7{$p8QV literal 0 HcmV?d00001 diff --git a/doc/images/prototypeSelectionHighlight.png b/doc/images/prototypeSelectionHighlight.png new file mode 100644 index 0000000000000000000000000000000000000000..06c9baf5c53fbdbb71b23f31de5480a73b07a20e GIT binary patch literal 43988 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�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⪼&qfsr$$TRs>NOAB{$gDsMrUNp^Y2}IY=pHB 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 OaMMuHR<2UCiuiwS4Z%qO literal 0 HcmV?d00001 diff --git a/doc/selectionHighlightingArchitecture.md b/doc/selectionHighlightingArchitecture.md index 4168f08252..0e6796bbdb 100644 --- a/doc/selectionHighlightingArchitecture.md +++ b/doc/selectionHighlightingArchitecture.md @@ -8,7 +8,7 @@ supports Hydra rendering in this repository as the Flow Viewport Toolkit (name subject to change). This document will describe the state of Flow Viewport Toolkit selection -highlighting as of 21-Sep-2023. +highlighting as of 31-May-2024. ## Behavior @@ -18,8 +18,9 @@ are shown differently in the viewport for ease of understanding. An application will provide a way to select an object, or to select components of an object. For example, for a mesh object, these components may be points, -edges, or faces. At time of writing, only object selection highlighting is -supported, and selection highlighting of components is unimplemented. +edges, or faces. Currently, only object selection highlighting and point +instancing highlighting of meshes are supported. Selection highlighting of +components is unimplemented. ## Selection: Application versus Hydra @@ -27,7 +28,8 @@ The application maintains an edit-friendly version of the scene. This scene is translated into a Hydra scene by scene indices. Correspondingly, there are two versions of the selection, one in the application, with objects and their paths described with application-specific classes, and a version of the selection in -the Hydra scene, described as prims and their `SdfPath`s +the Hydra scene, described as prims and their `SdfPath`s, as well as their +associated selection data sources. ## Requirements @@ -45,8 +47,8 @@ Requirements for selection highlighting are: highlight appearance. - It must be possible to let a data injecting data model provide prims to Hydra - that already contain selection highlighting. At time of writing - (19-Sep-2023), this is true of Maya native Dag data, where selection + that already contain selection highlighting. Currently, + this is true of Maya native Dag data, where selection highlighting is done by OGS. ## Selection Highlighting Styles @@ -59,16 +61,16 @@ special way, e.g. object contour, modified object color, or object overlay. The former approach is handled by having a plugin provide a selection highlighting filtering scene index to the Flow Viewport Toolkit, and is the -topic of this document at time of writing (20-Sep-2023). The -latter is handled by having a plugin provide a selection highlighting -task to the Flow Viewport Toolkit, and is currently unimplemented. +topic of this document at time of writing. The latter is handled by having +a plugin provide a selection highlighting task to the Flow Viewport Toolkit, +and is currently unimplemented. ## Added Geometry Plugin Software Architecture Requirements A selection highlighting plugin that provides added geometry to scene must provide the following services: -- A way to translate the application's selection path(s) into Hydra paths: +- A way to translate the application's selection path(s) into Hydra paths and data sources: - So that the appropriate prims in Hydra can be dirtied on selection change. - So that selected prims in Hydra can have a data source added. This is embodied in a **Path interface**. @@ -83,8 +85,8 @@ provide the following services: ### Selection Change This -[selection change code](../lib/flowViewport/sceneIndex/fvpSelectionSceneIndex.cpp#L150-L167) -shows the use of the *Path Interface*, through the *SceneIndexPath()* method, +[selection change code](../lib/flowViewport/sceneIndex/fvpSelectionSceneIndex.cpp#L152-L173) +shows the use of the *Path Interface*, through the *UfePathToPrimSelections()* method, called on the input scene index. The path interface allows the selection scene index to translate selected application paths to selected Hydra scene index paths. @@ -92,7 +94,7 @@ paths. ### Wireframe Selection Highlighting This -[wireframe selection highlighting code](../lib/flowViewport/sceneIndex/fvpWireframeSelectionHighlightSceneIndex.cpp#L76-L97) +[wireframe selection highlighting code](../lib/flowViewport/sceneIndex/fvpWireframeSelectionHighlightSceneIndex.cpp#L462-L465) shows the use of the *Selection*, through the *HasFullySelectedAncestorInclusive()* method, called on the input selection. The selection allows a selection highlighting filtering scene index to query @@ -178,7 +180,7 @@ index is optional. The object modeling is the following: - **Selection**: builtin provided by the Flow Viewport Toolkit. - - Encapsulates the Hydra selection as scene index paths. + - Encapsulates the Hydra selection as scene index paths and selection data sources. - Is shared by the selection scene index and all selection highlighting scene indices. - **Selection scene index**: builtin provided by the Flow Viewport Toolkit. @@ -232,7 +234,7 @@ class Selection{ } class PathInterface{ -+SceneIndexPath(Ufe::Path) SdfPath ++UfePathToPrimSelections(Ufe::Path) SdfPath } class SelectionSceneIndex @@ -287,3 +289,213 @@ WireframeSelectionHighlightSceneIndex o-- Selection : Read propagate across scene index inputs, so that if a Maya Dag ancestor is selected, a USD descendant's appearance can change. This is the same situation as global transformation and visibility. + +## Mesh point instancing wireframe selection highlighting + +We currently support wireframe selection highlighting for point instancing of meshes +for the three different point instancing selection modes : + +- Point Instancer + +![Point instancer selection highlight](images/pointInstancerSelectionHighlight.png) + +- Instance + +![Instance selection highlight](images/instanceSelectionHighlight.png) + +- Prototype + +![Prototype selection highlight](images/prototypeSelectionHighlight.png) + +Here is an overview of how point instancing works in Hydra, and how we implement +wireframe selection highlighting for it. + +### Scene index structure + +In Hydra, a point instancer is represented as a prim of type `instancer`, +with an `instancerTopology` data source. + +![instancerTopology data source](images/instancerTopology.png) + +This data source contains three relevant inner data sources : +- The `prototypes` data source, of type `VtArray`, lists the paths +to each prototype this point instancer instances. +- The `instanceIndices` data source, a vector data source where each element +data source (`i0, i1, i2, etc.`) is of type `VtArray` and contains +which instances correspond to which prototype. For example, if `i1` contains +`0, 3`, then the first and fourth instances will be using the second prototype. +- The `mask` data source, of type `VtArray`, which can optionally be used +to show/hide specific instances (e.g. if the 3rd element of the mask is `false`, +then the 3rd instance will be hidden). If this array is empty, all instances will be +shown. + +--- + +Per-instance data is specified using primvar data sources, namely : +- hydra:instanceTranslations +- hydra:instanceRotations +- hydra:instanceScales +- hydra:instanceTransforms + +![instanceTranslations primvar data source](images/instanceTranslations.png) + +Where the corresponding primvarValue data source lists the instance-specific data. +Note that while the first three are 3-dimensional vectors and `hydra:instanceTransforms` +is a 4x4 matrix, they can all be used simultaneously (internally, they will all be +converted to 4x4 matrices, and then multiplied together). + +--- + +On the other end of instancing, prototype prims have an `instancedBy` data source. + +![instancedBy data source](images/instancedBy.png) + +This data source contains up to two inner data sources : +- (required) : The `paths` data source, of type `VtArray`, lists the paths +to each instancer that instances this prototype. +- (optional) : When a sub-hierarchy is prototyped, the `prototypeRoots`, of type +`VtArray`, lists the paths to the roots of the sub-hierarchies that are being +prototyped. For example, if we are instancing an xform that has a child mesh, +then the prototype xform and mesh prims will each have the same `instancedBy` data source, +where the `paths` data source will point to the instancers that use this prototype, and +where the `prototypeRoots` will point to the xform prim. + +--- + +Some notes about the behavioral impacts of the hierarchical location of prims : +- Prims that are rooted under an instancer will not be drawn unless instanced +- Prototypes that are instanced will still be drawn as if they were not instanced +(i.e. the instances will be drawn in addition to the base prim itself), unless as +mentioned they are rooted under an instancer. + +### Nested/Composed instancers + +It is possible for an instancer itself to be instanced by another, and thus have both the +`instancerTopology` and the `instancedBy` data sources. Note that this does not preclude +such a prototyped instancer from also drawing geometry itself. If the prototyped instancer +is a child of the instancing instancer, then yes, such a nested instancer will not draw by +itself, and will be instance-drawn through the parent instancer. However, if the prototyped +instancer has no parent instancer, but it is instanced by another instancer somewhere else +in the hierarchy, then both the prototyped instancer will draw as if it were by itself, but +also be instance-drawn by the other instancer. + +This nesting and composition of instancers is what leads to most of the complexity of point +instancing selection highlighting. We can view such nesting and composition of instancers as +graphs, with the vertices being the instancer prims, and the edges being the paths contained +in the `instancerTopology/prototypes`, `instancedBy/paths` and `instancedBy/prototypeRoots` +data sources, as well as parent-child relationships. + +For example, given the following scene structure : +``` +Root +|__TopInstancer +| |__NestedInstancer +| | |__LeafInstancer +| | |__PrototypePrim +| | |__PrototypeSubPrim +|__AnotherPrototypePrim + |__ChildInstancer +``` + +```mermaid +graph LR + TopInstancer -->|instancerTopology/prototypes| NestedInstancer + NestedInstancer -->|instancerTopology/prototypes| LeafInstancer + LeafInstancer -->|instancedBy/paths| NestedInstancer + NestedInstancer -->|instancedBy/paths| TopInstancer + LeafInstancer -->|instancerTopology/prototypes| PrototypePrim + PrototypePrim -->|instancedBy/paths| LeafInstancer + PrototypeSubPrim -->|instancedBy/prototypeRoots| PrototypePrim + + TopInstancer -->|instancerTopology/prototypes| AnotherPrototypePrim + AnotherPrototypePrim -->|parent-child relationship| ChildInstancer + ChildInstancer -->|instancedBy/prototypeRoots| AnotherPrototypePrim + ChildInstancer -->|instancedBy/paths| TopInstancer +``` + +### Implementation for point instancer and instance selection + +This section will focus on selection highlighting when trying to highlight point instancers +as a whole or specific instances, as these require a more complicated workflow. Unlike standard +selection, we cannot simply override instanced meshes to use the `refinedWireOnSurf`/`wireOnSurf` +HdReprs, as that would lead to highlighting all instances of the prototype all the time. Instead, +we opt for the following approach : when an instancer is selected (entirely or only certain instances), +we will create a mirror of the instancing graph it is a part of, and make the mirror copies of the +instanced meshes draw with a wireframe representation. This mirror graph includes everything from +the most deeply buried prims to the topmost instancers; anything that this instancer affects or is +affected by, including itself. In practice, this means that each prototype and each instancer will +have a corresponding mirror prim for selection highlighting, that will be located alongside it as +a sibling. This way, any parent transforms affecting the original prim will also affect the selection +highlight mirror prim. + +For example, given the following scene structure : +``` +Root +|__TopInstancer + |__NestedInstancer + |__Prototype +``` +the resulting scene structure with selection highlighting would become : +``` +Root +|__TopInstancer +| |__NestedInstancer +| | |__Prototype +| | |__Prototype_SelectionHighlight +| |__NestedInstancer_SelectionHighlight +|__TopInstancer_SelectionHighlight +``` +where `TopInstancer_SelectionHighlight` would instance `NestedInstancer_SelectionHighlight`, which would in turn instance `Prototype_SelectionHighlight`. + +Note that in the case where a prototype is not a single prim but a sub-hierarchy, we only need to +create a single *explicit* selection highlight mirror prim for the whole prototype sub-hierarchy; the +child prims of the selection highlight mirror will simply be pulled from the corresponding original +prim, and thus implicitly be selection highlight mirrors as well. + +Another thing to be aware of is that a nested/composed instancer is not necessarily directly selected, +as it is not necessarily a prototype root itself. If an instancer is a child prim of another prim +that is itself selected or instanced by another instancer, these instancers are still composed +together, but will not point to each other directly. Such cases are an example of when we need to +use the `instancedBy/prototypeRoots` data source to properly construct the mirror graph of instancers. + +An example of this is the following : +``` +Root +|__TopInstancer + |__Prototype + |__ChildInstancer +``` +for which we end up with : +``` +Root +|__TopInstancer +| |__Prototype +| | |__ChildInstancer +| |__Prototype_SelectionHighlight +| |__ChildInstancer +|__TopInstancer_SelectionHighlight +``` +where `TopInstancer_SelectionHighlight` instances `Prototype_SelectionHighlight`, which implicitly draws the selection highlight version of `ChildInstancer`. + +Of note are the following selection highlighting scenarios and their corresponding behaviors : +- Selecting a point instancer in its entirety + - If the instancer is a top-level instancer, all instances it draws WILL be highlighted. + - If the instancer is a prototype, instances of itself drawn by other instancers will NOT be highlighted. + This is an intentional workflow decision from the Hydra for Maya team. +- Selecting specific instances of point instancer + - If the instancer is a top-level instancer, the selected instances it draws WILL be highlighted. + - If the instancer is a prototype, the instances it would indirectly draw through instances of itself drawn by other instancers will NOT be highlighted. + This is an intentional workflow decision from the Hydra for Maya team. +- Selecting a parent prim of a point instancer + - (same as selecting a point instancer in its entirety) + +### Implementation for prototype selection + +We simply do as for a regular selection, and override the original prim's display style +to draw as a wireframe-on-surface representation. + +### Current limitations + +- The wireframe colors for point instancer & instance selections might not always be correct (with + respect to the lead/active selection colors). However, prototype selections should be using the + correct colors. \ No newline at end of file diff --git a/lib/flowViewport/sceneIndex/fvpBlockPrimRemovalPropagationSceneIndex.h b/lib/flowViewport/sceneIndex/fvpBlockPrimRemovalPropagationSceneIndex.h index a8e5f7f1f4..2ba8311f45 100644 --- a/lib/flowViewport/sceneIndex/fvpBlockPrimRemovalPropagationSceneIndex.h +++ b/lib/flowViewport/sceneIndex/fvpBlockPrimRemovalPropagationSceneIndex.h @@ -70,8 +70,8 @@ class BlockPrimRemovalPropagationSceneIndex : public PXR_NS::HdSingleInputFilter //from PathInterface FVP_API - PXR_NS::SdfPath SceneIndexPath(const Ufe::Path& appPath) const override{ - return _pathInterface->SceneIndexPath(appPath); + PrimSelections UfePathToPrimSelections(const Ufe::Path& appPath) const override{ + return _pathInterface->UfePathToPrimSelections(appPath); } protected: diff --git a/lib/flowViewport/sceneIndex/fvpMergingSceneIndex.cpp b/lib/flowViewport/sceneIndex/fvpMergingSceneIndex.cpp index 6a46bfbe80..912d51bc10 100644 --- a/lib/flowViewport/sceneIndex/fvpMergingSceneIndex.cpp +++ b/lib/flowViewport/sceneIndex/fvpMergingSceneIndex.cpp @@ -34,7 +34,7 @@ MergingSceneIndex::MergingSceneIndex() : HdMergingSceneIndex() .Msg("MergingSceneIndex::MergingSceneIndex() called.\n"); } -SdfPath MergingSceneIndex::SceneIndexPath(const Ufe::Path& appPath) const +PrimSelections MergingSceneIndex::UfePathToPrimSelections(const Ufe::Path& appPath) const { // FLOW_VIEWPORT_TODO May be able to use a caching scheme for app path to // scene index path conversion using the run-time ID of the UFE path, as it @@ -50,13 +50,13 @@ SdfPath MergingSceneIndex::SceneIndexPath(const Ufe::Path& appPath) const // scene we know whether it supports the PathInterface or not. auto pathInterface = dynamic_cast(&*inputScene); if (pathInterface) { - auto sceneIndexPath = pathInterface->SceneIndexPath(appPath); - if (!sceneIndexPath.IsEmpty()) { - return sceneIndexPath; + auto primSelections = pathInterface->UfePathToPrimSelections(appPath); + if (!primSelections.empty()) { + return primSelections; } } } - return SdfPath(); + return PrimSelections(); } } diff --git a/lib/flowViewport/sceneIndex/fvpMergingSceneIndex.h b/lib/flowViewport/sceneIndex/fvpMergingSceneIndex.h index d4b98b26cb..6945ca3d34 100644 --- a/lib/flowViewport/sceneIndex/fvpMergingSceneIndex.h +++ b/lib/flowViewport/sceneIndex/fvpMergingSceneIndex.h @@ -41,7 +41,7 @@ class MergingSceneIndex static MergingSceneIndexRefPtr New(); FVP_API - PXR_NS::SdfPath SceneIndexPath(const Ufe::Path& appPath) const override; + PrimSelections UfePathToPrimSelections(const Ufe::Path& appPath) const override; private: MergingSceneIndex(); diff --git a/lib/flowViewport/sceneIndex/fvpPathInterface.cpp b/lib/flowViewport/sceneIndex/fvpPathInterface.cpp index 28445061d3..eaf4df7926 100644 --- a/lib/flowViewport/sceneIndex/fvpPathInterface.cpp +++ b/lib/flowViewport/sceneIndex/fvpPathInterface.cpp @@ -15,8 +15,42 @@ #include "flowViewport/sceneIndex/fvpPathInterface.h" +#include + +#include + +PXR_NAMESPACE_USING_DIRECTIVE + namespace FVP_NS_DEF { PathInterface::~PathInterface() {} +SdfPath PathInterface::SceneIndexPath(const Ufe::Path& appPath) const +{ + auto primSelections = UfePathToPrimSelections(appPath); + if (!TF_VERIFY(primSelections.size() <= 1u)) { + throw PrimPathsCountOutOfRangeException(0, 1, primSelections.size()); + } + return primSelections.empty() ? SdfPath() : primSelections.front().primPath; +} + +SdfPathVector PathInterface::SceneIndexPaths(const Ufe::Path& appPath) const +{ + auto primSelections = UfePathToPrimSelections(appPath); + + SdfPathVector outVector; + outVector.reserve(primSelections.size()); + for (const auto& primSelection : primSelections) { + outVector.emplace_back(primSelection.primPath); + } + return outVector; +} + +PrimPathsCountOutOfRangeException::PrimPathsCountOutOfRangeException(size_t min, size_t max, size_t actual) + : std::out_of_range("Prim paths count out of range, expected [" + + std::to_string(min) + "," + std::to_string(max) + + "] but got " + std::to_string(actual)) +{ +} + } diff --git a/lib/flowViewport/sceneIndex/fvpPathInterface.h b/lib/flowViewport/sceneIndex/fvpPathInterface.h index 55d16c944e..1a4615eba1 100644 --- a/lib/flowViewport/sceneIndex/fvpPathInterface.h +++ b/lib/flowViewport/sceneIndex/fvpPathInterface.h @@ -20,32 +20,58 @@ #include #include +#include +#include +#include + +#include UFE_NS_DEF { class Path; } -PXR_NAMESPACE_OPEN_SCOPE -class SdfPath; -PXR_NAMESPACE_CLOSE_SCOPE - namespace FVP_NS_DEF { +struct PrimSelection +{ + PXR_NS::SdfPath primPath; + PXR_NS::HdDataSourceBaseHandle selectionDataSource; +}; + +// Using TfSmallVector to optimize for selections that map to a few prims, +// which is likely going to be the bulk of use cases. +using PrimSelections = PXR_NS::TfSmallVector; + /// \class PathInterface /// /// A pure interface class to allow for conversion between an application's -/// path, expressed as a Ufe::Path, into an SdfPath valid for a scene index. +/// path, expressed as a Ufe::Path, into SdfPaths valid for a scene index +/// and selection data sources. /// To be used as a mix-in class for scene indices. /// class PathInterface { public: - //! Return the prim path corresponding to the argument application path. + //! Return the prim path(s) corresponding to the argument application path, + //! as well as their associated selection data source(s). + //! If no such selected path exists, an empty container should be returned. + //! \return Selected prim paths and their associated selection data sources. + FVP_API + virtual PrimSelections UfePathToPrimSelections(const Ufe::Path& appPath) const = 0; + + //! Return the prim path corresponding to the argument application path, + //! for when an application path maps to at most a single prim path. //! If no such path exists, an empty SdfPath should be returned. - //! \return scene index path. + //! \return Scene index path. + FVP_API + PXR_NS::SdfPath SceneIndexPath(const Ufe::Path& appPath) const; + + //! Return the prim paths corresponding to the argument application path. + //! If no such paths exist, an empty SdfPathVector should be returned. + //! \return Scene index paths. FVP_API - virtual PXR_NS::SdfPath SceneIndexPath(const Ufe::Path& appPath) const = 0; + PXR_NS::SdfPathVector SceneIndexPaths(const Ufe::Path& appPath) const; protected: @@ -56,6 +82,12 @@ class PathInterface virtual ~PathInterface(); }; +class PrimPathsCountOutOfRangeException : public std::out_of_range +{ +public: + PrimPathsCountOutOfRangeException(size_t min, size_t max, size_t actual); +}; + } #endif diff --git a/lib/flowViewport/sceneIndex/fvpPathInterfaceSceneIndex.h b/lib/flowViewport/sceneIndex/fvpPathInterfaceSceneIndex.h index 9ea5a62db2..5765943d5c 100644 --- a/lib/flowViewport/sceneIndex/fvpPathInterfaceSceneIndex.h +++ b/lib/flowViewport/sceneIndex/fvpPathInterfaceSceneIndex.h @@ -27,7 +27,7 @@ namespace FVP_NS_DEF { /// /// A simple pass-through filtering scene index that adds support for the path /// interface. Derived classes need only implement the -/// PathInterface::SceneIndexPath() virtual. +/// PathInterface::UfePathToPrimSelections() virtual. /// class PathInterfaceSceneIndexBase : public PXR_NS::HdSingleInputFilteringSceneIndexBase diff --git a/lib/flowViewport/sceneIndex/fvpSelectionSceneIndex.cpp b/lib/flowViewport/sceneIndex/fvpSelectionSceneIndex.cpp index 5503d72a3a..195246054a 100644 --- a/lib/flowViewport/sceneIndex/fvpSelectionSceneIndex.cpp +++ b/lib/flowViewport/sceneIndex/fvpSelectionSceneIndex.cpp @@ -43,6 +43,7 @@ #include "flowViewport/debugCodes.h" #include "pxr/imaging/hd/retainedDataSource.h" +#include #include "pxr/imaging/hd/selectionSchema.h" #include "pxr/imaging/hd/selectionsSchema.h" @@ -154,16 +155,21 @@ SelectionSceneIndex::AddSelection(const Ufe::Path& appPath) TF_DEBUG(FVP_SELECTION_SCENE_INDEX) .Msg("SelectionSceneIndex::AddSelection(const Ufe::Path& %s) called.\n", Ufe::PathString::string(appPath).c_str()); - // Call our input scene index to convert the application path to a scene - // index path. - auto sceneIndexPath = SceneIndexPath(appPath); + // Call our input scene index to convert the application path to scene index paths and selection data sources. + auto primSelections = UfePathToPrimSelections(appPath); - TF_DEBUG(FVP_SELECTION_SCENE_INDEX) - .Msg(" Adding %s to the Hydra selection.\n", sceneIndexPath.GetText()); + for (const auto& primSelection : primSelections) { + TF_DEBUG(FVP_SELECTION_SCENE_INDEX) + .Msg(" Adding %s to the Hydra selection.\n", primSelection.primPath.GetText()); + } - if (_selection->Add(sceneIndexPath)) { - _SendPrimsDirtied({{sceneIndexPath, selectionsSchemaDefaultLocator}}); + HdSceneIndexObserver::DirtiedPrimEntries dirtiedPrims; + for (const auto& primSelection : primSelections) { + if (_selection->Add(primSelection)) { + dirtiedPrims.emplace_back(primSelection.primPath, selectionsSchemaDefaultLocator); + } } + _SendPrimsDirtied(dirtiedPrims); } void SelectionSceneIndex::RemoveSelection(const Ufe::Path& appPath) @@ -171,13 +177,16 @@ void SelectionSceneIndex::RemoveSelection(const Ufe::Path& appPath) TF_DEBUG(FVP_SELECTION_SCENE_INDEX) .Msg("SelectionSceneIndex::RemoveSelection(const Ufe::Path& %s) called.\n", Ufe::PathString::string(appPath).c_str()); - // Call our input scene index to convert the application path to a scene - // index path. - auto sceneIndexPath = SceneIndexPath(appPath); + // Call our input scene index to convert the application path to scene index paths and selection data sources. + auto primSelections = UfePathToPrimSelections(appPath); - if (_selection->Remove(sceneIndexPath)) { - _SendPrimsDirtied({{sceneIndexPath, selectionsSchemaDefaultLocator}}); + HdSceneIndexObserver::DirtiedPrimEntries dirtiedPrims; + for (const auto& primSelection : primSelections) { + if (_selection->Remove(primSelection.primPath)) { + dirtiedPrims.emplace_back(primSelection.primPath, selectionsSchemaDefaultLocator); + } } + _SendPrimsDirtied(dirtiedPrims); } void @@ -219,21 +228,22 @@ void SelectionSceneIndex::ReplaceSelection(const Ufe::Selection& selection) _selection->Clear(); - SdfPathVector sceneIndexSn; + PrimSelections sceneIndexSn; sceneIndexSn.reserve(selection.size()); for (const auto& snItem : selection) { - // Call our input scene index to convert the application path to a scene - // index path. - auto sceneIndexPath = SceneIndexPath(snItem->path()); + // Call our input scene index to convert the application path to scene index paths and selection data sources. + auto primSelections = UfePathToPrimSelections(snItem->path()); - if (sceneIndexPath.IsEmpty()) { + if (primSelections.empty()) { continue; } - sceneIndexSn.emplace_back(sceneIndexPath); - TF_DEBUG(FVP_SELECTION_SCENE_INDEX) - .Msg(" Adding %s to the Hydra selection.\n", sceneIndexPath.GetText()); - entries.emplace_back(sceneIndexPath, selectionsSchemaDefaultLocator); + for (const auto& primSelection : primSelections) { + sceneIndexSn.emplace_back(primSelection); + TF_DEBUG(FVP_SELECTION_SCENE_INDEX) + .Msg(" Adding %s to the Hydra selection.\n", primSelection.primPath.GetText()); + entries.emplace_back(primSelection.primPath, selectionsSchemaDefaultLocator); + } } _selection->Replace(sceneIndexSn); @@ -250,15 +260,15 @@ bool SelectionSceneIndex::HasFullySelectedAncestorInclusive(const SdfPath& primP return _selection->HasFullySelectedAncestorInclusive(primPath); } -SdfPath SelectionSceneIndex::SceneIndexPath(const Ufe::Path& appPath) const +PrimSelections SelectionSceneIndex::UfePathToPrimSelections(const Ufe::Path& appPath) const { - auto sceneIndexPath = _inputSceneIndexPathInterface->SceneIndexPath(appPath); + auto primSelections = _inputSceneIndexPathInterface->UfePathToPrimSelections(appPath); - if (sceneIndexPath.IsEmpty()) { - TF_WARN("SelectionSceneIndex::SceneIndexPath(%s) returned an empty path, Hydra selection will be incorrect", Ufe::PathString::string(appPath).c_str()); + if (primSelections.empty()) { + TF_WARN("SelectionSceneIndex::UfePathToPrimSelections(%s) returned no path, Hydra selection will be incorrect", Ufe::PathString::string(appPath).c_str()); } - return sceneIndexPath; + return primSelections; } SdfPathVector SelectionSceneIndex::GetFullySelectedPaths() const diff --git a/lib/flowViewport/sceneIndex/fvpSelectionSceneIndex.h b/lib/flowViewport/sceneIndex/fvpSelectionSceneIndex.h index f9f806a444..be4ce573a8 100644 --- a/lib/flowViewport/sceneIndex/fvpSelectionSceneIndex.h +++ b/lib/flowViewport/sceneIndex/fvpSelectionSceneIndex.h @@ -117,7 +117,7 @@ class SelectionSceneIndex final //! and warns about empty return paths. //@{ FVP_API - PXR_NS::SdfPath SceneIndexPath(const Ufe::Path& appPath) const override; + PrimSelections UfePathToPrimSelections(const Ufe::Path& appPath) const override; //@} FVP_API diff --git a/lib/flowViewport/sceneIndex/fvpWireframeSelectionHighlightSceneIndex.cpp b/lib/flowViewport/sceneIndex/fvpWireframeSelectionHighlightSceneIndex.cpp index dfaf66b3ce..f87a0fcf1f 100644 --- a/lib/flowViewport/sceneIndex/fvpWireframeSelectionHighlightSceneIndex.cpp +++ b/lib/flowViewport/sceneIndex/fvpWireframeSelectionHighlightSceneIndex.cpp @@ -20,11 +20,18 @@ #include "flowViewport/debugCodes.h" +#include +#include +#include #include #include #include -#include +#include +#include #include +#include + +#include PXR_NAMESPACE_USING_DIRECTIVE @@ -36,6 +43,14 @@ TF_DEFINE_PRIVATE_TOKENS( (overrideWireframeColor) // Works in HdStorm to override the wireframe color ); +const HdRetainedContainerDataSourceHandle sRefinedWireDisplayStyleDataSource + = HdRetainedContainerDataSource::New( + HdLegacyDisplayStyleSchemaTokens->displayStyle, + HdRetainedContainerDataSource::New( + HdLegacyDisplayStyleSchemaTokens->reprSelector, + HdRetainedTypedSampledDataSource>::New( + { HdReprTokens->refinedWire, TfToken(), TfToken() }))); + const HdRetainedContainerDataSourceHandle sRefinedWireOnSurfaceDisplayStyleDataSource = HdRetainedContainerDataSource::New( HdLegacyDisplayStyleSchemaTokens->displayStyle, @@ -50,6 +65,314 @@ const HdDataSourceLocator reprSelectorLocator( const HdDataSourceLocator primvarsOverrideWireframeColorLocator( HdPrimvarsSchema::GetDefaultLocator().Append(_primVarsTokens->overrideWireframeColor)); + +const std::string selectionHighlightMirrorTag = "_SelectionHighlight"; + +SdfPath _GetSelectionHighlightMirrorPathFromOriginal(const SdfPath& originalPath) +{ + return originalPath.ReplaceName(TfToken(originalPath.GetName() + selectionHighlightMirrorTag)); +} + +SdfPath _GetOriginalPathFromSelectionHighlightMirror(const SdfPath& mirrorPath) +{ + const std::string primName = mirrorPath.GetName(); + return mirrorPath.ReplaceName(TfToken(primName.substr(0, primName.size() - selectionHighlightMirrorTag.size()))); +} + +// Computes the mask to use for an instancer's selection highlight mirror +// based on the instancer's topology and its selections. This allows +// highlighting only specific instances in the case of instance selections. +VtBoolArray _GetSelectionHighlightMask(const HdInstancerTopologySchema& originalInstancerTopology, const HdSelectionsSchema& selections) +{ + // Schema getters were made const in USD 24.05 (specifically Hydra API version 66). + // We work around this for previous versions by const casting. + VtBoolArray originalMask = +#if HD_API_VERSION < 66 + const_cast(originalInstancerTopology).GetMask()->GetTypedValue(0); +#else + originalInstancerTopology.GetMask()->GetTypedValue(0); +#endif + + if (!selections.IsDefined()) { + return originalMask; + } + + size_t nbInstances = 0; + auto instanceIndices = +#if HD_API_VERSION < 66 + const_cast(originalInstancerTopology).GetInstanceIndices(); +#else + originalInstancerTopology.GetInstanceIndices(); +#endif + for (size_t iInstanceIndex = 0; iInstanceIndex < instanceIndices.GetNumElements(); iInstanceIndex++) { + auto protoInstances = instanceIndices.GetElement(iInstanceIndex)->GetTypedValue(0); + nbInstances += protoInstances.size(); + } + if (!TF_VERIFY(originalMask.empty() || originalMask.size() == nbInstances, "Instancer mask has incorrect size.")) { + return originalMask; + } + VtBoolArray selectionHighlightMask(nbInstances, false); + + for (size_t iSelection = 0; iSelection < selections.GetNumElements(); iSelection++) { + HdSelectionSchema selection = selections.GetElement(iSelection); + // Instancer is expected to be marked "fully selected" even if only certain instances are selected, + // based on USD's _AddToSelection function in selectionSceneIndexObserver.cpp : + // https://github.com/PixarAnimationStudios/OpenUSD/blob/f7b8a021ce3d13f91a0211acf8a64a8b780524df/pxr/imaging/hdx/selectionSceneIndexObserver.cpp#L212-L251 + if (!selection.GetFullySelected() || !selection.GetFullySelected()->GetTypedValue(0)) { + continue; + } + if (!selection.GetNestedInstanceIndices()) { + // We have a selection that has no instances, which means the whole instancer is selected : + // this overrides any instances selection. + return originalMask; + } + HdInstanceIndicesVectorSchema nestedInstanceIndices = selection.GetNestedInstanceIndices(); + for (size_t iInstanceIndices = 0; iInstanceIndices < nestedInstanceIndices.GetNumElements(); iInstanceIndices++) { + HdInstanceIndicesSchema instanceIndices = nestedInstanceIndices.GetElement(0); + for (const auto& instanceIndex : instanceIndices.GetInstanceIndices()->GetTypedValue(0)) { + selectionHighlightMask[instanceIndex] = originalMask.empty() ? true : originalMask[instanceIndex]; + } + } + } + + return selectionHighlightMask; +} + +// Returns the overall data source for an instancer's selection highlight mirror. +// This replaces the mask data source and blocks the selections data source. +HdContainerDataSourceHandle _GetSelectionHighlightInstancerDataSource(const HdContainerDataSourceHandle& originalDataSource) +{ + HdInstancerTopologySchema instancerTopology = HdInstancerTopologySchema::GetFromParent(originalDataSource); + HdSelectionsSchema selections = HdSelectionsSchema::GetFromParent(originalDataSource); + + HdContainerDataSourceEditor editedDataSource = HdContainerDataSourceEditor(originalDataSource); + + if (selections.IsDefined()) { + HdDataSourceLocator maskLocator = HdInstancerTopologySchema::GetDefaultLocator().Append(HdInstancerTopologySchemaTokens->mask); + VtBoolArray selectionHighlightMask = _GetSelectionHighlightMask(instancerTopology, selections); + auto selectionHighlightMaskDataSource = HdRetainedTypedSampledDataSource::New(selectionHighlightMask); + editedDataSource.Set(maskLocator, selectionHighlightMaskDataSource); + } + + editedDataSource.Set(HdSelectionsSchema::GetDefaultLocator(), HdBlockDataSource::New()); + + return editedDataSource.Finish(); +} + +// Returns all paths related to instancing for this prim; this is analogous to getting the edges +// connected to the given vertex (in this case a prim) of an instancing graph. +SdfPathVector _GetInstancingRelatedPaths(const HdSceneIndexPrim& prim) +{ + HdInstancerTopologySchema instancerTopology = HdInstancerTopologySchema::GetFromParent(prim.dataSource); + HdInstancedBySchema instancedBy = HdInstancedBySchema::GetFromParent(prim.dataSource); + + SdfPathVector instancingRelatedPaths; + + if (instancerTopology.IsDefined()) { + auto protoPaths = instancerTopology.GetPrototypes()->GetTypedValue(0); + for (const auto& protoPath : protoPaths) { + instancingRelatedPaths.push_back(protoPath); + } + } + + if (instancedBy.IsDefined()) { + auto instancerPaths = instancedBy.GetPaths()->GetTypedValue(0); + for (const auto& instancerPath : instancerPaths) { + instancingRelatedPaths.push_back(instancerPath); + } + + auto protoRootPaths = instancedBy.GetPrototypeRoots()->GetTypedValue(0); + for (const auto& protoRootPath : protoRootPaths) { + instancingRelatedPaths.push_back(protoRootPath); + } + } + + return instancingRelatedPaths; +} + +// We consider prototypes that have child prims to be different hierarchies, +// separate from each other and from the "root" hierarchy. +VtArray _GetHierarchyRoots(const HdSceneIndexPrim& prim) +{ + HdInstancedBySchema instancedBy = HdInstancedBySchema::GetFromParent(prim.dataSource); + return instancedBy.IsDefined() && instancedBy.GetPrototypeRoots() + ? instancedBy.GetPrototypeRoots()->GetTypedValue(0) + : VtArray({SdfPath::AbsoluteRootPath()}); +} + +bool _IsPrototype(const HdSceneIndexPrim& prim) +{ + HdInstancedBySchema instancedBy = HdInstancedBySchema::GetFromParent(prim.dataSource); + return instancedBy.IsDefined(); +} + +bool _IsPrototypeSubPrim(const HdSceneIndexPrim& prim, const SdfPath& primPath) +{ + HdInstancedBySchema instancedBy = HdInstancedBySchema::GetFromParent(prim.dataSource); + if (!instancedBy.IsDefined()) { + return false; + } + if (!instancedBy.GetPrototypeRoots()) { + return false; + } + auto protoRootPaths = instancedBy.GetPrototypeRoots()->GetTypedValue(0); + for (const auto& protoRootPath : protoRootPaths) { + if (protoRootPath == primPath) { + return false; + } + } + return true; +} + +// Similar to USD's _RerootingSceneIndexPathDataSource : +// https://github.com/PixarAnimationStudios/OpenUSD/blob/f7b8a021ce3d13f91a0211acf8a64a8b780524df/pxr/usdImaging/usdImaging/rerootingSceneIndex.cpp#L35 +class _SelectionHighlightRepathingPathDataSource : public HdPathDataSource +{ +public: + HD_DECLARE_DATASOURCE(_SelectionHighlightRepathingPathDataSource) + + _SelectionHighlightRepathingPathDataSource( + HdPathDataSourceHandle const &inputDataSource, + Fvp::WireframeSelectionHighlightSceneIndex const * const inputSceneIndex) + : _inputDataSource(inputDataSource), + _inputSceneIndex(inputSceneIndex) + { + } + + VtValue GetValue(const Time shutterOffset) override + { + return VtValue(GetTypedValue(shutterOffset)); + } + + bool GetContributingSampleTimesForInterval( + const Time startTime, + const Time endTime, + std::vectorXQ{fU1b*b zyKgeF%35q`6B&EK(51UOZe;^H2m{jRlBQ@2xCM&3c%aVU&NAxfdmoLjtE-Rbq}5ku zCy3*k)Q;@E5=nYc>5n3|ux;CLnkq=J0(tc7T}a5#9fqvJ&TLh`IKub0b+vD3dfEaD zK)A9#-hQ1^8GhP8S#8f@XMN>ENWzMNICmuomKP zuWbq269nCrEB&*p#vV^&+(MD3%THIT{3B4%@3{c&clfixZf@U1CT;7M7xOUr4ILZe z!8FS%zj8Ixq&gnnR;~gHt2}yGVKOT-IA*!0ou>;;mFjM86C4qXh<$p%8I6Gj@pO7` zw~JUjXB;}N99kTslKwX)UDi}r$3|rO{t+`mEK!$bn^WZXuX>J=ppfMCmBDj0pTn3B z6$E9ocyQ%IZ4)oQ_fL+R9 zlC0E=d&5V26^@VGxpE#GN1JB#DHX!r*-61D8C2%9`hFm!z)T z@z!-bYGbzY)~tg3Qv&eX>3_SA{e8B(xBE6$!of-c&#!AV`-Q z>Agyk(Ej{;X8K# zchtZN2L4%l*@!yOfMr@;EB5*MFh=2F zT|=eYvKIq7_-?(oG;N=e!gpbWi-_>foeX)vojbn>3GUu`&q;yru}GNwojYG15fa?F zqXnS2bH|Y&?9Lr|>i@m;e=YF;wFPVselFg9|0XOikG;c$KWRt3eA*dn*%i|94%0?- zI20!TiZ1K(=d%wcf~g&V*2=%N&$^APtWF0rj;PF>C0sU()N0b)8q7+ruY(EirLqtb zq$b1?*3-A4U7Rpz*6bbfhTaH`-1n02tS)^YipmxGK%5qCmNimqrO9WpL0f=t)ld( zBD2IesmA5R#W(d|aZaB8`F8I`oaUbv!mzL2y+=niqP4&0=3dawq;so(|IKlnh7m+T z)HvPzsS(9>b#+#ps;a8nhldpDU%l@UguVG3NzVF~orIkv0;AHL@knXb1M&-|`05}|~;gN4B;S!gYK3Og{j62|s zjfU7wjv252wIe`vzYJ?G{Gkm}0jPkuxVTj=A6B3L(MzYH7^Yv;an(MzW94l64 ziJ)_;FRaezp0D0z)N|^0dYRjNu#O*<^fbpFWl-T*uy+u}BWY@UPsdx{omYxFmC{=W zjnZduIB9B`wk-K%WXX!Q^Ob;CMLyE>n1}$U*_9J8tD||Uf!;%!Z^=<#Gl>bp#Av;5 ze`pAGtQJ7q^xF$ylY(2NmiK}8p_!kf3R2d25j_wkQ6dkj=S~9SU%rB!&JVED^Ew3X zoJ53+G@65@nPToZBSX7WrV3Q#?sQ?nU$YWr)&d80TZTk9qhEGr$j(&7ja6DK#IfeS zJ28I9B@1E6YQ`;?Wj&0#Z$swYB6WKgf0x-OwVie`86tWEN%qV3&@xufzFsD!#3^(G zowO?jk@U+Ut@ryOWIW{KvC2=qT9>3pRVDc)+-b(tc>)>A9EF(qyuAxb>^EM6{WI_e z;dLQy=?pjIMY?Kvk0dq*>Jg+r4c4?V-!AjP!cF%xE6GRu>9OL7PquM2l!*1E*h3n5 zz+uk}Trm|LXUU>u>uEi`_tMbE?L;A;%69b zaQ8cRRu_=hQ|7Mjk3ZdWwMD4Hxb6~!k!)m7)8qcUvhEmDWgRR}chh3pH>|CIvCI{! z4KoHL^`Nwc)a+8>`Jlv9)^b;3=TTL*ZWsDkZr0eKrTxPT<2d8(y~s;O#AYmb3PLD| zzcG3Y0QvDIoBkc&OCAS9XNQ-DfVslSAI{^xxtwGYd+k8A3w0rs18eYOpyw#0Yds|W zywkt9)87x`w8#2bKN3QS_}Yt)1mFGD`n#pQ><$dvJIaF0J5<#GZtWASj4YX=qB0y6 zyV^wudaPr-302Z2r&Q06Jx1Xr#?~fbX`f48iH-Kpyj_!v1pfgl06g5REIz;eyK14o z;rUDMpS#YUK;(DVR7vt~<@~C#r7?fkS(?Jas@3`u;7kF5ECfsrV`D@)GR78bjgXSx z4m8xVMFpzmY_6=>!QS-R>HY}

9oilqUNmeHO`hkKQr|DHc9Ip_=&Q?ReoyUxdbr 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

9oilqUNmeHO`hkKQr|DHc9Ip_=&Q?ReoyUxdbr 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 Pp@EW/OCIO-configs/Maya2022-default/config.ocio"; + setAttr ".vtn" -type "string" "ACES 1.0 SDR-video (sRGB)"; + setAttr ".vn" -type "string" "ACES 1.0 SDR-video"; + setAttr ".dn" -type "string" "sRGB"; + setAttr ".wsn" -type "string" "ACEScg"; + setAttr ".otn" -type "string" "ACES 1.0 SDR-video (sRGB)"; + setAttr ".potn" -type "string" "ACES 1.0 SDR-video (sRGB)"; +select -ne :hardwareRenderGlobals; + setAttr ".ctrs" 256; + setAttr ".btrs" 512; +connectAttr "polySphere1.out" "pSphereShape1.i"; +relationship "link" ":lightLinker1" ":initialShadingGroup.message" ":defaultLightSet.message"; +relationship "link" ":lightLinker1" ":initialParticleSE.message" ":defaultLightSet.message"; +relationship "shadowLink" ":lightLinker1" ":initialShadingGroup.message" ":defaultLightSet.message"; +relationship "shadowLink" ":lightLinker1" ":initialParticleSE.message" ":defaultLightSet.message"; +connectAttr "layerManager.dli[0]" "defaultLayer.id"; +connectAttr "renderLayerManager.rlmi[0]" "defaultRenderLayer.rlid"; +connectAttr "defaultRenderLayer.msg" ":defaultRenderingList1.r" -na; +connectAttr "pSphereShape1.iog" ":initialShadingGroup.dsm" -na; +// End of componentsPicking.ma