#pragma once #include "body.h" #include "model_body.h" #include "vector3.h" #include "matrix4x4.h" class DynamicBody : public ModelBody { public: OBJDEF(DynamicBody, ModelBody, DYNAMICBODY); DynamicBody(void); virtual ~DynamicBody(void); virtual void SetRotMatrix(const matrix4x4d& r); virtual void GetRotMatrix(matrix4x4d& m); virtual void SetVelocity(vector3d v); virtual void SetPosition(vector3d p); virtual vector3d GetPosition(void) const; virtual vector3d GetVelocity(void); vector3d GetAngVelocity(void); void SetAngVelocity(vector3d v); void SetMesh(ObjMesh* m); virtual bool OnCollision(Body* b, Uint32 flags) { return true; } vector3d GetAngularMomentum(void); void SetMassDistributionFromCollMesh(const CollMesh* m); void DisableBodyOnly(void) { m_enabled = false; } bool IsEnabled(void) { return m_enabled; } virtual void Disable(void); virtual void Enable(void); virtual double GetMass(void) const { return m_mass; } virtual void TimeStepUpdate(const float timeStep); void SetMass(double); void AddForceAtPos(const vector3d force, const vector3d pos); void AddForce(const vector3d); void SetForce(const vector3d); void SetTorque(const vector3d); /* body-relative forces. */ void AddRelForce(const vector3d); void AddRelTorque(const vector3d); protected: virtual void Save(void); virtual void Load(void); private: /* New odeless stuff. */ matrix4x4d m_orient; /* Contains pos. */ vector3d m_force; vector3d m_torque; vector3d m_vel; vector3d m_angVel; double m_mass; double m_massRadius; /* Set in a silly fashion from the collision mesh and used to calculate m_angInertia. */ double m_angInertia; /* Always spehere mass distribution. */ bool m_enabled; };