def testMotion( self ) : c1 = IECore.CurvesPrimitive( IECore.IntVectorData( [ 4 ] ) ) c2 = IECore.CurvesPrimitive( IECore.IntVectorData( [ 4 ] ) ) c1["P"] = IECore.PrimitiveVariable( IECore.PrimitiveVariable.Interpolation.Vertex, IECore.V3fVectorData( [ IECore.V3f( 1 ) ] * 4 ), ) c2["P"] = IECore.PrimitiveVariable( IECore.PrimitiveVariable.Interpolation.Vertex, IECore.V3fVectorData( [ IECore.V3f( 2 ) ] * 4 ), ) with IECoreArnold.UniverseBlock() : n = IECoreArnold.NodeAlgo.convert( [ c1, c2 ], [ -0.25, 0.25 ] ) a = arnold.AiNodeGetArray( n, "points" ) self.assertEqual( a.contents.nelements, 4 ) self.assertEqual( a.contents.nkeys, 2 ) for i in range( 0, 4 ) : self.assertEqual( arnold.AiArrayGetPnt( a, i ), arnold.AtPoint( 1 ) ) for i in range( 4, 8 ) : self.assertEqual( arnold.AiArrayGetPnt( a, i ), arnold.AtPoint( 2 ) ) a = arnold.AiNodeGetArray( n, "deform_time_samples" ) self.assertEqual( a.contents.nelements, 2 ) self.assertEqual( a.contents.nkeys, 1 ) self.assertEqual( arnold.AiArrayGetFlt( a, 0 ), -0.25 ) self.assertEqual( arnold.AiArrayGetFlt( a, 1 ), 0.25 )
def testMotion( self ) : p1 = IECoreScene.PointsPrimitive( IECore.V3fVectorData( [ imath.V3f( 10 ) ] * 10 ) ) p1["width"] = IECoreScene.PrimitiveVariable( IECoreScene.PrimitiveVariable.Interpolation.Vertex, IECore.FloatVectorData( [ 1 ] * 10 ), ) p2 = IECoreScene.PointsPrimitive( IECore.V3fVectorData( [ imath.V3f( 20 ) ] * 10 ) ) p2["width"] = IECoreScene.PrimitiveVariable( IECoreScene.PrimitiveVariable.Interpolation.Vertex, IECore.FloatVectorData( [ 2 ] * 10 ), ) with IECoreArnold.UniverseBlock( writable = True ) : n = IECoreArnold.NodeAlgo.convert( [ p1, p2 ], -0.25, 0.25, "testPoints" ) a = arnold.AiNodeGetArray( n, "points" ) self.assertEqual( arnold.AiArrayGetNumElements( a.contents ), 10 ) self.assertEqual( arnold.AiArrayGetNumKeys( a.contents ), 2 ) r = arnold.AiNodeGetArray( n, "radius" ) self.assertEqual( arnold.AiArrayGetNumElements( r.contents ), 10 ) self.assertEqual( arnold.AiArrayGetNumKeys( r.contents ), 2 ) for i in range( 0, 10 ) : self.assertEqual( arnold.AiArrayGetVec( a, i ), arnold.AtVector( 10 ) ) self.assertEqual( arnold.AiArrayGetFlt( r, i ), 0.5 ) for i in range( 11, 20 ) : self.assertEqual( arnold.AiArrayGetVec( a, i ), arnold.AtVector( 20 ) ) self.assertEqual( arnold.AiArrayGetFlt( r, i ), 1 ) self.assertEqual( arnold.AiNodeGetFlt( n, "motion_start" ), -0.25 ) self.assertEqual( arnold.AiNodeGetFlt( n, "motion_end" ), 0.25 )
def testConvertWithMotion( self ) : s = [ IECore.SpherePrimitive( 0.25 ), IECore.SpherePrimitive( 0.5 ) ] with IECoreArnold.UniverseBlock( writable = True ) : n = IECoreArnold.NodeAlgo.convert( s, 0, 1, "testSphere" ) self.assertEqual( arnold.AiNodeEntryGetName( arnold.AiNodeGetNodeEntry( n ) ), "sphere" ) a = arnold.AiNodeGetArray( n, "radius" ) self.assertEqual( arnold.AiArrayGetFlt( a, 0 ), 0.25 ) self.assertEqual( arnold.AiArrayGetFlt( a, 1 ), 0.5 ) self.assertEqual( arnold.AiNodeGetFlt( n, "motion_start" ), 0 ) self.assertEqual( arnold.AiNodeGetFlt( n, "motion_end" ), 1 )
def testIndexedUniformPrimitiveVariables(self): # We expect uniform indexed variables to be expanded out fully # when converting to Arnold, because Arnold only supports indexing # for FaceVarying variables. m = IECoreScene.MeshPrimitive.createPlane( imath.Box2f(imath.V2f(-1), imath.V2f(1)), imath.V2i(4, 1), ) self.assertEqual( m.variableSize( IECoreScene.PrimitiveVariable.Interpolation.Uniform), 4) m["myPrimVar"] = IECoreScene.PrimitiveVariable( IECoreScene.PrimitiveVariable.Interpolation.Uniform, IECore.FloatVectorData([5, 10]), IECore.IntVectorData([0, 1, 0, 1])) with IECoreArnold.UniverseBlock(writable=True) as universe: n = IECoreArnold.NodeAlgo.convert(m, universe, "testMesh") self.assertEqual( arnold.AiNodeLookUpUserParameter(n, "myPrimVaridxs"), None) a = arnold.AiNodeGetArray(n, "myPrimVar") self.assertEqual(arnold.AiArrayGetNumElements(a.contents), 4) for i in range(0, 4): self.assertEqual( arnold.AiArrayGetFlt(a, i), m["myPrimVar"].data[m["myPrimVar"].indices[i]])
def testIndexedFaceVaryingPrimitiveVariables(self): m = IECoreScene.MeshPrimitive.createPlane( imath.Box2f(imath.V2f(-1), imath.V2f(1)), imath.V2i(2, 1), ) self.assertEqual( m.variableSize( IECoreScene.PrimitiveVariable.Interpolation.FaceVarying), 8) m["myPrimVar"] = IECoreScene.PrimitiveVariable( IECoreScene.PrimitiveVariable.Interpolation.FaceVarying, IECore.FloatVectorData([5, 10]), IECore.IntVectorData([0, 0, 0, 0, 1, 1, 1, 1])) with IECoreArnold.UniverseBlock(writable=True) as universe: n = IECoreArnold.NodeAlgo.convert(m, universe, "testMesh") a = arnold.AiNodeGetArray(n, "myPrimVar") ia = arnold.AiNodeGetArray(n, "myPrimVaridxs") self.assertEqual(arnold.AiArrayGetNumElements(a.contents), 2) self.assertEqual(arnold.AiArrayGetNumElements(ia.contents), 8) for i in range(0, len(m["myPrimVar"].data)): self.assertEqual(arnold.AiArrayGetFlt(a, i), m["myPrimVar"].data[i]) for i in range(0, len(m["myPrimVar"].indices)): self.assertEqual(arnold.AiArrayGetUInt(ia, i), m["myPrimVar"].indices[i])
def testConvertWithMotion( self ) : s = [ IECore.SpherePrimitive( 0.25 ), IECore.SpherePrimitive( 0.5 ) ] with IECoreArnold.UniverseBlock() : n = IECoreArnold.NodeAlgo.convert( s, [ 0, 1 ] ) self.assertEqual( arnold.AiNodeEntryGetName( arnold.AiNodeGetNodeEntry( n ) ), "sphere" ) a = arnold.AiNodeGetArray( n, "radius" ) self.assertEqual( arnold.AiArrayGetFlt( a, 0 ), 0.25 ) self.assertEqual( arnold.AiArrayGetFlt( a, 1 ), 0.5 ) a = arnold.AiNodeGetArray( n, "deform_time_samples" ) self.assertEqual( arnold.AiArrayGetFlt( a, 0 ), 0 ) self.assertEqual( arnold.AiArrayGetFlt( a, 1 ), 1 )
def testMotion(self): p1 = IECore.PointsPrimitive(IECore.V3fVectorData([IECore.V3f(10)] * 10)) p1["width"] = IECore.PrimitiveVariable( IECore.PrimitiveVariable.Interpolation.Vertex, IECore.FloatVectorData([1] * 10), ) p2 = IECore.PointsPrimitive(IECore.V3fVectorData([IECore.V3f(20)] * 10)) p2["width"] = IECore.PrimitiveVariable( IECore.PrimitiveVariable.Interpolation.Vertex, IECore.FloatVectorData([2] * 10), ) with IECoreArnold.UniverseBlock(writable=True): n = IECoreArnold.NodeAlgo.convert([p1, p2], [-0.25, 0.25]) a = arnold.AiNodeGetArray(n, "points") self.assertEqual(a.contents.nelements, 10) self.assertEqual(a.contents.nkeys, 2) r = arnold.AiNodeGetArray(n, "radius") self.assertEqual(a.contents.nelements, 10) self.assertEqual(a.contents.nkeys, 2) for i in range(0, 10): self.assertEqual(arnold.AiArrayGetPnt(a, i), arnold.AtPoint(10)) self.assertEqual(arnold.AiArrayGetFlt(r, i), 0.5) for i in range(11, 20): self.assertEqual(arnold.AiArrayGetPnt(a, i), arnold.AtPoint(20)) self.assertEqual(arnold.AiArrayGetFlt(r, i), 1) a = arnold.AiNodeGetArray(n, "deform_time_samples") self.assertEqual(a.contents.nelements, 2) self.assertEqual(a.contents.nkeys, 1) self.assertEqual(arnold.AiArrayGetFlt(a, 0), -0.25) self.assertEqual(arnold.AiArrayGetFlt(a, 1), 0.25)
def testMotion(self): m1 = IECore.MeshPrimitive.createPlane( IECore.Box2f(IECore.V2f(-1), IECore.V2f(1))) IECore.MeshNormalsOp()(input=m1, copyInput=False) m2 = m1.copy() m2["P"].data[0] -= IECore.V3f(0, 0, 1) m2["P"].data[1] -= IECore.V3f(0, 0, 1) IECore.MeshNormalsOp()(input=m2, copyInput=False) with IECoreArnold.UniverseBlock(): node = IECoreArnold.NodeAlgo.convert([m1, m2], [-0.25, 0.25]) vList = arnold.AiNodeGetArray(node, "vlist") self.assertEqual(vList.contents.nelements, 4) self.assertEqual(vList.contents.nkeys, 2) nList = arnold.AiNodeGetArray(node, "nlist") self.assertEqual(nList.contents.nelements, 4) self.assertEqual(nList.contents.nkeys, 2) for i in range(0, 4): p = arnold.AiArrayGetPnt(vList, i) self.assertEqual(IECore.V3f(p.x, p.y, p.z), m1["P"].data[i]) n = arnold.AiArrayGetPnt(nList, i) self.assertEqual(IECore.V3f(n.x, n.y, n.z), m1["N"].data[i]) for i in range(4, 8): p = arnold.AiArrayGetPnt(vList, i) self.assertEqual(IECore.V3f(p.x, p.y, p.z), m2["P"].data[i - 4]) n = arnold.AiArrayGetPnt(nList, i) self.assertEqual(IECore.V3f(n.x, n.y, n.z), m2["N"].data[i - 4]) a = arnold.AiNodeGetArray(node, "deform_time_samples") self.assertEqual(a.contents.nelements, 2) self.assertEqual(a.contents.nkeys, 1) self.assertEqual(arnold.AiArrayGetFlt(a, 0), -0.25) self.assertEqual(arnold.AiArrayGetFlt(a, 1), 0.25)
def testVertexPrimitiveVariables(self): m = IECore.MeshPrimitive.createPlane( IECore.Box2f(IECore.V2f(-1), IECore.V2f(1))) m["myPrimVar"] = IECore.PrimitiveVariable( IECore.PrimitiveVariable.Interpolation.Vertex, IECore.FloatVectorData([0, 1, 2, 3])) with IECoreArnold.UniverseBlock(): n = IECoreArnold.ToArnoldMeshConverter(m).convert() a = arnold.AiNodeGetArray(n, "user:myPrimVar") self.assertEqual(a.contents.nelements, 4) for i in range(0, 4): self.assertEqual(arnold.AiArrayGetFlt(a, i), i)
def testVertexPrimitiveVariables(self): m = IECoreScene.MeshPrimitive.createPlane( imath.Box2f(imath.V2f(-1), imath.V2f(1))) m["myPrimVar"] = IECoreScene.PrimitiveVariable( IECoreScene.PrimitiveVariable.Interpolation.Vertex, IECore.FloatVectorData([0, 1, 2, 3])) m["myV3fPrimVar"] = IECoreScene.PrimitiveVariable( IECoreScene.PrimitiveVariable.Interpolation.Vertex, IECore.V3fVectorData([imath.V3f(v) for v in range(0, 4)])) with IECoreArnold.UniverseBlock(writable=True) as universe: n = IECoreArnold.NodeAlgo.convert(m, universe, "testMesh") a = arnold.AiNodeGetArray(n, "myPrimVar") v = arnold.AiNodeGetArray(n, "myV3fPrimVar") self.assertEqual(arnold.AiArrayGetNumElements(a.contents), 4) for i in range(0, 4): self.assertEqual(arnold.AiArrayGetFlt(a, i), i) self.assertEqual(arnold.AiArrayGetVec(v, i), i)
def testCornersAndCreases(self): m = IECoreScene.MeshPrimitive.createPlane( imath.Box2f(imath.V2f(-1), imath.V2f(1))) m.setInterpolation("catmullClark") m.setCorners(IECore.IntVectorData([3]), IECore.FloatVectorData([5])) m.setCreases(IECore.IntVectorData([3]), IECore.IntVectorData([0, 1, 2]), IECore.FloatVectorData([6])) with IECoreArnold.UniverseBlock(writable=True) as universe: n = IECoreArnold.NodeAlgo.convert(m, universe, "testMesh") idxArray = arnold.AiNodeGetArray(n, "crease_idxs") for i, v in enumerate([0, 1, 1, 2, 3, 3]): self.assertEqual(arnold.AiArrayGetUInt(idxArray, i), v) sharpnessArray = arnold.AiNodeGetArray(n, "crease_sharpness") for i, v in enumerate([6, 6, 5]): self.assertEqual(arnold.AiArrayGetFlt(sharpnessArray, i), v)
def testFaceVaryingPrimitiveVariables( self ) : m = IECore.MeshPrimitive.createPlane( IECore.Box2f( IECore.V2f( -1 ), IECore.V2f( 1 ) ), IECore.V2i( 2 ), ) self.assertEqual( m.variableSize( IECore.PrimitiveVariable.Interpolation.FaceVarying ), 16 ) m["myPrimVar"] = IECore.PrimitiveVariable( IECore.PrimitiveVariable.Interpolation.FaceVarying, IECore.FloatVectorData( range( 0, 16 ) ) ) with IECoreArnold.UniverseBlock( writable = True ) : n = IECoreArnold.NodeAlgo.convert( m ) a = arnold.AiNodeGetArray( n, "myPrimVar" ) ia = arnold.AiNodeGetArray( n, "myPrimVaridxs" ) self.assertEqual( a.contents.nelements, 16 ) self.assertEqual( ia.contents.nelements, 16 ) for i in range( 0, 16 ) : self.assertEqual( arnold.AiArrayGetFlt( a, i ), i ) self.assertEqual( arnold.AiArrayGetUInt( ia, i ), i )
def testConvertAnimatedParameters(self): with IECoreArnold.UniverseBlock(writable=True): samples = [] for i in range(0, 2): camera = IECoreScene.Camera() camera.setProjection("perspective") camera.setFocalLengthFromFieldOfView(45 * (i + 1)) camera.setAperture(imath.V2f(10, 10 + i)) camera.setFStop(i + 1) camera.setFocusDistance(i + 100) samples.append(camera) animatedNode = IECoreArnold.NodeAlgo.convert( samples, 1.0, 2.0, "samples") nodes = [ IECoreArnold.NodeAlgo.convert(samples[i], "sample{}".format(i)) for i, sample in enumerate(samples) ] self.assertEqual(arnold.AiNodeGetFlt(animatedNode, "motion_start"), 1.0) self.assertEqual(arnold.AiNodeGetFlt(animatedNode, "motion_start"), 1.0) for i, node in enumerate(nodes): animatedScreenWindowMin = arnold.AiArrayGetVec2( arnold.AiNodeGetArray(animatedNode, "screen_window_min"), i) animatedScreenWindowMax = arnold.AiArrayGetVec2( arnold.AiNodeGetArray(animatedNode, "screen_window_max"), i) self.assertEqual( animatedScreenWindowMin.x, arnold.AiNodeGetVec2(node, "screen_window_min").x) self.assertEqual( animatedScreenWindowMin.y, arnold.AiNodeGetVec2(node, "screen_window_min").y) self.assertEqual( animatedScreenWindowMax.x, arnold.AiNodeGetVec2(node, "screen_window_max").x) self.assertEqual( animatedScreenWindowMax.y, arnold.AiNodeGetVec2(node, "screen_window_max").y) self.assertEqual( arnold.AiArrayGetFlt( arnold.AiNodeGetArray(animatedNode, "fov"), i), arnold.AiNodeGetFlt(node, "fov")) self.assertEqual( arnold.AiArrayGetFlt( arnold.AiNodeGetArray(animatedNode, "aperture_size"), i), arnold.AiNodeGetFlt(node, "aperture_size")) self.assertEqual( arnold.AiArrayGetFlt( arnold.AiNodeGetArray(animatedNode, "focus_distance"), i), arnold.AiNodeGetFlt(node, "focus_distance")) for parameter in [ "screen_window_min", "screen_window_max", "fov", "aperture_size", "focus_distance", ]: array = arnold.AiNodeGetArray(animatedNode, "fov") self.assertEqual(arnold.AiArrayGetNumElements(array), 1) self.assertEqual(arnold.AiArrayGetNumKeys(array), 2)
def testVertexToVaryingConversion(self): c = IECoreScene.CurvesPrimitive(IECore.IntVectorData([2, 2]), IECore.CubicBasisf.linear()) c["P"] = IECoreScene.PrimitiveVariable( IECoreScene.PrimitiveVariable.Interpolation.Vertex, IECore.V3fVectorData([imath.V3f(x, 0, 0) for x in range(0, 4)])) c["width"] = IECoreScene.PrimitiveVariable( IECoreScene.PrimitiveVariable.Interpolation.Vertex, IECore.FloatVectorData([1] * 4), ) c["foo"] = IECoreScene.PrimitiveVariable( IECoreScene.PrimitiveVariable.Interpolation.Vertex, IECore.FloatVectorData([1.5] * 4)) self.assertTrue(c.arePrimitiveVariablesValid()) c2 = c.copy() c2["width"] = IECoreScene.PrimitiveVariable( IECoreScene.PrimitiveVariable.Interpolation.Vertex, IECore.FloatVectorData([2] * 4), ) self.assertTrue(c2.arePrimitiveVariablesValid()) c3 = IECoreScene.CurvesPrimitive(IECore.IntVectorData([8, 8]), IECore.CubicBasisf.bSpline()) c3["P"] = IECoreScene.PrimitiveVariable( IECoreScene.PrimitiveVariable.Interpolation.Vertex, IECore.V3fVectorData([ imath.V3f(0, 0, 0), imath.V3f(0, 0, 0), imath.V3f(0, 0, 0), imath.V3f(0, 0.75, 0), imath.V3f(0.25, 1, 0), imath.V3f(1, 1, 0), imath.V3f(1, 1, 0), imath.V3f(1, 1, 0), imath.V3f(0, 0, 1), imath.V3f(0, 0, 1), imath.V3f(0, 0, 1), imath.V3f(0, 0.75, 1), imath.V3f(0.25, 1, 1), imath.V3f(1, 1, 1), imath.V3f(1, 1, 1), imath.V3f(1, 1, 1) ]), ) c3["width"] = IECoreScene.PrimitiveVariable( IECoreScene.PrimitiveVariable.Interpolation.Vertex, IECore.FloatVectorData([1] * 16), ) c3["foo"] = IECoreScene.PrimitiveVariable( IECoreScene.PrimitiveVariable.Interpolation.Vertex, IECore.FloatVectorData([1.5] * 16)) self.assertTrue(c3.arePrimitiveVariablesValid()) c4 = c3.copy() c4["width"] = IECoreScene.PrimitiveVariable( IECoreScene.PrimitiveVariable.Interpolation.Vertex, IECore.FloatVectorData([2] * 16), ) self.assertTrue(c4.arePrimitiveVariablesValid()) with IECoreArnold.UniverseBlock(writable=True) as universe: n = IECoreArnold.NodeAlgo.convert(c, universe, "testLinearCurve") r = arnold.AiNodeGetArray(n, "radius") self.assertEqual(arnold.AiArrayGetNumElements(r.contents), 4) self.assertEqual(arnold.AiArrayGetNumKeys(r.contents), 1) foo = arnold.AiNodeGetArray(n, "foo") self.assertEqual(arnold.AiArrayGetNumElements(foo.contents), 4) self.assertEqual(arnold.AiArrayGetNumKeys(foo.contents), 1) for i in range(0, 4): self.assertEqual(arnold.AiArrayGetFlt(r, i), 0.5) self.assertEqual(arnold.AiArrayGetFlt(foo, i), 1.5) n2 = IECoreArnold.NodeAlgo.convert([c, c2], -0.25, 0.25, universe, "testLinearCurves") r2 = arnold.AiNodeGetArray(n2, "radius") self.assertEqual(arnold.AiArrayGetNumElements(r2.contents), 4) self.assertEqual(arnold.AiArrayGetNumKeys(r2.contents), 2) foo2 = arnold.AiNodeGetArray(n2, "foo") self.assertEqual(arnold.AiArrayGetNumElements(foo2.contents), 4) # arbitrary userdata is not sampled self.assertEqual(arnold.AiArrayGetNumKeys(foo2.contents), 1) for i in range(0, 4): self.assertEqual(arnold.AiArrayGetFlt(r2, i), 0.5) self.assertEqual(arnold.AiArrayGetFlt(foo2, i), 1.5) for i in range(4, 8): self.assertEqual(arnold.AiArrayGetFlt(r2, i), 1) # for cubic curves, radius will have been converted to Varying, so it will have fewer elements n3 = IECoreArnold.NodeAlgo.convert(c3, universe, "testBSplineCurve") r3 = arnold.AiNodeGetArray(n3, "radius") self.assertEqual(arnold.AiArrayGetNumElements(r3.contents), 12) self.assertEqual(arnold.AiArrayGetNumKeys(r3.contents), 1) foo3 = arnold.AiNodeGetArray(n3, "foo") self.assertEqual(arnold.AiArrayGetNumElements(foo3.contents), 12) self.assertEqual(arnold.AiArrayGetNumKeys(foo3.contents), 1) for i in range(0, 12): self.assertEqual(arnold.AiArrayGetFlt(r3, i), 0.5) self.assertEqual(arnold.AiArrayGetFlt(foo3, i), 1.5) n4 = IECoreArnold.NodeAlgo.convert([c3, c4], -0.25, 0.25, universe, "testBSplineCurves") r4 = arnold.AiNodeGetArray(n4, "radius") self.assertEqual(arnold.AiArrayGetNumElements(r4.contents), 12) self.assertEqual(arnold.AiArrayGetNumKeys(r4.contents), 2) foo4 = arnold.AiNodeGetArray(n4, "foo") self.assertEqual(arnold.AiArrayGetNumElements(foo4.contents), 12) # arbitrary userdata is not sampled self.assertEqual(arnold.AiArrayGetNumKeys(foo4.contents), 1) for i in range(0, 12): self.assertEqual(arnold.AiArrayGetFlt(r4, i), 0.5) self.assertEqual(arnold.AiArrayGetFlt(foo4, i), 1.5) for i in range(12, 24): self.assertEqual(arnold.AiArrayGetFlt(r4, i), 1)
def testTransformMotion( self ) : s = Gaffer.ScriptNode() s["plane"] = GafferScene.Plane() s["sphere"] = GafferScene.Sphere() s["group"] = GafferScene.Group() s["group"]["in"][0].setInput( s["plane"]["out"] ) s["group"]["in"][1].setInput( s["sphere"]["out"] ) s["expression"] = Gaffer.Expression() s["expression"].setExpression( inspect.cleandoc( """ parent["plane"]["transform"]["translate"]["x"] = context.getFrame() parent["sphere"]["transform"]["translate"]["y"] = context.getFrame() * 2 parent["group"]["transform"]["translate"]["z"] = context.getFrame() - 1 """ ) ) s["planeFilter"] = GafferScene.PathFilter() s["planeFilter"]["paths"].setValue( IECore.StringVectorData( [ "/group/plane" ] ) ) s["attributes"] = GafferScene.StandardAttributes() s["attributes"]["in"].setInput( s["group"]["out"] ) s["attributes"]["filter"].setInput( s["planeFilter"]["out"] ) s["attributes"]["attributes"]["transformBlur"]["enabled"].setValue( True ) s["attributes"]["attributes"]["transformBlur"]["value"].setValue( False ) s["options"] = GafferScene.StandardOptions() s["options"]["in"].setInput( s["attributes"]["out"] ) s["options"]["options"]["shutter"]["enabled"].setValue( True ) s["options"]["options"]["transformBlur"]["enabled"].setValue( True ) s["render"] = GafferArnold.ArnoldRender() s["render"]["in"].setInput( s["options"]["out"] ) s["render"]["mode"].setValue( s["render"].Mode.SceneDescriptionMode ) s["render"]["fileName"].setValue( self.temporaryDirectory() + "/test.ass" ) # No motion blur s["options"]["options"]["transformBlur"]["value"].setValue( False ) s["render"]["task"].execute() with IECoreArnold.UniverseBlock( writable = True ) : arnold.AiASSLoad( self.temporaryDirectory() + "/test.ass" ) camera = arnold.AiNodeLookUpByName( "gaffer:defaultCamera" ) sphere = arnold.AiNodeLookUpByName( "/group/sphere" ) sphereTimes = arnold.AiNodeGetArray( sphere, "transform_time_samples" ) sphereMatrix = arnold.AtMatrix() arnold.AiNodeGetMatrix( sphere, "matrix", sphereMatrix ) plane = arnold.AiNodeLookUpByName( "/group/plane" ) planeTimes = arnold.AiNodeGetArray( plane, "transform_time_samples" ) planeMatrix = arnold.AtMatrix() arnold.AiNodeGetMatrix( plane, "matrix", planeMatrix ) expectedSphereMatrix = arnold.AtMatrix() arnold.AiM4Translation( expectedSphereMatrix, arnold.AtVector( 0, 2, 0 ) ) expectedPlaneMatrix = arnold.AtMatrix() arnold.AiM4Translation( expectedPlaneMatrix, arnold.AtVector( 1, 0, 0 ) ) self.__assertStructsEqual( sphereMatrix, expectedSphereMatrix ) self.__assertStructsEqual( planeMatrix, expectedPlaneMatrix ) self.assertEqual( arnold.AiNodeGetFlt( camera, "shutter_start" ), 1 ) self.assertEqual( arnold.AiNodeGetFlt( camera, "shutter_end" ), 1 ) # Motion blur s["options"]["options"]["transformBlur"]["value"].setValue( True ) s["render"]["task"].execute() with IECoreArnold.UniverseBlock( writable = True ) : arnold.AiASSLoad( self.temporaryDirectory() + "/test.ass" ) camera = arnold.AiNodeLookUpByName( "gaffer:defaultCamera" ) sphere = arnold.AiNodeLookUpByName( "/group/sphere" ) sphereTimes = arnold.AiNodeGetArray( sphere, "transform_time_samples" ) sphereMatrices = arnold.AiNodeGetArray( sphere, "matrix" ) plane = arnold.AiNodeLookUpByName( "/group/plane" ) planeTimes = arnold.AiNodeGetArray( plane, "transform_time_samples" ) planeMatrices = arnold.AiNodeGetArray( plane, "matrix" ) self.assertEqual( sphereTimes.contents.nelements, 2 ) self.assertEqual( sphereTimes.contents.nkeys, 1 ) self.assertEqual( sphereMatrices.contents.nelements, 1 ) self.assertEqual( sphereMatrices.contents.nkeys, 2 ) self.assertEqual( planeTimes.contents.nelements, 2 ) self.assertEqual( planeTimes.contents.nkeys, 1 ) self.assertEqual( planeMatrices.contents.nelements, 1 ) self.assertEqual( planeMatrices.contents.nkeys, 2 ) for i in range( 0, 2 ) : frame = 0.75 + 0.5 * i self.assertEqual( arnold.AiArrayGetFlt( sphereTimes, i ), frame ) self.assertEqual( arnold.AiArrayGetFlt( planeTimes, i ), frame ) sphereMatrix = arnold.AtMatrix() arnold.AiArrayGetMtx( sphereMatrices, i, sphereMatrix ) expectedSphereMatrix = arnold.AtMatrix() arnold.AiM4Translation( expectedSphereMatrix, arnold.AtVector( 0, frame * 2, frame - 1 ) ) planeMatrix = arnold.AtMatrix() arnold.AiArrayGetMtx( planeMatrices, i, planeMatrix ) expectedPlaneMatrix = arnold.AtMatrix() arnold.AiM4Translation( expectedPlaneMatrix, arnold.AtVector( 1, 0, frame - 1 ) ) self.__assertStructsEqual( sphereMatrix, expectedSphereMatrix ) self.__assertStructsEqual( planeMatrix, expectedPlaneMatrix ) self.assertEqual( arnold.AiNodeGetFlt( camera, "shutter_start" ), 0.75 ) self.assertEqual( arnold.AiNodeGetFlt( camera, "shutter_end" ), 1.25 ) # Motion blur on, but sampleMotion off s["options"]["options"]["sampleMotion"]["enabled"].setValue( True ) s["options"]["options"]["sampleMotion"]["value"].setValue( False ) s["render"]["task"].execute() with IECoreArnold.UniverseBlock( writable = True ) : arnold.AiASSLoad( self.temporaryDirectory() + "/test.ass" ) camera = arnold.AiNodeLookUpByName( "gaffer:defaultCamera" ) sphere = arnold.AiNodeLookUpByName( "/group/sphere" ) sphereTimes = arnold.AiNodeGetArray( sphere, "transform_time_samples" ) sphereMatrices = arnold.AiNodeGetArray( sphere, "matrix" ) plane = arnold.AiNodeLookUpByName( "/group/plane" ) planeTimes = arnold.AiNodeGetArray( plane, "transform_time_samples" ) planeMatrices = arnold.AiNodeGetArray( plane, "matrix" ) self.assertEqual( sphereTimes.contents.nelements, 2 ) self.assertEqual( sphereTimes.contents.nkeys, 1 ) self.assertEqual( sphereMatrices.contents.nelements, 1 ) self.assertEqual( sphereMatrices.contents.nkeys, 2 ) self.assertEqual( planeTimes.contents.nelements, 2 ) self.assertEqual( planeTimes.contents.nkeys, 1 ) self.assertEqual( planeMatrices.contents.nelements, 1 ) self.assertEqual( planeMatrices.contents.nkeys, 2 ) for i in range( 0, 2 ) : frame = 0.75 + 0.5 * i self.assertEqual( arnold.AiArrayGetFlt( sphereTimes, i ), frame ) self.assertEqual( arnold.AiArrayGetFlt( planeTimes, i ), frame ) sphereMatrix = arnold.AtMatrix() arnold.AiArrayGetMtx( sphereMatrices, i, sphereMatrix ) expectedSphereMatrix = arnold.AtMatrix() arnold.AiM4Translation( expectedSphereMatrix, arnold.AtVector( 0, frame * 2, frame - 1 ) ) planeMatrix = arnold.AtMatrix() arnold.AiArrayGetMtx( planeMatrices, i, planeMatrix ) expectedPlaneMatrix = arnold.AtMatrix() arnold.AiM4Translation( expectedPlaneMatrix, arnold.AtVector( 1, 0, frame - 1 ) ) self.__assertStructsEqual( sphereMatrix, expectedSphereMatrix ) self.__assertStructsEqual( planeMatrix, expectedPlaneMatrix ) self.assertEqual( arnold.AiNodeGetFlt( camera, "shutter_start" ), 0.75 ) self.assertEqual( arnold.AiNodeGetFlt( camera, "shutter_end" ), 0.75 )