def testShaderNodeColorMode( self ) :

		sphere = GafferScene.Sphere()
		group = GafferScene.Group()
		group["in"][0].setInput( sphere["out"] )
		group["in"][1].setInput( sphere["out"] )
		group["in"][2].setInput( sphere["out"] )

		shader1 = GafferSceneTest.TestShader()
		shader1["name"].setValue( "test" )
		shader1["type"].setValue( "gfr:surface" )

		filter1 = GafferScene.PathFilter()
		filter1["paths"].setValue( IECore.StringVectorData( [ "/group/sphere1" ] ) )

		assignment1 = GafferScene.ShaderAssignment()
		assignment1["in"].setInput( group["out"] )
		assignment1["filter"].setInput( filter1["out"] )
		assignment1["shader"].setInput( shader1["out"] )

		shader2 = GafferSceneTest.TestShader()
		shader2["name"].setValue( "test" )
		shader2["type"].setValue( "gfr:surface" )
		Gaffer.Metadata.registerValue( shader2, "nodeGadget:color", imath.Color3f( 1, 0, 0 ) )

		filter2 = GafferScene.PathFilter()
		filter2["paths"].setValue( IECore.StringVectorData( [ "/group/sphere2" ] ) )

		assignment2 = GafferScene.ShaderAssignment()
		assignment2["in"].setInput( assignment1["out"] )
		assignment2["filter"].setInput( filter2["out"] )
		assignment2["shader"].setInput( shader2["out"] )

		self.assertTrue( "gl:surface" not in assignment2["out"].attributes( "/group/sphere" ) )
		self.assertTrue( "gl:surface" not in assignment2["out"].attributes( "/group/sphere1" ) )
		self.assertTrue( "gl:surface" not in assignment2["out"].attributes( "/group/sphere2" ) )

		visualiser = GafferScene.AttributeVisualiser()
		visualiser["in"].setInput( assignment2["out"] )
		self.assertSceneValid( visualiser["out"] )

		self.assertTrue( "gl:surface" not in visualiser["out"].attributes( "/group/sphere" ) )
		self.assertTrue( "gl:surface" not in visualiser["out"].attributes( "/group/sphere1" ) )
		self.assertTrue( "gl:surface" not in visualiser["out"].attributes( "/group/sphere2" ) )

		visualiser["attributeName"].setValue( "gfr:surface" )
		visualiser["mode"].setValue( visualiser.Mode.ShaderNodeColor )
		self.assertSceneValid( visualiser["out"] )

		self.assertTrue( "gl:surface" not in visualiser["out"].attributes( "/group/sphere" ) )
		self.assertTrue( "gl:surface" in visualiser["out"].attributes( "/group/sphere1" ) )
		self.assertTrue( "gl:surface" in visualiser["out"].attributes( "/group/sphere2" ) )
		self.assertEqual(
			visualiser["out"].attributes( "/group/sphere1" )["gl:surface"].outputShader().parameters["Cs"].value,
			imath.Color3f( 0 ),
		)
		self.assertEqual(
			visualiser["out"].attributes( "/group/sphere2" )["gl:surface"].outputShader().parameters["Cs"].value,
			imath.Color3f( 1, 0, 0 ),
		)
	def testColorMode( self ) :

		sphere = GafferScene.Sphere()
		group = GafferScene.Group()
		group["in"][0].setInput( sphere["out"] )
		group["in"][1].setInput( sphere["out"] )
		group["in"][2].setInput( sphere["out"] )

		filter1 = GafferScene.PathFilter()
		filter1["paths"].setValue( IECore.StringVectorData( [ "/group/sphere1" ] ) )

		attributes1 = GafferScene.StandardAttributes()
		attributes1["in"].setInput( group["out"] )
		attributes1["attributes"]["transformBlurSegments"]["enabled"].setValue( 1 )
		attributes1["attributes"]["transformBlurSegments"]["value"].setValue( 4 )
		attributes1["filter"].setInput( filter1["out"] )

		filter2 = GafferScene.PathFilter()
		filter2["paths"].setValue( IECore.StringVectorData( [ "/group/sphere2" ] ) )

		attributes2 = GafferScene.StandardAttributes()
		attributes2["in"].setInput( attributes1["out"] )
		attributes2["attributes"]["transformBlurSegments"]["enabled"].setValue( 1 )
		attributes2["attributes"]["transformBlurSegments"]["value"].setValue( 2 )
		attributes2["filter"].setInput( filter2["out"] )

		self.assertTrue( "gl:surface" not in attributes2["out"].attributes( "/group/sphere" ) )
		self.assertTrue( "gl:surface" not in attributes2["out"].attributes( "/group/sphere1" ) )
		self.assertTrue( "gl:surface" not in attributes2["out"].attributes( "/group/sphere2" ) )

		visualiser = GafferScene.AttributeVisualiser()
		visualiser["in"].setInput( attributes2["out"] )
		self.assertSceneValid( visualiser["out"] )

		self.assertTrue( "gl:surface" not in visualiser["out"].attributes( "/group/sphere" ) )
		self.assertTrue( "gl:surface" not in visualiser["out"].attributes( "/group/sphere1" ) )
		self.assertTrue( "gl:surface" not in visualiser["out"].attributes( "/group/sphere2" ) )

		visualiser["attributeName"].setValue( "gaffer:transformBlurSegments" )
		visualiser["mode"].setValue( visualiser.Mode.Color )
		visualiser["max"].setValue( 4 )

		self.assertTrue( "gl:surface" not in visualiser["out"].attributes( "/group/sphere" ) )
		self.assertTrue( "gl:surface" in visualiser["out"].attributes( "/group/sphere1" ) )
		self.assertTrue( "gl:surface" in visualiser["out"].attributes( "/group/sphere2" ) )
		self.assertEqual(
			visualiser["out"].attributes( "/group/sphere1" )["gl:surface"].outputShader().parameters["Cs"].value,
			imath.Color3f( 1 ),
		)
		self.assertEqual(
			visualiser["out"].attributes( "/group/sphere2" )["gl:surface"].outputShader().parameters["Cs"].value,
			imath.Color3f( .5 ),
		)
	def testVectors( self ) :

		fileName = os.path.join( self.temporaryDirectory(), "attributes.scc" )
		scene = IECoreScene.SceneInterface.create( fileName, IECore.IndexedIO.Write )
		child = scene.createChild( "child" )
		for name, value in [
			( "v2f", IECore.V2fData( imath.V2f( 1, 2 ) ) ),
			( "v3f", IECore.V3fData( imath.V3f( 3, 4, 5 ) ) ),
			( "v2i", IECore.V2iData( imath.V2i( 6, 7 ) ) ),
			( "v3i", IECore.V3iData( imath.V3i( 8, 9, 10 ) ) ),
			( "v2d", IECore.V2dData( imath.V2d( 11, 12 ) ) ),
			( "v3d", IECore.V3dData( imath.V3d( 13, 14, 15 ) ) ),
		] :
			child.writeAttribute( name, value, 1 )
		del scene, child

		sceneReader = GafferScene.SceneReader()
		sceneReader["fileName"].setValue( fileName )

		childFilter = GafferScene.PathFilter()
		childFilter["paths"].setValue( IECore.StringVectorData( [ "/child" ] ) )

		visualiser = GafferScene.AttributeVisualiser()
		visualiser["in"].setInput( sceneReader["out"] )
		visualiser["filter"].setInput( childFilter["out"] )

		for name, value in [
			( "v2f", imath.Color3f( 1, 2, 0 ) ),
			( "v3f", imath.Color3f( 3, 4, 5 ) ),
			( "v2i", imath.Color3f( 6, 7, 0 ) ),
			( "v3i", imath.Color3f( 8, 9, 10 ) ),
			( "v2d", imath.Color3f( 11, 12, 0 ) ),
			( "v3d", imath.Color3f( 13, 14, 15 ) ),
		] :

			visualiser["attributeName"].setValue( name )
			self.assertEqual(
				visualiser["out"].attributes( "/child" )["gl:surface"].outputShader().parameters["Cs"].value,
				value,
			)