예제 #1
0
	def testNestedEditScopes( self ) :

		outerScope = Gaffer.EditScope()
		outerScope.setup( GafferScene.ScenePlug() )
		innerScope = Gaffer.EditScope()
		outerScope["Inner"] = innerScope
		innerScope.setup( outerScope["BoxIn"]["out"] )
		innerScope["in"].setInput( outerScope["BoxIn"]["out"] )
		innerScope["parent"] = GafferScene.Parent()
		innerScope["parent"]["parent"].setValue( "/" )
		innerScope["parent"]["in"].setInput( innerScope["BoxIn"]["out"] )
		innerScope["BoxOut"]["in"].setInput( innerScope["parent"]["out"] )
		innerScope["plane"] = GafferScene.Plane()
		innerScope["parent"]["children"][0].setInput( innerScope["plane"]["out"] )
		outerScope["BoxOut"]["in"].setInput( innerScope["out"] )

		selection = GafferSceneUI.TransformTool.Selection( outerScope["out"], "/plane", Gaffer.Context(), innerScope )
		self.assertTrue( selection.editable() )
		self.assertEqual( selection.editTarget(), innerScope["plane"]["transform"] )
		self.assertEqual( selection.editScope(), innerScope )

		selection = GafferSceneUI.TransformTool.Selection( outerScope["out"], "/plane", Gaffer.Context(), outerScope )
		self.assertTrue( selection.editable() )
		self.assertEqual( selection.editTarget(), outerScope )
		self.assertEqual( selection.editScope(), outerScope )
예제 #2
0
	def testParameterEditReadOnlyReason( self ) :

		s = Gaffer.ScriptNode()

		s["light"] = GafferSceneTest.TestLight()

		s["scope"] = Gaffer.EditScope()
		s["scope"].setup( s["light"]["out"] )
		s["scope"]["in"].setInput( s["light"]["out"] )

		s["box"] = Gaffer.Box.create( s, Gaffer.StandardSet( [ s["light"], s["scope"] ] ) )

		self.assertIsNone( GafferScene.EditScopeAlgo.parameterEditReadOnlyReason( s["box"]["scope"], "/light", "light", ( "", "intensity" ) ) )

		for component in ( s["box"], s["box"]["scope"] ):
			Gaffer.MetadataAlgo.setReadOnly( component, True )
			self.assertEqual( GafferScene.EditScopeAlgo.parameterEditReadOnlyReason( s["box"]["scope"], "/light", "light", ( "", "intensity" ) ), s["box"] )

		Gaffer.MetadataAlgo.setReadOnly( s["box"], False )
		self.assertEqual( GafferScene.EditScopeAlgo.parameterEditReadOnlyReason( s["box"]["scope"], "/light", "light", ( "", "intensity" ) ), s["box"]["scope"] )

		Gaffer.MetadataAlgo.setReadOnly( s["box"]["scope"], False )
		GafferScene.EditScopeAlgo.acquireParameterEdit( s["box"]["scope"], "/light", "light", ( "", "intensity" ) )

		self.assertIsNone( GafferScene.EditScopeAlgo.parameterEditReadOnlyReason( s["box"]["scope"], "/light", "light", ( "", "intensity" ) ) )

		candidateComponents = (
			s["box"]["scope"]["LightEdits"]["edits"][1]["cells"]["intensity"]["value"]["value"][1],
			s["box"]["scope"]["LightEdits"]["edits"][1]["cells"]["intensity"]["value"]["mode"],
			s["box"]["scope"]["LightEdits"]["edits"][1]["cells"]["intensity"]["value"]["enabled"],
			s["box"]["scope"]["LightEdits"]["edits"][1]["cells"]["intensity"]["value"]["name"],
			s["box"]["scope"]["LightEdits"]["edits"][1]["cells"]["intensity"]["value"],
			s["box"]["scope"]["LightEdits"]["edits"][1]["cells"]["intensity"],
			s["box"]["scope"]["LightEdits"]["edits"][1]["cells"],
			s["box"]["scope"]["LightEdits"]["edits"][1],
			s["box"]["scope"]["LightEdits"]["edits"],
			s["box"]["scope"]["LightEdits"],
			s["box"]["scope"],
			s["box"]
		)

		for component in candidateComponents :
			Gaffer.MetadataAlgo.setReadOnly( component, True )
			self.assertEqual( GafferScene.EditScopeAlgo.parameterEditReadOnlyReason( s["box"]["scope"], "/light", "light", ( "", "intensity" ) ), component )

		for component in candidateComponents :
			Gaffer.MetadataAlgo.setReadOnly( component, False )

		# We can't remove parameter edits, they're just disabled (as the row is shared with other parameters),
		# so we try to create one for another light instead
		s["box"]["light"]["name"].setValue( "light2" )

		self.assertIsNone( GafferScene.EditScopeAlgo.acquireParameterEdit( s["box"]["scope"], "/light2", "light", ( "", "intensity" ), createIfNecessary = False ) )

		for component in (
			s["box"]["scope"]["LightEdits"]["edits"],
			s["box"]["scope"]["LightEdits"]
		) :
			Gaffer.MetadataAlgo.setReadOnly( component, True )
			self.assertEqual( GafferScene.EditScopeAlgo.parameterEditReadOnlyReason( s["box"]["scope"], "/light2", "light", ( "", "intensity" ) ), component )
