Logo Search packages:      
Sourcecode: blender version File versions  Download package

CcdPhysicsController.h

#ifndef BULLET2_PHYSICSCONTROLLER_H
#define BULLET2_PHYSICSCONTROLLER_H

#include "PHY_IPhysicsController.h"

///   PHY_IPhysicsController is the abstract simplified Interface to a physical object.
///   It contains the IMotionState and IDeformableMesh Interfaces.
#include "SimdVector3.h"
#include "SimdScalar.h" 
#include "SimdMatrix3x3.h"

class CollisionShape;

extern float gDeactivationTime;
extern float gLinearSleepingTreshold;
extern float gAngularSleepingTreshold;
extern bool gDisableDeactivation;


struct CcdConstructionInfo
{
      CcdConstructionInfo()
            : m_gravity(0,0,0),
            m_mass(0.f),
            m_restitution(0.1f),
            m_linearDamping(0.1f),
            m_angularDamping(0.1f),
            m_MotionState(0),
            m_collisionShape(0)

      {
      }
      SimdVector3 m_localInertiaTensor;
      SimdVector3 m_gravity;
      SimdScalar  m_mass;
      SimdScalar  m_restitution;
      SimdScalar  m_friction;
      SimdScalar  m_linearDamping;
      SimdScalar  m_angularDamping;
      void*       m_broadphaseHandle;
      class PHY_IMotionState*             m_MotionState;

      CollisionShape*               m_collisionShape;
      
};


class RigidBody;

///CcdPhysicsController is a physics object that supports continuous collision detection and time of impact based physics resolution.
00052 class CcdPhysicsController : public PHY_IPhysicsController  
{
      RigidBody* m_body;
      class PHY_IMotionState*             m_MotionState;
      void*       m_newClientInfo;

      void GetWorldOrientation(SimdMatrix3x3& mat);

      public:
      
            int                     m_collisionDelay;
      
            void*  m_broadphaseHandle;

            CcdPhysicsController (const CcdConstructionInfo& ci);

            virtual ~CcdPhysicsController();


            RigidBody* GetRigidBody() { return m_body;}

            CollisionShape*   GetCollisionShape();
            ////////////////////////////////////
            // PHY_IPhysicsController interface
            ////////////////////////////////////


            /**
                  SynchronizeMotionStates ynchronizes dynas, kinematic and deformable entities (and do 'late binding')
            */
            virtual bool            SynchronizeMotionStates(float time);
            /**
                  WriteMotionStateToDynamics ynchronizes dynas, kinematic and deformable entities (and do 'late binding')
            */
            
            virtual void            WriteMotionStateToDynamics(bool nondynaonly);
            virtual     void        WriteDynamicsToMotionState();
            // controller replication
            virtual     void        PostProcessReplica(class PHY_IMotionState* motionstate,class PHY_IPhysicsController* parentctrl);

            // kinematic methods
            virtual void            RelativeTranslate(float dlocX,float dlocY,float dlocZ,bool local);
            virtual void            RelativeRotate(const float drot[9],bool local);
            virtual     void        getOrientation(float &quatImag0,float &quatImag1,float &quatImag2,float &quatReal);
            virtual     void        setOrientation(float quatImag0,float quatImag1,float quatImag2,float quatReal);
            virtual     void        setPosition(float posX,float posY,float posZ);
            virtual     void        getPosition(PHY__Vector3&     pos) const;

            virtual     void        setScaling(float scaleX,float scaleY,float scaleZ);
            
            // physics methods
            virtual void            ApplyTorque(float torqueX,float torqueY,float torqueZ,bool local);
            virtual void            ApplyForce(float forceX,float forceY,float forceZ,bool local);
            virtual void            SetAngularVelocity(float ang_velX,float ang_velY,float ang_velZ,bool local);
            virtual void            SetLinearVelocity(float lin_velX,float lin_velY,float lin_velZ,bool local);
            virtual void            applyImpulse(float attachX,float attachY,float attachZ, float impulseX,float impulseY,float impulseZ);
            virtual void            SetActive(bool active);

            // reading out information from physics
            virtual void            GetLinearVelocity(float& linvX,float& linvY,float& linvZ);
            virtual void            GetVelocity(const float posX,const float posY,const float posZ,float& linvX,float& linvY,float& linvZ); 
            virtual     void        getReactionForce(float& forceX,float& forceY,float& forceZ);

            // dyna's that are rigidbody are free in orientation, dyna's with non-rigidbody are restricted 
            virtual     void        setRigidBody(bool rigid);

            
            virtual void            resolveCombinedVelocities(float linvelX,float linvelY,float linvelZ,float angVelX,float angVelY,float angVelZ);

            // clientinfo for raycasts for example
            virtual     void*                   getNewClientInfo();
            virtual     void                    setNewClientInfo(void* clientinfo);
            virtual PHY_IPhysicsController*     GetReplica() {return 0;}

            virtual void      calcXform() {} ;
            virtual void SetMargin(float margin) {};
            virtual float GetMargin() const {return 0.f;};


            bool  wantsSleeping();

            void  UpdateDeactivation(float timeStep);

            void  SetAabb(const SimdVector3& aabbMin,const SimdVector3& aabbMax);


};

#endif //BULLET2_PHYSICSCONTROLLER_H

Generated by  Doxygen 1.6.0   Back to index