src/PhysicalObject.h

Go to the documentation of this file.
00001 #ifndef PHYSICALOBJECT_H
00002 #define PHYSICALOBJECT_H
00003 
00004 
00005 #include <cassert>
00006 #include <iosfwd>
00007 
00008 #include "Matrix.h"
00009 #include "Ray.h"
00010 #include "Vec3f.h"
00011 
00012 
00022 class PhysicalObject
00023 {
00024 public:
00029     PhysicalObject(bool enablePhysics);
00030 
00033     virtual ~PhysicalObject();
00034 
00040     void resetTransform()
00041     {
00042         mTransform = mInverseTransform = Matrix();
00043     }
00044 
00051     void translate(const Vec3f & vector)
00052     {
00053         mTransform          = Matrix(vector) * mTransform;
00054         mInverseTransform   *= Matrix(-vector);
00055         if (mPhysicsOn)
00056             mPosition = vector;
00057     }
00058 
00068     void rotate(const float angle, const Vec3f & axis)
00069     {
00070         if (axis.length() > EPSILON)
00071         {
00072             mTransform          = Matrix(angle, axis) * mTransform;
00073             mInverseTransform   *= Matrix(-angle, axis);
00074             if (mPhysicsOn)
00075                 mRotation = axis.normal()*angle;
00076         }
00077         else
00078         {
00079             if (mPhysicsOn)
00080                 mRotation = Vec3f();
00081         }
00082     }
00083 
00092     void scale(const float x, const float y, const float z)
00093     {
00094         mTransform          = Matrix(x, y, z) * mTransform;
00095         mInverseTransform   *= Matrix(1.0f/x, 1.0f/y, 1.0f/z);
00096         if (mPhysicsOn)
00097             mScaling = (x + y + z) / 3.0;
00098     }
00099 
00104     void toLocalCoordinates(Ray & ray) const
00105     {
00106         ray = mInverseTransform * ray;
00107     }
00108 
00114     void toLocalCoordinates(Vec3f & vector) const
00115     {
00116         vector = mInverseTransform.transformVector(vector);
00117     }
00118 
00123     void toGlobalCoordinates(Ray & ray) const
00124     {
00125         ray = mTransform * ray;
00126     }
00127 
00133     void toGlobalCoordinates(Vec3f & vector) const
00134     {
00135         vector = mTransform.transformVector(vector);
00136     }
00137 
00140     bool applyPhysics() const
00141     {
00142         return mPhysicsOn;
00143     }
00144 
00147     float mass() const
00148     {
00149         return mMass;
00150     }
00151 
00154     void setMass(float m)
00155     {
00156         mMass = m;
00157     }
00158 
00161     const Vec3f & velocity() const
00162     {
00163         return mVelocity;
00164     }
00165 
00168     void setVelocity(const Vec3f & v)
00169     {
00170         mVelocity = v;
00171     }
00172 
00175     const Vec3f & angularVelocity() const
00176     {
00177         return mAngularVelocity;
00178     }
00179 
00182     void setAngularVelocity(const Vec3f & omega)
00183     {
00184         mAngularVelocity = omega;
00185     }
00186 
00189     const Vec3f & position() const
00190     {
00191         return mPosition;
00192     }
00193 
00196     void offset(const Vec3f off)
00197     {
00198         mPosition += off;
00199     }
00200 
00203     float time() const
00204     {
00205         return mTime;
00206     }
00207 
00210     void updateProperties(float t);
00211 
00214     virtual void dump() const = 0;
00215 
00220     virtual void writeDump(std::ostream & outs);
00221 
00226     virtual void readDump(std::istream & ins);
00227 
00228 protected:
00230     Matrix                      mTransform;
00231 
00233     Matrix                      mInverseTransform;
00234 
00236     bool                        mPhysicsOn;
00237 
00239     float                       mMass;
00240 
00242     Vec3f                       mPosition;
00243 
00245     float                       mScaling;
00246 
00248     Vec3f                       mRotation;
00249 
00251     Vec3f                       mVelocity;
00252 
00254     Vec3f                       mAngularVelocity;
00255 
00257     float                       mTime;
00258 
00259 };
00260 
00261 
00262 #endif
00263 

Generated on Fri Feb 1 00:01:42 2008 for Grayfall by  doxygen 1.5.1