예제 #3
0
	def testParameterEditsDontAffectOtherAttributes( self ) :

		light = GafferSceneTest.TestLight()

		lightFilter = GafferScene.PathFilter()
		lightFilter["paths"].setValue( IECore.StringVectorData( [ "/light" ] ) )

		shuffleAttributes = GafferScene.ShuffleAttributes()
		shuffleAttributes["in"].setInput( light["out"] )
		shuffleAttributes["filter"].setInput( lightFilter["out"] )

		editScope = Gaffer.EditScope()
		editScope.setup( shuffleAttributes["out"] )
		editScope["in"].setInput( shuffleAttributes["out"] )

		# Make an edit for the "light" attribute.

		edit = GafferScene.EditScopeAlgo.acquireParameterEdit( editScope, "/light", "light", ( "", "intensity" ) )
		edit["enabled"].setValue( True )
		edit["value"].setValue( imath.Color3f( 1, 2, 3 ) )
		self.assertEqual(
			editScope["out"].attributes( "/light" )["light"].outputShader().parameters["intensity"].value,
			imath.Color3f( 1, 2, 3 )
		)

		# Shuffle the light shader to another attribute. It should not be affected
		# by the edit.

		shuffleAttributes["shuffles"].addChild( Gaffer.ShufflePlug( "light", "test:light" ) )
		self.assertEqual(
			editScope["out"].attributes( "/light" )["test:light"].outputShader().parameters["intensity"].value,
			imath.Color3f( 0 )
		)
예제 #4
0
	def testProcessorNames( self ) :

		plane = GafferScene.Plane()

		planeFilter = GafferScene.PathFilter()
		planeFilter["paths"].setValue( IECore.StringVectorData( [ "/plane" ]) )

		shader = GafferSceneTest.TestShader()

		shaderAssignment = GafferScene.ShaderAssignment()
		shaderAssignment["in"].setInput( plane["out"] )
		shaderAssignment["filter"].setInput( planeFilter["out"] )
		shaderAssignment["shader"].setInput( shader["out"] )

		editScope = Gaffer.EditScope()
		editScope.setup( shaderAssignment["out"] )
		editScope["in"].setInput( shaderAssignment["out"] )

		for attributeName, processorName in [
			( "gl:surface", "OpenGLSurfaceEdits" ),
			( "gl:light", "OpenGLLightEdits" ),
			( "surface", "SurfaceEdits" ),
			( "displacement", "DisplacementEdits" ),
			( "test:lightFilter:one", "TestLightFilterOneEdits" ),
			( "test:lightFilter:bigGobo", "TestLightFilterBigGoboEdits" ),
		] :
			shader["type"].setValue( attributeName )
			edit = GafferScene.EditScopeAlgo.acquireParameterEdit( editScope, "/plane", attributeName, ( "", "i" ) )
			self.assertEqual( edit.node().getName(), processorName )
예제 #5
0
	def testTransform( self ) :

		plane = GafferScene.Plane()
		plane["transform"]["translate"].setValue( imath.V3f( 1, 0, 0 ) )

		editScope = Gaffer.EditScope()
		editScope.setup( plane["out"] )
		editScope["in"].setInput( plane["out"] )

		self.assertFalse( GafferScene.EditScopeAlgo.hasTransformEdit( editScope, "/plane" ) )
		self.assertIsNone( GafferScene.EditScopeAlgo.acquireTransformEdit( editScope, "/plane", createIfNecessary = False ) )
		self.assertEqual( len( list( GafferScene.SceneProcessor.Range( editScope ) ) ), 0 )
		self.assertEqual( editScope["out"].transform( "/plane" ), plane["transform"].matrix() )

		edit = GafferScene.EditScopeAlgo.acquireTransformEdit( editScope, "/plane" )
		self.assertIsInstance( edit, GafferScene.EditScopeAlgo.TransformEdit )
		self.assertTrue( GafferScene.EditScopeAlgo.hasTransformEdit( editScope, "/plane" ) )
		self.assertIsNotNone( GafferScene.EditScopeAlgo.acquireTransformEdit( editScope, "/plane", createIfNecessary = False ) )
		self.assertEqual( editScope["out"].transform( "/plane" ), imath.M44f() )
		edit.translate.setValue( imath.V3f( 2, 3, 4 ) )
		self.assertEqual( editScope["out"].transform( "/plane" ), imath.M44f().translate( imath.V3f( 2, 3, 4 ) ) )

		GafferScene.EditScopeAlgo.removeTransformEdit( editScope, "/plane" )
		self.assertFalse( GafferScene.EditScopeAlgo.hasTransformEdit( editScope, "/plane" ) )
		self.assertIsNone( GafferScene.EditScopeAlgo.acquireTransformEdit( editScope, "/plane", createIfNecessary = False ) )
		self.assertEqual( editScope["out"].transform( "/plane" ), plane["transform"].matrix() )
예제 #6
0
	def testPruneReadOnlyReason( self ) :

		s = Gaffer.ScriptNode()

		s["cube"] = GafferScene.Cube()

		s["scope"] = Gaffer.EditScope()
		s["scope"].setup( s["cube"]["out"] )
		s["scope"]["in"].setInput( s["cube"]["out"] )

		s["box"] = Gaffer.Box.create( s, Gaffer.StandardSet( [ s["cube"], s["scope"] ] ) )

		self.assertIsNone( GafferScene.EditScopeAlgo.prunedReadOnlyReason( s["box"]["scope"] ) )

		for component in ( s["box"], s["box"]["scope"] ):
			Gaffer.MetadataAlgo.setReadOnly( component, True )
			self.assertEqual( GafferScene.EditScopeAlgo.prunedReadOnlyReason( s["box"]["scope"] ), s["box"] )

		Gaffer.MetadataAlgo.setReadOnly( s["box"], False )
		self.assertEqual( GafferScene.EditScopeAlgo.prunedReadOnlyReason( s["box"]["scope"] ), s["box"]["scope"] )

		Gaffer.MetadataAlgo.setReadOnly( s["box"]["scope"], False )
		GafferScene.EditScopeAlgo.setPruned( s["box"]["scope"], "/cube", True )

		self.assertIsNone( GafferScene.EditScopeAlgo.prunedReadOnlyReason( s["box"]["scope"] ) )

		for component in (
			s["box"]["scope"]["PruningEdits"]["paths"],
			s["box"]["scope"]["PruningEdits"],
			s["box"]["scope"],
			s["box"]
		) :
			Gaffer.MetadataAlgo.setReadOnly( component, True )
			self.assertEqual( GafferScene.EditScopeAlgo.prunedReadOnlyReason( s["box"]["scope"] ), component )
