Changeset 1630


Ignore:
Timestamp:
Jul 15, 2012, 12:28:41 PM (8 years ago)
Author:
touky
Message:

Small refactor of the Phys::Simulation.
Phys::Simulation is now an entity.
Phys::Simulation now implements timesteps correctly.

Location:
trunk/test
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/test/BtPhysTest.cpp

    r1617 r1630  
    6868
    6969        m_simulation = new Simulation();
    70         m_simulation->InitContext();
     70        m_simulation->Init();
    7171        vec3 NewGravity = vec3(.0f, -10.0f, .0f);
    7272        m_simulation->SetGravity(NewGravity);
    7373        m_simulation->SetContinuousDetection(true);
     74        m_simulation->SetTimestep(1.f / 120.f);
     75    Ticker::Ref(m_simulation);
    7476
    7577        float offset = 29.5f;
     
    266268    if (Input::GetButtonState(27 /*SDLK_ESCAPE*/))
    267269        Ticker::Shutdown();
    268 
    269         m_simulation->TickContext(seconds);
    270270
    271271        vec3 GroundBarycenter = vec3(.0f);
     
    416416                Ticker::Unref(CurPop);
    417417        }
     418    Ticker::Unref(m_simulation);
    418419
    419420#if 0
  • trunk/test/Physics/EasyPhysics.cpp

    r1614 r1630  
    4343EasyPhysics::~EasyPhysics()
    4444{
     45        m_rigid_body = NULL;
    4546        delete m_collision_object;
    4647        delete m_collision_shape;
  • trunk/test/Physics/LolPhysics.h

    r1613 r1630  
    2222{
    2323
    24 class Simulation
     24class Simulation : public Entity
    2525{
     26        friend class EasyPhysics;
     27
    2628public:
    2729        Simulation() :
     
    3032                m_dispatcher(0),
    3133                m_solver(0),
    32                 m_dynamics_world(0)
     34                m_dynamics_world(0),
     35                m_timestep(1.f/60.f)
    3336        {
    3437        }
    3538        ~Simulation()
    3639        {
    37                 ExitContext();
     40                Exit();
    3841        }
    3942
     
    4144
    4245#ifdef HAVE_PHYS_USE_BULLET
    43         void InitContext()
     46public:
     47        void Init()
    4448        {
    4549                // Build the broadphase
     
    5761        }
    5862
    59         void SetContinuousDetection(bool ShouldUseCCD)
    60         {
    61                 if (m_dynamics_world)
    62                         m_dynamics_world->getDispatchInfo().m_useContinuous = ShouldUseCCD;
    63         }
    64 
    65         void SetGravity(vec3 &NewGravity)
    66         {
    67                 if (m_dynamics_world)
    68                         m_dynamics_world->setGravity(LOL2BT_VEC3(NewGravity));
    69         }
    70 
    71         void TickContext(float seconds)
     63        virtual void TickGame(float seconds)
    7264        {
    7365                //step the simulation
    7466                if (m_dynamics_world)
    7567                {
    76                         int steps = (int)(seconds / 0.005f);
    77                         for (int i = 0; i < steps; i++)
    78                                 m_dynamics_world->stepSimulation(seconds / steps);
     68                        //the "+1" is to have at least one Timestep and to ensure float to int .5f conversion.
     69                        int steps = (int)(seconds / m_timestep) + 1;
     70                        m_dynamics_world->stepSimulation(seconds, steps, m_timestep);
    7971                }
    8072        }
    8173
    82         void ExitContext()
     74        void Exit()
    8375        {
    8476                delete m_dynamics_world;
     
    9385                return m_dynamics_world;
    9486        }
    95         void AddToDynamic(EasyPhysics* dynamic_EP)
     87
     88private:
     89        void CustomSetContinuousDetection(bool ShouldUseCCD)
    9690        {
    97                 m_dynamic_list << dynamic_EP;
    98         }
    99         void AddToStatic(EasyPhysics* static_EP)
    100         {
    101                 m_static_list << static_EP;
     91                if (m_dynamics_world)
     92                        m_dynamics_world->getDispatchInfo().m_useContinuous = ShouldUseCCD;
    10293        }
    10394
    104 private:
     95        void CustomSetGravity(vec3 &NewGravity)
     96        {
     97                if (m_dynamics_world)
     98                        m_dynamics_world->setGravity(LOL2BT_VEC3(NewGravity));
     99        }
     100
     101        void CustomSetTimestep(float NewTimestep) { }
    105102
    106103        //broadphase
     
    113110        // The world.
    114111        btDiscreteDynamicsWorld*                                m_dynamics_world;
     112#else
     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#endif //HAVE_PHYS_USE_BULLET
     122
     123public:
     124        //Main logic :
     125        //The Set*() functions do the all-lib-independent data storage.
     126        //And then it calls the CustomSet*() which are the specialized versions.
     127
     128        //Sets the continuous collision detection flag.
     129        void SetContinuousDetection(bool ShouldUseCCD)
     130        {
     131                m_using_CCD = ShouldUseCCD;
     132                CustomSetContinuousDetection(ShouldUseCCD);
     133        }
     134
     135        //Sets the simulation gravity.
     136        void SetGravity(vec3 &NewGravity)
     137        {
     138                m_gravity = NewGravity;
     139                CustomSetGravity(NewGravity);
     140        }
     141
     142        //Sets the simulation fixed timestep.
     143        void SetTimestep(float NewTimestep)
     144        {
     145                if (NewTimestep > .0f)
     146                {
     147                        m_timestep = NewTimestep;
     148                        CustomSetTimestep(NewTimestep);
     149                }
     150        }
     151
     152private:
     153        //Adds the given EasyPhysics to the correct list.
     154        void AddToDynamic(EasyPhysics* dynamic_EP)      { m_dynamic_list << dynamic_EP; }
     155        void AddToStatic(EasyPhysics* static_EP)        { m_static_list << static_EP; }
    115156
    116157        //Easy Physics body List
    117158        Array<EasyPhysics*>                                             m_dynamic_list;
    118159        Array<EasyPhysics*>                                             m_static_list;
    119 #else
    120         void InitContext() { }
    121         void TickContext(float seconds) { }
    122         void ExitContext() { }
    123 #endif //HAVE_PHYS_USE_BULLET
     160
     161        //Easy Physics data storage
     162        float                                                                   m_timestep;
     163        bool                                                                    m_using_CCD;
     164        vec3                                                                    m_gravity;
    124165};
    125166
Note: See TracChangeset for help on using the changeset viewer.