Ejemplo n.º 1
0
	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 ) )
Ejemplo n.º 2
0
	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 ) )
Ejemplo n.º 3
0
	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 ) )
Ejemplo n.º 4
0
	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 ) )
Ejemplo n.º 5
0
	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 ) )
Ejemplo n.º 6
0
	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 ) )