예제 #7
0
	def testEditScopes( self ) :

		script = Gaffer.ScriptNode()

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

		script["editScope"] = Gaffer.EditScope()
		script["editScope"].setup( script["sphere"]["out"] )
		script["editScope"]["in"].setInput( script["sphere"]["out"] )

		view = GafferSceneUI.SceneView()
		view["in"].setInput( script["editScope"]["out"] )
		view["editScope"].setInput( script["editScope"]["out"] )

		GafferSceneUI.ContextAlgo.setSelectedPaths( view.getContext(), IECore.PathMatcher( [ "/sphere" ] ) )

		tool = GafferSceneUI.TranslateTool( view )
		tool["active"].setValue( True )

		self.assertEqual( tool.handlesTransform(), imath.M44f().translate( imath.V3f( 1, 0, 0 ) ) )
		self.assertEqual( len( tool.selection() ), 1 )
		self.assertTrue( tool.selection()[0].editable() )
		self.assertFalse( GafferScene.EditScopeAlgo.hasTransformEdit( script["editScope"], "/sphere" ) )
		self.assertEqual( script["editScope"]["out"].transform( "/sphere" ), imath.M44f().translate( imath.V3f( 1, 0, 0 ) ) )

		tool.translate( imath.V3f( 0, 1, 0 ) )
		self.assertEqual( tool.handlesTransform(), imath.M44f().translate( imath.V3f( 1, 1, 0 ) ) )
		self.assertEqual( len( tool.selection() ), 1 )
		self.assertTrue( tool.selection()[0].editable() )
		self.assertTrue( GafferScene.EditScopeAlgo.hasTransformEdit( script["editScope"], "/sphere" ) )
		self.assertEqual( script["editScope"]["out"].transform( "/sphere" ), imath.M44f().translate( imath.V3f( 1, 1, 0 ) ) )
예제 #8
0
	def testParameterEditLocalisation( self ) :

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

		groupFilter = GafferScene.PathFilter()
		groupFilter["paths"].setValue( IECore.StringVectorData( [ "/group" ] ) )
		shader = GafferSceneTest.TestShader()
		shader["type"].setValue( "test:surface" )

		shaderAssignment = GafferScene.ShaderAssignment()
		shaderAssignment["in"].setInput( group["out"] )
		shaderAssignment["filter"].setInput( groupFilter["out"] )
		shaderAssignment["shader"].setInput( shader["out"] )

		editScope = Gaffer.EditScope()
		editScope.setup( shaderAssignment["out"] )
		editScope["in"].setInput( shaderAssignment["out"] )

		self.assertIn( "test:surface", editScope["out"].attributes( "/group" ) )
		self.assertNotIn( "test:surface", editScope["out"].attributes( "/group/sphere" ) )

		edit = GafferScene.EditScopeAlgo.acquireParameterEdit( editScope, "/group/sphere", "test:surface", ( "", "i" ) )
		edit["enabled"].setValue( True )
		edit["value"].setValue( 10 )

		self.assertEqual( editScope["out"].attributes( "/group" ), editScope["in"].attributes( "/group" ) )
		self.assertIn( "test:surface", editScope["out"].attributes( "/group/sphere" ) )
		self.assertEqual(
			editScope["out"].attributes( "/group/sphere" )["test:surface"].outputShader().parameters["i"].value,
			10
		)
예제 #9
0
	def testTransformEditReadOnlyReason( self ) :

		s = Gaffer.ScriptNode()

		s["cube"] = GafferScene.Cube()

		s["scope"] = Gaffer.EditScope()
		s["scope"].setup( s["cube"]["out"] )
		s["scope"]["in"].setInput( s["cube"]["out"] )

		s["box"] = Gaffer.Box.create( s, Gaffer.StandardSet( [ s["cube"], s["scope"] ] ) )

		self.assertIsNone( GafferScene.EditScopeAlgo.transformEditReadOnlyReason( s["box"]["scope"], "/cube" ) )

		for component in ( s["box"], s["box"]["scope"] ):
			Gaffer.MetadataAlgo.setReadOnly( component, True )
			self.assertEqual( GafferScene.EditScopeAlgo.transformEditReadOnlyReason( s["box"]["scope"], "/cube" ), s["box"] )

		Gaffer.MetadataAlgo.setReadOnly( s["box"], False )
		self.assertEqual( GafferScene.EditScopeAlgo.transformEditReadOnlyReason( s["box"]["scope"], "/cube" ), s["box"]["scope"] )

		Gaffer.MetadataAlgo.setReadOnly( s["box"]["scope"], False )
		GafferScene.EditScopeAlgo.acquireTransformEdit( s["box"]["scope"], "/cube" )

		self.assertIsNone( GafferScene.EditScopeAlgo.transformEditReadOnlyReason( s["box"]["scope"], "/cube" ) )

		candidateComponents = (
			s["box"]["scope"]["TransformEdits"]["edits"][1]["cells"]["pivot"][1],
			s["box"]["scope"]["TransformEdits"]["edits"][1]["cells"]["pivot"],
			s["box"]["scope"]["TransformEdits"]["edits"][1]["cells"]["scale"],
			s["box"]["scope"]["TransformEdits"]["edits"][1]["cells"]["rotate"],
			s["box"]["scope"]["TransformEdits"]["edits"][1]["cells"]["translate"],
			s["box"]["scope"]["TransformEdits"]["edits"][1]["cells"],
			s["box"]["scope"]["TransformEdits"]["edits"][1],
			s["box"]["scope"]["TransformEdits"]["edits"],
			s["box"]["scope"]["TransformEdits"],
			s["box"]["scope"],
			s["box"]
		)

		for component in candidateComponents :
			Gaffer.MetadataAlgo.setReadOnly( component, True )
			self.assertEqual( GafferScene.EditScopeAlgo.transformEditReadOnlyReason( s["box"]["scope"], "/cube" ), component )

		for component in candidateComponents :
			Gaffer.MetadataAlgo.setReadOnly( component, False )

		GafferScene.EditScopeAlgo.removeTransformEdit( s["box"]["scope"], "/cube" )
		self.assertIsNone( GafferScene.EditScopeAlgo.acquireTransformEdit( s["box"]["scope"], "/cube", createIfNecessary = False ) )

		for component in (
			s["box"]["scope"]["TransformEdits"]["edits"],
			s["box"]["scope"]["TransformEdits"]
		) :
			Gaffer.MetadataAlgo.setReadOnly( component, True )
			self.assertEqual( GafferScene.EditScopeAlgo.transformEditReadOnlyReason( s["box"]["scope"], "/cube" ), component )
