Reverted incorrect merge (missing files)
[blender.git] / source / gameengine / Physics / Sumo / Fuzzics / include / SM_Object.h
index a0475c39bbb8b8e1d7c54f21de08322aa507035c..2d748a0f251f7f014b10767af3c10d2711fcb3d9 100644 (file)
@@ -1,15 +1,12 @@
 /**
  * $Id$
  *
- * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
+ * ***** BEGIN GPL LICENSE BLOCK *****
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
  * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version. The Blender
- * Foundation also sells licenses for use in proprietary software under
- * the Blender License.  See http://www.blender.org/BL/ for information
- * about this.
+ * of the License, or (at your option) any later version.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -27,7 +24,7 @@
  *
  * Contributor(s): none yet.
  *
- * ***** END GPL/BL DUAL LICENSE BLOCK *****
+ * ***** END GPL LICENSE BLOCK *****
  */
 #ifndef SM_OBJECT_H
 #define SM_OBJECT_H
@@ -66,6 +63,14 @@ struct SM_MaterialProps {
        bool      m_fh_normal;             ///< Should the object slide off slopes?
 };
 
+class SM_ClientObject
+{
+public:
+       SM_ClientObject() {}
+       virtual ~SM_ClientObject() {}
+       
+       virtual bool hasCollisionCallback() = 0;
+};
 
 /**
  * SM_Object is an internal part of the Sumo physics engine.
@@ -73,7 +78,8 @@ struct SM_MaterialProps {
  * It encapsulates an object in the physics scene, and is responsible
  * for calculating the collision response of objects.
  */
-class SM_Object : public SM_MotionState {
+class SM_Object 
+{
 public:
        SM_Object() ;
        SM_Object(
@@ -136,7 +142,6 @@ public:
        void setOrientation(const MT_Quaternion& orn);
        void setScaling(const MT_Vector3& scaling);
        
-
        /**
         * set an external velocity. This velocity complements
         * the physics velocity. So setting it does not override the
@@ -198,7 +203,7 @@ public:
        void applyImpulse(const MT_Point3& attach, const MT_Vector3& impulse) ;
        
        /**
-        * Applies an impulse through the centre of this object. (ie the angular
+        * Applies an impulse through the center of this object. (ie the angular
         * velocity will not change.
         */
        void applyCenterImpulse(const MT_Vector3& impulse);
@@ -254,17 +259,42 @@ public:
        );
        
        
-       void *getClientObject() { return m_client_object; }
-       void setClientObject(void *client_object) { m_client_object = client_object; }
-       
+       SM_ClientObject *getClientObject() { return m_client_object; }
+       void setClientObject(SM_ClientObject *client_object) { m_client_object = client_object; }
+       void    setPhysicsClientObject(void* physicsClientObject)
+       {
+               m_physicsClientObject = physicsClientObject;
+       }
+       void*   getPhysicsClientObject() {
+               return m_physicsClientObject;
+       }
        void relax();
        
-       void backup() {
-               m_pos = m_prev_state.getPosition();
-               m_orn = m_prev_state.getOrientation();
-               m_xform = m_prev_xform;
-       }
+       SM_MotionState &getCurrentFrame();
+       SM_MotionState &getPreviousFrame();
+       SM_MotionState &getNextFrame();
+       
+       const SM_MotionState &getCurrentFrame()   const;
+       const SM_MotionState &getPreviousFrame()  const;
+       const SM_MotionState &getNextFrame()      const;
+
+       // Motion state functions       
+       const MT_Point3&     getPosition()        const;
+       const MT_Quaternion& getOrientation()     const;
+       const MT_Vector3&    getLinearVelocity()  const;
+       const MT_Vector3&    getAngularVelocity() const;
+       
+       MT_Scalar            getTime()            const;
+       
+       void setTime(MT_Scalar time);
+       
+       void interpolate(MT_Scalar timeStep);
+       void endFrame();
+       
 private:
+       friend class Contact;
+       // Tweak parameters
+       static MT_Scalar ImpulseThreshold;
 
        // return the actual linear_velocity of this object this 
        // is the addition of m_combined_lin_vel and m_lin_vel.
@@ -297,7 +327,9 @@ private:
     // as the collision callback now has only information
        // on an SM_Object, there must be a way that the SM_Object client
        // can identify it's clientdata after a collision
-       void                   *m_client_object;
+       SM_ClientObject        *m_client_object;
+       
+       void*                                   m_physicsClientObject;
 
        DT_ShapeHandle          m_shape;                 // Shape for collision detection
 
@@ -320,14 +352,12 @@ private:
        MT_Vector3              m_reaction_impulse;      // The accumulated impulse resulting from collisions
        MT_Vector3              m_reaction_force;        // The reaction force derived from the reaction impulse   
 
-       unsigned int            m_kinematic      : 1;    // Have I been displaced (translated, rotated, scaled) in this frame? 
-       unsigned int            m_prev_kinematic : 1;    // Have I been displaced (translated, rotated, scaled) in the previous frame? 
-       unsigned int            m_is_rigid_body  : 1;    // Should friction give me a change in angular momentum?
-
        MT_Vector3              m_lin_mom;               // Linear momentum (linear velocity times mass)
        MT_Vector3              m_ang_mom;               // Angular momentum (angualr velocity times inertia)
        MT_Vector3              m_force;                 // Force on center of mass (afffects linear momentum)
-       MT_Vector3              m_torque;                // Torque around center of mass (affects angualr momentum)
+       MT_Vector3              m_torque;                // Torque around center of mass (affects angular momentum)
+       
+       SM_MotionState          m_frames[3];             
        
        MT_Vector3              m_error;                 // Error in position:- amount object must be moved to prevent intersection with scene
 
@@ -351,6 +381,12 @@ private:
        MT_Scalar               m_inv_mass;              // 1/mass
        MT_Vector3              m_inv_inertia;           // [1/inertia_x, 1/inertia_y, 1/inertia_z]
        MT_Matrix3x3            m_inv_inertia_tensor;    // Inverse Inertia Tensor
+       
+       bool                    m_kinematic;             // Have I been displaced (translated, rotated, scaled) in this frame? 
+       bool                    m_prev_kinematic;        // Have I been displaced (translated, rotated, scaled) in the previous frame? 
+       bool                    m_is_rigid_body;         // Should friction give me a change in angular momentum?
+       int                     m_static;                // temporarily static.
+
 };
 
 #endif