@@ -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 | ||||
@@ -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; | ||||
@@ -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. | ||||
@@ -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 | ||||
@@ -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); | ||||
} | } | ||||
@@ -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 | ||||
@@ -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); | |||||
} | |||||
} | } | ||||
} | } | ||||