This commit is contained in:
ejcoumans
2006-11-14 05:09:11 +00:00
parent 133a7dda99
commit be175e888e
9 changed files with 86 additions and 15 deletions

View File

@@ -35,7 +35,10 @@
#include "../Extras/ExtraSolid35/Solid3JohnsonSimplexSolver.h" #include "../Extras/ExtraSolid35/Solid3JohnsonSimplexSolver.h"
#include "../Extras/EPA/EpaPenetrationDepthSolver.h" #include "../Extras/EPA/EpaPenetrationDepthSolver.h"
#define USE_ORIGINAL 1
#ifndef USE_ORIGINAL
#include "BulletCollision/NarrowPhaseCollision/btGjkEpa.h"
#endif //USE_ORIGINAL
static bool gRefMode = false; static bool gRefMode = false;
static int gMethod = 0; static int gMethod = 0;
@@ -295,6 +298,9 @@ static bool TestEPA(const MyConvex& hull0, const MyConvex& hull1)
else else
Solver = &Solver2; Solver = &Solver2;
#ifdef USE_ORIGINAL
btGjkPairDetector GJK(&convexA, &convexB, &simplexSolver, Solver); btGjkPairDetector GJK(&convexA, &convexB, &simplexSolver, Solver);
GJK.m_catchDegeneracies = 1; GJK.m_catchDegeneracies = 1;
convexA.setMargin(0.01f); convexA.setMargin(0.01f);
@@ -309,6 +315,21 @@ static bool TestEPA(const MyConvex& hull0, const MyConvex& hull1)
gLastUsedMethod = GJK.m_lastUsedMethod; gLastUsedMethod = GJK.m_lastUsedMethod;
gNumGjkIterations = GJK.m_curIter; gNumGjkIterations = GJK.m_curIter;
gLastDegenerateSimplex= GJK.m_degenerateSimplex; gLastDegenerateSimplex= GJK.m_degenerateSimplex;
#else
MyResult output;
btVector3 witnesses[2];
btVector3 normal;
btScalar depth;
btGjkEpaSolver::Collide(&convexA,hull0.mTransform,
&convexB,hull1.mTransform,
0.01,0.01,
witnesses,normal,depth);
if (depth>0)
{
output.addContactPoint(normal,witnesses[1],-depth);
}
#endif
return true; return true;
} }

View File

@@ -892,5 +892,14 @@ void DemoApplication::clientResetScene()
btRigidBody::upcast(colObj)->setAngularVelocity(btVector3(0,0,0)); btRigidBody::upcast(colObj)->setAngularVelocity(btVector3(0,0,0));
} }
} }
/*
//quickly search some issue at a certain simulation frame, pressing space to reset
int fixed=18;
for (int i=0;i<fixed;i++)
{
getDynamicsWorld()->stepSimulation(1./60.f,1);
}
*/
} }
} }

View File

@@ -126,7 +126,9 @@ get current memory management functions.
*/ */
//! @{ //! @{
gim_alloc_function *gim_get_alloc_handler (void); gim_alloc_function *gim_get_alloc_handler (void);
#ifdef ALLOCA_GIMPACT
gim_alloca_function *gim_get_alloca_handler(void); gim_alloca_function *gim_get_alloca_handler(void);
#endif //
gim_realloc_function *gim_get_realloc_handler (void); gim_realloc_function *gim_get_realloc_handler (void);
gim_free_function *gim_get_free_handler (void); gim_free_function *gim_get_free_handler (void);
//! @} //! @}

View File

