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