Пример #1
0
    def testLightFilters(self):

        s = Gaffer.ScriptNode()

        s["lightFilter"] = GafferArnold.ArnoldLightFilter()
        s["lightFilter"].loadShader("light_blocker")

        s["attributes"] = GafferScene.StandardAttributes()
        s["attributes"]["in"].setInput(s["lightFilter"]["out"])
        s["attributes"]["attributes"]["filteredLights"]["enabled"].setValue(
            True)
        s["attributes"]["attributes"]["filteredLights"]["value"].setValue(
            "defaultLights")

        s["light"] = GafferArnold.ArnoldLight()
        s["light"].loadShader("point_light")

        s["gobo"] = GafferArnold.ArnoldShader()
        s["gobo"].loadShader("gobo")

        s["assignment"] = GafferScene.ShaderAssignment()
        s["assignment"]["in"].setInput(s["light"]["out"])
        s["assignment"]["shader"].setInput(s["gobo"]["out"])

        s["group"] = GafferScene.Group()

        s["group"]["in"][0].setInput(s["attributes"]["out"])
        s["group"]["in"][1].setInput(s["assignment"]["out"])

        s["render"] = GafferArnold.ArnoldRender()
        s["render"]["in"].setInput(s["group"]["out"])
        s["render"]["mode"].setValue(s["render"].Mode.SceneDescriptionMode)
        s["render"]["fileName"].setValue(self.temporaryDirectory() +
                                         "/test.ass")

        s["render"]["task"].execute()

        with IECoreArnold.UniverseBlock(writable=True):

            arnold.AiASSLoad(self.temporaryDirectory() + "/test.ass")

            light = arnold.AiNodeLookUpByName("light:/group/light")
            linkedFilters = arnold.AiNodeGetArray(light, "filters")
            numFilters = arnold.AiArrayGetNumElements(linkedFilters.contents)

            self.assertEqual(numFilters, 2)

            linkedFilter = arnold.cast(arnold.AiArrayGetPtr(linkedFilters, 0),
                                       arnold.POINTER(arnold.AtNode))
            linkedGobo = arnold.cast(arnold.AiArrayGetPtr(linkedFilters, 1),
                                     arnold.POINTER(arnold.AtNode))

            self.assertEqual(arnold.AiNodeGetName(linkedFilter),
                             "lightFilter:/group/lightFilter")
            self.assertEqual(
                arnold.AiNodeEntryGetName(
                    arnold.AiNodeGetNodeEntry(linkedFilter)), "light_blocker")
            self.assertEqual(
                arnold.AiNodeEntryGetName(
                    arnold.AiNodeGetNodeEntry(linkedGobo)), "gobo")
    def testShaderInputs(self):

        # Test setting up a checkerboard connected to the lightfilter's "shader" input.

        s = GafferArnold.ArnoldShader("Checkerboard")
        s.loadShader("checkerboard")

        l = GafferArnold.ArnoldLightFilter()
        l.loadShader("light_blocker")

        l["parameters"]["shader"].setInput(s["out"])

        network = l["out"].attributes("/lightFilter")["ai:lightFilter:filter"]
        self.assertEqual(len(network), 2)
        self.assertEqual(network.getShader("__shader").name, "light_blocker")
        self.assertEqual(
            network.getShader("Checkerboard").name, "checkerboard")
        self.assertEqual(
            network.getShader("Checkerboard").parameters["color1"].value,
            imath.Color3f(1, 1, 1))

        self.assertEqual(network.inputConnections(network.getOutput().shader),
                         [
                             network.Connection(
                                 ("Checkerboard", ""),
                                 (network.getOutput().shader, "shader")),
                         ])
