60
btDiscreteDynamicsWorld::btDiscreteDynamicsWorld(btDispatcher* dispatcher,btOverlappingPairCache* pairCache,btConstraintSolver* constraintSolver)
61
:btDynamicsWorld(dispatcher,pairCache),
62
m_constraintSolver(constraintSolver? constraintSolver: new btSequentialImpulseConstraintSolver),
62
btDiscreteDynamicsWorld::btDiscreteDynamicsWorld(btDispatcher* dispatcher,btBroadphaseInterface* pairCache,btConstraintSolver* constraintSolver, btCollisionConfiguration* collisionConfiguration)
63
:btDynamicsWorld(dispatcher,pairCache,collisionConfiguration),
64
m_constraintSolver(constraintSolver),
64
65
m_gravity(0,-10,0),
65
66
m_localTime(btScalar(1.)/btScalar(60.)),
66
67
m_profileTimings(0)
68
m_islandManager = new btSimulationIslandManager();
69
if (!m_constraintSolver)
71
void* mem = btAlignedAlloc(sizeof(btSequentialImpulseConstraintSolver),16);
72
m_constraintSolver = new (mem) btSequentialImpulseConstraintSolver;
73
m_ownsConstraintSolver = true;
76
m_ownsConstraintSolver = false;
80
void* mem = btAlignedAlloc(sizeof(btSimulationIslandManager),16);
81
m_islandManager = new (mem) btSimulationIslandManager();
69
84
m_ownsIslandManager = true;
70
m_ownsConstraintSolver = (constraintSolver==0);
105
void btDiscreteDynamicsWorld::synchronizeMotionStates()
126
void btDiscreteDynamicsWorld::debugDrawWorld()
107
//debug vehicle wheels
129
if (getDebugDrawer() && getDebugDrawer()->getDebugMode() & btIDebugDraw::DBG_DrawContactPoints)
131
int numManifolds = getDispatcher()->getNumManifolds();
132
btVector3 color(0,0,0);
133
for (int i=0;i<numManifolds;i++)
135
btPersistentManifold* contactManifold = getDispatcher()->getManifoldByIndexInternal(i);
136
//btCollisionObject* obA = static_cast<btCollisionObject*>(contactManifold->getBody0());
137
//btCollisionObject* obB = static_cast<btCollisionObject*>(contactManifold->getBody1());
139
int numContacts = contactManifold->getNumContacts();
140
for (int j=0;j<numContacts;j++)
142
btManifoldPoint& cp = contactManifold->getContactPoint(j);
143
getDebugDrawer()->drawContactPoint(cp.m_positionWorldOnB,cp.m_normalWorldOnB,cp.getDistance(),cp.getLifeTime(),color);
149
if (getDebugDrawer() && getDebugDrawer()->getDebugMode() & (btIDebugDraw::DBG_DrawWireframe | btIDebugDraw::DBG_DrawAabb))
111
153
//todo: iterate over awake simulation islands!
112
for ( int i=0;i<m_collisionObjects.size();i++)
154
for ( i=0;i<m_collisionObjects.size();i++)
114
156
btCollisionObject* colObj = m_collisionObjects[i];
115
157
if (getDebugDrawer() && getDebugDrawer()->getDebugMode() & btIDebugDraw::DBG_DrawWireframe)
136
178
debugDrawObject(colObj->getWorldTransform(),colObj->getCollisionShape(),color);
180
if (m_debugDrawer && (m_debugDrawer->getDebugMode() & btIDebugDraw::DBG_DrawAabb))
182
btPoint3 minAabb,maxAabb;
183
btVector3 colorvec(1,0,0);
184
colObj->getCollisionShape()->getAabb(colObj->getWorldTransform(), minAabb,maxAabb);
185
m_debugDrawer->drawAabb(minAabb,maxAabb,colorvec);
190
for ( i=0;i<this->m_vehicles.size();i++)
192
for (int v=0;v<m_vehicles[i]->getNumWheels();v++)
194
btVector3 wheelColor(0,255,255);
195
if (m_vehicles[i]->getWheelInfo(v).m_raycastInfo.m_isInContact)
197
wheelColor.setValue(0,0,255);
200
wheelColor.setValue(255,0,255);
203
btVector3 wheelPosWS = m_vehicles[i]->getWheelInfo(v).m_worldTransform.getOrigin();
205
btVector3 axle = btVector3(
206
m_vehicles[i]->getWheelInfo(v).m_worldTransform.getBasis()[0][m_vehicles[i]->getRightAxis()],
207
m_vehicles[i]->getWheelInfo(v).m_worldTransform.getBasis()[1][m_vehicles[i]->getRightAxis()],
208
m_vehicles[i]->getWheelInfo(v).m_worldTransform.getBasis()[2][m_vehicles[i]->getRightAxis()]);
211
//m_vehicles[i]->getWheelInfo(v).m_raycastInfo.m_wheelAxleWS
212
//debug wheels (cylinders)
213
m_debugDrawer->drawLine(wheelPosWS,wheelPosWS+axle,wheelColor);
214
m_debugDrawer->drawLine(wheelPosWS,m_vehicles[i]->getWheelInfo(v).m_raycastInfo.m_contactPointWS,wheelColor);
221
void btDiscreteDynamicsWorld::clearForces()
223
//todo: iterate over awake simulation islands!
224
for ( int i=0;i<m_collisionObjects.size();i++)
226
btCollisionObject* colObj = m_collisionObjects[i];
228
btRigidBody* body = btRigidBody::upcast(colObj);
236
///apply gravity, call this once per timestep
237
void btDiscreteDynamicsWorld::applyGravity()
239
//todo: iterate over awake simulation islands!
240
for ( int i=0;i<m_collisionObjects.size();i++)
242
btCollisionObject* colObj = m_collisionObjects[i];
244
btRigidBody* body = btRigidBody::upcast(colObj);
245
if (body && body->isActive())
247
body->applyGravity();
254
void btDiscreteDynamicsWorld::synchronizeMotionStates()
257
//todo: iterate over awake simulation islands!
258
for ( int i=0;i<m_collisionObjects.size();i++)
260
btCollisionObject* colObj = m_collisionObjects[i];
138
262
btRigidBody* body = btRigidBody::upcast(colObj);
139
263
if (body && body->getMotionState() && !body->isStaticOrKinematicObject())
159
283
for (int v=0;v<m_vehicles[i]->getNumWheels();v++)
161
btVector3 wheelColor(0,255,255);
162
if (m_vehicles[i]->getWheelInfo(v).m_raycastInfo.m_isInContact)
164
wheelColor.setValue(0,0,255);
167
wheelColor.setValue(255,0,255);
170
285
//synchronize the wheels with the (interpolated) chassis worldtransform
171
286
m_vehicles[i]->updateWheelTransform(v,true);
173
btVector3 wheelPosWS = m_vehicles[i]->getWheelInfo(v).m_worldTransform.getOrigin();
175
btVector3 axle = btVector3(
176
m_vehicles[i]->getWheelInfo(v).m_worldTransform.getBasis()[0][m_vehicles[i]->getRightAxis()],
177
m_vehicles[i]->getWheelInfo(v).m_worldTransform.getBasis()[1][m_vehicles[i]->getRightAxis()],
178
m_vehicles[i]->getWheelInfo(v).m_worldTransform.getBasis()[2][m_vehicles[i]->getRightAxis()]);
181
//m_vehicles[i]->getWheelInfo(v).m_raycastInfo.m_wheelAxleWS
182
//debug wheels (cylinders)
183
m_debugDrawer->drawLine(wheelPosWS,wheelPosWS+axle,wheelColor);
184
m_debugDrawer->drawLine(wheelPosWS,m_vehicles[i]->getWheelInfo(v).m_raycastInfo.m_contactPointWS,wheelColor);
460
588
btTypedConstraint** sortedConstraints,
461
589
int numConstraints,
462
590
btIDebugDraw* debugDrawer,
463
btStackAlloc* stackAlloc)
591
btStackAlloc* stackAlloc,
592
btDispatcher* dispatcher)
464
593
:m_solverInfo(solverInfo),
465
594
m_solver(solver),
466
595
m_sortedConstraints(sortedConstraints),
467
596
m_numConstraints(numConstraints),
468
597
m_debugDrawer(debugDrawer),
469
m_stackAlloc(stackAlloc)
598
m_stackAlloc(stackAlloc),
599
m_dispatcher(dispatcher)
480
610
virtual void ProcessIsland(btCollisionObject** bodies,int numBodies,btPersistentManifold** manifolds,int numManifolds, int islandId)
482
//also add all non-contact constraints/joints for this island
483
btTypedConstraint** startConstraint = 0;
484
int numCurConstraints = 0;
487
//find the first constraint for this island
488
for (i=0;i<m_numConstraints;i++)
490
if (btGetConstraintIslandId(m_sortedConstraints[i]) == islandId)
492
startConstraint = &m_sortedConstraints[i];
496
//count the number of constraints in this island
497
for (;i<m_numConstraints;i++)
499
if (btGetConstraintIslandId(m_sortedConstraints[i]) == islandId)
614
///we don't split islands, so all constraints/contact manifolds/bodies are passed into the solver regardless the island id
615
m_solver->solveGroup( bodies,numBodies,manifolds, numManifolds,&m_sortedConstraints[0],m_numConstraints,m_solverInfo,m_debugDrawer,m_stackAlloc,m_dispatcher);
618
//also add all non-contact constraints/joints for this island
619
btTypedConstraint** startConstraint = 0;
620
int numCurConstraints = 0;
623
//find the first constraint for this island
624
for (i=0;i<m_numConstraints;i++)
626
if (btGetConstraintIslandId(m_sortedConstraints[i]) == islandId)
628
startConstraint = &m_sortedConstraints[i];
632
//count the number of constraints in this island
633
for (;i<m_numConstraints;i++)
635
if (btGetConstraintIslandId(m_sortedConstraints[i]) == islandId)
505
m_solver->solveGroup( bodies,numBodies,manifolds, numManifolds,startConstraint,numCurConstraints,m_solverInfo,m_debugDrawer,m_stackAlloc);
641
///only call solveGroup if there is some work: avoid virtual function call, its overhead can be excessive
642
if (numManifolds + numCurConstraints)
644
m_solver->solveGroup( bodies,numBodies,manifolds, numManifolds,startConstraint,numCurConstraints,m_solverInfo,m_debugDrawer,m_stackAlloc,m_dispatcher);
523
sortedConstraints.heapSort(btSortConstraintOnIslandPredicate());
665
sortedConstraints.quickSort(btSortConstraintOnIslandPredicate());
525
667
btTypedConstraint** constraintsPtr = getNumConstraints() ? &sortedConstraints[0] : 0;
527
InplaceSolverIslandCallback solverCallback( solverInfo, m_constraintSolver, constraintsPtr,sortedConstraints.size(), m_debugDrawer,m_stackAlloc);
669
InplaceSolverIslandCallback solverCallback( solverInfo, m_constraintSolver, constraintsPtr,sortedConstraints.size(), m_debugDrawer,m_stackAlloc,m_dispatcher1);
671
m_constraintSolver->prepareSolve(getCollisionWorld()->getNumCollisionObjects(), getCollisionWorld()->getDispatcher()->getNumManifolds());
531
673
/// solve all the constraints for this island
532
674
m_islandManager->buildAndProcessIslands(getCollisionWorld()->getDispatcher(),getCollisionWorld()->getCollisionObjectArray(),&solverCallback);
676
m_constraintSolver->allSolved(solverInfo, m_debugDrawer, m_stackAlloc);
569
711
//Store the island id in each body
570
712
getSimulationIslandManager()->storeIslandActivationState(getCollisionWorld());
572
END_PROFILE("calculateSimulationIslands");
577
void btDiscreteDynamicsWorld::updateAabbs()
718
#include "BulletCollision/BroadphaseCollision/btCollisionAlgorithm.h"
720
class btClosestNotMeConvexResultCallback : public btCollisionWorld::ClosestConvexResultCallback
579
BEGIN_PROFILE("updateAabbs");
581
btVector3 colorvec(1,0,0);
582
btTransform predictedTrans;
583
for ( int i=0;i<m_collisionObjects.size();i++)
585
btCollisionObject* colObj = m_collisionObjects[i];
587
btRigidBody* body = btRigidBody::upcast(colObj);
722
btCollisionObject* m_me;
723
btScalar m_allowedPenetration;
724
btOverlappingPairCache* m_pairCache;
728
btClosestNotMeConvexResultCallback (btCollisionObject* me,const btVector3& fromA,const btVector3& toA,btOverlappingPairCache* pairCache) :
729
btCollisionWorld::ClosestConvexResultCallback(fromA,toA),
730
m_allowedPenetration(0.0f),
732
m_pairCache(pairCache)
736
virtual btScalar addSingleResult(btCollisionWorld::LocalConvexResult& convexResult,bool normalInWorldSpace)
738
if (convexResult.m_hitCollisionObject == m_me)
741
btVector3 linVelA,linVelB;
742
linVelA = m_convexToWorld-m_convexFromWorld;
743
linVelB = btVector3(0,0,0);//toB.getOrigin()-fromB.getOrigin();
745
btVector3 relativeVelocity = (linVelA-linVelB);
746
//don't report time of impact for motion away from the contact normal (or causes minor penetration)
747
if (convexResult.m_hitNormalLocal.dot(relativeVelocity)>=-m_allowedPenetration)
750
return ClosestConvexResultCallback::addSingleResult (convexResult, normalInWorldSpace);
753
virtual bool needsCollision(btBroadphaseProxy* proxy0) const
755
//don't collide with itself
756
if (proxy0->m_clientObject == m_me)
759
///don't do CCD when the collision filters are not matching
760
if (!btCollisionWorld::ClosestConvexResultCallback::needsCollision(proxy0))
763
///don't do CCD when there are already contact points (touching contact/penetration)
764
btAlignedObjectArray<btPersistentManifold*> manifoldArray;
765
btBroadphasePair* collisionPair = m_pairCache->findPair(m_me->getBroadphaseHandle(),proxy0);
590
// if (body->IsActive() && (!body->IsStatic()))
768
if (collisionPair->m_algorithm)
592
btPoint3 minAabb,maxAabb;
593
colObj->getCollisionShape()->getAabb(colObj->getWorldTransform(), minAabb,maxAabb);
594
btBroadphaseInterface* bp = (btBroadphaseInterface*)m_broadphasePairCache;
596
//moving objects should be moderately sized, probably something wrong if not
597
if ( colObj->isStaticObject() || ((maxAabb-minAabb).length2() < btScalar(1e12)))
599
bp->setAabb(body->getBroadphaseHandle(),minAabb,maxAabb);
602
//something went wrong, investigate
603
//this assert is unwanted in 3D modelers (danger of loosing work)
604
body->setActivationState(DISABLE_SIMULATION);
606
static bool reportMe = true;
607
if (reportMe && m_debugDrawer)
610
m_debugDrawer->reportErrorWarning("Overflow in AABB, object removed from simulation");
611
m_debugDrawer->reportErrorWarning("If you can reproduce this, please email bugs@continuousphysics.com\n");
612
m_debugDrawer->reportErrorWarning("Please include above information, your Platform, version of OS.\n");
613
m_debugDrawer->reportErrorWarning("Thanks.\n");
618
if (m_debugDrawer && (m_debugDrawer->getDebugMode() & btIDebugDraw::DBG_DrawAabb))
620
m_debugDrawer->drawAabb(minAabb,maxAabb,colorvec);
770
manifoldArray.resize(0);
771
collisionPair->m_algorithm->getAllContactManifolds(manifoldArray);
772
for (int j=0;j<manifoldArray.size();j++)
774
btPersistentManifold* manifold = manifoldArray[j];
775
if (manifold->getNumContacts()>0)
626
END_PROFILE("updateAabbs");
786
///internal debugging variable. this value shouldn't be too high
787
int gNumClampedCcdMotions=0;
629
790
void btDiscreteDynamicsWorld::integrateTransforms(btScalar timeStep)
631
BEGIN_PROFILE("integrateTransforms");
792
BT_PROFILE("integrateTransforms");
632
793
btTransform predictedTrans;
633
794
for ( int i=0;i<m_collisionObjects.size();i++)
636
797
btRigidBody* body = btRigidBody::upcast(colObj);
800
body->setHitFraction(1.f);
639
802
if (body->isActive() && (!body->isStaticOrKinematicObject()))
641
804
body->predictIntegratedTransform(timeStep, predictedTrans);
805
btScalar squareMotion = (predictedTrans.getOrigin()-body->getWorldTransform().getOrigin()).length2();
807
if (body->getCcdSquareMotionThreshold() && body->getCcdSquareMotionThreshold() < squareMotion)
809
BT_PROFILE("CCD motion clamping");
810
if (body->getCollisionShape()->isConvex())
812
gNumClampedCcdMotions++;
814
btClosestNotMeConvexResultCallback sweepResults(body,body->getWorldTransform().getOrigin(),predictedTrans.getOrigin(),getBroadphase()->getOverlappingPairCache());
815
btConvexShape* convexShape = static_cast<btConvexShape*>(body->getCollisionShape());
816
btSphereShape tmpSphere(body->getCcdSweptSphereRadius());//btConvexShape* convexShape = static_cast<btConvexShape*>(body->getCollisionShape());
817
convexSweepTest(&tmpSphere,body->getWorldTransform(),predictedTrans,sweepResults);
818
if (sweepResults.hasHit() && (sweepResults.m_closestHitFraction < 1.f))
820
body->setHitFraction(sweepResults.m_closestHitFraction);
821
body->predictIntegratedTransform(timeStep*body->getHitFraction(), predictedTrans);
822
body->setHitFraction(0.f);
823
// printf("clamped integration to hit fraction = %f\n",fraction);
642
828
body->proceedToTransform( predictedTrans);
646
END_PROFILE("integrateTransforms");
651
836
void btDiscreteDynamicsWorld::predictUnconstraintMotion(btScalar timeStep)
653
BEGIN_PROFILE("predictUnconstraintMotion");
838
BT_PROFILE("predictUnconstraintMotion");
654
839
for ( int i=0;i<m_collisionObjects.size();i++)
656
841
btCollisionObject* colObj = m_collisionObjects[i];
662
847
if (body->isActive())
664
body->applyForces( timeStep);
665
849
body->integrateVelocities( timeStep);
851
body->applyDamping(timeStep);
666
853
body->predictIntegratedTransform(timeStep,body->getInterpolationWorldTransform());
671
END_PROFILE("predictUnconstraintMotion");
675
861
void btDiscreteDynamicsWorld::startProfiling(btScalar timeStep)
682
if ( m_debugDrawer && m_debugDrawer->getDebugMode() & btIDebugDraw::DBG_ProfileTimings)
684
if (!m_profileTimings)
686
m_profileTimings = 1;
687
// To disable profiling, simply comment out the following line.
688
static int counter = 0;
691
sprintf(filename,"quickprof_bullet_timings%i.csv",counter++);
692
btProfiler::init(filename, btProfiler::BLOCK_CYCLE_SECONDS);//BLOCK_TOTAL_MICROSECONDS
695
btProfiler::endProfilingCycle();
700
if (m_profileTimings)
702
btProfiler::endProfilingCycle();
704
m_profileTimings = 0;
705
btProfiler::destroy();
708
#endif //USE_QUICKPROF
865
#ifndef BT_NO_PROFILE
866
CProfileManager::Reset();
867
#endif //BT_NO_PROFILE
828
988
btScalar radius = capsuleShape->getRadius();
829
989
btScalar halfHeight = capsuleShape->getHalfHeight();
991
int upAxis = capsuleShape->getUpAxis();
994
btVector3 capStart(0.f,0.f,0.f);
995
capStart[upAxis] = -halfHeight;
997
btVector3 capEnd(0.f,0.f,0.f);
998
capEnd[upAxis] = halfHeight;
831
1000
// Draw the ends
833
1003
btTransform childTransform = worldTransform;
834
childTransform.getOrigin() = worldTransform * btVector3(0,halfHeight,0);
1004
childTransform.getOrigin() = worldTransform * capStart;
835
1005
debugDrawSphere(radius, childTransform, color);
839
1009
btTransform childTransform = worldTransform;
840
childTransform.getOrigin() = worldTransform * btVector3(0,-halfHeight,0);
1010
childTransform.getOrigin() = worldTransform * capEnd;
841
1011
debugDrawSphere(radius, childTransform, color);
844
1014
// Draw some additional lines
845
1015
btVector3 start = worldTransform.getOrigin();
846
getDebugDrawer()->drawLine(start+worldTransform.getBasis() * btVector3(-radius,halfHeight,0),start+worldTransform.getBasis() * btVector3(-radius,-halfHeight,0), color);
847
getDebugDrawer()->drawLine(start+worldTransform.getBasis() * btVector3(radius,halfHeight,0),start+worldTransform.getBasis() * btVector3(radius,-halfHeight,0), color);
848
getDebugDrawer()->drawLine(start+worldTransform.getBasis() * btVector3(0,halfHeight,-radius),start+worldTransform.getBasis() * btVector3(0,-halfHeight,-radius), color);
849
getDebugDrawer()->drawLine(start+worldTransform.getBasis() * btVector3(0,halfHeight,radius),start+worldTransform.getBasis() * btVector3(0,-halfHeight,radius), color);
1018
capStart[(upAxis+1)%3] = radius;
1019
capEnd[(upAxis+1)%3] = radius;
1020
getDebugDrawer()->drawLine(start+worldTransform.getBasis() * capStart,start+worldTransform.getBasis() * capEnd, color);
1021
capStart[(upAxis+1)%3] = -radius;
1022
capEnd[(upAxis+1)%3] = -radius;
1023
getDebugDrawer()->drawLine(start+worldTransform.getBasis() * capStart,start+worldTransform.getBasis() * capEnd, color);
1025
capStart[(upAxis+1)%3] = 0.f;
1026
capEnd[(upAxis+1)%3] = 0.f;
1028
capStart[(upAxis+2)%3] = radius;
1029
capEnd[(upAxis+2)%3] = radius;
1030
getDebugDrawer()->drawLine(start+worldTransform.getBasis() * capStart,start+worldTransform.getBasis() * capEnd, color);
1031
capStart[(upAxis+2)%3] = -radius;
1032
capEnd[(upAxis+2)%3] = -radius;
1033
getDebugDrawer()->drawLine(start+worldTransform.getBasis() * capStart,start+worldTransform.getBasis() * capEnd, color);
853
1038
case CONE_SHAPE_PROXYTYPE:
856
1041
btScalar radius = coneShape->getRadius();//+coneShape->getMargin();
857
1042
btScalar height = coneShape->getHeight();//+coneShape->getMargin();
858
1043
btVector3 start = worldTransform.getOrigin();
859
getDebugDrawer()->drawLine(start+worldTransform.getBasis() * btVector3(btScalar(0.),btScalar(0.),btScalar(0.5)*height),start+worldTransform.getBasis() * btVector3(radius,btScalar(0.),btScalar(-0.5)*height),color);
860
getDebugDrawer()->drawLine(start+worldTransform.getBasis() * btVector3(btScalar(0.),btScalar(0.),btScalar(0.5)*height),start+worldTransform.getBasis() * btVector3(-radius,btScalar(0.),btScalar(-0.5)*height),color);
861
getDebugDrawer()->drawLine(start+worldTransform.getBasis() * btVector3(btScalar(0.),btScalar(0.),btScalar(0.5)*height),start+worldTransform.getBasis() * btVector3(btScalar(0.),radius,btScalar(-0.5)*height),color);
862
getDebugDrawer()->drawLine(start+worldTransform.getBasis() * btVector3(btScalar(0.),btScalar(0.),btScalar(0.5)*height),start+worldTransform.getBasis() * btVector3(btScalar(0.),-radius,btScalar(-0.5)*height),color);
1045
int upAxis= coneShape->getConeUpIndex();
1048
btVector3 offsetHeight(0,0,0);
1049
offsetHeight[upAxis] = height * btScalar(0.5);
1050
btVector3 offsetRadius(0,0,0);
1051
offsetRadius[(upAxis+1)%3] = radius;
1052
btVector3 offset2Radius(0,0,0);
1053
offset2Radius[(upAxis+2)%3] = radius;
1055
getDebugDrawer()->drawLine(start+worldTransform.getBasis() * (offsetHeight),start+worldTransform.getBasis() * (-offsetHeight+offsetRadius),color);
1056
getDebugDrawer()->drawLine(start+worldTransform.getBasis() * (offsetHeight),start+worldTransform.getBasis() * (-offsetHeight-offsetRadius),color);
1057
getDebugDrawer()->drawLine(start+worldTransform.getBasis() * (offsetHeight),start+worldTransform.getBasis() * (-offsetHeight+offset2Radius),color);
1058
getDebugDrawer()->drawLine(start+worldTransform.getBasis() * (offsetHeight),start+worldTransform.getBasis() * (-offsetHeight-offset2Radius),color);
878
1077
getDebugDrawer()->drawLine(start+worldTransform.getBasis() * (offsetHeight-offsetRadius),start+worldTransform.getBasis() * (-offsetHeight-offsetRadius),color);
1081
case STATIC_PLANE_PROXYTYPE:
1083
const btStaticPlaneShape* staticPlaneShape = static_cast<const btStaticPlaneShape*>(shape);
1084
btScalar planeConst = staticPlaneShape->getPlaneConstant();
1085
const btVector3& planeNormal = staticPlaneShape->getPlaneNormal();
1086
btVector3 planeOrigin = planeNormal * planeConst;
1087
btVector3 vec0,vec1;
1088
btPlaneSpace1(planeNormal,vec0,vec1);
1089
btScalar vecLen = 100.f;
1090
btVector3 pt0 = planeOrigin + vec0*vecLen;
1091
btVector3 pt1 = planeOrigin - vec0*vecLen;
1092
btVector3 pt2 = planeOrigin + vec1*vecLen;
1093
btVector3 pt3 = planeOrigin - vec1*vecLen;
1094
getDebugDrawer()->drawLine(worldTransform*pt0,worldTransform*pt1,color);
1095
getDebugDrawer()->drawLine(worldTransform*pt2,worldTransform*pt3,color);