Browse Source

Small physic refactor.

legacy
Benjamin ‘Touky’ Huet touky 12 years ago
parent
commit
5d10ec177c
7 changed files with 140 additions and 12 deletions
  1. +10
    -1
      test/Physics/Include/EasyCharacterController.h
  2. +6
    -0
      test/Physics/Include/EasyConstraint.h
  3. +2
    -1
      test/Physics/Include/EasyPhysics.h
  4. +89
    -4
      test/Physics/Include/LolPhysics.h
  5. +10
    -1
      test/Physics/Src/EasyCharacterController.cpp
  6. +4
    -1
      test/Physics/Src/EasyConstraint.cpp
  7. +19
    -4
      test/Physics/Src/EasyPhysics.cpp

+ 10
- 1
test/Physics/Include/EasyCharacterController.h View File

@@ -10,10 +10,13 @@
// //


// //
// The EasyPhysic class
// The EasyCharacterController class
// ------------------ // ------------------
// //


//Should try to to make a btKinematicCharacterController for real.
//

#if !defined __EASYCHARACTERCONTROLLER_EASYCHARACTERCONTROLLER_H__ #if !defined __EASYCHARACTERCONTROLLER_EASYCHARACTERCONTROLLER_H__
#define __EASYCHARACTERCONTROLLER_EASYCHARACTERCONTROLLER_H__ #define __EASYCHARACTERCONTROLLER_EASYCHARACTERCONTROLLER_H__


