Exemple #1
0
	def testImageOutput( self ) :
	
		s = Gaffer.ScriptNode()

		s["plane"] = GafferScene.Plane()
		
		s["displays"] = GafferScene.Displays()
		s["displays"].addDisplay(
			"beauty",
			IECore.Display(
				"/tmp/test.####.tif",
				"tiff",
				"rgba",
				{}
			)
		)
		s["displays"]["in"].setInput( s["plane"]["out"] )
		
		s["render"] = GafferArnold.ArnoldRender()
		s["render"]["in"].setInput( s["displays"]["out"] )
		
		s["render"]["verbosity"].setValue( 1 )
		s["render"]["fileName"].setValue( "/tmp/test.####.ass" )

		s["fileName"].setValue( self.__scriptFileName )
		s.save()
		
		c = Gaffer.Context()
		for i in range( 1, 4 ) :
			c.setFrame( i )
			with c :
				s["render"].execute( [ Gaffer.Context.current() ] )
			
		for i in range( 1, 4 ) :
			self.failUnless( os.path.exists( "/tmp/test.%04d.tif" % i ) )		
Exemple #2
0
    def testBoundsAndImageOutput(self):

        s = Gaffer.ScriptNode()

        s["plane"] = GafferScene.Plane()
        s["plane"]["transform"]["translate"].setValue(IECore.V3f(0, 0, -5))

        s["displays"] = GafferScene.Displays()
        s["displays"].addDisplay(
            "beauty", IECore.Display("/tmp/test.tif", "tiff", "rgba", {}))
        s["displays"]["in"].setInput(s["plane"]["out"])

        s["render"] = GafferRenderMan.RenderManRender()
        s["render"]["in"].setInput(s["displays"]["out"])
        s["render"]["mode"].setValue("generate")

        s["render"]["ribFileName"].setValue("/tmp/test.rib")

        s["fileName"].setValue("/tmp/test.gfr")
        s.save()

        s["render"].execute([Gaffer.Context.current()])

        self.assertTrue(os.path.exists("/tmp/test.rib"))

        p = subprocess.Popen("renderdl " + "/tmp/test.rib",
                             shell=True,
                             stderr=subprocess.PIPE)
        p.wait()

        self.failIf("exceeded its bounds" in "".join(p.stderr.readlines()))

        self.assertTrue(os.path.exists("/tmp/test.tif"))
Exemple #3
0
    def testDisplayDirectoryCreation(self):

        s = Gaffer.ScriptNode()
        s["variables"].addMember("renderDirectory", "/tmp/openGLRenderTest")

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

        s["displays"] = GafferScene.Displays()
        s["displays"]["in"].setInput(s["plane"]["out"])
        s["displays"].addDisplay(
            "beauty",
            IECore.Display("$renderDirectory/test.####.exr", "exr", "rgba",
                           {}))

        s["render"] = GafferScene.OpenGLRender()
        s["render"]["in"].setInput(s["displays"]["out"])

        self.assertFalse(os.path.exists("/tmp/openGLRenderTest"))
        self.assertFalse(os.path.exists("/tmp/openGLRenderTest/test.0001.exr"))

        s["fileName"].setValue("/tmp/test.gfr")

        with s.context():
            s["render"].execute()

        self.assertTrue(os.path.exists("/tmp/openGLRenderTest"))
        self.assertTrue(os.path.exists("/tmp/openGLRenderTest/test.0001.exr"))
Exemple #4
0
	def testWaitForImage( self ) :
	
		s = Gaffer.ScriptNode()

		s["plane"] = GafferScene.Plane()
		
		s["displays"] = GafferScene.Displays()
		s["displays"].addDisplay(
			"beauty",
			IECore.Display(
				"/tmp/test.tif",
				"tiff",
				"rgba",
				{}
			)
		)
		s["displays"]["in"].setInput( s["plane"]["out"] )
		
		s["render"] = GafferArnold.ArnoldRender()
		s["render"]["in"].setInput( s["displays"]["out"] )
		
		s["render"]["verbosity"].setValue( 1 )
		s["render"]["fileName"].setValue( "/tmp/test.ass" )

		s["fileName"].setValue( self.__scriptFileName )
		
		s["render"].execute( [ Gaffer.Context.current() ] )
			
		self.failUnless( os.path.exists( "/tmp/test.tif" ) )		
    def testRenderingDuringScriptDeletion(self):

        s = Gaffer.ScriptNode()

        s["p"] = GafferScene.Plane()
        s["c"] = GafferScene.Camera()
        s["c"]["transform"]["translate"]["z"].setValue(1)

        s["g"] = GafferScene.Group()
        s["g"]["in"].setInput(s["p"]["out"])
        s["g"]["in1"].setInput(s["c"]["out"])

        s["d"] = GafferScene.Displays()
        s["d"].addDisplay(
            "beauty",
            IECore.Display(
                "test", "ieDisplay", "rgba", {
                    "driverType": "ClientDisplayDriver",
                    "displayHost": "localhost",
                    "displayPort": "1559",
                    "remoteDisplayType": "GafferImage::GafferDisplayDriver",
                    "quantize": IECore.IntVectorData([0, 0, 0, 0]),
                }))

        s["d"]["in"].setInput(s["g"]["out"])

        s["m"] = GafferImage.Display()

        # connect a python function to the Display node image and data
        # received signals. this emulates what the UI does.
        def __displayCallback(plug):
            pass

        c = (
            s["m"].imageReceivedSignal().connect(__displayCallback),
            s["m"].dataReceivedSignal().connect(__displayCallback),
        )

        s["o"] = GafferScene.StandardOptions()
        s["o"]["in"].setInput(s["d"]["out"])
        s["o"]["options"]["renderCamera"]["enabled"].setValue(True)
        s["o"]["options"]["renderCamera"]["value"].setValue("/group/plane")

        s["r"] = GafferRenderMan.InteractiveRenderManRender()
        s["r"]["in"].setInput(s["o"]["out"])

        s["r"]["state"].setValue(s["r"].State.Running)

        time.sleep(1)

        # delete the script while the render is still progressing. when
        # this occurs, deletion of the render node will be triggered, which
        # will in turn stop the render. this may flush data to the display,
        # in which case it will emit its data and image received signals
        # on a separate thread. if we're still holding the gil on the main
        # thread when this happens, we'll get a deadlock.
        del s
