From a4545e8168270b8e666972b76061633687386221 Mon Sep 17 00:00:00 2001 From: "ADS\\blaines" Date: Wed, 20 May 2026 12:02:41 +0200 Subject: [PATCH 1/2] Optionally use Hydra Render Settings primitive instead of settings map #2650 --- CHANGELOG.md | 1 + cmake/utils/options.cmake | 1 - libs/render_delegate/CMakeLists.txt | 3 -- libs/render_delegate/SConscript | 3 -- libs/render_delegate/reader.cpp | 7 +-- libs/render_delegate/render_delegate.cpp | 32 ++++------- libs/render_delegate/render_delegate.h | 3 +- libs/render_delegate/render_pass.cpp | 6 --- libs/render_delegate/render_pass.h | 4 -- libs/render_delegate/render_settings.cpp | 69 ++++++++++-------------- libs/render_delegate/render_settings.h | 9 ++-- 11 files changed, 46 insertions(+), 92 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 648dca27b..5ee61f9c1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ ### Features - [usd#2619](https://github.com/Autodesk/arnold-usd/issues/2619) - Add MtoA scene index plugin for MayaHydra support of custom attributes +- [usd#2650](https://github.com/Autodesk/arnold-usd/issues/2650) - Optionally use Hydra Render Settings primitive instead of settings map - [usd#2583](https://github.com/Autodesk/arnold-usd/issues/2583) - Support nested instancers with lightweight shape instancing - [usd#2594](https://github.com/Autodesk/arnold-usd/issues/2594) - Use a global map for shared arrays - [usd#2608](https://github.com/Autodesk/arnold-usd/issues/2608) - Implement preliminary support for ParticleField3DGaussianSplat. diff --git a/cmake/utils/options.cmake b/cmake/utils/options.cmake index 086aa05d7..f53bbf6b9 100644 --- a/cmake/utils/options.cmake +++ b/cmake/utils/options.cmake @@ -49,7 +49,6 @@ option(BUILD_USDGENSCHEMA_ARNOLD "Build and use a custom usdgenschema" OFF) # Configurations: option(ENABLE_HYDRA_IN_USD_PROCEDURAL "Enable hydra in the procedural" ON) option(ENABLE_SHARED_ARRAYS "Enable using shared arrays" OFF) -option(ENABLE_HYDRA2_RENDERSETTINGS "Enable using RenderSetting hydra prim" OFF) option(ENABLE_SCENE_INDEX_IN_BUNDLE "Add the scene index filters in the bundle" OFF) option(ENABLE_TRACING "Enable USD trace instrumentation (TRACE_FUNCTION/TRACE_SCOPE)." OFF) option(MTOA_BUILD "Build MtoA-specific plugins (e.g. the ai primvar remap scene index)" OFF) diff --git a/libs/render_delegate/CMakeLists.txt b/libs/render_delegate/CMakeLists.txt index b85dbafa4..6be47fa6c 100644 --- a/libs/render_delegate/CMakeLists.txt +++ b/libs/render_delegate/CMakeLists.txt @@ -72,9 +72,6 @@ target_link_libraries(render_delegate INTERFACE common) if (ENABLE_SHARED_ARRAYS) target_compile_definitions(render_delegate PUBLIC ENABLE_SHARED_ARRAYS=1) endif() -if (ENABLE_HYDRA2_RENDERSETTINGS) - target_compile_definitions(render_delegate PUBLIC ENABLE_HYDRA2_RENDERSETTINGS=1) -endif() if (HYDRA_NORMALIZE_DEPTH) target_compile_definitions(render_delegate PUBLIC HYDRA_NORMALIZE_DEPTH=1) endif() diff --git a/libs/render_delegate/SConscript b/libs/render_delegate/SConscript index a0782de69..9ce43e3c3 100755 --- a/libs/render_delegate/SConscript +++ b/libs/render_delegate/SConscript @@ -58,9 +58,6 @@ if local_env['USD_HAS_FULLSCREEN_SHADER']: if local_env['ENABLE_SHARED_ARRAYS']: local_env.Append(CPPDEFINES = ['ENABLE_SHARED_ARRAYS']) -if local_env['ENABLE_HYDRA2_RENDERSETTINGS']: - local_env.Append(CPPDEFINES = ['ENABLE_HYDRA2_RENDERSETTINGS']) - if local_env['BUILD_SCENE_INDEX_PLUGIN']: local_env.Append(CPPDEFINES = ['ENABLE_SCENE_INDEX']) diff --git a/libs/render_delegate/reader.cpp b/libs/render_delegate/reader.cpp index 7ceaa19bc..76df68483 100644 --- a/libs/render_delegate/reader.cpp +++ b/libs/render_delegate/reader.cpp @@ -299,12 +299,11 @@ void HydraArnoldReader::ReadStage(UsdStageRefPtr stage, TRACE_SCOPE("ChooseRenderSettings"); ChooseRenderSettings(stage, _renderSettings, _time); } -// TODO HERE WE COULD CHECK IF WE WANT TO USE HYDRA2 + if (!_renderSettings.empty()) { TRACE_SCOPE("ReadRenderSettings"); // Sets the default parameters on the Arnold option node (AA_samples, GI_diffuse_depth, ...) SetArnoldDefaultOptions(_universe); -#ifdef ENABLE_HYDRA2_RENDERSETTINGS // We want to use the RenderSetting hydra prim only if we use the scene index system if (_useSceneIndex) { // TODO set metadata only if it it not already set @@ -313,10 +312,6 @@ void HydraArnoldReader::ReadStage(UsdStageRefPtr stage, UsdPrim renderSettingsPrim = stage->GetPrimAtPath(SdfPath(_renderSettings)); ReadRenderSettings(renderSettingsPrim, arnoldRenderDelegate->GetAPIAdapter(), this, _time, _universe, _renderCameraPath); } -#else - UsdPrim renderSettingsPrim = stage->GetPrimAtPath(SdfPath(_renderSettings)); - ReadRenderSettings(renderSettingsPrim, arnoldRenderDelegate->GetAPIAdapter(), this, _time, _universe, _renderCameraPath); -#endif } } diff --git a/libs/render_delegate/render_delegate.cpp b/libs/render_delegate/render_delegate.cpp index a663ed968..5d9a5f463 100644 --- a/libs/render_delegate/render_delegate.cpp +++ b/libs/render_delegate/render_delegate.cpp @@ -68,10 +68,7 @@ #include "render_pass.h" #include "volume.h" #include - -#ifdef ENABLE_HYDRA2_RENDERSETTINGS #include "render_settings.h" -#endif PXR_NAMESPACE_OPEN_SCOPE @@ -112,6 +109,9 @@ TF_DEFINE_PRIVATE_TOKENS(_tokens, (GeometryLight) (dataWindowNDC) (resolution) + (renderSettingsSrc) + (hydraSceneRenderSettingsSrc) + // The following tokens are also defined in read_options.cpp, we need them // here for the conversion from TfToken to HdFormat, while in read_options they // are used for the conversion of HdFormat to TfToken. @@ -294,11 +294,7 @@ inline const TfTokenVector& _SupportedBprimTypes(bool ownsUniverse) } else #endif { -#ifdef ENABLE_HYDRA2_RENDERSETTINGS static const TfTokenVector r{HdPrimTypeTokens->renderBuffer, _tokens->openvdbAsset, HdPrimTypeTokens->renderSettings}; -#else - static const TfTokenVector r{HdPrimTypeTokens->renderBuffer, _tokens->openvdbAsset}; -#endif return r; } } @@ -716,6 +712,12 @@ void HdArnoldRenderDelegate::_SetRenderSetting(const TfToken& _key, const VtValu _ParseDelegateRenderProducts(_value); return; } + if (_key == _tokens->renderSettingsSrc) { + if (_value.IsHolding()) { + TfToken renderSettingsSrc = _value.UncheckedGet(); + _useHydraRenderSettings = (renderSettingsSrc == _tokens->hydraSceneRenderSettingsSrc); + } + } TfToken key; _RemoveArnoldGlobalPrefix(_key, key); @@ -1126,15 +1128,6 @@ HdRenderSettingDescriptorList HdArnoldRenderDelegate::GetRenderSettingDescriptor return ret; } -// for testing in batch mode. TODO: correctly check the if we can and want to use the hydra render settings -bool HdArnoldRenderDelegate::IsUsingHydraRenderSettings() const { -#ifdef ENABLE_HYDRA2_RENDERSETTINGS - return true; -#else - return false; -#endif -} - VtDictionary HdArnoldRenderDelegate::GetRenderStats() const { VtDictionary stats; @@ -1367,14 +1360,9 @@ HdBprim* HdArnoldRenderDelegate::CreateBprim(const TfToken& typeId, const SdfPat #if PXR_VERSION >= 2208 // Only support render settings when we don't own the universe (procedural context). // When we own the universe (batch context), settings come through SetRenderSettings. -#ifdef ENABLE_HYDRA2_RENDERSETTINGS if (typeId == HdPrimTypeTokens->renderSettings /*&& !_renderDelegateOwnsUniverse*/) { - return new HdArnoldRenderSettings(bprimId); + return new HdArnoldRenderSettings(this, bprimId); } -#else - if (typeId == HdPrimTypeTokens->renderSettings) - return nullptr; -#endif // ENABLE_HYDRA2_RENDERSETTINGS #endif // PXR_VERSION >= 2208 TF_CODING_ERROR("Unknown Bprim Type %s", typeId.GetText()); diff --git a/libs/render_delegate/render_delegate.h b/libs/render_delegate/render_delegate.h index 57fd01693..50a6e7524 100644 --- a/libs/render_delegate/render_delegate.h +++ b/libs/render_delegate/render_delegate.h @@ -699,7 +699,7 @@ class HdArnoldRenderDelegate final : public HdRenderDelegate { void SetHasCryptomatte(bool b); void SetInstancerCryptoOffset(AtNode *node, size_t numInstances); - bool IsUsingHydraRenderSettings() const; + bool IsUsingHydraRenderSettings() const {return _useHydraRenderSettings;} private: HdArnoldRenderDelegate(const HdArnoldRenderDelegate&) = delete; @@ -827,6 +827,7 @@ class HdArnoldRenderDelegate final : public HdRenderDelegate { bool _enableNodesDestruction = true; bool _supportShapeInstancing = true; bool _forceIgnoreMotionBlur = false; + bool _useHydraRenderSettings = false; std::unordered_map _nodeNames; // We store a list of functions that must be run once all the prims are synced diff --git a/libs/render_delegate/render_pass.cpp b/libs/render_delegate/render_pass.cpp index 7998cb985..2719749d1 100644 --- a/libs/render_delegate/render_pass.cpp +++ b/libs/render_delegate/render_pass.cpp @@ -47,9 +47,7 @@ #include "nodes/nodes.h" #include "utils.h" #include "rendersettings_utils.h" -#ifdef ENABLE_HYDRA2_RENDERSETTINGS #include "render_settings.h" -#endif #include #include #include @@ -501,7 +499,6 @@ HdArnoldRenderPass::~HdArnoldRenderPass() void HdArnoldRenderPass::_Execute(const HdRenderPassStateSharedPtr& renderPassState, const TfTokenVector& renderTags) { HdArnoldRenderParam* renderParam = reinterpret_cast(_renderDelegate->GetRenderParam()); -#ifdef ENABLE_HYDRA2_RENDERSETTINGS if (_renderDelegate->IsUsingHydraRenderSettings()) { // If we are using the hydra render settings, we let the render settings prim handle the conversion. // We need to provide a camera pas @@ -529,7 +526,6 @@ void HdArnoldRenderPass::_Execute(const HdRenderPassStateSharedPtr& renderPassSt } // We couldn't use the render settings, we fall back to the original code } -#endif if (_renderDelegate->SetRenderTags(renderTags)) { // Render tags have changed, let's iterate through all the nodes @@ -1341,7 +1337,6 @@ void HdArnoldRenderPass::_ClearRenderBuffers() decltype(_renderBuffers){}.swap(_renderBuffers); } -#ifdef ENABLE_HYDRA2_RENDERSETTINGS #if PXR_VERSION >= 2308 HdArnoldRenderSettings* HdArnoldRenderPass::_GetHydraRenderSettingsPrim() const @@ -1354,6 +1349,5 @@ HdArnoldRenderPass::_GetHydraRenderSettingsPrim() const renderParam->GetHydraRenderSettingsPrimPath())); } #endif -#endif PXR_NAMESPACE_CLOSE_SCOPE diff --git a/libs/render_delegate/render_pass.h b/libs/render_delegate/render_pass.h index 35240a7ff..de349b9e8 100755 --- a/libs/render_delegate/render_pass.h +++ b/libs/render_delegate/render_pass.h @@ -50,9 +50,7 @@ PXR_NAMESPACE_OPEN_SCOPE -#ifdef ENABLE_HYDRA2_RENDERSETTINGS class HdArnoldRenderSettings; -#endif /// Utility class for handling Render Passes. class HdArnoldRenderPass : public HdRenderPass { @@ -95,14 +93,12 @@ class HdArnoldRenderPass : public HdRenderPass { HDARNOLD_API void _ClearRenderBuffers(); -#ifdef ENABLE_HYDRA2_RENDERSETTINGS #if PXR_VERSION >= 2308 /// Gets the driving hydra render settings prim. /// /// @return Pointer to the HdArnoldRenderSettings prim. HdArnoldRenderSettings* _GetHydraRenderSettingsPrim() const; #endif -#endif private: HdArnoldRenderBufferStorage _renderBuffers; ///< Render buffer storage. diff --git a/libs/render_delegate/render_settings.cpp b/libs/render_delegate/render_settings.cpp index 626fe7dfe..0dc9d4d35 100644 --- a/libs/render_delegate/render_settings.cpp +++ b/libs/render_delegate/render_settings.cpp @@ -18,9 +18,8 @@ /// @file render_settings.cpp /// /// Hydra 2.0 Render Settings Prim for Arnold. -#ifdef ENABLE_HYDRA2_RENDERSETTINGS - #include "render_settings.h" +#include "render_delegate.h" #if PXR_VERSION >= 2308 @@ -134,7 +133,8 @@ VtDictionary _GenerateArnoldOptions(VtDictionary const& settings) // ---------------------------------------------------------------------------- -HdArnoldRenderSettings::HdArnoldRenderSettings(SdfPath const& id) : HdRenderSettings(id) {} +HdArnoldRenderSettings::HdArnoldRenderSettings(HdArnoldRenderDelegate* renderDelegate, + SdfPath const& id) : HdRenderSettings(id), _renderDelegate(renderDelegate) {} HdArnoldRenderSettings::~HdArnoldRenderSettings() { @@ -161,13 +161,11 @@ void HdArnoldRenderSettings::_UpdateArnoldOptions(HdSceneDelegate* sceneDelegate const VtDictionary& namespacedSettings = GetNamespacedSettings(); const VtDictionary arnoldOptions = _GenerateArnoldOptions(namespacedSettings); - if (arnoldOptions.empty()) { + if (arnoldOptions.empty() || _renderDelegate == nullptr) { return; } - HdArnoldRenderDelegate* renderDelegate = - static_cast(sceneDelegate->GetRenderIndex().GetRenderDelegate()); - AtNode* options = renderDelegate->GetOptions(); + AtNode* options = _renderDelegate->GetOptions(); // Set Arnold options from the render settings for (auto const& pair : arnoldOptions) { @@ -215,7 +213,7 @@ void HdArnoldRenderSettings::_UpdateArnoldOptions(HdSceneDelegate* sceneDelegate continue; } - HdArnoldSetParameter(options, paramEntry, value, renderDelegate); + HdArnoldSetParameter(options, paramEntry, value, _renderDelegate); } } @@ -245,11 +243,8 @@ void HdArnoldRenderSettings::_UpdateShutterInterval(HdSceneDelegate* sceneDelega // The next call to _Execute will replace param->_shutter with the value of the universe // We also update Arnold directly - HdArnoldRenderDelegate* renderDelegate = - static_cast(sceneDelegate->GetRenderIndex().GetRenderDelegate()); - - if (renderDelegate) { - AtNode* options = renderDelegate->GetOptions(); + if (_renderDelegate) { + AtNode* options = _renderDelegate->GetOptions(); if (options) { AiNodeSetFlt(options, AtString("shutter_start"), static_cast(shutterInterval[0])); AiNodeSetFlt(options, AtString("shutter_end"), static_cast(shutterInterval[1])); @@ -266,14 +261,11 @@ void HdArnoldRenderSettings::_UpdateRenderingColorSpace(HdSceneDelegate* sceneDe #if PXR_VERSION >= 2211 TF_DEBUG(HDARNOLD_RENDER_SETTINGS).Msg("Updating rendering color space for %s\n", GetId().GetText()); - HdArnoldRenderDelegate* renderDelegate = - static_cast(sceneDelegate->GetRenderIndex().GetRenderDelegate()); - - if (!renderDelegate) { + if (!_renderDelegate) { return; } - AtNode* options = renderDelegate->GetOptions(); + AtNode* options = _renderDelegate->GetOptions(); if (!options) { return; } @@ -296,7 +288,7 @@ void HdArnoldRenderSettings::_UpdateRenderingColorSpace(HdSceneDelegate* sceneDe AtNode* colorManager = nullptr; const char* ocio_path = std::getenv("OCIO"); if (ocio_path) { - colorManager = renderDelegate->CreateArnoldNode(AtString("color_manager_ocio"), AtString("color_manager_ocio")); + colorManager = _renderDelegate->CreateArnoldNode(AtString("color_manager_ocio"), AtString("color_manager_ocio")); if (colorManager) { AiNodeSetStr(colorManager, str::config, AtString(ocio_path)); } @@ -349,7 +341,7 @@ void HdArnoldRenderSettings::_UpdateRenderingColorSpace(HdSceneDelegate* sceneDe } // Set the parameter value using HdArnoldSetParameter - HdArnoldSetParameter(colorManager, paramEntry, pair.second, renderDelegate); + HdArnoldSetParameter(colorManager, paramEntry, pair.second, _renderDelegate); TF_DEBUG(HDARNOLD_RENDER_SETTINGS) .Msg("Set color manager parameter %s on %s\n", paramName.c_str(), AiNodeGetName(colorManager)); @@ -363,14 +355,12 @@ void HdArnoldRenderSettings::_UpdateRenderingColorSpace(HdSceneDelegate* sceneDe void HdArnoldRenderSettings::_ReadUsdRenderSettings(HdSceneDelegate* sceneDelegate) { HdSceneIndexBaseRefPtr terminalSi = sceneDelegate->GetRenderIndex().GetTerminalSceneIndex(); - if (terminalSi) { + if (terminalSi && _renderDelegate) { HdSceneIndexPrim prim = terminalSi->GetPrim(GetId()); if (prim.dataSource) { - HdArnoldRenderDelegate* renderDelegate = - static_cast(sceneDelegate->GetRenderIndex().GetRenderDelegate()); UsdImagingUsdRenderSettingsSchema usdRss = UsdImagingUsdRenderSettingsSchema::GetFromParent(prim.dataSource); - AtNode* options = renderDelegate->GetOptions(); + AtNode* options = _renderDelegate->GetOptions(); if (!options) return; HdFloatDataSourceHandle parHandle = usdRss.GetPixelAspectRatio(); if (parHandle) { @@ -404,7 +394,7 @@ void HdArnoldRenderSettings::_ReadUsdRenderSettings(HdSceneDelegate* sceneDelega if (camHandle) { _hydraCameraPath = SdfPath(camHandle->GetTypedValue(0)); const AtParamEntry* paramEntry = AiNodeEntryLookUpParameter(AiNodeGetNodeEntry(options), str::camera); - HdArnoldSetParameter(options, paramEntry, VtValue(_hydraCameraPath.GetString()), renderDelegate); + HdArnoldSetParameter(options, paramEntry, VtValue(_hydraCameraPath.GetString()), _renderDelegate); } else { // Should we reset the camera ? In batch mode it's not necessary but we might want to do it in interactive mode _hydraCameraPath = SdfPath(); @@ -419,6 +409,10 @@ void HdArnoldRenderSettings::_Sync( if (std::getenv("USDIMAGINGGL_ENGINE_ENABLE_SCENE_INDEX") == nullptr) return; + // If we're not using the hydra render settings, we shouldn't do anything here + if (_renderDelegate == nullptr || !_renderDelegate->IsUsingHydraRenderSettings()) + return; + TF_DEBUG(HDARNOLD_RENDER_SETTINGS) .Msg("Syncing render settings prim %s (dirty bits = %x)\n", GetId().GetText(), *dirtyBits); @@ -434,9 +428,7 @@ void HdArnoldRenderSettings::_Sync( // in that case we don't want to use those render settings return; } - HdArnoldRenderDelegate* renderDelegate = - static_cast(sceneDelegate->GetRenderIndex().GetRenderDelegate()); - if (renderDelegate->GetProceduralParent()) + if (_renderDelegate == nullptr || _renderDelegate->GetProceduralParent()) return; // We register this render setting as the one to use for the render. @@ -502,13 +494,11 @@ void HdArnoldRenderSettings::_UpdateRenderProducts(HdSceneDelegate* sceneDelegat TF_DEBUG(HDARNOLD_RENDER_SETTINGS).Msg("Updating render products for %s\n", GetId().GetText()); const RenderProducts& products = GetRenderProducts(); - if (products.empty()) { + if (products.empty() || _renderDelegate == nullptr) { return; } - HdArnoldRenderDelegate* renderDelegate = - static_cast(sceneDelegate->GetRenderIndex().GetRenderDelegate()); - AtNode* options = renderDelegate->GetOptions(); + AtNode* options = _renderDelegate->GetOptions(); std::vector outputs; std::vector lpes; @@ -565,7 +555,7 @@ void HdArnoldRenderSettings::_UpdateRenderProducts(HdSceneDelegate* sceneDelegat } } - AtNode* driver = renderDelegate->CreateArnoldNode(AtString(driverType.c_str()), AtString(driverName.c_str())); + AtNode* driver = _renderDelegate->CreateArnoldNode(AtString(driverType.c_str()), AtString(driverName.c_str())); if (!driver) { TF_WARN("Failed to create driver for render product %s\n", driverName.c_str()); @@ -617,7 +607,7 @@ void HdArnoldRenderSettings::_UpdateRenderProducts(HdSceneDelegate* sceneDelegat } // Set the parameter value using HdArnoldSetParameter - HdArnoldSetParameter(driver, paramEntry, pair.second, renderDelegate); + HdArnoldSetParameter(driver, paramEntry, pair.second, _renderDelegate); TF_DEBUG(HDARNOLD_RENDER_SETTINGS) .Msg("Set driver parameter %s on %s\n", paramName.c_str(), driverNodeName); @@ -672,7 +662,7 @@ void HdArnoldRenderSettings::_UpdateRenderProducts(HdSceneDelegate* sceneDelegat AtNode* filter = AiNodeLookUpByName(AiNodeGetUniverse(options), AtString(filterName.c_str())); if (!filter) { - filter = renderDelegate->CreateArnoldNode(AtString(filterType.c_str()), AtString(filterName.c_str())); + filter = _renderDelegate->CreateArnoldNode(AtString(filterType.c_str()), AtString(filterName.c_str())); } if (!filter) { @@ -719,7 +709,7 @@ void HdArnoldRenderSettings::_UpdateRenderProducts(HdSceneDelegate* sceneDelegat } // Set the parameter value using HdArnoldSetParameter - HdArnoldSetParameter(filter, paramEntry, pair.second, renderDelegate); + HdArnoldSetParameter(filter, paramEntry, pair.second, _renderDelegate); TF_DEBUG(HDARNOLD_RENDER_SETTINGS) .Msg("Set filter parameter %s on %s\n", paramName.c_str(), filterNodeName); @@ -793,7 +783,7 @@ void HdArnoldRenderSettings::_UpdateRenderProducts(HdSceneDelegate* sceneDelegat if (!product.cameraPath.IsEmpty() && product.cameraPath != _hydraCameraPath) { cameraName = product.cameraPath.GetString(); // Check the arnold camera name in case its name is different from the prim name - AtNode *cam = renderDelegate->LookupNode(cameraName.c_str()); + AtNode *cam = _renderDelegate->LookupNode(cameraName.c_str()); if (cam) cameraName = std::string(AiNodeGetName(cam)); } @@ -818,14 +808,14 @@ void HdArnoldRenderSettings::_UpdateRenderProducts(HdSceneDelegate* sceneDelegat // Primvar AOV - requires aov_write and user_data shaders std::string aovShaderName = varName + "_shader"; AtNode* aovShader = - renderDelegate->CreateArnoldNode(arnoldTypes.aovWrite, AtString(aovShaderName.c_str())); + _renderDelegate->CreateArnoldNode(arnoldTypes.aovWrite, AtString(aovShaderName.c_str())); if (aovShader) { AiNodeSetStr(aovShader, str::aov_name, AtString(aovName.c_str())); std::string userDataName = varName + "_user_data"; AtNode* userData = - renderDelegate->CreateArnoldNode(arnoldTypes.userData, AtString(userDataName.c_str())); + _renderDelegate->CreateArnoldNode(arnoldTypes.userData, AtString(userDataName.c_str())); if (userData) { AiNodeLink(userData, "aov_input", aovShader); @@ -917,4 +907,3 @@ void HdArnoldRenderSettings::_UpdateRenderProducts(HdSceneDelegate* sceneDelegat PXR_NAMESPACE_CLOSE_SCOPE #endif // PXR_VERSION >= 2308 -#endif // ENABLE_HYDRA2_RENDERSETTINGS diff --git a/libs/render_delegate/render_settings.h b/libs/render_delegate/render_settings.h index 4381a2f8b..4e71bda93 100644 --- a/libs/render_delegate/render_settings.h +++ b/libs/render_delegate/render_settings.h @@ -20,8 +20,6 @@ /// Hydra 2.0 Render Settings Prim for Arnold. #pragma once -#ifdef ENABLE_HYDRA2_RENDERSETTINGS - #include "api.h" #include @@ -38,7 +36,7 @@ PXR_NAMESPACE_OPEN_SCOPE class HdRenderIndex; class HdArnoldRenderParam; - +class HdArnoldRenderDelegate; /// Hydra 2.0 Render Settings Prim for Arnold. /// /// This class represents a render settings prim in Hydra 2.0 for the Arnold @@ -53,7 +51,7 @@ class HdArnoldRenderSettings final : public HdRenderSettings { /// /// @param id The scene delegate path for this render settings prim. HDARNOLD_API - HdArnoldRenderSettings(SdfPath const& id); + HdArnoldRenderSettings(HdArnoldRenderDelegate* renderDelegate, SdfPath const& id); /// Destructor. HDARNOLD_API @@ -123,6 +121,7 @@ HDARNOLD_API void _ReadUsdRenderSettings(HdSceneDelegate* sceneDelegate); private: + HdArnoldRenderDelegate* _renderDelegate = nullptr; SdfPath _hydraCameraPath; GfVec2f _hydraCameraShutter = GfVec2f(0.f, 0.f); }; @@ -130,5 +129,3 @@ HDARNOLD_API PXR_NAMESPACE_CLOSE_SCOPE #endif // PXR_VERSION >= 2308 - -#endif // ENABLE_HYDRA2_RENDERSETTINGS \ No newline at end of file From 3fe143b9b5fd61af0c2c307e424f74222edf4f81 Mon Sep 17 00:00:00 2001 From: "ADS\\blaines" Date: Wed, 20 May 2026 12:43:41 +0200 Subject: [PATCH 2/2] Run the hydra2 testsuite reading the hydra render settings prim --- libs/render_delegate/reader.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/libs/render_delegate/reader.cpp b/libs/render_delegate/reader.cpp index 76df68483..d82626d46 100644 --- a/libs/render_delegate/reader.cpp +++ b/libs/render_delegate/reader.cpp @@ -35,6 +35,9 @@ PXR_NAMESPACE_USING_DIRECTIVE // clang-format off TF_DEFINE_PRIVATE_TOKENS(_tokens, ((hydraProcCamera, "/ArnoldHydraProceduralCamera")) + (renderSettingsSrc) + (hydraSceneRenderSettingsSrc) + ); // check pxr/imaging/hd/testenv/testHdRenderIndex.cpp @@ -307,6 +310,9 @@ void HydraArnoldReader::ReadStage(UsdStageRefPtr stage, // We want to use the RenderSetting hydra prim only if we use the scene index system if (_useSceneIndex) { // TODO set metadata only if it it not already set + VtValue val(_tokens->hydraSceneRenderSettingsSrc); + // Tell the arnold render delegate to use the hydra render settings + arnoldRenderDelegate->SetRenderSetting(_tokens->renderSettingsSrc, val); stage->SetMetadata(UsdRenderTokens->renderSettingsPrimPath, _renderSettings); } else { UsdPrim renderSettingsPrim = stage->GetPrimAtPath(SdfPath(_renderSettings));