コード例 #1
0
        def SetupShading(stage):
            # First create the shading prims
            UsdGeom.Scope.Define(stage, shadersPath)
            UsdGeom.Scope.Define(stage, materialsPath)
            # .. and as we create each surface, bind the associated material's variant to it
            allMaterials = []
            for material in materialBases:
                materialPrim = UsdShade.Material.Define(
                    stage, MakeMaterialPath(material))
                allMaterials.append(materialPrim.GetPrim())
                for variant in shadeVariations:
                    surface = UsdShade.Shader.Define(
                        stage, MakeSurfacePath(material, variant))
                    colorOut = surface.CreateOutput("out",
                                                    Sdf.ValueTypeNames.Color3f)

                    disp = UsdShade.Shader.Define(
                        stage, MakeDisplacementPath(material, variant))
                    dispOut = disp.CreateOutput('out',
                                                Sdf.ValueTypeNames.Vector3f)

                    pattern = UsdShade.Shader.Define(
                        stage, MakePatternPath(material, variant))
                    patternOut = pattern.CreateOutput(
                        "out", Sdf.ValueTypeNames.FloatArray)

                    with materialPrim.GetEditContextForVariant(variant):
                        surfaceOutput = materialPrim.CreateOutput(
                            "surf", colorOut.GetTypeName())
                        surfaceOutput.ConnectToSource(
                            UsdShade.ConnectionSourceInfo(
                                UsdShade.ConnectableAPI(colorOut.GetPrim()),
                                colorOut.GetBaseName(),
                                UsdShade.AttributeType.Output))

                        displacementOutput = materialPrim.CreateOutput(
                            "disp", dispOut.GetTypeName())
                        displacementOutput.ConnectToSource(dispOut)

                        patternOutput = materialPrim.CreateOutput(
                            "pattern", patternOut.GetTypeName())
                        patternOutput.ConnectToSource(patternOut)

            return allMaterials