Exemple #6
0
    def testRender(self):

        s = Gaffer.ScriptNode()
        s["fileName"].setValue("/tmp/testRenderManLight.gfr")

        s["l"] = GafferRenderMan.RenderManLight()
        s["l"].loadShader("pointlight")
        s["l"]["parameters"]["lightcolor"].setValue(
            IECore.Color3f(1, 0.5, 0.25))
        s["l"]["transform"]["translate"]["z"].setValue(1)

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

        s["c"] = GafferScene.Camera()
        s["c"]["transform"]["translate"]["z"].setValue(1)

        s["g"] = GafferScene.Group()
        s["g"]["in"].setInput(s["l"]["out"])
        s["g"]["in1"].setInput(s["p"]["out"])
        s["g"]["in2"].setInput(s["c"]["out"])

        s["s"] = GafferRenderMan.RenderManShader()
        s["s"].loadShader("matte")
        s["a"] = GafferScene.ShaderAssignment()
        s["a"]["in"].setInput(s["g"]["out"])
        s["a"]["shader"].setInput(s["s"]["out"])

        s["d"] = GafferScene.Displays()
        s["d"].addDisplay(
            "beauty",
            IECore.Display("/tmp/testRenderManLight.exr", "exr", "rgba",
                           {"quantize": IECore.FloatVectorData([0, 0, 0, 0])}))
        s["d"]["in"].setInput(s["a"]["out"])

        s["o"] = GafferScene.StandardOptions()
        s["o"]["options"]["renderCamera"]["value"].setValue("/group/camera")
        s["o"]["options"]["renderCamera"]["enabled"].setValue(True)
        s["o"]["in"].setInput(s["d"]["out"])

        s["r"] = GafferRenderMan.RenderManRender()
        s["r"]["ribFileName"].setValue("/tmp/testRenderManLight.rib")
        s["r"]["in"].setInput(s["o"]["out"])

        ## \todo This fails because ExecutableRender::execute() doesn't wait for the
        # subprocess to complete as it should. We need to make it wait, but we can't
        # do that until we're using the LocalDespatcher in gui applications.
        s["r"].execute([Gaffer.Context.current()])

        i = IECore.EXRImageReader("/tmp/testRenderManLight.exr").read()
        e = IECore.ImagePrimitiveEvaluator(i)
        r = e.createResult()
        e.pointAtUV(IECore.V2f(0.5), r)

        self.assertEqual(r.floatPrimVar(e.R()), 1)
        self.assertEqual(r.floatPrimVar(e.G()), 0.5)
        self.assertEqual(r.floatPrimVar(e.B()), 0.25)
