diff --git a/documents/Specification/MaterialX.Specification.md b/documents/Specification/MaterialX.Specification.md
index 4b99956fb4..895b4756c5 100644
--- a/documents/Specification/MaterialX.Specification.md
+++ b/documents/Specification/MaterialX.Specification.md
@@ -1496,7 +1496,7 @@ Blend nodes take two 1-4 channel inputs and apply the same operator to all chann
| **`burn`** | 1-(1-B)/F | float, colorN |
| **`dodge`** | B/(1-F) | float, colorN |
| **`screen`** | 1-(1-F)(1-B) | float, colorN |
-| **`overlay`** | 2FB if F<0.5;
1-(1-F)(1-B) if F>=0.5 | float, colorN |
+| **`overlay`** | 2FB if B<0.5;
1-2(1-F)(1-B) if B>=0.5 | float, colorN |
#### Merge Nodes
diff --git a/libraries/stdlib/genglsl/mx_overlay.glsl b/libraries/stdlib/genglsl/mx_overlay.glsl
deleted file mode 100644
index e1bec8ac44..0000000000
--- a/libraries/stdlib/genglsl/mx_overlay.glsl
+++ /dev/null
@@ -1,25 +0,0 @@
-float mx_overlay(float fg, float bg)
-{
- return (fg < 0.5) ? (2.0 * fg * bg) : (1.0 - (1.0 - fg) * (1.0 - bg));
-}
-
-vec2 mx_overlay(vec2 fg, vec2 bg)
-{
- return vec2(mx_overlay(fg.r, bg.r),
- mx_overlay(fg.g, bg.g));
-}
-
-vec3 mx_overlay(vec3 fg, vec3 bg)
-{
- return vec3(mx_overlay(fg.r, bg.r),
- mx_overlay(fg.g, bg.g),
- mx_overlay(fg.b, bg.b));
-}
-
-vec4 mx_overlay(vec4 fg, vec4 bg)
-{
- return vec4(mx_overlay(fg.r, bg.r),
- mx_overlay(fg.g, bg.g),
- mx_overlay(fg.b, bg.b),
- mx_overlay(fg.a, bg.a));
-}
diff --git a/libraries/stdlib/genglsl/mx_overlay_color3.glsl b/libraries/stdlib/genglsl/mx_overlay_color3.glsl
deleted file mode 100644
index 3b6ae67804..0000000000
--- a/libraries/stdlib/genglsl/mx_overlay_color3.glsl
+++ /dev/null
@@ -1,6 +0,0 @@
-#include "mx_overlay.glsl"
-
-void mx_overlay_color3(vec3 fg, vec3 bg, float mix, out vec3 result)
-{
- result = mix * mx_overlay(fg, bg) + (1.0-mix) * bg;
-}
diff --git a/libraries/stdlib/genglsl/mx_overlay_color4.glsl b/libraries/stdlib/genglsl/mx_overlay_color4.glsl
deleted file mode 100644
index 411e0da372..0000000000
--- a/libraries/stdlib/genglsl/mx_overlay_color4.glsl
+++ /dev/null
@@ -1,6 +0,0 @@
-#include "mx_overlay.glsl"
-
-void mx_overlay_color4(vec4 fg, vec4 bg, float mix, out vec4 result)
-{
- result = mix * mx_overlay(fg, bg) + (1.0-mix) * bg;
-}
diff --git a/libraries/stdlib/genglsl/stdlib_genglsl_impl.mtlx b/libraries/stdlib/genglsl/stdlib_genglsl_impl.mtlx
index 90d3120bd7..07aae6ce66 100644
--- a/libraries/stdlib/genglsl/stdlib_genglsl_impl.mtlx
+++ b/libraries/stdlib/genglsl/stdlib_genglsl_impl.mtlx
@@ -560,11 +560,6 @@
-
-
-
-
-
diff --git a/libraries/stdlib/genmdl/stdlib_genmdl_impl.mtlx b/libraries/stdlib/genmdl/stdlib_genmdl_impl.mtlx
index ab0d776936..0081dec924 100644
--- a/libraries/stdlib/genmdl/stdlib_genmdl_impl.mtlx
+++ b/libraries/stdlib/genmdl/stdlib_genmdl_impl.mtlx
@@ -568,11 +568,6 @@
-
-
-
-
-
diff --git a/libraries/stdlib/genmsl/stdlib_genmsl_impl.mtlx b/libraries/stdlib/genmsl/stdlib_genmsl_impl.mtlx
index fcab8fd69d..dea1c49636 100644
--- a/libraries/stdlib/genmsl/stdlib_genmsl_impl.mtlx
+++ b/libraries/stdlib/genmsl/stdlib_genmsl_impl.mtlx
@@ -560,11 +560,6 @@
-
-
-
-
-
diff --git a/libraries/stdlib/genosl/mx_overlay_color3.osl b/libraries/stdlib/genosl/mx_overlay_color3.osl
deleted file mode 100644
index 387653fe05..0000000000
--- a/libraries/stdlib/genosl/mx_overlay_color3.osl
+++ /dev/null
@@ -1,16 +0,0 @@
-float overlay(float fg, float bg)
-{
- return (fg < 0.5) ? (2 * fg * bg) : (1 - (1 - fg) * (1 - bg));
-}
-
-color overlay(color fg, color bg)
-{
- return color(overlay(fg[0], bg[0]),
- overlay(fg[1], bg[1]),
- overlay(fg[2], bg[2]));
-}
-
-void mx_overlay_color3(color fg, color bg, float mix, output color out)
-{
- out = mix * overlay(fg, bg) + (1-mix) * bg;
-}
diff --git a/libraries/stdlib/genosl/mx_overlay_color4.osl b/libraries/stdlib/genosl/mx_overlay_color4.osl
deleted file mode 100644
index 1ae6a72c15..0000000000
--- a/libraries/stdlib/genosl/mx_overlay_color4.osl
+++ /dev/null
@@ -1,22 +0,0 @@
-float overlay(float fg, float bg)
-{
- return (fg < 0.5) ? (2 * fg * bg) : (1 - (1 - fg) * (1 - bg));
-}
-
-color overlay(color fg, color bg)
-{
- return color(overlay(fg[0], bg[0]),
- overlay(fg[1], bg[1]),
- overlay(fg[2], bg[2]));
-}
-
-color4 overlay(color4 fg, color4 bg)
-{
- return color4(overlay(fg.rgb, bg.rgb),
- overlay(fg.a, bg.a));
-}
-
-void mx_overlay_color4(color4 fg, color4 bg, float mix, output color4 out)
-{
- out = mix * overlay(fg, bg) + (1-mix) * bg;
-}
diff --git a/libraries/stdlib/genosl/stdlib_genosl_impl.mtlx b/libraries/stdlib/genosl/stdlib_genosl_impl.mtlx
index 1ba22ef6a3..42828ce641 100644
--- a/libraries/stdlib/genosl/stdlib_genosl_impl.mtlx
+++ b/libraries/stdlib/genosl/stdlib_genosl_impl.mtlx
@@ -561,11 +561,6 @@
-
-
-
-
-
diff --git a/libraries/stdlib/stdlib_defs.mtlx b/libraries/stdlib/stdlib_defs.mtlx
index bb5e8edd1f..3f187e2be1 100644
--- a/libraries/stdlib/stdlib_defs.mtlx
+++ b/libraries/stdlib/stdlib_defs.mtlx
@@ -3343,8 +3343,8 @@
diff --git a/libraries/stdlib/stdlib_ng.mtlx b/libraries/stdlib/stdlib_ng.mtlx
index e031e72412..4983aaa477 100644
--- a/libraries/stdlib/stdlib_ng.mtlx
+++ b/libraries/stdlib/stdlib_ng.mtlx
@@ -3391,6 +3391,118 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/Materials/TestSuite/stdlib/compositing/compositing.mtlx b/resources/Materials/TestSuite/stdlib/compositing/compositing.mtlx
index e7a742c581..b125e70dca 100644
--- a/resources/Materials/TestSuite/stdlib/compositing/compositing.mtlx
+++ b/resources/Materials/TestSuite/stdlib/compositing/compositing.mtlx
@@ -183,24 +183,24 @@
-
-
+
+
-
-
+
+
-
-
+
+
diff --git a/source/MaterialXGenGlsl/Nodes/HeightToNormalNodeGlsl.cpp b/source/MaterialXGenGlsl/Nodes/HeightToNormalNodeGlsl.cpp
index 157cd5be04..e98a4ab75c 100644
--- a/source/MaterialXGenGlsl/Nodes/HeightToNormalNodeGlsl.cpp
+++ b/source/MaterialXGenGlsl/Nodes/HeightToNormalNodeGlsl.cpp
@@ -33,6 +33,11 @@ ShaderNodeImplPtr HeightToNormalNodeGlsl::create()
return std::make_shared();
}
+void HeightToNormalNodeGlsl::createVariables(const ShaderNode&, GenContext&, Shader&) const
+{
+ // Default filter kernels from ConvolutionNode are not used by this derived class.
+}
+
void HeightToNormalNodeGlsl::computeSampleOffsetStrings(const string& sampleSizeName, const string& offsetTypeString,
unsigned int, StringVec& offsetStrings) const
{
diff --git a/source/MaterialXGenGlsl/Nodes/HeightToNormalNodeGlsl.h b/source/MaterialXGenGlsl/Nodes/HeightToNormalNodeGlsl.h
index 638623ea43..fc6e6b421f 100644
--- a/source/MaterialXGenGlsl/Nodes/HeightToNormalNodeGlsl.h
+++ b/source/MaterialXGenGlsl/Nodes/HeightToNormalNodeGlsl.h
@@ -18,6 +18,8 @@ class MX_GENGLSL_API HeightToNormalNodeGlsl : public ConvolutionNode
public:
static ShaderNodeImplPtr create();
+ void createVariables(const ShaderNode&, GenContext&, Shader& shader) const override;
+
void emitFunctionDefinition(const ShaderNode& node, GenContext& context, ShaderStage& stage) const override;
void emitFunctionCall(const ShaderNode& node, GenContext& context, ShaderStage& stage) const override;
diff --git a/source/MaterialXGenMdl/mdl/materialx/stdlib.mdl b/source/MaterialXGenMdl/mdl/materialx/stdlib.mdl
index bce4a44ea5..8089feb7f0 100644
--- a/source/MaterialXGenMdl/mdl/materialx/stdlib.mdl
+++ b/source/MaterialXGenMdl/mdl/materialx/stdlib.mdl
@@ -2777,66 +2777,6 @@ export color4 mx_screen_color4(
return color4(rgb,a);
}
-float mx_overlay(float mxp_fg, float mxp_bg)
-{
- return (mxp_fg < 0.5) ? (2 * mxp_fg * mxp_bg) : (1 - (1 - mxp_fg) * (1 - mxp_bg));
-}
-float2 mx_overlay(float2 mxp_fg, float2 mxp_bg) [[ anno::unused() ]]
-{
- return float2(
- mx_overlay(mxp_fg.x, mxp_bg.x),
- mx_overlay(mxp_fg.y, mxp_bg.y)
- );
-}
-color mx_overlay(color mxp_fg, color mxp_bg)
-{
- float3 fg(mxp_fg);
- float3 bg(mxp_bg);
- return color(
- mx_overlay(fg.x, bg.x),
- mx_overlay(fg.y, bg.y),
- mx_overlay(fg.z, bg.z)
- );
-}
-
-export float mx_overlay_float(
- float mxp_fg = 0.0,
- float mxp_bg = 0.0,
- float mxp_mix = 1.0
-)
- [[
- anno::description("Node Group: compositing")
- ]]
-{
- return mxp_mix * mx_overlay(mxp_fg, mxp_bg) + (1-mxp_mix) * mxp_bg;
-}
-
-export color mx_overlay_color3(
- color mxp_fg = color(0.0),
- color mxp_bg = color(0.0),
- float mxp_mix = 1.0
-)
- [[
- anno::description("Node Group: compositing")
- ]]
-{
- return mxp_mix * mx_overlay(mxp_fg, mxp_bg) + (1-mxp_mix) * mxp_bg;
-}
-
-export color4 mx_overlay_color4(
- color4 mxp_fg = mk_color4(0.0, 0.0, 0.0, 0.0),
- color4 mxp_bg = mk_color4(0.0, 0.0, 0.0, 0.0),
- float mxp_mix = float(1.0)
-)
- [[
- anno::description("Node Group: compositing")
- ]]
-{
- color rgb = mxp_mix * mx_overlay(mxp_fg.rgb, mxp_bg.rgb) + (1-mxp_mix) * mxp_bg.rgb;
- float a = mxp_mix * mx_overlay(mxp_fg.a , mxp_bg.a ) + (1-mxp_mix) * mxp_bg.a;
- return color4(rgb,a);
-}
-
export color4 mx_disjointover_color4(
color4 mxp_fg = mk_color4(0.0, 0.0, 0.0, 0.0),
color4 mxp_bg = mk_color4(0.0, 0.0, 0.0, 0.0),
diff --git a/source/MaterialXGenMsl/Nodes/HeightToNormalNodeMsl.cpp b/source/MaterialXGenMsl/Nodes/HeightToNormalNodeMsl.cpp
index 12b1a9675c..7282e5e9df 100644
--- a/source/MaterialXGenMsl/Nodes/HeightToNormalNodeMsl.cpp
+++ b/source/MaterialXGenMsl/Nodes/HeightToNormalNodeMsl.cpp
@@ -33,6 +33,11 @@ ShaderNodeImplPtr HeightToNormalNodeMsl::create()
return std::make_shared();
}
+void HeightToNormalNodeMsl::createVariables(const ShaderNode&, GenContext&, Shader&) const
+{
+ // Default filter kernels from ConvolutionNode are not used by this derived class.
+}
+
void HeightToNormalNodeMsl::computeSampleOffsetStrings(const string& sampleSizeName, const string& offsetTypeString,
unsigned int, StringVec& offsetStrings) const
{
diff --git a/source/MaterialXGenMsl/Nodes/HeightToNormalNodeMsl.h b/source/MaterialXGenMsl/Nodes/HeightToNormalNodeMsl.h
index 752c411ed5..035ad300b4 100644
--- a/source/MaterialXGenMsl/Nodes/HeightToNormalNodeMsl.h
+++ b/source/MaterialXGenMsl/Nodes/HeightToNormalNodeMsl.h
@@ -18,6 +18,8 @@ class MX_GENMSL_API HeightToNormalNodeMsl : public ConvolutionNode
public:
static ShaderNodeImplPtr create();
+ void createVariables(const ShaderNode&, GenContext&, Shader& shader) const override;
+
void emitFunctionDefinition(const ShaderNode& node, GenContext& context, ShaderStage& stage) const override;
void emitFunctionCall(const ShaderNode& node, GenContext& context, ShaderStage& stage) const override;
diff --git a/source/MaterialXGraphEditor/Graph.cpp b/source/MaterialXGraphEditor/Graph.cpp
index 439f720e2e..889789706b 100644
--- a/source/MaterialXGraphEditor/Graph.cpp
+++ b/source/MaterialXGraphEditor/Graph.cpp
@@ -23,6 +23,32 @@ const ImVec2 DEFAULT_NODE_SIZE = ImVec2(138, 116);
const int DEFAULT_ALPHA = 255;
const int FILTER_ALPHA = 50;
+const std::array NODE_GROUP_ORDER =
+{
+ "texture2d",
+ "texture3d",
+ "procedural",
+ "procedural2d",
+ "procedural3d",
+ "geometric",
+ "translation",
+ "convolution2d",
+ "math",
+ "adjustment",
+ "compositing",
+ "conditional",
+ "channel",
+ "organization",
+ "global",
+ "application",
+ "material",
+ "shader",
+ "pbr",
+ "light",
+ "colortransform",
+ "none"
+};
+
// Based on ImRect_Expanded function in ImGui Node Editor blueprints-example.cpp
ImRect expandImRect(const ImRect& rect, float x, float y)
{
@@ -1220,41 +1246,15 @@ void Graph::createNodeUIList(mx::DocumentPtr doc)
{
_nodesToAdd.clear();
- std::vector ordered_groups = {
- "texture2d",
- "texture3d",
- "procedural",
- "procedural2d",
- "procedural3d",
- "geometric",
- "translation",
- "convolution2d",
- "math",
- "adjustment",
- "compositing",
- "conditional",
- "channel",
- "organization",
- "global",
- "application",
- "material",
- "shader",
- "pbr",
- "light",
- "colortransform",
- "no_group"
- };
-
auto nodeDefs = doc->getNodeDefs();
std::unordered_map> groupToNodeDef;
for (const auto& nodeDef : nodeDefs)
{
std::string group = nodeDef->getNodeGroup();
-
if (group.empty())
{
- group = "no_group";
+ group = NODE_GROUP_ORDER.back();
}
if (groupToNodeDef.find(group) == groupToNodeDef.end())
@@ -1264,7 +1264,7 @@ void Graph::createNodeUIList(mx::DocumentPtr doc)
groupToNodeDef[group].push_back(nodeDef);
}
- for (const auto& group : ordered_groups)
+ for (const auto& group : NODE_GROUP_ORDER)
{
auto it = groupToNodeDef.find(group);
if (it != groupToNodeDef.end())
@@ -2526,7 +2526,7 @@ void Graph::setDefaults(mx::InputPtr input)
void Graph::addLink(ed::PinId startPinId, ed::PinId endPinId)
{
- // prefer to assume left to right - start is an output, end is an input; swap if inaccurate
+ // Prefer to assume left to right - start is an output, end is an input; swap if inaccurate
if (UiPinPtr inputPin = getPin(endPinId); inputPin && inputPin->_kind != ed::PinKind::Input)
{
auto tmp = startPinId;
@@ -2575,7 +2575,7 @@ void Graph::addLink(ed::PinId startPinId, ed::PinId endPinId)
return;
}
- // make sure there is an implementation for node
+ // Make sure there is an implementation for node
const mx::ShaderGenerator& shadergen = _renderer->getGenContext().getShaderGenerator();
// Prevent direct connecting from input to output
@@ -2613,7 +2613,7 @@ void Graph::addLink(ed::PinId startPinId, ed::PinId endPinId)
{
if (linksItr->_endAttr == end_attr)
{
- // found existing link - remove it; adapted from deleteLink
+ // Found existing link - remove it; adapted from deleteLink
// note: ed::BreakLinks doesn't work as the order ends up inaccurate
deleteLinkInfo(linksItr->_startAttr, linksItr->_endAttr);
_currLinks.erase(linksItr);
@@ -2644,7 +2644,8 @@ void Graph::addLink(ed::PinId startPinId, ed::PinId endPinId)
if (pin->_pinId == inputPinId)
{
addNodeInput(uiDownNode, pin->_input);
- // update value to be empty
+
+ // Update value to be empty
if (uiDownNode->getNode() && uiDownNode->getNode()->getType() == mx::SURFACE_SHADER_TYPE_STRING)
{
if (uiUpNode->getOutput() != nullptr)
@@ -2657,12 +2658,11 @@ void Graph::addLink(ed::PinId startPinId, ed::PinId endPinId)
}
else
{
- // node graph
if (uiUpNode->getNodeGraph() != nullptr)
{
for (UiPinPtr outPin : uiUpNode->outputPins)
{
- // set pin connection to correct output
+ // Set pin connection to correct output
if (outPin->_pinId == outputPinId)
{
mx::OutputPtr outputs = uiUpNode->getNodeGraph()->getOutput(outPin->_name);
@@ -2689,10 +2689,6 @@ void Graph::addLink(ed::PinId startPinId, ed::PinId endPinId)
mx::NodePtr upstreamNode = _graphNodes[upNode]->getNode();
mx::NodeDefPtr upstreamNodeDef = upstreamNode->getNodeDef();
bool isMultiOutput = upstreamNodeDef ? upstreamNodeDef->getOutputs().size() > 1 : false;
-
- // This is purely to avoid adding a reference to an update node only 1 output,
- // as currently validation consides adding this an error. Otherwise
- // it will add an "output" attribute all the time.
if (!isMultiOutput)
{
pin->_input->setConnectedNode(uiUpNode->getNode());
@@ -2701,7 +2697,7 @@ void Graph::addLink(ed::PinId startPinId, ed::PinId endPinId)
{
for (UiPinPtr outPin : _graphNodes[upNode]->outputPins)
{
- // set pin connection to correct output
+ // Set pin connection to correct output
if (outPin->_pinId == outputPinId)
{
mx::OutputPtr outputs = uiUpNode->getNode()->getOutput(outPin->_name);
@@ -2718,7 +2714,7 @@ void Graph::addLink(ed::PinId startPinId, ed::PinId endPinId)
{
for (UiPinPtr outPin : uiUpNode->outputPins)
{
- // set pin connection to correct output
+ // Set pin connection to correct output
if (outPin->_pinId == outputPinId)
{
mx::OutputPtr outputs = uiUpNode->getNodeGraph()->getOutput(outPin->_name);
@@ -2729,14 +2725,14 @@ void Graph::addLink(ed::PinId startPinId, ed::PinId endPinId)
}
}
-
pin->setConnected(true);
pin->_input->removeAttribute(mx::ValueElement::VALUE_ATTRIBUTE);
connectingInput = pin->_input;
break;
}
}
- // create new edge and set edge information
+
+ // Create new edge and set edge information
createEdge(_graphNodes[upNode], _graphNodes[downNode], connectingInput);
}
else if (_graphNodes[downNode]->getOutput() != nullptr)
@@ -2744,19 +2740,19 @@ void Graph::addLink(ed::PinId startPinId, ed::PinId endPinId)
mx::InputPtr connectingInput = nullptr;
_graphNodes[downNode]->getOutput()->setConnectedNode(_graphNodes[upNode]->getNode());
- // create new edge and set edge information
+ // Create new edge and set edge information
createEdge(_graphNodes[upNode], _graphNodes[downNode], connectingInput);
}
else
{
- // create new edge and set edge info
+ // Create new edge and set edge info
UiEdge newEdge = UiEdge(_graphNodes[upNode], _graphNodes[downNode], nullptr);
if (!edgeExists(newEdge))
{
_graphNodes[downNode]->edges.push_back(newEdge);
_currEdge.push_back(newEdge);
- // update input node num and output connections
+ // Update input node num and output connections
_graphNodes[downNode]->setInputNodeNum(1);
_graphNodes[upNode]->setOutputConnection(_graphNodes[downNode]);
}
@@ -3779,23 +3775,18 @@ void Graph::addPinPopup()
{
ed::Suspend();
UiPinPtr pin = getPin(ed::GetHoveredPin());
- std::string connected = "";
- std::string value = "";
+ std::string connected;
+ std::string value;
if (pin->_connected)
{
- connected = "\nConnected to";
- int size = static_cast(pin->getConnections().size());
- for (int i = 0; i < size; i++)
+ mx::StringVec connectedNames;
+ for (UiPinPtr connectedPin : pin->getConnections())
{
- UiPinPtr connectedPin = pin->getConnections()[i];
- connected = connected + " " + connectedPin->_name;
- if (i != size - 1)
- {
- connected = connected + ",";
- }
+ connectedNames.push_back(connectedPin->_name);
}
+ connected = "\nConnected to " + mx::joinStrings(connectedNames, ", ");
}
- else if (pin->_input != nullptr)
+ else if (pin->_input)
{
value = "\nValue: " + pin->_input->getValueString();
}