Пример #3
0
    def testLightFiltersMany(self):

        # \todo: this can easily be turned into a performance test

        s = Gaffer.ScriptNode()

        s["lightFilter"] = GafferArnold.ArnoldLightFilter()
        s["lightFilter"].loadShader("light_blocker")
        s["lightFilter"]["filteredLights"].setValue("defaultLights")

        s["planeFilters"] = GafferScene.Plane("Plane")
        s["planeFilters"]["divisions"].setValue(imath.V2i(9))

        s["instancerFilters"] = GafferScene.Instancer("Instancer")
        s["instancerFilters"]["in"].setInput(s["planeFilters"]["out"])
        s["instancerFilters"]["instances"].setInput(s["lightFilter"]["out"])
        s["instancerFilters"]["parent"].setValue("/plane")

        s["light"] = GafferArnold.ArnoldLight()
        s["light"].loadShader("point_light")

        s["planeLights"] = GafferScene.Plane("Plane")
        s["planeLights"]["divisions"].setValue(imath.V2i(9))

        s["instancerLights"] = GafferScene.Instancer("Instancer")
        s["instancerLights"]["in"].setInput(s["planeLights"]["out"])
        s["instancerLights"]["instances"].setInput(s["light"]["out"])
        s["instancerLights"]["parent"].setValue("/plane")

        s["group"] = GafferScene.Group("Group")
        s["group"]["in"][0].setInput(s["instancerFilters"]["out"])
        s["group"]["in"][1].setInput(s["instancerLights"]["out"])

        s["render"] = GafferArnold.ArnoldRender()
        s["render"]["in"].setInput(s["group"]["out"])
        s["render"]["mode"].setValue(s["render"].Mode.SceneDescriptionMode)
        s["render"]["fileName"].setValue(self.temporaryDirectory() +
                                         "/testMany.ass")

        s["render"]["task"].execute()

        with IECoreArnold.UniverseBlock(writable=True):

            foo = self.temporaryDirectory() + "/testMany.ass"
            print foo
            arnold.AiASSLoad(foo)

            for i in range(100):
                light = arnold.AiNodeLookUpByName(
                    "light:/group/plane1/instances/light/%s" % i)
                linkedFilters = arnold.AiNodeGetArray(light, "filters")
                numFilters = arnold.AiArrayGetNumElements(
                    linkedFilters.contents)

                self.assertEqual(numFilters, 100)
    def testUsesShaders(self):

        l = GafferArnold.ArnoldLightFilter()
        l.loadShader("light_blocker")

        n = l["out"].attributes("/lightFilter")["ai:lightFilter:filter"]
        self.assertTrue(isinstance(n, IECoreScene.ShaderNetwork))
        self.assertEqual(len(n), 1)
        self.assertTrue(isinstance(n.outputShader(), IECoreScene.Shader))
        self.assertEqual(n.outputShader().type, "ai:lightFilter")
        self.assertEqual(n.outputShader().name, "light_blocker")
    def testSets(self):

        l = GafferArnold.ArnoldLightFilter()
        l.loadShader("light_blocker")

        self.assertEqual(l["out"].set("__lightFilters").value.paths(),
                         ["/lightFilter"])

        l["sets"].setValue("myLightFilters")

        self.assertEqual(l["out"].set("myLightFilters").value.paths(),
                         ["/lightFilter"])
    def testDisabling(self):

        l = GafferArnold.ArnoldLightFilter()
        l.loadShader("light_blocker")

        attributesHash = l["out"].attributesHash("/lightFilter")
        attributes = l["out"].attributes("/lightFilter")

        self.assertSceneValid(l["out"])

        l["enabled"].setValue(False)

        attributesHash2 = l["out"].attributesHash("/lightFilter")
        self.assertNotEqual(attributesHash2, attributesHash)

        attributes2 = l["out"].attributes("/lightFilter")
        self.assertEqual(len(attributes2), 0)

        self.assertSceneValid(l["out"])
