def testContainsPoint(self):

        r = imath.Rand32()
        v0 = imath.V3f(0, 0, 0)
        v1 = imath.V3f(1, 0, 0)
        v2 = imath.V3f(0, 1, 0)
        for i in range(0, 10000):

            p = imath.V3f(r.nextf(-1, 1), r.nextf(-1, 1), 0)
            if p.x < 0 or p.y < 0 or p.x + p.y > 1:
                self.failIf(IECore.triangleContainsPoint(v0, v1, v2, p))
            else:
                self.failUnless(IECore.triangleContainsPoint(v0, v1, v2, p))

        r = imath.Rand32()
        for i in range(0, 10000):

            v0 = imath.V3f(r.nextf(), r.nextf(), r.nextf())
            v1 = imath.V3f(r.nextf(), r.nextf(), r.nextf())
            v2 = imath.V3f(r.nextf(), r.nextf(), r.nextf())
            if IECore.triangleArea(v0, v1, v2) > 0.01:

                u = r.nextf(0, 1)
                v = r.nextf(0, 1)
                if u + v < 1:

                    w = 1 - (u + v)
                    p = u * v0 + v * v1 + w * v2
                    self.failUnless(IECore.triangleContainsPoint(
                        v0, v1, v2, p))
Exemple #2
0
	def testThrashingWithConcurrentClearUnused( self ) :

		r = imath.Rand32()
		pv = IECore.V3fVectorData()
		for i in range( 0, 10000 ) :
			pv.append( imath.V3f( r.nextf(), r.nextf(), r.nextf() ) )

		p = IECoreScene.PointsPrimitive( pv.copy() )

		pv.append( imath.V3f( r.nextf(), r.nextf(), r.nextf() ) )
		p2 = IECoreScene.PointsPrimitive( pv.copy() )

		self.assertNotEqual( p, p2 )

		for i in range( 0, 100 ) :

			c = IECoreGL.CachedConverter( int( p.memoryUsage() * 1.5 ) ) # not enough for both objects

			def t() :

				c.convert( p )
				c.convert( p2 )

			threads = []
			for j in range( 0, 100 ) :
				thread = threading.Thread( target = t )
				threads.append( thread )
				thread.start()

			for k in range( 0, 100 ) :
				c.clearUnused()

			for thread in threads :
				thread.join()
 def getRandomWeights(self, seed):
     r = imath.Rand32(seed)
     weights = []
     for i in range(0, 25):
         val = IECore.RandomAlgo.barycentricRandf(r)
         weights.extend([val[0], val[1], val[2]])
     return weights
    def testRandomTriangles(self):

        r = imath.Rand32()
        for i in range(0, 1000):

            p = IECore.V3fVectorData([
                imath.V3f(r.nextf(), r.nextf(), r.nextf()),
                imath.V3f(r.nextf(), r.nextf(), r.nextf()),
                imath.V3f(r.nextf(), r.nextf(), r.nextf()),
            ])
            m = IECoreScene.MeshPrimitive(IECore.IntVectorData([3]),
                                          IECore.IntVectorData([0, 1, 2]),
                                          "linear", p)

            uv = IECore.V2fVectorData([
                imath.V2f(r.nextf(), r.nextf()),
                imath.V2f(r.nextf(), r.nextf()),
                imath.V2f(r.nextf(), r.nextf())
            ])
            m["uv"] = IECoreScene.PrimitiveVariable(
                IECoreScene.PrimitiveVariable.Interpolation.Vertex, uv)

            faceArea = IECoreScene.MeshAlgo.calculateFaceArea(m)
            textureArea = IECoreScene.MeshAlgo.calculateFaceTextureArea(
                m, "uv")

            self.assertAlmostEqual(faceArea.data[0],
                                   IECore.triangleArea(p[0], p[1], p[2]), 4)
            self.assertAlmostEqual(
                textureArea.data[0],
                IECore.triangleArea(imath.V3f(uv[0][0], uv[0][1], 0),
                                    imath.V3f(uv[1][0], uv[1][1], 0),
                                    imath.V3f(uv[2][0], uv[2][1], 0)), 4)
