00001 #ifndef __SIM_SIMULATOR_H__ 00002 #define __SIM_SIMULATOR_H__ 00003 00004 #include "nommgr.h" 00005 #include <ode/ode.h> 00006 00007 #ifdef GCC295 00008 #include <hash_map> 00009 #else 00010 #include <ext/hash_map> 00011 #endif 00012 00013 #include "mmgr.h" 00014 00015 #include "Math.h" 00021 class Collision; 00022 class RigidBody; 00023 00024 struct RigidBodyHash : std::unary_function<RigidBody *, RigidBody *> 00025 { 00026 size_t operator () (const RigidBody* rigidBody) const 00027 { 00028 return (size_t)rigidBody; 00029 } 00030 }; 00031 00032 class Simulator 00033 { 00034 public: 00035 static Simulator* getInstance (); 00036 00037 public: 00038 ~Simulator (); 00039 00040 public: 00041 void initialize (); 00042 void shutdown (); 00043 00044 public: 00045 dWorldID getWorld (); 00046 dJointGroupID getContactGroup (); 00047 00048 void setTargetFps (Real targetFps); 00049 00050 public: 00051 void beginFrame (); 00052 void frame (); 00053 void endFrame (); 00054 00055 bool getIsCollisionHandled (RigidBody* rigidBody1, RigidBody* rigidBody2); 00056 00057 void addCollision (RigidBody* rigidBody, Collision& collision); 00058 void addCollision (RigidBody* rigidBody1, RigidBody* rigidBody2, Collision& collision); 00059 00060 protected: 00061 Simulator (); 00062 00063 protected: 00064 bool isInitialized; 00065 bool isShutdown; 00066 00067 dWorldID world; 00068 dJointGroupID contactGroup; 00069 00070 Real simStep; 00071 00072 #ifdef GCC295 00073 typedef std::hash_multimap<RigidBody*, RigidBody*, RigidBodyHash> CollisionSet; 00074 #else 00075 typedef __gnu_cxx::hash_multimap<RigidBody*, RigidBody*, RigidBodyHash> CollisionSet; 00076 #endif 00077 CollisionSet collisionSet; 00078 }; 00079 00080 #endif