Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenoit Bolsee <benoit.bolsee@online.be>2009-11-16 02:58:56 +0300
committerBenoit Bolsee <benoit.bolsee@online.be>2009-11-16 02:58:56 +0300
commitb45ab480e07931406785c8fc877e7cee849c8998 (patch)
tree88dbf52d49d1a3c26a5f4683517cfd3d7d7adcbf /source/gameengine/Physics
parent349fa813eaf413cd2f472e545e7ce2cb6b087b1c (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')
-rw-r--r--source/gameengine/Physics/Bullet/CcdGraphicController.cpp15
-rw-r--r--source/gameengine/Physics/Bullet/CcdGraphicController.h2
-rw-r--r--source/gameengine/Physics/Bullet/CcdPhysicsController.cpp17
-rw-r--r--source/gameengine/Physics/Bullet/CcdPhysicsController.h1
-rw-r--r--source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp19
-rw-r--r--source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h6
-rw-r--r--source/gameengine/Physics/common/PHY_IController.h7
-rw-r--r--source/gameengine/Physics/common/PHY_IGraphicController.h2
-rw-r--r--source/gameengine/Physics/common/PHY_IPhysicsController.h1
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.