Exemple #5
0
	def testCosineHemisphere( self ) :

		r = imath.Rand32()

		for i in range( 0, 1000 ) :

			v = IECore.RandomAlgo.cosineHemisphereRandf( r )
			self.assertTrue( v.z >= 0 )
			self.assertAlmostEqual( v.length(), 1, 6 )
    def testClosestPoint(self):

        rand = imath.Rand32()

        for basis in (IECore.CubicBasisf.linear(), IECore.CubicBasisf.bezier(),
                      IECore.CubicBasisf.bSpline(),
                      IECore.CubicBasisf.catmullRom()):

            for i in range(0, 10):

                p = IECore.V3fVectorData()
                vertsPerCurve = IECore.IntVectorData()

                numCurves = int(rand.nextf(1, 10))
                for c in range(0, numCurves):

                    numSegments = int(rand.nextf(1, 10))
                    numVerts = 4 + basis.step * (numSegments - 1)

                    vertsPerCurve.append(numVerts)

                    for i in range(0, numVerts):

                        p.append(
                            imath.V3f(rand.nextf(), rand.nextf(), rand.nextf())
                            + imath.V3f(c * 2))

                curves = IECoreScene.CurvesPrimitive(vertsPerCurve, basis,
                                                     False, p)

                curves["constantwidth"] = IECoreScene.PrimitiveVariable(
                    IECoreScene.PrimitiveVariable.Interpolation.Constant,
                    IECore.FloatData(0.01))
                IECore.ObjectWriter(curves, "/tmp/curves.cob").write()

                e = IECoreScene.CurvesPrimitiveEvaluator(curves)
                result = e.createResult()

                for c in range(0, numCurves):

                    numSteps = 100
                    for vi in range(0, numSteps):

                        v = float(vi) / (numSteps - 1)

                        e.pointAtV(c, v, result)
                        p = result.point()

                        success = e.closestPoint(p, result)
                        self.assertTrue(success)

                        p2 = result.point()
                        c2 = result.curveIndex()
                        v2 = result.uv()[1]

                        self.assertTrue(abs((p2 - p).length()) < 0.05)
                        self.assertEqual(c2, c)
Exemple #7
0
	def testBarycentric( self ) :

		r = imath.Rand32()

		for i in range( 0, 1000 ) :

			f = IECore.RandomAlgo.barycentricRandf( r )
			self.assertTrue( ( f[0] + f[1] + f[2] ) == 1.0 )

			d = IECore.RandomAlgo.barycentricRandd( r )
			self.assertTrue( ( d[0] + d[1] + d[2] ) == 1.0 )
	def testArea3D( self ) :

		r = imath.Rand32()
		for i in range( 0, 1000 ) :

			p = IECore.V3fVectorData( [
				imath.V3f( r.nextf(), r.nextf(), r.nextf() ),
				imath.V3f( r.nextf(), r.nextf(), r.nextf() ),
				imath.V3f( r.nextf(), r.nextf(), r.nextf() )
			] )
			self.assertAlmostEqual( IECore.polygonArea( p ), IECore.triangleArea( p[0], p[1], p[2] ), 4 )
 def setRandomWeights(self, seed, skinCluster, geo, joints):
     r = imath.Rand32(seed)
     weights = []
     for i in range(0, 25):
         val = IECore.RandomAlgo.barycentricRandf(r)
         weights.extend([val[0], val[1], val[2]])
         maya.cmds.skinPercent(skinCluster,
                               '%s.vtx[%d]' % (geo, i),
                               transformValue=[(joints[0], val[0]),
                                               (joints[1], val[1]),
                                               (joints[2], val[2])])
     return weights
