vrsode/include/vrsode/PhysicsManager.h

Go to the documentation of this file.
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

Generated on Fri May 11 21:01:58 2007 for Random Racer by  doxygen 1.5.1