/** @file 4x4 matrix structure, including operators when compiling in C++ */ #ifndef AI_MATRIX4X4_H_INC #define AI_MATRIX4X4_H_INC #ifdef __cplusplus extern "C" { #endif struct aiMatrix3x3; struct aiQuaternion; // Set packing to 4 #if defined(_MSC_VER) || defined(__BORLANDC__) || defined (__BCPLUSPLUS__) #pragma pack(push,4) #define PACK_STRUCT #elif defined( __GNUC__ ) #define PACK_STRUCT __attribute__((packed)) #else #error Compiler not supported #endif // --------------------------------------------------------------------------- /** Represents a row-major 4x4 matrix, * use this for homogenious coordinates */ // --------------------------------------------------------------------------- struct aiMatrix4x4 { #ifdef __cplusplus aiMatrix4x4 () : a1(1.0f), a2(0.0f), a3(0.0f), a4(0.0f), b1(0.0f), b2(1.0f), b3(0.0f), b4(0.0f), c1(0.0f), c2(0.0f), c3(1.0f), c4(0.0f), d1(0.0f), d2(0.0f), d3(0.0f), d4(1.0f){} aiMatrix4x4 ( float _a1, float _a2, float _a3, float _a4, float _b1, float _b2, float _b3, float _b4, float _c1, float _c2, float _c3, float _c4, float _d1, float _d2, float _d3, float _d4) : a1(_a1), a2(_a2), a3(_a3), a4(_a4), b1(_b1), b2(_b2), b3(_b3), b4(_b4), c1(_c1), c2(_c2), c3(_c3), c4(_c4), d1(_d1), d2(_d2), d3(_d3), d4(_d4) {} /** Constructor from 3x3 matrix. The remaining elements are set to identity. */ explicit aiMatrix4x4( const aiMatrix3x3& m); aiMatrix4x4& operator *= (const aiMatrix4x4& m); aiMatrix4x4 operator* (const aiMatrix4x4& m) const; aiMatrix4x4& Transpose(); aiMatrix4x4& Inverse(); float Determinant() const; inline bool IsIdentity() const; float* operator[](unsigned int p_iIndex); const float* operator[](unsigned int p_iIndex) const; inline bool operator== (const aiMatrix4x4 m) const; inline bool operator!= (const aiMatrix4x4 m) const; /** \brief Decompose a trafo matrix into its original components * \param scaling Receives the output scaling for the x,y,z axes * \param rotation Receives the output rotation as a hamilton * quaternion * \param position Receives the output position for the x,y,z axes */ inline void Decompose (aiVector3D& scaling, aiQuaternion& rotation, aiVector3D& position) const; /** \brief Decompose a trafo matrix with no scaling into its * original components * \param rotation Receives the output rotation as a hamilton * quaternion * \param position Receives the output position for the x,y,z axes */ inline void DecomposeNoScaling (aiQuaternion& rotation, aiVector3D& position) const; /** \brief Creates a trafo matrix from a set of euler angles * \param x Rotation angle for the x-axis, in radians * \param y Rotation angle for the y-axis, in radians * \param z Rotation angle for the z-axis, in radians */ inline void FromEulerAngles(float x, float y, float z); /** \brief Returns a rotation matrix for a rotation around the x axis * \param a Rotation angle, in radians * \param out Receives the output matrix * \return Reference to the output matrix */ static aiMatrix4x4& RotationX(float a, aiMatrix4x4& out); /** \brief Returns a rotation matrix for a rotation around the y axis * \param a Rotation angle, in radians * \param out Receives the output matrix * \return Reference to the output matrix */ static aiMatrix4x4& RotationY(float a, aiMatrix4x4& out); /** \brief Returns a rotation matrix for a rotation around the z axis * \param a Rotation angle, in radians * \param out Receives the output matrix * \return Reference to the output matrix */ static aiMatrix4x4& RotationZ(float a, aiMatrix4x4& out); /** \brief Returns a translation matrix * \param v Translation vector * \param out Receives the output matrix * \return Reference to the output matrix */ static aiMatrix4x4& Translation(aiVector3D v, aiMatrix4x4& out); #endif // __cplusplus float a1, a2, a3, a4; float b1, b2, b3, b4; float c1, c2, c3, c4; float d1, d2, d3, d4; } PACK_STRUCT; // Reset packing #if defined(_MSC_VER) || defined(__BORLANDC__) || defined (__BCPLUSPLUS__) #pragma pack( pop ) #endif #undef PACK_STRUCT #ifdef __cplusplus } // end extern "C" #endif // __cplusplus #endif // AI_MATRIX4X4_H_INC