Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/physics_new/src/ogreode/OgreOdeWorld.h @ 2119

Last change on this file since 2119 was 2119, checked in by rgrieder, 15 years ago

Merged physics branch into physics_new branch.

  • Property svn:eol-style set to native
File size: 7.7 KB
Line 
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
15namespace 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
Note: See TracBrowser for help on using the repository browser.