Exemple #7
0
	def testRender( self ) :
	
		s = Gaffer.ScriptNode()
		
		s["l"] = GafferRenderMan.RenderManLight()
		s["l"].loadShader( "pointlight" )
		s["l"]["parameters"]["lightcolor"].setValue( IECore.Color3f( 1, 0.5, 0.25 ) )
		s["l"]["transform"]["translate"]["z"].setValue( 1 )
		
		s["p"] = GafferScene.Plane()
		
		s["c"] = GafferScene.Camera()
		s["c"]["transform"]["translate"]["z"].setValue( 1 )
		
		s["g"] = GafferScene.Group()
		s["g"]["in"].setInput( s["l"]["out"] )
		s["g"]["in1"].setInput( s["p"]["out"] )
		s["g"]["in2"].setInput( s["c"]["out"] )
		
		s["s"] = GafferRenderMan.RenderManShader()
		s["s"].loadShader( "matte" )
		s["a"] = GafferScene.ShaderAssignment()
		s["a"]["in"].setInput( s["g"]["out"] )
		s["a"]["shader"].setInput( s["s"]["out"] )
		
		s["d"] = GafferScene.Displays()
		s["d"].addDisplay( "beauty", IECore.Display( "/tmp/testRenderManLight.exr", "exr", "rgba", { "quantize" : IECore.FloatVectorData( [ 0, 0, 0, 0 ] ) } ) )
		s["d"]["in"].setInput( s["a"]["out"] )
		
		s["o"] = GafferScene.StandardOptions()
		s["o"]["options"]["renderCamera"]["value"].setValue( "/group/camera" )
		s["o"]["options"]["renderCamera"]["enabled"].setValue( True )
		s["o"]["in"].setInput( s["d"]["out"] )
		
		s["r"] = GafferRenderMan.RenderManRender()
		s["r"]["ribFileName"].setValue( "/tmp/testRenderManLight.rib" )
		s["r"]["in"].setInput( s["o"]["out"] )
		
		# must save the script for the procedural to load it
		# in the render process. if we were using a dispatcher,
		# that would have saved the script for us, but we're
		# calling execute() directly so it is our responsibility.
		s["fileName"].setValue( "/tmp/testRenderManLight.gfr" )
		s.save()
		
		s["r"].execute()
		
		i = IECore.EXRImageReader( "/tmp/testRenderManLight.exr" ).read()
		e = IECore.ImagePrimitiveEvaluator( i )
		r = e.createResult()
		e.pointAtUV( IECore.V2f( 0.5 ), r )
		
		self.assertEqual( r.floatPrimVar( e.R() ), 1 )
		self.assertEqual( r.floatPrimVar( e.G() ), 0.5 )
		self.assertEqual( r.floatPrimVar( e.B() ), 0.25 )
    def test(self):

        p = GafferScene.Plane()
        displays = GafferScene.Displays()
        displays["in"].setInput(p["out"])

        # check that the scene hierarchy is passed through

        self.assertEqual(displays["out"].object("/"), IECore.NullObject())
        self.assertEqual(displays["out"].transform("/"), IECore.M44f())
        self.assertEqual(
            displays["out"].bound("/"),
            IECore.Box3f(IECore.V3f(-0.5, -0.5, 0), IECore.V3f(0.5, 0.5, 0)))
        self.assertEqual(displays["out"].childNames("/"),
                         IECore.InternedStringVectorData(["plane"]))

        self.assertEqual(
            displays["out"].object("/plane"),
            IECore.MeshPrimitive.createPlane(
                IECore.Box2f(IECore.V2f(-0.5), IECore.V2f(0.5))))
        self.assertEqual(displays["out"].transform("/plane"), IECore.M44f())
        self.assertEqual(
            displays["out"].bound("/plane"),
            IECore.Box3f(IECore.V3f(-0.5, -0.5, 0), IECore.V3f(0.5, 0.5, 0)))
        self.assertEqual(displays["out"].childNames("/plane"),
                         IECore.InternedStringVectorData())

        # check that we have some displays

        display = displays.addDisplay(
            "beauty", IECore.Display("beauty.exr", "exr", "rgba"))
        display["parameters"].addMember("test", IECore.FloatData(10))

        displays.addDisplay(
            "diffuse", IECore.Display("diffuse.exr", "exr",
                                      "color aov_diffuse"))

        g = displays["out"]["globals"].getValue()
        self.assertEqual(len(g), 2)
        self.assertEqual(
            g["display:beauty.exr"],
            IECore.Display("beauty.exr", "exr", "rgba", {"test": 10.0}))
        self.assertEqual(
            g["display:diffuse.exr"],
            IECore.Display("diffuse.exr", "exr", "color aov_diffuse"))

        # check that we can turn 'em off as well
        display["active"].setValue(False)

        g = displays["out"]["globals"].getValue()
        self.assertEqual(len(g), 1)
        self.assertEqual(
            g["display:diffuse.exr"],
            IECore.Display("diffuse.exr", "exr", "color aov_diffuse"))
Exemple #9
0
    def testParametersHaveUsefulNames(self):

        displays = GafferScene.Displays()
        displays.addDisplay(
            "test",
            IECore.Display("name", "type", "data", {
                "paramA": 1,
                "paramB": 2
            }))

        self.assertEqual(set(displays["displays"][0]["parameters"].keys()),
                         set(["paramA", "paramB"]))
Exemple #10
0
	def test( self ) :
	
		self.assertFalse( os.path.exists( "/tmp/test.exr" ) )

		s = Gaffer.ScriptNode()

		s["plane"] = GafferScene.Plane()
		s["plane"]["transform"]["translate"].setValue( IECore.V3f( 0, 0, -5 ) )		
		
		s["image"] = GafferImage.ImageReader()
		s["image"]["fileName"].setValue( os.path.expandvars( "$GAFFER_ROOT/python/GafferTest/images/checker.exr" ) )
		
		s["shader"] = GafferScene.OpenGLShader()
		s["shader"].loadShader( "Texture" )
		s["shader"]["parameters"]["texture"].setInput( s["image"]["out"] )
		s["shader"]["parameters"]["mult"].setValue( 1 )
		s["shader"]["parameters"]["tint"].setValue( IECore.Color4f( 1 ) )
		
		s["assignment"] = GafferScene.ShaderAssignment()
		s["assignment"]["in"].setInput( s["plane"]["out"] )
		s["assignment"]["shader"].setInput( s["shader"]["out"] )
		
		s["displays"] = GafferScene.Displays()
		s["displays"].addDisplay(
			"beauty",
			IECore.Display(
				"/tmp/test.exr",
				"exr",
				"rgba",
				{}
			)
		)
		s["displays"]["in"].setInput( s["assignment"]["out"] )
				
		s["render"] = GafferScene.OpenGLRender()
		s["render"]["in"].setInput( s["displays"]["out"] )
		
		s["fileName"].setValue( "/tmp/test.gfr" )
		s.save()
		
		s["render"].execute( [ Gaffer.Context.current() ] )
		
		self.assertTrue( os.path.exists( "/tmp/test.exr" ) )
		
		i = IECore.EXRImageReader( "/tmp/test.exr" ).read()
		e = IECore.ImagePrimitiveEvaluator( i )
		r = e.createResult()
		e.pointAtUV( IECore.V2f( 0.5 ), r )
		self.assertAlmostEqual( r.floatPrimVar( e.R() ), 0.666666, 5 )
		self.assertAlmostEqual( r.floatPrimVar( e.G() ), 0.666666, 5 )
		self.assertEqual( r.floatPrimVar( e.B() ), 0 )
