diff --git a/test/PhysicObject.h b/test/PhysicObject.h index 45cd32ff..c4e47c1c 100644 --- a/test/PhysicObject.h +++ b/test/PhysicObject.h @@ -26,6 +26,7 @@ public: { m_mesh.Compile("[sc#ddd afcb60 1 60 -.1]"); vec3 BoxSize = vec3(60.f, 1.f, 60.f); + m_physics.SetCollisionChannel(0, 0xFF); m_physics.SetShapeToBox(BoxSize); m_physics.SetMass(.0f); m_physics.SetTransform(base_location, base_rotation); @@ -85,17 +86,34 @@ public: m_mesh.Compile(MeshRand[RandValue]); vec3 BoxSize = vec3(2.0f); + int ColGroup = 1; if (RandValue < SphereLimit) + { m_physics.SetShapeToBox(BoxSize); + ColGroup += 0; + } else if (RandValue < ConeLimit) + { m_physics.SetShapeToSphere(BoxSize.x * 2.f); + ColGroup += 1; + } else if (RandValue < CylLimit) + { m_physics.SetShapeToCone(BoxSize.x, BoxSize.y); + ColGroup += 2; + } else if (RandValue < CapsLimit) + { m_physics.SetShapeToCylinder(BoxSize); + ColGroup += 3; + } else + { m_physics.SetShapeToCapsule(BoxSize.x, BoxSize.y); + ColGroup += 4; + } + m_physics.SetCollisionChannel(ColGroup, (1<setCollisionFlags(m_collision_mask); +} + //------------------------------------------------------------------------- //Base Location/Rotation setup //-- @@ -157,14 +168,14 @@ void EasyPhysics::AddToSimulation(class Simulation* current_simulation) btDiscreteDynamicsWorld* dynamics_world = current_simulation->GetWorld(); if (m_rigid_body) { - dynamics_world->addRigidBody(m_rigid_body); + dynamics_world->addRigidBody(m_rigid_body, m_collision_group, m_collision_mask); if (m_mass != .0f) current_simulation->AddToDynamic(this); else current_simulation->AddToStatic(this); } else - dynamics_world->addCollisionObject(m_collision_object); + dynamics_world->addCollisionObject(m_collision_object, m_collision_group, m_collision_mask); } //------------------------------------------------------------------------- diff --git a/test/Physics/EasyPhysics.h b/test/Physics/EasyPhysics.h index f0a62bfb..5b7bd68b 100644 --- a/test/Physics/EasyPhysics.h +++ b/test/Physics/EasyPhysics.h @@ -42,6 +42,7 @@ public: void SetShapeToCylinder(lol::vec3& cyl_size); void SetShapeToCapsule(float radius, float height); + void CustomSetCollisionChannel(int NewGroup, int NewMask); void SetTransform(const lol::vec3& base_location, const lol::quat& base_rotation=lol::quat(lol::mat4(1.0f))); void SetMass(float mass); void InitBodyToRigid(); @@ -55,13 +56,10 @@ protected: btCollisionObject* m_collision_object; btRigidBody* m_rigid_body; - btScalar m_mass; btVector3 m_local_inertia; btCollisionShape* m_collision_shape; btMotionState* m_motion_state; - - lol::mat4 m_local_to_world; #else public: EasyPhysics() { } @@ -72,12 +70,31 @@ public: void SetShapeToCylinder(lol::vec3& cyl_size) { } void SetShapeToCapsule(float radius, float height) { } + void CustomSetCollisionChannel(int NewGroup, int NewMask) { } 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 + +public: + //Sets the collision Group & Mask. + //Mask can change at runtime, not group ! + void SetCollisionChannel(int NewGroup, int NewMask) + { + m_collision_group = (1<setGravity(LOL2BT_VEC3(NewGravity)); + m_dynamics_world->setGravity(LOL2BT_VEC3(NewGravity * LOL2BT_UNIT)); } void CustomSetTimestep(float NewTimestep) { }