// this is a 

		internal override bool calcPenDepth( btSimplexSolverInterface simplexSolver,
											btConvexShape pConvexA, btConvexShape pConvexB,
											ref btTransform transformA, ref btTransform transformB,
											ref btVector3 v, out btVector3 wWitnessOnA, out btVector3 wWitnessOnB,
											btIDebugDraw debugDraw )
		{

			//(void)debugDraw;
			//(void)v;
			//(void)simplexSolver;

			//	double				radialmargin(btScalar.BT_ZERO);

			btVector3 guessVector; transformB.m_origin.Sub( ref transformA.m_origin, out guessVector );
			btGjkEpaSolver2.sResults results;


			if( btGjkEpaSolver2.Penetration( pConvexA, ref transformA,
										pConvexB, ref transformB,
										ref guessVector, out results ) )

			{
				//	debugDraw.drawLine(results.witnesses[1],results.witnesses[1]+results.normal,btVector3(255,0,0));
				//resultOut.addContactPoint(results.normal,results.witnesses[1],-results.depth);
				wWitnessOnA = results.witness0;
				wWitnessOnB = results.witness1;
				v = results.normal;
				return true;
			}
			else
			{
				if( btGjkEpaSolver2.Distance( pConvexA, ref transformA, pConvexB, ref transformB, ref guessVector, out results ) )
				{
					wWitnessOnA = results.witness0;
					wWitnessOnB = results.witness1;
					v = results.normal;
					return false;
				}
			}
			wWitnessOnA = results.witness0;
			wWitnessOnB = results.witness1;
			return false;
		}
Ejemplo n.º 2
0
		public void Initialize(btConvexShape convexA, btConvexShape convexB, btSimplexSolverInterface simplexSolver)
		{
			m_simplexSolver = ( simplexSolver );
			m_convexA = ( convexA );
			m_convexB = ( convexB );
        }
		///ConvexPenetrationDepthSolver provides an interface for penetration depth calculation.
		internal abstract bool calcPenDepth( btSimplexSolverInterface simplexSolver,
			btConvexShape convexA, btConvexShape convexB,
						ref btTransform transA, ref btTransform transB,
					ref btVector3 v, out btVector3 pa, out btVector3 pb,
					btIDebugDraw debugDraw );
Ejemplo n.º 4
0
		public btContinuousConvexCollision( btConvexShape convexA, btStaticPlaneShape plane )
		{
			m_simplexSolver = ( null );
			m_penetrationDepthSolver = ( null );
			m_convexA = ( convexA ); m_convexB1 = ( null ); m_planeShape = ( plane );
		}
Ejemplo n.º 5
0
		internal void Initialize( btConvexShape convexA, btConvexShape convexB, btSimplexSolverInterface simplexSolver, btConvexPenetrationDepthSolver penetrationDepthSolver )
		{
			m_simplexSolver = ( simplexSolver );
			m_penetrationDepthSolver = ( penetrationDepthSolver );
			m_convexA = ( convexA ); m_convexB1 = ( convexB ); m_planeShape = null;
		}
Ejemplo n.º 6
0
		internal void Initialize( btConvexShape convexA, btStaticPlaneShape plane )
		{
			m_simplexSolver = ( null );
			m_penetrationDepthSolver = ( null );
			m_convexA = ( convexA ); m_convexB1 = ( null ); m_planeShape = ( plane );
		}
Ejemplo n.º 7
0
		public void Initialize( btPersistentManifold mf, btCollisionAlgorithmConstructionInfo ci, btCollisionObjectWrapper body0Wrap, btCollisionObjectWrapper body1Wrap, btSimplexSolverInterface simplexSolver, btConvexPenetrationDepthSolver pdSolver, int numPerturbationIterations, int minimumPointsPerturbationThreshold )
		{
			base.Initialize( ci, body0Wrap, body1Wrap );
			m_simplexSolver = ( simplexSolver );
			m_pdSolver = ( pdSolver );
			m_ownManifold = ( false );
			m_manifoldPtr = ( mf );
			m_lowLevelOfDetail = ( false );
#if USE_SEPDISTANCE_UTIL2
m_sepDistance((static_cast<btConvexShape*>(body0.getCollisionShape())).getAngularMotionDisc(),
			  (static_cast<btConvexShape*>(body1.getCollisionShape())).getAngularMotionDisc()),
#endif
			m_numPerturbationIterations = ( numPerturbationIterations );
			m_minimumPointsPerturbationThreshold = ( minimumPointsPerturbationThreshold );
		}
