[1747] | 1 | // |
---|
| 2 | // Lol Engine |
---|
| 3 | // |
---|
| 4 | // Copyright: (c) 2010-2012 Sam Hocevar <sam@hocevar.net> |
---|
| 5 | // (c) 2009-2012 Benjamin Huet <huet.benjamin@gmail.com> |
---|
| 6 | // This program is free software; you can redistribute it and/or |
---|
| 7 | // modify it under the terms of the Do What The Fuck You Want To |
---|
| 8 | // Public License, Version 2, as published by Sam Hocevar. See |
---|
| 9 | // http://sam.zoy.org/projects/COPYING.WTFPL for more details. |
---|
| 10 | // |
---|
| 11 | |
---|
| 12 | // |
---|
| 13 | // The EasyPhysic class |
---|
| 14 | // ------------------ |
---|
| 15 | // |
---|
| 16 | |
---|
| 17 | #if !defined __EASYPHYSICS_EASYPHYSICS_H__ |
---|
| 18 | #define __EASYPHYSICS_EASYPHYSICS_H__ |
---|
| 19 | |
---|
| 20 | #ifdef HAVE_PHYS_USE_BULLET
|
---|
| 21 | #include "core.h"
|
---|
[1749] | 22 | #include <bullet/btBulletDynamicsCommon.h>
|
---|
| 23 | #include <bullet/btBulletCollisionCommon.h>
|
---|
| 24 | #include <bullet/BulletCollision/CollisionDispatch/btGhostObject.h>
|
---|
[1747] | 25 | #endif
|
---|
| 26 |
|
---|
| 27 | namespace lol |
---|
| 28 | { |
---|
| 29 | |
---|
| 30 | namespace phys |
---|
| 31 | { |
---|
| 32 | |
---|
| 33 | class EasyPhysic |
---|
| 34 | { |
---|
| 35 | |
---|
| 36 | friend class EasyConstraint;
|
---|
[1768] | 37 | friend class Simulation;
|
---|
[1747] | 38 |
|
---|
| 39 | #ifdef HAVE_PHYS_USE_BULLET
|
---|
| 40 |
|
---|
| 41 | public:
|
---|
[1764] | 42 | EasyPhysic(WorldEntity* NewOwnerEntity); |
---|
[1747] | 43 | ~EasyPhysic(); |
---|
| 44 | |
---|
| 45 | virtual void SetShapeToBox(lol::vec3& box_size); |
---|
| 46 | virtual void SetShapeToSphere(float radius); |
---|
| 47 | virtual void SetShapeToCone(float radius, float height); |
---|
| 48 | virtual void SetShapeToCylinder(lol::vec3& cyl_size); |
---|
| 49 | virtual void SetShapeToCapsule(float radius, float height); |
---|
| 50 | |
---|
| 51 | virtual bool CanChangeCollisionChannel() { return (m_rigid_body == NULL); } |
---|
[1768] | 52 | virtual mat4 GetTransform(); |
---|
[1747] | 53 | virtual void SetTransform(const lol::vec3& base_location, const lol::quat& base_rotation=lol::quat(lol::mat4(1.0f))); |
---|
[1768] | 54 | protected: |
---|
[1764] | 55 | virtual void BaseTransformChanged(const lol::mat4& PreviousMatrix, const lol::mat4& NewMatrix); |
---|
| 56 | public: |
---|
[1747] | 57 | virtual void SetMass(float mass); |
---|
| 58 | virtual void InitBodyToRigid(bool ZeroMassIsKinematic=false); |
---|
| 59 | virtual void InitBodyToGhost(); |
---|
| 60 | virtual void AddToSimulation(class Simulation* current_simulation);
|
---|
| 61 | virtual void RemoveFromSimulation(class Simulation* current_simulation);
|
---|
| 62 | |
---|
| 63 | protected:
|
---|
| 64 | virtual void SetLocalInertia(float mass); |
---|
| 65 | virtual void SetShapeTo(btCollisionShape* collision_shape); |
---|
| 66 | |
---|
[1768] | 67 | virtual btGhostObject* GetGhostObjectInstance(); |
---|
[1747] | 68 |
|
---|
| 69 | btCollisionObject* m_collision_object;
|
---|
| 70 |
|
---|
| 71 | btGhostObject* m_ghost_object;
|
---|
| 72 |
|
---|
| 73 | btRigidBody* m_rigid_body;
|
---|
| 74 | btVector3 m_local_inertia;
|
---|
| 75 |
|
---|
| 76 | btCollisionShape* m_collision_shape;
|
---|
| 77 | btConvexShape* m_convex_shape;
|
---|
| 78 | btMotionState* m_motion_state;
|
---|
| 79 |
|
---|
| 80 | #else // NO PHYSIC IMPLEMENTATION
|
---|
| 81 |
|
---|
| 82 | public: |
---|
[1764] | 83 | EasyPhysic(WorldEntity* NewOwnerEntity) { m_owner_entity = NewOwnerEntity; } |
---|
[1747] | 84 | |
---|
| 85 | virtual void SetShapeToBox(lol::vec3& BoxSize) { } |
---|
| 86 | virtual void SetShapeToSphere(float radius) { } |
---|
| 87 | virtual void SetShapeToCone(float radius, float height) { } |
---|
| 88 | virtual void SetShapeToCylinder(lol::vec3& cyl_size) { } |
---|
| 89 | virtual void SetShapeToCapsule(float radius, float height) { } |
---|
| 90 | |
---|
| 91 | virtual bool CanChangeCollisionChannel() { return true; } |
---|
[1768] | 92 | virtual mat4 GetTransform() { return mat4(1.0f); } |
---|
[1747] | 93 | virtual void SetTransform(const lol::vec3& base_location, const lol::quat& base_rotation=lol::quat(lol::mat4(1.0f))) { } |
---|
[1764] | 94 | private: |
---|
| 95 | virtual void BaseTransformChanged(const lol::mat4& PreviousMatrix, const lol::mat4& NewMatrix) { } |
---|
| 96 | public: |
---|
[1747] | 97 | virtual void SetMass(float mass) { } |
---|
| 98 | virtual void InitBodyToRigid() { } |
---|
| 99 | virtual void InitBodyToGhost() { } |
---|
| 100 | virtual void AddToSimulation(class Simulation* current_simulation) { }
|
---|
| 101 | virtual void RemoveFromSimulation(class Simulation* current_simulation) { }
|
---|
| 102 | |
---|
| 103 | virtual void InitBodyToGhost() { } |
---|
| 104 | |
---|
| 105 | #endif // PHYSIC IMPLEMENTATION |
---|
[1764] | 106 | |
---|
[1747] | 107 | public: |
---|
| 108 | //Sets the collision Group & Mask. |
---|
| 109 | //Mask can change at runtime, not group ! |
---|
| 110 | virtual bool SetCollisionChannel(int NewGroup, int NewMask) |
---|
| 111 | { |
---|
| 112 | if (CanChangeCollisionChannel()) |
---|
| 113 | { |
---|
| 114 | m_collision_group = (1<<NewGroup); |
---|
| 115 | m_collision_mask = NewMask; |
---|
| 116 | return true; |
---|
| 117 | } |
---|
| 118 | return false; |
---|
| 119 | } |
---|
| 120 | int GetCollisionGroup() { return m_collision_group; } |
---|
| 121 | int GetCollisionMask() { return m_collision_mask; } |
---|
[1764] | 122 | |
---|
| 123 | //Base/Attachment logic
|
---|
| 124 | virtual void AttachTo(EasyPhysic* NewBase, bool NewBaseLockLocation = true, bool NewBaseLockRotation = true) |
---|
| 125 | { |
---|
[1768] | 126 | if (NewBase == this || (NewBase && NewBase->m_base_physic == this)) |
---|
[1764] | 127 | return; |
---|
| 128 | |
---|
| 129 | if (NewBase) |
---|
| 130 | { |
---|
| 131 | bool bAlreadyExists = false; |
---|
| 132 | for (int i = 0; i < NewBase->m_based_physic_list.Count(); ++i) |
---|
| 133 | if (NewBase->m_based_physic_list[i] == this) |
---|
| 134 | bAlreadyExists = true; |
---|
| 135 | if (!bAlreadyExists) |
---|
| 136 | NewBase->m_based_physic_list << this; |
---|
| 137 | m_base_physic = NewBase; |
---|
| 138 | m_base_lock_location = NewBaseLockLocation; |
---|
| 139 | m_base_lock_rotation = NewBaseLockRotation; |
---|
| 140 | } |
---|
[1768] | 141 | else if (m_base_physic) |
---|
[1764] | 142 | { |
---|
[1768] | 143 | for (int i = 0; i < m_base_physic->m_based_physic_list.Count(); ++i) |
---|
| 144 | if (m_base_physic->m_based_physic_list[i] == this) |
---|
| 145 | m_base_physic->m_based_physic_list.Remove(i--); |
---|
[1764] | 146 | m_base_physic = NULL; |
---|
| 147 | } |
---|
| 148 | } |
---|
[1747] | 149 |
|
---|
| 150 | protected:
|
---|
| 151 | lol::mat4 m_local_to_world;
|
---|
| 152 | float m_mass;
|
---|
| 153 | int m_collision_group;
|
---|
| 154 | int m_collision_mask;
|
---|
[1764] | 155 | WorldEntity* m_owner_entity;
|
---|
| 156 |
|
---|
| 157 | //Base/Attachment logic
|
---|
| 158 | Array<EasyPhysic*> m_based_physic_list; //List of objects based on this : this object moves, its based object move with it.
|
---|
| 159 | EasyPhysic* m_base_physic; //Base for this object : The base moves, the object moves with it.
|
---|
| 160 | bool m_base_lock_location; //when this is TRUE, location moves with rotation change.
|
---|
| 161 | bool m_base_lock_rotation; //when this is TRUE, rotation moves with rotation change.
|
---|
| 162 |
|
---|
| 163 | //Touch logic
|
---|
| 164 | Array<EasyPhysic*> m_touching_physic; //Maintained by ghost objects
|
---|
[1747] | 165 | }; |
---|
| 166 | |
---|
| 167 | } /* namespace phys */ |
---|
| 168 | |
---|
| 169 | } /* namespace lol */ |
---|
| 170 | |
---|
| 171 | #endif /* __EASYPHYSICS_EASYPHYSICS_H__ */ |
---|
| 172 | |
---|