330
335
m_triggerCallbacks[i] = 0;
338
// m_collisionConfiguration = new btDefaultCollisionConfiguration();
339
m_collisionConfiguration = new btSoftBodyRigidBodyCollisionConfiguration();
334
dispatcher = new btCollisionDispatcher();
343
btCollisionDispatcher* disp = new btCollisionDispatcher(m_collisionConfiguration);
345
btGImpactCollisionAlgorithm::registerAlgorithm(disp);
335
346
m_ownDispatcher = dispatcher;
341
//todo: calculate/let user specify this world sizes
342
btVector3 worldMin(-10000,-10000,-10000);
343
btVector3 worldMax(10000,10000,10000);
345
pairCache = new btAxisSweep3(worldMin,worldMax);
346
// remember that this was allocated by us so that we can release it
347
m_ownPairCache = pairCache;
348
//broadphase = new btSimpleBroadphase();
349
//m_broadphase = new btAxisSweep3(btVector3(-1000,-1000,-1000),btVector3(1000,1000,1000));
350
//m_broadphase = new btSimpleBroadphase();
351
m_broadphase = new btDbvtBroadphase();
351
353
m_filterCallback = new CcdOverlapFilterCallBack(this);
352
pairCache->setOverlapFilterCallback(m_filterCallback);
354
m_broadphase->getOverlappingPairCache()->setOverlapFilterCallback(m_filterCallback);
354
356
setSolverType(1);//issues with quickstep and memory allocations
355
m_dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher,pairCache,m_solver);
357
// m_dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher,m_broadphase,m_solver,m_collisionConfiguration);
358
m_dynamicsWorld = new btSoftRigidDynamicsWorld(dispatcher,m_broadphase,m_solver,m_collisionConfiguration);
356
360
m_debugDrawer = 0;
357
361
m_gravity = btVector3(0.f,-10.f,0.f);
358
362
m_dynamicsWorld->setGravity(m_gravity);
363
367
void CcdPhysicsEnvironment::addCcdPhysicsController(CcdPhysicsController* ctrl)
365
369
btRigidBody* body = ctrl->GetRigidBody();
370
btCollisionObject* obj = ctrl->GetCollisionObject();
367
372
//this m_userPointer is just used for triggers, see CallbackTriggers
368
body->setUserPointer(ctrl);
370
body->setGravity( m_gravity );
371
m_controllers.push_back(ctrl);
373
//use explicit group/filter for finer control over collision in bullet => near/radar sensor
374
m_dynamicsWorld->addRigidBody(body, ctrl->GetCollisionFilterGroup(), ctrl->GetCollisionFilterMask());
375
if (body->isStaticOrKinematicObject())
377
body->setActivationState(ISLAND_SLEEPING);
373
obj->setUserPointer(ctrl);
375
body->setGravity( m_gravity );
377
m_controllers.insert(ctrl);
381
//use explicit group/filter for finer control over collision in bullet => near/radar sensor
382
m_dynamicsWorld->addRigidBody(body, ctrl->GetCollisionFilterGroup(), ctrl->GetCollisionFilterMask());
385
if (ctrl->GetSoftBody())
387
btSoftBody* softBody = ctrl->GetSoftBody();
388
m_dynamicsWorld->addSoftBody(softBody);
391
if (obj->getCollisionShape())
393
m_dynamicsWorld->addCollisionObject(obj,ctrl->GetCollisionFilterGroup(), ctrl->GetCollisionFilterMask());
397
if (obj->isStaticOrKinematicObject())
399
obj->setActivationState(ISLAND_SLEEPING);
381
403
//CollisionObject(body,ctrl->GetCollisionFilterGroup(),ctrl->GetCollisionFilterMask());
383
assert(body->getBroadphaseHandle());
405
assert(obj->getBroadphaseHandle());
385
407
btBroadphaseInterface* scene = getBroadphase();
402
424
//extent it with the motion
404
btVector3 linMotion = body->getLinearVelocity()*timeStep;
406
float maxAabbx = maxAabb.getX();
407
float maxAabby = maxAabb.getY();
408
float maxAabbz = maxAabb.getZ();
409
float minAabbx = minAabb.getX();
410
float minAabby = minAabb.getY();
411
float minAabbz = minAabb.getZ();
413
if (linMotion.x() > 0.f)
414
maxAabbx += linMotion.x();
416
minAabbx += linMotion.x();
417
if (linMotion.y() > 0.f)
418
maxAabby += linMotion.y();
420
minAabby += linMotion.y();
421
if (linMotion.z() > 0.f)
422
maxAabbz += linMotion.z();
424
minAabbz += linMotion.z();
427
minAabb = btVector3(minAabbx,minAabby,minAabbz);
428
maxAabb = btVector3(maxAabbx,maxAabby,maxAabbz);
428
btVector3 linMotion = body->getLinearVelocity()*timeStep;
430
float maxAabbx = maxAabb.getX();
431
float maxAabby = maxAabb.getY();
432
float maxAabbz = maxAabb.getZ();
433
float minAabbx = minAabb.getX();
434
float minAabby = minAabb.getY();
435
float minAabbz = minAabb.getZ();
437
if (linMotion.x() > 0.f)
438
maxAabbx += linMotion.x();
440
minAabbx += linMotion.x();
441
if (linMotion.y() > 0.f)
442
maxAabby += linMotion.y();
444
minAabby += linMotion.y();
445
if (linMotion.z() > 0.f)
446
maxAabbz += linMotion.z();
448
minAabbz += linMotion.z();
451
minAabb = btVector3(minAabbx,minAabby,minAabbz);
452
maxAabb = btVector3(maxAabbx,maxAabby,maxAabbz);
435
461
void CcdPhysicsEnvironment::removeCcdPhysicsController(CcdPhysicsController* ctrl)
438
463
//also remove constraint
442
m_dynamicsWorld->removeRigidBody(ctrl->GetRigidBody());
446
std::vector<CcdPhysicsController*>::iterator i =
447
std::find(m_controllers.begin(), m_controllers.end(), ctrl);
448
if (!(i == m_controllers.end()))
450
std::swap(*i, m_controllers.back());
451
m_controllers.pop_back();
464
btRigidBody* body = ctrl->GetRigidBody();
467
m_dynamicsWorld->removeRigidBody(ctrl->GetRigidBody());
471
if (ctrl->GetSoftBody())
473
m_dynamicsWorld->removeSoftBody(ctrl->GetSoftBody());
476
m_dynamicsWorld->removeCollisionObject(ctrl->GetCollisionObject());
479
m_controllers.erase(ctrl);
481
if (ctrl->m_registerCount != 0)
482
printf("Warning: removing controller with non-zero m_registerCount: %d\n", ctrl->m_registerCount);
455
484
//remove it from the triggers
457
std::vector<CcdPhysicsController*>::iterator i =
458
std::find(m_triggerControllers.begin(), m_triggerControllers.end(), ctrl);
459
if (!(i == m_triggerControllers.end()))
461
std::swap(*i, m_triggerControllers.back());
462
m_triggerControllers.pop_back();
485
m_triggerControllers.erase(ctrl);
488
void CcdPhysicsEnvironment::updateCcdPhysicsController(CcdPhysicsController* ctrl, btScalar newMass, int newCollisionFlags, short int newCollisionGroup, short int newCollisionMask)
490
// this function is used when the collisionning group of a controller is changed
491
// remove and add the collistioning object
492
btRigidBody* body = ctrl->GetRigidBody();
493
btCollisionObject* obj = ctrl->GetCollisionObject();
496
btVector3 inertia(0.0,0.0,0.0);
497
m_dynamicsWorld->removeCollisionObject(obj);
498
obj->setCollisionFlags(newCollisionFlags);
502
body->getCollisionShape()->calculateLocalInertia(newMass, inertia);
503
body->setMassProps(newMass, inertia);
505
m_dynamicsWorld->addCollisionObject(obj, newCollisionGroup, newCollisionMask);
507
// to avoid nasty interaction, we must update the property of the controller as well
508
ctrl->m_cci.m_mass = newMass;
509
ctrl->m_cci.m_collisionFilterGroup = newCollisionGroup;
510
ctrl->m_cci.m_collisionFilterMask = newCollisionMask;
511
ctrl->m_cci.m_collisionFlags = newCollisionFlags;
514
void CcdPhysicsEnvironment::enableCcdPhysicsController(CcdPhysicsController* ctrl)
516
if (m_controllers.insert(ctrl).second)
518
btCollisionObject* obj = ctrl->GetCollisionObject();
519
obj->setUserPointer(ctrl);
520
m_dynamicsWorld->addCollisionObject(obj,
521
ctrl->GetCollisionFilterGroup(), ctrl->GetCollisionFilterMask());
525
void CcdPhysicsEnvironment::disableCcdPhysicsController(CcdPhysicsController* ctrl)
527
if (m_controllers.erase(ctrl))
529
btRigidBody* body = ctrl->GetRigidBody();
532
m_dynamicsWorld->removeRigidBody(body);
535
if (ctrl->GetSoftBody())
539
m_dynamicsWorld->removeCollisionObject(body);
476
552
bool CcdPhysicsEnvironment::proceedDeltaTime(double curTime,float timeStep)
554
std::set<CcdPhysicsController*>::iterator it;
479
int i,numCtrl = GetNumControllers();
480
for (i=0;i<numCtrl;i++)
557
for (it=m_controllers.begin(); it!=m_controllers.end(); it++)
482
CcdPhysicsController* ctrl = GetPhysicsController(i);
483
ctrl->SynchronizeMotionStates(timeStep);
559
(*it)->SynchronizeMotionStates(timeStep);
562
processFhSprings(curTime,timeStep);
486
564
float subStep = timeStep / float(m_numTimeSubSteps);
487
565
for (i=0;i<m_numTimeSubSteps;i++)
489
m_dynamicsWorld->stepSimulation(subStep,0);//perform always a full simulation step
492
numCtrl = GetNumControllers();
493
for (i=0;i<numCtrl;i++)
495
CcdPhysicsController* ctrl = GetPhysicsController(i);
496
ctrl->SynchronizeMotionStates(timeStep);
567
// m_dynamicsWorld->stepSimulation(subStep,20,1./240.);//perform always a full simulation step
568
m_dynamicsWorld->stepSimulation(subStep,0);//perform always a full simulation step
571
for (it=m_controllers.begin(); it!=m_controllers.end(); it++)
573
(*it)->SynchronizeMotionStates(timeStep);
576
for (it=m_controllers.begin(); it!=m_controllers.end(); it++)
578
(*it)->SynchronizeMotionStates(timeStep);
499
581
for (i=0;i<m_wrapperVehicles.size();i++)
502
584
veh->SyncWheels();
587
if (m_dynamicsWorld->getDebugDrawer() && m_dynamicsWorld->getDebugDrawer()->getDebugMode() >0)
588
m_dynamicsWorld->debugDrawWorld();
505
591
CallbackTriggers();
596
class ClosestRayResultCallbackNotMe : public btCollisionWorld::ClosestRayResultCallback
598
btCollisionObject* m_owner;
599
btCollisionObject* m_parent;
602
ClosestRayResultCallbackNotMe(const btVector3& rayFromWorld,const btVector3& rayToWorld,btCollisionObject* owner,btCollisionObject* parent)
603
:btCollisionWorld::ClosestRayResultCallback(rayFromWorld,rayToWorld),
609
virtual bool needsCollision(btBroadphaseProxy* proxy0) const
611
//don't collide with self
612
if (proxy0->m_clientObject == m_owner)
615
if (proxy0->m_clientObject == m_parent)
618
return btCollisionWorld::ClosestRayResultCallback::needsCollision(proxy0);
623
void CcdPhysicsEnvironment::processFhSprings(double curTime,float timeStep)
625
std::set<CcdPhysicsController*>::iterator it;
627
for (it=m_controllers.begin(); it!=m_controllers.end(); it++)
629
CcdPhysicsController* ctrl = (*it);
630
btRigidBody* body = ctrl->GetRigidBody();
632
if (body && (ctrl->getConstructionInfo().m_do_fh || ctrl->getConstructionInfo().m_do_rot_fh))
634
//printf("has Fh or RotFh\n");
635
//re-implement SM_FhObject.cpp using btCollisionWorld::rayTest and info from ctrl->getConstructionInfo()
636
//send a ray from {0.0, 0.0, 0.0} towards {0.0, 0.0, -10.0}, in local coordinates
639
CcdPhysicsController* parentCtrl = ctrl->getParentCtrl();
640
btRigidBody* parentBody = parentCtrl?parentCtrl->GetRigidBody() : 0;
641
btRigidBody* cl_object = parentBody ? parentBody : body;
643
if (body->isStaticOrKinematicObject())
646
btVector3 rayDirLocal(0,0,-10);
649
//ctrl->GetRigidBody();
650
btVector3 rayFromWorld = body->getCenterOfMassPosition();
651
//btVector3 rayToWorld = rayFromWorld + body->getCenterOfMassTransform().getBasis() * rayDirLocal;
652
//ray always points down the z axis in world space...
653
btVector3 rayToWorld = rayFromWorld + rayDirLocal;
655
ClosestRayResultCallbackNotMe resultCallback(rayFromWorld,rayToWorld,body,parentBody);
657
m_dynamicsWorld->rayTest(rayFromWorld,rayToWorld,resultCallback);
658
if (resultCallback.hasHit())
660
//we hit this one: resultCallback.m_collisionObject;
661
CcdPhysicsController* controller = static_cast<CcdPhysicsController*>(resultCallback.m_collisionObject->getUserPointer());
665
if (controller->getConstructionInfo().m_fh_distance < SIMD_EPSILON)
668
btRigidBody* hit_object = controller->GetRigidBody();
672
CcdConstructionInfo& hitObjShapeProps = controller->getConstructionInfo();
674
float distance = resultCallback.m_closestHitFraction*rayDirLocal.length()-ctrl->getConstructionInfo().m_radius;
675
if (distance >= hitObjShapeProps.m_fh_distance)
680
//btVector3 ray_dir = cl_object->getCenterOfMassTransform().getBasis()* rayDirLocal.normalized();
681
btVector3 ray_dir = rayDirLocal.normalized();
682
btVector3 normal = resultCallback.m_hitNormalWorld;
686
if (ctrl->getConstructionInfo().m_do_fh)
688
btVector3 lspot = cl_object->getCenterOfMassPosition()
689
+ rayDirLocal * resultCallback.m_closestHitFraction;
694
lspot -= hit_object->getCenterOfMassPosition();
695
btVector3 rel_vel = cl_object->getLinearVelocity() - hit_object->getVelocityInLocalPoint(lspot);
696
btScalar rel_vel_ray = ray_dir.dot(rel_vel);
697
btScalar spring_extent = 1.0 - distance / hitObjShapeProps.m_fh_distance;
699
btScalar i_spring = spring_extent * hitObjShapeProps.m_fh_spring;
700
btScalar i_damp = rel_vel_ray * hitObjShapeProps.m_fh_damping;
702
cl_object->setLinearVelocity(cl_object->getLinearVelocity() + (-(i_spring + i_damp) * ray_dir));
703
if (hitObjShapeProps.m_fh_normal)
705
cl_object->setLinearVelocity(cl_object->getLinearVelocity()+(i_spring + i_damp) *(normal - normal.dot(ray_dir) * ray_dir));
708
btVector3 lateral = rel_vel - rel_vel_ray * ray_dir;
711
if (ctrl->getConstructionInfo().m_do_anisotropic) {
712
//Bullet basis contains no scaling/shear etc.
713
const btMatrix3x3& lcs = cl_object->getCenterOfMassTransform().getBasis();
714
btVector3 loc_lateral = lateral * lcs;
715
const btVector3& friction_scaling = cl_object->getAnisotropicFriction();
716
loc_lateral *= friction_scaling;
717
lateral = lcs * loc_lateral;
720
btScalar rel_vel_lateral = lateral.length();
722
if (rel_vel_lateral > SIMD_EPSILON) {
723
btScalar friction_factor = hit_object->getFriction();//cl_object->getFriction();
725
btScalar max_friction = friction_factor * btMax(btScalar(0.0), i_spring);
727
btScalar rel_mom_lateral = rel_vel_lateral / cl_object->getInvMass();
729
btVector3 friction = (rel_mom_lateral > max_friction) ?
730
-lateral * (max_friction / rel_vel_lateral) :
733
cl_object->applyCentralImpulse(friction);
738
if (ctrl->getConstructionInfo().m_do_rot_fh) {
739
btVector3 up2 = cl_object->getWorldTransform().getBasis().getColumn(2);
741
btVector3 t_spring = up2.cross(normal) * hitObjShapeProps.m_fh_spring;
742
btVector3 ang_vel = cl_object->getAngularVelocity();
744
// only rotations that tilt relative to the normal are damped
745
ang_vel -= ang_vel.dot(normal) * normal;
747
btVector3 t_damp = ang_vel * hitObjShapeProps.m_fh_damping;
749
cl_object->setAngularVelocity(cl_object->getAngularVelocity() + (t_spring - t_damp));
511
763
void CcdPhysicsEnvironment::setDebugMode(int debugMode)
694
956
struct FilterClosestRayResultCallback : public btCollisionWorld::ClosestRayResultCallback
696
PHY_IPhysicsController* m_ignoreClient;
958
PHY_IRayCastFilterCallback& m_phyRayFilter;
959
const btCollisionShape* m_hitTriangleShape;
960
int m_hitTriangleIndex;
698
FilterClosestRayResultCallback (PHY_IPhysicsController* ignoreClient,const btVector3& rayFrom,const btVector3& rayTo)
962
FilterClosestRayResultCallback (PHY_IRayCastFilterCallback& phyRayFilter,const btVector3& rayFrom,const btVector3& rayTo)
699
963
: btCollisionWorld::ClosestRayResultCallback(rayFrom,rayTo),
700
m_ignoreClient(ignoreClient)
964
m_phyRayFilter(phyRayFilter),
965
m_hitTriangleShape(NULL),
966
m_hitTriangleIndex(0)
705
970
virtual ~FilterClosestRayResultCallback()
709
virtual float AddSingleResult( btCollisionWorld::LocalRayResult& rayResult)
974
virtual bool needsCollision(btBroadphaseProxy* proxy0) const
976
if (!(proxy0->m_collisionFilterGroup & m_collisionFilterMask))
978
if (!(m_collisionFilterGroup & proxy0->m_collisionFilterMask))
980
btCollisionObject* object = (btCollisionObject*)proxy0->m_clientObject;
981
CcdPhysicsController* phyCtrl = static_cast<CcdPhysicsController*>(object->getUserPointer());
982
if (phyCtrl == m_phyRayFilter.m_ignoreController)
984
return m_phyRayFilter.needBroadphaseRayCast(phyCtrl);
987
virtual btScalar addSingleResult(btCollisionWorld::LocalRayResult& rayResult,bool normalInWorldSpace)
711
989
CcdPhysicsController* curHit = static_cast<CcdPhysicsController*>(rayResult.m_collisionObject->getUserPointer());
713
if (curHit != m_ignoreClient)
716
return ClosestRayResultCallback::AddSingleResult(rayResult);
990
// save shape information as ClosestRayResultCallback::AddSingleResult() does not do it
991
if (rayResult.m_localShapeInfo)
993
m_hitTriangleShape = rayResult.m_collisionObject->getCollisionShape();
994
m_hitTriangleIndex = rayResult.m_localShapeInfo->m_triangleIndex;
997
m_hitTriangleShape = NULL;
998
m_hitTriangleIndex = 0;
718
return m_closestHitFraction;
1000
return ClosestRayResultCallback::addSingleResult(rayResult,normalInWorldSpace);
723
PHY_IPhysicsController* CcdPhysicsEnvironment::rayTest(PHY_IPhysicsController* ignoreClient, float fromX,float fromY,float fromZ, float toX,float toY,float toZ,
724
float& hitX,float& hitY,float& hitZ,float& normalX,float& normalY,float& normalZ)
1005
PHY_IPhysicsController* CcdPhysicsEnvironment::rayTest(PHY_IRayCastFilterCallback &filterCallback, float fromX,float fromY,float fromZ, float toX,float toY,float toZ)
735
1016
//Either Ray Cast with or without filtering
737
1018
//btCollisionWorld::ClosestRayResultCallback rayCallback(rayFrom,rayTo);
738
FilterClosestRayResultCallback rayCallback(ignoreClient,rayFrom,rayTo);
741
PHY_IPhysicsController* nearestHit = 0;
1019
FilterClosestRayResultCallback rayCallback(filterCallback,rayFrom,rayTo);
1022
PHY_RayCastResult result;
1023
memset(&result, 0, sizeof(result));
742
1025
// don't collision with sensor object
743
m_dynamicsWorld->rayTest(rayFrom,rayTo,rayCallback, CcdConstructionInfo::AllFilter ^ CcdConstructionInfo::SensorFilter);
744
if (rayCallback.HasHit())
1026
rayCallback.m_collisionFilterMask = CcdConstructionInfo::AllFilter ^ CcdConstructionInfo::SensorFilter;
1027
//, ,filterCallback.m_faceNormal);
1029
m_dynamicsWorld->rayTest(rayFrom,rayTo,rayCallback);
1030
if (rayCallback.hasHit())
746
nearestHit = static_cast<CcdPhysicsController*>(rayCallback.m_collisionObject->getUserPointer());
747
hitX = rayCallback.m_hitPointWorld.getX();
748
hitY = rayCallback.m_hitPointWorld.getY();
749
hitZ = rayCallback.m_hitPointWorld.getZ();
1032
CcdPhysicsController* controller = static_cast<CcdPhysicsController*>(rayCallback.m_collisionObject->getUserPointer());
1033
result.m_controller = controller;
1034
result.m_hitPoint[0] = rayCallback.m_hitPointWorld.getX();
1035
result.m_hitPoint[1] = rayCallback.m_hitPointWorld.getY();
1036
result.m_hitPoint[2] = rayCallback.m_hitPointWorld.getZ();
1038
if (rayCallback.m_hitTriangleShape != NULL)
1040
// identify the mesh polygon
1041
CcdShapeConstructionInfo* shapeInfo = controller->m_shapeInfo;
1044
btCollisionShape* shape = controller->GetCollisionObject()->getCollisionShape();
1045
if (shape->isCompound())
1047
btCompoundShape* compoundShape = (btCompoundShape*)shape;
1048
CcdShapeConstructionInfo* compoundShapeInfo = shapeInfo;
1049
// need to search which sub-shape has been hit
1050
for (int i=0; i<compoundShape->getNumChildShapes(); i++)
1052
shapeInfo = compoundShapeInfo->GetChildShape(i);
1053
shape=compoundShape->getChildShape(i);
1054
if (shape == rayCallback.m_hitTriangleShape)
1058
if (shape == rayCallback.m_hitTriangleShape &&
1059
rayCallback.m_hitTriangleIndex < shapeInfo->m_polygonIndexArray.size())
1061
result.m_meshObject = shapeInfo->GetMesh();
1062
result.m_polygon = shapeInfo->m_polygonIndexArray.at(rayCallback.m_hitTriangleIndex);
1064
// Bullet returns the normal from "outside".
1065
// If the user requests the real normal, compute it now
1066
if (filterCallback.m_faceNormal)
1068
// mesh shapes are shared and stored in the shapeInfo
1069
btTriangleMeshShape* triangleShape = shapeInfo->GetMeshShape();
1072
// this code is copied from Bullet
1073
btVector3 triangle[3];
1074
const unsigned char *vertexbase;
1076
PHY_ScalarType type;
1078
const unsigned char *indexbase;
1081
PHY_ScalarType indicestype;
1082
btStridingMeshInterface* meshInterface = triangleShape->getMeshInterface();
1084
meshInterface->getLockedReadOnlyVertexIndexBase(
1095
unsigned int* gfxbase = (unsigned int*)(indexbase+rayCallback.m_hitTriangleIndex*indexstride);
1096
const btVector3& meshScaling = shape->getLocalScaling();
1097
for (int j=2;j>=0;j--)
1099
int graphicsindex = indicestype==PHY_SHORT?((unsigned short*)gfxbase)[j]:gfxbase[j];
1101
btScalar* graphicsbase = (btScalar*)(vertexbase+graphicsindex*stride);
1103
triangle[j] = btVector3(graphicsbase[0]*meshScaling.getX(),graphicsbase[1]*meshScaling.getY(),graphicsbase[2]*meshScaling.getZ());
1105
meshInterface->unLockReadOnlyVertexBase(0);
1106
btVector3 triangleNormal;
1107
triangleNormal = (triangle[1]-triangle[0]).cross(triangle[2]-triangle[0]);
1108
rayCallback.m_hitNormalWorld = rayCallback.m_collisionObject->getWorldTransform().getBasis()*triangleNormal;
751
1114
if (rayCallback.m_hitNormalWorld.length2() > (SIMD_EPSILON*SIMD_EPSILON))
753
1116
rayCallback.m_hitNormalWorld.normalize();
892
1256
void CcdPhysicsEnvironment::removeCollisionCallback(PHY_IPhysicsController* ctrl)
894
std::vector<CcdPhysicsController*>::iterator i =
895
std::find(m_triggerControllers.begin(), m_triggerControllers.end(), ctrl);
896
if (!(i == m_triggerControllers.end()))
898
std::swap(*i, m_triggerControllers.back());
899
m_triggerControllers.pop_back();
1258
CcdPhysicsController* ccdCtrl = (CcdPhysicsController*)ctrl;
1259
if (ccdCtrl->Unregister())
1260
m_triggerControllers.erase(ccdCtrl);
904
1264
void CcdPhysicsEnvironment::removeSensor(PHY_IPhysicsController* ctrl)
906
1266
removeCollisionCallback(ctrl);
907
//printf("removeSensor\n");
1268
disableCcdPhysicsController((CcdPhysicsController*)ctrl);
909
1271
void CcdPhysicsEnvironment::addTouchCallback(int response_class, PHY_ResponseCallback callback, void *user)
911
1273
/* printf("addTouchCallback\n(response class = %i)\n",response_class);
972
1336
m_debugDrawer->drawContactPoint(cp.m_positionWorldOnB,cp.m_normalWorldOnB,cp.getDistance(),cp.getLifeTime(),color);
975
btRigidBody* obj0 = static_cast<btRigidBody* >(manifold->getBody0());
976
btRigidBody* obj1 = static_cast<btRigidBody* >(manifold->getBody1());
1339
btRigidBody* obj0 = rb0;
1340
btRigidBody* obj1 = rb1;
978
1342
//m_internalOwner is set in 'addPhysicsController'
979
1343
CcdPhysicsController* ctrl0 = static_cast<CcdPhysicsController*>(obj0->getUserPointer());
980
1344
CcdPhysicsController* ctrl1 = static_cast<CcdPhysicsController*>(obj1->getUserPointer());
982
std::vector<CcdPhysicsController*>::iterator i =
983
std::find(m_triggerControllers.begin(), m_triggerControllers.end(), ctrl0);
1346
std::set<CcdPhysicsController*>::const_iterator i = m_triggerControllers.find(ctrl0);
984
1347
if (i == m_triggerControllers.end())
986
i = std::find(m_triggerControllers.begin(), m_triggerControllers.end(), ctrl1);
1349
i = m_triggerControllers.find(ctrl1);
989
1352
if (!(i == m_triggerControllers.end()))
1094
1466
CcdPhysicsController* sphereController = new CcdPhysicsController(cinfo);
1097
1468
return sphereController;
1471
int findClosestNode(btSoftBody* sb,const btVector3& worldPoint);
1472
int findClosestNode(btSoftBody* sb,const btVector3& worldPoint)
1476
btSoftBody::tNodeArray& nodes(sb->m_nodes);
1477
float maxDistSqr = 1e30f;
1479
for (int n=0;n<nodes.size();n++)
1481
btScalar distSqr = (nodes[n].m_x - worldPoint).length2();
1482
if (distSqr<maxDistSqr)
1484
maxDistSqr = distSqr;
1100
1491
int CcdPhysicsEnvironment::createConstraint(class PHY_IPhysicsController* ctrl0,class PHY_IPhysicsController* ctrl1,PHY_ConstraintType type,
1101
1492
float pivotX,float pivotY,float pivotZ,
1102
1493
float axisX,float axisY,float axisZ,
1103
1494
float axis1X,float axis1Y,float axis1Z,
1104
float axis2X,float axis2Y,float axis2Z
1495
float axis2X,float axis2Y,float axis2Z,int flags
1499
bool disableCollisionBetweenLinkedBodies = (0!=(flags & CCD_CONSTRAINT_DISABLE_LINKED_COLLISION));
1109
1503
CcdPhysicsController* c0 = (CcdPhysicsController*)ctrl0;
1110
1504
CcdPhysicsController* c1 = (CcdPhysicsController*)ctrl1;
1112
1506
btRigidBody* rb0 = c0 ? c0->GetRigidBody() : 0;
1113
1507
btRigidBody* rb1 = c1 ? c1->GetRigidBody() : 0;
1115
1512
bool rb0static = rb0 ? rb0->isStaticOrKinematicObject() : true;
1116
1513
bool rb1static = rb1 ? rb1->isStaticOrKinematicObject() : true;
1515
btCollisionObject* colObj0 = c0->GetCollisionObject();
1521
btVector3 pivotInA(pivotX,pivotY,pivotZ);
1525
//it might be a soft body, let's try
1526
btSoftBody* sb0 = c0 ? c0->GetSoftBody() : 0;
1527
btSoftBody* sb1 = c1 ? c1->GetSoftBody() : 0;
1530
//not between two soft bodies?
1536
//either cluster or node attach, let's find closest node first
1537
//the soft body doesn't have a 'real' world transform, so get its initial world transform for now
1538
btVector3 pivotPointSoftWorld = sb0->m_initialWorldTransform(pivotInA);
1539
int node=findClosestNode(sb0,pivotPointSoftWorld);
1542
bool clusterconstaint = false;
1546
case PHY_LINEHINGE_CONSTRAINT:
1548
if (sb0->clusterCount() && rb1)
1550
btSoftBody::LJoint::Specs ls;
1552
ls.position=sb0->clusterCom(0);
1553
sb0->appendLinearJoint(ls,rb1);
1554
clusterconstaint = true;
1558
case PHY_GENERIC_6DOF_CONSTRAINT:
1560
if (sb0->clusterCount() && rb1)
1562
btSoftBody::AJoint::Specs as;
1565
as.axis.setValue(axisX,axisY,axisZ);
1566
sb0->appendAngularJoint(as,rb1);
1567
clusterconstaint = true;
1580
if (!clusterconstaint)
1584
sb0->appendAnchor(node,rb1,disableCollisionBetweenLinkedBodies);
1587
sb0->setMass(node,0.f);
1593
return 0;//can't remove soft body anchors yet
1598
btVector3 pivotPointAWorld = colObj0->getWorldTransform()(pivotInA);
1599
int node=findClosestNode(sb1,pivotPointAWorld);
1602
bool clusterconstaint = false;
1607
case PHY_LINEHINGE_CONSTRAINT:
1609
if (sb1->clusterCount() && rb0)
1611
btSoftBody::LJoint::Specs ls;
1613
ls.position=sb1->clusterCom(0);
1614
sb1->appendLinearJoint(ls,rb0);
1615
clusterconstaint = true;
1619
case PHY_GENERIC_6DOF_CONSTRAINT:
1621
if (sb1->clusterCount() && rb0)
1623
btSoftBody::AJoint::Specs as;
1626
as.axis.setValue(axisX,axisY,axisZ);
1627
sb1->appendAngularJoint(as,rb0);
1628
clusterconstaint = true;
1642
if (!clusterconstaint)
1646
sb1->appendAnchor(node,rb0,disableCollisionBetweenLinkedBodies);
1649
sb1->setMass(node,0.f);
1655
return 0;//can't remove soft body anchors yet
1119
1658
if (rb0static && rb1static)
1122
btVector3 pivotInA(pivotX,pivotY,pivotZ);
1123
1669
btVector3 pivotInB = rb1 ? rb1->getCenterOfMassTransform().inverse()(rb0->getCenterOfMassTransform()(pivotInA)) :
1124
1670
rb0->getCenterOfMassTransform() * pivotInA;
1125
1671
btVector3 axisInA(axisX,axisY,axisZ);