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");
+ }
}
}
}