00001
00032 #ifndef LL_COORDFRAME_H
00033 #define LL_COORDFRAME_H
00034
00035 #include "v3math.h"
00036 #include "v4math.h"
00037 #include "llerror.h"
00038
00039
00040
00041
00042
00043
00044
00045 class LLCoordFrame
00046 {
00047 public:
00048 LLCoordFrame();
00049 explicit LLCoordFrame(const LLVector3 &origin);
00050 LLCoordFrame(const LLVector3 &x_axis,
00051 const LLVector3 &y_axis,
00052 const LLVector3 &z_axis);
00053 LLCoordFrame(const LLVector3 &origin,
00054 const LLVector3 &x_axis,
00055 const LLVector3 &y_axis,
00056 const LLVector3 &z_axis);
00057 LLCoordFrame(const LLVector3 &origin,
00058 const LLMatrix3 &rotation);
00059 LLCoordFrame(const LLVector3 &origin,
00060 const LLVector3 &direction);
00061 explicit LLCoordFrame(const LLQuaternion &q);
00062 LLCoordFrame(const LLVector3 &origin,
00063 const LLQuaternion &q);
00064 explicit LLCoordFrame(const LLMatrix4 &mat);
00065
00066
00067
00068
00069 BOOL isFinite() { return mOrigin.isFinite() && mXAxis.isFinite() && mYAxis.isFinite() && mZAxis.isFinite(); }
00070
00071 void reset();
00072 void resetAxes();
00073
00074 void setOrigin(F32 x, F32 y, F32 z);
00075 void setOrigin(const LLVector3 &origin);
00076 void setOrigin(const F32 *origin);
00077 void setOrigin(const LLCoordFrame &frame);
00078
00079 inline void setOriginX(F32 x) { mOrigin.mV[VX] = x; }
00080 inline void setOriginY(F32 y) { mOrigin.mV[VY] = y; }
00081 inline void setOriginZ(F32 z) { mOrigin.mV[VZ] = z; }
00082
00083 void setAxes(const LLVector3 &x_axis,
00084 const LLVector3 &y_axis,
00085 const LLVector3 &z_axis);
00086 void setAxes(const LLMatrix3 &rotation_matrix);
00087 void setAxes(const LLQuaternion &q);
00088 void setAxes(const F32 *rotation_matrix);
00089 void setAxes(const LLCoordFrame &frame);
00090
00091 void translate(F32 x, F32 y, F32 z);
00092 void translate(const LLVector3 &v);
00093 void translate(const F32 *origin);
00094
00095 void rotate(F32 angle, F32 x, F32 y, F32 z);
00096 void rotate(F32 angle, const LLVector3 &rotation_axis);
00097 void rotate(const LLQuaternion &q);
00098 void rotate(const LLMatrix3 &m);
00099
00100 void orthonormalize();
00101
00102
00103 void roll(F32 angle);
00104 void pitch(F32 angle);
00105 void yaw(F32 angle);
00106
00107 inline const LLVector3 &getOrigin() const { return mOrigin; }
00108
00109 inline const LLVector3 &getXAxis() const { return mXAxis; }
00110 inline const LLVector3 &getYAxis() const { return mYAxis; }
00111 inline const LLVector3 &getZAxis() const { return mZAxis; }
00112
00113 inline const LLVector3 &getAtAxis() const { return mXAxis; }
00114 inline const LLVector3 &getLeftAxis() const { return mYAxis; }
00115 inline const LLVector3 &getUpAxis() const { return mZAxis; }
00116
00117
00118
00119
00120
00121 LLQuaternion getQuaternion() const;
00122
00123
00124
00125
00126
00127 void getMatrixToParent(LLMatrix4 &mat) const;
00128
00129 void getMatrixToLocal(LLMatrix4 &mat) const;
00130
00131 void getRotMatrixToParent(LLMatrix4 &mat) const;
00132
00133
00134 size_t writeOrientation(char *buffer) const;
00135
00136
00137
00138 size_t readOrientation(const char *buffer);
00139
00140 LLVector3 rotateToLocal(const LLVector3 &v) const;
00141 LLVector4 rotateToLocal(const LLVector4 &v) const;
00142 LLVector3 rotateToAbsolute(const LLVector3 &v) const;
00143 LLVector4 rotateToAbsolute(const LLVector4 &v) const;
00144
00145 LLVector3 transformToLocal(const LLVector3 &v) const;
00146 LLVector4 transformToLocal(const LLVector4 &v) const;
00147 LLVector3 transformToAbsolute(const LLVector3 &v) const;
00148 LLVector4 transformToAbsolute(const LLVector4 &v) const;
00149
00150
00151 void getOpenGLTranslation(F32 *ogl_matrix) const;
00152 void getOpenGLRotation(F32 *ogl_matrix) const;
00153 void getOpenGLTransform(F32 *ogl_matrix) const;
00154
00155
00156 void lookDir(const LLVector3 &xuv, const LLVector3 &up);
00157 void lookDir(const LLVector3 &xuv);
00158
00159 void lookAt(const LLVector3 &origin, const LLVector3 &point_of_interest, const LLVector3 &up);
00160 void lookAt(const LLVector3 &origin, const LLVector3 &point_of_interest);
00161
00162
00163 void setOriginAndLookAt(const LLVector3 &origin, const LLVector3 &up, const LLVector3 &point_of_interest)
00164 {
00165 lookAt(origin, point_of_interest, up);
00166 }
00167
00168 friend std::ostream& operator<<(std::ostream &s, const LLCoordFrame &C);
00169
00170
00171 LLVector3 mOrigin;
00172 LLVector3 mXAxis;
00173 LLVector3 mYAxis;
00174 LLVector3 mZAxis;
00175 };
00176
00177
00178 #endif
00179