Exemplo n.º 1
0
	def testSetDriver( self ) :

		semaphore = threading.Semaphore( 0 )
		imageReceivedConnection = GafferImage.Display.imageReceivedSignal().connect( lambda plug : semaphore.release() )

		driversCreated = GafferTest.CapturingSlot( GafferImage.Display.driverCreatedSignal() )

		server = IECore.DisplayDriverServer()
		cortexWindow = IECore.Box2i( IECore.V2i( 0 ), IECore.V2i( 99 ) )
		gafferWindow = IECore.Box2i( IECore.V2i( 0 ), IECore.V2i( 100 ) )
		driver = IECore.ClientDisplayDriver(
			cortexWindow,
			cortexWindow,
			[ "Y" ],
			{
				"displayHost" : "localHost",
				"displayPort" : str( server.portNumber() ),
				"remoteDisplayType" : "GafferImage::GafferDisplayDriver",
			}
		)

		display = GafferImage.Display()
		self.assertTrue( display.getDriver() is None )

		self.assertTrue( len( driversCreated ), 1 )
		display.setDriver( driversCreated[0][0] )
		self.assertTrue( display.getDriver().isSame( driversCreated[0][0] ) )

		self.__sendBucket( driver, cortexWindow, IECore.FloatVectorData( [ 0.5 ] * gafferWindow.size().x * gafferWindow.size().y ) )

		self.assertEqual( display["out"]["format"].getValue().getDisplayWindow(), gafferWindow )
		self.assertEqual( display["out"]["dataWindow"].getValue(), gafferWindow )
		self.assertEqual( display["out"]["channelNames"].getValue(), IECore.StringVectorData( [ "Y" ] ) )
		self.assertEqual(
			display["out"].channelData( "Y", IECore.V2i( 0 ) ),
			IECore.FloatVectorData( [ 0.5 ] * GafferImage.ImagePlug.tileSize() * GafferImage.ImagePlug.tileSize() )
		)

		display2 = GafferImage.Display()
		display2.setDriver( display.getDriver(), copy = True )

		self.assertImagesEqual( display["out"], display2["out"] )

		self.__sendBucket( driver, cortexWindow, IECore.FloatVectorData( [ 1 ] * gafferWindow.size().x * gafferWindow.size().y ) )

		self.assertEqual(
			display["out"].channelData( "Y", IECore.V2i( 0 ) ),
			IECore.FloatVectorData( [ 1 ] * GafferImage.ImagePlug.tileSize() * GafferImage.ImagePlug.tileSize() )
		)

		self.assertEqual(
			display2["out"].channelData( "Y", IECore.V2i( 0 ) ),
			IECore.FloatVectorData( [ 0.5 ] * GafferImage.ImagePlug.tileSize() * GafferImage.ImagePlug.tileSize() )
		)

		driver.imageClose()
		semaphore.acquire()