Ejemplo n.º 8
0
			internal CreateFunc( btSimplexSolverInterface simplexSolver, btConvexPenetrationDepthSolver pdSolver )
			{
				m_numPerturbationIterations = 0;
				m_minimumPointsPerturbationThreshold = 3;
				m_simplexSolver = simplexSolver;
				m_pdSolver = pdSolver;
			}
Ejemplo n.º 9
0
		///cache separating vector to speedup collision detection
		internal override void Cleanup()
		{
			if( m_ownManifold )
				m_dispatcher.releaseManifold( m_manifoldPtr );

			m_simplexSolver = null;
			m_pdSolver = null;
			m_manifoldPtr = null;
		}
Ejemplo n.º 10
0
		internal void Initialize( btConvexShape objectA, btConvexShape objectB, btSimplexSolverInterface simplexSolver
			, btConvexPenetrationDepthSolver penetrationDepthSolver )
		{
			m_cachedSeparatingAxis = btVector3.yAxis;
			m_penetrationDepthSolver = ( penetrationDepthSolver );
			m_simplexSolver = ( simplexSolver );
			m_minkowskiA = ( objectA );
			m_minkowskiB = ( objectB );
			m_shapeTypeA = ( objectA.getShapeType() );
			m_shapeTypeB = ( objectB.getShapeType() );
			m_marginA = ( objectA.getMargin() );
			m_marginB = ( objectB.getMargin() );
			m_ignoreMargin = ( false );
			m_lastUsedMethod = ( -1 );
			m_catchDegeneracies = ( 1 );
			m_fixContactNormalDirection = ( 1 );
		}
		public virtual bool calcPenDepth( btSimplexSolverInterface simplexSolver,
														   btConvexShape convexA, btConvexShape convexB,
														   ref btTransform transA, ref btTransform transB,
														   ref btVector3 v, ref btVector3 pa, ref btVector3 pb,
														   btIDebugDraw debugDraw
														   )
		{

			//(void)v;

			bool check2d = convexA.isConvex2d() && convexB.isConvex2d();

			//just take fixed number of orientation, and sample the penetration depth in that direction
			double minProj = btScalar.BT_LARGE_FLOAT;
			btVector3 minNorm = btVector3.Zero;
			btVector3 minA, minB;
			btVector3 seperatingAxisInA, seperatingAxisInB;
			btVector3 pInA, qInB, pWorld, qWorld, w;

#if USE_BATCHED_SUPPORT

			btVector3[] supportVerticesABatch = new btVector3[NUM_UNITSPHERE_POINTS + btConvexShape.MAX_PREFERRED_PENETRATION_DIRECTIONS * 2];
			btVector3[] supportVerticesBBatch = new btVector3[NUM_UNITSPHERE_POINTS + btConvexShape.MAX_PREFERRED_PENETRATION_DIRECTIONS * 2];
			btVector3[] seperatingAxisInABatch = new btVector3[NUM_UNITSPHERE_POINTS + btConvexShape.MAX_PREFERRED_PENETRATION_DIRECTIONS * 2];
			btVector3[] seperatingAxisInBBatch = new btVector3[NUM_UNITSPHERE_POINTS + btConvexShape.MAX_PREFERRED_PENETRATION_DIRECTIONS * 2];
			int i;

			int numSampleDirections = NUM_UNITSPHERE_POINTS;

			for( i = 0; i < numSampleDirections; i++ )
			{
				btVector3 norm = getPenetrationDirections()[i];
				seperatingAxisInABatch[i] = ( -norm ) * transA.getBasis();
				seperatingAxisInBBatch[i] = norm * transB.getBasis();
			}

			{
				int numPDA = convexA.getNumPreferredPenetrationDirections();
				if( numPDA )
				{
					for( int i = 0; i < numPDA; i++ )
					{
						btVector3 norm;
						convexA.getPreferredPenetrationDirection( i, norm );
						norm = transA.getBasis() * norm;
						getPenetrationDirections()[numSampleDirections] = norm;
						seperatingAxisInABatch[numSampleDirections] = ( -norm ) * transA.getBasis();
						seperatingAxisInBBatch[numSampleDirections] = norm * transB.getBasis();
						numSampleDirections++;
					}
				}
			}

			{
				int numPDB = convexB.getNumPreferredPenetrationDirections();
				if( numPDB )
				{
					for( int i = 0; i < numPDB; i++ )
					{
						btVector3 norm;
						convexB.getPreferredPenetrationDirection( i, norm );
						norm = transB.getBasis() * norm;
						getPenetrationDirections()[numSampleDirections] = norm;
						seperatingAxisInABatch[numSampleDirections] = ( -norm ) * transA.getBasis();
						seperatingAxisInBBatch[numSampleDirections] = norm * transB.getBasis();
						numSampleDirections++;
					}
				}
			}




			convexA.batchedUnitVectorGetSupportingVertexWithoutMargin( seperatingAxisInABatch, supportVerticesABatch, numSampleDirections );
			convexB.batchedUnitVectorGetSupportingVertexWithoutMargin( seperatingAxisInBBatch, supportVerticesBBatch, numSampleDirections );

			for( i = 0; i < numSampleDirections; i++ )
			{
				btVector3 norm = getPenetrationDirections()[i];
				if( check2d )
				{
					norm[2] = 0;
				}
				if( norm.length2() > 0.01 )
				{

					seperatingAxisInA = seperatingAxisInABatch[i];
					seperatingAxisInB = seperatingAxisInBBatch[i];

					pInA = supportVerticesABatch[i];
					qInB = supportVerticesBBatch[i];

					pWorld = transA( pInA );
					qWorld = transB( qInB );
					if( check2d )
					{
						pWorld[2] = 0;
						qWorld[2] = 0;
					}

					w = qWorld - pWorld;
					double delta = norm.dot( w );
					//find smallest delta
					if( delta < minProj )
					{
						minProj = delta;
						minNorm = norm;
						minA = pWorld;
						minB = qWorld;
					}
				}
			}
#else

	int numSampleDirections = NUM_UNITSPHERE_POINTS;

#if !__SPU__
	{
		int numPDA = convexA.getNumPreferredPenetrationDirections();
		if (numPDA)
		{
			for (int i=0;i<numPDA;i++)
			{
				btVector3 norm;
				convexA.getPreferredPenetrationDirection(i,norm);
				norm  = transA.getBasis() * norm;
				getPenetrationDirections()[numSampleDirections] = norm;
				numSampleDirections++;
			}
		}
	}

	{
		int numPDB = convexB.getNumPreferredPenetrationDirections();
		if (numPDB)
		{
			for (int i=0;i<numPDB;i++)
			{
				btVector3 norm;
				convexB.getPreferredPenetrationDirection(i,norm);
				norm  = transB.getBasis() * norm;
				getPenetrationDirections()[numSampleDirections] = norm;
				numSampleDirections++;
			}
		}
	}
#endif // __SPU__

	for (int i=0;i<numSampleDirections;i++)
	{
		ref btVector3 norm = getPenetrationDirections()[i];
		seperatingAxisInA = (-norm)* transA.getBasis();
		seperatingAxisInB = norm* transB.getBasis();
		pInA = convexA.localGetSupportVertexWithoutMarginNonVirtual(seperatingAxisInA);
		qInB = convexB.localGetSupportVertexWithoutMarginNonVirtual(seperatingAxisInB);
		pWorld = transA(pInA);	
		qWorld = transB(qInB);
		w	= qWorld - pWorld;
		double delta = norm.dot(w);
		//find smallest delta
		if (delta < minProj)
		{
			minProj = delta;
			minNorm = norm;
			minA = pWorld;
			minB = qWorld;
		}
	}