Fixes for FPU exceptions, thanks to Phil Knight for reporting and John McCutchan for fix/workarounds.
Added new cluster collision methods for soft bodies, thanks to Nathanael Presson. Enable/disable textures/shadows for specific demos.
This commit is contained in:
@@ -120,6 +120,17 @@ btDemoEntry g_demoEntries[] =
|
|||||||
{"SoftBody Torus Match",SoftDemo14::Create},
|
{"SoftBody Torus Match",SoftDemo14::Create},
|
||||||
{"SoftBody Bunny",SoftDemo15::Create},
|
{"SoftBody Bunny",SoftDemo15::Create},
|
||||||
{"SoftBody Bunny Match",SoftDemo16::Create},
|
{"SoftBody Bunny Match",SoftDemo16::Create},
|
||||||
|
{"SoftBody Init Cutting",SoftDemo17::Create},
|
||||||
|
{"SoftBody Cluster Deform",SoftDemo18::Create},
|
||||||
|
{"SoftBody Cluster Collide1",SoftDemo19::Create},
|
||||||
|
{"SoftBody Cluster Collide2",SoftDemo20::Create},
|
||||||
|
{"SoftBody Cluster Socket",SoftDemo21::Create},
|
||||||
|
{"SoftBody Cluster Hinge",SoftDemo22::Create},
|
||||||
|
{"SoftBody Cluster Combine",SoftDemo23::Create},
|
||||||
|
{"SoftBody Cluster Car",SoftDemo24::Create},
|
||||||
|
{"SoftBody Cluster Robot",SoftDemo25::Create},
|
||||||
|
{"SoftBody Cluster Stack Soft",SoftDemo26::Create},
|
||||||
|
{"SoftBody Cluster Stack Mixed",SoftDemo27::Create},
|
||||||
{"DynamicControlDemo",MotorDemo::Create},
|
{"DynamicControlDemo",MotorDemo::Create},
|
||||||
{"RagdollDemo",RagdollDemo::Create},
|
{"RagdollDemo",RagdollDemo::Create},
|
||||||
{"SliderConstraint",SliderConstraintDemo::Create},
|
{"SliderConstraint",SliderConstraintDemo::Create},
|
||||||
|
|||||||
@@ -329,6 +329,21 @@ void MouseMotion(int x, int y)
|
|||||||
int main(int argc, char** argv)
|
int main(int argc, char** argv)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
//#define CHECK_FPU_EXCEPTIONS 1
|
||||||
|
#ifdef CHECK_FPU_EXCEPTIONS
|
||||||
|
|
||||||
|
int cw = _control87(0, 0);
|
||||||
|
|
||||||
|
// Set the exception masks off, turn exceptions on
|
||||||
|
cw &= ~(EM_ZERODIVIDE | EM_INVALID);
|
||||||
|
|
||||||
|
printf("control87 = %#x\n", cw);
|
||||||
|
|
||||||
|
// Set the control word
|
||||||
|
_control87(cw, MCW_EM);
|
||||||
|
#endif //CHECK_FPU_EXCEPTIONS
|
||||||
|
|
||||||
|
|
||||||
setDefaultSettings();
|
setDefaultSettings();
|
||||||
|
|
||||||
int bulletVersion = btGetVersion();
|
int bulletVersion = btGetVersion();
|
||||||
|
|||||||
@@ -77,6 +77,8 @@ void BasicDemo::displayCallback(void) {
|
|||||||
|
|
||||||
void BasicDemo::initPhysics()
|
void BasicDemo::initPhysics()
|
||||||
{
|
{
|
||||||
|
setTexturing(true);
|
||||||
|
setShadows(true);
|
||||||
|
|
||||||
setCameraDistance(btScalar(50.));
|
setCameraDistance(btScalar(50.));
|
||||||
|
|
||||||
@@ -102,8 +104,8 @@ void BasicDemo::initPhysics()
|
|||||||
m_dynamicsWorld->setGravity(btVector3(0,-10,0));
|
m_dynamicsWorld->setGravity(btVector3(0,-10,0));
|
||||||
|
|
||||||
///create a few basic rigid bodies
|
///create a few basic rigid bodies
|
||||||
// btCollisionShape* groundShape = new btBoxShape(btVector3(btScalar(50.),btScalar(50.),btScalar(50.)));
|
btCollisionShape* groundShape = new btBoxShape(btVector3(btScalar(50.),btScalar(50.),btScalar(50.)));
|
||||||
btCollisionShape* groundShape = new btStaticPlaneShape(btVector3(0,1,0),50);
|
// btCollisionShape* groundShape = new btStaticPlaneShape(btVector3(0,1,0),50);
|
||||||
|
|
||||||
m_collisionShapes.push_back(groundShape);
|
m_collisionShapes.push_back(groundShape);
|
||||||
|
|
||||||
|
|||||||
@@ -133,7 +133,8 @@ BspDemo::~BspDemo()
|
|||||||
|
|
||||||
void BspDemo::initPhysics(char* bspfilename)
|
void BspDemo::initPhysics(char* bspfilename)
|
||||||
{
|
{
|
||||||
|
setTexturing(true);
|
||||||
|
setShadows(false);
|
||||||
|
|
||||||
m_cameraUp = btVector3(0,0,1);
|
m_cameraUp = btVector3(0,0,1);
|
||||||
m_forwardAxis = 1;
|
m_forwardAxis = 1;
|
||||||
|
|||||||
@@ -319,6 +319,9 @@ float myFrictionModel( btRigidBody& body1, btRigidBody& body2, btManifoldPoint&
|
|||||||
|
|
||||||
void CcdPhysicsDemo::initPhysics()
|
void CcdPhysicsDemo::initPhysics()
|
||||||
{
|
{
|
||||||
|
setTexturing(true);
|
||||||
|
setShadows(false);
|
||||||
|
|
||||||
#ifdef USE_PARALLEL_DISPATCHER
|
#ifdef USE_PARALLEL_DISPATCHER
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
m_threadSupportSolver = 0;
|
m_threadSupportSolver = 0;
|
||||||
|
|||||||
@@ -226,13 +226,16 @@ void CollisionDemo::displayCallback(void) {
|
|||||||
|
|
||||||
convexConvex.getClosestPoints(input ,gjkOutput,0);
|
convexConvex.getClosestPoints(input ,gjkOutput,0);
|
||||||
|
|
||||||
|
btVector3 worldBoundsMin(-1000,-1000,-1000);
|
||||||
|
btVector3 worldBoundsMax(1000,1000,1000);
|
||||||
|
|
||||||
|
|
||||||
for (i=0;i<numObjects;i++)
|
for (i=0;i<numObjects;i++)
|
||||||
{
|
{
|
||||||
|
|
||||||
tr[i].getOpenGLMatrix( m );
|
tr[i].getOpenGLMatrix( m );
|
||||||
|
|
||||||
m_shapeDrawer.drawOpenGL(m,shapePtr[i],btVector3(1,1,1),getDebugMode());
|
m_shapeDrawer.drawOpenGL(m,shapePtr[i],btVector3(1,1,1),getDebugMode(),worldBoundsMin,worldBoundsMax);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -248,7 +251,7 @@ void CollisionDemo::displayCallback(void) {
|
|||||||
btTransform ident;
|
btTransform ident;
|
||||||
ident.setIdentity();
|
ident.setIdentity();
|
||||||
ident.getOpenGLMatrix(m);
|
ident.getOpenGLMatrix(m);
|
||||||
m_shapeDrawer.drawOpenGL(m,&simplex,btVector3(1,1,1),getDebugMode());
|
m_shapeDrawer.drawOpenGL(m,&simplex,btVector3(1,1,1),getDebugMode(),worldBoundsMin,worldBoundsMax);
|
||||||
|
|
||||||
|
|
||||||
btQuaternion orn;
|
btQuaternion orn;
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ int main(int argc,char** argv)
|
|||||||
void CollisionInterfaceDemo::initPhysics()
|
void CollisionInterfaceDemo::initPhysics()
|
||||||
{
|
{
|
||||||
|
|
||||||
m_debugMode |= btIDebugDraw::DBG_DrawWireframe;
|
//m_debugMode |= btIDebugDraw::DBG_DrawWireframe;
|
||||||
|
|
||||||
btMatrix3x3 basisA;
|
btMatrix3x3 basisA;
|
||||||
basisA.setIdentity();
|
basisA.setIdentity();
|
||||||
@@ -158,13 +158,15 @@ void CollisionInterfaceDemo::displayCallback(void) {
|
|||||||
|
|
||||||
btScalar m[16];
|
btScalar m[16];
|
||||||
|
|
||||||
|
btVector3 worldBoundsMin,worldBoundsMax;
|
||||||
|
collisionWorld->getBroadphase()->getBroadphaseAabb(worldBoundsMin,worldBoundsMax);
|
||||||
|
|
||||||
|
|
||||||
for (i=0;i<numObjects;i++)
|
for (i=0;i<numObjects;i++)
|
||||||
{
|
{
|
||||||
|
|
||||||
objects[i].getWorldTransform().getOpenGLMatrix( m );
|
objects[i].getWorldTransform().getOpenGLMatrix( m );
|
||||||
m_shapeDrawer.drawOpenGL(m,objects[i].getCollisionShape(),btVector3(1,1,1),getDebugMode());
|
m_shapeDrawer.drawOpenGL(m,objects[i].getCollisionShape(),btVector3(1,1,1),getDebugMode(),worldBoundsMin,worldBoundsMax);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -138,6 +138,10 @@ void ConcaveDemo::keyboardCallback(unsigned char key, int x, int y)
|
|||||||
|
|
||||||
void ConcaveDemo::initPhysics()
|
void ConcaveDemo::initPhysics()
|
||||||
{
|
{
|
||||||
|
|
||||||
|
setTexturing(true);
|
||||||
|
setShadows(false);
|
||||||
|
|
||||||
#define TRISIZE 10.f
|
#define TRISIZE 10.f
|
||||||
|
|
||||||
gContactAddedCallback = CustomMaterialCombinerCallback;
|
gContactAddedCallback = CustomMaterialCombinerCallback;
|
||||||
|
|||||||
@@ -63,6 +63,9 @@ void drawLimit()
|
|||||||
|
|
||||||
void ConstraintDemo::initPhysics()
|
void ConstraintDemo::initPhysics()
|
||||||
{
|
{
|
||||||
|
setTexturing(true);
|
||||||
|
setShadows(true);
|
||||||
|
|
||||||
setCameraDistance(26.f);
|
setCameraDistance(26.f);
|
||||||
|
|
||||||
m_collisionConfiguration = new btDefaultCollisionConfiguration();
|
m_collisionConfiguration = new btDefaultCollisionConfiguration();
|
||||||
|
|||||||
@@ -149,6 +149,10 @@ void btContinuousConvexCollisionDemo::displayCallback(void) {
|
|||||||
btScalar m[16];
|
btScalar m[16];
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
btVector3 worldBoundsMin(-1000,-1000,-1000);
|
||||||
|
btVector3 worldBoundsMax(1000,1000,1000);
|
||||||
|
|
||||||
|
|
||||||
/*for (i=0;i<numObjects;i++)
|
/*for (i=0;i<numObjects;i++)
|
||||||
{
|
{
|
||||||
fromTrans[i].getOpenGLMatrix( m );
|
fromTrans[i].getOpenGLMatrix( m );
|
||||||
@@ -177,7 +181,7 @@ void btContinuousConvexCollisionDemo::displayCallback(void) {
|
|||||||
//m_shapeDrawer.drawOpenGL(m,shapePtr[i]);
|
//m_shapeDrawer.drawOpenGL(m,shapePtr[i]);
|
||||||
|
|
||||||
interpolatedTrans.getOpenGLMatrix( m );
|
interpolatedTrans.getOpenGLMatrix( m );
|
||||||
m_shapeDrawer.drawOpenGL(m,shapePtr[i],btVector3(1,0,1),getDebugMode());
|
m_shapeDrawer.drawOpenGL(m,shapePtr[i],btVector3(1,0,1),getDebugMode(),worldBoundsMin,worldBoundsMax);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -229,7 +233,7 @@ void btContinuousConvexCollisionDemo::displayCallback(void) {
|
|||||||
for (i=0;i<numObjects;i++)
|
for (i=0;i<numObjects;i++)
|
||||||
{
|
{
|
||||||
fromTrans[i].getOpenGLMatrix(m);
|
fromTrans[i].getOpenGLMatrix(m);
|
||||||
m_shapeDrawer.drawOpenGL(m,shapePtr[i],btVector3(1,1,1),getDebugMode());
|
m_shapeDrawer.drawOpenGL(m,shapePtr[i],btVector3(1,1,1),getDebugMode(),worldBoundsMin,worldBoundsMax);
|
||||||
}
|
}
|
||||||
|
|
||||||
btDebugCastResult rayResult1(fromTrans[0],shapePtr[0],linVels[0],angVels[0],&m_shapeDrawer);
|
btDebugCastResult rayResult1(fromTrans[0],shapePtr[0],linVels[0],angVels[0],&m_shapeDrawer);
|
||||||
@@ -267,12 +271,12 @@ void btContinuousConvexCollisionDemo::displayCallback(void) {
|
|||||||
btTransformUtil::integrateTransform(fromTrans[0],linVels[0],angVels[0],rayResultPtr->m_fraction,hitTrans);
|
btTransformUtil::integrateTransform(fromTrans[0],linVels[0],angVels[0],rayResultPtr->m_fraction,hitTrans);
|
||||||
|
|
||||||
hitTrans.getOpenGLMatrix(m);
|
hitTrans.getOpenGLMatrix(m);
|
||||||
m_shapeDrawer.drawOpenGL(m,shapePtr[0],btVector3(0,1,0),getDebugMode());
|
m_shapeDrawer.drawOpenGL(m,shapePtr[0],btVector3(0,1,0),getDebugMode(),worldBoundsMin,worldBoundsMax);
|
||||||
|
|
||||||
btTransformUtil::integrateTransform(fromTrans[i],linVels[i],angVels[i],rayResultPtr->m_fraction,hitTrans);
|
btTransformUtil::integrateTransform(fromTrans[i],linVels[i],angVels[i],rayResultPtr->m_fraction,hitTrans);
|
||||||
|
|
||||||
hitTrans.getOpenGLMatrix(m);
|
hitTrans.getOpenGLMatrix(m);
|
||||||
m_shapeDrawer.drawOpenGL(m,shapePtr[i],btVector3(0,1,1),getDebugMode());
|
m_shapeDrawer.drawOpenGL(m,shapePtr[i],btVector3(0,1,1),getDebugMode(),worldBoundsMin,worldBoundsMax);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -59,6 +59,9 @@ unsigned int tcount = 0;
|
|||||||
|
|
||||||
void ConvexDecompositionDemo::initPhysics(const char* filename)
|
void ConvexDecompositionDemo::initPhysics(const char* filename)
|
||||||
{
|
{
|
||||||
|
setTexturing(true);
|
||||||
|
setShadows(true);
|
||||||
|
|
||||||
setCameraDistance(26.f);
|
setCameraDistance(26.f);
|
||||||
|
|
||||||
ConvexDecomposition::WavefrontObj wo;
|
ConvexDecomposition::WavefrontObj wo;
|
||||||
|
|||||||
@@ -121,6 +121,10 @@ void DoublePrecisionDemo::displayCallback(void)
|
|||||||
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
btVector3 worldBoundsMin,worldBoundsMax;
|
||||||
|
collisionWorld->getBroadphase()->getBroadphaseAabb(worldBoundsMin,worldBoundsMax);
|
||||||
|
|
||||||
|
|
||||||
///one way to draw all the contact points is iterating over contact manifolds / points:
|
///one way to draw all the contact points is iterating over contact manifolds / points:
|
||||||
int numManifolds = collisionWorld->getDispatcher()->getNumManifolds();
|
int numManifolds = collisionWorld->getDispatcher()->getNumManifolds();
|
||||||
for (i=0;i<numManifolds;i++)
|
for (i=0;i<numManifolds;i++)
|
||||||
@@ -169,7 +173,7 @@ void DoublePrecisionDemo::displayCallback(void)
|
|||||||
temp = objects[i].getWorldTransform();
|
temp = objects[i].getWorldTransform();
|
||||||
temp.setOrigin(temp.getOrigin() - m_cameraPosition);
|
temp.setOrigin(temp.getOrigin() - m_cameraPosition);
|
||||||
temp.getOpenGLMatrix( m );
|
temp.getOpenGLMatrix( m );
|
||||||
m_shapeDrawer.drawOpenGL(m,objects[i].getCollisionShape(),color,getDebugMode());
|
m_shapeDrawer.drawOpenGL(m,objects[i].getCollisionShape(),color,getDebugMode(),worldBoundsMin,worldBoundsMax);
|
||||||
}
|
}
|
||||||
|
|
||||||
objects[1].getWorldTransform().setOrigin(objects[1].getWorldTransform().getOrigin()+btVector3(-VERY_SMALL_INCREMENT,-VERY_SMALL_INCREMENT,0));
|
objects[1].getWorldTransform().setOrigin(objects[1].getWorldTransform().getOrigin()+btVector3(-VERY_SMALL_INCREMENT,-VERY_SMALL_INCREMENT,0));
|
||||||
|
|||||||
@@ -249,6 +249,9 @@ public:
|
|||||||
|
|
||||||
void MotorDemo::initPhysics()
|
void MotorDemo::initPhysics()
|
||||||
{
|
{
|
||||||
|
setTexturing(true);
|
||||||
|
setShadows(true);
|
||||||
|
|
||||||
// Setup the basic world
|
// Setup the basic world
|
||||||
|
|
||||||
m_Time = 0;
|
m_Time = 0;
|
||||||
|
|||||||
@@ -59,6 +59,9 @@ int main(int argc,char* argv[])
|
|||||||
|
|
||||||
void GenericJointDemo::initPhysics()
|
void GenericJointDemo::initPhysics()
|
||||||
{
|
{
|
||||||
|
setTexturing(true);
|
||||||
|
setShadows(true);
|
||||||
|
|
||||||
// Setup the basic world
|
// Setup the basic world
|
||||||
|
|
||||||
btDefaultCollisionConfiguration * collision_config = new btDefaultCollisionConfiguration();
|
btDefaultCollisionConfiguration * collision_config = new btDefaultCollisionConfiguration();
|
||||||
|
|||||||
@@ -110,6 +110,10 @@ void GimpactConcaveDemo::renderme()
|
|||||||
|
|
||||||
if (m_dynamicsWorld)
|
if (m_dynamicsWorld)
|
||||||
{
|
{
|
||||||
|
btVector3 worldBoundsMin,worldBoundsMax;
|
||||||
|
getDynamicsWorld()->getBroadphase()->getBroadphaseAabb(worldBoundsMin,worldBoundsMax);
|
||||||
|
|
||||||
|
|
||||||
int numObjects = m_dynamicsWorld->getNumCollisionObjects();
|
int numObjects = m_dynamicsWorld->getNumCollisionObjects();
|
||||||
btVector3 wireColor(1,0,0);
|
btVector3 wireColor(1,0,0);
|
||||||
for (int i=0;i<numObjects;i++)
|
for (int i=0;i<numObjects;i++)
|
||||||
@@ -153,7 +157,7 @@ void GimpactConcaveDemo::renderme()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
m_shapeDrawer.drawOpenGL(m,colObj->getCollisionShape(),wireColor,getDebugMode());
|
m_shapeDrawer.drawOpenGL(m,colObj->getCollisionShape(),wireColor,getDebugMode(),worldBoundsMin,worldBoundsMax);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -364,6 +368,9 @@ btCollisionShape * GimpactConcaveDemo::createBunnyShape()
|
|||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
void GimpactConcaveDemo::initPhysics()
|
void GimpactConcaveDemo::initPhysics()
|
||||||
{
|
{
|
||||||
|
setTexturing(true);
|
||||||
|
setShadows(false);
|
||||||
|
|
||||||
setCameraDistance(45.f);
|
setCameraDistance(45.f);
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -136,6 +136,10 @@ void LinearConvexCastDemo::displayCallback(void)
|
|||||||
gGjkSimplexSolver.reset();
|
gGjkSimplexSolver.reset();
|
||||||
|
|
||||||
|
|
||||||
|
btVector3 worldBoundsMin(-1000,-1000,-1000);
|
||||||
|
btVector3 worldBoundsMax(1000,1000,1000);
|
||||||
|
|
||||||
|
|
||||||
//btGjkConvexCast convexCaster(shapePtr[ 0 ], shapePtr[ 1 ], &gGjkSimplexSolver );
|
//btGjkConvexCast convexCaster(shapePtr[ 0 ], shapePtr[ 1 ], &gGjkSimplexSolver );
|
||||||
btSubsimplexConvexCast convexCaster( shapePtr[ 0 ], shapePtr[ 1 ], &gGjkSimplexSolver );
|
btSubsimplexConvexCast convexCaster( shapePtr[ 0 ], shapePtr[ 1 ], &gGjkSimplexSolver );
|
||||||
|
|
||||||
@@ -154,11 +158,11 @@ void LinearConvexCastDemo::displayCallback(void)
|
|||||||
btTransform tmp = tr[0];
|
btTransform tmp = tr[0];
|
||||||
tmp.setOrigin(result.m_hitPoint);
|
tmp.setOrigin(result.m_hitPoint);
|
||||||
tmp.getOpenGLMatrix(m3);
|
tmp.getOpenGLMatrix(m3);
|
||||||
m_shapeDrawer.drawOpenGL( m3, &sphere, btVector3( 1, 0, 1 ), getDebugMode() );
|
m_shapeDrawer.drawOpenGL( m3, &sphere, btVector3( 1, 0, 1 ), getDebugMode() ,worldBoundsMin,worldBoundsMax);
|
||||||
|
|
||||||
|
|
||||||
m_shapeDrawer.drawOpenGL( m1, shapePtr[ 0 ], btVector3( 1, 0, 0 ), getDebugMode() );
|
m_shapeDrawer.drawOpenGL( m1, shapePtr[ 0 ], btVector3( 1, 0, 0 ), getDebugMode() ,worldBoundsMin,worldBoundsMax);
|
||||||
m_shapeDrawer.drawOpenGL( m2, shapePtr[ 1 ], btVector3( 1, 0, 0 ), getDebugMode() );
|
m_shapeDrawer.drawOpenGL( m2, shapePtr[ 1 ], btVector3( 1, 0, 0 ), getDebugMode() ,worldBoundsMin,worldBoundsMax);
|
||||||
|
|
||||||
btVector3 originA, originB;
|
btVector3 originA, originB;
|
||||||
originA.setInterpolate3( tr[ 0 ].getOrigin(), toA.getOrigin(), result.m_fraction );
|
originA.setInterpolate3( tr[ 0 ].getOrigin(), toA.getOrigin(), result.m_fraction );
|
||||||
@@ -173,8 +177,8 @@ void LinearConvexCastDemo::displayCallback(void)
|
|||||||
A.getOpenGLMatrix( m1 );
|
A.getOpenGLMatrix( m1 );
|
||||||
B.getOpenGLMatrix( m2 );
|
B.getOpenGLMatrix( m2 );
|
||||||
|
|
||||||
m_shapeDrawer.drawOpenGL( m1, shapePtr[ 0 ], btVector3( 1, 1, 0 ), getDebugMode() );
|
m_shapeDrawer.drawOpenGL( m1, shapePtr[ 0 ], btVector3( 1, 1, 0 ), getDebugMode() ,worldBoundsMin,worldBoundsMax);
|
||||||
m_shapeDrawer.drawOpenGL( m2, shapePtr[ 1 ], btVector3( 1, 1, 0 ), getDebugMode() );
|
m_shapeDrawer.drawOpenGL( m2, shapePtr[ 1 ], btVector3( 1, 1, 0 ), getDebugMode() ,worldBoundsMin,worldBoundsMax);
|
||||||
|
|
||||||
glFlush();
|
glFlush();
|
||||||
glutSwapBuffers();
|
glutSwapBuffers();
|
||||||
|
|||||||
@@ -1492,6 +1492,10 @@ void ConcaveDemo::renderme()
|
|||||||
|
|
||||||
if (m_dynamicsWorld)
|
if (m_dynamicsWorld)
|
||||||
{
|
{
|
||||||
|
btVector3 worldBoundsMin,worldBoundsMax;
|
||||||
|
getDynamicsWorld()->getBroadphase()->getBroadphaseAabb(worldBoundsMin,worldBoundsMax);
|
||||||
|
|
||||||
|
|
||||||
int numObjects = m_dynamicsWorld->getNumCollisionObjects();
|
int numObjects = m_dynamicsWorld->getNumCollisionObjects();
|
||||||
btVector3 wireColor(1,0,0);
|
btVector3 wireColor(1,0,0);
|
||||||
for (int i=0;i<numObjects;i++)
|
for (int i=0;i<numObjects;i++)
|
||||||
@@ -1535,7 +1539,7 @@ void ConcaveDemo::renderme()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
m_shapeDrawer.drawOpenGL(m,colObj->getCollisionShape(),wireColor,getDebugMode());
|
m_shapeDrawer.drawOpenGL(m,colObj->getCollisionShape(),wireColor,getDebugMode(),worldBoundsMin,worldBoundsMax);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -23,4 +23,7 @@ ADD_EXECUTABLE(MultiThreadedDemo
|
|||||||
MultiThreadedDemo.cpp
|
MultiThreadedDemo.cpp
|
||||||
MultiThreadedDemo.h
|
MultiThreadedDemo.h
|
||||||
)
|
)
|
||||||
|
IF (UNIX)
|
||||||
|
TARGET_LINK_LIBRARIES(MultiThreadedDemo pthread)
|
||||||
|
ENDIF(UNIX)
|
||||||
|
|
||||||
|
|||||||
@@ -70,12 +70,15 @@ struct btDebugCastResult : public btConvexCast::CastResult
|
|||||||
|
|
||||||
virtual void DebugDraw(btScalar fraction)
|
virtual void DebugDraw(btScalar fraction)
|
||||||
{
|
{
|
||||||
|
btVector3 worldBoundsMin(-1000,-1000,-1000);
|
||||||
|
btVector3 worldBoundsMax(1000,1000,1000);
|
||||||
|
|
||||||
|
|
||||||
btScalar m[16];
|
btScalar m[16];
|
||||||
btTransform hitTrans;
|
btTransform hitTrans;
|
||||||
btTransformUtil::integrateTransform(m_fromTrans,m_linVel,m_angVel,fraction,hitTrans);
|
btTransformUtil::integrateTransform(m_fromTrans,m_linVel,m_angVel,fraction,hitTrans);
|
||||||
hitTrans.getOpenGLMatrix(m);
|
hitTrans.getOpenGLMatrix(m);
|
||||||
m_shapeDrawer->drawOpenGL(m,m_shape,btVector3(1,0,0),btIDebugDraw::DBG_NoDebug);
|
m_shapeDrawer->drawOpenGL(m,m_shape,btVector3(1,0,0),btIDebugDraw::DBG_NoDebug,worldBoundsMin,worldBoundsMax);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -78,6 +78,9 @@ m_shootBoxShape(0),
|
|||||||
#ifndef BT_NO_PROFILE
|
#ifndef BT_NO_PROFILE
|
||||||
m_profileIterator = CProfileManager::Get_Iterator();
|
m_profileIterator = CProfileManager::Get_Iterator();
|
||||||
#endif //BT_NO_PROFILE
|
#endif //BT_NO_PROFILE
|
||||||
|
|
||||||
|
m_shapeDrawer.enableTexture(true);
|
||||||
|
m_enableshadows = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -957,11 +960,15 @@ for(int i=0;i<numObjects;i++)
|
|||||||
wireColor += btVector3 (0.f,0.5f,0.f);
|
wireColor += btVector3 (0.f,0.5f,0.f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
btVector3 aabbMin,aabbMax;
|
||||||
|
m_dynamicsWorld->getBroadphase()->getBroadphaseAabb(aabbMin,aabbMax);
|
||||||
|
|
||||||
switch(pass)
|
switch(pass)
|
||||||
{
|
{
|
||||||
case 0: m_shapeDrawer.drawOpenGL(m,colObj->getCollisionShape(),wireColor,getDebugMode());break;
|
case 0: m_shapeDrawer.drawOpenGL(m,colObj->getCollisionShape(),wireColor,getDebugMode(),aabbMin,aabbMax);break;
|
||||||
case 1: m_shapeDrawer.drawShadow(m,m_sundirection*rot,colObj->getCollisionShape());break;
|
case 1: m_shapeDrawer.drawShadow(m,m_sundirection*rot,colObj->getCollisionShape(),aabbMin,aabbMax);break;
|
||||||
case 2: m_shapeDrawer.drawOpenGL(m,colObj->getCollisionShape(),wireColor*0.3,0);break;
|
case 2: m_shapeDrawer.drawOpenGL(m,colObj->getCollisionShape(),wireColor*0.3,0,aabbMin,aabbMax);break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -360,7 +360,7 @@ GL_ShapeDrawer::ShapeCache* GL_ShapeDrawer::cache(btConvexShape* shape)
|
|||||||
return(sc);
|
return(sc);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GL_ShapeDrawer::drawOpenGL(btScalar* m, const btCollisionShape* shape, const btVector3& color,int debugMode)
|
void GL_ShapeDrawer::drawOpenGL(btScalar* m, const btCollisionShape* shape, const btVector3& color,int debugMode,const btVector3& worldBoundsMin,const btVector3& worldBoundsMax)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
@@ -378,7 +378,7 @@ void GL_ShapeDrawer::drawOpenGL(btScalar* m, const btCollisionShape* shape, cons
|
|||||||
{0,0,scalingFactor,0},
|
{0,0,scalingFactor,0},
|
||||||
{0,0,0,1}};
|
{0,0,0,1}};
|
||||||
|
|
||||||
drawOpenGL( (btScalar*)tmpScaling,convexShape,color,debugMode);
|
drawOpenGL( (btScalar*)tmpScaling,convexShape,color,debugMode,worldBoundsMin,worldBoundsMax);
|
||||||
}
|
}
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
return;
|
return;
|
||||||
@@ -393,7 +393,7 @@ void GL_ShapeDrawer::drawOpenGL(btScalar* m, const btCollisionShape* shape, cons
|
|||||||
const btCollisionShape* colShape = compoundShape->getChildShape(i);
|
const btCollisionShape* colShape = compoundShape->getChildShape(i);
|
||||||
btScalar childMat[16];
|
btScalar childMat[16];
|
||||||
childTrans.getOpenGLMatrix(childMat);
|
childTrans.getOpenGLMatrix(childMat);
|
||||||
drawOpenGL(childMat,colShape,color,debugMode);
|
drawOpenGL(childMat,colShape,color,debugMode,worldBoundsMin,worldBoundsMax);
|
||||||
}
|
}
|
||||||
|
|
||||||
} else
|
} else
|
||||||
@@ -447,6 +447,9 @@ void GL_ShapeDrawer::drawOpenGL(btScalar* m, const btCollisionShape* shape, cons
|
|||||||
{
|
{
|
||||||
glEnable(GL_TEXTURE_2D);
|
glEnable(GL_TEXTURE_2D);
|
||||||
glBindTexture(GL_TEXTURE_2D,m_texturehandle);
|
glBindTexture(GL_TEXTURE_2D,m_texturehandle);
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
glDisable(GL_TEXTURE_2D);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -692,17 +695,11 @@ void GL_ShapeDrawer::drawOpenGL(btScalar* m, const btCollisionShape* shape, cons
|
|||||||
// if (shape->getShapeType() == TRIANGLE_MESH_SHAPE_PROXYTYPE)
|
// if (shape->getShapeType() == TRIANGLE_MESH_SHAPE_PROXYTYPE)
|
||||||
{
|
{
|
||||||
btConcaveShape* concaveMesh = (btConcaveShape*) shape;
|
btConcaveShape* concaveMesh = (btConcaveShape*) shape;
|
||||||
//btVector3 aabbMax(btScalar(1e30),btScalar(1e30),btScalar(1e30));
|
|
||||||
//btVector3 aabbMax(100,100,100);//btScalar(1e30),btScalar(1e30),btScalar(1e30));
|
|
||||||
|
|
||||||
//todo pass camera, for some culling
|
|
||||||
btVector3 aabbMax(btScalar(1e30),btScalar(1e30),btScalar(1e30));
|
|
||||||
btVector3 aabbMin(-btScalar(1e30),-btScalar(1e30),-btScalar(1e30));
|
|
||||||
|
|
||||||
GlDrawcallback drawCallback;
|
GlDrawcallback drawCallback;
|
||||||
drawCallback.m_wireframe = (debugMode & btIDebugDraw::DBG_DrawWireframe)!=0;
|
drawCallback.m_wireframe = (debugMode & btIDebugDraw::DBG_DrawWireframe)!=0;
|
||||||
|
|
||||||
concaveMesh->processAllTriangles(&drawCallback,aabbMin,aabbMax);
|
concaveMesh->processAllTriangles(&drawCallback,worldBoundsMin,worldBoundsMax);
|
||||||
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -749,7 +746,7 @@ if(m_textureenabled) glDisable(GL_TEXTURE_2D);
|
|||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
void GL_ShapeDrawer::drawShadow(btScalar* m,const btVector3& extrusion,const btCollisionShape* shape)
|
void GL_ShapeDrawer::drawShadow(btScalar* m,const btVector3& extrusion,const btCollisionShape* shape,const btVector3& worldBoundsMin,const btVector3& worldBoundsMax)
|
||||||
{
|
{
|
||||||
glPushMatrix();
|
glPushMatrix();
|
||||||
btglMultMatrix(m);
|
btglMultMatrix(m);
|
||||||
@@ -762,7 +759,7 @@ void GL_ShapeDrawer::drawShadow(btScalar* m,const btVector3& extrusion,const bt
|
|||||||
{0,scalingFactor,0,0},
|
{0,scalingFactor,0,0},
|
||||||
{0,0,scalingFactor,0},
|
{0,0,scalingFactor,0},
|
||||||
{0,0,0,1}};
|
{0,0,0,1}};
|
||||||
drawShadow((btScalar*)tmpScaling,extrusion,convexShape);
|
drawShadow((btScalar*)tmpScaling,extrusion,convexShape,worldBoundsMin,worldBoundsMax);
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -775,7 +772,7 @@ void GL_ShapeDrawer::drawShadow(btScalar* m,const btVector3& extrusion,const bt
|
|||||||
const btCollisionShape* colShape = compoundShape->getChildShape(i);
|
const btCollisionShape* colShape = compoundShape->getChildShape(i);
|
||||||
btScalar childMat[16];
|
btScalar childMat[16];
|
||||||
childTrans.getOpenGLMatrix(childMat);
|
childTrans.getOpenGLMatrix(childMat);
|
||||||
drawShadow(childMat,extrusion*childTrans.getBasis(),colShape);
|
drawShadow(childMat,extrusion*childTrans.getBasis(),colShape,worldBoundsMin,worldBoundsMax);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -812,17 +809,11 @@ void GL_ShapeDrawer::drawShadow(btScalar* m,const btVector3& extrusion,const bt
|
|||||||
// if (shape->getShapeType() == TRIANGLE_MESH_SHAPE_PROXYTYPE)
|
// if (shape->getShapeType() == TRIANGLE_MESH_SHAPE_PROXYTYPE)
|
||||||
{
|
{
|
||||||
btConcaveShape* concaveMesh = (btConcaveShape*) shape;
|
btConcaveShape* concaveMesh = (btConcaveShape*) shape;
|
||||||
//btVector3 aabbMax(btScalar(1e30),btScalar(1e30),btScalar(1e30));
|
|
||||||
//btVector3 aabbMax(100,100,100);//btScalar(1e30),btScalar(1e30),btScalar(1e30));
|
|
||||||
|
|
||||||
//todo pass camera, for some culling
|
|
||||||
btVector3 aabbMax(btScalar(1e30),btScalar(1e30),btScalar(1e30));
|
|
||||||
btVector3 aabbMin(-btScalar(1e30),-btScalar(1e30),-btScalar(1e30));
|
|
||||||
|
|
||||||
GlDrawcallback drawCallback;
|
GlDrawcallback drawCallback;
|
||||||
drawCallback.m_wireframe = false;
|
drawCallback.m_wireframe = false;
|
||||||
|
|
||||||
concaveMesh->processAllTriangles(&drawCallback,aabbMin,aabbMax);
|
concaveMesh->processAllTriangles(&drawCallback,worldBoundsMin,worldBoundsMax);
|
||||||
|
|
||||||
}
|
}
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
|
|||||||
@@ -47,8 +47,8 @@ class GL_ShapeDrawer
|
|||||||
virtual ~GL_ShapeDrawer();
|
virtual ~GL_ShapeDrawer();
|
||||||
|
|
||||||
///drawOpenGL might allocate temporary memoty, stores pointer in shape userpointer
|
///drawOpenGL might allocate temporary memoty, stores pointer in shape userpointer
|
||||||
void drawOpenGL(btScalar* m, const btCollisionShape* shape, const btVector3& color,int debugMode);
|
void drawOpenGL(btScalar* m, const btCollisionShape* shape, const btVector3& color,int debugMode,const btVector3& worldBoundsMin,const btVector3& worldBoundsMax);
|
||||||
void drawShadow(btScalar* m, const btVector3& extrusion,const btCollisionShape* shape);
|
void drawShadow(btScalar* m, const btVector3& extrusion,const btCollisionShape* shape,const btVector3& worldBoundsMin,const btVector3& worldBoundsMax);
|
||||||
|
|
||||||
bool enableTexture(bool enable) { bool p=m_textureenabled;m_textureenabled=enable;return(p); }
|
bool enableTexture(bool enable) { bool p=m_textureenabled;m_textureenabled=enable;return(p); }
|
||||||
|
|
||||||
|
|||||||
@@ -309,6 +309,9 @@ void RagdollDemo::initPhysics()
|
|||||||
{
|
{
|
||||||
// Setup the basic world
|
// Setup the basic world
|
||||||
|
|
||||||
|
setTexturing(true);
|
||||||
|
setShadows(true);
|
||||||
|
|
||||||
setCameraDistance(btScalar(5.));
|
setCameraDistance(btScalar(5.));
|
||||||
|
|
||||||
m_collisionConfiguration = new btDefaultCollisionConfiguration();
|
m_collisionConfiguration = new btDefaultCollisionConfiguration();
|
||||||
|
|||||||
@@ -76,6 +76,9 @@ void SimplexDemo::displayCallback()
|
|||||||
btScalar m[16];
|
btScalar m[16];
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
btVector3 worldBoundsMin(-1000,-1000,-1000);
|
||||||
|
btVector3 worldBoundsMax(1000,1000,1000);
|
||||||
|
|
||||||
for (i=0;i<numObjects;i++)
|
for (i=0;i<numObjects;i++)
|
||||||
{
|
{
|
||||||
btTransform transA;
|
btTransform transA;
|
||||||
@@ -88,7 +91,7 @@ void SimplexDemo::displayCallback()
|
|||||||
transA.getOpenGLMatrix( m );
|
transA.getOpenGLMatrix( m );
|
||||||
|
|
||||||
/// draw the simplex
|
/// draw the simplex
|
||||||
m_shapeDrawer.drawOpenGL(m,shapePtr[i],btVector3(1,1,1),getDebugMode());
|
m_shapeDrawer.drawOpenGL(m,shapePtr[i],btVector3(1,1,1),getDebugMode(),worldBoundsMin,worldBoundsMax);
|
||||||
|
|
||||||
/// calculate closest point from simplex to the origin, and draw this vector
|
/// calculate closest point from simplex to the origin, and draw this vector
|
||||||
simplex.calcClosest(m);
|
simplex.calcClosest(m);
|
||||||
|
|||||||
@@ -165,6 +165,17 @@ MACRO_SOFT_DEMO(13)//Init_Torus
|
|||||||
MACRO_SOFT_DEMO(14)//Init_TorusMatch
|
MACRO_SOFT_DEMO(14)//Init_TorusMatch
|
||||||
MACRO_SOFT_DEMO(15)//Init_Bunny
|
MACRO_SOFT_DEMO(15)//Init_Bunny
|
||||||
MACRO_SOFT_DEMO(16)//Init_BunnyMatch
|
MACRO_SOFT_DEMO(16)//Init_BunnyMatch
|
||||||
|
MACRO_SOFT_DEMO(17)//Init_Cutting1
|
||||||
|
MACRO_SOFT_DEMO(18)//Init_ClusterDeform
|
||||||
|
MACRO_SOFT_DEMO(19)//Init_ClusterCollide1
|
||||||
|
MACRO_SOFT_DEMO(20)//Init_ClusterCollide2
|
||||||
|
MACRO_SOFT_DEMO(21)//Init_ClusterSocket
|
||||||
|
MACRO_SOFT_DEMO(22)//Init_ClusterHinge
|
||||||
|
MACRO_SOFT_DEMO(23)//Init_ClusterCombine
|
||||||
|
MACRO_SOFT_DEMO(24)//Init_ClusterCar
|
||||||
|
MACRO_SOFT_DEMO(25)//Init_ClusterRobot
|
||||||
|
MACRO_SOFT_DEMO(26)//Init_ClusterStackSoft
|
||||||
|
MACRO_SOFT_DEMO(27)//Init_ClusterStackMixed
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -403,13 +403,18 @@ void VehicleDemo::renderme()
|
|||||||
btCylinderShapeX wheelShape(btVector3(wheelWidth,wheelRadius,wheelRadius));
|
btCylinderShapeX wheelShape(btVector3(wheelWidth,wheelRadius,wheelRadius));
|
||||||
btVector3 wheelColor(1,0,0);
|
btVector3 wheelColor(1,0,0);
|
||||||
|
|
||||||
|
btVector3 worldBoundsMin,worldBoundsMax;
|
||||||
|
getDynamicsWorld()->getBroadphase()->getBroadphaseAabb(worldBoundsMin,worldBoundsMax);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
for (i=0;i<m_vehicle->getNumWheels();i++)
|
for (i=0;i<m_vehicle->getNumWheels();i++)
|
||||||
{
|
{
|
||||||
//synchronize the wheels with the (interpolated) chassis worldtransform
|
//synchronize the wheels with the (interpolated) chassis worldtransform
|
||||||
m_vehicle->updateWheelTransform(i,true);
|
m_vehicle->updateWheelTransform(i,true);
|
||||||
//draw wheels (cylinders)
|
//draw wheels (cylinders)
|
||||||
m_vehicle->getWheelInfo(i).m_worldTransform.getOpenGLMatrix(m);
|
m_vehicle->getWheelInfo(i).m_worldTransform.getOpenGLMatrix(m);
|
||||||
m_shapeDrawer.drawOpenGL(m,&wheelShape,wheelColor,getDebugMode());
|
m_shapeDrawer.drawOpenGL(m,&wheelShape,wheelColor,getDebugMode(),worldBoundsMin,worldBoundsMax);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -235,7 +235,7 @@ btCollisionAlgorithmCreateFunc* btDefaultCollisionConfiguration::getCollisionAlg
|
|||||||
|
|
||||||
if ((proxyType0 == BOX_SHAPE_PROXYTYPE) && (proxyType1 == BOX_SHAPE_PROXYTYPE))
|
if ((proxyType0 == BOX_SHAPE_PROXYTYPE) && (proxyType1 == BOX_SHAPE_PROXYTYPE))
|
||||||
{
|
{
|
||||||
//return m_boxBoxCF;
|
return m_boxBoxCF;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (btBroadphaseProxy::isConvex(proxyType0) && (proxyType1 == STATIC_PLANE_PROXYTYPE))
|
if (btBroadphaseProxy::isConvex(proxyType0) && (proxyType1 == STATIC_PLANE_PROXYTYPE))
|
||||||
|
|||||||
@@ -803,10 +803,10 @@ void btOptimizedBvh::walkStacklessQuantizedTreeAgainstRay(btNodeOverlapCallback*
|
|||||||
btVector3 rayDirection = (rayTarget-raySource);
|
btVector3 rayDirection = (rayTarget-raySource);
|
||||||
rayDirection.normalize ();
|
rayDirection.normalize ();
|
||||||
lambda_max = rayDirection.dot(rayTarget-raySource);
|
lambda_max = rayDirection.dot(rayTarget-raySource);
|
||||||
///what about division by zero?
|
///what about division by zero? --> just set rayDirection[i] to 1.0
|
||||||
rayDirection[0] = btScalar(1.0) / rayDirection[0];
|
rayDirection[0] = rayDirection[0] == btScalar(0.0) ? btScalar(1.0) : btScalar(1.0) / rayDirection[0];
|
||||||
rayDirection[1] = btScalar(1.0) / rayDirection[1];
|
rayDirection[1] = rayDirection[1] == btScalar(0.0) ? btScalar(1.0) : btScalar(1.0) / rayDirection[1];
|
||||||
rayDirection[2] = btScalar(1.0) / rayDirection[2];
|
rayDirection[2] = rayDirection[2] == btScalar(0.0) ? btScalar(1.0) : btScalar(1.0) / rayDirection[2];
|
||||||
unsigned int sign[3] = { rayDirection[0] < 0.0, rayDirection[1] < 0.0, rayDirection[2] < 0.0};
|
unsigned int sign[3] = { rayDirection[0] < 0.0, rayDirection[1] < 0.0, rayDirection[2] < 0.0};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -1365,3 +1365,4 @@ m_bvhQuantization(self.m_bvhQuantization)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -901,6 +901,7 @@ if(gjk_status==GJK::eStatus::Valid)
|
|||||||
const btVector3 delta= results.witnesses[0]-
|
const btVector3 delta= results.witnesses[0]-
|
||||||
results.witnesses[1];
|
results.witnesses[1];
|
||||||
const btScalar length= delta.length();
|
const btScalar length= delta.length();
|
||||||
|
if (length >= SIMD_EPSILON)
|
||||||
results.normal = delta/length;
|
results.normal = delta/length;
|
||||||
return(-length);
|
return(-length);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -137,7 +137,10 @@ bool btSubsimplexConvexCast::calcTimeOfImpact(
|
|||||||
|
|
||||||
|
|
||||||
result.m_fraction = lambda;
|
result.m_fraction = lambda;
|
||||||
|
if (n.length2() >= (SIMD_EPSILON*SIMD_EPSILON))
|
||||||
result.m_normal = n.normalized();
|
result.m_normal = n.normalized();
|
||||||
|
else
|
||||||
|
result.m_normal = btVector3(btScalar(0.0), btScalar(0.0), btScalar(0.0));
|
||||||
|
|
||||||
//don't report time of impact for motion away from the contact normal (or causes minor penetration)
|
//don't report time of impact for motion away from the contact normal (or causes minor penetration)
|
||||||
if (result.m_normal.dot(r)>=-result.m_allowedPenetration)
|
if (result.m_normal.dot(r)>=-result.m_allowedPenetration)
|
||||||
@@ -151,3 +154,4 @@ bool btSubsimplexConvexCast::calcTimeOfImpact(
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1723,7 +1723,9 @@ void btSoftBody::updateNormals()
|
|||||||
}
|
}
|
||||||
for(i=0,ni=m_nodes.size();i<ni;++i)
|
for(i=0,ni=m_nodes.size();i<ni;++i)
|
||||||
{
|
{
|
||||||
m_nodes[i].m_n.normalize();
|
btScalar len = m_nodes[i].m_n.length();
|
||||||
|
if (len>SIMD_EPSILON)
|
||||||
|
m_nodes[i].m_n /= len;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user