Exemple #11
0
    def testHashPassThrough(self):

        # the hash of the per-object part of a displays output should be
        # identical to the input, so that they share cache entries.

        p = GafferScene.Plane()
        displays = GafferScene.Displays()
        displays["in"].setInput(p["out"])

        self.assertSceneHashesEqual(p["out"],
                                    displays["out"],
                                    childPlugNames=("transform", "bound",
                                                    "attributes", "object",
                                                    "childNames"))
Exemple #12
0
    def testRenderToDisplayViaForegroundDispatch(self):

        s = Gaffer.ScriptNode()

        s["sphere"] = GafferScene.Sphere()

        s["displays"] = GafferScene.Displays()
        s["displays"].addDisplay(
            "beauty",
            IECore.Display(
                "test", "ieDisplay", "rgba", {
                    "quantize": IECore.FloatVectorData([0, 0, 0, 0]),
                    "driverType": "ClientDisplayDriver",
                    "displayHost": "localhost",
                    "displayPort": "1559",
                    "remoteDisplayType": "GafferImage::GafferDisplayDriver",
                    "handle": "myLovelyPlane",
                }))
        s["displays"]["in"].setInput(s["sphere"]["out"])

        s["display"] = GafferImage.Display()

        def __displayCallback(plug):
            pass

        # connect a python function to the Display node image and data
        # received signals. this emulates what the UI does.
        c = (
            s["display"].imageReceivedSignal().connect(__displayCallback),
            s["display"].dataReceivedSignal().connect(__displayCallback),
        )

        s["render"] = GafferRenderMan.RenderManRender()
        s["render"]["ribFileName"].setValue("/tmp/test.rib")
        s["render"]["in"].setInput(s["displays"]["out"])

        s["fileName"].setValue("/tmp/test.gfr")
        s.save()

        # dispatch the render on the foreground thread. if we don't manage
        # the GIL appropriately, we'll get a deadlock when the Display signals
        # above try to enter python on the background thread.
        dispatcher = Gaffer.LocalDispatcher()
        dispatcher["jobDirectory"].setValue("/tmp/testJobDirectory")
        dispatcher["framesMode"].setValue(
            Gaffer.Dispatcher.FramesMode.CurrentFrame)
        dispatcher["executeInBackground"].setValue(False)

        dispatcher.dispatch([s["render"]])
Exemple #13
0
    def testExecutionHash(self):

        c = Gaffer.Context()
        c.setFrame(1)
        c2 = Gaffer.Context()
        c2.setFrame(2)

        s = Gaffer.ScriptNode()
        s["plane"] = GafferScene.Plane()
        s["displays"] = GafferScene.Displays()
        s["displays"]["in"].setInput(s["plane"]["out"])
        s["displays"].addDisplay(
            "beauty",
            IECore.Display("$renderDirectory/test.####.exr", "exr", "rgba",
                           {}))
        s["render"] = GafferRenderMan.RenderManRender()

        # no input scene produces no effect
        self.assertEqual(s["render"].executionHash(c), IECore.MurmurHash())

        # now theres an scene to render, we get some output
        s["render"]["in"].setInput(s["displays"]["out"])
        self.assertNotEqual(s["render"].executionHash(c), IECore.MurmurHash())

        # output varies by time
        self.assertNotEqual(s["render"].executionHash(c),
                            s["render"].executionHash(c2))

        # output varies by new Context entries
        current = s["render"].executionHash(c)
        c["renderDirectory"] = "/tmp/renderTests"
        self.assertNotEqual(s["render"].executionHash(c), current)

        # output varies by changed Context entries
        current = s["render"].executionHash(c)
        c["renderDirectory"] = "/tmp/renderTests2"
        self.assertNotEqual(s["render"].executionHash(c), current)

        # output doesn't vary by ui Context entries
        current = s["render"].executionHash(c)
        c["ui:something"] = "alterTheUI"
        self.assertEqual(s["render"].executionHash(c), current)

        # also varies by input node
        current = s["render"].executionHash(c)
        s["render"]["in"].setInput(s["plane"]["out"])
        self.assertNotEqual(s["render"].executionHash(c), current)
Exemple #14
0
	def testDirectoryCreation( self ) :
	
		s = Gaffer.ScriptNode()
		s["variables"].addMember( "renderDirectory", "/tmp/renderTests" )
		s["variables"].addMember( "assDirectory", "/tmp/assTests" )
		
		s["plane"] = GafferScene.Plane()
		
		s["displays"] = GafferScene.Displays()
		s["displays"]["in"].setInput( s["plane"]["out"] )
		s["displays"].addDisplay(
			"beauty",
			IECore.Display(
				"$renderDirectory/test.####.exr",
				"exr",
				"rgba",
				{}
			)
		)
		
		s["render"] = GafferArnold.ArnoldRender()
		s["render"]["in"].setInput( s["displays"]["out"] )
		s["render"]["fileName"].setValue( "$assDirectory/test.####.ass" )
		s["render"]["mode"].setValue( "generate" )
		
		self.assertFalse( os.path.exists( "/tmp/renderTests" ) )
		self.assertFalse( os.path.exists( "/tmp/assTests" ) )
		self.assertFalse( os.path.exists( "/tmp/assTests/test.0001.ass" ) )
		
		s["fileName"].setValue( "/tmp/test.gfr" )
		
		s["render"].execute( [ s.context() ] )
		
		self.assertTrue( os.path.exists( "/tmp/renderTests" ) )
		self.assertTrue( os.path.exists( "/tmp/assTests" ) )
		self.assertTrue( os.path.exists( "/tmp/assTests/test.0001.ass" ) )

		# check it can cope with everything already existing

		s["render"].execute( [ s.context() ] )
		
		self.assertTrue( os.path.exists( "/tmp/renderTests" ) )
		self.assertTrue( os.path.exists( "/tmp/assTests" ) )
		self.assertTrue( os.path.exists( "/tmp/assTests/test.0001.ass" ) )
