diff --git a/lib/mayaUsd/render/MaterialXGenOgsXml/CMakeLists.txt b/lib/mayaUsd/render/MaterialXGenOgsXml/CMakeLists.txt index 6ec6797205..be53b87c8c 100644 --- a/lib/mayaUsd/render/MaterialXGenOgsXml/CMakeLists.txt +++ b/lib/mayaUsd/render/MaterialXGenOgsXml/CMakeLists.txt @@ -24,6 +24,17 @@ list(APPEND LIGHT_IMPLEMENTATIONS libraries/mx_lighting_maya_v2.glsl ) +list(APPEND NODE_DECLARATIONS + libraries/maya_surfaces.mtlx + libraries/usd_utilities.mtlx +) + +list(APPEND NODE_IMPLEMENTATIONS + libraries/usd_utilities_genglsl_impl.mtlx + libraries/mx_texcoordtangents_vector3.glsl + libraries/mx_arbitrarytangents_vector3.glsl +) + # ----------------------------------------------------------------------------- # promote headers # ----------------------------------------------------------------------------- @@ -35,3 +46,11 @@ mayaUsd_promoteHeaderList(HEADERS ${HEADERS} SUBDIR render/MaterialXGenOgsXml) install(FILES ${LIGHT_IMPLEMENTATIONS} DESTINATION ${CMAKE_INSTALL_PREFIX}/libraries/pbrlib/genglsl/ogsxml ) + +install(FILES ${NODE_DECLARATIONS} + DESTINATION ${CMAKE_INSTALL_PREFIX}/libraries/adsk/maya +) + +install(FILES ${NODE_IMPLEMENTATIONS} + DESTINATION ${CMAKE_INSTALL_PREFIX}/libraries/adsk/maya/genglsl +) diff --git a/lib/mayaUsd/render/MaterialXGenOgsXml/libraries/maya_surfaces.mtlx b/lib/mayaUsd/render/MaterialXGenOgsXml/libraries/maya_surfaces.mtlx new file mode 100644 index 0000000000..36c87ec818 --- /dev/null +++ b/lib/mayaUsd/render/MaterialXGenOgsXml/libraries/maya_surfaces.mtlx @@ -0,0 +1,297 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/mayaUsd/render/MaterialXGenOgsXml/libraries/mx_arbitrarytangents_vector3.glsl b/lib/mayaUsd/render/MaterialXGenOgsXml/libraries/mx_arbitrarytangents_vector3.glsl new file mode 100644 index 0000000000..bb0f4bb4d1 --- /dev/null +++ b/lib/mayaUsd/render/MaterialXGenOgsXml/libraries/mx_arbitrarytangents_vector3.glsl @@ -0,0 +1,9 @@ +void mx_arbitrarytangents_vector3(vec3 position, vec3 normal, out vec3 tangent) +{ + // Get screen space derivatives of position + vec3 dPdx = dFdx(position); + + // Ensure position derivatives are perpendicular to normal + tangent = normalize(dPdx - dot(dPdx, normal) * normal); + +} diff --git a/lib/mayaUsd/render/MaterialXGenOgsXml/libraries/mx_texcoordtangents_vector3.glsl b/lib/mayaUsd/render/MaterialXGenOgsXml/libraries/mx_texcoordtangents_vector3.glsl new file mode 100644 index 0000000000..12fdbec36e --- /dev/null +++ b/lib/mayaUsd/render/MaterialXGenOgsXml/libraries/mx_texcoordtangents_vector3.glsl @@ -0,0 +1,35 @@ +void mx_texcoordtangents_vector3(vec3 position, vec3 normal, vec2 texcoord, out vec3 tangent) +{ + // Calculation of TBN matrix and terminology based on "Surface + // Gradient-Based Bump Mapping Framework" (2020) + + // Get screen space derivatives of position + vec3 dPdx = dFdx(position); + vec3 dPdy = dFdy(position); + + // Ensure position derivatives are perpendicular to normal + vec3 sigmaX = dPdx - dot(dPdx, normal) * normal; + vec3 sigmaY = dPdy - dot(dPdy, normal) * normal; + + float flipSign = dot(dPdy, cross(normal, dPdx)) < 0 ? -1 : 1; + + // Get screen space derivatives of st + vec2 dSTdx = dFdx(texcoord); + vec2 dSTdy = dFdy(texcoord); + + // Get determinant and determinant sign of st matrix + float det = dot(dSTdx, vec2(dSTdy.y, -dSTdy.x)); + float signDet = det < 0 ? -1 : 1; + + // Get first column of inv st matrix + // Don't divide by det, but scale by its sign + vec2 invC0 = signDet * vec2(dSTdy.y, -dSTdx.y); + + vec3 T = sigmaX * invC0.x + sigmaY * invC0.y; + + if (abs(det) > 0) { + T = normalize(T); + } + + tangent = T; +} diff --git a/lib/mayaUsd/render/MaterialXGenOgsXml/libraries/usd_utilities.mtlx b/lib/mayaUsd/render/MaterialXGenOgsXml/libraries/usd_utilities.mtlx new file mode 100644 index 0000000000..a33ef79941 --- /dev/null +++ b/lib/mayaUsd/render/MaterialXGenOgsXml/libraries/usd_utilities.mtlx @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/mayaUsd/render/MaterialXGenOgsXml/libraries/usd_utilities_genglsl_impl.mtlx b/lib/mayaUsd/render/MaterialXGenOgsXml/libraries/usd_utilities_genglsl_impl.mtlx new file mode 100644 index 0000000000..4601ef9f0c --- /dev/null +++ b/lib/mayaUsd/render/MaterialXGenOgsXml/libraries/usd_utilities_genglsl_impl.mtlx @@ -0,0 +1,5 @@ + + + + + diff --git a/lib/mayaUsd/render/vp2RenderDelegate/material.cpp b/lib/mayaUsd/render/vp2RenderDelegate/material.cpp index e6952edecf..7e34b9eed6 100644 --- a/lib/mayaUsd/render/vp2RenderDelegate/material.cpp +++ b/lib/mayaUsd/render/vp2RenderDelegate/material.cpp @@ -171,13 +171,38 @@ TF_DEFINE_PRIVATE_TOKENS( (vaddressmode) (filtertype) (channels) + (out) + (surfaceshader) // Texcoord reader identifiers: + (texcoord) (index) (UV0) (geompropvalue) (ST_reader) (vector2) + + // Tangent related identifiers: + (tangent) + (normalmap) + (arbitrarytangents) + (texcoordtangents) + (Tworld) + (Tobject) + (Tw_reader) + (vector3) + (transformvector) + (constant) + (Tw_to_To) + (in) + (space) + (fromspace) + (tospace) + (world) + (object) + (model) + (outTworld) + (outTobject) ); const std::set _mtlxTopoNodeSet = { @@ -387,18 +412,152 @@ MStatus _SetFAParameter( // name for UV at index zero. void _AddMissingTexcoordReaders(mx::DocumentPtr& mtlxDoc) { - // We expect only one node graph, but fixing them all is not an issue: - for (mx::NodeGraphPtr nodeGraph : mtlxDoc->getNodeGraphs()) { - if (nodeGraph->hasSourceUri()) { + mx::NodeGraphPtr nodeGraph = mtlxDoc->getNodeGraph(_mtlxTokens->NG_Maya.GetString()); + if (!nodeGraph) { + return; + } + + // This will hold the emergency "ST" reader if one was necessary + mx::NodePtr stReader; + // Store nodes to delete when loop iteration is complete + std::vector nodesToDelete; + + for (mx::NodePtr node : nodeGraph->getNodes()) { + // Check the inputs of the node for UV0 default geom properties + mx::NodeDefPtr nodeDef = node->getNodeDef(); + // A missing node def is a very bad sign. No need to process further. + if (!TF_VERIFY( + nodeDef, + "Could not find MaterialX NodeDef for Node '%s'. Please recheck library paths.", + node->getNamePath().c_str())) { + return; + } + for (mx::InputPtr input : nodeDef->getActiveInputs()) { + if (input->hasDefaultGeomPropString() + && input->getDefaultGeomPropString() == _mtlxTokens->UV0.GetString()) { + // See if the corresponding input is connected on the node: + if (node->getConnectedNodeName(input->getName()).empty()) { + // Create emergency ST reader if necessary + if (!stReader) { + stReader = nodeGraph->addNode( + _mtlxTokens->geompropvalue.GetString(), + _mtlxTokens->ST_reader.GetString(), + _mtlxTokens->vector2.GetString()); + mx::ValueElementPtr prpInput + = stReader->addInputFromNodeDef(_mtlxTokens->geomprop.GetString()); + prpInput->setValueString(_tokens->st.GetString()); + } + node->addInputFromNodeDef(input->getName()); + node->setConnectedNodeName(input->getName(), stReader->getName()); + } + } + } + // Check if it is an explicit texcoord reader: + if (nodeDef->getNodeString() == _mtlxTokens->texcoord.GetString()) { + // Switch it with a geompropvalue of the same name: + std::string nodeName = node->getName(); + std::string oldName = nodeName + "_toDelete"; + node->setName(oldName); + nodesToDelete.push_back(oldName); + // Find out if there is an explicit stream index: + int streamIndex = 0; + mx::InputPtr indexInput = node->getInput(_mtlxTokens->index.GetString()); + if (indexInput && indexInput->hasValue()) { + mx::ValuePtr indexValue = indexInput->getValue(); + if (indexValue->isA()) { + streamIndex = indexValue->asA(); + } + } + // Add replacement geompropvalue node: + mx::NodePtr doppelNode = nodeGraph->addNode( + _mtlxTokens->geompropvalue.GetString(), + nodeName, + nodeDef->getOutput(_mtlxTokens->out.GetString())->getType()); + mx::ValueElementPtr prpInput + = doppelNode->addInputFromNodeDef(_mtlxTokens->geomprop.GetString()); + MString primvar = _tokens->st.GetText(); + if (streamIndex) { + // If reading at index > 0 we add the index to the primvar name: + primvar += streamIndex; + } + prpInput->setValueString(primvar.asChar()); + } + } + // Delete all obsolete texcoord reader nodes. + for (const std::string& deadNode : nodesToDelete) { + nodeGraph->removeNode(deadNode); + } +} + +// Recursively traverse a node graph, depth first, to find target node +mx::NodePtr _RecursiveFindNode(const mx::NodePtr& node, const TfToken& target) +{ + mx::NodePtr retVal; + for (auto const& input : node->getInputs()) { + if (mx::NodePtr downstreamNode = input->getConnectedNode()) { + if (mx::NodeDefPtr nodeDef = downstreamNode->getNodeDef()) { + if (nodeDef->getNodeString() == _mtlxTokens->geompropvalue.GetString() + && downstreamNode->getType() == _mtlxTokens->vector2.GetString()) { + retVal = downstreamNode; + break; + } + } + retVal = _RecursiveFindNode(downstreamNode, target); + if (retVal) { + break; + } + } + } + return retVal; +} + +// USD does not provide tangents, so we need to build them from UV coordinates when possible: +void _AddMissingTangents(mx::DocumentPtr& mtlxDoc) +{ + // We will need at least one geompropvalue reader to generate tangents: + mx::NodePtr stReader; + + // List of all items to fix: + using nodeInput = std::pair; + std::vector graphTworldInputs; + std::vector graphTobjectInputs; + std::vector materialTworldInputs; + std::vector materialTobjectInputs; + std::vector nodesToReplace; + + // The materialnode very often will have a tangent input: + for (mx::NodePtr material : mtlxDoc->getMaterialNodes()) { + if (material->getName() != _mtlxTokens->USD_Mtlx_VP2_Material.GetText()) { continue; } - // This will hold the emergency "ST" reader if one was necessary - mx::NodePtr stReader; - // Store nodes to delete when loop iteration is complete - std::vector nodesToDelete; + mx::InputPtr surfaceInput = material->getInput(_mtlxTokens->surfaceshader.GetString()); + if (surfaceInput) { + material = surfaceInput->getConnectedNode(); + } + mx::NodeDefPtr nodeDef = material->getNodeDef(); + for (mx::InputPtr input : nodeDef->getActiveInputs()) { + if (input->hasDefaultGeomPropString()) { + const std::string& geomPropString = input->getDefaultGeomPropString(); + if (geomPropString == _mtlxTokens->Tworld.GetString() + && !material->getConnectedOutput(input->getName())) { + materialTworldInputs.emplace_back(material, input->getName()); + } + if (geomPropString == _mtlxTokens->Tobject.GetString() + && !material->getConnectedOutput(input->getName())) { + materialTobjectInputs.emplace_back(material, input->getName()); + } + } + } + } + + // If we have no nodegraph, but need tangent input on the material node, then we create one: + mx::NodeGraphPtr nodeGraph = mtlxDoc->getNodeGraph(_mtlxTokens->NG_Maya.GetString()); + if (!nodeGraph && (!materialTworldInputs.empty() || !materialTobjectInputs.empty())) { + nodeGraph = mtlxDoc->addNodeGraph(_mtlxTokens->NG_Maya.GetString()); + } + if (nodeGraph) { for (mx::NodePtr node : nodeGraph->getNodes()) { - // Check the inputs of the node for UV0 default geom properties mx::NodeDefPtr nodeDef = node->getNodeDef(); // A missing node def is a very bad sign. No need to process further. if (!TF_VERIFY( @@ -407,60 +566,160 @@ void _AddMissingTexcoordReaders(mx::DocumentPtr& mtlxDoc) node->getNamePath().c_str())) { return; } - for (mx::InputPtr input : nodeDef->getInputs()) { - if (input->hasDefaultGeomPropString() - && input->getDefaultGeomPropString() == _mtlxTokens->UV0.GetString()) { - // See if the corresponding input is connected on the node: - if (node->getConnectedNodeName(input->getName()).empty()) { - // Create emergency ST reader if necessary - if (!stReader) { - stReader = nodeGraph->addNode( - _mtlxTokens->geompropvalue.GetString(), - _mtlxTokens->ST_reader.GetString(), - _mtlxTokens->vector2.GetString()); - mx::ValueElementPtr prpInput - = stReader->addInputFromNodeDef(_mtlxTokens->geomprop.GetString()); - prpInput->setValueString(_tokens->st.GetString()); - } - node->addInputFromNodeDef(input->getName()); - node->setConnectedNodeName(input->getName(), stReader->getName()); - } + + if (!stReader && nodeDef->getNodeString() == _mtlxTokens->geompropvalue.GetString() + && node->getType() == _mtlxTokens->vector2.GetString()) { + // Grab the first st reader we can find. This will be the default one used for + // tangents unless we find something better. + stReader = node; + continue; + } + + if (nodeDef->getNodeString() == _mtlxTokens->normalmap.GetString()) { + // That one is even more important, because the texcoord reader attached to the + // image is definitely the one we want for our tangents since it is used for normal + // mapping: + mx::NodePtr downstreamReader = _RecursiveFindNode(node, _mtlxTokens->geompropvalue); + if (downstreamReader) { + stReader = downstreamReader; } } - // Check if it is an explicit texcoord reader: - if (nodeDef->getNodeString() == "texcoord") { - // Switch it with a geompropvalue of the same name: - std::string nodeName = node->getName(); - std::string oldName = nodeName + "_toDelete"; - node->setName(oldName); - nodesToDelete.push_back(oldName); - // Find out if there is an explicit stream index: - int streamIndex = 0; - mx::InputPtr indexInput = node->getInput(_mtlxTokens->index.GetString()); - if (indexInput && indexInput->hasValue()) { - mx::ValuePtr indexValue = indexInput->getValue(); - if (indexValue->isA()) { - streamIndex = indexValue->asA(); + + // Check the inputs of the node for Tworld and Tobject default geom properties + for (mx::InputPtr input : nodeDef->getActiveInputs()) { + if (input->hasDefaultGeomPropString()) { + const std::string& geomPropString = input->getDefaultGeomPropString(); + if (geomPropString == _mtlxTokens->Tworld.GetString() + && node->getConnectedNodeName(input->getName()).empty()) { + graphTworldInputs.emplace_back(node, input->getName()); + } + if (geomPropString == _mtlxTokens->Tobject.GetString() + && node->getConnectedNodeName(input->getName()).empty()) { + graphTobjectInputs.emplace_back(node, input->getName()); } } - // Add replacement geompropvalue node: - mx::NodePtr doppelNode = nodeGraph->addNode( - _mtlxTokens->geompropvalue.GetString(), - nodeName, - nodeDef->getOutput("out")->getType()); - mx::ValueElementPtr prpInput - = doppelNode->addInputFromNodeDef(_mtlxTokens->geomprop.GetString()); - MString primvar = _tokens->st.GetText(); - if (streamIndex) { - // If reading at index > 0 we add the index to the primvar name: - primvar += streamIndex; + } + // Check if it is an explicit tangent reader: + if (nodeDef->getNodeString() == _mtlxTokens->tangent.GetString()) { + nodesToReplace.push_back(node); + } + } + + if (nodesToReplace.empty() && graphTworldInputs.empty() && graphTobjectInputs.empty() + && materialTworldInputs.empty() && materialTobjectInputs.empty()) { + // Nothing to do. + return; + } + + // Create the tangent generator: + mx::NodePtr tangentGenerator; + if (stReader) { + tangentGenerator = nodeGraph->addNode( + _mtlxTokens->texcoordtangents.GetString(), + _mtlxTokens->Tw_reader.GetString(), + _mtlxTokens->vector3.GetString()); + tangentGenerator->addInputFromNodeDef(_mtlxTokens->texcoord.GetString()); + tangentGenerator->setConnectedNodeName( + _mtlxTokens->texcoord.GetString(), stReader->getName()); + } else { + tangentGenerator = nodeGraph->addNode( + _mtlxTokens->arbitrarytangents.GetString(), + _mtlxTokens->Tw_reader.GetString(), + _mtlxTokens->vector3.GetString()); + } + + // We create a world -> object transformation on demand. Computing an object tangent from + // object space normal and position might be more precise though. + mx::NodePtr transformVectorToObject; + mx::NodePtr transformVectorToModel; + auto _createTransformVector = [&](const TfToken& toSpace) { + mx::NodePtr retVal = nodeGraph->addNode( + _mtlxTokens->transformvector.GetString(), + _mtlxTokens->Tw_to_To.GetString(), + _mtlxTokens->vector3.GetString()); + retVal->addInputFromNodeDef(_mtlxTokens->in.GetString()); + retVal->setConnectedNodeName(_mtlxTokens->in.GetString(), tangentGenerator->getName()); + retVal->addInputFromNodeDef(_mtlxTokens->fromspace.GetString()) + ->setValueString(_mtlxTokens->world.GetString()); + retVal->addInputFromNodeDef(_mtlxTokens->tospace.GetString()) + ->setValueString(toSpace.GetString()); + return retVal; + }; + + // Reconnect nodes that require Tworld to the tangent generator: + for (const auto& nodeInput : graphTworldInputs) { + nodeInput.first->addInputFromNodeDef(nodeInput.second); + nodeInput.first->setConnectedNodeName(nodeInput.second, tangentGenerator->getName()); + } + + // Reconnect nodes that require Tobject to the tangent generator via a space transform: + for (const auto& nodeInput : graphTobjectInputs) { + if (!transformVectorToObject) { + transformVectorToObject = _createTransformVector(_mtlxTokens->object); + } + nodeInput.first->addInputFromNodeDef(nodeInput.second); + nodeInput.first->setConnectedNodeName( + nodeInput.second, transformVectorToObject->getName()); + } + + // Connect Tworld inputs on the material via an output port on the nodegraph: + mx::OutputPtr outTworld = nodeGraph->getOutput(_mtlxTokens->outTworld.GetString()); + for (const auto& nodeInput : materialTworldInputs) { + if (!outTworld) { + outTworld = nodeGraph->addOutput( + _mtlxTokens->outTworld.GetString(), _mtlxTokens->vector3.GetString()); + outTworld->setConnectedNode(tangentGenerator); + } + nodeInput.first->addInputFromNodeDef(nodeInput.second); + nodeInput.first->setConnectedOutput(nodeInput.second, outTworld); + } + + // Connect Tobject inputs on the material via an output port on the nodegraph: + mx::OutputPtr outTobject = nodeGraph->getOutput(_mtlxTokens->outTobject.GetString()); + for (const auto& nodeInput : materialTobjectInputs) { + if (!outTobject) { + outTobject = nodeGraph->addOutput( + _mtlxTokens->outTworld.GetString(), _mtlxTokens->vector3.GetString()); + if (!transformVectorToObject) { + transformVectorToObject = _createTransformVector(_mtlxTokens->object); } - prpInput->setValueString(primvar.asChar()); + outTobject->setConnectedNode(transformVectorToObject); } + nodeInput.first->addInputFromNodeDef(nodeInput.second); + nodeInput.first->setConnectedOutput(nodeInput.second, outTobject); } - // Delete all obsolete texcoord reader nodes. - for (const std::string& deadNode : nodesToDelete) { - nodeGraph->removeNode(deadNode); + + // We will replace tangent nodes with a passthru that feeds on the tangent generator. A + // space transform will be used when appropriate. + auto replaceWithPassthru = [&](mx::NodePtr& toReplace, mx::NodePtr& newSource) { + std::string nodeName = toReplace->getName(); + + nodeGraph->removeNode(nodeName); + + mx::NodePtr passthruNode = nodeGraph->addNode( + _mtlxTokens->constant.GetString(), nodeName, _mtlxTokens->vector3.GetString()); + passthruNode->addInputFromNodeDef(_mtlxTokens->in.GetString()); + passthruNode->setConnectedNodeName(_mtlxTokens->in.GetString(), newSource->getName()); + }; + + for (auto& tangentNode : nodesToReplace) { + mx::InputPtr spaceInput = tangentNode->getInput(_mtlxTokens->space.GetString()); + if (spaceInput) { + if (spaceInput->getValueString() == _mtlxTokens->object.GetString()) { + if (!transformVectorToObject) { + transformVectorToObject = _createTransformVector(_mtlxTokens->object); + } + replaceWithPassthru(tangentNode, transformVectorToObject); + } else if (spaceInput->getValueString() == _mtlxTokens->model.GetString()) { + if (!transformVectorToModel) { + transformVectorToModel = _createTransformVector(_mtlxTokens->model); + } + replaceWithPassthru(tangentNode, transformVectorToModel); + } else { + // Default to world. + replaceWithPassthru(tangentNode, tangentGenerator); + } + } } } } @@ -1838,8 +2097,9 @@ MHWRender::MShaderInstance* HdVP2Material::_CreateMaterialXShaderInstance( return shaderInstance; } - // Fix any missing texcoord reader. + // Touchups required to fix input stream issues: _AddMissingTexcoordReaders(mtlxDoc); + _AddMissingTangents(mtlxDoc); _surfaceShaderId = terminalPath; @@ -1927,8 +2187,19 @@ MHWRender::MShaderInstance* HdVP2Material::_CreateMaterialXShaderInstance( } } - // Add automatic tangent generation: - shaderInstance->addInputFragment("materialXTw", "Tw", "Tw"); + // Fixup inputs that were renamed because they conflicted with reserved keywords: + for (const auto& namePair : ogsFragment.getPathInputMap()) { + std::string path = namePair.first; + std::string input = namePair.second; + // Renaming adds digits at the end, so only compare the backs. + if (path.back() != input.back()) { + MString uniqueName(input.c_str()); + while (!input.empty() && path.back() != input.back()) { + input.pop_back(); + } + shaderInstance->renameParameter(uniqueName, input.c_str()); + } + } shaderInstance->setIsTransparent(ogsFragment.isTransparent()); diff --git a/lib/mayaUsd/render/vp2ShaderFragments/CMakeLists.txt b/lib/mayaUsd/render/vp2ShaderFragments/CMakeLists.txt index b07b437e56..62df598b63 100644 --- a/lib/mayaUsd/render/vp2ShaderFragments/CMakeLists.txt +++ b/lib/mayaUsd/render/vp2ShaderFragments/CMakeLists.txt @@ -62,13 +62,6 @@ list(APPEND SHADERFRAGMENTS_XMLS plugInfo.json ) -if(CMAKE_WANT_MATERIALX_BUILD) - list(APPEND SHADERFRAGMENTS_XMLS - # MaterialX - materialXTw.xml - ) -endif() - set(HEADERS shaderFragments.h ) diff --git a/lib/mayaUsd/render/vp2ShaderFragments/materialXTw.xml b/lib/mayaUsd/render/vp2ShaderFragments/materialXTw.xml deleted file mode 100644 index bf34bc7a9c..0000000000 --- a/lib/mayaUsd/render/vp2ShaderFragments/materialXTw.xml +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/lib/mayaUsd/render/vp2ShaderFragments/shaderFragments.cpp b/lib/mayaUsd/render/vp2ShaderFragments/shaderFragments.cpp index 98ca1e6caa..bbf03b2843 100644 --- a/lib/mayaUsd/render/vp2ShaderFragments/shaderFragments.cpp +++ b/lib/mayaUsd/render/vp2ShaderFragments/shaderFragments.cpp @@ -311,29 +311,6 @@ MStatus HdVP2ShaderFragments::registerFragments() } } -#ifdef WANT_MATERIALX_BUILD - { - const MString fragName("materialXTw"); - - if (!fragmentManager->hasFragment(fragName)) { - const std::string fragXmlFile = TfStringPrintf("%s.xml", fragName.asChar()); - const std::string fragXmlPath = _GetResourcePath(fragXmlFile); - - const MString addedName - = fragmentManager->addShadeFragmentFromFile(fragXmlPath.c_str(), false); - - if (addedName != fragName) { - MGlobal::displayError(TfStringPrintf( - "Failed to register fragment '%s' from file: %s", - fragName.asChar(), - fragXmlPath.c_str()) - .c_str()); - return MS::kFailure; - } - } - } -#endif - // Register all fragment graphs. for (const TfToken& fragGraphNameToken : _FragmentGraphNames) { const MString fragGraphName(fragGraphNameToken.GetText()); @@ -626,17 +603,6 @@ MStatus HdVP2ShaderFragments::deregisterFragments() } } -#ifdef WANT_MATERIALX_BUILD - { - const MString fragName("materialXTw"); - if (!fragmentManager->removeFragment(fragName)) { - MGlobal::displayWarning( - TfStringPrintf("Failed to remove fragment: %s", fragName.asChar()).c_str()); - return MS::kFailure; - } - } -#endif - // De-register all fragments. for (const TfToken& fragNameToken : _FragmentNames) { const MString fragName(fragNameToken.GetText()); diff --git a/lib/usd/translators/shading/mtlxBaseWriter.cpp b/lib/usd/translators/shading/mtlxBaseWriter.cpp index 9d2100a9c3..d1f7022dc0 100644 --- a/lib/usd/translators/shading/mtlxBaseWriter.cpp +++ b/lib/usd/translators/shading/mtlxBaseWriter.cpp @@ -18,8 +18,12 @@ #include "shadingTokens.h" #include +#include #include +#include #include +#include +#include #include #include #include @@ -63,6 +67,13 @@ TF_DEFINE_PRIVATE_TOKENS( ((SwizzlePrefix, "MayaSwizzle")) ((LuminancePrefix, "MayaLuminance")) ((NormalMapPrefix, "MayaNormalMap")) + + (lambert) + (MayaND_lambert_surfaceshader) + (phong) + (MayaND_phong_surfaceshader) + (blinn) + (MayaND_blinn_surfaceshader) ); // clang-format on @@ -72,6 +83,27 @@ REGISTER_SHADING_MODE_EXPORT_MATERIAL_CONVERSION( TrMtlxTokens->niceName, TrMtlxTokens->exportDescription); +// Register symmetric writers: +TF_REGISTRY_FUNCTION(UsdMayaShaderWriterRegistry) +{ + UsdMayaSymmetricShaderWriter::RegisterWriter( + _tokens->lambert, _tokens->MayaND_lambert_surfaceshader, TrMtlxTokens->conversionName); + UsdMayaSymmetricShaderWriter::RegisterWriter( + _tokens->phong, _tokens->MayaND_phong_surfaceshader, TrMtlxTokens->conversionName); + UsdMayaSymmetricShaderWriter::RegisterWriter( + _tokens->blinn, _tokens->MayaND_blinn_surfaceshader, TrMtlxTokens->conversionName); +}; + +TF_REGISTRY_FUNCTION(UsdMayaShaderReaderRegistry) +{ + UsdMayaSymmetricShaderReader::RegisterReader( + _tokens->MayaND_lambert_surfaceshader, _tokens->lambert, TrMtlxTokens->conversionName); + UsdMayaSymmetricShaderReader::RegisterReader( + _tokens->MayaND_phong_surfaceshader, _tokens->phong, TrMtlxTokens->conversionName); + UsdMayaSymmetricShaderReader::RegisterReader( + _tokens->MayaND_blinn_surfaceshader, _tokens->blinn, TrMtlxTokens->conversionName); +}; + UsdMayaShaderWriter::ContextSupport MtlxUsd_BaseWriter::CanExport(const UsdMayaJobExportArgs& exportArgs) { diff --git a/test/lib/mayaUsd/fileio/testShaderWriter.py b/test/lib/mayaUsd/fileio/testShaderWriter.py index 222bde4fbb..f2083fb182 100644 --- a/test/lib/mayaUsd/fileio/testShaderWriter.py +++ b/test/lib/mayaUsd/fileio/testShaderWriter.py @@ -62,17 +62,17 @@ def setUp(self): cmds.file(new=True, force=True) def testSimpleShaderWriter(self): - mayaUsdLib.ShaderWriter.Register(shaderWriterTest, "lambert") + mayaUsdLib.ShaderWriter.Register(shaderWriterTest, "phongE") cmds.file(f=True, new=True) sphere_xform = cmds.polySphere()[0] - # Need a lambert, with something connected to exercise the + # Need a phongE, with something connected to exercise the # full API. The code will survive the test writer not even - # creating a UsdShade node for the lambert. - material_node = cmds.shadingNode("lambert", asShader=True, - name="Lanbert42") + # creating a UsdShade node for the phongE. + material_node = cmds.shadingNode("phongE", asShader=True, + name="phongE42") material_sg = cmds.sets(renderable=True, noSurfaceShader=True, empty=True, name=material_node+"SG") @@ -101,7 +101,7 @@ def testSimpleShaderWriter(self): # Export to USD. We select MaterialX because all the writer # there are reporting "Fallback", which allows our CanExport # to always win with "Supported" (also helps that the current - # version of the MaterialX export does not support lambert). + # version of the MaterialX export does not support phongE). usdFilePath = os.path.join(self.temp_dir,'testShaderWriter.usda') cmds.mayaUSDExport(mergeTransformAndShape=True, file=usdFilePath, shadingMode='useRegistry', convertMaterialsTo=['MaterialX'], diff --git a/test/lib/mayaUsd/render/vp2RenderDelegate/VP2RenderDelegateMaterialXTest/baseline/MayaSurfaces_render.png b/test/lib/mayaUsd/render/vp2RenderDelegate/VP2RenderDelegateMaterialXTest/baseline/MayaSurfaces_render.png new file mode 100644 index 0000000000..f1dfa46aa3 Binary files /dev/null and b/test/lib/mayaUsd/render/vp2RenderDelegate/VP2RenderDelegateMaterialXTest/baseline/MayaSurfaces_render.png differ diff --git a/test/lib/mayaUsd/render/vp2RenderDelegate/testVP2RenderDelegateMaterialX.py b/test/lib/mayaUsd/render/vp2RenderDelegate/testVP2RenderDelegateMaterialX.py index 8edad7be0e..10047b3864 100644 --- a/test/lib/mayaUsd/render/vp2RenderDelegate/testVP2RenderDelegateMaterialX.py +++ b/test/lib/mayaUsd/render/vp2RenderDelegate/testVP2RenderDelegateMaterialX.py @@ -57,8 +57,6 @@ def assertSnapshotClose(self, imageName): return self.assertImagesClose(baselineImage, snapshotImage) def _StartTest(self, testName): - cmds.file(force=True, new=True) - cmds.move(2, -2, 1.5, 'persp') mayaUtils.loadPlugin("mayaUsdPlugin") self._testName = testName @@ -71,8 +69,15 @@ def _StartTest(self, testName): def testUVStreamManagement(self): """Test that a scene without primvar readers renders correctly if it uses indexed UV streams""" + cmds.file(force=True, new=True) + cmds.move(2, -2, 1.5, 'persp') self._StartTest('MtlxUVStreamTest') + def testMayaSurfaces(self): + cmds.file(force=True, new=True) + cmds.move(6, -6, 6, 'persp') + cmds.rotate(60, 0, 45, 'persp') + self._StartTest('MayaSurfaces') if __name__ == '__main__': diff --git a/test/testSamples/MaterialX/MayaSurfaces.usda b/test/testSamples/MaterialX/MayaSurfaces.usda new file mode 100644 index 0000000000..3daebd23ef --- /dev/null +++ b/test/testSamples/MaterialX/MayaSurfaces.usda @@ -0,0 +1,319 @@ +#usda 1.0 +( + defaultPrim = "pCube1" + metersPerUnit = 0.01 + upAxis = "Y" +) + +def Mesh "pCube1" ( + prepend apiSchemas = ["MaterialBindingAPI"] + kind = "component" +) +{ + uniform bool doubleSided = 1 + float3[] extent = [(-0.5, -0.5, -0.5), (0.5, 0.5, 0.5)] + int[] faceVertexCounts = [4, 4, 4, 4, 4, 4] + int[] faceVertexIndices = [0, 1, 3, 2, 2, 3, 5, 4, 4, 5, 7, 6, 6, 7, 1, 0, 1, 7, 5, 3, 6, 0, 2, 4] + rel material:binding = + normal3f[] normals = [(0, 0, 1), (0, 0, 1), (0, 0, 1), (0, 0, 1), (0, 1, 0), (0, 1, 0), (0, 1, 0), (0, 1, 0), (0, 0, -1), (0, 0, -1), (0, 0, -1), (0, 0, -1), (0, -1, 0), (0, -1, 0), (0, -1, 0), (0, -1, 0), (1, 0, 0), (1, 0, 0), (1, 0, 0), (1, 0, 0), (-1, 0, 0), (-1, 0, 0), (-1, 0, 0), (-1, 0, 0)] ( + interpolation = "faceVarying" + ) + point3f[] points = [(-0.5, -0.5, 0.5), (0.5, -0.5, 0.5), (-0.5, 0.5, 0.5), (0.5, 0.5, 0.5), (-0.5, 0.5, -0.5), (0.5, 0.5, -0.5), (-0.5, -0.5, -0.5), (0.5, -0.5, -0.5)] + texCoord2f[] primvars:st = [(0.375, 0), (0.625, 0), (0.375, 0.25), (0.625, 0.25), (0.375, 0.5), (0.625, 0.5), (0.375, 0.75), (0.625, 0.75), (0.375, 1), (0.625, 1), (0.875, 0), (0.875, 0.25), (0.125, 0), (0.125, 0.25)] ( + customData = { + dictionary Maya = { + token name = "map1" + } + } + interpolation = "faceVarying" + ) + int[] primvars:st:indices = [0, 1, 3, 2, 2, 3, 5, 4, 4, 5, 7, 6, 6, 7, 9, 8, 1, 10, 11, 3, 12, 0, 2, 13] + uniform token subdivisionScheme = "none" + double3 xformOp:translate = (-0.6840338073485981, -0.6536323047997818, 0.037234084329256234) + uniform token[] xformOpOrder = ["xformOp:translate"] + + def Scope "Looks" + { + def Material "lambert2SG" + { + string inputs:file1:varnameStr = "st" + token outputs:mtlx:surface.connect = + + def Shader "lambert2" + { + uniform token info:id = "MayaND_lambert_surfaceshader" + color3f inputs:color = (0, 0, 0) + color3f inputs:color.connect = + color3f outputs:outColor + token outputs:surface + } + + def NodeGraph "MayaNG_lambert2SG" + { + string inputs:file1:varnameStr.connect = + + def Shader "file1" + { + uniform token info:id = "ND_image_color4" + color4f inputs:default = (0.5, 0.5, 0.5, 1) + asset inputs:file = @grid.png@ + float2 inputs:texcoord.connect = + string inputs:uaddressmode = "periodic" + string inputs:vaddressmode = "periodic" + color4f outputs:out + } + + def Shader "place2dTexture1" + { + uniform token info:id = "ND_geompropvalue_vector2" + string inputs:geomprop.connect = + float2 outputs:out + } + + def Shader "MayaSwizzle_file1_rgb" + { + uniform token info:id = "ND_swizzle_color4_color3" + string inputs:channels = "rgb" + color4f inputs:in.connect = + color3f outputs:out + } + } + } + } +} + +def Mesh "pCube2" ( + prepend apiSchemas = ["MaterialBindingAPI"] + kind = "component" +) +{ + uniform bool doubleSided = 1 + float3[] extent = [(-0.5, -0.5, -0.5), (0.5, 0.5, 0.5)] + int[] faceVertexCounts = [4, 4, 4, 4, 4, 4] + int[] faceVertexIndices = [0, 1, 3, 2, 2, 3, 5, 4, 4, 5, 7, 6, 6, 7, 1, 0, 1, 7, 5, 3, 6, 0, 2, 4] + rel material:binding = + normal3f[] normals = [(0, 0, 1), (0, 0, 1), (0, 0, 1), (0, 0, 1), (0, 1, 0), (0, 1, 0), (0, 1, 0), (0, 1, 0), (0, 0, -1), (0, 0, -1), (0, 0, -1), (0, 0, -1), (0, -1, 0), (0, -1, 0), (0, -1, 0), (0, -1, 0), (1, 0, 0), (1, 0, 0), (1, 0, 0), (1, 0, 0), (-1, 0, 0), (-1, 0, 0), (-1, 0, 0), (-1, 0, 0)] ( + interpolation = "faceVarying" + ) + point3f[] points = [(-0.5, -0.5, 0.5), (0.5, -0.5, 0.5), (-0.5, 0.5, 0.5), (0.5, 0.5, 0.5), (-0.5, 0.5, -0.5), (0.5, 0.5, -0.5), (-0.5, -0.5, -0.5), (0.5, -0.5, -0.5)] + texCoord2f[] primvars:st = [(0.375, 0), (0.625, 0), (0.375, 0.25), (0.625, 0.25), (0.375, 0.5), (0.625, 0.5), (0.375, 0.75), (0.625, 0.75), (0.375, 1), (0.625, 1), (0.875, 0), (0.875, 0.25), (0.125, 0), (0.125, 0.25)] ( + customData = { + dictionary Maya = { + token name = "map1" + } + } + interpolation = "faceVarying" + ) + int[] primvars:st:indices = [0, 1, 3, 2, 2, 3, 5, 4, 4, 5, 7, 6, 6, 7, 9, 8, 1, 10, 11, 3, 12, 0, 2, 13] + uniform token subdivisionScheme = "none" + double3 xformOp:translate = (-0.7167478865167949, -0.6968933744249144, 1.797892421246913) + uniform token[] xformOpOrder = ["xformOp:translate"] + + def Scope "Looks" + { + def Material "standardSurface2SG" + { + string inputs:file2:varnameStr = "st" + token outputs:mtlx:surface.connect = + + def Shader "standardSurface2" + { + uniform token info:id = "ND_standard_surface_surfaceshader" + float inputs:base = 1 + color3f inputs:base_color.connect = + float inputs:specular = 1 + float inputs:specular_roughness = 0.4 + token outputs:surface + } + + def NodeGraph "MayaNG_standardSurface2SG" + { + string inputs:file2:varnameStr.connect = + color3f outputs:baseColor.connect = + + def Shader "file2" + { + uniform token info:id = "ND_image_color4" + color4f inputs:default = (0.5, 0.5, 0.5, 1) + asset inputs:file = @grid.png@ + float2 inputs:texcoord.connect = + string inputs:uaddressmode = "periodic" + string inputs:vaddressmode = "periodic" + color4f outputs:out + } + + def Shader "place2dTexture2" + { + uniform token info:id = "ND_geompropvalue_vector2" + string inputs:geomprop.connect = + float2 outputs:out + } + + def Shader "MayaSwizzle_file2_rgb" + { + uniform token info:id = "ND_swizzle_color4_color3" + string inputs:channels = "rgb" + color4f inputs:in.connect = + color3f outputs:out + } + } + } + } +} + +def Mesh "pPlatonic1" ( + prepend apiSchemas = ["MaterialBindingAPI"] + kind = "component" +) +{ + uniform bool doubleSided = 1 + float3[] extent = [(-0.47552827, -0.49999997, -0.5), (0.47552827, 0.49999997, 0.5)] + int[] faceVertexCounts = [3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3] + int[] faceVertexIndices = [0, 12, 13, 12, 2, 14, 12, 14, 13, 13, 14, 1, 0, 15, 12, 15, 3, 16, 15, 16, 12, 12, 16, 2, 0, 17, 15, 17, 4, 18, 17, 18, 15, 15, 18, 3, 0, 19, 17, 19, 5, 20, 19, 20, 17, 17, 20, 4, 0, 13, 19, 13, 1, 21, 13, 21, 19, 19, 21, 5, 1, 14, 22, 14, 2, 23, 14, 23, 22, 22, 23, 7, 2, 16, 24, 16, 3, 25, 16, 25, 24, 24, 25, 8, 3, 18, 26, 18, 4, 27, 18, 27, 26, 26, 27, 9, 4, 20, 28, 20, 5, 29, 20, 29, 28, 28, 29, 10, 5, 21, 30, 21, 1, 31, 21, 31, 30, 30, 31, 6, 1, 22, 31, 22, 7, 32, 22, 32, 31, 31, 32, 6, 2, 24, 23, 24, 8, 33, 24, 33, 23, 23, 33, 7, 3, 26, 25, 26, 9, 34, 26, 34, 25, 25, 34, 8, 4, 28, 27, 28, 10, 35, 28, 35, 27, 27, 35, 9, 5, 30, 29, 30, 6, 36, 30, 36, 29, 29, 36, 10, 6, 32, 37, 32, 7, 38, 32, 38, 37, 37, 38, 11, 7, 33, 38, 33, 8, 39, 33, 39, 38, 38, 39, 11, 8, 34, 39, 34, 9, 40, 34, 40, 39, 39, 40, 11, 9, 35, 40, 35, 10, 41, 35, 41, 40, 40, 41, 11, 10, 36, 41, 36, 6, 37, 36, 37, 41, 41, 37, 11] + rel material:binding = + normal3f[] normals = [(-8.961551e-8, 4.7166058e-9, -0.99999994), (-0.16245979, 0.49999997, -0.8506509), (0.42532533, 0.309017, -0.85065085), (-0.16245979, 0.49999997, -0.8506509), (-0.27639323, 0.8506508, -0.4472136), (0.26286563, 0.80901694, -0.5257311), (-0.16245979, 0.49999997, -0.8506509), (0.26286563, 0.80901694, -0.5257311), (0.42532533, 0.309017, -0.85065085), (0.42532533, 0.309017, -0.85065085), (0.26286563, 0.80901694, -0.5257311), (0.7236067, 0.5257312, -0.44721362), (-8.961551e-8, 4.7166058e-9, -0.99999994), (-0.525731, 0, -0.8506509), (-0.16245979, 0.49999997, -0.8506509), (-0.525731, 0, -0.8506509), (-0.8944272, -6.131587e-8, -0.4472135), (-0.68819106, 0.49999994, -0.52573115), (-0.525731, 0, -0.8506509), (-0.68819106, 0.49999994, -0.52573115), (-0.16245979, 0.49999997, -0.8506509), (-0.16245979, 0.49999997, -0.8506509), (-0.68819106, 0.49999994, -0.52573115), (-0.27639323, 0.8506508, -0.4472136), (-8.961551e-8, 4.7166058e-9, -0.99999994), (-0.16245987, -0.49999997, -0.85065085), (-0.525731, 0, -0.8506509), (-0.16245987, -0.49999997, -0.85065085), (-0.2763933, -0.85065085, -0.44721344), (-0.68819094, -0.50000006, -0.5257311), (-0.16245987, -0.49999997, -0.85065085), (-0.68819094, -0.50000006, -0.5257311), (-0.525731, 0, -0.8506509), (-0.525731, 0, -0.8506509), (-0.68819094, -0.50000006, -0.5257311), (-0.8944272, -6.131587e-8, -0.4472135), (-8.961551e-8, 4.7166058e-9, -0.99999994), (0.42532533, -0.30901697, -0.85065085), (-0.16245987, -0.49999997, -0.85065085), (0.42532533, -0.30901697, -0.85065085), (0.7236067, -0.52573115, -0.44721362), (0.26286548, -0.80901706, -0.52573115), (0.42532533, -0.30901697, -0.85065085), (0.26286548, -0.80901706, -0.52573115), (-0.16245987, -0.49999997, -0.85065085), (-0.16245987, -0.49999997, -0.85065085), (0.26286548, -0.80901706, -0.52573115), (-0.2763933, -0.85065085, -0.44721344), (-8.961551e-8, 4.7166058e-9, -0.99999994), (0.42532533, 0.309017, -0.85065085), (0.42532533, -0.30901697, -0.85065085), (0.42532533, 0.309017, -0.85065085), (0.7236067, 0.5257312, -0.44721362), (0.85065085, 2.2347578e-8, -0.5257311), (0.42532533, 0.309017, -0.85065085), (0.85065085, 2.2347578e-8, -0.5257311), (0.42532533, -0.30901697, -0.85065085), (0.42532533, -0.30901697, -0.85065085), (0.85065085, 2.2347578e-8, -0.5257311), (0.7236067, -0.52573115, -0.44721362), (0.7236067, 0.5257312, -0.44721362), (0.26286563, 0.80901694, -0.5257311), (0.58778524, 0.809017, 1.7878063e-8), (0.26286563, 0.80901694, -0.5257311), (-0.27639323, 0.8506508, -0.4472136), (2.12302e-8, 1, 1.2067693e-7), (0.26286563, 0.80901694, -0.5257311), (2.12302e-8, 1, 1.2067693e-7), (0.58778524, 0.809017, 1.7878063e-8), (0.58778524, 0.809017, 1.7878063e-8), (2.12302e-8, 1, 1.2067693e-7), (0.27639312, 0.8506508, 0.44721362), (-0.27639323, 0.8506508, -0.4472136), (-0.68819106, 0.49999994, -0.52573115), (-0.58778524, 0.80901694, -8.93903e-9), (-0.68819106, 0.49999994, -0.52573115), (-0.8944272, -6.131587e-8, -0.4472135), (-0.95105654, 0.30901697, 1.7878062e-8), (-0.68819106, 0.49999994, -0.52573115), (-0.95105654, 0.30901697, 1.7878062e-8), (-0.58778524, 0.80901694, -8.93903e-9), (-0.58778524, 0.80901694, -8.93903e-9), (-0.95105654, 0.30901697, 1.7878062e-8), (-0.72360677, 0.5257311, 0.44721362), (-0.8944272, -6.131587e-8, -0.4472135), (-0.68819094, -0.50000006, -0.5257311), (-0.9510565, -0.3090171, 4.469516e-8), (-0.68819094, -0.50000006, -0.5257311), (-0.2763933, -0.85065085, -0.44721344), (-0.5877852, -0.80901706, 5.8103712e-8), (-0.68819094, -0.50000006, -0.5257311), (-0.5877852, -0.80901706, 5.8103712e-8), (-0.9510565, -0.3090171, 4.469516e-8), (-0.9510565, -0.3090171, 4.469516e-8), (-0.5877852, -0.80901706, 5.8103712e-8), (-0.7236067, -0.5257312, 0.4472136), (-0.2763933, -0.85065085, -0.44721344), (0.26286548, -0.80901706, -0.52573115), (4.022564e-8, -1, 1.3855498e-7), (0.26286548, -0.80901706, -0.52573115), (0.7236067, -0.52573115, -0.44721362), (0.58778524, -0.809017, 8.939032e-9), (0.26286548, -0.80901706, -0.52573115), (0.58778524, -0.809017, 8.939032e-9), (4.022564e-8, -1, 1.3855498e-7), (4.022564e-8, -1, 1.3855498e-7), (0.58778524, -0.809017, 8.939032e-9), (0.27639323, -0.8506508, 0.44721362), (0.7236067, -0.52573115, -0.44721362), (0.85065085, 2.2347578e-8, -0.5257311), (0.9510565, -0.30901706, -8.045129e-8), (0.85065085, 2.2347578e-8, -0.5257311), (0.7236067, 0.5257312, -0.44721362), (0.9510565, 0.30901703, 0), (0.85065085, 2.2347578e-8, -0.5257311), (0.9510565, 0.30901703, 0), (0.9510565, -0.30901706, -8.045129e-8), (0.9510565, -0.30901706, -8.045129e-8), (0.9510565, 0.30901703, 0), (0.8944272, 7.54657e-8, 0.44721362), (0.7236067, 0.5257312, -0.44721362), (0.58778524, 0.809017, 1.7878063e-8), (0.9510565, 0.30901703, 0), (0.58778524, 0.809017, 1.7878063e-8), (0.27639312, 0.8506508, 0.44721362), (0.688191, 0.5, 0.52573115), (0.58778524, 0.809017, 1.7878063e-8), (0.688191, 0.5, 0.52573115), (0.9510565, 0.30901703, 0), (0.9510565, 0.30901703, 0), (0.688191, 0.5, 0.52573115), (0.8944272, 7.54657e-8, 0.44721362), (-0.27639323, 0.8506508, -0.4472136), (-0.58778524, 0.80901694, -8.93903e-9), (2.12302e-8, 1, 1.2067693e-7), (-0.58778524, 0.80901694, -8.93903e-9), (-0.72360677, 0.5257311, 0.44721362), (-0.26286557, 0.80901706, 0.5257311), (-0.58778524, 0.80901694, -8.93903e-9), (-0.26286557, 0.80901706, 0.5257311), (2.12302e-8, 1, 1.2067693e-7), (2.12302e-8, 1, 1.2067693e-7), (-0.26286557, 0.80901706, 0.5257311), (0.27639312, 0.8506508, 0.44721362), (-0.8944272, -6.131587e-8, -0.4472135), (-0.9510565, -0.3090171, 4.469516e-8), (-0.95105654, 0.30901697, 1.7878062e-8), (-0.9510565, -0.3090171, 4.469516e-8), (-0.7236067, -0.5257312, 0.4472136), (-0.85065085, -1.6621586e-7, 0.525731), (-0.9510565, -0.3090171, 4.469516e-8), (-0.85065085, -1.6621586e-7, 0.525731), (-0.95105654, 0.30901697, 1.7878062e-8), (-0.95105654, 0.30901697, 1.7878062e-8), (-0.85065085, -1.6621586e-7, 0.525731), (-0.72360677, 0.5257311, 0.44721362), (-0.2763933, -0.85065085, -0.44721344), (4.022564e-8, -1, 1.3855498e-7), (-0.5877852, -0.80901706, 5.8103712e-8), (4.022564e-8, -1, 1.3855498e-7), (0.27639323, -0.8506508, 0.44721362), (-0.26286545, -0.80901706, 0.5257311), (4.022564e-8, -1, 1.3855498e-7), (-0.26286545, -0.80901706, 0.5257311), (-0.5877852, -0.80901706, 5.8103712e-8), (-0.5877852, -0.80901706, 5.8103712e-8), (-0.26286545, -0.80901706, 0.5257311), (-0.7236067, -0.5257312, 0.4472136), (0.7236067, -0.52573115, -0.44721362), (0.9510565, -0.30901706, -8.045129e-8), (0.58778524, -0.809017, 8.939032e-9), (0.9510565, -0.30901706, -8.045129e-8), (0.8944272, 7.54657e-8, 0.44721362), (0.688191, -0.5, 0.5257311), (0.9510565, -0.30901706, -8.045129e-8), (0.688191, -0.5, 0.5257311), (0.58778524, -0.809017, 8.939032e-9), (0.58778524, -0.809017, 8.939032e-9), (0.688191, -0.5, 0.5257311), (0.27639323, -0.8506508, 0.44721362), (0.8944272, 7.54657e-8, 0.44721362), (0.688191, 0.5, 0.52573115), (0.52573115, 3.7990883e-8, 0.85065085), (0.688191, 0.5, 0.52573115), (0.27639312, 0.8506508, 0.44721362), (0.16245979, 0.5, 0.8506508), (0.688191, 0.5, 0.52573115), (0.16245979, 0.5, 0.8506508), (0.52573115, 3.7990883e-8, 0.85065085), (0.52573115, 3.7990883e-8, 0.85065085), (0.16245979, 0.5, 0.8506508), (-9.4332115e-9, -1.4149817e-8, 0.99999994), (0.27639312, 0.8506508, 0.44721362), (-0.26286557, 0.80901706, 0.5257311), (0.16245979, 0.5, 0.8506508), (-0.26286557, 0.80901706, 0.5257311), (-0.72360677, 0.5257311, 0.44721362), (-0.42532542, 0.30901697, 0.85065085), (-0.26286557, 0.80901706, 0.5257311), (-0.42532542, 0.30901697, 0.85065085), (0.16245979, 0.5, 0.8506508), (0.16245979, 0.5, 0.8506508), (-0.42532542, 0.30901697, 0.85065085), (-9.4332115e-9, -1.4149817e-8, 0.99999994), (-0.72360677, 0.5257311, 0.44721362), (-0.85065085, -1.6621586e-7, 0.525731), (-0.42532542, 0.30901697, 0.85065085), (-0.85065085, -1.6621586e-7, 0.525731), (-0.7236067, -0.5257312, 0.4472136), (-0.4253253, -0.30901703, 0.85065085), (-0.85065085, -1.6621586e-7, 0.525731), (-0.4253253, -0.30901703, 0.85065085), (-0.42532542, 0.30901697, 0.85065085), (-0.42532542, 0.30901697, 0.85065085), (-0.4253253, -0.30901703, 0.85065085), (-9.4332115e-9, -1.4149817e-8, 0.99999994), (-0.7236067, -0.5257312, 0.4472136), (-0.26286545, -0.80901706, 0.5257311), (-0.4253253, -0.30901703, 0.85065085), (-0.26286545, -0.80901706, 0.5257311), (0.27639323, -0.8506508, 0.44721362), (0.16245988, -0.49999997, 0.8506508), (-0.26286545, -0.80901706, 0.5257311), (0.16245988, -0.49999997, 0.8506508), (-0.4253253, -0.30901703, 0.85065085), (-0.4253253, -0.30901703, 0.85065085), (0.16245988, -0.49999997, 0.8506508), (-9.4332115e-9, -1.4149817e-8, 0.99999994), (0.27639323, -0.8506508, 0.44721362), (0.688191, -0.5, 0.5257311), (0.16245988, -0.49999997, 0.8506508), (0.688191, -0.5, 0.5257311), (0.8944272, 7.54657e-8, 0.44721362), (0.52573115, 3.7990883e-8, 0.85065085), (0.688191, -0.5, 0.5257311), (0.52573115, 3.7990883e-8, 0.85065085), (0.16245988, -0.49999997, 0.8506508), (0.16245988, -0.49999997, 0.8506508), (0.52573115, 3.7990883e-8, 0.85065085), (-9.4332115e-9, -1.4149817e-8, 0.99999994)] ( + interpolation = "faceVarying" + ) + point3f[] points = [(0, 0, -0.5), (0.3618034, 0.26286554, -0.2236068), (-0.13819663, 0.42532545, -0.22360682), (-0.44721365, -3.909666e-8, -0.22360682), (-0.13819665, -0.4253254, -0.2236068), (0.36180338, -0.26286557, -0.2236068), (0.44721365, 0, 0.22360682), (0.13819659, 0.42532542, 0.2236068), (-0.36180344, 0.26286554, 0.22360682), (-0.36180338, -0.2628656, 0.2236068), (0.13819666, -0.4253254, 0.2236068), (0, 0, 0.5), (-0.08122993, 0.24999999, -0.42532542), (0.21266271, 0.15450849, -0.42532542), (0.13143277, 0.40450847, -0.26286554), (-0.26286554, -2.2980437e-8, -0.42532542), (-0.3440955, 0.24999997, -0.26286554), (-0.08122995, -0.24999999, -0.42532542), (-0.3440955, -0.25, -0.26286554), (0.2126627, -0.1545085, -0.42532542), (0.13143276, -0.40450853, -0.26286557), (0.42532542, -1.7517365e-8, -0.26286554), (0.29389262, 0.40450847, 0), (-1.7517365e-8, 0.49999997, 0), (-0.29389262, 0.40450847, 0), (-0.47552827, 0.15450846, 0), (-0.4755282, -0.15450855, 0), (-0.29389262, -0.4045085, 0), (8.758683e-9, -0.49999997, 0), (0.29389265, -0.40450847, 0), (0.47552827, -0.15450852, 0), (0.47552827, 0.15450849, 0), (0.34409547, 0.25, 0.26286554), (-0.13143279, 0.40450847, 0.26286554), (-0.42532542, -5.2552096e-8, 0.26286554), (-0.13143273, -0.4045085, 0.26286554), (0.3440955, -0.24999999, 0.26286554), (0.26286554, 0, 0.42532542), (0.08122992, 0.25, 0.42532542), (-0.21266271, 0.15450847, 0.42532542), (-0.2126627, -0.15450852, 0.42532542), (0.08122996, -0.24999999, 0.42532542)] + texCoord2f[] primvars:st = [(1, 0.5), (0.83810407, 0.67620814), (0.088104114, 0.8237918), (0.1762082, 0.5), (0.088104114, 0.17620823), (0.8381041, 0.32379177), (0.6762082, 0.5), (0.58810407, 0.82379186), (0.3381041, 0.67620814), (0.3381041, 0.32379177), (0.5881041, 0.17620823), (0.5, 0.5), (0.030034225, 0.6666667), (0.9262082, 0.59999996), (0.9262082, 0.8), (0.08810408, 0.5), (0.146174, 0.6666667), (0.030034225, 0.3333333), (0.146174, 0.3333333), (0.9262082, 0.39999998), (0.9262082, 0.19999997), (0.83810407, 0.5), (0.75, 0.8), (0.25, 1), (0.25, 0.8), (0.25, 0.59999996), (0.25, 0.39999995), (0.25, 0.19999997), (0.75, 1), (0.75, 0.20000005), (0.75, 0.39999998), (0.75, 0.59999996), (0.64617395, 0.6666667), (0.42620817, 0.8), (0.33810407, 0.49999994), (0.4262082, 0.19999997), (0.646174, 0.3333333), (0.58810407, 0.5), (0.5300342, 0.6666667), (0.4262082, 0.59999996), (0.4262082, 0.39999998), (0.53003424, 0.3333333), (1.0300342, 0.6666667), (1.0881041, 0.8237918), (1.0881041, 0.5), (1.0300342, 0.3333333), (1.0881041, 0.17620823), (1.25, 1)] ( + customData = { + dictionary Maya = { + token name = "map1" + } + } + interpolation = "faceVarying" + ) + int[] primvars:st:indices = [0, 42, 13, 42, 43, 14, 42, 14, 13, 13, 14, 1, 0, 44, 42, 15, 3, 16, 15, 16, 12, 12, 16, 2, 0, 45, 44, 17, 4, 18, 17, 18, 15, 15, 18, 3, 0, 19, 45, 19, 5, 20, 19, 20, 45, 45, 20, 46, 0, 13, 19, 13, 1, 21, 13, 21, 19, 19, 21, 5, 1, 14, 22, 14, 43, 47, 14, 47, 22, 22, 23, 7, 2, 16, 24, 16, 3, 25, 16, 25, 24, 24, 25, 8, 3, 18, 26, 18, 4, 27, 18, 27, 26, 26, 27, 9, 46, 20, 28, 20, 5, 29, 20, 29, 28, 28, 29, 10, 5, 21, 30, 21, 1, 31, 21, 31, 30, 30, 31, 6, 1, 22, 31, 22, 7, 32, 22, 32, 31, 31, 32, 6, 2, 24, 23, 24, 8, 33, 24, 33, 23, 23, 33, 7, 3, 26, 25, 26, 9, 34, 26, 34, 25, 25, 34, 8, 46, 28, 27, 28, 10, 35, 28, 35, 27, 27, 35, 9, 5, 30, 29, 30, 6, 36, 30, 36, 29, 29, 36, 10, 6, 32, 37, 32, 7, 38, 32, 38, 37, 37, 38, 11, 7, 33, 38, 33, 8, 39, 33, 39, 38, 38, 39, 11, 8, 34, 39, 34, 9, 40, 34, 40, 39, 39, 40, 11, 9, 35, 40, 35, 10, 41, 35, 41, 40, 40, 41, 11, 10, 36, 41, 36, 6, 37, 36, 37, 41, 41, 37, 11] + uniform token subdivisionScheme = "none" + double3 xformOp:translate = (-0.20195283836005995, 1.0531949097272095, 1.5372357673085828) + uniform token[] xformOpOrder = ["xformOp:translate"] + + def Scope "Looks" + { + def Material "blinn1SG" + { + string inputs:file3:varnameStr = "st" + token outputs:mtlx:surface.connect = + + def Shader "blinn1" + { + uniform token info:id = "MayaND_blinn_surfaceshader" + color3f inputs:color = (0, 0, 0) + color3f inputs:color.connect = + color3f inputs:specularColor = (1, 1, 0) + color3f outputs:outColor + token outputs:surface + } + + def NodeGraph "MayaNG_blinn1SG" + { + string inputs:file3:varnameStr.connect = + + def Shader "file3" + { + uniform token info:id = "ND_image_color4" + color4f inputs:default = (0.5, 0.5, 0.5, 1) + asset inputs:file = @grid.png@ + float2 inputs:texcoord.connect = + string inputs:uaddressmode = "periodic" + string inputs:vaddressmode = "periodic" + color4f outputs:out + } + + def Shader "place2dTexture3" + { + uniform token info:id = "ND_geompropvalue_vector2" + string inputs:geomprop.connect = + float2 outputs:out + } + + def Shader "MayaSwizzle_file3_rgb" + { + uniform token info:id = "ND_swizzle_color4_color3" + string inputs:channels = "rgb" + color4f inputs:in.connect = + color3f outputs:out + } + } + } + } +} + +def Mesh "pPlatonic2" ( + prepend apiSchemas = ["MaterialBindingAPI"] + kind = "component" +) +{ + uniform bool doubleSided = 1 + float3[] extent = [(-0.5, -0.5, -0.5), (0.5, 0.5, 0.5)] + int[] faceVertexCounts = [3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3] + int[] faceVertexIndices = [1, 6, 8, 6, 7, 12, 6, 12, 8, 8, 12, 9, 7, 2, 10, 7, 10, 12, 12, 10, 11, 12, 11, 9, 9, 11, 0, 2, 13, 10, 13, 14, 17, 13, 17, 10, 10, 17, 11, 14, 3, 15, 14, 15, 17, 17, 15, 16, 17, 16, 11, 11, 16, 0, 3, 18, 15, 18, 19, 22, 18, 22, 15, 15, 22, 16, 19, 4, 20, 19, 20, 22, 22, 20, 21, 22, 21, 16, 16, 21, 0, 0, 21, 9, 21, 20, 25, 21, 25, 9, 9, 25, 8, 20, 4, 23, 20, 23, 25, 25, 23, 24, 25, 24, 8, 8, 24, 1, 5, 26, 28, 26, 27, 30, 26, 30, 28, 28, 30, 29, 27, 2, 7, 27, 7, 30, 30, 7, 6, 30, 6, 29, 29, 6, 1, 5, 31, 26, 31, 32, 33, 31, 33, 26, 26, 33, 27, 32, 3, 14, 32, 14, 33, 33, 14, 13, 33, 13, 27, 27, 13, 2, 5, 34, 31, 34, 35, 36, 34, 36, 31, 31, 36, 32, 35, 4, 19, 35, 19, 36, 36, 19, 18, 36, 18, 32, 32, 18, 3, 5, 28, 34, 28, 29, 37, 28, 37, 34, 34, 37, 35, 29, 1, 24, 29, 24, 37, 37, 24, 23, 37, 23, 35, 35, 23, 4] + rel material:binding = + normal3f[] normals = [(1, 0, 0), (0.8572056, 0.5149743, -3.262045e-8), (0.8572056, -8.155113e-9, 0.5149743), (0.8572056, 0.5149743, -3.262045e-8), (0.51497436, 0.85720557, -8.155112e-9), (0.5773503, 0.5773503, 0.57735026), (0.8572056, 0.5149743, -3.262045e-8), (0.5773503, 0.5773503, 0.57735026), (0.8572056, -8.155113e-9, 0.5149743), (0.8572056, -8.155113e-9, 0.5149743), (0.5773503, 0.5773503, 0.57735026), (0.5149743, 0, 0.8572056), (0.51497436, 0.85720557, -8.155112e-9), (0, 1, 0), (2.8542896e-8, 0.8572056, 0.51497436), (0.51497436, 0.85720557, -8.155112e-9), (2.8542896e-8, 0.8572056, 0.51497436), (0.5773503, 0.5773503, 0.57735026), (0.5773503, 0.5773503, 0.57735026), (2.8542896e-8, 0.8572056, 0.51497436), (-8.155111e-9, 0.51497436, 0.8572055), (0.5773503, 0.5773503, 0.57735026), (-8.155111e-9, 0.51497436, 0.8572055), (0.5149743, 0, 0.8572056), (0.5149743, 0, 0.8572056), (-8.155111e-9, 0.51497436, 0.8572055), (0, 0, 1), (0, 1, 0), (-0.51497436, 0.8572056, 8.155113e-9), (2.8542896e-8, 0.8572056, 0.51497436), (-0.51497436, 0.8572056, 8.155113e-9), (-0.85720557, 0.51497436, -1.6310224e-8), (-0.57735026, 0.57735026, 0.5773503), (-0.51497436, 0.8572056, 8.155113e-9), (-0.57735026, 0.57735026, 0.5773503), (2.8542896e-8, 0.8572056, 0.51497436), (2.8542896e-8, 0.8572056, 0.51497436), (-0.57735026, 0.57735026, 0.5773503), (-8.155111e-9, 0.51497436, 0.8572055), (-0.85720557, 0.51497436, -1.6310224e-8), (-1, 0, 0), (-0.8572056, 4.0775565e-9, 0.51497436), (-0.85720557, 0.51497436, -1.6310224e-8), (-0.8572056, 4.0775565e-9, 0.51497436), (-0.57735026, 0.57735026, 0.5773503), (-0.57735026, 0.57735026, 0.5773503), (-0.8572056, 4.0775565e-9, 0.51497436), (-0.51497436, 2.8542892e-8, 0.8572056), (-0.57735026, 0.57735026, 0.5773503), (-0.51497436, 2.8542892e-8, 0.8572056), (-8.155111e-9, 0.51497436, 0.8572055), (-8.155111e-9, 0.51497436, 0.8572055), (-0.51497436, 2.8542892e-8, 0.8572056), (0, 0, 1), (-1, 0, 0), (-0.8572056, -0.5149743, -3.262045e-8), (-0.8572056, 4.0775565e-9, 0.51497436), (-0.8572056, -0.5149743, -3.262045e-8), (-0.51497436, -0.85720557, -8.155112e-9), (-0.5773503, -0.5773503, 0.57735026), (-0.8572056, -0.5149743, -3.262045e-8), (-0.5773503, -0.5773503, 0.57735026), (-0.8572056, 4.0775565e-9, 0.51497436), (-0.8572056, 4.0775565e-9, 0.51497436), (-0.5773503, -0.5773503, 0.57735026), (-0.51497436, 2.8542892e-8, 0.8572056), (-0.51497436, -0.85720557, -8.155112e-9), (0, -1, 0), (-1.6310224e-8, -0.8572056, 0.5149743), (-0.51497436, -0.85720557, -8.155112e-9), (-1.6310224e-8, -0.8572056, 0.5149743), (-0.5773503, -0.5773503, 0.57735026), (-0.5773503, -0.5773503, 0.57735026), (-1.6310224e-8, -0.8572056, 0.5149743), (-8.155112e-9, -0.5149744, 0.85720557), (-0.5773503, -0.5773503, 0.57735026), (-8.155112e-9, -0.5149744, 0.85720557), (-0.51497436, 2.8542892e-8, 0.8572056), (-0.51497436, 2.8542892e-8, 0.8572056), (-8.155112e-9, -0.5149744, 0.85720557), (0, 0, 1), (0, 0, 1), (-8.155112e-9, -0.5149744, 0.85720557), (0.5149743, 0, 0.8572056), (-8.155112e-9, -0.5149744, 0.85720557), (-1.6310224e-8, -0.8572056, 0.5149743), (0.5773503, -0.5773503, 0.57735026), (-8.155112e-9, -0.5149744, 0.85720557), (0.5773503, -0.5773503, 0.57735026), (0.5149743, 0, 0.8572056), (0.5149743, 0, 0.8572056), (0.5773503, -0.5773503, 0.57735026), (0.8572056, -8.155113e-9, 0.5149743), (-1.6310224e-8, -0.8572056, 0.5149743), (0, -1, 0), (0.51497424, -0.85720557, 2.4465333e-8), (-1.6310224e-8, -0.8572056, 0.5149743), (0.51497424, -0.85720557, 2.4465333e-8), (0.5773503, -0.5773503, 0.57735026), (0.5773503, -0.5773503, 0.57735026), (0.51497424, -0.85720557, 2.4465333e-8), (0.8572056, -0.51497436, -3.262045e-8), (0.5773503, -0.5773503, 0.57735026), (0.8572056, -0.51497436, -3.262045e-8), (0.8572056, -8.155113e-9, 0.5149743), (0.8572056, -8.155113e-9, 0.5149743), (0.8572056, -0.51497436, -3.262045e-8), (1, 0, 0), (0, 0, -1), (2.0387782e-8, 0.5149743, -0.8572056), (0.5149743, -8.155113e-9, -0.8572056), (2.0387782e-8, 0.5149743, -0.8572056), (8.155113e-9, 0.8572056, -0.51497436), (0.5773503, 0.57735026, -0.5773503), (2.0387782e-8, 0.5149743, -0.8572056), (0.5773503, 0.57735026, -0.5773503), (0.5149743, -8.155113e-9, -0.8572056), (0.5149743, -8.155113e-9, -0.8572056), (0.5773503, 0.57735026, -0.5773503), (0.8572056, 0, -0.5149744), (8.155113e-9, 0.8572056, -0.51497436), (0, 1, 0), (0.51497436, 0.85720557, -8.155112e-9), (8.155113e-9, 0.8572056, -0.51497436), (0.51497436, 0.85720557, -8.155112e-9), (0.5773503, 0.57735026, -0.5773503), (0.5773503, 0.57735026, -0.5773503), (0.51497436, 0.85720557, -8.155112e-9), (0.8572056, 0.5149743, -3.262045e-8), (0.5773503, 0.57735026, -0.5773503), (0.8572056, 0.5149743, -3.262045e-8), (0.8572056, 0, -0.5149744), (0.8572056, 0, -0.5149744), (0.8572056, 0.5149743, -3.262045e-8), (1, 0, 0), (0, 0, -1), (-0.51497436, -4.0775565e-9, -0.8572056), (2.0387782e-8, 0.5149743, -0.8572056), (-0.51497436, -4.0775565e-9, -0.8572056), (-0.85720557, -4.0775565e-9, -0.51497436), (-0.57735026, 0.57735026, -0.57735026), (-0.51497436, -4.0775565e-9, -0.8572056), (-0.57735026, 0.57735026, -0.57735026), (2.0387782e-8, 0.5149743, -0.8572056), (2.0387782e-8, 0.5149743, -0.8572056), (-0.57735026, 0.57735026, -0.57735026), (8.155113e-9, 0.8572056, -0.51497436), (-0.85720557, -4.0775565e-9, -0.51497436), (-1, 0, 0), (-0.85720557, 0.51497436, -1.6310224e-8), (-0.85720557, -4.0775565e-9, -0.51497436), (-0.85720557, 0.51497436, -1.6310224e-8), (-0.57735026, 0.57735026, -0.57735026), (-0.57735026, 0.57735026, -0.57735026), (-0.85720557, 0.51497436, -1.6310224e-8), (-0.51497436, 0.8572056, 8.155113e-9), (-0.57735026, 0.57735026, -0.57735026), (-0.51497436, 0.8572056, 8.155113e-9), (8.155113e-9, 0.8572056, -0.51497436), (8.155113e-9, 0.8572056, -0.51497436), (-0.51497436, 0.8572056, 8.155113e-9), (0, 1, 0), (0, 0, -1), (-2.0387782e-8, -0.5149743, -0.8572056), (-0.51497436, -4.0775565e-9, -0.8572056), (-2.0387782e-8, -0.5149743, -0.8572056), (-8.155113e-9, -0.8572056, -0.51497436), (-0.5773503, -0.57735026, -0.5773503), (-2.0387782e-8, -0.5149743, -0.8572056), (-0.5773503, -0.57735026, -0.5773503), (-0.51497436, -4.0775565e-9, -0.8572056), (-0.51497436, -4.0775565e-9, -0.8572056), (-0.5773503, -0.57735026, -0.5773503), (-0.85720557, -4.0775565e-9, -0.51497436), (-8.155113e-9, -0.8572056, -0.51497436), (0, -1, 0), (-0.51497436, -0.85720557, -8.155112e-9), (-8.155113e-9, -0.8572056, -0.51497436), (-0.51497436, -0.85720557, -8.155112e-9), (-0.5773503, -0.57735026, -0.5773503), (-0.5773503, -0.57735026, -0.5773503), (-0.51497436, -0.85720557, -8.155112e-9), (-0.8572056, -0.5149743, -3.262045e-8), (-0.5773503, -0.57735026, -0.5773503), (-0.8572056, -0.5149743, -3.262045e-8), (-0.85720557, -4.0775565e-9, -0.51497436), (-0.85720557, -4.0775565e-9, -0.51497436), (-0.8572056, -0.5149743, -3.262045e-8), (-1, 0, 0), (0, 0, -1), (0.5149743, -8.155113e-9, -0.8572056), (-2.0387782e-8, -0.5149743, -0.8572056), (0.5149743, -8.155113e-9, -0.8572056), (0.8572056, 0, -0.5149744), (0.57735026, -0.57735026, -0.57735026), (0.5149743, -8.155113e-9, -0.8572056), (0.57735026, -0.57735026, -0.57735026), (-2.0387782e-8, -0.5149743, -0.8572056), (-2.0387782e-8, -0.5149743, -0.8572056), (0.57735026, -0.57735026, -0.57735026), (-8.155113e-9, -0.8572056, -0.51497436), (0.8572056, 0, -0.5149744), (1, 0, 0), (0.8572056, -0.51497436, -3.262045e-8), (0.8572056, 0, -0.5149744), (0.8572056, -0.51497436, -3.262045e-8), (0.57735026, -0.57735026, -0.57735026), (0.57735026, -0.57735026, -0.57735026), (0.8572056, -0.51497436, -3.262045e-8), (0.51497424, -0.85720557, 2.4465333e-8), (0.57735026, -0.57735026, -0.57735026), (0.51497424, -0.85720557, 2.4465333e-8), (-8.155113e-9, -0.8572056, -0.51497436), (-8.155113e-9, -0.8572056, -0.51497436), (0.51497424, -0.85720557, 2.4465333e-8), (0, -1, 0)] ( + interpolation = "faceVarying" + ) + point3f[] points = [(0, 0, 0.5), (0.5, 0, 0), (0, 0.5, 0), (-0.5, 0, 0), (0, -0.5, 0), (0, 0, -0.5), (0.4472136, 0.22360677, 0), (0.22360681, 0.4472136, 0), (0.4472136, 0, 0.22360677), (0.22360681, 0, 0.4472136), (0, 0.4472136, 0.22360677), (0, 0.22360681, 0.4472136), (0.28867516, 0.28867513, 0.28867513), (-0.22360677, 0.4472136, 0), (-0.4472136, 0.22360681, 0), (-0.4472136, 0, 0.22360677), (-0.22360681, 0, 0.4472136), (-0.28867513, 0.28867516, 0.28867513), (-0.4472136, -0.22360677, 0), (-0.22360681, -0.4472136, 0), (0, -0.4472136, 0.22360677), (0, -0.22360681, 0.4472136), (-0.28867516, -0.28867513, 0.28867513), (0.22360677, -0.4472136, 0), (0.4472136, -0.22360681, 0), (0.28867516, -0.28867516, 0.28867513), (0, 0.22360677, -0.4472136), (0, 0.4472136, -0.22360681), (0.22360677, 0, -0.4472136), (0.4472136, 0, -0.22360681), (0.28867513, 0.28867513, -0.28867516), (-0.22360677, 0, -0.4472136), (-0.4472136, 0, -0.22360681), (-0.28867513, 0.28867513, -0.28867516), (0, -0.22360677, -0.4472136), (0, -0.4472136, -0.22360681), (-0.28867513, -0.28867513, -0.28867516), (0.28867513, -0.28867513, -0.28867516)] + texCoord2f[] primvars:st = [(0.5, 0.5), (0.75, 0.5), (0.5, 1), (0.25, 0.5), (0.5, 1), (1, 0.5), (0.75, 0.6475836), (0.75, 0.8524164), (0.6762082, 0.5), (0.5737918, 0.5), (0.5, 0.8524164), (0.5, 0.64758366), (0.625, 0.69591326), (0.25, 0.8524164), (0.25, 0.64758366), (0.3237918, 0.5), (0.4262082, 0.5), (0.375, 0.6959133), (0.25, 0.3524164), (0.25, 0.14758359), (0.5, 0.14758359), (0.5, 0.3524164), (0.375, 0.30408674), (0.75, 0.14758359), (0.75, 0.3524164), (0.625, 0.3040867), (1, 0.6475836), (1, 0.8524164), (0.9262082, 0.5), (0.8237918, 0.5), (0.875, 0.69591326), (0.073791794, 0.5), (0.1762082, 0.5), (0.125, 0.69591326), (1, 0.3524164), (1, 0.14758359), (0.125, 0.30408674), (0.875, 0.30408674), (1.0737917, 0.5), (1.125, 0.69591326), (1.25, 0.8524164), (1.125, 0.30408674), (1.25, 0.14758359)] ( + customData = { + dictionary Maya = { + token name = "map1" + } + } + interpolation = "faceVarying" + ) + int[] primvars:st:indices = [1, 6, 8, 6, 7, 12, 6, 12, 8, 8, 12, 9, 7, 2, 10, 7, 10, 12, 12, 10, 11, 12, 11, 9, 9, 11, 0, 2, 13, 10, 13, 14, 17, 13, 17, 10, 10, 17, 11, 14, 3, 15, 14, 15, 17, 17, 15, 16, 17, 16, 11, 11, 16, 0, 3, 18, 15, 18, 19, 22, 18, 22, 15, 15, 22, 16, 19, 4, 20, 19, 20, 22, 22, 20, 21, 22, 21, 16, 16, 21, 0, 0, 21, 9, 21, 20, 25, 21, 25, 9, 9, 25, 8, 20, 4, 23, 20, 23, 25, 25, 23, 24, 25, 24, 8, 8, 24, 1, 5, 26, 28, 26, 27, 30, 26, 30, 28, 28, 30, 29, 27, 2, 7, 27, 7, 30, 30, 7, 6, 30, 6, 29, 29, 6, 1, 5, 38, 26, 31, 32, 33, 38, 39, 26, 26, 39, 27, 32, 3, 14, 32, 14, 33, 33, 14, 13, 39, 40, 27, 27, 40, 2, 5, 34, 38, 34, 35, 41, 34, 41, 38, 31, 36, 32, 35, 4, 42, 35, 42, 41, 36, 19, 18, 36, 18, 32, 32, 18, 3, 5, 28, 34, 28, 29, 37, 28, 37, 34, 34, 37, 35, 29, 1, 24, 29, 24, 37, 37, 24, 23, 37, 23, 35, 35, 23, 4] + uniform token subdivisionScheme = "none" + double3 xformOp:translate = (0.5081393997446737, 0.6123731227692266, 0.12765971770036622) + uniform token[] xformOpOrder = ["xformOp:translate"] + + def Scope "Looks" + { + def Material "phong1SG" + { + string inputs:file4:varnameStr = "st" + token outputs:mtlx:surface.connect = + + def Shader "phong1" + { + uniform token info:id = "MayaND_phong_surfaceshader" + color3f inputs:color = (0, 0, 0) + color3f inputs:color.connect = + color3f inputs:specularColor = (1, 0, 1) + color3f outputs:outColor + token outputs:surface + } + + def NodeGraph "MayaNG_phong1SG" + { + string inputs:file4:varnameStr.connect = + + def Shader "file4" + { + uniform token info:id = "ND_image_color4" + color4f inputs:default = (0.5, 0.5, 0.5, 1) + asset inputs:file = @grid.png@ + float2 inputs:texcoord.connect = + string inputs:uaddressmode = "periodic" + string inputs:vaddressmode = "periodic" + color4f outputs:out + } + + def Shader "place2dTexture4" + { + uniform token info:id = "ND_geompropvalue_vector2" + string inputs:geomprop.connect = + float2 outputs:out + } + + def Shader "MayaSwizzle_file4_rgb" + { + uniform token info:id = "ND_swizzle_color4_color3" + string inputs:channels = "rgb" + color4f inputs:in.connect = + color3f outputs:out + } + } + } + } +} +