Exemplo n.º 2
0
    def testSetDriver(self):

        driversCreated = GafferTest.CapturingSlot(
            GafferImage.Display.driverCreatedSignal())

        server = IECoreImage.DisplayDriverServer()
        dataWindow = IECore.Box2i(IECore.V2i(0), IECore.V2i(100))

        driver = self.Driver(GafferImage.Format(dataWindow),
                             dataWindow, ["Y"],
                             port=server.portNumber())

        self.assertTrue(len(driversCreated), 1)

        display = GafferImage.Display()
        self.assertTrue(display.getDriver() is None)

        display.setDriver(driversCreated[0][0])
        self.assertTrue(display.getDriver().isSame(driversCreated[0][0]))

        driver.sendBucket(dataWindow, [
            IECore.FloatVectorData(
                [0.5] * dataWindow.size().x * dataWindow.size().y)
        ])

        self.assertEqual(
            display["out"]["format"].getValue().getDisplayWindow(), dataWindow)
        self.assertEqual(display["out"]["dataWindow"].getValue(), dataWindow)
        self.assertEqual(display["out"]["channelNames"].getValue(),
                         IECore.StringVectorData(["Y"]))
        self.assertEqual(
            display["out"].channelData("Y", IECore.V2i(0)),
            IECore.FloatVectorData([0.5] * GafferImage.ImagePlug.tileSize() *
                                   GafferImage.ImagePlug.tileSize()))

        display2 = GafferImage.Display()
        display2.setDriver(display.getDriver(), copy=True)

        self.assertImagesEqual(display["out"], display2["out"])

        driver.sendBucket(dataWindow, [
            IECore.FloatVectorData(
                [1] * dataWindow.size().x * dataWindow.size().y)
        ])

        self.assertEqual(
            display["out"].channelData("Y", IECore.V2i(0)),
            IECore.FloatVectorData([1] * GafferImage.ImagePlug.tileSize() *
                                   GafferImage.ImagePlug.tileSize()))

        self.assertEqual(
            display2["out"].channelData("Y", IECore.V2i(0)),
            IECore.FloatVectorData([0.5] * GafferImage.ImagePlug.tileSize() *
                                   GafferImage.ImagePlug.tileSize()))

        driver.close()
Exemplo n.º 3
0
    def __testTransferImage(self, fileName):

        imageReader = GafferImage.ImageReader()
        imageReader["fileName"].setValue(os.path.expandvars(fileName))

        imagesReceived = GafferTest.CapturingSlot(
            GafferImage.Display.imageReceivedSignal())

        node = GafferImage.Display()
        server = IECoreImage.DisplayDriverServer()
        driverCreatedConnection = GafferImage.Display.driverCreatedSignal(
        ).connect(lambda driver, parameters: node.setDriver(driver))

        self.assertEqual(len(imagesReceived), 0)

        self.Driver.sendImage(imageReader["out"], port=server.portNumber())

        self.assertImagesEqual(imageReader["out"],
                               node["out"],
                               ignoreMetadata=True)

        self.assertEqual(len(imagesReceived), 1)
        self.assertEqual(imagesReceived[0][0], node["out"])

        return node
Exemplo n.º 4
0
	def testParallelProcessEmptyDataWindow( self ) :

		d = GafferImage.Display()
		self.assertEqual( d["out"]["dataWindow"].getValue(), IECore.Box2i() )

		GafferImageTest.processTiles( d["out"] )
		d["out"].image()
		d["out"].imageHash()
Exemplo n.º 5
0
	def testDefaultFormat( self ) :

		d = GafferImage.Display()

		with Gaffer.Context() as c :
			self.assertEqual( d["out"]["format"].getValue(), GafferImage.FormatPlug.getDefaultFormat( c ) )
			GafferImage.FormatPlug.setDefaultFormat( c, GafferImage.Format( 200, 150, 1. ) )
			self.assertEqual( d["out"]["format"].getValue(), GafferImage.FormatPlug.getDefaultFormat( c ) )