Exemple #10
0
    def testClosestPoints(self):

        r = imath.Rand32(100)
        for i in range(0, 1000):

            x = r.nextf(-10, 10)
            y = r.nextf(-10, 10)
            z1 = r.nextf(-10, 10)
            z2 = r.nextf(-10, 10)

            l1 = IECore.LineSegment3f(imath.V3f(-10, y, z1),
                                      imath.V3f(10, y, z1))
            l2 = IECore.LineSegment3f(imath.V3f(x, -10, z2),
                                      imath.V3f(x, 10, z2))

            p1, p2 = l1.closestPoints(l2)
            p3, p4 = l2.closestPoints(l1)

            self.assertTrue(p1.equalWithAbsError(p4, 0.00001))
            self.assertTrue(p2.equalWithAbsError(p3, 0.00001))

        # |
        # |
        # |  ------
        # |
        # |
        l1 = IECore.LineSegment3f(imath.V3f(0, 0, 0), imath.V3f(0, 2, 0))
        l2 = IECore.LineSegment3f(imath.V3f(1, 1, 0), imath.V3f(3, 1, 0))

        p1, p2 = l1.closestPoints(l2)
        p3, p4 = l2.closestPoints(l1)
        self.assertEqual(p1, p4)
        self.assertEqual(p2, p3)

        self.assertEqual(p1, imath.V3f(0, 1, 0))
        self.assertEqual(p2, imath.V3f(1, 1, 0))

        # \
        #  \
        #
        #  /
        # /

        l1 = IECore.LineSegment3f(imath.V3f(0, 0, 0), imath.V3f(2, 2, 0))
        l2 = IECore.LineSegment3f(imath.V3f(0, 5, 0), imath.V3f(2, 3, 0))

        p1, p2 = l1.closestPoints(l2)
        p3, p4 = l2.closestPoints(l1)
        self.assertEqual(p1, p4)
        self.assertEqual(p2, p3)

        self.assertEqual(p1, imath.V3f(2, 2, 0))
        self.assertEqual(p2, imath.V3f(2, 3, 0))
    def buildTestSetup(self):
        # create simple hierarchy
        j1 = maya.cmds.joint(n='joint1', p=[0, -2, 0])
        maya.cmds.joint(n='joint2', p=[0, 0, 0])
        maya.cmds.joint(n='joint3', p=[0, 2, 0])

        maya.cmds.select(clear=True)
        j4 = maya.cmds.joint(n='joint4', p=[0, -2, 0])
        j5 = maya.cmds.joint(n='joint5', p=[0, 0, 0])
        j6 = maya.cmds.joint(n='joint6', p=[0, 2, 0])
        maya.cmds.rotate(0, 0, -20, j4, r=True, os=True)
        maya.cmds.rotate(0, 0, 40, j5, r=True, os=True)
        maya.cmds.rotate(0, 0, -20, j6, r=True, os=True)

        # create geo
        geo = maya.cmds.polyCube(n="myGeo",
                                 w=1,
                                 h=4,
                                 d=1,
                                 sx=1,
                                 sy=3,
                                 sz=1,
                                 ax=[0, 1, 0],
                                 cuv=4,
                                 ch=0)[0]
        geo2 = maya.cmds.polyCube(n="myGeo2",
                                  w=1,
                                  h=4,
                                  d=1,
                                  sx=1,
                                  sy=3,
                                  sz=1,
                                  ax=[0, 1, 0],
                                  cuv=4,
                                  ch=0)[0]

        # bind it
        sc = maya.cmds.skinCluster(j1, geo, dr=4.5)[0]
        sc2 = maya.cmds.skinCluster(j4, geo2, dr=4.5)[0]

        # change the weights on sc2
        r = imath.Rand32()
        for i in range(0, 15):
            val = IECore.RandomAlgo.barycentricRandf(r)
            maya.cmds.skinPercent(sc2,
                                  '%s.vtx[%d]' % (geo2, i),
                                  transformValue=[(j4, val[0]), (j5, val[1]),
                                                  (j6, val[2])])

        return (sc, sc2)
