Beispiel #1
0
    def test(self):

        plane = GafferScene.Plane()
        offset = GafferScene.MapOffset()
        offset["in"].setInput(plane["out"])

        self.assertSceneValid(offset["out"])
        self.assertScenesEqual(offset["out"], plane["out"])

        inputObject = plane["out"].object("/plane")

        self.assertEqual(offset["out"].object("/plane"), inputObject)

        offset["udim"].setValue(1022)
        self.assertSceneValid(offset["out"])

        for i, s in enumerate(offset["out"].object("/plane")["s"].data):
            self.assertEqual(s, inputObject["s"].data[i] + 1)

        for i, t in enumerate(offset["out"].object("/plane")["t"].data):
            self.assertEqual(t, inputObject["t"].data[i] + 2)

        offset["offset"].setValue(IECore.V2f(0.5, 1.5))
        self.assertSceneValid(offset["out"])

        for i, s in enumerate(offset["out"].object("/plane")["s"].data):
            self.assertEqual(s, inputObject["s"].data[i] + 1.5)

        for i, t in enumerate(offset["out"].object("/plane")["t"].data):
            self.assertEqual(t, inputObject["t"].data[i] + 3.5)
Beispiel #2
0
    def test(self):

        plane = GafferScene.Plane()
        offset = GafferScene.MapOffset()
        offset["in"].setInput(plane["out"])

        self.assertSceneValid(offset["out"])
        self.assertScenesEqual(offset["out"], plane["out"])

        inputObject = plane["out"].object("/plane")

        self.assertEqual(offset["out"].object("/plane"), inputObject)

        offset["udim"].setValue(1022)
        self.assertSceneValid(offset["out"])

        for i, uv in enumerate(offset["out"].object("/plane")["uv"].data):
            self.assertEqual(
                uv, IECore.V2f(inputObject["uv"].data[i] + IECore.V2f(1, 2)))

        offset["offset"].setValue(IECore.V2f(0.5, 1.5))
        self.assertSceneValid(offset["out"])

        for i, uv in enumerate(offset["out"].object("/plane")["uv"].data):
            self.assertEqual(
                uv,
                IECore.V2f(inputObject["uv"].data[i] + IECore.V2f(1.5, 3.5)))
