From cbbf5049af6380aa3a1279652d06e147e7f7b20d Mon Sep 17 00:00:00 2001 From: Jakub Svoboda <132791205+rolledhand@users.noreply.github.com> Date: Mon, 11 May 2026 17:40:09 +0200 Subject: [PATCH 01/29] Add Houdini 21 Python 3.11 payload kickoff Signed-off-by: Jakub Svoboda <132791205+rolledhand@users.noreply.github.com> --- houdini/CMakeLists.txt | 2 +- houdini/python3.11libs/pythonrc.py | 30 ++++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 houdini/python3.11libs/pythonrc.py diff --git a/houdini/CMakeLists.txt b/houdini/CMakeLists.txt index 35376d4..50f85f7 100644 --- a/houdini/CMakeLists.txt +++ b/houdini/CMakeLists.txt @@ -16,7 +16,7 @@ install(DIRECTORY soho python2.7libs python3.9libs + python3.11libs DESTINATION plugin/houdini ) - diff --git a/houdini/python3.11libs/pythonrc.py b/houdini/python3.11libs/pythonrc.py new file mode 100644 index 0000000..cd296d9 --- /dev/null +++ b/houdini/python3.11libs/pythonrc.py @@ -0,0 +1,30 @@ +# Copyright 2023-2024 DreamWorks Animation LLC +# SPDX-License-Identifier: Apache-2.0 + +# Temporary solution to force houdini to load moonrayLight.ds. +# Remove this file once moonray hydra render delegate is available +import hou + +import loputils + + +def addRendererParmFolders(node, parmgroup): + if not loputils: + return + names = hou.lop.availableRendererNames() + labels = hou.lop.availableRendererLabels() + new_names = ["moonray"] + list(names) + new_labels = ["Moonray"] + list(labels) + + for name, label in zip(new_names, new_labels): + try: + dspath = hou.findFile('soho/parameters/%s_%s.ds' + % (name, parmgroup)) + except hou.OperationFailed: + continue + + loputils.addDialogScriptFolder(dspath, node, label) + + +if loputils: + loputils.addRendererParmFolders = addRendererParmFolders From 4ad28a6f7aa94c8fb992e15707a9148577e63af0 Mon Sep 17 00:00:00 2001 From: Jakub Svoboda <132791205+rolledhand@users.noreply.github.com> Date: Sun, 31 May 2026 10:57:04 +0200 Subject: [PATCH 02/29] usd_usdmtlxsubnet_pythonscript-HDA_exposure Signed-off-by: Jakub Svoboda <132791205+rolledhand@users.noreply.github.com> --- houdini/CMakeLists.txt | 1 - .../otls/Vop::DW_MOONRAY::AttributeMap::1.hda | Bin 8095 -> 8105 bytes .../otls/Vop::DW_MOONRAY::AxisAngleMap::1.hda | Bin 6892 -> 6902 bytes .../otls/Vop::DW_MOONRAY::BaseMaterial::1.hda | Bin 6020 -> 6030 bytes .../otls/Vop::DW_MOONRAY::BaseVolume::1.hda | Bin 17673 -> 17683 bytes ...Vop::DW_MOONRAY::BlendDisplayFilter::1.hda | Bin 6807 -> 6817 bytes houdini/otls/Vop::DW_MOONRAY::BlendMap::1.hda | Bin 6647 -> 6657 bytes .../Vop::DW_MOONRAY::CheckerboardMap::1.hda | Bin 6771 -> 6781 bytes ...Vop::DW_MOONRAY::ClampDisplayFilter::1.hda | Bin 6272 -> 6282 bytes houdini/otls/Vop::DW_MOONRAY::ClampMap::1.hda | Bin 5924 -> 5934 bytes ...DW_MOONRAY::ColorCorrectContrastMap::1.hda | Bin 7840 -> 7850 bytes ..._MOONRAY::ColorCorrectDisplayFilter::1.hda | Bin 7638 -> 7648 bytes ..._MOONRAY::ColorCorrectGainOffsetMap::1.hda | Bin 8980 -> 8990 bytes ...p::DW_MOONRAY::ColorCorrectGammaMap::1.hda | Bin 7369 -> 7379 bytes ...Vop::DW_MOONRAY::ColorCorrectHsvMap::1.hda | Bin 7773 -> 7783 bytes ...DW_MOONRAY::ColorCorrectHueShiftMap::1.hda | Bin 5894 -> 5904 bytes ...::DW_MOONRAY::ColorCorrectLegacyMap::1.hda | Bin 7563 -> 7573 bytes .../Vop::DW_MOONRAY::ColorCorrectMap::1.hda | Bin 20528 -> 20538 bytes ...op::DW_MOONRAY::ColorCorrectNukeMap::1.hda | Bin 4316 -> 4326 bytes ..._MOONRAY::ColorCorrectSaturationMap::1.hda | Bin 7654 -> 7664 bytes ...Vop::DW_MOONRAY::ColorCorrectTMIMap::1.hda | Bin 6038 -> 6048 bytes ...op::DW_MOONRAY::CombineDisplacement::1.hda | Bin 6997 -> 7007 bytes .../Vop::DW_MOONRAY::CombineNormalMap::1.hda | Bin 6201 -> 6211 bytes .../Vop::DW_MOONRAY::ConstantColorMap::1.hda | Bin 4939 -> 4949 bytes ...::DW_MOONRAY::ConstantDisplayFilter::1.hda | Bin 5700 -> 5710 bytes .../Vop::DW_MOONRAY::ConstantScalarMap::1.hda | Bin 4926 -> 4936 bytes ...W_MOONRAY::ConvolutionDisplayFilter::1.hda | Bin 7086 -> 7096 bytes .../otls/Vop::DW_MOONRAY::CurvatureMap::1.hda | Bin 6128 -> 6138 bytes .../otls/Vop::DW_MOONRAY::CutoutVolume::1.hda | Bin 7504 -> 7514 bytes houdini/otls/Vop::DW_MOONRAY::DebugMap::1.hda | Bin 7666 -> 7676 bytes .../Vop::DW_MOONRAY::DeformationMap::1.hda | Bin 6119 -> 6129 bytes .../Vop::DW_MOONRAY::DirectionalMap::1.hda | Bin 11742 -> 11752 bytes ...DW_MOONRAY::DiscretizeDisplayFilter::1.hda | Bin 6043 -> 6053 bytes .../Vop::DW_MOONRAY::DistortNormalMap::1.hda | Bin 9000 -> 9010 bytes .../Vop::DW_MOONRAY::DofDisplayFilter::1.hda | Bin 7321 -> 7331 bytes .../Vop::DW_MOONRAY::DwaAdjustMaterial::1.hda | Bin 12228 -> 12238 bytes .../Vop::DW_MOONRAY::DwaBaseMaterial::1.hda | Bin 57344 -> 57354 bytes ...DW_MOONRAY::DwaColorCorrectMaterial::1.hda | Bin 9757 -> 9767 bytes ...op::DW_MOONRAY::DwaEmissiveMaterial::1.hda | Bin 7909 -> 7919 bytes .../Vop::DW_MOONRAY::DwaFabricMaterial::1.hda | Bin 36088 -> 36098 bytes .../Vop::DW_MOONRAY::DwaLayerMaterial::1.hda | Bin 17865 -> 17875 bytes .../Vop::DW_MOONRAY::DwaMetalMaterial::1.hda | Bin 44995 -> 45005 bytes .../Vop::DW_MOONRAY::DwaMixMaterial::1.hda | Bin 38734 -> 38744 bytes ...::DW_MOONRAY::DwaRefractiveMaterial::1.hda | Bin 34420 -> 34430 bytes .../Vop::DW_MOONRAY::DwaSkinMaterial::1.hda | Bin 50002 -> 50012 bytes ...MOONRAY::DwaSolidDielectricMaterial::1.hda | Bin 51325 -> 51335 bytes .../Vop::DW_MOONRAY::DwaSwitchMaterial::1.hda | Bin 29110 -> 29120 bytes .../Vop::DW_MOONRAY::DwaToonMaterial::1.hda | Bin 94881 -> 94891 bytes ...op::DW_MOONRAY::DwaTwoSidedMaterial::1.hda | Bin 10626 -> 10636 bytes .../Vop::DW_MOONRAY::DwaVelvetMaterial::2.hda | Bin 29872 -> 29882 bytes .../otls/Vop::DW_MOONRAY::ExtraAovMap::1.hda | Bin 5843 -> 5853 bytes .../Vop::DW_MOONRAY::FloatToRgbMap::1.hda | Bin 5306 -> 5316 bytes ...p::DW_MOONRAY::GlitterFlakeMaterial::2.hda | Bin 5611 -> 5621 bytes .../otls/Vop::DW_MOONRAY::GradientMap::1.hda | Bin 10365 -> 10375 bytes ...W_MOONRAY::HairColorCorrectMaterial::1.hda | Bin 9757 -> 9767 bytes ...op::DW_MOONRAY::HairColorPresetsMap::1.hda | Bin 5592 -> 5602 bytes .../Vop::DW_MOONRAY::HairColumnMap::1.hda | Bin 4586 -> 4596 bytes ...op::DW_MOONRAY::HairDiffuseMaterial::1.hda | Bin 14013 -> 14023 bytes .../Vop::DW_MOONRAY::HairLayerMaterial::1.hda | Bin 8654 -> 8664 bytes houdini/otls/Vop::DW_MOONRAY::HairMap::1.hda | Bin 6419 -> 6429 bytes .../otls/Vop::DW_MOONRAY::HairMaterial::3.hda | Bin 23141 -> 23151 bytes .../Vop::DW_MOONRAY::HairToonMaterial::1.hda | Bin 76245 -> 76255 bytes ...::DW_MOONRAY::HalftoneDisplayFilter::1.hda | Bin 6933 -> 6943 bytes .../otls/Vop::DW_MOONRAY::HsvToRgbMap::1.hda | Bin 4861 -> 4871 bytes ...Vop::DW_MOONRAY::ImageDisplayFilter::1.hda | Bin 6721 -> 6731 bytes houdini/otls/Vop::DW_MOONRAY::ImageMap::1.hda | Bin 15406 -> 15416 bytes .../Vop::DW_MOONRAY::ImageNormalMap::1.hda | Bin 10009 -> 10019 bytes houdini/otls/Vop::DW_MOONRAY::LODMap::1.hda | Bin 6470 -> 6480 bytes houdini/otls/Vop::DW_MOONRAY::LayerMap::1.hda | Bin 6375 -> 6385 bytes houdini/otls/Vop::DW_MOONRAY::LayerMap::2.hda | Bin 4381 -> 4391 bytes houdini/otls/Vop::DW_MOONRAY::ListMap::1.hda | Bin 10499 -> 10509 bytes ...Vop::DW_MOONRAY::MacroFlakeMaterial::1.hda | Bin 4891 -> 4901 bytes ...:DW_MOONRAY::MultiChannelToFloatMap::1.hda | Bin 5919 -> 5929 bytes houdini/otls/Vop::DW_MOONRAY::NoiseMap::1.hda | Bin 5389 -> 5399 bytes houdini/otls/Vop::DW_MOONRAY::NoiseMap::2.hda | Bin 16809 -> 16819 bytes .../Vop::DW_MOONRAY::NoiseWorleyMap::1.hda | Bin 5329 -> 5339 bytes .../Vop::DW_MOONRAY::NoiseWorleyMap::2.hda | Bin 17623 -> 17633 bytes .../Vop::DW_MOONRAY::NoiseWorleyMap::3.hda | Bin 6076 -> 6086 bytes ...Vop::DW_MOONRAY::NormalDisplacement::1.hda | Bin 6437 -> 6447 bytes .../Vop::DW_MOONRAY::NormalToRgbMap::1.hda | Bin 4913 -> 4923 bytes .../Vop::DW_MOONRAY::OpDisplayFilter::1.hda | Bin 7675 -> 7685 bytes houdini/otls/Vop::DW_MOONRAY::OpMap::1.hda | Bin 8529 -> 8539 bytes .../otls/Vop::DW_MOONRAY::OpSqrtMap::1.hda | Bin 4226 -> 4236 bytes .../otls/Vop::DW_MOONRAY::OpenVdbMap::1.hda | Bin 9256 -> 9266 bytes .../otls/Vop::DW_MOONRAY::OpenVdbMap::2.hda | Bin 9324 -> 9334 bytes .../Vop::DW_MOONRAY::OverDisplayFilter::1.hda | Bin 5930 -> 5940 bytes .../Vop::DW_MOONRAY::ProjectCameraMap::1.hda | Bin 7595 -> 7605 bytes .../Vop::DW_MOONRAY::ProjectCameraMap::2.hda | Bin 8382 -> 8392 bytes ...:DW_MOONRAY::ProjectCameraNormalMap::1.hda | Bin 7486 -> 7496 bytes ...::DW_MOONRAY::ProjectCylindricalMap::1.hda | Bin 10127 -> 10137 bytes .../Vop::DW_MOONRAY::ProjectPlanarMap::1.hda | Bin 9679 -> 9689 bytes ...:DW_MOONRAY::ProjectPlanarNormalMap::1.hda | Bin 10136 -> 10146 bytes ...op::DW_MOONRAY::ProjectSphericalMap::1.hda | Bin 8939 -> 8949 bytes ...op::DW_MOONRAY::ProjectTriplanarMap::1.hda | Bin 39198 -> 39208 bytes ...op::DW_MOONRAY::ProjectTriplanarMap::2.hda | Bin 39829 -> 39839 bytes ..._MOONRAY::ProjectTriplanarNormalMap::1.hda | Bin 38909 -> 38919 bytes ..._MOONRAY::ProjectTriplanarNormalMap::2.hda | Bin 39930 -> 39940 bytes ...DW_MOONRAY::ProjectTriplanarUdimMap::1.hda | Bin 13235 -> 13245 bytes .../Vop::DW_MOONRAY::RampDisplayFilter::1.hda | Bin 7299 -> 7309 bytes houdini/otls/Vop::DW_MOONRAY::RampMap::1.hda | Bin 10335 -> 10345 bytes .../otls/Vop::DW_MOONRAY::RandomMap::1.hda | Bin 6093 -> 6103 bytes .../Vop::DW_MOONRAY::RandomNormalMap::1.hda | Bin 5264 -> 5274 bytes .../Vop::DW_MOONRAY::RaySwitchMaterial::1.hda | Bin 9486 -> 9496 bytes ...Vop::DW_MOONRAY::RemapDisplayFilter::1.hda | Bin 13079 -> 13089 bytes houdini/otls/Vop::DW_MOONRAY::RemapMap::1.hda | Bin 12156 -> 12166 bytes ...DW_MOONRAY::RgbToFloatDisplayFilter::1.hda | Bin 6307 -> 6317 bytes .../Vop::DW_MOONRAY::RgbToFloatMap::1.hda | Bin 5413 -> 5423 bytes ...::DW_MOONRAY::RgbToHsvDisplayFilter::1.hda | Bin 6140 -> 6150 bytes .../otls/Vop::DW_MOONRAY::RgbToHsvMap::1.hda | Bin 4864 -> 4874 bytes .../otls/Vop::DW_MOONRAY::RgbToLabMap::1.hda | Bin 4896 -> 4906 bytes .../Vop::DW_MOONRAY::RgbToNormalMap::1.hda | Bin 4929 -> 4939 bytes ...op::DW_MOONRAY::ShadowDisplayFilter::1.hda | Bin 5765 -> 5775 bytes .../Vop::DW_MOONRAY::SwitchColorMap::1.hda | Bin 21987 -> 21997 bytes ...Vop::DW_MOONRAY::SwitchDisplacement::1.hda | Bin 29974 -> 29984 bytes .../Vop::DW_MOONRAY::SwitchFloatMap::1.hda | Bin 20195 -> 20205 bytes .../Vop::DW_MOONRAY::SwitchMaterial::1.hda | Bin 28124 -> 28134 bytes .../Vop::DW_MOONRAY::SwitchNormalMap::1.hda | Bin 22458 -> 22468 bytes ..._MOONRAY::TangentSpaceDisplayFilter::1.hda | Bin 6881 -> 6891 bytes .../Vop::DW_MOONRAY::ToonDisplayFilter::1.hda | Bin 8486 -> 8496 bytes houdini/otls/Vop::DW_MOONRAY::ToonMap::1.hda | Bin 7507 -> 7517 bytes ...Vop::DW_MOONRAY::TransformNormalMap::1.hda | Bin 5875 -> 5885 bytes .../Vop::DW_MOONRAY::TransformSpaceMap::1.hda | Bin 10106 -> 10116 bytes .../otls/Vop::DW_MOONRAY::TwoSidedMap::1.hda | Bin 4334 -> 4344 bytes .../Vop::DW_MOONRAY::UVTransformMap::1.hda | Bin 6868 -> 6878 bytes ...Vop::DW_MOONRAY::VectorDisplacement::1.hda | Bin 6864 -> 6874 bytes .../otls/Vop::DW_MOONRAY::WireframeMap::1.hda | Bin 5608 -> 5618 bytes .../python3.11libs/moonray_vopmask_check.py | 61 ++++++++++++ .../moonray_vopmask_materialx_patch.py | 93 ++++++++++++++++++ 128 files changed, 154 insertions(+), 1 deletion(-) create mode 100644 houdini/python3.11libs/moonray_vopmask_check.py create mode 100644 houdini/python3.11libs/moonray_vopmask_materialx_patch.py diff --git a/houdini/CMakeLists.txt b/houdini/CMakeLists.txt index 50f85f7..8a7fef9 100644 --- a/houdini/CMakeLists.txt +++ b/houdini/CMakeLists.txt @@ -15,7 +15,6 @@ install(DIRECTORY otls soho python2.7libs - python3.9libs python3.11libs DESTINATION plugin/houdini diff --git a/houdini/otls/Vop::DW_MOONRAY::AttributeMap::1.hda b/houdini/otls/Vop::DW_MOONRAY::AttributeMap::1.hda index 48ef3d76bc277963b0b59f5c9c5378cf52926ab2..c176f1c53ea8d5e03e2f241682661ef8a4df3e17 100644 GIT binary patch delta 79 zcmbPlztVn!2J5RV=`WlUbtO4pF#rLW-eEcDFFeH K%;p5f&CUP^avPce diff --git a/houdini/otls/Vop::DW_MOONRAY::BlendDisplayFilter::1.hda b/houdini/otls/Vop::DW_MOONRAY::BlendDisplayFilter::1.hda index 8950f086fd5250e696c0c97358d00a49d90321e2..ac9f45727bfe3d669a72f815b8e3223a65debce8 100644 GIT binary patch delta 82 zcmbPky3lljIvXQvmh>0SiMkS8jI0bm0Ot7{fO(R_U|#1V1z{}(-^7yCqRhmc2!-7I U{Jf&XN|0(00IAvB$S5WW0A!36DF6Tf delta 72 zcmZ2zI^A@FIvd09%$@iDOw^U&V))Gf1Yn-O0hlK#4CZw{664fT$j#5sD@v>csR03y K%;s)JF-ZXO=o&)+ diff --git a/houdini/otls/Vop::DW_MOONRAY::BlendMap::1.hda b/houdini/otls/Vop::DW_MOONRAY::BlendMap::1.hda index 7edbff3c0fca7dfb614b45a71766f543bed1e89a..b6bf553d679f010fb87f415b63d647abc473dc0e 100644 GIT binary patch delta 79 zcmexv+-NdEgY{OH^cT*Fx{{o?7=QrG@mB|NBvybq_1hJMwG@04OHzw66LTUIa`W@^ SiV`b9ia`LRX0s3DY6$=n92k}W delta 69 zcmZoP`EEQxgY`n@&ij8R>Pm86U;qLz$6p=9kyrud)NdE#)KbXJ&(AALtOO|m0g%k* IFvisq0N^bevj6}9 diff --git a/houdini/otls/Vop::DW_MOONRAY::CheckerboardMap::1.hda b/houdini/otls/Vop::DW_MOONRAY::CheckerboardMap::1.hda index b78d67255732da675922872d71dcd8186bb23d08..b8bc6c9d7105f68fdbc9639915131c742bbd41f8 100644 GIT binary patch delta 79 zcmext^4Da72J5#h=`WlUbtO5!F#rLWKJ4I delta 69 zcmexs^4Vm92J4&5o%jDt)Rp9X!vF+ej=vs=BgqKnv|SeC)KbXJ&(AALtOO|m0g%k* IN=6n*0RGP!fdBvi diff --git a/houdini/otls/Vop::DW_MOONRAY::ClampDisplayFilter::1.hda b/houdini/otls/Vop::DW_MOONRAY::ClampDisplayFilter::1.hda index bcac2440a7b2bd9f812113191ca36d96f193dd24..842d1171b600cd8713ca71a8573bb92afd57a3ae 100644 GIT binary patch delta 82 zcmZoL>@u97&c?`^CH;kSqOJrNBP#PmQD$OJghFn9 UeqK>xB}g?0fYfYmWc)7%0DhhpzW@LL delta 72 zcmeA&Y%rXl&c^UNbLag(6LlrH7=AMV0hs4+0OpDP0rNT^iE(NvbENhYbp39mZTPCCgwya^cT*Fx{{n?3_t+p_?v+^vTR^Z-)9A3Ed}4ilGLKi#GD9)-2D8! SqQpv&Vh{kS**u+*Qx*Vj;T4(y delta 69 zcmZ2wyTEpW1}jhI&ij8S>Pm9*FaQCV<8KDy$g+VseV@fRwG?vm^Ye-lD?v&?03@?{ IAtR?O09Y^=y8r+H diff --git a/houdini/otls/Vop::DW_MOONRAY::ColorCorrectDisplayFilter::1.hda b/houdini/otls/Vop::DW_MOONRAY::ColorCorrectDisplayFilter::1.hda index 8ad319e539de423f3025a5eedc85e5fbf6e7e6cc..a5580ed1eb42616424cd2af9ffc9794df59a4d49 100644 GIT binary patch delta 79 zcmca+{lI#H2CHJ0^cT*Fx{{oV3_t+p_*;NDGWuZ7gntUcS_;02C8Pm8oGXMdY<8J}t$moMP6aI;DYANLA=jRnAR)Um(07z!@ IIz}TI0D^EBumAu6 diff --git a/houdini/otls/Vop::DW_MOONRAY::ColorCorrectGainOffsetMap::1.hda b/houdini/otls/Vop::DW_MOONRAY::ColorCorrectGainOffsetMap::1.hda index e53391c84ccb27cbb6d6c2ab16da02174ae75e19..1091a518dba03983ebbe3562081a4c88ca56f42b 100644 GIT binary patch delta 79 zcmbQ@HqUK>2CH0_^cT*Fx{{o73_t+p_*;NDiUnZKgx?CnS_;02C8Pm8oFaQCV<8J}tC>DS@6MlPm7lfB=}|Zw%r{+krXV&&4>k6ms+P^NJEH!D^t&Hcw)7 Glm-B5Fc>TV diff --git a/houdini/otls/Vop::DW_MOONRAY::ColorCorrectHsvMap::1.hda b/houdini/otls/Vop::DW_MOONRAY::ColorCorrectHsvMap::1.hda index b5b1d15cf18145fcc546b45c317c5d66f2de6eed..d1ebc40aeb0bd93bc39494e29c5ac10adcab743f 100644 GIT binary patch delta 82 zcmca>^W0{FIvXQXmh>0SiMkS8j7$tb0Ot7{fO#@^z`V};3c^|nzKJENMVW~?5em8a U`FTZ&l_1q108+ELj`6+>0Jy^!OaK4? delta 72 zcmaEEbJu2qIvc}}%$@iDPSlm)V)(%T1Yn-O0hlLq2h8idFUF~*kei>MSCm)@QUd}Y Knav%H_hkS&Ivi>M diff --git a/houdini/otls/Vop::DW_MOONRAY::ColorCorrectHueShiftMap::1.hda b/houdini/otls/Vop::DW_MOONRAY::ColorCorrectHueShiftMap::1.hda index 7588cad0e466325e75ce39d33d44c850485e51d5..ecd4d8f80432cd8b165a9ab283c4aa9efa8d1a76 100644 GIT binary patch delta 79 zcmZqEo1iyAgHqZR}J delta 69 zcmbQB*QPf?gOw+9=l#DEbtO4@7=QrG@izl;M03ELzRzNuS_--O`FTZ&l^`V`0Fv3f IkTG8r08n}uB>(^b diff --git a/houdini/otls/Vop::DW_MOONRAY::ColorCorrectLegacyMap::1.hda b/houdini/otls/Vop::DW_MOONRAY::ColorCorrectLegacyMap::1.hda index 781d5ea21f23237c2350494abf56571dd650dc83..6323aa98a0a3afea5ab8c33f1977c8679f134e92 100644 GIT binary patch delta 79 zcmeCSo@zZogOx8!`U~eoT}e(p1|R@){7pa{>EB>Z&uax?Ed}4ilGLKi#GD9)-2D8! SqQpv&Vh{kS+1$(cPZ|J*kryNY delta 69 zcmbPg-EBQVgOw$7=l#DEbtO4j7=QrG@izf+q<@1sJ+H+$wG?vm^Ye-lD?v&?03@?{ II^#cS0BM#PMF0Q* diff --git a/houdini/otls/Vop::DW_MOONRAY::ColorCorrectMap::1.hda b/houdini/otls/Vop::DW_MOONRAY::ColorCorrectMap::1.hda index d99ea041a29ed22c5e1c9868ddcae5d65a98a055..af36219fed3f4963fc70b8cc5b3c68d15d92203e 100644 GIT binary patch delta 81 zcmdn6fN|FX#t9m%-?F5?a8A^f0SiMkS8jBE@*0Ot7{f_eO5U|!c_1z{}(-^7yCqRhmc2!-7I U{Jf&XN|0(00IAvB%oxcJ0FSN~1poj5 delta 72 zcmaE+ct>%9Ivc~E6y23qC+bRYG5lcw0x-|t5X|Eb1M|8bi*afxY delta 69 zcmexh{mgoT2CGQs&inr+>Pm8oFaQCV<8J}t$T)#H6Mli_@% diff --git a/houdini/otls/Vop::DW_MOONRAY::ColorCorrectTMIMap::1.hda b/houdini/otls/Vop::DW_MOONRAY::ColorCorrectTMIMap::1.hda index 89912a0ce6e60c03e78a50fa4218307d56f0181f..7ed8b144ad9d6a8c46125813a196145af919caab 100644 GIT binary patch delta 82 zcmbQHzd(P2IvXQXmh>0SiMkS8j7$tb0Ot7{fO%q~U|#2a1z{}(-^7yCqRhmc2!-7I U{Jf&XN|0(00IAtr$0#8N09{2D3IG5A delta 72 zcmZ3WKTUsvIvc}}%$@iDP1Kd(V)(%T1Yn-O0hlKy3g&g*7vt1Y$j#5sD@v>csR03y K%;pY82{8ce&l)TM diff --git a/houdini/otls/Vop::DW_MOONRAY::CombineDisplacement::1.hda b/houdini/otls/Vop::DW_MOONRAY::CombineDisplacement::1.hda index 3df4ed0e8de3b8206ebde3c00482a607f6875f6b..ec2ca8ba74f8e82254674a2b402b7d2e75f970b1 100644 GIT binary patch delta 79 zcmca=cHeA*1}jgN^cT*Fx{{nc3_t+p_#1&Zk|)8Ou9phJS_;02C8P;j3fZ0Ul%q2 delta 69 zcmca_cGYZx1}jtM&inr+>Pm7lF#rLW<8K7wNS*|9x?YNLYANLA=jRnAR)Um(07z!@ IWX3a+0EG=1TL1t6 diff --git a/houdini/otls/Vop::DW_MOONRAY::CombineNormalMap::1.hda b/houdini/otls/Vop::DW_MOONRAY::CombineNormalMap::1.hda index 22bb66f43ff37b77874da4cf099a7c5886867ddb..57b34f42af33cae8a90d701e83c4928c6d9f7f48 100644 GIT binary patch delta 79 zcmdmKaM)mi2J81M=`WlUbtO5!GXMdY^0Q|2TmjD0& diff --git a/houdini/otls/Vop::DW_MOONRAY::ConstantColorMap::1.hda b/houdini/otls/Vop::DW_MOONRAY::ConstantColorMap::1.hda index d7c1409f2a33a53247ce769cb8800f1e50353a17..bbb2b09ce9b287c3f8a9c9de61648e4833baec3b 100644 GIT binary patch delta 79 zcmX@Dc2#YH2J5dZ=`WlUbtO4}F#rLWw*A19vP(o delta 69 zcmcbrc3N$M2J45+o%jDu)RpA?zyJhbj=w&LBX|YOX}>PUsilycpPyHhSP4=B0w9^q Ib&S^q0R+Mu$^ZZW diff --git a/houdini/otls/Vop::DW_MOONRAY::ConstantDisplayFilter::1.hda b/houdini/otls/Vop::DW_MOONRAY::ConstantDisplayFilter::1.hda index 29d087ddc42adc82b39202038a95641848299c60..0d711228650a4dc31405d907b996bb40473f402f 100644 GIT binary patch delta 79 zcmX@2b53W12CHC}^cT*Fx{{oN3_t+p_?v(@A{)V+o_7kuS_;02C8Pm95GXMdY<8K1uh-?INdftg~YANLA=jRnAR)Um(07z!@ IEXFM&0Cv9_3IG5A diff --git a/houdini/otls/Vop::DW_MOONRAY::ConstantScalarMap::1.hda b/houdini/otls/Vop::DW_MOONRAY::ConstantScalarMap::1.hda index d89405081e98ee9a542659e8b2b7cba5f2ddfc19..383470ea0c907e74675da4d619094d2e3131fab5 100644 GIT binary patch delta 79 zcmdm|c0z4}2J62p=`WlUbtO6fF#rLW<8J`s2p$4+I&LcnYbp39mZTPCCgwya2J4s1o%jDu)RpA?!T9{S%silycpPyHhSP4=B0w9^q I&5TC{0sdPXqW}N^ diff --git a/houdini/otls/Vop::DW_MOONRAY::ConvolutionDisplayFilter::1.hda b/houdini/otls/Vop::DW_MOONRAY::ConvolutionDisplayFilter::1.hda index dc8641b2dd6595277a05466a3ca1c4efc534e121..59d7329c28154a40386329411358333c40223f66 100644 GIT binary patch delta 79 zcmZ2yzQcTi2CHnA^cT*Fx{{o-3_t+p_?v?`QaoTz|1Sk$Ed}4ilGLKi#GD9)-2D8! SqQpv&Vh{kS**u?-UkU(v`4!dx delta 69 zcmdmCzRrAt2CH!9&inr+>Pm77GXMdY<8Kb)Nb!I<{lCOGwG?vm^Ye-lD?v&?03@?{ IB_qES0AlMG`v3p{ diff --git a/houdini/otls/Vop::DW_MOONRAY::CurvatureMap::1.hda b/houdini/otls/Vop::DW_MOONRAY::CurvatureMap::1.hda index c6061ec98eea4c0ac99b4d2f485fd8ec7487bfd5..49468769bc51ff09d66f15680dcd16f5e17b92e2 100644 GIT binary patch delta 79 zcmeyM|4V;@2J5RV=`WlUbtO4pF#rLWHq)$ diff --git a/houdini/otls/Vop::DW_MOONRAY::DebugMap::1.hda b/houdini/otls/Vop::DW_MOONRAY::DebugMap::1.hda index 8905753af048410a392c971f1280a046ca8b368e..2ac53774e8db0c804ebeb6ca2fa0e2cdafc468c4 100644 GIT binary patch delta 79 zcmexl{l|KO2J5XX=`WlUbtO4(F#rLWbENhYbp39mZTPCCgwya+blwG@04OHzw66LTUIa`W@^ SiV`b9ia`LRW^)!}tr!41$Qc&^ delta 69 zcmeyU|6G592J4H=o%jDw)Rp9X!2kqcj=wI5BUT0Gw4N8^)KbXJ&(AALtOO|m0g%k* I62@9F00qw*KmY&$ diff --git a/houdini/otls/Vop::DW_MOONRAY::DirectionalMap::1.hda b/houdini/otls/Vop::DW_MOONRAY::DirectionalMap::1.hda index 23a5871517507a2dddf2f770f6fa223493f9435c..d23084674f285978af67b188a978b83e445fabb4 100644 GIT binary patch delta 79 zcmcZ?{UUmT2J5FR=`WlUbtO4JF#rLW+blwG@04OHzw66LTUIa`W@^ SiV`b9ia`LRW^)!}i4Fi$G#PgQ delta 69 zcmaD6eJ^@~2J4H=o%jDw)Rp9X!2kqcj=wI5qf-dxw4N8^)KbXJ&(AALtOO|m0g%k* I62=l802%!opa1{> diff --git a/houdini/otls/Vop::DW_MOONRAY::DiscretizeDisplayFilter::1.hda b/houdini/otls/Vop::DW_MOONRAY::DiscretizeDisplayFilter::1.hda index 1d4dbe4c974968464b6cabca9af67236e7fbfe76..b5e7184f985429f36b571c38eb73f6d952f18ab0 100644 GIT binary patch delta 79 zcmbQOzf^yM2CHP2^cT*Fx{{od3_t+p_?v+^qW{30zHbV`S_;02C8Pm9*GXMdY<8KDyi2eg}`o4*AYANLA=jRnAR)Um(07z!@ I5=KTb0COW4jQ{`u diff --git a/houdini/otls/Vop::DW_MOONRAY::DistortNormalMap::1.hda b/houdini/otls/Vop::DW_MOONRAY::DistortNormalMap::1.hda index c36d086244992cc4d1766ed76bc763d03967b730..6698df59c70e7fde85b75871ae632249e825b7ce 100644 GIT binary patch delta 79 zcmZ4Cw#jXR2J81M=`WlUbtO5!GXMdYSe=dH42J7D}=`WlUbtO6fG5`UX<8J`s=y`%U9k&#OwG@04OHzw66LTUIa`W@^ SiV`b9ia`LRW^)Cjj~)O?kQqM! delta 69 zcmX>Xe&%@G7$)jUa=vB&0x-v455&3G59YL8664fT$j#5sD@v>cDFFeH K%;pNlN%sJ^#Tjk@ diff --git a/houdini/otls/Vop::DW_MOONRAY::DwaColorCorrectMaterial::1.hda b/houdini/otls/Vop::DW_MOONRAY::DwaColorCorrectMaterial::1.hda index f6358a18f6b2623a5fd570c7d33ad71a0046ca18..5b7a4789ff4a1004d7964362c6faafa0ee68545b 100644 GIT binary patch delta 79 zcmbR1v)pHb2CHb6^cT*Fx{{ot3_t+p_?v+^DlK46-zNoOEd}4ilGLKi#GD9)-2D8! SqQpv&Vh{kS**uN0T?GJ+9~QR& delta 69 zcmZ4PGuLN=1}k^w&Ib$=btO5u8Gr!H@izl;R9e8CzE5JDS_--O`FTZ&l^`V`0Fv3f IfU#W#0Op+(=l}o! diff --git a/houdini/otls/Vop::DW_MOONRAY::DwaEmissiveMaterial::1.hda b/houdini/otls/Vop::DW_MOONRAY::DwaEmissiveMaterial::1.hda index 1f0abf052b8465e98084924fe3b6635cd5910a99..a687ef049ac37f239a421ea15d20001dfc6532e4 100644 GIT binary patch delta 82 zcmaEA``&hfIvXQvmh>0SiMkS8jI0bm0Ot7{f_btDU|!cF1z{}(-^7yCqRhmc2!-7I U{Jf&XN|0(00IAvB#F#7#0IGQwdH?_b delta 72 zcmaEF`_y)VIvd09%$*MyChAIXG5lr#0x-|t5X_TJ0Q0&YiE(NvI49~#a{gri0x-wl0L1C81#>!XDF|yR_$HR57G);pL@4Cu U=jRnAR)Q3R07%W|3dV+R0EU(t!TcDFFeH K%;qM>hHe12#~AYf diff --git a/houdini/otls/Vop::DW_MOONRAY::DwaLayerMaterial::1.hda b/houdini/otls/Vop::DW_MOONRAY::DwaLayerMaterial::1.hda index ed6493638d1298c6feb599009eedcf1b6fbbf588..59423975e57ee9a20db0bac8bcf8564d4f67d66d 100644 GIT binary patch delta 81 zcmX@v&3L(+ae@Zx&n)RLoD+2=Ie#($0hr^j58}84gE{Tj6oj=Dd=pDji!u{)A{27- U^Ye-lD?y4u0HkJfF=Lnu0By$^%m4rY delta 71 zcmccI&3Lk#ae@Zx`^=pW7$)jUa=vE(0x-v4AH;D926Ni4iE(NvY$@!iE2*4bFeGq4zFPPJQO^j1ZAvZriuPCt+qyz*& LGMj4|1J(fm-i8@t diff --git a/houdini/otls/Vop::DW_MOONRAY::DwaMixMaterial::1.hda b/houdini/otls/Vop::DW_MOONRAY::DwaMixMaterial::1.hda index f5785de662ffe8297fb8212081301e834966f3a5..bb5b680fc527b82f17f0b13e77693788642917cf 100644 GIT binary patch delta 81 zcmX@Nj_JlarU@FXAG4&ta8A^fT1u@a;h1VCywXEHvW3IM4T8?XQX delta 71 zcmcbyj_KSwrU@FX&og&EV4SEc$@!cC2*4bFT@YvLBQU4+oEWE;LT-M3UQuEtNC^ml LWHuKwKAj2x*25X) diff --git a/houdini/otls/Vop::DW_MOONRAY::DwaRefractiveMaterial::1.hda b/houdini/otls/Vop::DW_MOONRAY::DwaRefractiveMaterial::1.hda index 98ceb76b936cc56ef15e8e8eb0cb25327fb02391..c864a63c5ecd94c71c48e85748b0c199b3b6990a 100644 GIT binary patch delta 81 zcmey;!}PC*X@UkTZ0dZQMf;l~}#5lDSa`W@^iV`b9N&%@G7$@pVa=vB&0x-v455zh65X@=2B*v+wkei>MSCm)@QUU@X Lnavf9PYwbA&8!*> diff --git a/houdini/otls/Vop::DW_MOONRAY::DwaSolidDielectricMaterial::1.hda b/houdini/otls/Vop::DW_MOONRAY::DwaSolidDielectricMaterial::1.hda index e55d0a87bab05d97f10ba71b9f32bb75e018fd58..6dcc18d296b39877ac9205d426dc067fb20b729c 100644 GIT binary patch delta 81 zcmex6fw_Gm^8^i6#VqMBoD+2=ITaaz0L<~X1aXdC1#>3;QxMit@J%d9Ey_&HiBQPR V&(AALtOO|r0g#%_OBrt*0{{xg8LMSCm)@QUU@X Lna%4NZyW;vPOlf{ diff --git a/houdini/otls/Vop::DW_MOONRAY::DwaSwitchMaterial::1.hda b/houdini/otls/Vop::DW_MOONRAY::DwaSwitchMaterial::1.hda index b0251f61df92ff901a569a31c1899451add6c4b8..282e997aba55c3b757cb5457da46b77c34571586 100644 GIT binary patch delta 81 zcmdn?nDM}4#t9m%f3u{&a8A^fh($ delta 71 zcmX@`m~q=<#t9m%pEGwpV4A2a$@!T92*4bF0}!Xc8qDdqCB~_xkei>MSCm)@QUU@X Knaxd%b_D>@iWtrS diff --git a/houdini/otls/Vop::DW_MOONRAY::DwaToonMaterial::1.hda b/houdini/otls/Vop::DW_MOONRAY::DwaToonMaterial::1.hda index 7daf4fefce1b28e0b9c5ae0ababfeea415982c42..d2e6a86d66abb397ac4339cf9a404f453a257295 100644 GIT binary patch delta 85 zcmZ4Zly&t})(IM{U$dmYa8A^fPmQD$OJghFn9 TeqK>xB}g?0fYdB*V$=WtfSnc} delta 71 zcmeAPZVH~D&c^UNbLRu5iMkS848IwG0L=3@1oPDYf_Yt!#5lDSa`W@^iV`b9YCr%a Jv$%&*0|0kF7gYcN diff --git a/houdini/otls/Vop::DW_MOONRAY::DwaVelvetMaterial::2.hda b/houdini/otls/Vop::DW_MOONRAY::DwaVelvetMaterial::2.hda index 330efe97dd6675c238ebbc4529c1d1a3ef0e6fd4..d11187c7a9894a241523784f2233a8fb7c41a592 100644 GIT binary patch delta 81 zcmdn+l5y8d#t9m%f3u{&a8A^fl5xXJ#t9m%pEGwpV4A2a$@!T92*4bF0}!X!6wK+kCB~_xkei>MSCm)@QUU@X Knaxd%7R3P33>e4& diff --git a/houdini/otls/Vop::DW_MOONRAY::ExtraAovMap::1.hda b/houdini/otls/Vop::DW_MOONRAY::ExtraAovMap::1.hda index a8837ebdd1d5f2f481bbb22a0e3dbde14ff462f8..3fa28d049c9e9efab7ee6162b8a432cfa826a962 100644 GIT binary patch delta 79 zcmcbtdslaY2J5pd=`WlUbtO5UF#rLWPm9nVE_U!$6pJ?5iJFCnhuL`YANLA=jRnAR)Um(07zzY IDr1Ex0A)cI*8l(j diff --git a/houdini/otls/Vop::DW_MOONRAY::FloatToRgbMap::1.hda b/houdini/otls/Vop::DW_MOONRAY::FloatToRgbMap::1.hda index 56e06453b5aa5d3314881010ef28b354fab44fbe..3286cd9c6bc777dc273f20124dfc27e2e2b204ce 100644 GIT binary patch delta 79 zcmdm`c|>!92J5>l=`WlUbtO69F#rLWPm7xVE_U!$6p7;5e@=#T26~`YANLA=jRnAR)Um(07zzY IK4Yjb09M-;fdBvi diff --git a/houdini/otls/Vop::DW_MOONRAY::GlitterFlakeMaterial::2.hda b/houdini/otls/Vop::DW_MOONRAY::GlitterFlakeMaterial::2.hda index 0ddaac5411bd1e8b246a19e3f366a79c16ff38c3..87adba54d391c09b015cf157f8b6da07e65f9988 100644 GIT binary patch delta 79 zcmaE@{Z)H{1}k@#^cT*Fx{{pS3_t+p_#1;bBJp5O_X`DKEd}4ilGLKi#GD9)-2D8! SqQpv&Vh{kS+1$yPBmw}H)fQ|3 delta 69 zcmeyW{aSm11}kHV?#i1JbtO3&8Gr!H@izu>MB>4m?iXU5S_--O`FTZ&l^`V`0Fv1} InK4NO0P>O);Q#;t diff --git a/houdini/otls/Vop::DW_MOONRAY::GradientMap::1.hda b/houdini/otls/Vop::DW_MOONRAY::GradientMap::1.hda index 1871cd9544139e3c5e7c4be9e59c65a604e31a80..b90e17e510dc9c9895e19d8193830eb32ac78556 100644 GIT binary patch delta 79 zcmewx&>lEJgY{XK^cT*Fx{{pF7=QrG@z(-z)aAjPro#%tS_;02C80SiMkS8jBE@*0Ot7{f_WlAU|!c_1z{}(-^7yCqRhmc2!-7I U{Jf&XN|0(00IAvB%or*H0F#y$6951J delta 72 zcmaE)eM5VKIvc~E%$*OIC+bRYG5lcw0x-|t5X=(^0`s~ai*afxl=`WlUbtO69F#rLWPm7xVE_U!$6p7;5oiK)T26~`YANLA=jRnAR)Um(07zzY IK4Yr@0CVLRF8}}l diff --git a/houdini/otls/Vop::DW_MOONRAY::HairDiffuseMaterial::1.hda b/houdini/otls/Vop::DW_MOONRAY::HairDiffuseMaterial::1.hda index 716b29d3db6fef9bd01dc5dd76b13df26cbd1158..31cbe251f8b441cc30b426ca2c450d1bf1114090 100644 GIT binary patch delta 82 zcmdm+dpvi7IvXQPmh>0SiMkS8j4TX50Ot7{f_bKvU|!cl1z{}(-^7yCqRhmc2!-7I U{Jf&XN|0(00IAvB$Y^5<0IPBqX8-^I delta 72 zcmX?}yEk`&Ivc~U%$*OIC+bRYG5lfx0x-|t5X>{R1oOHcig9Wwt@Tp17m delta 69 zcmccNe9n1-2J5HHoe!8N>Pm8cVgLd#$KL?NQ3wHZI&O+_YANLA=jRnAR)Um(07zzY IBV)J%0DQ?8O#lD@ diff --git a/houdini/otls/Vop::DW_MOONRAY::HairMap::1.hda b/houdini/otls/Vop::DW_MOONRAY::HairMap::1.hda index b9ff9c8d5b02b75ced1180f3b4cbf7d4a4ea28cb..18dad16a296d4eb8c347db5edc3042147bda3f1a 100644 GIT binary patch delta 79 zcmbPiG}mZ?2J5vf=`WlUbtO5kF#rLWNYC~Ybp39mZTPCCgwyaPm8+VE_U!$6pP^5kCp$)NK~y)KbXJ&(AALtOO|m0g%k* IK*lrT07bJFu>b%7 diff --git a/houdini/otls/Vop::DW_MOONRAY::HairMaterial::3.hda b/houdini/otls/Vop::DW_MOONRAY::HairMaterial::3.hda index 34ed2c78430b660eeac12dfe11fd4d0b87ad3b58..6b393d3601e31d4c6ff666056f6e2507ca6103f7 100644 GIT binary patch delta 96 zcmaF5h4K9s#t9m%FS4Y+a8A^fMHpeltM*;wZQX1C) delta 87 zcmaFAh4JYY#t9m%_cC`rV40{Z$$5_f2*4bFZBZa6k_E&8iZKE)h*p^VfJtHE`k7*! YS_--O`FTZ&l|WH20IA%Z!N?v70OVvDhyVZp diff --git a/houdini/otls/Vop::DW_MOONRAY::HairToonMaterial::1.hda b/houdini/otls/Vop::DW_MOONRAY::HairToonMaterial::1.hda index a74016f596adc47f3760489401aa20f41f724704..8e3db2f239382c5bcecccffd7d61a456a3f26ca9 100644 GIT binary patch delta 85 zcmcb5ndSavmI)fHKeD91a8A^f delta 69 zcmbPlHq~r`1}l5!&Ic?LbtO638Gr!H@izf+B%8pTo_AuLS_--O`FTZ&l^`V`0Fv1} Ii?LM_0MnNghyVZp diff --git a/houdini/otls/Vop::DW_MOONRAY::HsvToRgbMap::1.hda b/houdini/otls/Vop::DW_MOONRAY::HsvToRgbMap::1.hda index 84f1af9894683d52a31ad87e87f1134fff551221..8ab12b9dad196190d44b23025fbce846a6e1164e 100644 GIT binary patch delta 79 zcmeyX+O9T1gY{XK^cT*Fx{{pF7=QrG@z(-z1m}Y}O@|ePwG@04OHzw66LTUIa`W@^ SiV`b9ia`LRW^**-B0&HbC>W~% delta 69 zcmZoy`>Q%ZgY{14&Ic?LbtO6PFaQCV;M1& diff --git a/houdini/otls/Vop::DW_MOONRAY::ImageDisplayFilter::1.hda b/houdini/otls/Vop::DW_MOONRAY::ImageDisplayFilter::1.hda index a6864164dc47fc8db322701cb46947d8686c2ea3..21ed07e2e6d2a1b326526351e7ea7b1c2b896d38 100644 GIT binary patch delta 82 zcmX?Ta@u5qIvXQvmh>0SiMkS8jI0bm0Ot7{fO!&o!Mx5#3c^|nzKJENMVW~?5em8a U`FTZ&l_1q108+ELk@0{80G==w%>V!Z delta 72 zcmX?Ya?oUgIvd09%$*NdChAIXG5lr#0x-|t0L+uv3+8n`664fT$j#5sD@v>csR03y K%;s*!0}=q2(ijT> diff --git a/houdini/otls/Vop::DW_MOONRAY::ImageMap::1.hda b/houdini/otls/Vop::DW_MOONRAY::ImageMap::1.hda index f05d66356fb97c662e555932d3c474883cfcc05f..7ba8792e7c5981731df6c472f4f2e562702d718b 100644 GIT binary patch delta 79 zcmZ2iv7=&w2J5XX=`WlUbtO4(F#rLWbENhYbp39mZTPCCgwyaPm86U;qLz$6p=9vAPfD)NdE#)KbXJ&(AALtOO|m0g%k* IFvdq#0EK%P1ONa4 diff --git a/houdini/otls/Vop::DW_MOONRAY::ImageNormalMap::1.hda b/houdini/otls/Vop::DW_MOONRAY::ImageNormalMap::1.hda index 16dfa486a5e32f35b0ae01adf4c4edbfaa17bffd..b856dd95f561d149afd43a6b1fe8c4b752b4266f 100644 GIT binary patch delta 79 zcmbQ~x7crj2J8DQ=`WlUbtO69GXMdYPm7xWdH&&$6pu3QC$z_w4M>;)KbXJ&(AALtOO|m0g%k* ILdH$10BcPbcK`qY diff --git a/houdini/otls/Vop::DW_MOONRAY::LODMap::1.hda b/houdini/otls/Vop::DW_MOONRAY::LODMap::1.hda index 2c6c686da92f4825d0b7de82cf9e8002f78e81a7..e876656e8526e51815b5844734da3ff152cedb47 100644 GIT binary patch delta 79 zcmX?RbirtX2J59P=`WlUbtO43F#rLWPm8+U;qLz$6po1kzfRKYS)W#YANLA=jRnAR)Um(07z!D I4bENhYbp39mZTPCCgwyaPm86U;qLz$6p=95uX9()NdE#)KbXJ&(AALtOO|m0g%k* IFvi*90B+qE6aWAK diff --git a/houdini/otls/Vop::DW_MOONRAY::LayerMap::2.hda b/houdini/otls/Vop::DW_MOONRAY::LayerMap::2.hda index 96bcf30b96a8a395f37e6b87750ef6a077ac6516..360c1dcff0ca708a345b61ad0acac1f672848b87 100644 GIT binary patch delta 79 zcmbQMv|MR|2J5XX=`WlUbtO4(F#rLWbENhYbp39mZTPCCgwyaPm86U;qLz$6p=9;XeoF)NdE#)KbXJ&(AALtOO|m0g%k* IFvg4g07i!vz5oCK diff --git a/houdini/otls/Vop::DW_MOONRAY::ListMap::1.hda b/houdini/otls/Vop::DW_MOONRAY::ListMap::1.hda index 7b163a1e43a8842f9a2334ec7ca2cd1c8c36b78b..4bb5181cf5445b892a37ea58dba0fc1916396af5 100644 GIT binary patch delta 79 zcmZn;>J6Hp!FnxA`U~eoT}jSs3_t+p_^W|9>N~-ly3Gp0S_;02C8x{{n{7=QrG@mB+J)OUh8b(_UFwG?vm^Ye-lD?v&?03@?H Ika3SX08b4T*#H0l diff --git a/houdini/otls/Vop::DW_MOONRAY::MacroFlakeMaterial::1.hda b/houdini/otls/Vop::DW_MOONRAY::MacroFlakeMaterial::1.hda index 9f19a4ad0ed8984d7109736a00daaf1f6e8defcd..f8fc94beaf384f804e4be65d64532aa25912bcab 100644 GIT binary patch delta 82 zcmbQOwp49`IvXQ%mh>0SiMkS8jLZx`0Ot7{fO!Mx4~3c^|nzKJENMVW~?5em8a U`FTZ&l_1q108+ELo^g&K0CR>G1poj5 delta 72 zcmZ3gHd}3iIvc~!6y24#ChAIXG5llz0x-|t0L&Ad3FdV^5aZNR$j#5sD@v>csR03y K%;rwUIf4Lno)>!n diff --git a/houdini/otls/Vop::DW_MOONRAY::MultiChannelToFloatMap::1.hda b/houdini/otls/Vop::DW_MOONRAY::MultiChannelToFloatMap::1.hda index 6c0c25e11fda9aa5c061bb33591ae8e159c9726b..8cceac025e332eb583f5fae9c84369e6c345f68b 100644 GIT binary patch delta 79 zcmbQQw^DC{2CGn(^cT*Fx{{ni3_t+p_?v<_qFrE4?|TJdEd}4ilGLKi#GD9)-2D8! SqQpv&Vh{kS**uA{R}=tvj}}`1 delta 69 zcmZ3fH(zgp1}jJA&Iha$btO4D7=QrG@izr=M7zM8-uGghS_--O`FTZ&l^`V`0Fv1} Ihp|@_0M_Ibpa1{> diff --git a/houdini/otls/Vop::DW_MOONRAY::NoiseMap::1.hda b/houdini/otls/Vop::DW_MOONRAY::NoiseMap::1.hda index b06dc2908b6c04c5f9707b687f2f646f4d83f17f..e12db1605e628acc814ce2e0b2867dd7e97f0d03 100644 GIT binary patch delta 79 zcmeCxnyxiLgY{OH^cT*Fx{{o?7=QrG@mB|Ng!h3t_1hJMwG@04OHzw66LTUIa`W@^ SiV`b9ia`LRX0s3DL16&)Zx~Sk delta 69 zcmbQP)vGl@gY`m+?#kN}btO43FaQCVbHw=YANLA=jRnAR)Um(07zzY I7~?@<079)6&Hw-a diff --git a/houdini/otls/Vop::DW_MOONRAY::NoiseMap::2.hda b/houdini/otls/Vop::DW_MOONRAY::NoiseMap::2.hda index f1b76fa6e0cc7ed6a0574c5fba575bec3bc0d522..9efef78e65f734ca7dd3537835fde3388179fc4f 100644 GIT binary patch delta 81 zcmZ44%(%Ikae@Zxtt{y;oD+2=Id3rl0hr^j4&pdOfjRZt6@;}Ed=pDji!u{)A{27- U^Ye-lD?y4u0HkKK4`ZwY05+blwG@04OHzw66LTUIa`W@^ SiV`b9ia`LRW^)!}x-bAH6d0`l delta 69 zcmcbuc~NtM2J4Fy-Icc|>Pm9HU;qLz$6pu35l#VfTF;AdYANLA=jRnAR)Um(07zzY I31hl20BlniDgXcg diff --git a/houdini/otls/Vop::DW_MOONRAY::NoiseWorleyMap::2.hda b/houdini/otls/Vop::DW_MOONRAY::NoiseWorleyMap::2.hda index 33ee6d38ac0a932f6e12076b9335fadfda643b91..0054034f26faf41e2f01b7f8f76663ba13a4e1c2 100644 GIT binary patch delta 81 zcmccK$@s97ae@Zxr!46&oD+2=IX^J~0hr^j3*tCufjO<`6@;}Ed=pDji!u{)A{27- U^Ye-lD?y4u0HkJf7Gth60CHm)=Kufz delta 71 zcmaFZ$#}h!ae@Zxi_D!5*e2>qa=u^y0x-v47sPSS0&`l=i*afx+blwG@04OHzw66LTUIa`W@^ SiV`b9ia`LRW^)!}kQe|Ngcxf8 delta 69 zcmX@6zej(92J4H=oe$V1>Pm9HU;qLz$6pu35%ULgTF;AdYANLA=jRnAR)Um(07zzY I31g5L0AKPJv;Y7A diff --git a/houdini/otls/Vop::DW_MOONRAY::NormalDisplacement::1.hda b/houdini/otls/Vop::DW_MOONRAY::NormalDisplacement::1.hda index 1aa138f969d7166ed8590202be22f646900729a9..19f80ce88c1ac6b9d1760be0e4ce5200a18d8edc 100644 GIT binary patch delta 82 zcmZ2#wBBffIvXQLmh>0SiMkS8j2sL=0Ot7{fO+Ecz`V|<3c^|nzKJENMVW~?5em8a U`FTZ&l_1q108+ELg>j)c0Eg`sU;qFB delta 72 zcmZ2)wA5&VIvc~k%$*O|ChAIXG5liy0x-|t0L&Ag2j+D?730)W$j#5sD@v>csR03y K%;rAEh2j8(&ljcu diff --git a/houdini/otls/Vop::DW_MOONRAY::NormalToRgbMap::1.hda b/houdini/otls/Vop::DW_MOONRAY::NormalToRgbMap::1.hda index f1881c6302f49eda899ee29ed20e5f1dc30f3a50..2db521965db8c13419a4c19dec17f581cc76c230 100644 GIT binary patch delta 79 zcmdm}wp(q22J5FR=`WlUbtO4JF#rLWPm9HU;qLz$6pu35j+Csw4N8^)KbXJ&(AALtOO|m0g%k* I62{|#0A>UiYybcN diff --git a/houdini/otls/Vop::DW_MOONRAY::OpDisplayFilter::1.hda b/houdini/otls/Vop::DW_MOONRAY::OpDisplayFilter::1.hda index 2adc0462eb31951245dae60b734c0a2f15a28296..3e1d60af873fd6ef8bb3aa0f76687c3846eee59a 100644 GIT binary patch delta 79 zcmexu-D)#IgY{>Y^cT*Fx{{nf8Gr!H@z(=!WZJ--wrdK)S_;02C8Pm7RVE_U!$6p1+Q4j=kYF3MJYANLA=jRnAR)Um(07z!D IJEMpK08qsh(EtDd diff --git a/houdini/otls/Vop::DW_MOONRAY::OpSqrtMap::1.hda b/houdini/otls/Vop::DW_MOONRAY::OpSqrtMap::1.hda index 3d698a2ea357cf787a0c92c41a3260bf0a370e59..a7694f5a969eabcb7adb68962f696827f5cfe69a 100644 GIT binary patch delta 79 zcmZot>`|Pc!Fn%C`U~eoT}jS+3_t+p_-lYT{CZ$c!)^s(Ed}4ilGLKi#GD9)-2D8! SqQpv&Vh{kS*&N7d$PWP0ffpD6 delta 69 zcmeBCY*L({!FnZg=L7bMx{{n%7=QrG@z(%x`1Qb?hTUSES_--O`FTZ&l^`V`0Fv1p I&1lFE03<&ZWdHyG diff --git a/houdini/otls/Vop::DW_MOONRAY::OpenVdbMap::1.hda b/houdini/otls/Vop::DW_MOONRAY::OpenVdbMap::1.hda index 8e9acc47ccd5db8d42cc37c3df232e48f70f2de9..43c0684b0605508bc822f23be8a2af06aae890b8 100644 GIT binary patch delta 79 zcmZ4CvB_hC2J53N=`WlUbtO3;F#rLWPm9nU;qLz$6ph~Q92LiH0~GU)KbXJ&(AALtOO|m0g%k* I1jb8B0BX$_egFUf diff --git a/houdini/otls/Vop::DW_MOONRAY::OpenVdbMap::2.hda b/houdini/otls/Vop::DW_MOONRAY::OpenVdbMap::2.hda index 617fefc140a3f65c8175af0ee33ec320e81fae9f..9bddf8f7ae951eab42f522c02c891e0da90918ef 100644 GIT binary patch delta 79 zcmaFk@y%m`2J53N=`WlUbtO3;F#rLWPm9nU;qLz$6ph~Q5FVs8uyEFYANLA=jRnAR)Um(07zzY I0;8BR0COuAkN^Mx diff --git a/houdini/otls/Vop::DW_MOONRAY::OverDisplayFilter::1.hda b/houdini/otls/Vop::DW_MOONRAY::OverDisplayFilter::1.hda index 9712ce110d92b0446a5454ae61579ab7972399ca..ea462e0e7342b1e67e6e836d1da4937b78b0a819 100644 GIT binary patch delta 82 zcmZ3bw?%J)IvXQnmh>0SiMkS8jEoFG0OtAYgL$H>!Mu)p3c^|nzKJENMVW~?5em8a U`FTZ&l_1q108+ELhH;%J0E6`wQUCw| delta 72 zcmdm@w@PncsR03y K%;q-6b)o=+5f_{Q diff --git a/houdini/otls/Vop::DW_MOONRAY::ProjectCameraMap::1.hda b/houdini/otls/Vop::DW_MOONRAY::ProjectCameraMap::1.hda index aac960da37709f266fd6853920cd049175dbee43..656d16b50f22ea12ec6d97d38d62977193a948b4 100644 GIT binary patch delta 79 zcmZ2&z14bx2J5dZ=`WlUbtO4}F#rLWPm8cU;qLz$6p`Bkud>t+OLaoYANLA=jRnAR)Um(07zzY I9izDn0AU#xvH$=8 diff --git a/houdini/otls/Vop::DW_MOONRAY::ProjectCameraMap::2.hda b/houdini/otls/Vop::DW_MOONRAY::ProjectCameraMap::2.hda index c8ce191d17caa534597045f295d1a2025f331c6c..ff7f0abf700ffb7049e471b9082b4801f61214a6 100644 GIT binary patch delta 79 zcmdnzc*1dl2J5dZ=`WlUbtO4}F#rLWPm8cU;qLz$6p`Bk#`4k+OLaoYANLA=jRnAR)Um(07zzY I9ix{#0CAZY5C8xG diff --git a/houdini/otls/Vop::DW_MOONRAY::ProjectCameraNormalMap::1.hda b/houdini/otls/Vop::DW_MOONRAY::ProjectCameraNormalMap::1.hda index 6ce989f404a745868c37b2f99ed69c0071846dce..3334fc74a58603d8e521d4045ce0768a5b588117 100644 GIT binary patch delta 79 zcmdmIb;4?b1}lG-^cT*Fx{{py3_t+p_?v<_(rdt+-Zu)uS_;02C8yfy)*!qe-`op delta 69 zcmX?Mwa;pT1}kgk&IcS5btO4j8Gr!H@izr=q}PBsy>G-gwG?vm^Ye-lD?v&?03@?{ ICgXZ(0P_bGLjV8( diff --git a/houdini/otls/Vop::DW_MOONRAY::ProjectCylindricalMap::1.hda b/houdini/otls/Vop::DW_MOONRAY::ProjectCylindricalMap::1.hda index e9de1bbd97a3458a3fee20d188013d8802df1fb3..b2b714d769604fac4ef5160062cde57f5d718248 100644 GIT binary patch delta 79 zcmeD8pXonAgOx8!`U~eoT}e(p1|R@){7pa{)&F2l&uax?Ed}4ilGLKi#GD9)-2D8! SqQpv&Vh{kS+1$&>qy_+$supno delta 69 zcmbQ~-|s&`gOw$7=L3$3x{{nM3_t+p_?v(@s{g^9p4VcWS_--O`FTZ&l^`V`0Fv1} Iosmfm0PoZk!TD{?bj8AwG@04OHzw66LTUIa`W@^ SiV`b9ia`LRW^)N+ve9 delta 69 zcmccVecpS52J45+oewxB>Pm8cU;qLz$6p`BQHcO^+OLaoYANLA=jRnAR)Um(07zzY I9b>c#0E4ai_@% diff --git a/houdini/otls/Vop::DW_MOONRAY::ProjectSphericalMap::1.hda b/houdini/otls/Vop::DW_MOONRAY::ProjectSphericalMap::1.hda index 4995b8d8c98a95108497ce9fe32331d410c9b42f..d329922dca69da29158dbd2d3d5fecff6762ddd4 100644 GIT binary patch delta 82 zcmaFu`qg!UIvXQfmh>0SiMkS8jBE@*0Ot7{f_aLmU|!c_1z{}(-^7yCqRhmc2!-7I U{Jf&XN|0(00IAvB%$T7F0JYo}tpET3 delta 72 zcmezB`r37ZIvc~E%$*N7ChAIXG5lcw0x-|t5X@6d1@pQdi*afx80IEJ-cOOw5T; X$j#5sD@v>csRjX%n$69Ov!??9?l2fb delta 74 zcmZ3niD}*@rU~k741Y3rKH!+BE5XI^hXDw{JbyzlZ~6={uj{cGrT1u@a;P N1VA#Idl`jh0RYJ67<~W$ diff --git a/houdini/otls/Vop::DW_MOONRAY::ProjectTriplanarNormalMap::1.hda b/houdini/otls/Vop::DW_MOONRAY::ProjectTriplanarNormalMap::1.hda index 332a4da9c1169687f81d02134a1483808a1626a0..c230eae6080fb4b9dcec54f17b024da6d7131783 100644 GIT binary patch delta 77 zcmeyno~eBU(*z9`=`86l6Lq9Gq#1w!#P+iUv8Tm=*!@4{g|!rX6H8KyG81zm6ms+P T^NJEHK}taYsATh8#)N4A!jBkI delta 67 zcmZqQ!1Q-L(*z9`!OWcxChACW2r>Wxi0x+yVo!?!vHO3Da%w5$=I7@XC02qIfB;Zp J^K!<7X#fx<7N-CJ diff --git a/houdini/otls/Vop::DW_MOONRAY::ProjectTriplanarNormalMap::2.hda b/houdini/otls/Vop::DW_MOONRAY::ProjectTriplanarNormalMap::2.hda index cd5ffe4d70a40e66be015185932eac078b632a72..7f24fc3d5d0b9a8232c3ed1e4e288dafaf3112f4 100644 GIT binary patch delta 77 zcmeyhovCF9(*z9`=`86l6Lq9Gq#1w!#P+iUv1dhs*!@4{g|!rX6H8KyG81zm6ms+P T^NJEHK}taYsATh8#@JZ^#h@5o delta 67 zcmZqK!Sri8(*z9`!OWcxChACW2r>Wxi0x+yV$X^MvHO3Da%w5$=I7@XC02qIfB;Zp J^K!=6SpX8q7P9~V diff --git a/houdini/otls/Vop::DW_MOONRAY::ProjectTriplanarUdimMap::1.hda b/houdini/otls/Vop::DW_MOONRAY::ProjectTriplanarUdimMap::1.hda index 9f1eb70d82767275cc5ce104808823644824dd15..88bd4dd63e6678e8eba67d57f03bcaa68ebdd8bb 100644 GIT binary patch delta 75 zcmdm-zBhe>28&ph^p}Y`QXFCoKmcOeMy)S}G9oCt;7{QSJ4 R#7dA-5CAIKJdIJ-2moq27CZm| delta 65 zcmdm+zBzq@1`AK-&Ic29q&RpOfB?kyGY7GaBth)nFQS}U3c30Dc}0npAO#=*l-Rt0 HQPv0m$3zs7 diff --git a/houdini/otls/Vop::DW_MOONRAY::RampDisplayFilter::1.hda b/houdini/otls/Vop::DW_MOONRAY::RampDisplayFilter::1.hda index aef571f5c516b701737d0b5198be95f5257e139d..e5a62e0d678d53ba94264fe4ee4cdf1930ae84b4 100644 GIT binary patch delta 78 zcmZp+?6sVr&dSJ`CH-ZhjwB}|BLfhCIDQ6Tjx-C1(|%uGSWCe-u_U!9GchMZAvZri TuPCt+q!t8#N;X$Ba!3OJCi)bx delta 68 zcmeCRY_^=B&dTsTbLWGJI+C0W-x+`a#PKr#bEH{7oc8;ooLUOG`T2Q8iIpG~AOMuu J+{(xy4FD#p76JeO diff --git a/houdini/otls/Vop::DW_MOONRAY::RampMap::1.hda b/houdini/otls/Vop::DW_MOONRAY::RampMap::1.hda index 946946aac42f43507d433e0a0183ea2145c64951..d4c87304f4194c0acdbd525f44167bfd79530413 100644 GIT binary patch delta 75 zcmcZ~@G@Y62FtZ9=`Ry?q&TiI00D^Yrw(GPi-Op-TjYhc6nqm)Qj0PZb0QRS^YinH R5-UMUK>(;^vm2wNIsoU27uWy* delta 65 zcmaDEa6e#z2Fsbuoew7JNO7ED00I!(PaVWo7X`6vw}^6TDdgto=M^PZf)s!NP-1fc Hqog_jFx3_< diff --git a/houdini/otls/Vop::DW_MOONRAY::RandomMap::1.hda b/houdini/otls/Vop::DW_MOONRAY::RandomMap::1.hda index 5ff678e895753773baff698d2da3537cf1902a20..0ce395b4621d44fd9eeacdfe8e42a865bcb3b6c4 100644 GIT binary patch delta 75 zcmX@Be_elq2FtxH=`Ry?q&V&|00D^YrwL+{d*p?+6nqm)Qj0PZb0QRS^YinH R5-UMUK>(;^a{yzl7y#hJ7)Ag9 delta 65 zcmcbve^!5j2FsPqoew7JNO4?Y00I!(PZPuzs|2y@_lR<8Ddgto=M^PZf)s!NP-1fw HW33nfDPPm9HWB>v%$6pV`5mp3q+AfH3YANLA=jRnAR)Um(07zzY I8Ka6Y06}CH1^@s6 diff --git a/houdini/otls/Vop::DW_MOONRAY::RaySwitchMaterial::1.hda b/houdini/otls/Vop::DW_MOONRAY::RaySwitchMaterial::1.hda index 702fb5ed75744070744a95d5a9e54b5c3d24ea06..56f12f2553ee7804214064c663d8b008a96350d9 100644 GIT binary patch delta 79 zcmeD4n&CA;gY|!w^cT*Fx{{p#8Gr!H@izc*lqZ5Y9d{IjwG@04OHzw66LTUIa`W@^ SiV`b9ia`LRW^)ze6lDM@J{c_l delta 69 zcmbQ?)#o)qgY|3X&Ieo*btO5!G5`UX<8J`sC{F})I_`*ZYANLA=jRnAR)Um(07zzY I3*!`J0B!;oh5!Hn diff --git a/houdini/otls/Vop::DW_MOONRAY::RemapDisplayFilter::1.hda b/houdini/otls/Vop::DW_MOONRAY::RemapDisplayFilter::1.hda index 86416434d5dabda0e09724fddd49a639a09e0199..3a31753fd896a1639e7b1cb80ac023e53900d023 100644 GIT binary patch delta 82 zcmbQ9wlHmiIvXQvmh>0SiMkS8jI0bm0Ot7{fO&?K!Mx5#3c^|nzKJENMVW~?5em8a U`FTZ&l_1q108+ELk#U+K0H3TDy8r+H delta 72 zcmZ3OHa%^EIvd09%$*OoChAIXG5lr#0x-|t0L(L-4CZw{664fT$j#5sD@v>csR03y K%;s*!X@&rtxEK)t diff --git a/houdini/otls/Vop::DW_MOONRAY::RemapMap::1.hda b/houdini/otls/Vop::DW_MOONRAY::RemapMap::1.hda index 3747662a1b0b34d12d321c2550c13a3deab6a2da..1d1d340549eaa154257c6eb8d35b9879676dc180 100644 GIT binary patch delta 79 zcmewp*A_oPgY{OH^cT*Fx{{o?7=QrG@mB|N^mM_T`t1tBS_;02C8l=`WlUbtO69F#rLWPm7xVE_U!$6p7;5#9^tw44^>)KbXJ&(AALtOO|m0g%k* Ie8vO90AKbOO8@`> diff --git a/houdini/otls/Vop::DW_MOONRAY::RgbToHsvDisplayFilter::1.hda b/houdini/otls/Vop::DW_MOONRAY::RgbToHsvDisplayFilter::1.hda index e565777cf5931c4652bab9233eeb0df8f62856db..00525c58982cb3e6fdf918577ba5c3f33d7d9b6c 100644 GIT binary patch delta 79 zcmeyP-)1mDgHZx{{pi3_t+p_?v(@Vwqr0&pR@~ diff --git a/houdini/otls/Vop::DW_MOONRAY::RgbToHsvMap::1.hda b/houdini/otls/Vop::DW_MOONRAY::RgbToHsvMap::1.hda index 9d9043e9d26c23131f972d9effaaf7db23134940..cd71fd2a8cfdfcaab08a340a23922b6caf19a39a 100644 GIT binary patch delta 79 zcmZor>r$Jb!TKyq`U~eoT}jSo3_t+p_-lbUf{VbMro#%tS_;02C8Zx{{oC7=QrG@z(-z1Q&rhO^3xewG?vm^Ye-lD?v&?03@?H Im2s&c06%aRkpKVy diff --git a/houdini/otls/Vop::DW_MOONRAY::RgbToLabMap::1.hda b/houdini/otls/Vop::DW_MOONRAY::RgbToLabMap::1.hda index 618a8bfd268e6655a64d6a70f9a5d14281fb56c4..146f8a7b8033d7fd88d63c8b7ee8058797699290 100644 GIT binary patch delta 79 zcmZ3Wwn}Y+2J5pd=`WlUbtO5UF#rLWPm9nVE_U!$6pJ?5j+IuG#wV>)KbXJ&(AALtOO|m0g%k* IRK}x%097y-5dZ)H diff --git a/houdini/otls/Vop::DW_MOONRAY::RgbToNormalMap::1.hda b/houdini/otls/Vop::DW_MOONRAY::RgbToNormalMap::1.hda index b36e5864ea1d8ef271f3bb6413efa607f39c4963..af13f244f1d4346348f33ff75a1d5c209425b29c 100644 GIT binary patch delta 79 zcmX@8c3N$M2J8DQ=`WlUbtO69GXMdY;B3K?1e delta 69 zcmX@Dc2I4C2J6$zoe#Jt>Pm7xWdH&&$6pu35xfrOw4M>;)KbXJ&(AALtOO|m0g%k* ILdIKy0CD3Nw*UYD diff --git a/houdini/otls/Vop::DW_MOONRAY::ShadowDisplayFilter::1.hda b/houdini/otls/Vop::DW_MOONRAY::ShadowDisplayFilter::1.hda index 26c6c92d8b1192797ee124a36db7c22866d93022..9da625f84ba24ed41328eefe3f34deff82719125 100644 GIT binary patch delta 82 zcmZqG?bn^4&c?`@CH;kSqOJrNBPRn8fO-CgV4lbyFt6*Gg0Pl?Z(>PmQD$OJghFn9 UeqK>xB}g?0fYfYmWBe}y0D|Qf)Bpeg delta 72 zcmeCzZPlHi&c^URbLRu@iMkS84F4H`0L=3@1oK4xfO%cd#5lDSa`W@^iV`b9YCr%a Kvv~sJe-QwJu^27@ diff --git a/houdini/otls/Vop::DW_MOONRAY::SwitchColorMap::1.hda b/houdini/otls/Vop::DW_MOONRAY::SwitchColorMap::1.hda index 5dc098ed577fde17d07bae33660912268bbcce66..a4ac66a5db9079a7a680f823c8d3786eba50ee47 100644 GIT binary patch delta 81 zcmaF7n(^&w#t9m%pR%OCa8A^fMSCm)@QUU@X Knaw4Pl_3Dkm>Ajs diff --git a/houdini/otls/Vop::DW_MOONRAY::SwitchDisplacement::1.hda b/houdini/otls/Vop::DW_MOONRAY::SwitchDisplacement::1.hda index 842dbf8f422c6ca6633d68b18efe4399be098cd3..eca3e836edf42d051d61f2d4f099346cecd0f61f 100644 GIT binary patch delta 84 zcmbRCigCd!#tG_dj2v0gUpOb~N^mi9FaQCV=WhV!759UAolg~nwG@04OHzw66LTUI Wa`W@^iV`b9szCsxW^)VUq+$RC8yHRi delta 74 zcmZ4RigDU2#tG_d4F58BKH#3HE5XI^j{yk4Jbwc)uecw~>wGH4silycpPyHhSP4=C M0w9^qeT2IjP$R}j`x@J%d9Ey_&HiBQPR U&(AALtOO|r0g#%_S&Wsw0E#;rQvd(} delta 71 zcmaDmm+|pj#t9m%FEV#N;GU=}$@zi-2*4bFT@c5&49sagFUF~*kei>MSCm)@QUU@X Knaw4PmA(MP5E!rk diff --git a/houdini/otls/Vop::DW_MOONRAY::SwitchMaterial::1.hda b/houdini/otls/Vop::DW_MOONRAY::SwitchMaterial::1.hda index c285cf17aea24d917ed9a5a160d14530be552264..b07b8d8fc064192729c7f670ff8617efae78bf06 100644 GIT binary patch delta 81 zcmca}oAKFg#t9m%pR=UDa8A^fMSCm)@QUU@X Kna!n)g*gD_ml;t2 diff --git a/houdini/otls/Vop::DW_MOONRAY::SwitchNormalMap::1.hda b/houdini/otls/Vop::DW_MOONRAY::SwitchNormalMap::1.hda index ddedab1e6894c1a9af4e5e959445509ca07ff5e4..4ba050b8eb8d5bda8673d454612b0422b85b5239 100644 GIT binary patch delta 81 zcmdnBp7F?f#t9m%pR=UDa8A^f4d%36P!QHq@J%d9Ey_&HiBQPR U&(AALtOO|r0g#%_IgEZ`0Cut&=>Px# delta 71 zcmX@Io^jWD#t9m%FEe*O;F+i^$@!822*4bFJrF0%8_a3DAjYYskei>MSCm)@QUU@X KnayR4eqjK!_!vq6 diff --git a/houdini/otls/Vop::DW_MOONRAY::TangentSpaceDisplayFilter::1.hda b/houdini/otls/Vop::DW_MOONRAY::TangentSpaceDisplayFilter::1.hda index 60a502654a748034bf433a5ced3459268fc01028..514c04de22ac4a1319db0828e034bf1cb4fc0896 100644 GIT binary patch delta 79 zcmaE8`r34Y2CHJ0^cT*Fx{{oV3_t+p_*;NDl2%~OgntUcS_;02C80SiMkS8jEoFG0OtAYgL(4H!Mu)p3c^|nzKJENMVW~?5em8a U`FTZ&l_1q108+ELhH;fV0FMn8egFUf delta 72 zcmdnsw9ILOIvd0H%$*N-ChAIXF??qL0x-{CAIy_q4(4^-6XVoU$j#5sD@v>csR03y K%;q-6Rq_CjeHYvS diff --git a/houdini/otls/Vop::DW_MOONRAY::ToonMap::1.hda b/houdini/otls/Vop::DW_MOONRAY::ToonMap::1.hda index 7e77d6031700f223e16a1a37fcf01216ffd41599..bf6303c6750fe5e9980a3ef1395117be4218007c 100644 GIT binary patch delta 79 zcmca?b=PWw2J5vf=`WlUbtO5kF#rLW0?mKTly delta 69 zcmca>b=hiy2J4y3oey{>>Pm8+VE_U!$6pP^k>Lb$>NbmUYANLA=jRnAR)Um(07zzY IAR~_q096(h?*IS* diff --git a/houdini/otls/Vop::DW_MOONRAY::TransformNormalMap::1.hda b/houdini/otls/Vop::DW_MOONRAY::TransformNormalMap::1.hda index c015823291ea97f238e0f6450e32f4c5b98b27e9..5b1bdde2ea901ef0cd9457e9fae726fe1e2ccfe8 100644 GIT binary patch delta 82 zcmeyY`&V~@IvXQXmh>0SiMkS8j7$tb0Ot7{fO(=tU|#2a1z{}(-^7yCqRhmc2!-7I U{Jf&XN|0(00IAtr$5<)~0H_}pcmMzZ delta 72 zcmeyX`&oB_Ivc}}%$*N-ChAIXG5lZv0x-|t0L&9D0`ofWi*afx(y-b0s6A8UR@@8E60i delta 69 zcmZqi|K&G9gY`@1&IddbbtO5!FaQCV<8J`ssQv?UI&O<`YANLA=jRnAR)Um(07zzY IGb5uK0G1aQ$p8QV diff --git a/houdini/otls/Vop::DW_MOONRAY::TwoSidedMap::1.hda b/houdini/otls/Vop::DW_MOONRAY::TwoSidedMap::1.hda index 489a9fea91d8d3817e3cb39da404314de9450e7e..a10ddd042fda40a740efa0abba1a49c43456cd23 100644 GIT binary patch delta 79 zcmaE-_(O4m2J5pd=`WlUbtO5UF#rLW>Pm9nVE_U!$6pJ?;hzBJG#wV>)KbXJ&(AALtOO|m0g%k* IRL05t0Ci*+LjV8( diff --git a/houdini/otls/Vop::DW_MOONRAY::UVTransformMap::1.hda b/houdini/otls/Vop::DW_MOONRAY::UVTransformMap::1.hda index 11b487e9a225c7643e73544ba1d12f6ae05d8d64..26cb604c84647e4ba0721eda5bb80513456cab64 100644 GIT binary patch delta 79 zcmca&de3x%2J5FR=`WlUbtO4JF#rLW+blwG@04OHzw66LTUIa`W@^ SiV`b9ia`LRW^)!}mLvc$&=}nS delta 69 zcmca-dc|~t2J4H=oey{>>Pm9HU;qLz$6pu3kxU13TF;AdYANLA=jRnAR)Um(07zzY I31gNd0Cy%AJ^%m! diff --git a/houdini/otls/Vop::DW_MOONRAY::VectorDisplacement::1.hda b/houdini/otls/Vop::DW_MOONRAY::VectorDisplacement::1.hda index ad715f03ec896801906b19b3bb0fdcfbcce8b893..1789b0667839290c7abc0d9219699ee3ea8b46ed 100644 GIT binary patch delta 82 zcmca$ddqZzIvXQLmh>0SiMkS8j2sL=0Ot7{fO(RhU|#1_1z{}(-^7yCqRhmc2!-7I U{Jf&XN|0(00IAvB!ssIj0F`qV761SM delta 72 zcmca*dckypIvc~k%$*N-ChAIXG5liy0x-|t0L+v01oJwdig9WwO%oz0m delta 69 zcmeyQ{X%>Pm7xU;qLz$6p)75orZ;nvaWdYANLA=jRnAR)Um(07zzY I7GsA90C~t4RsaA1 diff --git a/houdini/python3.11libs/moonray_vopmask_check.py b/houdini/python3.11libs/moonray_vopmask_check.py new file mode 100644 index 0000000..4b8f6ff --- /dev/null +++ b/houdini/python3.11libs/moonray_vopmask_check.py @@ -0,0 +1,61 @@ +# Copyright 2026 DreamWorks Animation LLC +# SPDX-License-Identifier: Apache-2.0 + +"""Validate MoonRay VOP network masks in Houdini. + +Run with Houdini's hython after sourcing the OpenMoonRay Houdini setup: + + hython moonray_vopmask_check.py + +The script is intentionally read-only. It verifies that DW_MOONRAY VOP +definitions include the MaterialX token in their vopnetMask/extraInfo so the +installed definitions are usable inside MaterialX VOP contexts without a +post-install HOM patch. +""" + +from __future__ import print_function + +import sys + +import hou + + +TOKEN = "MaterialX" +TYPE_MARKER = "DW_MOONRAY" + + +def main(): + category = hou.vopNodeTypeCategory() + missing = [] + checked = 0 + + for type_name, node_type in sorted(category.nodeTypes().items()): + if TYPE_MARKER not in type_name: + continue + + checked += 1 + definition = node_type.definition() + extra_info = definition.extraInfo() if definition else "" + mask = node_type.vopnetMask() + + if TOKEN not in mask and TOKEN not in extra_info: + missing.append((type_name, mask, extra_info, + definition.libraryFilePath() if definition else "")) + + print("DW_MOONRAY VOP definitions checked:", checked) + print("Definitions missing MaterialX:", len(missing)) + + for type_name, mask, extra_info, path in missing[:80]: + print("MISSING:", type_name, + "mask={!r}".format(mask), + "extraInfo={!r}".format(extra_info), + "path={}".format(path)) + + if len(missing) > 80: + print("... and {} more".format(len(missing) - 80)) + + return 1 if missing else 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/houdini/python3.11libs/moonray_vopmask_materialx_patch.py b/houdini/python3.11libs/moonray_vopmask_materialx_patch.py new file mode 100644 index 0000000..2e44683 --- /dev/null +++ b/houdini/python3.11libs/moonray_vopmask_materialx_patch.py @@ -0,0 +1,93 @@ +# Copyright 2026 DreamWorks Animation LLC +# SPDX-License-Identifier: Apache-2.0 + +"""Add MaterialX to source DW_MOONRAY VOP HDA masks. + +This is a source-definition maintenance helper. Run it with Houdini's hython +against the source otls directory before install-time packaging if regenerated +HDAs lose the MaterialX VOP context token: + + hython moonray_vopmask_materialx_patch.py /path/to/houdini/otls + +It updates the HDA files in-place so installed definitions do not need a manual +post-install HOM patch. +""" + +from __future__ import print_function + +import os +import sys + +import hou + + +TOKEN = "MaterialX" +TYPE_MARKER = "DW_MOONRAY" + + +def _with_materialx(extra_info): + parts = extra_info.split() + if TOKEN in parts: + return extra_info + if not parts: + return extra_info + if parts[0] == "*": + parts.insert(1, TOKEN) + elif "moonray" in parts: + parts.insert(parts.index("moonray"), TOKEN) + else: + parts.append(TOKEN) + return " ".join(parts) + + +def main(argv): + if len(argv) != 2: + print("Usage: hython {} /path/to/houdini/otls".format(argv[0])) + return 2 + + otls_dir = argv[1] + if not os.path.isdir(otls_dir): + print("Not a directory:", otls_dir) + return 2 + + changed = [] + skipped = [] + + for filename in sorted(os.listdir(otls_dir)): + if TYPE_MARKER not in filename or not filename.endswith((".hda", ".otl")): + continue + + hda_path = os.path.join(otls_dir, filename) + hou.hda.installFile(hda_path) + definitions = hou.hda.definitionsInFile(hda_path) + + for definition in definitions: + node_type = definition.nodeType() + type_name = node_type.nameWithCategory() + if TYPE_MARKER not in type_name: + continue + + old_info = definition.extraInfo() + new_info = _with_materialx(old_info) + if new_info == old_info: + skipped.append(type_name) + continue + + definition.setExtraInfo(new_info) + definition.save(hda_path, create_backup=False) + changed.append((type_name, old_info, new_info, hda_path)) + + print("Changed:", len(changed)) + print("Skipped:", len(skipped)) + for type_name, old_info, new_info, hda_path in changed[:80]: + print("CHANGED:", type_name, + repr(old_info), "->", repr(new_info), + hda_path) + if len(changed) > 80: + print("... and {} more".format(len(changed) - 80)) + + return 0 + + +if __name__ == "__main__": + sys.exit(main(sys.argv)) From 12bc2f47674add073e7b8130deaedbbc485917ed Mon Sep 17 00:00:00 2001 From: Jakub Svoboda <132791205+rolledhand@users.noreply.github.com> Date: Sun, 31 May 2026 11:03:22 +0200 Subject: [PATCH 03/29] python3.9libs-back Signed-off-by: Jakub Svoboda <132791205+rolledhand@users.noreply.github.com> --- houdini/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/houdini/CMakeLists.txt b/houdini/CMakeLists.txt index 8a7fef9..50f85f7 100644 --- a/houdini/CMakeLists.txt +++ b/houdini/CMakeLists.txt @@ -15,6 +15,7 @@ install(DIRECTORY otls soho python2.7libs + python3.9libs python3.11libs DESTINATION plugin/houdini From 9cfd73fc0ca02d0d89335d64be4c714200b2861b Mon Sep 17 00:00:00 2001 From: Jakub Svoboda <132791205+rolledhand@users.noreply.github.com> Date: Sun, 31 May 2026 11:30:58 +0200 Subject: [PATCH 04/29] domelight-support-addition Signed-off-by: Jakub Svoboda <132791205+rolledhand@users.noreply.github.com> --- .../HdMoonrayRendererPlugin_Light.ds | 148 +++++++++--------- houdini/soho/parameters/moonray_Light.ds | 144 ++++++++--------- 2 files changed, 146 insertions(+), 146 deletions(-) diff --git a/houdini/soho/parameters/HdMoonrayRendererPlugin_Light.ds b/houdini/soho/parameters/HdMoonrayRendererPlugin_Light.ds index f1582e1..d38bfb3 100644 --- a/houdini/soho/parameters/HdMoonrayRendererPlugin_Light.ds +++ b/houdini/soho/parameters/HdMoonrayRendererPlugin_Light.ds @@ -21,21 +21,21 @@ label "class" type string invisible - default { [ "\n parm = hou.parm(\"lighttype\")\n if parm:\n value = parm.eval()\n label = parm.menuLabels()[value]\n if label == \"Geometry\":\n label = \"Mesh\"\n elif label == \"Rectangle\":\n label = \"Rect\"\n return label + \"Light\"\n else:\n parm = hou.parm(\"primtype\")\n value = parm.eval()\n if value == \"UsdLuxDomeLight\":\n return \"EnvLight\"\n " python ] } + default { [ "\n parm = hou.parm(\"lighttype\")\n if parm:\n value = parm.eval()\n label = parm.menuLabels()[value]\n if label == \"Geometry\":\n label = \"Mesh\"\n elif label == \"Rectangle\":\n label = \"Rect\"\n return label + \"Light\"\n else:\n parm = hou.parm(\"primtype\")\n value = parm.eval()\n if value in (\"UsdLuxDomeLight\", \"UsdLuxDomeLight_1\", \"DomeLight_1\"):\n return \"EnvLight\"\n " python ] } disablewhen "{ xn__moonrayclass_control_o8a == block } { xn__moonrayclass_control_o8a == none }" parmtag { "usdvaluetype" "token" } } group { name "folder" label "Properties" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" parm { name "xn__moonrayon_control_s3a" label "moonray:on" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "![BUTTONS_set_or_create]Set or Create" "setexisting" "![BUTTONS_set_if_exists]Set if Exists" @@ -51,7 +51,7 @@ default { "1" } help "Whether the light is switched on." disablewhen "{ xn__moonrayon_control_s3a == block } { xn__moonrayon_control_s3a == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" parmtag { "usdvaluetype" "bool" } } parm { @@ -59,7 +59,7 @@ label "moonray:mb" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "![BUTTONS_set_or_create]Set or Create" "setexisting" "![BUTTONS_set_if_exists]Set if Exists" @@ -75,7 +75,7 @@ default { "0" } help "Whether motion-blur is active for this light. When set to true, the scene's illumination will correctly account for any blur() applied to the light's transformation matrix." disablewhen "{ xn__moonraymb_control_s3a == block } { xn__moonraymb_control_s3a == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" parmtag { "usdvaluetype" "bool" } } parm { @@ -83,7 +83,7 @@ label "moonray:visible_in_camera" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "![BUTTONS_set_or_create]Set or Create" "setexisting" "![BUTTONS_set_if_exists]Set if Exists" @@ -101,7 +101,7 @@ default { "use default" } help "Whether the light is directly visible in the scene's active camera. When set to \"use default\" it reads from the value of SceneVariable lights_visible_in_camera." disablewhen "{ xn__moonrayvisible_in_camera_control_7sb == block } { xn__moonrayvisible_in_camera_control_7sb == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menu { "force off" "Force Off" "force on" "Force On" @@ -114,7 +114,7 @@ label "moonray:max_shadow_distance" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "![BUTTONS_set_or_create]Set or Create" "setexisting" "![BUTTONS_set_if_exists]Set if Exists" @@ -132,7 +132,7 @@ default { "0" } help "The distance from the light beyond which a light-receiving surface will no longer receive shadows cast from that light.\nNote that the distance is thresholded for each occlusion ray cast for this light, it is possible for a receiving point to lie at an intermediate distance such that some parts of the light are closer than the threshold distance and other parts beyond it, in which case the point will appearto be in partial shadow." disablewhen "{ xn__moonraymax_shadow_distance_control_hwb == block } { xn__moonraymax_shadow_distance_control_hwb == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" range { 0 10 } parmtag { "usdvaluetype" "float" } } @@ -141,7 +141,7 @@ label "moonray:min_shadow_distance" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "![BUTTONS_set_or_create]Set or Create" "setexisting" "![BUTTONS_set_if_exists]Set if Exists" @@ -159,7 +159,7 @@ default { "0" } help "The distance from the light before which a light-receiving surface will no longer receive shadows cast from that light.\nNote that the distance is thresholded for each occlusion ray cast for this light, it is possible for a receiving point to lie at an intermediate distance such that some parts of the light are closer than the threshold distance and other parts beyond it, in which case the point will appearto be in partial shadow." disablewhen "{ xn__moonraymin_shadow_distance_control_hwb == block } { xn__moonraymin_shadow_distance_control_hwb == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" range { 0 10 } parmtag { "usdvaluetype" "float" } } @@ -168,7 +168,7 @@ label "moonray:presence_shadows" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "![BUTTONS_set_or_create]Set or Create" "setexisting" "![BUTTONS_set_if_exists]Set if Exists" @@ -186,7 +186,7 @@ default { "use default" } help "Switch this attribute on for shadows cast from this light to correctly respect presence values. When off, surfaces with a material with presence less than 1.0 will cast opaque shadows from this light. This is an optimization - when the attribute is off, occlusion rays (fast) are used for testing for shadows. When it is on, regular rays (slower) are used, and the material's presence is evaluated to determine how much shadowing should occur. When set to \"use default\" it reads from the value of SceneVariable enable_presence_shadows." disablewhen "{ xn__moonraypresence_shadows_control_lrb == block } { xn__moonraypresence_shadows_control_lrb == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menu { "force off" "Force Off" "force on" "Force On" @@ -199,7 +199,7 @@ label "moonray:ray_termination" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "![BUTTONS_set_or_create]Set or Create" "setexisting" "![BUTTONS_set_if_exists]Set if Exists" @@ -215,7 +215,7 @@ default { "0" } help "Whether the light is used for ray termination color. Ray termination color is used for filling in falsely dark areas where ray paths have been terminated too early by the depth controls. Such a ray path immediately exits to any ray termination light(s) present in the light set being applied to the lobe, ignoring occlusion by scene geometry. Any light can either be a regular light or a ray termination light (but not both). Thus they can be freely assigned to light sets, which provides a mechanism for applying specific ray termination lights to specific materials, parts or objects. Ray termination color is only applied to non-hair transmission lobes." disablewhen "{ xn__moonrayray_termination_control_ypb == block } { xn__moonrayray_termination_control_ypb == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" parmtag { "usdvaluetype" "bool" } } parm { @@ -223,7 +223,7 @@ label "moonray:texture_filter" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "![BUTTONS_set_or_create]Set or Create" "setexisting" "![BUTTONS_set_if_exists]Set if Exists" @@ -241,7 +241,7 @@ default { "nearest neighbor" } help "The filtering mode to apply to the texture. Nearest neighbor is the cheapest filtering mode but produces a blocky result. Switch linear filtering on for a smoother result. Additionally, mip-mapping can be switched on with either nearest neighbor or linear filtering." disablewhen "{ xn__moonraytexture_filter_control_cob == block } { xn__moonraytexture_filter_control_cob == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menu { "nearest neighbor" "Nearest Neighbor" "bilinear" "Bilinear" @@ -255,7 +255,7 @@ label "moonray:label" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "![BUTTONS_set_or_create]Set or Create" "setexisting" "![BUTTONS_set_if_exists]Set if Exists" @@ -271,7 +271,7 @@ default { "" } help "Label used in light aov expressions." disablewhen "{ xn__moonraylabel_control_o8a == block } { xn__moonraylabel_control_o8a == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" parmtag { "usdvaluetype" "string" } } parm { @@ -519,7 +519,7 @@ label "moonray:color" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "![BUTTONS_set_or_create]Set or Create" "setexisting" "![BUTTONS_set_if_exists]Set if Exists" @@ -538,7 +538,7 @@ default { "1" "1" "1" } help "The light's RGB values.\nThese are combined multiplicatively with the intensity and other attributes in determining the light's 3-channel radiance." disablewhen "{ xn__moonraycolor_control_o8a == block } { xn__moonraycolor_control_o8a == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" range { 0 10 } parmtag { "usdvaluetype" "color3f" } } @@ -547,7 +547,7 @@ label "moonray:intensity" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "![BUTTONS_set_or_create]Set or Create" "setexisting" "![BUTTONS_set_if_exists]Set if Exists" @@ -565,7 +565,7 @@ default { "1" } help "The light's intensity.\nThis is combined multiplicatively with the color and other attributes in determining the light's 3-channel radiance." disablewhen "{ xn__moonrayintensity_control_6fb == block } { xn__moonrayintensity_control_6fb == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" range { 0 10 } parmtag { "usdvaluetype" "float" } } @@ -574,7 +574,7 @@ label "moonray:exposure" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "![BUTTONS_set_or_create]Set or Create" "setexisting" "![BUTTONS_set_if_exists]Set if Exists" @@ -592,7 +592,7 @@ default { "0" } help "The light's exposure value.\nThis value provides an alternative to the intensity value as a mechanism for controlling the light's overall brightness, and is inspired by the corresponding photographic term but is generalised to apply independently to each light. To calculate its effect, pow(2, exposure) is combined multiplicatively with the color and other attributes in determining the light's 3-channel radiance." disablewhen "{ xn__moonrayexposure_control_keb == block } { xn__moonrayexposure_control_keb == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" range { 0 10 } parmtag { "usdvaluetype" "float" } } @@ -680,14 +680,14 @@ group { name "folder2" label "Map" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" parm { name "xn__moonraytexture_control_xcb" label "moonray:texture" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "![BUTTONS_set_or_create]Set or Create" "setexisting" "![BUTTONS_set_if_exists]Set if Exists" @@ -703,7 +703,7 @@ default { "" } help "File name of the texture applied to the light. If set to the empty string, no texture is applied. Any file format supported by OpenImageIO can be used. The texture is used in 2 ways - for looking up the texture value at the intersection point when a ray hits the light, and for building a lookup-table-based auxilliary data structure used for distributing light samples over the texture." disablewhen "{ xn__moonraytexture_control_xcb == block } { xn__moonraytexture_control_xcb == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" parmtag { "usdvaluetype" "asset" } } parm { @@ -711,7 +711,7 @@ label "moonray:saturation" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "![BUTTONS_set_or_create]Set or Create" "setexisting" "![BUTTONS_set_if_exists]Set if Exists" @@ -730,7 +730,7 @@ default { "1" "1" "1" } help "Per-channel saturation used in color-correcting the light's texture, if one is present. This is achieved by applying the following formula for each channel:\n output = lerp(luminance(inputRGB), input, saturation)." disablewhen "{ xn__moonraysaturation_control_thb == block } { xn__moonraysaturation_control_thb == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" range { 0 10 } parmtag { "usdvaluetype" "color3f" } } @@ -739,7 +739,7 @@ label "moonray:contrast" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "![BUTTONS_set_or_create]Set or Create" "setexisting" "![BUTTONS_set_if_exists]Set if Exists" @@ -758,7 +758,7 @@ default { "1" "1" "1" } help "Per-channel contrast used in color-correcting the light's texture, if one is present. The operation mimics Nuke's ColorCorrect node's contrast function:\n For input > 0, output = 0.18 * pow(inputCompnent/0.18, contrast).\n For input <= 0, output = 0.18 * input * pow(1/0.18, contrast)." disablewhen "{ xn__moonraycontrast_control_keb == block } { xn__moonraycontrast_control_keb == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" range { 0 10 } parmtag { "usdvaluetype" "color3f" } } @@ -767,7 +767,7 @@ label "moonray:gamma" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "![BUTTONS_set_or_create]Set or Create" "setexisting" "![BUTTONS_set_if_exists]Set if Exists" @@ -786,7 +786,7 @@ default { "1" "1" "1" } help "Per-channel gamma used in color-correcting the light's texture, if one is present. This is achieved by applying the following formula for each channel:\n For input > 0, output = pow(input, gamma)\n For input <= 0, output = input" disablewhen "{ xn__moonraygamma_control_o8a == block } { xn__moonraygamma_control_o8a == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" range { 0 10 } parmtag { "usdvaluetype" "color3f" } } @@ -795,7 +795,7 @@ label "moonray:gain" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "![BUTTONS_set_or_create]Set or Create" "setexisting" "![BUTTONS_set_if_exists]Set if Exists" @@ -814,7 +814,7 @@ default { "1" "1" "1" } help "Per-channel gain used in tandem with a per-channel offset for color-correcting the light's texture, if one is present. This is achieved by applying the following formula for each channel:\n output = input * gain + offset" disablewhen "{ xn__moonraygain_control_16a == block } { xn__moonraygain_control_16a == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" range { 0 10 } parmtag { "usdvaluetype" "color3f" } } @@ -823,7 +823,7 @@ label "moonray:offset" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "![BUTTONS_set_or_create]Set or Create" "setexisting" "![BUTTONS_set_if_exists]Set if Exists" @@ -842,7 +842,7 @@ default { "0" "0" "0" } help "Per-channel offset used in tandem with a per-channel gain for color-correcting the light's texture, if one is present. This is achieved by applying the following formula for each channel:\n output = input * gain + offset" disablewhen "{ xn__moonrayoffset_control_bbb == block } { xn__moonrayoffset_control_bbb == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" range { 0 10 } parmtag { "usdvaluetype" "color3f" } } @@ -851,7 +851,7 @@ label "moonray:temperature" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "![BUTTONS_set_or_create]Set or Create" "setexisting" "![BUTTONS_set_if_exists]Set if Exists" @@ -870,7 +870,7 @@ default { "0" "0" "0" } help "Color temperature using Nuke-style T/M/I settings (T = temperature, M = magenta/green, I = intensity). This is achieved as follows:\nThe 3-channel temperature is interpreted as the vector (T,M,I). The followiong scale values are then applied to the RGB components:\n outputR = inputR * (pow(2,I) + M/3 - T/2)\n outputG = inputG * (pow(2,I) - 2*M/3\n outputB = inputB * (pow(2,I) + M/3 + T/2)" disablewhen "{ xn__moonraytemperature_control_gjb == block } { xn__moonraytemperature_control_gjb == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" range { 0 10 } parmtag { "usdvaluetype" "vector3f" } } @@ -879,7 +879,7 @@ label "moonray:texture_rotation" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "![BUTTONS_set_or_create]Set or Create" "setexisting" "![BUTTONS_set_if_exists]Set if Exists" @@ -897,7 +897,7 @@ default { "0" } help "Clockwise rotation angle in degrees." disablewhen "{ xn__moonraytexture_rotation_control_lrb == block } { xn__moonraytexture_rotation_control_lrb == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" range { 0 10 } parmtag { "usdvaluetype" "float" } } @@ -906,7 +906,7 @@ label "moonray:texture_translation" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "![BUTTONS_set_or_create]Set or Create" "setexisting" "![BUTTONS_set_if_exists]Set if Exists" @@ -925,7 +925,7 @@ default { "0" "0" } help "Translation of the texture in (u,v)-space, in units of the texture size. For example, a translation of (0.25, 0.5) will translate the texture one-quarter of its width in the u-direction and one-half of its height in the v-direction." disablewhen "{ xn__moonraytexture_translation_control_hwb == block } { xn__moonraytexture_translation_control_hwb == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" range { 0 10 } parmtag { "usdvaluetype" "float2" } } @@ -934,7 +934,7 @@ label "moonray:texture_coverage" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "![BUTTONS_set_or_create]Set or Create" "setexisting" "![BUTTONS_set_if_exists]Set if Exists" @@ -953,7 +953,7 @@ default { "1" "1" } help "Texture scales in the u and v-directions." disablewhen "{ xn__moonraytexture_coverage_control_lrb == block } { xn__moonraytexture_coverage_control_lrb == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" range { 0 10 } parmtag { "usdvaluetype" "float2" } } @@ -962,7 +962,7 @@ label "moonray:texture_reps_u" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "![BUTTONS_set_or_create]Set or Create" "setexisting" "![BUTTONS_set_if_exists]Set if Exists" @@ -980,7 +980,7 @@ default { "1" } help "Number of times texture repeats in u over the scaled texture space." disablewhen "{ xn__moonraytexture_reps_u_control_cob == block } { xn__moonraytexture_reps_u_control_cob == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" range { 0 10 } parmtag { "usdvaluetype" "float" } } @@ -989,7 +989,7 @@ label "moonray:texture_reps_v" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "![BUTTONS_set_or_create]Set or Create" "setexisting" "![BUTTONS_set_if_exists]Set if Exists" @@ -1007,7 +1007,7 @@ default { "1" } help "Number of times texture repeats in v over the scaled texture space." disablewhen "{ xn__moonraytexture_reps_v_control_cob == block } { xn__moonraytexture_reps_v_control_cob == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" range { 0 10 } parmtag { "usdvaluetype" "float" } } @@ -1016,7 +1016,7 @@ label "moonray:texture_mirror_u" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "![BUTTONS_set_or_create]Set or Create" "setexisting" "![BUTTONS_set_if_exists]Set if Exists" @@ -1032,7 +1032,7 @@ default { "0" } help "Whether to mirror the texture in the u-direction. If set to false, the texture is repeated in the u-direction." disablewhen "{ xn__moonraytexture_mirror_u_control_lrb == block } { xn__moonraytexture_mirror_u_control_lrb == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" parmtag { "usdvaluetype" "bool" } } parm { @@ -1040,7 +1040,7 @@ label "moonray:texture_mirror_v" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "![BUTTONS_set_or_create]Set or Create" "setexisting" "![BUTTONS_set_if_exists]Set if Exists" @@ -1056,7 +1056,7 @@ default { "0" } help "Whether to mirror the texture in the v-direction. If set to false, the texture is repeated in the v-direction." disablewhen "{ xn__moonraytexture_mirror_v_control_lrb == block } { xn__moonraytexture_mirror_v_control_lrb == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" parmtag { "usdvaluetype" "bool" } } parm { @@ -1064,7 +1064,7 @@ label "moonray:texture_border_color" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "![BUTTONS_set_or_create]Set or Create" "setexisting" "![BUTTONS_set_if_exists]Set if Exists" @@ -1083,7 +1083,7 @@ default { "1" "1" "1" } help "RGB value used when a texture lookup occurs outside the texture." disablewhen "{ xn__moonraytexture_border_color_control_3xb == block } { xn__moonraytexture_border_color_control_3xb == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" range { 0 10 } parmtag { "usdvaluetype" "color3f" } } @@ -1092,7 +1092,7 @@ label "moonray:sample_upper_hemisphere_only" type string default { "none" } - hidewhen "{ primtype != UsdLuxDomeLight createprims == on }" + hidewhen "{ primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 createprims == on }" menujoin { "set" "![BUTTONS_set_or_create]Set or Create" "setexisting" "![BUTTONS_set_if_exists]Set if Exists" @@ -1108,7 +1108,7 @@ default { "0" } help "Set this to true if you want the EnvLight to illuminate from only the \"upper\" hemisphere, defined as the hemisphere centered around the light's positive local z-axis direction." disablewhen "{ xn__moonraysample_upper_hemisphere_only_control_4bc == block } { xn__moonraysample_upper_hemisphere_only_control_4bc == none }" - hidewhen "{ primtype != UsdLuxDomeLight createprims == on }" + hidewhen "{ primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 createprims == on }" parmtag { "usdvaluetype" "bool" } } } @@ -1116,14 +1116,14 @@ group { name "folder3" label "Visibility Flags" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" parm { name "xn__moonrayvisible_diffuse_reflection_control_v7b" label "moonray:visible_diffuse_reflection" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "![BUTTONS_set_or_create]Set or Create" "setexisting" "![BUTTONS_set_if_exists]Set if Exists" @@ -1139,7 +1139,7 @@ default { "1" } help "Whether the light is visible in diffuse reflection." disablewhen "{ xn__moonrayvisible_diffuse_reflection_control_v7b == block } { xn__moonrayvisible_diffuse_reflection_control_v7b == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" parmtag { "usdvaluetype" "bool" } } parm { @@ -1147,7 +1147,7 @@ label "moonray:visible_diffuse_transmission" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "![BUTTONS_set_or_create]Set or Create" "setexisting" "![BUTTONS_set_if_exists]Set if Exists" @@ -1163,7 +1163,7 @@ default { "1" } help "Whether the light is visible in diffuse transmission." disablewhen "{ xn__moonrayvisible_diffuse_transmission_control_4bc == block } { xn__moonrayvisible_diffuse_transmission_control_4bc == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" parmtag { "usdvaluetype" "bool" } } parm { @@ -1171,7 +1171,7 @@ label "moonray:visible_glossy_reflection" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "![BUTTONS_set_or_create]Set or Create" "setexisting" "![BUTTONS_set_if_exists]Set if Exists" @@ -1187,7 +1187,7 @@ default { "1" } help "Whether the light is visible in glossy reflection." disablewhen "{ xn__moonrayvisible_glossy_reflection_control_85b == block } { xn__moonrayvisible_glossy_reflection_control_85b == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" parmtag { "usdvaluetype" "bool" } } parm { @@ -1195,7 +1195,7 @@ label "moonray:visible_glossy_transmission" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "![BUTTONS_set_or_create]Set or Create" "setexisting" "![BUTTONS_set_if_exists]Set if Exists" @@ -1211,7 +1211,7 @@ default { "1" } help "Whether the light is visible in glossy transmission (refraction)." disablewhen "{ xn__moonrayvisible_glossy_transmission_control_i9b == block } { xn__moonrayvisible_glossy_transmission_control_i9b == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" parmtag { "usdvaluetype" "bool" } } parm { @@ -1219,7 +1219,7 @@ label "moonray:visible_mirror_reflection" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "![BUTTONS_set_or_create]Set or Create" "setexisting" "![BUTTONS_set_if_exists]Set if Exists" @@ -1235,7 +1235,7 @@ default { "1" } help "Whether the light is visible in miror reflection." disablewhen "{ xn__moonrayvisible_mirror_reflection_control_85b == block } { xn__moonrayvisible_mirror_reflection_control_85b == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" parmtag { "usdvaluetype" "bool" } } parm { @@ -1243,7 +1243,7 @@ label "moonray:visible_mirror_transmission" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "![BUTTONS_set_or_create]Set or Create" "setexisting" "![BUTTONS_set_if_exists]Set if Exists" @@ -1259,7 +1259,7 @@ default { "1" } help "Whether the light is visible in miror transmission (refraction)." disablewhen "{ xn__moonrayvisible_mirror_transmission_control_i9b == block } { xn__moonrayvisible_mirror_transmission_control_i9b == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" parmtag { "usdvaluetype" "bool" } } } @@ -1269,7 +1269,7 @@ label "moonray:light_filters" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "![BUTTONS_set_or_create]Set or Create" "setexisting" "![BUTTONS_set_if_exists]Set if Exists" @@ -1283,7 +1283,7 @@ label "Light Filters" default 0 disablewhen "{ xn__moonraylight_filters_control_pmb == block } { xn__moonraylight_filters_control_pmb == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" parmtag { "usdvaluetype" "" } parm { diff --git a/houdini/soho/parameters/moonray_Light.ds b/houdini/soho/parameters/moonray_Light.ds index 88fc327..302364c 100644 --- a/houdini/soho/parameters/moonray_Light.ds +++ b/houdini/soho/parameters/moonray_Light.ds @@ -20,21 +20,21 @@ label "class" type string invisible - default { [ "\n parm = hou.parm(\"lighttype\")\n if parm:\n value = parm.eval()\n label = parm.menuLabels()[value]\n if label == \"Geometry\":\n label = \"Mesh\"\n elif label == \"Rectangle\":\n label = \"Rect\"\n return label + \"Light\"\n else:\n parm = hou.parm(\"primtype\")\n value = parm.eval()\n if value == \"UsdLuxDomeLight\":\n return \"EnvLight\"\n " python ] } + default { [ "\n parm = hou.parm(\"lighttype\")\n if parm:\n value = parm.eval()\n label = parm.menuLabels()[value]\n if label == \"Geometry\":\n label = \"Mesh\"\n elif label == \"Rectangle\":\n label = \"Rect\"\n return label + \"Light\"\n else:\n parm = hou.parm(\"primtype\")\n value = parm.eval()\n if value in (\"UsdLuxDomeLight\", \"UsdLuxDomeLight_1\", \"DomeLight_1\"):\n return \"EnvLight\"\n " python ] } disablewhen "{ xn__moonrayclass_control_o8a == block } { xn__moonrayclass_control_o8a == none }" parmtag { "usdvaluetype" "token" } } group { name "folder" label "Properties" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" parm { name "xn__moonrayon_control_s3a" label "moonray:on" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "Set Or Create" "setexisting" "Set if Exists" @@ -49,7 +49,7 @@ default { "1" } help "Whether the light is switched on." disablewhen "{ xn__moonrayon_control_s3a == block } { xn__moonrayon_control_s3a == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" parmtag { "usdvaluetype" "bool" } } parm { @@ -57,7 +57,7 @@ label "moonray:mb" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "Set Or Create" "setexisting" "Set if Exists" @@ -72,7 +72,7 @@ default { "0" } help "Whether motion-blur is active for this light. When set to true, the scene's illumination will correctly account for any blur() applied to the light's transformation matrix." disablewhen "{ xn__moonraymb_control_s3a == block } { xn__moonraymb_control_s3a == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" parmtag { "usdvaluetype" "bool" } } parm { @@ -80,7 +80,7 @@ label "moonray:visible_in_camera" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "Set Or Create" "setexisting" "Set if Exists" @@ -95,7 +95,7 @@ default { "use default" } help "Whether the light is directly visible in the scene's active camera. When set to \"use default\" it reads from the value of SceneVariable lights_visible_in_camera." disablewhen "{ xn__moonrayvisible_in_camera_control_7sb == block } { xn__moonrayvisible_in_camera_control_7sb == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menu { "force off" "Force Off" "force on" "Force On" @@ -108,7 +108,7 @@ label "moonray:color" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "Set Or Create" "setexisting" "Set if Exists" @@ -124,7 +124,7 @@ default { "1" "1" "1" } help "The light's RGB values.\nThese are combined multiplicatively with the intensity and other attributes in determining the light's 3-channel radiance." disablewhen "{ xn__moonraycolor_control_o8a == block } { xn__moonraycolor_control_o8a == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" range { 0 10 } parmtag { "usdvaluetype" "color3f" } } @@ -133,7 +133,7 @@ label "moonray:intensity" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "Set Or Create" "setexisting" "Set if Exists" @@ -148,7 +148,7 @@ default { "1" } help "The light's intensity.\nThis is combined multiplicatively with the color and other attributes in determining the light's 3-channel radiance." disablewhen "{ xn__moonrayintensity_control_6fb == block } { xn__moonrayintensity_control_6fb == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" range { 0 10 } parmtag { "usdvaluetype" "float" } } @@ -157,7 +157,7 @@ label "moonray:exposure" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "Set Or Create" "setexisting" "Set if Exists" @@ -172,7 +172,7 @@ default { "0" } help "The light's exposure value.\nThis value provides an alternative to the intensity value as a mechanism for controlling the light's overall brightness, and is inspired by the corresponding photographic term but is generalised to apply independently to each light. To calculate its effect, pow(2, exposure) is combined multiplicatively with the color and other attributes in determining the light's 3-channel radiance." disablewhen "{ xn__moonrayexposure_control_keb == block } { xn__moonrayexposure_control_keb == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" range { 0 10 } parmtag { "usdvaluetype" "float" } } @@ -181,7 +181,7 @@ label "moonray:max_shadow_distance" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "Set Or Create" "setexisting" "Set if Exists" @@ -196,7 +196,7 @@ default { "0" } help "The distance from the light beyond which a light-receiving surface will no longer receive shadows cast from that light.\nNote that the distance is thresholded for each occlusion ray cast for this light, it is possible for a receiving point to lie at an intermediate distance such that some parts of the light are closer than the threshold distance and other parts beyond it, in which case the point will appearto be in partial shadow." disablewhen "{ xn__moonraymax_shadow_distance_control_hwb == block } { xn__moonraymax_shadow_distance_control_hwb == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" range { 0 10 } parmtag { "usdvaluetype" "float" } } @@ -205,7 +205,7 @@ label "moonray:presence_shadows" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "Set Or Create" "setexisting" "Set if Exists" @@ -220,7 +220,7 @@ default { "use default" } help "Switch this attribute on for shadows cast from this light to correctly respect presence values. When off, surfaces with a material with presence less than 1.0 will cast opaque shadows from this light. This is an optimization - when the attribute is off, occlusion rays (fast) are used for testing for shadows. When it is on, regular rays (slower) are used, and the material's presence is evaluated to determine how much shadowing should occur. When set to \"use default\" it reads from the value of SceneVariable enable_presence_shadows." disablewhen "{ xn__moonraypresence_shadows_control_lrb == block } { xn__moonraypresence_shadows_control_lrb == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menu { "force off" "Force Off" "force on" "Force On" @@ -233,7 +233,7 @@ label "moonray:ray_termination" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "Set Or Create" "setexisting" "Set if Exists" @@ -248,7 +248,7 @@ default { "0" } help "Whether the light is used for ray termination color. Ray termination color is used for filling in falsely dark areas where ray paths have been terminated too early by the depth controls. Such a ray path immediately exits to any ray termination light(s) present in the light set being applied to the lobe, ignoring occlusion by scene geometry. Any light can either be a regular light or a ray termination light (but not both). Thus they can be freely assigned to light sets, which provides a mechanism for applying specific ray termination lights to specific materials, parts or objects. Ray termination color is only applied to non-hair transmission lobes." disablewhen "{ xn__moonrayray_termination_control_ypb == block } { xn__moonrayray_termination_control_ypb == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" parmtag { "usdvaluetype" "bool" } } parm { @@ -256,7 +256,7 @@ label "moonray:texture_filter" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "Set Or Create" "setexisting" "Set if Exists" @@ -271,7 +271,7 @@ default { "nearest neighbor" } help "The filtering mode to apply to the texture. Nearest neighbor is the cheapest filtering mode but produces a blocky result. Switch linear filtering on for a smoother result. Additionally, mip-mapping can be switched on with either nearest neighbor or linear filtering." disablewhen "{ xn__moonraytexture_filter_control_cob == block } { xn__moonraytexture_filter_control_cob == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menu { "nearest neighbor" "Nearest Neighbor" "bilinear" "Bilinear" @@ -285,7 +285,7 @@ label "moonray:label" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "Set Or Create" "setexisting" "Set if Exists" @@ -300,7 +300,7 @@ default { "" } help "Label used in light aov expressions." disablewhen "{ xn__moonraylabel_control_o8a == block } { xn__moonraylabel_control_o8a == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" parmtag { "usdvaluetype" "string" } } parm { @@ -657,14 +657,14 @@ group { name "folder2" label "Map" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" parm { name "xn__moonraytexture_control_xcb" label "moonray:texture" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "Set Or Create" "setexisting" "Set if Exists" @@ -679,7 +679,7 @@ default { "" } help "File name of the texture applied to the light. If set to the empty string, no texture is applied. Any file format supported by OpenImageIO can be used. The texture is used in 2 ways - for looking up the texture value at the intersection point when a ray hits the light, and for building a lookup-table-based auxilliary data structure used for distributing light samples over the texture." disablewhen "{ xn__moonraytexture_control_xcb == block } { xn__moonraytexture_control_xcb == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" parmtag { "usdvaluetype" "asset" } } parm { @@ -687,7 +687,7 @@ label "moonray:saturation" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "Set Or Create" "setexisting" "Set if Exists" @@ -703,7 +703,7 @@ default { "1" "1" "1" } help "Per-channel saturation used in color-correcting the light's texture, if one is present. This is achieved by applying the following formula for each channel:\n output = lerp(luminance(inputRGB), input, saturation)." disablewhen "{ xn__moonraysaturation_control_thb == block } { xn__moonraysaturation_control_thb == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" range { 0 10 } parmtag { "usdvaluetype" "color3f" } } @@ -712,7 +712,7 @@ label "moonray:contrast" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "Set Or Create" "setexisting" "Set if Exists" @@ -728,7 +728,7 @@ default { "1" "1" "1" } help "Per-channel contrast used in color-correcting the light's texture, if one is present. The operation mimics Nuke's ColorCorrect node's contrast function:\n For input > 0, output = 0.18 * pow(inputCompnent/0.18, contrast).\n For input <= 0, output = 0.18 * input * pow(1/0.18, contrast)." disablewhen "{ xn__moonraycontrast_control_keb == block } { xn__moonraycontrast_control_keb == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" range { 0 10 } parmtag { "usdvaluetype" "color3f" } } @@ -737,7 +737,7 @@ label "moonray:gamma" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "Set Or Create" "setexisting" "Set if Exists" @@ -753,7 +753,7 @@ default { "1" "1" "1" } help "Per-channel gamma used in color-correcting the light's texture, if one is present. This is achieved by applying the following formula for each channel:\n For input > 0, output = pow(input, gamma)\n For input <= 0, output = input" disablewhen "{ xn__moonraygamma_control_o8a == block } { xn__moonraygamma_control_o8a == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" range { 0 10 } parmtag { "usdvaluetype" "color3f" } } @@ -762,7 +762,7 @@ label "moonray:gain" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "Set Or Create" "setexisting" "Set if Exists" @@ -778,7 +778,7 @@ default { "1" "1" "1" } help "Per-channel gain used in tandem with a per-channel offset for color-correcting the light's texture, if one is present. This is achieved by applying the following formula for each channel:\n output = input * gain + offset" disablewhen "{ xn__moonraygain_control_16a == block } { xn__moonraygain_control_16a == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" range { 0 10 } parmtag { "usdvaluetype" "color3f" } } @@ -787,7 +787,7 @@ label "moonray:offset" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "Set Or Create" "setexisting" "Set if Exists" @@ -803,7 +803,7 @@ default { "0" "0" "0" } help "Per-channel offset used in tandem with a per-channel gain for color-correcting the light's texture, if one is present. This is achieved by applying the following formula for each channel:\n output = input * gain + offset" disablewhen "{ xn__moonrayoffset_control_bbb == block } { xn__moonrayoffset_control_bbb == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" range { 0 10 } parmtag { "usdvaluetype" "color3f" } } @@ -812,7 +812,7 @@ label "moonray:temperature" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "Set Or Create" "setexisting" "Set if Exists" @@ -828,7 +828,7 @@ default { "0" "0" "0" } help "Color temperature using Nuke-style T/M/I settings (T = temperature, M = magenta/green, I = intensity). This is achieved as follows:\nThe 3-channel temperature is interpreted as the vector (T,M,I). The followiong scale values are then applied to the RGB components:\n outputR = inputR * (pow(2,I) + M/3 - T/2)\n outputG = inputG * (pow(2,I) - 2*M/3\n outputB = inputB * (pow(2,I) + M/3 + T/2)" disablewhen "{ xn__moonraytemperature_control_gjb == block } { xn__moonraytemperature_control_gjb == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" range { 0 10 } parmtag { "usdvaluetype" "vector3f" } } @@ -837,7 +837,7 @@ label "moonray:texture_rotation" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "Set Or Create" "setexisting" "Set if Exists" @@ -852,7 +852,7 @@ default { "0" } help "Clockwise rotation angle in degrees." disablewhen "{ xn__moonraytexture_rotation_control_lrb == block } { xn__moonraytexture_rotation_control_lrb == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" range { 0 10 } parmtag { "usdvaluetype" "float" } } @@ -861,7 +861,7 @@ label "moonray:texture_translation" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "Set Or Create" "setexisting" "Set if Exists" @@ -877,7 +877,7 @@ default { "0" "0" } help "Translation of the texture in (u,v)-space, in units of the texture size. For example, a translation of (0.25, 0.5) will translate the texture one-quarter of its width in the u-direction and one-half of its height in the v-direction." disablewhen "{ xn__moonraytexture_translation_control_hwb == block } { xn__moonraytexture_translation_control_hwb == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" range { 0 10 } parmtag { "usdvaluetype" "float2" } } @@ -886,7 +886,7 @@ label "moonray:texture_coverage" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "Set Or Create" "setexisting" "Set if Exists" @@ -902,7 +902,7 @@ default { "1" "1" } help "Texture scales in the u and v-directions." disablewhen "{ xn__moonraytexture_coverage_control_lrb == block } { xn__moonraytexture_coverage_control_lrb == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" range { 0 10 } parmtag { "usdvaluetype" "float2" } } @@ -911,7 +911,7 @@ label "moonray:texture_reps_u" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "Set Or Create" "setexisting" "Set if Exists" @@ -926,7 +926,7 @@ default { "1" } help "Number of times texture repeats in u over the scaled texture space." disablewhen "{ xn__moonraytexture_reps_u_control_cob == block } { xn__moonraytexture_reps_u_control_cob == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" range { 0 10 } parmtag { "usdvaluetype" "float" } } @@ -935,7 +935,7 @@ label "moonray:texture_reps_v" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "Set Or Create" "setexisting" "Set if Exists" @@ -950,7 +950,7 @@ default { "1" } help "Number of times texture repeats in v over the scaled texture space." disablewhen "{ xn__moonraytexture_reps_v_control_cob == block } { xn__moonraytexture_reps_v_control_cob == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" range { 0 10 } parmtag { "usdvaluetype" "float" } } @@ -959,7 +959,7 @@ label "moonray:texture_mirror_u" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "Set Or Create" "setexisting" "Set if Exists" @@ -974,7 +974,7 @@ default { "0" } help "Whether to mirror the texture in the u-direction. If set to false, the texture is repeated in the u-direction." disablewhen "{ xn__moonraytexture_mirror_u_control_lrb == block } { xn__moonraytexture_mirror_u_control_lrb == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" parmtag { "usdvaluetype" "bool" } } parm { @@ -982,7 +982,7 @@ label "moonray:texture_mirror_v" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "Set Or Create" "setexisting" "Set if Exists" @@ -997,7 +997,7 @@ default { "0" } help "Whether to mirror the texture in the v-direction. If set to false, the texture is repeated in the v-direction." disablewhen "{ xn__moonraytexture_mirror_v_control_lrb == block } { xn__moonraytexture_mirror_v_control_lrb == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" parmtag { "usdvaluetype" "bool" } } parm { @@ -1005,7 +1005,7 @@ label "moonray:texture_border_color" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "Set Or Create" "setexisting" "Set if Exists" @@ -1021,7 +1021,7 @@ default { "1" "1" "1" } help "RGB value used when a texture lookup occurs outside the texture." disablewhen "{ xn__moonraytexture_border_color_control_3xb == block } { xn__moonraytexture_border_color_control_3xb == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" range { 0 10 } parmtag { "usdvaluetype" "color3f" } } @@ -1030,7 +1030,7 @@ label "moonray:sample_upper_hemisphere_only" type string default { "none" } - hidewhen "{ primtype != UsdLuxDomeLight createprims == on }" + hidewhen "{ primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 createprims == on }" menujoin { "set" "Set Or Create" "setexisting" "Set if Exists" @@ -1045,7 +1045,7 @@ default { "0" } help "Set this to true if you want the EnvLight to illuminate from only the \"upper\" hemisphere, defined as the hemisphere centered around the light's positive local z-axis direction." disablewhen "{ xn__moonraysample_upper_hemisphere_only_control_4bc == block } { xn__moonraysample_upper_hemisphere_only_control_4bc == none }" - hidewhen "{ primtype != UsdLuxDomeLight createprims == on }" + hidewhen "{ primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 createprims == on }" parmtag { "usdvaluetype" "bool" } } } @@ -1053,14 +1053,14 @@ group { name "folder3" label "Visibility Flags" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" parm { name "xn__moonrayvisible_diffuse_reflection_control_v7b" label "moonray:visible_diffuse_reflection" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "Set Or Create" "setexisting" "Set if Exists" @@ -1075,7 +1075,7 @@ default { "1" } help "Whether the light is visible in diffuse reflection." disablewhen "{ xn__moonrayvisible_diffuse_reflection_control_v7b == block } { xn__moonrayvisible_diffuse_reflection_control_v7b == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" parmtag { "usdvaluetype" "bool" } } parm { @@ -1083,7 +1083,7 @@ label "moonray:visible_diffuse_transmission" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "Set Or Create" "setexisting" "Set if Exists" @@ -1098,7 +1098,7 @@ default { "1" } help "Whether the light is visible in diffuse transmission." disablewhen "{ xn__moonrayvisible_diffuse_transmission_control_4bc == block } { xn__moonrayvisible_diffuse_transmission_control_4bc == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" parmtag { "usdvaluetype" "bool" } } parm { @@ -1106,7 +1106,7 @@ label "moonray:visible_glossy_reflection" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "Set Or Create" "setexisting" "Set if Exists" @@ -1121,7 +1121,7 @@ default { "1" } help "Whether the light is visible in glossy reflection." disablewhen "{ xn__moonrayvisible_glossy_reflection_control_85b == block } { xn__moonrayvisible_glossy_reflection_control_85b == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" parmtag { "usdvaluetype" "bool" } } parm { @@ -1129,7 +1129,7 @@ label "moonray:visible_glossy_transmission" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "Set Or Create" "setexisting" "Set if Exists" @@ -1144,7 +1144,7 @@ default { "1" } help "Whether the light is visible in glossy transmission (refraction)." disablewhen "{ xn__moonrayvisible_glossy_transmission_control_i9b == block } { xn__moonrayvisible_glossy_transmission_control_i9b == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" parmtag { "usdvaluetype" "bool" } } parm { @@ -1152,7 +1152,7 @@ label "moonray:visible_mirror_reflection" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "Set Or Create" "setexisting" "Set if Exists" @@ -1167,7 +1167,7 @@ default { "1" } help "Whether the light is visible in miror reflection." disablewhen "{ xn__moonrayvisible_mirror_reflection_control_85b == block } { xn__moonrayvisible_mirror_reflection_control_85b == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" parmtag { "usdvaluetype" "bool" } } parm { @@ -1175,7 +1175,7 @@ label "moonray:visible_mirror_transmission" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "Set Or Create" "setexisting" "Set if Exists" @@ -1190,7 +1190,7 @@ default { "1" } help "Whether the light is visible in miror transmission (refraction)." disablewhen "{ xn__moonrayvisible_mirror_transmission_control_i9b == block } { xn__moonrayvisible_mirror_transmission_control_i9b == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" parmtag { "usdvaluetype" "bool" } } } @@ -1200,7 +1200,7 @@ label "moonray:light_filters" type string default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "Set Or Create" "setexisting" "Set if Exists" @@ -1213,7 +1213,7 @@ label "Light Filters" default 0 disablewhen "{ xn__moonraylight_filters_control_pmb == block } { xn__moonraylight_filters_control_pmb == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" parmtag { "usdvaluetype" "" } parm { From 952eea3dad7250028db579e9c4467e187a00e451 Mon Sep 17 00:00:00 2001 From: Jakub Svoboda <132791205+rolledhand@users.noreply.github.com> Date: Sun, 31 May 2026 20:04:40 +0200 Subject: [PATCH 05/29] Houdini 20.5: expose MoonRay Solaris material builder Signed-off-by: Jakub Svoboda <132791205+rolledhand@users.noreply.github.com> --- houdini/CMakeLists.txt | 1 + .../moonray_material_builder.py | 98 +++++++++++++++++++ .../python3.11libs/moonray_vopmask_check.py | 3 - .../moonray_vopmask_materialx_patch.py | 3 - houdini/toolbar/MoonRayTools.shelf | 21 ++++ 5 files changed, 120 insertions(+), 6 deletions(-) create mode 100644 houdini/python3.11libs/moonray_material_builder.py create mode 100644 houdini/toolbar/MoonRayTools.shelf diff --git a/houdini/CMakeLists.txt b/houdini/CMakeLists.txt index 50f85f7..1130096 100644 --- a/houdini/CMakeLists.txt +++ b/houdini/CMakeLists.txt @@ -14,6 +14,7 @@ install(FILES install(DIRECTORY otls soho + toolbar python2.7libs python3.9libs python3.11libs diff --git a/houdini/python3.11libs/moonray_material_builder.py b/houdini/python3.11libs/moonray_material_builder.py new file mode 100644 index 0000000..b2f7751 --- /dev/null +++ b/houdini/python3.11libs/moonray_material_builder.py @@ -0,0 +1,98 @@ +"""MoonRay Solaris material builder helpers.""" + +import hou +import voptoolutils + + +MOONRAY_TAB_MASK = ( + "moonray parameter constant rampparm collect null subnet " + "subnetconnector suboutput subinput genericshader" +) + + +def _set_if_present(node, parms): + existing = {parm.name() for parm in node.parms()} + node.setParms({name: value for name, value in parms.items() if name in existing}) + + +def _create_output_connector(subnet_node, name, label, parm_type, color, input_node): + connector = subnet_node.createNode("subnetconnector", "{}_output".format(name)) + _set_if_present( + connector, + { + "parmname": name, + "parmlabel": label, + "parmtype": parm_type, + "connectorkind": 1, + "useasparmdefiner": 0, + }, + ) + connector.setColor(hou.Color(color)) + connector.setInput(0, input_node, 0) + return connector + + +def setup_moonray_material_builder(subnet_node): + """Configure a plain VOP subnet as a MoonRay-native material builder.""" + + subnet_node.setShaderLanguageName("VEX") + + # Match Houdini's MaterialX/Karma builder pattern: a plain editable subnet + # carries a Tab Menu Mask and render context, rather than being a locked HDA. + voptoolutils._addMtlSubnetParms( # pylint: disable=protected-access + subnet_node, + MOONRAY_TAB_MASK, + "moonray", + "MoonRay Material Builder", + ) + + suboutput = subnet_node.node("suboutput1") + if suboutput is not None: + suboutput.destroy() + + subinput = subnet_node.node("subinput1") + if subinput is not None: + subinput.setName("inputs", unique_name=True) + + surface = subnet_node.createNode( + "Vop::DW_MOONRAY::DwaBaseMaterial::1", "dwa_base" + ) + displacement = subnet_node.createNode( + "Vop::DW_MOONRAY::NormalDisplacement::1", "normal_displacement" + ) + + # Keep the default displacement path valid but visually/editably present. + _set_if_present(displacement, {"height": 0.0, "height_multiplier": 0.0}) + + surface_output = _create_output_connector( + subnet_node, "surface", "Surface", 24, (0.89, 0.69, 0.6), surface + ) + displacement_output = _create_output_connector( + subnet_node, + "displacement", + "Displacement", + 25, + (0.6, 0.69, 0.89), + displacement, + ) + + if subinput is not None: + subinput.setPosition(hou.Vector2((-6.0, 2.2))) + surface.setPosition(hou.Vector2((-1.2, 1.3))) + surface_output.setPosition(hou.Vector2((3.8, 1.3))) + displacement.setPosition(hou.Vector2((1.7, -2.8))) + displacement_output.setPosition(hou.Vector2((3.8, -2.8))) + + subnet_node.setMaterialFlag(True) + return subnet_node + + +def create_moonray_material_builder(kwargs, name="moonraymaterial"): + """Create the artist-facing MoonRay Material Builder subnet.""" + + destination = kwargs.get("node") + if destination is not None and not hasattr(hou, "ui"): + subnet_node = destination.createNode("subnet", name) + else: + subnet_node = voptoolutils.genericTool(kwargs, "subnet", name) + return setup_moonray_material_builder(subnet_node) diff --git a/houdini/python3.11libs/moonray_vopmask_check.py b/houdini/python3.11libs/moonray_vopmask_check.py index 4b8f6ff..1ba90ef 100644 --- a/houdini/python3.11libs/moonray_vopmask_check.py +++ b/houdini/python3.11libs/moonray_vopmask_check.py @@ -1,6 +1,3 @@ -# Copyright 2026 DreamWorks Animation LLC -# SPDX-License-Identifier: Apache-2.0 - """Validate MoonRay VOP network masks in Houdini. Run with Houdini's hython after sourcing the OpenMoonRay Houdini setup: diff --git a/houdini/python3.11libs/moonray_vopmask_materialx_patch.py b/houdini/python3.11libs/moonray_vopmask_materialx_patch.py index 2e44683..292f06e 100644 --- a/houdini/python3.11libs/moonray_vopmask_materialx_patch.py +++ b/houdini/python3.11libs/moonray_vopmask_materialx_patch.py @@ -1,6 +1,3 @@ -# Copyright 2026 DreamWorks Animation LLC -# SPDX-License-Identifier: Apache-2.0 - """Add MaterialX to source DW_MOONRAY VOP HDA masks. This is a source-definition maintenance helper. Run it with Houdini's hython diff --git a/houdini/toolbar/MoonRayTools.shelf b/houdini/toolbar/MoonRayTools.shelf new file mode 100644 index 0000000..26b4620 --- /dev/null +++ b/houdini/toolbar/MoonRayTools.shelf @@ -0,0 +1,21 @@ + + + + + + Vop/materialbuilder + + MoonRay + + + MoonRay + DW_MOONRAY + DwaBaseMaterial + dwa + material builder + + + From 78ca7572646afa7ca469b17db38eb6612c7805d0 Mon Sep 17 00:00:00 2001 From: Jakub Svoboda <132791205+rolledhand@users.noreply.github.com> Date: Sun, 31 May 2026 23:23:28 +0200 Subject: [PATCH 06/29] subd/tes-param-exposure Signed-off-by: Jakub Svoboda <132791205+rolledhand@users.noreply.github.com> --- .../HdMoonrayRendererPlugin_Geometry.ds | 233 ++++++++++++++++++ 1 file changed, 233 insertions(+) diff --git a/houdini/soho/parameters/HdMoonrayRendererPlugin_Geometry.ds b/houdini/soho/parameters/HdMoonrayRendererPlugin_Geometry.ds index dbb1c41..cb96dd7 100644 --- a/houdini/soho/parameters/HdMoonrayRendererPlugin_Geometry.ds +++ b/houdini/soho/parameters/HdMoonrayRendererPlugin_Geometry.ds @@ -515,4 +515,237 @@ } } + group { + name "folder_mesh" + label "Mesh Tessellation" + + parm { + name "xn__primvarsmoonrayis_subd_control_zpbh" + label "primvars:moonray:is_subd" + type string + default { "none" } + menujoin { + "set" "![BUTTONS_set_or_create]Set or Create" + "setexisting" "![BUTTONS_set_if_exists]Set if Exists" + "block" "![BUTTONS_set_block]Block" + "none" "![BUTTONS_set_nothing]Do Nothing" + } + parmtag { "sidefx::look" "icon" } + } + parm { + name "xn__primvarsmoonrayis_subd_ycbh" + label "Is Subd" + type toggle + default { "1" } + help "If true, a SubdivisionMesh primitive will be created; otherwise a PolygonMesh primitive will be created." + disablewhen "{ xn__primvarsmoonrayis_subd_control_zpbh == block } { xn__primvarsmoonrayis_subd_control_zpbh == none }" + parmtag { "usdvaluetype" "bool" } + } + + parm { + name "xn__primvarsmoonraysubd_scheme_control_iwbh" + label "primvars:moonray:subd_scheme" + type string + default { "none" } + menujoin { + "set" "![BUTTONS_set_or_create]Set or Create" + "setexisting" "![BUTTONS_set_if_exists]Set if Exists" + "add" "![BUTTONS_set_add]Add if Exists" + "multiply" "![BUTTONS_set_multiply]Multiply if Exists" + "block" "![BUTTONS_set_block]Block" + "none" "![BUTTONS_set_nothing]Do Nothing" + } + parmtag { "sidefx::look" "icon" } + } + parm { + name "xn__primvarsmoonraysubd_scheme_hjbh" + label "Subd Scheme" + type string + default { "catclark" } + help "MoonRay subdivision scheme. USD Loop subdivision is not supported by hdMoonray and is treated as Catmull-Clark." + disablewhen "{ xn__primvarsmoonraysubd_scheme_control_iwbh == block } { xn__primvarsmoonraysubd_scheme_control_iwbh == none }" + menu { + "bilinear" "Bilinear" + "catclark" "Catmull-Clark" + } + parmtag { "usdvaluetype" "token" } + } + + parm { + name "xn__primvarsmoonraysubd_boundary_control_rzbh" + label "primvars:moonray:subd_boundary" + type string + default { "none" } + menujoin { + "set" "![BUTTONS_set_or_create]Set or Create" + "setexisting" "![BUTTONS_set_if_exists]Set if Exists" + "add" "![BUTTONS_set_add]Add if Exists" + "multiply" "![BUTTONS_set_multiply]Multiply if Exists" + "block" "![BUTTONS_set_block]Block" + "none" "![BUTTONS_set_nothing]Do Nothing" + } + parmtag { "sidefx::look" "icon" } + } + parm { + name "xn__primvarsmoonraysubd_boundary_qmbh" + label "Subd Boundary" + type string + default { "edge and corner" } + help "Boundary interpolation for subdivision meshes." + disablewhen "{ xn__primvarsmoonraysubd_boundary_control_rzbh == block } { xn__primvarsmoonraysubd_boundary_control_rzbh == none }" + menu { + "none" "None" + "edge only" "Edge Only" + "edge and corner" "Edge And Corner" + } + parmtag { "usdvaluetype" "token" } + } + + parm { + name "xn__primvarsmoonraysubd_fvar_linear_control_n4bh" + label "primvars:moonray:subd_fvar_linear" + type string + default { "none" } + menujoin { + "set" "![BUTTONS_set_or_create]Set or Create" + "setexisting" "![BUTTONS_set_if_exists]Set if Exists" + "add" "![BUTTONS_set_add]Add if Exists" + "multiply" "![BUTTONS_set_multiply]Multiply if Exists" + "block" "![BUTTONS_set_block]Block" + "none" "![BUTTONS_set_nothing]Do Nothing" + } + parmtag { "sidefx::look" "icon" } + } + parm { + name "xn__primvarsmoonraysubd_fvar_linear_mrbh" + label "Subd Fvar Linear" + type string + default { "corners only" } + help "Face-varying linear interpolation for subdivision meshes." + disablewhen "{ xn__primvarsmoonraysubd_fvar_linear_control_n4bh == block } { xn__primvarsmoonraysubd_fvar_linear_control_n4bh == none }" + menu { + "none" "None" + "corners only" "Corners Only" + "corners plus1" "Corners Plus1" + "corners plus2" "Corners Plus2" + "boundaries" "Boundaries" + "all" "All" + } + parmtag { "usdvaluetype" "token" } + } + + parm { + name "xn__primvarsmoonraymesh_resolution_control_02bh" + label "primvars:moonray:mesh_resolution" + type string + default { "none" } + menujoin { + "set" "![BUTTONS_set_or_create]Set or Create" + "setexisting" "![BUTTONS_set_if_exists]Set if Exists" + "add" "![BUTTONS_set_add]Add if Exists" + "multiply" "![BUTTONS_set_multiply]Multiply if Exists" + "block" "![BUTTONS_set_block]Block" + "none" "![BUTTONS_set_nothing]Do Nothing" + } + parmtag { "sidefx::look" "icon" } + } + parm { + name "xn__primvarsmoonraymesh_resolution_zpbh" + label "Mesh Resolution" + type float + default { "2" } + help "Maximum resolution for mesh tessellation. With adaptive tessellation this caps the tessellation level." + disablewhen "{ xn__primvarsmoonraymesh_resolution_control_02bh == block } { xn__primvarsmoonraymesh_resolution_control_02bh == none }" + range { 0 10 } + parmtag { "usdvaluetype" "float" } + } + + parm { + name "xn__primvarsmoonrayadaptive_error_control_e1bh" + label "primvars:moonray:adaptive_error" + type string + default { "none" } + menujoin { + "set" "![BUTTONS_set_or_create]Set or Create" + "setexisting" "![BUTTONS_set_if_exists]Set if Exists" + "add" "![BUTTONS_set_add]Add if Exists" + "multiply" "![BUTTONS_set_multiply]Multiply if Exists" + "block" "![BUTTONS_set_block]Block" + "none" "![BUTTONS_set_nothing]Do Nothing" + } + parmtag { "sidefx::look" "icon" } + } + parm { + name "xn__primvarsmoonrayadaptive_error_dobh" + label "Adaptive Error" + type float + default { "0" } + help "Maximum allowable pixel error for adaptive subdivision tessellation. A value of 0 disables adaptive tessellation." + disablewhen "{ xn__primvarsmoonrayadaptive_error_control_e1bh == block } { xn__primvarsmoonrayadaptive_error_control_e1bh == none }" + range { 0 10 } + parmtag { "usdvaluetype" "float" } + } + + parm { + name "xn__primvarsmoonraysmooth_normal_control_rzbh" + label "primvars:moonray:smooth_normal" + type string + default { "none" } + menujoin { + "set" "![BUTTONS_set_or_create]Set or Create" + "setexisting" "![BUTTONS_set_if_exists]Set if Exists" + "block" "![BUTTONS_set_block]Block" + "none" "![BUTTONS_set_nothing]Do Nothing" + } + parmtag { "sidefx::look" "icon" } + } + parm { + name "xn__primvarsmoonraysmooth_normal_qmbh" + label "Smooth Normal" + type toggle + default { "1" } + help "Generate smooth shading normals on polygon meshes when the mesh does not provide shading normals." + disablewhen "{ xn__primvarsmoonraysmooth_normal_control_rzbh == block } { xn__primvarsmoonraysmooth_normal_control_rzbh == none }" + parmtag { "usdvaluetype" "bool" } + } + } + + group { + name "folder_motion" + label "Motion Blur" + + parm { + name "xn__primvarsmoonraymotion_blur_type_control_n4bh" + label "primvars:moonray:motion_blur_type" + type string + default { "none" } + menujoin { + "set" "![BUTTONS_set_or_create]Set or Create" + "setexisting" "![BUTTONS_set_if_exists]Set if Exists" + "add" "![BUTTONS_set_add]Add if Exists" + "multiply" "![BUTTONS_set_multiply]Multiply if Exists" + "block" "![BUTTONS_set_block]Block" + "none" "![BUTTONS_set_nothing]Do Nothing" + } + parmtag { "sidefx::look" "icon" } + } + parm { + name "xn__primvarsmoonraymotion_blur_type_mrbh" + label "Motion Blur Type" + type string + default { "best" } + help "Motion blur method for MoonRay mesh, curve, and point geometry when motion samples or velocity data are present." + disablewhen "{ xn__primvarsmoonraymotion_blur_type_control_n4bh == block } { xn__primvarsmoonraymotion_blur_type_control_n4bh == none }" + menu { + "best" "Best" + "static" "Static" + "velocity" "Velocity" + "frame delta" "Frame Delta" + "acceleration" "Acceleration" + "hermite" "Hermite" + } + parmtag { "usdvaluetype" "token" } + } + } + } From 6f167d8c280c1760351c31286fd38e3b7622b78b Mon Sep 17 00:00:00 2001 From: Jakub Svoboda <132791205+rolledhand@users.noreply.github.com> Date: Mon, 1 Jun 2026 01:07:38 +0200 Subject: [PATCH 07/29] Houdini: fix MoonRay settings float defaults Signed-off-by: Jakub Svoboda <132791205+rolledhand@users.noreply.github.com> --- houdini/soho/parameters/HdMoonrayRendererPlugin_Geometry.ds | 4 ++-- houdini/soho/parameters/HdMoonrayRendererPlugin_Global.ds | 4 ++-- houdini/soho/parameters/moonray_Global.ds | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/houdini/soho/parameters/HdMoonrayRendererPlugin_Geometry.ds b/houdini/soho/parameters/HdMoonrayRendererPlugin_Geometry.ds index cb96dd7..005578f 100644 --- a/houdini/soho/parameters/HdMoonrayRendererPlugin_Geometry.ds +++ b/houdini/soho/parameters/HdMoonrayRendererPlugin_Geometry.ds @@ -653,7 +653,7 @@ name "xn__primvarsmoonraymesh_resolution_zpbh" label "Mesh Resolution" type float - default { "2" } + default { "2.0" } help "Maximum resolution for mesh tessellation. With adaptive tessellation this caps the tessellation level." disablewhen "{ xn__primvarsmoonraymesh_resolution_control_02bh == block } { xn__primvarsmoonraymesh_resolution_control_02bh == none }" range { 0 10 } @@ -679,7 +679,7 @@ name "xn__primvarsmoonrayadaptive_error_dobh" label "Adaptive Error" type float - default { "0" } + default { "0.0" } help "Maximum allowable pixel error for adaptive subdivision tessellation. A value of 0 disables adaptive tessellation." disablewhen "{ xn__primvarsmoonrayadaptive_error_control_e1bh == block } { xn__primvarsmoonrayadaptive_error_control_e1bh == none }" range { 0 10 } diff --git a/houdini/soho/parameters/HdMoonrayRendererPlugin_Global.ds b/houdini/soho/parameters/HdMoonrayRendererPlugin_Global.ds index 3133669..6a03317 100644 --- a/houdini/soho/parameters/HdMoonrayRendererPlugin_Global.ds +++ b/houdini/soho/parameters/HdMoonrayRendererPlugin_Global.ds @@ -1161,7 +1161,7 @@ name "xn__moonraysceneVariablesample_clamping_value_v7bn" label "Sample Clamping Value" type float - default { "10" } + default { "10.0" } help "Clamp sample radiance values to this maximum value (the feature is disabled if the value is 0.0). Using this technique reduces fireflies, but is biased." disablewhen "{ xn__moonraysceneVariablesample_clamping_value_control_wlcn == block } { xn__moonraysceneVariablesample_clamping_value_control_wlcn == none }" range { 0 10 } @@ -2693,7 +2693,7 @@ name "xn__moonraysceneVariabletarget_adaptive_error_v7bn" label "Target Adaptive Error" type float - default { "10" } + default { "10.0" } help "When adaptive sampling is turned on, this represents the desired quality of the output images. Lower values will give higher quality but take longer to render. Higher values will give lower quality but render quicker." disablewhen "{ xn__moonraysceneVariabletarget_adaptive_error_control_wlcn == block } { xn__moonraysceneVariabletarget_adaptive_error_control_wlcn == none }" range { 0 10 } diff --git a/houdini/soho/parameters/moonray_Global.ds b/houdini/soho/parameters/moonray_Global.ds index d8f8a22..c3e8d6b 100644 --- a/houdini/soho/parameters/moonray_Global.ds +++ b/houdini/soho/parameters/moonray_Global.ds @@ -1009,7 +1009,7 @@ name "xn__sceneVariablesample_clamping_value_nwb" label "Sample Clamping Value" type float - default { "10" } + default { "10.0" } help "Clamp sample radiance values to this maximum value (the feature is disabled if the value is 0.0). Using this technique reduces fireflies, but is biased." disablewhen "{ xn__sceneVariablesample_clamping_value_control_o9b == block } { xn__sceneVariablesample_clamping_value_control_o9b == none }" range { 0 10 } @@ -2599,7 +2599,7 @@ name "xn__sceneVariabletarget_adaptive_error_nwb" label "Target Adaptive Error" type float - default { "10" } + default { "10.0" } help "When adaptive sampling is turned on, this represents the desired quality of the output images. Lower values will give higher quality but take longer to render. Higher values will give lower quality but render quicker." disablewhen "{ xn__sceneVariabletarget_adaptive_error_control_o9b == block } { xn__sceneVariabletarget_adaptive_error_control_o9b == none }" range { 0 10 } From dbf22fa104ea673ad5c23eca84f8ef28dd43319e Mon Sep 17 00:00:00 2001 From: Jakub Svoboda <132791205+rolledhand@users.noreply.github.com> Date: Mon, 1 Jun 2026 10:12:25 +0200 Subject: [PATCH 08/29] Houdini: avoid invalid default MoonRay light class overrides Signed-off-by: Jakub Svoboda <132791205+rolledhand@users.noreply.github.com> --- houdini/soho/parameters/HdMoonrayRendererPlugin_Light.ds | 4 ++-- houdini/soho/parameters/moonray_Light.ds | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/houdini/soho/parameters/HdMoonrayRendererPlugin_Light.ds b/houdini/soho/parameters/HdMoonrayRendererPlugin_Light.ds index d38bfb3..45ba3de 100644 --- a/houdini/soho/parameters/HdMoonrayRendererPlugin_Light.ds +++ b/houdini/soho/parameters/HdMoonrayRendererPlugin_Light.ds @@ -7,7 +7,7 @@ label "moonray:class" type string invisible - default { "set" } + default { "none" } menujoin { "set" "![BUTTONS_set_or_create]Set or Create" "setexisting" "![BUTTONS_set_if_exists]Set if Exists" @@ -21,7 +21,7 @@ label "class" type string invisible - default { [ "\n parm = hou.parm(\"lighttype\")\n if parm:\n value = parm.eval()\n label = parm.menuLabels()[value]\n if label == \"Geometry\":\n label = \"Mesh\"\n elif label == \"Rectangle\":\n label = \"Rect\"\n return label + \"Light\"\n else:\n parm = hou.parm(\"primtype\")\n value = parm.eval()\n if value in (\"UsdLuxDomeLight\", \"UsdLuxDomeLight_1\", \"DomeLight_1\"):\n return \"EnvLight\"\n " python ] } + default { [ "\n parm = hou.parm(\"lighttype\")\n if parm:\n value = parm.eval()\n label = parm.menuLabels()[value]\n if label == \"Geometry\":\n label = \"Mesh\"\n elif label == \"Point\":\n label = \"Sphere\"\n elif label == \"Rectangle\":\n label = \"Rect\"\n return label + \"Light\"\n else:\n parm = hou.parm(\"primtype\")\n value = parm.eval()\n if value in (\"UsdLuxDomeLight\", \"UsdLuxDomeLight_1\", \"DomeLight_1\"):\n return \"EnvLight\"\n " python ] } disablewhen "{ xn__moonrayclass_control_o8a == block } { xn__moonrayclass_control_o8a == none }" parmtag { "usdvaluetype" "token" } } diff --git a/houdini/soho/parameters/moonray_Light.ds b/houdini/soho/parameters/moonray_Light.ds index 302364c..9b050b2 100644 --- a/houdini/soho/parameters/moonray_Light.ds +++ b/houdini/soho/parameters/moonray_Light.ds @@ -7,7 +7,7 @@ label "moonray:class" type string invisible - default { "set" } + default { "none" } menujoin { "set" "Set Or Create" "setexisting" "Set if Exists" @@ -20,7 +20,7 @@ label "class" type string invisible - default { [ "\n parm = hou.parm(\"lighttype\")\n if parm:\n value = parm.eval()\n label = parm.menuLabels()[value]\n if label == \"Geometry\":\n label = \"Mesh\"\n elif label == \"Rectangle\":\n label = \"Rect\"\n return label + \"Light\"\n else:\n parm = hou.parm(\"primtype\")\n value = parm.eval()\n if value in (\"UsdLuxDomeLight\", \"UsdLuxDomeLight_1\", \"DomeLight_1\"):\n return \"EnvLight\"\n " python ] } + default { [ "\n parm = hou.parm(\"lighttype\")\n if parm:\n value = parm.eval()\n label = parm.menuLabels()[value]\n if label == \"Geometry\":\n label = \"Mesh\"\n elif label == \"Point\":\n label = \"Sphere\"\n elif label == \"Rectangle\":\n label = \"Rect\"\n return label + \"Light\"\n else:\n parm = hou.parm(\"primtype\")\n value = parm.eval()\n if value in (\"UsdLuxDomeLight\", \"UsdLuxDomeLight_1\", \"DomeLight_1\"):\n return \"EnvLight\"\n " python ] } disablewhen "{ xn__moonrayclass_control_o8a == block } { xn__moonrayclass_control_o8a == none }" parmtag { "usdvaluetype" "token" } } From b01d7e0143e80baa79a716ff5005c9948c67e25d Mon Sep 17 00:00:00 2001 From: Jakub Svoboda <132791205+rolledhand@users.noreply.github.com> Date: Mon, 1 Jun 2026 11:27:47 +0200 Subject: [PATCH 09/29] Houdini: restore MoonRay SpotLight controls Signed-off-by: Jakub Svoboda <132791205+rolledhand@users.noreply.github.com> --- .../HdMoonrayRendererPlugin_Light.ds | 53 ++++++++++++++----- houdini/soho/parameters/moonray_Light.ds | 34 ++++++------ 2 files changed, 60 insertions(+), 27 deletions(-) diff --git a/houdini/soho/parameters/HdMoonrayRendererPlugin_Light.ds b/houdini/soho/parameters/HdMoonrayRendererPlugin_Light.ds index 45ba3de..da5d92a 100644 --- a/houdini/soho/parameters/HdMoonrayRendererPlugin_Light.ds +++ b/houdini/soho/parameters/HdMoonrayRendererPlugin_Light.ds @@ -1300,14 +1300,41 @@ group { name "folder4" label "Cone" - hidewhen "{ primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ spotlightenable == 0 xn__moonrayclass_nva != SpotLight } { primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight xn__moonrayclass_nva != SpotLight }" + parm { + name "xn__moonraylens_radius_control_gjb" + label "moonray:lens_radius" + type string + default { "none" } + hidewhen "{ spotlightenable == 0 xn__moonrayclass_nva != SpotLight } { primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight xn__moonrayclass_nva != SpotLight }" + menujoin { + "set" "![BUTTONS_set_or_create]Set or Create" + "setexisting" "![BUTTONS_set_if_exists]Set if Exists" + "add" "![BUTTONS_set_add]Add if Exists" + "multiply" "![BUTTONS_set_multiply]Multiply if Exists" + "block" "![BUTTONS_set_block]Block" + "none" "![BUTTONS_set_nothing]Do Nothing" + } + parmtag { "sidefx::look" "icon" } + } + parm { + name "xn__moonraylens_radius_f5a" + label "Lens Radius" + type float + default { "1" } + help "The radius of the SpotLight's lens. This is a MoonRay SpotLight override; standard USD cone angle and softness still drive the cone shape." + disablewhen "{ xn__moonraylens_radius_control_gjb == block } { xn__moonraylens_radius_control_gjb == none }" + hidewhen "{ spotlightenable == 0 xn__moonrayclass_nva != SpotLight } { primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight xn__moonrayclass_nva != SpotLight }" + range { 0 10 } + parmtag { "usdvaluetype" "float" } + } parm { name "xn__moonrayaspect_ratio_control_2kb" label "moonray:aspect_ratio" type string default { "none" } - hidewhen "{ primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ spotlightenable == 0 xn__moonrayclass_nva != SpotLight } { primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight xn__moonrayclass_nva != SpotLight }" menujoin { "set" "![BUTTONS_set_or_create]Set or Create" "setexisting" "![BUTTONS_set_if_exists]Set if Exists" @@ -1325,7 +1352,7 @@ default { "1" } help "The aspect ratio of the lens - its local y dimension divided by its local x dimension. Values other than 1.0 will give the lens a non-circular elliptical shape." disablewhen "{ xn__moonrayaspect_ratio_control_2kb == block } { xn__moonrayaspect_ratio_control_2kb == none }" - hidewhen "{ primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ spotlightenable == 0 xn__moonrayclass_nva != SpotLight } { primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight xn__moonrayclass_nva != SpotLight }" range { 0 10 } parmtag { "usdvaluetype" "float" } } @@ -1334,7 +1361,7 @@ label "moonray:focal_plane_distance" type string default { "none" } - hidewhen "{ primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ spotlightenable == 0 xn__moonrayclass_nva != SpotLight } { primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight xn__moonrayclass_nva != SpotLight }" menujoin { "set" "![BUTTONS_set_or_create]Set or Create" "setexisting" "![BUTTONS_set_if_exists]Set if Exists" @@ -1352,7 +1379,7 @@ default { "1e+10" } help "The distance from the SpotLight's position, measured in the direction the light is pointing, at which the projected image will be in focus." disablewhen "{ xn__moonrayfocal_plane_distance_control_3xb == block } { xn__moonrayfocal_plane_distance_control_3xb == none }" - hidewhen "{ primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ spotlightenable == 0 xn__moonrayclass_nva != SpotLight } { primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight xn__moonrayclass_nva != SpotLight }" range { 0 10 } parmtag { "usdvaluetype" "float" } } @@ -1360,6 +1387,7 @@ name "xn__moonrayinner_cone_angle_control_lrb" label "moonray:inner_cone_angle" type string + invisible default { "none" } hidewhen "{ primtype != UsdLuxDiskLight createprims == on }" menujoin { @@ -1376,6 +1404,7 @@ name "xn__moonrayinner_cone_angle_keb" label "Inner Cone Angle" type float + invisible default { "30" } help "The apex angle of the bright inner cone of the light emitted by the SpotLight. Full illumination takes place inside this region. This is a full angle, measured from one side to the other. There is a falloff function applied between the outer and inner cones - see the angle_falloff_type attribute." disablewhen "{ xn__moonrayinner_cone_angle_control_lrb == block } { xn__moonrayinner_cone_angle_control_lrb == none }" @@ -1388,14 +1417,14 @@ group { name "folder5" label "Falloff" - hidewhen "{ primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ spotlightenable == 0 xn__moonrayclass_nva != SpotLight } { primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight xn__moonrayclass_nva != SpotLight }" parm { name "xn__moonrayangle_falloff_type_control_uub" label "moonray:angle_falloff_type" type string default { "none" } - hidewhen "{ primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ spotlightenable == 0 xn__moonrayclass_nva != SpotLight } { primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight xn__moonrayclass_nva != SpotLight }" menujoin { "set" "![BUTTONS_set_or_create]Set or Create" "setexisting" "![BUTTONS_set_if_exists]Set if Exists" @@ -1413,7 +1442,7 @@ default { "ease in/out" } help "The falloff function applied between the outer and inner cones. To calculate this, the angle from the cone's axis to the the point being illuminated is measured as seen from the SpotLight's position. This angle is converted into a fractional value representing the fraction from the outer cone angle to the inner cone angle, clamped to the range [0,1]. The resulting value is then fed into one of the following user-selectable functions to determine the final 0-1 scaling value to be applied to thelight's radiance: \n 0 (off) - no fallof, a step function at the outer cone boundary is applied\n 1 (linear) - a linear ramp, i.e. the fractional parameter is applied as-is\n 2 (ease in) - a quadratic ramp with zero gradient at the start point (outer cone)\n 3 (ease out) - a quadratic ramp with zero gradient at the end point (inner cone)\n 4 (ease in/out) - a cubic ramp with zero gradient at both ends (outer and inner cone)\n" disablewhen "{ xn__moonrayangle_falloff_type_control_uub == block } { xn__moonrayangle_falloff_type_control_uub == none }" - hidewhen "{ primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ spotlightenable == 0 xn__moonrayclass_nva != SpotLight } { primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight xn__moonrayclass_nva != SpotLight }" menu { "off" "Off" "linear" "Linear" @@ -1428,7 +1457,7 @@ label "moonray:black_level" type string default { "none" } - hidewhen "{ primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ spotlightenable == 0 xn__moonrayclass_nva != SpotLight } { primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight xn__moonrayclass_nva != SpotLight }" menujoin { "set" "![BUTTONS_set_or_create]Set or Create" "setexisting" "![BUTTONS_set_if_exists]Set if Exists" @@ -1441,12 +1470,12 @@ } parm { name "xn__moonrayblack_level_f5a" - label "Black Level" + label "Black Level (Lens Visibility)" type float default { "0.001" } - help "The radiance used for rendering the SpotLight lens as seen through the camera via a primary ray, when the true computed radiance would otherwise be black. This is simply a convenience feature to make the SpotLight lens visible in the camera view." + help "Visible-lens visualization only. The radiance used for rendering the SpotLight lens as seen through the camera via a primary ray, when the true computed radiance would otherwise be black. This does not change scene illumination." disablewhen "{ xn__moonrayblack_level_control_gjb == block } { xn__moonrayblack_level_control_gjb == none }" - hidewhen "{ primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ spotlightenable == 0 xn__moonrayclass_nva != SpotLight } { primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight xn__moonrayclass_nva != SpotLight }" range { 0 10 } parmtag { "usdvaluetype" "float" } } diff --git a/houdini/soho/parameters/moonray_Light.ds b/houdini/soho/parameters/moonray_Light.ds index 9b050b2..f9d8dc4 100644 --- a/houdini/soho/parameters/moonray_Light.ds +++ b/houdini/soho/parameters/moonray_Light.ds @@ -1230,14 +1230,14 @@ group { name "folder4" label "Cone" - hidewhen "{ primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ spotlightenable == 0 xn__moonrayclass_nva != SpotLight } { primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight xn__moonrayclass_nva != SpotLight }" parm { name "xn__moonraylens_radius_control_gjb" label "moonray:lens_radius" type string default { "none" } - hidewhen "{ primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ spotlightenable == 0 xn__moonrayclass_nva != SpotLight } { primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight xn__moonrayclass_nva != SpotLight }" menujoin { "set" "Set Or Create" "setexisting" "Set if Exists" @@ -1250,9 +1250,9 @@ label "Lens Radius" type float default { "1" } - help "The radius of the SpotLight's lens (when the aspect ratio is 1.0, so that the lens is circular)." + help "The radius of the SpotLight's lens. This is a MoonRay SpotLight override; standard USD cone angle and softness still drive the cone shape." disablewhen "{ xn__moonraylens_radius_control_gjb == block } { xn__moonraylens_radius_control_gjb == none }" - hidewhen "{ primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ spotlightenable == 0 xn__moonrayclass_nva != SpotLight } { primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight xn__moonrayclass_nva != SpotLight }" range { 0 10 } parmtag { "usdvaluetype" "float" } } @@ -1261,7 +1261,7 @@ label "moonray:aspect_ratio" type string default { "none" } - hidewhen "{ primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ spotlightenable == 0 xn__moonrayclass_nva != SpotLight } { primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight xn__moonrayclass_nva != SpotLight }" menujoin { "set" "Set Or Create" "setexisting" "Set if Exists" @@ -1276,7 +1276,7 @@ default { "1" } help "The aspect ratio of the lens - its local y dimension divided by its local x dimension. Values other than 1.0 will give the lens a non-circular elliptical shape." disablewhen "{ xn__moonrayaspect_ratio_control_2kb == block } { xn__moonrayaspect_ratio_control_2kb == none }" - hidewhen "{ primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ spotlightenable == 0 xn__moonrayclass_nva != SpotLight } { primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight xn__moonrayclass_nva != SpotLight }" range { 0 10 } parmtag { "usdvaluetype" "float" } } @@ -1285,7 +1285,7 @@ label "moonray:focal_plane_distance" type string default { "none" } - hidewhen "{ primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ spotlightenable == 0 xn__moonrayclass_nva != SpotLight } { primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight xn__moonrayclass_nva != SpotLight }" menujoin { "set" "Set Or Create" "setexisting" "Set if Exists" @@ -1300,7 +1300,7 @@ default { "1e+10" } help "The distance from the SpotLight's position, measured in the direction the light is pointing, at which the projected image will be in focus." disablewhen "{ xn__moonrayfocal_plane_distance_control_3xb == block } { xn__moonrayfocal_plane_distance_control_3xb == none }" - hidewhen "{ primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ spotlightenable == 0 xn__moonrayclass_nva != SpotLight } { primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight xn__moonrayclass_nva != SpotLight }" range { 0 10 } parmtag { "usdvaluetype" "float" } } @@ -1308,6 +1308,7 @@ name "xn__moonrayouter_cone_angle_control_lrb" label "moonray:outer_cone_angle" type string + invisible default { "none" } hidewhen "{ primtype != UsdLuxDiskLight createprims == on }" menujoin { @@ -1321,6 +1322,7 @@ name "xn__moonrayouter_cone_angle_keb" label "Outer Cone Angle" type float + invisible default { "60" } help "The apex angle of the bounding cone of the light emitted by the SpotLight. No illumination takes placeoutside this angle. This is a full angle, measured from one side to the other. There is a falloff function applied between the outer and inner cones - see the angle_falloff_type attribute." disablewhen "{ xn__moonrayouter_cone_angle_control_lrb == block } { xn__moonrayouter_cone_angle_control_lrb == none }" @@ -1332,6 +1334,7 @@ name "xn__moonrayinner_cone_angle_control_lrb" label "moonray:inner_cone_angle" type string + invisible default { "none" } hidewhen "{ primtype != UsdLuxDiskLight createprims == on }" menujoin { @@ -1345,6 +1348,7 @@ name "xn__moonrayinner_cone_angle_keb" label "Inner Cone Angle" type float + invisible default { "30" } help "The apex angle of the bright inner cone of the light emitted by the SpotLight. Full illumination takes place inside this region. This is a full angle, measured from one side to the other. There is a falloff function applied between the outer and inner cones - see the angle_falloff_type attribute." disablewhen "{ xn__moonrayinner_cone_angle_control_lrb == block } { xn__moonrayinner_cone_angle_control_lrb == none }" @@ -1357,14 +1361,14 @@ group { name "folder5" label "Falloff" - hidewhen "{ primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ spotlightenable == 0 xn__moonrayclass_nva != SpotLight } { primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight xn__moonrayclass_nva != SpotLight }" parm { name "xn__moonrayangle_falloff_type_control_uub" label "moonray:angle_falloff_type" type string default { "none" } - hidewhen "{ primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ spotlightenable == 0 xn__moonrayclass_nva != SpotLight } { primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight xn__moonrayclass_nva != SpotLight }" menujoin { "set" "Set Or Create" "setexisting" "Set if Exists" @@ -1379,7 +1383,7 @@ default { "ease in/out" } help "The falloff function applied between the outer and inner cones. To calculate this, the angle from the cone's axis to the the point being illuminated is measured as seen from the SpotLight's position. This angle is converted into a fractional value representing the fraction from the outer cone angle to the inner cone angle, clamped to the range [0,1]. The resulting value is then fed into one of the following user-selectable functions to determine the final 0-1 scaling value to be applied to thelight's radiance: \n 0 (off) - no fallof, a step function at the outer cone boundary is applied\n 1 (linear) - a linear ramp, i.e. the fractional parameter is applied as-is\n 2 (ease in) - a quadratic ramp with zero gradient at the start point (outer cone)\n 3 (ease out) - a quadratic ramp with zero gradient at the end point (inner cone)\n 4 (ease in/out) - a cubic ramp with zero gradient at both ends (outer and inner cone)\n" disablewhen "{ xn__moonrayangle_falloff_type_control_uub == block } { xn__moonrayangle_falloff_type_control_uub == none }" - hidewhen "{ primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ spotlightenable == 0 xn__moonrayclass_nva != SpotLight } { primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight xn__moonrayclass_nva != SpotLight }" menu { "off" "Off" "linear" "Linear" @@ -1394,7 +1398,7 @@ label "moonray:black_level" type string default { "none" } - hidewhen "{ primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ spotlightenable == 0 xn__moonrayclass_nva != SpotLight } { primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight xn__moonrayclass_nva != SpotLight }" menujoin { "set" "Set Or Create" "setexisting" "Set if Exists" @@ -1404,12 +1408,12 @@ } parm { name "xn__moonrayblack_level_f5a" - label "Black Level" + label "Black Level (Lens Visibility)" type float default { "0.001" } - help "The radiance used for rendering the SpotLight lens as seen through the camera via a primary ray, when the true computed radiance would otherwise be black. This is simply a convenience feature to make the SpotLight lens visible in the camera view." + help "Visible-lens visualization only. The radiance used for rendering the SpotLight lens as seen through the camera via a primary ray, when the true computed radiance would otherwise be black. This does not change scene illumination." disablewhen "{ xn__moonrayblack_level_control_gjb == block } { xn__moonrayblack_level_control_gjb == none }" - hidewhen "{ primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ spotlightenable == 0 xn__moonrayclass_nva != SpotLight } { primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight xn__moonrayclass_nva != SpotLight }" range { 0 10 } parmtag { "usdvaluetype" "float" } } From 9bf4945815b3e6c4a39a62702ef89be0453ecc28 Mon Sep 17 00:00:00 2001 From: Jakub Svoboda <132791205+rolledhand@users.noreply.github.com> Date: Mon, 1 Jun 2026 16:22:49 +0200 Subject: [PATCH 10/29] Houdini: add explicit MoonRay SpotLight UI controls Signed-off-by: Jakub Svoboda <132791205+rolledhand@users.noreply.github.com> --- .../HdMoonrayRendererPlugin_Light.ds | 402 ++++++++++-------- houdini/soho/parameters/moonray_Light.ds | 387 ++++++++--------- 2 files changed, 414 insertions(+), 375 deletions(-) diff --git a/houdini/soho/parameters/HdMoonrayRendererPlugin_Light.ds b/houdini/soho/parameters/HdMoonrayRendererPlugin_Light.ds index da5d92a..241395c 100644 --- a/houdini/soho/parameters/HdMoonrayRendererPlugin_Light.ds +++ b/houdini/soho/parameters/HdMoonrayRendererPlugin_Light.ds @@ -1112,6 +1112,224 @@ parmtag { "usdvaluetype" "bool" } } } + group { + name "folder4" + label "SpotLight" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + + parm { + name "xn__moonraynative_spotlight_rqa" + label "Enable Native MoonRay SpotLight" + type toggle + default { "0" } + help "Forces this Solaris light to render as MoonRay's native SpotLight. Use this when you specifically want MoonRay projector-style controls such as inner/outer cone angles, lens radius, focal plane distance, aspect ratio, angle falloff, and black level. The standard Solaris Shaping tab remains the renderer-neutral USD ShapingAPI path." + parmtag { "script_callback_language" "python" } + parmtag { "script_callback" "node = kwargs['node']; enabled = bool(kwargs['parm'].eval()); control = node.parm('xn__moonrayclass_control_o8a'); klass = node.parm('xn__moonrayclass_nva'); owner = node.userData('moonray_native_spotlight_helper');\nif enabled:\n if control is not None and klass is not None:\n control.set('set')\n klass.set('SpotLight')\n node.setUserData('moonray_native_spotlight_helper', '1')\nelse:\n if owner == '1' and control is not None and klass is not None and control.evalAsString() == 'set' and klass.evalAsString() == 'SpotLight':\n control.set('none')\n node.destroyUserData('moonray_native_spotlight_helper')" } + } + + parm { + name "xn__moonraylens_radius_control_gjb" + label "moonray:lens_radius" + type string + default { "none" } + disablewhen "{ xn__moonraynative_spotlight_rqa == 0 }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + menujoin { + "set" "![BUTTONS_set_or_create]Set or Create" + "setexisting" "![BUTTONS_set_if_exists]Set if Exists" + "add" "![BUTTONS_set_add]Add if Exists" + "multiply" "![BUTTONS_set_multiply]Multiply if Exists" + "block" "![BUTTONS_set_block]Block" + "none" "![BUTTONS_set_nothing]Do Nothing" + } + parmtag { "sidefx::look" "icon" } + } + parm { + name "xn__moonraylens_radius_f5a" + label "Lens Radius" + type float + default { "1" } + help "The radius of the SpotLight's lens (when the aspect ratio is 1.0, so that the lens is circular)." + disablewhen "{ xn__moonraynative_spotlight_rqa == 0 } { xn__moonraylens_radius_control_gjb == block } { xn__moonraylens_radius_control_gjb == none }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + range { 0 10 } + parmtag { "usdvaluetype" "float" } + } + parm { + name "xn__moonrayaspect_ratio_control_2kb" + label "moonray:aspect_ratio" + type string + default { "none" } + disablewhen "{ xn__moonraynative_spotlight_rqa == 0 }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + menujoin { + "set" "![BUTTONS_set_or_create]Set or Create" + "setexisting" "![BUTTONS_set_if_exists]Set if Exists" + "add" "![BUTTONS_set_add]Add if Exists" + "multiply" "![BUTTONS_set_multiply]Multiply if Exists" + "block" "![BUTTONS_set_block]Block" + "none" "![BUTTONS_set_nothing]Do Nothing" + } + parmtag { "sidefx::look" "icon" } + } + parm { + name "xn__moonrayaspect_ratio_16a" + label "Aspect Ratio" + type float + default { "1" } + help "The aspect ratio of the lens - its local y dimension divided by its local x dimension. Values other than 1.0 will give the lens a non-circular elliptical shape." + disablewhen "{ xn__moonraynative_spotlight_rqa == 0 } { xn__moonrayaspect_ratio_control_2kb == block } { xn__moonrayaspect_ratio_control_2kb == none }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + range { 0 10 } + parmtag { "usdvaluetype" "float" } + } + parm { + name "xn__moonrayfocal_plane_distance_control_3xb" + label "moonray:focal_plane_distance" + type string + default { "none" } + disablewhen "{ xn__moonraynative_spotlight_rqa == 0 }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + menujoin { + "set" "![BUTTONS_set_or_create]Set or Create" + "setexisting" "![BUTTONS_set_if_exists]Set if Exists" + "add" "![BUTTONS_set_add]Add if Exists" + "multiply" "![BUTTONS_set_multiply]Multiply if Exists" + "block" "![BUTTONS_set_block]Block" + "none" "![BUTTONS_set_nothing]Do Nothing" + } + parmtag { "sidefx::look" "icon" } + } + parm { + name "xn__moonrayfocal_plane_distance_2kb" + label "Focal Plane Distance" + type float + default { "1e+10" } + help "The distance from the SpotLight's position, measured in the direction the light is pointing, at which the projected image will be in focus." + disablewhen "{ xn__moonraynative_spotlight_rqa == 0 } { xn__moonrayfocal_plane_distance_control_3xb == block } { xn__moonrayfocal_plane_distance_control_3xb == none }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + range { 0 10 } + parmtag { "usdvaluetype" "float" } + } + parm { + name "xn__moonrayouter_cone_angle_control_lrb" + label "moonray:outer_cone_angle" + type string + default { "none" } + disablewhen "{ xn__moonraynative_spotlight_rqa == 0 }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + menujoin { + "set" "![BUTTONS_set_or_create]Set or Create" + "setexisting" "![BUTTONS_set_if_exists]Set if Exists" + "add" "![BUTTONS_set_add]Add if Exists" + "multiply" "![BUTTONS_set_multiply]Multiply if Exists" + "block" "![BUTTONS_set_block]Block" + "none" "![BUTTONS_set_nothing]Do Nothing" + } + parmtag { "sidefx::look" "icon" } + } + parm { + name "xn__moonrayouter_cone_angle_keb" + label "Outer Cone Angle" + type float + default { "60" } + help "The apex angle of the bounding cone of the light emitted by the SpotLight. No illumination takes placeoutside this angle. This is a full angle, measured from one side to the other. There is a falloff function applied between the outer and inner cones - see the angle_falloff_type attribute." + disablewhen "{ xn__moonraynative_spotlight_rqa == 0 } { xn__moonrayouter_cone_angle_control_lrb == block } { xn__moonrayouter_cone_angle_control_lrb == none }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + range { 0 180 } + parmtag { "usdvaluetype" "float" } + } + parm { + name "xn__moonrayinner_cone_angle_control_lrb" + label "moonray:inner_cone_angle" + type string + default { "none" } + disablewhen "{ xn__moonraynative_spotlight_rqa == 0 }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + menujoin { + "set" "![BUTTONS_set_or_create]Set or Create" + "setexisting" "![BUTTONS_set_if_exists]Set if Exists" + "add" "![BUTTONS_set_add]Add if Exists" + "multiply" "![BUTTONS_set_multiply]Multiply if Exists" + "block" "![BUTTONS_set_block]Block" + "none" "![BUTTONS_set_nothing]Do Nothing" + } + parmtag { "sidefx::look" "icon" } + } + parm { + name "xn__moonrayinner_cone_angle_keb" + label "Inner Cone Angle" + type float + default { "30" } + help "The apex angle of the bright inner cone of the light emitted by the SpotLight. Full illumination takes place inside this region. This is a full angle, measured from one side to the other. There is a falloff function applied between the outer and inner cones - see the angle_falloff_type attribute." + disablewhen "{ xn__moonraynative_spotlight_rqa == 0 } { xn__moonrayinner_cone_angle_control_lrb == block } { xn__moonrayinner_cone_angle_control_lrb == none }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + range { 0 180 } + parmtag { "usdvaluetype" "float" } + } + parm { + name "xn__moonrayangle_falloff_type_control_uub" + label "moonray:angle_falloff_type" + type string + default { "none" } + disablewhen "{ xn__moonraynative_spotlight_rqa == 0 }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + menujoin { + "set" "![BUTTONS_set_or_create]Set or Create" + "setexisting" "![BUTTONS_set_if_exists]Set if Exists" + "add" "![BUTTONS_set_add]Add if Exists" + "multiply" "![BUTTONS_set_multiply]Multiply if Exists" + "block" "![BUTTONS_set_block]Block" + "none" "![BUTTONS_set_nothing]Do Nothing" + } + parmtag { "sidefx::look" "icon" } + } + parm { + name "xn__moonrayangle_falloff_type_thb" + label "Angle Falloff Type" + type string + default { "ease in/out" } + help "The falloff function applied between the outer and inner cones. To calculate this, the angle from the cone's axis to the the point being illuminated is measured as seen from the SpotLight's position. This angle is converted into a fractional value representing the fraction from the outer cone angle to the inner cone angle, clamped to the range [0,1]. The resulting value is then fed into one of the following user-selectable functions to determine the final 0-1 scaling value to be applied to thelight's radiance: \n 0 (off) - no fallof, a step function at the outer cone boundary is applied\n 1 (linear) - a linear ramp, i.e. the fractional parameter is applied as-is\n 2 (ease in) - a quadratic ramp with zero gradient at the start point (outer cone)\n 3 (ease out) - a quadratic ramp with zero gradient at the end point (inner cone)\n 4 (ease in/out) - a cubic ramp with zero gradient at both ends (outer and inner cone)\n" + disablewhen "{ xn__moonraynative_spotlight_rqa == 0 } { xn__moonrayangle_falloff_type_control_uub == block } { xn__moonrayangle_falloff_type_control_uub == none }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + menu { + "off" "Off" + "linear" "Linear" + "ease in" "Ease In" + "ease out" "Ease Out" + "ease in/out" "Ease In/Out" + } + parmtag { "usdvaluetype" "token" } + } + parm { + name "xn__moonrayblack_level_control_gjb" + label "moonray:black_level" + type string + default { "none" } + disablewhen "{ xn__moonraynative_spotlight_rqa == 0 }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + menujoin { + "set" "![BUTTONS_set_or_create]Set or Create" + "setexisting" "![BUTTONS_set_if_exists]Set if Exists" + "add" "![BUTTONS_set_add]Add if Exists" + "multiply" "![BUTTONS_set_multiply]Multiply if Exists" + "block" "![BUTTONS_set_block]Block" + "none" "![BUTTONS_set_nothing]Do Nothing" + } + parmtag { "sidefx::look" "icon" } + } + parm { + name "xn__moonrayblack_level_f5a" + label "Black Level" + type float + default { "0.001" } + help "The radiance used for rendering the SpotLight lens as seen through the camera via a primary ray, when the true computed radiance would otherwise be black. This is simply a convenience feature to make the SpotLight lens visible in the camera view." + disablewhen "{ xn__moonraynative_spotlight_rqa == 0 } { xn__moonrayblack_level_control_gjb == block } { xn__moonrayblack_level_control_gjb == none }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxPortalLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + range { 0 10 } + parmtag { "usdvaluetype" "float" } + } + } group { name "folder3" @@ -1297,188 +1515,4 @@ } } - group { - name "folder4" - label "Cone" - hidewhen "{ spotlightenable == 0 xn__moonrayclass_nva != SpotLight } { primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight xn__moonrayclass_nva != SpotLight }" - - parm { - name "xn__moonraylens_radius_control_gjb" - label "moonray:lens_radius" - type string - default { "none" } - hidewhen "{ spotlightenable == 0 xn__moonrayclass_nva != SpotLight } { primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight xn__moonrayclass_nva != SpotLight }" - menujoin { - "set" "![BUTTONS_set_or_create]Set or Create" - "setexisting" "![BUTTONS_set_if_exists]Set if Exists" - "add" "![BUTTONS_set_add]Add if Exists" - "multiply" "![BUTTONS_set_multiply]Multiply if Exists" - "block" "![BUTTONS_set_block]Block" - "none" "![BUTTONS_set_nothing]Do Nothing" - } - parmtag { "sidefx::look" "icon" } - } - parm { - name "xn__moonraylens_radius_f5a" - label "Lens Radius" - type float - default { "1" } - help "The radius of the SpotLight's lens. This is a MoonRay SpotLight override; standard USD cone angle and softness still drive the cone shape." - disablewhen "{ xn__moonraylens_radius_control_gjb == block } { xn__moonraylens_radius_control_gjb == none }" - hidewhen "{ spotlightenable == 0 xn__moonrayclass_nva != SpotLight } { primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight xn__moonrayclass_nva != SpotLight }" - range { 0 10 } - parmtag { "usdvaluetype" "float" } - } - parm { - name "xn__moonrayaspect_ratio_control_2kb" - label "moonray:aspect_ratio" - type string - default { "none" } - hidewhen "{ spotlightenable == 0 xn__moonrayclass_nva != SpotLight } { primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight xn__moonrayclass_nva != SpotLight }" - menujoin { - "set" "![BUTTONS_set_or_create]Set or Create" - "setexisting" "![BUTTONS_set_if_exists]Set if Exists" - "add" "![BUTTONS_set_add]Add if Exists" - "multiply" "![BUTTONS_set_multiply]Multiply if Exists" - "block" "![BUTTONS_set_block]Block" - "none" "![BUTTONS_set_nothing]Do Nothing" - } - parmtag { "sidefx::look" "icon" } - } - parm { - name "xn__moonrayaspect_ratio_16a" - label "Aspect Ratio" - type float - default { "1" } - help "The aspect ratio of the lens - its local y dimension divided by its local x dimension. Values other than 1.0 will give the lens a non-circular elliptical shape." - disablewhen "{ xn__moonrayaspect_ratio_control_2kb == block } { xn__moonrayaspect_ratio_control_2kb == none }" - hidewhen "{ spotlightenable == 0 xn__moonrayclass_nva != SpotLight } { primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight xn__moonrayclass_nva != SpotLight }" - range { 0 10 } - parmtag { "usdvaluetype" "float" } - } - parm { - name "xn__moonrayfocal_plane_distance_control_3xb" - label "moonray:focal_plane_distance" - type string - default { "none" } - hidewhen "{ spotlightenable == 0 xn__moonrayclass_nva != SpotLight } { primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight xn__moonrayclass_nva != SpotLight }" - menujoin { - "set" "![BUTTONS_set_or_create]Set or Create" - "setexisting" "![BUTTONS_set_if_exists]Set if Exists" - "add" "![BUTTONS_set_add]Add if Exists" - "multiply" "![BUTTONS_set_multiply]Multiply if Exists" - "block" "![BUTTONS_set_block]Block" - "none" "![BUTTONS_set_nothing]Do Nothing" - } - parmtag { "sidefx::look" "icon" } - } - parm { - name "xn__moonrayfocal_plane_distance_2kb" - label "Focal Plane Distance" - type float - default { "1e+10" } - help "The distance from the SpotLight's position, measured in the direction the light is pointing, at which the projected image will be in focus." - disablewhen "{ xn__moonrayfocal_plane_distance_control_3xb == block } { xn__moonrayfocal_plane_distance_control_3xb == none }" - hidewhen "{ spotlightenable == 0 xn__moonrayclass_nva != SpotLight } { primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight xn__moonrayclass_nva != SpotLight }" - range { 0 10 } - parmtag { "usdvaluetype" "float" } - } - parm { - name "xn__moonrayinner_cone_angle_control_lrb" - label "moonray:inner_cone_angle" - type string - invisible - default { "none" } - hidewhen "{ primtype != UsdLuxDiskLight createprims == on }" - menujoin { - "set" "![BUTTONS_set_or_create]Set or Create" - "setexisting" "![BUTTONS_set_if_exists]Set if Exists" - "add" "![BUTTONS_set_add]Add if Exists" - "multiply" "![BUTTONS_set_multiply]Multiply if Exists" - "block" "![BUTTONS_set_block]Block" - "none" "![BUTTONS_set_nothing]Do Nothing" - } - parmtag { "sidefx::look" "icon" } - } - parm { - name "xn__moonrayinner_cone_angle_keb" - label "Inner Cone Angle" - type float - invisible - default { "30" } - help "The apex angle of the bright inner cone of the light emitted by the SpotLight. Full illumination takes place inside this region. This is a full angle, measured from one side to the other. There is a falloff function applied between the outer and inner cones - see the angle_falloff_type attribute." - disablewhen "{ xn__moonrayinner_cone_angle_control_lrb == block } { xn__moonrayinner_cone_angle_control_lrb == none }" - hidewhen "{ primtype != UsdLuxDiskLight createprims == on }" - range { 0 10 } - parmtag { "usdvaluetype" "float" } - } - } - - group { - name "folder5" - label "Falloff" - hidewhen "{ spotlightenable == 0 xn__moonrayclass_nva != SpotLight } { primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight xn__moonrayclass_nva != SpotLight }" - - parm { - name "xn__moonrayangle_falloff_type_control_uub" - label "moonray:angle_falloff_type" - type string - default { "none" } - hidewhen "{ spotlightenable == 0 xn__moonrayclass_nva != SpotLight } { primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight xn__moonrayclass_nva != SpotLight }" - menujoin { - "set" "![BUTTONS_set_or_create]Set or Create" - "setexisting" "![BUTTONS_set_if_exists]Set if Exists" - "add" "![BUTTONS_set_add]Add if Exists" - "multiply" "![BUTTONS_set_multiply]Multiply if Exists" - "block" "![BUTTONS_set_block]Block" - "none" "![BUTTONS_set_nothing]Do Nothing" - } - parmtag { "sidefx::look" "icon" } - } - parm { - name "xn__moonrayangle_falloff_type_thb" - label "Angle Falloff Type" - type string - default { "ease in/out" } - help "The falloff function applied between the outer and inner cones. To calculate this, the angle from the cone's axis to the the point being illuminated is measured as seen from the SpotLight's position. This angle is converted into a fractional value representing the fraction from the outer cone angle to the inner cone angle, clamped to the range [0,1]. The resulting value is then fed into one of the following user-selectable functions to determine the final 0-1 scaling value to be applied to thelight's radiance: \n 0 (off) - no fallof, a step function at the outer cone boundary is applied\n 1 (linear) - a linear ramp, i.e. the fractional parameter is applied as-is\n 2 (ease in) - a quadratic ramp with zero gradient at the start point (outer cone)\n 3 (ease out) - a quadratic ramp with zero gradient at the end point (inner cone)\n 4 (ease in/out) - a cubic ramp with zero gradient at both ends (outer and inner cone)\n" - disablewhen "{ xn__moonrayangle_falloff_type_control_uub == block } { xn__moonrayangle_falloff_type_control_uub == none }" - hidewhen "{ spotlightenable == 0 xn__moonrayclass_nva != SpotLight } { primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight xn__moonrayclass_nva != SpotLight }" - menu { - "off" "Off" - "linear" "Linear" - "ease in" "Ease In" - "ease out" "Ease Out" - "ease in/out" "Ease In/Out" - } - parmtag { "usdvaluetype" "token" } - } - parm { - name "xn__moonrayblack_level_control_gjb" - label "moonray:black_level" - type string - default { "none" } - hidewhen "{ spotlightenable == 0 xn__moonrayclass_nva != SpotLight } { primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight xn__moonrayclass_nva != SpotLight }" - menujoin { - "set" "![BUTTONS_set_or_create]Set or Create" - "setexisting" "![BUTTONS_set_if_exists]Set if Exists" - "add" "![BUTTONS_set_add]Add if Exists" - "multiply" "![BUTTONS_set_multiply]Multiply if Exists" - "block" "![BUTTONS_set_block]Block" - "none" "![BUTTONS_set_nothing]Do Nothing" - } - parmtag { "sidefx::look" "icon" } - } - parm { - name "xn__moonrayblack_level_f5a" - label "Black Level (Lens Visibility)" - type float - default { "0.001" } - help "Visible-lens visualization only. The radiance used for rendering the SpotLight lens as seen through the camera via a primary ray, when the true computed radiance would otherwise be black. This does not change scene illumination." - disablewhen "{ xn__moonrayblack_level_control_gjb == block } { xn__moonrayblack_level_control_gjb == none }" - hidewhen "{ spotlightenable == 0 xn__moonrayclass_nva != SpotLight } { primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight xn__moonrayclass_nva != SpotLight }" - range { 0 10 } - parmtag { "usdvaluetype" "float" } - } - } - } diff --git a/houdini/soho/parameters/moonray_Light.ds b/houdini/soho/parameters/moonray_Light.ds index f9d8dc4..248331c 100644 --- a/houdini/soho/parameters/moonray_Light.ds +++ b/houdini/soho/parameters/moonray_Light.ds @@ -1049,17 +1049,27 @@ parmtag { "usdvaluetype" "bool" } } } - group { - name "folder3" - label "Visibility Flags" + name "folder4" + label "SpotLight" hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" parm { - name "xn__moonrayvisible_diffuse_reflection_control_v7b" - label "moonray:visible_diffuse_reflection" + name "xn__moonraynative_spotlight_rqa" + label "Enable Native MoonRay SpotLight" + type toggle + default { "0" } + help "Forces this Solaris light to render as MoonRay's native SpotLight. Use this when you specifically want MoonRay projector-style controls such as inner/outer cone angles, lens radius, focal plane distance, aspect ratio, angle falloff, and black level. The standard Solaris Shaping tab remains the renderer-neutral USD ShapingAPI path." + parmtag { "script_callback_language" "python" } + parmtag { "script_callback" "node = kwargs['node']; enabled = bool(kwargs['parm'].eval()); control = node.parm('xn__moonrayclass_control_o8a'); klass = node.parm('xn__moonrayclass_nva'); owner = node.userData('moonray_native_spotlight_helper');\nif enabled:\n if control is not None and klass is not None:\n control.set('set')\n klass.set('SpotLight')\n node.setUserData('moonray_native_spotlight_helper', '1')\nelse:\n if owner == '1' and control is not None and klass is not None and control.evalAsString() == 'set' and klass.evalAsString() == 'SpotLight':\n control.set('none')\n node.destroyUserData('moonray_native_spotlight_helper')" } + } + + parm { + name "xn__moonraylens_radius_control_gjb" + label "moonray:lens_radius" type string default { "none" } + disablewhen "{ xn__moonraynative_spotlight_rqa == 0 }" hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "Set Or Create" @@ -1069,20 +1079,22 @@ } } parm { - name "xn__moonrayvisible_diffuse_reflection_uub" - label "Visible Diffuse Reflection" - type toggle + name "xn__moonraylens_radius_f5a" + label "Lens Radius" + type float default { "1" } - help "Whether the light is visible in diffuse reflection." - disablewhen "{ xn__moonrayvisible_diffuse_reflection_control_v7b == block } { xn__moonrayvisible_diffuse_reflection_control_v7b == none }" + help "The radius of the SpotLight's lens (when the aspect ratio is 1.0, so that the lens is circular)." + disablewhen "{ xn__moonraynative_spotlight_rqa == 0 } { xn__moonraylens_radius_control_gjb == block } { xn__moonraylens_radius_control_gjb == none }" hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" - parmtag { "usdvaluetype" "bool" } + range { 0 10 } + parmtag { "usdvaluetype" "float" } } parm { - name "xn__moonrayvisible_diffuse_transmission_control_4bc" - label "moonray:visible_diffuse_transmission" + name "xn__moonrayaspect_ratio_control_2kb" + label "moonray:aspect_ratio" type string default { "none" } + disablewhen "{ xn__moonraynative_spotlight_rqa == 0 }" hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "Set Or Create" @@ -1092,20 +1104,22 @@ } } parm { - name "xn__moonrayvisible_diffuse_transmission_3xb" - label "Visible Diffuse Transmission" - type toggle + name "xn__moonrayaspect_ratio_16a" + label "Aspect Ratio" + type float default { "1" } - help "Whether the light is visible in diffuse transmission." - disablewhen "{ xn__moonrayvisible_diffuse_transmission_control_4bc == block } { xn__moonrayvisible_diffuse_transmission_control_4bc == none }" + help "The aspect ratio of the lens - its local y dimension divided by its local x dimension. Values other than 1.0 will give the lens a non-circular elliptical shape." + disablewhen "{ xn__moonraynative_spotlight_rqa == 0 } { xn__moonrayaspect_ratio_control_2kb == block } { xn__moonrayaspect_ratio_control_2kb == none }" hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" - parmtag { "usdvaluetype" "bool" } + range { 0 10 } + parmtag { "usdvaluetype" "float" } } parm { - name "xn__moonrayvisible_glossy_reflection_control_85b" - label "moonray:visible_glossy_reflection" + name "xn__moonrayfocal_plane_distance_control_3xb" + label "moonray:focal_plane_distance" type string default { "none" } + disablewhen "{ xn__moonraynative_spotlight_rqa == 0 }" hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "Set Or Create" @@ -1115,20 +1129,22 @@ } } parm { - name "xn__moonrayvisible_glossy_reflection_7sb" - label "Visible Glossy Reflection" - type toggle - default { "1" } - help "Whether the light is visible in glossy reflection." - disablewhen "{ xn__moonrayvisible_glossy_reflection_control_85b == block } { xn__moonrayvisible_glossy_reflection_control_85b == none }" + name "xn__moonrayfocal_plane_distance_2kb" + label "Focal Plane Distance" + type float + default { "1e+10" } + help "The distance from the SpotLight's position, measured in the direction the light is pointing, at which the projected image will be in focus." + disablewhen "{ xn__moonraynative_spotlight_rqa == 0 } { xn__moonrayfocal_plane_distance_control_3xb == block } { xn__moonrayfocal_plane_distance_control_3xb == none }" hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" - parmtag { "usdvaluetype" "bool" } + range { 0 10 } + parmtag { "usdvaluetype" "float" } } parm { - name "xn__moonrayvisible_glossy_transmission_control_i9b" - label "moonray:visible_glossy_transmission" + name "xn__moonrayouter_cone_angle_control_lrb" + label "moonray:outer_cone_angle" type string default { "none" } + disablewhen "{ xn__moonraynative_spotlight_rqa == 0 }" hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "Set Or Create" @@ -1138,20 +1154,22 @@ } } parm { - name "xn__moonrayvisible_glossy_transmission_hwb" - label "Visible Glossy Transmission" - type toggle - default { "1" } - help "Whether the light is visible in glossy transmission (refraction)." - disablewhen "{ xn__moonrayvisible_glossy_transmission_control_i9b == block } { xn__moonrayvisible_glossy_transmission_control_i9b == none }" + name "xn__moonrayouter_cone_angle_keb" + label "Outer Cone Angle" + type float + default { "60" } + help "The apex angle of the bounding cone of the light emitted by the SpotLight. No illumination takes placeoutside this angle. This is a full angle, measured from one side to the other. There is a falloff function applied between the outer and inner cones - see the angle_falloff_type attribute." + disablewhen "{ xn__moonraynative_spotlight_rqa == 0 } { xn__moonrayouter_cone_angle_control_lrb == block } { xn__moonrayouter_cone_angle_control_lrb == none }" hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" - parmtag { "usdvaluetype" "bool" } + range { 0 180 } + parmtag { "usdvaluetype" "float" } } parm { - name "xn__moonrayvisible_mirror_reflection_control_85b" - label "moonray:visible_mirror_reflection" + name "xn__moonrayinner_cone_angle_control_lrb" + label "moonray:inner_cone_angle" type string default { "none" } + disablewhen "{ xn__moonraynative_spotlight_rqa == 0 }" hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "Set Or Create" @@ -1161,20 +1179,22 @@ } } parm { - name "xn__moonrayvisible_mirror_reflection_7sb" - label "Visible Mirror Reflection" - type toggle - default { "1" } - help "Whether the light is visible in miror reflection." - disablewhen "{ xn__moonrayvisible_mirror_reflection_control_85b == block } { xn__moonrayvisible_mirror_reflection_control_85b == none }" + name "xn__moonrayinner_cone_angle_keb" + label "Inner Cone Angle" + type float + default { "30" } + help "The apex angle of the bright inner cone of the light emitted by the SpotLight. Full illumination takes place inside this region. This is a full angle, measured from one side to the other. There is a falloff function applied between the outer and inner cones - see the angle_falloff_type attribute." + disablewhen "{ xn__moonraynative_spotlight_rqa == 0 } { xn__moonrayinner_cone_angle_control_lrb == block } { xn__moonrayinner_cone_angle_control_lrb == none }" hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" - parmtag { "usdvaluetype" "bool" } + range { 0 180 } + parmtag { "usdvaluetype" "float" } } parm { - name "xn__moonrayvisible_mirror_transmission_control_i9b" - label "moonray:visible_mirror_transmission" + name "xn__moonrayangle_falloff_type_control_uub" + label "moonray:angle_falloff_type" type string default { "none" } + disablewhen "{ xn__moonraynative_spotlight_rqa == 0 }" hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "Set Or Create" @@ -1184,60 +1204,29 @@ } } parm { - name "xn__moonrayvisible_mirror_transmission_hwb" - label "Visible Mirror Transmission" - type toggle - default { "1" } - help "Whether the light is visible in miror transmission (refraction)." - disablewhen "{ xn__moonrayvisible_mirror_transmission_control_i9b == block } { xn__moonrayvisible_mirror_transmission_control_i9b == none }" + name "xn__moonrayangle_falloff_type_thb" + label "Angle Falloff Type" + type string + default { "ease in/out" } + help "The falloff function applied between the outer and inner cones. To calculate this, the angle from the cone's axis to the the point being illuminated is measured as seen from the SpotLight's position. This angle is converted into a fractional value representing the fraction from the outer cone angle to the inner cone angle, clamped to the range [0,1]. The resulting value is then fed into one of the following user-selectable functions to determine the final 0-1 scaling value to be applied to thelight's radiance: \n 0 (off) - no fallof, a step function at the outer cone boundary is applied\n 1 (linear) - a linear ramp, i.e. the fractional parameter is applied as-is\n 2 (ease in) - a quadratic ramp with zero gradient at the start point (outer cone)\n 3 (ease out) - a quadratic ramp with zero gradient at the end point (inner cone)\n 4 (ease in/out) - a cubic ramp with zero gradient at both ends (outer and inner cone)\n" + disablewhen "{ xn__moonraynative_spotlight_rqa == 0 } { xn__moonrayangle_falloff_type_control_uub == block } { xn__moonrayangle_falloff_type_control_uub == none }" hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" - parmtag { "usdvaluetype" "bool" } - } - } - - parm { - name "xn__moonraylight_filters_control_pmb" - label "moonray:light_filters" - type string - default { "none" } - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" - menujoin { - "set" "Set Or Create" - "setexisting" "Set if Exists" - "block" "Block" - "none" "Do Nothing" - } - } - multiparm { - name "light_filters" - label "Light Filters" - default 0 - disablewhen "{ xn__moonraylight_filters_control_pmb == block } { xn__moonraylight_filters_control_pmb == none }" - hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" - parmtag { "usdvaluetype" "" } - - parm { - name "xn__moonraylight_filters_o8a#" - label "Light Filters" - type oppath - default { "" } - help "Vector of LightFilters associated with the light." - parmtag { "moonray::is_parm" "1" } - parmtag { "oprelative" "." } + menu { + "off" "Off" + "linear" "Linear" + "ease in" "Ease In" + "ease out" "Ease Out" + "ease in/out" "Ease In/Out" + } + parmtag { "usdvaluetype" "token" } } - } - - group { - name "folder4" - label "Cone" - hidewhen "{ spotlightenable == 0 xn__moonrayclass_nva != SpotLight } { primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight xn__moonrayclass_nva != SpotLight }" - parm { - name "xn__moonraylens_radius_control_gjb" - label "moonray:lens_radius" + name "xn__moonrayblack_level_control_gjb" + label "moonray:black_level" type string default { "none" } - hidewhen "{ spotlightenable == 0 xn__moonrayclass_nva != SpotLight } { primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight xn__moonrayclass_nva != SpotLight }" + disablewhen "{ xn__moonraynative_spotlight_rqa == 0 }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "Set Or Create" "setexisting" "Set if Exists" @@ -1246,22 +1235,29 @@ } } parm { - name "xn__moonraylens_radius_f5a" - label "Lens Radius" + name "xn__moonrayblack_level_f5a" + label "Black Level" type float - default { "1" } - help "The radius of the SpotLight's lens. This is a MoonRay SpotLight override; standard USD cone angle and softness still drive the cone shape." - disablewhen "{ xn__moonraylens_radius_control_gjb == block } { xn__moonraylens_radius_control_gjb == none }" - hidewhen "{ spotlightenable == 0 xn__moonrayclass_nva != SpotLight } { primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight xn__moonrayclass_nva != SpotLight }" + default { "0.001" } + help "The radiance used for rendering the SpotLight lens as seen through the camera via a primary ray, when the true computed radiance would otherwise be black. This is simply a convenience feature to make the SpotLight lens visible in the camera view." + disablewhen "{ xn__moonraynative_spotlight_rqa == 0 } { xn__moonrayblack_level_control_gjb == block } { xn__moonrayblack_level_control_gjb == none }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" range { 0 10 } parmtag { "usdvaluetype" "float" } } + } + + group { + name "folder3" + label "Visibility Flags" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + parm { - name "xn__moonrayaspect_ratio_control_2kb" - label "moonray:aspect_ratio" + name "xn__moonrayvisible_diffuse_reflection_control_v7b" + label "moonray:visible_diffuse_reflection" type string default { "none" } - hidewhen "{ spotlightenable == 0 xn__moonrayclass_nva != SpotLight } { primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight xn__moonrayclass_nva != SpotLight }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "Set Or Create" "setexisting" "Set if Exists" @@ -1270,22 +1266,21 @@ } } parm { - name "xn__moonrayaspect_ratio_16a" - label "Aspect Ratio" - type float + name "xn__moonrayvisible_diffuse_reflection_uub" + label "Visible Diffuse Reflection" + type toggle default { "1" } - help "The aspect ratio of the lens - its local y dimension divided by its local x dimension. Values other than 1.0 will give the lens a non-circular elliptical shape." - disablewhen "{ xn__moonrayaspect_ratio_control_2kb == block } { xn__moonrayaspect_ratio_control_2kb == none }" - hidewhen "{ spotlightenable == 0 xn__moonrayclass_nva != SpotLight } { primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight xn__moonrayclass_nva != SpotLight }" - range { 0 10 } - parmtag { "usdvaluetype" "float" } + help "Whether the light is visible in diffuse reflection." + disablewhen "{ xn__moonrayvisible_diffuse_reflection_control_v7b == block } { xn__moonrayvisible_diffuse_reflection_control_v7b == none }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + parmtag { "usdvaluetype" "bool" } } parm { - name "xn__moonrayfocal_plane_distance_control_3xb" - label "moonray:focal_plane_distance" + name "xn__moonrayvisible_diffuse_transmission_control_4bc" + label "moonray:visible_diffuse_transmission" type string default { "none" } - hidewhen "{ spotlightenable == 0 xn__moonrayclass_nva != SpotLight } { primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight xn__moonrayclass_nva != SpotLight }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "Set Or Create" "setexisting" "Set if Exists" @@ -1294,23 +1289,21 @@ } } parm { - name "xn__moonrayfocal_plane_distance_2kb" - label "Focal Plane Distance" - type float - default { "1e+10" } - help "The distance from the SpotLight's position, measured in the direction the light is pointing, at which the projected image will be in focus." - disablewhen "{ xn__moonrayfocal_plane_distance_control_3xb == block } { xn__moonrayfocal_plane_distance_control_3xb == none }" - hidewhen "{ spotlightenable == 0 xn__moonrayclass_nva != SpotLight } { primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight xn__moonrayclass_nva != SpotLight }" - range { 0 10 } - parmtag { "usdvaluetype" "float" } + name "xn__moonrayvisible_diffuse_transmission_3xb" + label "Visible Diffuse Transmission" + type toggle + default { "1" } + help "Whether the light is visible in diffuse transmission." + disablewhen "{ xn__moonrayvisible_diffuse_transmission_control_4bc == block } { xn__moonrayvisible_diffuse_transmission_control_4bc == none }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + parmtag { "usdvaluetype" "bool" } } parm { - name "xn__moonrayouter_cone_angle_control_lrb" - label "moonray:outer_cone_angle" + name "xn__moonrayvisible_glossy_reflection_control_85b" + label "moonray:visible_glossy_reflection" type string - invisible default { "none" } - hidewhen "{ primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "Set Or Create" "setexisting" "Set if Exists" @@ -1319,24 +1312,21 @@ } } parm { - name "xn__moonrayouter_cone_angle_keb" - label "Outer Cone Angle" - type float - invisible - default { "60" } - help "The apex angle of the bounding cone of the light emitted by the SpotLight. No illumination takes placeoutside this angle. This is a full angle, measured from one side to the other. There is a falloff function applied between the outer and inner cones - see the angle_falloff_type attribute." - disablewhen "{ xn__moonrayouter_cone_angle_control_lrb == block } { xn__moonrayouter_cone_angle_control_lrb == none }" - hidewhen "{ primtype != UsdLuxDiskLight createprims == on }" - range { 0 10 } - parmtag { "usdvaluetype" "float" } + name "xn__moonrayvisible_glossy_reflection_7sb" + label "Visible Glossy Reflection" + type toggle + default { "1" } + help "Whether the light is visible in glossy reflection." + disablewhen "{ xn__moonrayvisible_glossy_reflection_control_85b == block } { xn__moonrayvisible_glossy_reflection_control_85b == none }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + parmtag { "usdvaluetype" "bool" } } parm { - name "xn__moonrayinner_cone_angle_control_lrb" - label "moonray:inner_cone_angle" + name "xn__moonrayvisible_glossy_transmission_control_i9b" + label "moonray:visible_glossy_transmission" type string - invisible default { "none" } - hidewhen "{ primtype != UsdLuxDiskLight createprims == on }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "Set Or Create" "setexisting" "Set if Exists" @@ -1345,30 +1335,21 @@ } } parm { - name "xn__moonrayinner_cone_angle_keb" - label "Inner Cone Angle" - type float - invisible - default { "30" } - help "The apex angle of the bright inner cone of the light emitted by the SpotLight. Full illumination takes place inside this region. This is a full angle, measured from one side to the other. There is a falloff function applied between the outer and inner cones - see the angle_falloff_type attribute." - disablewhen "{ xn__moonrayinner_cone_angle_control_lrb == block } { xn__moonrayinner_cone_angle_control_lrb == none }" - hidewhen "{ primtype != UsdLuxDiskLight createprims == on }" - range { 0 10 } - parmtag { "usdvaluetype" "float" } + name "xn__moonrayvisible_glossy_transmission_hwb" + label "Visible Glossy Transmission" + type toggle + default { "1" } + help "Whether the light is visible in glossy transmission (refraction)." + disablewhen "{ xn__moonrayvisible_glossy_transmission_control_i9b == block } { xn__moonrayvisible_glossy_transmission_control_i9b == none }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + parmtag { "usdvaluetype" "bool" } } - } - - group { - name "folder5" - label "Falloff" - hidewhen "{ spotlightenable == 0 xn__moonrayclass_nva != SpotLight } { primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight xn__moonrayclass_nva != SpotLight }" - parm { - name "xn__moonrayangle_falloff_type_control_uub" - label "moonray:angle_falloff_type" + name "xn__moonrayvisible_mirror_reflection_control_85b" + label "moonray:visible_mirror_reflection" type string default { "none" } - hidewhen "{ spotlightenable == 0 xn__moonrayclass_nva != SpotLight } { primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight xn__moonrayclass_nva != SpotLight }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "Set Or Create" "setexisting" "Set if Exists" @@ -1377,28 +1358,21 @@ } } parm { - name "xn__moonrayangle_falloff_type_thb" - label "Angle Falloff Type" - type string - default { "ease in/out" } - help "The falloff function applied between the outer and inner cones. To calculate this, the angle from the cone's axis to the the point being illuminated is measured as seen from the SpotLight's position. This angle is converted into a fractional value representing the fraction from the outer cone angle to the inner cone angle, clamped to the range [0,1]. The resulting value is then fed into one of the following user-selectable functions to determine the final 0-1 scaling value to be applied to thelight's radiance: \n 0 (off) - no fallof, a step function at the outer cone boundary is applied\n 1 (linear) - a linear ramp, i.e. the fractional parameter is applied as-is\n 2 (ease in) - a quadratic ramp with zero gradient at the start point (outer cone)\n 3 (ease out) - a quadratic ramp with zero gradient at the end point (inner cone)\n 4 (ease in/out) - a cubic ramp with zero gradient at both ends (outer and inner cone)\n" - disablewhen "{ xn__moonrayangle_falloff_type_control_uub == block } { xn__moonrayangle_falloff_type_control_uub == none }" - hidewhen "{ spotlightenable == 0 xn__moonrayclass_nva != SpotLight } { primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight xn__moonrayclass_nva != SpotLight }" - menu { - "off" "Off" - "linear" "Linear" - "ease in" "Ease In" - "ease out" "Ease Out" - "ease in/out" "Ease In/Out" - } - parmtag { "usdvaluetype" "token" } + name "xn__moonrayvisible_mirror_reflection_7sb" + label "Visible Mirror Reflection" + type toggle + default { "1" } + help "Whether the light is visible in miror reflection." + disablewhen "{ xn__moonrayvisible_mirror_reflection_control_85b == block } { xn__moonrayvisible_mirror_reflection_control_85b == none }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + parmtag { "usdvaluetype" "bool" } } parm { - name "xn__moonrayblack_level_control_gjb" - label "moonray:black_level" + name "xn__moonrayvisible_mirror_transmission_control_i9b" + label "moonray:visible_mirror_transmission" type string default { "none" } - hidewhen "{ spotlightenable == 0 xn__moonrayclass_nva != SpotLight } { primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight xn__moonrayclass_nva != SpotLight }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" menujoin { "set" "Set Or Create" "setexisting" "Set if Exists" @@ -1407,15 +1381,46 @@ } } parm { - name "xn__moonrayblack_level_f5a" - label "Black Level (Lens Visibility)" - type float - default { "0.001" } - help "Visible-lens visualization only. The radiance used for rendering the SpotLight lens as seen through the camera via a primary ray, when the true computed radiance would otherwise be black. This does not change scene illumination." - disablewhen "{ xn__moonrayblack_level_control_gjb == block } { xn__moonrayblack_level_control_gjb == none }" - hidewhen "{ spotlightenable == 0 xn__moonrayclass_nva != SpotLight } { primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight xn__moonrayclass_nva != SpotLight }" - range { 0 10 } - parmtag { "usdvaluetype" "float" } + name "xn__moonrayvisible_mirror_transmission_hwb" + label "Visible Mirror Transmission" + type toggle + default { "1" } + help "Whether the light is visible in miror transmission (refraction)." + disablewhen "{ xn__moonrayvisible_mirror_transmission_control_i9b == block } { xn__moonrayvisible_mirror_transmission_control_i9b == none }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + parmtag { "usdvaluetype" "bool" } + } + } + + parm { + name "xn__moonraylight_filters_control_pmb" + label "moonray:light_filters" + type string + default { "none" } + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + menujoin { + "set" "Set Or Create" + "setexisting" "Set if Exists" + "block" "Block" + "none" "Do Nothing" + } + } + multiparm { + name "light_filters" + label "Light Filters" + default 0 + disablewhen "{ xn__moonraylight_filters_control_pmb == block } { xn__moonraylight_filters_control_pmb == none }" + hidewhen "{ primtype != UsdLuxCylinderLight primtype != UsdLuxDiskLight primtype != UsdLuxDistantLight primtype != UsdLuxDomeLight primtype != UsdLuxDomeLight_1 primtype != DomeLight_1 primtype != UsdLuxGeometryLight primtype != UsdLuxRectLight primtype != UsdLuxSphereLight primtype != UsdLuxDiskLight createprims == on }" + parmtag { "usdvaluetype" "" } + + parm { + name "xn__moonraylight_filters_o8a#" + label "Light Filters" + type oppath + default { "" } + help "Vector of LightFilters associated with the light." + parmtag { "moonray::is_parm" "1" } + parmtag { "oprelative" "." } } } From 8c995f8153dc7fb57be2faa106bee5dcd6972f3e Mon Sep 17 00:00:00 2001 From: Jakub Svoboda <132791205+rolledhand@users.noreply.github.com> Date: Tue, 2 Jun 2026 11:46:01 +0200 Subject: [PATCH 11/29] Houdini: add MoonRay Render Settings LOP Signed-off-by: Jakub Svoboda <132791205+rolledhand@users.noreply.github.com> --- ...::DW_MOONRAY::moonrayrendersettings::1.hda | Bin 0 -> 11608 bytes .../python3.11libs/moonray_render_settings.py | 124 ++++++++++++++++++ houdini/toolbar/MoonRayTools.shelf | 17 +++ 3 files changed, 141 insertions(+) create mode 100644 houdini/otls/Lop::DW_MOONRAY::moonrayrendersettings::1.hda create mode 100644 houdini/python3.11libs/moonray_render_settings.py diff --git a/houdini/otls/Lop::DW_MOONRAY::moonrayrendersettings::1.hda b/houdini/otls/Lop::DW_MOONRAY::moonrayrendersettings::1.hda new file mode 100644 index 0000000000000000000000000000000000000000..601d3cbccb0f516c42f9f472e401f6bd893ab466 GIT binary patch literal 11608 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 alqzcd%(S<%LK7V?dnK=po;Tas-1;xRU-|w3 literal 0 HcmV?d00001 diff --git a/houdini/python3.11libs/moonray_render_settings.py b/houdini/python3.11libs/moonray_render_settings.py new file mode 100644 index 0000000..859a5be --- /dev/null +++ b/houdini/python3.11libs/moonray_render_settings.py @@ -0,0 +1,124 @@ +"""MoonRay Solaris Render Settings authoring helpers.""" + +import hou + +from pxr import Gf, Sdf, UsdRender + + +RENDER_SETTINGS_PRIM = "/Render/rendersettings" +RENDER_PRODUCT_PRIM = "/Render/Products/renderproduct" +BEAUTY_RENDER_VAR_PRIM = "/Render/Vars/beauty" +PRODUCT_NAME = "$HIP/render/$HIPNAME.$OS.$F4.exr" + + +SCENE_VARIABLES = ( + ("sampling_mode", Sdf.ValueTypeNames.Token), + ("pixel_samples", Sdf.ValueTypeNames.Int), + ("light_samples", Sdf.ValueTypeNames.Int), + ("bsdf_samples", Sdf.ValueTypeNames.Int), + ("bssrdf_samples", Sdf.ValueTypeNames.Int), + ("target_adaptive_error", Sdf.ValueTypeNames.Float), + ("min_adaptive_samples", Sdf.ValueTypeNames.Int), + ("max_adaptive_samples", Sdf.ValueTypeNames.Int), + ("sample_clamping_value", Sdf.ValueTypeNames.Float), + ("sample_clamping_depth", Sdf.ValueTypeNames.Int), + ("roughness_clamping_factor", Sdf.ValueTypeNames.Float), + ("max_depth", Sdf.ValueTypeNames.Int), + ("max_diffuse_depth", Sdf.ValueTypeNames.Int), + ("max_glossy_depth", Sdf.ValueTypeNames.Int), + ("max_mirror_depth", Sdf.ValueTypeNames.Int), + ("max_presence_depth", Sdf.ValueTypeNames.Int), + ("max_hair_depth", Sdf.ValueTypeNames.Int), + ("max_volume_depth", Sdf.ValueTypeNames.Int), +) + + +def _parm(node, name, default=None): + parm = node.parm(name) + if parm is None: + return default + return parm.eval() + + +def _string_parm(node, name, default=""): + parm = node.parm(name) + if parm is None: + return default + try: + return parm.unexpandedString() + except hou.OperationFailed: + return str(parm.eval()) + + +def _path(node, name, default): + value = _string_parm(node, name, default).strip() + return value or default + + +def _set_rel_targets(schema_obj, create_rel, paths): + valid = [Sdf.Path(path) for path in paths if path] + rel = create_rel() + rel.SetTargets(valid) + return rel + + +def author_from_node(node=None): + """Author USD RenderSettings, RenderProduct, beauty RenderVar, and MoonRay settings.""" + + node = node or hou.pwd() + stage = node.editableStage() + + settings_path = _path(node, "render_settings_prim", RENDER_SETTINGS_PRIM) + product_path = _path(node, "render_product_prim", RENDER_PRODUCT_PRIM) + beauty_var_path = _path(node, "beauty_render_var_prim", BEAUTY_RENDER_VAR_PRIM) + camera_path = _path(node, "camera_prim", "") + + settings = UsdRender.Settings.Define(stage, settings_path) + product = UsdRender.Product.Define(stage, product_path) + beauty_var = UsdRender.Var.Define(stage, beauty_var_path) + + _set_rel_targets(settings, settings.CreateProductsRel, [product_path]) + if camera_path: + _set_rel_targets(settings, settings.CreateCameraRel, [camera_path]) + + width = int(_parm(node, "resolutionx", 1280)) + height = int(_parm(node, "resolutiony", 720)) + settings.CreateResolutionAttr().Set(Gf.Vec2i(width, height)) + + product_name = _string_parm(node, "product_name", PRODUCT_NAME).strip() or PRODUCT_NAME + product.CreateProductNameAttr().Set(product_name) + product.CreateProductTypeAttr().Set("raster") + _set_rel_targets(product, product.CreateOrderedVarsRel, [beauty_var_path]) + + beauty_var.CreateDataTypeAttr().Set("color3f") + beauty_var.CreateSourceNameAttr().Set("color") + beauty_var.GetPrim().CreateAttribute( + "driver:parameters:aov:name", + Sdf.ValueTypeNames.String, + custom=True, + ).Set("color") + + settings_prim = settings.GetPrim() + for name, value_type in SCENE_VARIABLES: + parm = node.parm("sceneVariable_" + name) + if parm is None: + continue + if value_type == Sdf.ValueTypeNames.Token: + value = parm.evalAsString() + elif value_type == Sdf.ValueTypeNames.Int: + value = int(parm.eval()) + elif value_type == Sdf.ValueTypeNames.Float: + value = float(parm.eval()) + settings_prim.CreateAttribute( + "moonray:sceneVariable:" + name, + value_type, + custom=True, + ).Set(value) + + rdl_output = _string_parm(node, "rdlOutput", "").strip() + if rdl_output: + settings_prim.CreateAttribute( + "rdlOutput", + Sdf.ValueTypeNames.String, + custom=True, + ).Set(rdl_output) diff --git a/houdini/toolbar/MoonRayTools.shelf b/houdini/toolbar/MoonRayTools.shelf index 26b4620..534fa01 100644 --- a/houdini/toolbar/MoonRayTools.shelf +++ b/houdini/toolbar/MoonRayTools.shelf @@ -18,4 +18,21 @@ moonray_material_builder.create_moonray_material_builder(kwargs) material builder + + + + Lop/DW_MOONRAY::moonrayrendersettings::1 + + MoonRay + + + MoonRay + Render Settings + HdMoonrayRendererPlugin + husk + rdl + + From 5f96be986f525cd112d50a52786bcb6efe04b396 Mon Sep 17 00:00:00 2001 From: Jakub Svoboda <132791205+rolledhand@users.noreply.github.com> Date: Tue, 2 Jun 2026 13:23:12 +0200 Subject: [PATCH 12/29] Houdini: add MoonRay Render Settings LOP v2 Signed-off-by: Jakub Svoboda <132791205+rolledhand@users.noreply.github.com> --- ...::DW_MOONRAY::moonrayrendersettings::1.hda | Bin 11608 -> 14229 bytes .../python3.11libs/moonray_render_settings.py | 413 +++++++++++++++++- 2 files changed, 405 insertions(+), 8 deletions(-) diff --git a/houdini/otls/Lop::DW_MOONRAY::moonrayrendersettings::1.hda b/houdini/otls/Lop::DW_MOONRAY::moonrayrendersettings::1.hda index 601d3cbccb0f516c42f9f472e401f6bd893ab466..2f0475a3c816d69ad18937c71e152e274ea9e8ff 100644 GIT binary patch literal 14229 zcmeHOTW{OQ6;7}PiWPQWiUNHrW|aW8fkd{F-5~42C>%R!48*ozJLwk9f}y05G!4mN zdGVz|epY`%f6~79J9FcZmSj5du8X!p0@CDM&V1)OXAbucc7M22{l38M*Lw%M&wmJx zpYNRP9Uho>KmG0Z|9px2-^^q=7K!N1#$hCeS(shm=}*+kw0QVRrkk6)e-8E!4-byE z|FXG>2kWtvNfusYJQ?#W=S3lsX}-DH*PWmI)^xs$zkh}QYnKLDGQjWlG5AqDHsuM=K-Rd^`OsnbC1K3J zY(1LlqRF^srzjlq=*#W`0qAzr$TJ?LOw;vIKM_e<7P@c$%kCci#g2<`%1w`HCd+gr zqbN*sF^stBZC6Iuu4Z;%WjRPQ5eE|)LB6|cT56@{pw9PH}8S0OVi&XViuWKE~d=i#X!9K9=$&51^Rutlt=WPG=@d+Dp7ReFu zl9i;ZtU#l6P5ye-niZ0P|D&0D|N3~BdQ z5Eip~AG`d#$Y5w3Nd%g=e!DEqN=t&j2I`>12iGpGvOxo(N4hYR82}qz01c6|M2>ln z4Wvj4R&`>q5)4WfvPoH#8D~yv@jNVaR~oQaUkjlJ*(8Q(9SOowA!O2JT@j};E5I-a zu!!=viM{LPJmRBbfYI{3WPlM?-=BrqG=IQegi+4dnu}aCNgzgQrf08DP7V)_gN*Bu zm-QEb_)Omn3^Hbg?&lSjldSw7kd@OgYcD5n(D>(* zk#!pWlLTcVvb=bhhItMf?#T=W{J*?Z=4h#HG2sCjL(dyKPi$;TKo2Tg;_S#_Sx_J` z5F;}0RRimcCL-d_6?tyx{>#0=y7ocqbbqkD|Ganq@VIyX#kW0vp84Y7oY4!Bgb~Za zynv6EdS)`W&M>erH{Qxvjh-R@0Mz%`2{|hK%Q;pHch4r7jNu%I<&+)mzFNosZG?sh z>=-{MFXI^+!pC?dTGMDIWzMr8hTDVLKFb7x6cY$&o4p9o5lG3x3MmKWPUD4zu;I@= z5ZCosxw-Z&0X0Lby*JZMRWQQ}ctuXpj&k0->EKP%j7JD|Ws=WCIvx4*Kkdb-7eK!<2Su)1Pnvz4`8H79|vj}i6?9_OnF%YJl-n2|D$B_xan zY`%@cWLjd^!cw*Ib3N;UlF?MH#lcwQA$By-)0&F-+*kX-fOdAnaP%H67p$U8$1off zM+Yz@F?1=*SCJ*?rDx;SwFm4{2(fsoz%Gb_KeZ&w=_}>Uu&|P+ITBaBw8Dk}{S<;B zvquiQT>L|AoT?|Dk?DW`2w`luzwxvd%{rreIGIEOGBqpn_v;k-Ypb5KQVA!_ZN+&A zD|VUFS;OM=*c-vm$l$K;4UYWw=snJ`QA@0;IyDVFVay;AME(cX|AsvUxvk7_MHGo* z1(U;YM_G7KYE`9bW1*B8(n4Y6a7?7??f&*qoR6KEBP8XFVID+Gl3kJJt&(&hMiT0> z+L13}@3ibd;30``YtmatB`8r2C4?O2+)uU8;#XH*Jj0wTYj3-2?|glmt5e1%d#WN+ z5^vV?2xqJ89h?j(xo_H^hEd7ib|0{fwRa2O_3Z+0D_#~2H;rJ_(Q=xJt?up0onyGQxf}~U$CgchfAfzP94ZqYW z#uaR&vFKA@2;j4^0WFj@#130gX^gwx5Mj4ZQ4Qwi8Mfq}&{V3i!TKB5)Qg~=cyTyY z8o>@~sTm8>LM6D`ROn#Er8_)L_!JXSTd>M+dD`P5T$Ar}S*?oeZpkidQBSsd$*kt+ z(+M z8_}m7%M*0HI=eW7xot;RC;Z#v(=Zu9;1%7Je5FL29jdm2v&7jgzn7TPK$!+PK|`sF zIZ33-d=V8_L8zxkvWGH&0k+3iq4=!1gK|d z?u5?3r8kU=l!{+ z3AWnMVoic#;K0t&*sNHfFHP3iveA4UQ+{KCITiTW?O7SaR?1k}dt6d9)W}aiQkLlVqM0V-^wI;aEUE8{A$w$-f zwpq&Mrj<}p$NFE_69g3zX>s8B<%ygi=zv4X-n@2J5U{P_Q=Zi%lSuRg;ptM-W(A=} z7psZI9PIrF=i80%pEMx(9DpL)cDDfN6}4kG0nnpX0M+QaO@M~^c+vu&XUDrQenEJA zs%{sZJZp*1@zF1gkWbldVuTHCVC`NDN!k|)v!?MzB&z?UmB!5@vjH1JDo$~fq3 zn`5+0KI&`+U)24eGtSoaX&4X$D9^{f*HVVdpQs8Vt>TZ+Cg3QvMZ(p3iS@y?H&)VMp_PdB0s$HwSDDw-OMU2d-WkDfN{Q-wK^`U$v*$ple-D|~i!TgwrPjlEt2qjo`?;+s$3 zEn_u}WS-9zSc0G?N`F#Ke^I1->TVgRSdgV`B~$yV=?wt&xV75()ZH>rDoc&*UMr{u zl+s4y8vv_q35f>^s8;(Y0T%wMpb}VMu>hGSGg@Dxldf`YDx~oFACUhoH zw1nELg|0>Dwp@-WJk%juIH6)HU3;miW|rZqgf2x!`bzK~+cS4d=;wrTszM;)d0t80 z1l7Mww>L*rRX}|z>3gxDkHzpx@ms#b(b9)alrs62~0Wk)p_>nvVla&4;kIiG$_^8f~Q|eU@iExuz z(AjQ2nV{06huj1m5vwxo0@VVE_N$n^D)Ig)x0w%cjcl>Q=^Cm|ZH>yYA8GI9hb(R3Eo00bJDHiH={? zXhq)J94`&u4sl2!sg6lN^0nIDTmur*`(Rnro}V63{%FaDh_c{Q7>DhGm;0W z#iz=8lsEeIlB%|34*STkwJdD3ORcoqFcp`NoqKG1{s%JVYn#qns$xhazM(>y<`(OB z?x7D3*6?u;6-4Mlk!yaFBcTc*Yy-yXhzZJ0y7!UkfbrYfV%;uVBODUt167%fssJ?; zL8i%$;<$HAb)zW4sZ*kRor|J_He%8Nu?KXXq$Xgim%jADgN2`bt#v>sYIAI{7kikq znW00ChxgdJX6lUVVZv5|Ab5kKGT?%{754Cyt*q#oJLUrjl$+VxSbu0{&#nQp`qZq` zS@5E#&xHe0cvN|ec~!f%)&UdoWe4y`;6V$4`szt0fB-&us=n*66&mJi5_|lLnafli Y#*Ip_1;ADUY-ri69Y<2Zp`x|-ZYuW6dhW=%1~rVpp>sXh(RbVZ4p`*#>CLn*w}(#yD%}$0IxDS%$v*%tr%@s zxah)#=0;82`3p2*)t&wVm+DSeZd`QXN)z=C(Aq@Px0tze-?<-i&UwZ@-h7f7Id|*n zEHR&@C41(>oft-s5AhrJEa_^Rm!Gh_pnBFzhy&smi1%CQ>>~*|k3cLzU+D#mWZ$oqN%jtl9YZzkb zacGVPz?TZznW~CL6D-*XbjO@vv&Enr9)}s*E~r^6cnZ9SsT!3$w$4(~VhG)OE7Pm{Jitq(YSj z)ku{ZhNRrqiP%OSHGGq8=^kysOMj$-%&2XHHb|Apq9*A?qdJq@hQt)oVhxIDjgki4 zrkaMRwqi&!F`BeP>Y_qwlV*Me=)`~d{mpSU2a1lK4 zB^`qGcow357rghnAe0vHXI$_N<8aCs-=TGbX}LbwEI2y4bf21W4)uzT- zi1`?lgf6l-0iOg9ti%_ww@Hq3NE8pNeotSf&!ZFYdg=^x{0UHnO~@4pJUkz_v$lb3 z^es~wghR`?RgE>;b>pvw&jTJCDVvH4snAI!yJG^BCa2LoE=PG#1($3QsNr6xIH^44 zfM}4n9-HJ!P_X{Lzmwk-HGQr|QBb5iA1$p(iqsNi)Wb{-g+~x+>qvdAV=9KCA3J2= zjNx`!a=ElgHm(v>e;_n0Ecj2~Rav~zMEHr83Yz8EVN9X_?!wR Date: Tue, 2 Jun 2026 16:00:27 +0200 Subject: [PATCH 13/29] Houdini: expand MoonRay Render Settings LOP v3 Signed-off-by: Jakub Svoboda <132791205+rolledhand@users.noreply.github.com> --- ...::DW_MOONRAY::moonrayrendersettings::1.hda | Bin 14229 -> 27737 bytes .../python3.11libs/moonray_render_settings.py | 436 ++++++++++++++---- 2 files changed, 346 insertions(+), 90 deletions(-) diff --git a/houdini/otls/Lop::DW_MOONRAY::moonrayrendersettings::1.hda b/houdini/otls/Lop::DW_MOONRAY::moonrayrendersettings::1.hda index 2f0475a3c816d69ad18937c71e152e274ea9e8ff..741101b50a7a2bac5ffcec86ece4321da124fb48 100644 GIT binary patch literal 27737 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 delta 637 zcmZ9J!D|yi6vj6RZEC4jpkZ?@!-jme}JAW>cO)fdJ{Z|ZIyTd%K@A&&2jr_U+=% zG^FQpZLm7FUZAfhdvrICGUev%S}ItUHPVpCG&UXSN7}Mx*DNdJ?X%&PuJ#0P2(e*V zmp{;SYoFvBA`Fp};mQQbTdAD<&eTT-OBX9wE2ZT5iQ0hqGn7w`pZb(b_RcgiX64$@ zej*kwopnT&Di;;CR{jeM%VMEP$-%s)pE8pY(CcK zlZVx>`G5M485m&z9#qUVm2zPCz@Owt)I$5p9ob#pK=M?QCLuzjA*8K#t(r diff --git a/houdini/python3.11libs/moonray_render_settings.py b/houdini/python3.11libs/moonray_render_settings.py index 068bf99..c826601 100644 --- a/houdini/python3.11libs/moonray_render_settings.py +++ b/houdini/python3.11libs/moonray_render_settings.py @@ -20,6 +20,7 @@ SCENE_VARIABLES = ( ("sampling_mode", Sdf.ValueTypeNames.Token), + ("light_sampling_mode", Sdf.ValueTypeNames.Token), ("pixel_samples", Sdf.ValueTypeNames.Int), ("light_samples", Sdf.ValueTypeNames.Int), ("bsdf_samples", Sdf.ValueTypeNames.Int), @@ -27,6 +28,9 @@ ("target_adaptive_error", Sdf.ValueTypeNames.Float), ("min_adaptive_samples", Sdf.ValueTypeNames.Int), ("max_adaptive_samples", Sdf.ValueTypeNames.Int), + ("batch_tile_order", Sdf.ValueTypeNames.Token), + ("progressive_tile_order", Sdf.ValueTypeNames.Token), + ("checkpoint_tile_order", Sdf.ValueTypeNames.Token), ("sample_clamping_value", Sdf.ValueTypeNames.Float), ("sample_clamping_depth", Sdf.ValueTypeNames.Int), ("roughness_clamping_factor", Sdf.ValueTypeNames.Float), @@ -37,6 +41,31 @@ ("max_presence_depth", Sdf.ValueTypeNames.Int), ("max_hair_depth", Sdf.ValueTypeNames.Int), ("max_volume_depth", Sdf.ValueTypeNames.Int), + ("max_subsurface_per_path", Sdf.ValueTypeNames.Int), + ("russian_roulette_threshold", Sdf.ValueTypeNames.Float), + ("transparency_threshold", Sdf.ValueTypeNames.Float), + ("presence_threshold", Sdf.ValueTypeNames.Float), + ("presence_quality", Sdf.ValueTypeNames.Float), + ("volume_quality", Sdf.ValueTypeNames.Float), + ("volume_shadow_quality", Sdf.ValueTypeNames.Float), + ("volume_illumination_samples", Sdf.ValueTypeNames.Int), + ("volume_opacity_threshold", Sdf.ValueTypeNames.Float), + ("volume_overlap_mode", Sdf.ValueTypeNames.Token), + ("volume_attenuation_factor", Sdf.ValueTypeNames.Float), + ("volume_contribution_factor", Sdf.ValueTypeNames.Float), + ("volume_phase_attenuation_factor", Sdf.ValueTypeNames.Float), + ("volume_indirect_samples", Sdf.ValueTypeNames.Int), + ("texture_blur", Sdf.ValueTypeNames.Float), + ("pixel_filter_width", Sdf.ValueTypeNames.Float), + ("pixel_filter", Sdf.ValueTypeNames.Token), + ("enable_dof", Sdf.ValueTypeNames.Bool), + ("enable_displacement", Sdf.ValueTypeNames.Bool), + ("enable_subsurface_scattering", Sdf.ValueTypeNames.Bool), + ("enable_shadowing", Sdf.ValueTypeNames.Bool), + ("enable_presence_shadows", Sdf.ValueTypeNames.Bool), + ("lights_visible_in_camera", Sdf.ValueTypeNames.Bool), + ("propagate_visibility_bounce_type", Sdf.ValueTypeNames.Bool), + ("shadow_terminator_fix", Sdf.ValueTypeNames.Token), ) @@ -74,6 +103,13 @@ def _set_rel_targets(schema_obj, create_rel, paths): return rel +def _bool_parm(node, name, default=False): + parm = node.parm(name) + if parm is None: + return default + return bool(parm.eval()) + + def author_from_node(node=None): """Author USD RenderSettings, RenderProduct, beauty RenderVar, and MoonRay settings.""" @@ -91,7 +127,6 @@ def author_from_node(node=None): settings = UsdRender.Settings.Define(stage, settings_path) product = UsdRender.Product.Define(stage, product_path) - beauty_var = UsdRender.Var.Define(stage, beauty_var_path) _set_rel_targets(settings, settings.CreateProductsRel, [product_path]) if camera_path: @@ -104,15 +139,19 @@ def author_from_node(node=None): product_name = _string_parm(node, "product_name", PRODUCT_NAME).strip() or PRODUCT_NAME product.CreateProductNameAttr().Set(product_name) product.CreateProductTypeAttr().Set("raster") - _set_rel_targets(product, product.CreateOrderedVarsRel, [beauty_var_path]) - beauty_var.CreateDataTypeAttr().Set("color3f") - beauty_var.CreateSourceNameAttr().Set("color") - beauty_var.GetPrim().CreateAttribute( - "driver:parameters:aov:name", - Sdf.ValueTypeNames.String, - custom=True, - ).Set("color") + ordered_vars = [] + if _bool_parm(node, "aov_beauty", True): + beauty_var = UsdRender.Var.Define(stage, beauty_var_path) + beauty_var.CreateDataTypeAttr().Set("color3f") + beauty_var.CreateSourceNameAttr().Set("color") + beauty_var.GetPrim().CreateAttribute( + "driver:parameters:aov:name", + Sdf.ValueTypeNames.String, + custom=True, + ).Set("color") + ordered_vars.append(beauty_var_path) + _set_rel_targets(product, product.CreateOrderedVarsRel, ordered_vars) settings_prim = settings.GetPrim() for name, value_type in SCENE_VARIABLES: @@ -125,6 +164,8 @@ def author_from_node(node=None): value = int(parm.eval()) elif value_type == Sdf.ValueTypeNames.Float: value = float(parm.eval()) + elif value_type == Sdf.ValueTypeNames.Bool: + value = bool(parm.eval()) settings_prim.CreateAttribute( "moonray:sceneVariable:" + name, value_type, @@ -174,6 +215,76 @@ def _label(name, label, text): return hou.LabelParmTemplate(name, label, (text,)) +def _scene_int(name, label, default, min_value=0, max_value=128, help_text=None): + return hou.IntParmTemplate( + "sceneVariable_" + name, + label, + 1, + (default,), + min=min_value, + max=max_value, + help=help_text or ("MoonRay %s SceneVariable." % name), + ) + + +def _scene_float(name, label, default, min_value=0.0, max_value=10.0, help_text=None): + return hou.FloatParmTemplate( + "sceneVariable_" + name, + label, + 1, + (default,), + min=min_value, + max=max_value, + help=help_text or ("MoonRay %s SceneVariable." % name), + ) + + +def _scene_toggle(name, label, default, help_text=None): + return hou.ToggleParmTemplate( + "sceneVariable_" + name, + label, + default_value=default, + help=help_text or ("MoonRay %s SceneVariable." % name), + ) + + +def _scene_menu(name, label, tokens, labels, default_token, help_text=None): + parm = hou.MenuParmTemplate( + "sceneVariable_" + name, + label, + tokens, + labels, + default_value=tokens.index(default_token), + help=help_text or ("MoonRay %s SceneVariable." % name), + ) + parm.setMenuType(hou.menuType.Normal) + return parm + + +TILE_ORDER_TOKENS = ( + "top", + "bottom", + "left", + "right", + "morton", + "random", + "spiral square", + "spiral rect", + "morton shiftflip", +) +TILE_ORDER_LABELS = ( + "Top", + "Bottom", + "Left", + "Right", + "Morton", + "Random", + "Spiral Square", + "Spiral Rect", + "Morton Shift Flip", +) + + def _build_parm_template_group(): ptg = hou.ParmTemplateGroup() @@ -254,19 +365,27 @@ def _build_parm_template_group(): } ) ptg.append(res_mode) - ptg.append( - resolution := hou.IntParmTemplate( - "resolution", - "Resolution", - 2, - DEFAULT_RESOLUTION, - naming_scheme=hou.parmNamingScheme.XYZW, - min=1, - max=8192, - min_is_strict=True, - help="Offline husk/USD renders use this resolution through RenderSettings. Viewport/IPR resolution is driven by the viewport.", + resolution = hou.IntParmTemplate( + "resolution", + "Resolution", + 2, + DEFAULT_RESOLUTION, + naming_scheme=hou.parmNamingScheme.XYZW, + min=1, + max=8192, + min_is_strict=True, + help="Offline husk/USD renders use this resolution through RenderSettings. Viewport/IPR resolution is driven by the viewport.", + ) + resolution.setDefaultExpression( + ( + "", + 'pythonexprf("__import__(\\\'loputils\\\').computeResolutionParameter(True, True)")', ) ) + resolution.setDefaultExpressionLanguage( + (hou.scriptLanguage.Hscript, hou.scriptLanguage.Hscript) + ) + ptg.append(resolution) resolution_menu = hou.MenuParmTemplate( "resolutionMenu", "Choose Resolution", @@ -303,6 +422,20 @@ def _build_parm_template_group(): ) ) + aovs = ( + hou.ToggleParmTemplate( + "aov_beauty", + "Beauty", + default_value=True, + help="Author the primary beauty RenderVar. Additional AOV checkboxes are deferred until the main MoonRay delegate fills non-beauty AOV buffers reliably.", + ), + _label( + "aov_deferred_note", + "Deferred AOVs", + "Albedo, normal, geometric normal, depth, motion vectors, and OIDN helper AOVs are verified in MoonRay's local/debug path but remain hidden here until the main HdMoonrayRendererPlugin fills those buffers through USD Render ROP.", + ), + ) + render_product = ( hou.StringParmTemplate( "render_product_name", @@ -321,54 +454,54 @@ def _build_parm_template_group(): _label( "beauty_note", "Beauty Output", - "Derived paths: RenderProduct under the RenderProducts parent and beauty RenderVar under the RenderVars parent. AOV and Cryptomatte controls are deferred.", + "Derived paths: RenderProduct under the RenderProducts parent and beauty RenderVar under the RenderVars parent. AOV and Cryptomatte controls beyond beauty are deferred.", ), ) sampling = [ - hou.MenuParmTemplate( - "sceneVariable_sampling_mode", + _scene_menu( + "sampling_mode", "Sampling Mode", ("uniform", "adaptive"), ("Uniform", "Adaptive"), - default_value=0, - help="MoonRay SceneVariables sampling_mode. Metadata values are uniform = 0 and adaptive = 2; this node authors the token form used by the generic Solaris Render Settings Moonray tab.", + "uniform", + "Controls which sampling scheme to use: uniform or adaptive.", + ), + _scene_menu( + "light_sampling_mode", + "Light Sampling Mode", + ("uniform", "adaptive"), + ("Uniform", "Adaptive"), + "uniform", + "Controls which light sampling scheme to use: uniform or adaptive.", ), - hou.IntParmTemplate( - "sceneVariable_pixel_samples", + _scene_int( + "pixel_samples", "Pixel Samples", - 1, - (8,), - min=0, - max=4096, - help="MoonRay pixel_samples SceneVariable.", + 8, + max_value=4096, + help_text="The square root of the number of primary samples taken for each pixel in uniform sampling mode.", ), - hou.IntParmTemplate( - "sceneVariable_light_samples", + _scene_int( + "light_samples", "Light Samples", - 1, - (2,), - min=0, - max=4096, - help="MoonRay light_samples SceneVariable.", + 2, + max_value=4096, + help_text="The square root of the number of samples taken for each light on the primary intersection.", ), - hou.IntParmTemplate( - "sceneVariable_bsdf_samples", + _scene_int( + "bsdf_samples", "BSDF Samples", - 1, - (2,), - min=0, - max=4096, - help="MoonRay bsdf_samples SceneVariable.", + 2, + max_value=4096, + help_text="The square root of the number of samples taken for BSDF lobe evaluations on the primary intersection.", ), - hou.IntParmTemplate( - "sceneVariable_bssrdf_samples", + _scene_int( + "bssrdf_samples", "BSSRDF Samples", - 1, - (2,), - min=0, - max=4096, - help="MoonRay bssrdf_samples SceneVariable.", + 2, + max_value=4096, + help_text="The square root of the number of samples taken to evaluate BSSRDF contributions on the primary intersection.", ), ] adaptive_cond = "{ sceneVariable_sampling_mode != adaptive }" @@ -386,21 +519,46 @@ def _build_parm_template_group(): "MoonRay max_adaptive_samples SceneVariable. Used by adaptive sampling.", ), ): - parm = hou.IntParmTemplate(name, label, 1, (default,), min=0, max=8192, help=help_text) + parm = _scene_int(name.replace("sceneVariable_", ""), label, default, max_value=8192, help_text=help_text) parm.setConditional(hou.parmCondType.DisableWhen, adaptive_cond) sampling.append(parm) - target_error = hou.FloatParmTemplate( - "sceneVariable_target_adaptive_error", + target_error = _scene_float( + "target_adaptive_error", "Target Adaptive Error", - 1, - (10.0,), - min=0, - max=100, - help="MoonRay target_adaptive_error SceneVariable. Used by adaptive sampling.", + 10.0, + max_value=100.0, + help_text="When adaptive sampling is turned on, this represents the desired quality of the output images.", ) target_error.setConditional(hou.parmCondType.DisableWhen, adaptive_cond) sampling.append(target_error) + tile_order = ( + _scene_menu( + "batch_tile_order", + "Batch Tile Order", + TILE_ORDER_TOKENS, + TILE_ORDER_LABELS, + "morton", + "Specifies the order in which tiles are prioritized for batch rendering.", + ), + _scene_menu( + "progressive_tile_order", + "Progressive Tile Order", + TILE_ORDER_TOKENS, + TILE_ORDER_LABELS, + "morton", + "Specifies the order in which tiles are prioritized for progressive rendering.", + ), + _scene_menu( + "checkpoint_tile_order", + "Checkpoint Tile Order", + TILE_ORDER_TOKENS, + TILE_ORDER_LABELS, + "morton", + "Specifies the order in which tiles are prioritized for checkpoint rendering.", + ), + ) + ray_depth = [] for name, label, default in ( ("sceneVariable_max_depth", "Max Ray Depth", 5), @@ -412,44 +570,137 @@ def _build_parm_template_group(): ("sceneVariable_max_volume_depth", "Max Volume Depth", 1), ): ray_depth.append( - hou.IntParmTemplate( - name, + _scene_int( + name.replace("sceneVariable_", ""), label, - 1, - (default,), - min=0, - max=128, - help="MoonRay %s SceneVariable." % name.replace("sceneVariable_", ""), + default, + max_value=128, + help_text="MoonRay %s SceneVariable." % name.replace("sceneVariable_", ""), ) ) + ray_depth.extend( + ( + _scene_int( + "max_subsurface_per_path", + "Max Subsurface Per Path", + 1, + max_value=32, + help_text='The maximum ray depth to allow subsurface scattering. For ray depths beyond this limit Lambertian diffuse is used to approximate subsurface scattering.', + ), + _scene_float( + "russian_roulette_threshold", + "Russian Roulette Threshold", + 0.0375, + max_value=10, + help_text="The Russian roulette threshold specifies the luminance point at which Russian roulette is evaluated for direct light sampling and BSDF continuation.", + ), + _scene_float( + "transparency_threshold", + "Transparency Threshold", + 1.0, + max_value=10, + help_text="The transparency threshold defines the point at which accumulated opacity can be considered opaque.", + ), + _scene_float( + "presence_threshold", + "Presence Threshold", + 0.999, + max_value=10, + help_text="The presence threshold defines the point at which accumulated presence can be considered opaque.", + ), + _scene_float( + "presence_quality", + "Presence Quality", + 0.75, + max_value=10, + help_text="Controls the threshold for stochastic presence sampling along paths.", + ), + ) + ) clamping = ( - hou.FloatParmTemplate( - "sceneVariable_sample_clamping_value", + _scene_float( + "sample_clamping_value", "Sample Clamping Value", - 1, - (10.0,), - min=0, - max=100, - help="Clamp sample values before they are accumulated.", + 10.0, + max_value=100, + help_text="Clamp sample radiance values to this maximum value. A value of 0 disables the effect.", ), - hou.IntParmTemplate( - "sceneVariable_sample_clamping_depth", + _scene_int( + "sample_clamping_depth", "Sample Clamping Depth", 1, - (1,), - min=0, - max=32, - help="Ray depth after which sample clamping is applied.", + max_value=32, + help_text="Clamp sample values only after the given non-specular ray depth.", ), - hou.FloatParmTemplate( - "sceneVariable_roughness_clamping_factor", + _scene_float( + "roughness_clamping_factor", "Roughness Clamping Factor", - 1, - (0.0,), - min=0, - max=10, - help="Clamp material roughness along paths. A value of 1 clamps values to the maximum roughness encountered, while lower values temper the clamping value. 0 disables the effect. Using this technique reduces fireflies from indirect caustics but is biased.", + 0.0, + max_value=10, + help_text="Clamp material roughness along paths. A value of 1 clamps values to the maximum roughness encountered, while lower values temper the clamping value. 0 disables the effect. Using this technique reduces fireflies from indirect caustics but is biased.", + ), + ) + + volumes = ( + _scene_float("volume_quality", "Volume Quality", 0.5, max_value=10, help_text="Controls the overall quality of volume rendering."), + _scene_float("volume_shadow_quality", "Volume Shadow Quality", 1.0, max_value=10, help_text="Controls the quality of volume shadow transmittance."), + _scene_int("volume_illumination_samples", "Volume Illumination Samples", 4, max_value=128, help_text="Sample number along the ray when computing volume scattering radiance towards the eye. Set to 0 to turn off volume lighting completely."), + _scene_float("volume_opacity_threshold", "Volume Opacity Threshold", 0.995, max_value=10, help_text="Stop further volume integration when accumulated opacity exceeds this threshold."), + _scene_menu( + "volume_overlap_mode", + "Volume Overlap Mode", + ("sum", "max", "rnd"), + ("Sum", "Max", "Random"), + "sum", + "Selects how to handle contributions from overlapping volumes.", + ), + _scene_float("volume_attenuation_factor", "Volume Attenuation Factor", 0.65, max_value=10, help_text="Controls how volume attenuation gets exponentially scaled down when rendering multiple scattering volumes."), + _scene_float("volume_contribution_factor", "Volume Contribution Factor", 0.65, max_value=10, help_text="Controls how scattering contribution gets exponentially scaled down when rendering multiple scattering volumes."), + _scene_float("volume_phase_attenuation_factor", "Volume Phase Attenuation Factor", 0.5, max_value=10, help_text="Controls how phase function anisotropy gets exponentially scaled down when rendering multiple scattering volumes."), + _scene_int("volume_indirect_samples", "Volume Indirect Samples", 0, max_value=128, help_text="Number of indirect illumination samples on volumes per primary ray."), + ) + + filtering = ( + _scene_float("texture_blur", "Texture Blur", 0.0, max_value=10, help_text="Adjusts the amount of texture filtering."), + _scene_float("pixel_filter_width", "Pixel Filter Width", 3.0, max_value=10, help_text="The overall extents, in pixels, of the pixel filter."), + _scene_menu( + "pixel_filter", + "Pixel Filter Type", + ("box", "cubic b-spline", "quadratic b-spline"), + ("Box", "Cubic B-Spline", "Quadratic B-Spline"), + "cubic b-spline", + "The type of filter used for filter importance sampling.", + ), + ) + + global_toggles = ( + _scene_toggle("enable_dof", "Enable DOF", True, help_text="Enables or disables camera depth-of-field."), + _scene_toggle("enable_displacement", "Enable Displacement", True, help_text="Enables or disables geometry displacement."), + _scene_toggle("enable_subsurface_scattering", "Enable Subsurface Scattering", True, help_text="Enables or disables subsurface scattering."), + _scene_toggle("enable_shadowing", "Enable Shadowing", True, help_text="Enables or disables shadowing through occlusion rays."), + _scene_toggle("enable_presence_shadows", "Enable Presence Shadows", False, help_text='Whether or not to respect a material\'s "presence" value for shadow rays.'), + _scene_toggle("lights_visible_in_camera", "Lights Visible in Camera", False, help_text="Globally enables or disables lights being visible in camera."), + _scene_toggle("propagate_visibility_bounce_type", "Propagate Visibility Bounce Type", False, help_text="Turns on/off propagation for ray visibility masks."), + _scene_menu( + "shadow_terminator_fix", + "Shadow Terminator Fix", + ( + "Off", + "On", + "On (Sine Compensation Alternative)", + "On (GGX Compensation Alternative)", + "On (Cosine Compensation Alternative)", + ), + ( + "Off", + "On", + "On (Sine Compensation Alternative)", + "On (GGX Compensation Alternative)", + "On (Cosine Compensation Alternative)", + ), + "Off", + "Attempt to soften hard shadow terminator boundaries due to shading/geometric normal deviations.", ), ) @@ -470,10 +721,15 @@ def _build_parm_template_group(): "moonray_settings", "MoonRay Render Settings", ( + hou.FolderParmTemplate("aovs", "AOVs", aovs), hou.FolderParmTemplate("render_product", "Render Product", render_product), hou.FolderParmTemplate("sampling", "Sampling", sampling), - hou.FolderParmTemplate("ray_depth", "Ray Depth", ray_depth), - hou.FolderParmTemplate("clamping", "Clamping", clamping), + hou.FolderParmTemplate("tile_order", "Tile Order", tile_order), + hou.FolderParmTemplate("ray_depth", "Ray Depth / Path", ray_depth), + hou.FolderParmTemplate("clamping", "Clamping / Fireflies", clamping), + hou.FolderParmTemplate("volumes", "Volumes", volumes), + hou.FolderParmTemplate("filtering", "Filtering / Textures", filtering), + hou.FolderParmTemplate("global_toggles", "Global Toggles", global_toggles), hou.FolderParmTemplate("debug", "Debug", debug), ), folder_type=hou.folderType.Tabs, From 6cd0361b1372349d8fa82daa11c0df15b30481d5 Mon Sep 17 00:00:00 2001 From: Jakub Svoboda <132791205+rolledhand@users.noreply.github.com> Date: Sat, 6 Jun 2026 10:49:57 +0200 Subject: [PATCH 14/29] Houdini: checkpoint MoonRay render settings LOP Signed-off-by: Jakub Svoboda <132791205+rolledhand@users.noreply.github.com> --- .../docs/moonray_render_settings_lop_audit.md | 695 ++++++++++++++++++ ...::DW_MOONRAY::moonrayrendersettings::1.hda | Bin 27737 -> 29002 bytes .../python3.11libs/moonray_render_settings.py | 203 ++++- ...ev_validate_moonray_render_settings_lop.py | 413 +++++++++++ houdini/toolbar/MoonRayTools.shelf | 10 +- 5 files changed, 1291 insertions(+), 30 deletions(-) create mode 100644 houdini/docs/moonray_render_settings_lop_audit.md create mode 100755 houdini/tests/dev_validate_moonray_render_settings_lop.py diff --git a/houdini/docs/moonray_render_settings_lop_audit.md b/houdini/docs/moonray_render_settings_lop_audit.md new file mode 100644 index 0000000..9b89d1a --- /dev/null +++ b/houdini/docs/moonray_render_settings_lop_audit.md @@ -0,0 +1,695 @@ +# MoonRay Render Settings LOP Audit + +## Scope + +This is a technical development/audit note for the MoonRay Render Settings LOP work in Houdini Solaris. It is not a polished public user manual. + +- Validation target for this pass: Houdini 20.5 only. +- Custom node name: `moonrayrendersettings1`. +- Custom HDA/operator: `Lop::DW_MOONRAY::moonrayrendersettings::1`. +- Repo source path: `moonray/moonray_dcc_plugins/houdini/python3.11libs/moonray_render_settings.py`. +- HDA path: `moonray/moonray_dcc_plugins/houdini/otls/Lop::DW_MOONRAY::moonrayrendersettings::1.hda`. +- Installed runtime module path used by Houdini 20.5 validation: `/Applications/MoonRay/installs/openmoonray/plugin/houdini/python3.11libs/moonray_render_settings.py`. +- Houdini 21 evidence is out of scope for this pass and should not be mixed with the Houdini 20.5 results below. + +## References Consulted + +### OpenUSD RenderSettings / RenderProduct / RenderVar + +- [usdRender overview](https://openusd.org/dev/user_guides/schemas/usdRender/overview.html): Used for the RenderSettings, RenderProduct, and RenderVar schema relationship model. +- [RenderSettings schema](https://openusd.org/dev/user_guides/schemas/usdRender/RenderSettings.html): Used to confirm the render settings prim is the global render invocation/configuration prim. +- [RenderProduct schema](https://openusd.org/dev/user_guides/schemas/usdRender/RenderProduct.html): Used to confirm product/output path and ordered render variable ownership. +- [RenderVar schema](https://openusd.org/dev/user_guides/schemas/usdRender/RenderVar.html): Used to confirm output variable/AOV authoring expectations. +- [Render settings proposal](https://openusd.org/release/wp_render_settings.html): Used as background for the USD RenderSettings/Product/Var design. +- [USD render user guide](https://openusd.org/dev/user_guides/render_user_guide.html): Used for the broader USD rendering workflow context. + +### SideFX Solaris / USD Render ROP + +- [Render Settings LOP](https://www.sidefx.com/docs/houdini/nodes/lop/rendersettings.html): Primary Houdini/Solaris authoring reference. +- [Render Product LOP](https://www.sidefx.com/docs/houdini/nodes/lop/renderproduct.html): Used to compare productName/productType/orderedVars authoring. +- [Render Var LOP](https://www.sidefx.com/docs/houdini/nodes/lop/rendervar.html): Used to compare Beauty RenderVar authoring and driver parameter extras. +- [USD Render ROP](https://www.sidefx.com/docs/houdini/nodes/out/usdrender.html): Used to confirm the USD Render ROP execution/wiring model. + +### SideFX HOM / LOP Python + +- [hou.LopNode](https://www.sidefx.com/docs/houdini/hom/hou/LopNode.html): Used for Python LOP/HDA stage access and validation. +- [hou.lop](https://www.sidefx.com/docs/houdini/hom/hou/lop.html): Used for Solaris/HOM context. + +### SideFX HDK / USD / Hydra + +- [HDK USD Hydra customization](https://www.sidefx.com/docs/hdk/_h_d_k__u_s_d_hydra.html): Used for Houdini/Hydra integration context. +- [LOP_Node header/source](https://www.sidefx.com/docs/hdk/_l_o_p___node_8h_source.html): Used for LOP implementation and cooking context. + +### SideFX Houdini Digital Asset / UI References + +- [Asset UI](https://www.sidefx.com/docs/houdini/assets/asset_ui.html): Used for HDA parameter UI conventions. +- [Editing assets](https://www.sidefx.com/docs/houdini/assets/edit.html): Used for HDA/source-of-truth considerations. +- [Operator Type Properties](https://www.sidefx.com/docs/houdini/ref/windows/optype.html): Used for HDA operator definition behavior. +- [Edit Properties LOP](https://www.sidefx.com/docs/houdini/nodes/lop/editproperties.html): Used as context for Houdini's generic USD property authoring model. + +### OpenMoonRay / HdMoonRay + +- [HdMoonRay Render Settings](https://docs.openmoonray.org/user-reference/tools/hydra/render-settings/): Used for the MoonRay/Hydra render settings path. +- [HdMoonRay setup](https://docs.openmoonray.org/user-reference/tools/hydra/hdmoonray-setup/): Used for plugin/runtime environment context. +- [HdMoonRay commands](https://docs.openmoonray.org/user-reference/tools/hydra/commands/): Used for `husk`/Hydra command-line context. +- [HdMoonRay Houdini](https://docs.openmoonray.org/user-reference/tools/hydra/hdmoonray-houdini/): Used for Houdini integration context. +- [HdMoonRay features](https://docs.openmoonray.org/user-reference/tools/hydra/hdmoonray-features/): Used for feature support context. +- [MoonRay scene objects](https://docs.openmoonray.org/user-reference/scene-objects/): Used for RDL scene object context. +- [SceneVariables](https://docs.openmoonray.org/user-reference/scene-objects/scene-variables/SceneVariables/): Used to classify MoonRay SceneVariables. +- [RenderOutput](https://docs.openmoonray.org/user-reference/scene-objects/render-output/RenderOutput/): Used for MoonRay-side output/AOV realization. +- [Render outputs guide](https://docs.openmoonray.org/user-reference/how-to-guides/render-outputs/): Used for MoonRay RenderOutput workflow context. +- [OpenMoonRay developer reference](https://docs.openmoonray.org/developer-reference/): Used for developer-level source/library context. + +### Autodesk / Arnold AOV References + +These were treated only as practical renderer/AOV workflow references, not as MoonRay truth. + +- [arnold-usd](https://github.com/Autodesk/arnold-usd) +- [Arnold expression AOVs](https://help.autodesk.com/cloudhelp/ENU/AR-Core/files/ac-output-aovs/arnold_user_guide_ac_output_aovs_ac_expression_aovs_html.html) +- [Arnold AOV shaders](https://help.autodesk.com/cloudhelp/ENU/AR-Core/files/ac-shading/arnold_user_guide_ac_shading_ac_aov_shaders_html.html) +- [Arnold for Cinema 4D AOVs](https://help.autodesk.com/cloudhelp/JPN/AR-Cinema4D/files/ci-arnold-render-settings/arnold_for_cinema_4d_ci_Arnold_Render_Settings_ci_AOVs_html.html) +- [Arnold for 3ds Max AOVs](https://help.autodesk.com/view/3DSMAX/2024/ENU/?guid=arnold_for_3ds_max_ax_render_setup_ax_aovs_html) + +## Source of Truth and Runtime Import Rules + +The repo `moonray_render_settings.py` is the source of truth for the custom MoonRay Render Settings LOP. The HDA UI and cook-time Python must come from the same definition list. The generated HDA imports `moonray_render_settings` at cook time, so the module imported by Houdini must match the source used to generate the HDA. + +Runtime import path used by Houdini 20.5 validation: + +```text +/Applications/MoonRay/installs/openmoonray/plugin/houdini/python3.11libs/moonray_render_settings.py +``` + +Verification commands inside Houdini 20.5 `hython`: + +```python +import moonray_render_settings +print(moonray_render_settings.__file__) +print(len(moonray_render_settings.SCENE_VARIABLES)) +print(any(name == "enable_dof" for name, _ in moonray_render_settings.SCENE_VARIABLES)) +print(any(name == "light_sampling_mode" for name, _ in moonray_render_settings.SCENE_VARIABLES)) +``` + +The drift bug happened because the visible HDA UI was newer than the installed Python module that Houdini imported at cook time. The repo source and HDA contained newer settings, but Houdini 20.5 loaded the stale installed module from the plugin install tree. + +The local install-tree sync used during validation copied the repo source and regenerated HDA into the installed plugin tree. That was a validation step, not a final manual-install solution. Future repo/install tooling must keep the HDA and runtime Python module aligned reproducibly. + +## Proven Drift Bug + +Before the source/install sync: + +- HDA UI showed `Enable DOF`. +- Installed runtime module had only 18 SceneVariables. +- `enable_dof` was missing from the installed runtime module. +- Custom USD did not author `moonray:sceneVariable:enable_dof`. +- Custom RDLA kept camera `["dof"] = true`. + +After the source/install sync: + +- Installed runtime module has 50 SceneVariables. +- `enable_dof` is present. +- `light_sampling_mode` is present. +- Custom USD authors `custom bool moonray:sceneVariable:enable_dof = 0`. +- Custom RDLA contains `["enable_dof"] = false`. + +## USD RenderSettings / RenderProduct / RenderVar Contract + +The USD render contract is: + +- `RenderSettings` owns render invocation/global render settings. +- `RenderSettings` has the render camera relationship. +- `RenderSettings` has the products relationship. +- `RenderProduct` owns `productName`, `productType`, and `orderedVars`. +- `RenderVar` describes an AOV/output variable. +- AOVs flow through `RenderSettings -> RenderProduct -> orderedVars -> RenderVar`. +- The MoonRay backend realizes render outputs as MoonRay `RenderOutput` objects. + +Current custom authored paths: + +```text +/Render/rendersettings +/Render/Products/renderproduct +/Render/Products/Vars/beauty +``` + +## Render Product and Output Path Rules + +`RenderProduct.productName` is the final image output path authored by the custom LOP. `$F4` frame tokens are preserved in the authored USD and expand during render execution. + +When the USD Render ROP `outputimage` override is blank, the RenderProduct output path wins. A Houdini 20.5 smoke test wrote: + +```text +/tmp/moonray_render_settings_alignment_after/rop_product.0001.exr +``` + +That smoke render was black. It proves USD Render ROP wiring, RenderProduct output creation, and resolution/output path behavior only. It does not prove filled-pixel Beauty/AOV success. + +## Resolution Behavior + +The custom MoonRay Render Settings LOP uses manual resolution only. + +Earlier prototypes mirrored Karma's computed camera-aperture modes: + +- Set Width, Compute Height from Camera. +- Set Height, Compute Width from Camera. + +Those computed modes were removed in the H20.5 UI/lifecycle cleanup pass to reduce callback and lifecycle complexity. The node now exposes a simple `Manual Resolution` note plus a directly editable `Resolution` integer pair. + +Validated dimensions: + +- Manual: `512 x 256`. + +The custom LOP authors final numeric resolution as `RenderSettings.resolution`. It must not author `moonray:sceneVariable:image_width` or `moonray:sceneVariable:image_height`. + +## SceneVariables and Render Settings + +MoonRay render settings that target RDL `SceneVariables` are authored as `moonray:sceneVariable:*` custom attributes on the `RenderSettings` prim where appropriate. + +`image_width` and `image_height` should not be authored by the custom LOP. They appear in RDLA from Hydra/render-pass framing, not from custom USD SceneVariable attributes. + +Current custom USD now authors: + +- `moonray:sceneVariable:enable_dof`. +- `moonray:sceneVariable:light_sampling_mode`. +- Tile order settings. +- `moonray:sceneVariable:roughness_clamping_factor`. +- `moonray:sceneVariable:target_adaptive_error`. + +RDLA proves MoonRay receives `enable_dof`, `light_sampling_mode`, `target_adaptive_error`, and `roughness_clamping_factor`. + +| UI label | USD attr | USD type | RDLA key | Current status | +|---------|----------|----------|----------|----------------| +| Enable DOF | `moonray:sceneVariable:enable_dof` | bool | `enable_dof` | working after drift fix | +| Light Sampling Mode | `moonray:sceneVariable:light_sampling_mode` | token/string | `light_sampling_mode` | working after drift fix | +| Target Adaptive Error | `moonray:sceneVariable:target_adaptive_error` | float | `target_adaptive_error` | working after drift fix | +| Roughness Clamping Factor | `moonray:sceneVariable:roughness_clamping_factor` | float | `roughness_clamping_factor` | working after drift fix | +| Image Width | do not author | n/a | `image_width` | render-pass-derived | +| Image Height | do not author | n/a | `image_height` | render-pass-derived | + +## Parameter Location Classification + +The Render Settings LOP must not absorb every MoonRay or USD setting. Not every `moonray:*` attribute belongs on `RenderSettings`. + +| Area | Example | Correct USD location | USD kind | MoonRay/RDL target | Should this Render Settings LOP author it? | Correct authoring path | Status | +|------|---------|----------------------|----------|--------------------|--------------------------------------------|------------------------|--------| +| Render settings | pixel samples | RenderSettings prim | `moonray:sceneVariable:*` attr | SceneVariables | yes | custom Render Settings LOP | verify/working | +| Render output/AOV | beauty/color | RenderVar + RenderProduct orderedVars | UsdRenderVar | RenderOutput | yes for validated outputs | AOV tab / RenderVar authoring | Beauty only | +| Geometry settings | `moonray:mesh_resolution` | geometry prim | primvar or namespaced prim attr | RDL geometry setting | no | LOP wrangle / geometry settings node | document only | +| Camera/DOF settings | DOF enable/focus/aperture depending on native behavior | camera prim or RenderSettings depending on proven path | camera attr or SceneVariable | Camera / SceneVariables | only if native path proves it | match H20.5 generic/native | audit | +| Light settings | MoonRay light attrs | light prim | namespaced attrs | RDL light | no | light LOP / light-specific UI | document only | +| Material settings | material/shader attrs | material/shader prim | shader inputs | RDL material | no | material network | document only | +| Debug/RDLA output | RDLA dump path/options | RenderSettings/delegate setting if proven | renderer/debug setting | hdMoonRay/debug | yes, Advanced/Debug only | custom Render Settings LOP | verify | + +Do not expose `moonray:mesh_resolution` in the Render Settings LOP as a global render setting. Geometry, light, material, and camera prim-level settings belong on their own prims unless Houdini 20.5 native/generic behavior proves otherwise. + +## Beauty RenderVar and AOV Status + +Beauty is the only exposed AOV for now. + +Current custom Beauty RenderVar: + +```text +Path: /Render/Products/Vars/beauty +sourceName = color +sourceType = raw +dataType = color3f +driver:parameters:aov:name = color +driver:parameters:aov:format = color3f +driver:parameters:aov:multiSampled = 0 +driver:parameters:aov:clearValue = 0 +``` + +Generic Houdini 20.5 RenderVar extras now aligned: + +- `sourceType = raw`. +- `driver:parameters:aov:format = color3f`. +- `driver:parameters:aov:multiSampled = 0`. +- `driver:parameters:aov:clearValue = 0`. + +Houdini `customData` appears to be UI/editor metadata and should not be hand-copied unless the integration deliberately adopts the generic/Edit Properties infrastructure. + +Non-beauty AOV status: + +- Hidden/deferred. +- Do not expose until production `HdMoonrayRendererPlugin` returns nonzero buffers through USD Render ROP/husk. +- Debug/local path filling non-beauty buffers is not enough for artist UI exposure. +- If the production path produces zero-filled buffers, classify that as backend payload unresolved, not UI-ready. + +## USD Render ROP Integration + +Houdini 20.5 USD Render ROP parameter names for both LOP `usdrender_rop` and OUT `usdrender`: + +- `renderer`. +- `loppath`. +- `rendersettings`. +- `outputimage`. + +Houdini 20.5 `husk --list-renderers` sees: + +- `HdMoonrayRendererPlugin (Moonray)`. +- `HdMoonrayRendererDebugPlugin (Moonray (debug))`. + +Houdini 20.5 USD Render ROP menu shows Moonray. The smoke test used the LOP `usdrender_rop` path: + +```text +renderer = HdMoonrayRendererPlugin +loppath = /stage/moonrayrendersettings1 +rendersettings = /Render/rendersettings +outputimage = "" +``` + +Output path: + +```text +/tmp/moonray_render_settings_alignment_after/rop_product.0001.exr +``` + +The smoke output was black, so it should be treated as wiring/output creation evidence only. + +## USD Render ROP Auto-Creation Policy + +The MoonRay Render Settings LOP intentionally auto-creates a matching USD Render ROP LOP node on node creation. This is part of the desired integrated artist workflow: creating the render settings node should immediately leave the offline render path ready to use. + +The custom LOP authors `/Render/rendersettings` and the RenderProduct controls the final image output path. The auto-created `usdrender_rop` LOP is an execution wrapper connected below the settings LOP and pointed at that authored RenderSettings prim. The ROP `outputimage` parameter is deliberately left blank so `RenderProduct.productName` remains the source of truth for output path and `$F4` behavior. + +Houdini 20.5 ROP details: + +```text +Context: same LOP network as the MoonRay Render Settings LOP +Node type: usdrender_rop +renderer = HdMoonrayRendererPlugin +loppath = +rendersettings = /Render/rendersettings +outputimage = "" +``` + +Ownership is recorded on the ROP with userData: + +```text +moonray_render_settings_lop = +moonray_render_settings_operator = Lop::DW_MOONRAY::moonrayrendersettings::1 +moonray_render_settings_lop_session_id = +``` + +The deterministic LOP ROP node name is based on the MoonRay Render Settings LOP node name: + +```text +/stage/moonrayrendersettings1_usdrender +``` + +The creation/update helper is idempotent and non-destructive: + +- If the owned `usdrender_rop` exists, update it. +- If it does not exist, create it in the same LOP network. +- Running the helper repeatedly must not create duplicates. +- Do not overwrite unrelated user-created USD Render ROP LOPs. +- If the deterministic name already exists but is not owned by the MoonRay Render Settings LOP, create a unique safe name instead. +- Multiple MoonRay Render Settings LOPs should each create a distinct owned ROP. + +Rename behavior: + +- During the current Houdini session, the helper stores the owning LOP session id and can update the owned ROP after a LOP rename. +- Across saved/reloaded sessions, robust rename recovery may be limited if the old path and session id no longer identify the owner. In that case, the repair helper should avoid overwriting unrelated ROPs and create/update only clearly owned ROPs. + +An optional `Create / Update USD Render ROP` repair button calls the same helper used by the HDA `OnCreated` event. It is a secondary repair/update affordance, not a replacement for automatic ROP creation. + +Do not auto-create or update ROPs during normal cook or ordinary parameter changes. + +## Design Guidelines + +- Native Solaris first. +- Use Houdini 20.5 Generic Render Settings as UX/layout reference. +- Expose curated artist controls, not raw metadata dumps. +- Group by task, not JSON order. +- Do not show broken or unverified controls in main artist tabs. +- Put debug/RDLA/internal controls in Advanced/Debug. +- AOV tabs should expose only production-proven outputs. +- Defaults should match Houdini 20.5 Generic/Native or MoonRay defaults unless deliberately changed. +- No node creation Python errors. +- No callback errors on missing camera/path. +- No source/install drift between HDA UI and cook-time Python. + +Suggested grouping: + +- Output / Product. +- Camera / Resolution. +- Sampling. +- Ray Depth / Path. +- Lighting. +- Volumes. +- Filtering / Textures. +- Clamping / Fireflies. +- AOVs. +- Advanced / Debug. + +## MoonRay Parameter Discovery + +Parameter discovery for this pass used Houdini 20.5 only. Houdini 21 behavior is intentionally out of scope. + +Sources inspected: + +- `/Applications/MoonRay/installs/openmoonray/coredata/SceneVariables.json` +- `/Applications/MoonRay/installs/openmoonray/coredata/RenderOutput.json` +- `/Applications/MoonRay/installs/openmoonray/plugin/houdini/soho/parameters/HdMoonrayRendererPlugin_Global.ds` +- `moonray/hydra/hdMoonray/lib/hydramoonray/RenderSettings.cc` +- `moonray/hydra/hdMoonray/lib/hydramoonray/RenderBuffer.cc` +- `moonray/hydra/hdMoonray/lib/hydramoonray/RenderDelegate.cc` +- `moonray/moonray_dcc_plugins/houdini/python3.11libs/moonray_render_settings.py` +- The generated `Lop::DW_MOONRAY::moonrayrendersettings::1` parameter template. +- Houdini 20.5 `rendersettings`, `karmarenderproperties`, `usdrender_rop`, and `usdrender` parameter templates through HOM. + +Inventory counts: + +- `SceneVariables.json`: 112 attributes. +- `RenderOutput.json`: 37 attributes. +- Current custom MoonRay Render Settings LOP: 50 curated SceneVariable parameters plus Beauty RenderVar authoring. + +Method: + +- Use `SceneVariables.json` as the authoritative MoonRay type/default/enum source for RDL `SceneVariables`. +- Use `HdMoonrayRendererPlugin_Global.ds` as the Houdini 20.5 UI grouping/label/help source where it exposes global render settings. +- Use `RenderSettings.cc` to prove the supported USD render-settings path: `moonray:sceneVariable:` or `sceneVariable_` on the RenderSettings prim, excluding `camera`, `motion_steps`, `enable_motion_blur`, `layer`, `image_width`, and `image_height`. +- Use USD Render docs to decide whether a setting belongs on `RenderSettings`, `RenderProduct`, or `RenderVar`. +- Use `RenderBuffer.cc` and `RenderOutput.json` to classify AOV/output settings but not expose non-beauty AOVs until production-filled buffers are proven. + +Important boundary: + +Not every MoonRay parameter belongs in this LOP. This node authors a Solaris render contract plus curated MoonRay global renderer settings. Geometry, light, camera-prim, and material/shader settings remain outside this node even if they use `moonray:*` names elsewhere. + +## Parameter Inventory + +This table is a summarized inventory of the parameters relevant to the MoonRay Render Settings LOP decision. The complete raw discovery set is the 112 `SceneVariables` plus 37 `RenderOutput` attributes listed in the metadata files above. + +| Source | Raw name | Label | Type | Default | Menu/range | Docs/help | MoonRay/RDL target | USD location | Current custom LOP status | Recommended UI status | Recommended tab | Notes | +|--------|----------|-------|------|---------|------------|-----------|--------------------|--------------|---------------------------|-----------------------|-----------------|-------| +| SceneVariables.json | `sampling_mode` | Sampling Mode | Int enum | `uniform=0` | `uniform=0`, `adaptive=2` | Controls uniform/adaptive sampling. | SceneVariables | RenderSettings prim | exposed/authored as token menu | expose main UI; keep H20.5 token/int validation note | Sampling | RDLA prints enum token; metadata type is Int. | +| SceneVariables.json | `light_sampling_mode` | Light Sampling Mode | Int enum | `uniform=0` | `uniform=0`, `adaptive=1` | Controls light sampling scheme. | SceneVariables | RenderSettings prim | exposed/authored as token menu | expose main UI | Sampling | RDLA-proven in current prototype. | +| SceneVariables.json | `light_sampling_quality` | Light Sampling Quality | Float | `0.5` | `0..1` artist range | Adaptive light sampling quality. | SceneVariables | RenderSettings prim | newly exposed | expose main UI | Sampling | Disabled unless Light Sampling Mode is adaptive. | +| SceneVariables.json | `pixel_samples` | Pixel Samples | Int | `8` | positive int | Primary samples in uniform mode. | SceneVariables | RenderSettings prim | exposed | expose main UI | Sampling | Existing curated control. | +| SceneVariables.json | `light_samples` | Light Samples | Int | `2` | positive int | Samples per light at primary intersection. | SceneVariables | RenderSettings prim | exposed | expose main UI | Sampling | Existing curated control. | +| SceneVariables.json | `bsdf_samples` | BSDF Samples | Int | `2` | positive int | BSDF lobe samples. | SceneVariables | RenderSettings prim | exposed | expose main UI | Sampling | Existing curated control. | +| SceneVariables.json | `bssrdf_samples` | BSSRDF Samples | Int | `2` | positive int | BSSRDF samples. | SceneVariables | RenderSettings prim | exposed | expose main UI | Sampling | Existing curated control. | +| SceneVariables.json | `min_adaptive_samples` | Min Adaptive Samples | Int | `16` | positive int | Adaptive-only min samples. | SceneVariables | RenderSettings prim | exposed | expose main UI | Sampling | Disabled unless Sampling Mode is adaptive. | +| SceneVariables.json | `max_adaptive_samples` | Max Adaptive Samples | Int | `4096` | positive int | Adaptive-only max samples. | SceneVariables | RenderSettings prim | exposed | expose main UI | Sampling | Disabled unless Sampling Mode is adaptive. | +| SceneVariables.json | `target_adaptive_error` | Target Adaptive Error | Float | `10.0` | positive float | Adaptive target error. | SceneVariables | RenderSettings prim | exposed/RDLA-proven | expose main UI | Sampling | Keep float typed to avoid old long-long issue. | +| SceneVariables.json | `lock_frame_noise` | Lock Frame Noise | Bool | `false` | toggle | Locks RNG seed across frames. | SceneVariables | RenderSettings prim | newly exposed | expose main UI | Sampling | Useful animation/render setting. | +| SceneVariables.json | `batch_tile_order` | Batch Tile Order | Int enum | `morton=4` | tile order enum | Batch tile scheduling. | SceneVariables | RenderSettings prim | exposed/authored as token menu | expose main UI | Tile Order | RDLA enum tokens acceptable in current path. | +| SceneVariables.json | `progressive_tile_order` | Progressive Tile Order | Int enum | `morton=4` | tile order enum | Progressive tile scheduling. | SceneVariables | RenderSettings prim | exposed/authored as token menu | expose main UI | Tile Order | Existing curated control. | +| SceneVariables.json | `checkpoint_tile_order` | Checkpoint Tile Order | Int enum | `morton=4` | tile order enum | Checkpoint tile scheduling. | SceneVariables | RenderSettings prim | exposed/authored as token menu | expose main UI | Tile Order | Existing curated control; checkpoint controls otherwise deferred. | +| SceneVariables.json | `max_depth` family | Max Ray Depth family | Int | metadata defaults | positive int | Ray/path depth limits. | SceneVariables | RenderSettings prim | exposed | expose main UI | Ray Depth / Path | Includes diffuse/glossy/mirror/presence/hair/volume. | +| SceneVariables.json | `max_subsurface_per_path` | Max Subsurface Per Path | Int | `1` | positive int | Subsurface path limit. | SceneVariables | RenderSettings prim | exposed | expose main UI | Ray Depth / Path | Existing curated control. | +| SceneVariables.json | `russian_roulette_threshold` | Russian Roulette Threshold | Float | `0.0375` | positive float | Path continuation threshold. | SceneVariables | RenderSettings prim | exposed | expose main UI | Ray Depth / Path | Existing curated control. | +| SceneVariables.json | `transparency_threshold` | Transparency Threshold | Float | `1.0` | positive float | Transparency stop threshold. | SceneVariables | RenderSettings prim | exposed | expose main UI | Ray Depth / Path | Existing curated control. | +| SceneVariables.json | `presence_threshold` | Presence Threshold | Float | `0.999` | positive float | Presence stop threshold. | SceneVariables | RenderSettings prim | exposed | expose main UI | Ray Depth / Path | Existing curated control. | +| SceneVariables.json | `presence_quality` | Presence Quality | Float | `0.75` | positive float | Stochastic presence threshold. | SceneVariables | RenderSettings prim | exposed | expose main UI | Ray Depth / Path | Existing curated control. | +| SceneVariables.json | `disable_optimized_hair_sampling` | Disable Optimized Hair Sampling | Bool | `false` | toggle | Forces independent hair BSDF lobe sampling. | SceneVariables | RenderSettings prim | newly exposed | expose Advanced | Advanced / Debug | Useful but not core artist first-pass. | +| SceneVariables.json | `sample_clamping_value` | Sample Clamping Value | Float | `10.0` | positive float | Radiance sample clamp. | SceneVariables | RenderSettings prim | exposed | expose main UI | Clamping / Fireflies | Existing curated control. | +| SceneVariables.json | `sample_clamping_depth` | Sample Clamping Depth | Int | `1` | positive int | Clamp after depth. | SceneVariables | RenderSettings prim | exposed | expose main UI | Clamping / Fireflies | Existing curated control. | +| SceneVariables.json | `roughness_clamping_factor` | Roughness Clamping Factor | Float | `0.0` | `0..10` artist range | Indirect roughness clamp/firefly reduction. | SceneVariables | RenderSettings prim | exposed/RDLA-proven | expose main UI | Clamping / Fireflies | Mirrored from generic MoonRay tab. | +| SceneVariables.json | `volume_*` curated group | Volume settings | Float/Int/enum | metadata defaults | metadata enums | Global volume quality/overlap/indirect settings. | SceneVariables | RenderSettings prim | exposed | expose main UI | Volumes | Artist-useful volume group only; deep output separate. | +| SceneVariables.json | `texture_blur`, `pixel_filter_width`, `pixel_filter` | Filtering / Textures | Float/enum | metadata defaults | metadata enum | Texture/pixel filtering. | SceneVariables | RenderSettings prim | exposed | expose main UI | Filtering / Textures | Existing curated controls. | +| SceneVariables.json | `enable_dof` | Enable DOF | Bool | `true` | toggle | Global DOF enable. | SceneVariables | RenderSettings prim | exposed/RDLA-proven | expose main UI | Global Toggles | Camera focus/aperture remain camera prim settings. | +| SceneVariables.json | `enable_displacement`, `enable_subsurface_scattering`, `enable_shadowing`, `enable_presence_shadows`, `lights_visible_in_camera`, `propagate_visibility_bounce_type`, `shadow_terminator_fix` | Global toggles | Bool/enum | metadata defaults | metadata enum | Global production toggles. | SceneVariables | RenderSettings prim | exposed | expose main UI | Global Toggles | Keep curated; do not include all debug/internal toggles. | +| SceneVariables.json | `image_width`, `image_height` | Image dimensions | Int | `1920`, `1080` | n/a | Image dimensions. | SceneVariables | do not author here | not exposed | do not include in this LOP | n/a | Excluded by `RenderSettings.cc`; use USD RenderSettings resolution. | +| SceneVariables.json | `scene_scale` | Scene Scale | Float | `0.01` | n/a | World unit scale. | SceneVariables | do not author here | not exposed | document only | n/a | Unit-policy work deferred. | +| SceneVariables.json | `enable_motion_blur`, `motion_steps`, `fps`, `slerp_xforms` | Motion blur settings | Bool/Float/Vector | metadata defaults | n/a | Motion sampling. | SceneVariables | unknown/special-case | hidden | hide/defer | n/a | `enable_motion_blur` and `motion_steps` are special-cased/excluded in hdMoonRay. | +| SceneVariables.json | checkpoint/resume/deep settings | Checkpoint/deep output | mixed | metadata defaults | mixed | Output/deep/checkpoint internals. | SceneVariables | RenderSettings prim or output workflow | hidden | hide/defer | n/a | Needs separate render execution/deep/checkpoint pass. | +| SceneVariables.json | `output_file`, `primary_aov` | MoonRay native output linkage | String/SceneObject* | metadata defaults | n/a | Native MoonRay output path/AOV linkage. | RenderOutput/SceneVariables | do not author here | hidden | do not include in this LOP | n/a | Use USD RenderProduct.productName and RenderVars. | +| RenderOutput.json | `result`, `state_variable`, `material_aov`, `lpe`, `denoise`, `denoiser_input` | RenderOutput attrs | mixed | metadata defaults | metadata enums | AOV/output realization. | RenderOutput | RenderVar prim / backend output path | hidden except Beauty metadata | needs backend proof | AOVs | Non-beauty AOVs deferred. | +| hdMoonRay delegate | `rdlOutput` | Debug RDL/RDLA Output | String | blank | file path | Debug scene export. | delegate/debug setting | delegate/debug setting | exposed debug-only | expose Debug | Advanced / Debug | Not final image output. | +| Geometry prim attrs | `moonray:mesh_resolution` etc. | Geometry settings | mixed | n/a | n/a | Geometry tessellation/subdivision. | RDL geometry | geometry prim | not applicable | do not include in this LOP | n/a | Belongs to Render Geometry Settings. | +| Light prim attrs | per-light `moonray:*` | Light settings | mixed | n/a | n/a | Per-light MoonRay attrs. | RDL light | light prim | not applicable | do not include in this LOP | n/a | Belongs to light-specific UI. | +| Material/shader attrs | shader inputs | Material settings | mixed | n/a | n/a | Material behavior. | RDL material | material/shader prim | not applicable | do not include in this LOP | n/a | Belongs to material networks. | + +## Exposed Parameters + +Current exposed/custom-authored settings after discovery: + +| Tab | Label | Parm name | USD attr / relationship | USD type | Default | Source for type/default | Validation status | +|-----|-------|-----------|-------------------------|----------|---------|-------------------------|------------------| +| Output / Product | RenderSettings Primitive Path | `render_settings_prim` | RenderSettings prim path | path | `/Render/rendersettings` | H20.5 Generic/Karma pattern | validated previously | +| Output / Product | RenderProducts Parent Primitive Path | `render_products_parent_prim` | RenderProduct parent path | path | `/Render/Products` | H20.5 Karma pattern | validated previously | +| Output / Product | RenderVars Parent Primitive Path | `render_vars_parent_prim` | RenderVar parent path | path | `/Render/Products/Vars` | H20.5 Karma pattern | validated previously | +| Output / Product | Output Picture | `product_name` | `RenderProduct.productName` | token | `$HIP/render/$HIPNAME.$OS.$F4.exr` | USD RenderProduct / H20.5 Karma pattern | validated previously | +| Camera / Resolution | Camera | `camera` | `RenderSettings.camera` relationship | rel | `/cameras/camera1` | H20.5 Karma pattern | validated previously | +| Camera / Resolution | Resolution Mode | `resolution_mode_note` | UI note only | n/a | Manual Resolution | H20.5 lifecycle cleanup decision | computed modes intentionally removed | +| Camera / Resolution | Resolution | `resolution` | `RenderSettings.resolution` | `int2` | `1920, 1080` | USD RenderSettings | validated previously | +| AOVs | Beauty | `aov_beauty` | `RenderProduct.orderedVars` + Beauty RenderVar | RenderVar | enabled | USD RenderVar + H20.5 generic parity | Beauty metadata validated; filled-pixel proof deferred | +| Sampling | Sampling Mode | `sceneVariable_sampling_mode` | `moonray:sceneVariable:sampling_mode` | token-authored enum | `uniform` | SceneVariables metadata | RDLA token path proven for enum style | +| Sampling | Light Sampling Mode | `sceneVariable_light_sampling_mode` | `moonray:sceneVariable:light_sampling_mode` | token-authored enum | `uniform` | SceneVariables metadata | RDLA-proven | +| Sampling | Light Sampling Quality | `sceneVariable_light_sampling_quality` | `moonray:sceneVariable:light_sampling_quality` | float | `0.5` | SceneVariables metadata | newly added; needs RDLA validation | +| Sampling | Pixel/Light/BSDF/BSSRDF Samples | `sceneVariable_*_samples` | `moonray:sceneVariable:*` | int | metadata defaults | SceneVariables metadata | validated previously for representative attrs | +| Sampling | Min/Max Adaptive Samples, Target Adaptive Error | `sceneVariable_min_adaptive_samples`, etc. | `moonray:sceneVariable:*` | int/float | metadata defaults | SceneVariables metadata | validated previously for target error | +| Sampling | Lock Frame Noise | `sceneVariable_lock_frame_noise` | `moonray:sceneVariable:lock_frame_noise` | bool | false | SceneVariables metadata | newly added; needs RDLA validation | +| Tile Order | Batch/Progressive/Checkpoint Tile Order | `sceneVariable_*_tile_order` | `moonray:sceneVariable:*` | token-authored enum | `morton` | SceneVariables metadata | validated previously for authored attrs | +| Ray Depth / Path | Ray depth/path controls | `sceneVariable_max_*`, thresholds | `moonray:sceneVariable:*` | int/float | metadata defaults | SceneVariables metadata | validated previously for representative attrs | +| Clamping / Fireflies | Sample/Roughness clamps | `sceneVariable_sample_clamping_*`, `sceneVariable_roughness_clamping_factor` | `moonray:sceneVariable:*` | int/float | metadata defaults | SceneVariables metadata / generic MoonRay tab | roughness RDLA-proven | +| Volumes | Volume group | `sceneVariable_volume_*` | `moonray:sceneVariable:*` | int/float/token | metadata defaults | SceneVariables metadata / Global.ds | authored; representative validation needed | +| Filtering / Textures | Texture blur / pixel filter controls | `sceneVariable_texture_blur`, etc. | `moonray:sceneVariable:*` | float/token | metadata defaults | SceneVariables metadata / Global.ds | authored; representative validation needed | +| Global Toggles | Production toggles | `sceneVariable_enable_*`, etc. | `moonray:sceneVariable:*` | bool/token | metadata defaults | SceneVariables metadata / Global.ds | `enable_dof` RDLA-proven | +| Advanced / Debug | Disable Optimized Hair Sampling | `sceneVariable_disable_optimized_hair_sampling` | `moonray:sceneVariable:disable_optimized_hair_sampling` | bool | false | SceneVariables metadata | newly added; needs RDLA validation | +| Advanced / Debug | Debug RDL/RDLA Output | `rdlOutput` | `rdlOutput` | string | blank | hdMoonRay delegate setting | validated previously | + +## Hidden / Deferred Parameters + +| Parameter/group | Reason | Correct authoring location | Future work | +|-----------------|--------|----------------------------|-------------| +| `image_width`, `image_height` | Excluded in hdMoonRay `RenderSettings.cc`; dimensions are driven by USD RenderSettings/Hydra framing. | `RenderSettings.resolution`, not `moonray:sceneVariable:*` | none for this LOP | +| `scene_scale` | Unit policy is not settled; broad risk to lights, SSS, camera, materials. | renderer/unit-policy task | dedicated units pass | +| `motion_steps`, `enable_motion_blur`, `fps`, `slerp_xforms` | hdMoonRay has special handling/exclusions; motion blur path not validated for this UI. | future motion blur/settings pass | audit and implement separately | +| Checkpoint/resume settings | Execution/output behavior, not first-pass RenderSettings authoring. | future ROP/execution workflow | checkpoint pass | +| Deep output settings | Deep output is AOV/output-system work. | future AOV/deep pass | defer | +| Texture cache/file handles | Performance/cache policy and environment-sensitive. | Advanced only after validation | defer | +| `output_file`, `primary_aov`, `two_stage_output` | Native MoonRay output wiring conflicts with USD RenderProduct model unless carefully designed. | RenderProduct/ROP/backend output design | defer | +| `machine_id`, `num_machines`, `task_distribution_type`, `athena_debug` | Arras/internal/debug. | backend/Arras context | do not include | +| `max_geometry_resolution`, `enable_max_geometry_resolution`, `fast_geometry_update` | Geometry/procedural behavior, not artist render contract. | geometry/procedural settings | document only | +| Non-beauty RenderOutputs/AOVs | Production delegate filled-pixel proof missing. | RenderVar + backend AOV pipeline | future AOV pass | + +## Geometry / Camera / Light / Material Boundaries + +- `moonray:mesh_resolution` is geometry-level and must not be exposed in this Render Settings LOP. +- Per-light MoonRay attributes belong on light prims or light-specific tooling. +- Material/shader attributes belong in material networks. +- Camera focal/aperture/focus settings belong on camera prims unless Houdini 20.5 native/generic behavior proves a different RenderSettings-level path. +- The global `enable_dof` SceneVariable is included because it is a real SceneVariable and RDLA-proven through `moonray:sceneVariable:enable_dof`; it does not replace camera prim DOF controls. + +## Final Tab Architecture + +| Final tab | Purpose | Parameters to include | Parameters explicitly excluded | Notes | +|----------|---------|-----------------------|-------------------------------|-------| +| Output / Product | USD render contract and output path | RenderSettings path, products parent, vars parent, output picture, optional advanced product/beauty names | Native MoonRay `output_file`, `primary_aov` | RenderProduct.productName remains final image output source. | +| Camera / Resolution | Render camera and offline resolution | Camera, manual resolution note, resolution | computed width/height modes, `image_width`, `image_height`, camera lens/focus attrs | Uses USD RenderSettings resolution and camera rel. | +| Sampling | Main sampling controls | sampling mode, light sampling mode/quality, sample counts, adaptive controls, lock frame noise | unrelated debug RNG/internal controls | Adaptive controls disabled when inactive. | +| Ray Depth / Path | Path limits and thresholds | max depth family, subsurface per path, russian roulette, transparency/presence threshold/quality | geometry resolution limits | SceneVariables only. | +| Lighting | Global lighting behavior if it remains useful as a separate tab | currently no separate tab; light sampling lives in Sampling and lights visibility in Global Toggles | per-light attrs | Keep per-light UI elsewhere. | +| Volumes | Global volume controls | volume quality/shadow/illumination/opacity/overlap/factors/indirect samples | deep output settings | Uses useful volume group from metadata/DS. | +| Filtering / Textures | Texture/pixel filtering | texture blur, pixel filter width/type | texture cache/file handles for now | Cache controls deferred. | +| Clamping / Fireflies | Firefly reduction | sample clamp value/depth, roughness clamping factor | none currently | Roughness clamp mirrored from generic MoonRay tab. | +| AOVs | Artist AOV checkboxes | Beauty only | albedo/normal/depth/OIDN/Cryptomatte | Non-beauty hidden until production buffers are filled. | +| Advanced / Debug | Troubleshooting/low-level controls | disable optimized hair sampling, debug RDL/RDLA output | Arras/internal/debug dumps | Keep sparse. | + +## What Still Remains + +- Non-beauty AOV backend payload work and filled-pixel validation. +- Possible separate geometry settings LOP or expanded geometry tooling. +- Possible light/material-specific UI passes. +- Production filled Beauty proof, distinct from output-file smoke proof. +- Install/runtime tooling to prevent HDA UI and cook-time Python drift. + +## HDA Lifecycle and Node Graph Mutation Policy + +The MoonRay Render Settings LOP has a small amount of node-graph automation: when the LOP is created, it creates a connected LOP `usdrender_rop` configured for `HdMoonrayRendererPlugin`. This lifecycle policy documents where node graph mutation is allowed and where it is forbidden. + +Validation target: + +```bash +/Applications/Houdini/Houdini20.5.584/Frameworks/Houdini.framework/Versions/20.5/Resources/bin/hython \ + /Applications/MoonRay/openmoonray/moonray/moonray_dcc_plugins/houdini/tests/dev_validate_moonray_render_settings_lop.py +``` + +Current validation summary: + +```text +PASS=44 +FAIL=0 +SKIP=6 +``` + +Skipped tests: + +- `raw_hom_copy_lop_only`: Houdini HOM copy of an existing node does not run `OnCreated`; press the repair button on the copied LOP. +- `moonray_menu_tool_creation_path`: requires graphical Houdini 20.5 `hou.ui` interaction; hython cannot exercise the real MoonRay Tab/shelf UI path. +- `digital_assets_creation_path`: requires graphical Houdini 20.5 Tab menu interaction; hython can report the operator definition but cannot click the Digital Assets entry. +- `mixed_menu_path_two_node_sharing`: requires graphical Houdini 20.5 creation from both menu presentation paths. +- `undo_redo_creation`: Hython does not provide a reliable UI undo/redo event test for this lifecycle; validate manually in Houdini UI if needed. +- `rdla_scenevariable_receipt`: The optional RDLA smoke test timed out in the dev harness. This is not a lifecycle failure and should be rerun manually when render/RDLA timing is stable. + +### Python Entry Points + +| Entry point | File/location | When it runs | What it mutates | Safe? | Notes | +|------------|---------------|--------------|-----------------|-------|-------| +| HDA `OnCreated` | `Lop::DW_MOONRAY::moonrayrendersettings::1.hda` section `OnCreated` | Fresh MoonRay Render Settings LOP creation | Creates or updates one owned connected LOP `usdrender_rop` | Yes | Does not run on file load or HDA definition reload in H20.5 validation. | +| `author_from_node()` | `houdini/python3.11libs/moonray_render_settings.py` | HDA Python cook/export | USD stage only | Yes | Must not create, delete, rename, or wire Houdini nodes. | +| `create_or_update_usd_render_rop()` | `houdini/python3.11libs/moonray_render_settings.py` | HDA `OnCreated` and explicit repair button | Owned LOP `usdrender_rop` only | Yes | Idempotent; preserves unrelated ROPs. | +| `resolution_mode_note` label | generated HDA parameter | Display only | Nothing | Yes | Computed resolution mode callbacks were removed; manual resolution only. | +| resolution preset callback | generated HDA parameter tag | Resolution preset menu use | Resolution parameter values only | Yes | No ROP creation. | +| `Create / Update USD Render ROP` button callback | generated HDA parameter tag | Explicit user button press | Owned LOP `usdrender_rop` only | Yes | Repair/update affordance. | +| `MoonRayTools.shelf` tool | `houdini/toolbar/MoonRayTools.shelf` | Shelf/tab tool creation | Creates MoonRay Render Settings LOP via `loptoolutils.genericTool` | Yes | Shelf/tool behavior only; not cook-time behavior. | +| Module import | `moonray_render_settings.py` | Python import | Nothing | Yes | Import-time code must remain side-effect free. | +| `regenerate_hda()` | `moonray_render_settings.py` | Explicit developer regeneration | Creates temporary source node and HDA definition | Yes for dev only | Not a runtime artist action. | + +### Allowed Mutation Points + +- HDA `OnCreated` may create one owned LOP `usdrender_rop` for a fresh MoonRay Render Settings LOP. +- The explicit `Create / Update USD Render ROP` button may create, repair, or reconnect the owned LOP `usdrender_rop`. +- Shelf/tool creation may create the MoonRay Render Settings LOP through Houdini's `loptoolutils.genericTool`. + +### Forbidden Mutation Points + +- Cook/export must not create, delete, rename, connect, or rewire Houdini nodes. +- Ordinary parameter changes must not create ROPs. +- File load must not create extra ROPs. +- HDA definition reload must not create extra ROPs. +- Import-time code must not mutate the scene. +- Unrelated user-created `usdrender_rop` nodes must never be overwritten. + +### Owned USD Render ROP Model + +The owned ROP is a LOP `usdrender_rop`, not an `/out/usdrender` node. + +Owned ROP values: + +```text +renderer = HdMoonrayRendererPlugin +loppath = +rendersettings = /Render/rendersettings +outputimage = "" +``` + +Ownership userData keys: + +```text +moonray_render_settings_lop = +moonray_render_settings_operator = Lop::DW_MOONRAY::moonrayrendersettings::1 +moonray_render_settings_lop_session_id = +``` + +The helper uses the owner path, owner operator type, and session id to identify the owned ROP. The session id lets repair recover after renaming the owning LOP during the same Houdini session. A comment is also written on the ROP for human inspection. + +### Operator Registration / Menu Entry Policy + +Houdini 20.5 HOM sees one MoonRay Render Settings LOP operator definition: + +| Menu entry | Operator type | Label | Definition path | Source mechanism | Creates node type | Stale/duplicate? | Recommended action | +|------------|---------------|-------|-----------------|------------------|-------------------|------------------|--------------------| +| Digital Assets entry | `Lop::DW_MOONRAY::moonrayrendersettings::1` | MoonRay Render Settings | `/Applications/MoonRay/installs/openmoonray/plugin/houdini/otls/Lop::DW_MOONRAY::moonrayrendersettings::1.hda` | Houdini generic HDA fallback/category listing | Same operator type | Not a second definition | Document; do not delete. | +| MoonRay shelf/tab entry | `Lop::DW_MOONRAY::moonrayrendersettings::1` | MoonRay Render Settings | same installed HDA path | `MoonRayTools.shelf` using `loptoolutils.genericTool` | Same operator type | Intended renderer-specific tool path | Keep. | + +The observed `Digital Assets` and `MoonRay` entries are menu presentation paths for the same installed operator definition, not two separate MoonRay Render Settings operators. Do not remove the generic Digital Assets entry blindly. Users should prefer the MoonRay shelf/tab entry, but both creation paths must create the same operator type and should be lifecycle-safe. + +Known installed/generated HDA paths observed during this work: + +```text +/Applications/MoonRay/installs/openmoonray/plugin/houdini/otls/Lop::DW_MOONRAY::moonrayrendersettings::1.hda +/Applications/MoonRay/source/openmoonray/moonray/moonray_dcc_plugins/houdini/otls/Lop::DW_MOONRAY::moonrayrendersettings::1.hda +``` + +The H20.5 validation runtime used the installed plugin HDA path. + +### USD Render ROP Initial Creation Policy + +Initial creation and the repair button use the same idempotent helper, `create_or_update_usd_render_rop()`. + +In graphical Houdini, `OnCreated` schedules only one deferred helper call through `hdefereval.executeDeferred`. The deferred pass exists because shelf/tool creation can finalize node naming, wiring, and placement after the HDA `OnCreated` hook starts. This avoids creating an incorrect intermediate ROP and then repairing it. The deferred call uses the same idempotent helper and the owning node session id, so it creates the final owned ROP in the same state as the explicit repair button. Hython does not provide `hdefereval`, so H20.5 command-line validation uses the immediate fallback path only. + +Manual graphical Houdini 20.5 validation is still required before claiming the MoonRay shelf/menu path and the Digital Assets menu path are fully fixed. The command-line harness proves direct HDA/HOM behavior and records UI-only creation paths as skipped, not passed. + +Expected initial creation behavior: + +- Create exactly one owned connected LOP `usdrender_rop`. +- Connect it below the owning MoonRay Render Settings LOP. +- Set `renderer = HdMoonrayRendererPlugin`. +- Set `loppath` to the owning MoonRay Render Settings LOP path. +- Set `rendersettings = /Render/rendersettings`. +- Leave `outputimage` blank so `RenderProduct.productName` remains the output path source of truth. +- Do not create `/out/usdrender`. +- Do not overwrite unrelated `usdrender_rop` nodes. + +The repair button is only a repair/update affordance. It should not be required after normal creation. H20.5 hython validation confirms initial creation already matches repair behavior for direct HDA node creation; manual UI validation should still be used for shelf/menu presentation quirks. + +Current validation also confirms: + +- ROP graph comparisons include `moonray_render_settings_lop`, `moonray_render_settings_operator`, and `moonray_render_settings_lop_session_id`. +- Two MoonRay Render Settings LOPs do not share the same owned `usdrender_rop`. +- Only the Beauty AOV checkbox is visible in the current H20.5 UI. +- Computed resolution mode parms and `loputils.computeResolutionParameter` / `loputils.updateResolutionParameters` callback references are absent. +- `image_width` and `image_height` are absent from the curated `SCENE_VARIABLES` list and are not authored as custom USD SceneVariables. + +### Lifecycle Scenario Summary + +| Scenario | Result | Notes | +|----------|--------|-------| +| Create one MoonRay Render Settings LOP | PASS | One owned connected `usdrender_rop` is created. | +| Click repair button twice | PASS | No duplicate ROPs. | +| Initial graph equals post-repair graph | PASS | Direct HDA creation matches repair state, including placement. | +| Create two MoonRay Render Settings LOPs | PASS | Two distinct owned ROPs. | +| Settings nodes share one ROP | PASS | They do not share; each settings node owns one distinct ROP. | +| Rename owning LOP, then repair | PASS | Owned ROP updates by session id. | +| Rename owned `usdrender_rop`, then repair | PASS | Renamed ROP is preserved and updated in place. | +| Delete owned `usdrender_rop`, then repair | PASS | Owned ROP is recreated. | +| Disconnect owned `usdrender_rop`, then repair | PASS | Owned ROP is rewired. | +| Raw HOM copy of LOP only | SKIP/limitation | `OnCreated` does not run for raw HOM copy; repair is required. | +| Duplicate LOP+ROP pair | PASS with limitation | Non-destructive; copied ROP may have stale ownership until repair refreshes it. | +| Unrelated colliding ROP | PASS | Existing unrelated Karma/usdrender ROP is preserved. | +| Fake/stale ownership ROP | PASS | Stale/fake ROP is preserved; new owned ROP is created. | +| Save/reopen file | PASS | No extra ROPs are created. | +| HDA definition reload | PASS | No extra ROPs are created. | +| Parameter change + cook | PASS | No node graph mutation. | +| `/out/usdrender` creation | PASS | None created. | +| MoonRay menu/tool path | SKIP | Requires graphical Houdini 20.5. | +| Digital Assets menu path | SKIP | Requires graphical Houdini 20.5. | +| One node from each menu path | SKIP | Requires graphical Houdini 20.5. | +| Undo/redo | SKIP | Needs manual UI validation; not reliable in hython. | + +### MoonRayTools.shelf Justification + +The `MoonRayTools.shelf` change is intentional and should be kept. It updates shelf/tab creation behavior so the tool is available in LOP viewer/network contexts and creates the node with Houdini's `loptoolutils.genericTool`, matching Solaris tool conventions better than direct `kwargs["node"].createNode(...)`. + +This shelf change: + +- Affects shelf/tab creation only. +- Is not cook-time behavior. +- Is not backend/AOV behavior. +- Is not responsible for `usdrender_rop` mutation during cook. + +### Known Accepted Limitations + +- Raw HOM copy/paste of only the MoonRay Render Settings LOP does not auto-create a ROP because `OnCreated` is not run; press the repair button. +- Duplicating a LOP+ROP pair can leave stale ownership userData on the copied ROP until repair is pressed. +- Undo/redo lifecycle behavior still needs manual UI validation. +- MoonRay shelf/menu creation and Digital Assets menu creation still need real graphical Houdini 20.5 validation. Do not claim those menu paths are fully fixed from hython evidence alone. +- These limitations are non-destructive and accepted for now. + +## Validation Checklist + +Future passes should validate: + +- [ ] Confirm Houdini 20.5 `hython` path. +- [ ] Confirm Houdini 20.5 `husk` path. +- [ ] Confirm `moonray_render_settings.__file__`. +- [ ] Confirm SceneVariables count. +- [ ] Confirm `enable_dof` is present. +- [ ] Regenerate HDA from repo source. +- [ ] Sync/install through a reproducible mechanism. +- [ ] Export generic/native USD. +- [ ] Export custom USD. +- [ ] Diff RenderSettings/Product/Var. +- [ ] Export RDLA. +- [ ] Verify `enable_dof` in RDLA. +- [ ] Verify `image_width` and `image_height` are not authored as USD SceneVariables. +- [ ] Verify manual resolution. +- [ ] Verify computed resolution modes remain removed. +- [ ] Verify no computed resolution callback tags remain. +- [ ] Verify USD Render ROP `renderer`, `loppath`, `rendersettings`, and `outputimage` wiring. +- [ ] Verify RenderProduct `$F4` output path behavior. +- [ ] Treat black/zero-filled renders as output-wiring evidence only, not filled-pixel Beauty/AOV proof. diff --git a/houdini/otls/Lop::DW_MOONRAY::moonrayrendersettings::1.hda b/houdini/otls/Lop::DW_MOONRAY::moonrayrendersettings::1.hda index 741101b50a7a2bac5ffcec86ece4321da124fb48..b6da7af967018d449efdf64fd5b2a3f3120cd1d1 100644 GIT binary patch delta 1232 zcmZux&u<%55VjL=8#}SxBz6pK-KiTPC$#wisO3;ZAZbLJw04_VRH(3e_C9Af-hFTT z_HB%dM9Kk9s3MvJ;()|IP(<;S0~|r1907?#;UD0LgoMQG4^f0zt+cE8=9`_F?|b|6 zPwDS|OMf&!dhVBR4lkUE9*s*G`R!g9`0)2KJyNOk#`U#ZsmE6a57XrXM}|oh9bZ+P zX};Z2wx?4mM-szIuxxXnEh$!|?4?rfkCbgB$gx%Fx?B)JT%>S636C{IT+Srm0RdMN zpm^nNt=PKl@P?;tDJFbM_=6H4Oc?%|erp^LO2@}sX>vnI&GD#s8t>+3@X=@JM>F7$#sof^%q~YC1gSuA zkJ$>e#s5MXYlD_4)6D>Bew;9-mAphJ~xL)6P2jK`^EaORsJA{7omV+vxdgG+>^H0g&Qb0EBM9c#=+|r7g2kT zy=!Uknd>=WM!0dH#+b=SnSFjf?z1C>R?_jol6`QQ7(m3MJjG)&4dv0M{#A~+eTx&m zw6GMGbclL~M6>k(%1oHB9LFu{AOSFaYZ{yN)71DBe*f$R{Pm3+I5Jloj@C|O@w02s z6&%^=8C}KP&=>a~u_3ZHS`DZQ{nYqtIhnt4U z+re%viw|3++$%|t9EI;%FW|k|{ETV)tnF|^(sEtl$Xp%@t4xDwY7=3knZJl=CCRxeL zUTA2coxuX^ga)MBWwvkz5cs?sIM5~clGFip>046jZ~@U*wwhNUIxAz)<`&zxrNXn9 zrtqCi4p+tj|FS1Zq1oY=)~Ph!JDD98_O6bQk5Lp6iw=2bvktF!l78Pw<*|+w4;I_2-eNaqFq#LYeDFg@FuxV(n<2-%X`!= zWOhP9#QNM75&waZt-qlDfw~f1xpUzk@MaoYk@`08a_+t7oOhD_@8*{S^YxWemp*rP z=Ozc&gWIP!4>oh)<$)gBkS_pm+yp_Y#&|S0H#yN?2a9$T%!A_u zQNo3E9D63@L?49dOucbTzr;OUqS-}>QEJyM*f@Gb{s3YUNN!`u3IFYeEbc1SMMwsz z{@K(!=V~>4HqiBglyyS1z`C9Xq|GxI9=hbU!`vQ$|M901kG|l_Q3%USPR;z={k}4;UyYXawJIW6KeR6f=%V>% QrKGFTJWUK|@8agrZ!UoJZU6uP diff --git a/houdini/python3.11libs/moonray_render_settings.py b/houdini/python3.11libs/moonray_render_settings.py index c826601..413cea1 100644 --- a/houdini/python3.11libs/moonray_render_settings.py +++ b/houdini/python3.11libs/moonray_render_settings.py @@ -16,11 +16,17 @@ BEAUTY_RENDER_VAR_NAME = "beauty" PRODUCT_NAME = "$HIP/render/$HIPNAME.$OS.$F4.exr" DEFAULT_RESOLUTION = (1920, 1080) +ROP_NODE_TYPE = "usdrender_rop" +ROP_RENDERER_TOKEN = "HdMoonrayRendererPlugin" +ROP_OWNER_LOP_KEY = "moonray_render_settings_lop" +ROP_OWNER_OPERATOR_KEY = "moonray_render_settings_operator" +ROP_OWNER_SESSION_KEY = "moonray_render_settings_lop_session_id" SCENE_VARIABLES = ( ("sampling_mode", Sdf.ValueTypeNames.Token), ("light_sampling_mode", Sdf.ValueTypeNames.Token), + ("light_sampling_quality", Sdf.ValueTypeNames.Float), ("pixel_samples", Sdf.ValueTypeNames.Int), ("light_samples", Sdf.ValueTypeNames.Int), ("bsdf_samples", Sdf.ValueTypeNames.Int), @@ -46,6 +52,8 @@ ("transparency_threshold", Sdf.ValueTypeNames.Float), ("presence_threshold", Sdf.ValueTypeNames.Float), ("presence_quality", Sdf.ValueTypeNames.Float), + ("lock_frame_noise", Sdf.ValueTypeNames.Bool), + ("disable_optimized_hair_sampling", Sdf.ValueTypeNames.Bool), ("volume_quality", Sdf.ValueTypeNames.Float), ("volume_shadow_quality", Sdf.ValueTypeNames.Float), ("volume_illumination_samples", Sdf.ValueTypeNames.Int), @@ -145,11 +153,27 @@ def author_from_node(node=None): beauty_var = UsdRender.Var.Define(stage, beauty_var_path) beauty_var.CreateDataTypeAttr().Set("color3f") beauty_var.CreateSourceNameAttr().Set("color") + beauty_var.CreateSourceTypeAttr().Set("raw") beauty_var.GetPrim().CreateAttribute( "driver:parameters:aov:name", Sdf.ValueTypeNames.String, custom=True, ).Set("color") + beauty_var.GetPrim().CreateAttribute( + "driver:parameters:aov:format", + Sdf.ValueTypeNames.Token, + custom=True, + ).Set("color3f") + beauty_var.GetPrim().CreateAttribute( + "driver:parameters:aov:multiSampled", + Sdf.ValueTypeNames.Bool, + custom=True, + ).Set(False) + beauty_var.GetPrim().CreateAttribute( + "driver:parameters:aov:clearValue", + Sdf.ValueTypeNames.Int, + custom=True, + ).Set(0) ordered_vars.append(beauty_var_path) _set_rel_targets(product, product.CreateOrderedVarsRel, ordered_vars) @@ -181,6 +205,106 @@ def author_from_node(node=None): ).Set(rdl_output) +def _safe_node_name(name): + return "".join(ch if ch.isalnum() or ch == "_" else "_" for ch in name) + + +def _owned_rop_for_lop(lop_node): + parent = lop_node.parent() + if parent is None: + return None + + lop_path = lop_node.path() + lop_session_id = str(lop_node.sessionId()) + fallback_by_path = None + fallback_by_session = None + for rop in parent.children(): + if rop.type().name() != ROP_NODE_TYPE: + continue + if rop.userData(ROP_OWNER_OPERATOR_KEY) != OPERATOR_TYPE: + continue + if rop.userData(ROP_OWNER_LOP_KEY) == lop_path: + return rop + if rop.userData(ROP_OWNER_SESSION_KEY) == lop_session_id: + fallback_by_session = rop + elif rop.parm("loppath") is not None and rop.parm("loppath").eval() == lop_path: + fallback_by_path = rop + return fallback_by_session or fallback_by_path + + +def _create_owned_rop(lop_node): + parent = lop_node.parent() + if parent is None: + raise hou.OperationFailed("MoonRay Render Settings LOP has no parent network.") + base_name = _safe_node_name(lop_node.name() + "_usdrender") + existing = parent.node(base_name) + if existing is not None: + if ( + existing.type().name() == ROP_NODE_TYPE + and existing.userData(ROP_OWNER_OPERATOR_KEY) == OPERATOR_TYPE + and existing.userData(ROP_OWNER_LOP_KEY) == lop_node.path() + ): + return existing + rop = parent.createNode(ROP_NODE_TYPE) + rop.setName(base_name, unique_name=True) + return rop + return parent.createNode(ROP_NODE_TYPE, base_name) + + +def create_or_update_usd_render_rop(lop_node=None): + """Create or update the USD Render ROP owned by this MoonRay Render Settings LOP.""" + + lop_node = lop_node or hou.pwd() + rop = _owned_rop_for_lop(lop_node) or _create_owned_rop(lop_node) + + settings_prim = _path(lop_node, "render_settings_prim", RENDER_SETTINGS_PRIM) + for parm_name, value in ( + ("renderer", ROP_RENDERER_TOKEN), + ("loppath", lop_node.path()), + ("rendersettings", settings_prim), + ("outputimage", ""), + ): + parm = rop.parm(parm_name) + if parm is not None: + parm.set(value) + + try: + rop.setInput(0, lop_node) + except hou.OperationFailed: + pass + try: + rop.setPosition(lop_node.position() + hou.Vector2(0, -1.0)) + except hou.OperationFailed: + pass + + rop.setUserData(ROP_OWNER_LOP_KEY, lop_node.path()) + rop.setUserData(ROP_OWNER_OPERATOR_KEY, OPERATOR_TYPE) + rop.setUserData(ROP_OWNER_SESSION_KEY, str(lop_node.sessionId())) + rop.setComment("Owned by %s (%s)." % (lop_node.path(), OPERATOR_TYPE)) + try: + rop.setGenericFlag(hou.nodeFlag.DisplayComment, True) + except hou.OperationFailed: + pass + return rop + + +def _deferred_update_usd_render_rop(session_id): + node = hou.nodeBySessionId(session_id) + if node is not None and node.type().name() == OPERATOR_TYPE: + create_or_update_usd_render_rop(node) + + +def on_created(kwargs): + node = kwargs.get("node") + if node is not None: + try: + import hdefereval + + hdefereval.executeDeferred(_deferred_update_usd_render_rop, node.sessionId()) + except Exception: + create_or_update_usd_render_rop(node) + + def _prim_path_tags(select_existing=False, input_index=None): tags = { "script_action": "import loputils\nloputils.selectPrimsInParm(kwargs, %s)" % ( @@ -346,25 +470,13 @@ def _build_parm_template_group(): input_index=0, ) ) - res_mode = hou.StringParmTemplate( - "res_mode", - "Resolution Mode", - 1, - ("autoheight",), - string_type=hou.stringParmType.Regular, - help="Use the USD camera aperture aspect ratio to compute one resolution dimension, or set both dimensions manually.", - ) - res_mode.setItemGeneratorScript("menu = __import__('loputils').resolutionModeMenuItems()\nreturn menu") - res_mode.setItemGeneratorScriptLanguage(hou.scriptLanguage.Python) - res_mode.setMenuType(hou.menuType.Normal) - res_mode.setTags( - { - "export_disable": "1", - "script_callback": "__import__('loputils').updateResolutionParameters(hou.pwd(), True)", - "script_callback_language": "python", - } + ptg.append( + _label( + "resolution_mode_note", + "Resolution Mode", + "Manual Resolution", + ) ) - ptg.append(res_mode) resolution = hou.IntParmTemplate( "resolution", "Resolution", @@ -376,15 +488,6 @@ def _build_parm_template_group(): min_is_strict=True, help="Offline husk/USD renders use this resolution through RenderSettings. Viewport/IPR resolution is driven by the viewport.", ) - resolution.setDefaultExpression( - ( - "", - 'pythonexprf("__import__(\\\'loputils\\\').computeResolutionParameter(True, True)")', - ) - ) - resolution.setDefaultExpressionLanguage( - (hou.scriptLanguage.Hscript, hou.scriptLanguage.Hscript) - ) ptg.append(resolution) resolution_menu = hou.MenuParmTemplate( "resolutionMenu", @@ -421,6 +524,18 @@ def _build_parm_template_group(): "Offline husk/USD renders use this RenderSettings resolution. Viewport/IPR resolution is driven by the viewport.", ) ) + update_rop = hou.ButtonParmTemplate( + "create_update_usd_render_rop", + "Create / Update USD Render ROP", + help="Create or repair the USD Render ROP owned by this MoonRay Render Settings LOP.", + ) + update_rop.setTags( + { + "script_callback": "import moonray_render_settings\nmoonray_render_settings.create_or_update_usd_render_rop(hou.pwd())", + "script_callback_language": "python", + } + ) + ptg.append(update_rop) aovs = ( hou.ToggleParmTemplate( @@ -504,6 +619,18 @@ def _build_parm_template_group(): help_text="The square root of the number of samples taken to evaluate BSSRDF contributions on the primary intersection.", ), ] + light_sampling_quality = _scene_float( + "light_sampling_quality", + "Light Sampling Quality", + 0.5, + max_value=1, + help_text="When the light sampling mode is adaptive, this controls how many lights are sampled per light sample, where 0.0 is low quality and 1.0 is high quality.", + ) + light_sampling_quality.setConditional( + hou.parmCondType.DisableWhen, + "{ sceneVariable_light_sampling_mode != adaptive }", + ) + sampling.insert(2, light_sampling_quality) adaptive_cond = "{ sceneVariable_sampling_mode != adaptive }" for name, label, default, help_text in ( ( @@ -531,6 +658,14 @@ def _build_parm_template_group(): ) target_error.setConditional(hou.parmCondType.DisableWhen, adaptive_cond) sampling.append(target_error) + sampling.append( + _scene_toggle( + "lock_frame_noise", + "Lock Frame Noise", + False, + help_text="Use the same random seed from frame to frame instead of considering the frame number.", + ) + ) tile_order = ( _scene_menu( @@ -705,6 +840,12 @@ def _build_parm_template_group(): ) debug = ( + _scene_toggle( + "disable_optimized_hair_sampling", + "Disable Optimized Hair Sampling", + False, + help_text="Forces all hair materials to sample each hair BSDF lobe independently. This is mainly useful for troubleshooting hair LPE label behavior.", + ), hou.StringParmTemplate( "rdlOutput", "Debug RDL/RDLA Output", @@ -730,7 +871,7 @@ def _build_parm_template_group(): hou.FolderParmTemplate("volumes", "Volumes", volumes), hou.FolderParmTemplate("filtering", "Filtering / Textures", filtering), hou.FolderParmTemplate("global_toggles", "Global Toggles", global_toggles), - hou.FolderParmTemplate("debug", "Debug", debug), + hou.FolderParmTemplate("advanced_debug", "Advanced / Debug", debug), ), folder_type=hou.folderType.Tabs, ) @@ -768,6 +909,12 @@ def regenerate_hda(hda_path): "Authors an artist-friendly USD RenderSettings/RenderProduct setup and curated hdMoonRay moonray:sceneVariable settings." ) definition.setParmTemplateGroup(_build_parm_template_group()) + definition.addSection( + "OnCreated", + "import moonray_render_settings\n" + "moonray_render_settings.on_created(kwargs)\n", + ) + definition.setExtraFileOption("OnCreated/IsPython", True) try: definition.setIcon("ROP_usdrender") except hou.OperationFailed: diff --git a/houdini/tests/dev_validate_moonray_render_settings_lop.py b/houdini/tests/dev_validate_moonray_render_settings_lop.py new file mode 100755 index 0000000..f3600cb --- /dev/null +++ b/houdini/tests/dev_validate_moonray_render_settings_lop.py @@ -0,0 +1,413 @@ +#!/usr/bin/env hython +"""Development validation for the MoonRay Render Settings LOP lifecycle. + +Run with Houdini 20.5 hython: +/Applications/Houdini/Houdini20.5.584/Frameworks/Houdini.framework/Versions/20.5/Resources/bin/hython \ + /Applications/MoonRay/openmoonray/moonray/moonray_dcc_plugins/houdini/tests/dev_validate_moonray_render_settings_lop.py +""" + +from __future__ import annotations + +import os +import subprocess +import tempfile + +import hou + +OPERATOR_TYPE = "Lop::DW_MOONRAY::moonrayrendersettings::1" +ROP_NODE_TYPE = "usdrender_rop" +OUT_ROP_NODE_TYPE = "usdrender" +RENDERER_TOKEN = "HdMoonrayRendererPlugin" +OWNER_LOP_KEY = "moonray_render_settings_lop" +OWNER_OPERATOR_KEY = "moonray_render_settings_operator" +OWNER_SESSION_KEY = "moonray_render_settings_lop_session_id" +EXPECTED_SCENE_VARIABLE_COUNT = 50 +EXPECTED_MODULE_SUFFIX = "/plugin/houdini/python3.11libs/moonray_render_settings.py" + + +RESULTS = [] + + +def _print(status: str, name: str, details: object) -> None: + RESULTS.append((status, name, str(details))) + print(f"{status} {name}: {details}") + + +def pass_(name: str, details: object) -> None: + _print("PASS", name, details) + + +def fail(name: str, details: object) -> None: + _print("FAIL", name, details) + + +def skip(name: str, details: object) -> None: + _print("SKIP", name, details) + + +def check(name: str, condition: bool, details: object) -> None: + if condition: + pass_(name, details) + else: + fail(name, details) + + +def clear_scene() -> hou.Node: + hou.hipFile.clear(suppress_save_prompt=True) + stage = hou.node("/stage") or hou.node("/").createNode("lopnet", "stage") + for child in tuple(stage.children()): + child.destroy() + return stage + + +def render_setting_nodes(parent: hou.Node): + return [child for child in parent.children() if child.type().name() == OPERATOR_TYPE] + + +def usd_render_rops(parent: hou.Node): + return [child for child in parent.children() if child.type().name() == ROP_NODE_TYPE] + + +def out_usd_render_rops(): + out = hou.node("/out") + if out is None: + return [] + return [child for child in out.children() if child.type().name() == OUT_ROP_NODE_TYPE] + + +def owned_rops(parent: hou.Node): + return [rop for rop in usd_render_rops(parent) if rop.userData(OWNER_OPERATOR_KEY) == OPERATOR_TYPE] + + +def rop_info(rop: hou.Node): + return { + "path": rop.path(), + "input0": rop.input(0).path() if rop.input(0) is not None else None, + "renderer": rop.parm("renderer").eval() if rop.parm("renderer") else None, + "loppath": rop.parm("loppath").eval() if rop.parm("loppath") else None, + "rendersettings": rop.parm("rendersettings").eval() if rop.parm("rendersettings") else None, + "outputimage": rop.parm("outputimage").eval() if rop.parm("outputimage") else None, + "owner_path": rop.userData(OWNER_LOP_KEY), + "owner_operator": rop.userData(OWNER_OPERATOR_KEY), + "owner_session": rop.userData(OWNER_SESSION_KEY), + } + + +def rop_graph_state(rop: hou.Node): + return { + **rop_info(rop), + "position": tuple(round(v, 4) for v in rop.position()), + } + + +def owned_rop_for_node(node: hou.Node): + candidates = [rop for rop in owned_rops(node.parent()) if rop.parm("loppath") and rop.parm("loppath").eval() == node.path()] + return candidates + + +def create_settings(parent: hou.Node, name: str | None = None) -> hou.Node: + if name is None: + return parent.createNode(OPERATOR_TYPE, exact_type_name=True) + return parent.createNode(OPERATOR_TYPE, name, exact_type_name=True) + + +def press_repair(node: hou.Node) -> None: + node.parm("create_update_usd_render_rop").pressButton() + + +def assert_one_owned_rop(test_name: str, node: hou.Node): + rops = owned_rop_for_node(node) + ok = len(rops) == 1 and rops[0].input(0) == node and rops[0].parm("renderer").eval() == RENDERER_TOKEN + check(test_name, ok, [rop_info(rop) for rop in rops]) + return rops[0] if rops else None + + +def test_module_and_hda() -> None: + import moonray_render_settings + + module_file = moonray_render_settings.__file__ + check("module_import_path", module_file.endswith(EXPECTED_MODULE_SUFFIX), module_file) + check("scene_variable_count", len(moonray_render_settings.SCENE_VARIABLES) == EXPECTED_SCENE_VARIABLE_COUNT, len(moonray_render_settings.SCENE_VARIABLES)) + node_type = hou.lopNodeTypeCategory().nodeTypes().get(OPERATOR_TYPE) + check("operator_type_name", node_type is not None, OPERATOR_TYPE) + definition = node_type.definition() if node_type is not None else None + check("hda_definition_library_path", definition is not None and definition.libraryFilePath().endswith("Lop::DW_MOONRAY::moonrayrendersettings::1.hda"), definition.libraryFilePath() if definition else None) + matches = [] + for name, node_type in sorted(hou.lopNodeTypeCategory().nodeTypes().items()): + desc = node_type.description() + if "moonray" in (name + " " + desc).lower() and "rendersettings" in name.lower(): + node_definition = node_type.definition() + matches.append( + { + "name": name, + "label": desc, + "definition": node_definition.libraryFilePath() if node_definition else None, + } + ) + check("single_moonray_render_settings_operator_definition", len(matches) == 1 and matches[0]["name"] == OPERATOR_TYPE, matches) + + +def test_basic_creation_and_repair() -> hou.Node: + stage = clear_scene() + before_out = len(out_usd_render_rops()) + node = create_settings(stage, "moonrayrendersettings1") + check("node_creation", node.type().name() == OPERATOR_TYPE and not node.errors(), {"path": node.path(), "errors": node.errors()}) + rop = assert_one_owned_rop("one_owned_connected_usdrender_rop", node) + check("no_out_usdrender_creation", len(out_usd_render_rops()) == before_out, {"before": before_out, "after": len(out_usd_render_rops())}) + before_repair = rop_graph_state(rop) if rop is not None else None + press_repair(node) + press_repair(node) + rop = assert_one_owned_rop("repair_button_idempotency", node) + after_repair = rop_graph_state(rop) if rop is not None else None + check("initial_creation_matches_post_repair_graph", before_repair == after_repair, {"before": before_repair, "after": after_repair}) + return stage + + +def test_lifecycle_scenarios() -> None: + stage = clear_scene() + + node1 = create_settings(stage, "moonrayrendersettings1") + node2 = create_settings(stage, "moonrayrendersettings2") + distinct = owned_rop_for_node(node1) + owned_rop_for_node(node2) + check("two_lops_two_distinct_owned_rops", len(distinct) == 2 and len({rop.path() for rop in distinct}) == 2, [rop_info(rop) for rop in distinct]) + check( + "settings_nodes_do_not_share_rops", + len(owned_rop_for_node(node1)) == 1 + and len(owned_rop_for_node(node2)) == 1 + and owned_rop_for_node(node1)[0] is not owned_rop_for_node(node2)[0], + {"node1": [rop_info(rop) for rop in owned_rop_for_node(node1)], "node2": [rop_info(rop) for rop in owned_rop_for_node(node2)]}, + ) + + node1.setName("moonraysettings_renamed") + press_repair(node1) + rop1 = assert_one_owned_rop("rename_owner_then_repair_updates_by_session", node1) + + if rop1 is not None: + rop1.setName("artist_renamed_rop") + press_repair(node1) + check("rename_owned_rop_then_repair_preserves_renamed_rop", rop1.name() == "artist_renamed_rop" and rop1.input(0) == node1, rop_info(rop1)) + + rop1.destroy() + press_repair(node1) + rop1 = assert_one_owned_rop("delete_owned_rop_then_repair_recreates", node1) + + if rop1 is not None: + rop1.setInput(0, None) + press_repair(node1) + check("disconnect_owned_rop_then_repair_rewires", rop1.input(0) == node1, rop_info(rop1)) + + # Raw HOM copy of only the LOP does not run OnCreated; this is an accepted limitation. + copied_lop = hou.copyNodesTo((node1,), stage)[0] + copied_owned = owned_rop_for_node(copied_lop) + if copied_owned: + pass_("raw_hom_copy_lop_only", [rop_info(rop) for rop in copied_owned]) + else: + skip("raw_hom_copy_lop_only", "HOM copy of an existing node does not run OnCreated; press repair on the copied LOP.") + press_repair(copied_lop) + assert_one_owned_rop("raw_hom_copy_lop_only_repair", copied_lop) + + pair_node = create_settings(stage, "pairsettings") + pair_rop = owned_rop_for_node(pair_node)[0] + copied_items = hou.copyNodesTo((pair_node, pair_rop), stage) + copied_pair_lops = [item for item in copied_items if item.type().name() == OPERATOR_TYPE] + copied_pair_rops = [item for item in copied_items if item.type().name() == ROP_NODE_TYPE] + check("duplicate_lop_rop_pair_raw_copy_non_destructive", len(copied_pair_lops) == 1 and len(copied_pair_rops) == 1, {"lops": [n.path() for n in copied_pair_lops], "rops": [rop_info(r) for r in copied_pair_rops]}) + if copied_pair_lops: + press_repair(copied_pair_lops[0]) + assert_one_owned_rop("duplicate_lop_rop_pair_repair_refreshes_ownership", copied_pair_lops[0]) + + collision_stage = stage + foreign = collision_stage.createNode(ROP_NODE_TYPE, "moonrayrendersettings1_usdrender") + foreign.parm("renderer").set("BRAY_HdKarma") + collision_node = create_settings(collision_stage, "moonrayrendersettings1") + check("unrelated_colliding_rop_preserved", foreign.parm("renderer").eval() == "BRAY_HdKarma" and foreign not in owned_rop_for_node(collision_node), [rop_info(rop) for rop in usd_render_rops(collision_stage) if "moonrayrendersettings1_usdrender" in rop.name()]) + + fake = stage.createNode(ROP_NODE_TYPE, "moonrayfake_usdrender") + fake.setUserData(OWNER_OPERATOR_KEY, OPERATOR_TYPE) + fake.setUserData(OWNER_LOP_KEY, "/stage/not_real") + fake.parm("renderer").set("BRAY_HdKarma") + fake_node = create_settings(stage, "moonrayfake") + check("fake_stale_ownership_not_overwritten", fake.parm("renderer").eval() == "BRAY_HdKarma" and fake not in owned_rop_for_node(fake_node), [rop_info(rop) for rop in usd_render_rops(stage) if "moonrayfake" in rop.name()]) + + before_save = len(usd_render_rops(stage)) + hip_path = os.path.join(tempfile.gettempdir(), "moonray_render_settings_lifecycle_validation.hip") + hou.hipFile.save(hip_path) + hou.hipFile.clear(suppress_save_prompt=True) + hou.hipFile.load(hip_path, suppress_save_prompt=True, ignore_load_warnings=True) + loaded_stage = hou.node("/stage") + after_load = len(usd_render_rops(loaded_stage)) + check("save_reopen_no_extra_rops", before_save == after_load, {"before": before_save, "after": after_load, "file": hip_path}) + + node_type = hou.lopNodeTypeCategory().nodeTypes().get(OPERATOR_TYPE) + definition = node_type.definition() if node_type is not None else None + if definition is None: + skip("hda_reload_no_extra_rops", "operator definition unavailable") + else: + before_reload = len(usd_render_rops(loaded_stage)) + hou.hda.reloadFile(definition.libraryFilePath()) + after_reload = len(usd_render_rops(loaded_stage)) + check("hda_reload_no_extra_rops", before_reload == after_reload, {"before": before_reload, "after": after_reload, "library": definition.libraryFilePath()}) + + loaded_settings = next((child for child in loaded_stage.children() if child.type().name() == OPERATOR_TYPE), None) + if loaded_settings is None: + skip("parameter_change_and_cook_no_extra_rops", "no loaded MoonRay Render Settings node found") + else: + before_change = len(usd_render_rops(loaded_stage)) + loaded_settings.parm("product_name").set("/tmp/moonray_lifecycle.$F4.exr") + try: + loaded_settings.cook(force=True) + details = {"errors": loaded_settings.errors(), "warnings": loaded_settings.warnings()} + except hou.OperationFailed as exc: + details = {"exception": str(exc), "errors": loaded_settings.errors(), "warnings": loaded_settings.warnings()} + after_change = len(usd_render_rops(loaded_stage)) + check("parameter_change_and_cook_no_extra_rops", before_change == after_change, {"before": before_change, "after": after_change, **details}) + + skip("undo_redo_creation", "Houdini hython does not provide a reliable undo/redo UI event test for this lifecycle; validate manually in UI if needed.") + + + +def test_manual_ui_creation_paths() -> None: + skip( + "moonray_menu_tool_creation_path", + "Requires graphical Houdini 20.5 hou.ui interaction; hython cannot exercise the real MoonRay Tab/shelf UI path.", + ) + skip( + "digital_assets_creation_path", + "Requires graphical Houdini 20.5 Tab menu interaction; hython can report the operator definition but cannot click the Digital Assets entry.", + ) + skip( + "mixed_menu_path_two_node_sharing", + "Requires graphical Houdini 20.5 creation from both menu presentation paths; not claimable from hython.", + ) + +def test_resolution_and_usd_contract() -> None: + stage = clear_scene() + setup = stage.createNode("pythonscript", "camera_setup") + setup.parm("python").set( + "import hou\n" + "from pxr import UsdGeom, Gf\n" + "stage = hou.pwd().editableStage()\n" + "cam = UsdGeom.Camera.Define(stage, '/cameras/camera1')\n" + "UsdGeom.Xformable(cam).AddTranslateOp().Set(Gf.Vec3d(0, 0, 5))\n" + "cam.GetHorizontalApertureAttr().Set(40)\n" + "cam.GetVerticalApertureAttr().Set(20)\n" + ) + node = create_settings(stage, "moonrayrendersettings1") + node.setInput(0, setup) + + check("computed_resolution_modes_removed", node.parm("res_mode") is None, "res_mode parm absent") + mode_note = node.parm("resolution_mode_note") + check("manual_resolution_mode_note", mode_note is not None, mode_note.eval() if mode_note is not None else None) + ptg_text = str(node.parmTemplateGroup()) + check( + "computed_resolution_callbacks_absent", + "computeResolutionParameter" not in ptg_text and "updateResolutionParameters" not in ptg_text, + "no loputils computed-resolution callback references", + ) + import moonray_render_settings + + scene_variable_names = {name for name, _ in moonray_render_settings.SCENE_VARIABLES} + check( + "scene_variables_exclude_image_width_height", + "image_width" not in scene_variable_names and "image_height" not in scene_variable_names, + sorted(name for name in scene_variable_names if name in ("image_width", "image_height")), + ) + aov_toggles = sorted( + parm.name() + for parm in node.parms() + if parm.name().startswith("aov_") + and parm.parmTemplate().type() == hou.parmTemplateType.Toggle + ) + check("beauty_only_aov_ui", aov_toggles == ["aov_beauty"], aov_toggles) + + node.parm("camera").set("/cameras/camera1") + node.parm("resolutionx").set(512) + node.parm("resolutiony").set(256) + value = tuple(node.parmTuple("resolution").eval()) + check("manual_resolution", value == (512, 256), value) + + node.cook(force=True) + usd_path = os.path.join(tempfile.gettempdir(), "moonray_render_settings_lifecycle_validation.usda") + node.stage().Flatten().Export(usd_path) + text = open(usd_path, "r", encoding="utf-8").read() + checks = { + "RenderSettings": 'def RenderSettings "rendersettings"' in text, + "RenderProduct": 'def RenderProduct "renderproduct"' in text, + "RenderVar": 'def RenderVar "beauty"' in text, + "products_rel": 'rel products = ' in text, + "orderedVars_rel": 'rel orderedVars = ' in text, + "camera_rel": 'rel camera = ' in text, + "resolution": 'uniform int2 resolution = (512, 256)' in text, + "beauty_sourceType": 'uniform token sourceType = "raw"' in text, + "beauty_format": 'driver:parameters:aov:format = "color3f"' in text, + "beauty_multiSampled": 'driver:parameters:aov:multiSampled = 0' in text, + "beauty_clearValue": 'driver:parameters:aov:clearValue = 0' in text, + "beauty_only_orderedVars": text.count("rel orderedVars = ") == 1, + "no_custom_image_width": 'moonray:sceneVariable:image_width' not in text, + "no_custom_image_height": 'moonray:sceneVariable:image_height' not in text, + } + for test_name, ok in checks.items(): + check("usd_contract_" + test_name, ok, usd_path) + +def test_rdla_receipt() -> None: + # RDLA export is practical but can be slow; use a tiny lit fixture and a timeout. + stage = clear_scene() + setup = stage.createNode("pythonscript", "rdla_setup") + setup.parm("python").set( + "import hou\n" + "from pxr import UsdGeom, UsdLux, Gf\n" + "stage = hou.pwd().editableStage()\n" + "cam = UsdGeom.Camera.Define(stage, '/cameras/camera1')\n" + "UsdGeom.Xformable(cam).AddTranslateOp().Set(Gf.Vec3d(0, 0, 5))\n" + "UsdGeom.Sphere.Define(stage, '/World/Sphere')\n" + "light = UsdLux.SphereLight.Define(stage, '/World/Light')\n" + "light.CreateIntensityAttr().Set(500.0)\n" + "UsdGeom.Xformable(light).AddTranslateOp().Set(Gf.Vec3d(0, 3, 3))\n" + ) + node = create_settings(stage, "moonrayrendersettings1") + node.setInput(0, setup) + node.parm("rdlOutput").set(os.path.join(tempfile.gettempdir(), "moonray_lifecycle_validation.rdla")) + node.parm("sceneVariable_target_adaptive_error").set(7.5) + node.parm("sceneVariable_roughness_clamping_factor").set(0.35) + node.parm("sceneVariable_light_sampling_quality").set(0.77) + node.cook(force=True) + usd_path = os.path.join(tempfile.gettempdir(), "moonray_lifecycle_rdla.usda") + node.stage().Flatten().Export(usd_path) + rdla_path = node.parm("rdlOutput").eval() + husk = "/Applications/Houdini/Houdini20.5.584/Frameworks/Houdini.framework/Versions/20.5/Resources/bin/husk" + if not os.path.exists(husk): + skip("rdla_scenevariable_receipt", "husk not found") + return + log_path = "/tmp/moonray_lifecycle_validation_husk.log" + cmd = [husk, "-R", "HdMoonrayRendererPlugin", "--settings", "/Render/rendersettings", "-o", "/tmp/moonray_lifecycle_validation.exr", usd_path] + try: + with open(log_path, "w", encoding="utf-8") as log: + result = subprocess.run(cmd, stdout=log, stderr=subprocess.STDOUT, timeout=90) + except subprocess.TimeoutExpired: + skip("rdla_scenevariable_receipt", f"husk timed out; see {log_path}") + return + if result.returncode != 0 or not os.path.exists(rdla_path): + skip("rdla_scenevariable_receipt", f"husk/RDLA unavailable rc={result.returncode}; see {log_path}") + return + text = open(rdla_path, "r", encoding="utf-8", errors="replace").read() + ok = all(key in text for key in ("target_adaptive_error", "roughness_clamping_factor", "light_sampling_quality")) + check("rdla_scenevariable_receipt", ok, rdla_path) + + +def main() -> int: + test_module_and_hda() + test_basic_creation_and_repair() + test_lifecycle_scenarios() + test_manual_ui_creation_paths() + test_resolution_and_usd_contract() + test_rdla_receipt() + + counts = {"PASS": 0, "FAIL": 0, "SKIP": 0} + for status, _, _ in RESULTS: + counts[status] = counts.get(status, 0) + 1 + print("SUMMARY PASS={PASS} FAIL={FAIL} SKIP={SKIP}".format(**counts)) + return 1 if counts.get("FAIL", 0) else 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/houdini/toolbar/MoonRayTools.shelf b/houdini/toolbar/MoonRayTools.shelf index 534fa01..8cb0dd9 100644 --- a/houdini/toolbar/MoonRayTools.shelf +++ b/houdini/toolbar/MoonRayTools.shelf @@ -20,12 +20,18 @@ moonray_material_builder.create_moonray_material_builder(kwargs) + + LOP + - Lop/DW_MOONRAY::moonrayrendersettings::1 + LOP MoonRay MoonRay From b12bd04448f337fddfdad5fbd5269fa501921196 Mon Sep 17 00:00:00 2001 From: Jakub Svoboda <132791205+rolledhand@users.noreply.github.com> Date: Sat, 6 Jun 2026 21:19:09 +0200 Subject: [PATCH 15/29] Houdini: add MoonRay camera controls Signed-off-by: Jakub Svoboda <132791205+rolledhand@users.noreply.github.com> --- houdini/soho/parameters/moonray_Camera.ds | 186 ++++++++++++++++++++++ 1 file changed, 186 insertions(+) create mode 100644 houdini/soho/parameters/moonray_Camera.ds diff --git a/houdini/soho/parameters/moonray_Camera.ds b/houdini/soho/parameters/moonray_Camera.ds new file mode 100644 index 0000000..04fb102 --- /dev/null +++ b/houdini/soho/parameters/moonray_Camera.ds @@ -0,0 +1,186 @@ +#include "$HFS/houdini/soho/parameters/CommonMacros.ds" +{ + name parameters + label "Moonray" + + group { + name "folder" + label "Motion Blur" + + parm { + name "xn__moonraymb_shutter_bias_control_ypb" + label "moonray:mb_shutter_bias" + type string + default { "none" } + menujoin { + "set" "![BUTTONS_set_or_create]Set or Create" + "setexisting" "![BUTTONS_set_if_exists]Set if Exists" + "add" "![BUTTONS_set_add]Add if Exists" + "multiply" "![BUTTONS_set_multiply]Multiply if Exists" + "block" "![BUTTONS_set_block]Block" + "none" "![BUTTONS_set_nothing]Do Nothing" + } + parmtag { "sidefx::look" "icon" } + } + parm { + name "xn__moonraymb_shutter_bias_xcb" + label "Mb Shutter Bias" + type float + default { "0" } + help "Biases the motion blur samples toward one end of the shutter interval." + disablewhen "{ xn__moonraymb_shutter_bias_control_ypb == block } { xn__moonraymb_shutter_bias_control_ypb == none }" + range { 0 10 } + parmtag { "usdvaluetype" "float" } + } + } + + group { + name "folder2" + label "Bokeh" + + parm { + name "xn__moonraybokeh_control_o8a" + label "moonray:bokeh" + type string + default { "none" } + menujoin { + "set" "![BUTTONS_set_or_create]Set or Create" + "setexisting" "![BUTTONS_set_if_exists]Set if Exists" + "block" "![BUTTONS_set_block]Block" + "none" "![BUTTONS_set_nothing]Do Nothing" + } + parmtag { "sidefx::look" "icon" } + } + parm { + name "xn__moonraybokeh_nva" + label "Bokeh" + type toggle + default { "0" } + help "Enable Bokeh. Requires DOF to be enabled." + disablewhen "{ xn__moonraybokeh_control_o8a == block } { xn__moonraybokeh_control_o8a == none }" + parmtag { "usdvaluetype" "bool" } + } + parm { + name "xn__moonraybokeh_sides_control_gjb" + label "moonray:bokeh_sides" + type string + default { "none" } + menujoin { + "set" "![BUTTONS_set_or_create]Set or Create" + "setexisting" "![BUTTONS_set_if_exists]Set if Exists" + "add" "![BUTTONS_set_add]Add if Exists" + "multiply" "![BUTTONS_set_multiply]Multiply if Exists" + "block" "![BUTTONS_set_block]Block" + "none" "![BUTTONS_set_nothing]Do Nothing" + } + parmtag { "sidefx::look" "icon" } + } + parm { + name "xn__moonraybokeh_sides_f5a" + label "Bokeh Sides" + type integer + default { "0" } + help "Number of sides of the iris. Specifying less than 3 sides will default to a disk." + disablewhen "{ xn__moonraybokeh_sides_control_gjb == block } { xn__moonraybokeh_sides_control_gjb == none }" + range { 0 10 } + parmtag { "usdvaluetype" "int" } + } + parm { + name "xn__moonraybokeh_image_control_gjb" + label "moonray:bokeh_image" + type string + default { "none" } + menujoin { + "set" "![BUTTONS_set_or_create]Set or Create" + "setexisting" "![BUTTONS_set_if_exists]Set if Exists" + "block" "![BUTTONS_set_block]Block" + "none" "![BUTTONS_set_nothing]Do Nothing" + } + parmtag { "sidefx::look" "icon" } + } + parm { + name "xn__moonraybokeh_image_f5a" + label "Bokeh Image" + type string + default { "" } + help "Path to image file to be used for the iris" + disablewhen "{ xn__moonraybokeh_image_control_gjb == block } { xn__moonraybokeh_image_control_gjb == none }" + parmtag { "usdvaluetype" "string" } + } + parm { + name "xn__moonraybokeh_angle_control_gjb" + label "moonray:bokeh_angle" + type string + default { "none" } + menujoin { + "set" "![BUTTONS_set_or_create]Set or Create" + "setexisting" "![BUTTONS_set_if_exists]Set if Exists" + "add" "![BUTTONS_set_add]Add if Exists" + "multiply" "![BUTTONS_set_multiply]Multiply if Exists" + "block" "![BUTTONS_set_block]Block" + "none" "![BUTTONS_set_nothing]Do Nothing" + } + parmtag { "sidefx::look" "icon" } + } + parm { + name "xn__moonraybokeh_angle_f5a" + label "Bokeh Angle" + type float + default { "0" } + help "Angle of iris rotation" + disablewhen "{ xn__moonraybokeh_angle_control_gjb == block } { xn__moonraybokeh_angle_control_gjb == none }" + range { 0 10 } + parmtag { "usdvaluetype" "float" } + } + parm { + name "xn__moonraybokeh_weight_location_control_qzb" + label "moonray:bokeh_weight_location" + type string + default { "none" } + menujoin { + "set" "![BUTTONS_set_or_create]Set or Create" + "setexisting" "![BUTTONS_set_if_exists]Set if Exists" + "add" "![BUTTONS_set_add]Add if Exists" + "multiply" "![BUTTONS_set_multiply]Multiply if Exists" + "block" "![BUTTONS_set_block]Block" + "none" "![BUTTONS_set_nothing]Do Nothing" + } + parmtag { "sidefx::look" "icon" } + } + parm { + name "xn__moonraybokeh_weight_location_pmb" + label "Bokeh Weight Location" + type float + default { "0" } + help "Distance from the origin of Bokeh shape" + disablewhen "{ xn__moonraybokeh_weight_location_control_qzb == block } { xn__moonraybokeh_weight_location_control_qzb == none }" + range { 0 10 } + parmtag { "usdvaluetype" "float" } + } + parm { + name "xn__moonraybokeh_weight_strength_control_qzb" + label "moonray:bokeh_weight_strength" + type string + default { "none" } + menujoin { + "set" "![BUTTONS_set_or_create]Set or Create" + "setexisting" "![BUTTONS_set_if_exists]Set if Exists" + "add" "![BUTTONS_set_add]Add if Exists" + "multiply" "![BUTTONS_set_multiply]Multiply if Exists" + "block" "![BUTTONS_set_block]Block" + "none" "![BUTTONS_set_nothing]Do Nothing" + } + parmtag { "sidefx::look" "icon" } + } + parm { + name "xn__moonraybokeh_weight_strength_pmb" + label "Bokeh Weight Strength" + type float + default { "0" } + help "Controls the strength of weights as samples approach the weight location" + disablewhen "{ xn__moonraybokeh_weight_strength_control_qzb == block } { xn__moonraybokeh_weight_strength_control_qzb == none }" + range { 0 10 } + parmtag { "usdvaluetype" "float" } + } + } +} From f97e96f64d2362f23a184b3d52e177427f348d87 Mon Sep 17 00:00:00 2001 From: Jakub Svoboda <132791205+rolledhand@users.noreply.github.com> Date: Sun, 7 Jun 2026 11:11:11 +0200 Subject: [PATCH 16/29] lightfilters-unexposed-checkpoint Signed-off-by: Jakub Svoboda <132791205+rolledhand@users.noreply.github.com> --- .../Vop::DW_MOONRAY::DecayLightFilter::1.hda | Bin 0 -> 4380 bytes ...p::DW_MOONRAY::IntensityLightFilter::1.hda | Bin 0 -> 4479 bytes .../moonray_lightfilter_nodes.py | 313 ++++++++++++++++++ 3 files changed, 313 insertions(+) create mode 100644 houdini/otls/Vop::DW_MOONRAY::DecayLightFilter::1.hda create mode 100644 houdini/otls/Vop::DW_MOONRAY::IntensityLightFilter::1.hda create mode 100644 houdini/python3.11libs/moonray_lightfilter_nodes.py diff --git a/houdini/otls/Vop::DW_MOONRAY::DecayLightFilter::1.hda b/houdini/otls/Vop::DW_MOONRAY::DecayLightFilter::1.hda new file mode 100644 index 0000000000000000000000000000000000000000..43a3efbbc26b1a0148513a223d5ccf82850345b1 GIT binary patch literal 4380 zcmd5<+in{-5LN0T4|0M61^Ut_W@{iR(CYG5D3T0CE46B6tzpTRA_xRp%avHI$OV^c zTQU48`GNjHzNo*D#||%R?OIY}v~HUP42v_vxg5?6IlX~JHkt(*+}a~MmcCX;}N)5E3YZr z;>`Yi1wr@IL1%R89sM#a$1@%QA^mnh3H;u<(ElEvc!xL)E%ULUF(Wb+wLt^acj15H zQXKN>a3W}A#dqIZ@vlb9h#U$Y5g{pwy+~5d;zD8feWCEEWQBG|oQH8Ko{=yp6rTK1 zD17#_Vts>*W)y4HDBuFEMZE!QgcHdZSkehZvqV$Eh`^Hg#p@!1kKqMD&V3X)THacB z?piY35TBC}Ior?HhzY`cA{IEFqXndaz)PchhJh>rBowM#3v{k&7P*3~V>pbp2&xt} zm9i+2h%$*dLypIc_7ydNka-Y{8NmWMU9&<1SY;)HkYkCI%s7@ zs>A%OjPfP58f1-jH`xS<)Fkk?SyWQmppv<@#}lc7&j5uCUbc!>00kkQ#tNazU0Uj? z#%GP2L1Z&eIkm<~b%NKMm}$Tp_L(RRBc@Y^Wg;LqT@v6Vl&Gf;J9dz7*Vp>sHQ@RH z%`x6x-Y$t49u1E( zN(76MoZ0eA^9eEsdJWW3X%&w$q+*hIimq)-8Vjo3bl?oK23DrFqL3zyO1Zodi$`~@ zc9jR}dst*DS;v)ngN)Bf4jAZDkbV1kS050MRq5qTSTqKA`jc{0eHsg02f5Szdr7he zg}`h|;Iu2KTB&SIAfG}5WfOt|!55}AA<2>Hsyu+ssBz23v=ufTNcKGLkw_Xi=u3GM zS=eqHsDbR01x+>A{{*tM_Ml;JL@g~nxP9{c|E==i>ihRf4`48Naz5DGK9swrKk*#O z7aqWtkLf`xPvN$$@E~EM;;2KV~1lJH@6An}BwBa0&y5Ilc z>^F;bJs-Jzk}Lq9CR}%Q33HQvR5hHvpWN2i?Q~nm{n2>jd40#ct1PGAdes3E1*|Ql z*Y*aE(qi=-5SD0wuHYdB{x+NoN-l}8G9U$eB@874BGm~rVOXq}@6e38vhpjV?=P*u zhnVcMM)2+bfTu< o7xPOjrtx>^xei=~`~2JDn>WpR+1SwMu3d(VfN>s1=2c4k37M(Xp8x;= literal 0 HcmV?d00001 diff --git a/houdini/otls/Vop::DW_MOONRAY::IntensityLightFilter::1.hda b/houdini/otls/Vop::DW_MOONRAY::IntensityLightFilter::1.hda new file mode 100644 index 0000000000000000000000000000000000000000..cf2df066a8417222c015ea7b8428615e3ab8da8c GIT binary patch literal 4479 zcmb_g{cajZ5XVgwMbuHHO8vLmUL(bk5@V7!st7p3fKyt`S%!Qmis<@o;kG_@PrG}z zNt8$F3-sCg5S{%v;5h8qsgcZav-7d@+nL!Jcl+%(rN!qK{Jh)kw>xh}gHCJM_4{^h zOGyA&%*>z+zS^ZQRjZj^p7gp44jX*P{d9?;kba)@negbeSSd zQZ?(*Nu>5^tca-9s#f;ff1T_GsQDWHwhB5flrQ~oz&Sg@Gc;#G#s;!RK--@@fvwgm z1*Mm4?D=(=!N%QwXZYGb`eRU$5l?`SeQtpw_2xh*3Sk72V< zOQo-V*GoSks~Jh78jZO?1<&We=Fbk{RPiZRGysogXhIkfSdp;&v5eru@RT6$s>(bg z<96Y#vuHVDd`x2GU4G`4RS*^uF~#x(O(8@Co>?0a2C@RsP^@EdY+}(Yk#mSjhGS`1 zP_=BRlqIP`lqtj+@_c5sTk1IG*sR&$MvI*nxyX6KWhwxaj{CLDb4mgQ;0HX0Z?B~v z%gfq4Wv8%lZ9_j-SB*2H1gmHyNetQ`43KA2;Si{3kWsB9PnGs-2?J!IaEY_ETk**xCg#90x}+Zn1ae&S**Pkirx6(UqBzfQta~&jXN_wJ+>k2*DiIyoFUv^Q*>~ zIsKd?H-v}4Y(l`d9aP;}3)KMxCQYD3F3=JZ_FWd@x`7&Y4Fl@WkN(Q!oIBT6#$zO zmabe=+O!9ZUNeqe7p_|mnfJhO>G;)LT^3RS-O3u4$15z*m-a8FzQ__SZbPuenG(>gqqB$xk!{f6 z3I!NVSh^++?hKs3Tth;n`2V_ZKb1d~2l$i>AdJZ&T-6fQ8ffQPxfPM%q~m&GO{+dL zjNJfwLHqjR15NaP2~$Q2II`CkpC*Dx32o?5U-nkuC5w4*;(^uozk?POSr!j&GrJZYd)oloQ!U7J1@ucCs9PU5*)qB2MuA6bI z&4UzDMeRZk))kClrkQJa_kL?PNA1pj^JQ;18v1_Ev;CY~={5H{K%#)PqjXz--_u&0 zo&(4~1JF4%aIoKocS^|_5snAAKvuy_(Bc^@m4L7`GrXpyqck4gCYqguh<~uqyT``R88kbbjSeBPxw#}?d13gr4ot$AY kkq^;* + + + + VOP + + + $HDA_TABLE_AND_NAME + + MoonRay/Light Filters + DW Moonray + + + +""" + + +def _quote(value: str) -> str: + return '"' + str(value).replace("\\", "\\\\").replace('"', '\\"') + '"' + + +def _default_values(default): + if isinstance(default, (tuple, list)): + return " ".join(_quote(v) for v in default) + return _quote(default) + + +def _parm_dialog(input_def: dict) -> str: + lines = [ + " parm {", + f" name {_quote(input_def['name'])}", + f" label {_quote(input_def['label'])}", + f" type {input_def['parm_type']}", + f" size {3 if input_def['parm_type'] == 'color' else 1}", + " export none", + f" default {{ {_default_values(input_def['default'])} }}", + ] + if "range" in input_def: + lo, hi = input_def["range"] + lines.append(f" range {{ {lo} {hi} }}") + if "menu" in input_def: + lines.append(" menu {") + for token, label in input_def["menu"]: + lines.append(f" {_quote(token)} {_quote(label)}") + lines.append(" }") + if "help" in input_def: + lines.append(f" help {_quote(input_def['help'])}") + lines.append(f" parmtag {{ script_ritype {_quote(input_def['script_ritype'])} }}") + lines.append(" }") + return "\n".join(lines) + + +def _dialog_script(class_name: str, spec: dict) -> str: + folder_name, folder_label = spec["folder"] + input_lines = [ + f" input {item['vop_type']} {item['name']} {_quote(item['label'])}" + for item in spec["inputs"] + ] + input_flags = [f" inputflags {item['name']} 0" for item in spec["inputs"]] + signature_types = " ".join(item["vop_type"] for item in spec["inputs"]) + parms = "\n".join(_parm_dialog(item) for item in spec["inputs"]) + return f"""# Dialog script for Vop::DW_MOONRAY::{class_name}::1 automatically generated +{{ + name {_quote(f"Vop::DW_MOONRAY::{class_name}::1")} + script {_quote(class_name)} + label {_quote(spec['label'])} + rendermask moonray + shadertype lightfilter + externalshader 1 + +{chr(10).join(input_lines)} + output lightfilter filter Filter +{chr(10).join(input_flags)} + signature "Default Inputs" default {{ {signature_types} }} + + help {{ + {_quote(spec['label'])} + }} + + group {{ + name {_quote(folder_name)} + label {_quote(folder_label)} +{parms} + }} +}} +""" + + +def generate(output_dir: str | os.PathLike[str] | None = None) -> list[Path]: + if output_dir is None: + output_dir = Path(__file__).resolve().parents[1] / "otls" + output_dir = Path(output_dir) + output_dir.mkdir(parents=True, exist_ok=True) + + template = hou.nodeType(hou.vopNodeTypeCategory(), TEMPLATE_NODE) + if template is None or template.definition() is None: + raise RuntimeError(f"Could not find template VOP node {TEMPLATE_NODE}") + + written = [] + for class_name, spec in LIGHT_FILTERS.items(): + hda_name = f"Vop::DW_MOONRAY::{class_name}::1" + hda_path = output_dir / f"{hda_name}.hda" + if hda_path.exists(): + hda_path.unlink() + template.definition().copyToHDAFile( + str(hda_path), + new_name=hda_name, + new_menu_name=spec["label"], + ) + hou.hda.installFile(str(hda_path)) + node_type = hou.nodeType(hou.vopNodeTypeCategory(), hda_name) + if node_type is None or node_type.definition() is None: + raise RuntimeError(f"Generated HDA did not register {hda_name}") + definition = node_type.definition() + definition.addSection("DialogScript", _dialog_script(class_name, spec)) + definition.addSection("TypePropertiesOptions", TYPE_OPTIONS) + definition.addSection("Tools.shelf", TOOLS_SHELF) + definition.setDescription(spec["label"]) + definition.setIcon("NETWORKS/shop") + written.append(hda_path) + return written + + +if __name__ == "__main__": + for path in generate(): + print(path) From ff3f904d9272399bee1868cab420b487da78e554 Mon Sep 17 00:00:00 2001 From: Jakub Svoboda <132791205+rolledhand@users.noreply.github.com> Date: Sun, 7 Jun 2026 11:30:11 +0200 Subject: [PATCH 17/29] lightfilters-exposed Signed-off-by: Jakub Svoboda <132791205+rolledhand@users.noreply.github.com> --- .../Vop::DW_MOONRAY::DecayLightFilter::1.hda | Bin 4380 -> 4893 bytes ...p::DW_MOONRAY::IntensityLightFilter::1.hda | Bin 4479 -> 4992 bytes .../moonray_lightfilter_nodes.py | 48 +++++++++++++++++- 3 files changed, 47 insertions(+), 1 deletion(-) diff --git a/houdini/otls/Vop::DW_MOONRAY::DecayLightFilter::1.hda b/houdini/otls/Vop::DW_MOONRAY::DecayLightFilter::1.hda index 43a3efbbc26b1a0148513a223d5ccf82850345b1..c984204191784a516b324fa31565f9a676e98576 100644 GIT binary patch delta 705 zcmZ`#J#W-N5M4tAV(&nqiv&_eKER2P57N-NKwKg~;!+SIB#^Ad9^0Gjd9B^`>8`qx z3JH`JXecQtQt>1BIh06@KTgnOBx`3pZ{B+|pZzcQJ_c93@Z|2J7oWl{?uCq^tq#X+ zbyK$0`(LZ3vyO=^M2f~OD~y!P3ztdd(7;?;`A(s(T~#|9J%qWgN^~<}Poto=>3`S& zda`Sc0Oil7lh=toKN<5T*{e6(XWzYB ztKlCi$35xBQ&bgWH|{sg4TPS-k=DwNZGkH5T9=;p@ZmvSCQj;dDrU&oW=-&|er$7p z;fy$t3JQJnp8LeVF^JT$H!34{aD31oZvxkSK(fHX4@^SERt=H#abCl_TFK$Uav1Q|W~52Lgy_f7@| pMm-Q0sFXV-KR>5fuQ($$Ck?3aIRgWe7f5Pz57SQW&7J%e%m7=NFZBQb diff --git a/houdini/otls/Vop::DW_MOONRAY::IntensityLightFilter::1.hda b/houdini/otls/Vop::DW_MOONRAY::IntensityLightFilter::1.hda index cf2df066a8417222c015ea7b8428615e3ab8da8c..02b8e88bf7f9ffa274c10b71ef1e9e378136172b 100644 GIT binary patch delta 708 zcmZ`#O>fgc5OqI*#tl`uwW1Ou2jt|CmI{fR4;5(z2+{+kLITNJ?6JLcvuo|Hql8Pi zbD`p=^umn`KLh>>Fl#%4OGjGmjNY5~X68@uDg4sE5q)^@_~qqrw-b33b#eO06?eYX z#phoO2P|V`3YMa_^AaP$^TK9aSky4(hQAl6DqB|8L=R!AN{M#D%taJdCjE~aLMzsB z29!S=kKQcx>Ayv8YHZ{;dv{g?DgAwU%#*1UEF>_ z<$g3GPCl1einr*C7gxUf6=c+uoW~_lvbIp!R zEtt$JmLm)e6wT62I}s{_I%Sr@P(m2T@i}Tk=9GmnoI)5j%&VJQ^R>NejC?x1_ZOeT B&ocl3 delta 181 zcmZor|F1MbgOwvoW!2n?x{{n63_t+p_#1;b{BOXV?z`d4W%&g_IkqtWfW({}kTM`( zE6Oa+OD%zLAR2*ePd}Fkm=KU=24WtU%*34h^x)*8%mS!#98&d4M)C>Va$m mD&-Ez&(A5=E6zyGNn>E(HDh34@&ZY1Uckh`v-u5w1v3C-dMcj) diff --git a/houdini/python3.11libs/moonray_lightfilter_nodes.py b/houdini/python3.11libs/moonray_lightfilter_nodes.py index 799808e..ac05d5f 100644 --- a/houdini/python3.11libs/moonray_lightfilter_nodes.py +++ b/houdini/python3.11libs/moonray_lightfilter_nodes.py @@ -14,7 +14,8 @@ import hou -TEMPLATE_NODE = "pxrintmultlightfilter" +TEMPLATE_NODE = "kma_lfilter_attenuation" +USD_LIGHTFILTER_EXTRA_INFO = "shadertype=lightfilter visibleoutputs=0 vopnetmask='usdlightfilter' " LIGHT_FILTERS = { @@ -287,24 +288,69 @@ def generate(output_dir: str | os.PathLike[str] | None = None) -> list[Path]: for class_name, spec in LIGHT_FILTERS.items(): hda_name = f"Vop::DW_MOONRAY::{class_name}::1" hda_path = output_dir / f"{hda_name}.hda" + if hda_path.exists(): hda_path.unlink() + template.definition().copyToHDAFile( str(hda_path), new_name=hda_name, new_menu_name=spec["label"], ) + hou.hda.installFile(str(hda_path)) node_type = hou.nodeType(hou.vopNodeTypeCategory(), hda_name) + if node_type is None or node_type.definition() is None: raise RuntimeError(f"Generated HDA did not register {hda_name}") + definition = node_type.definition() + definition.addSection("DialogScript", _dialog_script(class_name, spec)) definition.addSection("TypePropertiesOptions", TYPE_OPTIONS) definition.addSection("Tools.shelf", TOOLS_SHELF) + + # Critical for Solaris Light Filter Library visibility. + # The generated node must belong to the USD light-filter VOP context, + # not RIS / RenderMan. + definition.setExtraInfo(USD_LIGHTFILTER_EXTRA_INFO) + definition.setDescription(spec["label"]) definition.setIcon("NETWORKS/shop") + + # Persist the edited definition into the HDA file. + definition.save(str(hda_path), create_backup=False) + + # Reinstall/requery so validation checks the saved definition. + hou.hda.installFile(str(hda_path)) + node_type = hou.nodeType(hou.vopNodeTypeCategory(), hda_name) + + if node_type is None or node_type.definition() is None: + raise RuntimeError(f"Generated HDA disappeared after save: {hda_name}") + + definition = node_type.definition() + mask = node_type.vopnetMask() + extra_info = definition.extraInfo() + + if mask != "usdlightfilter": + raise RuntimeError( + f"{hda_name} has wrong vopnetMask {mask!r}; " + "expected 'usdlightfilter'" + ) + + if "risnet" in extra_info.lower(): + raise RuntimeError( + f"{hda_name} still contains RIS extraInfo: {extra_info!r}" + ) + + if "shadertype=lightfilter" not in extra_info: + raise RuntimeError( + f"{hda_name} is missing shadertype=lightfilter extraInfo: " + f"{extra_info!r}" + ) + written.append(hda_path) + return written From 0eab698665b33d39ff70f87e94071159d2ff01b0 Mon Sep 17 00:00:00 2001 From: Jakub Svoboda <132791205+rolledhand@users.noreply.github.com> Date: Sun, 7 Jun 2026 12:00:15 +0200 Subject: [PATCH 18/29] barndoor-exposed Signed-off-by: Jakub Svoboda <132791205+rolledhand@users.noreply.github.com> --- ...op::DW_MOONRAY::BarnDoorLightFilter::1.hda | Bin 0 -> 11541 bytes .../Vop::DW_MOONRAY::DecayLightFilter::1.hda | Bin 4893 -> 4893 bytes ...p::DW_MOONRAY::IntensityLightFilter::1.hda | Bin 4992 -> 4992 bytes ...W_MOONRAY::BarnDoorLightFilter::1_bak1.hda | Bin 0 -> 4975 bytes ...W_MOONRAY::BarnDoorLightFilter::1_bak2.hda | Bin 0 -> 11736 bytes ...W_MOONRAY::BarnDoorLightFilter::1_bak3.hda | Bin 0 -> 11736 bytes ...W_MOONRAY::BarnDoorLightFilter::1_bak4.hda | Bin 0 -> 11555 bytes ...W_MOONRAY::BarnDoorLightFilter::1_bak5.hda | Bin 0 -> 11555 bytes ...W_MOONRAY::BarnDoorLightFilter::1_bak6.hda | Bin 0 -> 11555 bytes ...::DW_MOONRAY::DecayLightFilter::1_bak1.hda | Bin 0 -> 4959 bytes ...::DW_MOONRAY::DecayLightFilter::1_bak2.hda | Bin 0 -> 5088 bytes ...::DW_MOONRAY::DecayLightFilter::1_bak3.hda | Bin 0 -> 5088 bytes ...::DW_MOONRAY::DecayLightFilter::1_bak4.hda | Bin 0 -> 4907 bytes ...::DW_MOONRAY::DecayLightFilter::1_bak5.hda | Bin 0 -> 4907 bytes ...::DW_MOONRAY::DecayLightFilter::1_bak6.hda | Bin 0 -> 4907 bytes ..._MOONRAY::IntensityLightFilter::1_bak1.hda | Bin 0 -> 4979 bytes ..._MOONRAY::IntensityLightFilter::1_bak2.hda | Bin 0 -> 5187 bytes ..._MOONRAY::IntensityLightFilter::1_bak3.hda | Bin 0 -> 5187 bytes ..._MOONRAY::IntensityLightFilter::1_bak4.hda | Bin 0 -> 5006 bytes ..._MOONRAY::IntensityLightFilter::1_bak5.hda | Bin 0 -> 5006 bytes ..._MOONRAY::IntensityLightFilter::1_bak6.hda | Bin 0 -> 5006 bytes .../moonray_lightfilter_nodes.cpython-314.pyc | Bin 0 -> 17394 bytes .../moonray_lightfilter_nodes.py | 236 ++++++++++++++++++ 23 files changed, 236 insertions(+) create mode 100644 houdini/otls/Vop::DW_MOONRAY::BarnDoorLightFilter::1.hda create mode 100644 houdini/otls/backup/Vop::DW_MOONRAY::BarnDoorLightFilter::1_bak1.hda create mode 100644 houdini/otls/backup/Vop::DW_MOONRAY::BarnDoorLightFilter::1_bak2.hda create mode 100644 houdini/otls/backup/Vop::DW_MOONRAY::BarnDoorLightFilter::1_bak3.hda create mode 100644 houdini/otls/backup/Vop::DW_MOONRAY::BarnDoorLightFilter::1_bak4.hda create mode 100644 houdini/otls/backup/Vop::DW_MOONRAY::BarnDoorLightFilter::1_bak5.hda create mode 100644 houdini/otls/backup/Vop::DW_MOONRAY::BarnDoorLightFilter::1_bak6.hda create mode 100644 houdini/otls/backup/Vop::DW_MOONRAY::DecayLightFilter::1_bak1.hda create mode 100644 houdini/otls/backup/Vop::DW_MOONRAY::DecayLightFilter::1_bak2.hda create mode 100644 houdini/otls/backup/Vop::DW_MOONRAY::DecayLightFilter::1_bak3.hda create mode 100644 houdini/otls/backup/Vop::DW_MOONRAY::DecayLightFilter::1_bak4.hda create mode 100644 houdini/otls/backup/Vop::DW_MOONRAY::DecayLightFilter::1_bak5.hda create mode 100644 houdini/otls/backup/Vop::DW_MOONRAY::DecayLightFilter::1_bak6.hda create mode 100644 houdini/otls/backup/Vop::DW_MOONRAY::IntensityLightFilter::1_bak1.hda create mode 100644 houdini/otls/backup/Vop::DW_MOONRAY::IntensityLightFilter::1_bak2.hda create mode 100644 houdini/otls/backup/Vop::DW_MOONRAY::IntensityLightFilter::1_bak3.hda create mode 100644 houdini/otls/backup/Vop::DW_MOONRAY::IntensityLightFilter::1_bak4.hda create mode 100644 houdini/otls/backup/Vop::DW_MOONRAY::IntensityLightFilter::1_bak5.hda create mode 100644 houdini/otls/backup/Vop::DW_MOONRAY::IntensityLightFilter::1_bak6.hda create mode 100644 houdini/python3.11libs/__pycache__/moonray_lightfilter_nodes.cpython-314.pyc diff --git a/houdini/otls/Vop::DW_MOONRAY::BarnDoorLightFilter::1.hda b/houdini/otls/Vop::DW_MOONRAY::BarnDoorLightFilter::1.hda new file mode 100644 index 0000000000000000000000000000000000000000..47c84aed0299c1eaff0f023026fb793a47ffb374 GIT binary patch literal 11541 zcmd5?{chv95zqD(DC*t;MT-Lct7Wyf&F!pHfmWWv-)f9^+<3nlDg+VgBBY7(|3OYy5D!9W54ABmNfZ{7pfA1vE%n%6qw zpeu1F>YFjtKgIfI%#4D?Gz``UH7+Rb3GYr9`tgY z`&a{tF*VcLxRRb8W`&+%!8DGcK#Rz-yrz;OkMIVQ|Zr@ zhN+Qb*`uPVT)yZ-$1-9Lp`2x6&knA0#X*>?kclO2cAXraOheT55p;XF|p^fa`Gt3qV8k z`PkR&0Jo*sVV?c|NLv&x2gX=t`G24Kq3>*)DXlfUTeDq)ZxS-&0H6~v(^hR+2ay_Q zd5r@>>$V3zr)#X%7&W$SodI+fj8kgtIVA`=tSf0>kjJ#C>@JQa_}G?`&D|6-Mz*fi zVBiZ{5R!7#IJgJNC;p1-P{HaRs31?8s>j)K*lmu7pmMt7D2SOJ3bR5bYZI(Ou#TyI ze?1)!3c@jIK42fM!{$b?>7d^M3dsscMNLE@zo_NKSVYR48SDiiP(oQ?lLp6waIF!Bo&{AZO!72gZw{YMF zLqh}G^_W&{#6uP;7$|5-k)mLq2pPEVfeZ%AP)~kO$&aR>s50L%L59XfRy+rVeP7U6 z!~^hAKC(@=wYgb3*%S8(CUyZy){nqtL_@fnm|y~OAcI*krjcc*QL5@0jDYsz2f)pE z*9*b4utq!#DRrp~&*h+IoRkM(%SITV3vQ-Q%LXp*yOqM$ED5ug4_c}Dn&7X`G2Eq- z0<>0irf^t`oNpP}jED9Ra@h#xa|X})n@hwGo!E!aOXIrF89Q>vmxvq%LJvWgiFH3` z>`YL%Xz+3|VkvUR5YvzYpB`W2V4I(R`PZytfHJ1}mwP_%UF18AEaX|94W%ygIzd1Z zo#i=GF9h2#4rg5jI)cMo@^>OJK(F&$z_|ykr{n<%hJg=DqUTu`*T+Nw_fEU=oxk%h zOAo+sK={nnvD{q$+kIU<>;~O=mRCb@A4EC{(ELKgO!WH@Hq46VV;o9*s!@t!?r6{; zH)rgoIgq7W`aWbz%q+BrVv9$}9Pg9@lsz2H;WM`=yb!b)d+c06NXJ9SV)e`!V-ld4 z%n^kq5)OFb_!xpfI8wydS*Ovb8>KnvDupO}KAeMSUU6Lkp^WjBPN5SuhE$8k&eb(D z9iJ7L$JiI{S*5@<3l;NSm8PsorLc4XH^>O!%Kib4g%}=-ED{)8f7DXY@Otu$4eTjS>DuN53xeXeM>tQ>hA zg?X0j3V>fJdekv?CG`*>Lg>;wq%SoyG5xHVnek`j7=7JVZY$4Nt^AsmO#oK@6AMf{ z!c9RQvnu2zp8*e}`)BBTX6|)ejJWF?b8)%WkYBU04%|fJaHI>I71?JmnDaG{27pMl z${dHi#Nh=5tmq9D>keg{Gz)KdL__{Ri07<__uf*uhU;4D3ed=Y1-jM(gJdLty@1oD>msWj%0S6YkN&<=*Up&r(%$m5!`wScX2-R@vGmTU|AB zDjj|)I*;s}{#dCGMehQx#?hTGEZh2#2oHLIn)&?u2N~i?jlkreDM~); zY6PcSF^cPA{?*i;2EOWDv;%Yd4+}vMO0UCeCA>Ng-4q@IUDB3iK7td9B)xB&i$$Yz z*JtS8zKYJJ*EZp2wgS%4`trH~mkLASVZ|Zclryplm3T?e_JbPPhs@iXzHf_mUR{rT z2Dg=Pa8+k(9d<+Znxb&bWE1r)*ROMnouMGYg=+qZ?_z5#kO+<(~|(YhS?4MtvZ)dT#3li z02T0RxU<(18a1%{rhUA#aj(oYw}Ji2v^P}>TnN2V(M3T_J0vMIu5NAbu<6!X4YyT0 zYTik;Bo7MhjL$Jb+O^jhHxB6*o4LIZ?@(_Ok`#}mq;bZO5AHLTQCb5rKiJ`_6W%~3 zJaBe*{`{`qsC8@aRHJuU@OuK@2TK^9>P;>79 literal 0 HcmV?d00001 diff --git a/houdini/otls/Vop::DW_MOONRAY::DecayLightFilter::1.hda b/houdini/otls/Vop::DW_MOONRAY::DecayLightFilter::1.hda index c984204191784a516b324fa31565f9a676e98576..2800c9d5dfeb00809c34b5ece0eb233532e605b8 100644 GIT binary patch delta 54 ycmbQMHdk$eHj{nrL|p|C>2C%kH@0gq0;$Ox8FfL_14ergrN{*0Z4O{MD*yn|JrJ`1 delta 54 ycmbQMHdk$eHj|m}L|p|C>2C%kH@0gq0;$Ox8FfL_14ergrN{*0Z4O{MD*yneln*2T diff --git a/houdini/otls/Vop::DW_MOONRAY::IntensityLightFilter::1.hda b/houdini/otls/Vop::DW_MOONRAY::IntensityLightFilter::1.hda index 02b8e88bf7f9ffa274c10b71ef1e9e378136172b..fb394051bd81fda88e574efc43d2de299f08caa4 100644 GIT binary patch delta 54 zcmZorZ&070&17FYQC9&(`db0XjolWEKx*<)MqMWRn#o@n?Lm|&6OdQCIfY3^5CF@q B5HSD% delta 54 xcmZorZ&070&1B{~QC9&(`db0XjolWEKx*<)MqLo~h0z{FnKFTRn^Tx%1OcKY4x|78 diff --git a/houdini/otls/backup/Vop::DW_MOONRAY::BarnDoorLightFilter::1_bak1.hda b/houdini/otls/backup/Vop::DW_MOONRAY::BarnDoorLightFilter::1_bak1.hda new file mode 100644 index 0000000000000000000000000000000000000000..ae11270ffa83d816a5fa01b898e74b829b55a3d0 GIT binary patch literal 4975 zcmds5{camY5Ko~Jx+_Qp2?+@ardN<#ffGA_pen?vTst8Vi5(iJfC^aayS2Uee0%Kf zB{89o!UMot@MJKvd*^eLm$JaEDW8{d_}X5lz5PZ1XuH+h z>vkON#_qT8KYWJcH^wrHL?Twl5sSq@F*RFRxv@)JImZW2WV*4@{=9$C?RFkFzuefs ziM2;eC2c9yz8HOqey1YDyn7ze}zJlae+k(Y% zbQCI)8pnR?!SML$yF_a#&I~VTw;o_l+Bxmb9y)fYWQr~duDdBA(kSx-GOgxJH+OlA zxL*626z6lddQ!%ERgZZ*bflMlE$r=NNl1D+Y|2+wZvTW*Z{@Vx+h;~G%p9May8R2% zZxa13I252Q3>adnmjoSHX5`+9`NkMK5A|ZX7JG-36_~n2mIfx>g!<(+=&G({=C4>GjLgC9F#lmPA+_MT=3w zOs2ROwE2)_v4K5GjSjrXy?f_i)AWM>3kim2u25Wf-YNuJ`#yX z_3e9}cdvHe(sFTJZYdyN;6j(rrdV<~ONCDl6+it3+RS3^IO*LMG|eA9KTn$z(X~+` z8O_z?Sm7LkbUf3v)B=P-ob*g_16(jlQww|$9Og2(JX=yJ9-7h<%RFZBFrX0%?&26% zzpM5OeBTw78bC0wS~$cNkjN=+dl%R#nT1-a-;!MVP60D)M9|zu(5HQ5z`{vCX2~dH zBaX(>nHkHZ!0e=#h1#yy($qZEmoXL5#_f6@%Y{(a`3JR+3Y!$0NN9#9#p#$Q5S(L@ zFsE>*0Te!XR+?1kIHmC%YOA$6pq~2rLc0EX$aYnh_UDj`U8y7$knNhe3Uuu{fai6v z1U1xae>>iK32KhlZL=le|AThD1T{xHUx6jh`=O8W10`#(F zd>zPSa!E1&GfUWF#)EGe!i+v@sURieRQoOBM#O8+@m|( zl1Bc%k8Yi%syMQts$rbp9jr9cGtE`R41;O{73{8_aHY{Ujw(<+fl9^M@mpgaPVjPK z8+O>hAbsrPL56-C-ICK(aZPePYLy&yN2-B{y4V(CBX@`mh0Y0|d@s^MG@sg+;pD>9 z0h{omyL1YzjvXbZPlhqc)jswQ6(5STHr~%t9ua+??j*~Ibl=KpN9=^RSUBcUi(=`t z(d1r;33vAB^$6R7(s{IaoW$sBH*t5yT<}=)_R%85&4*{x7_f<@m^6a=DjwiG2_=3v z7&U_9-cI#F@NmoDwAaJ73^QyN%@$^Q^G>zussr!A9MBoVM4|y3ApGQDFP|WXKyoKs ze+UL|nFFS9#FEIq=~W;0406aUj}^ z;_5XY?Qi#+op!&|JlLLF%~@V(^e7u(WV5ZsOQGJhUKS*$BVX0-hs-yM?tE+W&eK-A z*=s%((^M)$A5sWqW<;!gfAMYAekKrM56Sl?r?`P(T~#a&^1gEa>#w&q*PIPotkw}M PHElUCE~co literal 0 HcmV?d00001 diff --git a/houdini/otls/backup/Vop::DW_MOONRAY::BarnDoorLightFilter::1_bak2.hda b/houdini/otls/backup/Vop::DW_MOONRAY::BarnDoorLightFilter::1_bak2.hda new file mode 100644 index 0000000000000000000000000000000000000000..bad2199a69ecd79401010ad1566e8cf27f56d30e GIT binary patch literal 11736 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 a``w)l!-M2bLxvTxF|j13sCEVKwEiDkJbJ1C literal 0 HcmV?d00001 diff --git a/houdini/otls/backup/Vop::DW_MOONRAY::BarnDoorLightFilter::1_bak5.hda b/houdini/otls/backup/Vop::DW_MOONRAY::BarnDoorLightFilter::1_bak5.hda new file mode 100644 index 0000000000000000000000000000000000000000..984641e270a2825196aaae8d533389023fb02e00 GIT binary patch literal 11555 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 a``w)l!-M2bLxvTxF|j13sCEVKwEiDkJbJ1C literal 0 HcmV?d00001 diff --git a/houdini/otls/backup/Vop::DW_MOONRAY::BarnDoorLightFilter::1_bak6.hda b/houdini/otls/backup/Vop::DW_MOONRAY::BarnDoorLightFilter::1_bak6.hda new file mode 100644 index 0000000000000000000000000000000000000000..984641e270a2825196aaae8d533389023fb02e00 GIT binary patch literal 11555 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 a``w)l!-M2bLxvTxF|j13sCEVKwEiDkJbJ1C literal 0 HcmV?d00001 diff --git a/houdini/otls/backup/Vop::DW_MOONRAY::DecayLightFilter::1_bak1.hda b/houdini/otls/backup/Vop::DW_MOONRAY::DecayLightFilter::1_bak1.hda new file mode 100644 index 0000000000000000000000000000000000000000..99ff900b0b0bd36fce24f7040f4e689532f46d81 GIT binary patch literal 4959 zcmds5{camY5Ko~Jx+|3m5)y(xm|lz03Y^&a16669%C!?3k=UVeN>M@9`fhD6KHna@ zdr3^_qwoOm7Cafu?B4m@#HNw>5O7lBy`9hB%e zy-wTFu08zj<3}%X{O(9*kx0baC}OebE2gF^E7u+pSI%+onM^k~TVM4KI-T~@#@Cyh zII-U1A)D@t;mGWY*l@MES#xsl{FKXGLlxKY@9rh}g|aIj97vfwWmB+Zu)4u1M=j4~ zitcT$UsATjnMYS;MBN`g>m2sR6V{6d7E6yA!;_2|ArmAQ&zq>S80Wt&Jz^18W}5PP zOu=vp;6!NAkGafDni*ZM!ih{1ZYE5R>#LcL=6F{j*X8AL!)(oG@GT_2-4ZO8!=q4% z)HwDV4+h6CJ|bFEab|cyyYT?i(8_7=bkw%#xk!dYwy8eX6i0kGr zq&T0u(UmgRYkI`vfg`=~TVZcEOG47qW)r@$a_eW5dOxS#+Bq|dVb1u>)U98Uex2xd zz@Y$bVZcBtSQ2z#nUNEWf5_r^3PYZ7g%~5>KlcHj1WkKOWG#a;@rNui>+{$PzF=y? zUMV(cl-Un_t4{F*vrO6Z#>8(Y`5Bgd!eUnfP;-W7_2A9r*pftowcrh6$&6Aw_*Svj^aHbX#H@q)17GcOlc!{pqB<+!;7d*uwv~d_L<{HeH zb_*U?(ev0|83*&Lc24UcW<#B$u9n8!v_rday5=pM-ncwn!n!13Nrc5wv=}DLWQu!1 ziw{^98`z`N=)jBIyLS#YO|SVsmtc753dMy-o^Yi^#C4(2B0l%MUa!~ZLy>q?-@fO0 z_p0|TEf>e-mICqxE_C^9iY14$RQU8z@zZah%{1nYliqDX)BMq^^Rzh;T^l8m;Y>}A z70w|@M^jBpEkGE=NzVi~z&WEdHOB|RVJ?HqvniG0p(#DF%p(>L0ve&<6CC5}ch!D@ z@B5-s0|;hS3x~J@5;?(b?*cm|vrtR*TaruPDPV>T37XpodbE%9Svc;+EE#5O$kA9j zH6xi6n4R>pP}}udnwo|BGNvNhxLwa;ITz|0|D^g^VUuDL3C-}NI34i>f^$p~<`iz% zfx-tbOOpy6r!<~Jb*)+h)KlA-OV?iy*{;gc{tR-lE0v@IvRyNaKv%B^kH4$`tLKrdUySAk3> zmlX3qvxF^XJouJDo}KDfL44JX>tBI-3F30P$gd5N8uk}$TN{5a$+g>m#g_HbzXOfM z-EiJW``>78Adz@|V;bt%h~7aNu-5`?)34HQ(*=PUsZi1v1GoplU8aV(uIqIO0=N$b zk0%=<9*!h*M?x2BaU>GFEk!&6G|wQU>qu$WNu3GfBaayP=vrGw9IOGLyXE?lM*hB! zZk?s7II^LlVU*t;tTfUy%~iw?%2VHi${C`p`dAd?3zRct1;dMD%^SlPn|BeJiIOu@l~8;fO~~ilx&=lY1d1 z+}WeoBWw#w=h5PE5~Hu3#N8Ql!DG!^NAnQ39-U2Mz$TVrQV(itc!2XHl=z)sSPzc7 zyOjsQqiui7UJqL`%&=KB+nDLC+m(u|4!j3*KxYgSi3V(d@Dqc*e1aSR$(?ZhDHyzE z_L;&FOCtNG*L>JB$RV>h!lE|N=hzD+QH4hWZ-8JMC1C*TuFugQz!Hd{Kcx}{mf}Z( z(3T(SX-mV=#)ug(r}Cl`#IGr&Jm%y-V5qD?Y!&4x>J(V<3^dw6D1>JXDwS>O^S8)v z+lSYKyH8q;UTbH!alGH{bvvE?z%}AIWxw%w2d4yvBA?l7cG>|2E7x;?jkYbGGhD>z zPdzvh{FJMl2e~MWc-d@oL-o0hA1k)jFU&c0>*Uv*zCW~rpCeAC8ecNgNv#!&tJ`?I zztd~9TfKJUU}t7EXL+sBqpXjS&9>(+g?h_+S&*ELd{w(2GG8yc^X;wMFPg1JxA8(u zQmG7mNFkJ&5wZ6D`L{LunLvbHB;OmK;s%CwwQ6yY_pA56{dRk6-Py3kY8}BcUcXSs LOZFq5zK{G4uu!sk literal 0 HcmV?d00001 diff --git a/houdini/otls/backup/Vop::DW_MOONRAY::DecayLightFilter::1_bak2.hda b/houdini/otls/backup/Vop::DW_MOONRAY::DecayLightFilter::1_bak2.hda new file mode 100644 index 0000000000000000000000000000000000000000..29b214aa441579d536bc5bee6dc7be07e1e9dea7 GIT binary patch literal 5088 zcmd5=ZEqXL5tbVRLC;Q+1Sk-sKr%TyklmJg`4-5c1ez2Z0TO9Ml;grNh!t;--0FCH zxZBf<4gE0xxFC6EcTYS@WMZ^#>jMbh?aa>0Gc&t8yWi`)SeZQ^;q{aKUT5#c@My0+ z*zflo?aq^beY<;w_s=J~j8v-DCXqH~AYirZZ`}`|E?+!%V#qZ&*`3vW+e0ivK`h&P6OC~FuoN!2a zp);7bwSG(35@UAXl@YT4^1T0ScsdosB(}Z`g)uTMg;6>Mxq3c=$m-qycZ!LKWNt1q z*-RJ=CxFgWp-vL1OOutRXl~G%&QfWnqBw1?mPJ(KT_rE;j~+Kfs~*9RLB8KnBGKcc zQLZxM*zdjd?DyNb6h>CGdv6hjPJI0GYw-Pf0K=Z;I)jNy7X6GpDj@G?Fs*r}yWh(M ze*NihEZC3T8)%&rYsEw+u_OKA7f-t1Ez=Rp>4~XaS^4a*nDvFHeY$sHa)Fr1YgL~; z1^q75ACU8c3hM^NI;UGfT96tfN~5O;#z-W|C5>e&b2uCYZvw)T!VC)EMNnw@z4q{? zCPz)giA*S5o{Ekwmnp)|;iM_DHW!yp_H{N;Ey9*0FHj_@NL<3uW?)BEiu@pz8qz6+ z{nSaHjmB_U$MGOhgN9wZRJngJ9iVq7pn8#l))OD#UPs5L|u)7Yq6 zlu9P7UPP=MUNFyj=?H}yr^1vuaU18)Jh0d!%!`F-Uw1(leQ z%XrTE-_1}zZJg_}KF?K4#EbXPq3wdtGJWp5<=4evM$AM$t?6feCrkUJ|olq#3q zAQ3N-Wb}BPNE^gzyil(ts-gPie|eE_;h@aZg3Ls^tg7+} znS-?kb+k6~hZV6;MvUo=Uy_EovSx;eL0!R2)lw9yq~VmCSK{&L-l|=;fS>n^%tqaC z7VnUWw44J5yB4xB_2atn%Fq+^L_Z_wt( z#=-=O6c*5QBq`4I)F+YAiKf9s6_r@LVY`OYG9suKG~#|} zrq|87P$mG6iUXL|(^$o=0^;U&eTh|%1DJJ@II<8751XSBNN^aSmR9G#*&vONH80i-8ETeID!XzOW~%Yx?(_>|b{$7_{UQ~l6^9-ZD8Iuxg}I(RyPRz?^5+VeQ!c^glHXSs~kMF$OH zCL^XF*!E`$ksCfg@kpG>wir!h)MhN*1RmTUA>d9Qe;%PiXU0S0ahkx^e(IW5Kk>Mb zouj&o+q)Ojgw7n6&2V!KTe(a}8W$DgW_Ud4HogmYcYo)-jjIVnJoT}1F23dI6xc&Zfrw5n?Xgp2xTP4`^n;w9HWE4}XwJ;JzG(y>QwxSvCX($Z zKxGy3N%0&q6*68>0UdCK{aK?%V~5*;ZMM{&znkI1?>ntwXRq5jJ{SxK{r*Adj^Lhh z(0aOuAq6P>$bP%u3mGgg=MYyNHhC^k#IUCso+)`QbI$`Vh7tX1Pa4k89o&{|uiqGR z;?~)&n!MlCg8PtjouA%P)6c9H>(`+5^k8q;>UD;_*5Tf@R?qUgN{`ADAY1O#?~;mb zYh^`pGJI9LKUUuivr98UZ?m)g&C7PDHE6w5Q`?r{CWpN&jY^6jsDG{5s|ht4fc)t6 n919roYSsF|)~`N(^=fB(-RZE&Y7IdeuiwbyCF@bZ7c{>D%zd@2 literal 0 HcmV?d00001 diff --git a/houdini/otls/backup/Vop::DW_MOONRAY::DecayLightFilter::1_bak3.hda b/houdini/otls/backup/Vop::DW_MOONRAY::DecayLightFilter::1_bak3.hda new file mode 100644 index 0000000000000000000000000000000000000000..1055b8beb1b3735afa898d88024a858fa0f847e2 GIT binary patch literal 5088 zcmd5=`)}Ju5_YZuieqwzwm^ZR1@5Ly3MY4!AHNljWkZpys{vaIY9-AfErhkWl(we0 z1iAF1f&Z}nafiEac9#}qNo~-ky$CQ&?##~Pn{OY(!(Qj*+U)lp9{+OK>m0lso*c9X zhy9+D-FfoE7yH+E{%E4hNTq6H5{X2e<|4mZTf6gwwY3lmp?)Q7&wEn%b zgMrPC9EqzVHJ+HRN{q~RcDCKTkN)Q8-GPa__*Q_y+2e+4)hqZu#P>T&Bzk-@ z%2j5Z`n{jL`u%n;g^`u)-cKk)Cw~6w@6h{rfWV&RIzxy`7X6GfDq!zFP}=YY?tU#3 zOhfSJs=RkngJ9iVq7pnTerumNG(1K(i$SmWgOIk zq_T;qmkFzcm&|inIzgevsW4>@ZgylW%EZti7rO{4^6#&0;Vs~{fUb)50uo5$J zjAz#WB18SOajwhyJhxgR-n@qnZC8A@>ACN=Usr>fFcbN-=AZSQE$vCmBmDDLDlWT0 zBHkj&=w?n#~n`7Y#2W6fXWG2$Fs^Sxv zgS`gpXk(TSJK~&-7}IONB@J_B!wgY_x`Uakl_*rCVam-r@pyC>)-FfDzqgCbRy}Yw z?~sYKoC5}@7TC8xAL?7gW483>U3fHlxArFvlz$cryAI~6`|C)u07Wj+u|&1EXnSjG zDS;w|4Ky7|igP{nBr=-ZuBv0~j25@~oL0hS6RFqZ4Txlc!@e}{q7K{52I?StXF=o5 z^$&rpT6@^Am!eiJJ)A!C^8ee)!_oKqEj_^C&gA)IZ}y?NWBMKE(EP#!Z1Xw2)s@G% zty*}X&g|myj$>9|cfT32>)<+gK&|CBaDQwD-xZRNYxIwzpe9c92be>)FF~JBzwfVT zvWPnrVRVj}fr{x7g%3qO#wp)yQW(->KGRcsB*@W3(_o^C$}FC6Tq9{25!?$JaX&Qk z>tg5f)jBrPe51s40n!#cAB*HBxq0M=nO5BZ47v9`-xRN904`= z`mY~V*4CV#v9q92y|(o<%Vojt27I}46P~Au9-Z}5*A;q4?7b~U6B)HRb?5yEdX+6d z`BbC056|!@36EnPbb$+U%J}$B|FhXM-AzJ#GhfIZ}K7ZiWxP?zD!TgKq2j(O@{}_m4t% z1^1Gp*3$zFDL~;z4%_`+$Y6Op$N1D?d2oqEjCh*ixsn$$_d3vG7}3A>q+z1%;cLn6 z=B+VjZjEhF{h0AG>dc*_D}~x7pkM{8hWt8nj-isclQ}C5N*tjY^6jsK0I4PZMf1 rfcVkb1vW77YTf3+(XT)L{`bP+1O~Oj literal 0 HcmV?d00001 diff --git a/houdini/otls/backup/Vop::DW_MOONRAY::DecayLightFilter::1_bak4.hda b/houdini/otls/backup/Vop::DW_MOONRAY::DecayLightFilter::1_bak4.hda new file mode 100644 index 0000000000000000000000000000000000000000..7bef693602e3e51f87f209a60945216fcfcd388d GIT binary patch literal 4907 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 R1j~5+LLD#Jk9_(*@;hGFydMAn literal 0 HcmV?d00001 diff --git a/houdini/otls/backup/Vop::DW_MOONRAY::IntensityLightFilter::1_bak2.hda b/houdini/otls/backup/Vop::DW_MOONRAY::IntensityLightFilter::1_bak2.hda new file mode 100644 index 0000000000000000000000000000000000000000..2a6ae3bc3111ed45675e247607f3162886758f8c GIT binary patch literal 5187 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 literal 0 HcmV?d00001 diff --git a/houdini/otls/backup/Vop::DW_MOONRAY::IntensityLightFilter::1_bak4.hda b/houdini/otls/backup/Vop::DW_MOONRAY::IntensityLightFilter::1_bak4.hda new file mode 100644 index 0000000000000000000000000000000000000000..f118fb9e9ddeeab89bcbaef58a7bc4727ce797d6 GIT binary patch literal 5006 zcmb_gjcyx75Kd_&$`MdOLPA1<_*>V@I`<7M1GQ+^y{;=iSrZ zp5wISy?6i~gNI@E=j`)env_^d&ffX|W_EVx>doq_mC5HeeEqE6tkzz6?OLT%Z#50= z*7HAq*u8-7U-o$tP)0ZV0S@Vjz~X#m<<@h>WjP)m^Qc&?zVr@St>%mJZ^a@k@`ne5i)9?0Kjr%wtLY_yY6e@6x z0yLyCJqZaRn*}OVKKVU`bNi>Rm`nwR`mXJD`2l0mlvnkHAGr;#Q<0ilIsxz_e)<+<8Vqi0kvW zO0gCEw8MEAZ^nHRb`9yHU#)wq`w8=vo+ciUm6dz{fYjGk>|Sjo1%}*_v8j9i0{xDn z-$y126zechmkTtPsBs-kmm0!}X{gL*-fNyHg) zTg+%TtKE=eO*4BDO+26HBBO}Mi2zV)_FI-`NPG$4`#gmIZbdz^WM!VRA=Herp`No; z9gG)Y+4o`+f;K1zTivP+B{j z<$1TeISEEds(>W!p?9{;cmmEX@X-a3vf3whmO?Owb=tx#rqfhyOlN;8kQ>57VAdlL z+ZHNpErjX-3X?|AA}44G98k=Bf=<*bja8M}oixN@LZz3n_jZ0N;lpn1+N(DB@>pj~?o}R=sw8I?5XbQuncG{T9Vc_nv}KOU#$x zqZArB)=eK4GB>?%smH6W6o;`)GQ;7zQjL|FY<;gjg;xyjK^Q4CW$H1SegL`eao5YLQ zeq6xzKGi>EW!e$(lMvhcnKGSz+@BZmU7~!lOOy&zf)&oBfSW!#>r=mPk5_fCGsmsH zq`{eiBN)R-07w1*I&UwW3+Fy6FTTv%6WjScChD31BPx!e%@&;dAcORnqwblR@nOl# zhSb1=;ff2A4(*~f)r}@IfR`aTyYG-$y+ng)|#fN&^CmyW71yGA5X5)D0#8C!EiHH%t5wDx_$ z2glveE^Y6Q1|fnjuYxPNg-vK1g!vrah4f19QD=YS7k78Z+1BH3mHP>_8@U6S-j*;1 z>kDzoeekSW_Nul0@=>GXby}^4YwpCB(kSoMV2J|OcBNivHC?5}>N$WOrU4p3b%Vbp zcSy+@5tawIKvu$B*d$VAUU`cl*1)A zI+uMIPj$D(jaBn@LH`(snTFQC49sj+r?2CX1|h;lk`6>e_b bdGlsxJ8x|0yla=CBJwjOv1DsI>eb1A)B&L~ literal 0 HcmV?d00001 diff --git a/houdini/otls/backup/Vop::DW_MOONRAY::IntensityLightFilter::1_bak5.hda b/houdini/otls/backup/Vop::DW_MOONRAY::IntensityLightFilter::1_bak5.hda new file mode 100644 index 0000000000000000000000000000000000000000..f118fb9e9ddeeab89bcbaef58a7bc4727ce797d6 GIT binary patch literal 5006 zcmb_gjcyx75Kd_&$`MdOLPA1<_*>V@I`<7M1GQ+^y{;=iSrZ zp5wISy?6i~gNI@E=j`)env_^d&ffX|W_EVx>doq_mC5HeeEqE6tkzz6?OLT%Z#50= z*7HAq*u8-7U-o$tP)0ZV0S@Vjz~X#m<<@h>WjP)m^Qc&?zVr@St>%mJZ^a@k@`ne5i)9?0Kjr%wtLY_yY6e@6x z0yLyCJqZaRn*}OVKKVU`bNi>Rm`nwR`mXJD`2l0mlvnkHAGr;#Q<0ilIsxz_e)<+<8Vqi0kvW zO0gCEw8MEAZ^nHRb`9yHU#)wq`w8=vo+ciUm6dz{fYjGk>|Sjo1%}*_v8j9i0{xDn z-$y126zechmkTtPsBs-kmm0!}X{gL*-fNyHg) zTg+%TtKE=eO*4BDO+26HBBO}Mi2zV)_FI-`NPG$4`#gmIZbdz^WM!VRA=Herp`No; z9gG)Y+4o`+f;K1zTivP+B{j z<$1TeISEEds(>W!p?9{;cmmEX@X-a3vf3whmO?Owb=tx#rqfhyOlN;8kQ>57VAdlL z+ZHNpErjX-3X?|AA}44G98k=Bf=<*bja8M}oixN@LZz3n_jZ0N;lpn1+N(DB@>pj~?o}R=sw8I?5XbQuncG{T9Vc_nv}KOU#$x zqZArB)=eK4GB>?%smH6W6o;`)GQ;7zQjL|FY<;gjg;xyjK^Q4CW$H1SegL`eao5YLQ zeq6xzKGi>EW!e$(lMvhcnKGSz+@BZmU7~!lOOy&zf)&oBfSW!#>r=mPk5_fCGsmsH zq`{eiBN)R-07w1*I&UwW3+Fy6FTTv%6WjScChD31BPx!e%@&;dAcORnqwblR@nOl# zhSb1=;ff2A4(*~f)r}@IfR`aTyYG-$y+ng)|#fN&^CmyW71yGA5X5)D0#8C!EiHH%t5wDx_$ z2glveE^Y6Q1|fnjuYxPNg-vK1g!vrah4f19QD=YS7k78Z+1BH3mHP>_8@U6S-j*;1 z>kDzoeekSW_Nul0@=>GXby}^4YwpCB(kSoMV2J|OcBNivHC?5}>N$WOrU4p3b%Vbp zcSy+@5tawIKvu$B*d$VAUU`cl*1)A zI+uMIPj$D(jaBn@LH`(snTFQC49sj+r?2CX1|h;lk`6>e_b bdGlsxJ8x|0yla=CBJwjOv1DsI>eb1A)B&L~ literal 0 HcmV?d00001 diff --git a/houdini/otls/backup/Vop::DW_MOONRAY::IntensityLightFilter::1_bak6.hda b/houdini/otls/backup/Vop::DW_MOONRAY::IntensityLightFilter::1_bak6.hda new file mode 100644 index 0000000000000000000000000000000000000000..f118fb9e9ddeeab89bcbaef58a7bc4727ce797d6 GIT binary patch literal 5006 zcmb_gjcyx75Kd_&$`MdOLPA1<_*>V@I`<7M1GQ+^y{;=iSrZ zp5wISy?6i~gNI@E=j`)env_^d&ffX|W_EVx>doq_mC5HeeEqE6tkzz6?OLT%Z#50= z*7HAq*u8-7U-o$tP)0ZV0S@Vjz~X#m<<@h>WjP)m^Qc&?zVr@St>%mJZ^a@k@`ne5i)9?0Kjr%wtLY_yY6e@6x z0yLyCJqZaRn*}OVKKVU`bNi>Rm`nwR`mXJD`2l0mlvnkHAGr;#Q<0ilIsxz_e)<+<8Vqi0kvW zO0gCEw8MEAZ^nHRb`9yHU#)wq`w8=vo+ciUm6dz{fYjGk>|Sjo1%}*_v8j9i0{xDn z-$y126zechmkTtPsBs-kmm0!}X{gL*-fNyHg) zTg+%TtKE=eO*4BDO+26HBBO}Mi2zV)_FI-`NPG$4`#gmIZbdz^WM!VRA=Herp`No; z9gG)Y+4o`+f;K1zTivP+B{j z<$1TeISEEds(>W!p?9{;cmmEX@X-a3vf3whmO?Owb=tx#rqfhyOlN;8kQ>57VAdlL z+ZHNpErjX-3X?|AA}44G98k=Bf=<*bja8M}oixN@LZz3n_jZ0N;lpn1+N(DB@>pj~?o}R=sw8I?5XbQuncG{T9Vc_nv}KOU#$x zqZArB)=eK4GB>?%smH6W6o;`)GQ;7zQjL|FY<;gjg;xyjK^Q4CW$H1SegL`eao5YLQ zeq6xzKGi>EW!e$(lMvhcnKGSz+@BZmU7~!lOOy&zf)&oBfSW!#>r=mPk5_fCGsmsH zq`{eiBN)R-07w1*I&UwW3+Fy6FTTv%6WjScChD31BPx!e%@&;dAcORnqwblR@nOl# zhSb1=;ff2A4(*~f)r}@IfR`aTyYG-$y+ng)|#fN&^CmyW71yGA5X5)D0#8C!EiHH%t5wDx_$ z2glveE^Y6Q1|fnjuYxPNg-vK1g!vrah4f19QD=YS7k78Z+1BH3mHP>_8@U6S-j*;1 z>kDzoeekSW_Nul0@=>GXby}^4YwpCB(kSoMV2J|OcBNivHC?5}>N$WOrU4p3b%Vbp zcSy+@5tawIKvu$B*d$VAUU`cl*1)A zI+uMIPj$D(jaBn@LH`(snTFQC49sj+r?2CX1|h;lk`6>e_b bdGlsxJ8x|0yla=CBJwjOv1DsI>eb1A)B&L~ literal 0 HcmV?d00001 diff --git a/houdini/python3.11libs/__pycache__/moonray_lightfilter_nodes.cpython-314.pyc b/houdini/python3.11libs/__pycache__/moonray_lightfilter_nodes.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..483ca7b69b8403ba9c791148957dd93bcc741790 GIT binary patch literal 17394 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 F``=Uo&jSDe literal 0 HcmV?d00001 diff --git a/houdini/python3.11libs/moonray_lightfilter_nodes.py b/houdini/python3.11libs/moonray_lightfilter_nodes.py index ac05d5f..8613ef5 100644 --- a/houdini/python3.11libs/moonray_lightfilter_nodes.py +++ b/houdini/python3.11libs/moonray_lightfilter_nodes.py @@ -17,6 +17,74 @@ TEMPLATE_NODE = "kma_lfilter_attenuation" USD_LIGHTFILTER_EXTRA_INFO = "shadertype=lightfilter visibleoutputs=0 vopnetmask='usdlightfilter' " +def toggle(name, label, default="0", help_text=""): + return { + "name": name, + "label": label, + "vop_type": "int", + "parm_type": "toggle", + "default": default, + "script_ritype": "int", + "help": help_text, + } + + +def int_parm(name, label, default="0", value_range=None, help_text="", menu=None): + item = { + "name": name, + "label": label, + "vop_type": "int", + "parm_type": "integer", + "default": default, + "script_ritype": "int", + "help": help_text, + } + if value_range is not None: + item["range"] = value_range + if menu is not None: + item["menu"] = menu + return item + + +def float_parm(name, label, default="0", value_range=None, help_text=""): + item = { + "name": name, + "label": label, + "vop_type": "float", + "parm_type": "float", + "default": default, + "script_ritype": "float", + "help": help_text, + } + if value_range is not None: + item["range"] = value_range + return item + + +def color_parm(name, label, default=("1", "1", "1"), help_text=""): + return { + "name": name, + "label": label, + "vop_type": "vector", + "parm_type": "color", + "default": default, + "range": (0, 1), + "script_ritype": "color", + "help": help_text, + } + + +def string_parm(name, label, default="", help_text=""): + return { + "name": name, + "label": label, + "vop_type": "string", + "parm_type": "string", + "default": default, + "script_ritype": "string", + "help": help_text, + } + LIGHT_FILTERS = { "IntensityLightFilter": { @@ -164,6 +232,174 @@ }, ], }, + "BarnDoorLightFilter": { + "label": "MoonRay Barn Door Light Filter", + "folder": ("barn_door_filter", "Barn Door Filter"), + "inputs": [ + toggle("on", "On", "1", "Turns the light filter on or off."), + int_parm( + "projector_type", + "Projector Type", + "0", + menu=[ + ("0", "Perspective"), + ("1", "Orthographic"), + ], + help_text="The projection type used to map points to the flap opening.", + ), + float_parm( + "projector_focal_distance", + "Projector Focal Distance", + "30", + (0, 100), + "Distance of the flap opening from the projector origin.", + ), + float_parm( + "projector_width", + "Projector Width", + "1", + (0, 100), + "Width of the flap opening.", + ), + float_parm( + "projector_height", + "Projector Height", + "1", + (0, 100), + "Height of the flap opening.", + ), + float_parm( + "edge_scale_top", + "Edge Scale Top", + "1", + (0, 10), + "Scale factor for the top edge.", + ), + float_parm( + "edge_scale_bottom", + "Edge Scale Bottom", + "1", + (0, 10), + "Scale factor for the bottom edge.", + ), + float_parm( + "edge_scale_left", + "Edge Scale Left", + "1", + (0, 10), + "Scale factor for the left edge.", + ), + float_parm( + "edge_scale_right", + "Edge Scale Right", + "1", + (0, 10), + "Scale factor for the right edge.", + ), + int_parm( + "pre_barn_mode", + "Pre Barn Mode", + "2", + menu=[ + ("0", "Black"), + ("1", "White"), + ("2", "Default"), + ], + help_text="Controls the region before the pre barn distance.", + ), + float_parm( + "pre_barn_distance", + "Pre Barn Distance", + "0.5", + (0, 100), + "Distance where the pre barn mode takes effect.", + ), + float_parm( + "density", + "Density", + "1", + (0, 1), + "Fades the filter effect.", + ), + toggle( + "invert", + "Invert", + "0", + "Swap application of the filter from inside to outside.", + ), + float_parm( + "radius", + "Radius", + "0", + (0, 1), + "Rounded box radius.", + ), + float_parm( + "edge", + "Edge", + "0", + (0, 1), + "Transition zone size.", + ), + int_parm( + "mode", + "Mode", + "0", + menu=[ + ("0", "Analytical"), + ("1", "Physical"), + ], + help_text="Analytical or physical barn door mode.", + ), + float_parm( + "size_top", + "Size Top", + "0", + (-100, 100), + "Additional size on the top edge.", + ), + float_parm( + "size_bottom", + "Size Bottom", + "0", + (-100, 100), + "Additional size on the bottom edge.", + ), + float_parm( + "size_left", + "Size Left", + "0", + (-100, 100), + "Additional size on the left edge.", + ), + float_parm( + "size_right", + "Size Right", + "0", + (-100, 100), + "Additional size on the right edge.", + ), + toggle( + "use_light_xform", + "Use Light Xform", + "1", + "Attach the filter to the light and ignore node_xform.", + ), + float_parm( + "rotation", + "Rotation", + "0", + (-180, 180), + "Rotation around the focal direction, in degrees.", + ), + color_parm( + "color", + "Color", + ("1", "1", "1"), + "Color within the Barn Door lit region.", + ), + ], + }, } From 5aff92a15cc691969268d7bf7524b260a4ca9923 Mon Sep 17 00:00:00 2001 From: Jakub Svoboda <132791205+rolledhand@users.noreply.github.com> Date: Sun, 7 Jun 2026 12:49:37 +0200 Subject: [PATCH 19/29] all-lighfilters-exposed Signed-off-by: Jakub Svoboda <132791205+rolledhand@users.noreply.github.com> --- ...op::DW_MOONRAY::BarnDoorLightFilter::1.hda | Bin 11541 -> 11541 bytes ...p::DW_MOONRAY::ColorRampLightFilter::1.hda | Bin 0 -> 5403 bytes ...Vop::DW_MOONRAY::CombineLightFilter::1.hda | Bin 0 -> 3203 bytes .../Vop::DW_MOONRAY::CookieLightFilter::1.hda | Bin 0 -> 8480 bytes ...p::DW_MOONRAY::CookieLightFilter_v2::1.hda | Bin 0 -> 9203 bytes .../Vop::DW_MOONRAY::DecayLightFilter::1.hda | Bin 4893 -> 4893 bytes ...p::DW_MOONRAY::IntensityLightFilter::1.hda | Bin 4992 -> 4992 bytes .../Vop::DW_MOONRAY::RodLightFilter::1.hda | Bin 0 -> 5787 bytes .../Vop::DW_MOONRAY::VdbLightFilter::1.hda | Bin 0 -> 7575 bytes ...W_MOONRAY::BarnDoorLightFilter::1_bak1.hda | Bin 4975 -> 0 bytes ...W_MOONRAY::BarnDoorLightFilter::1_bak2.hda | Bin 11736 -> 0 bytes ...W_MOONRAY::BarnDoorLightFilter::1_bak3.hda | Bin 11736 -> 0 bytes ...W_MOONRAY::BarnDoorLightFilter::1_bak4.hda | Bin 11555 -> 0 bytes ...W_MOONRAY::BarnDoorLightFilter::1_bak5.hda | Bin 11555 -> 0 bytes ...W_MOONRAY::BarnDoorLightFilter::1_bak6.hda | Bin 11555 -> 0 bytes ...::DW_MOONRAY::DecayLightFilter::1_bak1.hda | Bin 4959 -> 0 bytes ...::DW_MOONRAY::DecayLightFilter::1_bak2.hda | Bin 5088 -> 0 bytes ...::DW_MOONRAY::DecayLightFilter::1_bak3.hda | Bin 5088 -> 0 bytes ...::DW_MOONRAY::DecayLightFilter::1_bak4.hda | Bin 4907 -> 0 bytes ...::DW_MOONRAY::DecayLightFilter::1_bak5.hda | Bin 4907 -> 0 bytes ...::DW_MOONRAY::DecayLightFilter::1_bak6.hda | Bin 4907 -> 0 bytes ..._MOONRAY::IntensityLightFilter::1_bak1.hda | Bin 4979 -> 0 bytes ..._MOONRAY::IntensityLightFilter::1_bak2.hda | Bin 5187 -> 0 bytes ..._MOONRAY::IntensityLightFilter::1_bak3.hda | Bin 5187 -> 0 bytes ..._MOONRAY::IntensityLightFilter::1_bak4.hda | Bin 5006 -> 0 bytes ..._MOONRAY::IntensityLightFilter::1_bak5.hda | Bin 5006 -> 0 bytes ..._MOONRAY::IntensityLightFilter::1_bak6.hda | Bin 5006 -> 0 bytes .../moonray_lightfilter_nodes.cpython-314.pyc | Bin 17394 -> 0 bytes .../moonray_lightfilter_nodes.py | 587 ++++++++++++++---- 29 files changed, 460 insertions(+), 127 deletions(-) create mode 100644 houdini/otls/Vop::DW_MOONRAY::ColorRampLightFilter::1.hda create mode 100644 houdini/otls/Vop::DW_MOONRAY::CombineLightFilter::1.hda create mode 100644 houdini/otls/Vop::DW_MOONRAY::CookieLightFilter::1.hda create mode 100644 houdini/otls/Vop::DW_MOONRAY::CookieLightFilter_v2::1.hda create mode 100644 houdini/otls/Vop::DW_MOONRAY::RodLightFilter::1.hda create mode 100644 houdini/otls/Vop::DW_MOONRAY::VdbLightFilter::1.hda delete mode 100644 houdini/otls/backup/Vop::DW_MOONRAY::BarnDoorLightFilter::1_bak1.hda delete mode 100644 houdini/otls/backup/Vop::DW_MOONRAY::BarnDoorLightFilter::1_bak2.hda delete mode 100644 houdini/otls/backup/Vop::DW_MOONRAY::BarnDoorLightFilter::1_bak3.hda delete mode 100644 houdini/otls/backup/Vop::DW_MOONRAY::BarnDoorLightFilter::1_bak4.hda delete mode 100644 houdini/otls/backup/Vop::DW_MOONRAY::BarnDoorLightFilter::1_bak5.hda delete mode 100644 houdini/otls/backup/Vop::DW_MOONRAY::BarnDoorLightFilter::1_bak6.hda delete mode 100644 houdini/otls/backup/Vop::DW_MOONRAY::DecayLightFilter::1_bak1.hda delete mode 100644 houdini/otls/backup/Vop::DW_MOONRAY::DecayLightFilter::1_bak2.hda delete mode 100644 houdini/otls/backup/Vop::DW_MOONRAY::DecayLightFilter::1_bak3.hda delete mode 100644 houdini/otls/backup/Vop::DW_MOONRAY::DecayLightFilter::1_bak4.hda delete mode 100644 houdini/otls/backup/Vop::DW_MOONRAY::DecayLightFilter::1_bak5.hda delete mode 100644 houdini/otls/backup/Vop::DW_MOONRAY::DecayLightFilter::1_bak6.hda delete mode 100644 houdini/otls/backup/Vop::DW_MOONRAY::IntensityLightFilter::1_bak1.hda delete mode 100644 houdini/otls/backup/Vop::DW_MOONRAY::IntensityLightFilter::1_bak2.hda delete mode 100644 houdini/otls/backup/Vop::DW_MOONRAY::IntensityLightFilter::1_bak3.hda delete mode 100644 houdini/otls/backup/Vop::DW_MOONRAY::IntensityLightFilter::1_bak4.hda delete mode 100644 houdini/otls/backup/Vop::DW_MOONRAY::IntensityLightFilter::1_bak5.hda delete mode 100644 houdini/otls/backup/Vop::DW_MOONRAY::IntensityLightFilter::1_bak6.hda delete mode 100644 houdini/python3.11libs/__pycache__/moonray_lightfilter_nodes.cpython-314.pyc diff --git a/houdini/otls/Vop::DW_MOONRAY::BarnDoorLightFilter::1.hda b/houdini/otls/Vop::DW_MOONRAY::BarnDoorLightFilter::1.hda index 47c84aed0299c1eaff0f023026fb793a47ffb374..a10e1cc15f442fce7327db26482049115415f51d 100644 GIT binary patch delta 54 ycmbOlH8pC2Hj_v9L|p|C>2C=nH+Gpa0;$Od8FfL_2S$4kWyl2LZBAg?ss#Y~?h*k2 delta 54 ycmbOlH8pC2Hj{nrL|p|C>2C=nH+Gpa0;$Od8FfL_2S$4kWyl2LZBAg?ss#Y(`4M0M diff --git a/houdini/otls/Vop::DW_MOONRAY::ColorRampLightFilter::1.hda b/houdini/otls/Vop::DW_MOONRAY::ColorRampLightFilter::1.hda new file mode 100644 index 0000000000000000000000000000000000000000..b8b1d02e61b71d4740d532f8c0c6b0767784da09 GIT binary patch literal 5403 zcmc&&?{3>R5Kq?v!@OoFx((R3a%u;+Kock5hBS8JTF#m+v4g}(I&_`JShUSW76p<@ zoECk8y+t2x&#^m_ie$@4)2&$rB$jx`yW{WvkjKrA|6(D3Zo=#0X2);82=>~o-e$LB zX*U{w{_y-Sc)vRmX~<)~JPK*Vk0h063kx?I$mKX5ABbda%|8sbyWP%i^VhXC7^t;G zB;+m~CtG|t(i=R|Os=i1+PPovy16$%%q{qPSdww!{DphlLd3iDj2ISzI*3t1tQHXW zhe*KIwOUE)C6+z?5N6P^*lG6;ySu;a)znBNFpxbrK~VPYetk8fA(Q$nVf6^{7#KXr z30M3mVj|T^s#Sf3oQNc5dQ8=Ey_%}9z*{9w))x*sa9Yukp9A@}&uJuvdwt0hZP^#! zIriHv$*5)-ZSfs=!XNCvya#;W_Q0?mDH1S|Gu2Hr7qMDc`08(9T6O|%J!cWD>&`bQ z*iHPhCq$%{)rds{OZx2ROy5Qt_fbxVjv0i}?=b5-H|Gz3U z1yN=hWFRCdx#oiCAT-rtOf~P*C^{oU7BdNp4l8de1fCd7A>LJmd1j8Y!keejazylq zMZ|kgR9ariVu%CuFBwA=OL}INoQDS~xZIG~1QI8vk&Pg-S}~(MhJYbF)&8}k zKAI{POaQqt@%9xXFYvXIS$KfTsU>l1S z*Js4r%wEe9!;HtbFGUVq-B^TR*Eam0rJPEd1eSaVuO#QO*;E9QxOB7iAqQ{}(V;>F zS7yg@{7R%5&`R_vkV@1XmJ%t$qC_yOERE&>Sd!wynCeslUOpSpG}2@fqeOWmbl-1G z#2~KL|KJGWB-HG{I>q`GrMo;TRCVjG zoFkzS(78D{$x0P20dNE#Co0PeJ4guDU!uiu7%}7UY+Uiz3^FVG#9uZ^gw!M!@ic1= zrMKz{!0Ca?v>3JcTqAu^q-b77fR^QN#d zNiyZw~d^m0T-Qke$UHD?`EM+U9(!$+eFaPnTgdH=247N9SfkB`Rd(b;gw2*5-!O z)UKal_~}u~cH;jHBi!NV0+gR>rqDq*4w<};sx)SCI3Y7fenw@X84Fs2PPM2JPt z=aQKN|13vdcaYa^2&QSnRbMsoV8tI;%g)b7)AqUyojEh2W%!ub`$XtMQv_9O+FG;; z4;tP!mr}@S;yhr@y3BzQ`=&7WiQ9X5Jp50PzpcEj+$YWXZI(O2RDM$ok4|u3KozOO z$?87LA*KO^hOpS!9gk@c*;7G4HLO2{<_(WZ(27zmB+RVv0eMKg2UHFLhmWJ`XfPlBd#*B@Mfx9$U*|@Dd}V5o9nf+CR|qlZ9b@gX&vk`i~@oe5w#1fdQ<_k zCW(w-<4!5;-Ajs$Tz_b010Bv_GNhW4rI=KMAUI%Bfo^!KlBE+;ty(>mJ$l0S;3UU( z;QXh^TAi#sskBC{e~e*(4IhrJJ~51&eSpM%{`8tBErHvMHnV^u`)rAEBAG&UJv>3$ z3Hxy*`p4baw*O8MYH!j0h=na&y4Ah~e3>jad7B=yteJ4)6!Z7aZ3gWdLLTw33w;I; z^ThyRN3sE*_;9O`un=c#nLgR-DiQIPz}aD>Z%8pd7#I)$nDwWVaYRlmmUVA+8LAPB z`vNYehIMbhx3To2_q0)2Hy07U=%-M{bOSuSuHk~hGzoR@!E?VE`0b76{#GyOb-P=h z?GqejtNE-ALmaSnBb%*m$3rPj&NhUn0cZlz4ffW(6V6VVbUeTXb2T*V9j4I(jf3va zdTnORimRbr1$mchfg7PyA&*OHx{1+Z*41l1+iC~RjvsWI+wF6$j^({d_tGOQ{0(=B zQ7hi3sdZy*#**WajrfPqeVfaSd7Lgm><=1T_mVR`f|jkZ{{73A-|RJC^0Dc*;Pwk~ zNi~mDrTDRIZgO}ZubUnopF$~6k4e=m9G6>tRC)EPv0k$}jNgsP5D{=W2X|9>NL-NG I6};5?2QBmP1^@s6 literal 0 HcmV?d00001 diff --git a/houdini/otls/Vop::DW_MOONRAY::CombineLightFilter::1.hda b/houdini/otls/Vop::DW_MOONRAY::CombineLightFilter::1.hda new file mode 100644 index 0000000000000000000000000000000000000000..a4dd4b7a28069180f0bb3df2bcbd0a3c68f990f8 GIT binary patch literal 3203 zcmbtW>uwuG6n1D!m8F#sQYC&Mao85zA`&M+CFI(vT(3g{zC^W?wrVSDvO8W6Uhk}C zW)r(rfAfRq;sJOJ-hwlijh#3t6|9ta_gubnKQsH?;CX5BT*KGf``w`ReAsU_2m8IQ z<*hyZ?d!ci@cpwf&m)$y&2dB$b}WdPmr837wUm?i_K0WIYVd5>>Gir#8!xI=BvhJw zddyPVX7O0h9KAR@0%5bE3`{rbU06+k~ug5F!*2%Akr(Ip_A3h z3gDG4J^pY}#J}Bb4W9L${@Sm|G0%`tJl7DWcz3^n9FvF&HP2{0(P^Px3 zS6QxPeG5)_mQpn(a#AnnGFp-?gTq>P8N*5~SMMgWZv~7bJnn~rWy*@*xZ}icH3cP# z7Q7pGumHj6@a2~%cV~c(9SEMGi;T)%rWj9Usr2y+6xwtE*Y{|Gaozk~13Se}2An5y zQ;umevaFAODeUd$X{d3!WJ*h=^}kT-bEo!cYo-LjO3^b@>whEvy5`>n8wE%c28_6X zmBL)w6hLytr$n)kB*`3Nno@xwN8Vcx@JZ1T@IMU7HyX|Zf7P1hC*+tW;J>dCt)QSO zmS2|@rr5QD%q{*|SHM!G4U5ijOj45A#({0mP+5w70xVU)Q}BDKMPE>-Ji-t=_}_AD zV=aS&>pVLq3(!$QVyRKLF47F9rAij3MCAf)1aw65M8UrHNcs@D@3+P~?cqD?GPXtr zwg9>aACN4k7z>^+YufUKc9#ro7&c0c>q=4V0vq0foe?oz@)na`6=j0|bn4J=GunFU?r^WbN#eUV{IpamLJaW01cmWr)q zPjysNn&uZOrO7@D`W@^zmL>D^t{OI`)bFqh#WbAnHHXYD(fI*6jVQW=^CNQl`7ti3 zP@QKllBvOM-S+tDO4TF~923{A(f_L4JMW!$7aEuEHdlM^m881o@LVPm>e!NZQ3uS< z#~r-9OD9t@Ozij!iBgzu+?cw@aQhR*1!{V11oy$eM?{Qyt=GZ#;eie@H5I4fn8RSq zWC4qBx+8GMMS$iBg!-&m*tJ?SraY8kBM)8c>P=+~zsE}wI-^#FY0_C!`F9KE{hhyAmc#L5t{{gkY_Z~ z8f|kxSz9YieK0#e4EnC%)1y)1NVUhaX#yuUmvw)869p1PklNOQ~=GsyAo4u~D zQ5;SO+tVayhTV<+*8LMkPpNP+D22KT56do9x&k{#y@Oii0?oozv|mej@3n%Luv0E3 zD`t9`v0~yHG@i6u!$vn4b{n16nN=t9uSRjd=v}wtZV#2^>#M98Zwrw{J_<_k4746z zBrcP517d%)!*xHKt1+H+JGHM~HiO2X@sdr=F@+aSotIp(M0(2~o96n&LVd%#KRLx! pAismM30#L;e&D@+y;G}L8>a5YW$XyN594)k(GpjTwx{or{{U&bqE-L^ literal 0 HcmV?d00001 diff --git a/houdini/otls/Vop::DW_MOONRAY::CookieLightFilter::1.hda b/houdini/otls/Vop::DW_MOONRAY::CookieLightFilter::1.hda new file mode 100644 index 0000000000000000000000000000000000000000..a35646b4c3f43dd1c930e942a47e4fbdf3059bb6 GIT binary patch literal 8480 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 literal 0 HcmV?d00001 diff --git a/houdini/otls/Vop::DW_MOONRAY::DecayLightFilter::1.hda b/houdini/otls/Vop::DW_MOONRAY::DecayLightFilter::1.hda index 2800c9d5dfeb00809c34b5ece0eb233532e605b8..b8c57d40f102e577178e63954ea507f64a1ed921 100644 GIT binary patch delta 54 ycmbQMHdk$eHj_v9L|p|C>2C%kH@0gq0;$Ox8FfL_14ergrN{*0Z4O{MD*yoEG7(e& delta 54 ycmbQMHdk$eHj{nrL|p|C>2C%kH@0gq0;$Ox8FfL_14ergrN{*0Z4O{MD*yn|JrJ`1 diff --git a/houdini/otls/Vop::DW_MOONRAY::IntensityLightFilter::1.hda b/houdini/otls/Vop::DW_MOONRAY::IntensityLightFilter::1.hda index fb394051bd81fda88e574efc43d2de299f08caa4..f8b4ecbb41abc82044935e1625aa0545bf4420c0 100644 GIT binary patch delta 54 xcmZorZ&070&E(NNQC9&(`db0XjolWEKx*<)MqLo~h0z{FnKFTRn^Tx%1OeQ`5Yzww delta 54 zcmZorZ&070&17FYQC9&(`db0XjolWEKx*<)MqMWRn#o@n?Lm|&6OdQCIfY3^5CF@q B5HSD% diff --git a/houdini/otls/Vop::DW_MOONRAY::RodLightFilter::1.hda b/houdini/otls/Vop::DW_MOONRAY::RodLightFilter::1.hda new file mode 100644 index 0000000000000000000000000000000000000000..74859aacc0a2927239216b4d1b6ba22ce225eec4 GIT binary patch literal 5787 zcmd5=UvC>l5O--M#L=n+TB&ag*A}-Di4*aH+&Go%bBH0aqu5D`N@Z<)d%h*-+tck{ z;xy_bPkbCc86N7nRxPI=-AML>h2$Q)HPIa1HW!*^n#I<``etyyW|v*30f~0#i(Jx6LhRz zD=Av&#5>VpRKEBVN8Pu>?zE>eCAdQL+|=EB$iJcZ55UX1U3S%166sPMuXAa;eMknABvE*uLYuTN*Vt5fbq!G9m1)LE| zX^hLQmJucxnJGCnde5T(3M;Ewbc$&ZlgI=LtU8*?VvGx5u>>B2+l!5MLk%KMB%Cl` zhTtBkN15x>L~%X!D04%qLJ{0e{VelS;nrVDc2)PX1b!@^cx_yc8uAC@en4h*c`o({N2L74Zd|Y-UH8;Tl9_EEKRS zZ_^B@C9*-YM7A)N=oY>bUBgzQ8oWy68Birwj!ubTVKH>U#xapuiYw*OfMk(`j*2Sb zf^Ywy=?F6mbJ4F|)goK1z#9{%nEwfwOjFtRj_k05#wpK=qfCyb+#i|+GwZ4J*_>0G zyII5;D`*h0;nw+Bp;6>s-qyM3-+2~7UqA|lTH(k(H8S~ zUUUYdyXqn$#W5NfcaWvA02xvfmU%#8=wXWRAXuKwM-5hUl4J~Lb_*P)m?-F`i-;Eu z%uHQ~f{x^Q?G}i_j*&a8jp!Ago5Op8A|)|y7iX{nt1Amp(jFlk8mL1eC>-+XWueh- z|3h$eJ}(5Puwi~6;AoHjOK{Atwh*1-dGUe3V_f<#@iDvmLVSwn<(1&GQVeuu;hnj) z%QLJ5F;>5g2DmOfQ6*fgcPKgvISfK3a<%xT^F^ITXr91G^(AI@&8R7p4&I?z;Gk<= zjsR%`@EAJ*wF|s@;-Fj8B#p4p%m~(+O9DbW89f^LnV_jpB!Q(Es>9)MpQZwB<69M$ zj-gsLcAP#rrhVM1=nmH60_qJ|dFr%6Iy%DEg}$gO+Uip+*cl;e=I{5fS<>QaKahG9 zO5}fAe3GP8D08aaVh8NS5g#4(V$+?mhLrUd8HLnusi_<5TPT<7vV*tD5zQ}k#{Qn5 zUjN)@w7$X9L+1BPXcZYdDGk`v!=_I{eZ|<)jSXX~#8gcj>xWjdfuXw}M3%JnY&wYm z@8D{34R>`JGl0e;j*Y=_!`&NfEPdxbTX)uUpUC5*Y=Zc#<4Uhd>>ue1Tf=?0={1L5 zd!xCxH5d+hy)D<=*(_(P`MixJhFDulr`7AaN{iLAjp3;QnqqXLzYX`8(G!|l8I;1Y z5*saDD%A?C@Ar1rYH!hux|;HNxyTHUoZ=mT8i!4&MUpl_%tJZcaFbIR;`Mob?W>n9 zuQ_PGWD|Y!#pa~KC6g=?PVvvOZnv?K>IObOI>D_#d;?WIaW&oQ6X(^d^|hL@q1Roz Uj1hsoQ*0g1LgIqdc2v*tFYT&EdH?_b literal 0 HcmV?d00001 diff --git a/houdini/otls/Vop::DW_MOONRAY::VdbLightFilter::1.hda b/houdini/otls/Vop::DW_MOONRAY::VdbLightFilter::1.hda new file mode 100644 index 0000000000000000000000000000000000000000..3f8ead1678ba23097c6acbf280b181e20865df2f GIT binary patch literal 7575 zcmc&(TW=f36_y(VMcD*s3p6pBhfLRTWdqeMeJK=C21QafTZvRHN>1PeixGE7PPE)v z%*@hM3_tX_Kc>H|KcH_tXD-@ZE@{!KoDh(9cjnBweDlqjTc_LlW-b4H1h1cTx~=v% z;c2_s@ASI1?%tyx9zFjTy#H=2vWO>qa~#o_Uq~vi*4FMlLMbQlr*o0+?zUcr$Gu+n zMdRDuT`1T(k1me*Xsi!;teM>1-Lb7c|Bq{R4;0*ozo6Q>+H&o|u@K1%dPUA#2gK+l zRxxPkixeE&-Kr{DBo2Eh+R6yEgUt zZ=wD^);}aR3ZhIHWGE!5cFH^n2+g#ZP|XK4j<3jwB}_uNQSD8Qz%KzO$O>EvjI^^H zlu2sqVtT=15-cN}6_PB0?#6B;6JVyKS61&e3rL}7O%cHyE)a=WqPV^aN0LXOMWSVk$TKJ+*h9r;Xb;uG zlgU)XfT~DBB(Js7DV7uDPO!`Znb(H-;By%JbaFc~Bp)ll&VVH8#Hs!@Arfi^r`~wjS z8EVuOH1VDE;k_tm0lSDZ8BS@Of${@*C+GNHltUFp%J!uZn(sc8;mH&-LFhauLC1U( z*L7B-g`&t~;*y%pyg7e|F&!x+@b-L}=WeCKW0o_vBC>>_6*;eJo`|anLPy^q=qUl* zUQzPhI!h#}Xe@A{Qdj8z#dW6FD^+uyZR-^uB~)k9@N`JCSlgkh0^qa#eq-{I%R=sf zM7UXj^HSrpa5I>tGH^iOtrSv2Vz*uF*(}tk}wCH{^yTqva~*!igcw}47>#0P81Bmz|B*o^_n-J=vs6e;5|NZeb5Mhw z01zp*F~9`lN9kPyUhxS7X;jWH%oN92v0MnefR048uiy=WjewG;(6 zO3V5Sa9&S3-f3gVGNKg7?eHjiixw;#CsdD#76uUPQ|NBCDg@TGqTUry@Ok7qB`w6m zrO5et^}`_JTq*{V1B8=0@WKG(1PS{7K|xxalouj}oz_{hkSM_ggk>Wp?|@0$^GHot zlFbc#G#!9oa3XM|l&qRM7@om_aH|dPsHyo1YW|VY2-cl^P;Qy?3neXs%fXv5lPMOF z*JG9tMJKRpf#n?zcz|lvUPGS?=_9whbaZ=O&&`iz|J`W!>|VHb^H`WjOolIkce}w~ z=`u-^5reF@v9rBR@GlRs2rVv~O+*A1oqUo_Rt3;Feisn>g`kJ!T@cR8-YJBY`Q-f} zq_dwE!hB7&0uBAj+wUPf;CBk*?Re;1`syUPjN6sESw;$cetfq6(HmCd(I2_hHN23X8T>(qn9B1;1j5sJr_@(#xY4F zo~c#gxy`g`;KBT|9G!lp*5o7Tx1VE4_>5*sahjC<#csn*ThQckki}G%tINc+qtyV6 zk*o^u`w!3ZuDXbP6p_7(#0GGIK75abS@wWE1_K-9dp98yXaP2$AaQh9( zkt$M$-T6akL(JJY9C8-VoG&LdjO{5xNVSHof;k5zcuG#;Tn<{+_>ep%!IxByfB^M6 z2?Fv2m+XnjWNa`Nq(A1$tA#hDE}RWV1k6)1z%%*Wu5C5rx&|_QSOeF(B4WfCAdle` zd~1nUPio-SER``Vk24A@PzitN_O_Sd!Mm<=xB*xnpcW7*EvMzAvg)a>W8A9>mo7@sz+K*E1E z#UzC}3C-bRX~{>pu_bbz0zYi_S@h4 zHKYRdXR>Yr$8gu5)V}|Ie{aj$ YF#T>^21dZWAzYi~lvpyfYk1%GKYEv7mjD0& literal 0 HcmV?d00001 diff --git a/houdini/otls/backup/Vop::DW_MOONRAY::BarnDoorLightFilter::1_bak1.hda b/houdini/otls/backup/Vop::DW_MOONRAY::BarnDoorLightFilter::1_bak1.hda deleted file mode 100644 index ae11270ffa83d816a5fa01b898e74b829b55a3d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4975 zcmds5{camY5Ko~Jx+_Qp2?+@ardN<#ffGA_pen?vTst8Vi5(iJfC^aayS2Uee0%Kf zB{89o!UMot@MJKvd*^eLm$JaEDW8{d_}X5lz5PZ1XuH+h z>vkON#_qT8KYWJcH^wrHL?Twl5sSq@F*RFRxv@)JImZW2WV*4@{=9$C?RFkFzuefs ziM2;eC2c9yz8HOqey1YDyn7ze}zJlae+k(Y% zbQCI)8pnR?!SML$yF_a#&I~VTw;o_l+Bxmb9y)fYWQr~duDdBA(kSx-GOgxJH+OlA zxL*626z6lddQ!%ERgZZ*bflMlE$r=NNl1D+Y|2+wZvTW*Z{@Vx+h;~G%p9May8R2% zZxa13I252Q3>adnmjoSHX5`+9`NkMK5A|ZX7JG-36_~n2mIfx>g!<(+=&G({=C4>GjLgC9F#lmPA+_MT=3w zOs2ROwE2)_v4K5GjSjrXy?f_i)AWM>3kim2u25Wf-YNuJ`#yX z_3e9}cdvHe(sFTJZYdyN;6j(rrdV<~ONCDl6+it3+RS3^IO*LMG|eA9KTn$z(X~+` z8O_z?Sm7LkbUf3v)B=P-ob*g_16(jlQww|$9Og2(JX=yJ9-7h<%RFZBFrX0%?&26% zzpM5OeBTw78bC0wS~$cNkjN=+dl%R#nT1-a-;!MVP60D)M9|zu(5HQ5z`{vCX2~dH zBaX(>nHkHZ!0e=#h1#yy($qZEmoXL5#_f6@%Y{(a`3JR+3Y!$0NN9#9#p#$Q5S(L@ zFsE>*0Te!XR+?1kIHmC%YOA$6pq~2rLc0EX$aYnh_UDj`U8y7$knNhe3Uuu{fai6v z1U1xae>>iK32KhlZL=le|AThD1T{xHUx6jh`=O8W10`#(F zd>zPSa!E1&GfUWF#)EGe!i+v@sURieRQoOBM#O8+@m|( zl1Bc%k8Yi%syMQts$rbp9jr9cGtE`R41;O{73{8_aHY{Ujw(<+fl9^M@mpgaPVjPK z8+O>hAbsrPL56-C-ICK(aZPePYLy&yN2-B{y4V(CBX@`mh0Y0|d@s^MG@sg+;pD>9 z0h{omyL1YzjvXbZPlhqc)jswQ6(5STHr~%t9ua+??j*~Ibl=KpN9=^RSUBcUi(=`t z(d1r;33vAB^$6R7(s{IaoW$sBH*t5yT<}=)_R%85&4*{x7_f<@m^6a=DjwiG2_=3v z7&U_9-cI#F@NmoDwAaJ73^QyN%@$^Q^G>zussr!A9MBoVM4|y3ApGQDFP|WXKyoKs ze+UL|nFFS9#FEIq=~W;0406aUj}^ z;_5XY?Qi#+op!&|JlLLF%~@V(^e7u(WV5ZsOQGJhUKS*$BVX0-hs-yM?tE+W&eK-A z*=s%((^M)$A5sWqW<;!gfAMYAekKrM56Sl?r?`P(T~#a&^1gEa>#w&q*PIPotkw}M PHElUCE~co diff --git a/houdini/otls/backup/Vop::DW_MOONRAY::BarnDoorLightFilter::1_bak2.hda b/houdini/otls/backup/Vop::DW_MOONRAY::BarnDoorLightFilter::1_bak2.hda deleted file mode 100644 index bad2199a69ecd79401010ad1566e8cf27f56d30e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11736 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 a``w)l!-M2bLxvTxF|j13sCEVKwEiDkJbJ1C diff --git a/houdini/otls/backup/Vop::DW_MOONRAY::BarnDoorLightFilter::1_bak5.hda b/houdini/otls/backup/Vop::DW_MOONRAY::BarnDoorLightFilter::1_bak5.hda deleted file mode 100644 index 984641e270a2825196aaae8d533389023fb02e00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11555 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 a``w)l!-M2bLxvTxF|j13sCEVKwEiDkJbJ1C diff --git a/houdini/otls/backup/Vop::DW_MOONRAY::BarnDoorLightFilter::1_bak6.hda b/houdini/otls/backup/Vop::DW_MOONRAY::BarnDoorLightFilter::1_bak6.hda deleted file mode 100644 index 984641e270a2825196aaae8d533389023fb02e00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11555 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 a``w)l!-M2bLxvTxF|j13sCEVKwEiDkJbJ1C diff --git a/houdini/otls/backup/Vop::DW_MOONRAY::DecayLightFilter::1_bak1.hda b/houdini/otls/backup/Vop::DW_MOONRAY::DecayLightFilter::1_bak1.hda deleted file mode 100644 index 99ff900b0b0bd36fce24f7040f4e689532f46d81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4959 zcmds5{camY5Ko~Jx+|3m5)y(xm|lz03Y^&a16669%C!?3k=UVeN>M@9`fhD6KHna@ zdr3^_qwoOm7Cafu?B4m@#HNw>5O7lBy`9hB%e zy-wTFu08zj<3}%X{O(9*kx0baC}OebE2gF^E7u+pSI%+onM^k~TVM4KI-T~@#@Cyh zII-U1A)D@t;mGWY*l@MES#xsl{FKXGLlxKY@9rh}g|aIj97vfwWmB+Zu)4u1M=j4~ zitcT$UsATjnMYS;MBN`g>m2sR6V{6d7E6yA!;_2|ArmAQ&zq>S80Wt&Jz^18W}5PP zOu=vp;6!NAkGafDni*ZM!ih{1ZYE5R>#LcL=6F{j*X8AL!)(oG@GT_2-4ZO8!=q4% z)HwDV4+h6CJ|bFEab|cyyYT?i(8_7=bkw%#xk!dYwy8eX6i0kGr zq&T0u(UmgRYkI`vfg`=~TVZcEOG47qW)r@$a_eW5dOxS#+Bq|dVb1u>)U98Uex2xd zz@Y$bVZcBtSQ2z#nUNEWf5_r^3PYZ7g%~5>KlcHj1WkKOWG#a;@rNui>+{$PzF=y? zUMV(cl-Un_t4{F*vrO6Z#>8(Y`5Bgd!eUnfP;-W7_2A9r*pftowcrh6$&6Aw_*Svj^aHbX#H@q)17GcOlc!{pqB<+!;7d*uwv~d_L<{HeH zb_*U?(ev0|83*&Lc24UcW<#B$u9n8!v_rday5=pM-ncwn!n!13Nrc5wv=}DLWQu!1 ziw{^98`z`N=)jBIyLS#YO|SVsmtc753dMy-o^Yi^#C4(2B0l%MUa!~ZLy>q?-@fO0 z_p0|TEf>e-mICqxE_C^9iY14$RQU8z@zZah%{1nYliqDX)BMq^^Rzh;T^l8m;Y>}A z70w|@M^jBpEkGE=NzVi~z&WEdHOB|RVJ?HqvniG0p(#DF%p(>L0ve&<6CC5}ch!D@ z@B5-s0|;hS3x~J@5;?(b?*cm|vrtR*TaruPDPV>T37XpodbE%9Svc;+EE#5O$kA9j zH6xi6n4R>pP}}udnwo|BGNvNhxLwa;ITz|0|D^g^VUuDL3C-}NI34i>f^$p~<`iz% zfx-tbOOpy6r!<~Jb*)+h)KlA-OV?iy*{;gc{tR-lE0v@IvRyNaKv%B^kH4$`tLKrdUySAk3> zmlX3qvxF^XJouJDo}KDfL44JX>tBI-3F30P$gd5N8uk}$TN{5a$+g>m#g_HbzXOfM z-EiJW``>78Adz@|V;bt%h~7aNu-5`?)34HQ(*=PUsZi1v1GoplU8aV(uIqIO0=N$b zk0%=<9*!h*M?x2BaU>GFEk!&6G|wQU>qu$WNu3GfBaayP=vrGw9IOGLyXE?lM*hB! zZk?s7II^LlVU*t;tTfUy%~iw?%2VHi${C`p`dAd?3zRct1;dMD%^SlPn|BeJiIOu@l~8;fO~~ilx&=lY1d1 z+}WeoBWw#w=h5PE5~Hu3#N8Ql!DG!^NAnQ39-U2Mz$TVrQV(itc!2XHl=z)sSPzc7 zyOjsQqiui7UJqL`%&=KB+nDLC+m(u|4!j3*KxYgSi3V(d@Dqc*e1aSR$(?ZhDHyzE z_L;&FOCtNG*L>JB$RV>h!lE|N=hzD+QH4hWZ-8JMC1C*TuFugQz!Hd{Kcx}{mf}Z( z(3T(SX-mV=#)ug(r}Cl`#IGr&Jm%y-V5qD?Y!&4x>J(V<3^dw6D1>JXDwS>O^S8)v z+lSYKyH8q;UTbH!alGH{bvvE?z%}AIWxw%w2d4yvBA?l7cG>|2E7x;?jkYbGGhD>z zPdzvh{FJMl2e~MWc-d@oL-o0hA1k)jFU&c0>*Uv*zCW~rpCeAC8ecNgNv#!&tJ`?I zztd~9TfKJUU}t7EXL+sBqpXjS&9>(+g?h_+S&*ELd{w(2GG8yc^X;wMFPg1JxA8(u zQmG7mNFkJ&5wZ6D`L{LunLvbHB;OmK;s%CwwQ6yY_pA56{dRk6-Py3kY8}BcUcXSs LOZFq5zK{G4uu!sk diff --git a/houdini/otls/backup/Vop::DW_MOONRAY::DecayLightFilter::1_bak2.hda b/houdini/otls/backup/Vop::DW_MOONRAY::DecayLightFilter::1_bak2.hda deleted file mode 100644 index 29b214aa441579d536bc5bee6dc7be07e1e9dea7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5088 zcmd5=ZEqXL5tbVRLC;Q+1Sk-sKr%TyklmJg`4-5c1ez2Z0TO9Ml;grNh!t;--0FCH zxZBf<4gE0xxFC6EcTYS@WMZ^#>jMbh?aa>0Gc&t8yWi`)SeZQ^;q{aKUT5#c@My0+ z*zflo?aq^beY<;w_s=J~j8v-DCXqH~AYirZZ`}`|E?+!%V#qZ&*`3vW+e0ivK`h&P6OC~FuoN!2a zp);7bwSG(35@UAXl@YT4^1T0ScsdosB(}Z`g)uTMg;6>Mxq3c=$m-qycZ!LKWNt1q z*-RJ=CxFgWp-vL1OOutRXl~G%&QfWnqBw1?mPJ(KT_rE;j~+Kfs~*9RLB8KnBGKcc zQLZxM*zdjd?DyNb6h>CGdv6hjPJI0GYw-Pf0K=Z;I)jNy7X6GpDj@G?Fs*r}yWh(M ze*NihEZC3T8)%&rYsEw+u_OKA7f-t1Ez=Rp>4~XaS^4a*nDvFHeY$sHa)Fr1YgL~; z1^q75ACU8c3hM^NI;UGfT96tfN~5O;#z-W|C5>e&b2uCYZvw)T!VC)EMNnw@z4q{? zCPz)giA*S5o{Ekwmnp)|;iM_DHW!yp_H{N;Ey9*0FHj_@NL<3uW?)BEiu@pz8qz6+ z{nSaHjmB_U$MGOhgN9wZRJngJ9iVq7pn8#l))OD#UPs5L|u)7Yq6 zlu9P7UPP=MUNFyj=?H}yr^1vuaU18)Jh0d!%!`F-Uw1(leQ z%XrTE-_1}zZJg_}KF?K4#EbXPq3wdtGJWp5<=4evM$AM$t?6feCrkUJ|olq#3q zAQ3N-Wb}BPNE^gzyil(ts-gPie|eE_;h@aZg3Ls^tg7+} znS-?kb+k6~hZV6;MvUo=Uy_EovSx;eL0!R2)lw9yq~VmCSK{&L-l|=;fS>n^%tqaC z7VnUWw44J5yB4xB_2atn%Fq+^L_Z_wt( z#=-=O6c*5QBq`4I)F+YAiKf9s6_r@LVY`OYG9suKG~#|} zrq|87P$mG6iUXL|(^$o=0^;U&eTh|%1DJJ@II<8751XSBNN^aSmR9G#*&vONH80i-8ETeID!XzOW~%Yx?(_>|b{$7_{UQ~l6^9-ZD8Iuxg}I(RyPRz?^5+VeQ!c^glHXSs~kMF$OH zCL^XF*!E`$ksCfg@kpG>wir!h)MhN*1RmTUA>d9Qe;%PiXU0S0ahkx^e(IW5Kk>Mb zouj&o+q)Ojgw7n6&2V!KTe(a}8W$DgW_Ud4HogmYcYo)-jjIVnJoT}1F23dI6xc&Zfrw5n?Xgp2xTP4`^n;w9HWE4}XwJ;JzG(y>QwxSvCX($Z zKxGy3N%0&q6*68>0UdCK{aK?%V~5*;ZMM{&znkI1?>ntwXRq5jJ{SxK{r*Adj^Lhh z(0aOuAq6P>$bP%u3mGgg=MYyNHhC^k#IUCso+)`QbI$`Vh7tX1Pa4k89o&{|uiqGR z;?~)&n!MlCg8PtjouA%P)6c9H>(`+5^k8q;>UD;_*5Tf@R?qUgN{`ADAY1O#?~;mb zYh^`pGJI9LKUUuivr98UZ?m)g&C7PDHE6w5Q`?r{CWpN&jY^6jsDG{5s|ht4fc)t6 n919roYSsF|)~`N(^=fB(-RZE&Y7IdeuiwbyCF@bZ7c{>D%zd@2 diff --git a/houdini/otls/backup/Vop::DW_MOONRAY::DecayLightFilter::1_bak3.hda b/houdini/otls/backup/Vop::DW_MOONRAY::DecayLightFilter::1_bak3.hda deleted file mode 100644 index 1055b8beb1b3735afa898d88024a858fa0f847e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5088 zcmd5=`)}Ju5_YZuieqwzwm^ZR1@5Ly3MY4!AHNljWkZpys{vaIY9-AfErhkWl(we0 z1iAF1f&Z}nafiEac9#}qNo~-ky$CQ&?##~Pn{OY(!(Qj*+U)lp9{+OK>m0lso*c9X zhy9+D-FfoE7yH+E{%E4hNTq6H5{X2e<|4mZTf6gwwY3lmp?)Q7&wEn%b zgMrPC9EqzVHJ+HRN{q~RcDCKTkN)Q8-GPa__*Q_y+2e+4)hqZu#P>T&Bzk-@ z%2j5Z`n{jL`u%n;g^`u)-cKk)Cw~6w@6h{rfWV&RIzxy`7X6GfDq!zFP}=YY?tU#3 zOhfSJs=RkngJ9iVq7pnTerumNG(1K(i$SmWgOIk zq_T;qmkFzcm&|inIzgevsW4>@ZgylW%EZti7rO{4^6#&0;Vs~{fUb)50uo5$J zjAz#WB18SOajwhyJhxgR-n@qnZC8A@>ACN=Usr>fFcbN-=AZSQE$vCmBmDDLDlWT0 zBHkj&=w?n#~n`7Y#2W6fXWG2$Fs^Sxv zgS`gpXk(TSJK~&-7}IONB@J_B!wgY_x`Uakl_*rCVam-r@pyC>)-FfDzqgCbRy}Yw z?~sYKoC5}@7TC8xAL?7gW483>U3fHlxArFvlz$cryAI~6`|C)u07Wj+u|&1EXnSjG zDS;w|4Ky7|igP{nBr=-ZuBv0~j25@~oL0hS6RFqZ4Txlc!@e}{q7K{52I?StXF=o5 z^$&rpT6@^Am!eiJJ)A!C^8ee)!_oKqEj_^C&gA)IZ}y?NWBMKE(EP#!Z1Xw2)s@G% zty*}X&g|myj$>9|cfT32>)<+gK&|CBaDQwD-xZRNYxIwzpe9c92be>)FF~JBzwfVT zvWPnrVRVj}fr{x7g%3qO#wp)yQW(->KGRcsB*@W3(_o^C$}FC6Tq9{25!?$JaX&Qk z>tg5f)jBrPe51s40n!#cAB*HBxq0M=nO5BZ47v9`-xRN904`= z`mY~V*4CV#v9q92y|(o<%Vojt27I}46P~Au9-Z}5*A;q4?7b~U6B)HRb?5yEdX+6d z`BbC056|!@36EnPbb$+U%J}$B|FhXM-AzJ#GhfIZ}K7ZiWxP?zD!TgKq2j(O@{}_m4t% z1^1Gp*3$zFDL~;z4%_`+$Y6Op$N1D?d2oqEjCh*ixsn$$_d3vG7}3A>q+z1%;cLn6 z=B+VjZjEhF{h0AG>dc*_D}~x7pkM{8hWt8nj-isclQ}C5N*tjY^6jsK0I4PZMf1 rfcVkb1vW77YTf3+(XT)L{`bP+1O~Oj diff --git a/houdini/otls/backup/Vop::DW_MOONRAY::DecayLightFilter::1_bak4.hda b/houdini/otls/backup/Vop::DW_MOONRAY::DecayLightFilter::1_bak4.hda deleted file mode 100644 index 7bef693602e3e51f87f209a60945216fcfcd388d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4907 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 R1j~5+LLD#Jk9_(*@;hGFydMAn diff --git a/houdini/otls/backup/Vop::DW_MOONRAY::IntensityLightFilter::1_bak2.hda b/houdini/otls/backup/Vop::DW_MOONRAY::IntensityLightFilter::1_bak2.hda deleted file mode 100644 index 2a6ae3bc3111ed45675e247607f3162886758f8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5187 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 diff --git a/houdini/otls/backup/Vop::DW_MOONRAY::IntensityLightFilter::1_bak4.hda b/houdini/otls/backup/Vop::DW_MOONRAY::IntensityLightFilter::1_bak4.hda deleted file mode 100644 index f118fb9e9ddeeab89bcbaef58a7bc4727ce797d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5006 zcmb_gjcyx75Kd_&$`MdOLPA1<_*>V@I`<7M1GQ+^y{;=iSrZ zp5wISy?6i~gNI@E=j`)env_^d&ffX|W_EVx>doq_mC5HeeEqE6tkzz6?OLT%Z#50= z*7HAq*u8-7U-o$tP)0ZV0S@Vjz~X#m<<@h>WjP)m^Qc&?zVr@St>%mJZ^a@k@`ne5i)9?0Kjr%wtLY_yY6e@6x z0yLyCJqZaRn*}OVKKVU`bNi>Rm`nwR`mXJD`2l0mlvnkHAGr;#Q<0ilIsxz_e)<+<8Vqi0kvW zO0gCEw8MEAZ^nHRb`9yHU#)wq`w8=vo+ciUm6dz{fYjGk>|Sjo1%}*_v8j9i0{xDn z-$y126zechmkTtPsBs-kmm0!}X{gL*-fNyHg) zTg+%TtKE=eO*4BDO+26HBBO}Mi2zV)_FI-`NPG$4`#gmIZbdz^WM!VRA=Herp`No; z9gG)Y+4o`+f;K1zTivP+B{j z<$1TeISEEds(>W!p?9{;cmmEX@X-a3vf3whmO?Owb=tx#rqfhyOlN;8kQ>57VAdlL z+ZHNpErjX-3X?|AA}44G98k=Bf=<*bja8M}oixN@LZz3n_jZ0N;lpn1+N(DB@>pj~?o}R=sw8I?5XbQuncG{T9Vc_nv}KOU#$x zqZArB)=eK4GB>?%smH6W6o;`)GQ;7zQjL|FY<;gjg;xyjK^Q4CW$H1SegL`eao5YLQ zeq6xzKGi>EW!e$(lMvhcnKGSz+@BZmU7~!lOOy&zf)&oBfSW!#>r=mPk5_fCGsmsH zq`{eiBN)R-07w1*I&UwW3+Fy6FTTv%6WjScChD31BPx!e%@&;dAcORnqwblR@nOl# zhSb1=;ff2A4(*~f)r}@IfR`aTyYG-$y+ng)|#fN&^CmyW71yGA5X5)D0#8C!EiHH%t5wDx_$ z2glveE^Y6Q1|fnjuYxPNg-vK1g!vrah4f19QD=YS7k78Z+1BH3mHP>_8@U6S-j*;1 z>kDzoeekSW_Nul0@=>GXby}^4YwpCB(kSoMV2J|OcBNivHC?5}>N$WOrU4p3b%Vbp zcSy+@5tawIKvu$B*d$VAUU`cl*1)A zI+uMIPj$D(jaBn@LH`(snTFQC49sj+r?2CX1|h;lk`6>e_b bdGlsxJ8x|0yla=CBJwjOv1DsI>eb1A)B&L~ diff --git a/houdini/otls/backup/Vop::DW_MOONRAY::IntensityLightFilter::1_bak5.hda b/houdini/otls/backup/Vop::DW_MOONRAY::IntensityLightFilter::1_bak5.hda deleted file mode 100644 index f118fb9e9ddeeab89bcbaef58a7bc4727ce797d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5006 zcmb_gjcyx75Kd_&$`MdOLPA1<_*>V@I`<7M1GQ+^y{;=iSrZ zp5wISy?6i~gNI@E=j`)env_^d&ffX|W_EVx>doq_mC5HeeEqE6tkzz6?OLT%Z#50= z*7HAq*u8-7U-o$tP)0ZV0S@Vjz~X#m<<@h>WjP)m^Qc&?zVr@St>%mJZ^a@k@`ne5i)9?0Kjr%wtLY_yY6e@6x z0yLyCJqZaRn*}OVKKVU`bNi>Rm`nwR`mXJD`2l0mlvnkHAGr;#Q<0ilIsxz_e)<+<8Vqi0kvW zO0gCEw8MEAZ^nHRb`9yHU#)wq`w8=vo+ciUm6dz{fYjGk>|Sjo1%}*_v8j9i0{xDn z-$y126zechmkTtPsBs-kmm0!}X{gL*-fNyHg) zTg+%TtKE=eO*4BDO+26HBBO}Mi2zV)_FI-`NPG$4`#gmIZbdz^WM!VRA=Herp`No; z9gG)Y+4o`+f;K1zTivP+B{j z<$1TeISEEds(>W!p?9{;cmmEX@X-a3vf3whmO?Owb=tx#rqfhyOlN;8kQ>57VAdlL z+ZHNpErjX-3X?|AA}44G98k=Bf=<*bja8M}oixN@LZz3n_jZ0N;lpn1+N(DB@>pj~?o}R=sw8I?5XbQuncG{T9Vc_nv}KOU#$x zqZArB)=eK4GB>?%smH6W6o;`)GQ;7zQjL|FY<;gjg;xyjK^Q4CW$H1SegL`eao5YLQ zeq6xzKGi>EW!e$(lMvhcnKGSz+@BZmU7~!lOOy&zf)&oBfSW!#>r=mPk5_fCGsmsH zq`{eiBN)R-07w1*I&UwW3+Fy6FTTv%6WjScChD31BPx!e%@&;dAcORnqwblR@nOl# zhSb1=;ff2A4(*~f)r}@IfR`aTyYG-$y+ng)|#fN&^CmyW71yGA5X5)D0#8C!EiHH%t5wDx_$ z2glveE^Y6Q1|fnjuYxPNg-vK1g!vrah4f19QD=YS7k78Z+1BH3mHP>_8@U6S-j*;1 z>kDzoeekSW_Nul0@=>GXby}^4YwpCB(kSoMV2J|OcBNivHC?5}>N$WOrU4p3b%Vbp zcSy+@5tawIKvu$B*d$VAUU`cl*1)A zI+uMIPj$D(jaBn@LH`(snTFQC49sj+r?2CX1|h;lk`6>e_b bdGlsxJ8x|0yla=CBJwjOv1DsI>eb1A)B&L~ diff --git a/houdini/otls/backup/Vop::DW_MOONRAY::IntensityLightFilter::1_bak6.hda b/houdini/otls/backup/Vop::DW_MOONRAY::IntensityLightFilter::1_bak6.hda deleted file mode 100644 index f118fb9e9ddeeab89bcbaef58a7bc4727ce797d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5006 zcmb_gjcyx75Kd_&$`MdOLPA1<_*>V@I`<7M1GQ+^y{;=iSrZ zp5wISy?6i~gNI@E=j`)env_^d&ffX|W_EVx>doq_mC5HeeEqE6tkzz6?OLT%Z#50= z*7HAq*u8-7U-o$tP)0ZV0S@Vjz~X#m<<@h>WjP)m^Qc&?zVr@St>%mJZ^a@k@`ne5i)9?0Kjr%wtLY_yY6e@6x z0yLyCJqZaRn*}OVKKVU`bNi>Rm`nwR`mXJD`2l0mlvnkHAGr;#Q<0ilIsxz_e)<+<8Vqi0kvW zO0gCEw8MEAZ^nHRb`9yHU#)wq`w8=vo+ciUm6dz{fYjGk>|Sjo1%}*_v8j9i0{xDn z-$y126zechmkTtPsBs-kmm0!}X{gL*-fNyHg) zTg+%TtKE=eO*4BDO+26HBBO}Mi2zV)_FI-`NPG$4`#gmIZbdz^WM!VRA=Herp`No; z9gG)Y+4o`+f;K1zTivP+B{j z<$1TeISEEds(>W!p?9{;cmmEX@X-a3vf3whmO?Owb=tx#rqfhyOlN;8kQ>57VAdlL z+ZHNpErjX-3X?|AA}44G98k=Bf=<*bja8M}oixN@LZz3n_jZ0N;lpn1+N(DB@>pj~?o}R=sw8I?5XbQuncG{T9Vc_nv}KOU#$x zqZArB)=eK4GB>?%smH6W6o;`)GQ;7zQjL|FY<;gjg;xyjK^Q4CW$H1SegL`eao5YLQ zeq6xzKGi>EW!e$(lMvhcnKGSz+@BZmU7~!lOOy&zf)&oBfSW!#>r=mPk5_fCGsmsH zq`{eiBN)R-07w1*I&UwW3+Fy6FTTv%6WjScChD31BPx!e%@&;dAcORnqwblR@nOl# zhSb1=;ff2A4(*~f)r}@IfR`aTyYG-$y+ng)|#fN&^CmyW71yGA5X5)D0#8C!EiHH%t5wDx_$ z2glveE^Y6Q1|fnjuYxPNg-vK1g!vrah4f19QD=YS7k78Z+1BH3mHP>_8@U6S-j*;1 z>kDzoeekSW_Nul0@=>GXby}^4YwpCB(kSoMV2J|OcBNivHC?5}>N$WOrU4p3b%Vbp zcSy+@5tawIKvu$B*d$VAUU`cl*1)A zI+uMIPj$D(jaBn@LH`(snTFQC49sj+r?2CX1|h;lk`6>e_b bdGlsxJ8x|0yla=CBJwjOv1DsI>eb1A)B&L~ diff --git a/houdini/python3.11libs/__pycache__/moonray_lightfilter_nodes.cpython-314.pyc b/houdini/python3.11libs/__pycache__/moonray_lightfilter_nodes.cpython-314.pyc deleted file mode 100644 index 483ca7b69b8403ba9c791148957dd93bcc741790..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17394 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 F``=Uo&jSDe diff --git a/houdini/python3.11libs/moonray_lightfilter_nodes.py b/houdini/python3.11libs/moonray_lightfilter_nodes.py index 8613ef5..4a3a97c 100644 --- a/houdini/python3.11libs/moonray_lightfilter_nodes.py +++ b/houdini/python3.11libs/moonray_lightfilter_nodes.py @@ -17,6 +17,7 @@ TEMPLATE_NODE = "kma_lfilter_attenuation" USD_LIGHTFILTER_EXTRA_INFO = "shadertype=lightfilter visibleoutputs=0 vopnetmask='usdlightfilter' " + def toggle(name, label, default="0", help_text=""): return { "name": name, @@ -91,62 +92,38 @@ def string_parm(name, label, default="", help_text=""): "label": "MoonRay Intensity Light Filter", "folder": ("intensity_filter", "Intensity Filter"), "inputs": [ - { - "name": "on", - "label": "On", - "vop_type": "int", - "parm_type": "toggle", - "default": "1", - "script_ritype": "int", - "help": "Turns the light filter on/off.", - }, - { - "name": "intensity", - "label": "Intensity", - "vop_type": "float", - "parm_type": "float", - "default": "1", - "range": (0, 10), - "script_ritype": "float", - "help": "Multiply the light radiance by this intensity value", - }, - { - "name": "exposure", - "label": "Exposure", - "vop_type": "float", - "parm_type": "float", - "default": "0", - "range": (-10, 10), - "script_ritype": "float", - "help": "Multiply the light radiance by exposure = pow(2, exposure)", - }, - { - "name": "color", - "label": "Color", - "vop_type": "vector", - "parm_type": "color", - "default": ("1", "1", "1"), - "range": (0, 1), - "script_ritype": "color", - "help": "Multiply the light radiance by this RGB color value", - }, - { - "name": "invert", - "label": "Invert", - "vop_type": "int", - "parm_type": "toggle", - "default": "0", - "script_ritype": "int", - "help": "Invert the light radiance by 1/radiance", - }, - { - "name": "light_path_selection", - "label": "Light Path Selection", - "vop_type": "int", - "parm_type": "integer", - "default": "0", - "script_ritype": "int", - "menu": [ + toggle("on", "On", "1", "Turns the light filter on/off."), + float_parm( + "intensity", + "Intensity", + "1", + (0, 10), + "Multiply the light radiance by this intensity value", + ), + float_parm( + "exposure", + "Exposure", + "0", + (-10, 10), + "Multiply the light radiance by exposure = pow(2, exposure)", + ), + color_parm( + "color", + "Color", + ("1", "1", "1"), + "Multiply the light radiance by this RGB color value", + ), + toggle( + "invert", + "Invert", + "0", + "Invert the light radiance by 1/radiance", + ), + int_parm( + "light_path_selection", + "Light Path Selection", + "0", + menu=[ ("0", "All Light Paths"), ("1", "All Indirect"), ("2", "All Indirect First Bounce"), @@ -155,84 +132,50 @@ def string_parm(name, label, default="", help_text=""): ("5", "Indirect Specular"), ("6", "Indirect Specular First Bounce"), ], - "help": "Controls which light paths the filter is applied to.", - }, + help_text="Controls which light paths the filter is applied to.", + ), ], }, + "DecayLightFilter": { "label": "MoonRay Decay Light Filter", "folder": ("decay_filter", "Decay Filter"), "inputs": [ - { - "name": "on", - "label": "On", - "vop_type": "int", - "parm_type": "toggle", - "default": "1", - "script_ritype": "int", - "help": "Turns the light filter on or off.", - }, - { - "name": "falloff_near", - "label": "Falloff Near", - "vop_type": "int", - "parm_type": "toggle", - "default": "0", - "script_ritype": "int", - "help": "does the light fade in?", - }, - { - "name": "near_start", - "label": "Near Start", - "vop_type": "float", - "parm_type": "float", - "default": "0", - "range": (0, 100), - "script_ritype": "float", - "help": "distance from light to start of fade in", - }, - { - "name": "near_end", - "label": "Near End", - "vop_type": "float", - "parm_type": "float", - "default": "0", - "range": (0, 100), - "script_ritype": "float", - "help": "distance from light to end of fade in", - }, - { - "name": "falloff_far", - "label": "Falloff Far", - "vop_type": "int", - "parm_type": "toggle", - "default": "0", - "script_ritype": "int", - "help": "does the light fade out?", - }, - { - "name": "far_start", - "label": "Far Start", - "vop_type": "float", - "parm_type": "float", - "default": "0", - "range": (0, 100), - "script_ritype": "float", - "help": "distance from light to start of fade out", - }, - { - "name": "far_end", - "label": "Far End", - "vop_type": "float", - "parm_type": "float", - "default": "0", - "range": (0, 100), - "script_ritype": "float", - "help": "distance from light to end of fade out", - }, + toggle("on", "On", "1", "Turns the light filter on or off."), + toggle("falloff_near", "Falloff Near", "0", "Does the light fade in?"), + float_parm( + "near_start", + "Near Start", + "0", + (0, 100), + "Distance from light to start of fade in", + ), + float_parm( + "near_end", + "Near End", + "0", + (0, 100), + "Distance from light to end of fade in", + ), + toggle("falloff_far", "Falloff Far", "0", "Does the light fade out?"), + float_parm( + "far_start", + "Far Start", + "0", + (0, 100), + "Distance from light to start of fade out", + ), + float_parm( + "far_end", + "Far End", + "0", + (0, 100), + "Distance from light to end of fade out", + ), ], }, - "BarnDoorLightFilter": { + + "BarnDoorLightFilter": { "label": "MoonRay Barn Door Light Filter", "folder": ("barn_door_filter", "Barn Door Filter"), "inputs": [ @@ -400,6 +343,396 @@ def string_parm(name, label, default="", help_text=""): ), ], }, + + "ColorRampLightFilter": { + "label": "MoonRay Color Ramp Light Filter", + "folder": ("color_ramp_filter", "Color Ramp Filter"), + "inputs": [ + toggle("on", "On", "1", "Turns the light filter on or off."), + toggle("use_xform", "Use Xform", "0", "Use the filter's own transform."), + float_parm( + "begin_distance", + "Begin Distance", + "0", + (0, 100), + "Where the ramp starts.", + ), + float_parm( + "end_distance", + "End Distance", + "1", + (0, 100), + "Where the ramp ends.", + ), + float_parm( + "intensity", + "Intensity", + "1", + (0, 1), + "The intensity of the filter.", + ), + float_parm( + "density", + "Density", + "1", + (0, 1), + "The density of the filter.", + ), + int_parm( + "mode", + "Mode", + "0", + menu=[ + ("0", "Radial"), + ("1", "Directional"), + ], + help_text="Ramp mode.", + ), + int_parm( + "wrap_mode", + "Wrap Mode", + "0", + menu=[ + ("0", "Extend"), + ("1", "Mirror"), + ], + help_text="Wrap mode for directional filtering.", + ), + ], + }, + + "CombineLightFilter": { + "label": "MoonRay Combine Light Filter", + "folder": ("combine_filter", "Combine Filter"), + "inputs": [ + toggle("on", "On", "1", "Turns the light filter on or off."), + int_parm( + "mode", + "Mode", + "0", + menu=[ + ("0", "Multiply"), + ("1", "Min"), + ("2", "Max"), + ("3", "Add"), + ("4", "Subtract"), + ], + help_text="How the light filters are combined.", + ), + ], + }, + + "CookieLightFilter": { + "label": "MoonRay Cookie Light Filter", + "folder": ("cookie_filter", "Cookie Filter"), + "inputs": [ + toggle("on", "On", "1", "Turns the light filter on or off."), + int_parm( + "projector_type", + "Projector Type", + "0", + menu=[ + ("0", "Perspective"), + ("1", "Orthographic"), + ], + help_text="Perspective or orthographic projection.", + ), + float_parm( + "projector_focal", + "Projector Focal", + "30", + (0, 100), + "Projector focal length.", + ), + float_parm( + "projector_film_width_aperture", + "Projector Film Width Aperture", + "24", + (0, 100), + "Projector image plane width.", + ), + float_parm( + "projector_pixel_aspect_ratio", + "Projector Pixel Aspect Ratio", + "1", + (0.01, 10), + "Projector pixel aspect ratio.", + ), + float_parm( + "blur_near_distance", + "Blur Near Distance", + "0", + (0, 100), + "Near blur distance.", + ), + float_parm( + "blur_midpoint", + "Blur Midpoint", + "0.5", + (0, 100), + "Blur midpoint.", + ), + float_parm( + "blur_far_distance", + "Blur Far Distance", + "1", + (0, 100), + "Far blur distance.", + ), + float_parm( + "blur_near_value", + "Blur Near Value", + "0", + (0, 0.1), + "Near blur value.", + ), + float_parm( + "blur_mid_value", + "Blur Mid Value", + "0", + (0, 0.1), + "Mid blur value.", + ), + float_parm( + "blur_far_value", + "Blur Far Value", + "0", + (0, 0.1), + "Far blur value.", + ), + int_parm( + "blur_type", + "Blur Type", + "0", + menu=[ + ("0", "Gaussian"), + ("1", "Circular"), + ], + help_text="Blur type.", + ), + int_parm( + "outside_projection", + "Outside Projection", + "0", + menu=[ + ("0", "Black"), + ("1", "White"), + ("2", "Default"), + ], + help_text="Behavior outside the projection frustum.", + ), + float_parm( + "density", + "Density", + "1", + (0, 1), + "Controls how much of the cookie is added to the light.", + ), + toggle("invert", "Invert", "0", "Invert the map."), + ], + }, + + "CookieLightFilter_v2": { + "label": "MoonRay Cookie Light Filter v2", + "folder": ("cookie_v2_filter", "Cookie v2 Filter"), + "inputs": [ + toggle("on", "On", "1", "Turns the light filter on or off."), + int_parm( + "projector_type", + "Projector Type", + "0", + menu=[ + ("0", "Perspective"), + ("1", "Orthographic"), + ], + help_text="Perspective or orthographic projection.", + ), + float_parm( + "projector_focal", + "Projector Focal", + "30", + (0, 100), + "Projector focal length.", + ), + float_parm( + "projector_film_width_aperture", + "Projector Film Width Aperture", + "24", + (0, 100), + "Projector image plane width.", + ), + float_parm( + "projector_pixel_aspect_ratio", + "Projector Pixel Aspect Ratio", + "1", + (0.01, 10), + "Projector pixel aspect ratio.", + ), + float_parm( + "blur_near_distance", + "Blur Near Distance", + "0", + (0, 100), + "Near blur distance.", + ), + float_parm( + "blur_midpoint", + "Blur Midpoint", + "0.5", + (0, 100), + "Blur midpoint.", + ), + float_parm( + "blur_far_distance", + "Blur Far Distance", + "1", + (0, 100), + "Far blur distance.", + ), + float_parm( + "blur_near_value", + "Blur Near Value", + "0", + (0, 0.1), + "Near blur value.", + ), + float_parm( + "blur_mid_value", + "Blur Mid Value", + "0", + (0, 0.1), + "Mid blur value.", + ), + float_parm( + "blur_far_value", + "Blur Far Value", + "0", + (0, 0.1), + "Far blur value.", + ), + int_parm( + "blur_type", + "Blur Type", + "0", + menu=[ + ("0", "Gaussian"), + ("1", "Circular"), + ], + help_text="Blur type.", + ), + int_parm( + "outside_projection", + "Outside Projection", + "0", + menu=[ + ("0", "Black"), + ("1", "White"), + ("2", "Default"), + ], + help_text="Behavior outside the projection frustum.", + ), + float_parm( + "density", + "Density", + "1", + (0, 1), + "Controls how much of the cookie is added to the light.", + ), + toggle("invert", "Invert", "0", "Invert the texture."), + string_parm("texture", "Texture", "", "Texture file path."), + color_parm("gamma", "Gamma", ("1", "1", "1"), "Per-channel texture gamma."), + ], + }, + + "RodLightFilter": { + "label": "MoonRay Rod Light Filter", + "folder": ("rod_filter", "Rod Filter"), + "inputs": [ + toggle("on", "On", "1", "Turns the light filter on or off."), + float_parm("width", "Width", "1", (0, 10), "Width of the base box."), + float_parm("depth", "Depth", "1", (0, 10), "Depth of the base box."), + float_parm("height", "Height", "1", (0, 10), "Height of the base box."), + float_parm("radius", "Radius", "0", (0, 10), "Rounded box radius."), + float_parm("edge", "Edge", "0", (0, 10), "Transition zone size."), + color_parm("color", "Color", ("0", "0", "0"), "Filter color."), + float_parm("intensity", "Intensity", "1", (0, 10), "Color intensity multiplier."), + float_parm("density", "Density", "1", (0, 10), "Fades the filter effect."), + toggle("invert", "Invert", "0", "Swap application from inside to outside."), + ], + }, + + "VdbLightFilter": { + "label": "MoonRay VDB Light Filter", + "folder": ("vdb_filter", "VDB Filter"), + "inputs": [ + toggle("on", "On", "1", "Turns the light filter on or off."), + string_parm("vdb_map", "VDB Map", "", "Path to the VDB file."), + string_parm( + "density_grid_name", + "Density Grid Name", + "density", + "Name of the density grid.", + ), + int_parm( + "vdb_interpolation_type", + "VDB Interpolation Type", + "0", + menu=[ + ("0", "Point"), + ("1", "Box"), + ("2", "Quadratic"), + ], + help_text="Interpolation type used when sampling the VDB.", + ), + float_parm( + "density_remap_input_min", + "Density Remap Input Min", + "0", + (-100, 100), + "Input remap minimum.", + ), + float_parm( + "density_remap_input_max", + "Density Remap Input Max", + "1", + (-100, 100), + "Input remap maximum.", + ), + float_parm( + "density_remap_output_min", + "Density Remap Output Min", + "0", + (-100, 100), + "Output remap minimum.", + ), + float_parm( + "density_remap_output_max", + "Density Remap Output Max", + "1", + (-100, 100), + "Output remap maximum.", + ), + toggle( + "density_rescale_enable", + "Density Rescale Enable", + "0", + "Enable density rescaling.", + ), + color_parm("color_tint", "Color Tint", ("0", "0", "0"), "Color tint."), + float_parm("blur_value", "Blur Value", "0", (0, 1000), "Blur radius."), + int_parm( + "blur_type", + "Blur Type", + "0", + menu=[ + ("0", "Gaussian"), + ("1", "Circular"), + ], + help_text="Blur type.", + ), + toggle("invert_density", "Invert Density", "0", "Invert the density."), + ], + }, } @@ -592,4 +925,4 @@ def generate(output_dir: str | os.PathLike[str] | None = None) -> list[Path]: if __name__ == "__main__": for path in generate(): - print(path) + print(path) \ No newline at end of file From cff423db8f8fddde8923b8123a6264a0a67f1834 Mon Sep 17 00:00:00 2001 From: Jakub Svoboda <132791205+rolledhand@users.noreply.github.com> Date: Sun, 7 Jun 2026 14:09:10 +0200 Subject: [PATCH 20/29] ramps-exposed Signed-off-by: Jakub Svoboda <132791205+rolledhand@users.noreply.github.com> --- ...op::DW_MOONRAY::BarnDoorLightFilter::1.hda | Bin 11541 -> 11587 bytes ...p::DW_MOONRAY::ColorRampLightFilter::1.hda | Bin 5403 -> 5869 bytes ...Vop::DW_MOONRAY::CombineLightFilter::1.hda | Bin 3203 -> 3207 bytes .../Vop::DW_MOONRAY::CookieLightFilter::1.hda | Bin 8480 -> 8510 bytes ...p::DW_MOONRAY::CookieLightFilter_v2::1.hda | Bin 9203 -> 9237 bytes .../Vop::DW_MOONRAY::DecayLightFilter::1.hda | Bin 4893 -> 4907 bytes ...p::DW_MOONRAY::IntensityLightFilter::1.hda | Bin 4992 -> 5004 bytes .../Vop::DW_MOONRAY::RodLightFilter::1.hda | Bin 5787 -> 6287 bytes .../Vop::DW_MOONRAY::VdbLightFilter::1.hda | Bin 7575 -> 8095 bytes .../moonray_lightfilter_nodes.cpython-314.pyc | Bin 0 -> 25632 bytes .../moonray_lightfilter_nodes.py | 133 +++++++++++++++++- 11 files changed, 126 insertions(+), 7 deletions(-) create mode 100644 houdini/python3.11libs/__pycache__/moonray_lightfilter_nodes.cpython-314.pyc diff --git a/houdini/otls/Vop::DW_MOONRAY::BarnDoorLightFilter::1.hda b/houdini/otls/Vop::DW_MOONRAY::BarnDoorLightFilter::1.hda index a10e1cc15f442fce7327db26482049115415f51d..dab0542d5c38e1ae914a6da5264255d02f7ba601 100644 GIT binary patch delta 731 zcmbOlbvSB*HdBbuL|p|C>2JnbpQRciw6V*S5y+o>kWowWJV=0nfq}=lC^fMpH8{B_ zv!H~5LG}D(7A9pebzueuMm?w!7LU}N0tN;R$H}%#Qnro^3`|}y&2FW6$t9Wjd47qx zsSFHS-9Q5+(n6!k^IrtwQZLKolsPnrk2A-=NLFccfe zrC}-t#lUs>cj$^IJ1ARE=2gTD3y`?G5=J;|c2L&BG#uoewJMmA^iSG!@*~y17?y(6 PE2)1(7vHR)@s$Mt!=(NY delta 684 zcmX>cH8pC2Hj_v9L|p|C>2Jmwn5F8`y|K%b5y+o>kWou=AxMCMfq}=lC^fMpH8{B_ zv!H~5L3QC|7A9pewWkaWjCxQdEFP&j1q=)t!jo;8q-=#57?`|Zn%zqCl1no4^ZXKX zQyCbvVu1!qq=iPy18D)*ijty4x6GVW{{oPbVxWBK<|#~vIC+b~mcxF)aRe~G36By&sP8y3+CBHWV|gs`ax$wUf& z!m8&xR#EQB*G1oB%53HqPeya<=2{6yG@;2LH!@4zN7cXiqm%@?!deNF$v!eSP!)o; zPY_|5oGW_?Q)Y9EoB=jtzRSPER6JQr5u5+gls;lnJ4g8o7SXFJpV34?j^2Jm+s*B)SLna2Ek`Q+#bBG_i!w_p3sRL7lrr-s zJMtJzzRi9Sr`%hPxBO`OCJS<#O_t?)j!m4UC^5HSasaoed=QYK#HD})K$a?i;B{DDV;)lgBv&|q>QpQwy;eolT7ScyVuacYV}Ql&ykMyf(iW_m`+WIi4R zbtRDYq{QOP;`p+}BCroiQi}@ma}q(GjtALLtfWvoc_N><3|MV;Y9&l*N@j6MVqP*_ zfize_Sz=CUDojZ-$bOgsl1in;DPU=6Xn|#o)1qT1@8i&)?9Pof045jmJj50-o2T*$ VGvW&6%`f?ka7hYpwimd=0syBuz61aO delta 326 zcmaE>J6mglHj_v9L|p|C>2Jm+9F(Q%(Y>+Tk`X8{`52?76z?LC2m=EHk8@FKVo7Rn za#3bM2?GP~qRE_0%D#Nh7#JA!ph{RgQgaFz7z9Ls${Er^qve4VcSwGIPO)BbMruwP zM2g7^W};hZUUErhex6@qZYl$VP~7B7COIadvduG@7+HCX!4}0AWtLPHq)y(;VKVtH z`$bgI&3ic%8PSB^a>}9!O@7O1Hd&DOIjTais4d?^RME}4{GRCAfmUzcDPV*tEWTM# H=ne}2e>-am diff --git a/houdini/otls/Vop::DW_MOONRAY::CombineLightFilter::1.hda b/houdini/otls/Vop::DW_MOONRAY::CombineLightFilter::1.hda index a4dd4b7a28069180f0bb3df2bcbd0a3c68f990f8..50a8e0cdd7dc1c5d39c24d53218bf1e79a5922ad 100644 GIT binary patch delta 199 zcmZpcY?qv%%@iUuQC9&(`kS(z%u)>z+SqBp2;@)R&8Q_Q2@+snVBm2sN=+Xhfq}gnsG1=yG+G`=afjsR=M?J|XQbw&L8O?x zUfo+6WGN!zh#}q Mh%T{t0{dqc0MgnwvH$=8 delta 191 zcmZpdY?hp$&E(NNQC9&(`kS&I%~JK~-q>lt2;@)R&8Q_Q3KC#oVBm2sN=+Xhfq}gpsG1=yG+G`=afjsR=M?J|XQbw&L8O?x zU2Jc?nxz^dw6Q~n5y+psjZsVTDoB8Vfq}=lC^fMpH8{B_ zv!H~5LGtS4pNz`B(vl1ejCxQdEFP&j1q=)_?m*=XX`#{bK#DsgKR>5fuQ($$Ck-OS z2JcCo~7#1y|F`w5y+psjZsT-J4k?mfq}=lC^fMpH8{B_ zv!H~5L2~=#pNz`BQok7(81DlXal(BOF diff --git a/houdini/otls/Vop::DW_MOONRAY::CookieLightFilter_v2::1.hda b/houdini/otls/Vop::DW_MOONRAY::CookieLightFilter_v2::1.hda index 64b624e56e3a670a847be0061d3bc1b2f1e78747..d486c7a6a24caa5e15923720ae4abb83ffd910d7 100644 GIT binary patch delta 556 zcmezDKGkD_HdBbuL|p|C>2J>Jo242ew6WWQ5y+o>lu=7^E=YiZfq}=lC^fMpH8{B_ zv!H~5L1yk`4ki`RhYSpidQcTC9;rD63=H!8lO35P<>dJp7?`|Zn%zqCl1no4^ZXKX zQyCZ(BPUld$ukyip21YX!LL*dHZ#5`v!t>hRcZ1E36seJd|aEOxg8jBNODhp&hrdI z?xB#`W&u7SOie%uu!;Hn9M~kSC+`<{i^VkS$zKE?po?#QD5Q$Z5Z1}TBKOfXOnxY2 zJ-JHsAr^7_$;-v=qKj{yC?14i!R8MVGcW|fA$3yfFS-dp8_gzj%IwDw2Zb!B?0#{y e5LZwtE-A{)OP~CZSAQ~(+*5RYoBzpuWdQ(DU&9vw delta 515 zcmbR0@!5TXHj_v9L|p|C>2J=eou%s0y|LSZ5y+o>lu=8v8YIBLz`)~Nl$uzQ8k}5| zSx~~jAX7b=gGohnKLZ1!9#jR3M`}(11B2Y#$&O5ta&m7O7?`|Zn%zqCl1no4^ZXKX zQyCZ(%_mnd$us(Ip21YX!CMSAGQKFYq_QA&vpjblBdXA3d2YMOuXvuLi3W2J(ho~0Thw6R@-5y+pskx@(XI7onjfq}=lC^fMpH8{B_ zv!H~5f&2L6FO14!yxa^7jCxQdEFP&j1q=*)mXmdvq--r27?`|Zn%zqCl1no4^ZXKX zQyCZpnt=vNq=iPy18D)*ijty4x6GVW{{oPbVxZ9M%`HqzSooES!M4R0WtLPHq$*85 zz-=};n|&Um%VaJNJuI>&lPfv417!_4?J#85bD2%v#JL$PD>k`?OAU*PD?r&6ZhZ`y m1Kcmc`cx*L2J)MnWgH{y|G<`5y+pskx@%>CrE&Sfq}=lC^fMpH8{B_ zv!H~5fqUoVFO14!JbxJ&8106nR40*qv%yoO3TSloP3VkVDb*m%|I17TsAmV v7y<2=160w&t&d^;OR(80lW*`yn%uQur z5V$b8f=Qn7#pW4I6)gNp#b6`ji!w_p3sRLf%d#6YVhF}^*kA}wj^!|$e24QNhT`X3 ToEVBX|K)CG!cf`E_n8F%x?NCr delta 257 zcmeBCZ&070&E(NNQC9&(`kS-v$Wry_-q>xy2;@&b%BUsD0TN(fVBm2sN=+n%uQur z5I8cqf=Qn7&gL0R6)e2PU=!nuGD|88Qa8)98#AH_C34uH2~AGqFq`~{^B~`a764UzQd$52 diff --git a/houdini/otls/Vop::DW_MOONRAY::RodLightFilter::1.hda b/houdini/otls/Vop::DW_MOONRAY::RodLightFilter::1.hda index 74859aacc0a2927239216b4d1b6ba22ce225eec4..d8d009a2c7bf4b200f3a87ab417669c41b575fa5 100644 GIT binary patch delta 647 zcmbQO+iy5Qn<+$SqOJmn^fzD=dzz&hBDAqpfe|P$c{!t|l%Od{gn@y9$GIpqu_QG( zxhS)sgn>cObn+`kWnZC61_nkws1g>B)SLna2I1vEHVqQNV2S8;)C8#W}g|ViniqzKK=bmFGHE@p#@FVrY(0P)g3v$uF9`fL(ub72k8L z+LrJ?Ko{RUQGg5653|`#Sc(#J3nqW$5M>DhF&6R(bAUwR({f5C^RXK+8cp8EBf(^- zIJtpSQZuu-Brz{JRiP*~H?cqgq)wr;%|juJ>g zQetstaeP@~k&*(KAD@{AlrPB7NdyIdJSc#Rl@w|xEAWY{fE8q?R-&noPl4JCQ>YGB pSeBSmnu?+{zqABHt+-NYaSB)|I4%{G(sJ?>OQK^puN8d90sw&6*Zlwh delta 379 zcmeA-oUJ=So5`blqOJmn^fzD=`Ix2Z(Y>)%fe|P$c{!t|6u%=#gn@y9$GIpqu_QG( zxhS)sgn@zIaq=rhWnY0-1_nkws1g>B)SLna2EolhCOIY%(alv%BCNc{V2k35GD|88Qa8_K=VL?_ znq0?kG5Hh64GdAU$^2Y*v4|RS-^3#7&vPA%Xg2Q+5fld~C?)6TPzUHdBbuL|p|C>2JU$`!!27L}+8H0wYjh@^VH^DG67Q2m=EHk8@FKVo7Rn za#3bM2?K+K>*QCA%D$4F3=E8VP$euLsW}A<3{u;H${Er^qve4VcSwGIPO)BbMruwP zM2g7^W};hZUUErhex6@qZYl$VEaT)TCOIZq$<0+v5$ya*#bBG_i!w_p3sRLP-{<^> zA;!*QK6$So$7DtBo9J?z*?Cqnq6-2IF#&4eoBW^m6Na3lfXn3jZ0wUg`Cp^UZFUr} z#5BxNz-RJh!MEs&Cp!u_Oy(87jUf)SoTVr+w_q|qr>J}okfFq-fCNC^Q~=4xr{$DP zE)X_gG@5)-RD#t|QNhq)@!r}s8wb`ka zFr||(vLR%Jz_MkDIi;y^c>z`txNdQ!(&7}bG&rUdl+tqY6HB6FC-d{@Pu3K9Achu| t3QEcOIr&9kX&=!$7~$k7V7571Oa?Q+L9us2{5*z+`<&vNcT3!10RU(-?7RQ~ delta 471 zcmbPlKiztQHj_v9L|p|C>2JU${WeS0qkChk0wYjh@^VH^DKT4+2m=EHk8@FKVo7Rn za#3bM2?K+e?c`UC%D&=_3=E8VP$euLsW}A<3=->s${Er^qve4VcSwGIPO)BbMruwP zM2g7^W};hZUUErhex6@qZYl$V)X&LLOma-pf}5+DBG`G0!4}0AWtLPHq)vXw`3+5k zm&bgv9Y4opRqmUpGMjmMRx+Xr0kxX|6^l;h<9m%J<164Y`92%_AiXU={Z$2z_hXnwQPoh=; diff --git a/houdini/python3.11libs/__pycache__/moonray_lightfilter_nodes.cpython-314.pyc b/houdini/python3.11libs/__pycache__/moonray_lightfilter_nodes.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..69e96459e7c8562b789057793218f62cd7cc6a18 GIT binary patch literal 25632 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 EE7=R7$^ZZW literal 0 HcmV?d00001 diff --git a/houdini/python3.11libs/moonray_lightfilter_nodes.py b/houdini/python3.11libs/moonray_lightfilter_nodes.py index 4a3a97c..e1f428e 100644 --- a/houdini/python3.11libs/moonray_lightfilter_nodes.py +++ b/houdini/python3.11libs/moonray_lightfilter_nodes.py @@ -87,6 +87,60 @@ def string_parm(name, label, default="", help_text=""): } +def ramp_rgb_parm( + name, + label, + default_count="2", + value_type="color3f[]", + help_text="", + rampbasis_var=None, + rampkeys_var=None, + rampvalues_var=None, +): + return { + "name": name, + "label": label, + "vop_type": None, + "parm_type": "ramp_rgb", + "default": default_count, + "script_ritype": "ramp_rgb", + "usdvaluetype": value_type, + "range": ("1!", "10"), + "help": help_text, + "ui_only": True, + "rampbasis_var": rampbasis_var, + "rampkeys_var": rampkeys_var, + "rampvalues_var": rampvalues_var, + } + + +def ramp_float_parm( + name, + label, + default_count="2", + value_type="float[]", + help_text="", + rampbasis_var=None, + rampkeys_var=None, + rampvalues_var=None, +): + return { + "name": name, + "label": label, + "vop_type": None, + "parm_type": "ramp_flt", + "default": default_count, + "script_ritype": "ramp_flt", + "usdvaluetype": value_type, + "range": ("1!", "10"), + "help": help_text, + "ui_only": True, + "rampbasis_var": rampbasis_var, + "rampkeys_var": rampkeys_var, + "rampvalues_var": rampvalues_var, + } + + LIGHT_FILTERS = { "IntensityLightFilter": { "label": "MoonRay Intensity Light Filter", @@ -364,6 +418,16 @@ def string_parm(name, label, default="", help_text=""): (0, 100), "Where the ramp ends.", ), + ramp_rgb_parm( + "ramp", + "Ramp", + "2", + "color3f[]", + "Color ramp used by the light filter.", + rampbasis_var="interpolation_types", + rampkeys_var="distances", + rampvalues_var="colors", + ), float_parm( "intensity", "Intensity", @@ -658,6 +722,16 @@ def string_parm(name, label, default="", help_text=""): float_parm("intensity", "Intensity", "1", (0, 10), "Color intensity multiplier."), float_parm("density", "Density", "1", (0, 10), "Fades the filter effect."), toggle("invert", "Invert", "0", "Swap application from inside to outside."), + ramp_float_parm( + "ramp", + "Ramp", + "2", + "float[]", + "Distance remap ramp used by the rod filter.", + rampbasis_var="ramp_interpolation_types", + rampkeys_var="ramp_in_distances", + rampvalues_var="ramp_out_distances", + ), ], }, @@ -718,6 +792,16 @@ def string_parm(name, label, default="", help_text=""): "0", "Enable density rescaling.", ), + ramp_float_parm( + "ramp", + "Ramp", + "2", + "float[]", + "Density remap ramp used by the VDB filter.", + rampbasis_var="density_remap_interpolation_types", + rampkeys_var="density_remap_inputs", + rampvalues_var="density_remap_outputs", + ), color_parm("color_tint", "Color Tint", ("0", "0", "0"), "Color tint."), float_parm("blur_value", "Blur Value", "0", (0, 1000), "Blur radius."), int_parm( @@ -788,10 +872,20 @@ def _parm_dialog(input_def: dict) -> str: f" name {_quote(input_def['name'])}", f" label {_quote(input_def['label'])}", f" type {input_def['parm_type']}", - f" size {3 if input_def['parm_type'] == 'color' else 1}", - " export none", - f" default {{ {_default_values(input_def['default'])} }}", ] + + if input_def["parm_type"] == "color": + lines.append(" size 3") + elif input_def["parm_type"] not in ("ramp_rgb", "ramp_flt"): + lines.append(" size 1") + + lines.extend( + [ + " export none", + f" default {{ {_default_values(input_def['default'])} }}", + ] + ) + if "range" in input_def: lo, hi = input_def["range"] lines.append(f" range {{ {lo} {hi} }}") @@ -802,20 +896,45 @@ def _parm_dialog(input_def: dict) -> str: lines.append(" }") if "help" in input_def: lines.append(f" help {_quote(input_def['help'])}") - lines.append(f" parmtag {{ script_ritype {_quote(input_def['script_ritype'])} }}") + + if input_def.get("rampbasis_var"): + lines.append( + f" parmtag {{ {_quote('rampbasis_var')} {_quote(input_def['rampbasis_var'])} }}" + ) + if input_def.get("rampkeys_var"): + lines.append( + f" parmtag {{ {_quote('rampkeys_var')} {_quote(input_def['rampkeys_var'])} }}" + ) + if input_def.get("rampvalues_var"): + lines.append( + f" parmtag {{ {_quote('rampvalues_var')} {_quote(input_def['rampvalues_var'])} }}" + ) + + if "usdvaluetype" in input_def: + lines.append( + f" parmtag {{ {_quote('usdvaluetype')} {_quote(input_def['usdvaluetype'])} }}" + ) + else: + lines.append( + f" parmtag {{ {_quote('script_ritype')} {_quote(input_def['script_ritype'])} }}" + ) + lines.append(" }") return "\n".join(lines) def _dialog_script(class_name: str, spec: dict) -> str: folder_name, folder_label = spec["folder"] + vop_inputs = [item for item in spec["inputs"] if not item.get("ui_only")] + input_lines = [ f" input {item['vop_type']} {item['name']} {_quote(item['label'])}" - for item in spec["inputs"] + for item in vop_inputs ] - input_flags = [f" inputflags {item['name']} 0" for item in spec["inputs"]] - signature_types = " ".join(item["vop_type"] for item in spec["inputs"]) + input_flags = [f" inputflags {item['name']} 0" for item in vop_inputs] + signature_types = " ".join(item["vop_type"] for item in vop_inputs) parms = "\n".join(_parm_dialog(item) for item in spec["inputs"]) + return f"""# Dialog script for Vop::DW_MOONRAY::{class_name}::1 automatically generated {{ name {_quote(f"Vop::DW_MOONRAY::{class_name}::1")} From 6890b91fb24b3075e6c471bf9b3a96ced1029be9 Mon Sep 17 00:00:00 2001 From: Jakub Svoboda <132791205+rolledhand@users.noreply.github.com> Date: Sat, 13 Jun 2026 17:13:02 +0200 Subject: [PATCH 21/29] Houdini: make Beauty RenderVar experimental Signed-off-by: Jakub Svoboda <132791205+rolledhand@users.noreply.github.com> --- .../docs/moonray_render_settings_lop_audit.md | 94 ++++++++++++++++-- ...::DW_MOONRAY::moonrayrendersettings::1.hda | Bin 29002 -> 29086 bytes .../python3.11libs/moonray_render_settings.py | 27 ++--- ...ev_validate_moonray_render_settings_lop.py | 43 ++++++-- 4 files changed, 134 insertions(+), 30 deletions(-) diff --git a/houdini/docs/moonray_render_settings_lop_audit.md b/houdini/docs/moonray_render_settings_lop_audit.md index 9b89d1a..b2036e3 100644 --- a/houdini/docs/moonray_render_settings_lop_audit.md +++ b/houdini/docs/moonray_render_settings_lop_audit.md @@ -12,6 +12,50 @@ This is a technical development/audit note for the MoonRay Render Settings LOP w - Installed runtime module path used by Houdini 20.5 validation: `/Applications/MoonRay/installs/openmoonray/plugin/houdini/python3.11libs/moonray_render_settings.py`. - Houdini 21 evidence is out of scope for this pass and should not be mixed with the Houdini 20.5 results below. +## Evidence-Gated Development Policy + +Every important Render Settings, AOV, viewport/IPR, render-buffer, or backend lifecycle claim must be classified as one of: + +- `PROVEN`: backed by exact source path/function, command output, exported USD/RDLA, log, installed-runtime provenance, render output, or EXR stats. +- `OBSERVED`: directly seen in Houdini/runtime behavior, but not fully explained. +- `HYPOTHESIS`: plausible explanation with a named test that can prove or disprove it. +- `UNKNOWN`: not enough evidence. +- `OUT OF SCOPE`: intentionally deferred. + +Rules: + +1. No claim without evidence. +2. No recommendation without a reproducer, source-path proof, exported USD proof, log proof, RDLA proof, render proof, or EXR proof. +3. Do not infer that something is working because a UI folder, parameter, channel, RenderVar, or SceneObject exists. +4. If the render is black, the path is functionally broken until render proof says otherwise. +5. Authored USD alone is not render proof. +6. RDLA/RenderOutput declaration alone is not image-buffer proof. +7. Debug renderer success is not production renderer success. +8. Houdini 21 behavior does not prove Houdini 20.5 behavior. +9. UI cleanup must not hide backend lifecycle, dirtying, render-buffer, AOV binding, or viewport/IPR refresh bugs. +10. If evidence conflicts, report the conflict instead of choosing the convenient explanation. + +Primary source-of-truth hierarchy: + +1. Local runtime behavior in the target Houdini version, currently H20.5. +2. Exported USD from the exact scene state being tested. +3. Installed hdMoonray source and binaries currently loaded by Houdini. +4. MoonRay native metadata: `/Applications/MoonRay/installs/openmoonray/coredata/SceneVariables.json` and `/Applications/MoonRay/installs/openmoonray/coredata/RenderOutput.json`. +5. MoonRay docs and source. +6. OpenUSD RenderSettings/Product/Var schemas. +7. SideFX Houdini/HDK docs and local Houdini headers. +8. Local project docs and prior audit notes. + +Track A is DCC/UI/USD-contract work: custom Render Settings LOP generator, regenerated HDA, validation scripts, docs, and installed/runtime source alignment. + +Track B is backend forensic work: backend source tracing, temporary diagnostics, logs, render proof, EXR stats, viewport/IPR lifecycle proof, and runtime symptom proof. + +Track A and Track B may run in parallel when UI/USD authoring and backend runtime behavior are coupled. Parallel work is allowed. Unsupported blending is not. DCC/USD evidence and backend/runtime evidence must be separated in reports. Commits should stay separate unless the backend root cause is proven, the fix is narrow, and the diff explains why UI/USD and backend behavior must change together. + +Backend files are not forbidden. They may be inspected or temporarily instrumented when runtime evidence points there, especially `RenderBuffer.cc`, `ArrasRenderer.cc`, `RenderPass.cc`, `RenderDelegate.cc`, `UsdRenderers.json`, Beauty/AOV binding lifecycle, render settings dirtying/versioning, and viewport/IPR refresh behavior. Backend behavioral changes require source-path proof, exported USD proof, log proof, and render/EXR or runtime symptom proof before implementation. + +Do not flip `aovsupport` because it appears related. Do not restart `cameraDepth`. Do not broaden non-beauty AOV transport. Do not ship UI-only cleanup as a substitute for backend/runtime proof. + ## References Consulted ### OpenUSD RenderSettings / RenderProduct / RenderVar @@ -144,6 +188,14 @@ When the USD Render ROP `outputimage` override is blank, the RenderProduct outpu That smoke render was black. It proves USD Render ROP wiring, RenderProduct output creation, and resolution/output path behavior only. It does not prove filled-pixel Beauty/AOV success. +## Generic Houdini Render Settings Boundary + +The generic Houdini Render Settings LOP with a MoonRay folder is UI integration evidence only. It is not complete render proof. + +If flattened USDA has empty `rel products` and no `RenderProduct`, `productName`, or `productType`, generic Render Settings alone is not a complete MoonRay output setup. If it renders black, it is functionally broken until render proof says otherwise. + +Generic Render Settings may still be useful as raw/advanced reference UI, but it should not be advertised as the primary working workflow without product/output proof and filled render proof. + ## Resolution Behavior The custom MoonRay Render Settings LOP uses manual resolution only. @@ -193,7 +245,7 @@ The Render Settings LOP must not absorb every MoonRay or USD setting. Not every | Area | Example | Correct USD location | USD kind | MoonRay/RDL target | Should this Render Settings LOP author it? | Correct authoring path | Status | |------|---------|----------------------|----------|--------------------|--------------------------------------------|------------------------|--------| | Render settings | pixel samples | RenderSettings prim | `moonray:sceneVariable:*` attr | SceneVariables | yes | custom Render Settings LOP | verify/working | -| Render output/AOV | beauty/color | RenderVar + RenderProduct orderedVars | UsdRenderVar | RenderOutput | yes for validated outputs | AOV tab / RenderVar authoring | Beauty only | +| Render output/AOV | beauty/color | RenderProduct by default; optional RenderVar only when `aov_beauty` is enabled | UsdRenderProduct / optional UsdRenderVar | default beauty framebuffer / experimental RenderOutput path | only as Advanced/Debug diagnostic until render proof | Advanced / Debug experimental toggle | default no Beauty RenderVar | | Geometry settings | `moonray:mesh_resolution` | geometry prim | primvar or namespaced prim attr | RDL geometry setting | no | LOP wrangle / geometry settings node | document only | | Camera/DOF settings | DOF enable/focus/aperture depending on native behavior | camera prim or RenderSettings depending on proven path | camera attr or SceneVariable | Camera / SceneVariables | only if native path proves it | match H20.5 generic/native | audit | | Light settings | MoonRay light attrs | light prim | namespaced attrs | RDL light | no | light LOP / light-specific UI | document only | @@ -204,9 +256,30 @@ Do not expose `moonray:mesh_resolution` in the Render Settings LOP as a global r ## Beauty RenderVar and AOV Status -Beauty is the only exposed AOV for now. +The default artist workflow does not author a Beauty RenderVar. It authors a RenderProduct with +an empty `orderedVars` relationship and uses MoonRay's normal beauty framebuffer path. + +Current default custom LOP contract: -Current custom Beauty RenderVar: +- `aov_beauty = 0`. +- No authored Beauty RenderVar by default. +- `UsdRender.Settings`. +- `UsdRender.Product`. +- `settings.products`. +- `settings.camera`. +- `settings.resolution`. +- `product.productName`. +- `product.productType = "raster"`. +- Empty `orderedVars`. +- Curated `moonray:sceneVariable:*`. + +The optional Beauty RenderVar path is preserved as an Advanced / Debug diagnostic toggle named +`aov_beauty` for compatibility. It is disabled by default because H20.5 viewport/IPR testing showed +the RenderVar/AOV binding path can start black until a viewport/display-options refresh. + +The UI label is `Experimental Beauty RenderVar / AOV Path`. The control belongs under Advanced / Debug or Experimental AOVs. This path is debug/experimental and is not production AOV support. + +Experimental custom Beauty RenderVar when `aov_beauty` is enabled: ```text Path: /Render/Products/Vars/beauty @@ -235,6 +308,10 @@ Non-beauty AOV status: - Debug/local path filling non-beauty buffers is not enough for artist UI exposure. - If the production path produces zero-filled buffers, classify that as backend payload unresolved, not UI-ready. +Do not recommend always authoring a Beauty RenderVar unless fresh viewport/IPR, USD Render ROP/husk, and filled image/EXR output prove it is required and stable. + +Do not claim AOV support from authored RenderVars, metadata, EXR channels, RDLA RenderOutput declarations, or debug renderer success alone. + ## USD Render ROP Integration Houdini 20.5 USD Render ROP parameter names for both LOP `usdrender_rop` and OUT `usdrender`: @@ -362,7 +439,7 @@ Inventory counts: - `SceneVariables.json`: 112 attributes. - `RenderOutput.json`: 37 attributes. -- Current custom MoonRay Render Settings LOP: 50 curated SceneVariable parameters plus Beauty RenderVar authoring. +- Current custom MoonRay Render Settings LOP: 50 curated SceneVariable parameters plus default RenderProduct authoring. The optional Beauty RenderVar is disabled by default and lives under the Advanced / Debug experimental path. Method: @@ -434,7 +511,7 @@ Current exposed/custom-authored settings after discovery: | Camera / Resolution | Camera | `camera` | `RenderSettings.camera` relationship | rel | `/cameras/camera1` | H20.5 Karma pattern | validated previously | | Camera / Resolution | Resolution Mode | `resolution_mode_note` | UI note only | n/a | Manual Resolution | H20.5 lifecycle cleanup decision | computed modes intentionally removed | | Camera / Resolution | Resolution | `resolution` | `RenderSettings.resolution` | `int2` | `1920, 1080` | USD RenderSettings | validated previously | -| AOVs | Beauty | `aov_beauty` | `RenderProduct.orderedVars` + Beauty RenderVar | RenderVar | enabled | USD RenderVar + H20.5 generic parity | Beauty metadata validated; filled-pixel proof deferred | +| Advanced / Debug | Experimental Beauty RenderVar / AOV Path | `aov_beauty` | `RenderProduct.orderedVars` + Beauty RenderVar | RenderVar | disabled | H20.5 runtime evidence | Debug metadata validated; filled-pixel proof required before default use | | Sampling | Sampling Mode | `sceneVariable_sampling_mode` | `moonray:sceneVariable:sampling_mode` | token-authored enum | `uniform` | SceneVariables metadata | RDLA token path proven for enum style | | Sampling | Light Sampling Mode | `sceneVariable_light_sampling_mode` | `moonray:sceneVariable:light_sampling_mode` | token-authored enum | `uniform` | SceneVariables metadata | RDLA-proven | | Sampling | Light Sampling Quality | `sceneVariable_light_sampling_quality` | `moonray:sceneVariable:light_sampling_quality` | float | `0.5` | SceneVariables metadata | newly added; needs RDLA validation | @@ -485,8 +562,8 @@ Current exposed/custom-authored settings after discovery: | Volumes | Global volume controls | volume quality/shadow/illumination/opacity/overlap/factors/indirect samples | deep output settings | Uses useful volume group from metadata/DS. | | Filtering / Textures | Texture/pixel filtering | texture blur, pixel filter width/type | texture cache/file handles for now | Cache controls deferred. | | Clamping / Fireflies | Firefly reduction | sample clamp value/depth, roughness clamping factor | none currently | Roughness clamp mirrored from generic MoonRay tab. | -| AOVs | Artist AOV checkboxes | Beauty only | albedo/normal/depth/OIDN/Cryptomatte | Non-beauty hidden until production buffers are filled. | -| Advanced / Debug | Troubleshooting/low-level controls | disable optimized hair sampling, debug RDL/RDLA output | Arras/internal/debug dumps | Keep sparse. | +| AOVs | Artist AOV checkboxes | none | beauty/albedo/normal/depth/OIDN/Cryptomatte | No production AOV tab until buffers are proven. | +| Advanced / Debug | Troubleshooting/low-level controls | disable optimized hair sampling, debug RDL/RDLA output, experimental Beauty RenderVar toggle | Arras/internal/debug dumps and production AOV UI | Keep sparse. | ## What Still Remains @@ -681,6 +758,9 @@ Future passes should validate: - [ ] Confirm `enable_dof` is present. - [ ] Regenerate HDA from repo source. - [ ] Sync/install through a reproducible mechanism. +- [ ] Launch a fresh normal Houdini 20.5 GUI session after install sync. +- [ ] Confirm fresh GUI custom LOP defaults `aov_beauty` off and labels it experimental. +- [ ] Confirm fresh GUI custom LOP viewport/IPR renders with default Beauty RenderVar disabled. - [ ] Export generic/native USD. - [ ] Export custom USD. - [ ] Diff RenderSettings/Product/Var. diff --git a/houdini/otls/Lop::DW_MOONRAY::moonrayrendersettings::1.hda b/houdini/otls/Lop::DW_MOONRAY::moonrayrendersettings::1.hda index b6da7af967018d449efdf64fd5b2a3f3120cd1d1..c9ba507aace1f259fd296c5cfaa53ba9bd339a0a 100644 GIT binary patch delta 945 zcmZWoO-~a+7~TSYR7I<8+8AnmqmcuK7Hd!wFI2$b2X-yWl}x+S-H~Btot-W8puHPS zz&V=u8zen@FxF565kQKt34@ZrChZvaS@|e63?Mo zxwb|HCWvQfUQf*Fx)_vmEK8=)aXWEj<~Ot=HyNjOUo$C!90uIM0Ehz4!yF@Ay5_UE z(tkX3A=m$Kx<1@%laOm@QWEMegaHjedlVW}I8@n6I$=wL47DF>@QL$y1lP3f@7&_aCwSc3S>6i@a3&Iww&E~jOv z#e@La51a@G6w*fjFs(g&x*jaZ&|!jA7P^iiaqA`%XmQJMmy!-eIs($<$Wg>iv>J!T zE6V~=ngzS7i#bhE73=VMh4o<>?{V-#N5Jh2cLkNXtJf7Vj2nw|ci&BaP=^`9XUHlu+ zW}FAm4BKt00#KAQ#N9=mOha4I0I8}@m8YS@=(;bJuH3R4@gxtI<`Mxyqi$njq}-rv PPC7Z{BGZ2%-VXf+IN(VF delta 804 zcmZ8fO=}cE6r4>$VnV>6Vv;48XFLRwT|W>MMGx!7prY=QU_c0jp6RzcZF;(go}M*x zG0EM7q3`+&BEtRv^{59=f(SY3StKW~zS&IT$El%Sy_%|5^YVM?_ccLSiGfLaSty2)~E`IiY*GFE};8 zbSH89^W%fH#!50X;x5fr-H-Jt_vYI0;4NgS&D{1x*?nR&?%n+}k83G;Ghjo6*ocUk z4E!DomQZmtE6kjS8s{Sa9+N<-5QG@4`+5TtU3ynbzsj@=$q#`EVs+ycuT2%|V ze9=!^L`}e;6wH^I19o$a46hwZtSN2XPIGE>;ZT#-+%`MuF5WoiCI?Qq*AvG#Ytl!q zE1b%fT4;0WOu+pq$W&Rs(X1FKC^0j4-K?k+rp5M_)e4|5QqgGRIjMGy)e zXswo5Hk*Ld0h1Rv`e_?tW<&CC$-7VK6oi6vqzCB&{{&ZXhvyoGWd|oj)0AnOR$4;J zgzlpgJUWF9jZWJkJX&5TE)GkLrrRpl-CqB2_toje{<0ArvX(nYt{0@H(L4>T`#OGB z7x`A*WU