Exemple #12
0
	def testStandardAttributeConversion( self ) :

		sop = self.emptySop()
		curves = self.curves()
		for key in curves.keys() :
			if key != "P" :
				del curves[key]
		rand = imath.Rand32()
		curves["uv"] = IECoreScene.PrimitiveVariable( IECoreScene.PrimitiveVariable.Interpolation.Vertex, IECore.V2fVectorData( [ imath.V2f( rand.nextf() ) for x in range( 0, 32 ) ] ) )
		curves["Cs"] = IECoreScene.PrimitiveVariable( IECoreScene.PrimitiveVariable.Interpolation.Uniform, IECore.V3fVectorData( [ imath.V3f( 1, 0, 0 ) ] * 4, IECore.GeometricData.Interpretation.Color ) )
		curves["width"] = IECoreScene.PrimitiveVariable( IECoreScene.PrimitiveVariable.Interpolation.Vertex, IECore.FloatVectorData( [ 1 ] * 32 ) )
		curves["Pref"] = curves["P"]

		self.assertTrue( curves.arePrimitiveVariablesValid() )

		converter = IECoreHoudini.ToHoudiniCurvesConverter( curves )
		self.assertTrue( converter.convert( sop ) )
		geo = sop.geometry()
		self.assertEqual( sorted([ x.name() for x in geo.pointAttribs() ]), TestToHoudiniCurvesConverter.PointPositionAttribs + ['pscale', 'rest', 'uv'] )
		self.assertEqual( sorted([ x.name() for x in geo.primAttribs() ]), ['Cd'] )
		self.assertEqual( sorted([ x.name() for x in geo.vertexAttribs() ]), [] )
		self.assertEqual( sorted([ x.name() for x in geo.globalAttribs() ]), [] )

		uvData = curves["uv"].data
		uvs = geo.findPointAttrib( "uv" )

		i = 0
		for point in geo.points() :
			uvValues = point.attribValue( uvs )
			self.assertAlmostEqual( uvValues[0], uvData[i][0] )
			self.assertAlmostEqual( uvValues[1], uvData[i][1] )
			i += 1

		converter["convertStandardAttributes"].setTypedValue( False )
		self.assertTrue( converter.convert( sop ) )
		geo = sop.geometry()
		self.assertItemsEqual( sorted([ x.name() for x in geo.pointAttribs() ]), TestToHoudiniCurvesConverter.PointPositionAttribs + ['Pref', 'uv', 'width'] )
		self.assertEqual( sorted([ x.name() for x in geo.primAttribs() ]), ['Cs'] )
		self.assertEqual( sorted([ x.name() for x in geo.vertexAttribs() ]), [] )
		self.assertEqual( sorted([ x.name() for x in geo.globalAttribs() ]), [] )

		i = 0
		uvData = curves["uv"].data
		uvIndices = curves["uv"].indices
		uvs = geo.findPointAttrib( "uv" )
		for point in geo.points() :
			uvValues = point.attribValue( uvs )
			self.assertAlmostEqual( uvValues[0], uvData[i][0] )
			self.assertAlmostEqual( uvValues[1], uvData[i][1] )
			i += 1
    def testContainsPointWithBarycentric(self):

        r = imath.Rand32()
        v0 = imath.V3f(0, 0, 0)
        v1 = imath.V3f(1, 0, 0)
        v2 = imath.V3f(0, 1, 0)

        for i in range(0, 10000):

            b = imath.V3f(r.nextf(-1, 1), r.nextf(-1, 1), 0)
            b.z = 1 - (b.x + b.y)
            p = IECore.trianglePoint(v0, v1, v2, b)
            if p.x < 0 or p.y < 0 or p.x + p.y > 1:
                self.failIf(IECore.triangleContainsPoint(v0, v1, v2, p))
            else:
                bb = IECore.triangleContainsPoint(v0, v1, v2, p)
                self.failUnless(bb.equalWithAbsError(b, 0.0001))
Exemple #14
0
    def testClosestPointTo(self):

        l = IECore.LineSegment3f(imath.V3f(1), imath.V3f(2))

        r = imath.Rand32(100)

        for i in range(0, 1000):

            p = l(r.nextf(0, 1))
            self.assertTrue(l.closestPointTo(p).equalWithAbsError(p, 0.00001))

        for i in range(0, 1000):

            p = l(r.nextf(-1, 0))
            self.assertTrue(
                l.closestPointTo(p).equalWithAbsError(l.p0, 0.00001))

        for i in range(0, 1000):

            p = l(r.nextf(1, 2))
            self.assertTrue(
                l.closestPointTo(p).equalWithAbsError(l.p1, 0.00001))

        t = l.direction().cross(imath.V3f(0, 1, 0))
        for i in range(0, 1000):

            pl = l(r.nextf(0, 1))
            pt = pl + t * r.nextf(-10, 10)
            self.assertTrue(
                l.closestPointTo(pt).equalWithAbsError(pl, 0.00001))

        for i in range(0, 1000):

            pl = l(r.nextf(1, 2))
            pt = pl + t * r.nextf(-10, 10)
            self.assertTrue(
                l.closestPointTo(pt).equalWithAbsError(l.p1, 0.00001))

        for i in range(0, 1000):

            pl = l(r.nextf(-1, 0))
            pt = pl + t * r.nextf(-10, 10)
            self.assertTrue(
                l.closestPointTo(pt).equalWithAbsError(l.p0, 0.00001))
