Changeset 1631


Ignore:
Timestamp:
Jul 15, 2012, 1:17:00 PM (8 years ago)
Author:
touky
Message:

Added Collision group & mask support.
+ weird racist test : the primitives only collide with their same type.

Location:
trunk/test
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/test/PhysicObject.h

    r1621 r1631  
    2727                m_mesh.Compile("[sc#ddd afcb60 1 60 -.1]");
    2828                vec3 BoxSize = vec3(60.f, 1.f, 60.f);
     29                m_physics.SetCollisionChannel(0, 0xFF);
    2930                m_physics.SetShapeToBox(BoxSize);
    3031                m_physics.SetMass(.0f);
     
    8687                m_mesh.Compile(MeshRand[RandValue]);
    8788                vec3 BoxSize = vec3(2.0f);
     89                int ColGroup = 1;
    8890                if (RandValue < SphereLimit)
     91                {
    8992                        m_physics.SetShapeToBox(BoxSize);
     93                        ColGroup += 0;
     94                }
    9095                else if (RandValue < ConeLimit)
     96                {
    9197                        m_physics.SetShapeToSphere(BoxSize.x * 2.f);
     98                        ColGroup += 1;
     99                }
    92100                else if (RandValue < CylLimit)
     101                {
    93102                        m_physics.SetShapeToCone(BoxSize.x, BoxSize.y);
     103                        ColGroup += 2;
     104                }
    94105                else if (RandValue < CapsLimit)
     106                {
    95107                        m_physics.SetShapeToCylinder(BoxSize);
     108                        ColGroup += 3;
     109                }
    96110                else
     111                {
    97112                        m_physics.SetShapeToCapsule(BoxSize.x, BoxSize.y);
     113                        ColGroup += 4;
     114                }
    98115
     116                m_physics.SetCollisionChannel(ColGroup, (1<<ColGroup)|(1));
    99117                m_physics.SetMass(base_mass);
    100118                m_physics.SetTransform(base_location);
  • trunk/test/Physics/EasyPhysics.cpp

    r1630 r1631  
    3737        m_motion_state(NULL),
    3838        m_mass(.0f),
    39         m_local_inertia(btVector3(.0f, .0f, .0f))
     39        m_local_inertia(btVector3(.0f, .0f, .0f)),
     40        m_collision_group(1),
     41        m_collision_mask(1)
    4042{
    4143}
     
    99101        SetShapeTo(new btCapsuleShape(  radius * LOL2BT_UNIT * LOL2BT_SIZE,
    100102                                                                        height * LOL2BT_UNIT * LOL2BT_SIZE));
     103}
     104
     105//-------------------------------------------------------------------------
     106//Bullet collision channel setup
     107//--
     108void EasyPhysics::CustomSetCollisionChannel(int NewGroup, int NewMask)
     109{
     110        if (m_rigid_body)
     111                m_rigid_body->setCollisionFlags(m_collision_mask);
    101112}
    102113
     
    158169        if (m_rigid_body)
    159170        {
    160                 dynamics_world->addRigidBody(m_rigid_body);
     171                dynamics_world->addRigidBody(m_rigid_body, m_collision_group, m_collision_mask);
    161172                if (m_mass != .0f)
    162173                        current_simulation->AddToDynamic(this);
     
    165176        }
    166177        else
    167                 dynamics_world->addCollisionObject(m_collision_object);
     178                dynamics_world->addCollisionObject(m_collision_object, m_collision_group, m_collision_mask);
    168179}
    169180
  • trunk/test/Physics/EasyPhysics.h

    r1607 r1631  
    4343        void SetShapeToCapsule(float radius, float height);
    4444
     45        void CustomSetCollisionChannel(int NewGroup, int NewMask);
    4546        void SetTransform(const lol::vec3& base_location, const lol::quat& base_rotation=lol::quat(lol::mat4(1.0f)));
    4647        void SetMass(float mass);
     
    5657
    5758        btRigidBody*                                                            m_rigid_body;
    58         btScalar                                                                        m_mass;
    5959        btVector3                                                                       m_local_inertia;
    6060
    6161        btCollisionShape*                                                       m_collision_shape;
    6262        btMotionState*                                                          m_motion_state;
    63 
    64         lol::mat4                                                                       m_local_to_world;
    6563#else
    6664public:
     
    7371        void SetShapeToCapsule(float radius, float height) { }
    7472
     73        void CustomSetCollisionChannel(int NewGroup, int NewMask) { }
    7574        void SetTransform(const lol::vec3& base_location, const lol::quat& base_rotation=lol::quat(lol::mat4(1.0f))) { }
    7675        void SetMass(float mass) { }
     
    7978        mat4 GetTransform() { return mat4(1.0f); }
    8079#endif
     80
     81public:
     82        //Sets the collision Group & Mask.
     83        //Mask can change at runtime, not group !
     84        void SetCollisionChannel(int NewGroup, int NewMask)
     85        {
     86                m_collision_group = (1<<NewGroup);
     87                m_collision_mask = NewMask;
     88                CustomSetCollisionChannel(NewGroup, NewMask);
     89        }
     90        int GetCollisionGroup() { return m_collision_group; }
     91        int GetCollisionMask()  { return m_collision_mask; }
     92
     93protected:
     94        lol::mat4                                                                       m_local_to_world;
     95        float                                                                           m_mass;
     96        int                                                                                     m_collision_group;
     97        int                                                                                     m_collision_mask;
    8198};
    8299
  • trunk/test/Physics/LolPhysics.h

    r1630 r1631  
    9696        {
    9797                if (m_dynamics_world)
    98                         m_dynamics_world->setGravity(LOL2BT_VEC3(NewGravity));
     98                        m_dynamics_world->setGravity(LOL2BT_VEC3(NewGravity * LOL2BT_UNIT));
    9999        }
    100100
Note: See TracChangeset for help on using the changeset viewer.