00001 00002 #ifndef _VRSODE_PHYSICS_MANAGER_H_ 00003 #define _VRSODE_PHYSICS_MANAGER_H_ 00004 00005 #include "CollisionBody.h" 00006 #include "PhysicsBody.h" 00007 00008 #include "PhysicsJoint.h" 00009 #include "PhysicsJointBall.h" 00010 #include "PhysicsJointHinge.h" 00011 #include "PhysicsJointHinge2.h" 00012 #include "PhysicsJointSlider.h" 00013 #include "PhysicsJointUniversal.h" 00014 00015 #include "CollisionSpace.h" 00016 #include "CollisionSpaceSimple.h" 00017 00018 // #include "random_utils/SleepyObject.h" 00019 #include "random_utils/ThreadSafeObject.h" 00020 #include "random_utils/ThreadSafeCanvas.h" 00021 00022 #include <ode/ode.h> 00023 #include <vrs/container/array.h> 00024 #include <vrs/so.h> 00025 #include <vrs/matrix.h> 00026 #include <vrs/sg/scenething.h> 00027 00028 #include "SDL.h" 00029 00030 namespace vrsode 00031 { 00032 00033 #define Infinity dInfinity; 00034 00040 // class PhysicsManager : public random_utils::SleepyObject 00041 class PhysicsManager : public random_utils::ThreadSafeObject 00042 { 00043 dWorldID m_worldId; 00044 dSpaceID m_spaceId; 00045 dJointGroupID m_collisionContactGroupId; 00046 00047 unsigned int m_maxCollisionContacts; 00048 00049 // in how many steps is one update cycle split 00050 static unsigned int m_updateResolution; 00051 static double m_stepSize; 00052 static double m_stepTime; 00053 static bool m_keepRunning; 00054 static bool m_runningMultiThreaded; 00055 00056 bool m_performanceAutoAdjust; 00057 00058 static PhysicsManager* m_instance; 00059 bool m_initialised; 00060 00061 std::vector<VRS::SO<PhysicsBody> > m_physicsBodies; 00062 std::vector<VRS::SO<CollisionBody> > m_collisionBodies; 00063 00064 static SDL_Thread* m_thread; 00065 00066 void applyTransformations(); 00067 00068 std::vector<VRS::SO<PhysicsBody> >::iterator findPhysicsBody( 00069 VRS::SO<PhysicsBody>); 00070 std::vector<VRS::SO<CollisionBody> >::iterator findCollisionBody( 00071 VRS::SO<CollisionBody>); 00072 00073 double currentTime(); 00074 00075 protected: 00076 void update(); 00077 00078 public: 00082 PhysicsManager(); 00083 00087 ~PhysicsManager(); 00088 00092 static void startThread() 00093 { 00094 PhysicsManager* pm = PhysicsManager::get(); 00095 assert(pm->isInitialised()); 00096 m_runningMultiThreaded = true; 00097 m_thread = SDL_CreateThread(&PhysicsManager::updateWorker, pm); 00098 } 00099 00103 static void terminate() 00104 { 00105 assert(m_runningMultiThreaded); 00106 PhysicsManager* pm = PhysicsManager::get(); 00107 pm->stop(); 00108 random_utils::ThreadSafeCanvas::get()->breakOut(); 00109 pm->release(); 00110 SDL_WaitThread(m_thread, 0); 00111 // SDL_KillThread(m_thread); 00112 } 00113 00117 bool runningMultiThreaded(); 00118 00122 void registerCollisionBody(VRS::SO<CollisionBody>); 00123 00127 void registerPhysicsBody(VRS::SO<PhysicsBody>); 00128 00132 void unregisterCollisionBody(VRS::SO<CollisionBody>); 00133 00137 void unregisterPhysicsBody(VRS::SO<PhysicsBody>); 00138 00143 const std::vector<VRS::SO<PhysicsBody> >& physicsBodies() const; 00144 00149 const std::vector<VRS::SO<CollisionBody> >& collisionBodies() const; 00150 00155 unsigned int physicsBodyCount() const; 00156 00161 unsigned int collisionBodyCount() const; 00162 00167 static PhysicsManager* get() 00168 { 00169 if(!m_instance) 00170 m_instance = new PhysicsManager(); 00171 00172 return m_instance; 00173 } 00174 00179 void setDebugNodesGlobal(bool p_debugNodes = true); 00180 00185 const dWorldID worldId() const; 00186 00192 const dSpaceID spaceId() const; 00193 00199 const dJointGroupID collisionContactGroupId() const; 00200 00206 const unsigned int maxCollisionContacts() const; 00207 00213 void setMaxCollisionContacts(unsigned int); 00214 00218 const bool isInitialised() const; 00219 00225 void init(); 00226 00231 void tick(double); 00232 00238 void update(double); 00239 00244 void release(); 00245 00250 void setStepTime(double); 00251 00255 double stepTime(); 00256 00261 void setStepSize(double); 00262 00266 double stepSize(); 00267 00272 void setUpdateSpeed(double); 00273 00278 double updateSpeed(); 00279 00284 void setUpdateResolution(unsigned int); 00285 00290 unsigned int updateResolution(); 00291 00295 static int updateWorker(void*); 00296 00300 bool keepRunning(); 00301 00305 void stop(); 00306 00310 void setPerformanceAutoAdjust(bool); 00311 00315 bool performanceAutoAdjust(); 00316 00320 std::string odeVersionString(); 00321 }; 00322 00323 } 00324 00325 #endif
1.5.1