def testModeUV( self ) : meshTangents = GafferScene.MeshTangents() triangleScene = self.makeTriangleScene() meshTangents["in"].setInput( triangleScene["out"] ) pathFilter = GafferScene.PathFilter( "PathFilter" ) pathFilter["paths"].setValue( IECore.StringVectorData( ['/object'] ) ) meshTangents["filter"].setInput( pathFilter["out"] ) meshTangents['mode'].setValue( GafferScene.MeshTangents.Mode.UV ) object = meshTangents['out'].object( "/object" ) uTangent = object["uTangent"] vTangent = object["vTangent"] self.assertEqual( len( uTangent.data ), 3 ) self.assertEqual( len( vTangent.data ), 3 ) for v in uTangent.data : self.assertTrue( v.equalWithAbsError( imath.V3f( 1, 0, 0 ), 0.000001 ) ) for v in vTangent.data : self.assertTrue( v.equalWithAbsError( imath.V3f( 0, 1, 0 ), 0.000001 ) )
def testCanUseSecondUVSet( self ) : meshTangents = GafferScene.MeshTangents() meshTangents["uvSet"].setValue( "foo" ) triangleScene = self.makeTriangleScene() meshTangents["in"].setInput( triangleScene["out"] ) pathFilter = GafferScene.PathFilter( "PathFilter" ) pathFilter["paths"].setValue( IECore.StringVectorData( ['/object'] ) ) meshTangents["filter"].setInput( pathFilter["out"] ) object = meshTangents['out'].object( "/object" ) uTangent = object["uTangent"] vTangent = object["vTangent"] self.assertEqual( len( uTangent.data ), 3 ) self.assertEqual( len( vTangent.data ), 3 ) for v in uTangent.data : self.assertTrue( v.equalWithAbsError( imath.V3f( 0, 1, 0 ), 0.000001 ) ) # really I'd expect the naive answer to the vTangent to be IECore.V3f( 1, 0, 0 ) # but the code forces the triple of n, uT, vT to flip the direction of vT if we don't have a correctly handed set of basis vectors for v in vTangent.data : self.assertTrue( v.equalWithAbsError( imath.V3f( -1, 0, 0 ), 0.000001 ) )
def testModeCentroid( self ) : meshTangents = GafferScene.MeshTangents() triangleScene = self.makeTriangleScene() meshTangents["in"].setInput( triangleScene["out"] ) pathFilter = GafferScene.PathFilter( "PathFilter" ) pathFilter["paths"].setValue( IECore.StringVectorData( ['/object'] ) ) meshTangents["filter"].setInput( pathFilter["out"] ) meshTangents['mode'].setValue( GafferScene.MeshTangents.Mode.PrimitiveCentroid ) object = meshTangents['out'].object( "/object" ) tangent = object["tangent"] biTangent = object["biTangent"] self.assertEqual( len( tangent.data ), 3 ) self.assertEqual( len( biTangent.data ), 3 ) for v, v1 in zip( tangent.data, [x.normalized() for x in [ imath.V3f( 1, 1, 0 ), imath.V3f( -2, 1, 0 ), imath.V3f( 1, -2, 0 ) ] ] ): self.assertTrue( v.equalWithAbsError( v1, 0.000001 ) ) for v, v1 in zip( tangent.data, [x.normalized() for x in [ imath.V3f( 1, 1, 0 ), imath.V3f( -2, 1, 0 ), imath.V3f( 1, -2, 0 ) ] ] ): self.assertTrue( v.equalWithAbsError( v1, 0.000001 ) )
def testCanUsePref( self ) : meshTangents = GafferScene.MeshTangents() meshTangents["position"].setValue( "Pref" ) triangleScene = self.makeTriangleScene() meshTangents["in"].setInput( triangleScene["out"] ) pathFilter = GafferScene.PathFilter( "PathFilter" ) pathFilter["paths"].setValue( IECore.StringVectorData( ['/object'] ) ) meshTangents["filter"].setInput( pathFilter["out"] ) object = meshTangents['out'].object( "/object" ) uTangent = object["uTangent"] vTangent = object["vTangent"] self.assertEqual( len( uTangent.data ), 3 ) self.assertEqual( len( vTangent.data ), 3 ) for v in uTangent.data : self.failUnless( v.equalWithAbsError( imath.V3f( 0, -1, 0 ), 0.000001 ) ) for v in vTangent.data : self.failUnless( v.equalWithAbsError( imath.V3f( 1, 0, 0 ), 0.000001 ) )
def testModeFirstEdge( self ) : meshTangents = GafferScene.MeshTangents() triangleScene = self.makeTriangleScene() meshTangents["in"].setInput( triangleScene["out"] ) pathFilter = GafferScene.PathFilter( "PathFilter" ) pathFilter["paths"].setValue( IECore.StringVectorData( ['/object'] ) ) meshTangents["filter"].setInput( pathFilter["out"] ) meshTangents['mode'].setValue( GafferScene.MeshTangents.Mode.FirstEdge ) object = meshTangents['out'].object( "/object" ) tangent = object["tangent"] biTangent = object["biTangent"] self.assertEqual( len( tangent.data ), 3 ) self.assertEqual( len( biTangent.data ), 3 ) for v, v1 in zip( tangent.data, [imath.V3f( 1, 0, 0 ), imath.V3f( -1, 0, 0 ), imath.V3f( 0, -1, 0 ) ] ): self.failUnless( v.equalWithAbsError( v1, 0.000001 ) ) for v, v1 in zip( biTangent.data, [imath.V3f( 0, -1, 0 ), imath.V3f( 0, 1, 0 ), imath.V3f( -1, 0, 0 ) ] ): self.failUnless( v.equalWithAbsError( v1, 0.000001 ) )
def testHandedness( self ) : isLeftHanded = lambda u, v, n : u.cross( v ).dot( n ) < 0 meshTangents = GafferScene.MeshTangents() triangleScene = self.makeTriangleScene() meshTangents["in"].setInput( triangleScene["out"] ) pathFilter = GafferScene.PathFilter( "PathFilter" ) pathFilter["paths"].setValue( IECore.StringVectorData( ['/object'] ) ) meshTangents["filter"].setInput( pathFilter["out"] ) meshTangents['orthogonal'].setValue( True ) meshTangents['mode'].setValue( GafferScene.MeshTangents.Mode.UV ) meshTangents['leftHanded'].setValue( True ) object = meshTangents['out'].object( "/object" ) n = imath.V3f(0,0,1) for u, v in zip( object['uTangent'].data, object['vTangent'].data ) : self.assertTrue( isLeftHanded( u, v, n ) ) meshTangents['leftHanded'].setValue( False ) object = meshTangents['out'].object( "/object" ) for u, v in zip( object['uTangent'].data, object['vTangent'].data ) : self.assertFalse( isLeftHanded( u, v, n ) ) meshTangents['mode'].setValue( GafferScene.MeshTangents.Mode.FirstEdge ) meshTangents['leftHanded'].setValue( True ) object = meshTangents['out'].object( "/object" ) for u, v, n in zip( object['tangent'].data, object['biTangent'].data, object['N'].data ) : self.assertTrue( isLeftHanded( u, v, n ) ) meshTangents['leftHanded'].setValue( False ) object = meshTangents['out'].object( "/object" ) for u, v, n in zip( object['tangent'].data, object['biTangent'].data, object['N'].data ) : self.assertFalse( isLeftHanded( u, v, n ) ) meshTangents['mode'].setValue( GafferScene.MeshTangents.Mode.TwoEdges ) meshTangents['leftHanded'].setValue( True ) object = meshTangents['out'].object( "/object" ) for u, v, n in zip( object['tangent'].data, object['biTangent'].data, object['N'].data ) : self.assertTrue( isLeftHanded( u, v, n ) ) meshTangents['leftHanded'].setValue( False ) object = meshTangents['out'].object( "/object" ) for u, v, n in zip( object['tangent'].data, object['biTangent'].data, object['N'].data ) : self.assertFalse( isLeftHanded( u, v, n ) ) meshTangents['mode'].setValue( GafferScene.MeshTangents.Mode.PrimitiveCentroid ) meshTangents['leftHanded'].setValue( True ) object = meshTangents['out'].object( "/object" ) for u, v, n in zip( object['tangent'].data, object['biTangent'].data, object['N'].data ) : self.assertTrue( isLeftHanded( u, v, n ) ) meshTangents['leftHanded'].setValue( False ) object = meshTangents['out'].object( "/object" ) for u, v, n in zip( object['tangent'].data, object['biTangent'].data, object['N'].data ) : self.assertFalse( isLeftHanded( u, v, n ) )