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 25b9d3de6c..de28a95488 100644
--- a/lib/mayaUsd/render/vp2RenderDelegate/material.cpp
+++ b/lib/mayaUsd/render/vp2RenderDelegate/material.cpp
@@ -185,13 +185,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 = {
@@ -401,18 +426,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(
@@ -421,60 +580,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);
+ }
+ }
}
}
}
@@ -1958,8 +2217,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;
@@ -2047,8 +2307,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
+ }
+ }
+ }
+ }
+}
+