Ignore:
Timestamp:
Aug 16, 2012, 7:14:07 PM (10 years ago)
Author:
touky
Message:

Added Base/Attachment Logic, works with Kinematic & Ghost.

Location:
trunk/test/Physics/Include
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/test/Physics/Include/EasyCharacterController.h

    r1749 r1764  
    3636
    3737public:
    38         EasyCharacterController() :
    39                 EasyPhysic(),
     38        EasyCharacterController(WorldEntity* NewOwnerEntity) :
     39                EasyPhysic(NewOwnerEntity),
    4040                m_character(NULL)
    4141        {
  • trunk/test/Physics/Include/EasyPhysics.h

    r1749 r1764  
    3939
    4040public:
    41         EasyPhysic();
     41        EasyPhysic(WorldEntity* NewOwnerEntity);
    4242        ~EasyPhysic();
    4343
     
    5050        virtual bool CanChangeCollisionChannel() { return (m_rigid_body == NULL); }
    5151        virtual void SetTransform(const lol::vec3& base_location, const lol::quat& base_rotation=lol::quat(lol::mat4(1.0f)));
     52private:
     53        virtual void BaseTransformChanged(const lol::mat4& PreviousMatrix, const lol::mat4& NewMatrix);
     54public:
    5255        virtual void SetMass(float mass);
    5356        virtual void InitBodyToRigid(bool ZeroMassIsKinematic=false);
     
    7780
    7881public:
    79         EasyPhysic() { }
     82        EasyPhysic(WorldEntity* NewOwnerEntity) { m_owner_entity = NewOwnerEntity; }
    8083
    8184        virtual void SetShapeToBox(lol::vec3& BoxSize) { }
     
    8790        virtual bool CanChangeCollisionChannel() { return true; }
    8891        virtual void SetTransform(const lol::vec3& base_location, const lol::quat& base_rotation=lol::quat(lol::mat4(1.0f))) { }
     92private:
     93        virtual void BaseTransformChanged(const lol::mat4& PreviousMatrix, const lol::mat4& NewMatrix) { }
     94public:
    8995        virtual void SetMass(float mass) { }
    9096        virtual void InitBodyToRigid() { }
     
    114120        int GetCollisionMask()  { return m_collision_mask; }
    115121
     122        //Base/Attachment logic
     123        virtual void AttachTo(EasyPhysic* NewBase, bool NewBaseLockLocation = true, bool NewBaseLockRotation = true)
     124        {
     125                if (NewBase == this || NewBase->m_base_physic == this)
     126                        return;
     127
     128                if (NewBase)
     129                {
     130                        bool bAlreadyExists = false;
     131                        for (int i = 0; i < NewBase->m_based_physic_list.Count(); ++i)
     132                                if (NewBase->m_based_physic_list[i] == this)
     133                                        bAlreadyExists = true;
     134                        if (!bAlreadyExists)
     135                                NewBase->m_based_physic_list << this;
     136                        m_base_physic = NewBase;
     137                        m_base_lock_location = NewBaseLockLocation;
     138                        m_base_lock_rotation = NewBaseLockRotation;
     139                }
     140                else
     141                {
     142                        for (int i = 0; i < NewBase->m_based_physic_list.Count(); ++i)
     143                                if (NewBase->m_based_physic_list[i] == this)
     144                                        NewBase->m_based_physic_list.Remove(i--);
     145                        m_base_physic = NULL;
     146                }
     147        }
     148
    116149protected:
    117150        lol::mat4                                                                       m_local_to_world;
     
    119152        int                                                                                     m_collision_group;
    120153        int                                                                                     m_collision_mask;
     154        WorldEntity*                                                            m_owner_entity;
     155
     156        //Base/Attachment logic
     157        Array<EasyPhysic*>                                                      m_based_physic_list;    //List of objects based on this : this object moves, its based object move with it.
     158        EasyPhysic*                                                                     m_base_physic;                  //Base for this object : The base moves, the object moves with it.
     159        bool                                                                            m_base_lock_location;   //when this is TRUE, location moves with rotation change.
     160        bool                                                                            m_base_lock_rotation;   //when this is TRUE, rotation moves with rotation change.
     161
     162        //Touch logic
     163        Array<EasyPhysic*>                                                      m_touching_physic;              //Maintained by ghost objects
    121164};
    122165
Note: See TracChangeset for help on using the changeset viewer.