diff --git a/resources/Materials/TestSuite/stdlib/upgrade/syntax_1_38.mtlx b/resources/Materials/TestSuite/stdlib/upgrade/syntax_1_38.mtlx index 575edbd800..215c6d776a 100644 --- a/resources/Materials/TestSuite/stdlib/upgrade/syntax_1_38.mtlx +++ b/resources/Materials/TestSuite/stdlib/upgrade/syntax_1_38.mtlx @@ -35,4 +35,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/source/MaterialXCore/Version.cpp b/source/MaterialXCore/Version.cpp index b4aa28bcd7..d1c60e1629 100644 --- a/source/MaterialXCore/Version.cpp +++ b/source/MaterialXCore/Version.cpp @@ -1316,30 +1316,59 @@ void Document::upgradeVersion() } else if (nodeCategory == "normalmap") { - // Handle a rename of the float-typed nodedef. - if (node->getNodeDefString() == "ND_normalmap") + InputPtr space = node->getInput("space"); + if (space && space->getValueString() == "object") { - node->setNodeDefString("ND_normalmap_float"); - } - - node->removeInput("space"); + // Replace object-space normalmap with a graph. + GraphElementPtr graph = node->getAncestorOfType(); + NodePtr multiply = graph->addNode("multiply", graph->createValidChildName("multiply"), "vector3"); + copyInputWithBindings(node, "in", multiply, "in1"); + multiply->setInputValue("in2", 2.0f); + NodePtr subtract = graph->addNode("subtract", graph->createValidChildName("subtract"), "vector3"); + subtract->addInput("in1", "vector3")->setConnectedNode(multiply); + subtract->setInputValue("in2", 1.0f); + node->setCategory("normalize"); + vector origInputs = node->getInputs(); + for (InputPtr input : origInputs) + { + node->removeChild(input->getName()); + } + node->addInput("in", "vector3")->setConnectedNode(subtract); - // If the normal or tangent inputs are set and the bitangent input is not, - // the bitangent should be set to normalize(cross(N, T)) - InputPtr normalInput = node->getInput("normal"); - InputPtr tangentInput = node->getInput("tangent"); - InputPtr bitangentInput = node->getInput("bitangent"); - if ((normalInput || tangentInput) && !bitangentInput) + // Update nodedef name if present. + if (node->hasNodeDefString()) + { + node->setNodeDefString("ND_normalize_vector3"); + } + } + else { - GraphElementPtr graph = node->getAncestorOfType(); - NodePtr crossNode = graph->addNode("crossproduct", graph->createValidChildName("normalmap_cross"), "vector3"); - copyInputWithBindings(node, "normal", crossNode, "in1"); - copyInputWithBindings(node, "tangent", crossNode, "in2"); + // Clear tangent-space input. + node->removeInput("space"); + + // If the normal or tangent inputs are set and the bitangent input is not, + // the bitangent should be set to normalize(cross(N, T)) + InputPtr normalInput = node->getInput("normal"); + InputPtr tangentInput = node->getInput("tangent"); + InputPtr bitangentInput = node->getInput("bitangent"); + if ((normalInput || tangentInput) && !bitangentInput) + { + GraphElementPtr graph = node->getAncestorOfType(); + NodePtr crossNode = graph->addNode("crossproduct", graph->createValidChildName("normalmap_cross"), "vector3"); + copyInputWithBindings(node, "normal", crossNode, "in1"); + copyInputWithBindings(node, "tangent", crossNode, "in2"); - NodePtr normalizeNode = graph->addNode("normalize", graph->createValidChildName("normalmap_cross_norm"), "vector3"); - normalizeNode->addInput("in", "vector3")->setConnectedNode(crossNode); + NodePtr normalizeNode = graph->addNode("normalize", graph->createValidChildName("normalmap_cross_norm"), "vector3"); + normalizeNode->addInput("in", "vector3")->setConnectedNode(crossNode); - node->addInput("bitangent", "vector3")->setConnectedNode(normalizeNode); + node->addInput("bitangent", "vector3")->setConnectedNode(normalizeNode); + } + + // Update nodedef name if present. + if (node->getNodeDefString() == "ND_normalmap") + { + node->setNodeDefString("ND_normalmap_float"); + } } } }