Exemple #15
0
	def testThreading( self ) :

		r = imath.Rand32()
		pv = IECore.V3fVectorData()
		for i in range( 0, 10000 ) :
			pv.append( imath.V3f( r.nextf(), r.nextf(), r.nextf() ) )

		p = IECoreScene.PointsPrimitive( pv.copy() )

		pv.append( imath.V3f( r.nextf(), r.nextf(), r.nextf() ) )
		p2 = IECoreScene.PointsPrimitive( pv.copy() )

		self.assertNotEqual( p, p2 )

		for i in range( 0, 100 ) :

			pg = []
			pg2 = []

			c = IECoreGL.CachedConverter( 5000 * 1024 * 1024 ) # 500 megs

			def t() :

				pg.append( c.convert( p ) )
				pg2.append( c.convert( p2 ) )

			threads = []
			for j in range( 0, 100 ) :
				thread = threading.Thread( target = t )
				threads.append( thread )
				thread.start()

			for thread in threads :
				thread.join()

			for o in pg :
				self.assertTrue( o.isSame( c.convert( p ) ) )
			for o in pg2 :
				self.assertTrue( o.isSame( c.convert( p2 ) ) )
Exemple #16
0
    def testSplit(self):

        r = imath.Rand32()
        for i in range(0, 100):

            b = imath.Box3f()
            b.extendBy(imath.V3f(r.nextf(), r.nextf(), r.nextf()))
            b.extendBy(imath.V3f(r.nextf(), r.nextf(), r.nextf()))

            major = b.majorAxis()

            low, high = IECore.BoxAlgo.split(b)
            low2, high2 = IECore.BoxAlgo.split(b, major)

            self.assertEqual(low, low2)
            self.assertEqual(high, high2)

            b2 = imath.Box3f()
            b2.extendBy(low)
            b2.extendBy(high)

            self.assertEqual(b, b2)
