| 1 | #ifndef _OGREODEWORLD_H_ | 
|---|
| 2 | #define _OGREODEWORLD_H_ | 
|---|
| 3 |  | 
|---|
| 4 | #include "OgreOdePreReqs.h" | 
|---|
| 5 |  | 
|---|
| 6 | #include <map> | 
|---|
| 7 | #include <OgreVector3.h> | 
|---|
| 8 |  | 
|---|
| 9 | #include "OgreOdeMaintainedList.h" | 
|---|
| 10 | #include "OgreOdeBody.h" | 
|---|
| 11 | #include "OgreOdeJoint.h" | 
|---|
| 12 | #include "OgreOdeGeometry.h" | 
|---|
| 13 | #include "OgreOdeSpace.h" | 
|---|
| 14 |  | 
|---|
| 15 | namespace OgreOde  | 
|---|
| 16 | { | 
|---|
| 17 |         /** The main class which you will use to simulate your world. | 
|---|
| 18 |      *  | 
|---|
| 19 |          * This is the core class of OgreOde, it is directly analogous to the ODE world except that | 
|---|
| 20 |          * in OgreOde you can have only one world, which is why it is Singleton. | 
|---|
| 21 |          * | 
|---|
| 22 |          * A World is a container for all the bodies and geometries in you simulation. You also | 
|---|
| 23 |          * use it to set global options for things like gravity, ERP, CFM and automatic sleeping. | 
|---|
| 24 |          * Also, the World is what you step when you want to advance your simulation by a certain time | 
|---|
| 25 |          * period. | 
|---|
| 26 |          */ | 
|---|
| 27 |         class _OgreOdeExport World | 
|---|
| 28 |     { | 
|---|
| 29 |         friend class Body; | 
|---|
| 30 |                 friend class JointGroup; | 
|---|
| 31 |                 friend class Joint; | 
|---|
| 32 |                 friend class Space; | 
|---|
| 33 |                 friend class Geometry; | 
|---|
| 34 |                 friend class StepHandler; | 
|---|
| 35 |  | 
|---|
| 36 |         public: | 
|---|
| 37 |                 /** Construct a new World. | 
|---|
| 38 |                  *  | 
|---|
| 39 |                  * You will need to call this to create the World into which you cabn place your physical objects. | 
|---|
| 40 |                  * The World requires a reference to the scene manager you are using in order to create things | 
|---|
| 41 |                  * like nodes for debug objects and to obtain configuration options for world geometry. | 
|---|
| 42 |                  *  | 
|---|
| 43 |                  * \param manager The scene manager you are using. | 
|---|
| 44 |                  */ | 
|---|
| 45 |                 World(Ogre::SceneManager* manager); | 
|---|
| 46 |                 ~World(); | 
|---|
| 47 |  | 
|---|
| 48 |                 void setGravity(const Ogre::Vector3& gravity = Ogre::Vector3::ZERO); | 
|---|
| 49 |                 const Ogre::Vector3& getGravity(); | 
|---|
| 50 |  | 
|---|
| 51 |                 void setHistorySize (size_t historySize); | 
|---|
| 52 |                 size_t getHistorySize () const; | 
|---|
| 53 |  | 
|---|
| 54 |                 void setERP(Ogre::Real erp = 0.2); | 
|---|
| 55 |                 Ogre::Real getERP(); | 
|---|
| 56 |                 void setCFM(Ogre::Real cfm = 10e-5); | 
|---|
| 57 |                 Ogre::Real getCFM(); | 
|---|
| 58 |  | 
|---|
| 59 |                 void setContactCorrectionVelocity(Ogre::Real velocity = 0.1); | 
|---|
| 60 |                 void setContactSurfaceLayer(Ogre::Real layer = 0.001); | 
|---|
| 61 |  | 
|---|
| 62 |                 void setAutoSleep(bool auto_sleep = false); | 
|---|
| 63 |                 bool getAutoSleep(); | 
|---|
| 64 |                 void setAutoSleepLinearThreshold(Ogre::Real linear_threshold = 0.01); | 
|---|
| 65 |                 Ogre::Real getAutoSleepLinearThreshold(); | 
|---|
| 66 |                 void setAutoSleepAngularThreshold(Ogre::Real angular_threshold = 0.01); | 
|---|
| 67 |                 Ogre::Real getAutoSleepAngularThreshold(); | 
|---|
| 68 |                 void setAutoSleepSteps(int steps = 10); | 
|---|
| 69 |                 int getAutoSleepSteps(); | 
|---|
| 70 |                 void setAutoSleepTime(Ogre::Real time = 0); | 
|---|
| 71 |                 Ogre::Real getAutoSleepTime();  | 
|---|
| 72 |         void setAutoSleepAverageSamplesCount(unsigned int  time = 10); | 
|---|
| 73 |         size_t getAutoSleepAverageSamplesCount(); | 
|---|
| 74 |                 inline void step(Ogre::Real stepsize);  | 
|---|
| 75 |         inline void quickStep(Ogre::Real stepsize); | 
|---|
| 76 |         inline void fastStep(Ogre::Real stepsize); | 
|---|
| 77 |  | 
|---|
| 78 |                 void setQuickStepIterations(int iterations); | 
|---|
| 79 |                 int getQuickStepIterations(); | 
|---|
| 80 |  | 
|---|
| 81 |                 Body* findBody(Ogre::SceneNode* node); | 
|---|
| 82 |                 Body* findBody(const Ogre::String& name); | 
|---|
| 83 |  | 
|---|
| 84 |                 inline void clearContacts(); | 
|---|
| 85 |  | 
|---|
| 86 |                 void setCollisionListener(CollisionListener* collision_listener); | 
|---|
| 87 |                 CollisionListener* getCollisionListener(); | 
|---|
| 88 |  | 
|---|
| 89 |                 void setShowDebugGeometries(bool show); | 
|---|
| 90 |         bool getShowDebugGeometries(){return _show_debug_geoms;} | 
|---|
| 91 |  | 
|---|
| 92 |         void setShowDebugContact(bool show); | 
|---|
| 93 |         bool getShowDebugContact(){return _show_debug_contact;} | 
|---|
| 94 |  | 
|---|
| 95 |                 inline void notifyGeometry(Body* body); | 
|---|
| 96 |  | 
|---|
| 97 |                 Space* getDefaultSpace(){return _default_space;} | 
|---|
| 98 |                 void setDefaultSpace(Space* space); | 
|---|
| 99 |  | 
|---|
| 100 |                 inline Ogre::SceneManager* getSceneManager(){return _manager;} | 
|---|
| 101 |  | 
|---|
| 102 |                 void setDamping(Ogre::Real linear_damping,Ogre::Real angular_damping); | 
|---|
| 103 |                 Ogre::Real getLinearDamping(); | 
|---|
| 104 |                 Ogre::Real getAngularDamping(); | 
|---|
| 105 |  | 
|---|
| 106 |                 inline void synchronise(); | 
|---|
| 107 |          | 
|---|
| 108 |                 inline void updateDrawState(); | 
|---|
| 109 |                 inline void updatePreviousState(); | 
|---|
| 110 |                 inline void updateCurrentState(); | 
|---|
| 111 |                 inline void interpolateDrawState(const Ogre::Real alpha); | 
|---|
| 112 |  | 
|---|
| 113 |  | 
|---|
| 114 |                 inline MaintainedList<Body>                     &getBodyList()          {return _body_list;} | 
|---|
| 115 |                 inline MaintainedList<Joint>            &getJointList()         {return _joint_list;} | 
|---|
| 116 |                 inline MaintainedList<JointGroup>       &getJointGroupList(){return _joint_group_list;} | 
|---|
| 117 |                 inline MaintainedList<Geometry>         &getGeometryList()      {return _geometry_list;} | 
|---|
| 118 |                 inline MaintainedList<Space>            &getSpaceList()         {return _space_list;} | 
|---|
| 119 |  | 
|---|
| 120 |         inline dWorldID                            getWorldID(); | 
|---|
| 121 |         protected: | 
|---|
| 122 |  | 
|---|
| 123 |         inline dJointGroupID                       getContactGroupID(); | 
|---|
| 124 |                 static void                         collisionCallback(void *data, | 
|---|
| 125 |                                                             dGeomID geom_a, | 
|---|
| 126 |                                                             dGeomID geom_b); | 
|---|
| 127 |  | 
|---|
| 128 |         protected: | 
|---|
| 129 |                 dWorldID                            _world; | 
|---|
| 130 |                 dJointGroupID               _contacts; | 
|---|
| 131 |  | 
|---|
| 132 |                 Space*                          _default_space; | 
|---|
| 133 |                  | 
|---|
| 134 |                 static CollisionListener*   _collision_listener; | 
|---|
| 135 |  | 
|---|
| 136 |                 MaintainedList<Body>            _body_list; | 
|---|
| 137 |                 MaintainedList<Joint>           _joint_list; | 
|---|
| 138 |                 MaintainedList<JointGroup>      _joint_group_list; | 
|---|
| 139 |                 MaintainedList<Geometry>        _geometry_list; | 
|---|
| 140 |                 MaintainedList<Space>           _space_list; | 
|---|
| 141 |  | 
|---|
| 142 |         bool                                _show_debug_geoms; | 
|---|
| 143 |         bool                                _show_debug_contact; | 
|---|
| 144 |  | 
|---|
| 145 |                 Ogre::SceneManager*             _manager; | 
|---|
| 146 |  | 
|---|
| 147 |                 Ogre::Vector3               _gravity; | 
|---|
| 148 |                 dReal                       _linear_damping,_angular_damping; | 
|---|
| 149 |                 size_t                      _history_size; | 
|---|
| 150 |         }; | 
|---|
| 151 |  | 
|---|
| 152 |  | 
|---|
| 153 |     //------------------------------------------------------------------------------------------------ | 
|---|
| 154 |     //INLINED Methods | 
|---|
| 155 |     //------------------------------------------------------------------------------------------------ | 
|---|
| 156 |     //------------------------------------------------------------------------------------------------ | 
|---|
| 157 |     inline dWorldID World::getWorldID() | 
|---|
| 158 |     { | 
|---|
| 159 |         return _world; | 
|---|
| 160 |     } | 
|---|
| 161 |     //------------------------------------------------------------------------------------------------ | 
|---|
| 162 |     inline dJointGroupID World::getContactGroupID() | 
|---|
| 163 |     { | 
|---|
| 164 |         return _contacts; | 
|---|
| 165 |     } | 
|---|
| 166 |     //------------------------------------------------------------------------------------------------ | 
|---|
| 167 |     inline void World::notifyGeometry(Body* body) | 
|---|
| 168 |     { | 
|---|
| 169 |         _geometry_list.notify(body); | 
|---|
| 170 |     } | 
|---|
| 171 |     //------------------------------------------------------------------------------------------------ | 
|---|
| 172 |     inline void World::synchronise() | 
|---|
| 173 |     { | 
|---|
| 174 |         _body_list.synchronise (); | 
|---|
| 175 |     } | 
|---|
| 176 |     //------------------------------------------------------------------------------------------------ | 
|---|
| 177 |     inline void World::updateDrawState() | 
|---|
| 178 |     { | 
|---|
| 179 |         _body_list.updateDrawState (); | 
|---|
| 180 |         if (_show_debug_contact) | 
|---|
| 181 |             _geometry_list.updateDebugContact(); | 
|---|
| 182 |     } | 
|---|
| 183 |     //------------------------------------------------------------------------------------------------ | 
|---|
| 184 |     inline void World::interpolateDrawState(const Ogre::Real alpha) | 
|---|
| 185 |     { | 
|---|
| 186 |         _body_list.interpolateDrawState(alpha); | 
|---|
| 187 |         if (_show_debug_contact) | 
|---|
| 188 |             _geometry_list.updateDebugContact(); | 
|---|
| 189 |     } | 
|---|
| 190 |     //------------------------------------------------------------------------------------------------ | 
|---|
| 191 |     inline void World::updatePreviousState() | 
|---|
| 192 |     { | 
|---|
| 193 |         _body_list.updatePreviousState(); | 
|---|
| 194 |     } | 
|---|
| 195 |     //------------------------------------------------------------------------------------------------ | 
|---|
| 196 |     inline void World::updateCurrentState() | 
|---|
| 197 |     { | 
|---|
| 198 |         _body_list.updateCurrentState (); | 
|---|
| 199 |     } | 
|---|
| 200 |     //------------------------------------------------------------------------------------------------ | 
|---|
| 201 |     inline void World::clearContacts() | 
|---|
| 202 |     { | 
|---|
| 203 |         dJointGroupEmpty(_contacts); | 
|---|
| 204 |     } | 
|---|
| 205 |     //------------------------------------------------------------------------------------------------ | 
|---|
| 206 |     inline void World::step(Ogre::Real stepsize) | 
|---|
| 207 |     { | 
|---|
| 208 |         dWorldStep(_world,(dReal)stepsize);  | 
|---|
| 209 |     } | 
|---|
| 210 |     //------------------------------------------------------------------------------------------------ | 
|---|
| 211 |     inline void World::quickStep(Ogre::Real stepsize) | 
|---|
| 212 |     { | 
|---|
| 213 |         dWorldQuickStep(_world,(dReal)stepsize); | 
|---|
| 214 |     } | 
|---|
| 215 |     //------------------------------------------------------------------------------------------------ | 
|---|
| 216 |     inline void World::fastStep(Ogre::Real stepsize) | 
|---|
| 217 |     { | 
|---|
| 218 |         dWorldStepFast1(_world,(dReal)stepsize,20); | 
|---|
| 219 |     } | 
|---|
| 220 | } | 
|---|
| 221 | #endif | 
|---|