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))
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)
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)
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
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)
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))
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))
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 ) ) )
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)
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() ]), [] )