@@ -33,6 +36,9 @@ class EasyCharacterController : public EasyPhysic,
public Entity public Entity
{ {


friend class Simulation;
friend class EasyPhysic;

#ifdef HAVE_PHYS_USE_BULLET #ifdef HAVE_PHYS_USE_BULLET


public: public:
@@ -47,6 +53,7 @@ public:
{ {
m_gamegroup = GAMEGROUP_EZP_CHAR_CTRLR; m_gamegroup = GAMEGROUP_EZP_CHAR_CTRLR;
m_up_axis = 1; m_up_axis = 1;
m_gravity = vec3(.0f, -9.81f, .0f);
} }
~EasyCharacterController() ~EasyCharacterController()
{ {
@@ -77,6 +84,8 @@ protected:
bool m_base_is_updating; bool m_base_is_updating;
vec3 m_base_cached_movement; vec3 m_base_cached_movement;
vec3 m_frame_cached_movement; vec3 m_frame_cached_movement;
vec3 m_gravity;
vec3 m_velocity;


#else // NO PHYSIC IMPLEMENTATION #else // NO PHYSIC IMPLEMENTATION




+ 6
- 0
test/Physics/Include/EasyConstraint.h View File

@@ -30,6 +30,10 @@ namespace phys


class EasyConstraint class EasyConstraint
{ {

friend class Simulation;
friend class EasyPhysic;

#ifdef HAVE_PHYS_USE_BULLET #ifdef HAVE_PHYS_USE_BULLET


public: public:
@@ -40,6 +44,7 @@ public:
m_slider_constraint(NULL), m_slider_constraint(NULL),
m_cone_twist_constraint(NULL), m_cone_twist_constraint(NULL),
m_6dof_constraint(NULL), m_6dof_constraint(NULL),
m_owner_simulation(NULL),
m_a_physobj(NULL), m_a_physobj(NULL),
m_b_physobj(NULL), m_b_physobj(NULL),
m_a_transform(lol::mat4(1.f)), m_a_transform(lol::mat4(1.f)),
@@ -193,6 +198,7 @@ public:
} }


private: private:
Simulation* m_owner_simulation;
EasyPhysic* m_a_physobj; EasyPhysic* m_a_physobj;
EasyPhysic* m_b_physobj; EasyPhysic* m_b_physobj;
lol::mat4 m_a_transform; lol::mat4 m_a_transform;


+ 2
- 1
test/Physics/Include/EasyPhysics.h View File

@@ -33,8 +33,8 @@ namespace phys
class EasyPhysic class EasyPhysic
{ {


friend class EasyConstraint;
friend class Simulation; friend class Simulation;
friend class EasyConstraint;


#ifdef HAVE_PHYS_USE_BULLET #ifdef HAVE_PHYS_USE_BULLET


@@ -153,6 +153,7 @@ protected:
int m_collision_group; int m_collision_group;
int m_collision_mask; int m_collision_mask;
WorldEntity* m_owner_entity; WorldEntity* m_owner_entity;
Simulation* m_owner_simulation;


//Base/Attachment logic //Base/Attachment logic
Array<EasyPhysic*> m_based_physic_list; //List of objects based on this : this object moves, its based object move with it. Array<EasyPhysic*> m_based_physic_list; //List of objects based on this : this object moves, its based object move with it.


+ 89
- 4
test/Physics/Include/LolPhysics.h View File

@@ -320,19 +320,104 @@ public:
} }


private: private:

friend class EasyPhysic; friend class EasyPhysic;
friend class EasyCharacterController;
friend class EasyConstraint; friend class EasyConstraint;


enum eEasyPhysicType
{
EEPT_Dynamic,
EEPT_Static,
EEPT_Ghost,
EEPT_CollisionObject,
EEPT_CharacterController,

EEPT_MAX
};

//m_owner_simulation
//Adds the given EasyPhysic to the correct list. //Adds the given EasyPhysic to the correct list.
void AddToDynamic(EasyPhysic* NewEPDynamic) { m_dynamic_list << NewEPDynamic; }
void AddToStatic(EasyPhysic* NewEPStatic) { m_static_list << NewEPStatic; }
void AddToGhost(EasyPhysic* NewEPGhost) { m_ghost_list << NewEPGhost; }
void AddToConstraint(EasyConstraint* NewEC) { m_constraint_list << NewEC; }
void ObjectRegistration(bool AddObject, EasyPhysic* NewEP, eEasyPhysicType CurType)
{
Array<EasyPhysic*>* SearchList = NULL;
switch(CurType)
{
case EEPT_Dynamic:
{
SearchList = &m_dynamic_list;
break;
}
case EEPT_Static:
{
SearchList = &m_static_list;
break;
}
case EEPT_Ghost:
{
SearchList = &m_ghost_list;
break;
}
case EEPT_CollisionObject:
{
SearchList = &m_collision_object_list;
break;
}
case EEPT_CharacterController:
{
SearchList = &m_character_controller_list;
break;
}
}

if (AddObject)
{
NewEP->m_owner_simulation = this;
(*SearchList) << NewEP;
}
else
{
NewEP->m_owner_simulation = NULL;
for (int i = 0; i < SearchList->Count(); ++i)
{
if ((*SearchList)[i] == NewEP)
{
SearchList->Remove(i--);
break;
}
}
}
}
void ObjectRegistration(bool AddObject, EasyConstraint* NewEC)
{
Array<EasyConstraint*>* SearchList = NULL;
SearchList = &m_constraint_list;

if (AddObject)
{
NewEC->m_owner_simulation = this;
(*SearchList) << NewEC;
}
else
{
NewEC->m_owner_simulation = NULL;
for (int i = 0; i < SearchList->Count(); ++i)
{
if ((*SearchList)[i] == NewEC)
{
SearchList->Remove(i--);
break;
}
}
}
}


//Easy Physics body List //Easy Physics body List
Array<EasyPhysic*> m_dynamic_list; Array<EasyPhysic*> m_dynamic_list;
Array<EasyPhysic*> m_static_list; Array<EasyPhysic*> m_static_list;
Array<EasyPhysic*> m_ghost_list; Array<EasyPhysic*> m_ghost_list;
Array<EasyPhysic*> m_collision_object_list;
Array<EasyPhysic*> m_character_controller_list;
Array<EasyConstraint*> m_constraint_list; Array<EasyConstraint*> m_constraint_list;


//Easy Physics data storage //Easy Physics data storage


+ 10
- 1
test/Physics/Src/EasyCharacterController.cpp View File

@@ -62,7 +62,13 @@ void EasyCharacterController::AddToSimulation(class Simulation* current_simulati
delete m_character; delete m_character;


m_character = new btKinematicCharacterController(m_pair_caching_object, m_convex_shape, m_step_height, m_up_axis); m_character = new btKinematicCharacterController(m_pair_caching_object, m_convex_shape, m_step_height, m_up_axis);

//Deactivate Character controller basic behaviour.
//m_character->setGravity(.0f);
//m_character->setFallSpeed(.0f);

dynamics_world->addAction(m_character); dynamics_world->addAction(m_character);
current_simulation->ObjectRegistration(true, this, Simulation::EEPT_CharacterController);
Ticker::Ref(this); Ticker::Ref(this);
} }
} }
@@ -78,6 +84,7 @@ void EasyCharacterController::RemoveFromSimulation(class Simulation* current_sim
if (m_character) if (m_character)
{ {
dynamics_world->removeAction(m_character); dynamics_world->removeAction(m_character);
current_simulation->ObjectRegistration(false, this, Simulation::EEPT_CharacterController);
Ticker::Unref(this); Ticker::Unref(this);
} }
} }
@@ -118,7 +125,9 @@ void EasyCharacterController::TickGame(float seconds)
{ {
Entity::TickGame(seconds); Entity::TickGame(seconds);


m_character->setVelocityForTimeInterval(LOL2BT_VEC3(LOL2BT_UNIT * (m_base_cached_movement + m_frame_cached_movement)) / seconds, seconds);
int IterationsNb = (int)(seconds / m_owner_simulation->m_timestep);
float NewSeconds = IterationsNb * m_owner_simulation->m_timestep;
m_character->setVelocityForTimeInterval(LOL2BT_VEC3(LOL2BT_UNIT * (m_base_cached_movement + m_frame_cached_movement)) / NewSeconds, NewSeconds);
m_base_cached_movement = vec3(.0f); m_base_cached_movement = vec3(.0f);
} }