Пример #7
0
    def testLightFiltersMany(self):

        numLights = 10000
        numLightFilters = 10000

        s = Gaffer.ScriptNode()

        s["lightFilter"] = GafferArnold.ArnoldLightFilter()
        s["lightFilter"].loadShader("light_blocker")
        s["lightFilter"]["filteredLights"].setValue("defaultLights")

        s["planeFilters"] = GafferScene.Plane("Plane")
        s["planeFilters"]["divisions"].setValue(
            imath.V2i(1, numLightFilters / 2 - 1))

        s["instancerFilters"] = GafferScene.Instancer("Instancer")
        s["instancerFilters"]["in"].setInput(s["planeFilters"]["out"])
        s["instancerFilters"]["instances"].setInput(s["lightFilter"]["out"])
        s["instancerFilters"]["parent"].setValue("/plane")

        s["light"] = GafferArnold.ArnoldLight()
        s["light"].loadShader("point_light")

        s["planeLights"] = GafferScene.Plane("Plane")
        s["planeLights"]["divisions"].setValue(imath.V2i(1, numLights / 2 - 1))

        s["instancerLights"] = GafferScene.Instancer("Instancer")
        s["instancerLights"]["in"].setInput(s["planeLights"]["out"])
        s["instancerLights"]["instances"].setInput(s["light"]["out"])
        s["instancerLights"]["parent"].setValue("/plane")

        s["group"] = GafferScene.Group("Group")
        s["group"]["in"][0].setInput(s["instancerFilters"]["out"])
        s["group"]["in"][1].setInput(s["instancerLights"]["out"])

        s["render"] = GafferArnold.ArnoldRender()
        s["render"]["in"].setInput(s["group"]["out"])

        with Gaffer.Context() as c:
            c["scene:render:sceneTranslationOnly"] = IECore.BoolData(True)
            s["render"]["task"].execute()
    def testFilteredLightsPlug(self):

        l = GafferArnold.ArnoldLightFilter()
        l.loadShader("light_blocker")

        self.assertNotIn("filteredLights", l["out"].attributes("/lightFilter"))

        l["filteredLights"].setValue("defaultLights")

        self.assertIn("filteredLights", l["out"].attributes("/lightFilter"))
        self.assertEqual(l["out"].attributes("/lightFilter")["filteredLights"],
                         IECore.StringData("defaultLights"))

        h1 = l["out"].attributesHash("/lightFilter")
        l["filteredLights"].setValue("/does/not/exist")
        h2 = l["out"].attributesHash("/lightFilter")

        self.assertNotEqual(h1, h2)

        self.assertEqual(l["out"].attributes("/lightFilter")["filteredLights"],
                         IECore.StringData("/does/not/exist"))
    def testSerialisation(self):

        s = Gaffer.ScriptNode()

        s["l"] = GafferArnold.ArnoldLightFilter()
        s["l"].loadShader("light_blocker")

        ss = s.serialise()

        s2 = Gaffer.ScriptNode()
        s2.execute(ss)

        self.assertEqual(s["l"]["parameters"].keys(),
                         s2["l"]["parameters"].keys())

        for plug in s["l"]['parameters'].values():
            relativeName = plug.relativeName(s["l"])
            self.assertEqual(s2["l"].descendant(relativeName).getValue(),
                             plug.getValue())

        self.assertEqual(s["l"]["out"].attributes("/lightFilter"),
                         s2["l"]["out"].attributes("/lightFilter"))
Пример #10
0
    def testReload(self):

        l = GafferArnold.ArnoldLightFilter()
        l.loadShader("light_blocker")

        l["parameters"]["density"].setValue(3.14)
        l["parameters"]["geometry_type"].setValue("plane")
        l["parameters"]["ramp"].setValue(0.4)
        l["parameters"]["width_edge"].setValue(0.2)

        l.loadShader("light_blocker", keepExistingValues=True)

        self.assertAlmostEqual(l["parameters"]["density"].getValue(), 3.14, 5)
        self.assertEqual(l["parameters"]["geometry_type"].getValue(), "plane")
        self.assertAlmostEqual(l["parameters"]["ramp"].getValue(), 0.4, 5)
        self.assertAlmostEqual(l["parameters"]["width_edge"].getValue(), 0.2,
                               5)

        l.loadShader("light_blocker", keepExistingValues=False)

        self.assertTrue(l["parameters"]["density"].isSetToDefault())
        self.assertTrue(l["parameters"]["geometry_type"].isSetToDefault())
        self.assertTrue(l["parameters"]["ramp"].isSetToDefault())
        self.assertTrue(l["parameters"]["width_edge"].isSetToDefault())
    def _createLightFilter(self):

        lightFilter = GafferArnold.ArnoldLightFilter()
        lightFilter.loadShader("light_blocker")
        return lightFilter, lightFilter["parameters"]["density"]
