Пример #1
0
	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 )
Пример #2
0
	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 )
Пример #3
0
	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 )
Пример #4
0
    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]])
Пример #5
0
    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])
Пример #6
0
	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 )
Пример #7
0
    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)
Пример #8
0
    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)
Пример #9
0
    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)
Пример #10
0
    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)
Пример #11
0
    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)
Пример #12
0
	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 )
Пример #13
0
    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)
Пример #14
0
    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)
Пример #15
0
	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 )