@@ -30,7 +30,7 @@ public: | |||
m_physics.SetShapeToBox(BoxSize); | |||
m_physics.SetMass(.0f); | |||
m_physics.SetTransform(base_location, base_rotation); | |||
m_physics.InitBodyToRigid(); | |||
m_physics.InitBodyToRigid(true); | |||
m_physics.AddToSimulation(new_sim); | |||
} | |||
@@ -164,7 +164,7 @@ protected: | |||
private: | |||
//Base datas | |||
EasyMesh m_mesh; | |||
EasyPhysics m_physics; | |||
EasyPhysic m_physics; | |||
bool m_ready; | |||
bool m_should_render; | |||
@@ -30,7 +30,7 @@ namespace phys | |||
#ifdef HAVE_PHYS_USE_BULLET | |||
EasyPhysics::EasyPhysics() : | |||
EasyPhysic::EasyPhysic() : | |||
m_collision_object(NULL), | |||
m_rigid_body(NULL), | |||
m_collision_shape(NULL), | |||
@@ -42,7 +42,7 @@ EasyPhysics::EasyPhysics() : | |||
{ | |||
} | |||
EasyPhysics::~EasyPhysics() | |||
EasyPhysic::~EasyPhysic() | |||
{ | |||
m_rigid_body = NULL; | |||
delete m_collision_object; | |||
@@ -54,7 +54,7 @@ EasyPhysics::~EasyPhysics() | |||
//Set Shape functions | |||
//-- | |||
void EasyPhysics::SetShapeTo(btCollisionShape* collision_shape) | |||
void EasyPhysic::SetShapeTo(btCollisionShape* collision_shape) | |||
{ | |||
bool bReinitToRigidBody = false; | |||
if (m_rigid_body) | |||
@@ -72,60 +72,43 @@ void EasyPhysics::SetShapeTo(btCollisionShape* collision_shape) | |||
} | |||
//Box Shape support | |||
void EasyPhysics::SetShapeToBox(lol::vec3& box_size) | |||
void EasyPhysic::SetShapeToBox(lol::vec3& box_size) | |||
{ | |||
vec3 new_box_size = box_size * LOL2BT_UNIT * LOL2BT_SIZE; | |||
SetShapeTo(new btBoxShape(LOL2BT_VEC3(new_box_size))); | |||
} | |||
void EasyPhysics::SetShapeToSphere(float radius) | |||
void EasyPhysic::SetShapeToSphere(float radius) | |||
{ | |||
SetShapeTo(new btSphereShape(radius * LOL2BT_UNIT * LOL2BT_SIZE)); | |||
} | |||
void EasyPhysics::SetShapeToCone(float radius, float height) | |||
void EasyPhysic::SetShapeToCone(float radius, float height) | |||
{ | |||
SetShapeTo(new btConeShape( radius * LOL2BT_UNIT, | |||
height * LOL2BT_UNIT)); | |||
} | |||
void EasyPhysics::SetShapeToCylinder(lol::vec3& cyl_size) | |||
void EasyPhysic::SetShapeToCylinder(lol::vec3& cyl_size) | |||
{ | |||
vec3 new_cyl_size = cyl_size * LOL2BT_UNIT; | |||
new_cyl_size.y *= LOL2BT_SIZE; | |||
SetShapeTo(new btCylinderShape(LOL2BT_VEC3(new_cyl_size))); | |||
} | |||
void EasyPhysics::SetShapeToCapsule(float radius, float height) | |||
void EasyPhysic::SetShapeToCapsule(float radius, float height) | |||
{ | |||
SetShapeTo(new btCapsuleShape( radius * LOL2BT_UNIT * LOL2BT_SIZE, | |||
height * LOL2BT_UNIT * LOL2BT_SIZE)); | |||
} | |||
//------------------------------------------------------------------------- | |||
//Bullet collision channel setup | |||
//-- | |||
void EasyPhysics::CustomSetCollisionChannel(int NewGroup, int NewMask) | |||
{ | |||
if (m_rigid_body) | |||
m_rigid_body->setCollisionFlags(m_collision_mask); | |||
} | |||
//------------------------------------------------------------------------- | |||
//Base Location/Rotation setup | |||
//-- | |||
void EasyPhysics::SetTransform(const lol::vec3& base_location, const lol::quat& base_rotation) | |||
void EasyPhysic::SetTransform(const lol::vec3& base_location, const lol::quat& base_rotation) | |||
{ | |||
if (m_motion_state) | |||
{ | |||
if (m_mass != .0f) | |||
m_motion_state->setWorldTransform(btTransform(LOL2BT_QUAT(base_rotation), LOL2BT_VEC3(base_location))); | |||
else | |||
{ | |||
m_rigid_body->setWorldTransform(btTransform(LOL2BT_QUAT(base_rotation), LOL2BT_VEC3(base_location))); | |||
m_motion_state->setWorldTransform(btTransform(LOL2BT_QUAT(base_rotation), LOL2BT_VEC3(base_location))); | |||
} | |||
} | |||
m_motion_state->setWorldTransform(btTransform(LOL2BT_QUAT(base_rotation), LOL2BT_VEC3(base_location))); | |||
else | |||
m_motion_state = new btDefaultMotionState(btTransform(LOL2BT_QUAT(base_rotation), LOL2BT_VEC3(base_location))); | |||
} | |||
@@ -134,7 +117,7 @@ void EasyPhysics::SetTransform(const lol::vec3& base_location, const lol::quat& | |||
//Mass related functions | |||
//-- | |||
//Set Shape functions | |||
void EasyPhysics::SetMass(float mass) | |||
void EasyPhysic::SetMass(float mass) | |||
{ | |||
m_mass = mass; | |||
@@ -150,7 +133,7 @@ void EasyPhysics::SetMass(float mass) | |||
//-- | |||
//Init to rigid body | |||
void EasyPhysics::InitBodyToRigid() | |||
void EasyPhysic::InitBodyToRigid(bool SetToKinematic) | |||
{ | |||
if (m_collision_object) | |||
delete m_collision_object; | |||
@@ -158,12 +141,19 @@ void EasyPhysics::InitBodyToRigid() | |||
SetLocalInertia(m_mass); | |||
if (!m_motion_state) | |||
SetTransform(vec3(.0f)); | |||
btRigidBody::btRigidBodyConstructionInfo NewInfos(m_mass, m_motion_state, m_collision_shape, m_local_inertia); | |||
m_rigid_body = new btRigidBody(NewInfos); | |||
m_collision_object = m_rigid_body; | |||
if (m_mass == .0f && SetToKinematic) | |||
{ | |||
m_rigid_body->setActivationState(DISABLE_DEACTIVATION); | |||
m_rigid_body->setCollisionFlags(m_rigid_body->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT); | |||
} | |||
} | |||
void EasyPhysics::AddToSimulation(class Simulation* current_simulation) | |||
void EasyPhysic::AddToSimulation(class Simulation* current_simulation) | |||
{ | |||
btDiscreteDynamicsWorld* dynamics_world = current_simulation->GetWorld(); | |||
if (m_rigid_body) | |||
@@ -182,7 +172,7 @@ void EasyPhysics::AddToSimulation(class Simulation* current_simulation) | |||
//Getter functons | |||
//-- | |||
mat4 EasyPhysics::GetTransform() | |||
mat4 EasyPhysic::GetTransform() | |||
{ | |||
m_local_to_world = lol::mat4(1.0f); | |||
if (m_rigid_body && m_motion_state) | |||
@@ -197,14 +187,15 @@ mat4 EasyPhysics::GetTransform() | |||
} | |||
//Set Local Inertia | |||
void EasyPhysics::SetLocalInertia(float mass) | |||
void EasyPhysic::SetLocalInertia(float mass) | |||
{ | |||
if (mass != .0f) | |||
m_collision_shape->calculateLocalInertia(mass, m_local_inertia); | |||
else | |||
m_local_inertia = btVector3(.0f, .0f, .0f); | |||
} | |||
#endif | |||
#endif // HAVE_PHYS_USE_BULLET | |||
} /* namespace phys */ | |||
@@ -10,7 +10,7 @@ | |||
// | |||
// | |||
// The EasyPhysics class | |||
// The EasyPhysic class | |||
// ------------------ | |||
// | |||
@@ -29,12 +29,14 @@ namespace lol | |||
namespace phys | |||
{ | |||
class EasyPhysics | |||
class EasyPhysic | |||
{ | |||
#ifdef HAVE_PHYS_USE_BULLET | |||
public: | |||
EasyPhysics(); | |||
~EasyPhysics(); | |||
EasyPhysic(); | |||
~EasyPhysic(); | |||
void SetShapeToBox(lol::vec3& box_size); | |||
void SetShapeToSphere(float radius); | |||
@@ -42,10 +44,10 @@ public: | |||
void SetShapeToCylinder(lol::vec3& cyl_size); | |||
void SetShapeToCapsule(float radius, float height); | |||
void CustomSetCollisionChannel(int NewGroup, int NewMask); | |||
bool CanChangeCollisionChannel() { return (m_rigid_body == NULL); } | |||
void SetTransform(const lol::vec3& base_location, const lol::quat& base_rotation=lol::quat(lol::mat4(1.0f))); | |||
void SetMass(float mass); | |||
void InitBodyToRigid(); | |||
void InitBodyToRigid(bool ZeroMassIsKinematic=false); | |||
void AddToSimulation(class Simulation* current_simulation); | |||
mat4 GetTransform(); | |||
@@ -60,9 +62,11 @@ protected: | |||
btCollisionShape* m_collision_shape; | |||
btMotionState* m_motion_state; | |||
#else | |||
#else // NO PHYSIC IMPLEMENTATION | |||
public: | |||
EasyPhysics() { } | |||
EasyPhysic() { } | |||
void SetShapeToBox(lol::vec3& BoxSize) { } | |||
void SetShapeToSphere(float radius) { } | |||
@@ -70,22 +74,27 @@ public: | |||
void SetShapeToCylinder(lol::vec3& cyl_size) { } | |||
void SetShapeToCapsule(float radius, float height) { } | |||
void CustomSetCollisionChannel(int NewGroup, int NewMask) { } | |||
bool CanChangeCollisionChannel() { return true; } | |||
void SetTransform(const lol::vec3& base_location, const lol::quat& base_rotation=lol::quat(lol::mat4(1.0f))) { } | |||
void SetMass(float mass) { } | |||
void InitBodyToRigid() { } | |||
void AddToSimulation(class Simulation* current_simulation) { } | |||
mat4 GetTransform() { return mat4(1.0f); } | |||
#endif | |||
#endif // PHYSIC IMPLEMENTATION | |||
public: | |||
//Sets the collision Group & Mask. | |||
//Mask can change at runtime, not group ! | |||
void SetCollisionChannel(int NewGroup, int NewMask) | |||
bool SetCollisionChannel(int NewGroup, int NewMask) | |||
{ | |||
m_collision_group = (1<<NewGroup); | |||
m_collision_mask = NewMask; | |||
CustomSetCollisionChannel(NewGroup, NewMask); | |||
if (CanChangeCollisionChannel()) | |||
{ | |||
m_collision_group = (1<<NewGroup); | |||
m_collision_mask = NewMask; | |||
return true; | |||
} | |||
return false; | |||
} | |||
int GetCollisionGroup() { return m_collision_group; } | |||
int GetCollisionMask() { return m_collision_mask; } | |||
@@ -97,6 +106,27 @@ protected: | |||
int m_collision_mask; | |||
}; | |||
class EasyConstraint | |||
{ | |||
EasyConstraint() | |||
{ | |||
//btPoint2PointConstraint(bA, bB, PivotA, PivotB) | |||
//btHingeConstraint(bA, bB, TransfA, TransfB, UseRefA) | |||
//btSliderConstraint(bA, bB, TransfA, TransfB, UseRefA) | |||
//btConeTwistConstraint(bA, bB, TransfA, TransfB) | |||
//btGeneric6DofConstraint(bA, bB, TransfA, TransfB, UseRefA) | |||
} | |||
#ifdef HAVE_PHYS_USE_BULLET | |||
btTypedConstraint* m_typed_constraint; | |||
#else // NO PHYSIC IMPLEMENTATION | |||
#endif // PHYSIC IMPLEMENTATION | |||
}; | |||
} /* namespace phys */ | |||
} /* namespace lol */ | |||
@@ -20,6 +20,8 @@ | |||
namespace lol | |||
{ | |||
#ifdef HAVE_PHYS_USE_BULLET | |||
#define LOL2BT_UNIT 1.0f | |||
#define BT2LOL_UNIT 1.0f | |||
@@ -32,6 +34,8 @@ namespace lol | |||
#define LOL2BT_QUAT(ELEMENT) btQuaternion((ELEMENT).x, (ELEMENT).y, (ELEMENT).z, (ELEMENT).w) | |||
#define BT2LOL_QUAT(ELEMENT) lol::quat((ELEMENT).getW(), BT2LOL_VEC3((ELEMENT).getAxis()) | |||
#endif // HAVE_PHYS_USE_BULLET | |||
} /* namespace lol */ | |||
#endif /* __LOLBTPHYSICSINTEGRATION_H__ */ | |||
@@ -23,8 +23,6 @@ namespace phys | |||
class Simulation : public Entity | |||
{ | |||
friend class EasyPhysics; | |||
public: | |||
Simulation() : | |||
m_broadphase(0), | |||
@@ -109,7 +107,9 @@ private: | |||
btSequentialImpulseConstraintSolver* m_solver; | |||
// The world. | |||
btDiscreteDynamicsWorld* m_dynamics_world; | |||
#else | |||
#else // NO PHYSIC IMPLEMENTATION | |||
public: | |||
void Init() { } | |||
void TickGame(float seconds) { } | |||
@@ -118,7 +118,8 @@ private: | |||
void CustomSetContinuousDetection(bool ShouldUseCCD) { } | |||
void CustomSetGravity(vec3 &NewGravity) { } | |||
void CustomSetTimestep(float NewTimestep) { } | |||
#endif //HAVE_PHYS_USE_BULLET | |||
#endif // PHYSIC IMPLEMENTATION | |||
public: | |||
//Main logic : | |||
@@ -150,13 +151,18 @@ public: | |||
} | |||
private: | |||
//Adds the given EasyPhysics to the correct list. | |||
void AddToDynamic(EasyPhysics* dynamic_EP) { m_dynamic_list << dynamic_EP; } | |||
void AddToStatic(EasyPhysics* static_EP) { m_static_list << static_EP; } | |||
friend class EasyPhysic; | |||
friend class EasyConstraint; | |||
//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 AddToConstraint(EasyConstraint* NewEC) { m_constraint_list << NewEC; } | |||
//Easy Physics body List | |||
Array<EasyPhysics*> m_dynamic_list; | |||
Array<EasyPhysics*> m_static_list; | |||
Array<EasyPhysic*> m_dynamic_list; | |||
Array<EasyPhysic*> m_static_list; | |||
Array<EasyConstraint*> m_constraint_list; | |||
//Easy Physics data storage | |||
float m_timestep; | |||