/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield * * This library is open source and may be redistributed and/or modified under * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or * (at your option) any later version. The full license is in LICENSE file * included with this distribution, and on the openscenegraph.org website. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * OpenSceneGraph Public License for more details. */ #ifndef OSG_QUAT #define OSG_QUAT 1 #include #include #include #include #include namespace osg { class Matrixf; class Matrixd; /** A quaternion class. It can be used to represent an orientation in 3D space.*/ class OSG_EXPORT Quat { public: /** Data type of vector components.*/ #ifdef OSG_USE_FLOAT_QUAT typedef float value_type; #else typedef double value_type; #endif /** Number of vector components. */ enum { num_components = 4 }; value_type _v[4]; // a four-vector inline Quat() { _v[0]=0.0; _v[1]=0.0; _v[2]=0.0; _v[3]=1.0; } inline Quat( value_type x, value_type y, value_type z, value_type w ) { _v[0]=x; _v[1]=y; _v[2]=z; _v[3]=w; } inline Quat( const Quat& rhs ) { _v[0]=rhs._v[0]; _v[1]=rhs._v[1]; _v[2]=rhs._v[2]; _v[3]=rhs._v[3]; } inline Quat( const Vec4f& v ) { _v[0]=v.x(); _v[1]=v.y(); _v[2]=v.z(); _v[3]=v.w(); } inline Quat( const Vec4d& v ) { _v[0]=v.x(); _v[1]=v.y(); _v[2]=v.z(); _v[3]=v.w(); } inline Quat( value_type angle, const Vec3f& axis) { makeRotate(angle,axis); } inline Quat( value_type angle, const Vec3d& axis) { makeRotate(angle,axis); } inline Quat( value_type angle1, const Vec3f& axis1, value_type angle2, const Vec3f& axis2, value_type angle3, const Vec3f& axis3) { makeRotate(angle1,axis1,angle2,axis2,angle3,axis3); } inline Quat( value_type angle1, const Vec3d& axis1, value_type angle2, const Vec3d& axis2, value_type angle3, const Vec3d& axis3) { makeRotate(angle1,axis1,angle2,axis2,angle3,axis3); } inline Quat& operator = (const Quat& v) { _v[0]=v._v[0]; _v[1]=v._v[1]; _v[2]=v._v[2]; _v[3]=v._v[3]; return *this; } inline bool operator == (const Quat& v) const { return _v[0]==v._v[0] && _v[1]==v._v[1] && _v[2]==v._v[2] && _v[3]==v._v[3]; } inline bool operator != (const Quat& v) const { return _v[0]!=v._v[0] || _v[1]!=v._v[1] || _v[2]!=v._v[2] || _v[3]!=v._v[3]; } inline bool operator < (const Quat& v) const { if (_v[0]v._v[0]) return false; else if (_v[1]v._v[1]) return false; else if (_v[2]v._v[2]) return false; else return (_v[3]