4dd12b8b291598c958592eab93876d4795b314e1
[blender.git] / source / gameengine / Physics / Sumo / SumoPhysicsController.h
1 /**
2  * $Id$
3  *
4  * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version. The Blender
10  * Foundation also sells licenses for use in proprietary software under
11  * the Blender License.  See http://www.blender.org/BL/ for information
12  * about this.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software Foundation,
21  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22  *
23  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
24  * All rights reserved.
25  *
26  * The Original Code is: all of this file.
27  *
28  * Contributor(s): none yet.
29  *
30  * ***** END GPL/BL DUAL LICENSE BLOCK *****
31  */
32 #ifndef __SUMO_PHYSICSCONTROLLER_H
33 #define __SUMO_PHYSICSCONTROLLER_H
34
35 #include "PHY_IPhysicsController.h"
36 #include "SM_Scene.h"
37 #include "SM_Callback.h"
38
39 /**
40         Sumo Physics Controller, a special kind of a PhysicsController.
41         A Physics Controller is a special kind of Scene Graph Transformation Controller.
42         Each time the scene graph get's updated, the controller get's a chance
43         in the 'Update' method to reflect changes.
44 */
45
46 class SumoPhysicsController : public PHY_IPhysicsController , public SM_Callback
47
48                                                          
49 {
50
51
52 public:
53         SumoPhysicsController(
54                                 class SM_Scene* sumoScene,
55                                 DT_SceneHandle solidscene,
56                                 class SM_Object* sumoObj,
57                                 class PHY_IMotionState* motionstate,
58                                 bool dyna); 
59
60         virtual ~SumoPhysicsController();
61         
62                 // kinematic methods
63         virtual void            RelativeTranslate(float dlocX,float dlocY,float dlocZ,bool local);
64         virtual void            RelativeRotate(const float drot[9],bool local);
65         virtual void            getOrientation(float &quatImag0,float &quatImag1,float &quatImag2,float &quatReal);
66         virtual void            setOrientation(float quatImag0,float quatImag1,float quatImag2,float quatReal);
67         virtual void            setPosition(float posX,float posY,float posZ);
68         virtual void            setScaling(float scaleX,float scaleY,float scaleZ);
69         
70         // physics methods
71         virtual void            ApplyTorque(float torqueX,float torqueY,float torqueZ,bool local);
72         virtual void            ApplyForce(float forceX,float forceY,float forceZ,bool local);
73         virtual void            SetAngularVelocity(float ang_velX,float ang_velY,float ang_velZ,bool local);
74         virtual void            SetLinearVelocity(float lin_velX,float lin_velY,float lin_velZ,bool local);
75         virtual void            applyImpulse(float attachX,float attachY,float attachZ, float impulseX,float impulseY,float impulseZ);
76         virtual void            SetActive(bool active){};
77         virtual void            SuspendDynamics();
78         virtual void            RestoreDynamics();
79
80
81         /**  
82                 reading out information from physics
83         */
84         virtual void            GetLinearVelocity(float& linvX,float& linvY,float& linvZ);
85         /** 
86                 GetVelocity parameters are in geometric coordinates (Origin is not center of mass!).
87         */
88         virtual void            GetVelocity(const float posX,const float posY,const float posZ,float& linvX,float& linvY,float& linvZ); 
89         virtual float           getMass();
90         virtual void            getReactionForce(float& forceX,float& forceY,float& forceZ);
91         virtual void            setRigidBody(bool rigid);
92                 
93         
94         virtual void            PostProcessReplica(class PHY_IMotionState* motionstate,class PHY_IPhysicsController* parentctrl);
95         
96         // todo: remove next line !
97         virtual void                    SetSimulatedTime(float time);
98         
99
100         virtual void            WriteDynamicsToMotionState() {};
101         virtual void    WriteMotionStateToDynamics(bool nondynaonly);
102
103         /** 
104                 call from Scene Graph Node to 'update'.
105         */
106         virtual bool    SynchronizeMotionStates(float time);
107
108                 // clientinfo for raycasts for example
109         virtual void*                           getClientInfo() { return m_clientInfo;}
110         virtual void                            setClientInfo(void* clientinfo) {m_clientInfo = clientinfo;};
111         void*                                           m_clientInfo;
112
113
114         float   getFriction() { return m_friction;}
115         float   getRestitution() { return m_restitution;}
116
117         // sumo callback
118         virtual void do_me();
119
120         class SM_Object*        GetSumoObject ()
121         {
122                 return m_sumoObj;
123         };
124
125         void GetWorldOrientation(class MT_Matrix3x3& mat);
126         void GetWorldPosition(MT_Point3& pos);
127         void GetWorldScaling(MT_Vector3& scale);
128
129
130 //      void    SetSumoObject(class SM_Object* sumoObj) {
131 //              m_sumoObj = sumoObj;
132 //      }
133 //      void    SetSumoScene(class SM_Scene* sumoScene) {
134 //              m_sumoScene = sumoScene;
135 //      }
136
137         void    setSumoTransform(bool nondynaonly);
138
139
140 private:
141         class SM_Object*        m_sumoObj;
142         class SM_Scene*         m_sumoScene; // needed for replication
143         DT_SceneHandle          m_solidscene;
144         bool                            m_bFirstTime;
145         bool                            m_bDyna;
146
147         float                                           m_friction;
148         float                                           m_restitution;
149
150
151         bool                                            m_suspendDynamics;
152
153         bool                                            m_firstTime;
154         bool                                            m_bFullRigidBody;
155         bool                                            m_bPhantom;                             // special flag for objects that are not affected by physics 'resolver'
156
157         // data to calculate fake velocities for kinematic objects (non-dynas)
158         bool                                            m_bKinematic;
159         bool                                            m_bPrevKinematic;
160         
161         float                                           m_lastTime;
162
163         class   PHY_IMotionState*                       m_MotionState;
164         
165 };
166
167 #endif //__SUMO_PHYSICSCONTROLLER_H
168