+ 4
- 1
test/Physics/Src/EasyConstraint.cpp View File

@@ -25,7 +25,7 @@ void EasyConstraint::AddToSimulation(class Simulation* current_simulation)
if (dynamics_world && m_typed_constraint) if (dynamics_world && m_typed_constraint)
{ {
dynamics_world->addConstraint(m_typed_constraint, m_disable_a2b_collision); dynamics_world->addConstraint(m_typed_constraint, m_disable_a2b_collision);
current_simulation->AddToConstraint(this);
current_simulation->ObjectRegistration(true, this);
} }
} }


@@ -33,7 +33,10 @@ void EasyConstraint::RemoveFromSimulation(class Simulation* current_simulation)
{ {
btDiscreteDynamicsWorld* dynamics_world = current_simulation->GetWorld(); btDiscreteDynamicsWorld* dynamics_world = current_simulation->GetWorld();
if (dynamics_world && m_typed_constraint) if (dynamics_world && m_typed_constraint)
{
dynamics_world->removeConstraint(m_typed_constraint); dynamics_world->removeConstraint(m_typed_constraint);
current_simulation->ObjectRegistration(false, this);
}
} }


#endif // HAVE_PHYS_USE_BULLET #endif // HAVE_PHYS_USE_BULLET


+ 19
- 4
test/Physics/Src/EasyPhysics.cpp View File

@@ -41,6 +41,7 @@ EasyPhysic::EasyPhysic(WorldEntity* NewOwnerEntity) :
m_collision_group(1), m_collision_group(1),
m_collision_mask(1), m_collision_mask(1),
m_owner_entity(NewOwnerEntity), m_owner_entity(NewOwnerEntity),
m_owner_simulation(NULL),
m_base_physic(NULL) m_base_physic(NULL)
{ {
} }
@@ -286,18 +287,21 @@ void EasyPhysic::AddToSimulation(class Simulation* current_simulation)
if (m_ghost_object) if (m_ghost_object)
{ {
dynamics_world->addCollisionObject(m_ghost_object, m_collision_group, m_collision_mask); dynamics_world->addCollisionObject(m_ghost_object, m_collision_group, m_collision_mask);
current_simulation->AddToGhost(this);
current_simulation->ObjectRegistration(true, this, Simulation::EEPT_Ghost);
} }
else if (m_rigid_body) else if (m_rigid_body)
{ {
dynamics_world->addRigidBody(m_rigid_body, m_collision_group, m_collision_mask); dynamics_world->addRigidBody(m_rigid_body, m_collision_group, m_collision_mask);
if (m_mass != .0f) if (m_mass != .0f)
current_simulation->AddToDynamic(this);
current_simulation->ObjectRegistration(true, this, Simulation::EEPT_Dynamic);
else else
current_simulation->AddToStatic(this);
current_simulation->ObjectRegistration(true, this, Simulation::EEPT_Static);
} }
else else
{
dynamics_world->addCollisionObject(m_collision_object, m_collision_group, m_collision_mask); dynamics_world->addCollisionObject(m_collision_object, m_collision_group, m_collision_mask);
current_simulation->ObjectRegistration(true, this, Simulation::EEPT_CollisionObject);
}
} }
} }


@@ -308,9 +312,20 @@ void EasyPhysic::RemoveFromSimulation(class Simulation* current_simulation)
if (dynamics_world) if (dynamics_world)
{ {
if (m_rigid_body) if (m_rigid_body)
{
dynamics_world->removeRigidBody(m_rigid_body); dynamics_world->removeRigidBody(m_rigid_body);
else if (m_collision_object)
if (m_mass != .0f)
current_simulation->ObjectRegistration(false, this, Simulation::EEPT_Dynamic);
else
current_simulation->ObjectRegistration(false, this, Simulation::EEPT_Static);
}
else
{
dynamics_world->removeCollisionObject(m_collision_object); dynamics_world->removeCollisionObject(m_collision_object);
if (m_ghost_object)
current_simulation->ObjectRegistration(false, this, Simulation::EEPT_Ghost);
current_simulation->ObjectRegistration(false, this, Simulation::EEPT_CollisionObject);
}
} }
} }




Loading…
Cancel
Save