@@ -133,10 +133,13 @@ void * gim_alloc(size_t size)
return ptr; return ptr;
} }
#ifdef ALLOCA_GIMPACT
void * gim_alloca(size_t size) void * gim_alloca(size_t size)
{ {
if (g_allocafn) return g_allocafn(size); else return alloca(size); if (g_allocafn) return g_allocafn(size); else
return alloca(size);
} }
#endif
void * gim_realloc(void *ptr, size_t oldsize, size_t newsize) void * gim_realloc(void *ptr, size_t oldsize, size_t newsize)
@@ -305,13 +308,13 @@ void gim_destroy_buffer_manager(GUINT buffer_manager_id)
GBUFFER_DATA * buffers = GIM_DYNARRAY_POINTER(GBUFFER_DATA,bm_data->m_buffer_array); GBUFFER_DATA * buffers = GIM_DYNARRAY_POINTER(GBUFFER_DATA,bm_data->m_buffer_array);
GUINT i, buffer_count = bm_data->m_buffer_array.m_size; GUINT i, buffer_count = bm_data->m_buffer_array.m_size;
for (i=0;i<buffer_count ;i++ ) for (i=0;i<buffer_count ;i++ )
{ {
if(buffers[i].m_buffer_handle!=0) //Is active if(buffers[i].m_buffer_handle!=0) //Is active
{ {
// free handle // free handle
bm_data->m_prototype.free_fn(buffers[i].m_buffer_handle,buffers[i].m_size); bm_data->m_prototype.free_fn(buffers[i].m_buffer_handle,buffers[i].m_size);
} }
} }
//destroy buffer array //destroy buffer array
@@ -339,7 +342,7 @@ void gim_get_buffer_manager_data(GUINT buffer_manager_id,GBUFFER_MANAGER_DATA **
void gim_init_buffer_managers() void gim_init_buffer_managers()
{ {
GUINT i; GUINT i;
for (i=0;i<MAX_BUFFER_MANAGERS;i++) for (i=0;i<MAX_BUFFER_MANAGERS;i++)
{ {
g_buffer_managers[i].m_active = 0; g_buffer_managers[i].m_active = 0;
g_buffer_managers[i].m_buffer_array.m_pdata = 0; g_buffer_managers[i].m_buffer_array.m_pdata = 0;
@@ -347,7 +350,7 @@ void gim_init_buffer_managers()
g_buffer_managers[i].m_buffer_array.m_size = 0; g_buffer_managers[i].m_buffer_array.m_size = 0;
g_buffer_managers[i].m_free_positions.m_pdata = 0; g_buffer_managers[i].m_free_positions.m_pdata = 0;
g_buffer_managers[i].m_free_positions.m_reserve_size = 0; g_buffer_managers[i].m_free_positions.m_reserve_size = 0;
g_buffer_managers[i].m_free_positions.m_size = 0; g_buffer_managers[i].m_free_positions.m_size = 0;
} }
g_buffer_managers_count = 0; g_buffer_managers_count = 0;
// Add the two most important buffer managers // Add the two most important buffer managers

View File

@@ -121,13 +121,13 @@ void btCollisionWorld::addCollisionObject(btCollisionObject* collisionObject,sho
} }
void btCollisionWorld::performDiscreteCollisionDetection()
void btCollisionWorld::performDiscreteCollisionDetection(btDispatcherInfo& dispatchInfo)
{ {
BEGIN_PROFILE("performDiscreteCollisionDetection"); BEGIN_PROFILE("performDiscreteCollisionDetection");
btDispatcherInfo dispatchInfo;
dispatchInfo.m_timeStep = 0.f;
dispatchInfo.m_stepCount = 0;
//update aabb (of all moved objects) //update aabb (of all moved objects)

View File

@@ -236,8 +236,8 @@ public:
void removeCollisionObject(btCollisionObject* collisionObject); void removeCollisionObject(btCollisionObject* collisionObject);
virtual void performDiscreteCollisionDetection(); virtual void performDiscreteCollisionDetection( btDispatcherInfo& dispatchInfo);
}; };

View File

@@ -39,6 +39,10 @@ subject to the following restrictions:
#include "BulletCollision/NarrowPhaseCollision/btMinkowskiPenetrationDepthSolver.h" #include "BulletCollision/NarrowPhaseCollision/btMinkowskiPenetrationDepthSolver.h"
#ifdef USE_BT_GJKEPA
#include "BulletCollision/NarrowPhaseCollision/btGjkEpa.h"
#endif //USE_BT_GJKEPA
//#include "NarrowPhaseCollision/EpaPenetrationDepthSolver.h" //#include "NarrowPhaseCollision/EpaPenetrationDepthSolver.h"
#ifdef WIN32 #ifdef WIN32
@@ -155,6 +159,26 @@ void btConvexConvexAlgorithm ::processCollision (btCollisionObject* body0,btColl
} }
#ifdef USE_BT_GJKEPA
btVector3 witnesses[2];
btVector3 normal(0,0,0);
btScalar depth(0);
btConvexShape* shape0(static_cast<btConvexShape*>(body0->getCollisionShape()));
btConvexShape* shape1(static_cast<btConvexShape*>(body1->getCollisionShape()));
const btScalar margin(shape0->getMargin()+shape1->getMargin());
resultOut->setPersistentManifold(m_manifoldPtr);
if(btGjkEpaSolver::Collide( shape0,body0->getWorldTransform(),
shape1,body1->getWorldTransform(),
shape0->getMargin(),shape1->getMargin(),
witnesses,normal,depth))
{
//optional: draw the contact+normal
//dispatchInfo.m_debugDraw->drawLine(witnesses[1],witnesses[1]+normal,btVector3(255,0,0));
resultOut->addContactPoint(normal,witnesses[1],-depth);
}
#else
checkPenetrationDepthSolver(); checkPenetrationDepthSolver();
btConvexShape* min0 = static_cast<btConvexShape*>(body0->getCollisionShape()); btConvexShape* min0 = static_cast<btConvexShape*>(body0->getCollisionShape());
@@ -175,6 +199,7 @@ void btConvexConvexAlgorithm ::processCollision (btCollisionObject* body0,btColl
resultOut->setPersistentManifold(m_manifoldPtr); resultOut->setPersistentManifold(m_manifoldPtr);
m_gjkPairDetector.getClosestPoints(input,*resultOut,dispatchInfo.m_debugDraw); m_gjkPairDetector.getClosestPoints(input,*resultOut,dispatchInfo.m_debugDraw);
#endif
} }

View File

@@ -267,8 +267,14 @@ void btDiscreteDynamicsWorld::internalSingleStepSimulation(float timeStep)
///apply gravity, predict motion ///apply gravity, predict motion
predictUnconstraintMotion(timeStep); predictUnconstraintMotion(timeStep);
btDispatcherInfo dispatchInfo;
dispatchInfo.m_timeStep = timeStep;
dispatchInfo.m_stepCount = 0;
dispatchInfo.m_debugDraw = getDebugDrawer();
///perform collision detection ///perform collision detection
performDiscreteCollisionDetection(); performDiscreteCollisionDetection(dispatchInfo);
calculateSimulationIslands(); calculateSimulationIslands();

View File

@@ -52,8 +52,13 @@ int btSimpleDynamicsWorld::stepSimulation( float timeStep,int maxSubSteps, floa
///apply gravity, predict motion ///apply gravity, predict motion
predictUnconstraintMotion(timeStep); predictUnconstraintMotion(timeStep);
btDispatcherInfo dispatchInfo;
dispatchInfo.m_timeStep = timeStep;
dispatchInfo.m_stepCount = 0;
dispatchInfo.m_debugDraw = getDebugDrawer();
///perform collision detection ///perform collision detection
performDiscreteCollisionDetection(); performDiscreteCollisionDetection(dispatchInfo );
///solve contact constraints ///solve contact constraints
int numManifolds = m_dispatcher1->getNumManifolds(); int numManifolds = m_dispatcher1->getNumManifolds();