Exemplo n.º 6
0
    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.Outputs()
        s["d"].addOutput(
            "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
Exemplo n.º 7
0
	def testTileHashes( self ) :

		semaphore = threading.Semaphore( 0 )
		imageReceivedConnection = GafferImage.Display.imageReceivedSignal().connect( lambda plug : semaphore.release() )

		node = GafferImage.Display()
		node["port"].setValue( 2500 )

		gafferDisplayWindow = IECore.Box2i( IECore.V2i( -100, -200 ), IECore.V2i( 303, 557 ) )
		gafferFormat = GafferImage.Format( gafferDisplayWindow, 1.0 )

		externalDisplayWindow = gafferFormat.toEXRSpace( gafferDisplayWindow )

		externalDataWindow = externalDisplayWindow
		gafferDataWindow = gafferDisplayWindow
		driver = IECore.ClientDisplayDriver(
			externalDisplayWindow,
			externalDataWindow,
			[ "Y" ],
			{
				"displayHost" : "localHost",
				"displayPort" : "2500",
				"remoteDisplayType" : "GafferImage::GafferDisplayDriver",
			}
		)

		for i in range( 0, 1000 ) :

			h1 = self.__tileHashes( node, "Y" )
			t1 = self.__tiles( node, "Y" )

			externalBucketWindow = IECore.Box2i()
			for j in range( 0, 2 ) :
				externalBucketWindow.extendBy(
					IECore.V2i(
						int( random.uniform( externalDisplayWindow.min.x, externalDisplayWindow.max.x ) ),
						int( random.uniform( externalDisplayWindow.min.y, externalDisplayWindow.max.y ) ),
					)
				)

			numPixels = ( externalBucketWindow.size().x + 1 ) * ( externalBucketWindow.size().y + 1 )
			bucketData = IECore.FloatVectorData()
			bucketData.resize( numPixels, i + 1 )

			self.__sendBucket( driver, externalBucketWindow, bucketData )

			h2 = self.__tileHashes( node, "Y" )
			t2 = self.__tiles( node, "Y" )

			gafferBucketWindow = gafferFormat.fromEXRSpace( externalBucketWindow )

			self.__assertTilesChangedInRegion( t1, t2, gafferBucketWindow )
			self.__assertTilesChangedInRegion( h1, h2, gafferBucketWindow )

		driver.imageClose()
		semaphore.acquire()
Exemplo n.º 8
0
	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"][0].setInput( s["p"]["out"] )
		s["g"]["in"][1].setInput( s["c"]["out"] )

		s["d"] = GafferScene.Outputs()
		s["d"].addOutput(
			"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"] )

		# Emulate the connection the UI makes, so the Display knows someone is listening and
		# it needs to actually make servers.
		executeOnUIThreadConnection = GafferImage.Display.executeOnUIThreadSignal().connect( lambda f : f() )

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

		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/camera" )

		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
Exemplo n.º 9
0
    def __testTransferImage(self, fileName):

        imageReader = GafferImage.ImageReader()
        imageReader["fileName"].setValue(os.path.expandvars(fileName))

        node = GafferImage.Display()
        node["port"].setValue(2500)

        driver = IECore.ClientDisplayDriver(
            imageReader["out"]["format"].getValue().getDisplayWindow(),
            imageReader["out"]["format"].getValue().formatToYDownSpace(
                imageReader["out"]["dataWindow"].getValue()),
            list(imageReader["out"]["channelNames"].getValue()), {
                "displayHost": "localHost",
                "displayPort": "2500",
                "remoteDisplayType": "GafferImage::GafferDisplayDriver",
            })

        dataWindow = imageReader["out"]["dataWindow"].getValue()
        tileSize = GafferImage.ImagePlug.tileSize()
        minTileOrigin = GafferImage.ImagePlug.tileOrigin(dataWindow.min)
        maxTileOrigin = GafferImage.ImagePlug.tileOrigin(dataWindow.max)
        for y in range(minTileOrigin.y, maxTileOrigin.y + 1, tileSize):
            for x in range(minTileOrigin.x, maxTileOrigin.x + 1, tileSize):
                tileOrigin = IECore.V2i(x, y)
                channelData = []
                for channelName in imageReader["out"]["channelNames"].getValue(
                ):
                    channelData.append(imageReader["out"].channelData(
                        channelName, tileOrigin))
                bucketData = IECore.FloatVectorData()
                for by in range(tileSize - 1, -1, -1):
                    for bx in range(0, tileSize):
                        i = by * tileSize + bx
                        for c in channelData:
                            bucketData.append(c[i])

                bucketBound = IECore.Box2i(
                    tileOrigin, tileOrigin +
                    IECore.V2i(GafferImage.ImagePlug.tileSize() - 1))
                bucketBound = imageReader["out"]["format"].getValue(
                ).formatToYDownSpace(bucketBound)
                driver.imageData(bucketBound, bucketData)

        driver.imageClose()

        self.__imageReceivedSemaphore.acquire()

        # Display doesn't handle image metadata, so we must erase it before comparing the images
        inImage = imageReader["out"].image()
        inImage.blindData().clear()

        self.assertEqual(inImage, node["out"].image())

        return node