예제 #10
0
	def testEditScope( self ) :

		view = self.MyView()

		addNode = GafferTest.AddNode()
		editScope = Gaffer.EditScope()
		editScope.setup( view["in"] )

		self.assertEqual( view.editScope(), None )
		view["editScope"].setInput( editScope["out"] )
		self.assertEqual( view.editScope(), editScope )
예제 #11
0
	def testAcquireTransformEdit( self ) :

		plane = GafferScene.Plane()

		selection = GafferSceneUI.TransformTool.Selection( plane["out"], "/plane", Gaffer.Context(), None )
		edit = selection.acquireTransformEdit()
		self.assertEqual( edit.translate, plane["transform"]["translate"] )
		self.assertEqual( edit.rotate, plane["transform"]["rotate"] )
		self.assertEqual( edit.scale, plane["transform"]["scale"] )
		self.assertEqual( edit.pivot, plane["transform"]["pivot"] )

		editScope = Gaffer.EditScope()
		editScope.setup( plane["out"] )
		editScope["in"].setInput( plane["out"] )

		selection = GafferSceneUI.TransformTool.Selection( editScope["out"], "/plane", Gaffer.Context(), editScope )
		self.assertIsNone( selection.acquireTransformEdit( createIfNecessary = False ) )
		edit = selection.acquireTransformEdit()
		self.assertTrue( editScope.isAncestorOf( edit.translate ) )

		# Check readOnly is respected

		plane["name"].setValue( "plane2" )

		Gaffer.MetadataAlgo.setReadOnly( plane["transform"]["translate"], True )

		# We still allow 'editing' of existing plugs, but the handles should take care of disabling themselves.
		selection = GafferSceneUI.TransformTool.Selection( plane["out"], "/plane2", Gaffer.Context(), None )
		self.assertTrue( selection.editable() )
		self.assertEqual( selection.warning(), "\"Plane.transform.translate\" is locked" )

		Gaffer.MetadataAlgo.setReadOnly( editScope, True )

		selection = GafferSceneUI.TransformTool.Selection( editScope["out"], "/plane2", Gaffer.Context(), editScope )
		self.assertFalse( selection.editable() )
		self.assertEqual( selection.warning(), "\"EditScope\" is locked" )
		with six.assertRaisesRegex( self, RuntimeError, "Selection is not editable" ) :
			self.assertIsNone( selection.acquireTransformEdit() )

		Gaffer.MetadataAlgo.setReadOnly( editScope, False )

		selection = GafferSceneUI.TransformTool.Selection( editScope["out"], "/plane2", Gaffer.Context(), editScope )
		edit = selection.acquireTransformEdit()

		Gaffer.MetadataAlgo.setReadOnly( edit.translate.ancestor( Gaffer.Spreadsheet.RowsPlug ).source(), True  )

		plane["name"].setValue( "plane3" )

		selection = GafferSceneUI.TransformTool.Selection( editScope["out"], "/plane3", Gaffer.Context(), editScope )
		self.assertFalse( selection.editable() )
		self.assertEqual( selection.warning(), "\"EditScope.TransformEdits.edits\" is locked" )
		with six.assertRaisesRegex( self, RuntimeError, "Selection is not editable" ) :
			self.assertIsNone( selection.acquireTransformEdit() )
예제 #12
0
    def testProcessors(self):

        e = Gaffer.EditScope()
        e.setup(Gaffer.IntPlug())
        self.assertEqual(e.processors(), [])

        p = e.acquireProcessor("Test")
        self.assertEqual(e.processors(), [p])

        # Remove processor from the main stream but keep it in the
        # EditScope. It should no longer be returned by `processors()`.
        p["out"].outputs()[0].setInput(p["in"].getInput())
        self.assertEqual(e.processors(), [])
예제 #13
0
    def testEditScopeNesting(self):

        light = GafferSceneTest.TestLight()
        editScope1 = Gaffer.EditScope("EditScope1")

        editScope1.setup(light["out"])
        editScope1["in"].setInput(light["out"])

        def inspector(scene, path, parameter, editScope, attribute="light"):

            history = GafferScene.SceneAlgo.history(scene["attributes"], path)
            attributeHistory = GafferScene.SceneAlgo.attributeHistory(
                history, attribute)
            return GafferSceneUI.SceneViewUI._ParameterInspector(
                attributeHistory, parameter, editScope)

        i = inspector(editScope1["out"], "/light", "intensity", editScope1)
        scope1Edit = i.acquireEdit()
        scope1Edit["enabled"].setValue(True)
        self.assertEqual(scope1Edit.ancestor(Gaffer.EditScope), editScope1)

        editScope2 = Gaffer.EditScope("EditScope2")
        editScope2.setup(light["out"])
        editScope1.addChild(editScope2)
        editScope2["in"].setInput(
            scope1Edit.ancestor(GafferScene.SceneProcessor)["out"])
        editScope1["BoxOut"]["in"].setInput(editScope2["out"])

        i = inspector(editScope1["out"], "/light", "intensity", editScope2)
        scope2Edit = i.acquireEdit()
        scope2Edit["enabled"].setValue(True)
        self.assertEqual(scope2Edit.ancestor(Gaffer.EditScope), editScope2)

        # Check we still find the edit in scope 1

        i = inspector(editScope1["out"], "/light", "intensity", editScope1)
        self.assertEqual(i.acquireEdit().ancestor(Gaffer.EditScope),
                         editScope1)