Exemple #17
0
	def testAttributeFilter( self ) :

		curves = self.curves()
		sop = self.emptySop()

		converter = IECoreHoudini.ToHoudiniCurvesConverter( curves )
		self.assertTrue( converter.convert( sop ) )
		self.assertEqual( sorted([ x.name() for x in sop.geometry().pointAttribs() ]), TestToHoudiniCurvesConverter.PointPositionAttribs + ['color3fPoint', 'floatPoint', 'intPoint', 'stringPoint', 'v2fPoint', 'v2iPoint', 'v3fPoint', 'v3iPoint'] )
		self.assertEqual( sorted([ x.name() for x in sop.geometry().primAttribs() ]), ['color3fPrim', 'floatPrim', 'intPrim', 'stringPrim', 'v2fPrim', 'v2iPrim', 'v3fPrim', 'v3iPrim'] )
		self.assertEqual( sorted([ x.name() for x in sop.geometry().vertexAttribs() ]), [] )
		self.assertEqual( sorted([ x.name() for x in sop.geometry().globalAttribs() ]), ['color3fDetail', 'floatDetail', 'intDetail', 'stringDetail', 'v2fDetail', 'v2iDetail', 'v3fDetail', 'v3iDetail'] )

		converter.parameters()["attributeFilter"].setTypedValue( "P *3f*" )
		self.assertTrue( converter.convert( sop ) )
		self.assertEqual( sorted([ x.name() for x in sop.geometry().pointAttribs() ]), TestToHoudiniCurvesConverter.PointPositionAttribs + ['color3fPoint', 'v3fPoint'] )
		self.assertEqual( sorted([ x.name() for x in sop.geometry().primAttribs() ]), ['color3fPrim', 'v3fPrim'] )
		self.assertEqual( sorted([ x.name() for x in sop.geometry().vertexAttribs() ]), [] )
		self.assertEqual( sorted([ x.name() for x in sop.geometry().globalAttribs() ]), ['color3fDetail', 'v3fDetail'] )

		converter.parameters()["attributeFilter"].setTypedValue( "* ^*Detail ^int*" )
		self.assertTrue( converter.convert( sop ) )
		self.assertEqual( sorted([ x.name() for x in sop.geometry().pointAttribs() ]), TestToHoudiniCurvesConverter.PointPositionAttribs + ['color3fPoint', 'floatPoint', 'stringPoint', 'v2fPoint', 'v2iPoint', 'v3fPoint', 'v3iPoint'] )
		self.assertEqual( sorted([ x.name() for x in sop.geometry().primAttribs() ]), ['color3fPrim', 'floatPrim', 'stringPrim', 'v2fPrim', 'v2iPrim', 'v3fPrim', 'v3iPrim'] )
		self.assertEqual( sorted([ x.name() for x in sop.geometry().vertexAttribs() ]), [] )
		self.assertEqual( sorted([ x.name() for x in sop.geometry().globalAttribs() ]), [] )

		# verify we can filter uvs
		for key in curves.keys() :
			if key != "P" :
				del curves[key]
		rand = imath.Rand32()
		curves["uv"] = IECoreScene.PrimitiveVariable( IECoreScene.PrimitiveVariable.Interpolation.Vertex, IECore.V2fVectorData( [ imath.V2f( rand.nextf() ) for x in range( 0, 32 ) ] ) )
		curves["Cs"] = IECoreScene.PrimitiveVariable( IECoreScene.PrimitiveVariable.Interpolation.Uniform, IECore.V3fVectorData( [ imath.V3f( 1, 0, 0 ) ] * 4, IECore.GeometricData.Interpretation.Color ) )
		curves["width"] = IECoreScene.PrimitiveVariable( IECoreScene.PrimitiveVariable.Interpolation.Vertex, IECore.FloatVectorData( [ 1 ] * 32 ) )
		curves["Pref"] = curves["P"]

		converter = IECoreHoudini.ToHoudiniCurvesConverter( curves )
		self.assertTrue( converter.convert( sop ) )
		self.assertEqual( sorted([ x.name() for x in sop.geometry().pointAttribs() ]), TestToHoudiniCurvesConverter.PointPositionAttribs + ['pscale', 'rest', 'uv'] )
		self.assertEqual( sorted([ x.name() for x in sop.geometry().primAttribs() ]), ['Cd'] )
		self.assertEqual( sorted([ x.name() for x in sop.geometry().vertexAttribs() ]), [] )
		self.assertEqual( sorted([ x.name() for x in sop.geometry().globalAttribs() ]), [] )

		# have to filter the source attrs
		converter.parameters()["attributeFilter"].setTypedValue( "* ^uv ^pscale ^rest" )
		self.assertTrue( converter.convert( sop ) )
		self.assertEqual( sorted([ x.name() for x in sop.geometry().pointAttribs() ]),TestToHoudiniCurvesConverter.PointPositionAttribs + ['pscale', 'rest'] )
		self.assertEqual( sorted([ x.name() for x in sop.geometry().primAttribs() ]), ['Cd'] )
		self.assertEqual( sorted([ x.name() for x in sop.geometry().vertexAttribs() ]), [] )
		self.assertEqual( sorted([ x.name() for x in sop.geometry().globalAttribs() ]), [] )

		converter.parameters()["attributeFilter"].setTypedValue( "* ^uv  ^width ^Pref" )
		self.assertTrue( converter.convert( sop ) )
		self.assertEqual( sorted([ x.name() for x in sop.geometry().pointAttribs() ]), TestToHoudiniCurvesConverter.PointPositionAttribs )
		self.assertEqual( sorted([ x.name() for x in sop.geometry().primAttribs() ]), ['Cd'] )
		self.assertEqual( sorted([ x.name() for x in sop.geometry().vertexAttribs() ]), [] )
		self.assertEqual( sorted([ x.name() for x in sop.geometry().globalAttribs() ]), [] )

		converter.parameters()["attributeFilter"].setTypedValue( "* ^width ^Cs" )
		self.assertTrue( converter.convert( sop ) )
		self.assertEqual( sorted([ x.name() for x in sop.geometry().pointAttribs() ]), TestToHoudiniCurvesConverter.PointPositionAttribs + ['rest', 'uv'] )
		self.assertEqual( sorted([ x.name() for x in sop.geometry().primAttribs() ]), [] )
		self.assertEqual( sorted([ x.name() for x in sop.geometry().vertexAttribs() ]), [] )
		self.assertEqual( sorted([ x.name() for x in sop.geometry().globalAttribs() ]), [] )