コード例 #2
0
ファイル: testUsdShadeShaders.py プロジェクト: mattyjams/USD
    def test_InputOutputConnections(self):
        stage = self._SetupStage()

        ################################
        print('Test Input/Output connections')
        ################################

        pale = UsdShade.Shader.Get(stage, palePath)
        self.assertTrue(pale)

        whiterPale = UsdShade.Shader.Get(stage, whiterPalePath)
        self.assertTrue(whiterPale)

        shaderClass = UsdShade.Shader.Get(stage, classPalePath)

        print('Test RenderType')
        chords = pale.CreateInput("chords", Sdf.ValueTypeNames.String)
        self.assertTrue(chords)
        self.assertTrue(not chords.HasRenderType())
        self.assertEqual(chords.GetRenderType(), "")
        chords.SetRenderType("notes")
        self.assertTrue(chords.HasRenderType())
        self.assertEqual(chords.GetRenderType(), "notes")

        ################################
        print('Test scalar connections')
        ################################

        usdShadeInput = pale.CreateInput('myFloatInput',
                                         Sdf.ValueTypeNames.Float)

        # test set/get documentation.
        doc = "My shade input"
        usdShadeInput.SetDocumentation(doc)
        self.assertEqual(usdShadeInput.GetDocumentation(), doc)

        # test set/get dislayGroup
        displayGroup = "floats"
        usdShadeInput.SetDisplayGroup(displayGroup)
        self.assertEqual(usdShadeInput.GetDisplayGroup(), displayGroup)

        self.assertEqual(usdShadeInput.GetBaseName(), 'myFloatInput')
        self.assertEqual(usdShadeInput.GetTypeName(), Sdf.ValueTypeNames.Float)
        usdShadeInput.Set(1.0)
        self.assertTrue(not usdShadeInput.HasConnectedSource())

        usdShadeInput.ConnectToSource(
            UsdShade.ConnectionSourceInfo(whiterPale.ConnectableAPI(), 'Fout',
                                          Output))
        self.assertTrue(usdShadeInput.HasConnectedSource())

        self.assertEqual(usdShadeInput.GetAttr().GetConnections(),
                         [whiterPale.GetPath().AppendProperty("outputs:Fout")])

        self.assertEqual(usdShadeInput.GetConnectedSources()[0], [
            UsdShade.ConnectionSourceInfo(whiterPale.ConnectableAPI(), 'Fout',
                                          Output)
        ])
        usdShadeInput.ClearSources()
        self.assertTrue(not usdShadeInput.HasConnectedSource())
        self.assertEqual(usdShadeInput.GetConnectedSources()[0], [])

        # Now make the connection in the class
        inheritedInput = shaderClass.CreateInput('myFloatInput',
                                                 Sdf.ValueTypeNames.Float)
        inheritedInput.ConnectToSource(
            UsdShade.ConnectionSourceInfo(whiterPale.ConnectableAPI(), 'Fout',
                                          Output))
        # note we're now testing the inheritING prim's parameter
        self.assertTrue(usdShadeInput.HasConnectedSource())
        self.assertTrue(usdShadeInput.GetConnectedSources()[0], [
            UsdShade.ConnectionSourceInfo(whiterPale.ConnectableAPI(), 'Fout',
                                          Output)
        ])
        # clearing no longer changes anything
        usdShadeInput.ClearSources()
        self.assertTrue(usdShadeInput.HasConnectedSource())
        self.assertTrue(usdShadeInput.GetConnectedSources()[0], [
            UsdShade.ConnectionSourceInfo(whiterPale.ConnectableAPI(), 'Fout',
                                          Output)
        ])
        # but disconnecting should
        usdShadeInput.DisconnectSource()
        self.assertTrue(not usdShadeInput.HasConnectedSource())
        self.assertEqual(usdShadeInput.GetConnectedSources()[0], [])

        ################################
        print('Test asset id')
        ################################
        self.assertEqual(pale.GetImplementationSource(), UsdShade.Tokens.id)
        self.assertEqual(whiterPale.GetImplementationSource(),
                         UsdShade.Tokens.id)

        self.assertTrue(pale.SetShaderId('SharedFloat_1'))
        self.assertEqual(pale.GetShaderId(), 'SharedFloat_1')

        self.assertTrue(whiterPale.CreateIdAttr('SharedColor_1'))
        self.assertEqual(whiterPale.GetIdAttr().Get(), 'SharedColor_1')

        self.assertTrue(pale.GetSourceAsset() is None)
        self.assertTrue(whiterPale.GetSourceCode() is None)

        # Test boundaries of parameter type-testing when connecting
        print("Test Typed Input Connections")

        colInput = pale.CreateInput("col1", Sdf.ValueTypeNames.Color3f)
        self.assertTrue(colInput)
        self.assertTrue(
            colInput.ConnectToSource(
                UsdShade.ConnectionSourceInfo(whiterPale.ConnectableAPI(),
                                              'colorOut', Output)))
        outputAttr = whiterPale.GetPrim().GetAttribute("outputs:colorOut")
        self.assertTrue(outputAttr)
        self.assertEqual(outputAttr.GetTypeName(), Sdf.ValueTypeNames.Color3f)

        v3fInput = pale.CreateInput("v3f1", Sdf.ValueTypeNames.Float3)
        self.assertTrue(v3fInput)
        self.assertTrue(
            v3fInput.ConnectToSource(
                UsdShade.ConnectionSourceInfo(whiterPale.ConnectableAPI(),
                                              "colorOut", Output)))

        pointInput = pale.CreateInput("point1", Sdf.ValueTypeNames.Point3f)
        self.assertTrue(pointInput)
        self.assertTrue(
            pointInput.ConnectToSource(
                UsdShade.ConnectionSourceInfo(whiterPale.ConnectableAPI(),
                                              "colorOut", Output)))

        floatInput = pale.CreateInput("float1", Sdf.ValueTypeNames.Float)
        self.assertTrue(floatInput)
        # XXX The following test must be disabled until we re-enable strict
        # type-checking for input / output connections.  See bug/113600
        # can't connect float to color!
        #with RequiredException(Tf.ErrorException):
        #    floatInput.ConnectToSource(
        #        UsdShade.ConnectionSourceInfo(whiterPale, "colorOut", Output))

        self.assertTrue(
            floatInput.ConnectToSource(
                UsdShade.ConnectionSourceInfo(whiterPale.ConnectableAPI(),
                                              "floatInput", Input)))
        outputAttr = whiterPale.GetPrim().GetAttribute("outputs:floatInput")
        self.assertFalse(outputAttr)
        outputAttr = whiterPale.GetPrim().GetAttribute("inputs:floatInput")
        self.assertTrue(outputAttr)

        print("Test Input Fetching")
        # test against single input fetches
        vecInput = pale.CreateInput('vec', Sdf.ValueTypeNames.Color3f)
        self.assertTrue(vecInput)
        self.assertTrue(pale.GetInput('vec'))
        self.assertEqual(pale.GetInput('vec').GetBaseName(), 'vec')
        self.assertEqual(
            pale.GetInput('vec').GetTypeName(), Sdf.ValueTypeNames.Color3f)
        self.assertTrue(pale.GetInput('vec').SetRenderType('foo'))
        self.assertEqual(pale.GetInput('vec').GetRenderType(), 'foo')

        # test against multiple input parameters.
        inputs = pale.GetInputs()

        # assure new item in collection
        self.assertEqual(
            len([pr for pr in inputs if pr.GetRenderType() == 'foo']), 1)

        # ensure the input count increments properly
        oldlen = len(pale.GetInputs())
        newparam = pale.CreateInput('struct', Sdf.ValueTypeNames.Color3f)

        # assure new item in collection
        self.assertEqual(len(pale.GetInputs()), (oldlen + 1))

        # ensure by-value capture in 'inputs'
        self.assertNotEqual(len(pale.GetInputs()), len(inputs))