예제 #14
0
	def testParentAndChildInSameEditScope( self ) :

		script = Gaffer.ScriptNode()

		script["cube"] = GafferScene.Cube()
		script["cube"]["transform"]["translate"].setValue( imath.V3f( 0, 1, 0 ) )

		script["group"] = GafferScene.Group()
		script["group"]["in"][0].setInput( script["cube"]["out"] )

		script["editScope"] = Gaffer.EditScope()
		script["editScope"].setup( script["group"]["out"] )
		script["editScope"]["in"].setInput( script["group"]["out"] )

		view = GafferSceneUI.SceneView()
		view["in"].setInput( script["editScope"]["out"] )
		view["editScope"].setInput( script["editScope"]["out"] )

		groupTransformEdit = GafferScene.EditScopeAlgo.acquireTransformEdit( script["editScope"], "/group" )
		groupTransformEdit.rotate["y"].setValue( 90 )

		GafferSceneUI.ContextAlgo.setSelectedPaths( view.getContext(), IECore.PathMatcher( [ "/group/cube" ] ) )

		tool = GafferSceneUI.TranslateTool( view )
		tool["active"].setValue( True )

		self.assertTrue(
			tool.handlesTransform().equalWithAbsError(
				groupTransformEdit.matrix() * imath.M44f().translate( imath.V3f( 0, 1, 0 ) ),
				0.00001
			)
		)

		tool.translate( imath.V3f( 1, 0, 0 ) )

		self.assertTrue(
			script["editScope"]["out"].fullTransform( "/group/cube" ).equalWithAbsError(
				imath.M44f().translate( imath.V3f( 1, 1, 0 ) ) * groupTransformEdit.matrix(),
				0.00001
			)
		)

		tool.translate( imath.V3f( 1, 0, 0 ) )

		self.assertTrue(
			script["editScope"]["out"].fullTransform( "/group/cube" ).equalWithAbsError(
				imath.M44f().translate( imath.V3f( 2, 1, 0 ) ) * groupTransformEdit.matrix(),
				0.00001
			)
		)
예제 #15
0
	def testTransformProcessorNotCreatedPrematurely( self ) :

		plane = GafferScene.Plane()
		plane["transform"]["translate"].setValue( imath.V3f( 1, 0, 0 ) )

		editScope = Gaffer.EditScope()
		editScope.setup( plane["out"] )
		editScope["in"].setInput( plane["out"] )

		self.assertFalse( "TransformEdits" in editScope )
		GafferScene.EditScopeAlgo.acquireTransformEdit( editScope, "/plane", createIfNecessary = False )
		self.assertFalse( "TransformEdits" in editScope )
		GafferScene.EditScopeAlgo.acquireTransformEdit( editScope, "/plane" )
		self.assertTrue( "TransformEdits" in editScope )
예제 #16
0
    def testEditScopes(self):

        script = Gaffer.ScriptNode()
        script["camera"] = GafferScene.Camera()

        script["editScope"] = Gaffer.EditScope()
        script["editScope"].setup(script["camera"]["out"])
        script["editScope"]["in"].setInput(script["camera"]["out"])

        view = GafferSceneUI.SceneView()
        view["in"].setInput(script["editScope"]["out"])

        view["camera"]["lookThroughEnabled"].setValue(True)
        view["camera"]["lookThroughCamera"].setValue("/camera")

        tool = GafferSceneUI.CameraTool(view)
        tool["active"].setValue(True)

        script["camera"]["transform"]["translate"].setValue(imath.V3f(1, 2, 3))
        script["camera"]["transform"]["rotate"].setValue(imath.V3f(1, 2, 3))

        # Without EditScope, should edit Camera node directly.

        cameraTransform = imath.M44f().translate(imath.V3f(10, 5, 1)).rotate(
            imath.V3f(math.pi / 4))
        view.viewportGadget().setCameraTransform(cameraTransform)

        self.assertFalse(
            GafferScene.EditScopeAlgo.hasTransformEdit(script["editScope"],
                                                       "/camera"))
        self.assertTrue(
            script["camera"]["out"].transform("/camera").equalWithAbsError(
                cameraTransform, 0.00001), )

        # With EditScope

        view["editScope"].setInput(script["editScope"]["out"])

        cameraTransform.translate(imath.V3f(1, 2, 3))
        view.viewportGadget().setCameraTransform(cameraTransform)

        self.assertTrue(
            GafferScene.EditScopeAlgo.hasTransformEdit(script["editScope"],
                                                       "/camera"))
        self.assertTrue(
            script["editScope"]["out"].transform("/camera").equalWithAbsError(
                cameraTransform, 0.00001), )
        self.assertTrue(
            GafferScene.EditScopeAlgo.hasTransformEdit(script["editScope"],
                                                       "/camera"))
예제 #17
0
	def testPruningSerialisation( self ) :

		s = Gaffer.ScriptNode()

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

		s["editScope"] = Gaffer.EditScope()
		s["editScope"].setup( s["plane"]["out"] )

		GafferScene.EditScopeAlgo.setPruned( s["editScope"], "/plane", True )
		self.assertTrue( GafferScene.EditScopeAlgo.getPruned( s["editScope"], "/plane" ), True )

		s2 = Gaffer.ScriptNode()
		s2.execute( s.serialise() )

		self.assertTrue( GafferScene.EditScopeAlgo.getPruned( s2["editScope"], "/plane" ), True )
예제 #18
0
    def testSetup(self):

        e = Gaffer.EditScope()
        self.assertNotIn("in", e)
        self.assertNotIn("out", e)

        e.setup(Gaffer.IntPlug())

        self.assertIn("in", e)
        self.assertIn("out", e)

        self.assertIsInstance(e["in"], Gaffer.IntPlug)
        self.assertIsInstance(e["out"], Gaffer.IntPlug)
        self.assertEqual(e["out"].source(), e["in"])

        self.assertEqual(e.correspondingInput(e["out"]), e["in"])
