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