diff options
author | Erwin Coumans <blender@erwincoumans.com> | 2006-04-17 05:33:10 +0400 |
---|---|---|
committer | Erwin Coumans <blender@erwincoumans.com> | 2006-04-17 05:33:10 +0400 |
commit | 971ee74c845e31cec49e428877fbdc6315dda0ed (patch) | |
tree | 56f4d2bc2ce2cde3f8a0b7d1c4a733a41d78306c /source/gameengine/Physics | |
parent | 176641b2730084ae279e1567af92d5e493c60f03 (diff) |
added support for 'Ghost' object and collision sensor (preliminary)
Diffstat (limited to 'source/gameengine/Physics')
4 files changed, 153 insertions, 9 deletions
diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp b/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp index 6b892655300..57f29575569 100644 --- a/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp +++ b/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp @@ -73,6 +73,9 @@ void CcdPhysicsController::CreateRigidbody() // m_body->setMassProps(m_cci.m_mass, m_cci.m_localInertiaTensor * m_cci.m_inertiaFactor); + //setMassProps this also sets collisionFlags + m_body->m_collisionFlags = m_cci.m_collisionFlags; + m_body->setGravity( m_cci.m_gravity); m_body->setDamping(m_cci.m_linearDamping, m_cci.m_angularDamping); m_body->setCenterOfMassTransform( trans ); @@ -93,9 +96,9 @@ CcdPhysicsController::~CcdPhysicsController() */ bool CcdPhysicsController::SynchronizeMotionStates(float time) { - //don't sync non-dynamic... + //sync non-static to motionstate, and static from motionstate (todo: add kinematic etc.) - if (m_body->getInvMass() != 0.f) + if (!m_body->IsStatic()) { const SimdVector3& worldPos = m_body->getCenterOfMassPosition(); m_MotionState->setWorldPosition(worldPos[0],worldPos[1],worldPos[2]); @@ -383,6 +386,14 @@ void CcdPhysicsController::getReactionForce(float& forceX,float& forceY,float& // dyna's that are rigidbody are free in orientation, dyna's with non-rigidbody are restricted void CcdPhysicsController::setRigidBody(bool rigid) { + if (!rigid) + { + //fake it for now + SimdVector3 inertia = m_body->getInvInertiaDiagLocal(); + inertia[1] = 0.f; + m_body->setInvInertiaDiagLocal(inertia); + m_body->updateInertiaTensor(); + } } // clientinfo for raycasts for example diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsController.h b/source/gameengine/Physics/Bullet/CcdPhysicsController.h index 04d34fb1200..2c5e01dd4b0 100644 --- a/source/gameengine/Physics/Bullet/CcdPhysicsController.h +++ b/source/gameengine/Physics/Bullet/CcdPhysicsController.h @@ -34,7 +34,8 @@ struct CcdConstructionInfo m_MotionState(0), m_physicsEnv(0), m_inertiaFactor(1.f), - m_scaling(1.f,1.f,1.f) + m_scaling(1.f,1.f,1.f), + m_collisionFlags(0) { } @@ -46,6 +47,7 @@ struct CcdConstructionInfo SimdScalar m_friction; SimdScalar m_linearDamping; SimdScalar m_angularDamping; + int m_collisionFlags; CollisionShape* m_collisionShape; class PHY_IMotionState* m_MotionState; diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp index ff0880b5c2e..7f9bbd62ceb 100644 --- a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp +++ b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp @@ -308,6 +308,10 @@ m_profileTimings(0), m_enableSatCollisionDetection(false) { + for (int i=0;i<PHY_NUM_RESPONSE;i++) + { + m_triggerCallbacks[i] = 0; + } if (!dispatcher) dispatcher = new CollisionDispatcher(); @@ -338,6 +342,9 @@ m_enableSatCollisionDetection(false) void CcdPhysicsEnvironment::addCcdPhysicsController(CcdPhysicsController* ctrl) { RigidBody* body = ctrl->GetRigidBody(); + + //this m_userPointer is just used for triggers, see CallbackTriggers + body->m_userPointer = ctrl; body->setGravity( m_gravity ); m_controllers.push_back(ctrl); @@ -448,6 +455,19 @@ void CcdPhysicsEnvironment::removeCcdPhysicsController(CcdPhysicsController* ctr m_controllers.pop_back(); } } + + //remove it from the triggers + { + std::vector<CcdPhysicsController*>::iterator i = + std::find(m_triggerControllers.begin(), m_triggerControllers.end(), ctrl); + if (!(i == m_triggerControllers.end())) + { + std::swap(*i, m_triggerControllers.back()); + m_triggerControllers.pop_back(); + } + } + + } @@ -694,6 +714,16 @@ bool CcdPhysicsEnvironment::proceedDeltaTimeOneStep(float timeStep) #ifdef USE_PROFILE Profiler::endBlock("BuildAndProcessIslands"); + + Profiler::beginBlock("CallbackTriggers"); +#endif //USE_PROFILE + + CallbackTriggers(); + +#ifdef USE_PROFILE + Profiler::endBlock("CallbackTriggers"); + + Profiler::beginBlock("proceedToTransform"); #endif //USE_PROFILE @@ -1430,6 +1460,101 @@ TypedConstraint* CcdPhysicsEnvironment::getConstraintById(int constraintId) } +void CcdPhysicsEnvironment::addSensor(PHY_IPhysicsController* ctrl) +{ + printf("addSensor\n"); +} +void CcdPhysicsEnvironment::removeSensor(PHY_IPhysicsController* ctrl) +{ + printf("removeSensor\n"); +} +void CcdPhysicsEnvironment::addTouchCallback(int response_class, PHY_ResponseCallback callback, void *user) +{ + printf("addTouchCallback\n(response class = %i)\n",response_class); + + //map PHY_ convention into SM_ convention + switch (response_class) + { + case PHY_FH_RESPONSE: + printf("PHY_FH_RESPONSE\n"); + break; + case PHY_SENSOR_RESPONSE: + printf("PHY_SENSOR_RESPONSE\n"); + break; + case PHY_CAMERA_RESPONSE: + printf("PHY_CAMERA_RESPONSE\n"); + break; + case PHY_OBJECT_RESPONSE: + printf("PHY_OBJECT_RESPONSE\n"); + break; + case PHY_STATIC_RESPONSE: + printf("PHY_STATIC_RESPONSE\n"); + break; + default: + assert(0); + return; + } + + m_triggerCallbacks[response_class] = callback; + m_triggerCallbacksUserPtrs[response_class] = user; + +} +void CcdPhysicsEnvironment::requestCollisionCallback(PHY_IPhysicsController* ctrl) +{ + CcdPhysicsController* ccdCtrl = static_cast<CcdPhysicsController*>(ctrl); + + printf("requestCollisionCallback\n"); + m_triggerControllers.push_back(ccdCtrl); +} + + +void CcdPhysicsEnvironment::CallbackTriggers() +{ + CcdPhysicsController* ctrl0=0,*ctrl1=0; + + if (m_triggerCallbacks[PHY_OBJECT_RESPONSE]) + { + + int numManifolds = m_collisionWorld->GetDispatcher()->GetNumManifolds(); + for (int i=0;i<numManifolds;i++) + { + PersistentManifold* manifold = m_collisionWorld->GetDispatcher()->GetManifoldByIndexInternal(i); + int numContacts = manifold->GetNumContacts(); + if (numContacts) + { + RigidBody* obj0 = static_cast<RigidBody* >(manifold->GetBody0()); + RigidBody* obj1 = static_cast<RigidBody* >(manifold->GetBody1()); + + //m_userPointer is set in 'addPhysicsController + CcdPhysicsController* ctrl0 = static_cast<CcdPhysicsController*>(obj0->m_userPointer); + CcdPhysicsController* ctrl1 = static_cast<CcdPhysicsController*>(obj1->m_userPointer); + + std::vector<CcdPhysicsController*>::iterator i = + std::find(m_triggerControllers.begin(), m_triggerControllers.end(), ctrl0); + if (i == m_triggerControllers.end()) + { + i = std::find(m_triggerControllers.begin(), m_triggerControllers.end(), ctrl1); + } + + if (!(i == m_triggerControllers.end())) + { + m_triggerCallbacks[PHY_OBJECT_RESPONSE](m_triggerCallbacksUserPtrs[PHY_OBJECT_RESPONSE], + ctrl0,ctrl1,0); + } + } + } + + + + } + //walk over all overlapping pairs, and if +} + + + + + + #ifdef NEW_BULLET_VEHICLE_SUPPORT //complex constraint for vehicles diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h index 116e3d984df..2a4396d8c78 100644 --- a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h +++ b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h @@ -90,6 +90,10 @@ class CcdPhysicsEnvironment : public PHY_IPhysicsEnvironment float axisX,float axisY,float axisZ); virtual void removeConstraint(int constraintid); + + virtual void CallbackTriggers(); + + #ifdef NEW_BULLET_VEHICLE_SUPPORT //complex constraint for vehicles virtual PHY_IVehicle* getVehicleConstraint(int constraintId); @@ -107,11 +111,10 @@ class CcdPhysicsEnvironment : public PHY_IPhysicsEnvironment //Methods for gamelogic collision/physics callbacks - //todo: - virtual void addSensor(PHY_IPhysicsController* ctrl) {}; - virtual void removeSensor(PHY_IPhysicsController* ctrl){}; - virtual void addTouchCallback(int response_class, PHY_ResponseCallback callback, void *user){}; - virtual void requestCollisionCallback(PHY_IPhysicsController* ctrl){}; + virtual void addSensor(PHY_IPhysicsController* ctrl); + virtual void removeSensor(PHY_IPhysicsController* ctrl); + virtual void addTouchCallback(int response_class, PHY_ResponseCallback callback, void *user); + virtual void requestCollisionCallback(PHY_IPhysicsController* ctrl); virtual PHY_IPhysicsController* CreateSphereController(float radius,const PHY__Vector3& position) {return 0;}; virtual PHY_IPhysicsController* CreateConeController(float coneradius,float coneheight){ return 0;}; @@ -160,9 +163,12 @@ class CcdPhysicsEnvironment : public PHY_IPhysicsEnvironment void SyncMotionStates(float timeStep); std::vector<CcdPhysicsController*> m_controllers; - + std::vector<CcdPhysicsController*> m_triggerControllers; + PHY_ResponseCallback m_triggerCallbacks[PHY_NUM_RESPONSE]; + void* m_triggerCallbacksUserPtrs[PHY_NUM_RESPONSE]; + std::vector<WrapperVehicle*> m_wrapperVehicles; class CollisionWorld* m_collisionWorld; |