Beispiel #3
0
    def testManyImages(self):

        allFilter = GafferScene.PathFilter()
        allFilter["paths"].setValue(IECore.StringVectorData(['/...']))

        sphere = GafferScene.Sphere()
        sphere["transform"]["translate"].setValue(imath.V3f(-3, 0, 0))

        standardSurface = GafferArnold.ArnoldShader()
        standardSurface.loadShader("standard_surface")

        shaderAssignment = GafferScene.ShaderAssignment()
        shaderAssignment["in"].setInput(sphere["out"])
        shaderAssignment["filter"].setInput(allFilter["out"])
        shaderAssignment["shader"].setInput(standardSurface["out"])

        uvScaleCode = GafferOSL.OSLCode()
        uvScaleCode["out"].addChild(
            Gaffer.V3fPlug("uvScaled", direction=Gaffer.Plug.Direction.Out))
        uvScaleCode["code"].setValue('uvScaled = vector( u * 2, v * 2, 0 );')

        outUV = GafferOSL.OSLShader()
        outUV.loadShader("ObjectProcessing/OutUV")
        outUV["parameters"]["value"].setInput(uvScaleCode["out"]["uvScaled"])

        outObject2 = GafferOSL.OSLShader()
        outObject2.loadShader("ObjectProcessing/OutObject")
        outObject2["parameters"]["in0"].setInput(
            outUV["out"]["primitiveVariable"])

        uvScaleOSL = GafferOSL.OSLObject()
        uvScaleOSL["in"].setInput(shaderAssignment["out"])
        uvScaleOSL["filter"].setInput(allFilter["out"])
        uvScaleOSL["shader"].setInput(outObject2["out"])
        uvScaleOSL["interpolation"].setValue(5)

        mapOffset = GafferScene.MapOffset()
        mapOffset["in"].setInput(uvScaleOSL["out"])
        mapOffset["filter"].setInput(allFilter["out"])
        mapOffset["udim"].setValue(1033)

        offsetGroup = GafferScene.Group()
        offsetGroup["in"]["in0"].setInput(mapOffset["out"])
        offsetGroup["name"].setValue('offset')
        offsetGroup["transform"]["translate"].setValue(imath.V3f(6, 0, 3))

        combineGroup = GafferScene.Group()
        combineGroup["in"]["in0"].setInput(uvScaleOSL["out"])
        combineGroup["in"]["in1"].setInput(offsetGroup["out"])

        lights = []
        for color, rotate in [((1, 0, 0), (0, 0, 0)), ((0, 1, 0), (0, 90, 0)),
                              ((0, 0, 1), (-90, 0, 0))]:
            light = GafferArnold.ArnoldLight()
            light.loadShader("distant_light")
            light["parameters"]["color"].setValue(imath.Color3f(*color))
            light["transform"]["rotate"].setValue(imath.V3f(*rotate))
            combineGroup["in"][-1].setInput(light["out"])
            lights.append(light)

        arnoldTextureBake = GafferArnold.ArnoldTextureBake()
        arnoldTextureBake["in"].setInput(combineGroup["out"])
        arnoldTextureBake["filter"].setInput(allFilter["out"])
        arnoldTextureBake["bakeDirectory"].setValue(self.temporaryDirectory() +
                                                    '/bakeSpheres/')
        arnoldTextureBake["defaultResolution"].setValue(32)
        arnoldTextureBake["aovs"].setValue('beauty:RGBA diffuse:diffuse')
        arnoldTextureBake["tasks"].setValue(3)
        arnoldTextureBake["cleanupIntermediateFiles"].setValue(True)

        # Dispatch the bake
        script = Gaffer.ScriptNode()
        script.addChild(arnoldTextureBake)
        dispatcher = GafferDispatch.LocalDispatcher()
        dispatcher["jobsDirectory"].setValue(self.temporaryDirectory())
        dispatcher.dispatch([arnoldTextureBake])

        # Test that we are writing all expected files, and that we have cleaned up all temp files
        expectedUdims = [i + j for j in [1001, 1033] for i in [0, 1, 10, 11]]
        self.assertEqual(
            sorted(os.listdir(self.temporaryDirectory() + '/bakeSpheres/')),
            ["beauty", "diffuse"])
        self.assertEqual(
            sorted(
                os.listdir(self.temporaryDirectory() + '/bakeSpheres/beauty')),
            ["beauty.%i.tx" % i for i in expectedUdims])
        self.assertEqual(
            sorted(
                os.listdir(self.temporaryDirectory() +
                           '/bakeSpheres/diffuse')),
            ["diffuse.%i.tx" % i for i in expectedUdims])

        # Read back in the 4 udim tiles of a sphere

        reader = GafferImage.ImageReader()

        imageTransform = GafferImage.ImageTransform()
        imageTransform["in"].setInput(reader["out"])

        exprBox = Gaffer.Box()
        expression = Gaffer.Expression()
        exprBox.addChild(reader)
        exprBox.addChild(imageTransform)
        exprBox.addChild(expression)
        expression.setExpression(
            inspect.cleandoc(
                """
			i = context.get( "loop:index", 0 )
			layer = context.get( "collect:layerName", "beauty" )
			x = i % 2 
			y = i / 2
			parent["ImageReader"]["fileName"] = '""" + self.temporaryDirectory() +
                """/bakeSpheres/%s/%s.%i.tx' % ( layer, layer, 1001 + x + y * 10 )

			parent["ImageTransform"]["transform"]["translate"] = imath.V2f( 32 * x, 32 * y )
			"""), "python")

        udimLoop = Gaffer.Loop()
        udimLoop.setup(GafferImage.ImagePlug())
        udimLoop["iterations"].setValue(4)

        udimMerge = GafferImage.Merge()
        udimMerge["in"]["in0"].setInput(imageTransform["out"])
        udimMerge["in"]["in1"].setInput(udimLoop["previous"])

        udimLoop["next"].setInput(udimMerge["out"])

        aovCollect = GafferImage.CollectImages()
        aovCollect["in"].setInput(udimLoop["out"])
        aovCollect["rootLayers"].setValue(
            IECore.StringVectorData(['beauty', 'diffuse']))

        # We have a little reference image for how the diffuse should look
        imageReaderRef = GafferImage.ImageReader()
        imageReaderRef["fileName"].setValue(
            os.path.dirname(__file__) + "/images/sphereLightBake.exr")

        resizeRef = GafferImage.Resize()
        resizeRef["in"].setInput(imageReaderRef["out"])
        resizeRef["format"].setValue(GafferImage.Format(64, 64, 1.000))

        shuffleRef = GafferImage.Shuffle()
        shuffleRef["in"].setInput(resizeRef["out"])
        for layer in ["beauty", "diffuse"]:
            for channel in ["R", "G", "B"]:
                shuffleRef["channels"].addChild(
                    GafferImage.Shuffle.ChannelPlug())
                shuffleRef["channels"][-1]["in"].setValue(channel)
                shuffleRef["channels"][-1]["out"].setValue(layer + "." +
                                                           channel)

        differenceMerge = GafferImage.Merge()
        differenceMerge["in"]["in0"].setInput(aovCollect["out"])
        differenceMerge["in"]["in1"].setInput(shuffleRef["out"])
        differenceMerge["operation"].setValue(
            GafferImage.Merge.Operation.Difference)

        stats = GafferImage.ImageStats()
        stats["in"].setInput(differenceMerge["out"])
        stats["area"].setValue(imath.Box2i(imath.V2i(0, 0), imath.V2i(64, 64)))

        # We should get a very close match to our single tile low res reference bake
        stats["channels"].setValue(
            IECore.StringVectorData(
                ['diffuse.R', 'diffuse.G', 'diffuse.B', 'diffuse.A']))
        for i in range(3):
            self.assertLess(stats["average"].getValue()[i], 0.002)
            self.assertLess(stats["max"].getValue()[i], 0.02)

        # The beauty should be mostly a close match, but with a high max difference due to the spec pings
        stats["channels"].setValue(
            IECore.StringVectorData(
                ['beauty.R', 'beauty.G', 'beauty.B', 'beauty.A']))
        for i in range(3):
            self.assertLess(stats["average"].getValue()[i], 0.1)
            self.assertGreater(stats["max"].getValue()[i], 0.3)