Пример #12
0
	def testShaderSubstitutions( self ) :

		s = Gaffer.ScriptNode()

		s["plane"] = GafferScene.Plane()

		s["planeAttrs"] = GafferScene.CustomAttributes()
		s["planeAttrs"]["in"].setInput( s["plane"]["out"] )
		s["planeAttrs"]["attributes"].addChild( Gaffer.NameValuePlug( "A", Gaffer.StringPlug( "value", defaultValue = 'bar' ) ) )
		s["planeAttrs"]["attributes"].addChild( Gaffer.NameValuePlug( "B", Gaffer.StringPlug( "value", defaultValue = 'foo' ) ) )

		s["cube"] = GafferScene.Cube()

		s["cubeAttrs"] = GafferScene.CustomAttributes()
		s["cubeAttrs"]["in"].setInput( s["cube"]["out"] )
		s["cubeAttrs"]["attributes"].addChild( Gaffer.NameValuePlug( "B", Gaffer.StringPlug( "value", defaultValue = 'override' ) ) )

		s["parent"] = GafferScene.Parent()
		s["parent"]["in"].setInput( s["planeAttrs"]["out"] )
		s["parent"]["children"][0].setInput( s["cubeAttrs"]["out"] )
		s["parent"]["parent"].setValue( "/plane" )

		s["shader"] = GafferArnold.ArnoldShader()
		s["shader"].loadShader( "image" )
		s["shader"]["parameters"]["filename"].setValue( "<attr:A>/path/<attr:B>.tx" )

		s["filter"] = GafferScene.PathFilter()
		s["filter"]["paths"].setValue( IECore.StringVectorData( [ "/plane" ] ) )

		s["shaderAssignment"] = GafferScene.ShaderAssignment()
		s["shaderAssignment"]["in"].setInput( s["parent"]["out"] )
		s["shaderAssignment"]["filter"].setInput( s["filter"]["out"] )
		s["shaderAssignment"]["shader"].setInput( s["shader"]["out"] )

		s["light"] = GafferArnold.ArnoldLight()
		s["light"].loadShader( "photometric_light" )
		s["light"]["parameters"]["filename"].setValue( "/path/<attr:A>.ies" )

		s["goboTexture"] = GafferArnold.ArnoldShader()
		s["goboTexture"].loadShader( "image" )
		s["goboTexture"]["parameters"]["filename"].setValue( "<attr:B>/gobo.tx" )

		s["gobo"] = GafferArnold.ArnoldShader()
		s["gobo"].loadShader( "gobo" )
		s["gobo"]["parameters"]["slidemap"].setInput( s["goboTexture"]["out"] )

		s["goboAssign"] = GafferScene.ShaderAssignment()
		s["goboAssign"]["in"].setInput( s["light"]["out"] )
		s["goboAssign"]["shader"].setInput( s["gobo"]["out"] )

		s["lightBlocker"] = GafferArnold.ArnoldLightFilter()
		s["lightBlocker"].loadShader( "light_blocker" )
		s["lightBlocker"]["parameters"]["geometry_type"].setValue( "<attr:geometryType>" )

		s["lightGroup"] = GafferScene.Group()
		s["lightGroup"]["name"].setValue( "lightGroup" )
		s["lightGroup"]["in"][0].setInput( s["goboAssign"]["out"] )
		s["lightGroup"]["in"][1].setInput( s["lightBlocker"]["out"] )

		s["parent2"] = GafferScene.Parent()
		s["parent2"]["in"].setInput( s["shaderAssignment"]["out"] )
		s["parent2"]["children"][0].setInput( s["lightGroup"]["out"] )
		s["parent2"]["parent"].setValue( "/" )

		s["globalAttrs"] = GafferScene.CustomAttributes()
		s["globalAttrs"]["in"].setInput( s["parent2"]["out"] )
		s["globalAttrs"]["global"].setValue( True )
		s["globalAttrs"]["attributes"].addChild( Gaffer.NameValuePlug( "A", Gaffer.StringPlug( "value", defaultValue = 'default1' ) ) )
		s["globalAttrs"]["attributes"].addChild( Gaffer.NameValuePlug( "B", Gaffer.StringPlug( "value", defaultValue = 'default2' ) ) )
		s["globalAttrs"]["attributes"].addChild( Gaffer.NameValuePlug( "geometryType", Gaffer.StringPlug( "value", defaultValue = 'cylinder' ) ) )

		s["render"] = GafferArnold.ArnoldRender()
		s["render"]["in"].setInput( s["globalAttrs"]["out"] )
		s["render"]["mode"].setValue( s["render"].Mode.SceneDescriptionMode )
		s["render"]["fileName"].setValue( self.temporaryDirectory() + "/test.ass" )

		s["render"]["task"].execute()

		with IECoreArnold.UniverseBlock( writable = True ) :

			arnold.AiASSLoad( self.temporaryDirectory() + "/test.ass" )
			plane = arnold.AiNodeLookUpByName( "/plane" )
			shader = arnold.AiNodeGetPtr( plane, "shader" )
			self.assertEqual( arnold.AiNodeGetStr( shader, "filename" ), "bar/path/foo.tx" )

			cube = arnold.AiNodeLookUpByName( "/plane/cube" )
			shader2 = arnold.AiNodeGetPtr( cube, "shader" )
			self.assertEqual( arnold.AiNodeGetStr( shader2, "filename" ), "bar/path/override.tx" )

			light = arnold.AiNodeLookUpByName( "light:/lightGroup/light" )
			self.assertEqual( arnold.AiNodeGetStr( light, "filename" ), "/path/default1.ies" )

			gobo = arnold.AiNodeGetPtr( light, "filters" )
			goboTex = arnold.AiNodeGetLink( gobo, "slidemap" )
			self.assertEqual( arnold.AiNodeGetStr( goboTex, "filename" ), "default2/gobo.tx" )

			lightFilter = arnold.AiNodeLookUpByName( "lightFilter:/lightGroup/lightFilter" )
			self.assertEqual( arnold.AiNodeGetStr( lightFilter, "geometry_type" ), "cylinder" )