Exemple #15
0
    def testSerialisation(self):

        s = Gaffer.ScriptNode()
        s["displaysNode"] = GafferScene.Displays()
        display = s["displaysNode"].addDisplay(
            "beauty", IECore.Display("beauty.exr", "exr", "rgba"))
        display["parameters"].addMember("test", IECore.FloatData(10))

        ss = s.serialise()

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

        g = s2["displaysNode"]["out"]["globals"].getValue()
        self.assertEqual(len(g), 1)
        self.assertEqual(
            g["display:beauty.exr"],
            IECore.Display("beauty.exr", "exr", "rgba", {"test": 10.0}))
        self.assertEqual(len(s2["displaysNode"]["displays"]), 1)
        self.assertTrue("displays1" not in s2["displaysNode"])
Exemple #16
0
    def testDirectoryCreation(self):

        s = Gaffer.ScriptNode()
        s["variables"].addMember("renderDirectory", "/tmp/renderTests")
        s["variables"].addMember("ribDirectory", "/tmp/ribTests")

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

        s["displays"] = GafferScene.Displays()
        s["displays"]["in"].setInput(s["plane"]["out"])
        s["displays"].addDisplay(
            "beauty",
            IECore.Display("$renderDirectory/test.####.exr", "exr", "rgba",
                           {}))

        s["render"] = GafferRenderMan.RenderManRender()
        s["render"]["in"].setInput(s["displays"]["out"])
        s["render"]["ribFileName"].setValue("$ribDirectory/test.####.rib")
        s["render"]["mode"].setValue("generate")

        self.assertFalse(os.path.exists("/tmp/renderTests"))
        self.assertFalse(os.path.exists("/tmp/ribTests"))
        self.assertFalse(os.path.exists("/tmp/ribTests/test.0001.rib"))

        s["fileName"].setValue("/tmp/test.gfr")

        with s.context():
            s["render"].execute()

        self.assertTrue(os.path.exists("/tmp/renderTests"))
        self.assertTrue(os.path.exists("/tmp/ribTests"))
        self.assertTrue(os.path.exists("/tmp/ribTests/test.0001.rib"))

        # check that having the directories already exist is ok too

        with s.context():
            s["render"].execute()

        self.assertTrue(os.path.exists("/tmp/renderTests"))
        self.assertTrue(os.path.exists("/tmp/ribTests"))
        self.assertTrue(os.path.exists("/tmp/ribTests/test.0001.rib"))
    def testLights(self):

        s = Gaffer.ScriptNode()

        s["l"] = GafferRenderMan.RenderManLight()
        s["l"].loadShader("pointlight")
        s["l"]["parameters"]["lightcolor"].setValue(
            IECore.Color3f(1, 0.5, 0.25))
        s["l"]["transform"]["translate"]["z"].setValue(1)

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

        s["c"] = GafferScene.Camera()
        s["c"]["transform"]["translate"]["z"].setValue(1)

        s["g"] = GafferScene.Group()
        s["g"]["in"].setInput(s["l"]["out"])
        s["g"]["in1"].setInput(s["p"]["out"])
        s["g"]["in2"].setInput(s["c"]["out"])

        s["s"] = GafferRenderMan.RenderManShader()
        s["s"].loadShader("matte")
        s["a"] = GafferScene.ShaderAssignment()
        s["a"]["in"].setInput(s["g"]["out"])
        s["a"]["shader"].setInput(s["s"]["out"])

        s["d"] = GafferScene.Displays()
        s["d"].addDisplay(
            "beauty",
            IECore.Display(
                "test", "ieDisplay", "rgba", {
                    "quantize": IECore.FloatVectorData([0, 0, 0, 0]),
                    "driverType": "ImageDisplayDriver",
                    "handle": "myLovelyPlane",
                }))
        s["d"]["in"].setInput(s["a"]["out"])

        s["o"] = GafferScene.StandardOptions()
        s["o"]["options"]["renderCamera"]["value"].setValue("/group/camera")
        s["o"]["options"]["renderCamera"]["enabled"].setValue(True)
        s["o"]["in"].setInput(s["d"]["out"])

        s["r"] = GafferRenderMan.InteractiveRenderManRender()
        s["r"]["in"].setInput(s["o"]["out"])

        # start a render, give it time to finish, and check the output

        s["r"]["state"].setValue(s["r"].State.Running)

        time.sleep(2)

        c = self.__colorAtUV(
            IECore.ImageDisplayDriver.storedImage("myLovelyPlane"),
            IECore.V2f(0.5),
        )
        self.assertEqual(c / c[0], IECore.Color3f(1, 0.5, 0.25))

        # adjust a parameter, give it time to update, and check the output

        s["l"]["parameters"]["lightcolor"].setValue(
            IECore.Color3f(0.25, 0.5, 1))

        time.sleep(1)

        c = self.__colorAtUV(
            IECore.ImageDisplayDriver.storedImage("myLovelyPlane"),
            IECore.V2f(0.5),
        )
        self.assertEqual(c / c[2], IECore.Color3f(0.25, 0.5, 1))

        # pause it, adjust a parameter, wait, and check that nothing changed

        s["r"]["state"].setValue(s["r"].State.Paused)
        s["l"]["parameters"]["lightcolor"].setValue(
            IECore.Color3f(1, 0.5, 0.25))

        time.sleep(1)

        c = self.__colorAtUV(
            IECore.ImageDisplayDriver.storedImage("myLovelyPlane"),
            IECore.V2f(0.5),
        )
        self.assertEqual(c / c[2], IECore.Color3f(0.25, 0.5, 1))

        # unpause it, wait, and check that the update happened

        s["r"]["state"].setValue(s["r"].State.Running)
        time.sleep(1)

        c = self.__colorAtUV(
            IECore.ImageDisplayDriver.storedImage("myLovelyPlane"),
            IECore.V2f(0.5),
        )
        self.assertEqual(c / c[0], IECore.Color3f(1, 0.5, 0.25))

        # turn off light updates, adjust a parameter, wait, and check nothing happened

        s["r"]["updateLights"].setValue(False)
        s["l"]["parameters"]["lightcolor"].setValue(
            IECore.Color3f(0.25, 0.5, 1))

        time.sleep(1)

        c = self.__colorAtUV(
            IECore.ImageDisplayDriver.storedImage("myLovelyPlane"),
            IECore.V2f(0.5),
        )
        self.assertEqual(c / c[0], IECore.Color3f(1, 0.5, 0.25))

        # turn light updates back on and check that it updates

        s["r"]["updateLights"].setValue(True)

        time.sleep(1)

        c = self.__colorAtUV(
            IECore.ImageDisplayDriver.storedImage("myLovelyPlane"),
            IECore.V2f(0.5),
        )
        self.assertEqual(c / c[2], IECore.Color3f(0.25, 0.5, 1))

        # stop the render, tweak a parameter and check that nothing happened

        s["r"]["state"].setValue(s["r"].State.Stopped)
        s["l"]["parameters"]["lightcolor"].setValue(
            IECore.Color3f(1, 0.5, 0.25))
        time.sleep(1)

        c = self.__colorAtUV(
            IECore.ImageDisplayDriver.storedImage("myLovelyPlane"),
            IECore.V2f(0.5),
        )
        self.assertEqual(c / c[2], IECore.Color3f(0.25, 0.5, 1))
    def testHideLight(self):

        s = Gaffer.ScriptNode()

        s["l"] = GafferRenderMan.RenderManLight()
        s["l"].loadShader("pointlight")
        s["l"]["transform"]["translate"]["z"].setValue(1)

        s["v"] = GafferScene.StandardAttributes()
        s["v"]["attributes"]["visibility"]["enabled"].setValue(True)
        s["v"]["in"].setInput(s["l"]["out"])

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

        s["c"] = GafferScene.Camera()
        s["c"]["transform"]["translate"]["z"].setValue(1)

        s["g"] = GafferScene.Group()
        s["g"]["in"].setInput(s["v"]["out"])
        s["g"]["in1"].setInput(s["p"]["out"])
        s["g"]["in2"].setInput(s["c"]["out"])

        s["s"] = GafferRenderMan.RenderManShader()
        s["s"].loadShader("matte")
        s["a"] = GafferScene.ShaderAssignment()
        s["a"]["in"].setInput(s["g"]["out"])
        s["a"]["shader"].setInput(s["s"]["out"])

        s["d"] = GafferScene.Displays()
        s["d"].addDisplay(
            "beauty",
            IECore.Display(
                "test", "ieDisplay", "rgba", {
                    "quantize": IECore.FloatVectorData([0, 0, 0, 0]),
                    "driverType": "ImageDisplayDriver",
                    "handle": "myLovelyPlane",
                }))
        s["d"]["in"].setInput(s["a"]["out"])

        s["o"] = GafferScene.StandardOptions()
        s["o"]["options"]["renderCamera"]["value"].setValue("/group/camera")
        s["o"]["options"]["renderCamera"]["enabled"].setValue(True)
        s["o"]["in"].setInput(s["d"]["out"])

        s["r"] = GafferRenderMan.InteractiveRenderManRender()
        s["r"]["in"].setInput(s["o"]["out"])

        # start a render, give it time to finish, and check the output

        s["r"]["state"].setValue(s["r"].State.Running)

        time.sleep(2)

        c = self.__colorAtUV(
            IECore.ImageDisplayDriver.storedImage("myLovelyPlane"),
            IECore.V2f(0.5),
        )
        self.assertNotEqual(c[0], 0.0)

        # remove the light by hiding it

        s["v"]["attributes"]["visibility"]["value"].setValue(False)
        time.sleep(2)

        c = self.__colorAtUV(
            IECore.ImageDisplayDriver.storedImage("myLovelyPlane"),
            IECore.V2f(0.5),
        )
        self.assertEqual(c[0], 0.0)

        # put the light back by showing it

        s["v"]["attributes"]["visibility"]["value"].setValue(True)
        time.sleep(2)

        c = self.__colorAtUV(
            IECore.ImageDisplayDriver.storedImage("myLovelyPlane"),
            IECore.V2f(0.5),
        )
        self.assertNotEqual(c[0], 0.0)
    def testAddLight(self):

        s = Gaffer.ScriptNode()

        s["l"] = GafferRenderMan.RenderManLight()
        s["l"].loadShader("pointlight")
        s["l"]["parameters"]["lightcolor"].setValue(IECore.Color3f(1, 0, 0))
        s["l"]["transform"]["translate"]["z"].setValue(1)

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

        s["c"] = GafferScene.Camera()
        s["c"]["transform"]["translate"]["z"].setValue(1)

        s["g"] = GafferScene.Group()
        s["g"]["in"].setInput(s["l"]["out"])
        s["g"]["in1"].setInput(s["p"]["out"])
        s["g"]["in2"].setInput(s["c"]["out"])

        s["s"] = GafferRenderMan.RenderManShader()
        s["s"].loadShader("matte")
        s["a"] = GafferScene.ShaderAssignment()
        s["a"]["in"].setInput(s["g"]["out"])
        s["a"]["shader"].setInput(s["s"]["out"])

        s["d"] = GafferScene.Displays()
        s["d"].addDisplay(
            "beauty",
            IECore.Display(
                "test", "ieDisplay", "rgba", {
                    "quantize": IECore.FloatVectorData([0, 0, 0, 0]),
                    "driverType": "ImageDisplayDriver",
                    "handle": "myLovelyPlane",
                }))
        s["d"]["in"].setInput(s["a"]["out"])

        s["o"] = GafferScene.StandardOptions()
        s["o"]["options"]["renderCamera"]["value"].setValue("/group/camera")
        s["o"]["options"]["renderCamera"]["enabled"].setValue(True)
        s["o"]["in"].setInput(s["d"]["out"])

        s["r"] = GafferRenderMan.InteractiveRenderManRender()
        s["r"]["in"].setInput(s["o"]["out"])

        # start a render, give it time to finish, and check the output

        s["r"]["state"].setValue(s["r"].State.Running)

        time.sleep(2)

        c = self.__colorAtUV(
            IECore.ImageDisplayDriver.storedImage("myLovelyPlane"),
            IECore.V2f(0.5),
        )
        self.assertEqual(c / c[0], IECore.Color3f(1, 0, 0))

        # add a light

        s["l2"] = GafferRenderMan.RenderManLight()
        s["l2"].loadShader("pointlight")
        s["l2"]["parameters"]["lightcolor"].setValue(IECore.Color3f(0, 1, 0))
        s["l2"]["transform"]["translate"]["z"].setValue(1)

        s["g"]["in3"].setInput(s["l2"]["out"])

        # give it time to update, and check the output

        time.sleep(1)

        c = self.__colorAtUV(
            IECore.ImageDisplayDriver.storedImage("myLovelyPlane"),
            IECore.V2f(0.5),
        )
        self.assertEqual(c / c[0], IECore.Color3f(1, 1, 0))
    def testScopesDontLeak(self):

        s = Gaffer.ScriptNode()

        s["p"] = GafferScene.Plane()
        s["p"]["transform"]["translate"].setValue(IECore.V3f(-0.6, -0.1, 0))

        s["p1"] = GafferScene.Plane()
        s["p1"]["transform"]["translate"].setValue(IECore.V3f(0.6, 0.1, 0))

        s["c"] = GafferScene.Camera()
        s["c"]["transform"]["translate"]["z"].setValue(2)

        s["l"] = GafferRenderMan.RenderManLight()
        s["l"].loadShader("ambientlight")

        s["g"] = GafferScene.Group()
        s["g"]["in"].setInput(s["p"]["out"])
        s["g"]["in1"].setInput(s["p1"]["out"])
        s["g"]["in2"].setInput(s["c"]["out"])
        s["g"]["in3"].setInput(s["l"]["out"])

        s["s"] = GafferRenderMan.RenderManShader()
        s["s"].loadShader("checker")
        s["s"]["parameters"]["blackcolor"].setValue(IECore.Color3f(1, 0, 0))
        s["s"]["parameters"]["Ka"].setValue(1)
        s["s"]["parameters"]["frequency"].setValue(1)

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

        s["a"] = GafferScene.ShaderAssignment()
        s["a"]["in"].setInput(s["g"]["out"])
        s["a"]["shader"].setInput(s["s"]["out"])
        s["a"]["filter"].setInput(s["f"]["match"])

        s["d"] = GafferScene.Displays()
        s["d"].addDisplay(
            "beauty",
            IECore.Display(
                "test", "ieDisplay", "rgba", {
                    "quantize": IECore.FloatVectorData([0, 0, 0, 0]),
                    "driverType": "ImageDisplayDriver",
                    "handle": "myLovelyPlanes",
                }))
        s["d"]["in"].setInput(s["a"]["out"])

        s["o"] = GafferScene.StandardOptions()
        s["o"]["options"]["renderCamera"]["value"].setValue("/group/camera")
        s["o"]["options"]["renderCamera"]["enabled"].setValue(True)
        s["o"]["options"]["renderResolution"]["value"].setValue(
            IECore.V2i(512))
        s["o"]["options"]["renderResolution"]["enabled"].setValue(True)
        s["o"]["in"].setInput(s["d"]["out"])

        s["r"] = GafferRenderMan.InteractiveRenderManRender()
        s["r"]["in"].setInput(s["o"]["out"])

        # start a render, give it time to finish, and check the output.
        # we should have a red plane on the left, and a facing ratio
        # shaded plane on the right, because we attached no shader to the
        # second plane.

        s["r"]["state"].setValue(s["r"].State.Running)

        time.sleep(2)

        c = self.__colorAtUV(
            IECore.ImageDisplayDriver.storedImage("myLovelyPlanes"),
            IECore.V2f(0.25, 0.5),
        )
        self.assertEqual(c, IECore.Color3f(1, 0, 0))

        c1 = self.__colorAtUV(
            IECore.ImageDisplayDriver.storedImage("myLovelyPlanes"),
            IECore.V2f(0.75, 0.5),
        )
        self.assertTrue(c1[0] > 0.9)
        self.assertEqual(c1[0], c1[1])
        self.assertEqual(c1[0], c1[2])

        # adjust a shader parameter, wait, and check that the plane
        # on the left changed. check that the plane on the right didn't
        # change at all.

        s["s"]["parameters"]["blackcolor"].setValue(IECore.Color3f(0, 1, 0))
        time.sleep(2)

        c = self.__colorAtUV(
            IECore.ImageDisplayDriver.storedImage("myLovelyPlanes"),
            IECore.V2f(0.25, 0.5),
        )
        self.assertEqual(c, IECore.Color3f(0, 1, 0))

        c1 = self.__colorAtUV(
            IECore.ImageDisplayDriver.storedImage("myLovelyPlanes"),
            IECore.V2f(0.75, 0.5),
        )
        self.assertTrue(c1[0] > 0.9)
        self.assertEqual(c1[0], c1[1])
        self.assertEqual(c1[0], c1[2])
    def testShaders(self):

        s = Gaffer.ScriptNode()

        s["p"] = GafferScene.Plane()
        s["p"]["transform"]["translate"].setValue(IECore.V3f(-0.1, -0.1, 0))

        s["c"] = GafferScene.Camera()
        s["c"]["transform"]["translate"]["z"].setValue(1)

        s["l"] = GafferRenderMan.RenderManLight()
        s["l"].loadShader("ambientlight")

        s["g"] = GafferScene.Group()
        s["g"]["in"].setInput(s["p"]["out"])
        s["g"]["in1"].setInput(s["c"]["out"])
        s["g"]["in2"].setInput(s["l"]["out"])

        s["s"] = GafferRenderMan.RenderManShader()
        s["s"].loadShader("checker")
        s["s"]["parameters"]["blackcolor"].setValue(
            IECore.Color3f(1, 0.5, 0.25))
        s["s"]["parameters"]["Ka"].setValue(1)
        s["s"]["parameters"]["frequency"].setValue(1)

        s["a"] = GafferScene.ShaderAssignment()
        s["a"]["in"].setInput(s["g"]["out"])
        s["a"]["shader"].setInput(s["s"]["out"])

        s["d"] = GafferScene.Displays()
        s["d"].addDisplay(
            "beauty",
            IECore.Display(
                "test", "ieDisplay", "rgba", {
                    "quantize": IECore.FloatVectorData([0, 0, 0, 0]),
                    "driverType": "ImageDisplayDriver",
                    "handle": "myLovelyPlane",
                }))
        s["d"]["in"].setInput(s["a"]["out"])

        s["o"] = GafferScene.StandardOptions()
        s["o"]["options"]["renderCamera"]["value"].setValue("/group/camera")
        s["o"]["options"]["renderCamera"]["enabled"].setValue(True)
        s["o"]["in"].setInput(s["d"]["out"])

        s["r"] = GafferRenderMan.InteractiveRenderManRender()
        s["r"]["in"].setInput(s["o"]["out"])

        # start a render, give it time to finish, and check the output

        s["r"]["state"].setValue(s["r"].State.Running)

        time.sleep(2)

        c = self.__colorAtUV(
            IECore.ImageDisplayDriver.storedImage("myLovelyPlane"),
            IECore.V2f(0.5),
        )
        self.assertEqual(c, IECore.Color3f(1, 0.5, 0.25))

        # adjust a shader parameter, wait, and check that it changed

        s["s"]["parameters"]["blackcolor"].setValue(IECore.Color3f(1, 1, 1))
        time.sleep(1)
        c = self.__colorAtUV(
            IECore.ImageDisplayDriver.storedImage("myLovelyPlane"),
            IECore.V2f(0.5),
        )
        self.assertEqual(c, IECore.Color3f(1))

        # turn off shader updates, do the same, and check that it hasn't changed

        s["r"]["updateShaders"].setValue(False)
        s["s"]["parameters"]["blackcolor"].setValue(IECore.Color3f(0.5))
        time.sleep(1)
        c = self.__colorAtUV(
            IECore.ImageDisplayDriver.storedImage("myLovelyPlane"),
            IECore.V2f(0.5),
        )
        self.assertEqual(c, IECore.Color3f(1))

        # turn shader updates back on, and check that it updates

        s["r"]["updateShaders"].setValue(True)
        time.sleep(1)
        c = self.__colorAtUV(
            IECore.ImageDisplayDriver.storedImage("myLovelyPlane"),
            IECore.V2f(0.5),
        )
        self.assertEqual(c, IECore.Color3f(0.5))