From 563a86f5d0d4c09ce87ba64af6a9e23aa53b076f Mon Sep 17 00:00:00 2001 From: David Lanier Date: Thu, 15 Feb 2024 11:47:17 +0100 Subject: [PATCH 01/14] HYDRA-307: Add the FootPrint node as an Hydra example --- .../flowViewportAPIExamples/CMakeLists.txt | 1 + .../flowViewportAPIMayaLocator.cpp | 2 +- .../footPrintNode/CMakeLists.txt | 102 +++ .../footPrintNode/mhFootPrintNode.cpp | 666 ++++++++++++++++++ .../mayaUsd/render/mayaToHydra/CMakeLists.txt | 1 + .../FootPrintNodeTest/add_NodeCreated.png | Bin 0 -> 2374 bytes .../FootPrintNodeTest/add_NodeDeleted.png | Bin 0 -> 1563 bytes .../FootPrintNodeTest/add_NodeDeletedRedo.png | Bin 0 -> 1563 bytes .../FootPrintNodeTest/add_NodeDeletedUndo.png | Bin 0 -> 2399 bytes .../add_NodeDeletedUndoAgain.png | Bin 0 -> 2399 bytes .../FootPrintNodeTest/add_NodeHidden.png | Bin 0 -> 1563 bytes .../FootPrintNodeTest/add_NodeMoved.png | Bin 0 -> 2399 bytes .../add_NodeMovedAfterDeletionAndUndo.png | Bin 0 -> 2411 bytes .../FootPrintNodeTest/add_NodeUnhidden.png | Bin 0 -> 2399 bytes .../add_VP2AndThenBackToStorm.png | Bin 0 -> 2411 bytes .../footPrint_AfterModifs.png | Bin 0 -> 2080 bytes .../footPrint_BeforeModifs.png | Bin 0 -> 1836 bytes .../footPrint_VP2AndThenBackToStorm.png | Bin 0 -> 2080 bytes .../loadingFootPrintScene.png | Bin 0 -> 3041 bytes .../multipleNodes_AfterModifs.png | Bin 0 -> 2394 bytes .../multipleNodes_BeforeModifs.png | Bin 0 -> 2327 bytes .../multipleNodes_Node1Hidden.png | Bin 0 -> 1982 bytes .../multipleNodes_Node1Unhidden.png | Bin 0 -> 2394 bytes .../multipleNodes_VP2AndThenBackToStorm.png | Bin 0 -> 2394 bytes ...iewports_VP2AndThenBackToStorm_modPan3.png | Bin 0 -> 2078 bytes ...iewports_VP2AndThenBackToStorm_modPan4.png | Bin 0 -> 1924 bytes .../multipleViewports_VP2_modPan3.png | Bin 0 -> 1563 bytes .../multipleViewports_VP2_modPan4.png | Bin 0 -> 1563 bytes .../multipleViewports_viewPanel1.png | Bin 0 -> 2078 bytes .../multipleViewports_viewPanel4.png | Bin 0 -> 1924 bytes .../render/mayaToHydra/testFlowViewportAPI.py | 1 + .../render/mayaToHydra/testFootPrintNode.py | 296 ++++++++ .../testFootPrintNode/testFootPrintNode.ma | 219 ++++++ .../testFootPrintNodeSaved.ma | 245 +++++++ 34 files changed, 1532 insertions(+), 1 deletion(-) create mode 100644 lib/mayaHydra/flowViewportAPIExamples/footPrintNode/CMakeLists.txt create mode 100644 lib/mayaHydra/flowViewportAPIExamples/footPrintNode/mhFootPrintNode.cpp create mode 100644 test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/add_NodeCreated.png create mode 100644 test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/add_NodeDeleted.png create mode 100644 test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/add_NodeDeletedRedo.png create mode 100644 test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/add_NodeDeletedUndo.png create mode 100644 test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/add_NodeDeletedUndoAgain.png create mode 100644 test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/add_NodeHidden.png create mode 100644 test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/add_NodeMoved.png create mode 100644 test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/add_NodeMovedAfterDeletionAndUndo.png create mode 100644 test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/add_NodeUnhidden.png create mode 100644 test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/add_VP2AndThenBackToStorm.png create mode 100644 test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/footPrint_AfterModifs.png create mode 100644 test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/footPrint_BeforeModifs.png create mode 100644 test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/footPrint_VP2AndThenBackToStorm.png create mode 100644 test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/loadingFootPrintScene.png create mode 100644 test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/multipleNodes_AfterModifs.png create mode 100644 test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/multipleNodes_BeforeModifs.png create mode 100644 test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/multipleNodes_Node1Hidden.png create mode 100644 test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/multipleNodes_Node1Unhidden.png create mode 100644 test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/multipleNodes_VP2AndThenBackToStorm.png create mode 100644 test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/multipleViewports_VP2AndThenBackToStorm_modPan3.png create mode 100644 test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/multipleViewports_VP2AndThenBackToStorm_modPan4.png create mode 100644 test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/multipleViewports_VP2_modPan3.png create mode 100644 test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/multipleViewports_VP2_modPan4.png create mode 100644 test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/multipleViewports_viewPanel1.png create mode 100644 test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/multipleViewports_viewPanel4.png create mode 100644 test/lib/mayaUsd/render/mayaToHydra/testFootPrintNode.py create mode 100644 test/testSamples/testFootPrintNode/testFootPrintNode.ma create mode 100644 test/testSamples/testFootPrintNode/testFootPrintNodeSaved.ma diff --git a/lib/mayaHydra/flowViewportAPIExamples/CMakeLists.txt b/lib/mayaHydra/flowViewportAPIExamples/CMakeLists.txt index f05a524afd..d7ee60f200 100644 --- a/lib/mayaHydra/flowViewportAPIExamples/CMakeLists.txt +++ b/lib/mayaHydra/flowViewportAPIExamples/CMakeLists.txt @@ -1 +1,2 @@ add_subdirectory(flowViewportAPIMayaLocator) +add_subdirectory(footPrintNode) diff --git a/lib/mayaHydra/flowViewportAPIExamples/flowViewportAPIMayaLocator/flowViewportAPIMayaLocator.cpp b/lib/mayaHydra/flowViewportAPIExamples/flowViewportAPIMayaLocator/flowViewportAPIMayaLocator.cpp index d5cf868ab9..dc35e8cf4b 100644 --- a/lib/mayaHydra/flowViewportAPIExamples/flowViewportAPIMayaLocator/flowViewportAPIMayaLocator.cpp +++ b/lib/mayaHydra/flowViewportAPIExamples/flowViewportAPIMayaLocator/flowViewportAPIMayaLocator.cpp @@ -554,7 +554,7 @@ MStatus FlowViewportAPIMayaLocator::initialize() MAKE_INPUT(nAttr); CHECK_MSTATUS ( nAttr.setDefault(5.0, 5.0, 5.0) ); - //Create dummy output attribute to trigger a call to the compute function on demand. as it's in the compute fonction that we add our scene indices + //Create dummy input attribute to trigger a call to the compute function on demand. as it's in the compute fonction that we add our scene indices mDummyInput = nAttr.create("dummyInput", "dI", MFnNumericData::kInt, 1.0, &status); MAKE_INPUT(nAttr); CHECK_MSTATUS ( nAttr.setDefault(1) ); diff --git a/lib/mayaHydra/flowViewportAPIExamples/footPrintNode/CMakeLists.txt b/lib/mayaHydra/flowViewportAPIExamples/footPrintNode/CMakeLists.txt new file mode 100644 index 0000000000..2d7847955e --- /dev/null +++ b/lib/mayaHydra/flowViewportAPIExamples/footPrintNode/CMakeLists.txt @@ -0,0 +1,102 @@ +set(TARGET_NAME mayaHydraFootPrintNode) + +add_library(${TARGET_NAME} SHARED) + +# ----------------------------------------------------------------------------- +# sources +# ----------------------------------------------------------------------------- +target_sources(${TARGET_NAME} + PRIVATE + mhFootPrintNode.cpp +) + +set(HEADERS + PRIVATE +) + +# ----------------------------------------------------------------------------- +# compiler configuration +# ----------------------------------------------------------------------------- +target_compile_definitions(${TARGET_NAME} + PRIVATE + # M3dView needs this (technically, MNativeWindowHdl.h) + # private atm because M3dView is only used in .cpp right now + # gcc will NOT set this automatically + $<$:LINUX> + # Not sure if msvcc sets this automatically, but won't hurt to redefine + $<$:_WIN32> + MFB_ALT_PACKAGE_NAME="${TARGET_NAME}" # This is used by Pixar HdSceneIndexPluginRegistry::Define to create a unique name +) + +# ----------------------------------------------------------------------------- +# include directories +# ----------------------------------------------------------------------------- +if(DEFINED MAYAUSD_VERSION) + target_compile_definitions(${TARGET_NAME} + PRIVATE + MAYAUSD_VERSION=${MAYAUSD_VERSION} + ) +endif() + +if(DEFINED MAYAHYDRA_VERSION) + target_compile_definitions(${TARGET_NAME} + PRIVATE + MAYAHYDRA_VERSION=${MAYAHYDRA_VERSION} + ) +endif() +if(DEFINED MAYAHYDRA_CUT_ID) + target_compile_definitions(${TARGET_NAME} + PRIVATE + MAYAHYDRA_CUT_ID=${MAYAHYDRA_CUT_ID} + ) +endif() + +mayaHydra_compile_config(${TARGET_NAME}) + +# ----------------------------------------------------------------------------- +# link libraries +# ----------------------------------------------------------------------------- +target_link_libraries(${TARGET_NAME} + PRIVATE + mayaHydraLib +) + +# ----------------------------------------------------------------------------- +# properties +# ----------------------------------------------------------------------------- +maya_set_plugin_properties(${TARGET_NAME}) + +# ----------------------------------------------------------------------------- +# run-time search paths +# ----------------------------------------------------------------------------- +if(IS_MACOSX OR IS_LINUX) + mayaUsd_init_rpath(rpath "lib/maya") + if(DEFINED MAYAUSD_TO_USD_RELATIVE_PATH) + mayaUsd_add_rpath(rpath "../../${MAYAUSD_TO_USD_RELATIVE_PATH}/lib") + elseif(DEFINED PXR_USD_LOCATION) + mayaUsd_add_rpath(rpath "${PXR_USD_LOCATION}/lib") + endif() + if (IS_LINUX AND DEFINED MAYAUSD_TO_USD_RELATIVE_PATH) + mayaUsd_add_rpath(rpath "../../${MAYAUSD_TO_USD_RELATIVE_PATH}/lib64") + endif() + if(IS_MACOSX AND DEFINED MAYAUSD_TO_USD_RELATIVE_PATH) + mayaUsd_add_rpath(rpath "../../../../Maya.app/Contents/MacOS") + endif() + mayaUsd_add_rpath(rpath "../") + mayaUsd_install_rpath(rpath ${TARGET_NAME}) +endif() + +# ----------------------------------------------------------------------------- +# install +# ----------------------------------------------------------------------------- +install(TARGETS ${TARGET_NAME} + DESTINATION ${CMAKE_INSTALL_PREFIX}/lib/maya) + +if(IS_WINDOWS) + install(FILES $ + DESTINATION ${CMAKE_INSTALL_PREFIX}/lib/maya OPTIONAL) +endif() + +set(LIBFILENAME ${CMAKE_SHARED_LIBRARY_PREFIX}${TARGET_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX}) +set(PLUG_INFO_LIBRARY_PATH "../../../${LIBFILENAME}") +set(PLUG_INFO_RESOURCE_PATH "resources") \ No newline at end of file diff --git a/lib/mayaHydra/flowViewportAPIExamples/footPrintNode/mhFootPrintNode.cpp b/lib/mayaHydra/flowViewportAPIExamples/footPrintNode/mhFootPrintNode.cpp new file mode 100644 index 0000000000..7cc30fdd4c --- /dev/null +++ b/lib/mayaHydra/flowViewportAPIExamples/footPrintNode/mhFootPrintNode.cpp @@ -0,0 +1,666 @@ +// +// Copyright 2024 Autodesk, Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +//////////////////////////////////////////////////////////////////////// +// DESCRIPTION: +// +// This plug-in demonstrates how to draw a simple mesh like foot Print in an easy way within a Hydra viewport. +// This node is only visible in a Hydra viewport, it won't be visible in viewport 2.0. +// +// For comparison, you can reference a Maya Developer Kit sample named footPrintNode which uses Viewport 2.0 override to draw. +// To create an instance of this node in maya, please use the following MEL command : +// +// createNode("MhFootPrint") +// +//////////////////////////////////////////////////////////////////////// + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +//Flow viewport headers +#include +#include + +//Hydra headers +#include +#include +#include +#include +#include +#include +#include +#include + +PXR_NAMESPACE_USING_DIRECTIVE + +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +// Node implementation with Hydra scene index +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +class MhFootPrint : public MPxLocatorNode +{ +public: + MhFootPrint(); + ~MhFootPrint() override; + + MStatus compute( const MPlug& plug, MDataBlock& data ) override; + + bool isBounded() const override; + MBoundingBox boundingBox() const override; + + void setupFlowViewportInterface(); + void UpdateFootPrintPrims(); + void TriggerACallToCompute(); + + static void * creator(); + static MStatus initialize(); + + //Attributes + static MObject mSize; + static MObject mWorldS; + static MObject mColor; + static MObject mDummyInput; //Dummy input to trigger a call to compute + static MObject mDummyOutput;//Dummy output to trigger a call to compute + + static MTypeId id; + static MString nodeClassification; + +private: + ///get the value of the size attribute in centimeters + float _GetSizeInCentimeters() const; + ///get the value of the color attribute, returned as a 3D Hydra vector + GfVec3f _GetColor() const; + ///Create the Hydra foot print primitives + void _CreateAndAddFootPrintPrimitives(); + ///Remove the Hydra foot print primitives + void _RemoveFootPrintPrimitives(); + ///Update the MObject of this node + void _UpdateThisMObject(); + + ///Counter to make the hydra primitives unique + static int _counter; + + /// Sole path to be used in the retained hydra scene index for the sole primitive + SdfPath _solePath; + /// Heel path to be used in the retained hydra scene index for the heel primitive + SdfPath _heelPath; + + ///Hydra retained scene index to add the 2 foot print primitives + HdRetainedSceneIndexRefPtr _retainedSceneIndex {nullptr}; + + ///To be used in hydra viewport API to pass the Maya node's MObject for setting callbacks for data producer scene indices + MObject _thisMObject; + ///To check if the MObject of this node has changed + MObject _oldMObject; + ///To hold the afterOpenCallback Id to be able to react when a File Open has happened. + MCallbackId _cbAfterOpenId = 0; + ///To hold the attributeChangedCallback Id to be able to react when the 3D grid creation parameters attributes from this node change. + MCallbackId _cbAttributeChangedId = 0; + + /// Init flag to do things only once for this node + bool _init = false; +}; + +namespace +{ + // Foot print data + constexpr int soleVertsCount = 21; + constexpr int heelVertsCount = 17; + + static const VtArray solePoints = { + { 0.00f, 0.0f, -0.70f }, + { 0.04f, 0.0f, -0.69f }, + { 0.09f, 0.0f, -0.65f }, + { 0.13f, 0.0f, -0.61f }, + { 0.16f, 0.0f, -0.54f }, + { 0.17f, 0.0f, -0.46f }, + { 0.17f, 0.0f, -0.35f }, + { 0.16f, 0.0f, -0.25f }, + { 0.15f, 0.0f, -0.14f }, + { 0.13f, 0.0f, 0.00f }, + { 0.00f, 0.0f, 0.00f }, + { -0.13f, 0.0f, 0.00f }, + { -0.15f, 0.0f, -0.14f }, + { -0.16f, 0.0f, -0.25f }, + { -0.17f, 0.0f, -0.35f }, + { -0.17f, 0.0f, -0.46f }, + { -0.16f, 0.0f, -0.54f }, + { -0.13f, 0.0f, -0.61f }, + { -0.09f, 0.0f, -0.65f }, + { -0.04f, 0.0f, -0.69f }, + { -0.00f, 0.0f, -0.70f } + }; + + static const VtArray heelPoints= { + { 0.00f, 0.0f, 0.06f }, + { 0.13f, 0.0f, 0.06f }, + { 0.14f, 0.0f, 0.15f }, + { 0.14f, 0.0f, 0.21f }, + { 0.13f, 0.0f, 0.25f }, + { 0.11f, 0.0f, 0.28f }, + { 0.09f, 0.0f, 0.29f }, + { 0.04f, 0.0f, 0.30f }, + { 0.00f, 0.0f, 0.30f }, + { -0.04f, 0.0f, 0.30f }, + { -0.09f, 0.0f, 0.29f }, + { -0.11f, 0.0f, 0.28f }, + { -0.13f, 0.0f, 0.25f }, + { -0.14f, 0.0f, 0.21f }, + { -0.14f, 0.0f, 0.15f }, + { -0.13f, 0.0f, 0.06f }, + { -0.00f, 0.0f, 0.06f } + }; + + //Number of sole triangles is soleVertsCount - 2 + static const VtIntArray soleFaceVertexCounts = { + 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, + 3, 3, 3, 3 + }; + + //Number of heel triangles is heelVertsCount - 2 + static const VtIntArray heelFaceVertexCounts = { + 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3 + }; + + static const VtIntArray soleFaceVertexIndices = { + 2, 1, 0, + 3, 2, 0, + 4, 3, 0, + 5, 4, 0, + 6, 5, 0, + 7, 6, 0, + 8, 7, 0, + 9, 8, 0, + 10, 9, 0, + 11, 10, 0, + 12, 11, 0, + 13, 12, 0, + 14, 13, 0, + 15, 14, 0, + 16, 15, 0, + 17, 16, 0, + 18, 17, 0, + 19, 18, 0, + 20, 19, 0 + }; + + static const VtIntArray heelFaceVertexIndices = { + 2, 1, 0, + 3, 2, 0, + 4, 3, 0, + 5, 4, 0, + 6, 5, 0, + 7, 6, 0, + 8, 7, 0, + 9, 8, 0, + 10, 9, 0, + 11, 10, 0, + 12, 11, 0, + 13, 12, 0, + 14, 13, 0, + 15, 14, 0, + 16, 15, 0 + }; + + //For the maya bounding box + static const MPoint corner1( -0.17, 0.0, -0.7 ); + static const MPoint corner2( 0.17, 0.0, 0.3 ); + + //Create the Hydra primitive and add it to the retained scene index + void _CreateAndAddPrim(const HdRetainedSceneIndexRefPtr& retainedSceneIndex, const SdfPath& primPath, const VtArray& points, const VtIntArray& faceVertexCount, const VtIntArray& faceVertexIndices, const GfVec3f& scale, const GfVec3f& displayColor) + { + using _PointArrayDs = HdRetainedTypedSampledDataSource>; + using _IntArrayDs = HdRetainedTypedSampledDataSource; + + const _IntArrayDs::Handle fvcDs = _IntArrayDs::New(faceVertexCount); + const _IntArrayDs::Handle fviDs = _IntArrayDs::New(faceVertexIndices); + + const VtIntArray vertexColorArray(points.size(), 0);//Is an index in the vertex color array, 1 per vertex,but we only have one same color for all verts (index 0) + + const HdContainerDataSourceHandle meshDs = + HdMeshSchema::Builder() + .SetTopology(HdMeshTopologySchema::Builder() + .SetFaceVertexCounts(fvcDs) + .SetFaceVertexIndices(fviDs) + .Build()) + .SetDoubleSided(HdRetainedTypedSampledDataSource::New(true))//Make the mesh double sided + .Build(); + + const HdContainerDataSourceHandle primvarsDs = + HdRetainedContainerDataSource::New( + + //Create the vertices positions + HdPrimvarsSchemaTokens->points, + HdPrimvarSchema::Builder() + .SetPrimvarValue(_PointArrayDs::New(points)) + .SetInterpolation(HdPrimvarSchema:: + BuildInterpolationDataSource( + HdPrimvarSchemaTokens->vertex)) + .SetRole(HdPrimvarSchema:: + BuildRoleDataSource( + HdPrimvarSchemaTokens->point)) + .Build(), + + //Create the vertex colors + HdTokens->displayColor, + HdPrimvarSchema::Builder() + .SetIndexedPrimvarValue( + HdRetainedTypedSampledDataSource::New( + VtVec3fArray{ + displayColor, + })) + .SetIndices( + HdRetainedTypedSampledDataSource::New( + vertexColorArray + ) + ) + .SetInterpolation( + HdPrimvarSchema::BuildInterpolationDataSource( + HdPrimvarSchemaTokens->varying)) + .SetRole( + HdPrimvarSchema::BuildRoleDataSource( + HdPrimvarSchemaTokens->color))//vertex color + .Build() + ); + + //Apply the size of the prim as a scale matrix + GfMatrix4d transform; + transform.SetIdentity(); + transform.SetScale(scale); + + //Create the primitive + HdRetainedSceneIndex::AddedPrimEntry addedPrim; + addedPrim.primPath = primPath; + addedPrim.primType = HdPrimTypeTokens->mesh; + addedPrim.dataSource = HdRetainedContainerDataSource::New( + //Create a matrix + HdXformSchemaTokens->xform, + HdXformSchema::Builder() + .SetMatrix(HdRetainedTypedSampledDataSource::New( + transform)).Build(), + + //create a mesh + HdMeshSchemaTokens->mesh, + meshDs, + HdPrimvarsSchemaTokens->primvars, + primvarsDs + ); + + //Add the prim in the retained scene index + retainedSceneIndex->AddPrims({addedPrim}); + } + + //Callback when an attribute of the maya node changes + void attributeChangedCallback(MNodeMessage::AttributeMessage msg, MPlug& plug, MPlug & otherPlug, void* footPrintData) + { + if (! footPrintData){ + return; + } + + MhFootPrint* footPrint = reinterpret_cast(footPrintData); + + MPlug parentPlug = plug.parent(); + if ( + (plug == MhFootPrint::mSize) || + (parentPlug == MhFootPrint::mColor) || + (plug == MhFootPrint::mColor) + ){ + footPrint->UpdateFootPrintPrims(); + } + } + + //Get the color attribute value which is a double3 + void GetDouble3AttributeValue(double3& outVal, const MObject& node, const MObject& attr) + { + MPlug plug(node, attr); + if (plug.isNull()){ + return; + } + + MObject oDouble3; + plug.getValue(oDouble3); + + MFnNumericData fnData(oDouble3); + fnData.getData( outVal[0], outVal[1], outVal[2] ); + } +}//end of anonymous namespace + +//Static variables init +int MhFootPrint::_counter = 0; +MObject MhFootPrint::mSize; +MObject MhFootPrint::mColor; +MTypeId MhFootPrint::id( 0x90573 ); +MString MhFootPrint::nodeClassification("hydraAPIExample/geometry/footPrint"); +MObject MhFootPrint::mWorldS; +MObject MhFootPrint::mDummyInput; +MObject MhFootPrint::mDummyOutput; + +namespace { + //Callback after a File Open + void afterOpenCallback (void *clientData) + { + if (! clientData){ + return; + } + + //Trigger a call to compute so that everything is initialized + MhFootPrint* footPrintInstance = reinterpret_cast(clientData); + footPrintInstance->TriggerACallToCompute(); + } +} + +MhFootPrint::MhFootPrint() +{ + _solePath = SdfPath(std::string("/sole_") + std::to_string(_counter)); + _heelPath = SdfPath(std::string("/heel_") + std::to_string(_counter)); + _counter++; + + //Add a callback after a load scene + _cbAfterOpenId = MSceneMessage::addCallback(MSceneMessage::kAfterOpen, afterOpenCallback, ((void*)this)) ; + + _retainedSceneIndex = HdRetainedSceneIndex::New(); +} + +MhFootPrint::~MhFootPrint() +{ + //Remove the callbacks + if (_cbAfterOpenId){ + CHECK_MSTATUS(MSceneMessage::removeCallback(_cbAfterOpenId)); + _cbAfterOpenId = 0; + } + + if (_cbAttributeChangedId){ + CHECK_MSTATUS(MMessage::removeCallback(_cbAttributeChangedId)); + _cbAttributeChangedId = 0; + } + + //Remove our retained scene index from hydra + Fvp::DataProducerSceneIndexInterface& dataProducerSceneIndexInterface = Fvp::DataProducerSceneIndexInterface::get(); + dataProducerSceneIndexInterface.removeViewportDataProducerSceneIndex(_retainedSceneIndex, pxr::FvpViewportAPITokens->allViewports); +} + +//Create the Hydra foot print primitives in the retained scene index +void MhFootPrint::_CreateAndAddFootPrintPrimitives() +{ + using _PointArrayDs = HdRetainedTypedSampledDataSource>; + using _IntArrayDs = HdRetainedTypedSampledDataSource; + + //Get the value of the size and color attributes + const float fSize = _GetSizeInCentimeters(); + const GfVec3f displayColor = _GetColor(); + const GfVec3f scale = {fSize,fSize,fSize};//convert size into a 3d uniform scale which we'll convert into a scale matrix + + _CreateAndAddPrim(_retainedSceneIndex, _solePath, solePoints, soleFaceVertexCounts, soleFaceVertexIndices, scale, displayColor); + _CreateAndAddPrim(_retainedSceneIndex, _heelPath, heelPoints, heelFaceVertexCounts, heelFaceVertexIndices, scale, displayColor); +} + +//Remove the 2 primitives from the retained scene index +void MhFootPrint::_RemoveFootPrintPrimitives() +{ + _retainedSceneIndex->RemovePrims({_solePath, _heelPath}); +} + +//To update we need to remove the previous primitives and create new ones +void MhFootPrint::UpdateFootPrintPrims() +{ + _RemoveFootPrintPrimitives(); + _CreateAndAddFootPrintPrimitives(); +} + +void MhFootPrint::TriggerACallToCompute() +{ + { + MPlug plug(thisMObject(), mDummyInput); + if (!plug.isNull()) + { + int dummyInputVal; + if (plug.getValue(dummyInputVal)) + { + plug.setValue(dummyInputVal + 1);//Dirty one parameter that affects the mDummyOutput attribute + MPlug plugOutput(thisMObject(), mDummyOutput); + if (!plugOutput.isNull()) + { + int dummyOutputVal; + plugOutput.getValue(dummyOutputVal);//This will trigger a call to compute + } + } + } + } +} + +void MhFootPrint::_UpdateThisMObject() +{ + if (! _thisMObject.isNull()){ + return; + } + + MObject currentMObj = thisMObject(); + if (_oldMObject.isNull() || _oldMObject != currentMObj){ + _thisMObject = currentMObj; + _oldMObject = _thisMObject; + } +} + +void MhFootPrint::setupFlowViewportInterface() +{ + static const SdfPath noPrefix = SdfPath::AbsoluteRootPath(); + + _UpdateThisMObject(); + + //Remove the callback + if (_cbAttributeChangedId){ + CHECK_MSTATUS(MMessage::removeCallback(_cbAttributeChangedId)); + _cbAttributeChangedId = 0; + } + //Add the callback when an attribute of this node changes + _cbAttributeChangedId = MNodeMessage::addAttributeChangedCallback(_thisMObject, attributeChangedCallback, ((void*)this)); + + //Remove the previous data producer scene index in case it was registered, if that occurs it's because _thisMObject has changed and we want to update the maya callbacks on the node + Fvp::DataProducerSceneIndexInterface& dataProducerSceneIndexInterface = Fvp::DataProducerSceneIndexInterface::get(); + dataProducerSceneIndexInterface.removeViewportDataProducerSceneIndex(_retainedSceneIndex, pxr::FvpViewportAPITokens->allViewports); + + //Data producer scene index interface is used to add the retained scene index to all viewports with all render delegates + dataProducerSceneIndexInterface.addDataProducerSceneIndex(_retainedSceneIndex, noPrefix, (void*)&_thisMObject, FvpViewportAPITokens->allViewports,FvpViewportAPITokens->allRenderers); +} + +// Retrieve value of the size attribute from the node +float MhFootPrint::_GetSizeInCentimeters() const +{ + const MObject obj = thisMObject(); + + MPlug plug(obj, MhFootPrint::mSize); + if (!plug.isNull()) + { + MDistance sizeVal; + if (plug.getValue(sizeVal)) + { + return (float)sizeVal.asCentimeters(); + } + } + + return 1.0f; +} + +// Retrieve value of the color attribute from the node +GfVec3f MhFootPrint::_GetColor() const +{ + const MObject obj = thisMObject(); + MPlug plug(obj, MhFootPrint::mColor); + if (!plug.isNull()) + { + double3 color; + GetDouble3AttributeValue(color, obj, MhFootPrint::mColor); + return {(float)color[0], (float)color[1], (float)color[2]}; + } + + return GfVec3f(0.f,0.f,1.f); +} + +MStatus MhFootPrint::compute( const MPlug& plug, MDataBlock& dataBlock) +{ + if( ! _init){ + _CreateAndAddFootPrintPrimitives(); + _init = true; + } + + //The MObject can change if the node gets deleted and deletion being undone, so always update it in our records + MObject currentMObj = thisMObject(); + if (_oldMObject.isNull() || _oldMObject != currentMObj){ + + _thisMObject = currentMObj; + _oldMObject = _thisMObject; + + setupFlowViewportInterface(); + } + + if (plug == mWorldS) + { + if (plug.isElement()) + { + MArrayDataHandle outputArrayHandle = dataBlock.outputArrayValue( mWorldS ); + outputArrayHandle.setAllClean(); + } + dataBlock.setClean(plug); + + return MS::kSuccess; + } + + return MS::kUnknownParameter;; +} + +bool MhFootPrint::isBounded() const +{ + return true; +} + +MBoundingBox MhFootPrint::boundingBox() const +{ + const double multiplier = _GetSizeInCentimeters(); + return MBoundingBox( corner1 * multiplier, corner2 * multiplier);//corner1 and 2 are the bounding box corner of our geometry +} + +void* MhFootPrint::creator() +{ + return new MhFootPrint(); +} + +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +// Plugin Registration +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- + +//Macro to create input attribute for the maya node +#define MAKE_INPUT(attr) \ + CHECK_MSTATUS(attr.setKeyable(true) ); \ + CHECK_MSTATUS(attr.setStorable(true) ); \ + CHECK_MSTATUS(attr.setReadable(true) ); \ + CHECK_MSTATUS(attr.setWritable(true) ); \ + CHECK_MSTATUS(attr.setAffectsAppearance(true) ); + +//Macro to create output attribute for the maya node +#define MAKE_OUTPUT(attr) \ + CHECK_MSTATUS ( attr.setKeyable(false) ); \ + CHECK_MSTATUS ( attr.setStorable(false) ); \ + CHECK_MSTATUS ( attr.setReadable(true) ); \ + CHECK_MSTATUS ( attr.setWritable(false) ); + +MStatus MhFootPrint::initialize() +{ + MFnUnitAttribute unitFn; + MFnNumericAttribute nAttr; + + mSize = unitFn.create( "size", "sz", MFnUnitAttribute::kDistance); + MAKE_INPUT(unitFn); + CHECK_MSTATUS ( unitFn.setDefault(1.0) ); + + mWorldS = unitFn.create("worldS", "ws", MFnUnitAttribute::kDistance, 1.0); + unitFn.setWritable(true); + unitFn.setCached(false); + unitFn.setArray( true ); + unitFn.setUsesArrayDataBuilder( true ); + unitFn.setWorldSpace( true ); + + mColor = nAttr.create("color", "col", MFnNumericData::k3Double, 1.0); + MAKE_INPUT(nAttr); + CHECK_MSTATUS ( nAttr.setDefault(0.0, 0.0, 1.0) ); + + //Create dummy input attribute to trigger a call to the compute function on demand. as it's in the compute fonction that we add our scene indices + mDummyInput = nAttr.create("dummyInput", "dI", MFnNumericData::kInt, 1.0); + MAKE_INPUT(nAttr); + CHECK_MSTATUS ( nAttr.setDefault(1) ); + + //Create dummy output attribute to trigger a call to the compute function on demand. as it's in the compute fonction that we add our scene indices + mDummyOutput = nAttr.create("dummyOutput", "dO", MFnNumericData::kInt, 1.0); + MAKE_OUTPUT(nAttr); + CHECK_MSTATUS ( nAttr.setDefault(1) ); + + CHECK_MSTATUS ( addAttribute(mSize) ); + CHECK_MSTATUS ( addAttribute(mColor)); + CHECK_MSTATUS ( addAttribute(mDummyInput)); + CHECK_MSTATUS ( addAttribute(mDummyOutput)); + CHECK_MSTATUS ( addAttribute(mWorldS)); + + CHECK_MSTATUS ( attributeAffects(mSize, mWorldS)); + CHECK_MSTATUS ( attributeAffects(mDummyInput, mDummyOutput)); + return MS::kSuccess; +} + +MStatus initializePlugin( MObject obj ) +{ + MStatus status; + MFnPlugin plugin( obj, PLUGIN_COMPANY, "2025.0", "Any"); + + status = plugin.registerNode( + "MhFootPrint", + MhFootPrint::id, + &MhFootPrint::creator, + &MhFootPrint::initialize, + MPxNode::kLocatorNode, + &MhFootPrint::nodeClassification); + if (!status) { + status.perror("registerNode"); + return status; + } + + return status; +} + +MStatus uninitializePlugin( MObject obj) +{ + MStatus status; + MFnPlugin plugin( obj ); + + status = plugin.deregisterNode( MhFootPrint::id ); + if (!status) { + status.perror("deregisterNode"); + return status; + } + return status; +} diff --git a/test/lib/mayaUsd/render/mayaToHydra/CMakeLists.txt b/test/lib/mayaUsd/render/mayaToHydra/CMakeLists.txt index 116f04a372..43fb994461 100644 --- a/test/lib/mayaUsd/render/mayaToHydra/CMakeLists.txt +++ b/test/lib/mayaUsd/render/mayaToHydra/CMakeLists.txt @@ -21,6 +21,7 @@ set(INTERACTIVE_TEST_SCRIPT_FILES testStageVariants.py testNurbsPrimitives.py testPolygonPrimitives.py + testFootPrintNode.py cpp/testColorPreferences.py cpp/testCppFramework.py cpp/testMayaSceneFlattening.py diff --git a/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/add_NodeCreated.png b/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/add_NodeCreated.png new file mode 100644 index 0000000000000000000000000000000000000000..3127eb25268e4bbef5977367256c26be164b7bac GIT binary patch literal 2374 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKL9Be?5hW%z|fD~V9glC$suNIKWzyTr{7^Xen z9tos4^WEHv!2%%Sme#g&Kov(kT^vIy=DfYTF;C_=V?*L;&(x(NPcOM?aTi?KwMkcf z{XwPtr01SZdpdNT_s(XSV14|Z&c>~G)tXN$@i?D)a(?&iySLvnw=Cvhk}>;!|IC|n zb{6*b_1p~aUcKGP&TznrlY^nNfnfs2C^Z@cWTk?W`OoDTHps7!x34QJ{P^SY?SFq3 zyRYB3@7?e8^!4-J=LXC%VQiebQ>Lqazg_j;Uw6}g|C3Emx3`mDFJJSafB&0*`dWYN z85>(?H+}r{RDPeuz4v!qGpl4BB@G3I^n?W>7FaI&sHUv)c>aWfnGFY=babVz&vg3q zSn=$#Le*)6@L+_xI|V%Y^rCaqC5Twwu=OMU$ys@ZDoKHVcAz3xa3n-Z>I?VjCxi%z>5XEY=yXlQZVNsm9o7 zdn?F7?a{_qCZ_75SEoa-OMY)YW6SnTS)sr`n&-H|JFo5kH|8=iT?{*HIFm0bWj71U zyNuTlC5~O1x|g4YCC}5M?BRx-qb?2)!a0ujRTNBZIKbPIoSrkS{?Eth^UvDyO>=j6 z&?VUCZ2K}l_l#AAFk_?l8LP6E=Gy`S72XzVhYrSaaLiVdu|DLesE~6>N>09-=g`4g zpxEZGk;iwedUbJec%S0Kdn_$yZ&X)$5nN-yS91HJdgFdcd%^Q&$D()J^~^=n!iHgK5dcF13vfgn|{|^<#G1+oPtv< zEsG`d*XYOndAWM$@xpLZm4a7uT900=`Fz&B{_oG{_xIX=w|JM;^Rr#P?*H?R=Rcma zwy&+9{drpg_q}=53^|8q)apE42UJjhW-*5bH>4<>t*ooTmJiGmr0)d zaqH#woSBjw?wfa)d_DfWxIbC`&VEL-i!%?-lGoRk`4B&CgT=1z_kO?2e_Wb-I`R?Y z|I@}7XCD3Hwx_MysfBr6I@_U~V{Bh;i2r;#z5TuZ*H3XD8)kEIY?ca7?^Rv9v^AyW zu<@~nK(D(-czLui=baCY(7Cj+-*#gNYq`3D&aH*>Su|uWaB{3J_}Oy%_pu`vUu}?Q zI`nEvWM{j@!GAz;Guf;PP_BGgtt|35ROi8lJ02%i`A!tzwyH6|&o gg_HXkj@s`umR!oQ9oVeF-TYzjboFyt=akR{0EoRt5C8xG literal 0 HcmV?d00001 diff --git a/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/add_NodeDeleted.png b/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/add_NodeDeleted.png new file mode 100644 index 0000000000000000000000000000000000000000..698720d403378478cdf31cff7328fbdae4968e31 GIT binary patch literal 1563 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKL9Be?5hW%z|fD~V9glC$suNIKWzyTr{7^Xen z9tos4^WEHv!2%%Sme#g&3=FI@JzX3_D(1Ys>d4EWC~)Awa7_X%q2M(IvW`#NQ_dWK`@#MMl-@_SwQ3BFz0&!i%Hv8i$B1!8h4q_;OXk; Jvd$@?2>@-#gd4EWC~)Awa7_X%q2M(IvW`#NQ_dWK`@#MMl-@_SwQ3BFz0&!i%Hv8i$B1!8h4q_;OXk; Jvd$@?2>@-#g+He?k0OYffHRP_Gd_WA1+mEO;rGv~}+wuZUA1#{-se*5s}&kwb}|Ic4u z=HD-IU0krzihrzQb~Q-4XmyI1=s;n~s@CMKOjQHMURTI%lN(6D&hv4TBW zCj|us9%#sZjt%|2?Mep+M?uLoyV5nS4GiwdrytJfbBYvd*JN@}JpD03OPIqz`{9la zN7%W26%OPad3>nCsP>(yh?>BITb#$ez3r|64b9%XG`jfyu}O~&fkx^2$m-wS`+NKP z>EF&AuUA$$;Mi+k`s?5C{(VNJF%jN2Y>bS2$F6+5H0zLIp}1Iqz@v|sq#hg2aA?>o z)HnT_R9|NUL$$J;_%%5&tFY|b@%P*I1@4<#;KRbQV^ZPtt2b|^-#@#z&oWn6W-=%X z7q4fGXw<#8ZueD?k{i2Ck3YG#R$lJjo}X_XPCIM}^y%6j-cKLriSCx!Yv^ROF1zF8 z3^ToThd?qx$_&q+Z?~`fdv4Xo=pS>f`{mzAO%|Ngef@N2XF-ggLxcIAw+q{qRUStr z7oAa*e0Zbu(Jd)P#yZ1Ag@w823#Y71vDh{vr#87poQX-gyrcd9GzsB{H|91RaErYj z{P_5u_(y%KRtpN;n6a}@dZts+$EtgOg?>x_R#ey^c>K$eA2IchKBcevDHnbYU)FnASRi6&{=T1=_dkm}yl$P*)Sej} z$G;Xx>94s_GUddj9?zs%YGs`#e@IC`zU~f;XS1VA?7p6RxTm_P$mqLN19Rp7zw-YL z*FArJ{Nt4Gp?|(y&aX4Kn`ig;L-)q}AMaJ$|119WbH;J&VtodSH5=s%KxyvW-o9Gn z)-&f>n4}Hrg6Eq}n{Lkk{t9S1sN&s1lBRkM@Rf&QEO z_O&dt?ACobOiVE+OA;R6W=XZ$RJ%v4_o=Wz!uvQ|)*Eg=sw{iOZ&+Wv!3Ips!2HAj nOj)DUXb=ptRPaaIFMW-IFgJrAu)Tx3UBuw&>gTe~DWM4fC_Mhc literal 0 HcmV?d00001 diff --git a/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/add_NodeDeletedUndoAgain.png b/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/add_NodeDeletedUndoAgain.png new file mode 100644 index 0000000000000000000000000000000000000000..0747c652844a4223c7f2300858e0e72c53076a9b GIT binary patch literal 2399 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKL9Be?5hW%z|fD~V9glC$suNIKWzyTr{7^Xen z9tos4^WEHv!2%%Sme#g&KoxgAT^vIy=DfYTF;C{YWW&W1eyPi+Ou5vl%~^0`hnUXs z-grd@?%$p{wq9`ue6tP+He?k0OYffHRP_Gd_WA1+mEO;rGv~}+wuZUA1#{-se*5s}&kwb}|Ic4u z=HD-IU0krzihrzQb~Q-4XmyI1=s;n~s@CMKOjQHMURTI%lN(6D&hv4TBW zCj|us9%#sZjt%|2?Mep+M?uLoyV5nS4GiwdrytJfbBYvd*JN@}JpD03OPIqz`{9la zN7%W26%OPad3>nCsP>(yh?>BITb#$ez3r|64b9%XG`jfyu}O~&fkx^2$m-wS`+NKP z>EF&AuUA$$;Mi+k`s?5C{(VNJF%jN2Y>bS2$F6+5H0zLIp}1Iqz@v|sq#hg2aA?>o z)HnT_R9|NUL$$J;_%%5&tFY|b@%P*I1@4<#;KRbQV^ZPtt2b|^-#@#z&oWn6W-=%X z7q4fGXw<#8ZueD?k{i2Ck3YG#R$lJjo}X_XPCIM}^y%6j-cKLriSCx!Yv^ROF1zF8 z3^ToThd?qx$_&q+Z?~`fdv4Xo=pS>f`{mzAO%|Ngef@N2XF-ggLxcIAw+q{qRUStr z7oAa*e0Zbu(Jd)P#yZ1Ag@w823#Y71vDh{vr#87poQX-gyrcd9GzsB{H|91RaErYj z{P_5u_(y%KRtpN;n6a}@dZts+$EtgOg?>x_R#ey^c>K$eA2IchKBcevDHnbYU)FnASRi6&{=T1=_dkm}yl$P*)Sej} z$G;Xx>94s_GUddj9?zs%YGs`#e@IC`zU~f;XS1VA?7p6RxTm_P$mqLN19Rp7zw-YL z*FArJ{Nt4Gp?|(y&aX4Kn`ig;L-)q}AMaJ$|119WbH;J&VtodSH5=s%KxyvW-o9Gn z)-&f>n4}Hrg6Eq}n{Lkk{t9S1sN&s1lBRkM@Rf&QEO z_O&dt?ACobOiVE+OA;R6W=XZ$RJ%v4_o=Wz!uvQ|)*Eg=sw{iOZ&+Wv!3Ips!2HAj nOj)DUXb=ptRPaaIFMW-IFgJrAu)Tx3UBuw&>gTe~DWM4fC_Mhc literal 0 HcmV?d00001 diff --git a/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/add_NodeHidden.png b/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/add_NodeHidden.png new file mode 100644 index 0000000000000000000000000000000000000000..698720d403378478cdf31cff7328fbdae4968e31 GIT binary patch literal 1563 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKL9Be?5hW%z|fD~V9glC$suNIKWzyTr{7^Xen z9tos4^WEHv!2%%Sme#g&3=FI@JzX3_D(1Ys>d4EWC~)Awa7_X%q2M(IvW`#NQ_dWK`@#MMl-@_SwQ3BFz0&!i%Hv8i$B1!8h4q_;OXk; Jvd$@?2>@-#g+He?k0OYffHRP_Gd_WA1+mEO;rGv~}+wuZUA1#{-se*5s}&kwb}|Ic4u z=HD-IU0krzihrzQb~Q-4XmyI1=s;n~s@CMKOjQHMURTI%lN(6D&hv4TBW zCj|us9%#sZjt%|2?Mep+M?uLoyV5nS4GiwdrytJfbBYvd*JN@}JpD03OPIqz`{9la zN7%W26%OPad3>nCsP>(yh?>BITb#$ez3r|64b9%XG`jfyu}O~&fkx^2$m-wS`+NKP z>EF&AuUA$$;Mi+k`s?5C{(VNJF%jN2Y>bS2$F6+5H0zLIp}1Iqz@v|sq#hg2aA?>o z)HnT_R9|NUL$$J;_%%5&tFY|b@%P*I1@4<#;KRbQV^ZPtt2b|^-#@#z&oWn6W-=%X z7q4fGXw<#8ZueD?k{i2Ck3YG#R$lJjo}X_XPCIM}^y%6j-cKLriSCx!Yv^ROF1zF8 z3^ToThd?qx$_&q+Z?~`fdv4Xo=pS>f`{mzAO%|Ngef@N2XF-ggLxcIAw+q{qRUStr z7oAa*e0Zbu(Jd)P#yZ1Ag@w823#Y71vDh{vr#87poQX-gyrcd9GzsB{H|91RaErYj z{P_5u_(y%KRtpN;n6a}@dZts+$EtgOg?>x_R#ey^c>K$eA2IchKBcevDHnbYU)FnASRi6&{=T1=_dkm}yl$P*)Sej} z$G;Xx>94s_GUddj9?zs%YGs`#e@IC`zU~f;XS1VA?7p6RxTm_P$mqLN19Rp7zw-YL z*FArJ{Nt4Gp?|(y&aX4Kn`ig;L-)q}AMaJ$|119WbH;J&VtodSH5=s%KxyvW-o9Gn z)-&f>n4}Hrg6Eq}n{Lkk{t9S1sN&s1lBRkM@Rf&QEO z_O&dt?ACobOiVE+OA;R6W=XZ$RJ%v4_o=Wz!uvQ|)*Eg=sw{iOZ&+Wv!3Ips!2HAj nOj)DUXb=ptRPaaIFMW-IFgJrAu)Tx3UBuw&>gTe~DWM4fC_Mhc literal 0 HcmV?d00001 diff --git a/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/add_NodeMovedAfterDeletionAndUndo.png b/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/add_NodeMovedAfterDeletionAndUndo.png new file mode 100644 index 0000000000000000000000000000000000000000..5954d6e4069573b1b4b4bbe5c2abc4eda940f62f GIT binary patch literal 2411 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKL9Be?5hW%z|fD~V9glC$suNIKWzyTr{7^Xen z9tos4^WEHv!2%%Sme#g&Kou`NT^vIy=DfXoJ}>4f7Ey}8T^C3IyNkLbF)FDEcd2hHFwVJ#U(1IEw(*>K6B^ybARnLXK579dE8rXSO4rz z_44J*-!mTAc5i+a1B1@w28Ib791NYK)MyaUG8LR;59VjsF?aK3_w(n@%h#IK{eSlL z=FOY)=jDEWFK_qf=h3J3)gK;w?Ka=PulC1>ukZiy){q?g#cjJyzq4OU< znxD(``J}piji$z(wuS>eJsEGbByQjOGyn0|kB{H)ulVz$U7z2UZQ9d&FJHdAlH3qF z+epe>P-tB;8<3FrxuAf>0>QqW?vFParU^dOVq#+7aHJro zr_g%k(NGqaZy6^a?#Pgl7ZcDE7Pzr->6`qV!*LwpKMzk<_g^N*EYo|o=kcGKI`vg$ z56|j6xxMoEftneO2l!-82Z`o5J3QdKCepWYqTN@C8RCqM3BC^{j+v^PUEJy8kidO> zhhv@eIwggI=B;hX1>$1Y1qCYFP1}<#EPuY*Ig=g8 z-I4P4p~341+gMos<-dI>ailqygJX}n+#yFrg*CGZIN0YlZ16htaj*8RoyLrbrPpNo z1^c$IPm{d^6qm~8JD#w!D^^&b@7}D#hVM310mGU5VS+qM%i?X(_)ZFQT6%qd|Nqnc!c#A{-+x#C=k@yfKNYV&zPbEt)8Xa*`|I9y zHp*Pud-?L^mB$&XP1BU^|NVIRJU#vR*BO!Sg)?VKa&(&>GDwp$uf6kQM!(&!@B8~w z-HZ-xoSA#)+3WUNL*~T7W5<5{{JA(i+0D>TvbS9}_jB+Mp>!3$U_*DNLrQnPs2oV< z?YtavW@dvy^keBivu7Slzb$jvcG?6B-=jht9Gi;^J6F~9Ep2nLh!A2-6g!pk*le1B z(CHAJsSO4zXMZy*Tlyzu|N99uayOJP9a1UV=o9KAEA;;EgBctg?55LqujG>yaxbt9 zV>)#3jH;aYTVs`JD=f;G4&6KZu;j9@pWnW!eQ!5i3XPx6TX@aI;l^s!yIs+KIlQxl zQx+Y(wS&8R@2_{e_x~%_Ecfp%{P*SZ{Qrh#-|hc=nEwCXw|Of+7UmsH?FE&wGV4E1 z{yAs*+Iy)zm1kzf?fY}v{Bib-DjS1vpjADob5|ZO5O-p_E-divS;RLMH;-v@&NtW@ z6W8CHm-p-E(JPO4a33#xnB|vPD3CwBaoSdSC7A+SV*$QLPoBJXJ?nCWIq%!SE6fSD zZZ6O4ga!F_*uH0exZv5JoT85nZ*MRs8WmSg-&Np{%yuZ{nDq|x`#a8`=ik4^^w7sI zFK^8Ls8^)H(sHsl|3Q1qH6gwmyxtLKPTA$Z`)Z(mLzgjeTbZCRe{s`aL4maV+Y>6( z*k#%pHfYTD=GDLFYdUS|vDHg8Ep+l#QUc8;3UJSux7vrngN3ER#bJ~h4FZx=!IS#O a-lqhsoF{bx+djD4NDQ8?elF{r5}E)Ty+sB9 literal 0 HcmV?d00001 diff --git a/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/add_NodeUnhidden.png b/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/add_NodeUnhidden.png new file mode 100644 index 0000000000000000000000000000000000000000..0747c652844a4223c7f2300858e0e72c53076a9b GIT binary patch literal 2399 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKL9Be?5hW%z|fD~V9glC$suNIKWzyTr{7^Xen z9tos4^WEHv!2%%Sme#g&KoxgAT^vIy=DfYTF;C{YWW&W1eyPi+Ou5vl%~^0`hnUXs z-grd@?%$p{wq9`ue6tP+He?k0OYffHRP_Gd_WA1+mEO;rGv~}+wuZUA1#{-se*5s}&kwb}|Ic4u z=HD-IU0krzihrzQb~Q-4XmyI1=s;n~s@CMKOjQHMURTI%lN(6D&hv4TBW zCj|us9%#sZjt%|2?Mep+M?uLoyV5nS4GiwdrytJfbBYvd*JN@}JpD03OPIqz`{9la zN7%W26%OPad3>nCsP>(yh?>BITb#$ez3r|64b9%XG`jfyu}O~&fkx^2$m-wS`+NKP z>EF&AuUA$$;Mi+k`s?5C{(VNJF%jN2Y>bS2$F6+5H0zLIp}1Iqz@v|sq#hg2aA?>o z)HnT_R9|NUL$$J;_%%5&tFY|b@%P*I1@4<#;KRbQV^ZPtt2b|^-#@#z&oWn6W-=%X z7q4fGXw<#8ZueD?k{i2Ck3YG#R$lJjo}X_XPCIM}^y%6j-cKLriSCx!Yv^ROF1zF8 z3^ToThd?qx$_&q+Z?~`fdv4Xo=pS>f`{mzAO%|Ngef@N2XF-ggLxcIAw+q{qRUStr z7oAa*e0Zbu(Jd)P#yZ1Ag@w823#Y71vDh{vr#87poQX-gyrcd9GzsB{H|91RaErYj z{P_5u_(y%KRtpN;n6a}@dZts+$EtgOg?>x_R#ey^c>K$eA2IchKBcevDHnbYU)FnASRi6&{=T1=_dkm}yl$P*)Sej} z$G;Xx>94s_GUddj9?zs%YGs`#e@IC`zU~f;XS1VA?7p6RxTm_P$mqLN19Rp7zw-YL z*FArJ{Nt4Gp?|(y&aX4Kn`ig;L-)q}AMaJ$|119WbH;J&VtodSH5=s%KxyvW-o9Gn z)-&f>n4}Hrg6Eq}n{Lkk{t9S1sN&s1lBRkM@Rf&QEO z_O&dt?ACobOiVE+OA;R6W=XZ$RJ%v4_o=Wz!uvQ|)*Eg=sw{iOZ&+Wv!3Ips!2HAj nOj)DUXb=ptRPaaIFMW-IFgJrAu)Tx3UBuw&>gTe~DWM4fC_Mhc literal 0 HcmV?d00001 diff --git a/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/add_VP2AndThenBackToStorm.png b/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/add_VP2AndThenBackToStorm.png new file mode 100644 index 0000000000000000000000000000000000000000..5954d6e4069573b1b4b4bbe5c2abc4eda940f62f GIT binary patch literal 2411 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKL9Be?5hW%z|fD~V9glC$suNIKWzyTr{7^Xen z9tos4^WEHv!2%%Sme#g&Kou`NT^vIy=DfXoJ}>4f7Ey}8T^C3IyNkLbF)FDEcd2hHFwVJ#U(1IEw(*>K6B^ybARnLXK579dE8rXSO4rz z_44J*-!mTAc5i+a1B1@w28Ib791NYK)MyaUG8LR;59VjsF?aK3_w(n@%h#IK{eSlL z=FOY)=jDEWFK_qf=h3J3)gK;w?Ka=PulC1>ukZiy){q?g#cjJyzq4OU< znxD(``J}piji$z(wuS>eJsEGbByQjOGyn0|kB{H)ulVz$U7z2UZQ9d&FJHdAlH3qF z+epe>P-tB;8<3FrxuAf>0>QqW?vFParU^dOVq#+7aHJro zr_g%k(NGqaZy6^a?#Pgl7ZcDE7Pzr->6`qV!*LwpKMzk<_g^N*EYo|o=kcGKI`vg$ z56|j6xxMoEftneO2l!-82Z`o5J3QdKCepWYqTN@C8RCqM3BC^{j+v^PUEJy8kidO> zhhv@eIwggI=B;hX1>$1Y1qCYFP1}<#EPuY*Ig=g8 z-I4P4p~341+gMos<-dI>ailqygJX}n+#yFrg*CGZIN0YlZ16htaj*8RoyLrbrPpNo z1^c$IPm{d^6qm~8JD#w!D^^&b@7}D#hVM310mGU5VS+qM%i?X(_)ZFQT6%qd|Nqnc!c#A{-+x#C=k@yfKNYV&zPbEt)8Xa*`|I9y zHp*Pud-?L^mB$&XP1BU^|NVIRJU#vR*BO!Sg)?VKa&(&>GDwp$uf6kQM!(&!@B8~w z-HZ-xoSA#)+3WUNL*~T7W5<5{{JA(i+0D>TvbS9}_jB+Mp>!3$U_*DNLrQnPs2oV< z?YtavW@dvy^keBivu7Slzb$jvcG?6B-=jht9Gi;^J6F~9Ep2nLh!A2-6g!pk*le1B z(CHAJsSO4zXMZy*Tlyzu|N99uayOJP9a1UV=o9KAEA;;EgBctg?55LqujG>yaxbt9 zV>)#3jH;aYTVs`JD=f;G4&6KZu;j9@pWnW!eQ!5i3XPx6TX@aI;l^s!yIs+KIlQxl zQx+Y(wS&8R@2_{e_x~%_Ecfp%{P*SZ{Qrh#-|hc=nEwCXw|Of+7UmsH?FE&wGV4E1 z{yAs*+Iy)zm1kzf?fY}v{Bib-DjS1vpjADob5|ZO5O-p_E-divS;RLMH;-v@&NtW@ z6W8CHm-p-E(JPO4a33#xnB|vPD3CwBaoSdSC7A+SV*$QLPoBJXJ?nCWIq%!SE6fSD zZZ6O4ga!F_*uH0exZv5JoT85nZ*MRs8WmSg-&Np{%yuZ{nDq|x`#a8`=ik4^^w7sI zFK^8Ls8^)H(sHsl|3Q1qH6gwmyxtLKPTA$Z`)Z(mLzgjeTbZCRe{s`aL4maV+Y>6( z*k#%pHfYTD=GDLFYdUS|vDHg8Ep+l#QUc8;3UJSux7vrngN3ER#bJ~h4FZx=!IS#O a-lqhsoF{bx+djD4NDQ8?elF{r5}E)Ty+sB9 literal 0 HcmV?d00001 diff --git a/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/footPrint_AfterModifs.png b/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/footPrint_AfterModifs.png new file mode 100644 index 0000000000000000000000000000000000000000..32228189f34453e8faea5de8b30aaf76ccfcb7b3 GIT binary patch literal 2080 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKL9Be?5hW%z|fD~V9glC$suNIKWzyTr{7^Xen z9tos4^WEHv!2%%Sme#g&3=Hh^JY5_^D(1Ys>zF6v&fsv7;pRc9d`pIJqD~()C)7-z zusG$Y?twXs-_D7Bi&NJ;s;hK7;dk}2>Z)h9Ctqz`GjrY4{i{~5etz-h&71xV1@ZmU zQF4C1ef`(-=k+hY-o5Af>+9>Ehad01oIPW9 z!+|q#`)YpPwvdyT-@kT#VM)oCSNr$Z|NQjy&*$go_jhv^3kl3PsJ7^%va-hG=a-lJ z=ev7sE9BeZ=aA6tX0c7QcXm%PCr5E*QBl#RFA@pwdkW^vn>R0h{}q$z8_hNyskGEd zQ`n$*d!J8fcsTdRG{u~`4F{Ng%L8>~`%VUJmgDOOa?k8NRw(|sZ_U!<2NDGYILZuV zgu7pyadmhgS7s@5ct`K`IDuzM3I*)D<@yfF2|QC%_`rOK@xHo3L38Zx&9BtLr?0l* z?mo)F5wrRA=03r`LX+1CnM_RK*97>C`N}#Q3OR*a3Z zNwv+Ul_h0m+knm%dmME2`!)V!_mAbItbFbIEOYt~kc0(MfK%+ePtf8;laLRPCw^7 zm)_iCo`3I;>DsLf|Ahp?(pTO*z|q-pz+5i%kk;Pn@9!=GuT%yc6PPDz8u}0em*Ye)8^$BF>!JKcAh-nTC1qA z=H3r>`!tT(Tqik>|Nj2IUUvTWg^Gvbilp_c)2o)8{K9Z__nzZy4m<1_6W9A%A3y$D zQ%zayu|@7LVcrZDmWCsC0t`Zoj0%FI)MyY4a4PsIt?_fh)0OiNF9259xGQ!BPgg&e IbxsLQ0AFIoV*mgE literal 0 HcmV?d00001 diff --git a/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/footPrint_BeforeModifs.png b/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/footPrint_BeforeModifs.png new file mode 100644 index 0000000000000000000000000000000000000000..dcf57356b31362d9bff2ebbe016ad0859520ab8f GIT binary patch literal 1836 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKL9Be?5hW%z|fD~V9glC$suNIKWzyTr{7^Xen z9tos4^WEHv!2%%Sme#g&3=C|mJY5_^D(1YsW9SzWDA5oYV6DUGt)a+R=FqaE_a^rS z5%EPy5lt!=GPN&ot=%(0)5YPLcghjV<&`t{n4i2~yYu_LnLjUPn6NWUt}=Yf$WSql zg{8s8fx%;x8V!QMl?vi~s~IZZojX6hTu*P>{XTnry?M2A>%6_w+k>UK<~1}p6claR zST5T;_w#3S>+iOk_x($)ul@Vu0q5~1byWp}MnxHQ_1VAstIL8Neyr!@usNjiP$D|& zSKW{DWsUXC4F{OLEZDZKpTWw+R4&1H%-`Sqo1E3-9o+>6-YhJ6l8*{YzP!7va$k@y zZDPZLJ7>eL7RbgOl#Sbe_ujt^zn6=i5a^w~y1-yIOUul%>ypO{e(c>=RtWrXZ`TH=3d3#VN>TXywv+*VQkA9qi$UAs2( zJVWrt4IdugK6UE)cV~}v>%_wJ_2bv~z30{LSCrbe>OtM-#TPSf88dv~xp|05K~R7} oh>>xW8V!O$oeF+(o>J{zF6v&fsv7;pRc9d`pIJqD~()C)7-z zusG$Y?twXs-_D7Bi&NJ;s;hK7;dk}2>Z)h9Ctqz`GjrY4{i{~5etz-h&71xV1@ZmU zQF4C1ef`(-=k+hY-o5Af>+9>Ehad01oIPW9 z!+|q#`)YpPwvdyT-@kT#VM)oCSNr$Z|NQjy&*$go_jhv^3kl3PsJ7^%va-hG=a-lJ z=ev7sE9BeZ=aA6tX0c7QcXm%PCr5E*QBl#RFA@pwdkW^vn>R0h{}q$z8_hNyskGEd zQ`n$*d!J8fcsTdRG{u~`4F{Ng%L8>~`%VUJmgDOOa?k8NRw(|sZ_U!<2NDGYILZuV zgu7pyadmhgS7s@5ct`K`IDuzM3I*)D<@yfF2|QC%_`rOK@xHo3L38Zx&9BtLr?0l* z?mo)F5wrRA=03r`LX+1CnM_RK*97>C`N}#Q3OR*a3Z zNwv+Ul_h0m+knm%dmME2`!)V!_mAbItbFbIEOYt~kc0(MfK%+ePtf8;laLRPCw^7 zm)_iCo`3I;>DsLf|Ahp?(pTO*z|q-pz+5i%kk;Pn@9!=GuT%yc6PPDz8u}0em*Ye)8^$BF>!JKcAh-nTC1qA z=H3r>`!tT(Tqik>|Nj2IUUvTWg^Gvbilp_c)2o)8{K9Z__nzZy4m<1_6W9A%A3y$D zQ%zayu|@7LVcrZDmWCsC0t`Zoj0%FI)MyY4a4PsIt?_fh)0OiNF9259xGQ!BPgg&e IbxsLQ0AFIoV*mgE literal 0 HcmV?d00001 diff --git a/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/loadingFootPrintScene.png b/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/loadingFootPrintScene.png new file mode 100644 index 0000000000000000000000000000000000000000..772946f59e856d906329039acbf947d16513bb60 GIT binary patch literal 3041 zcmeH}`8(8W8^FI~ow3BAMUfdhP0`qjFim40Bw{F;EHyEO@XG!zBj!jm=e1;4oHH#L zOIfa*j4Y#2l#IP>b4o}tGtLms)cf=M7o79MbKjrqey;2O;aNY_lWq?3GJ9nJ0FZZb z#GL{F2>r)^N{K2U%e+sNc7za|F1WfHiV%SQ2mp}xvB_7IVBz-mQ9lbm!kA&>YXFc9 zaKat;x>me2X-iWdQtzIw$~IJ2I-|#knq^-SubbM5cyk#pv%3Fm*Te6cjZX2IK17KO z%O_tVPNm}Ra$OlO(Zwt=pK&Bo$#d;P5+ zCymn$M1Nu!Xu>-EoKHGC_V6_IW1!H89G_*@cGJo#=R{Z_Erg5B2LEzwK(Iq661u;{K%@~n7iVGZ*z#e*+~s8^g2!xQR~6DwUuR) z1%;9+@?RsfEJb7*+%rOxHVUvQx>ACcfn3j}vXis^)0hXgwUfc9NqrZ;QfV<+tzi@PK*S(Jmgle9ao}LQq797!Rkrmz6fy+&qd$L}+_THRM_#t=*Bjip{A8slW4& zrR8I$K!enVpEP29fAp`)^;oQy;+rtM2C=lZLv$R+vBaPub9la`nMilG$B;g}Py1Lb^ z&i=BpBd2q0ZQErb9Mkrd)6-N+Y9*X%@sMxY;9h3CeUJS?{ESc7)$msmXu5a*DwB`D z*h?7L4VfQ_hQA+sPH?8uLF1?OiDvCQ4?_Fr&goO{cClV^{Md#b6EiG@P<>AU^kRT3 z9YqQ1Jt`

