diff --git a/lib/mayaUsd/render/vp2RenderDelegate/material.cpp b/lib/mayaUsd/render/vp2RenderDelegate/material.cpp index b3e60c1bfc..49f5d601bd 100644 --- a/lib/mayaUsd/render/vp2RenderDelegate/material.cpp +++ b/lib/mayaUsd/render/vp2RenderDelegate/material.cpp @@ -800,6 +800,8 @@ void _AddMissingTangents(mx::DocumentPtr& mtlxDoc) { // We will need at least one geompropvalue reader to generate tangents: mx::NodePtr stReader; + // If we find one implicit texcoord input we can still try to generate texcoord tangents: + bool hasOneImplicitTexcoordInput = false; // List of all items to fix: using nodeInput = std::pair; @@ -833,6 +835,10 @@ void _AddMissingTangents(mx::DocumentPtr& mtlxDoc) && !material->getConnectedOutput(input->getName())) { materialTobjectInputs.emplace_back(material, input->getName()); } + if (geomPropString == _mtlxTokens->UV0 + && !material->getConnectedOutput(input->getName())) { + hasOneImplicitTexcoordInput = true; + } } } } @@ -884,6 +890,10 @@ void _AddMissingTangents(mx::DocumentPtr& mtlxDoc) && node->getConnectedNodeName(input->getName()).empty()) { graphTobjectInputs.emplace_back(node, input->getName()); } + if (geomPropString == _mtlxTokens->UV0 + && node->getConnectedNodeName(input->getName()).empty()) { + hasOneImplicitTexcoordInput = true; + } } } // Check if it is an explicit tangent reader: @@ -900,15 +910,19 @@ void _AddMissingTangents(mx::DocumentPtr& mtlxDoc) // Create the tangent generator: mx::NodePtr tangentGenerator; - if (stReader) { + if (stReader || hasOneImplicitTexcoordInput) { tangentGenerator = nodeGraph->addNode( _mtlxTokens->texcoordtangents.GetString(), _mtlxTokens->Tw_reader.GetString(), _mtlxTokens->vector3.GetString()); tangentGenerator->addInput( _mtlxTokens->texcoord.GetString(), _mtlxTokens->vector2.GetString()); - tangentGenerator->setConnectedNodeName( - _mtlxTokens->texcoord.GetString(), stReader->getName()); + if (stReader) { + // Use an explicit geomprop reader if one was found, otherwise, leave it to the + // implicit geomprop reader code in shadergen. + tangentGenerator->setConnectedNodeName( + _mtlxTokens->texcoord.GetString(), stReader->getName()); + } } else { tangentGenerator = nodeGraph->addNode( _mtlxTokens->arbitrarytangents.GetString(), diff --git a/test/lib/mayaUsd/render/vp2RenderDelegate/VP2RenderDelegateMaterialXTest/baseline/DemoQuads_render.png b/test/lib/mayaUsd/render/vp2RenderDelegate/VP2RenderDelegateMaterialXTest/baseline/DemoQuads_render.png index c1d2a0c434..d030b72539 100644 Binary files a/test/lib/mayaUsd/render/vp2RenderDelegate/VP2RenderDelegateMaterialXTest/baseline/DemoQuads_render.png and b/test/lib/mayaUsd/render/vp2RenderDelegate/VP2RenderDelegateMaterialXTest/baseline/DemoQuads_render.png differ diff --git a/test/lib/mayaUsd/render/vp2RenderDelegate/testVP2RenderDelegateMaterialX.py b/test/lib/mayaUsd/render/vp2RenderDelegate/testVP2RenderDelegateMaterialX.py index 4910948f33..854ab07eec 100644 --- a/test/lib/mayaUsd/render/vp2RenderDelegate/testVP2RenderDelegateMaterialX.py +++ b/test/lib/mayaUsd/render/vp2RenderDelegate/testVP2RenderDelegateMaterialX.py @@ -160,8 +160,13 @@ def testDemoQuads(self): cmds.move(0, 8, 0, 'persp') cmds.rotate(-90, 0, 0, 'persp') + # Add a light to see bump mapping: + light = cmds.directionalLight(rgb=(1, 1, 1)) + transform = cmds.listRelatives(light, parent=True)[0] + cmds.xform(transform, ro=(105, 25, 130), ws=True) + cmds.setAttr(light+".intensity", 2) panel = mayaUtils.activeModelPanel() - cmds.modelEditor(panel, edit=True, displayTextures=True) + cmds.modelEditor(panel, edit=True, lights=True, displayLights="all", displayTextures=True) self._StartTest('DemoQuads') diff --git a/test/testSamples/MaterialX/DemoQuads.usda b/test/testSamples/MaterialX/DemoQuads.usda index cef71cbfdf..28a5e5e4d0 100644 --- a/test/testSamples/MaterialX/DemoQuads.usda +++ b/test/testSamples/MaterialX/DemoQuads.usda @@ -276,7 +276,7 @@ def Scope "mtl" { uniform token info:id = "ND_standard_surface_surfaceshader" color3f inputs:base_color.connect = - float inputs:specular = 0.0 + float inputs:specular = 0 token outputs:out } @@ -296,7 +296,7 @@ def Scope "mtl" { uniform token info:id = "ND_standard_surface_surfaceshader" color3f inputs:base_color.connect = - float inputs:specular = 0.0 + float inputs:specular = 0 token outputs:out } @@ -316,7 +316,7 @@ def Scope "mtl" { uniform token info:id = "ND_standard_surface_surfaceshader" color3f inputs:base_color.connect = - float inputs:specular = 0.0 + float inputs:specular = 0 token outputs:out } @@ -336,8 +336,8 @@ def Scope "mtl" { uniform token info:id = "ND_standard_surface_surfaceshader" color3f inputs:base_color.connect = - float inputs:specular = 0.0 color3f inputs:opacity.connect = + float inputs:specular = 0 token outputs:out } @@ -385,8 +385,8 @@ def Scope "mtl" { uniform token info:id = "ND_standard_surface_surfaceshader" color3f inputs:base_color.connect = - float inputs:specular = 0.0 color3f inputs:opacity.connect = + float inputs:specular = 0 token outputs:out } @@ -425,7 +425,7 @@ def Scope "mtl" color3f outputs:out } } - + def Material "imageRG32F" { token outputs:mtlx:surface.connect = @@ -434,8 +434,8 @@ def Scope "mtl" { uniform token info:id = "ND_standard_surface_surfaceshader" color3f inputs:base_color.connect = - float inputs:specular = 0.0 color3f inputs:opacity.connect = + float inputs:specular = 0 token outputs:out } @@ -475,56 +475,42 @@ def Scope "mtl" } } - def Material "Background" ( - prepend apiSchemas = ["NodeGraphNodeAPI"] - ) + def Material "Background" { token outputs:mtlx:surface.connect = - uniform float2 ui:nodegraph:node:pos = (5.514378, 1.9555556) - def Shader "ss1" ( - prepend apiSchemas = ["NodeGraphNodeAPI"] - ) + def Shader "ss1" { uniform token info:id = "ND_standard_surface_surfaceshader" color3f inputs:base_color.connect = - float inputs:specular = 0.0 + float inputs:specular = 0 token outputs:out - uniform float2 ui:nodegraph:node:pos = (1.2722223, -0.2) } - def Shader "image1" ( - prepend apiSchemas = ["NodeGraphNodeAPI"] - ) + def Shader "image1" { uniform token info:id = "ND_image_color3" asset inputs:file = @textures/normalSpiral.png@ float2 inputs:texcoord.connect = color3f outputs:out - uniform float2 ui:nodegraph:node:pos = (-0.75555557, -0.4888889) } - def Shader "geompropvalue1" ( - prepend apiSchemas = ["NodeGraphNodeAPI"] - ) + def Shader "geompropvalue1" { uniform token info:id = "ND_geompropvalue_vector2" string inputs:geomprop = "st" float2 outputs:out - uniform float2 ui:nodegraph:node:pos = (-4.05, 0.46666667) } - def Shader "place2d1" ( - prepend apiSchemas = ["NodeGraphNodeAPI"] - ) + def Shader "place2d1" { uniform token info:id = "ND_place2d_vector2" float2 inputs:scale = (0.2, 0.2) float2 inputs:texcoord.connect = float2 outputs:out - uniform float2 ui:nodegraph:node:pos = (-2.538889, 0.92777777) } } + def Material "standard_surfaceUV1_3" { token outputs:mtlx:surface.connect = @@ -580,6 +566,68 @@ def Scope "mtl" float2 outputs:out } } + + def Material "standard_surface1" + { + token outputs:mtlx:surface.connect = + + def Shader "standard_surface1" + { + uniform token info:id = "ND_standard_surface_surfaceshader" + float3 inputs:normal.connect = + token outputs:out + } + + def Shader "normalmap1" + { + uniform token info:id = "ND_normalmap" + float3 inputs:normal.connect = + float3 outputs:out + } + + def Shader "image1" + { + uniform token info:id = "ND_image_vector3" + asset inputs:file = @textures/mesh_wire_norm.png@ + string inputs:filtertype = "closest" + float3 outputs:out + } + } + + def Material "standard_surface2" + { + token outputs:mtlx:surface.connect = + + def Shader "standard_surface1" + { + uniform token info:id = "ND_standard_surface_surfaceshader" + float3 inputs:normal.connect = + token outputs:out + } + + def Shader "normalmap1" + { + uniform token info:id = "ND_normalmap" + float3 inputs:in.connect = + float3 outputs:out + } + + def Shader "image1" + { + uniform token info:id = "ND_image_vector3" + asset inputs:file = @textures/mesh_wire_norm.png@ + string inputs:filtertype = "closest" + float2 inputs:texcoord.connect = + float3 outputs:out + } + + def Shader "geompropvalue1" + { + uniform token info:id = "ND_geompropvalue_vector2" + string inputs:geomprop = "st1" + float2 outputs:out + } + } } def Mesh "Background" ( @@ -614,3 +662,85 @@ def Mesh "Background" ( uniform token[] xformOpOrder = ["xformOp:translate", "xformOp:scale"] } +def Mesh "pMultiUVPlane5" ( + prepend apiSchemas = ["MaterialBindingAPI"] + kind = "component" +) +{ + uniform bool doubleSided = 1 + float3[] extent = [(-0.5, 0, -0.5), (0.5, 0, 0.5)] + int[] faceVertexCounts = [4] + int[] faceVertexIndices = [0, 1, 3, 2] + rel material:binding = + point3f[] points = [(-0.5, 0, 0.5), (0.5, 0, 0.5), (-0.5, 0, -0.5), (0.5, 0, -0.5)] + color3f[] primvars:displayColor = [(0.13320851, 0.13320851, 0.13320851)] ( + customData = { + dictionary Maya = { + bool generated = 1 + } + } + ) + texCoord2f[] primvars:st1 = [(1.5051357, 0.5019881), (0.4980119, 1.5051357), (0.5019881, -0.50513566), (-0.50513566, 0.4980119)] ( + customData = { + dictionary Maya = { + token name = "map1" + } + } + interpolation = "faceVarying" + ) + texCoord2f[] primvars:st = [(0.50056624, -0.00038683414), (1.0003868, 0.50056624), (-0.00038683414, 0.49943376), (0.49943376, 1.0003868)] ( + customData = { + dictionary Maya = { + token name = "uvSet1" + } + } + interpolation = "faceVarying" + ) + int[] primvars:st1:indices = [0, 1, 3, 2] + int[] primvars:st:indices = [0, 1, 3, 2] + token visibility = "inherited" + double3 xformOp:translate = (-2.2, 0, 0) + uniform token[] xformOpOrder = ["xformOp:translate"] +} + +def Mesh "pMultiUVPlane6" ( + prepend apiSchemas = ["MaterialBindingAPI"] + kind = "component" +) +{ + uniform bool doubleSided = 1 + float3[] extent = [(-0.5, 0, -0.5), (0.5, 0, 0.5)] + int[] faceVertexCounts = [4] + int[] faceVertexIndices = [0, 1, 3, 2] + rel material:binding = + point3f[] points = [(-0.5, 0, 0.5), (0.5, 0, 0.5), (-0.5, 0, -0.5), (0.5, 0, -0.5)] + color3f[] primvars:displayColor = [(0.13320851, 0.13320851, 0.13320851)] ( + customData = { + dictionary Maya = { + bool generated = 1 + } + } + ) + texCoord2f[] primvars:st1 = [(1.5051357, 0.5019881), (0.4980119, 1.5051357), (0.5019881, -0.50513566), (-0.50513566, 0.4980119)] ( + customData = { + dictionary Maya = { + token name = "map1" + } + } + interpolation = "faceVarying" + ) + texCoord2f[] primvars:st = [(0.50056624, -0.00038683414), (1.0003868, 0.50056624), (-0.00038683414, 0.49943376), (0.49943376, 1.0003868)] ( + customData = { + dictionary Maya = { + token name = "uvSet1" + } + } + interpolation = "faceVarying" + ) + int[] primvars:st1:indices = [0, 1, 3, 2] + int[] primvars:st:indices = [0, 1, 3, 2] + token visibility = "inherited" + double3 xformOp:translate = (-2.2, 0, 1.1) + uniform token[] xformOpOrder = ["xformOp:translate"] +} + diff --git a/test/testSamples/MaterialX/textures/mesh_wire_norm.png b/test/testSamples/MaterialX/textures/mesh_wire_norm.png new file mode 100644 index 0000000000..75dc2ccfc2 Binary files /dev/null and b/test/testSamples/MaterialX/textures/mesh_wire_norm.png differ