BGE bug #17688 fixed: Near Sensor Reset not working (for Gamekit)
[blender.git] / source / gameengine / Physics / BlOde / OdePhysicsController.h
1 /**
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * The contents of this file may be used under the terms of either the GNU
7  * General Public License Version 2 or later (the "GPL", see
8  * http://www.gnu.org/licenses/gpl.html ), or the Blender License 1.0 or
9  * later (the "BL", see http://www.blender.org/BL/ ) which has to be
10  * bought from the Blender Foundation to become active, in which case the
11  * above mentioned GPL option does not apply.
12  *
13  * The Original Code is Copyright (C) 2002 by NaN Holding BV.
14  * All rights reserved.
15  *
16  * The Original Code is: all of this file.
17  *
18  * Contributor(s): none yet.
19  *
20  * ***** END GPL LICENSE BLOCK *****
21  */
22 #ifndef __ODE_PHYSICSCONTROLLER_H
23 #define __ODE_PHYSICSCONTROLLER_H
24
25
26 #include "PHY_IPhysicsController.h"
27
28 /**
29         ODE Physics Controller, a special kind of a PhysicsController.
30         A Physics Controller is a special kind of Scene Graph Transformation Controller.
31         Each time the scene graph get's updated, the controller get's a chance
32         in the 'Update' method to reflect changes.
33 */
34
35 class ODEPhysicsController : public PHY_IPhysicsController
36                                                          
37 {
38
39         bool    m_OdeDyna;
40
41 public:
42         ODEPhysicsController(
43                 bool dyna,
44                 bool fullRigidBody,
45                 bool phantom,
46                 class PHY_IMotionState* motionstate,
47                 struct dxSpace* space,
48                 struct dxWorld* world,
49                 float   mass,
50                 float   friction,
51                 float   restitution,
52                 bool    implicitsphere,
53                 float   center[3],
54                 float   extends[3],
55                 float radius);
56
57         virtual ~ODEPhysicsController();
58         
59                 // kinematic methods
60         virtual void            RelativeTranslate(float dlocX,float dlocY,float dlocZ,bool local);
61         virtual void            RelativeRotate(const float drot[9],bool local);
62         virtual void            getOrientation(float &quatImag0,float &quatImag1,float &quatImag2,float &quatReal);
63         virtual void            setOrientation(float quatImag0,float quatImag1,float quatImag2,float quatReal);
64         virtual void            setPosition(float posX,float posY,float posZ);
65         virtual void            getPosition(PHY__Vector3&       pos) const;
66         
67         virtual void            setScaling(float scaleX,float scaleY,float scaleZ);
68         
69         // physics methods
70         virtual void            ApplyTorque(float torqueX,float torqueY,float torqueZ,bool local);
71         virtual void            ApplyForce(float forceX,float forceY,float forceZ,bool local);
72         virtual void            SetAngularVelocity(float ang_velX,float ang_velY,float ang_velZ,bool local);
73         virtual void            SetLinearVelocity(float lin_velX,float lin_velY,float lin_velZ,bool local);
74         virtual void            applyImpulse(float attachX,float attachY,float attachZ, float impulseX,float impulseY,float impulseZ);
75         virtual void            SetActive(bool active){};
76         virtual void            SuspendDynamics();
77         virtual void            RestoreDynamics();
78         virtual void            resolveCombinedVelocities(float linvelX,float linvelY,float linvelZ,float angVelX,float angVelY,float angVelZ)
79         {
80                 //todo ?
81         }
82
83
84         /**  
85                 reading out information from physics
86         */
87         virtual void            GetLinearVelocity(float& linvX,float& linvY,float& linvZ);
88         /** 
89                 GetVelocity parameters are in geometric coordinates (Origin is not center of mass!).
90         */
91         virtual void            GetVelocity(const float posX,const float posY,const float posZ,float& linvX,float& linvY,float& linvZ); 
92         virtual float           getMass();
93         virtual void            getReactionForce(float& forceX,float& forceY,float& forceZ);
94         virtual void            setRigidBody(bool rigid);
95                 
96         
97         virtual void            PostProcessReplica(class PHY_IMotionState* motionstate,class PHY_IPhysicsController* parentctrl);
98         
99         // \todo remove next line !
100         virtual void                    SetSimulatedTime(float time);
101         
102
103         virtual void            WriteDynamicsToMotionState() {};
104         virtual void    WriteMotionStateToDynamics(bool nondynaonly);
105
106         /** 
107                 call from Scene Graph Node to 'update'.
108         */
109         virtual bool    SynchronizeMotionStates(float time);
110
111         virtual void    calcXform(){}
112         virtual void SetMargin(float margin) {}
113         virtual float GetMargin() const {return 0.f;}
114         virtual float GetRadius() const {return 0.f;}
115         virtual void  SetRadius(float margin) {}
116
117                 // clientinfo for raycasts for example
118         virtual void*                           getNewClientInfo() { return m_clientInfo;}
119         virtual void                            setNewClientInfo(void* clientinfo) {m_clientInfo = clientinfo;};
120         void*                                           m_clientInfo;
121
122         struct  dxBody*                         GetOdeBodyId() { return m_bodyId; }
123
124         float   getFriction() { return m_friction;}
125         float   getRestitution() { return m_restitution;}
126
127         
128
129 private:
130
131         bool                                            m_firstTime;
132         bool                                            m_bFullRigidBody;
133         bool                                            m_bPhantom;                             // special flag for objects that are not affected by physics 'resolver'
134
135         // data to calculate fake velocities for kinematic objects (non-dynas)
136         bool                                            m_bKinematic;
137         bool                                            m_bPrevKinematic;
138
139         
140         float                                           m_lastTime;
141         bool                                            m_OdeSuspendDynamics;
142         class   PHY_IMotionState*                       m_MotionState;
143
144         //Ode specific members
145         struct  dxBody*                         m_bodyId;
146         struct dxGeom*                          m_geomId;
147         struct dxSpace*                         m_space;
148         struct dxWorld*                         m_world;
149         float                                           m_mass;
150         float                                           m_friction;
151         float                                           m_restitution;
152         bool                                            m_implicitsphere;
153         float                                           m_center[3];
154         float                                           m_extends[3];
155         float                                           m_radius;
156 };
157
158 #endif //__ODE_PHYSICSCONTROLLER_H
159