예제 #19
0
    def testBrokenInternalConnection(self):

        e = Gaffer.EditScope()
        e.setup(Gaffer.IntPlug())

        p = e.acquireProcessor("Test")
        self.assertEqual(e.processors(), [p])

        p["in"].setInput(None)
        with six.assertRaisesRegex(self, RuntimeError,
                                   "Output not linked to input"):
            e.processors()

        with six.assertRaisesRegex(self, RuntimeError,
                                   "Output not linked to input"):
            e.acquireProcessor("Test")
예제 #20
0
	def testSerialisation( self ) :

		s = Gaffer.ScriptNode()
		s["e"] = Gaffer.EditScope()
		s["e"].setup( Gaffer.IntPlug() )
		p = s["e"].acquireProcessor( "Test" )
		p["variables"].addChild( Gaffer.NameValuePlug( "x", 10, flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic ) )

		s2 = Gaffer.ScriptNode()
		s2.execute( s.serialise() )
		p2 = s2["e"].acquireProcessor( "Test", createIfNecessary = False )
		self.assertIsNotNone( p2 )
		self.assertEqual( type( p2 ), type( p ) )
		self.assertEqual( p2["variables"][0]["name"].getValue(), p["variables"][0]["name"].getValue() )
		self.assertEqual( p2["variables"][0]["value"].getValue(), p["variables"][0]["value"].getValue() )
		self.assertEqual( s2["e"]["out"].getValue(), s["e"]["out"].getValue() )
예제 #21
0
    def testAnimationHotkeyWithEditScopes(self):

        script = Gaffer.ScriptNode()
        script["cube"] = GafferScene.Cube()

        script["editScope"] = Gaffer.EditScope()
        script["editScope"].setup(script["cube"]["out"])
        script["editScope"]["in"].setInput(script["cube"]["out"])

        view = GafferSceneUI.SceneView()
        view["in"].setInput(script["editScope"]["out"])
        view["editScope"].setInput(script["editScope"]["out"])

        GafferSceneUI.ContextAlgo.setSelectedPaths(
            view.getContext(), IECore.PathMatcher(["/cube"]))

        tool = GafferSceneUI.TranslateTool(view)
        tool["active"].setValue(True)

        for plug in Gaffer.FloatPlug.RecursiveRange(
                script["cube"]["transform"]):
            self.assertFalse(Gaffer.Animation.isAnimated(plug))
        self.assertFalse(
            GafferScene.EditScopeAlgo.hasTransformEdit(script["editScope"],
                                                       "/cube"))

        view.viewportGadget().keyPressSignal()(view.viewportGadget(),
                                               GafferUI.KeyEvent("S"))

        for plug in Gaffer.FloatPlug.RecursiveRange(
                script["cube"]["transform"]):
            self.assertFalse(Gaffer.Animation.isAnimated(plug))
        self.assertTrue(
            GafferScene.EditScopeAlgo.hasTransformEdit(script["editScope"],
                                                       "/cube"))
        edit = GafferScene.EditScopeAlgo.acquireTransformEdit(
            script["editScope"], "/cube")
        for vectorPlug in (edit.translate, edit.rotate, edit.scale,
                           edit.pivot):
            for plug in vectorPlug:
                self.assertTrue(Gaffer.Animation.isAnimated(plug))

        tool.translate(imath.V3f(1, 0, 0))
        self.assertEqual(script["editScope"]["out"].transform("/cube"),
                         imath.M44f().translate(imath.V3f(1, 0, 0)))
예제 #22
0
    def testTransformInEditScopeButEditScopeOff(self):

        # Create an EditScope with an edit in it

        script = Gaffer.ScriptNode()

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

        script["editScope"] = Gaffer.EditScope()
        script["editScope"].setup(script["sphere"]["out"])
        script["editScope"]["in"].setInput(script["sphere"]["out"])

        transformEdit = GafferScene.EditScopeAlgo.acquireTransformEdit(
            script["editScope"], "/sphere")
        transformEdit.translate.setValue(imath.V3f(1, 0, 0))

        view = GafferSceneUI.SceneView()
        view["in"].setInput(script["editScope"]["out"])

        GafferSceneUI.ContextAlgo.setSelectedPaths(
            view.getContext(), IECore.PathMatcher(["/sphere"]))

        # We want the TranslateTool to pick up and use that edit
        # even if we haven't told it to use that EditScope.

        tool = GafferSceneUI.TranslateTool(view)
        tool["active"].setValue(True)

        self.assertEqual(tool.handlesTransform(),
                         imath.M44f().translate(imath.V3f(1, 0, 0)))
        self.assertEqual(len(tool.selection()), 1)
        self.assertTrue(tool.selectionEditable())
        self.assertTrue(tool.selection()[0].editable())
        self.assertEqual(
            tool.selection()[0].acquireTransformEdit(createIfNecessary=False),
            transformEdit)
        self.assertEqual(
            tool.selection()[0].editTarget(),
            transformEdit.translate.ancestor(Gaffer.Spreadsheet.RowPlug))

        tool.translate(imath.V3f(0, 1, 0))
        self.assertEqual(tool.handlesTransform(),
                         imath.M44f().translate(imath.V3f(1, 1, 0)))
        self.assertEqual(transformEdit.translate.getValue(),
                         imath.V3f(1, 1, 0))
예제 #23
0
	def testProcessorRegistry( self ) :

		self.assertIn( "Test", Gaffer.EditScope.registeredProcessors() )

		def createProcessor() :

			n = Gaffer.TimeWarp()
			n.setup( Gaffer.IntPlug() )
			return n

		Gaffer.EditScope.registerProcessor( "Test", createProcessor )
		self.assertEqual( Gaffer.EditScope.registeredProcessors().count( "Test" ), 1 )

		e = Gaffer.EditScope()
		e.setup( Gaffer.IntPlug() )
		self.assertIsInstance( e.acquireProcessor( "Test" ), Gaffer.TimeWarp )

		Gaffer.EditScope.deregisterProcessor( "Test" )
		self.assertEqual( Gaffer.EditScope.registeredProcessors().count( "Test" ), 0 )