コード例 #3
0
    def test_Basic(self):
        MaterialPath = Sdf.Path("/Material")
        ShaderPath = Sdf.Path("/Material/Shader")
        NodeGraphPath = Sdf.Path("/Material/NodeGraph")
        NestedShaderPath = Sdf.Path("/Material/NodeGraph/NestedShader")

        usdStage = Usd.Stage.CreateInMemory()
        self.assertTrue(usdStage)

        material = UsdShade.Material.Define(usdStage, MaterialPath)
        self.assertTrue(material)
        self.assertTrue(UsdShade.ConnectableAPI(material).IsContainer())

        nodeGraph = UsdShade.NodeGraph.Define(usdStage, NodeGraphPath)
        self.assertTrue(nodeGraph)
        self.assertTrue(UsdShade.ConnectableAPI(nodeGraph).IsContainer())
        self.assertTrue(UsdShade.ConnectableAPI(nodeGraph).IsNodeGraph())

        shader = UsdShade.Shader.Define(usdStage, ShaderPath)
        self.assertTrue(shader)
        self.assertFalse(UsdShade.ConnectableAPI(shader).IsContainer())
        self.assertTrue(UsdShade.ConnectableAPI(shader).IsShader())

        nestedShader = UsdShade.Shader.Define(usdStage, NestedShaderPath)
        self.assertTrue(nestedShader)

        # Create all inputs and connections.

        # Create a float interface input on the material.
        matConnectable = material.ConnectableAPI()
        floatInterfaceInput = matConnectable.CreateInput(
            "floatInput", Sdf.ValueTypeNames.Float)
        # default connectability of an interface-input is 'full'
        self.assertEqual(floatInterfaceInput.GetConnectability(),
                         UsdShade.Tokens.full)
        # inputs on a material are not connectable
        xAttr = material.GetPrim().CreateAttribute("x",
                                                   Sdf.ValueTypeNames.Double,
                                                   True)
        self._CanConnect(floatInterfaceInput, xAttr)

        self.assertTrue(
            floatInterfaceInput.SetConnectability(
                UsdShade.Tokens.interfaceOnly))
        self.assertEqual(floatInterfaceInput.GetConnectability(),
                         UsdShade.Tokens.interfaceOnly)

        self.assertTrue(floatInterfaceInput.ClearConnectability())
        self.assertEqual(floatInterfaceInput.GetConnectability(),
                         UsdShade.Tokens.full)

        # Create a color valued interface input on the material.
        colorInterfaceInput = material.CreateInput("colorInput",
                                                   Sdf.ValueTypeNames.Color3f)
        self.assertEqual(colorInterfaceInput.GetConnectability(),
                         UsdShade.Tokens.full)
        self.assertTrue(
            colorInterfaceInput.SetConnectability(
                UsdShade.Tokens.interfaceOnly))

        colorMaterialOutput = material.CreateOutput("colorOutput",
                                                    Sdf.ValueTypeNames.Color3f)

        # Create shader inputs.
        shaderConnectable = shader.ConnectableAPI()
        shaderInputFloat = shaderConnectable.CreateInput(
            "shaderFloat", Sdf.ValueTypeNames.Float)
        shaderInputColor = shader.CreateInput("shaderColor",
                                              Sdf.ValueTypeNames.Color3f)
        self.assertEqual(shaderInputFloat.GetConnectability(),
                         UsdShade.Tokens.full)
        self.assertEqual(shaderInputColor.GetConnectability(),
                         UsdShade.Tokens.full)

        # The shader inputs have full connectability by default and can be
        # connected to any input or output.
        self._CanConnect(shaderInputColor, colorInterfaceInput)
        # Make the connection.
        self.assertTrue(
            shaderInputColor.ConnectToSource(
                UsdShade.ConnectionSourceInfo(
                    material, colorInterfaceInput.GetBaseName(),
                    UsdShade.AttributeType.Input)))

        self.assertEqual(shaderInputColor.GetAttr().GetConnections(),
                         [colorInterfaceInput.GetAttr().GetPath()])

        self._CanConnect(shaderInputFloat, floatInterfaceInput)
        self.assertTrue(shaderInputFloat.ConnectToSource(floatInterfaceInput))

        self.assertEqual(shaderInputFloat.GetAttr().GetConnections(),
                         [floatInterfaceInput.GetAttr().GetPath()])

        shaderOutputColor = shader.CreateOutput("color",
                                                Sdf.ValueTypeNames.Color3f)
        shaderOutputFloat = shader.CreateOutput("fOut",
                                                Sdf.ValueTypeNames.Float)

        nodeGraphInputFloat = nodeGraph.CreateInput("nodeGraphFlIn",
                                                    Sdf.ValueTypeNames.Float)
        self.assertEqual(nodeGraphInputFloat.GetConnectability(),
                         UsdShade.Tokens.full)

        # NodeGraph Input with "interfaceOnly" connectability cannot be
        # connected to an output.
        self.assertTrue(
            nodeGraphInputFloat.SetConnectability(
                UsdShade.Tokens.interfaceOnly))
        self._CannotConnect(nodeGraphInputFloat, shaderOutputFloat)

        # NodeGraph Input with full connectability can be connected to an output.
        self.assertTrue(
            nodeGraphInputFloat.SetConnectability(UsdShade.Tokens.full))
        self._CanConnect(nodeGraphInputFloat, shaderOutputFloat)
        self.assertTrue(
            nodeGraphInputFloat.ConnectToSource(
                UsdShade.ConnectionSourceInfo(shaderOutputFloat)))

        nodeGraphInputColor = nodeGraph.CreateInput("nodeGraphColor",
                                                    Sdf.ValueTypeNames.Color3f)
        self.assertTrue(
            nodeGraphInputColor.SetConnectability(
                UsdShade.Tokens.interfaceOnly))
        # Can't connect an "interfaceOnly" input to an output on a shader or node-graph.
        self._CannotConnect(nodeGraphInputColor, shaderOutputColor)
        self._CannotConnect(nodeGraphInputColor, colorMaterialOutput)

        # Can't connect an "interfaceOnly" input to a "full" input on a shader.
        self._CannotConnect(nodeGraphInputColor, shaderInputColor)

        # Change connectability of input on shader to "interfaceOnly" to allow the
        # previously attempted connection.
        self.assertTrue(
            shaderInputColor.SetConnectability(UsdShade.Tokens.interfaceOnly))
        self._CanConnect(nodeGraphInputColor, shaderInputColor)
        self.assertTrue(
            nodeGraphInputColor.SetConnectedSources(
                [UsdShade.ConnectionSourceInfo(shaderInputColor)]))

        # Change connectability of an interface input to full, to test connection
        # from an "interfaceOnly" to a "full" input on a nodegraph.
        self.assertTrue(
            floatInterfaceInput.SetConnectability(UsdShade.Tokens.full))
        self.assertEqual(floatInterfaceInput.GetConnectability(),
                         UsdShade.Tokens.full)

        nestedShaderInputFloat = nestedShader.CreateInput(
            "nestedShaderFloat", Sdf.ValueTypeNames.Float)
        self.assertTrue(
            nestedShaderInputFloat.SetConnectability(
                UsdShade.Tokens.interfaceOnly))
        self._CannotConnect(nestedShaderInputFloat, floatInterfaceInput)

        # Change connectability of interface input to "interfaceOnly". This will
        # allow the previously attempted connection.
        self.assertTrue(
            floatInterfaceInput.SetConnectability(
                UsdShade.Tokens.interfaceOnly))
        self._CanConnect(nestedShaderInputFloat, floatInterfaceInput)
        self.assertTrue(
            nestedShaderInputFloat.ConnectToSource(floatInterfaceInput))

        # Test the ability to connect to multiple sources
        floatInterfaceInput2 = matConnectable.CreateInput(
            "floatInput2", Sdf.ValueTypeNames.Float)
        self.assertTrue(
            shaderInputFloat.ConnectToSource(
                UsdShade.ConnectionSourceInfo(floatInterfaceInput2),
                UsdShade.ConnectionModification.Append))
        self.assertEqual(shaderInputFloat.GetAttr().GetConnections(), [
            floatInterfaceInput.GetAttr().GetPath(),
            floatInterfaceInput2.GetAttr().GetPath()
        ])

        floatInterfaceInput3 = matConnectable.CreateInput(
            "floatInput3", Sdf.ValueTypeNames.Float)
        self.assertTrue(
            shaderInputFloat.ConnectToSource(
                UsdShade.ConnectionSourceInfo(floatInterfaceInput3),
                UsdShade.ConnectionModification.Prepend))
        self.assertEqual(shaderInputFloat.GetAttr().GetConnections(), [
            floatInterfaceInput3.GetAttr().GetPath(),
            floatInterfaceInput.GetAttr().GetPath(),
            floatInterfaceInput2.GetAttr().GetPath()
        ])

        sourceInfos, invalidPaths = shaderInputFloat.GetConnectedSources()
        self.assertEqual(sourceInfos, [
            UsdShade.ConnectionSourceInfo(floatInterfaceInput3),
            UsdShade.ConnectionSourceInfo(floatInterfaceInput),
            UsdShade.ConnectionSourceInfo(floatInterfaceInput2)
        ])
        self.assertEqual(invalidPaths, [])

        # Test the targeted disconnection of a single source
        shaderInputFloat.DisconnectSource(floatInterfaceInput.GetAttr())
        sourceInfos, invalidPaths = shaderInputFloat.GetConnectedSources()
        self.assertEqual(sourceInfos, [
            UsdShade.ConnectionSourceInfo(floatInterfaceInput3),
            UsdShade.ConnectionSourceInfo(floatInterfaceInput2)
        ])
        self.assertEqual(invalidPaths, [])

        # Calling DisconnectSource without a specific source attribute will
        # remove all remaining connections
        shaderInputFloat.DisconnectSource()
        sourceInfos, invalidPaths = shaderInputFloat.GetConnectedSources()
        self.assertEqual(sourceInfos, [])
        self.assertEqual(invalidPaths, [])

        # Clear sources is another way to remove all connections
        shaderInputColor.ClearSources()
        sourceInfos, invalidPaths = shaderInputColor.GetConnectedSources()
        self.assertEqual(sourceInfos, [])
        self.assertEqual(invalidPaths, [])