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 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" ) # We don't care about the exact name of the gobo which contains a hash goboName = arnold.AiNodeGetName( linkedGobo ) self.assertTrue( goboName.startswith( "shader:" ) and goboName.endswith( ":gobo" ) )
def testLightAndShadowLinking( self ) : sphere1 = GafferScene.Sphere() sphere2 = GafferScene.Sphere() attributes = GafferScene.StandardAttributes() arnoldAttributes = GafferArnold.ArnoldAttributes() light1 = GafferArnold.ArnoldLight() light1.loadShader( "point_light" ) light2 = GafferArnold.ArnoldLight() light2.loadShader( "point_light" ) group = GafferScene.Group() group["in"].addChild( GafferScene.ScenePlug( "in1" ) ) group["in"].addChild( GafferScene.ScenePlug( "in2" ) ) group["in"].addChild( GafferScene.ScenePlug( "in3" ) ) group["in"].addChild( GafferScene.ScenePlug( "in4" ) ) evaluate = GafferScene.EvaluateLightLinks() render = GafferArnold.ArnoldRender() attributes["in"].setInput( sphere1["out"] ) arnoldAttributes["in"].setInput( attributes["out"] ) group["in"]["in1"].setInput( arnoldAttributes["out"] ) group["in"]["in2"].setInput( light1["out"] ) group["in"]["in3"].setInput( light2["out"] ) group["in"]["in4"].setInput( sphere2["out"] ) evaluate["in"].setInput( group["out"] ) render["in"].setInput( evaluate["out"] ) # Illumination attributes["attributes"]["linkedLights"]["enabled"].setValue( True ) attributes["attributes"]["linkedLights"]["value"].setValue( "/group/light /group/light1" ) # Shadows arnoldAttributes["attributes"]["shadowGroup"]["enabled"].setValue( True ) arnoldAttributes["attributes"]["shadowGroup"]["value"].setValue( "/group/light /group/light1" ) # make sure we pass correct data into the renderer self.assertEqual( set( render["in"].attributes( "/group/sphere" )["linkedLights"] ), set( IECore.StringVectorData( ["/group/light", "/group/light1"] ) ) ) self.assertEqual( set( render["in"].attributes( "/group/sphere" )["ai:visibility:shadow_group"] ), set( IECore.StringVectorData( ["/group/light", "/group/light1"] ) ) ) render["mode"].setValue( render.Mode.SceneDescriptionMode ) render["fileName"].setValue( self.temporaryDirectory() + "/test.ass" ) render["task"].execute() with IECoreArnold.UniverseBlock( writable = True ) : arnold.AiASSLoad( self.temporaryDirectory() + "/test.ass" ) # the first sphere had linked lights sphere = arnold.AiNodeLookUpByName( "/group/sphere" ) # check illumination lights = arnold.AiNodeGetArray( sphere, "light_group" ) lightNames = [] for i in range( arnold.AiArrayGetNumElements( lights.contents ) ): light = arnold.cast(arnold.AiArrayGetPtr(lights, i), arnold.POINTER(arnold.AtNode)) lightNames.append( arnold.AiNodeGetName(light.contents) ) doLinking = arnold.AiNodeGetBool( sphere, "use_light_group" ) self.assertEqual( set( lightNames ), { "light:/group/light", "light:/group/light1" } ) self.assertEqual( doLinking, True ) # check shadows shadows = arnold.AiNodeGetArray( sphere, "shadow_group" ) lightNames = [] for i in range( arnold.AiArrayGetNumElements( shadows.contents ) ): light = arnold.cast(arnold.AiArrayGetPtr(shadows, i), arnold.POINTER(arnold.AtNode)) lightNames.append( arnold.AiNodeGetName(light.contents) ) doLinking = arnold.AiNodeGetBool( sphere, "use_shadow_group" ) self.assertEqual( set( lightNames ), { "light:/group/light", "light:/group/light1" } ) self.assertEqual( doLinking, True ) # the second sphere does not have any light linking enabled sphere1 = arnold.AiNodeLookUpByName( "/group/sphere1" ) # check illumination lights = arnold.AiNodeGetArray( sphere1, "light_group" ) lightNames = [] for i in range( arnold.AiArrayGetNumElements( lights.contents ) ): light = arnold.cast(arnold.AiArrayGetPtr(lights, i), arnold.POINTER(arnold.AtNode)) lightNames.append( arnold.AiNodeGetName(light.contents) ) doLinking = arnold.AiNodeGetBool( sphere1, "use_light_group" ) self.assertEqual( lightNames, [] ) self.assertEqual( doLinking, False ) # check shadows shadows = arnold.AiNodeGetArray( sphere1, "shadow_group" ) lightNames = [] for i in range( arnold.AiArrayGetNumElements( shadows.contents ) ): light = arnold.cast(arnold.AiArrayGetPtr(shadows, i), arnold.POINTER(arnold.AtNode)) lightNames.append( arnold.AiNodeGetName(light.contents) ) doLinking = arnold.AiNodeGetBool( sphere1, "use_shadow_group" ) self.assertEqual( lightNames, [] ) self.assertEqual( doLinking, False )