예제 #24
0
	def testPruning( self ) :

		plane = GafferScene.Plane()
		cube = GafferScene.Cube()
		group = GafferScene.Group()

		group["in"][0].setInput( plane["out"] )
		group["in"][1].setInput( cube["out"] )

		scope = Gaffer.EditScope()
		scope.setup( group["out"] )
		scope["in"].setInput( group["out"] )

		self.assertEqual( len( list( GafferScene.SceneProcessor.Range( scope ) ) ), 0 )
		self.assertFalse( GafferScene.EditScopeAlgo.getPruned( scope, "/group/plane" ) )
		self.assertFalse( GafferScene.EditScopeAlgo.getPruned( scope, "/group/cube" ) )
		self.assertEqual( len( list( GafferScene.SceneProcessor.Range( scope ) ) ), 0 )
		self.assertTrue( GafferScene.SceneAlgo.exists( scope["out"], "/group/plane" ) )
		self.assertTrue( GafferScene.SceneAlgo.exists( scope["out"], "/group/cube" ) )

		GafferScene.EditScopeAlgo.setPruned( scope, "/group/plane", True )
		self.assertTrue( GafferScene.EditScopeAlgo.getPruned( scope, "/group/plane" ) )
		self.assertFalse( GafferScene.EditScopeAlgo.getPruned( scope, "/group/cube" ) )
		self.assertEqual( len( list( GafferScene.SceneProcessor.Range( scope ) ) ), 1 )
		self.assertEqual( scope["PruningEdits"]["paths"].getValue(), IECore.StringVectorData( [ "/group/plane" ] ) )
		self.assertFalse( GafferScene.SceneAlgo.exists( scope["out"], "/group/plane" ) )
		self.assertTrue( GafferScene.SceneAlgo.exists( scope["out"], "/group/cube" ) )

		GafferScene.EditScopeAlgo.setPruned( scope, IECore.PathMatcher( [ "/group/plane", "/group/cube" ] ), True )
		self.assertTrue( GafferScene.EditScopeAlgo.getPruned( scope, "/group/plane" ) )
		self.assertTrue( GafferScene.EditScopeAlgo.getPruned( scope, "/group/cube" ) )
		self.assertEqual( len( list( GafferScene.SceneProcessor.Range( scope ) ) ), 1 )
		self.assertEqual( scope["PruningEdits"]["paths"].getValue(), IECore.StringVectorData( [ "/group/cube", "/group/plane" ] ) )
		self.assertFalse( GafferScene.SceneAlgo.exists( scope["out"], "/group/plane" ) )
		self.assertFalse( GafferScene.SceneAlgo.exists( scope["out"], "/group/cube" ) )

		GafferScene.EditScopeAlgo.setPruned( scope, IECore.PathMatcher( [ "/group/plane", "/group/cube" ] ), False )
		self.assertFalse( GafferScene.EditScopeAlgo.getPruned( scope, "/group/plane" ) )
		self.assertFalse( GafferScene.EditScopeAlgo.getPruned( scope, "/group/cube" ) )
		self.assertEqual( len( list( GafferScene.SceneProcessor.Range( scope ) ) ), 1 )
		self.assertEqual( scope["PruningEdits"]["paths"].getValue(), IECore.StringVectorData() )
		self.assertTrue( GafferScene.SceneAlgo.exists( scope["out"], "/group/plane" ) )
		self.assertTrue( GafferScene.SceneAlgo.exists( scope["out"], "/group/cube" ) )
예제 #25
0
	def testAcquireTransformEdit( self ) :

		plane = GafferScene.Plane()

		selection = GafferSceneUI.TransformTool.Selection( plane["out"], "/plane", Gaffer.Context(), None )
		edit = selection.acquireTransformEdit()
		self.assertEqual( edit.translate, plane["transform"]["translate"] )
		self.assertEqual( edit.rotate, plane["transform"]["rotate"] )
		self.assertEqual( edit.scale, plane["transform"]["scale"] )
		self.assertEqual( edit.pivot, plane["transform"]["pivot"] )

		editScope = Gaffer.EditScope()
		editScope.setup( plane["out"] )
		editScope["in"].setInput( plane["out"] )

		selection = GafferSceneUI.TransformTool.Selection( editScope["out"], "/plane", Gaffer.Context(), editScope )
		self.assertIsNone( selection.acquireTransformEdit( createIfNecessary = False ) )
		edit = selection.acquireTransformEdit()
		self.assertTrue( editScope.isAncestorOf( edit.translate ) )
예제 #26
0
	def testParameterEdits( self ) :

		light = GafferSceneTest.TestLight()

		editScope = Gaffer.EditScope()
		editScope.setup( light["out"] )
		editScope["in"].setInput( light["out"] )
		self.assertEqual(
			editScope["out"].attributes( "/light" )["light"].outputShader().parameters["intensity"].value,
			imath.Color3f( 0 )
		)

		self.assertFalse( GafferScene.EditScopeAlgo.hasParameterEdit( editScope, "/light", "light", ( "", "intensity" ) ) )
		self.assertIsNone( GafferScene.EditScopeAlgo.acquireParameterEdit( editScope, "/light", "light", ( "", "intensity" ), createIfNecessary = False ) )

		edit = GafferScene.EditScopeAlgo.acquireParameterEdit( editScope, "/light", "light", ( "", "intensity" ) )
		self.assertIsInstance( edit, GafferScene.TweakPlug )
		self.assertIsInstance( edit["value"], Gaffer.Color3fPlug )
		self.assertEqual( edit["mode"].getValue(), GafferScene.TweakPlug.Mode.Replace )
		self.assertEqual( edit["value"].getValue(), imath.Color3f( 0 ) )
		self.assertEqual( edit["enabled"].getValue(), False )

		edit["enabled"].setValue( True )
		edit["value"].setValue( imath.Color3f( 1 ) )
		self.assertEqual(
			editScope["out"].attributes( "/light" )["light"].outputShader().parameters["intensity"].value,
			imath.Color3f( 1 )
		)

		self.assertEqual(
			GafferScene.EditScopeAlgo.acquireParameterEdit( editScope, "/light", "light", ( "", "intensity" ) ),
			edit
		)

		light["parameters"]["intensity"].setValue( imath.Color3f( 0.5 ) )
		edit["enabled"].setValue( False )
		self.assertEqual(
			editScope["out"].attributes( "/light" )["light"].outputShader().parameters["intensity"].value,
			imath.Color3f( 0.5 )
		)

		self.assertIsNone( GafferScene.EditScopeAlgo.acquireParameterEdit( editScope, "/light", "light", ( "", "__areaLight" ), createIfNecessary = False ) )
