source: trunk/test/Physics/LolPhysics.h @ 1632

Last change on this file since 1632 was 1632, checked in by touky, 10 years ago

Small name refactor & correct Kinematic integration.
+ Constraint hollow class.

File size: 4.2 KB
Line 
1//
2// LolPhysics
3//
4// Copyright: (c) 2009-2012 Benjamin Huet <huet.benjamin@gmail.com>
5//            (c) 2012 Sam Hocevar <sam@hocevar.net>
6//
7
8#if !defined __LOLPHYSICS_H__
9#define __LOLPHYSICS_H__
10
11#ifdef HAVE_PHYS_USE_BULLET
12#include <bullet/btBulletDynamicsCommon.h>
13#include <bullet/btBulletCollisionCommon.h>
14#include "LolBtPhysicsIntegration.h"
15#include "EasyPhysics.h"
16#endif
17
18namespace lol
19{
20
21namespace phys
22{
23
24class Simulation : public Entity
25{
26public:
27        Simulation() :
28                m_broadphase(0),
29                m_collision_configuration(0),
30                m_dispatcher(0),
31                m_solver(0),
32                m_dynamics_world(0),
33                m_timestep(1.f/60.f)
34        {
35        }
36        ~Simulation()
37        {
38                Exit();
39        }
40
41        char const *GetName() { return "<Simulation>"; }
42
43#ifdef HAVE_PHYS_USE_BULLET
44public:
45        void Init()
46        {
47                // Build the broadphase
48                m_broadphase = new btDbvtBroadphase();
49 
50                // Set up the collision configuration and dispatcher
51                m_collision_configuration = new btDefaultCollisionConfiguration();
52                m_dispatcher = new btCollisionDispatcher(m_collision_configuration);
53 
54                // The actual physics solver
55                m_solver = new btSequentialImpulseConstraintSolver;
56 
57                // The world.
58                m_dynamics_world = new btDiscreteDynamicsWorld(m_dispatcher, m_broadphase, m_solver, m_collision_configuration);
59        }
60
61        virtual void TickGame(float seconds)
62        {
63                //step the simulation
64                if (m_dynamics_world)
65                {
66                        //the "+1" is to have at least one Timestep and to ensure float to int .5f conversion.
67                        int steps = (int)(seconds / m_timestep) + 1;
68                        m_dynamics_world->stepSimulation(seconds, steps, m_timestep);
69                }
70        }
71
72        void Exit()
73        {
74                delete m_dynamics_world;
75                delete m_solver;
76                delete m_dispatcher;
77                delete m_collision_configuration;
78                delete m_broadphase;
79        }
80
81        btDiscreteDynamicsWorld* GetWorld()
82        {
83                return m_dynamics_world;
84        }
85
86private:
87        void CustomSetContinuousDetection(bool ShouldUseCCD)
88        {
89                if (m_dynamics_world)
90                        m_dynamics_world->getDispatchInfo().m_useContinuous = ShouldUseCCD;
91        }
92
93        void CustomSetGravity(vec3 &NewGravity)
94        {
95                if (m_dynamics_world)
96                        m_dynamics_world->setGravity(LOL2BT_VEC3(NewGravity * LOL2BT_UNIT));
97        }
98
99        void CustomSetTimestep(float NewTimestep) { }
100
101        //broadphase
102        btBroadphaseInterface*                                  m_broadphase;
103        // Set up the collision configuration and dispatc
104        btDefaultCollisionConfiguration*                m_collision_configuration;
105        btCollisionDispatcher*                                  m_dispatcher;
106        // The actual physics solver
107        btSequentialImpulseConstraintSolver*    m_solver;
108        // The world.
109        btDiscreteDynamicsWorld*                                m_dynamics_world;
110
111#else  // NO PHYSIC IMPLEMENTATION
112
113public:
114        void Init() { }
115        void TickGame(float seconds) { }
116        void Exit() { }
117private:
118        void CustomSetContinuousDetection(bool ShouldUseCCD) { }
119        void CustomSetGravity(vec3 &NewGravity) { }
120        void CustomSetTimestep(float NewTimestep) { }
121
122#endif // PHYSIC IMPLEMENTATION
123
124public:
125        //Main logic :
126        //The Set*() functions do the all-lib-independent data storage.
127        //And then it calls the CustomSet*() which are the specialized versions.
128
129        //Sets the continuous collision detection flag.
130        void SetContinuousDetection(bool ShouldUseCCD)
131        {
132                m_using_CCD = ShouldUseCCD;
133                CustomSetContinuousDetection(ShouldUseCCD);
134        }
135
136        //Sets the simulation gravity.
137        void SetGravity(vec3 &NewGravity)
138        {
139                m_gravity = NewGravity;
140                CustomSetGravity(NewGravity);
141        }
142
143        //Sets the simulation fixed timestep.
144        void SetTimestep(float NewTimestep)
145        {
146                if (NewTimestep > .0f)
147                {
148                        m_timestep = NewTimestep;
149                        CustomSetTimestep(NewTimestep);
150                }
151        }
152
153private:
154        friend class EasyPhysic;
155        friend class EasyConstraint;
156
157        //Adds the given EasyPhysic to the correct list.
158        void AddToDynamic(EasyPhysic* NewEPDynamic)     { m_dynamic_list << NewEPDynamic; }
159        void AddToStatic(EasyPhysic* NewEPStatic)       { m_static_list << NewEPStatic; }
160        void AddToConstraint(EasyConstraint* NewEC)     { m_constraint_list     << NewEC; }
161
162        //Easy Physics body List
163        Array<EasyPhysic*>                                              m_dynamic_list;
164        Array<EasyPhysic*>                                              m_static_list;
165        Array<EasyConstraint*>                                  m_constraint_list;
166
167        //Easy Physics data storage
168        float                                                                   m_timestep;
169        bool                                                                    m_using_CCD;
170        vec3                                                                    m_gravity;
171};
172
173} /* namespace phys */
174
175} /* namespace lol */
176
177#endif // __LOLPHYSICS_H__
178
Note: See TracBrowser for help on using the repository browser.