Exemplo n.º 10
0
	def testCommand( self ) :

		s = Gaffer.ScriptNode()

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

		s["outputs"] = GafferScene.Outputs()
		s["outputs"].addOutput(
			"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["outputs"]["in"].setInput( s["sphere"]["out"] )

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

		s["render"] = GafferRenderMan.RenderManRender()
		s["render"]["ribFileName"].setValue( self.temporaryDirectory() + "/test.rib" )
		s["render"]["in"].setInput( s["outputs"]["out"] )

		s["fileName"].setValue( self.temporaryDirectory() + "/test.gfr" )
		s.save()

		# render a full frame and get the data window
		s["render"]["task"].execute()
		dataWindow1 = s["display"]["out"].image().dataWindow

		# specify a crop on the command line and get the new data window
		s["render"]["command"].setValue( "renderdl -crop 0 0.5 0 0.5" )
		s["render"]["task"].execute()

		# check that the crop worked
		dataWindow2 = s["display"]["out"].image().dataWindow
		self.assertEqual( dataWindow2.size(), dataWindow1.size() / 2 )

		# now check that we can specify values via the context too
		s["render"]["command"].setValue( "renderdl -crop 0 ${size} 0 ${size}" )
		s.context()["size"] = 0.25
		with s.context() :
			s["render"]["task"].execute()

		dataWindow3 = s["display"]["out"].image().dataWindow
		self.assertEqual( dataWindow3.size(), dataWindow1.size() / 4 )
Exemplo n.º 11
0
	def testRenderToDisplayViaForegroundDispatch( self ) :

		s = Gaffer.ScriptNode()

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

		s["outputs"] = GafferScene.Outputs()
		s["outputs"].addOutput(
			"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["outputs"]["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( self.temporaryDirectory() + "/test.rib" )
		s["render"]["in"].setInput( s["outputs"]["out"] )

		s["fileName"].setValue( self.temporaryDirectory() + "/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 = GafferDispatch.LocalDispatcher()
		dispatcher["jobsDirectory"].setValue( self.temporaryDirectory() + "/testJobDirectory" )
		dispatcher["framesMode"].setValue( GafferDispatch.Dispatcher.FramesMode.CurrentFrame )
		dispatcher["executeInBackground"].setValue( False )

		dispatcher.dispatch( [ s["render"] ] )
Exemplo n.º 12
0
	def testNoErrorOnBackgroundDispatch( self ) :

		s = Gaffer.ScriptNode()

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

		s["p"] = GafferDispatch.PythonCommand()
		s["p"]["command"].setValue( "pass" )

		s["fileName"].setValue( self.temporaryDirectory() + "test.gfr" )
		s.save()

		output = subprocess.check_output( [ "gaffer", "execute", self.temporaryDirectory() + "test.gfr", "-nodes", "p" ], stderr = subprocess.STDOUT )
		self.assertEqual( output, "" )
Exemplo n.º 13
0
    def testTileHashes(self):

        node = GafferImage.Display()
        node["port"].setValue(2500)

        displayWindow = IECore.Box2i(IECore.V2i(-100, -200),
                                     IECore.V2i(302, 556))
        dataWindow = displayWindow
        driver = IECore.ClientDisplayDriver(
            displayWindow, dataWindow, ["Y"], {
                "displayHost": "localHost",
                "displayPort": "2500",
                "remoteDisplayType": "GafferImage::GafferDisplayDriver",
            })

        for i in range(0, 1000):

            h1 = self.__tileHashes(node, "Y")
            t1 = self.__tiles(node, "Y")

            bucketWindow = IECore.Box2i()
            for j in range(0, 2):
                bucketWindow.extendBy(
                    IECore.V2i(
                        int(
                            random.uniform(displayWindow.min.x,
                                           displayWindow.max.x)),
                        int(
                            random.uniform(displayWindow.min.y,
                                           displayWindow.max.y)),
                    ))

            numPixels = (bucketWindow.size().x + 1) * (bucketWindow.size().y +
                                                       1)
            bucketData = IECore.FloatVectorData()
            bucketData.resize(numPixels, i + 1)
            driver.imageData(bucketWindow, bucketData)

            self.__dataReceivedSemaphore.acquire()

            h2 = self.__tileHashes(node, "Y")
            t2 = self.__tiles(node, "Y")

            bucketWindowYUp = GafferImage.Format(
                displayWindow, 1).yDownToFormatSpace(bucketWindow)
            self.__assertTilesChangedInRegion(t1, t2, bucketWindowYUp)
            self.__assertTilesChangedInRegion(h1, h2, bucketWindowYUp)

        driver.imageClose()
Exemplo n.º 14
0
    def testDefaultFormat(self):

        s = Gaffer.ScriptNode()
        d = GafferImage.Display()
        s.addChild(d)

        p = GafferImage.ImagePlug("in", Gaffer.Plug.Direction.In)
        p.setInput(d["out"])

        with s.context():
            self.assertEqual(p["format"].getValue(),
                             GafferImage.Format.getDefaultFormat(s))
            GafferImage.Format.setDefaultFormat(
                s, GafferImage.Format(200, 150, 1.))
            self.assertEqual(p["format"].getValue(),
                             GafferImage.Format.getDefaultFormat(s))
Exemplo n.º 15
0
    def __testTransferImage(self, fileName):

        imageReader = GafferImage.ImageReader()
        imageReader["fileName"].setValue(os.path.expandvars(fileName))

        node = GafferImage.Display()
        node["port"].setValue(2500)

        self.sendImage(imageReader["out"], port=2500)

        # Display doesn't handle image metadata, so we must erase it before comparing the images
        inImage = imageReader["out"].image()
        inImage.blindData().clear()

        self.assertEqual(inImage, node["out"].image())

        return node
Exemplo n.º 16
0
    def testTileHashes(self):

        node = GafferImage.Display()
        server = IECoreImage.DisplayDriverServer()
        driverCreatedConnection = GafferImage.Display.driverCreatedSignal(
        ).connect(lambda driver, parameters: node.setDriver(driver))

        dataWindow = imath.Box2i(imath.V2i(-100, -200), imath.V2i(303, 557))
        driver = self.Driver(
            GafferImage.Format(dataWindow),
            dataWindow,
            ["Y"],
            port=server.portNumber(),
        )

        for i in range(0, 100):

            h1 = self.__tileHashes(node, "Y")
            t1 = self.__tiles(node, "Y")

            bucketWindow = imath.Box2i()
            while GafferImage.BufferAlgo.empty(bucketWindow):
                bucketWindow.extendBy(
                    imath.V2i(
                        int(
                            random.uniform(dataWindow.min().x,
                                           dataWindow.max().x)),
                        int(
                            random.uniform(dataWindow.min().y,
                                           dataWindow.max().y)),
                    ))

            numPixels = (bucketWindow.size().x + 1) * (bucketWindow.size().y +
                                                       1)
            bucketData = IECore.FloatVectorData()
            bucketData.resize(numPixels, i + 1)

            driver.sendBucket(bucketWindow, [bucketData])

            h2 = self.__tileHashes(node, "Y")
            t2 = self.__tiles(node, "Y")

            self.__assertTilesChangedInRegion(t1, t2, bucketWindow)
            self.__assertTilesChangedInRegion(h1, h2, bucketWindow)

        driver.close()
Exemplo n.º 17
0
    def testCacheReuse(self):

        # Send an image to the catalogue, and also
        # capture the display driver that we used to
        # send it.

        c = GafferImage.Catalogue()
        c["directory"].setValue(
            os.path.join(self.temporaryDirectory(), "catalogue"))

        drivers = GafferTest.CapturingSlot(
            GafferImage.Display.driverCreatedSignal())

        r = GafferImage.ImageReader()
        r["fileName"].setValue(
            "${GAFFER_ROOT}/python/GafferImageTest/images/checker.exr")
        self.sendImage(r["out"], c)

        self.assertEqual(len(drivers), 1)

        # The image will have been saved to disk so it can persist between sessions,
        # and the Catalogue should have dropped any reference it has to the driver,
        # in order to save memory.

        self.assertEqual(len(c["images"]), 1)
        self.assertEqual(
            os.path.dirname(c["images"][0]["fileName"].getValue()),
            c["directory"].getValue())

        self.assertEqual(drivers[0][0].refCount(), 1)

        # But we don't want the Catalogue to immediately reload the image from
        # disk, because for large images with many AOVs this is a huge overhead.
        # We want to temporarily reuse the cache entries that were created from
        # the data in the display driver. These should be identical to a regular
        # Display node containing the same driver.

        display = GafferImage.Display()
        display.setDriver(drivers[0][0])

        self.assertEqual(display["out"].channelDataHash("R", imath.V2i(0)),
                         c["out"].channelDataHash("R", imath.V2i(0)))
        self.assertTrue(display["out"].channelData(
            "R", imath.V2i(0),
            _copy=False).isSame(c["out"].channelData("R",
                                                     imath.V2i(0),
                                                     _copy=False)))

        # This applies to copies too

        c["images"].addChild(
            GafferImage.Catalogue.Image(flags=Gaffer.Plug.Flags.Default
                                        | Gaffer.Plug.Flags.Dynamic))
        self.assertEqual(len(c["images"]), 2)
        c["images"][1].copyFrom(c["images"][0])

        c["imageIndex"].setValue(1)
        self.assertEqual(display["out"].channelDataHash("R", imath.V2i(0)),
                         c["out"].channelDataHash("R", imath.V2i(0)))
        self.assertTrue(display["out"].channelData(
            "R", imath.V2i(0),
            _copy=False).isSame(c["out"].channelData("R",
                                                     imath.V2i(0),
                                                     _copy=False)))
Exemplo n.º 18
0
    def testEditSubdivisionAttributes(self):

        script = Gaffer.ScriptNode()

        script["cube"] = GafferScene.Cube()
        script["cube"]["dimensions"].setValue(IECore.V3f(2))

        script["meshType"] = GafferScene.MeshType()
        script["meshType"]["in"].setInput(script["cube"]["out"])
        script["meshType"]["meshType"].setValue("catmullClark")

        script["attributes"] = GafferArnold.ArnoldAttributes()
        script["attributes"]["in"].setInput(script["meshType"]["out"])
        script["attributes"]["attributes"]["subdivIterations"][
            "enabled"].setValue(True)

        script["outputs"] = GafferScene.Outputs()
        script["outputs"].addOutput(
            "beauty",
            IECore.Display(
                "test", "ieDisplay", "rgba", {
                    "driverType": "ClientDisplayDriver",
                    "displayType": "IECore::ClientDisplayDriver",
                    "displayHost": "localhost",
                    "displayPort": "2500",
                    "remoteDisplayType": "GafferImage::GafferDisplayDriver",
                }))
        script["outputs"]["in"].setInput(script["attributes"]["out"])

        script["display"] = GafferImage.Display()
        script["display"]["port"].setValue(2500)

        script["imageStats"] = GafferImage.ImageStats()
        script["imageStats"]["in"].setInput(script["display"]["out"])
        script["imageStats"]["channels"].setValue(
            IECore.StringVectorData(["R", "G", "B", "A"]))
        script["imageStats"]["regionOfInterest"].setValue(
            IECore.Box2i(IECore.V2i(0), IECore.V2i(640, 480)))

        script["render"] = self._createInteractiveRender()
        script["render"]["in"].setInput(script["outputs"]["out"])

        # Render the cube with one level of subdivision. Check we get roughly the
        # alpha coverage we expect.

        script["render"]["state"].setValue(script["render"].State.Running)
        time.sleep(1)

        self.assertAlmostEqual(script["imageStats"]["average"][3].getValue(),
                               0.381,
                               delta=0.001)

        # Now up the number of subdivision levels. The alpha coverage should
        # increase as the shape tends towards the limit surface.

        script["attributes"]["attributes"]["subdivIterations"][
            "value"].setValue(4)
        time.sleep(1)

        self.assertAlmostEqual(script["imageStats"]["average"][3].getValue(),
                               0.424,
                               delta=0.001)
Exemplo n.º 19
0
    def testSetDriver(self):

        driversCreated = GafferTest.CapturingSlot(
            GafferImage.Display.driverCreatedSignal())

        server = IECoreImage.DisplayDriverServer()
        dataWindow = imath.Box2i(imath.V2i(0),
                                 imath.V2i(GafferImage.ImagePlug.tileSize()))

        driver = self.Driver(GafferImage.Format(dataWindow),
                             dataWindow, ["Y"],
                             port=server.portNumber())

        try:

            self.assertTrue(len(driversCreated), 1)

            display = GafferImage.Display()
            self.assertTrue(display.getDriver() is None)

            dirtiedPlugs = GafferTest.CapturingSlot(
                display.plugDirtiedSignal())

            display.setDriver(driversCreated[0][0])
            self.assertTrue(display.getDriver().isSame(driversCreated[0][0]))

            # Ensure all the output plugs have been dirtied
            expectedDirty = {"__driverCount", "__channelDataCount",
                             "out"}.union({
                                 c.getName()
                                 for c in display["out"].children()
                             })
            self.assertEqual(expectedDirty,
                             set(e[0].getName() for e in dirtiedPlugs))

            del dirtiedPlugs[:]

            driver.sendBucket(dataWindow, [
                IECore.FloatVectorData(
                    [0.5] * dataWindow.size().x * dataWindow.size().y)
            ])

            self.assertEqual(
                display["out"]["format"].getValue().getDisplayWindow(),
                dataWindow)
            self.assertEqual(display["out"]["dataWindow"].getValue(),
                             dataWindow)
            self.assertEqual(display["out"]["channelNames"].getValue(),
                             IECore.StringVectorData(["Y"]))
            self.assertEqual(
                display["out"].channelData("Y", imath.V2i(0)),
                IECore.FloatVectorData([0.5] *
                                       GafferImage.ImagePlug.tileSize() *
                                       GafferImage.ImagePlug.tileSize()))

            # Ensure only channel data has been dirtied
            expectedDirty = {"channelData", "__channelDataCount", "out"}
            self.assertEqual(set(e[0].getName() for e in dirtiedPlugs),
                             expectedDirty)

            display2 = GafferImage.Display()
            display2.setDriver(display.getDriver(), copy=True)

            self.assertImagesEqual(display["out"], display2["out"])

            driver.sendBucket(dataWindow, [
                IECore.FloatVectorData(
                    [1] * dataWindow.size().x * dataWindow.size().y)
            ])

            self.assertEqual(
                display["out"].channelData("Y", imath.V2i(0)),
                IECore.FloatVectorData([1] * GafferImage.ImagePlug.tileSize() *
                                       GafferImage.ImagePlug.tileSize()))

            self.assertEqual(
                display2["out"].channelData("Y", imath.V2i(0)),
                IECore.FloatVectorData([0.5] *
                                       GafferImage.ImagePlug.tileSize() *
                                       GafferImage.ImagePlug.tileSize()))
        finally:
            driver.close()
Exemplo n.º 20
0
    def testDeep(self):

        d = GafferImage.Display()
        self.assertEqual(d["out"]["deep"].getValue(), False)