예제 #27
0
	def testParameterEditSerialisation( self ) :

		script = Gaffer.ScriptNode()

		script["light1"] = GafferSceneTest.TestLight()
		script["light1"]["name"].setValue( "light1" )
		script["light2"] = GafferSceneTest.TestLight()
		script["light2"]["name"].setValue( "light2" )

		script["group"] = GafferScene.Group()
		script["group"]["in"][0].setInput( script["light1"]["out"] )
		script["group"]["in"][1].setInput( script["light2"]["out"] )

		script["editScope"] = Gaffer.EditScope()
		script["editScope"].setup( script["group"]["out"] )
		script["editScope"]["in"].setInput( script["group"]["out"] )

		edit1 = GafferScene.EditScopeAlgo.acquireParameterEdit( script["editScope"], "/group/light1", "light", ( "", "intensity" ) )
		edit1["enabled"].setValue( True )
		edit1["value"].setValue( imath.Color3f( 1, 2, 3 ) )

		edit2 = GafferScene.EditScopeAlgo.acquireParameterEdit( script["editScope"], "/group/light2", "light", ( "", "__areaLight" ) )
		edit2["enabled"].setValue( True )
		edit2["value"].setValue( True )

		script2 = Gaffer.ScriptNode()
		script2.execute( script.serialise() )

		self.assertScenesEqual( script2["editScope"]["out"], script["editScope"]["out"] )

		for path, parameter, enabled, value in [
			( "/group/light1", "intensity", True, imath.Color3f( 1, 2, 3 ) ),
			( "/group/light1", "__areaLight", False, False ),
			( "/group/light2", "intensity", False, imath.Color3f( 0 ) ),
			( "/group/light2", "__areaLight", True, True ),
		] :

			edit = GafferScene.EditScopeAlgo.acquireParameterEdit( script2["editScope"], path, "light", ( "", parameter ), createIfNecessary = False )
			self.assertIsNotNone( edit )
			self.assertEqual( edit["enabled"].getValue(), enabled )
			self.assertEqual( edit["value"].getValue(), value )
예제 #28
0
    def testTransformPerformance(self):

        plane = GafferScene.Plane()
        plane["divisions"].setValue(imath.V2i(100, 10))

        cube = GafferScene.Cube()

        planeFilter = GafferScene.PathFilter()
        planeFilter["paths"].setValue(IECore.StringVectorData(["/plane"]))

        instancer = GafferScene.Instancer()
        instancer["in"].setInput(plane["out"])
        instancer["prototypes"].setInput(cube["out"])
        instancer["filter"].setInput(planeFilter["out"])

        editScope = Gaffer.EditScope()
        editScope.setup(instancer["out"])
        editScope["in"].setInput(instancer["out"])

        for name in instancer["out"].childNames("/plane/instances/cube"):
            GafferScene.EditScopeAlgo.acquireTransformEdit(
                editScope, "/plane/instances/cube/{}".format(name))
예제 #29
0
	def testParameterEditExceptions( self ) :

		light = GafferSceneTest.TestLight()
		editScope = Gaffer.EditScope()
		editScope.setup( light["out"] )
		editScope["in"].setInput( light["out"] )
		emptyKeys = editScope.keys()

		with six.assertRaisesRegex( self, RuntimeError, 'Location "/bogus" does not exist' ) :
			GafferScene.EditScopeAlgo.acquireParameterEdit( editScope, "/bogus", "light", ( "", "intensity" ) )
		self.assertEqual( editScope.keys(), emptyKeys )

		with six.assertRaisesRegex( self, RuntimeError, 'Attribute "bogus" does not exist' ) :
			GafferScene.EditScopeAlgo.acquireParameterEdit( editScope, "/light", "bogus", ( "", "intensity" ) )
		self.assertEqual( editScope.keys(), emptyKeys )

		with six.assertRaisesRegex( self, RuntimeError, 'Shader "bogus" does not exist' ) :
			GafferScene.EditScopeAlgo.acquireParameterEdit( editScope, "/light", "light", ( "bogus", "intensity" ) )
		self.assertEqual( editScope.keys(), emptyKeys )

		with six.assertRaisesRegex( self, RuntimeError, 'Parameter "bogus" does not exist' ) :
			GafferScene.EditScopeAlgo.acquireParameterEdit( editScope, "/light", "light", ( "", "bogus" ) )
		self.assertEqual( editScope.keys(), emptyKeys )
예제 #30
0
    def testAcquireProcessor(self):

        e = Gaffer.EditScope()
        e.setup(Gaffer.IntPlug())

        self.assertIsNone(e.acquireProcessor("Test", createIfNecessary=False))
        p = e.acquireProcessor("Test")
        self.assertIsInstance(p, Gaffer.ContextVariables)
        self.assertEqual(e["out"].source(), p["out"])
        self.assertEqual(p["in"].source(), e["in"])

        self.assertEqual(p, e.acquireProcessor("Test"))

        # Remove processor from the main stream but keep it in the
        # EditScope. A new processor should be made for us by
        # `acquireProcessor()`.
        p["out"].outputs()[0].setInput(p["in"].getInput())
        self.assertIsNone(e.acquireProcessor("Test", createIfNecessary=False))
        p2 = e.acquireProcessor("Test")
        self.assertNotEqual(p, p2)
        self.assertIsInstance(p2, Gaffer.ContextVariables)
        self.assertEqual(e["out"].source(), p2["out"])
        self.assertEqual(p2["in"].source(), e["in"])