// stuff from quaternion.cpp

/*
 * Some constants and methods for accessing quaternion components
 */
//! @brief Use only this constant for accessing a quaternion's X component
const unsigned char QX = 0;
//! @brief Use only this constant for accessing a quaternion's Y component
const unsigned char QY = 1;
//! @brief Use only this constant for accessing a quaternion's Z component
const unsigned char QZ = 2;
//! @brief Use only this constant for accessing a quaternion's scalar component
const unsigned char QW = 3;
//! @brief Convenience method for accessing a quaternion's X component
inline double q_x( double *q) { return q[QX]; }
//! @brief Convenience method for accessing a quaternion's y component
inline double q_y( double *q) { return q[QY]; }
//! @brief Convenience method for accessing a quaternion's z component
inline double q_z( double *q) { return q[QZ]; }
//! @brief Convenience method for accessing a quaternion's scalar component
inline double q_w( double *q) { return q[QW]; }
double* quaternionToMatrix( const double *q, double *m);
double* matrixToQuaternion( const double *m, double *q );
double* axisAngleToQuaternion( double* axisAngle, double* quat );
double* quaternionToAxisAngle( double* q, double* axisAngle );
double* invertQuaternion( double *q );
double* conjugateQuaternion( double *q );
double* normalizeQuaternion( double *q );

double* multiplyQuaternion( double *q, const double *q1, const double *q2 );
double* rotateQuaternion( double *r, const double *q, const double *p );
double* rotateMatrix( double* rotPoint, double *matrix, const double *point );