Beispiel #4
0
    def testTasks(self):

        allFilter = GafferScene.PathFilter()
        allFilter["paths"].setValue(IECore.StringVectorData(['/...']))

        sphere = GafferScene.Sphere()
        sphere["transform"]["translate"].setValue(imath.V3f(-3, 0, 0))

        uvScaleCode = GafferOSL.OSLCode()
        uvScaleCode["out"].addChild(
            Gaffer.V3fPlug("uvScaled", direction=Gaffer.Plug.Direction.Out))
        uvScaleCode["code"].setValue('uvScaled = vector( u * 2, v * 2, 0 );')

        outUV = GafferOSL.OSLShader()
        outUV.loadShader("ObjectProcessing/OutUV")
        outUV["parameters"]["value"].setInput(uvScaleCode["out"]["uvScaled"])

        outObject2 = GafferOSL.OSLShader()
        outObject2.loadShader("ObjectProcessing/OutObject")
        outObject2["parameters"]["in0"].setInput(
            outUV["out"]["primitiveVariable"])

        uvScaleOSL = GafferOSL.OSLObject()
        uvScaleOSL["in"].setInput(sphere["out"])
        uvScaleOSL["filter"].setInput(allFilter["out"])
        uvScaleOSL["shader"].setInput(outObject2["out"])
        uvScaleOSL["interpolation"].setValue(5)

        mapOffset = GafferScene.MapOffset()
        mapOffset["in"].setInput(uvScaleOSL["out"])
        mapOffset["filter"].setInput(allFilter["out"])
        mapOffset["udim"].setValue(1033)

        offsetGroup = GafferScene.Group()
        offsetGroup["in"]["in0"].setInput(mapOffset["out"])
        offsetGroup["name"].setValue('offset')
        offsetGroup["transform"]["translate"].setValue(imath.V3f(6, 0, 3))

        combineGroup = GafferScene.Group()
        combineGroup["in"]["in0"].setInput(uvScaleOSL["out"])
        combineGroup["in"]["in1"].setInput(offsetGroup["out"])

        arnoldTextureBake = GafferArnold.ArnoldTextureBake()
        arnoldTextureBake["in"].setInput(combineGroup["out"])
        arnoldTextureBake["filter"].setInput(allFilter["out"])
        arnoldTextureBake["bakeDirectory"].setValue(self.temporaryDirectory() +
                                                    '/bakeSpheres/')
        arnoldTextureBake["defaultResolution"].setValue(1)
        arnoldTextureBake["aovs"].setValue('beauty:RGBA diffuse:diffuse')
        arnoldTextureBake["tasks"].setValue(3)
        arnoldTextureBake["cleanupIntermediateFiles"].setValue(False)

        # Dispatch the bake
        script = Gaffer.ScriptNode()
        script.addChild(arnoldTextureBake)
        dispatcher = GafferDispatch.LocalDispatcher()
        dispatcher["jobsDirectory"].setValue(self.temporaryDirectory())
        dispatcher.dispatch([arnoldTextureBake])

        self.assertEqual(
            sorted(os.listdir(self.temporaryDirectory() + '/bakeSpheres/')), [
                "BAKE_FILE_INDEX_0.0001.txt", "BAKE_FILE_INDEX_1.0001.txt",
                "BAKE_FILE_INDEX_2.0001.txt", "beauty", "diffuse"
            ])
        # Make sure the 16 images that need writing get divided into very approximate thirds
        for i in range(3):
            l = len(
                open(self.temporaryDirectory() +
                     '/bakeSpheres/BAKE_FILE_INDEX_%i.0001.txt' %
                     i).readlines())
            self.assertGreater(l, 2)
            self.assertLess(l, 8)