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/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/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 d5cf868ab9..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( 0x90517 ); +MTypeId FlowViewportAPIMayaLocator::id( 0x00080101 ); MString FlowViewportAPIMayaLocator::nodeClassification("hydraAPIExample/geometry/FlowViewportAPIMayaLocator"); MObject FlowViewportAPIMayaLocator::mNumCubeLevelsX; @@ -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..6ff03b6b0f --- /dev/null +++ b/lib/mayaHydra/flowViewportAPIExamples/footPrintNode/CMakeLists.txt @@ -0,0 +1,97 @@ +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> + 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(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}) + +# ----------------------------------------------------------------------------- +# 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") + 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() + + 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..b415ed653b --- /dev/null +++ b/lib/mayaHydra/flowViewportAPIExamples/footPrintNode/mhFootPrintNode.cpp @@ -0,0 +1,648 @@ +// +// 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") +// +//////////////////////////////////////////////////////////////////////// + +//maya headers +#include +#include +#include +#include +#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 + +namespace { +void nodeAddedToModel(MObject& node, void* clientData); +void nodeRemovedFromModel(MObject& node, void* clientData); +} + +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +// Node implementation with Hydra scene index +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +class MhFootPrint : public MPxLocatorNode +{ +public: + MhFootPrint() = default; + ~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; + MBoundingBox boundingBox() const override; + + void updateFootPrintPrims(); + + 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 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(); + + ///Counter to make the hydra primitives unique + static std::atomic_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 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 +{ + // Foot print data + 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] ); + } + +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 + +//Static variables init +std::atomic_int MhFootPrint::_counter {0}; +MObject MhFootPrint::mSize; +MObject MhFootPrint::mColor; +MTypeId MhFootPrint::id( 0x58000087 ); +MString MhFootPrint::nodeClassification("hydraAPIExample/geometry/footPrint"); +MObject MhFootPrint::mWorldS; + +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->updateFootPrintPrims(); + footPrintInstance->addedToModelCb(); + } +} + +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++; + + //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(); + _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 + for(auto cbId : {_cbAfterOpenId, _cbAttributeChangedId, _nodeAddedToModelCbId, _nodeRemovedFromModelCbId}) { + if (cbId) { + CHECK_MSTATUS(MMessage::removeCallback(cbId)); + } + } + + //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() +{ + //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(); +} + +// 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 (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() +{ + 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){ + MGlobal::displayError(errorString); + return nullptr; + } + + return new MhFootPrint(); +} + +void MhFootPrint::addedToModelCb() +{ + 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() +{ + //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 +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- + +//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) ); + + CHECK_MSTATUS ( addAttribute(mSize) ); + CHECK_MSTATUS ( addAttribute(mColor)); + CHECK_MSTATUS ( addAttribute(mWorldS)); + + CHECK_MSTATUS ( attributeAffects(mSize, mWorldS)); + return MS::kSuccess; +} + +MStatus initializePlugin( MObject obj ) +{ + MFnPlugin plugin( obj, PLUGIN_COMPANY, "2025.0", "Any"); + + MStatus status; + 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 70e5a195fa..08a90b32c8 100644 --- a/test/lib/mayaUsd/render/mayaToHydra/CMakeLists.txt +++ b/test/lib/mayaUsd/render/mayaToHydra/CMakeLists.txt @@ -30,6 +30,7 @@ set(INTERACTIVE_TEST_SCRIPT_FILES testNurbsPrimitives.py testCurveTools.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 0000000000..3127eb2526 Binary files /dev/null and b/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/add_NodeCreated.png differ 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 0000000000..698720d403 Binary files /dev/null and b/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/add_NodeDeleted.png differ diff --git a/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/add_NodeDeletedRedo.png b/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/add_NodeDeletedRedo.png new file mode 100644 index 0000000000..698720d403 Binary files /dev/null and b/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/add_NodeDeletedRedo.png differ diff --git a/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/add_NodeDeletedUndo.png b/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/add_NodeDeletedUndo.png new file mode 100644 index 0000000000..0747c65284 Binary files /dev/null and b/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/add_NodeDeletedUndo.png differ 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 0000000000..0747c65284 Binary files /dev/null and b/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/add_NodeDeletedUndoAgain.png differ 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 0000000000..698720d403 Binary files /dev/null and b/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/add_NodeHidden.png differ diff --git a/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/add_NodeMoved.png b/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/add_NodeMoved.png new file mode 100644 index 0000000000..0747c65284 Binary files /dev/null and b/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/add_NodeMoved.png differ 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 0000000000..5954d6e406 Binary files /dev/null and b/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/add_NodeMovedAfterDeletionAndUndo.png differ 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 0000000000..0747c65284 Binary files /dev/null and b/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/add_NodeUnhidden.png differ 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 0000000000..5954d6e406 Binary files /dev/null and b/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/add_VP2AndThenBackToStorm.png differ 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 0000000000..32228189f3 Binary files /dev/null and b/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/footPrint_AfterModifs.png differ 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 0000000000..dcf57356b3 Binary files /dev/null and b/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/footPrint_BeforeModifs.png differ diff --git a/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/footPrint_VP2AndThenBackToStorm.png b/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/footPrint_VP2AndThenBackToStorm.png new file mode 100644 index 0000000000..32228189f3 Binary files /dev/null and b/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/footPrint_VP2AndThenBackToStorm.png differ 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 0000000000..772946f59e Binary files /dev/null and b/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/loadingFootPrintScene.png differ diff --git a/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/multipleNodes_AfterModifs.png b/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/multipleNodes_AfterModifs.png new file mode 100644 index 0000000000..9bd5a6e914 Binary files /dev/null and b/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/multipleNodes_AfterModifs.png differ diff --git a/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/multipleNodes_BeforeModifs.png b/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/multipleNodes_BeforeModifs.png new file mode 100644 index 0000000000..5b01193c13 Binary files /dev/null and b/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/multipleNodes_BeforeModifs.png differ diff --git a/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/multipleNodes_Node1Hidden.png b/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/multipleNodes_Node1Hidden.png new file mode 100644 index 0000000000..670c6c9b6b Binary files /dev/null and b/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/multipleNodes_Node1Hidden.png differ diff --git a/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/multipleNodes_Node1Unhidden.png b/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/multipleNodes_Node1Unhidden.png new file mode 100644 index 0000000000..9bd5a6e914 Binary files /dev/null and b/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/multipleNodes_Node1Unhidden.png differ diff --git a/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/multipleNodes_VP2AndThenBackToStorm.png b/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/multipleNodes_VP2AndThenBackToStorm.png new file mode 100644 index 0000000000..9bd5a6e914 Binary files /dev/null and b/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/multipleNodes_VP2AndThenBackToStorm.png differ diff --git a/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/multipleViewports_VP2AndThenBackToStorm_modPan3.png b/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/multipleViewports_VP2AndThenBackToStorm_modPan3.png new file mode 100644 index 0000000000..aeae0efc68 Binary files /dev/null and b/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/multipleViewports_VP2AndThenBackToStorm_modPan3.png differ 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 0000000000..1d7bb1a39e Binary files /dev/null and b/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/multipleViewports_VP2AndThenBackToStorm_modPan4.png differ 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 0000000000..698720d403 Binary files /dev/null and b/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/multipleViewports_VP2_modPan3.png differ diff --git a/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/multipleViewports_VP2_modPan4.png b/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/multipleViewports_VP2_modPan4.png new file mode 100644 index 0000000000..698720d403 Binary files /dev/null and b/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/multipleViewports_VP2_modPan4.png differ diff --git a/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/multipleViewports_viewPanel1.png b/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/multipleViewports_viewPanel1.png new file mode 100644 index 0000000000..aeae0efc68 Binary files /dev/null and b/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/multipleViewports_viewPanel1.png differ 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 0000000000..1d7bb1a39e Binary files /dev/null and b/test/lib/mayaUsd/render/mayaToHydra/FootPrintNodeTest/multipleViewports_viewPanel4.png differ diff --git a/test/lib/mayaUsd/render/mayaToHydra/testFlowViewportAPI.py b/test/lib/mayaUsd/render/mayaToHydra/testFlowViewportAPI.py index f0a38ac2b9..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() @@ -52,7 +57,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 @@ -63,11 +68,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) @@ -95,10 +97,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) @@ -108,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 - cmds.file(new=True, force=True) - #Test filtering primitives def test_FilteringPrimitives(self): self.setupScene() @@ -122,7 +118,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 @@ -133,11 +129,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) @@ -193,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 - cmds.file(new=True, force=True) #Test Cube grids parameters def test_CubeGrid(self): @@ -204,7 +194,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 @@ -250,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 - cmds.file(new=True, force=True) - #Test multiple nodes def test_MultipleNodes(self): self.setupScene() @@ -260,7 +247,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 @@ -286,16 +273,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 @@ -321,11 +305,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) @@ -360,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 - cmds.file(new=True, force=True) - #Test multiple viewports def test_MultipleViewports(self): with PluginLoaded('flowViewportAPIMayaLocator'): @@ -380,15 +358,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 @@ -443,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 - 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 new file mode 100644 index 0000000000..586c9f943a --- /dev/null +++ b/test/lib/mayaUsd/render/mayaToHydra/testFootPrintNode.py @@ -0,0 +1,247 @@ +# +# 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.1 + + 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): + self.setHdStormRenderer() + cmds.move(7.714, 5.786, 7.714, 'persp') + cmds.refresh() + + #Test adding primitives + def test_AddingPrimitives(self): + with PluginLoaded('mayaHydraFootPrintNode'): + self.setupScene() + + #Create a mayaHydraFootPrintNode node which adds a dataProducerSceneIndex + footPrintNodeName = cmds.createNode("MhFootPrint") + + #Increase its size + cmds.setAttr(footPrintNodeName + '.size', 5) + cmds.refresh() + 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.assertIsNotNone(transformNode) + cmds.move(2, 0.5, -2, transformNode) + 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) + + cmds.move(-0.2, -0.5, 0, transformNode) + 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) + + #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") + cmds.refresh() + 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) + + #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") + + #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.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") + + 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.assertIsNotNone(transformNode2) + cmds.move(2, 0, -2, transformNode2) + 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) + + #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") + + 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) + + #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/testFootPrintNodeSaved.ma b/test/testSamples/testFootPrintNode/testFootPrintNodeSaved.ma new file mode 100644 index 0000000000..37d11bb051 --- /dev/null +++ b/test/testSamples/testFootPrintNode/testFootPrintNodeSaved.ma @@ -0,0 +1,226 @@ +//Maya ASCII 2026ff01 scene +//Name: testFootPrintNodeSaved.ma +//Last modified: Thu, Feb 15, 2024 11:20:16 AM +//Codeset: 1252 +requires maya "2026ff01"; +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; +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; +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; +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 ; +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 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