XoW}enB=_e`L0ab_E-M!HaQ99Qb%dfY&v9H z>KQ*j`ogmt3Gsb?PGH`{ic~P#+uVC@#-q7l<_1$>UV2QJsPHWx@5wov5C=i$S$9>` zO4rj@vUmX+Nj%ziE1#orMx(c|rwd^=oaiv75lH3=w6&IFCpsnS!DlGn$+_`g^duMO zOVlttSFzlW#)5|$Yw+jbjmhlLa+?N&U z38(peX2>UjW6eb^-(Jrl9h)j+(%-ia7c}IM&TgXA!h>O9H|K4KWX52o((Oys z9`sNo>ijFBZ-})|0d$QlWs}AK_eF8)9TB1HTcs3C%V?TOeeD59}}m|5qVZ z?J8HT>WEHaN?$dL@BgVDFH9Rxsx^ne;+j2}>+12bjkiJ`5f4ac&*7`$P(kVrs1Y>e z9;|4dWj;AJ`#H$vWHbgtVhGgZ6Y{Y;^nR)AcikC{$6(#KB{iaMO*rk5%>TWW1Jyq- z3;!_hOUHfp{?M(YuuTg%%=r4iNS?)De~QcvS8{U!*f-_%e(7k8iN7{N4`Fg7H?~#h z%Rs`Q%1kujfjfr86rjCfokA{mcBSrQ+f|8Rsf&S^vq^21qAwpT722Qf=G06AS9B3% ztS>t>Nv`dZL@=Xc+?~E!9QTO^_RW>rt@^X{6+Wf9@?_$hr3ZKA))aY$-V3-Aa*8@$ zsODfwRMVw9^$cze;GU@A@%CkiE~n)${x9$7Tb4tiwRqDUD~sIlKcEOrL`Eys8rXTvweQ2 zvY?{k2Rp-#wda?~F)+;bbYSpcVQFv~rAC8**i`V({=8pvHgDei_-a3k z+3bc5TirCy{jb?vv2XkK@`Bsz3#+QCY?6wKias5_#Lgl8?%>0R53eLQEWLUE{{K1~ zyUI^bj&9oj?euj0{ieo^{|%WFAFnl%+W+6q-QE58>OXQDJXu%|n9X?+T#V$Vl&&jdb_)y^XyX(3t4z#nh z+???^b=CFt@%szdSk|d2`1n~Q7;|z=o*8X1$Ey9dpun}fyoVB-dp{TK*>sF?yRyQX zqj$tl|8FA}P;e)I3s>4Q_{>%YI7ef0C@^Y-h@7UverWbdtzU*yi*?;co^Y_duW}g$- z4s8vq%{zSS*q%50D?k5}Ip1-3)u9bs-8XtJ^c?6o{fmRcJnEa%u7WeiJB}@5eH^T_ zsOZzv>Gm9_UU6{Df3r@p@It=bvDB5%?f-6>X1Z==?+lKUS${shyu3WPzmeBaY?uDI zqCK~6-mLuc;o)I-^S^VuSwB5qym;})X&bKVE!Y%SU-$dl`fBml61U$yT)*G$*Xi5a z>!r`1SAKN=fl#E&^J{ud1vc~I_su=|)U{yusu{D@^Y87E=vVKTpUtY@*-)S^zFo-D zuKtz%Q#MKcMcv{dE9_=hF&r?7tNZ(P`||HOu?gSj#cYcfXKbv_($SK?ySbz1=$Dnp zH~6x!yxS=_@p`}f{uxy=uM^a-6>)NWsPj#^tz0xeE$VfWwEl;CN!_ov<-Py=JUssI z-}~0q|7TUn+&;p?@?*WB@XzDr_ib-%yMOKY`NyBGegf)k+^A<%mg#HTmuh)y(fm}u zJEvG0jyO6!hHZE4*}WAxhv!y(udDW-%xoSSqnE94 zVCu0q$xp!QtEUX zR#sNOSQxH-eR)Zo;Xs~{0D}-Cqk`ZlH5vp&rh-ZJdbNxO+yDOkdw6x-^EYqaqx*sW z+0QR$Q(^VB+P?bRn~f7W{~YCLnY;aD#-9I{$B!RZpZ$mDhAPt`zggN+&!=h{>^RBN zGS}#kVY9)dIuYP`h?mw5Yv73{lTbS>LFVmr%wm6pYIMD_7FZ)2E zHJz~FRG{E%d474jm|s#ioPZWwPB(X(bFTK-TJ!vSe>VNPSz&k0%Z}0A|{rzpPZ_Tm!-xoybu9MC^&?hKhm*Mi{>FMeBd!Gld zYvo|S!y|U_XU6rr6Q3@Se_d7h;nCf@ymfc~fBo?F?)CQf|Nop@ZLR+JWA|nKeS3?) z9WQ>Stgt3`?&K%i9t8Ci?5X(h=;f~UyZ`_Bclr17?|Ur9WaP(K#leJAzxx`G^Wpamym z%|f?woqTmoIlMK+ejA~oYSshO`G`w}Aj)}?V)$jHD|G(e0KC<=6-C}ds zJCfTzGEJ`f^5){>tFcA)*CYyk_HLbi_Vag#2G6&9Z~lJzdHVc%^Rk$~`@a9)dq3}g z+51)3dtR>6@84fz6Sw=Pc8b=r4Gq1&FF5^_Shom(_BC+B$kuj`!1y4zvj4eM`bEPHjmSO1Nzoww7t+%IhP)pUjr z8|~&-F);K^ZeWXRK)1jf>^w0*`#;@t&;o^_Kere07S!Et=SSdgE?f2IVoo5pT1QOmpeERhJ zh^T~`dL+dwKw}tb#zX6)4qB`LgT-E%M8<(%O~x$bUpr#gJT0nd~BSZ=)}81 zKrP|v>F1ZtYkaJ(upz+SuI|s-*{y52bM)-f%vo5(vUIfU<0D*-CH=Z$e5SMEz@grb zKUHPlN?uv!HEVAy^LA+XI_tz8^$cze;GU@A@%CkiE~n)${x9$7Tb4tiwRqDUD~sIlKcEOrL`Eys8rXTvweQ2 zvY?{k2Rp-#wda?~F)+;bbYSpcVQFv~rAC8**i`V({=8pvHgDei_-a3k z+3bc5TirCy{jb?vv2XkK@`Bsz3#+QCY?6wKias5_#Lgl8?%>0R53eLQEWLUE{{K1~ zyUI^bj&9oj?euj0{ieo^{|%WFAFnl%+W+6q-QE58>OXQDJXu%|n9X?+T#V$Vl&&jdb_)y^XyX(3t4z#nh z+???^b=CFt@%szdSk|d2`1n~Q7;|z=o*8X1$Ey9dpun}fyoVB-dp{TK*>sF?yRyQX zqj$tl|8FA}P;e)I3s>4Q_{>%YI7ef0C@^Y-h@7UverWbdtzU*yi*?;co^Y_duW}g$- z4s8vq%{zSS*q%50D?k5}Ip1-3)u9bs-8XtJ^c?6o{fmRcJnEa%u7WeiJB}@5eH^T_ zsOZzv>Gm9_UU6{Df3r@p@It=bvDB5%?f-6>X1Z==?+lKUS${shyu3WPzmeBaY?uDI zqCK~6-mLuc;o)I-^S^VuSwB5qym;})X&bKVE!Y%SU-$dl`fBml61U$yT)*G$*Xi5a z>!r`1SAKN=fl#E&^J{ud1vc~I_su=|)U{yusu{D@^Y87E=vVKTpUtY@*-)S^zFo-D zuKtz%Q#MKcMcv{dE9_=hF&r?7tNZ(P`||HOu?gSj#cYcfXKbv_($SK?ySbz1=$Dnp zH~6x!yxS=_@p`}f{uxy=uM^a-6>)NWsPj#^tz0xeE$VfWwEl;CN!_ov<-Py=JUssI z-}~0q|7TUn+&;p?@?*WB@XzDr_ib-%yMOKY`NyBGegf)k+^A<%mg#HTmuh)y(fm}u zJEvG0jyO6!hHZE4*}WAxhv!y(udDW-%xoSSqnE94 zVCu0q$xp!Q^$cze;GU@A@%CkiE~n)${x9$7Tb4tiwRqDUD~sIlKcEOrL`Eys8rXTvweQ2 zvY?{k2Rp-#wda?~F)+;bbYSpcVQFv~rAC8**i`V({=8pvHgDei_-a3k z+3bc5TirCy{jb?vv2XkK@`Bsz3#+QCY?6wKias5_#Lgl8?%>0R53eLQEWLUE{{K1~ zyUI^bj&9oj?euj0{ieo^{|%WFAFnl%+W+6q-QE58>OXQDJXu%|n9X?+T#V$Vl&&jdb_)y^XyX(3t4z#nh z+???^b=CFt@%szdSk|d2`1n~Q7;|z=o*8X1$Ey9dpun}fyoVB-dp{TK*>sF?yRyQX zqj$tl|8FA}P;e)I3s>4Q_{>%YI7ef0C@^Y-h@7UverWbdtzU*yi*?;co^Y_duW}g$- z4s8vq%{zSS*q%50D?k5}Ip1-3)u9bs-8XtJ^c?6o{fmRcJnEa%u7WeiJB}@5eH^T_ zsOZzv>Gm9_UU6{Df3r@p@It=bvDB5%?f-6>X1Z==?+lKUS${shyu3WPzmeBaY?uDI zqCK~6-mLuc;o)I-^S^VuSwB5qym;})X&bKVE!Y%SU-$dl`fBml61U$yT)*G$*Xi5a z>!r`1SAKN=fl#E&^J{ud1vc~I_su=|)U{yusu{D@^Y87E=vVKTpUtY@*-)S^zFo-D zuKtz%Q#MKcMcv{dE9_=hF&r?7tNZ(P`||HOu?gSj#cYcfXKbv_($SK?ySbz1=$Dnp zH~6x!yxS=_@p`}f{uxy=uM^a-6>)NWsPj#^tz0xeE$VfWwEl;CN!_ov<-Py=JUssI z-}~0q|7TUn+&;p?@?*WB@XzDr_ib-%yMOKY`NyBGegf)k+^A<%mg#HTmuh)y(fm}u zJEvG0jyO6!hHZE4*}WAxhv!y(udDW-%xoSSqnE94 zVCu0q$xp!QzgOy&d_kt@C*m9QvtKK`Ua6sTd|mA zv4=8|4BY1?#;`Q4Kcx8K&}I(Vl+>y6cDwE}f4z51xiTbp^}mq2v3Jwk4<|A+#J|3G zOPJxoZxsaw6(%MJrBP~x1i_}*YNmp$Z~5QX|NB+FufFz2adqSUVj+PUGb0SS7#nB4je9e1tu6ZwZl*&5GFKAoh)wzin`f7shi9K>eAm=q zz`|ZSV}1j}1P%^oi+%QWKLqQ!uYvQ?A%nizPs7>DKS~#9v9L6_I52>mcBf{~&kxFf z*yeCCGAalP%$UgA-Q(gQ(bjBz#v7vIh9ci*pc^N87z%-vv~7B_*v;lx%SE6K8!z%d zQ&un#E=)3EVlv)%9xPZmq5UUNF7lIE^!5)%QV>m>kG$QM_b}Ck=}^HPUDnS60y7#l z3>R%a{BXlJ8HOKxk&Pf1GjswSo^yR3!L83P}f+xLv-|m=dz7NU}vy`Cr+&xpzSlem%@Cql$ID;vwdH45rZ+s{M=E5xj z+Xa-IAO18lqQ}ia;#{He|He9qzQd7^{yx3ed9H({t`~jzw*14{D1T)378z`{;oN&|CY_&oHGA?Zw=oB+f0kNc;NekHw6}JY}q5O ze&JbtxBKqqmviO*e+{|&GU?~ruY3;^N`SHZNDAU*sLw|!SQ;1&3F?K!$@!{$&;Pq> V&gleJ*SM>722WQ%mvv4FO#qP9N(KM` literal 0 HcmV?d00001 diff --git a/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/multipleViewports_VP2AndThenBackToStorm_modPan4.png b/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/multipleViewports_VP2AndThenBackToStorm_modPan4.png new file mode 100644 index 0000000000000000000000000000000000000000..1d7bb1a39e5cb33e844b09964a2595e547f3b421 GIT binary patch literal 1924 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKL9Be?5hW%z|fD~V9glC$suNIKWzyTr{7^Xen z9tos4^WEHv!2%%Sme#g&3=Hf{o-U3d6?5L+b<7iSXK=VUAtim<4V}bJ)kn$=g4bv4 zW^jL~#CSxoDW&YB*^TIgZtV+9k$sZ?3zO5H?e*DxUK% z&LP5`iRoZy3-h(P4F^=u2==|SVY$}Za6stUox+~xFP6_*cXD#XB%CX-ut~qm$uZ|~ z#rq#0QrwDRLJY06Y z*Jt{wbMJ(X|XJPquA?{Kd@57U3oHiy85}Sb4q9e E05LgkfB*mh literal 0 HcmV?d00001 diff --git a/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/multipleViewports_VP2_modPan3.png b/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/multipleViewports_VP2_modPan3.png new file mode 100644 index 0000000000000000000000000000000000000000..698720d403378478cdf31cff7328fbdae4968e31 GIT binary patch literal 1563 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKL9Be?5hW%z|fD~V9glC$suNIKWzyTr{7^Xen z9tos4^WEHv!2%%Sme#g&3=FI@JzX3_D(1Ys>d4EWC~)Awa7_X%q2M(IvW`#NQ_dWK`@#MMl-@_SwQ3BFz0&!i%Hv8i$B1!8h4q_;OXk; Jvd$@?2>@-#gd4EWC~)Awa7_X%q2M(IvW`#NQ_dWK`@#MMl-@_SwQ3BFz0&!i%Hv8i$B1!8h4q_;OXk; Jvd$@?2>@-#gzgOy&d_kt@C*m9QvtKK`Ua6sTd|mA zv4=8|4BY1?#;`Q4Kcx8K&}I(Vl+>y6cDwE}f4z51xiTbp^}mq2v3Jwk4<|A+#J|3G zOPJxoZxsaw6(%MJrBP~x1i_}*YNmp$Z~5QX|NB+FufFz2adqSUVj+PUGb0SS7#nB4je9e1tu6ZwZl*&5GFKAoh)wzin`f7shi9K>eAm=q zz`|ZSV}1j}1P%^oi+%QWKLqQ!uYvQ?A%nizPs7>DKS~#9v9L6_I52>mcBf{~&kxFf z*yeCCGAalP%$UgA-Q(gQ(bjBz#v7vIh9ci*pc^N87z%-vv~7B_*v;lx%SE6K8!z%d zQ&un#E=)3EVlv)%9xPZmq5UUNF7lIE^!5)%QV>m>kG$QM_b}Ck=}^HPUDnS60y7#l z3>R%a{BXlJ8HOKxk&Pf1GjswSo^yR3!L83P}f+xLv-|m=dz7NU}vy`Cr+&xpzSlem%@Cql$ID;vwdH45rZ+s{M=E5xj z+Xa-IAO18lqQ}ia;#{He|He9qzQd7^{yx3ed9H({t`~jzw*14{D1T)378z`{;oN&|CY_&oHGA?Zw=oB+f0kNc;NekHw6}JY}q5O ze&JbtxBKqqmviO*e+{|&GU?~ruY3;^N`SHZNDAU*sLw|!SQ;1&3F?K!$@!{$&;Pq> V&gleJ*SM>722WQ%mvv4FO#qP9N(KM` literal 0 HcmV?d00001 diff --git a/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/multipleViewports_viewPanel4.png b/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/multipleViewports_viewPanel4.png new file mode 100644 index 0000000000000000000000000000000000000000..1d7bb1a39e5cb33e844b09964a2595e547f3b421 GIT binary patch literal 1924 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKL9Be?5hW%z|fD~V9glC$suNIKWzyTr{7^Xen z9tos4^WEHv!2%%Sme#g&3=Hf{o-U3d6?5L+b<7iSXK=VUAtim<4V}bJ)kn$=g4bv4 zW^jL~#CSxoDW&YB*^TIgZtV+9k$sZ?3zO5H?e*DxUK% z&LP5`iRoZy3-h(P4F^=u2==|SVY$}Za6stUox+~xFP6_*cXD#XB%CX-ut~qm$uZ|~ z#rq#0QrwDRLJY06Y z*Jt{wbMJ(X|XJPquA?{Kd@57U3oHiy85}Sb4q9e E05LgkfB*mh literal 0 HcmV?d00001 diff --git a/test/lib/mayaUsd/render/mayaToHydra/testFlowViewportAPI.py b/test/lib/mayaUsd/render/mayaToHydra/testFlowViewportAPI.py index f0a38ac2b9..fe81023876 100644 --- a/test/lib/mayaUsd/render/mayaToHydra/testFlowViewportAPI.py +++ b/test/lib/mayaUsd/render/mayaToHydra/testFlowViewportAPI.py @@ -39,6 +39,7 @@ class TestFlowViewportAPI(mtohUtils.MtohTestCase): #Subclassing mtohUtils.MtohTe IMAGE_DIFF_FAIL_PERCENT = 2 def setupScene(self): + cmds.file(new=True, force=True) self.setHdStormRenderer() #Test adding primitives diff --git a/test/lib/mayaUsd/render/mayaToHydra/testFootPrintNode.py b/test/lib/mayaUsd/render/mayaToHydra/testFootPrintNode.py new file mode 100644 index 0000000000..b1c4971b41 --- /dev/null +++ b/test/lib/mayaUsd/render/mayaToHydra/testFootPrintNode.py @@ -0,0 +1,296 @@ +# +# Copyright 2023 Autodesk, Inc. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +from math import* +import maya.cmds as cmds +import maya.api.OpenMaya as om +import fixturesUtils +import mtohUtils +import mayaUtils +import maya.mel as mel +from testUtils import PluginLoaded + +HD_STORM = "HdStormRendererPlugin" +HD_STORM_OVERRIDE = "mayaHydraRenderOverride_" + HD_STORM + +class TestFootPrintNode(mtohUtils.MtohTestCase): #Subclassing mtohUtils.MtohTestCase to be able to call self.assertSnapshotClose + # MayaHydraBaseTestCase.setUpClass requirement. + _file = __file__ + + @property + def imageDiffFailThreshold(self): + return 0.01 + + @property + def imageDiffFailPercent(self): + return 0.2 + + def setupScene(self): + cmds.file(new=True, force=True) + testFile = mayaUtils.openTestScene( #Is an empty scene that is used to zoom in more on the foot print nodes, it also has Storm already set as the renderer + "testFootPrintNode", + "testFootPrintNode.ma") + cmds.refresh() + self.setHdStormRenderer()#set Storm as the renderer (even if the scene is supposed to have it already) + + #Test adding primitives + def test_AddingPrimitives(self): + with PluginLoaded('mayaHydraFootPrintNode'): + self.setupScene() + + #Create a mayaHydraFootPrintNode node which adds a dataProducerSceneIndex + footPrintNodeName = cmds.createNode("MhFootPrint") + self.assertFalse(footPrintNodeName == None) + + #Increase its size + cmds.setAttr(footPrintNodeName + '.size', 5) + cmds.refresh() + + #When the node above is created, its compute method is not called automatically, so work around to trigger a call to compute + cmds.setAttr(footPrintNodeName + '.dummyInput', 2)#setting this will set dirty the dummyOutput attribute + cmds.getAttr(footPrintNodeName + '.dummyOutput')#getting this value will trigger a call to compute + cmds.refresh() + #Original images are located for example in maya-hydra\test\lib\mayaUsd\render\mayaToHydra\FlowViewportAPITest + self.assertSnapshotClose("add_NodeCreated.png", self.imageDiffFailThreshold, self.imageDiffFailPercent) + + #Move the transform node, the added prims should move as well + # Get the transform node of the mayaHydraFootPrintNode + transformNode = cmds.listRelatives(footPrintNodeName, parent=True)[0] + self.assertFalse(transformNode == None) + #Select the transform node + cmds.select(transformNode) + # Move the selected node + cmds.move(2, 0.5, -2) + cmds.refresh() + self.assertSnapshotClose("add_NodeMoved.png", self.imageDiffFailThreshold, self.imageDiffFailPercent) + + #Hide the transform node, this should hide the mayaHydraFootPrintNode node and the added prims as well. + cmds.hide(transformNode) + self.assertSnapshotClose("add_NodeHidden.png", self.imageDiffFailThreshold, self.imageDiffFailPercent) + + #Unhide the transform node, this should unhide the mayaHydraFootPrintNode node and the added prims as well. + cmds.showHidden(transformNode) + self.assertSnapshotClose("add_NodeUnhidden.png", self.imageDiffFailThreshold, self.imageDiffFailPercent) + + #Delete the shape node, this should hide the added prims as well + cmds.delete(footPrintNodeName) + self.assertSnapshotClose("add_NodeDeleted.png", self.imageDiffFailThreshold, self.imageDiffFailPercent) + + #Undo the delete, the node should be visible again so do the added prims + cmds.undo() + self.assertSnapshotClose("add_NodeDeletedUndo.png", self.imageDiffFailThreshold, self.imageDiffFailPercent) + + #Redo the delete, the added prims should be hidden + cmds.redo() + self.assertSnapshotClose("add_NodeDeletedRedo.png", self.imageDiffFailThreshold, self.imageDiffFailPercent) + + #Undo the delete again, the added prims should be visible + cmds.undo() + self.assertSnapshotClose("add_NodeDeletedUndoAgain.png", self.imageDiffFailThreshold, self.imageDiffFailPercent) + + #Move transform node again to see if it still updates the added prims transform + cmds.select(transformNode) + # Move the selected node + cmds.move(-0.2, -0.5, 0) + cmds.refresh() + self.assertSnapshotClose("add_NodeMovedAfterDeletionAndUndo.png", self.imageDiffFailThreshold, self.imageDiffFailPercent) + + #Switch to VP2 + self.setViewport2Renderer() + #Switch back to Storm + self.setHdStormRenderer() + self.assertSnapshotClose("add_VP2AndThenBackToStorm.png", self.imageDiffFailThreshold, self.imageDiffFailPercent) + + #Finish by a File New command + cmds.file(new=True, force=True) + + #Test FootPrint grids parameters + def test_FootPrintAttributes(self): + with PluginLoaded('mayaHydraFootPrintNode'): + self.setupScene() + + #Create a mayaHydraFootPrintNode node which adds a dataProducerSceneIndex and a Filtering scene index + footPrintNodeName = cmds.createNode("MhFootPrint") + self.assertFalse(footPrintNodeName == None) + + #When the node above is created, its compute method is not called automatically, so work around to trigger a call to compute + cmds.setAttr(footPrintNodeName + '.dummyInput', 2)#setting this will set dirty the dummyOutput attribute + cmds.getAttr(footPrintNodeName + '.dummyOutput')#getting this value will trigger a call to compute + self.assertSnapshotClose("footPrint_BeforeModifs.png", self.imageDiffFailThreshold, self.imageDiffFailPercent) + + #Modify the attributes + cmds.setAttr(footPrintNodeName + '.size', 3) + cmds.setAttr(footPrintNodeName + '.color', 1.0, 1.0, 1.0, type="double3") + cmds.refresh() + self.assertSnapshotClose("footPrint_AfterModifs.png", self.imageDiffFailThreshold, self.imageDiffFailPercent) + + #Switch to VP2 + self.setViewport2Renderer() + #Switch back to Storm + self.setHdStormRenderer() + self.assertSnapshotClose("footPrint_VP2AndThenBackToStorm.png", self.imageDiffFailThreshold, self.imageDiffFailPercent) + + #Finish by a File New command + cmds.file(new=True, force=True) + + #Test multiple nodes + def test_MultipleNodes(self): + with PluginLoaded('mayaHydraFootPrintNode'): + self.setupScene() + + #Create a mayaHydraFootPrintNode node which adds a dataProducerSceneIndex and a Filtering scene index + footPrintNodeName1 = cmds.createNode("MhFootPrint", n="nodeShape1") + self.assertFalse(footPrintNodeName1 == None) + + #When the node above is created, its compute method is not called automatically, so work around to trigger a call to compute + cmds.setAttr(footPrintNodeName1 + '.dummyInput', 3)#setting this will set dirty the dummyOutput attribute + cmds.getAttr(footPrintNodeName1 + '.dummyOutput')#getting this value will trigger a call to compute + + #Modify the attributes + cmds.setAttr(footPrintNodeName1 + '.size', 3) + cmds.setAttr(footPrintNodeName1 + '.color', 1.0, 1.0, 1.0, type="double3") + cmds.refresh() + + #Move the transform node, the added prims should move as well + # Get the transform node of the mayaHydraFootPrintNode + transformNode1 = cmds.listRelatives(footPrintNodeName1, parent=True)[0] + self.assertFalse(transformNode1 == None) + #Select the transform node + cmds.select(transformNode1) + # Move the selected node + cmds.move(-2, 0, 0) + cmds.refresh() + + #Create a mayaHydraFootPrintNode node which adds a dataProducerSceneIndex and a Filtering scene index + footPrintNodeName2 = cmds.createNode("MhFootPrint", n="nodeShape2") + self.assertFalse(footPrintNodeName2 == None) + + #When the node above is created, its compute method is not called automatically, so work around to trigger a call to compute + cmds.setAttr(footPrintNodeName2 + '.dummyInput', 3)#setting this will set dirty the dummyOutput attribute + cmds.getAttr(footPrintNodeName2 + '.dummyOutput')#getting this value will trigger a call to compute + + cmds.setAttr(footPrintNodeName2 + '.size', 1.5) + cmds.setAttr(footPrintNodeName2 + '.color', 0.0, 1.0, 0.0, type="double3") + cmds.refresh() + + #Move the transform node, the added prims should move as well + # Get the transform node of the mayaHydraFootPrintNode + transformNode2 = cmds.listRelatives(footPrintNodeName2, parent=True)[0] + self.assertFalse(transformNode2 == None) + #Select the transform node + cmds.select(transformNode2) + # Move the selected node + cmds.move(2, 0, -2) + cmds.refresh() + + self.assertSnapshotClose("multipleNodes_BeforeModifs.png", self.imageDiffFailThreshold, self.imageDiffFailPercent) + + #Modify the color of node #2, it shouldn't change node's #1 color + cmds.setAttr(footPrintNodeName2 + '.color', 1.0, 0.0, 0.0, type="double3") + + # Apply transform on node #2 + cmds.select(transformNode2) + cmds.rotate(0, 45, 0) + cmds.scale(4, 1, 1) + cmds.refresh() + self.assertSnapshotClose("multipleNodes_AfterModifs.png", self.imageDiffFailThreshold, self.imageDiffFailPercent) + + #Hide node #1 + cmds.hide(transformNode1) + self.assertSnapshotClose("multipleNodes_Node1Hidden.png", self.imageDiffFailThreshold, self.imageDiffFailPercent) + + #Unhide node #1 + cmds.showHidden(transformNode1) + self.assertSnapshotClose("multipleNodes_Node1Unhidden.png", self.imageDiffFailThreshold, self.imageDiffFailPercent) + + #Switch to VP2 + self.setViewport2Renderer() + #Switch back to Storm + self.setHdStormRenderer() + self.assertSnapshotClose("multipleNodes_VP2AndThenBackToStorm.png", self.imageDiffFailThreshold, self.imageDiffFailPercent) + + #Finish by a File New command + cmds.file(new=True, force=True) + + #Test multiple viewports + def test_MultipleViewports(self): + with PluginLoaded('mayaHydraFootPrintNode'): + #switch to 4 views + mel.eval('FourViewLayout') + #Set focus on persp view + cmds.setFocus ('modelPanel4') #Is the persp view + #Set Storm as the renderer + self.setHdStormRenderer() + modelPanel4 = cmds.playblast(activeEditor=1) + rendererOverrideNameModPanel4 = cmds.modelEditor(modelPanel4, q=1,rendererOverrideName=1) + self.assertTrue(rendererOverrideNameModPanel4 == HD_STORM_OVERRIDE) + + #Set focus on model Panel 1 (it's an orthographic view : top) + cmds.setFocus ('modelPanel1') + #Set Storm as the renderer + self.setHdStormRenderer() + modelPanel1 = cmds.playblast(activeEditor=1) + rendererOverrideNameModPanel1 = cmds.modelEditor(modelPanel1, q=1,rendererOverrideName=1) + self.assertTrue(rendererOverrideNameModPanel1 == HD_STORM_OVERRIDE) + + #Create a mayaHydraFootPrintNode node which adds a dataProducerSceneIndex and a Filtering scene index + footPrintNodeName1 = cmds.createNode("MhFootPrint", n="nodeShape1") + self.assertFalse(footPrintNodeName1 == None) + + #When the node above is created, its compute method is not called automatically, so work around to trigger a call to compute + cmds.setAttr(footPrintNodeName1 + '.dummyInput', 2)#setting this will set dirty the dummyOutput attribute + cmds.getAttr(footPrintNodeName1 + '.dummyOutput')#getting this value will trigger a call to compute + + cmds.setAttr(footPrintNodeName1 + '.size', 6) + cmds.setAttr(footPrintNodeName1 + '.color', 0.0, 1.0, 0.0, type="double3") + cmds.refresh() + + cmds.setFocus ('modelPanel4') + self.assertSnapshotClose("multipleViewports_viewPanel4.png", self.imageDiffFailThreshold, self.imageDiffFailPercent) + cmds.setFocus ('modelPanel1') + self.assertSnapshotClose("multipleViewports_viewPanel1.png", self.imageDiffFailThreshold, self.imageDiffFailPercent) + + #Switch to VP2 + cmds.setFocus ('modelPanel4') + self.setViewport2Renderer() + self.assertSnapshotClose("multipleViewports_VP2_modPan4.png", self.imageDiffFailThreshold, self.imageDiffFailPercent) + cmds.setFocus ('modelPanel1') + self.setViewport2Renderer() + self.assertSnapshotClose("multipleViewports_VP2_modPan3.png", self.imageDiffFailThreshold, self.imageDiffFailPercent) + + #Switch back to Storm + cmds.setFocus ('modelPanel4') + self.setHdStormRenderer() + self.assertSnapshotClose("multipleViewports_VP2AndThenBackToStorm_modPan4.png", self.imageDiffFailThreshold, self.imageDiffFailPercent) + cmds.setFocus ('modelPanel1') + self.setHdStormRenderer() + self.assertSnapshotClose("multipleViewports_VP2AndThenBackToStorm_modPan3.png", self.imageDiffFailThreshold, self.imageDiffFailPercent) + + #Finish by a File New command + cmds.file(new=True, force=True) + + #Test loading a scene + def test_Load(self): + with PluginLoaded('mayaHydraFootPrintNode'): + cmds.file(new=True, force=True) + testFile = mayaUtils.openTestScene( + "testFootPrintNode", + "testFootPrintNodeSaved.ma") + cmds.refresh() + self.assertSnapshotClose("loadingFootPrintScene.png", self.imageDiffFailThreshold, self.imageDiffFailPercent) + +if __name__ == '__main__': + fixturesUtils.runTests(globals()) diff --git a/test/testSamples/testFootPrintNode/testFootPrintNode.ma b/test/testSamples/testFootPrintNode/testFootPrintNode.ma new file mode 100644 index 0000000000..f529f58238 --- /dev/null +++ b/test/testSamples/testFootPrintNode/testFootPrintNode.ma @@ -0,0 +1,219 @@ +//Maya ASCII 2026ff01 scene +//Name: testFootPrintNode.ma +//Last modified: Wed, Feb 14, 2024 05:36:52 PM +//Codeset: 1252 +requires maya "2026ff01"; +requires "mtoa" "5.4.0"; +requires -nodeType "mayaUsdLayerManager" -dataType "pxrUsdStageData" "mayaUsdPlugin" "0.28.0"; +currentUnit -l centimeter -a degree -t film; +fileInfo "application" "maya"; +fileInfo "product" "Maya 2025"; +fileInfo "version" "Preview Release 153"; +fileInfo "cutIdentifier" "202402011613-000000"; +fileInfo "osv" "Windows 10 Enterprise v2009 (Build: 19045)"; +fileInfo "UUID" "3307B759-409E-49EA-B026-3FA1B9314D1E"; +createNode transform -s -n "persp"; + rename -uid "60CEECE7-4524-3435-33A9-CBBE94B70019"; + setAttr ".v" no; + setAttr ".t" -type "double3" 7.7140018334377451 5.7855013750782884 7.7140018334377292 ; + setAttr ".r" -type "double3" -27.938352729602379 44.999999999999972 -5.172681101354183e-14 ; +createNode camera -s -n "perspShape" -p "persp"; + rename -uid "F08B569C-4B20-1B04-CAC9-D8A17D42CF42"; + setAttr -k off ".v" no; + setAttr ".fl" 34.999999999999993; + setAttr ".coi" 12.348428026821633; + setAttr ".imn" -type "string" "persp"; + setAttr ".den" -type "string" "persp_depth"; + setAttr ".man" -type "string" "persp_mask"; + setAttr ".hc" -type "string" "viewSet -p %camera"; +createNode transform -s -n "top"; + rename -uid "10757077-4689-483A-0233-088DF1797409"; + setAttr ".v" no; + setAttr ".t" -type "double3" 0 1000.1 0 ; + setAttr ".r" -type "double3" -90 0 0 ; +createNode camera -s -n "topShape" -p "top"; + rename -uid "66A1BA86-4E94-CEC8-E62A-A289C5063824"; + setAttr -k off ".v" no; + setAttr ".rnd" no; + setAttr ".coi" 1000.1; + setAttr ".ow" 30; + setAttr ".imn" -type "string" "top"; + setAttr ".den" -type "string" "top_depth"; + setAttr ".man" -type "string" "top_mask"; + setAttr ".hc" -type "string" "viewSet -t %camera"; + setAttr ".o" yes; + setAttr ".ai_translator" -type "string" "orthographic"; +createNode transform -s -n "front"; + rename -uid "809483A6-4AAF-4A40-B4DD-C49622814551"; + setAttr ".v" no; + setAttr ".t" -type "double3" 0 0 1000.1 ; +createNode camera -s -n "frontShape" -p "front"; + rename -uid "FBD1A55D-463A-7DF3-BE96-01AB88BA52D4"; + setAttr -k off ".v" no; + setAttr ".rnd" no; + setAttr ".coi" 1000.1; + setAttr ".ow" 30; + setAttr ".imn" -type "string" "front"; + setAttr ".den" -type "string" "front_depth"; + setAttr ".man" -type "string" "front_mask"; + setAttr ".hc" -type "string" "viewSet -f %camera"; + setAttr ".o" yes; + setAttr ".ai_translator" -type "string" "orthographic"; +createNode transform -s -n "side"; + rename -uid "AB222488-4904-FB92-F2D0-A99AA0F1FC86"; + setAttr ".v" no; + setAttr ".t" -type "double3" 1000.1 0 0 ; + setAttr ".r" -type "double3" 0 90 0 ; +createNode camera -s -n "sideShape" -p "side"; + rename -uid "0444C828-4079-C384-E0D4-56ADE3CAE6CF"; + setAttr -k off ".v" no; + setAttr ".rnd" no; + setAttr ".coi" 1000.1; + setAttr ".ow" 30; + setAttr ".imn" -type "string" "side"; + setAttr ".den" -type "string" "side_depth"; + setAttr ".man" -type "string" "side_mask"; + setAttr ".hc" -type "string" "viewSet -s %camera"; + setAttr ".o" yes; + setAttr ".ai_translator" -type "string" "orthographic"; +createNode lightLinker -s -n "lightLinker1"; + rename -uid "A559BD2C-475A-7BEC-A55C-A9B9BF88FFB0"; + setAttr -s 2 ".lnk"; + setAttr -s 2 ".slnk"; +createNode shapeEditorManager -n "shapeEditorManager"; + rename -uid "4D9953B0-48B9-EB14-64C8-6ABE8849CE53"; +createNode poseInterpolatorManager -n "poseInterpolatorManager"; + rename -uid "C200090A-4245-572E-65C3-23912A5A2350"; +createNode displayLayerManager -n "layerManager"; + rename -uid "D8E957BA-4A4B-90E4-F01A-A7A7127E01E1"; +createNode displayLayer -n "defaultLayer"; + rename -uid "2E898437-49A1-B7EA-AAE1-F3A03734C328"; + setAttr ".ufem" -type "stringArray" 0 ; +createNode renderLayerManager -n "renderLayerManager"; + rename -uid "D69E85F6-417F-61B5-E018-C6B5F20B5AE2"; +createNode renderLayer -n "defaultRenderLayer"; + rename -uid "DEF2C8DE-47D8-DA71-F919-9485562306C7"; + setAttr ".g" yes; +createNode mayaUsdLayerManager -n "mayaUsdLayerManager1"; + rename -uid "E483CD75-441A-B36C-D70B-3091BEE48F9D"; + setAttr ".sst" -type "string" ""; +createNode script -n "uiConfigurationScriptNode"; + rename -uid "B5143494-47DF-8214-875C-FA8767BC258E"; + setAttr ".b" -type "string" ( + "// Maya Mel UI Configuration File.\n//\n// This script is machine generated. Edit at your own risk.\n//\n//\n\nglobal string $gMainPane;\nif (`paneLayout -exists $gMainPane`) {\n\n\tglobal int $gUseScenePanelConfig;\n\tint $useSceneConfig = $gUseScenePanelConfig;\n\tint $nodeEditorPanelVisible = stringArrayContains(\"nodeEditorPanel1\", `getPanel -vis`);\n\tint $nodeEditorWorkspaceControlOpen = (`workspaceControl -exists nodeEditorPanel1Window` && `workspaceControl -q -visible nodeEditorPanel1Window`);\n\tint $menusOkayInPanels = `optionVar -q allowMenusInPanels`;\n\tint $nVisPanes = `paneLayout -q -nvp $gMainPane`;\n\tint $nPanes = 0;\n\tstring $editorName;\n\tstring $panelName;\n\tstring $itemFilterName;\n\tstring $panelConfig;\n\n\t//\n\t// get current state of the UI\n\t//\n\tsceneUIReplacement -update $gMainPane;\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"modelPanel\" (localizedPanelLabel(\"Top View\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tmodelPanel -edit -l (localizedPanelLabel(\"Top View\")) -mbv $menusOkayInPanels $panelName;\n" + + "\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"|top\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"smoothShaded\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -holdOuts 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 0\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 32768\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n" + + " -depthOfFieldPreview 1\n -maxConstantTransparency 1\n -rendererName \"vp2Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -controllers 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n" + + " -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -particleInstancers 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -bluePencil 1\n -greasePencils 0\n -excludeObjectPreset \"All\" \n -shadows 0\n -captureSequenceNumber -1\n -width 1\n -height 1\n -sceneRenderFilter 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n" + + "\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"modelPanel\" (localizedPanelLabel(\"Side View\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tmodelPanel -edit -l (localizedPanelLabel(\"Side View\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"|side\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"smoothShaded\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -holdOuts 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 0\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n" + + " -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 32768\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -depthOfFieldPreview 1\n -maxConstantTransparency 1\n -rendererName \"vp2Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n" + + " -interactiveBackFaceCull 0\n -sortTransparent 1\n -controllers 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -particleInstancers 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -bluePencil 1\n -greasePencils 0\n -excludeObjectPreset \"All\" \n" + + " -shadows 0\n -captureSequenceNumber -1\n -width 1\n -height 1\n -sceneRenderFilter 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"modelPanel\" (localizedPanelLabel(\"Front View\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tmodelPanel -edit -l (localizedPanelLabel(\"Front View\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"|front\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"smoothShaded\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -holdOuts 1\n -selectionHiliteDisplay 1\n" + + " -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 0\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 32768\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -depthOfFieldPreview 1\n -maxConstantTransparency 1\n -rendererName \"vp2Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n" + + " -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -controllers 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -particleInstancers 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n" + + " -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -bluePencil 1\n -greasePencils 0\n -excludeObjectPreset \"All\" \n -shadows 0\n -captureSequenceNumber -1\n -width 1\n -height 1\n -sceneRenderFilter 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"modelPanel\" (localizedPanelLabel(\"Persp View\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tmodelPanel -edit -l (localizedPanelLabel(\"Persp View\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n modelEditor -e \n" + + " -camera \"|persp\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"smoothShaded\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -holdOuts 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 0\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 32768\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -depthOfFieldPreview 1\n" + + " -maxConstantTransparency 1\n -rendererName \"vp2Renderer\" \n -rendererOverrideName \"mayaHydraRenderOverride_HdStormRendererPlugin\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -controllers 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n" + + " -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -particleInstancers 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -bluePencil 1\n -greasePencils 0\n -excludeObjectPreset \"All\" \n -shadows 0\n -captureSequenceNumber -1\n -width 1117\n -height 714\n -sceneRenderFilter 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n" + + " $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"outlinerPanel\" (localizedPanelLabel(\"ToggledOutliner\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\toutlinerPanel -edit -l (localizedPanelLabel(\"ToggledOutliner\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n outlinerEditor -e \n -showShapes 1\n -showAssignedMaterials 0\n -showTimeEditor 1\n -showReferenceNodes 1\n -showReferenceMembers 1\n -showAttributes 0\n -showConnected 0\n -showAnimCurvesOnly 0\n -showMuteInfo 0\n -organizeByLayer 1\n -organizeByClip 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 0\n -showDagOnly 1\n -showAssets 1\n -showContainedOnly 1\n -showPublishedAsConnected 0\n -showParentContainers 0\n" + + " -showContainerContents 1\n -ignoreDagHierarchy 0\n -expandConnections 0\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 1\n -showLeafs 1\n -showNumericAttrsOnly 0\n -highlightActive 1\n -autoSelectNewObjects 0\n -doNotSelectNewObjects 0\n -dropIsParent 1\n -transmitFilters 0\n -setFilter \"defaultSetFilter\" \n -showSetMembers 1\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -isSet 0\n -isSetMember 0\n -showUfeItems 1\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n" + + " -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 0\n -mapMotionTrails 0\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n -renderFilterVisible 0\n -renderFilterIndex 0\n -selectionOrder \"chronological\" \n -expandAttribute 0\n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"outlinerPanel\" (localizedPanelLabel(\"Outliner\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\toutlinerPanel -edit -l (localizedPanelLabel(\"Outliner\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n outlinerEditor -e \n -showShapes 0\n -showAssignedMaterials 0\n -showTimeEditor 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 0\n -showConnected 0\n -showAnimCurvesOnly 0\n" + + " -showMuteInfo 0\n -organizeByLayer 1\n -organizeByClip 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 0\n -showDagOnly 1\n -showAssets 1\n -showContainedOnly 1\n -showPublishedAsConnected 0\n -showParentContainers 0\n -showContainerContents 1\n -ignoreDagHierarchy 0\n -expandConnections 0\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 1\n -showLeafs 1\n -showNumericAttrsOnly 0\n -highlightActive 1\n -autoSelectNewObjects 0\n -doNotSelectNewObjects 0\n -dropIsParent 1\n -transmitFilters 0\n -setFilter \"defaultSetFilter\" \n -showSetMembers 1\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -showUfeItems 1\n -displayMode \"DAG\" \n -expandObjects 0\n" + + " -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 0\n -mapMotionTrails 0\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n -renderFilterVisible 0\n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"graphEditor\" (localizedPanelLabel(\"Graph Editor\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Graph Editor\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = ($panelName+\"OutlineEd\");\n outlinerEditor -e \n" + + " -showShapes 1\n -showAssignedMaterials 0\n -showTimeEditor 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 1\n -showConnected 1\n -showAnimCurvesOnly 1\n -showMuteInfo 0\n -organizeByLayer 1\n -organizeByClip 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 1\n -showDagOnly 0\n -showAssets 1\n -showContainedOnly 0\n -showPublishedAsConnected 0\n -showParentContainers 0\n -showContainerContents 0\n -ignoreDagHierarchy 0\n -expandConnections 1\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 0\n -showLeafs 1\n -showNumericAttrsOnly 1\n -highlightActive 0\n -autoSelectNewObjects 1\n" + + " -doNotSelectNewObjects 0\n -dropIsParent 1\n -transmitFilters 1\n -setFilter \"0\" \n -showSetMembers 0\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -showUfeItems 1\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 1\n -mapMotionTrails 1\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n -renderFilterVisible 0\n" + + " $editorName;\n\n\t\t\t$editorName = ($panelName+\"GraphEd\");\n animCurveEditor -e \n -displayValues 0\n -snapTime \"integer\" \n -snapValue \"none\" \n -showPlayRangeShades \"on\" \n -lockPlayRangeShades \"off\" \n -smoothness \"fine\" \n -resultSamples 1\n -resultScreenSamples 0\n -resultUpdate \"delayed\" \n -showUpstreamCurves 1\n -keyMinScale 1\n -stackedCurvesMin -1\n -stackedCurvesMax 1\n -stackedCurvesSpace 0.2\n -preSelectionHighlight 1\n -limitToSelectedCurves 0\n -constrainDrag 0\n -valueLinesToggle 0\n -highlightAffectedCurves 0\n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"dopeSheetPanel\" (localizedPanelLabel(\"Dope Sheet\")) `;\n" + + "\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Dope Sheet\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = ($panelName+\"OutlineEd\");\n outlinerEditor -e \n -showShapes 1\n -showAssignedMaterials 0\n -showTimeEditor 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 1\n -showConnected 1\n -showAnimCurvesOnly 1\n -showMuteInfo 0\n -organizeByLayer 1\n -organizeByClip 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 1\n -showDagOnly 0\n -showAssets 1\n -showContainedOnly 0\n -showPublishedAsConnected 0\n -showParentContainers 0\n -showContainerContents 0\n -ignoreDagHierarchy 0\n -expandConnections 1\n" + + " -showUpstreamCurves 1\n -showUnitlessCurves 0\n -showCompounds 0\n -showLeafs 1\n -showNumericAttrsOnly 1\n -highlightActive 0\n -autoSelectNewObjects 0\n -doNotSelectNewObjects 1\n -dropIsParent 1\n -transmitFilters 0\n -setFilter \"0\" \n -showSetMembers 1\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -showUfeItems 1\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n" + + " -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 0\n -mapMotionTrails 1\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n -renderFilterVisible 0\n $editorName;\n\n\t\t\t$editorName = ($panelName+\"DopeSheetEd\");\n dopeSheetEditor -e \n -displayValues 0\n -snapTime \"none\" \n -snapValue \"none\" \n -outliner \"dopeSheetPanel1OutlineEd\" \n -hierarchyBelow 0\n -selectionWindow 0 0 0 0 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"timeEditorPanel\" (localizedPanelLabel(\"Time Editor\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Time Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n" + + "\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"clipEditorPanel\" (localizedPanelLabel(\"Trax Editor\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Trax Editor\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = clipEditorNameFromPanel($panelName);\n clipEditor -e \n -displayValues 0\n -snapTime \"none\" \n -snapValue \"none\" \n -initialized 0\n -manageSequencer 0 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"sequenceEditorPanel\" (localizedPanelLabel(\"Camera Sequencer\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Camera Sequencer\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = sequenceEditorNameFromPanel($panelName);\n clipEditor -e \n -displayValues 0\n" + + " -snapTime \"none\" \n -snapValue \"none\" \n -initialized 0\n -manageSequencer 1 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"hyperGraphPanel\" (localizedPanelLabel(\"Hypergraph Hierarchy\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Hypergraph Hierarchy\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = ($panelName+\"HyperGraphEd\");\n hyperGraph -e \n -graphLayoutStyle \"hierarchicalLayout\" \n -orientation \"horiz\" \n -mergeConnections 0\n -zoom 1\n -animateTransition 0\n -showRelationships 1\n -showShapes 0\n -showDeformers 0\n -showExpressions 0\n -showConstraints 0\n -showConnectionFromSelected 0\n -showConnectionToSelected 0\n" + + " -showConstraintLabels 0\n -showUnderworld 0\n -showInvisible 0\n -transitionFrames 1\n -opaqueContainers 0\n -freeform 0\n -imagePosition 0 0 \n -imageScale 1\n -imageEnabled 0\n -graphType \"DAG\" \n -heatMapDisplay 0\n -updateSelection 1\n -updateNodeAdded 1\n -useDrawOverrideColor 0\n -limitGraphTraversal -1\n -range 0 0 \n -iconSize \"smallIcons\" \n -showCachedConnections 0\n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"hyperShadePanel\" (localizedPanelLabel(\"Hypershade\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Hypershade\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n" + + "\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"visorPanel\" (localizedPanelLabel(\"Visor\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Visor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"nodeEditorPanel\" (localizedPanelLabel(\"Node Editor\")) `;\n\tif ($nodeEditorPanelVisible || $nodeEditorWorkspaceControlOpen) {\n\t\tif (\"\" == $panelName) {\n\t\t\tif ($useSceneConfig) {\n\t\t\t\t$panelName = `scriptedPanel -unParent -type \"nodeEditorPanel\" -l (localizedPanelLabel(\"Node Editor\")) -mbv $menusOkayInPanels `;\n\n\t\t\t$editorName = ($panelName+\"NodeEditorEd\");\n nodeEditor -e \n -allAttributes 0\n -allNodes 0\n -autoSizeNodes 1\n -consistentNameSize 1\n -createNodeCommand \"nodeEdCreateNodeCommand\" \n -connectNodeOnCreation 0\n" + + " -connectOnDrop 0\n -copyConnectionsOnPaste 0\n -connectionStyle \"bezier\" \n -defaultPinnedState 0\n -additiveGraphingMode 0\n -connectedGraphingMode 1\n -settingsChangedCallback \"nodeEdSyncControls\" \n -traversalDepthLimit -1\n -keyPressCommand \"nodeEdKeyPressCommand\" \n -nodeTitleMode \"name\" \n -gridSnap 0\n -gridVisibility 1\n -crosshairOnEdgeDragging 0\n -popupMenuScript \"nodeEdBuildPanelMenus\" \n -showNamespace 1\n -showShapes 1\n -showSGShapes 0\n -showTransforms 1\n -useAssets 1\n -syncedSelection 1\n -extendToShapes 1\n -showUnitConversions 0\n -editorMode \"default\" \n -hasWatchpoint 0\n $editorName;\n\t\t\t}\n\t\t} else {\n\t\t\t$label = `panel -q -label $panelName`;\n" + + "\t\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Node Editor\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = ($panelName+\"NodeEditorEd\");\n nodeEditor -e \n -allAttributes 0\n -allNodes 0\n -autoSizeNodes 1\n -consistentNameSize 1\n -createNodeCommand \"nodeEdCreateNodeCommand\" \n -connectNodeOnCreation 0\n -connectOnDrop 0\n -copyConnectionsOnPaste 0\n -connectionStyle \"bezier\" \n -defaultPinnedState 0\n -additiveGraphingMode 0\n -connectedGraphingMode 1\n -settingsChangedCallback \"nodeEdSyncControls\" \n -traversalDepthLimit -1\n -keyPressCommand \"nodeEdKeyPressCommand\" \n -nodeTitleMode \"name\" \n -gridSnap 0\n -gridVisibility 1\n -crosshairOnEdgeDragging 0\n -popupMenuScript \"nodeEdBuildPanelMenus\" \n -showNamespace 1\n" + + " -showShapes 1\n -showSGShapes 0\n -showTransforms 1\n -useAssets 1\n -syncedSelection 1\n -extendToShapes 1\n -showUnitConversions 0\n -editorMode \"default\" \n -hasWatchpoint 0\n $editorName;\n\t\t\tif (!$useSceneConfig) {\n\t\t\t\tpanel -e -l $label $panelName;\n\t\t\t}\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"createNodePanel\" (localizedPanelLabel(\"Create Node\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Create Node\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"polyTexturePlacementPanel\" (localizedPanelLabel(\"UV Editor\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"UV Editor\")) -mbv $menusOkayInPanels $panelName;\n" + + "\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"renderWindowPanel\" (localizedPanelLabel(\"Render View\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Render View\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"shapePanel\" (localizedPanelLabel(\"Shape Editor\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tshapePanel -edit -l (localizedPanelLabel(\"Shape Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"posePanel\" (localizedPanelLabel(\"Pose Editor\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tposePanel -edit -l (localizedPanelLabel(\"Pose Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n" + + "\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"dynRelEdPanel\" (localizedPanelLabel(\"Dynamic Relationships\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Dynamic Relationships\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"relationshipPanel\" (localizedPanelLabel(\"Relationship Editor\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Relationship Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"referenceEditorPanel\" (localizedPanelLabel(\"Reference Editor\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Reference Editor\")) -mbv $menusOkayInPanels $panelName;\n" + + "\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"dynPaintScriptedPanelType\" (localizedPanelLabel(\"Paint Effects\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Paint Effects\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"scriptEditorPanel\" (localizedPanelLabel(\"Script Editor\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Script Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"profilerPanel\" (localizedPanelLabel(\"Profiler Tool\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Profiler Tool\")) -mbv $menusOkayInPanels $panelName;\n" + + "\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"contentBrowserPanel\" (localizedPanelLabel(\"Content Browser\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Content Browser\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\tif ($useSceneConfig) {\n string $configName = `getPanel -cwl (localizedPanelLabel(\"Current Layout\"))`;\n if (\"\" != $configName) {\n\t\t\tpanelConfiguration -edit -label (localizedPanelLabel(\"Current Layout\")) \n\t\t\t\t-userCreated false\n\t\t\t\t-defaultImage \"vacantCell.xP:/\"\n\t\t\t\t-image \"\"\n\t\t\t\t-sc false\n\t\t\t\t-configString \"global string $gMainPane; paneLayout -e -cn \\\"single\\\" -ps 1 100 100 $gMainPane;\"\n\t\t\t\t-removeAllPanels\n\t\t\t\t-ap false\n\t\t\t\t\t(localizedPanelLabel(\"Persp View\")) \n\t\t\t\t\t\"modelPanel\"\n" + + "\t\t\t\t\t\"$panelName = `modelPanel -unParent -l (localizedPanelLabel(\\\"Persp View\\\")) -mbv $menusOkayInPanels `;\\n$editorName = $panelName;\\nmodelEditor -e \\n -cam `findStartUpCamera persp` \\n -useInteractiveMode 0\\n -displayLights \\\"default\\\" \\n -displayAppearance \\\"smoothShaded\\\" \\n -activeOnly 0\\n -ignorePanZoom 0\\n -wireframeOnShaded 0\\n -headsUpDisplay 1\\n -holdOuts 1\\n -selectionHiliteDisplay 1\\n -useDefaultMaterial 0\\n -bufferMode \\\"double\\\" \\n -twoSidedLighting 0\\n -backfaceCulling 0\\n -xray 0\\n -jointXray 0\\n -activeComponentsXray 0\\n -displayTextures 0\\n -smoothWireframe 0\\n -lineWidth 1\\n -textureAnisotropic 0\\n -textureHilight 1\\n -textureSampling 2\\n -textureDisplay \\\"modulate\\\" \\n -textureMaxSize 32768\\n -fogging 0\\n -fogSource \\\"fragment\\\" \\n -fogMode \\\"linear\\\" \\n -fogStart 0\\n -fogEnd 100\\n -fogDensity 0.1\\n -fogColor 0.5 0.5 0.5 1 \\n -depthOfFieldPreview 1\\n -maxConstantTransparency 1\\n -rendererName \\\"vp2Renderer\\\" \\n -rendererOverrideName \\\"mayaHydraRenderOverride_HdStormRendererPlugin\\\" \\n -objectFilterShowInHUD 1\\n -isFiltered 0\\n -colorResolution 256 256 \\n -bumpResolution 512 512 \\n -textureCompression 0\\n -transparencyAlgorithm \\\"frontAndBackCull\\\" \\n -transpInShadows 0\\n -cullingOverride \\\"none\\\" \\n -lowQualityLighting 0\\n -maximumNumHardwareLights 1\\n -occlusionCulling 0\\n -shadingModel 0\\n -useBaseRenderer 0\\n -useReducedRenderer 0\\n -smallObjectCulling 0\\n -smallObjectThreshold -1 \\n -interactiveDisableShadows 0\\n -interactiveBackFaceCull 0\\n -sortTransparent 1\\n -controllers 1\\n -nurbsCurves 1\\n -nurbsSurfaces 1\\n -polymeshes 1\\n -subdivSurfaces 1\\n -planes 1\\n -lights 1\\n -cameras 1\\n -controlVertices 1\\n -hulls 1\\n -grid 1\\n -imagePlane 1\\n -joints 1\\n -ikHandles 1\\n -deformers 1\\n -dynamics 1\\n -particleInstancers 1\\n -fluids 1\\n -hairSystems 1\\n -follicles 1\\n -nCloths 1\\n -nParticles 1\\n -nRigids 1\\n -dynamicConstraints 1\\n -locators 1\\n -manipulators 1\\n -pluginShapes 1\\n -dimensions 1\\n -handles 1\\n -pivots 1\\n -textures 1\\n -strokes 1\\n -motionTrails 1\\n -clipGhosts 1\\n -bluePencil 1\\n -greasePencils 0\\n -excludeObjectPreset \\\"All\\\" \\n -shadows 0\\n -captureSequenceNumber -1\\n -width 1117\\n -height 714\\n -sceneRenderFilter 0\\n $editorName;\\nmodelEditor -e -viewSelected 0 $editorName;\\nmodelEditor -e \\n -pluginObjects \\\"gpuCacheDisplayFilter\\\" 1 \\n $editorName\"\n" + + "\t\t\t\t\t\"modelPanel -edit -l (localizedPanelLabel(\\\"Persp View\\\")) -mbv $menusOkayInPanels $panelName;\\n$editorName = $panelName;\\nmodelEditor -e \\n -cam `findStartUpCamera persp` \\n -useInteractiveMode 0\\n -displayLights \\\"default\\\" \\n -displayAppearance \\\"smoothShaded\\\" \\n -activeOnly 0\\n -ignorePanZoom 0\\n -wireframeOnShaded 0\\n -headsUpDisplay 1\\n -holdOuts 1\\n -selectionHiliteDisplay 1\\n -useDefaultMaterial 0\\n -bufferMode \\\"double\\\" \\n -twoSidedLighting 0\\n -backfaceCulling 0\\n -xray 0\\n -jointXray 0\\n -activeComponentsXray 0\\n -displayTextures 0\\n -smoothWireframe 0\\n -lineWidth 1\\n -textureAnisotropic 0\\n -textureHilight 1\\n -textureSampling 2\\n -textureDisplay \\\"modulate\\\" \\n -textureMaxSize 32768\\n -fogging 0\\n -fogSource \\\"fragment\\\" \\n -fogMode \\\"linear\\\" \\n -fogStart 0\\n -fogEnd 100\\n -fogDensity 0.1\\n -fogColor 0.5 0.5 0.5 1 \\n -depthOfFieldPreview 1\\n -maxConstantTransparency 1\\n -rendererName \\\"vp2Renderer\\\" \\n -rendererOverrideName \\\"mayaHydraRenderOverride_HdStormRendererPlugin\\\" \\n -objectFilterShowInHUD 1\\n -isFiltered 0\\n -colorResolution 256 256 \\n -bumpResolution 512 512 \\n -textureCompression 0\\n -transparencyAlgorithm \\\"frontAndBackCull\\\" \\n -transpInShadows 0\\n -cullingOverride \\\"none\\\" \\n -lowQualityLighting 0\\n -maximumNumHardwareLights 1\\n -occlusionCulling 0\\n -shadingModel 0\\n -useBaseRenderer 0\\n -useReducedRenderer 0\\n -smallObjectCulling 0\\n -smallObjectThreshold -1 \\n -interactiveDisableShadows 0\\n -interactiveBackFaceCull 0\\n -sortTransparent 1\\n -controllers 1\\n -nurbsCurves 1\\n -nurbsSurfaces 1\\n -polymeshes 1\\n -subdivSurfaces 1\\n -planes 1\\n -lights 1\\n -cameras 1\\n -controlVertices 1\\n -hulls 1\\n -grid 1\\n -imagePlane 1\\n -joints 1\\n -ikHandles 1\\n -deformers 1\\n -dynamics 1\\n -particleInstancers 1\\n -fluids 1\\n -hairSystems 1\\n -follicles 1\\n -nCloths 1\\n -nParticles 1\\n -nRigids 1\\n -dynamicConstraints 1\\n -locators 1\\n -manipulators 1\\n -pluginShapes 1\\n -dimensions 1\\n -handles 1\\n -pivots 1\\n -textures 1\\n -strokes 1\\n -motionTrails 1\\n -clipGhosts 1\\n -bluePencil 1\\n -greasePencils 0\\n -excludeObjectPreset \\\"All\\\" \\n -shadows 0\\n -captureSequenceNumber -1\\n -width 1117\\n -height 714\\n -sceneRenderFilter 0\\n $editorName;\\nmodelEditor -e -viewSelected 0 $editorName;\\nmodelEditor -e \\n -pluginObjects \\\"gpuCacheDisplayFilter\\\" 1 \\n $editorName\"\n" + + "\t\t\t\t$configName;\n\n setNamedPanelLayout (localizedPanelLabel(\"Current Layout\"));\n }\n\n panelHistory -e -clear mainPanelHistory;\n sceneUIReplacement -clear;\n\t}\n\n\ngrid -spacing 5 -size 12 -divisions 5 -displayAxes yes -displayGridLines yes -displayDivisionLines yes -displayPerspectiveLabels no -displayOrthographicLabels no -displayAxesBold yes -perspectiveLabelPosition axis -orthographicLabelPosition edge;\nviewManip -drawCompass 0 -compassAngle 0 -frontParameters \"\" -homeParameters \"\" -selectionLockParameters \"\";\n}\n"); + setAttr ".st" 3; +createNode script -n "sceneConfigurationScriptNode"; + rename -uid "40C77EE7-40C0-B3DD-0FED-B0959AA1FF85"; + setAttr ".b" -type "string" "playbackOptions -min 1 -max 120 -ast 1 -aet 200 "; + setAttr ".st" 6; +select -ne :time1; + setAttr ".o" 1; + setAttr ".unw" 1; +select -ne :hardwareRenderingGlobals; + setAttr ".otfna" -type "stringArray" 22 "NURBS Curves" "NURBS Surfaces" "Polygons" "Subdiv Surface" "Particles" "Particle Instance" "Fluids" "Strokes" "Image Planes" "UI" "Lights" "Cameras" "Locators" "Joints" "IK Handles" "Deformers" "Motion Trails" "Components" "Hair Systems" "Follicles" "Misc. UI" "Ornaments" ; + setAttr ".otfva" -type "Int32Array" 22 0 1 1 1 1 1 + 1 1 1 0 0 0 0 0 0 0 0 0 + 0 0 0 0 ; + setAttr ".fprt" yes; + setAttr ".rtfm" 1; +select -ne :renderPartition; + setAttr -s 2 ".st"; +select -ne :renderGlobalsList1; +select -ne :defaultShaderList1; + setAttr -s 5 ".s"; +select -ne :postProcessList1; + setAttr -s 2 ".p"; +select -ne :defaultRenderingList1; +select -ne :standardSurface1; + setAttr ".bc" -type "float3" 0.40000001 0.40000001 0.40000001 ; + setAttr ".sr" 0.5; +select -ne :initialShadingGroup; + setAttr ".ro" yes; +select -ne :initialParticleSE; + setAttr ".ro" yes; +select -ne :defaultRenderGlobals; + addAttr -ci true -sn "mtohMotionSampleStart" -ln "mtohMotionSampleStart" -at "float"; + addAttr -ci true -sn "mtohMotionSampleEnd" -ln "mtohMotionSampleEnd" -at "float"; + addAttr -ci true -sn "mayaHydraRenderPurpose" -ln "mayaHydraRenderPurpose" -min + 0 -max 1 -at "bool"; + addAttr -ci true -sn "mayaHydraProxyPurpose" -ln "mayaHydraProxyPurpose" -dv 1 -min + 0 -max 1 -at "bool"; + addAttr -ci true -sn "mayaHydraGuidePurpose" -ln "mayaHydraGuidePurpose" -min 0 + -max 1 -at "bool"; + addAttr -ci true -sn "mtohTextureMemoryPerTexture" -ln "mtohTextureMemoryPerTexture" + -dv 4096 -min 1 -max 262144 -smn 16384 -at "long"; + addAttr -ci true -sn "mtohMaximumShadowMapResolution" -ln "mtohMaximumShadowMapResolution" + -dv 2048 -min 32 -max 8192 -at "long"; + addAttr -ci true -sn "HdStormRendererPlugin__enableTinyPrimCulling" -ln "HdStormRendererPlugin__enableTinyPrimCulling" + -min 0 -max 1 -at "bool"; + addAttr -ci true -sn "HdStormRendererPlugin__volumeRaymarchingStepSize" -ln "HdStormRendererPlugin__volumeRaymarchingStepSize" + -dv 1 -at "float"; + addAttr -ci true -sn "HdStormRendererPlugin__volumeRaymarchingStepSizeLighting" + -ln "HdStormRendererPlugin__volumeRaymarchingStepSizeLighting" -dv 10 -at "float"; + addAttr -ci true -sn "HdStormRendererPlugin__volumeMaxTextureMemoryPerField" -ln "HdStormRendererPlugin__volumeMaxTextureMemoryPerField" + -dv 128 -at "float"; + addAttr -ci true -sn "HdStormRendererPlugin__maxLights" -ln "HdStormRendererPlugin__maxLights" + -dv 16 -at "long"; + addAttr -ci true -h true -sn "dss" -ln "defaultSurfaceShader" -dt "string"; + setAttr ".ren" -type "string" "arnold"; + setAttr ".dss" -type "string" "standardSurface1"; +select -ne :defaultResolution; + setAttr ".pa" 1; +select -ne :defaultColorMgtGlobals; + setAttr ".cfe" yes; + setAttr ".cfp" -type "string" "/OCIO-configs/Maya2022-default/config.ocio"; + setAttr ".vtn" -type "string" "ACES 1.0 SDR-video (sRGB)"; + setAttr ".vn" -type "string" "ACES 1.0 SDR-video"; + setAttr ".dn" -type "string" "sRGB"; + setAttr ".wsn" -type "string" "ACEScg"; + setAttr ".otn" -type "string" "ACES 1.0 SDR-video (sRGB)"; + setAttr ".potn" -type "string" "ACES 1.0 SDR-video (sRGB)"; +select -ne :hardwareRenderGlobals; + setAttr ".ctrs" 256; + setAttr ".btrs" 512; +relationship "link" ":lightLinker1" ":initialShadingGroup.message" ":defaultLightSet.message"; +relationship "link" ":lightLinker1" ":initialParticleSE.message" ":defaultLightSet.message"; +relationship "shadowLink" ":lightLinker1" ":initialShadingGroup.message" ":defaultLightSet.message"; +relationship "shadowLink" ":lightLinker1" ":initialParticleSE.message" ":defaultLightSet.message"; +connectAttr "layerManager.dli[0]" "defaultLayer.id"; +connectAttr "renderLayerManager.rlmi[0]" "defaultRenderLayer.rlid"; +connectAttr "defaultRenderLayer.msg" ":defaultRenderingList1.r" -na; +// End of testFootPrintNode.ma diff --git a/test/testSamples/testFootPrintNode/testFootPrintNodeSaved.ma b/test/testSamples/testFootPrintNode/testFootPrintNodeSaved.ma new file mode 100644 index 0000000000..3dc84a9e2a --- /dev/null +++ b/test/testSamples/testFootPrintNode/testFootPrintNodeSaved.ma @@ -0,0 +1,245 @@ +//Maya ASCII 2026ff01 scene +//Name: testFootPrintNodeSaved.ma +//Last modified: Thu, Feb 15, 2024 11:20:16 AM +//Codeset: 1252 +requires maya "2026ff01"; +requires -nodeType "aiOptions" -nodeType "aiAOVDriver" -nodeType "aiAOVFilter" "mtoa" "5.4.0"; +requires -nodeType "mayaUsdLayerManager" -dataType "pxrUsdStageData" "mayaUsdPlugin" "0.28.0"; +requires -nodeType "MhFootPrint" "mayaHydraFootPrintNode" "2025.0"; +currentUnit -l centimeter -a degree -t film; +fileInfo "application" "maya"; +fileInfo "product" "Maya 2025"; +fileInfo "version" "Preview Release 153"; +fileInfo "cutIdentifier" "202402011613-000000"; +fileInfo "osv" "Windows 10 Enterprise v2009 (Build: 19045)"; +fileInfo "UUID" "936493CE-4B55-E2DC-62DA-C5BC83CA1A8B"; +createNode transform -s -n "persp"; + rename -uid "89686174-49AF-F48D-C01A-DDBC43096230"; + setAttr ".v" no; + setAttr ".t" -type "double3" 4.4687263796001115 4.6123815993241735 1.0148599230741775 ; + setAttr ".r" -type "double3" -44.138352729604321 71.000000000000455 9.7692438216715594e-15 ; +createNode camera -s -n "perspShape" -p "persp"; + rename -uid "1C3DC5F6-44C9-7C5C-A9A2-46BCE29F8766"; + setAttr -k off ".v" no; + setAttr ".fl" 34.999999999999993; + setAttr ".coi" 6.4814552666600624; + setAttr ".imn" -type "string" "persp"; + setAttr ".den" -type "string" "persp_depth"; + setAttr ".man" -type "string" "persp_mask"; + setAttr ".hc" -type "string" "viewSet -p %camera"; +createNode transform -s -n "top"; + rename -uid "CA7DA140-45D5-533A-D4A5-B78380EA614A"; + setAttr ".v" no; + setAttr ".t" -type "double3" 0 1000.1 0 ; + setAttr ".r" -type "double3" -90 0 0 ; +createNode camera -s -n "topShape" -p "top"; + rename -uid "EB74CFFF-4D0F-35B3-57B9-E881C325D5EE"; + setAttr -k off ".v" no; + setAttr ".rnd" no; + setAttr ".coi" 1000.1; + setAttr ".ow" 30; + setAttr ".imn" -type "string" "top"; + setAttr ".den" -type "string" "top_depth"; + setAttr ".man" -type "string" "top_mask"; + setAttr ".hc" -type "string" "viewSet -t %camera"; + setAttr ".o" yes; + setAttr ".ai_translator" -type "string" "orthographic"; +createNode transform -s -n "front"; + rename -uid "CB71B927-4B24-D753-E31D-628D3D29DB03"; + setAttr ".v" no; + setAttr ".t" -type "double3" 0 0 1000.1 ; +createNode camera -s -n "frontShape" -p "front"; + rename -uid "90907B08-425A-2F73-8F99-0F89F4935D85"; + setAttr -k off ".v" no; + setAttr ".rnd" no; + setAttr ".coi" 1000.1; + setAttr ".ow" 30; + setAttr ".imn" -type "string" "front"; + setAttr ".den" -type "string" "front_depth"; + setAttr ".man" -type "string" "front_mask"; + setAttr ".hc" -type "string" "viewSet -f %camera"; + setAttr ".o" yes; + setAttr ".ai_translator" -type "string" "orthographic"; +createNode transform -s -n "side"; + rename -uid "1281E673-48D0-D52F-28CC-AD9B453CB8D7"; + setAttr ".v" no; + setAttr ".t" -type "double3" 1000.1 0 0 ; + setAttr ".r" -type "double3" 0 90 0 ; +createNode camera -s -n "sideShape" -p "side"; + rename -uid "7D54E919-41FE-0262-7900-DD874646B1B0"; + setAttr -k off ".v" no; + setAttr ".rnd" no; + setAttr ".coi" 1000.1; + setAttr ".ow" 30; + setAttr ".imn" -type "string" "side"; + setAttr ".den" -type "string" "side_depth"; + setAttr ".man" -type "string" "side_mask"; + setAttr ".hc" -type "string" "viewSet -s %camera"; + setAttr ".o" yes; + setAttr ".ai_translator" -type "string" "orthographic"; +createNode transform -n "transform1"; + rename -uid "2D4589FD-42A5-19C9-D949-748E12966104"; +createNode MhFootPrint -n "MhFootPrint1" -p "transform1"; + rename -uid "B52FA7E3-48D2-983E-E4F4-8594EF20D699"; + setAttr -k off ".v"; + setAttr ".sz" 5; + setAttr ".col" -type "double3" 0 1 1 ; + setAttr ".dI" 2; +createNode lightLinker -s -n "lightLinker1"; + rename -uid "F05525A4-421C-610A-0237-D4A8D7720235"; + setAttr -s 2 ".lnk"; + setAttr -s 2 ".slnk"; +createNode shapeEditorManager -n "shapeEditorManager"; + rename -uid "0B613D06-4A19-0C32-9797-75B10F1CE092"; +createNode poseInterpolatorManager -n "poseInterpolatorManager"; + rename -uid "D7D5C748-4C76-CBF5-2EAE-FCA25013B7C2"; +createNode displayLayerManager -n "layerManager"; + rename -uid "A64E139A-4B34-ADD6-DFE6-BDB21C3E1AD8"; +createNode displayLayer -n "defaultLayer"; + rename -uid "A3CABD58-4EE9-518A-C3B7-C48AA85530A4"; + setAttr ".ufem" -type "stringArray" 0 ; +createNode renderLayerManager -n "renderLayerManager"; + rename -uid "5509F3D2-4088-979E-6DC5-DC982B479602"; +createNode renderLayer -n "defaultRenderLayer"; + rename -uid "531D7775-4AF5-2FF2-6535-2D821A239000"; + setAttr ".g" yes; +createNode script -n "uiConfigurationScriptNode"; + rename -uid "7EF3833C-48E6-C63B-2C48-1EB0D854E668"; + setAttr ".b" -type "string" ( + "// Maya Mel UI Configuration File.\n//\n// This script is machine generated. Edit at your own risk.\n//\n//\n\nglobal string $gMainPane;\nif (`paneLayout -exists $gMainPane`) {\n\n\tglobal int $gUseScenePanelConfig;\n\tint $useSceneConfig = $gUseScenePanelConfig;\n\tint $nodeEditorPanelVisible = stringArrayContains(\"nodeEditorPanel1\", `getPanel -vis`);\n\tint $nodeEditorWorkspaceControlOpen = (`workspaceControl -exists nodeEditorPanel1Window` && `workspaceControl -q -visible nodeEditorPanel1Window`);\n\tint $menusOkayInPanels = `optionVar -q allowMenusInPanels`;\n\tint $nVisPanes = `paneLayout -q -nvp $gMainPane`;\n\tint $nPanes = 0;\n\tstring $editorName;\n\tstring $panelName;\n\tstring $itemFilterName;\n\tstring $panelConfig;\n\n\t//\n\t// get current state of the UI\n\t//\n\tsceneUIReplacement -update $gMainPane;\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"modelPanel\" (localizedPanelLabel(\"Top View\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tmodelPanel -edit -l (localizedPanelLabel(\"Top View\")) -mbv $menusOkayInPanels $panelName;\n" + + "\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"|top\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"smoothShaded\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -holdOuts 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 0\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 32768\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n" + + " -depthOfFieldPreview 1\n -maxConstantTransparency 1\n -rendererName \"vp2Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -controllers 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n" + + " -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -particleInstancers 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -bluePencil 1\n -greasePencils 0\n -excludeObjectPreset \"All\" \n -shadows 0\n -captureSequenceNumber -1\n -width 555\n -height 335\n -sceneRenderFilter 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n" + + "\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"modelPanel\" (localizedPanelLabel(\"Side View\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tmodelPanel -edit -l (localizedPanelLabel(\"Side View\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"|side\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"smoothShaded\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -holdOuts 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 0\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n" + + " -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 32768\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -depthOfFieldPreview 1\n -maxConstantTransparency 1\n -rendererName \"vp2Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n" + + " -interactiveBackFaceCull 0\n -sortTransparent 1\n -controllers 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -particleInstancers 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -bluePencil 1\n -greasePencils 0\n -excludeObjectPreset \"All\" \n" + + " -shadows 0\n -captureSequenceNumber -1\n -width 557\n -height 334\n -sceneRenderFilter 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"modelPanel\" (localizedPanelLabel(\"Front View\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tmodelPanel -edit -l (localizedPanelLabel(\"Front View\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"|front\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"smoothShaded\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -holdOuts 1\n -selectionHiliteDisplay 1\n" + + " -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 0\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 32768\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -depthOfFieldPreview 1\n -maxConstantTransparency 1\n -rendererName \"vp2Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n" + + " -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -controllers 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -particleInstancers 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n" + + " -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -bluePencil 1\n -greasePencils 0\n -excludeObjectPreset \"All\" \n -shadows 0\n -captureSequenceNumber -1\n -width 558\n -height 334\n -sceneRenderFilter 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"modelPanel\" (localizedPanelLabel(\"Persp View\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tmodelPanel -edit -l (localizedPanelLabel(\"Persp View\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n" + + " modelEditor -e \n -camera \"|persp\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"smoothShaded\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -holdOuts 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 0\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 32768\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -depthOfFieldPreview 1\n" + + " -maxConstantTransparency 1\n -rendererName \"vp2Renderer\" \n -rendererOverrideName \"mayaHydraRenderOverride_HdStormRendererPlugin\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -controllers 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n" + + " -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -particleInstancers 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -bluePencil 1\n -greasePencils 0\n -excludeObjectPreset \"All\" \n -shadows 0\n -captureSequenceNumber -1\n -width 1117\n -height 714\n -sceneRenderFilter 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n" + + " $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"outlinerPanel\" (localizedPanelLabel(\"ToggledOutliner\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\toutlinerPanel -edit -l (localizedPanelLabel(\"ToggledOutliner\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n outlinerEditor -e \n -showShapes 1\n -showAssignedMaterials 0\n -showTimeEditor 1\n -showReferenceNodes 1\n -showReferenceMembers 1\n -showAttributes 0\n -showConnected 0\n -showAnimCurvesOnly 0\n -showMuteInfo 0\n -organizeByLayer 1\n -organizeByClip 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 0\n -showDagOnly 1\n -showAssets 1\n -showContainedOnly 1\n -showPublishedAsConnected 0\n -showParentContainers 0\n" + + " -showContainerContents 1\n -ignoreDagHierarchy 0\n -expandConnections 0\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 1\n -showLeafs 1\n -showNumericAttrsOnly 0\n -highlightActive 1\n -autoSelectNewObjects 0\n -doNotSelectNewObjects 0\n -dropIsParent 1\n -transmitFilters 0\n -setFilter \"defaultSetFilter\" \n -showSetMembers 1\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -isSet 0\n -isSetMember 0\n -showUfeItems 1\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n" + + " -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 0\n -mapMotionTrails 0\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n -renderFilterVisible 0\n -renderFilterIndex 0\n -selectionOrder \"chronological\" \n -expandAttribute 0\n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"outlinerPanel\" (localizedPanelLabel(\"Outliner\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\toutlinerPanel -edit -l (localizedPanelLabel(\"Outliner\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n outlinerEditor -e \n -showShapes 0\n -showAssignedMaterials 0\n -showTimeEditor 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 0\n -showConnected 0\n -showAnimCurvesOnly 0\n" + + " -showMuteInfo 0\n -organizeByLayer 1\n -organizeByClip 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 0\n -showDagOnly 1\n -showAssets 1\n -showContainedOnly 1\n -showPublishedAsConnected 0\n -showParentContainers 0\n -showContainerContents 1\n -ignoreDagHierarchy 0\n -expandConnections 0\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 1\n -showLeafs 1\n -showNumericAttrsOnly 0\n -highlightActive 1\n -autoSelectNewObjects 0\n -doNotSelectNewObjects 0\n -dropIsParent 1\n -transmitFilters 0\n -setFilter \"defaultSetFilter\" \n -showSetMembers 1\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -showUfeItems 1\n -displayMode \"DAG\" \n -expandObjects 0\n" + + " -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 0\n -mapMotionTrails 0\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n -renderFilterVisible 0\n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"graphEditor\" (localizedPanelLabel(\"Graph Editor\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Graph Editor\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = ($panelName+\"OutlineEd\");\n outlinerEditor -e \n" + + " -showShapes 1\n -showAssignedMaterials 0\n -showTimeEditor 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 1\n -showConnected 1\n -showAnimCurvesOnly 1\n -showMuteInfo 0\n -organizeByLayer 1\n -organizeByClip 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 1\n -showDagOnly 0\n -showAssets 1\n -showContainedOnly 0\n -showPublishedAsConnected 0\n -showParentContainers 0\n -showContainerContents 0\n -ignoreDagHierarchy 0\n -expandConnections 1\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 0\n -showLeafs 1\n -showNumericAttrsOnly 1\n -highlightActive 0\n -autoSelectNewObjects 1\n" + + " -doNotSelectNewObjects 0\n -dropIsParent 1\n -transmitFilters 1\n -setFilter \"0\" \n -showSetMembers 0\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -showUfeItems 1\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 1\n -mapMotionTrails 1\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n -renderFilterVisible 0\n" + + " $editorName;\n\n\t\t\t$editorName = ($panelName+\"GraphEd\");\n animCurveEditor -e \n -displayValues 0\n -snapTime \"integer\" \n -snapValue \"none\" \n -showPlayRangeShades \"on\" \n -lockPlayRangeShades \"off\" \n -smoothness \"fine\" \n -resultSamples 1\n -resultScreenSamples 0\n -resultUpdate \"delayed\" \n -showUpstreamCurves 1\n -keyMinScale 1\n -stackedCurvesMin -1\n -stackedCurvesMax 1\n -stackedCurvesSpace 0.2\n -preSelectionHighlight 1\n -limitToSelectedCurves 0\n -constrainDrag 0\n -valueLinesToggle 0\n -highlightAffectedCurves 0\n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"dopeSheetPanel\" (localizedPanelLabel(\"Dope Sheet\")) `;\n" + + "\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Dope Sheet\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = ($panelName+\"OutlineEd\");\n outlinerEditor -e \n -showShapes 1\n -showAssignedMaterials 0\n -showTimeEditor 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 1\n -showConnected 1\n -showAnimCurvesOnly 1\n -showMuteInfo 0\n -organizeByLayer 1\n -organizeByClip 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 1\n -showDagOnly 0\n -showAssets 1\n -showContainedOnly 0\n -showPublishedAsConnected 0\n -showParentContainers 0\n -showContainerContents 0\n -ignoreDagHierarchy 0\n -expandConnections 1\n" + + " -showUpstreamCurves 1\n -showUnitlessCurves 0\n -showCompounds 0\n -showLeafs 1\n -showNumericAttrsOnly 1\n -highlightActive 0\n -autoSelectNewObjects 0\n -doNotSelectNewObjects 1\n -dropIsParent 1\n -transmitFilters 0\n -setFilter \"0\" \n -showSetMembers 1\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -showUfeItems 1\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n" + + " -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 0\n -mapMotionTrails 1\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n -renderFilterVisible 0\n $editorName;\n\n\t\t\t$editorName = ($panelName+\"DopeSheetEd\");\n dopeSheetEditor -e \n -displayValues 0\n -snapTime \"none\" \n -snapValue \"none\" \n -outliner \"dopeSheetPanel1OutlineEd\" \n -hierarchyBelow 0\n -selectionWindow 0 0 0 0 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"timeEditorPanel\" (localizedPanelLabel(\"Time Editor\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Time Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n" + + "\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"clipEditorPanel\" (localizedPanelLabel(\"Trax Editor\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Trax Editor\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = clipEditorNameFromPanel($panelName);\n clipEditor -e \n -displayValues 0\n -snapTime \"none\" \n -snapValue \"none\" \n -initialized 0\n -manageSequencer 0 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"sequenceEditorPanel\" (localizedPanelLabel(\"Camera Sequencer\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Camera Sequencer\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = sequenceEditorNameFromPanel($panelName);\n clipEditor -e \n -displayValues 0\n" + + " -snapTime \"none\" \n -snapValue \"none\" \n -initialized 0\n -manageSequencer 1 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"hyperGraphPanel\" (localizedPanelLabel(\"Hypergraph Hierarchy\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Hypergraph Hierarchy\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = ($panelName+\"HyperGraphEd\");\n hyperGraph -e \n -graphLayoutStyle \"hierarchicalLayout\" \n -orientation \"horiz\" \n -mergeConnections 0\n -zoom 1\n -animateTransition 0\n -showRelationships 1\n -showShapes 0\n -showDeformers 0\n -showExpressions 0\n -showConstraints 0\n -showConnectionFromSelected 0\n -showConnectionToSelected 0\n" + + " -showConstraintLabels 0\n -showUnderworld 0\n -showInvisible 0\n -transitionFrames 1\n -opaqueContainers 0\n -freeform 0\n -imagePosition 0 0 \n -imageScale 1\n -imageEnabled 0\n -graphType \"DAG\" \n -heatMapDisplay 0\n -updateSelection 1\n -updateNodeAdded 1\n -useDrawOverrideColor 0\n -limitGraphTraversal -1\n -range 0 0 \n -iconSize \"smallIcons\" \n -showCachedConnections 0\n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"hyperShadePanel\" (localizedPanelLabel(\"Hypershade\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Hypershade\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n" + + "\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"visorPanel\" (localizedPanelLabel(\"Visor\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Visor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"nodeEditorPanel\" (localizedPanelLabel(\"Node Editor\")) `;\n\tif ($nodeEditorPanelVisible || $nodeEditorWorkspaceControlOpen) {\n\t\tif (\"\" == $panelName) {\n\t\t\tif ($useSceneConfig) {\n\t\t\t\t$panelName = `scriptedPanel -unParent -type \"nodeEditorPanel\" -l (localizedPanelLabel(\"Node Editor\")) -mbv $menusOkayInPanels `;\n\n\t\t\t$editorName = ($panelName+\"NodeEditorEd\");\n nodeEditor -e \n -allAttributes 0\n -allNodes 0\n -autoSizeNodes 1\n -consistentNameSize 1\n -createNodeCommand \"nodeEdCreateNodeCommand\" \n -connectNodeOnCreation 0\n" + + " -connectOnDrop 0\n -copyConnectionsOnPaste 0\n -connectionStyle \"bezier\" \n -defaultPinnedState 0\n -additiveGraphingMode 0\n -connectedGraphingMode 1\n -settingsChangedCallback \"nodeEdSyncControls\" \n -traversalDepthLimit -1\n -keyPressCommand \"nodeEdKeyPressCommand\" \n -nodeTitleMode \"name\" \n -gridSnap 0\n -gridVisibility 1\n -crosshairOnEdgeDragging 0\n -popupMenuScript \"nodeEdBuildPanelMenus\" \n -showNamespace 1\n -showShapes 1\n -showSGShapes 0\n -showTransforms 1\n -useAssets 1\n -syncedSelection 1\n -extendToShapes 1\n -showUnitConversions 0\n -editorMode \"default\" \n -hasWatchpoint 0\n $editorName;\n\t\t\t}\n\t\t} else {\n\t\t\t$label = `panel -q -label $panelName`;\n" + + "\t\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Node Editor\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = ($panelName+\"NodeEditorEd\");\n nodeEditor -e \n -allAttributes 0\n -allNodes 0\n -autoSizeNodes 1\n -consistentNameSize 1\n -createNodeCommand \"nodeEdCreateNodeCommand\" \n -connectNodeOnCreation 0\n -connectOnDrop 0\n -copyConnectionsOnPaste 0\n -connectionStyle \"bezier\" \n -defaultPinnedState 0\n -additiveGraphingMode 0\n -connectedGraphingMode 1\n -settingsChangedCallback \"nodeEdSyncControls\" \n -traversalDepthLimit -1\n -keyPressCommand \"nodeEdKeyPressCommand\" \n -nodeTitleMode \"name\" \n -gridSnap 0\n -gridVisibility 1\n -crosshairOnEdgeDragging 0\n -popupMenuScript \"nodeEdBuildPanelMenus\" \n -showNamespace 1\n" + + " -showShapes 1\n -showSGShapes 0\n -showTransforms 1\n -useAssets 1\n -syncedSelection 1\n -extendToShapes 1\n -showUnitConversions 0\n -editorMode \"default\" \n -hasWatchpoint 0\n $editorName;\n\t\t\tif (!$useSceneConfig) {\n\t\t\t\tpanel -e -l $label $panelName;\n\t\t\t}\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"createNodePanel\" (localizedPanelLabel(\"Create Node\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Create Node\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"polyTexturePlacementPanel\" (localizedPanelLabel(\"UV Editor\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"UV Editor\")) -mbv $menusOkayInPanels $panelName;\n" + + "\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"renderWindowPanel\" (localizedPanelLabel(\"Render View\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Render View\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"shapePanel\" (localizedPanelLabel(\"Shape Editor\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tshapePanel -edit -l (localizedPanelLabel(\"Shape Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"posePanel\" (localizedPanelLabel(\"Pose Editor\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tposePanel -edit -l (localizedPanelLabel(\"Pose Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n" + + "\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"dynRelEdPanel\" (localizedPanelLabel(\"Dynamic Relationships\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Dynamic Relationships\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"relationshipPanel\" (localizedPanelLabel(\"Relationship Editor\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Relationship Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"referenceEditorPanel\" (localizedPanelLabel(\"Reference Editor\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Reference Editor\")) -mbv $menusOkayInPanels $panelName;\n" + + "\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"dynPaintScriptedPanelType\" (localizedPanelLabel(\"Paint Effects\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Paint Effects\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"scriptEditorPanel\" (localizedPanelLabel(\"Script Editor\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Script Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"profilerPanel\" (localizedPanelLabel(\"Profiler Tool\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Profiler Tool\")) -mbv $menusOkayInPanels $panelName;\n" + + "\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"contentBrowserPanel\" (localizedPanelLabel(\"Content Browser\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Content Browser\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\tif ($useSceneConfig) {\n string $configName = `getPanel -cwl (localizedPanelLabel(\"Current Layout\"))`;\n if (\"\" != $configName) {\n\t\t\tpanelConfiguration -edit -label (localizedPanelLabel(\"Current Layout\")) \n\t\t\t\t-userCreated false\n\t\t\t\t-defaultImage \"vacantCell.xP:/\"\n\t\t\t\t-image \"\"\n\t\t\t\t-sc false\n\t\t\t\t-configString \"global string $gMainPane; paneLayout -e -cn \\\"single\\\" -ps 1 100 100 $gMainPane;\"\n\t\t\t\t-removeAllPanels\n\t\t\t\t-ap false\n\t\t\t\t\t(localizedPanelLabel(\"Persp View\")) \n\t\t\t\t\t\"modelPanel\"\n" + + "\t\t\t\t\t\"$panelName = `modelPanel -unParent -l (localizedPanelLabel(\\\"Persp View\\\")) -mbv $menusOkayInPanels `;\\n$editorName = $panelName;\\nmodelEditor -e \\n -cam `findStartUpCamera persp` \\n -useInteractiveMode 0\\n -displayLights \\\"default\\\" \\n -displayAppearance \\\"smoothShaded\\\" \\n -activeOnly 0\\n -ignorePanZoom 0\\n -wireframeOnShaded 0\\n -headsUpDisplay 1\\n -holdOuts 1\\n -selectionHiliteDisplay 1\\n -useDefaultMaterial 0\\n -bufferMode \\\"double\\\" \\n -twoSidedLighting 0\\n -backfaceCulling 0\\n -xray 0\\n -jointXray 0\\n -activeComponentsXray 0\\n -displayTextures 0\\n -smoothWireframe 0\\n -lineWidth 1\\n -textureAnisotropic 0\\n -textureHilight 1\\n -textureSampling 2\\n -textureDisplay \\\"modulate\\\" \\n -textureMaxSize 32768\\n -fogging 0\\n -fogSource \\\"fragment\\\" \\n -fogMode \\\"linear\\\" \\n -fogStart 0\\n -fogEnd 100\\n -fogDensity 0.1\\n -fogColor 0.5 0.5 0.5 1 \\n -depthOfFieldPreview 1\\n -maxConstantTransparency 1\\n -rendererName \\\"vp2Renderer\\\" \\n -rendererOverrideName \\\"mayaHydraRenderOverride_HdStormRendererPlugin\\\" \\n -objectFilterShowInHUD 1\\n -isFiltered 0\\n -colorResolution 256 256 \\n -bumpResolution 512 512 \\n -textureCompression 0\\n -transparencyAlgorithm \\\"frontAndBackCull\\\" \\n -transpInShadows 0\\n -cullingOverride \\\"none\\\" \\n -lowQualityLighting 0\\n -maximumNumHardwareLights 1\\n -occlusionCulling 0\\n -shadingModel 0\\n -useBaseRenderer 0\\n -useReducedRenderer 0\\n -smallObjectCulling 0\\n -smallObjectThreshold -1 \\n -interactiveDisableShadows 0\\n -interactiveBackFaceCull 0\\n -sortTransparent 1\\n -controllers 1\\n -nurbsCurves 1\\n -nurbsSurfaces 1\\n -polymeshes 1\\n -subdivSurfaces 1\\n -planes 1\\n -lights 1\\n -cameras 1\\n -controlVertices 1\\n -hulls 1\\n -grid 1\\n -imagePlane 1\\n -joints 1\\n -ikHandles 1\\n -deformers 1\\n -dynamics 1\\n -particleInstancers 1\\n -fluids 1\\n -hairSystems 1\\n -follicles 1\\n -nCloths 1\\n -nParticles 1\\n -nRigids 1\\n -dynamicConstraints 1\\n -locators 1\\n -manipulators 1\\n -pluginShapes 1\\n -dimensions 1\\n -handles 1\\n -pivots 1\\n -textures 1\\n -strokes 1\\n -motionTrails 1\\n -clipGhosts 1\\n -bluePencil 1\\n -greasePencils 0\\n -excludeObjectPreset \\\"All\\\" \\n -shadows 0\\n -captureSequenceNumber -1\\n -width 1117\\n -height 714\\n -sceneRenderFilter 0\\n $editorName;\\nmodelEditor -e -viewSelected 0 $editorName;\\nmodelEditor -e \\n -pluginObjects \\\"gpuCacheDisplayFilter\\\" 1 \\n $editorName\"\n" + + "\t\t\t\t\t\"modelPanel -edit -l (localizedPanelLabel(\\\"Persp View\\\")) -mbv $menusOkayInPanels $panelName;\\n$editorName = $panelName;\\nmodelEditor -e \\n -cam `findStartUpCamera persp` \\n -useInteractiveMode 0\\n -displayLights \\\"default\\\" \\n -displayAppearance \\\"smoothShaded\\\" \\n -activeOnly 0\\n -ignorePanZoom 0\\n -wireframeOnShaded 0\\n -headsUpDisplay 1\\n -holdOuts 1\\n -selectionHiliteDisplay 1\\n -useDefaultMaterial 0\\n -bufferMode \\\"double\\\" \\n -twoSidedLighting 0\\n -backfaceCulling 0\\n -xray 0\\n -jointXray 0\\n -activeComponentsXray 0\\n -displayTextures 0\\n -smoothWireframe 0\\n -lineWidth 1\\n -textureAnisotropic 0\\n -textureHilight 1\\n -textureSampling 2\\n -textureDisplay \\\"modulate\\\" \\n -textureMaxSize 32768\\n -fogging 0\\n -fogSource \\\"fragment\\\" \\n -fogMode \\\"linear\\\" \\n -fogStart 0\\n -fogEnd 100\\n -fogDensity 0.1\\n -fogColor 0.5 0.5 0.5 1 \\n -depthOfFieldPreview 1\\n -maxConstantTransparency 1\\n -rendererName \\\"vp2Renderer\\\" \\n -rendererOverrideName \\\"mayaHydraRenderOverride_HdStormRendererPlugin\\\" \\n -objectFilterShowInHUD 1\\n -isFiltered 0\\n -colorResolution 256 256 \\n -bumpResolution 512 512 \\n -textureCompression 0\\n -transparencyAlgorithm \\\"frontAndBackCull\\\" \\n -transpInShadows 0\\n -cullingOverride \\\"none\\\" \\n -lowQualityLighting 0\\n -maximumNumHardwareLights 1\\n -occlusionCulling 0\\n -shadingModel 0\\n -useBaseRenderer 0\\n -useReducedRenderer 0\\n -smallObjectCulling 0\\n -smallObjectThreshold -1 \\n -interactiveDisableShadows 0\\n -interactiveBackFaceCull 0\\n -sortTransparent 1\\n -controllers 1\\n -nurbsCurves 1\\n -nurbsSurfaces 1\\n -polymeshes 1\\n -subdivSurfaces 1\\n -planes 1\\n -lights 1\\n -cameras 1\\n -controlVertices 1\\n -hulls 1\\n -grid 1\\n -imagePlane 1\\n -joints 1\\n -ikHandles 1\\n -deformers 1\\n -dynamics 1\\n -particleInstancers 1\\n -fluids 1\\n -hairSystems 1\\n -follicles 1\\n -nCloths 1\\n -nParticles 1\\n -nRigids 1\\n -dynamicConstraints 1\\n -locators 1\\n -manipulators 1\\n -pluginShapes 1\\n -dimensions 1\\n -handles 1\\n -pivots 1\\n -textures 1\\n -strokes 1\\n -motionTrails 1\\n -clipGhosts 1\\n -bluePencil 1\\n -greasePencils 0\\n -excludeObjectPreset \\\"All\\\" \\n -shadows 0\\n -captureSequenceNumber -1\\n -width 1117\\n -height 714\\n -sceneRenderFilter 0\\n $editorName;\\nmodelEditor -e -viewSelected 0 $editorName;\\nmodelEditor -e \\n -pluginObjects \\\"gpuCacheDisplayFilter\\\" 1 \\n $editorName\"\n" + + "\t\t\t\t$configName;\n\n setNamedPanelLayout (localizedPanelLabel(\"Current Layout\"));\n }\n\n panelHistory -e -clear mainPanelHistory;\n sceneUIReplacement -clear;\n\t}\n\n\ngrid -spacing 5 -size 12 -divisions 5 -displayAxes yes -displayGridLines yes -displayDivisionLines yes -displayPerspectiveLabels no -displayOrthographicLabels no -displayAxesBold yes -perspectiveLabelPosition axis -orthographicLabelPosition edge;\nviewManip -drawCompass 0 -compassAngle 0 -frontParameters \"\" -homeParameters \"\" -selectionLockParameters \"\";\n}\n"); + setAttr ".st" 3; +createNode script -n "sceneConfigurationScriptNode"; + rename -uid "CDD3DC3E-4389-91FF-1F2D-F7B5BFB8BB52"; + setAttr ".b" -type "string" "playbackOptions -min 1 -max 120 -ast 1 -aet 200 "; + setAttr ".st" 6; +createNode aiOptions -s -n "defaultArnoldRenderOptions"; + rename -uid "788D2B97-408D-A2AD-D41D-EEAD4F248410"; + setAttr ".version" -type "string" "5.4.0"; +createNode aiAOVFilter -s -n "defaultArnoldFilter"; + rename -uid "4EC78FE8-46BC-C4FD-4F2B-BB8C47BB5CCA"; + setAttr ".ai_translator" -type "string" "gaussian"; +createNode aiAOVDriver -s -n "defaultArnoldDriver"; + rename -uid "D660D139-4289-C735-8243-6498207165B3"; + setAttr ".ai_translator" -type "string" "exr"; +createNode aiAOVDriver -s -n "defaultArnoldDisplayDriver"; + rename -uid "8E8BA0C4-4443-830B-74CB-6FB096CB5D40"; + setAttr ".ai_translator" -type "string" "maya"; + setAttr ".output_mode" 0; +createNode mayaUsdLayerManager -n "mayaUsdLayerManager1"; + rename -uid "4D9030E7-4E0F-EF19-662E-CFA3E3339B89"; + setAttr ".sst" -type "string" ""; +select -ne :time1; + setAttr ".o" 1; + setAttr ".unw" 1; +select -ne :hardwareRenderingGlobals; + setAttr ".otfna" -type "stringArray" 22 "NURBS Curves" "NURBS Surfaces" "Polygons" "Subdiv Surface" "Particles" "Particle Instance" "Fluids" "Strokes" "Image Planes" "UI" "Lights" "Cameras" "Locators" "Joints" "IK Handles" "Deformers" "Motion Trails" "Components" "Hair Systems" "Follicles" "Misc. UI" "Ornaments" ; + setAttr ".otfva" -type "Int32Array" 22 0 1 1 1 1 1 + 1 1 1 0 0 0 0 0 0 0 0 0 + 0 0 0 0 ; + setAttr ".fprt" yes; + setAttr ".rtfm" 1; +select -ne :renderPartition; + setAttr -s 2 ".st"; +select -ne :renderGlobalsList1; +select -ne :defaultShaderList1; + setAttr -s 5 ".s"; +select -ne :postProcessList1; + setAttr -s 2 ".p"; +select -ne :defaultRenderingList1; +select -ne :standardSurface1; + setAttr ".bc" -type "float3" 0.40000001 0.40000001 0.40000001 ; + setAttr ".sr" 0.5; +select -ne :initialShadingGroup; + setAttr ".ro" yes; +select -ne :initialParticleSE; + setAttr ".ro" yes; +select -ne :defaultRenderGlobals; + addAttr -ci true -sn "mtohMotionSampleStart" -ln "mtohMotionSampleStart" -at "float"; + addAttr -ci true -sn "mtohMotionSampleEnd" -ln "mtohMotionSampleEnd" -at "float"; + addAttr -ci true -sn "mayaHydraRenderPurpose" -ln "mayaHydraRenderPurpose" -min + 0 -max 1 -at "bool"; + addAttr -ci true -sn "mayaHydraProxyPurpose" -ln "mayaHydraProxyPurpose" -dv 1 -min + 0 -max 1 -at "bool"; + addAttr -ci true -sn "mayaHydraGuidePurpose" -ln "mayaHydraGuidePurpose" -min 0 + -max 1 -at "bool"; + addAttr -ci true -sn "mtohTextureMemoryPerTexture" -ln "mtohTextureMemoryPerTexture" + -dv 4096 -min 1 -max 262144 -smn 16384 -at "long"; + addAttr -ci true -sn "mtohMaximumShadowMapResolution" -ln "mtohMaximumShadowMapResolution" + -dv 2048 -min 32 -max 8192 -at "long"; + addAttr -ci true -sn "HdStormRendererPlugin__enableTinyPrimCulling" -ln "HdStormRendererPlugin__enableTinyPrimCulling" + -min 0 -max 1 -at "bool"; + addAttr -ci true -sn "HdStormRendererPlugin__volumeRaymarchingStepSize" -ln "HdStormRendererPlugin__volumeRaymarchingStepSize" + -dv 1 -at "float"; + addAttr -ci true -sn "HdStormRendererPlugin__volumeRaymarchingStepSizeLighting" + -ln "HdStormRendererPlugin__volumeRaymarchingStepSizeLighting" -dv 10 -at "float"; + addAttr -ci true -sn "HdStormRendererPlugin__volumeMaxTextureMemoryPerField" -ln "HdStormRendererPlugin__volumeMaxTextureMemoryPerField" + -dv 128 -at "float"; + addAttr -ci true -sn "HdStormRendererPlugin__maxLights" -ln "HdStormRendererPlugin__maxLights" + -dv 16 -at "long"; + addAttr -ci true -h true -sn "dss" -ln "defaultSurfaceShader" -dt "string"; + setAttr ".ren" -type "string" "arnold"; + setAttr ".dss" -type "string" "standardSurface1"; +select -ne :defaultResolution; + setAttr ".pa" 1; +select -ne :defaultColorMgtGlobals; + setAttr ".cfe" yes; + setAttr ".cfp" -type "string" "/OCIO-configs/Maya2022-default/config.ocio"; + setAttr ".vtn" -type "string" "ACES 1.0 SDR-video (sRGB)"; + setAttr ".vn" -type "string" "ACES 1.0 SDR-video"; + setAttr ".dn" -type "string" "sRGB"; + setAttr ".wsn" -type "string" "ACEScg"; + setAttr ".otn" -type "string" "ACES 1.0 SDR-video (sRGB)"; + setAttr ".potn" -type "string" "ACES 1.0 SDR-video (sRGB)"; +select -ne :hardwareRenderGlobals; + setAttr ".ctrs" 256; + setAttr ".btrs" 512; +relationship "link" ":lightLinker1" ":initialShadingGroup.message" ":defaultLightSet.message"; +relationship "link" ":lightLinker1" ":initialParticleSE.message" ":defaultLightSet.message"; +relationship "shadowLink" ":lightLinker1" ":initialShadingGroup.message" ":defaultLightSet.message"; +relationship "shadowLink" ":lightLinker1" ":initialParticleSE.message" ":defaultLightSet.message"; +connectAttr "layerManager.dli[0]" "defaultLayer.id"; +connectAttr "renderLayerManager.rlmi[0]" "defaultRenderLayer.rlid"; +connectAttr ":defaultArnoldDisplayDriver.msg" ":defaultArnoldRenderOptions.drivers" + -na; +connectAttr ":defaultArnoldFilter.msg" ":defaultArnoldRenderOptions.filt"; +connectAttr ":defaultArnoldDriver.msg" ":defaultArnoldRenderOptions.drvr"; +connectAttr "defaultRenderLayer.msg" ":defaultRenderingList1.r" -na; +// End of testFootPrintNodeSaved.ma From ff4c9eb137484a76374a6f1f4b3b88170f06c050 Mon Sep 17 00:00:00 2001 From: David Lanier Date: Thu, 15 Feb 2024 14:04:25 +0100 Subject: [PATCH 02/14] Remove mtoa from test scenes. --- test/testSamples/testFootPrintNode/testFootPrintNode.ma | 1 - test/testSamples/testFootPrintNode/testFootPrintNodeSaved.ma | 1 - 2 files changed, 2 deletions(-) diff --git a/test/testSamples/testFootPrintNode/testFootPrintNode.ma b/test/testSamples/testFootPrintNode/testFootPrintNode.ma index f529f58238..c66e56275f 100644 --- a/test/testSamples/testFootPrintNode/testFootPrintNode.ma +++ b/test/testSamples/testFootPrintNode/testFootPrintNode.ma @@ -3,7 +3,6 @@ //Last modified: Wed, Feb 14, 2024 05:36:52 PM //Codeset: 1252 requires maya "2026ff01"; -requires "mtoa" "5.4.0"; requires -nodeType "mayaUsdLayerManager" -dataType "pxrUsdStageData" "mayaUsdPlugin" "0.28.0"; currentUnit -l centimeter -a degree -t film; fileInfo "application" "maya"; diff --git a/test/testSamples/testFootPrintNode/testFootPrintNodeSaved.ma b/test/testSamples/testFootPrintNode/testFootPrintNodeSaved.ma index 3dc84a9e2a..d59b18710e 100644 --- a/test/testSamples/testFootPrintNode/testFootPrintNodeSaved.ma +++ b/test/testSamples/testFootPrintNode/testFootPrintNodeSaved.ma @@ -3,7 +3,6 @@ //Last modified: Thu, Feb 15, 2024 11:20:16 AM //Codeset: 1252 requires maya "2026ff01"; -requires -nodeType "aiOptions" -nodeType "aiAOVDriver" -nodeType "aiAOVFilter" "mtoa" "5.4.0"; requires -nodeType "mayaUsdLayerManager" -dataType "pxrUsdStageData" "mayaUsdPlugin" "0.28.0"; requires -nodeType "MhFootPrint" "mayaHydraFootPrintNode" "2025.0"; currentUnit -l centimeter -a degree -t film; From 8ab3a361ea9f1cff3ddd5c1ed1dc651f75bb1b79 Mon Sep 17 00:00:00 2001 From: David Lanier Date: Thu, 15 Feb 2024 14:33:52 +0100 Subject: [PATCH 03/14] Remove some mtoa attributes in the scenes --- .../testFootPrintNode/testFootPrintNode.ma | 3 --- .../testFootPrintNodeSaved.ma | 19 +------------------ 2 files changed, 1 insertion(+), 21 deletions(-) diff --git a/test/testSamples/testFootPrintNode/testFootPrintNode.ma b/test/testSamples/testFootPrintNode/testFootPrintNode.ma index c66e56275f..07c7bf1dfe 100644 --- a/test/testSamples/testFootPrintNode/testFootPrintNode.ma +++ b/test/testSamples/testFootPrintNode/testFootPrintNode.ma @@ -41,7 +41,6 @@ createNode camera -s -n "topShape" -p "top"; setAttr ".man" -type "string" "top_mask"; setAttr ".hc" -type "string" "viewSet -t %camera"; setAttr ".o" yes; - setAttr ".ai_translator" -type "string" "orthographic"; createNode transform -s -n "front"; rename -uid "809483A6-4AAF-4A40-B4DD-C49622814551"; setAttr ".v" no; @@ -57,7 +56,6 @@ createNode camera -s -n "frontShape" -p "front"; setAttr ".man" -type "string" "front_mask"; setAttr ".hc" -type "string" "viewSet -f %camera"; setAttr ".o" yes; - setAttr ".ai_translator" -type "string" "orthographic"; createNode transform -s -n "side"; rename -uid "AB222488-4904-FB92-F2D0-A99AA0F1FC86"; setAttr ".v" no; @@ -74,7 +72,6 @@ createNode camera -s -n "sideShape" -p "side"; setAttr ".man" -type "string" "side_mask"; setAttr ".hc" -type "string" "viewSet -s %camera"; setAttr ".o" yes; - setAttr ".ai_translator" -type "string" "orthographic"; createNode lightLinker -s -n "lightLinker1"; rename -uid "A559BD2C-475A-7BEC-A55C-A9B9BF88FFB0"; setAttr -s 2 ".lnk"; diff --git a/test/testSamples/testFootPrintNode/testFootPrintNodeSaved.ma b/test/testSamples/testFootPrintNode/testFootPrintNodeSaved.ma index d59b18710e..5d62fa8a91 100644 --- a/test/testSamples/testFootPrintNode/testFootPrintNodeSaved.ma +++ b/test/testSamples/testFootPrintNode/testFootPrintNodeSaved.ma @@ -42,7 +42,6 @@ createNode camera -s -n "topShape" -p "top"; setAttr ".man" -type "string" "top_mask"; setAttr ".hc" -type "string" "viewSet -t %camera"; setAttr ".o" yes; - setAttr ".ai_translator" -type "string" "orthographic"; createNode transform -s -n "front"; rename -uid "CB71B927-4B24-D753-E31D-628D3D29DB03"; setAttr ".v" no; @@ -58,7 +57,6 @@ createNode camera -s -n "frontShape" -p "front"; setAttr ".man" -type "string" "front_mask"; setAttr ".hc" -type "string" "viewSet -f %camera"; setAttr ".o" yes; - setAttr ".ai_translator" -type "string" "orthographic"; createNode transform -s -n "side"; rename -uid "1281E673-48D0-D52F-28CC-AD9B453CB8D7"; setAttr ".v" no; @@ -75,7 +73,6 @@ createNode camera -s -n "sideShape" -p "side"; setAttr ".man" -type "string" "side_mask"; setAttr ".hc" -type "string" "viewSet -s %camera"; setAttr ".o" yes; - setAttr ".ai_translator" -type "string" "orthographic"; createNode transform -n "transform1"; rename -uid "2D4589FD-42A5-19C9-D949-748E12966104"; createNode MhFootPrint -n "MhFootPrint1" -p "transform1"; @@ -149,19 +146,6 @@ createNode script -n "sceneConfigurationScriptNode"; rename -uid "CDD3DC3E-4389-91FF-1F2D-F7B5BFB8BB52"; setAttr ".b" -type "string" "playbackOptions -min 1 -max 120 -ast 1 -aet 200 "; setAttr ".st" 6; -createNode aiOptions -s -n "defaultArnoldRenderOptions"; - rename -uid "788D2B97-408D-A2AD-D41D-EEAD4F248410"; - setAttr ".version" -type "string" "5.4.0"; -createNode aiAOVFilter -s -n "defaultArnoldFilter"; - rename -uid "4EC78FE8-46BC-C4FD-4F2B-BB8C47BB5CCA"; - setAttr ".ai_translator" -type "string" "gaussian"; -createNode aiAOVDriver -s -n "defaultArnoldDriver"; - rename -uid "D660D139-4289-C735-8243-6498207165B3"; - setAttr ".ai_translator" -type "string" "exr"; -createNode aiAOVDriver -s -n "defaultArnoldDisplayDriver"; - rename -uid "8E8BA0C4-4443-830B-74CB-6FB096CB5D40"; - setAttr ".ai_translator" -type "string" "maya"; - setAttr ".output_mode" 0; createNode mayaUsdLayerManager -n "mayaUsdLayerManager1"; rename -uid "4D9030E7-4E0F-EF19-662E-CFA3E3339B89"; setAttr ".sst" -type "string" ""; @@ -236,8 +220,7 @@ relationship "shadowLink" ":lightLinker1" ":initialShadingGroup.message" ":defau relationship "shadowLink" ":lightLinker1" ":initialParticleSE.message" ":defaultLightSet.message"; connectAttr "layerManager.dli[0]" "defaultLayer.id"; connectAttr "renderLayerManager.rlmi[0]" "defaultRenderLayer.rlid"; -connectAttr ":defaultArnoldDisplayDriver.msg" ":defaultArnoldRenderOptions.drivers" - -na; +connectAttr ":defaultArnoldDisplayDriver.msg" ":defaultArnoldRenderOptions.drivers" -na; connectAttr ":defaultArnoldFilter.msg" ":defaultArnoldRenderOptions.filt"; connectAttr ":defaultArnoldDriver.msg" ":defaultArnoldRenderOptions.drvr"; connectAttr "defaultRenderLayer.msg" ":defaultRenderingList1.r" -na; From 8a118f0596e8941c4213bc656a86b507b6779e84 Mon Sep 17 00:00:00 2001 From: David Lanier Date: Tue, 20 Feb 2024 12:05:01 +0100 Subject: [PATCH 04/14] HYDRA-307 : Fixes from code review. --- .../flowViewportAPIMayaLocator/CMakeLists.txt | 20 +++----- .../flowViewportAPIMayaLocator.cpp | 2 +- .../footPrintNode/CMakeLists.txt | 33 +++++------- .../footPrintNode/mhFootPrintNode.cpp | 34 ++++--------- .../render/mayaToHydra/testFlowViewportAPI.py | 51 ++++++------------- .../render/mayaToHydra/testFootPrintNode.py | 33 +++--------- 6 files changed, 55 insertions(+), 118 deletions(-) diff --git a/lib/mayaHydra/flowViewportAPIExamples/flowViewportAPIMayaLocator/CMakeLists.txt b/lib/mayaHydra/flowViewportAPIExamples/flowViewportAPIMayaLocator/CMakeLists.txt index 1f93f3e196..13774293ce 100644 --- a/lib/mayaHydra/flowViewportAPIExamples/flowViewportAPIMayaLocator/CMakeLists.txt +++ b/lib/mayaHydra/flowViewportAPIExamples/flowViewportAPIMayaLocator/CMakeLists.txt @@ -23,8 +23,6 @@ target_compile_definitions(${TARGET_NAME} # private atm because M3dView is only used in .cpp right now # gcc will NOT set this automatically $<$:LINUX> - # Not sure if msvcc sets this automatically, but won't hurt to redefine - $<$:_WIN32> MFB_ALT_PACKAGE_NAME="${TARGET_NAME}" # This is used by Pixar HdSceneIndexPluginRegistry::Define to create a unique name ) @@ -38,19 +36,15 @@ if(DEFINED MAYAUSD_VERSION) ) endif() -if(DEFINED MAYAHYDRA_VERSION) - target_compile_definitions(${TARGET_NAME} - PRIVATE - MAYAHYDRA_VERSION=${MAYAHYDRA_VERSION} - ) -endif() -if(DEFINED MAYAHYDRA_CUT_ID) - target_compile_definitions(${TARGET_NAME} - PRIVATE - MAYAHYDRA_CUT_ID=${MAYAHYDRA_CUT_ID} - ) +if(NOT DEFINED MAYAHYDRA_VERSION) + message(FATAL_ERROR "No MAYAHYDRA_VERSION defined, aborting configuration." ) endif() +target_compile_definitions(${TARGET_NAME} + PRIVATE + MAYAHYDRA_VERSION=${MAYAHYDRA_VERSION} +) + mayaHydra_compile_config(${TARGET_NAME}) # ----------------------------------------------------------------------------- diff --git a/lib/mayaHydra/flowViewportAPIExamples/flowViewportAPIMayaLocator/flowViewportAPIMayaLocator.cpp b/lib/mayaHydra/flowViewportAPIExamples/flowViewportAPIMayaLocator/flowViewportAPIMayaLocator.cpp index dc35e8cf4b..98912a06ce 100644 --- a/lib/mayaHydra/flowViewportAPIExamples/flowViewportAPIMayaLocator/flowViewportAPIMayaLocator.cpp +++ b/lib/mayaHydra/flowViewportAPIExamples/flowViewportAPIMayaLocator/flowViewportAPIMayaLocator.cpp @@ -271,7 +271,7 @@ namespace }//end of anonymous namespace //Initialization of static members -MTypeId FlowViewportAPIMayaLocator::id( 0x90517 ); +MTypeId FlowViewportAPIMayaLocator::id( 0x00080100 ); MString FlowViewportAPIMayaLocator::nodeClassification("hydraAPIExample/geometry/FlowViewportAPIMayaLocator"); MObject FlowViewportAPIMayaLocator::mNumCubeLevelsX; diff --git a/lib/mayaHydra/flowViewportAPIExamples/footPrintNode/CMakeLists.txt b/lib/mayaHydra/flowViewportAPIExamples/footPrintNode/CMakeLists.txt index 2d7847955e..6ff03b6b0f 100644 --- a/lib/mayaHydra/flowViewportAPIExamples/footPrintNode/CMakeLists.txt +++ b/lib/mayaHydra/flowViewportAPIExamples/footPrintNode/CMakeLists.txt @@ -23,8 +23,6 @@ target_compile_definitions(${TARGET_NAME} # private atm because M3dView is only used in .cpp right now # gcc will NOT set this automatically $<$:LINUX> - # Not sure if msvcc sets this automatically, but won't hurt to redefine - $<$:_WIN32> MFB_ALT_PACKAGE_NAME="${TARGET_NAME}" # This is used by Pixar HdSceneIndexPluginRegistry::Define to create a unique name ) @@ -38,19 +36,15 @@ if(DEFINED MAYAUSD_VERSION) ) endif() -if(DEFINED MAYAHYDRA_VERSION) - target_compile_definitions(${TARGET_NAME} - PRIVATE - MAYAHYDRA_VERSION=${MAYAHYDRA_VERSION} - ) -endif() -if(DEFINED MAYAHYDRA_CUT_ID) - target_compile_definitions(${TARGET_NAME} - PRIVATE - MAYAHYDRA_CUT_ID=${MAYAHYDRA_CUT_ID} - ) +if(NOT DEFINED MAYAHYDRA_VERSION) + message(FATAL_ERROR "No MAYAHYDRA_VERSION defined, aborting configuration." ) endif() +target_compile_definitions(${TARGET_NAME} + PRIVATE + MAYAHYDRA_VERSION=${MAYAHYDRA_VERSION} +) + mayaHydra_compile_config(${TARGET_NAME}) # ----------------------------------------------------------------------------- @@ -73,15 +67,16 @@ if(IS_MACOSX OR IS_LINUX) mayaUsd_init_rpath(rpath "lib/maya") if(DEFINED MAYAUSD_TO_USD_RELATIVE_PATH) mayaUsd_add_rpath(rpath "../../${MAYAUSD_TO_USD_RELATIVE_PATH}/lib") + if (IS_LINUX) + mayaUsd_add_rpath(rpath "../../${MAYAUSD_TO_USD_RELATIVE_PATH}/lib64") + endif() + if(IS_MACOSX) + mayaUsd_add_rpath(rpath "../../../../Maya.app/Contents/MacOS") + endif() elseif(DEFINED PXR_USD_LOCATION) mayaUsd_add_rpath(rpath "${PXR_USD_LOCATION}/lib") endif() - if (IS_LINUX AND DEFINED MAYAUSD_TO_USD_RELATIVE_PATH) - mayaUsd_add_rpath(rpath "../../${MAYAUSD_TO_USD_RELATIVE_PATH}/lib64") - endif() - if(IS_MACOSX AND DEFINED MAYAUSD_TO_USD_RELATIVE_PATH) - mayaUsd_add_rpath(rpath "../../../../Maya.app/Contents/MacOS") - endif() + mayaUsd_add_rpath(rpath "../") mayaUsd_install_rpath(rpath ${TARGET_NAME}) endif() diff --git a/lib/mayaHydra/flowViewportAPIExamples/footPrintNode/mhFootPrintNode.cpp b/lib/mayaHydra/flowViewportAPIExamples/footPrintNode/mhFootPrintNode.cpp index 7cc30fdd4c..ba37c51759 100644 --- a/lib/mayaHydra/flowViewportAPIExamples/footPrintNode/mhFootPrintNode.cpp +++ b/lib/mayaHydra/flowViewportAPIExamples/footPrintNode/mhFootPrintNode.cpp @@ -37,6 +37,7 @@ #include #include #include +#include //Flow viewport headers #include @@ -100,7 +101,7 @@ class MhFootPrint : public MPxLocatorNode void _UpdateThisMObject(); ///Counter to make the hydra primitives unique - static int _counter; + std::atomic_int _counter { 0 }; /// Sole path to be used in the retained hydra scene index for the sole primitive SdfPath _solePath; @@ -111,7 +112,7 @@ class MhFootPrint : public MPxLocatorNode HdRetainedSceneIndexRefPtr _retainedSceneIndex {nullptr}; ///To be used in hydra viewport API to pass the Maya node's MObject for setting callbacks for data producer scene indices - MObject _thisMObject; + MObjectHandle _thisMObject; ///To check if the MObject of this node has changed MObject _oldMObject; ///To hold the afterOpenCallback Id to be able to react when a File Open has happened. @@ -126,9 +127,6 @@ class MhFootPrint : public MPxLocatorNode namespace { // Foot print data - constexpr int soleVertsCount = 21; - constexpr int heelVertsCount = 17; - static const VtArray solePoints = { { 0.00f, 0.0f, -0.70f }, { 0.04f, 0.0f, -0.69f }, @@ -352,10 +350,9 @@ namespace }//end of anonymous namespace //Static variables init -int MhFootPrint::_counter = 0; MObject MhFootPrint::mSize; MObject MhFootPrint::mColor; -MTypeId MhFootPrint::id( 0x90573 ); +MTypeId MhFootPrint::id( 0x00080101 ); MString MhFootPrint::nodeClassification("hydraAPIExample/geometry/footPrint"); MObject MhFootPrint::mWorldS; MObject MhFootPrint::mDummyInput; @@ -408,9 +405,6 @@ MhFootPrint::~MhFootPrint() //Create the Hydra foot print primitives in the retained scene index void MhFootPrint::_CreateAndAddFootPrintPrimitives() { - using _PointArrayDs = HdRetainedTypedSampledDataSource>; - using _IntArrayDs = HdRetainedTypedSampledDataSource; - //Get the value of the size and color attributes const float fSize = _GetSizeInCentimeters(); const GfVec3f displayColor = _GetColor(); @@ -456,15 +450,11 @@ void MhFootPrint::TriggerACallToCompute() void MhFootPrint::_UpdateThisMObject() { - if (! _thisMObject.isNull()){ + if (_thisMObject.isValid()){ return; } - MObject currentMObj = thisMObject(); - if (_oldMObject.isNull() || _oldMObject != currentMObj){ - _thisMObject = currentMObj; - _oldMObject = _thisMObject; - } + _thisMObject = thisMObject(); } void MhFootPrint::setupFlowViewportInterface() @@ -479,14 +469,15 @@ void MhFootPrint::setupFlowViewportInterface() _cbAttributeChangedId = 0; } //Add the callback when an attribute of this node changes - _cbAttributeChangedId = MNodeMessage::addAttributeChangedCallback(_thisMObject, attributeChangedCallback, ((void*)this)); + MObject obj = _thisMObject.object(); + _cbAttributeChangedId = MNodeMessage::addAttributeChangedCallback(obj, attributeChangedCallback, ((void*)this)); //Remove the previous data producer scene index in case it was registered, if that occurs it's because _thisMObject has changed and we want to update the maya callbacks on the node Fvp::DataProducerSceneIndexInterface& dataProducerSceneIndexInterface = Fvp::DataProducerSceneIndexInterface::get(); dataProducerSceneIndexInterface.removeViewportDataProducerSceneIndex(_retainedSceneIndex, pxr::FvpViewportAPITokens->allViewports); //Data producer scene index interface is used to add the retained scene index to all viewports with all render delegates - dataProducerSceneIndexInterface.addDataProducerSceneIndex(_retainedSceneIndex, noPrefix, (void*)&_thisMObject, FvpViewportAPITokens->allViewports,FvpViewportAPITokens->allRenderers); + dataProducerSceneIndexInterface.addDataProducerSceneIndex(_retainedSceneIndex, noPrefix, (void*)&obj, FvpViewportAPITokens->allViewports,FvpViewportAPITokens->allRenderers); } // Retrieve value of the size attribute from the node @@ -530,12 +521,7 @@ MStatus MhFootPrint::compute( const MPlug& plug, MDataBlock& dataBlock) } //The MObject can change if the node gets deleted and deletion being undone, so always update it in our records - MObject currentMObj = thisMObject(); - if (_oldMObject.isNull() || _oldMObject != currentMObj){ - - _thisMObject = currentMObj; - _oldMObject = _thisMObject; - + if (! _thisMObject.isValid()){ setupFlowViewportInterface(); } diff --git a/test/lib/mayaUsd/render/mayaToHydra/testFlowViewportAPI.py b/test/lib/mayaUsd/render/mayaToHydra/testFlowViewportAPI.py index fe81023876..889833fff6 100644 --- a/test/lib/mayaUsd/render/mayaToHydra/testFlowViewportAPI.py +++ b/test/lib/mayaUsd/render/mayaToHydra/testFlowViewportAPI.py @@ -39,7 +39,6 @@ class TestFlowViewportAPI(mtohUtils.MtohTestCase): #Subclassing mtohUtils.MtohTe IMAGE_DIFF_FAIL_PERCENT = 2 def setupScene(self): - cmds.file(new=True, force=True) self.setHdStormRenderer() #Test adding primitives @@ -53,7 +52,7 @@ def test_AddingPrimitives(self): #Create a FlowViewportAPIMayaLocator node which adds a dataProducerSceneIndex and a Filtering scene index flowViewportNodeName = cmds.createNode("FlowViewportAPIMayaLocator") - self.assertFalse(flowViewportNodeName == None) + self.assertIsNotNone(flowViewportNodeName) #When the node above is created, its compute method is not called automatically, so work around to trigger a call to compute cmds.setAttr(flowViewportNodeName + '.dummyInput', 2)#setting this will set dirty the dummyOutput attribute cmds.getAttr(flowViewportNodeName + '.dummyOutput')#getting this value will trigger a call to compute @@ -64,11 +63,8 @@ def test_AddingPrimitives(self): #Move the transform node, the added prims (cube grid) should move as well # Get the transform node of the FlowViewportAPIMayaLocator transformNode = cmds.listRelatives(flowViewportNodeName, parent=True)[0] - self.assertFalse(transformNode == None) - #Select the transform node - cmds.select(transformNode) - # Move the selected node - cmds.move(10, 5, -5) + self.assertIsNotNone(transformNode) + cmds.move(10, 5, -5, transformNode) cmds.refresh() self.assertSnapshotClose("add_NodeMoved.png", self.IMAGE_DIFF_FAIL_THRESHOLD, self.IMAGE_DIFF_FAIL_PERCENT) @@ -96,10 +92,7 @@ def test_AddingPrimitives(self): cmds.undo() self.assertSnapshotClose("add_NodeDeletedUndoAgain.png", self.IMAGE_DIFF_FAIL_THRESHOLD, self.IMAGE_DIFF_FAIL_PERCENT) - #Move transform node again to see if it still updates the added prims transform - cmds.select(transformNode) - # Move the selected node - cmds.move(-20, -5, 0) + cmds.move(-20, -5, 0, transformNode) cmds.refresh() self.assertSnapshotClose("add_NodeMovedAfterDeletionAndUndo.png", self.IMAGE_DIFF_FAIL_THRESHOLD, self.IMAGE_DIFF_FAIL_PERCENT) @@ -123,7 +116,7 @@ def test_FilteringPrimitives(self): #Create a FlowViewportAPIMayaLocator node which adds a dataProducerSceneIndex and a Filtering scene index flowViewportNodeName = cmds.createNode("FlowViewportAPIMayaLocator") - self.assertFalse(flowViewportNodeName == None) + self.assertIsNotNone(flowViewportNodeName) #When the node above is created, its compute method is not called automatically, so work around to trigger a call to compute cmds.setAttr(flowViewportNodeName + '.dummyInput', 3)#setting this will set dirty the dummyOutput attribute cmds.getAttr(flowViewportNodeName + '.dummyOutput')#getting this value will trigger a call to compute @@ -134,11 +127,8 @@ def test_FilteringPrimitives(self): #Move the transform node, the added prims (cube grid) should move as well # Get the transform node of the FlowViewportAPIMayaLocator transformNode = cmds.listRelatives(flowViewportNodeName, parent=True)[0] - self.assertFalse(transformNode == None) - #Select the transform node - cmds.select(transformNode) - # Move the selected node - cmds.move(15, 0, 0) + self.assertIsNotNone(transformNode) + cmds.move(15, 0, 0, transformNode) cmds.refresh() self.assertSnapshotClose("filter_NodeMoved.png", self.IMAGE_DIFF_FAIL_THRESHOLD, self.IMAGE_DIFF_FAIL_PERCENT) @@ -205,7 +195,7 @@ def test_CubeGrid(self): #Create a FlowViewportAPIMayaLocator node which adds a dataProducerSceneIndex and a Filtering scene index flowViewportNodeName = cmds.createNode("FlowViewportAPIMayaLocator") - self.assertFalse(flowViewportNodeName == None) + self.assertIsNotNone(flowViewportNodeName) #When the node above is created, its compute method is not called automatically, so work around to trigger a call to compute cmds.setAttr(flowViewportNodeName + '.dummyInput', 2)#setting this will set dirty the dummyOutput attribute @@ -261,7 +251,7 @@ def test_MultipleNodes(self): #Create a FlowViewportAPIMayaLocator node which adds a dataProducerSceneIndex and a Filtering scene index flowViewportNodeName1 = cmds.createNode("FlowViewportAPIMayaLocator", n="nodeShape1") - self.assertFalse(flowViewportNodeName1 == None) + self.assertIsNotNone(flowViewportNodeName1) #When the node above is created, its compute method is not called automatically, so work around to trigger a call to compute cmds.setAttr(flowViewportNodeName1 + '.dummyInput', 2)#setting this will set dirty the dummyOutput attribute @@ -287,16 +277,13 @@ def test_MultipleNodes(self): #Move the transform node, the added prims (cube grid) should move as well # Get the transform node of the FlowViewportAPIMayaLocator transformNode1 = cmds.listRelatives(flowViewportNodeName1, parent=True)[0] - self.assertFalse(transformNode1 == None) - #Select the transform node - cmds.select(transformNode1) - # Move the selected node - cmds.move(-10, 0, 0) + self.assertIsNotNone(transformNode1) + cmds.move(-10, 0, 0, transformNode1) cmds.refresh() #Create a FlowViewportAPIMayaLocator node which adds a dataProducerSceneIndex and a Filtering scene index flowViewportNodeName2 = cmds.createNode("FlowViewportAPIMayaLocator", n="nodeShape2") - self.assertFalse(flowViewportNodeName2 == None) + self.assertIsNotNone(flowViewportNodeName2) #When the node above is created, its compute method is not called automatically, so work around to trigger a call to compute cmds.setAttr(flowViewportNodeName2 + '.dummyInput', 3)#setting this will set dirty the dummyOutput attribute @@ -322,11 +309,8 @@ def test_MultipleNodes(self): #Move the transform node, the added prims (cube grid) should move as well # Get the transform node of the FlowViewportAPIMayaLocator transformNode2 = cmds.listRelatives(flowViewportNodeName2, parent=True)[0] - self.assertFalse(transformNode2 == None) - #Select the transform node - cmds.select(transformNode2) - # Move the selected node - cmds.move(-30, 0, -30) + self.assertIsNotNone(transformNode2) + cmds.move(-30, 0, -30, transformNode2) cmds.refresh() self.assertSnapshotClose("multipleNodes_BeforeModifs.png", self.IMAGE_DIFF_FAIL_THRESHOLD, self.IMAGE_DIFF_FAIL_PERCENT) @@ -381,15 +365,12 @@ def test_MultipleViewports(self): #Create a maya sphere sphereNode, sphereShape = cmds.polySphere() - #Select the transform node - cmds.select(sphereNode) - # Move the selected node - cmds.move(15, 0, 0) + cmds.move(15, 0, 0, sphereNode) cmds.refresh() #Create a FlowViewportAPIMayaLocator node which adds a dataProducerSceneIndex and a Filtering scene index flowViewportNodeName1 = cmds.createNode("FlowViewportAPIMayaLocator", n="nodeShape1") - self.assertFalse(flowViewportNodeName1 == None) + self.assertIsNotNone(flowViewportNodeName1) #When the node above is created, its compute method is not called automatically, so work around to trigger a call to compute cmds.setAttr(flowViewportNodeName1 + '.dummyInput', 2)#setting this will set dirty the dummyOutput attribute diff --git a/test/lib/mayaUsd/render/mayaToHydra/testFootPrintNode.py b/test/lib/mayaUsd/render/mayaToHydra/testFootPrintNode.py index b1c4971b41..3f8011692e 100644 --- a/test/lib/mayaUsd/render/mayaToHydra/testFootPrintNode.py +++ b/test/lib/mayaUsd/render/mayaToHydra/testFootPrintNode.py @@ -39,7 +39,6 @@ def imageDiffFailPercent(self): return 0.2 def setupScene(self): - cmds.file(new=True, force=True) testFile = mayaUtils.openTestScene( #Is an empty scene that is used to zoom in more on the foot print nodes, it also has Storm already set as the renderer "testFootPrintNode", "testFootPrintNode.ma") @@ -53,7 +52,6 @@ def test_AddingPrimitives(self): #Create a mayaHydraFootPrintNode node which adds a dataProducerSceneIndex footPrintNodeName = cmds.createNode("MhFootPrint") - self.assertFalse(footPrintNodeName == None) #Increase its size cmds.setAttr(footPrintNodeName + '.size', 5) @@ -63,17 +61,13 @@ def test_AddingPrimitives(self): cmds.setAttr(footPrintNodeName + '.dummyInput', 2)#setting this will set dirty the dummyOutput attribute cmds.getAttr(footPrintNodeName + '.dummyOutput')#getting this value will trigger a call to compute cmds.refresh() - #Original images are located for example in maya-hydra\test\lib\mayaUsd\render\mayaToHydra\FlowViewportAPITest self.assertSnapshotClose("add_NodeCreated.png", self.imageDiffFailThreshold, self.imageDiffFailPercent) #Move the transform node, the added prims should move as well # Get the transform node of the mayaHydraFootPrintNode transformNode = cmds.listRelatives(footPrintNodeName, parent=True)[0] - self.assertFalse(transformNode == None) - #Select the transform node - cmds.select(transformNode) - # Move the selected node - cmds.move(2, 0.5, -2) + self.assertIsNotNone(transformNode) + cmds.move(2, 0.5, -2, transformNode) cmds.refresh() self.assertSnapshotClose("add_NodeMoved.png", self.imageDiffFailThreshold, self.imageDiffFailPercent) @@ -101,10 +95,7 @@ def test_AddingPrimitives(self): cmds.undo() self.assertSnapshotClose("add_NodeDeletedUndoAgain.png", self.imageDiffFailThreshold, self.imageDiffFailPercent) - #Move transform node again to see if it still updates the added prims transform - cmds.select(transformNode) - # Move the selected node - cmds.move(-0.2, -0.5, 0) + cmds.move(-0.2, -0.5, 0, transformNode) cmds.refresh() self.assertSnapshotClose("add_NodeMovedAfterDeletionAndUndo.png", self.imageDiffFailThreshold, self.imageDiffFailPercent) @@ -124,7 +115,6 @@ def test_FootPrintAttributes(self): #Create a mayaHydraFootPrintNode node which adds a dataProducerSceneIndex and a Filtering scene index footPrintNodeName = cmds.createNode("MhFootPrint") - self.assertFalse(footPrintNodeName == None) #When the node above is created, its compute method is not called automatically, so work around to trigger a call to compute cmds.setAttr(footPrintNodeName + '.dummyInput', 2)#setting this will set dirty the dummyOutput attribute @@ -153,7 +143,6 @@ def test_MultipleNodes(self): #Create a mayaHydraFootPrintNode node which adds a dataProducerSceneIndex and a Filtering scene index footPrintNodeName1 = cmds.createNode("MhFootPrint", n="nodeShape1") - self.assertFalse(footPrintNodeName1 == None) #When the node above is created, its compute method is not called automatically, so work around to trigger a call to compute cmds.setAttr(footPrintNodeName1 + '.dummyInput', 3)#setting this will set dirty the dummyOutput attribute @@ -167,16 +156,12 @@ def test_MultipleNodes(self): #Move the transform node, the added prims should move as well # Get the transform node of the mayaHydraFootPrintNode transformNode1 = cmds.listRelatives(footPrintNodeName1, parent=True)[0] - self.assertFalse(transformNode1 == None) - #Select the transform node - cmds.select(transformNode1) - # Move the selected node - cmds.move(-2, 0, 0) + self.assertIsNotNone(transformNode1) + cmds.move(-2, 0, 0, transformNode1) cmds.refresh() #Create a mayaHydraFootPrintNode node which adds a dataProducerSceneIndex and a Filtering scene index footPrintNodeName2 = cmds.createNode("MhFootPrint", n="nodeShape2") - self.assertFalse(footPrintNodeName2 == None) #When the node above is created, its compute method is not called automatically, so work around to trigger a call to compute cmds.setAttr(footPrintNodeName2 + '.dummyInput', 3)#setting this will set dirty the dummyOutput attribute @@ -189,11 +174,8 @@ def test_MultipleNodes(self): #Move the transform node, the added prims should move as well # Get the transform node of the mayaHydraFootPrintNode transformNode2 = cmds.listRelatives(footPrintNodeName2, parent=True)[0] - self.assertFalse(transformNode2 == None) - #Select the transform node - cmds.select(transformNode2) - # Move the selected node - cmds.move(2, 0, -2) + self.assertIsNotNone(transformNode2) + cmds.move(2, 0, -2, transformNode2) cmds.refresh() self.assertSnapshotClose("multipleNodes_BeforeModifs.png", self.imageDiffFailThreshold, self.imageDiffFailPercent) @@ -248,7 +230,6 @@ def test_MultipleViewports(self): #Create a mayaHydraFootPrintNode node which adds a dataProducerSceneIndex and a Filtering scene index footPrintNodeName1 = cmds.createNode("MhFootPrint", n="nodeShape1") - self.assertFalse(footPrintNodeName1 == None) #When the node above is created, its compute method is not called automatically, so work around to trigger a call to compute cmds.setAttr(footPrintNodeName1 + '.dummyInput', 2)#setting this will set dirty the dummyOutput attribute From 05325f7a2a72ffa97ecec4a25171f6d7c8ad1b25 Mon Sep 17 00:00:00 2001 From: David Lanier Date: Tue, 20 Feb 2024 14:20:24 +0100 Subject: [PATCH 05/14] HYDRA-307 : Fix an issue with multiple nodes --- .../flowViewportAPIExamples/footPrintNode/mhFootPrintNode.cpp | 3 ++- test/lib/mayaUsd/render/mayaToHydra/testFootPrintNode.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/mayaHydra/flowViewportAPIExamples/footPrintNode/mhFootPrintNode.cpp b/lib/mayaHydra/flowViewportAPIExamples/footPrintNode/mhFootPrintNode.cpp index ba37c51759..8d456770ea 100644 --- a/lib/mayaHydra/flowViewportAPIExamples/footPrintNode/mhFootPrintNode.cpp +++ b/lib/mayaHydra/flowViewportAPIExamples/footPrintNode/mhFootPrintNode.cpp @@ -101,7 +101,7 @@ class MhFootPrint : public MPxLocatorNode void _UpdateThisMObject(); ///Counter to make the hydra primitives unique - std::atomic_int _counter { 0 }; + static std::atomic_int _counter; /// Sole path to be used in the retained hydra scene index for the sole primitive SdfPath _solePath; @@ -350,6 +350,7 @@ namespace }//end of anonymous namespace //Static variables init +std::atomic_int MhFootPrint::_counter {0}; MObject MhFootPrint::mSize; MObject MhFootPrint::mColor; MTypeId MhFootPrint::id( 0x00080101 ); diff --git a/test/lib/mayaUsd/render/mayaToHydra/testFootPrintNode.py b/test/lib/mayaUsd/render/mayaToHydra/testFootPrintNode.py index 3f8011692e..45d5bb7fce 100644 --- a/test/lib/mayaUsd/render/mayaToHydra/testFootPrintNode.py +++ b/test/lib/mayaUsd/render/mayaToHydra/testFootPrintNode.py @@ -36,7 +36,7 @@ def imageDiffFailThreshold(self): @property def imageDiffFailPercent(self): - return 0.2 + return 0.1 def setupScene(self): testFile = mayaUtils.openTestScene( #Is an empty scene that is used to zoom in more on the foot print nodes, it also has Storm already set as the renderer From 9040ebad916c2d0df2ddaab0e8bd78cd650fd667 Mon Sep 17 00:00:00 2001 From: David Lanier Date: Tue, 20 Feb 2024 17:00:37 +0100 Subject: [PATCH 06/14] HYDRA-307 : Avoid crashing when mayaHydra is not loaded and creating this node --- .../footPrintNode/CMakeLists.txt | 1 + .../footPrintNode/mhFootPrintNode.cpp | 41 +++++++++++++++++-- 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/lib/mayaHydra/flowViewportAPIExamples/footPrintNode/CMakeLists.txt b/lib/mayaHydra/flowViewportAPIExamples/footPrintNode/CMakeLists.txt index 6ff03b6b0f..a5f6d2adf5 100644 --- a/lib/mayaHydra/flowViewportAPIExamples/footPrintNode/CMakeLists.txt +++ b/lib/mayaHydra/flowViewportAPIExamples/footPrintNode/CMakeLists.txt @@ -12,6 +12,7 @@ target_sources(${TARGET_NAME} set(HEADERS PRIVATE + mhFootPrintNodeStrings.h ) # ----------------------------------------------------------------------------- diff --git a/lib/mayaHydra/flowViewportAPIExamples/footPrintNode/mhFootPrintNode.cpp b/lib/mayaHydra/flowViewportAPIExamples/footPrintNode/mhFootPrintNode.cpp index 8d456770ea..b35eff7389 100644 --- a/lib/mayaHydra/flowViewportAPIExamples/footPrintNode/mhFootPrintNode.cpp +++ b/lib/mayaHydra/flowViewportAPIExamples/footPrintNode/mhFootPrintNode.cpp @@ -27,6 +27,10 @@ // //////////////////////////////////////////////////////////////////////// +//Local headers +#include "mhFootPrintNodeStrings.h" + +//maya headers #include #include #include @@ -38,6 +42,7 @@ #include #include #include +#include //Flow viewport headers #include @@ -347,6 +352,14 @@ namespace MFnNumericData fnData(oDouble3); fnData.getData( outVal[0], outVal[1], outVal[2] ); } + + // Register all strings used by the plugin C++ code + static MStatus registerMStringResources() + { + MStringResource::registerString(rMayaHydraNotLoadedStringError); + return MS::kSuccess; + } + }//end of anonymous namespace //Static variables init @@ -554,6 +567,20 @@ MBoundingBox MhFootPrint::boundingBox() const void* MhFootPrint::creator() { + int isMayaHydraLoaded = false; + // Validate that the gpuCache plugin is loaded. + MGlobal::executeCommand( "pluginInfo -query -loaded mayaHydra", isMayaHydraLoaded ); + if( ! isMayaHydraLoaded){ + MStatus status; + MString errorString = MStringResource::getString(rMayaHydraNotLoadedStringError, status); + if (! status){ + status.perror("Cannot retrieve the rMayaHydraNotLoadedStringError string, but you need to load mayaHydra before creating this node"); + }else{ + MGlobal::displayError(errorString); + } + return nullptr; + } + return new MhFootPrint(); } @@ -621,11 +648,19 @@ MStatus MhFootPrint::initialize() MStatus initializePlugin( MObject obj ) { - MStatus status; MFnPlugin plugin( obj, PLUGIN_COMPANY, "2025.0", "Any"); - + + MStatus status; + // This is done first, so the strings are available. + status = plugin.registerUIStrings(registerMStringResources, "mayaHydraFootPrintNodeInitStrings"); + if (status != MS::kSuccess) + { + status.perror("registerUIStrings"); + return status; + } + status = plugin.registerNode( - "MhFootPrint", + kMhFootPrintNodePluginId, MhFootPrint::id, &MhFootPrint::creator, &MhFootPrint::initialize, From e3184227bf913bbbb1f48fb2e75ad2b8b5944239 Mon Sep 17 00:00:00 2001 From: David Lanier Date: Tue, 20 Feb 2024 17:40:00 +0100 Subject: [PATCH 07/14] Forgot a file. --- .../footPrintNode/mhFootPrintNodeStrings.h | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 lib/mayaHydra/flowViewportAPIExamples/footPrintNode/mhFootPrintNodeStrings.h diff --git a/lib/mayaHydra/flowViewportAPIExamples/footPrintNode/mhFootPrintNodeStrings.h b/lib/mayaHydra/flowViewportAPIExamples/footPrintNode/mhFootPrintNodeStrings.h new file mode 100644 index 0000000000..b7562c0296 --- /dev/null +++ b/lib/mayaHydra/flowViewportAPIExamples/footPrintNode/mhFootPrintNodeStrings.h @@ -0,0 +1,38 @@ +// +// Copyright 2024 Autodesk, Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#ifndef _MAYAHYDRA_FOOT_PRINT_NODE_STRINGS_ +#define _MAYAHYDRA_FOOT_PRINT_NODE_STRINGS_ + +//////////////////////////////////////////////////////////////////////////////// +// +// Foot Print Node hydra plugin localization strings +// +//////////////////////////////////////////////////////////////////////////////// + +#include +#include +// MStringResourceIds contain plug-in id, unique resource id for +// each string and the default value for the string. + +#define kMhFootPrintNodePluginId "MhFootPrint" + +// If a MStringResourceId is added to this list, please register in registerMStringRes() +// in mhFootPrintNode.cpp + +#define rMayaHydraNotLoadedStringError MStringResourceId( kMhFootPrintNodePluginId, "rMayaHydraNotLoadedStringError", "You need to load the mayaHydra plugin before creating this node.") + +#endif //_MAYAHYDRA_FOOT_PRINT_NODE_STRINGS_ From 8469e76c52c3a3054bfc6672eea008f8114e0558 Mon Sep 17 00:00:00 2001 From: David Lanier Date: Wed, 21 Feb 2024 11:11:45 +0100 Subject: [PATCH 08/14] HYDRA-307 : modifications from code review --- .../flowViewportAPIMayaLocator.cpp | 2 +- .../footPrintNode/mhFootPrintNode.cpp | 6 +++--- .../mayaUsd/render/mayaToHydra/testFlowViewportAPI.py | 10 +++++----- .../mayaUsd/render/mayaToHydra/testFootPrintNode.py | 8 ++++---- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/lib/mayaHydra/flowViewportAPIExamples/flowViewportAPIMayaLocator/flowViewportAPIMayaLocator.cpp b/lib/mayaHydra/flowViewportAPIExamples/flowViewportAPIMayaLocator/flowViewportAPIMayaLocator.cpp index 98912a06ce..4fb43a1385 100644 --- a/lib/mayaHydra/flowViewportAPIExamples/flowViewportAPIMayaLocator/flowViewportAPIMayaLocator.cpp +++ b/lib/mayaHydra/flowViewportAPIExamples/flowViewportAPIMayaLocator/flowViewportAPIMayaLocator.cpp @@ -271,7 +271,7 @@ namespace }//end of anonymous namespace //Initialization of static members -MTypeId FlowViewportAPIMayaLocator::id( 0x00080100 ); +MTypeId FlowViewportAPIMayaLocator::id( 0x00080101 ); MString FlowViewportAPIMayaLocator::nodeClassification("hydraAPIExample/geometry/FlowViewportAPIMayaLocator"); MObject FlowViewportAPIMayaLocator::mNumCubeLevelsX; diff --git a/lib/mayaHydra/flowViewportAPIExamples/footPrintNode/mhFootPrintNode.cpp b/lib/mayaHydra/flowViewportAPIExamples/footPrintNode/mhFootPrintNode.cpp index b35eff7389..ed020f656d 100644 --- a/lib/mayaHydra/flowViewportAPIExamples/footPrintNode/mhFootPrintNode.cpp +++ b/lib/mayaHydra/flowViewportAPIExamples/footPrintNode/mhFootPrintNode.cpp @@ -366,7 +366,7 @@ namespace std::atomic_int MhFootPrint::_counter {0}; MObject MhFootPrint::mSize; MObject MhFootPrint::mColor; -MTypeId MhFootPrint::id( 0x00080101 ); +MTypeId MhFootPrint::id( 0x00080102 ); MString MhFootPrint::nodeClassification("hydraAPIExample/geometry/footPrint"); MObject MhFootPrint::mWorldS; MObject MhFootPrint::mDummyInput; @@ -568,9 +568,9 @@ MBoundingBox MhFootPrint::boundingBox() const void* MhFootPrint::creator() { int isMayaHydraLoaded = false; - // Validate that the gpuCache plugin is loaded. + // Validate that the mayaHydra plugin is loaded. MGlobal::executeCommand( "pluginInfo -query -loaded mayaHydra", isMayaHydraLoaded ); - if( ! isMayaHydraLoaded){ + if( ! isMayaHydraLoaded){ MStatus status; MString errorString = MStringResource::getString(rMayaHydraNotLoadedStringError, status); if (! status){ diff --git a/test/lib/mayaUsd/render/mayaToHydra/testFlowViewportAPI.py b/test/lib/mayaUsd/render/mayaToHydra/testFlowViewportAPI.py index 889833fff6..0414af0b8c 100644 --- a/test/lib/mayaUsd/render/mayaToHydra/testFlowViewportAPI.py +++ b/test/lib/mayaUsd/render/mayaToHydra/testFlowViewportAPI.py @@ -102,7 +102,7 @@ def test_AddingPrimitives(self): self.setHdStormRenderer() self.assertSnapshotClose("add_VP2AndThenBackToStorm.png", self.IMAGE_DIFF_FAIL_THRESHOLD, self.IMAGE_DIFF_FAIL_PERCENT) - #Finish by a File New command + #Finish by a File New command to check that it's not crashing when cleaning up everything cmds.file(new=True, force=True) #Test filtering primitives @@ -185,7 +185,7 @@ def test_FilteringPrimitives(self): cmds.refresh() self.assertSnapshotClose("filter_VP2AndThenBackToStorm_MovedSphereUnFiltered.png", self.IMAGE_DIFF_FAIL_THRESHOLD, self.IMAGE_DIFF_FAIL_PERCENT) - #Finish by a File New command + #Finish by a File New command to check that it's not crashing when cleaning up everything cmds.file(new=True, force=True) #Test Cube grids parameters @@ -241,7 +241,7 @@ def test_CubeGrid(self): self.setHdStormRenderer() self.assertSnapshotClose("cubeGrid_VP2AndThenBackToStorm.png", self.IMAGE_DIFF_FAIL_THRESHOLD, self.IMAGE_DIFF_FAIL_PERCENT) - #Finish by a File New command + #Finish by a File New command to check that it's not crashing when cleaning up everything cmds.file(new=True, force=True) #Test multiple nodes @@ -345,7 +345,7 @@ def test_MultipleNodes(self): self.setHdStormRenderer() self.assertSnapshotClose("multipleNodes_VP2AndThenBackToStorm.png", self.IMAGE_DIFF_FAIL_THRESHOLD, self.IMAGE_DIFF_FAIL_PERCENT) - #Finish by a File New command + #Finish by a File New command to check that it's not crashing when cleaning up everything cmds.file(new=True, force=True) #Test multiple viewports @@ -425,7 +425,7 @@ def test_MultipleViewports(self): self.setHdStormRenderer() self.assertSnapshotClose("multipleViewports_VP2AndThenBackToStorm_modPan2.png", self.IMAGE_DIFF_FAIL_THRESHOLD, self.IMAGE_DIFF_FAIL_PERCENT) - #Finish by a File New command + #Finish by a File New command to check that it's not crashing when cleaning up everything cmds.file(new=True, force=True) if __name__ == '__main__': fixturesUtils.runTests(globals()) diff --git a/test/lib/mayaUsd/render/mayaToHydra/testFootPrintNode.py b/test/lib/mayaUsd/render/mayaToHydra/testFootPrintNode.py index 45d5bb7fce..025a381688 100644 --- a/test/lib/mayaUsd/render/mayaToHydra/testFootPrintNode.py +++ b/test/lib/mayaUsd/render/mayaToHydra/testFootPrintNode.py @@ -105,7 +105,7 @@ def test_AddingPrimitives(self): self.setHdStormRenderer() self.assertSnapshotClose("add_VP2AndThenBackToStorm.png", self.imageDiffFailThreshold, self.imageDiffFailPercent) - #Finish by a File New command + #Finish by a File New command to check that it's not crashing when cleaning up everything' cmds.file(new=True, force=True) #Test FootPrint grids parameters @@ -133,7 +133,7 @@ def test_FootPrintAttributes(self): self.setHdStormRenderer() self.assertSnapshotClose("footPrint_VP2AndThenBackToStorm.png", self.imageDiffFailThreshold, self.imageDiffFailPercent) - #Finish by a File New command + #Finish by a File New command to check that it's not crashing when cleaning up everything cmds.file(new=True, force=True) #Test multiple nodes @@ -204,7 +204,7 @@ def test_MultipleNodes(self): self.setHdStormRenderer() self.assertSnapshotClose("multipleNodes_VP2AndThenBackToStorm.png", self.imageDiffFailThreshold, self.imageDiffFailPercent) - #Finish by a File New command + #Finish by a File New command to check that it's not crashing when cleaning up everything cmds.file(new=True, force=True) #Test multiple viewports @@ -260,7 +260,7 @@ def test_MultipleViewports(self): self.setHdStormRenderer() self.assertSnapshotClose("multipleViewports_VP2AndThenBackToStorm_modPan3.png", self.imageDiffFailThreshold, self.imageDiffFailPercent) - #Finish by a File New command + #Finish by a File New command to check that it's not crashing when cleaning up everything cmds.file(new=True, force=True) #Test loading a scene From ff34ce0cb80b804e6229a23e605dfabd5dfb92f2 Mon Sep 17 00:00:00 2001 From: David Lanier Date: Thu, 22 Feb 2024 11:00:40 +0100 Subject: [PATCH 09/14] Use a postConstructor method --- .../footPrintNode/mhFootPrintNode.cpp | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/lib/mayaHydra/flowViewportAPIExamples/footPrintNode/mhFootPrintNode.cpp b/lib/mayaHydra/flowViewportAPIExamples/footPrintNode/mhFootPrintNode.cpp index ed020f656d..c1208ce306 100644 --- a/lib/mayaHydra/flowViewportAPIExamples/footPrintNode/mhFootPrintNode.cpp +++ b/lib/mayaHydra/flowViewportAPIExamples/footPrintNode/mhFootPrintNode.cpp @@ -71,6 +71,9 @@ class MhFootPrint : public MPxLocatorNode MhFootPrint(); ~MhFootPrint() override; + //Is called when the MObject has been constructed and is valid + void postConstructor() override; + MStatus compute( const MPlug& plug, MDataBlock& data ) override; bool isBounded() const override; @@ -124,9 +127,6 @@ class MhFootPrint : public MPxLocatorNode MCallbackId _cbAfterOpenId = 0; ///To hold the attributeChangedCallback Id to be able to react when the 3D grid creation parameters attributes from this node change. MCallbackId _cbAttributeChangedId = 0; - - /// Init flag to do things only once for this node - bool _init = false; }; namespace @@ -366,7 +366,7 @@ namespace std::atomic_int MhFootPrint::_counter {0}; MObject MhFootPrint::mSize; MObject MhFootPrint::mColor; -MTypeId MhFootPrint::id( 0x00080102 ); +MTypeId MhFootPrint::id( 0x58000087 ); MString MhFootPrint::nodeClassification("hydraAPIExample/geometry/footPrint"); MObject MhFootPrint::mWorldS; MObject MhFootPrint::mDummyInput; @@ -388,6 +388,11 @@ namespace { MhFootPrint::MhFootPrint() { +} + +void MhFootPrint::postConstructor() +{ + //We have a valid MObject in this function _solePath = SdfPath(std::string("/sole_") + std::to_string(_counter)); _heelPath = SdfPath(std::string("/heel_") + std::to_string(_counter)); _counter++; @@ -396,6 +401,8 @@ MhFootPrint::MhFootPrint() _cbAfterOpenId = MSceneMessage::addCallback(MSceneMessage::kAfterOpen, afterOpenCallback, ((void*)this)) ; _retainedSceneIndex = HdRetainedSceneIndex::New(); + + _CreateAndAddFootPrintPrimitives(); } MhFootPrint::~MhFootPrint() @@ -529,12 +536,7 @@ GfVec3f MhFootPrint::_GetColor() const MStatus MhFootPrint::compute( const MPlug& plug, MDataBlock& dataBlock) { - if( ! _init){ - _CreateAndAddFootPrintPrimitives(); - _init = true; - } - - //The MObject can change if the node gets deleted and deletion being undone, so always update it in our records + //The MObject can change if the node gets deleted and deletion being undone if (! _thisMObject.isValid()){ setupFlowViewportInterface(); } From 6c72b69fa14a54b1d13cff4af7517acfa3429f47 Mon Sep 17 00:00:00 2001 From: David Lanier Date: Thu, 22 Feb 2024 11:47:30 +0100 Subject: [PATCH 10/14] Fix tests failing. --- .../footPrintNode/mhFootPrintNode.cpp | 35 +++++-------------- 1 file changed, 9 insertions(+), 26 deletions(-) diff --git a/lib/mayaHydra/flowViewportAPIExamples/footPrintNode/mhFootPrintNode.cpp b/lib/mayaHydra/flowViewportAPIExamples/footPrintNode/mhFootPrintNode.cpp index c1208ce306..2f870572ab 100644 --- a/lib/mayaHydra/flowViewportAPIExamples/footPrintNode/mhFootPrintNode.cpp +++ b/lib/mayaHydra/flowViewportAPIExamples/footPrintNode/mhFootPrintNode.cpp @@ -80,8 +80,7 @@ class MhFootPrint : public MPxLocatorNode MBoundingBox boundingBox() const override; void setupFlowViewportInterface(); - void UpdateFootPrintPrims(); - void TriggerACallToCompute(); + void updateFootPrintPrims(); static void * creator(); static MStatus initialize(); @@ -334,7 +333,7 @@ namespace (parentPlug == MhFootPrint::mColor) || (plug == MhFootPrint::mColor) ){ - footPrint->UpdateFootPrintPrims(); + footPrint->updateFootPrintPrims(); } } @@ -382,7 +381,8 @@ namespace { //Trigger a call to compute so that everything is initialized MhFootPrint* footPrintInstance = reinterpret_cast(clientData); - footPrintInstance->TriggerACallToCompute(); + footPrintInstance->updateFootPrintPrims(); + footPrintInstance->setupFlowViewportInterface(); } } @@ -400,6 +400,10 @@ void MhFootPrint::postConstructor() //Add a callback after a load scene _cbAfterOpenId = MSceneMessage::addCallback(MSceneMessage::kAfterOpen, afterOpenCallback, ((void*)this)) ; + //Add the callback when an attribute of this node changes + MObject obj = _thisMObject.object(); + _cbAttributeChangedId = MNodeMessage::addAttributeChangedCallback(obj, attributeChangedCallback, ((void*)this)); + _retainedSceneIndex = HdRetainedSceneIndex::New(); _CreateAndAddFootPrintPrimitives(); @@ -442,33 +446,12 @@ void MhFootPrint::_RemoveFootPrintPrimitives() } //To update we need to remove the previous primitives and create new ones -void MhFootPrint::UpdateFootPrintPrims() +void MhFootPrint::updateFootPrintPrims() { _RemoveFootPrintPrimitives(); _CreateAndAddFootPrintPrimitives(); } -void MhFootPrint::TriggerACallToCompute() -{ - { - MPlug plug(thisMObject(), mDummyInput); - if (!plug.isNull()) - { - int dummyInputVal; - if (plug.getValue(dummyInputVal)) - { - plug.setValue(dummyInputVal + 1);//Dirty one parameter that affects the mDummyOutput attribute - MPlug plugOutput(thisMObject(), mDummyOutput); - if (!plugOutput.isNull()) - { - int dummyOutputVal; - plugOutput.getValue(dummyOutputVal);//This will trigger a call to compute - } - } - } - } -} - void MhFootPrint::_UpdateThisMObject() { if (_thisMObject.isValid()){ From eff7ba8689bcfe5db288d514517fba122b1e90a5 Mon Sep 17 00:00:00 2001 From: David Lanier Date: Thu, 22 Feb 2024 17:30:39 +0100 Subject: [PATCH 11/14] Do not use localized strings yet for error messages. --- .../footPrintNode/CMakeLists.txt | 1 - .../footPrintNode/mhFootPrintNode.cpp | 34 +++-------------- .../footPrintNode/mhFootPrintNodeStrings.h | 38 ------------------- 3 files changed, 6 insertions(+), 67 deletions(-) delete mode 100644 lib/mayaHydra/flowViewportAPIExamples/footPrintNode/mhFootPrintNodeStrings.h diff --git a/lib/mayaHydra/flowViewportAPIExamples/footPrintNode/CMakeLists.txt b/lib/mayaHydra/flowViewportAPIExamples/footPrintNode/CMakeLists.txt index a5f6d2adf5..6ff03b6b0f 100644 --- a/lib/mayaHydra/flowViewportAPIExamples/footPrintNode/CMakeLists.txt +++ b/lib/mayaHydra/flowViewportAPIExamples/footPrintNode/CMakeLists.txt @@ -12,7 +12,6 @@ target_sources(${TARGET_NAME} set(HEADERS PRIVATE - mhFootPrintNodeStrings.h ) # ----------------------------------------------------------------------------- diff --git a/lib/mayaHydra/flowViewportAPIExamples/footPrintNode/mhFootPrintNode.cpp b/lib/mayaHydra/flowViewportAPIExamples/footPrintNode/mhFootPrintNode.cpp index 2f870572ab..db437578e7 100644 --- a/lib/mayaHydra/flowViewportAPIExamples/footPrintNode/mhFootPrintNode.cpp +++ b/lib/mayaHydra/flowViewportAPIExamples/footPrintNode/mhFootPrintNode.cpp @@ -27,9 +27,6 @@ // //////////////////////////////////////////////////////////////////////// -//Local headers -#include "mhFootPrintNodeStrings.h" - //maya headers #include #include @@ -351,15 +348,8 @@ namespace MFnNumericData fnData(oDouble3); fnData.getData( outVal[0], outVal[1], outVal[2] ); } - - // Register all strings used by the plugin C++ code - static MStatus registerMStringResources() - { - MStringResource::registerString(rMayaHydraNotLoadedStringError); - return MS::kSuccess; - } - -}//end of anonymous namespace +} +//end of anonymous namespace //Static variables init std::atomic_int MhFootPrint::_counter {0}; @@ -552,17 +542,13 @@ MBoundingBox MhFootPrint::boundingBox() const void* MhFootPrint::creator() { + static const MString errorString("You need to load the mayaHydra plugin before creating this node."); + int isMayaHydraLoaded = false; // Validate that the mayaHydra plugin is loaded. MGlobal::executeCommand( "pluginInfo -query -loaded mayaHydra", isMayaHydraLoaded ); if( ! isMayaHydraLoaded){ - MStatus status; - MString errorString = MStringResource::getString(rMayaHydraNotLoadedStringError, status); - if (! status){ - status.perror("Cannot retrieve the rMayaHydraNotLoadedStringError string, but you need to load mayaHydra before creating this node"); - }else{ - MGlobal::displayError(errorString); - } + MGlobal::displayError(errorString); return nullptr; } @@ -636,16 +622,8 @@ MStatus initializePlugin( MObject obj ) MFnPlugin plugin( obj, PLUGIN_COMPANY, "2025.0", "Any"); MStatus status; - // This is done first, so the strings are available. - status = plugin.registerUIStrings(registerMStringResources, "mayaHydraFootPrintNodeInitStrings"); - if (status != MS::kSuccess) - { - status.perror("registerUIStrings"); - return status; - } - status = plugin.registerNode( - kMhFootPrintNodePluginId, + "MhFootPrint", MhFootPrint::id, &MhFootPrint::creator, &MhFootPrint::initialize, diff --git a/lib/mayaHydra/flowViewportAPIExamples/footPrintNode/mhFootPrintNodeStrings.h b/lib/mayaHydra/flowViewportAPIExamples/footPrintNode/mhFootPrintNodeStrings.h deleted file mode 100644 index b7562c0296..0000000000 --- a/lib/mayaHydra/flowViewportAPIExamples/footPrintNode/mhFootPrintNodeStrings.h +++ /dev/null @@ -1,38 +0,0 @@ -// -// Copyright 2024 Autodesk, Inc. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#ifndef _MAYAHYDRA_FOOT_PRINT_NODE_STRINGS_ -#define _MAYAHYDRA_FOOT_PRINT_NODE_STRINGS_ - -//////////////////////////////////////////////////////////////////////////////// -// -// Foot Print Node hydra plugin localization strings -// -//////////////////////////////////////////////////////////////////////////////// - -#include -#include -// MStringResourceIds contain plug-in id, unique resource id for -// each string and the default value for the string. - -#define kMhFootPrintNodePluginId "MhFootPrint" - -// If a MStringResourceId is added to this list, please register in registerMStringRes() -// in mhFootPrintNode.cpp - -#define rMayaHydraNotLoadedStringError MStringResourceId( kMhFootPrintNodePluginId, "rMayaHydraNotLoadedStringError", "You need to load the mayaHydra plugin before creating this node.") - -#endif //_MAYAHYDRA_FOOT_PRINT_NODE_STRINGS_ From d8d2779037b0c3149f73b80895487b602a624bff Mon Sep 17 00:00:00 2001 From: David Lanier Date: Fri, 23 Feb 2024 14:23:26 +0100 Subject: [PATCH 12/14] HYDRA-307 : Modifs from code review. --- .../render/mayaToHydra/testFlowViewportAPI.py | 19 +- .../render/mayaToHydra/testFootPrintNode.py | 23 +- .../testFootPrintNode/testFootPrintNode.ma | 215 ------------------ 3 files changed, 12 insertions(+), 245 deletions(-) delete mode 100644 test/testSamples/testFootPrintNode/testFootPrintNode.ma diff --git a/test/lib/mayaUsd/render/mayaToHydra/testFlowViewportAPI.py b/test/lib/mayaUsd/render/mayaToHydra/testFlowViewportAPI.py index 0414af0b8c..7e4ce4cd3e 100644 --- a/test/lib/mayaUsd/render/mayaToHydra/testFlowViewportAPI.py +++ b/test/lib/mayaUsd/render/mayaToHydra/testFlowViewportAPI.py @@ -38,6 +38,11 @@ class TestFlowViewportAPI(mtohUtils.MtohTestCase): #Subclassing mtohUtils.MtohTe IMAGE_DIFF_FAIL_THRESHOLD = 0.1 IMAGE_DIFF_FAIL_PERCENT = 2 + @classmethod + def tearDownClass(cls): + #Finish by a File New command to check that it's not crashing when cleaning up everything' + cmds.file(new=True, force=True) + def setupScene(self): self.setHdStormRenderer() @@ -102,9 +107,6 @@ def test_AddingPrimitives(self): self.setHdStormRenderer() self.assertSnapshotClose("add_VP2AndThenBackToStorm.png", self.IMAGE_DIFF_FAIL_THRESHOLD, self.IMAGE_DIFF_FAIL_PERCENT) - #Finish by a File New command to check that it's not crashing when cleaning up everything - cmds.file(new=True, force=True) - #Test filtering primitives def test_FilteringPrimitives(self): self.setupScene() @@ -184,9 +186,6 @@ def test_FilteringPrimitives(self): cmds.setAttr(sphereShape + '.subdivisionsAxis', 30) #Unfilter the prim cmds.refresh() self.assertSnapshotClose("filter_VP2AndThenBackToStorm_MovedSphereUnFiltered.png", self.IMAGE_DIFF_FAIL_THRESHOLD, self.IMAGE_DIFF_FAIL_PERCENT) - - #Finish by a File New command to check that it's not crashing when cleaning up everything - cmds.file(new=True, force=True) #Test Cube grids parameters def test_CubeGrid(self): @@ -241,9 +240,6 @@ def test_CubeGrid(self): self.setHdStormRenderer() self.assertSnapshotClose("cubeGrid_VP2AndThenBackToStorm.png", self.IMAGE_DIFF_FAIL_THRESHOLD, self.IMAGE_DIFF_FAIL_PERCENT) - #Finish by a File New command to check that it's not crashing when cleaning up everything - cmds.file(new=True, force=True) - #Test multiple nodes def test_MultipleNodes(self): self.setupScene() @@ -345,9 +341,6 @@ def test_MultipleNodes(self): self.setHdStormRenderer() self.assertSnapshotClose("multipleNodes_VP2AndThenBackToStorm.png", self.IMAGE_DIFF_FAIL_THRESHOLD, self.IMAGE_DIFF_FAIL_PERCENT) - #Finish by a File New command to check that it's not crashing when cleaning up everything - cmds.file(new=True, force=True) - #Test multiple viewports def test_MultipleViewports(self): with PluginLoaded('flowViewportAPIMayaLocator'): @@ -425,7 +418,5 @@ def test_MultipleViewports(self): self.setHdStormRenderer() self.assertSnapshotClose("multipleViewports_VP2AndThenBackToStorm_modPan2.png", self.IMAGE_DIFF_FAIL_THRESHOLD, self.IMAGE_DIFF_FAIL_PERCENT) - #Finish by a File New command to check that it's not crashing when cleaning up everything - cmds.file(new=True, force=True) if __name__ == '__main__': fixturesUtils.runTests(globals()) diff --git a/test/lib/mayaUsd/render/mayaToHydra/testFootPrintNode.py b/test/lib/mayaUsd/render/mayaToHydra/testFootPrintNode.py index 025a381688..ba4a583043 100644 --- a/test/lib/mayaUsd/render/mayaToHydra/testFootPrintNode.py +++ b/test/lib/mayaUsd/render/mayaToHydra/testFootPrintNode.py @@ -38,12 +38,15 @@ def imageDiffFailThreshold(self): def imageDiffFailPercent(self): return 0.1 + @classmethod + def tearDownClass(cls): + #Finish by a File New command to check that it's not crashing when cleaning up everything' + cmds.file(new=True, force=True) + def setupScene(self): - testFile = mayaUtils.openTestScene( #Is an empty scene that is used to zoom in more on the foot print nodes, it also has Storm already set as the renderer - "testFootPrintNode", - "testFootPrintNode.ma") + self.setHdStormRenderer() + cmds.move(7.714, 5.786, 7.714, 'persp') cmds.refresh() - self.setHdStormRenderer()#set Storm as the renderer (even if the scene is supposed to have it already) #Test adding primitives def test_AddingPrimitives(self): @@ -105,9 +108,6 @@ def test_AddingPrimitives(self): self.setHdStormRenderer() self.assertSnapshotClose("add_VP2AndThenBackToStorm.png", self.imageDiffFailThreshold, self.imageDiffFailPercent) - #Finish by a File New command to check that it's not crashing when cleaning up everything' - cmds.file(new=True, force=True) - #Test FootPrint grids parameters def test_FootPrintAttributes(self): with PluginLoaded('mayaHydraFootPrintNode'): @@ -133,9 +133,6 @@ def test_FootPrintAttributes(self): self.setHdStormRenderer() self.assertSnapshotClose("footPrint_VP2AndThenBackToStorm.png", self.imageDiffFailThreshold, self.imageDiffFailPercent) - #Finish by a File New command to check that it's not crashing when cleaning up everything - cmds.file(new=True, force=True) - #Test multiple nodes def test_MultipleNodes(self): with PluginLoaded('mayaHydraFootPrintNode'): @@ -204,9 +201,6 @@ def test_MultipleNodes(self): self.setHdStormRenderer() self.assertSnapshotClose("multipleNodes_VP2AndThenBackToStorm.png", self.imageDiffFailThreshold, self.imageDiffFailPercent) - #Finish by a File New command to check that it's not crashing when cleaning up everything - cmds.file(new=True, force=True) - #Test multiple viewports def test_MultipleViewports(self): with PluginLoaded('mayaHydraFootPrintNode'): @@ -260,9 +254,6 @@ def test_MultipleViewports(self): self.setHdStormRenderer() self.assertSnapshotClose("multipleViewports_VP2AndThenBackToStorm_modPan3.png", self.imageDiffFailThreshold, self.imageDiffFailPercent) - #Finish by a File New command to check that it's not crashing when cleaning up everything - cmds.file(new=True, force=True) - #Test loading a scene def test_Load(self): with PluginLoaded('mayaHydraFootPrintNode'): diff --git a/test/testSamples/testFootPrintNode/testFootPrintNode.ma b/test/testSamples/testFootPrintNode/testFootPrintNode.ma deleted file mode 100644 index 07c7bf1dfe..0000000000 --- a/test/testSamples/testFootPrintNode/testFootPrintNode.ma +++ /dev/null @@ -1,215 +0,0 @@ -//Maya ASCII 2026ff01 scene -//Name: testFootPrintNode.ma -//Last modified: Wed, Feb 14, 2024 05:36:52 PM -//Codeset: 1252 -requires maya "2026ff01"; -requires -nodeType "mayaUsdLayerManager" -dataType "pxrUsdStageData" "mayaUsdPlugin" "0.28.0"; -currentUnit -l centimeter -a degree -t film; -fileInfo "application" "maya"; -fileInfo "product" "Maya 2025"; -fileInfo "version" "Preview Release 153"; -fileInfo "cutIdentifier" "202402011613-000000"; -fileInfo "osv" "Windows 10 Enterprise v2009 (Build: 19045)"; -fileInfo "UUID" "3307B759-409E-49EA-B026-3FA1B9314D1E"; -createNode transform -s -n "persp"; - rename -uid "60CEECE7-4524-3435-33A9-CBBE94B70019"; - setAttr ".v" no; - setAttr ".t" -type "double3" 7.7140018334377451 5.7855013750782884 7.7140018334377292 ; - setAttr ".r" -type "double3" -27.938352729602379 44.999999999999972 -5.172681101354183e-14 ; -createNode camera -s -n "perspShape" -p "persp"; - rename -uid "F08B569C-4B20-1B04-CAC9-D8A17D42CF42"; - setAttr -k off ".v" no; - setAttr ".fl" 34.999999999999993; - setAttr ".coi" 12.348428026821633; - setAttr ".imn" -type "string" "persp"; - setAttr ".den" -type "string" "persp_depth"; - setAttr ".man" -type "string" "persp_mask"; - setAttr ".hc" -type "string" "viewSet -p %camera"; -createNode transform -s -n "top"; - rename -uid "10757077-4689-483A-0233-088DF1797409"; - setAttr ".v" no; - setAttr ".t" -type "double3" 0 1000.1 0 ; - setAttr ".r" -type "double3" -90 0 0 ; -createNode camera -s -n "topShape" -p "top"; - rename -uid "66A1BA86-4E94-CEC8-E62A-A289C5063824"; - setAttr -k off ".v" no; - setAttr ".rnd" no; - setAttr ".coi" 1000.1; - setAttr ".ow" 30; - setAttr ".imn" -type "string" "top"; - setAttr ".den" -type "string" "top_depth"; - setAttr ".man" -type "string" "top_mask"; - setAttr ".hc" -type "string" "viewSet -t %camera"; - setAttr ".o" yes; -createNode transform -s -n "front"; - rename -uid "809483A6-4AAF-4A40-B4DD-C49622814551"; - setAttr ".v" no; - setAttr ".t" -type "double3" 0 0 1000.1 ; -createNode camera -s -n "frontShape" -p "front"; - rename -uid "FBD1A55D-463A-7DF3-BE96-01AB88BA52D4"; - setAttr -k off ".v" no; - setAttr ".rnd" no; - setAttr ".coi" 1000.1; - setAttr ".ow" 30; - setAttr ".imn" -type "string" "front"; - setAttr ".den" -type "string" "front_depth"; - setAttr ".man" -type "string" "front_mask"; - setAttr ".hc" -type "string" "viewSet -f %camera"; - setAttr ".o" yes; -createNode transform -s -n "side"; - rename -uid "AB222488-4904-FB92-F2D0-A99AA0F1FC86"; - setAttr ".v" no; - setAttr ".t" -type "double3" 1000.1 0 0 ; - setAttr ".r" -type "double3" 0 90 0 ; -createNode camera -s -n "sideShape" -p "side"; - rename -uid "0444C828-4079-C384-E0D4-56ADE3CAE6CF"; - setAttr -k off ".v" no; - setAttr ".rnd" no; - setAttr ".coi" 1000.1; - setAttr ".ow" 30; - setAttr ".imn" -type "string" "side"; - setAttr ".den" -type "string" "side_depth"; - setAttr ".man" -type "string" "side_mask"; - setAttr ".hc" -type "string" "viewSet -s %camera"; - setAttr ".o" yes; -createNode lightLinker -s -n "lightLinker1"; - rename -uid "A559BD2C-475A-7BEC-A55C-A9B9BF88FFB0"; - setAttr -s 2 ".lnk"; - setAttr -s 2 ".slnk"; -createNode shapeEditorManager -n "shapeEditorManager"; - rename -uid "4D9953B0-48B9-EB14-64C8-6ABE8849CE53"; -createNode poseInterpolatorManager -n "poseInterpolatorManager"; - rename -uid "C200090A-4245-572E-65C3-23912A5A2350"; -createNode displayLayerManager -n "layerManager"; - rename -uid "D8E957BA-4A4B-90E4-F01A-A7A7127E01E1"; -createNode displayLayer -n "defaultLayer"; - rename -uid "2E898437-49A1-B7EA-AAE1-F3A03734C328"; - setAttr ".ufem" -type "stringArray" 0 ; -createNode renderLayerManager -n "renderLayerManager"; - rename -uid "D69E85F6-417F-61B5-E018-C6B5F20B5AE2"; -createNode renderLayer -n "defaultRenderLayer"; - rename -uid "DEF2C8DE-47D8-DA71-F919-9485562306C7"; - setAttr ".g" yes; -createNode mayaUsdLayerManager -n "mayaUsdLayerManager1"; - rename -uid "E483CD75-441A-B36C-D70B-3091BEE48F9D"; - setAttr ".sst" -type "string" ""; -createNode script -n "uiConfigurationScriptNode"; - rename -uid "B5143494-47DF-8214-875C-FA8767BC258E"; - setAttr ".b" -type "string" ( - "// Maya Mel UI Configuration File.\n//\n// This script is machine generated. Edit at your own risk.\n//\n//\n\nglobal string $gMainPane;\nif (`paneLayout -exists $gMainPane`) {\n\n\tglobal int $gUseScenePanelConfig;\n\tint $useSceneConfig = $gUseScenePanelConfig;\n\tint $nodeEditorPanelVisible = stringArrayContains(\"nodeEditorPanel1\", `getPanel -vis`);\n\tint $nodeEditorWorkspaceControlOpen = (`workspaceControl -exists nodeEditorPanel1Window` && `workspaceControl -q -visible nodeEditorPanel1Window`);\n\tint $menusOkayInPanels = `optionVar -q allowMenusInPanels`;\n\tint $nVisPanes = `paneLayout -q -nvp $gMainPane`;\n\tint $nPanes = 0;\n\tstring $editorName;\n\tstring $panelName;\n\tstring $itemFilterName;\n\tstring $panelConfig;\n\n\t//\n\t// get current state of the UI\n\t//\n\tsceneUIReplacement -update $gMainPane;\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"modelPanel\" (localizedPanelLabel(\"Top View\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tmodelPanel -edit -l (localizedPanelLabel(\"Top View\")) -mbv $menusOkayInPanels $panelName;\n" - + "\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"|top\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"smoothShaded\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -holdOuts 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 0\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 32768\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n" - + " -depthOfFieldPreview 1\n -maxConstantTransparency 1\n -rendererName \"vp2Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -controllers 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n" - + " -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -particleInstancers 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -bluePencil 1\n -greasePencils 0\n -excludeObjectPreset \"All\" \n -shadows 0\n -captureSequenceNumber -1\n -width 1\n -height 1\n -sceneRenderFilter 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n" - + "\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"modelPanel\" (localizedPanelLabel(\"Side View\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tmodelPanel -edit -l (localizedPanelLabel(\"Side View\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"|side\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"smoothShaded\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -holdOuts 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 0\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n" - + " -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 32768\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -depthOfFieldPreview 1\n -maxConstantTransparency 1\n -rendererName \"vp2Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n" - + " -interactiveBackFaceCull 0\n -sortTransparent 1\n -controllers 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -particleInstancers 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -bluePencil 1\n -greasePencils 0\n -excludeObjectPreset \"All\" \n" - + " -shadows 0\n -captureSequenceNumber -1\n -width 1\n -height 1\n -sceneRenderFilter 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"modelPanel\" (localizedPanelLabel(\"Front View\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tmodelPanel -edit -l (localizedPanelLabel(\"Front View\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"|front\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"smoothShaded\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -holdOuts 1\n -selectionHiliteDisplay 1\n" - + " -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 0\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 32768\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -depthOfFieldPreview 1\n -maxConstantTransparency 1\n -rendererName \"vp2Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n" - + " -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -controllers 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -particleInstancers 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n" - + " -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -bluePencil 1\n -greasePencils 0\n -excludeObjectPreset \"All\" \n -shadows 0\n -captureSequenceNumber -1\n -width 1\n -height 1\n -sceneRenderFilter 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"modelPanel\" (localizedPanelLabel(\"Persp View\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tmodelPanel -edit -l (localizedPanelLabel(\"Persp View\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n modelEditor -e \n" - + " -camera \"|persp\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"smoothShaded\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -holdOuts 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 0\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 32768\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -depthOfFieldPreview 1\n" - + " -maxConstantTransparency 1\n -rendererName \"vp2Renderer\" \n -rendererOverrideName \"mayaHydraRenderOverride_HdStormRendererPlugin\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -controllers 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n" - + " -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -particleInstancers 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -bluePencil 1\n -greasePencils 0\n -excludeObjectPreset \"All\" \n -shadows 0\n -captureSequenceNumber -1\n -width 1117\n -height 714\n -sceneRenderFilter 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n" - + " $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"outlinerPanel\" (localizedPanelLabel(\"ToggledOutliner\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\toutlinerPanel -edit -l (localizedPanelLabel(\"ToggledOutliner\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n outlinerEditor -e \n -showShapes 1\n -showAssignedMaterials 0\n -showTimeEditor 1\n -showReferenceNodes 1\n -showReferenceMembers 1\n -showAttributes 0\n -showConnected 0\n -showAnimCurvesOnly 0\n -showMuteInfo 0\n -organizeByLayer 1\n -organizeByClip 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 0\n -showDagOnly 1\n -showAssets 1\n -showContainedOnly 1\n -showPublishedAsConnected 0\n -showParentContainers 0\n" - + " -showContainerContents 1\n -ignoreDagHierarchy 0\n -expandConnections 0\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 1\n -showLeafs 1\n -showNumericAttrsOnly 0\n -highlightActive 1\n -autoSelectNewObjects 0\n -doNotSelectNewObjects 0\n -dropIsParent 1\n -transmitFilters 0\n -setFilter \"defaultSetFilter\" \n -showSetMembers 1\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -isSet 0\n -isSetMember 0\n -showUfeItems 1\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n" - + " -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 0\n -mapMotionTrails 0\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n -renderFilterVisible 0\n -renderFilterIndex 0\n -selectionOrder \"chronological\" \n -expandAttribute 0\n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"outlinerPanel\" (localizedPanelLabel(\"Outliner\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\toutlinerPanel -edit -l (localizedPanelLabel(\"Outliner\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n outlinerEditor -e \n -showShapes 0\n -showAssignedMaterials 0\n -showTimeEditor 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 0\n -showConnected 0\n -showAnimCurvesOnly 0\n" - + " -showMuteInfo 0\n -organizeByLayer 1\n -organizeByClip 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 0\n -showDagOnly 1\n -showAssets 1\n -showContainedOnly 1\n -showPublishedAsConnected 0\n -showParentContainers 0\n -showContainerContents 1\n -ignoreDagHierarchy 0\n -expandConnections 0\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 1\n -showLeafs 1\n -showNumericAttrsOnly 0\n -highlightActive 1\n -autoSelectNewObjects 0\n -doNotSelectNewObjects 0\n -dropIsParent 1\n -transmitFilters 0\n -setFilter \"defaultSetFilter\" \n -showSetMembers 1\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -showUfeItems 1\n -displayMode \"DAG\" \n -expandObjects 0\n" - + " -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 0\n -mapMotionTrails 0\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n -renderFilterVisible 0\n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"graphEditor\" (localizedPanelLabel(\"Graph Editor\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Graph Editor\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = ($panelName+\"OutlineEd\");\n outlinerEditor -e \n" - + " -showShapes 1\n -showAssignedMaterials 0\n -showTimeEditor 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 1\n -showConnected 1\n -showAnimCurvesOnly 1\n -showMuteInfo 0\n -organizeByLayer 1\n -organizeByClip 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 1\n -showDagOnly 0\n -showAssets 1\n -showContainedOnly 0\n -showPublishedAsConnected 0\n -showParentContainers 0\n -showContainerContents 0\n -ignoreDagHierarchy 0\n -expandConnections 1\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 0\n -showLeafs 1\n -showNumericAttrsOnly 1\n -highlightActive 0\n -autoSelectNewObjects 1\n" - + " -doNotSelectNewObjects 0\n -dropIsParent 1\n -transmitFilters 1\n -setFilter \"0\" \n -showSetMembers 0\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -showUfeItems 1\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 1\n -mapMotionTrails 1\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n -renderFilterVisible 0\n" - + " $editorName;\n\n\t\t\t$editorName = ($panelName+\"GraphEd\");\n animCurveEditor -e \n -displayValues 0\n -snapTime \"integer\" \n -snapValue \"none\" \n -showPlayRangeShades \"on\" \n -lockPlayRangeShades \"off\" \n -smoothness \"fine\" \n -resultSamples 1\n -resultScreenSamples 0\n -resultUpdate \"delayed\" \n -showUpstreamCurves 1\n -keyMinScale 1\n -stackedCurvesMin -1\n -stackedCurvesMax 1\n -stackedCurvesSpace 0.2\n -preSelectionHighlight 1\n -limitToSelectedCurves 0\n -constrainDrag 0\n -valueLinesToggle 0\n -highlightAffectedCurves 0\n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"dopeSheetPanel\" (localizedPanelLabel(\"Dope Sheet\")) `;\n" - + "\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Dope Sheet\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = ($panelName+\"OutlineEd\");\n outlinerEditor -e \n -showShapes 1\n -showAssignedMaterials 0\n -showTimeEditor 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 1\n -showConnected 1\n -showAnimCurvesOnly 1\n -showMuteInfo 0\n -organizeByLayer 1\n -organizeByClip 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 1\n -showDagOnly 0\n -showAssets 1\n -showContainedOnly 0\n -showPublishedAsConnected 0\n -showParentContainers 0\n -showContainerContents 0\n -ignoreDagHierarchy 0\n -expandConnections 1\n" - + " -showUpstreamCurves 1\n -showUnitlessCurves 0\n -showCompounds 0\n -showLeafs 1\n -showNumericAttrsOnly 1\n -highlightActive 0\n -autoSelectNewObjects 0\n -doNotSelectNewObjects 1\n -dropIsParent 1\n -transmitFilters 0\n -setFilter \"0\" \n -showSetMembers 1\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -showUfeItems 1\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n" - + " -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 0\n -mapMotionTrails 1\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n -renderFilterVisible 0\n $editorName;\n\n\t\t\t$editorName = ($panelName+\"DopeSheetEd\");\n dopeSheetEditor -e \n -displayValues 0\n -snapTime \"none\" \n -snapValue \"none\" \n -outliner \"dopeSheetPanel1OutlineEd\" \n -hierarchyBelow 0\n -selectionWindow 0 0 0 0 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"timeEditorPanel\" (localizedPanelLabel(\"Time Editor\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Time Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n" - + "\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"clipEditorPanel\" (localizedPanelLabel(\"Trax Editor\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Trax Editor\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = clipEditorNameFromPanel($panelName);\n clipEditor -e \n -displayValues 0\n -snapTime \"none\" \n -snapValue \"none\" \n -initialized 0\n -manageSequencer 0 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"sequenceEditorPanel\" (localizedPanelLabel(\"Camera Sequencer\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Camera Sequencer\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = sequenceEditorNameFromPanel($panelName);\n clipEditor -e \n -displayValues 0\n" - + " -snapTime \"none\" \n -snapValue \"none\" \n -initialized 0\n -manageSequencer 1 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"hyperGraphPanel\" (localizedPanelLabel(\"Hypergraph Hierarchy\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Hypergraph Hierarchy\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = ($panelName+\"HyperGraphEd\");\n hyperGraph -e \n -graphLayoutStyle \"hierarchicalLayout\" \n -orientation \"horiz\" \n -mergeConnections 0\n -zoom 1\n -animateTransition 0\n -showRelationships 1\n -showShapes 0\n -showDeformers 0\n -showExpressions 0\n -showConstraints 0\n -showConnectionFromSelected 0\n -showConnectionToSelected 0\n" - + " -showConstraintLabels 0\n -showUnderworld 0\n -showInvisible 0\n -transitionFrames 1\n -opaqueContainers 0\n -freeform 0\n -imagePosition 0 0 \n -imageScale 1\n -imageEnabled 0\n -graphType \"DAG\" \n -heatMapDisplay 0\n -updateSelection 1\n -updateNodeAdded 1\n -useDrawOverrideColor 0\n -limitGraphTraversal -1\n -range 0 0 \n -iconSize \"smallIcons\" \n -showCachedConnections 0\n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"hyperShadePanel\" (localizedPanelLabel(\"Hypershade\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Hypershade\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n" - + "\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"visorPanel\" (localizedPanelLabel(\"Visor\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Visor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"nodeEditorPanel\" (localizedPanelLabel(\"Node Editor\")) `;\n\tif ($nodeEditorPanelVisible || $nodeEditorWorkspaceControlOpen) {\n\t\tif (\"\" == $panelName) {\n\t\t\tif ($useSceneConfig) {\n\t\t\t\t$panelName = `scriptedPanel -unParent -type \"nodeEditorPanel\" -l (localizedPanelLabel(\"Node Editor\")) -mbv $menusOkayInPanels `;\n\n\t\t\t$editorName = ($panelName+\"NodeEditorEd\");\n nodeEditor -e \n -allAttributes 0\n -allNodes 0\n -autoSizeNodes 1\n -consistentNameSize 1\n -createNodeCommand \"nodeEdCreateNodeCommand\" \n -connectNodeOnCreation 0\n" - + " -connectOnDrop 0\n -copyConnectionsOnPaste 0\n -connectionStyle \"bezier\" \n -defaultPinnedState 0\n -additiveGraphingMode 0\n -connectedGraphingMode 1\n -settingsChangedCallback \"nodeEdSyncControls\" \n -traversalDepthLimit -1\n -keyPressCommand \"nodeEdKeyPressCommand\" \n -nodeTitleMode \"name\" \n -gridSnap 0\n -gridVisibility 1\n -crosshairOnEdgeDragging 0\n -popupMenuScript \"nodeEdBuildPanelMenus\" \n -showNamespace 1\n -showShapes 1\n -showSGShapes 0\n -showTransforms 1\n -useAssets 1\n -syncedSelection 1\n -extendToShapes 1\n -showUnitConversions 0\n -editorMode \"default\" \n -hasWatchpoint 0\n $editorName;\n\t\t\t}\n\t\t} else {\n\t\t\t$label = `panel -q -label $panelName`;\n" - + "\t\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Node Editor\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = ($panelName+\"NodeEditorEd\");\n nodeEditor -e \n -allAttributes 0\n -allNodes 0\n -autoSizeNodes 1\n -consistentNameSize 1\n -createNodeCommand \"nodeEdCreateNodeCommand\" \n -connectNodeOnCreation 0\n -connectOnDrop 0\n -copyConnectionsOnPaste 0\n -connectionStyle \"bezier\" \n -defaultPinnedState 0\n -additiveGraphingMode 0\n -connectedGraphingMode 1\n -settingsChangedCallback \"nodeEdSyncControls\" \n -traversalDepthLimit -1\n -keyPressCommand \"nodeEdKeyPressCommand\" \n -nodeTitleMode \"name\" \n -gridSnap 0\n -gridVisibility 1\n -crosshairOnEdgeDragging 0\n -popupMenuScript \"nodeEdBuildPanelMenus\" \n -showNamespace 1\n" - + " -showShapes 1\n -showSGShapes 0\n -showTransforms 1\n -useAssets 1\n -syncedSelection 1\n -extendToShapes 1\n -showUnitConversions 0\n -editorMode \"default\" \n -hasWatchpoint 0\n $editorName;\n\t\t\tif (!$useSceneConfig) {\n\t\t\t\tpanel -e -l $label $panelName;\n\t\t\t}\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"createNodePanel\" (localizedPanelLabel(\"Create Node\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Create Node\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"polyTexturePlacementPanel\" (localizedPanelLabel(\"UV Editor\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"UV Editor\")) -mbv $menusOkayInPanels $panelName;\n" - + "\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"renderWindowPanel\" (localizedPanelLabel(\"Render View\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Render View\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"shapePanel\" (localizedPanelLabel(\"Shape Editor\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tshapePanel -edit -l (localizedPanelLabel(\"Shape Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"posePanel\" (localizedPanelLabel(\"Pose Editor\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tposePanel -edit -l (localizedPanelLabel(\"Pose Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n" - + "\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"dynRelEdPanel\" (localizedPanelLabel(\"Dynamic Relationships\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Dynamic Relationships\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"relationshipPanel\" (localizedPanelLabel(\"Relationship Editor\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Relationship Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"referenceEditorPanel\" (localizedPanelLabel(\"Reference Editor\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Reference Editor\")) -mbv $menusOkayInPanels $panelName;\n" - + "\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"dynPaintScriptedPanelType\" (localizedPanelLabel(\"Paint Effects\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Paint Effects\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"scriptEditorPanel\" (localizedPanelLabel(\"Script Editor\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Script Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"profilerPanel\" (localizedPanelLabel(\"Profiler Tool\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Profiler Tool\")) -mbv $menusOkayInPanels $panelName;\n" - + "\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"contentBrowserPanel\" (localizedPanelLabel(\"Content Browser\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Content Browser\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\tif ($useSceneConfig) {\n string $configName = `getPanel -cwl (localizedPanelLabel(\"Current Layout\"))`;\n if (\"\" != $configName) {\n\t\t\tpanelConfiguration -edit -label (localizedPanelLabel(\"Current Layout\")) \n\t\t\t\t-userCreated false\n\t\t\t\t-defaultImage \"vacantCell.xP:/\"\n\t\t\t\t-image \"\"\n\t\t\t\t-sc false\n\t\t\t\t-configString \"global string $gMainPane; paneLayout -e -cn \\\"single\\\" -ps 1 100 100 $gMainPane;\"\n\t\t\t\t-removeAllPanels\n\t\t\t\t-ap false\n\t\t\t\t\t(localizedPanelLabel(\"Persp View\")) \n\t\t\t\t\t\"modelPanel\"\n" - + "\t\t\t\t\t\"$panelName = `modelPanel -unParent -l (localizedPanelLabel(\\\"Persp View\\\")) -mbv $menusOkayInPanels `;\\n$editorName = $panelName;\\nmodelEditor -e \\n -cam `findStartUpCamera persp` \\n -useInteractiveMode 0\\n -displayLights \\\"default\\\" \\n -displayAppearance \\\"smoothShaded\\\" \\n -activeOnly 0\\n -ignorePanZoom 0\\n -wireframeOnShaded 0\\n -headsUpDisplay 1\\n -holdOuts 1\\n -selectionHiliteDisplay 1\\n -useDefaultMaterial 0\\n -bufferMode \\\"double\\\" \\n -twoSidedLighting 0\\n -backfaceCulling 0\\n -xray 0\\n -jointXray 0\\n -activeComponentsXray 0\\n -displayTextures 0\\n -smoothWireframe 0\\n -lineWidth 1\\n -textureAnisotropic 0\\n -textureHilight 1\\n -textureSampling 2\\n -textureDisplay \\\"modulate\\\" \\n -textureMaxSize 32768\\n -fogging 0\\n -fogSource \\\"fragment\\\" \\n -fogMode \\\"linear\\\" \\n -fogStart 0\\n -fogEnd 100\\n -fogDensity 0.1\\n -fogColor 0.5 0.5 0.5 1 \\n -depthOfFieldPreview 1\\n -maxConstantTransparency 1\\n -rendererName \\\"vp2Renderer\\\" \\n -rendererOverrideName \\\"mayaHydraRenderOverride_HdStormRendererPlugin\\\" \\n -objectFilterShowInHUD 1\\n -isFiltered 0\\n -colorResolution 256 256 \\n -bumpResolution 512 512 \\n -textureCompression 0\\n -transparencyAlgorithm \\\"frontAndBackCull\\\" \\n -transpInShadows 0\\n -cullingOverride \\\"none\\\" \\n -lowQualityLighting 0\\n -maximumNumHardwareLights 1\\n -occlusionCulling 0\\n -shadingModel 0\\n -useBaseRenderer 0\\n -useReducedRenderer 0\\n -smallObjectCulling 0\\n -smallObjectThreshold -1 \\n -interactiveDisableShadows 0\\n -interactiveBackFaceCull 0\\n -sortTransparent 1\\n -controllers 1\\n -nurbsCurves 1\\n -nurbsSurfaces 1\\n -polymeshes 1\\n -subdivSurfaces 1\\n -planes 1\\n -lights 1\\n -cameras 1\\n -controlVertices 1\\n -hulls 1\\n -grid 1\\n -imagePlane 1\\n -joints 1\\n -ikHandles 1\\n -deformers 1\\n -dynamics 1\\n -particleInstancers 1\\n -fluids 1\\n -hairSystems 1\\n -follicles 1\\n -nCloths 1\\n -nParticles 1\\n -nRigids 1\\n -dynamicConstraints 1\\n -locators 1\\n -manipulators 1\\n -pluginShapes 1\\n -dimensions 1\\n -handles 1\\n -pivots 1\\n -textures 1\\n -strokes 1\\n -motionTrails 1\\n -clipGhosts 1\\n -bluePencil 1\\n -greasePencils 0\\n -excludeObjectPreset \\\"All\\\" \\n -shadows 0\\n -captureSequenceNumber -1\\n -width 1117\\n -height 714\\n -sceneRenderFilter 0\\n $editorName;\\nmodelEditor -e -viewSelected 0 $editorName;\\nmodelEditor -e \\n -pluginObjects \\\"gpuCacheDisplayFilter\\\" 1 \\n $editorName\"\n" - + "\t\t\t\t\t\"modelPanel -edit -l (localizedPanelLabel(\\\"Persp View\\\")) -mbv $menusOkayInPanels $panelName;\\n$editorName = $panelName;\\nmodelEditor -e \\n -cam `findStartUpCamera persp` \\n -useInteractiveMode 0\\n -displayLights \\\"default\\\" \\n -displayAppearance \\\"smoothShaded\\\" \\n -activeOnly 0\\n -ignorePanZoom 0\\n -wireframeOnShaded 0\\n -headsUpDisplay 1\\n -holdOuts 1\\n -selectionHiliteDisplay 1\\n -useDefaultMaterial 0\\n -bufferMode \\\"double\\\" \\n -twoSidedLighting 0\\n -backfaceCulling 0\\n -xray 0\\n -jointXray 0\\n -activeComponentsXray 0\\n -displayTextures 0\\n -smoothWireframe 0\\n -lineWidth 1\\n -textureAnisotropic 0\\n -textureHilight 1\\n -textureSampling 2\\n -textureDisplay \\\"modulate\\\" \\n -textureMaxSize 32768\\n -fogging 0\\n -fogSource \\\"fragment\\\" \\n -fogMode \\\"linear\\\" \\n -fogStart 0\\n -fogEnd 100\\n -fogDensity 0.1\\n -fogColor 0.5 0.5 0.5 1 \\n -depthOfFieldPreview 1\\n -maxConstantTransparency 1\\n -rendererName \\\"vp2Renderer\\\" \\n -rendererOverrideName \\\"mayaHydraRenderOverride_HdStormRendererPlugin\\\" \\n -objectFilterShowInHUD 1\\n -isFiltered 0\\n -colorResolution 256 256 \\n -bumpResolution 512 512 \\n -textureCompression 0\\n -transparencyAlgorithm \\\"frontAndBackCull\\\" \\n -transpInShadows 0\\n -cullingOverride \\\"none\\\" \\n -lowQualityLighting 0\\n -maximumNumHardwareLights 1\\n -occlusionCulling 0\\n -shadingModel 0\\n -useBaseRenderer 0\\n -useReducedRenderer 0\\n -smallObjectCulling 0\\n -smallObjectThreshold -1 \\n -interactiveDisableShadows 0\\n -interactiveBackFaceCull 0\\n -sortTransparent 1\\n -controllers 1\\n -nurbsCurves 1\\n -nurbsSurfaces 1\\n -polymeshes 1\\n -subdivSurfaces 1\\n -planes 1\\n -lights 1\\n -cameras 1\\n -controlVertices 1\\n -hulls 1\\n -grid 1\\n -imagePlane 1\\n -joints 1\\n -ikHandles 1\\n -deformers 1\\n -dynamics 1\\n -particleInstancers 1\\n -fluids 1\\n -hairSystems 1\\n -follicles 1\\n -nCloths 1\\n -nParticles 1\\n -nRigids 1\\n -dynamicConstraints 1\\n -locators 1\\n -manipulators 1\\n -pluginShapes 1\\n -dimensions 1\\n -handles 1\\n -pivots 1\\n -textures 1\\n -strokes 1\\n -motionTrails 1\\n -clipGhosts 1\\n -bluePencil 1\\n -greasePencils 0\\n -excludeObjectPreset \\\"All\\\" \\n -shadows 0\\n -captureSequenceNumber -1\\n -width 1117\\n -height 714\\n -sceneRenderFilter 0\\n $editorName;\\nmodelEditor -e -viewSelected 0 $editorName;\\nmodelEditor -e \\n -pluginObjects \\\"gpuCacheDisplayFilter\\\" 1 \\n $editorName\"\n" - + "\t\t\t\t$configName;\n\n setNamedPanelLayout (localizedPanelLabel(\"Current Layout\"));\n }\n\n panelHistory -e -clear mainPanelHistory;\n sceneUIReplacement -clear;\n\t}\n\n\ngrid -spacing 5 -size 12 -divisions 5 -displayAxes yes -displayGridLines yes -displayDivisionLines yes -displayPerspectiveLabels no -displayOrthographicLabels no -displayAxesBold yes -perspectiveLabelPosition axis -orthographicLabelPosition edge;\nviewManip -drawCompass 0 -compassAngle 0 -frontParameters \"\" -homeParameters \"\" -selectionLockParameters \"\";\n}\n"); - setAttr ".st" 3; -createNode script -n "sceneConfigurationScriptNode"; - rename -uid "40C77EE7-40C0-B3DD-0FED-B0959AA1FF85"; - setAttr ".b" -type "string" "playbackOptions -min 1 -max 120 -ast 1 -aet 200 "; - setAttr ".st" 6; -select -ne :time1; - setAttr ".o" 1; - setAttr ".unw" 1; -select -ne :hardwareRenderingGlobals; - setAttr ".otfna" -type "stringArray" 22 "NURBS Curves" "NURBS Surfaces" "Polygons" "Subdiv Surface" "Particles" "Particle Instance" "Fluids" "Strokes" "Image Planes" "UI" "Lights" "Cameras" "Locators" "Joints" "IK Handles" "Deformers" "Motion Trails" "Components" "Hair Systems" "Follicles" "Misc. UI" "Ornaments" ; - setAttr ".otfva" -type "Int32Array" 22 0 1 1 1 1 1 - 1 1 1 0 0 0 0 0 0 0 0 0 - 0 0 0 0 ; - setAttr ".fprt" yes; - setAttr ".rtfm" 1; -select -ne :renderPartition; - setAttr -s 2 ".st"; -select -ne :renderGlobalsList1; -select -ne :defaultShaderList1; - setAttr -s 5 ".s"; -select -ne :postProcessList1; - setAttr -s 2 ".p"; -select -ne :defaultRenderingList1; -select -ne :standardSurface1; - setAttr ".bc" -type "float3" 0.40000001 0.40000001 0.40000001 ; - setAttr ".sr" 0.5; -select -ne :initialShadingGroup; - setAttr ".ro" yes; -select -ne :initialParticleSE; - setAttr ".ro" yes; -select -ne :defaultRenderGlobals; - addAttr -ci true -sn "mtohMotionSampleStart" -ln "mtohMotionSampleStart" -at "float"; - addAttr -ci true -sn "mtohMotionSampleEnd" -ln "mtohMotionSampleEnd" -at "float"; - addAttr -ci true -sn "mayaHydraRenderPurpose" -ln "mayaHydraRenderPurpose" -min - 0 -max 1 -at "bool"; - addAttr -ci true -sn "mayaHydraProxyPurpose" -ln "mayaHydraProxyPurpose" -dv 1 -min - 0 -max 1 -at "bool"; - addAttr -ci true -sn "mayaHydraGuidePurpose" -ln "mayaHydraGuidePurpose" -min 0 - -max 1 -at "bool"; - addAttr -ci true -sn "mtohTextureMemoryPerTexture" -ln "mtohTextureMemoryPerTexture" - -dv 4096 -min 1 -max 262144 -smn 16384 -at "long"; - addAttr -ci true -sn "mtohMaximumShadowMapResolution" -ln "mtohMaximumShadowMapResolution" - -dv 2048 -min 32 -max 8192 -at "long"; - addAttr -ci true -sn "HdStormRendererPlugin__enableTinyPrimCulling" -ln "HdStormRendererPlugin__enableTinyPrimCulling" - -min 0 -max 1 -at "bool"; - addAttr -ci true -sn "HdStormRendererPlugin__volumeRaymarchingStepSize" -ln "HdStormRendererPlugin__volumeRaymarchingStepSize" - -dv 1 -at "float"; - addAttr -ci true -sn "HdStormRendererPlugin__volumeRaymarchingStepSizeLighting" - -ln "HdStormRendererPlugin__volumeRaymarchingStepSizeLighting" -dv 10 -at "float"; - addAttr -ci true -sn "HdStormRendererPlugin__volumeMaxTextureMemoryPerField" -ln "HdStormRendererPlugin__volumeMaxTextureMemoryPerField" - -dv 128 -at "float"; - addAttr -ci true -sn "HdStormRendererPlugin__maxLights" -ln "HdStormRendererPlugin__maxLights" - -dv 16 -at "long"; - addAttr -ci true -h true -sn "dss" -ln "defaultSurfaceShader" -dt "string"; - setAttr ".ren" -type "string" "arnold"; - setAttr ".dss" -type "string" "standardSurface1"; -select -ne :defaultResolution; - setAttr ".pa" 1; -select -ne :defaultColorMgtGlobals; - setAttr ".cfe" yes; - setAttr ".cfp" -type "string" "/OCIO-configs/Maya2022-default/config.ocio"; - setAttr ".vtn" -type "string" "ACES 1.0 SDR-video (sRGB)"; - setAttr ".vn" -type "string" "ACES 1.0 SDR-video"; - setAttr ".dn" -type "string" "sRGB"; - setAttr ".wsn" -type "string" "ACEScg"; - setAttr ".otn" -type "string" "ACES 1.0 SDR-video (sRGB)"; - setAttr ".potn" -type "string" "ACES 1.0 SDR-video (sRGB)"; -select -ne :hardwareRenderGlobals; - setAttr ".ctrs" 256; - setAttr ".btrs" 512; -relationship "link" ":lightLinker1" ":initialShadingGroup.message" ":defaultLightSet.message"; -relationship "link" ":lightLinker1" ":initialParticleSE.message" ":defaultLightSet.message"; -relationship "shadowLink" ":lightLinker1" ":initialShadingGroup.message" ":defaultLightSet.message"; -relationship "shadowLink" ":lightLinker1" ":initialParticleSE.message" ":defaultLightSet.message"; -connectAttr "layerManager.dli[0]" "defaultLayer.id"; -connectAttr "renderLayerManager.rlmi[0]" "defaultRenderLayer.rlid"; -connectAttr "defaultRenderLayer.msg" ":defaultRenderingList1.r" -na; -// End of testFootPrintNode.ma From 7b3e3afae04f7309c85745ab85be372902b4df37 Mon Sep 17 00:00:00 2001 From: David Lanier Date: Mon, 4 Mar 2024 11:45:44 +0100 Subject: [PATCH 13/14] HYDRA-307 : Integrate changes from Pierre. --- .../footPrintNode/mhFootPrintNode.cpp | 152 +++++++++--------- .../render/mayaToHydra/testFootPrintNode.py | 5 +- 2 files changed, 79 insertions(+), 78 deletions(-) diff --git a/lib/mayaHydra/flowViewportAPIExamples/footPrintNode/mhFootPrintNode.cpp b/lib/mayaHydra/flowViewportAPIExamples/footPrintNode/mhFootPrintNode.cpp index db437578e7..3656c6b33a 100644 --- a/lib/mayaHydra/flowViewportAPIExamples/footPrintNode/mhFootPrintNode.cpp +++ b/lib/mayaHydra/flowViewportAPIExamples/footPrintNode/mhFootPrintNode.cpp @@ -40,6 +40,8 @@ #include #include #include +#include +#include //Flow viewport headers #include @@ -57,6 +59,11 @@ PXR_NAMESPACE_USING_DIRECTIVE +namespace { +void nodeAddedToModel(MObject& node, void* clientData); +void nodeRemovedFromModel(MObject& node, void* clientData); +} + //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- // Node implementation with Hydra scene index @@ -65,7 +72,7 @@ PXR_NAMESPACE_USING_DIRECTIVE class MhFootPrint : public MPxLocatorNode { public: - MhFootPrint(); + MhFootPrint() = default; ~MhFootPrint() override; //Is called when the MObject has been constructed and is valid @@ -82,12 +89,16 @@ class MhFootPrint : public MPxLocatorNode static void * creator(); static MStatus initialize(); + // Callback when the footprint node is added to the model (create / + // undo-delete) + void addedToModelCb(); + // Callback when the footprint node is removed from model (delete) + void removedFromModelCb(); + //Attributes static MObject mSize; static MObject mWorldS; static MObject mColor; - static MObject mDummyInput; //Dummy input to trigger a call to compute - static MObject mDummyOutput;//Dummy output to trigger a call to compute static MTypeId id; static MString nodeClassification; @@ -101,8 +112,6 @@ class MhFootPrint : public MPxLocatorNode void _CreateAndAddFootPrintPrimitives(); ///Remove the Hydra foot print primitives void _RemoveFootPrintPrimitives(); - ///Update the MObject of this node - void _UpdateThisMObject(); ///Counter to make the hydra primitives unique static std::atomic_int _counter; @@ -115,14 +124,13 @@ class MhFootPrint : public MPxLocatorNode ///Hydra retained scene index to add the 2 foot print primitives HdRetainedSceneIndexRefPtr _retainedSceneIndex {nullptr}; - ///To be used in hydra viewport API to pass the Maya node's MObject for setting callbacks for data producer scene indices - MObjectHandle _thisMObject; - ///To check if the MObject of this node has changed - MObject _oldMObject; ///To hold the afterOpenCallback Id to be able to react when a File Open has happened. MCallbackId _cbAfterOpenId = 0; ///To hold the attributeChangedCallback Id to be able to react when the 3D grid creation parameters attributes from this node change. MCallbackId _cbAttributeChangedId = 0; + + MCallbackId _nodeAddedToModelCbId{0}; + MCallbackId _nodeRemovedFromModelCbId{0}; }; namespace @@ -348,6 +356,27 @@ namespace MFnNumericData fnData(oDouble3); fnData.getData( outVal[0], outVal[1], outVal[2] ); } + +void nodeAddedToModel(MObject& node, void* /* clientData */) +{ + auto fpNode = reinterpret_cast(MFnDagNode(node).userNode()); + if (!TF_VERIFY(fpNode)) { + return; + } + + fpNode->addedToModelCb(); +} + +void nodeRemovedFromModel(MObject& node, void* /* clientData */) +{ + auto fpNode = reinterpret_cast(MFnDagNode(node).userNode()); + if (!TF_VERIFY(fpNode)) { + return; + } + + fpNode->removedFromModelCb(); +} + } //end of anonymous namespace @@ -358,8 +387,6 @@ MObject MhFootPrint::mColor; MTypeId MhFootPrint::id( 0x58000087 ); MString MhFootPrint::nodeClassification("hydraAPIExample/geometry/footPrint"); MObject MhFootPrint::mWorldS; -MObject MhFootPrint::mDummyInput; -MObject MhFootPrint::mDummyOutput; namespace { //Callback after a File Open @@ -372,14 +399,10 @@ namespace { //Trigger a call to compute so that everything is initialized MhFootPrint* footPrintInstance = reinterpret_cast(clientData); footPrintInstance->updateFootPrintPrims(); - footPrintInstance->setupFlowViewportInterface(); + footPrintInstance->addedToModelCb(); } } -MhFootPrint::MhFootPrint() -{ -} - void MhFootPrint::postConstructor() { //We have a valid MObject in this function @@ -391,27 +414,26 @@ void MhFootPrint::postConstructor() _cbAfterOpenId = MSceneMessage::addCallback(MSceneMessage::kAfterOpen, afterOpenCallback, ((void*)this)) ; //Add the callback when an attribute of this node changes - MObject obj = _thisMObject.object(); + MObject obj = thisMObject(); _cbAttributeChangedId = MNodeMessage::addAttributeChangedCallback(obj, attributeChangedCallback, ((void*)this)); _retainedSceneIndex = HdRetainedSceneIndex::New(); _CreateAndAddFootPrintPrimitives(); + + _nodeAddedToModelCbId = MModelMessage::addNodeAddedToModelCallback(obj, nodeAddedToModel); + _nodeRemovedFromModelCbId = MModelMessage::addNodeRemovedFromModelCallback(obj, nodeRemovedFromModel); } MhFootPrint::~MhFootPrint() { //Remove the callbacks - if (_cbAfterOpenId){ - CHECK_MSTATUS(MSceneMessage::removeCallback(_cbAfterOpenId)); - _cbAfterOpenId = 0; + for(auto cbId : {_cbAfterOpenId, _cbAttributeChangedId, _nodeAddedToModelCbId, _nodeRemovedFromModelCbId}) { + if (cbId) { + CHECK_MSTATUS(MMessage::removeCallback(cbId)); + } } - if (_cbAttributeChangedId){ - CHECK_MSTATUS(MMessage::removeCallback(_cbAttributeChangedId)); - _cbAttributeChangedId = 0; - } - //Remove our retained scene index from hydra Fvp::DataProducerSceneIndexInterface& dataProducerSceneIndexInterface = Fvp::DataProducerSceneIndexInterface::get(); dataProducerSceneIndexInterface.removeViewportDataProducerSceneIndex(_retainedSceneIndex, pxr::FvpViewportAPITokens->allViewports); @@ -442,38 +464,6 @@ void MhFootPrint::updateFootPrintPrims() _CreateAndAddFootPrintPrimitives(); } -void MhFootPrint::_UpdateThisMObject() -{ - if (_thisMObject.isValid()){ - return; - } - - _thisMObject = thisMObject(); -} - -void MhFootPrint::setupFlowViewportInterface() -{ - static const SdfPath noPrefix = SdfPath::AbsoluteRootPath(); - - _UpdateThisMObject(); - - //Remove the callback - if (_cbAttributeChangedId){ - CHECK_MSTATUS(MMessage::removeCallback(_cbAttributeChangedId)); - _cbAttributeChangedId = 0; - } - //Add the callback when an attribute of this node changes - MObject obj = _thisMObject.object(); - _cbAttributeChangedId = MNodeMessage::addAttributeChangedCallback(obj, attributeChangedCallback, ((void*)this)); - - //Remove the previous data producer scene index in case it was registered, if that occurs it's because _thisMObject has changed and we want to update the maya callbacks on the node - Fvp::DataProducerSceneIndexInterface& dataProducerSceneIndexInterface = Fvp::DataProducerSceneIndexInterface::get(); - dataProducerSceneIndexInterface.removeViewportDataProducerSceneIndex(_retainedSceneIndex, pxr::FvpViewportAPITokens->allViewports); - - //Data producer scene index interface is used to add the retained scene index to all viewports with all render delegates - dataProducerSceneIndexInterface.addDataProducerSceneIndex(_retainedSceneIndex, noPrefix, (void*)&obj, FvpViewportAPITokens->allViewports,FvpViewportAPITokens->allRenderers); -} - // Retrieve value of the size attribute from the node float MhFootPrint::_GetSizeInCentimeters() const { @@ -509,11 +499,6 @@ GfVec3f MhFootPrint::_GetColor() const MStatus MhFootPrint::compute( const MPlug& plug, MDataBlock& dataBlock) { - //The MObject can change if the node gets deleted and deletion being undone - if (! _thisMObject.isValid()){ - setupFlowViewportInterface(); - } - if (plug == mWorldS) { if (plug.isElement()) @@ -555,6 +540,36 @@ void* MhFootPrint::creator() return new MhFootPrint(); } +void MhFootPrint::addedToModelCb() +{ + std::cout << "PPT: footprint node added to model." << std::endl; + + static const SdfPath noPrefix = SdfPath::AbsoluteRootPath(); + + //Add the callback when an attribute of this node changes + MObject obj = thisMObject(); + _cbAttributeChangedId = MNodeMessage::addAttributeChangedCallback(obj, attributeChangedCallback, ((void*)this)); + + //Data producer scene index interface is used to add the retained scene index to all viewports with all render delegates + auto& dataProducerSceneIndexInterface = Fvp::DataProducerSceneIndexInterface::get(); + dataProducerSceneIndexInterface.addDataProducerSceneIndex(_retainedSceneIndex, noPrefix, (void*)&obj, FvpViewportAPITokens->allViewports,FvpViewportAPITokens->allRenderers); +} + +void MhFootPrint::removedFromModelCb() +{ + std::cout << "PPT: footprint node removed from model." << std::endl; + + //Remove the callback + if (_cbAttributeChangedId){ + CHECK_MSTATUS(MMessage::removeCallback(_cbAttributeChangedId)); + _cbAttributeChangedId = 0; + } + + //Remove the data producer scene index. + auto& dataProducerSceneIndexInterface = Fvp::DataProducerSceneIndexInterface::get(); + dataProducerSceneIndexInterface.removeViewportDataProducerSceneIndex(_retainedSceneIndex, pxr::FvpViewportAPITokens->allViewports); +} + //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- // Plugin Registration @@ -596,24 +611,11 @@ MStatus MhFootPrint::initialize() MAKE_INPUT(nAttr); CHECK_MSTATUS ( nAttr.setDefault(0.0, 0.0, 1.0) ); - //Create dummy input attribute to trigger a call to the compute function on demand. as it's in the compute fonction that we add our scene indices - mDummyInput = nAttr.create("dummyInput", "dI", MFnNumericData::kInt, 1.0); - MAKE_INPUT(nAttr); - CHECK_MSTATUS ( nAttr.setDefault(1) ); - - //Create dummy output attribute to trigger a call to the compute function on demand. as it's in the compute fonction that we add our scene indices - mDummyOutput = nAttr.create("dummyOutput", "dO", MFnNumericData::kInt, 1.0); - MAKE_OUTPUT(nAttr); - CHECK_MSTATUS ( nAttr.setDefault(1) ); - CHECK_MSTATUS ( addAttribute(mSize) ); CHECK_MSTATUS ( addAttribute(mColor)); - CHECK_MSTATUS ( addAttribute(mDummyInput)); - CHECK_MSTATUS ( addAttribute(mDummyOutput)); CHECK_MSTATUS ( addAttribute(mWorldS)); CHECK_MSTATUS ( attributeAffects(mSize, mWorldS)); - CHECK_MSTATUS ( attributeAffects(mDummyInput, mDummyOutput)); return MS::kSuccess; } diff --git a/test/lib/mayaUsd/render/mayaToHydra/testFootPrintNode.py b/test/lib/mayaUsd/render/mayaToHydra/testFootPrintNode.py index ba4a583043..f1bee50195 100644 --- a/test/lib/mayaUsd/render/mayaToHydra/testFootPrintNode.py +++ b/test/lib/mayaUsd/render/mayaToHydra/testFootPrintNode.py @@ -38,9 +38,8 @@ def imageDiffFailThreshold(self): def imageDiffFailPercent(self): return 0.1 - @classmethod - def tearDownClass(cls): - #Finish by a File New command to check that it's not crashing when cleaning up everything' + def tearDown(self): + #is called after each test : finish by a File New command to check that it's not crashing when cleaning up everything' cmds.file(new=True, force=True) def setupScene(self): From 23401f69cece944937dddaa29ab136782ca78801 Mon Sep 17 00:00:00 2001 From: David Lanier Date: Mon, 4 Mar 2024 14:17:36 +0100 Subject: [PATCH 14/14] HYDRA-307 : Remove usage of obsolete attributes, fix tests. --- .../fvpDataProducerSceneIndexDataBase.cpp | 2 +- .../footPrintNode/mhFootPrintNode.cpp | 5 ----- .../render/mayaToHydra/testFootPrintNode.py | 22 +------------------ .../testFootPrintNodeSaved.ma | 1 - 4 files changed, 2 insertions(+), 28 deletions(-) diff --git a/lib/flowViewport/API/perViewportSceneIndicesData/fvpDataProducerSceneIndexDataBase.cpp b/lib/flowViewport/API/perViewportSceneIndicesData/fvpDataProducerSceneIndexDataBase.cpp index dde4c93c8b..87bb796045 100644 --- a/lib/flowViewport/API/perViewportSceneIndicesData/fvpDataProducerSceneIndexDataBase.cpp +++ b/lib/flowViewport/API/perViewportSceneIndicesData/fvpDataProducerSceneIndexDataBase.cpp @@ -112,7 +112,6 @@ void DataProducerSceneIndexDataBase::_CreateSceneIndexChainForDataProducerSceneI HdSceneIndexBaseRefPtr DataProducerSceneIndexDataBase::_CreateUsdStageSceneIndexChain(HdSceneIndexBaseRefPtr const & inputStageSceneIndex) { _CreateSceneIndexChainForDataProducerSceneIndexWithDCCNode(inputStageSceneIndex); - UpdateHydraTransformFromParentPath();//Update the transform, this is useful when deleting the node and undoing it return _lastSceneIndexChain; } @@ -136,6 +135,7 @@ void DataProducerSceneIndexDataBase::_CreateSceneIndexChainForDataProducerSceneI { _rootOverridesSceneIndex = UsdImagingRootOverridesSceneIndex::New(inputSceneIndex); _lastSceneIndexChain = _rootOverridesSceneIndex; + UpdateHydraTransformFromParentPath();//Update the transform, this is useful when deleting the node and undoing it } void DataProducerSceneIndexDataBase::_CreateSceneIndexChainForDataProducerSceneIndexWithoutDCCNode(HdSceneIndexBaseRefPtr const & inputSceneIndex) diff --git a/lib/mayaHydra/flowViewportAPIExamples/footPrintNode/mhFootPrintNode.cpp b/lib/mayaHydra/flowViewportAPIExamples/footPrintNode/mhFootPrintNode.cpp index 3656c6b33a..b415ed653b 100644 --- a/lib/mayaHydra/flowViewportAPIExamples/footPrintNode/mhFootPrintNode.cpp +++ b/lib/mayaHydra/flowViewportAPIExamples/footPrintNode/mhFootPrintNode.cpp @@ -83,7 +83,6 @@ class MhFootPrint : public MPxLocatorNode bool isBounded() const override; MBoundingBox boundingBox() const override; - void setupFlowViewportInterface(); void updateFootPrintPrims(); static void * creator(); @@ -542,8 +541,6 @@ void* MhFootPrint::creator() void MhFootPrint::addedToModelCb() { - std::cout << "PPT: footprint node added to model." << std::endl; - static const SdfPath noPrefix = SdfPath::AbsoluteRootPath(); //Add the callback when an attribute of this node changes @@ -557,8 +554,6 @@ void MhFootPrint::addedToModelCb() void MhFootPrint::removedFromModelCb() { - std::cout << "PPT: footprint node removed from model." << std::endl; - //Remove the callback if (_cbAttributeChangedId){ CHECK_MSTATUS(MMessage::removeCallback(_cbAttributeChangedId)); diff --git a/test/lib/mayaUsd/render/mayaToHydra/testFootPrintNode.py b/test/lib/mayaUsd/render/mayaToHydra/testFootPrintNode.py index f1bee50195..586c9f943a 100644 --- a/test/lib/mayaUsd/render/mayaToHydra/testFootPrintNode.py +++ b/test/lib/mayaUsd/render/mayaToHydra/testFootPrintNode.py @@ -58,11 +58,6 @@ def test_AddingPrimitives(self): #Increase its size cmds.setAttr(footPrintNodeName + '.size', 5) cmds.refresh() - - #When the node above is created, its compute method is not called automatically, so work around to trigger a call to compute - cmds.setAttr(footPrintNodeName + '.dummyInput', 2)#setting this will set dirty the dummyOutput attribute - cmds.getAttr(footPrintNodeName + '.dummyOutput')#getting this value will trigger a call to compute - cmds.refresh() self.assertSnapshotClose("add_NodeCreated.png", self.imageDiffFailThreshold, self.imageDiffFailPercent) #Move the transform node, the added prims should move as well @@ -114,10 +109,7 @@ def test_FootPrintAttributes(self): #Create a mayaHydraFootPrintNode node which adds a dataProducerSceneIndex and a Filtering scene index footPrintNodeName = cmds.createNode("MhFootPrint") - - #When the node above is created, its compute method is not called automatically, so work around to trigger a call to compute - cmds.setAttr(footPrintNodeName + '.dummyInput', 2)#setting this will set dirty the dummyOutput attribute - cmds.getAttr(footPrintNodeName + '.dummyOutput')#getting this value will trigger a call to compute + cmds.refresh() self.assertSnapshotClose("footPrint_BeforeModifs.png", self.imageDiffFailThreshold, self.imageDiffFailPercent) #Modify the attributes @@ -140,10 +132,6 @@ def test_MultipleNodes(self): #Create a mayaHydraFootPrintNode node which adds a dataProducerSceneIndex and a Filtering scene index footPrintNodeName1 = cmds.createNode("MhFootPrint", n="nodeShape1") - #When the node above is created, its compute method is not called automatically, so work around to trigger a call to compute - cmds.setAttr(footPrintNodeName1 + '.dummyInput', 3)#setting this will set dirty the dummyOutput attribute - cmds.getAttr(footPrintNodeName1 + '.dummyOutput')#getting this value will trigger a call to compute - #Modify the attributes cmds.setAttr(footPrintNodeName1 + '.size', 3) cmds.setAttr(footPrintNodeName1 + '.color', 1.0, 1.0, 1.0, type="double3") @@ -159,10 +147,6 @@ def test_MultipleNodes(self): #Create a mayaHydraFootPrintNode node which adds a dataProducerSceneIndex and a Filtering scene index footPrintNodeName2 = cmds.createNode("MhFootPrint", n="nodeShape2") - #When the node above is created, its compute method is not called automatically, so work around to trigger a call to compute - cmds.setAttr(footPrintNodeName2 + '.dummyInput', 3)#setting this will set dirty the dummyOutput attribute - cmds.getAttr(footPrintNodeName2 + '.dummyOutput')#getting this value will trigger a call to compute - cmds.setAttr(footPrintNodeName2 + '.size', 1.5) cmds.setAttr(footPrintNodeName2 + '.color', 0.0, 1.0, 0.0, type="double3") cmds.refresh() @@ -224,10 +208,6 @@ def test_MultipleViewports(self): #Create a mayaHydraFootPrintNode node which adds a dataProducerSceneIndex and a Filtering scene index footPrintNodeName1 = cmds.createNode("MhFootPrint", n="nodeShape1") - #When the node above is created, its compute method is not called automatically, so work around to trigger a call to compute - cmds.setAttr(footPrintNodeName1 + '.dummyInput', 2)#setting this will set dirty the dummyOutput attribute - cmds.getAttr(footPrintNodeName1 + '.dummyOutput')#getting this value will trigger a call to compute - cmds.setAttr(footPrintNodeName1 + '.size', 6) cmds.setAttr(footPrintNodeName1 + '.color', 0.0, 1.0, 0.0, type="double3") cmds.refresh() diff --git a/test/testSamples/testFootPrintNode/testFootPrintNodeSaved.ma b/test/testSamples/testFootPrintNode/testFootPrintNodeSaved.ma index 5d62fa8a91..37d11bb051 100644 --- a/test/testSamples/testFootPrintNode/testFootPrintNodeSaved.ma +++ b/test/testSamples/testFootPrintNode/testFootPrintNodeSaved.ma @@ -80,7 +80,6 @@ createNode MhFootPrint -n "MhFootPrint1" -p "transform1"; setAttr -k off ".v"; setAttr ".sz" 5; setAttr ".col" -type "double3" 0 1 1 ; - setAttr ".dI" 2; createNode lightLinker -s -n "lightLinker1"; rename -uid "F05525A4-421C-610A-0237-D4A8D7720235"; setAttr -s 2 ".lnk";