update Bullet 2.x with latest changes, notice that the integration is not finished...
[blender.git] / extern / bullet2 / src / BulletCollision / CollisionDispatch / btCollisionObject.h
1 /*
2 Bullet Continuous Collision Detection and Physics Library
3 Copyright (c) 2003-2006 Erwin Coumans  http://continuousphysics.com/Bullet/
4
5 This software is provided 'as-is', without any express or implied warranty.
6 In no event will the authors be held liable for any damages arising from the use of this software.
7 Permission is granted to anyone to use this software for any purpose, 
8 including commercial applications, and to alter it and redistribute it freely, 
9 subject to the following restrictions:
10
11 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
12 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
13 3. This notice may not be removed or altered from any source distribution.
14 */
15
16 #ifndef COLLISION_OBJECT_H
17 #define COLLISION_OBJECT_H
18
19 #include "LinearMath/btTransform.h"
20
21 //island management, m_activationState1
22 #define ACTIVE_TAG 1
23 #define ISLAND_SLEEPING 2
24 #define WANTS_DEACTIVATION 3
25 #define DISABLE_DEACTIVATION 4
26 #define DISABLE_SIMULATION 5
27
28 struct  btBroadphaseProxy;
29 class   btCollisionShape;
30 #include "LinearMath/btMotionState.h"
31
32
33
34 /// btCollisionObject can be used to manage collision detection objects. 
35 /// btCollisionObject maintains all information that is needed for a collision detection: Shape, Transform and AABB proxy.
36 /// They can be added to the btCollisionWorld.
37 struct  btCollisionObject
38 {
39         btTransform     m_worldTransform;
40         btBroadphaseProxy*      m_broadphaseHandle;
41         btCollisionShape*               m_collisionShape;
42
43         ///m_interpolationWorldTransform is used for CCD and interpolation
44         ///it can be either previous or future (predicted) transform
45         btTransform     m_interpolationWorldTransform;
46         //those two are experimental: just added for bullet time effect, so you can still apply impulses (directly modifying velocities) 
47         //without destroying the continuous interpolated motion (which uses this interpolation velocities)
48         btVector3       m_interpolationLinearVelocity;
49         btVector3       m_interpolationAngularVelocity;
50
51
52         enum CollisionFlags
53         {
54                 CF_STATIC_OBJECT= 1,
55                 CF_KINEMATIC_OJBECT= 2,
56                 CF_NO_CONTACT_RESPONSE = 4,
57                 CF_CUSTOM_MATERIAL_CALLBACK = 8,//this allows per-triangle material (friction/restitution)
58         };
59
60         int                             m_collisionFlags;
61
62         int                             m_islandTag1;
63         int                             m_activationState1;
64         float                   m_deactivationTime;
65
66         btScalar                m_friction;
67         btScalar                m_restitution;
68
69         ///users can point to their objects, m_userPointer is not used by Bullet
70         void*                   m_userObjectPointer;
71
72         ///m_internalOwner is reserved to point to Bullet's btRigidBody. Don't use this, use m_userObjectPointer instead.
73         void*                   m_internalOwner;
74
75         ///time of impact calculation
76         float                   m_hitFraction; 
77         
78         ///Swept sphere radius (0.0 by default), see btConvexConvexAlgorithm::
79         float                   m_ccdSweptSphereRadius;
80
81         /// Don't do continuous collision detection if square motion (in one step) is less then m_ccdSquareMotionThreshold
82         float                   m_ccdSquareMotionThreshold;
83
84         inline bool mergesSimulationIslands() const
85         {
86                 ///static objects, kinematic and object without contact response don't merge islands
87                 return  ((m_collisionFlags & (CF_STATIC_OBJECT | CF_KINEMATIC_OJBECT | CF_NO_CONTACT_RESPONSE) )==0);
88         }
89
90
91         inline bool             isStaticObject() const {
92                 return (m_collisionFlags & CF_STATIC_OBJECT) != 0;
93         }
94
95         inline bool             isKinematicObject() const
96         {
97                 return (m_collisionFlags & CF_KINEMATIC_OJBECT) != 0;
98         }
99
100         inline bool             isStaticOrKinematicObject() const
101         {
102                 return (m_collisionFlags & (CF_KINEMATIC_OJBECT | CF_STATIC_OBJECT)) != 0 ;
103         }
104
105         inline bool             hasContactResponse() const {
106                 return (m_collisionFlags & CF_NO_CONTACT_RESPONSE)==0;
107         }
108
109         
110
111
112         btCollisionObject();
113
114
115         void    SetCollisionShape(btCollisionShape* collisionShape)
116         {
117                 m_collisionShape = collisionShape;
118         }
119
120         int     GetActivationState() const { return m_activationState1;}
121         
122         void SetActivationState(int newState);
123
124         void ForceActivationState(int newState);
125
126         void    activate();
127
128         inline bool IsActive() const
129         {
130                 return ((GetActivationState() != ISLAND_SLEEPING) && (GetActivationState() != DISABLE_SIMULATION));
131         }
132
133                 void    setRestitution(float rest)
134         {
135                 m_restitution = rest;
136         }
137         float   getRestitution() const
138         {
139                 return m_restitution;
140         }
141         void    setFriction(float frict)
142         {
143                 m_friction = frict;
144         }
145         float   getFriction() const
146         {
147                 return m_friction;
148         }
149
150
151 };
152
153 #endif //COLLISION_OBJECT_H