diff options
author | Benoit Bolsee <benoit.bolsee@online.be> | 2009-11-16 02:58:56 +0300 |
---|---|---|
committer | Benoit Bolsee <benoit.bolsee@online.be> | 2009-11-16 02:58:56 +0300 |
commit | b45ab480e07931406785c8fc877e7cee849c8998 (patch) | |
tree | 88dbf52d49d1a3c26a5f4683517cfd3d7d7adcbf /source/gameengine/Physics | |
parent | 349fa813eaf413cd2f472e545e7ce2cb6b087b1c (diff) |
BGE: dynamic loading patch commited. API and demo files available here: https://projects.blender.org/tracker/?func=detail&aid=19492&group_id=9&atid=127
Diffstat (limited to 'source/gameengine/Physics')
9 files changed, 58 insertions, 12 deletions
diff --git a/source/gameengine/Physics/Bullet/CcdGraphicController.cpp b/source/gameengine/Physics/Bullet/CcdGraphicController.cpp index 2dbbb7fa4a0..73ac789edf7 100644 --- a/source/gameengine/Physics/Bullet/CcdGraphicController.cpp +++ b/source/gameengine/Physics/Bullet/CcdGraphicController.cpp @@ -124,6 +124,21 @@ PHY_IGraphicController* CcdGraphicController::GetReplica(class PHY_IMotionState* return replica; } +void CcdGraphicController::SetPhysicsEnvironment(class PHY_IPhysicsEnvironment* env) +{ + CcdPhysicsEnvironment* phyEnv = static_cast<CcdPhysicsEnvironment*>(env); + /* Updates the m_phyEnv's m_cullingTree & m_cullingCache */ + if(getBroadphaseHandle()) { + /* insert into the new physics scene */ + Activate(false); + m_phyEnv= phyEnv; + Activate(true); + } + else { + m_phyEnv= phyEnv; + } +} + void CcdGraphicController::Activate(bool active) { if (active) diff --git a/source/gameengine/Physics/Bullet/CcdGraphicController.h b/source/gameengine/Physics/Bullet/CcdGraphicController.h index 99885eb99ee..07cf6d940cb 100644 --- a/source/gameengine/Physics/Bullet/CcdGraphicController.h +++ b/source/gameengine/Physics/Bullet/CcdGraphicController.h @@ -47,6 +47,8 @@ public: virtual void setBroadphaseHandle(btBroadphaseProxy* handle) { m_handle = handle; } virtual btBroadphaseProxy* getBroadphaseHandle() { return m_handle; } + virtual void SetPhysicsEnvironment(class PHY_IPhysicsEnvironment* env); + //////////////////////////////////// // PHY_IGraphicController interface //////////////////////////////////// diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp b/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp index b7d0dd2f6e7..69b63affeef 100644 --- a/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp +++ b/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp @@ -804,6 +804,23 @@ void CcdPhysicsController::PostProcessReplica(class PHY_IMotionState* motionsta } +void CcdPhysicsController::SetPhysicsEnvironment(class PHY_IPhysicsEnvironment *env) +{ + // can safely assume CCD environment + CcdPhysicsEnvironment *physicsEnv = static_cast<CcdPhysicsEnvironment*>(env); + + if (m_cci.m_physicsEnv != physicsEnv) + { + // since the environment is changing, we must also move the controler to the + // new environement. Note that we don't handle sensor explicitely: this + // function can be called on sensor but only when they are not registered + if (m_cci.m_physicsEnv->removeCcdPhysicsController(this)) + { + physicsEnv->addCcdPhysicsController(this); + } + m_cci.m_physicsEnv = physicsEnv; + } +} void CcdPhysicsController::SetCenterOfMassTransform(btTransform& xform) { diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsController.h b/source/gameengine/Physics/Bullet/CcdPhysicsController.h index 69b16ca35bd..02d723472f6 100644 --- a/source/gameengine/Physics/Bullet/CcdPhysicsController.h +++ b/source/gameengine/Physics/Bullet/CcdPhysicsController.h @@ -432,6 +432,7 @@ protected: // controller replication virtual void PostProcessReplica(class PHY_IMotionState* motionstate,class PHY_IPhysicsController* parentctrl); + virtual void SetPhysicsEnvironment(class PHY_IPhysicsEnvironment *env); // kinematic methods virtual void RelativeTranslate(float dlocX,float dlocY,float dlocZ,bool local); diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp index bf28802870a..22722c0927a 100644 --- a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp +++ b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp @@ -420,7 +420,7 @@ void CcdPhysicsEnvironment::addCcdPhysicsController(CcdPhysicsController* ctrl) -void CcdPhysicsEnvironment::removeCcdPhysicsController(CcdPhysicsController* ctrl) +bool CcdPhysicsEnvironment::removeCcdPhysicsController(CcdPhysicsController* ctrl) { //also remove constraint btRigidBody* body = ctrl->GetRigidBody(); @@ -445,13 +445,13 @@ void CcdPhysicsEnvironment::removeCcdPhysicsController(CcdPhysicsController* ctr m_dynamicsWorld->removeCollisionObject(ctrl->GetCollisionObject()); } } - m_controllers.erase(ctrl); - if (ctrl->m_registerCount != 0) printf("Warning: removing controller with non-zero m_registerCount: %d\n", ctrl->m_registerCount); //remove it from the triggers m_triggerControllers.erase(ctrl); + + return (m_controllers.erase(ctrl) != 0); } void CcdPhysicsEnvironment::updateCcdPhysicsController(CcdPhysicsController* ctrl, btScalar newMass, int newCollisionFlags, short int newCollisionGroup, short int newCollisionMask) @@ -1736,10 +1736,19 @@ btDispatcher* CcdPhysicsEnvironment::getDispatcher() return m_dynamicsWorld->getDispatcher(); } +void CcdPhysicsEnvironment::MergeEnvironment(CcdPhysicsEnvironment *other) +{ + std::set<CcdPhysicsController*>::iterator it; + while (other->m_controllers.begin() != other->m_controllers.end()) + { + it= other->m_controllers.begin(); + CcdPhysicsController* ctrl= (*it); - - + other->removeCcdPhysicsController(ctrl); + this->addCcdPhysicsController(ctrl); + } +} CcdPhysicsEnvironment::~CcdPhysicsEnvironment() { diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h index e087eac32c5..21f74e95ed4 100644 --- a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h +++ b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h @@ -199,7 +199,7 @@ protected: void addCcdPhysicsController(CcdPhysicsController* ctrl); - void removeCcdPhysicsController(CcdPhysicsController* ctrl); + bool removeCcdPhysicsController(CcdPhysicsController* ctrl); void updateCcdPhysicsController(CcdPhysicsController* ctrl, btScalar newMass, int newCollisionFlags, short int newCollisionGroup, short int newCollisionMask); @@ -242,13 +242,13 @@ protected: class btConstraintSolver* GetConstraintSolver(); + void MergeEnvironment(CcdPhysicsEnvironment *other); + protected: - std::set<CcdPhysicsController*> m_controllers; - std::set<CcdPhysicsController*> m_triggerControllers; PHY_ResponseCallback m_triggerCallbacks[PHY_NUM_RESPONSE]; diff --git a/source/gameengine/Physics/common/PHY_IController.h b/source/gameengine/Physics/common/PHY_IController.h index a053a9679b8..e897de255c1 100644 --- a/source/gameengine/Physics/common/PHY_IController.h +++ b/source/gameengine/Physics/common/PHY_IController.h @@ -31,6 +31,8 @@ #include "PHY_DynamicTypes.h" +class PHY_IPhysicsEnvironment; + #ifdef WITH_CXX_GUARDEDALLOC #include "MEM_guardedalloc.h" #endif @@ -45,8 +47,9 @@ class PHY_IController public: virtual ~PHY_IController(); // clientinfo for raycasts for example - virtual void* getNewClientInfo()=0; - virtual void setNewClientInfo(void* clientinfo)=0; + virtual void* getNewClientInfo()=0; + virtual void setNewClientInfo(void* clientinfo)=0; + virtual void SetPhysicsEnvironment(class PHY_IPhysicsEnvironment *env)=0; #ifdef WITH_CXX_GUARDEDALLOC diff --git a/source/gameengine/Physics/common/PHY_IGraphicController.h b/source/gameengine/Physics/common/PHY_IGraphicController.h index aae971ff42a..eac3de68d4f 100644 --- a/source/gameengine/Physics/common/PHY_IGraphicController.h +++ b/source/gameengine/Physics/common/PHY_IGraphicController.h @@ -32,7 +32,6 @@ #include "PHY_IController.h" - /** PHY_IPhysicsController is the abstract simplified Interface to a physical object. It contains the IMotionState and IDeformableMesh Interfaces. @@ -51,7 +50,6 @@ class PHY_IGraphicController : public PHY_IController virtual PHY_IGraphicController* GetReplica(class PHY_IMotionState* motionstate) {return 0;} - #ifdef WITH_CXX_GUARDEDALLOC void *operator new( unsigned int num_bytes) { return MEM_mallocN(num_bytes, "GE:PHY_IController"); } void operator delete( void *mem ) { MEM_freeN(mem); } diff --git a/source/gameengine/Physics/common/PHY_IPhysicsController.h b/source/gameengine/Physics/common/PHY_IPhysicsController.h index 664e5fddd83..b34f8417e4c 100644 --- a/source/gameengine/Physics/common/PHY_IPhysicsController.h +++ b/source/gameengine/Physics/common/PHY_IPhysicsController.h @@ -32,6 +32,7 @@ #include "PHY_IController.h" class PHY_IMotionState; +class PHY_IPhysicsEnvironment; /** PHY_IPhysicsController is the abstract simplified Interface to a physical object. |