Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*********************************************************
- * mat4.h
- *********************************************************/
- /*********************************************************
- * CWorx Engine : Graphics Engine produced by Ckef Worx
- * www : http://www.ckef-worx.com
- OpenGL used as 2D/3D graphics rendering API, in combination
- with the GLFW library.
- * Copyright (c) Stef Velzel :: All Rights Reserved
- *********************************************************/
- #ifndef __MAT4_H__
- #define __MAT4_H__
- #include "Math/mat3.h"
- // CWE (CWorx Engine) namespace
- namespace CWE
- {
- //-----------------------------------------------------------------------
- class DLL mat4
- {
- //-----------------------------------------------------------------------
- protected:
- // Array, row-major
- float m[16];
- //-----------------------------------------------------------------------
- public:
- /** Computes the matrix according to a position, orientation and scale
- * @position The position of the item.
- * @orientation The orientation of the item.
- * @scale The scale of the item.
- */
- static mat4 createMatrix(const vec3 &position, const quaternion &orientation, const vec3 &scale);
- /** Computes the inverse matrix according to a position, orientation and scale
- * @position The position of the item.
- * @orientation The orientation of the item.
- * @scale The scale of the item.
- */
- static mat4 createMatrixInverse(const vec3 &position, const quaternion &orientation, const vec3 &scale);
- // CONSTANTS
- static const mat4 ZERO;
- static const mat4 IDENTITY;
- /** Constructor, NOTE: does not initialize */
- mat4() {}
- /** Constructor */
- mat4(const float m00, const float m01, const float m02, const float m03,
- const float m10, const float m11, const float m12, const float m13,
- const float m20, const float m21, const float m22, const float m23,
- const float m30, const float m31, const float m32, const float m33)
- {
- m[0] = m00; m[1] = m01; m[2] = m02; m[3] = m03;
- m[4] = m10; m[5] = m11; m[6] = m12; m[7] = m13;
- m[8] = m20; m[9] = m21; m[10] = m22; m[11] = m23;
- m[12] = m30; m[13] = m31; m[14] = m32; m[15] = m33;
- }
- /** Constructor
- * @x The x (right) vector.
- * @y The y (up) vector.
- * @z The z (front) vector.
- * @position The position of the item.
- */
- mat4(const vec3 &x, const vec3 &y, const vec3 &z, const vec3 &position = vec3::ZERO);
- /** Constructor
- * @scalar The diagnal scalar.
- */
- mat4(const float scalar)
- {
- m[0] = scalar; m[1] = 0.0f; m[2] = 0.0f; m[3] = 0.0f;
- m[4] = 0.0f, m[5] = scalar; m[6] = 0.0f; m[7] = 0.0f;
- m[8] = 0.0f, m[9] = 0.0f; m[10] = scalar; m[11] = 0.0f;
- m[12] = 0.0f, m[13] = 0.0f; m[14] = 0.0f; m[15] = scalar;
- }
- /** Copies from a 3x3 matrix */
- mat4(const mat3 &mat)
- {
- *this = mat;
- }
- /** Copy Constructor */
- mat4(const mat4 &mat)
- {
- *this = mat;
- }
- /** Assignment Copy of 3x3 matrix */
- mat4 &operator=(const mat3 &mat)
- {
- m[0] = mat.m[0]; m[1] = mat.m[1]; m[2] = mat.m[2]; m[3] = 0.0f;
- m[4] = mat.m[3]; m[5] = mat.m[4]; m[6] = mat.m[5]; m[7] = 0.0f;
- m[8] = mat.m[6]; m[9] = mat.m[7]; m[10] = mat.m[8]; m[11] = 0.0f;
- m[12] = 0.0f; m[13] = 0.0f; m[14] = 0.0f; m[15] = 1.0f;
- return *this;
- }
- /** Assignment Copy */
- mat4 &operator=(const mat4 &mat)
- {
- m[0] = mat.m[0]; m[1] = mat.m[1]; m[2] = mat.m[2]; m[3] = mat.m[3];
- m[4] = mat.m[4]; m[5] = mat.m[5]; m[6] = mat.m[6]; m[7] = mat.m[7];
- m[8] = mat.m[8]; m[9] = mat.m[9]; m[10] = mat.m[10]; m[11] = mat.m[11];
- m[12] = mat.m[12]; m[13] = mat.m[13]; m[14] = mat.m[14]; m[15] = mat.m[15];
- return *this;
- }
- /** Fetches the value at a given index */
- inline float &operator[](const unsigned short index)
- {
- assert(index <= 15);
- return m[index];
- }
- /** Fetches the value at a given coordinate */
- inline float &operator()(const unsigned short row, const unsigned short collumn)
- {
- assert(row <= 3 && collumn <= 3);
- return m[4 * row + collumn];
- }
- /** Transposes the matrix */
- mat4 &transpose();
- /** Inverses the matrix */
- bool inverse(const float tolerance = 0.000006f);
- /** Computes the determinant of the matrix */
- float determinant();
- //-----------------------------------------------------------------------
- /** Basic Matrix arithmetics
- * Comparison
- * Negation
- * Adding
- * Subtracting
- * Multiplying
- */
- // Self modifying
- inline mat4 &operator+=(const mat4 &mat) { *this = *this + mat; return *this; }
- inline mat4 &operator-=(const mat4 &mat) { *this = *this - mat; return *this; }
- inline mat4 &operator*=(const mat4 &mat) { *this = *this * mat; return *this; }
- // Non-Self modifying
- bool operator==(const mat4 &mat) const;
- inline bool operator!=(const mat4 &mat) const { return !(*this == mat); }
- inline mat4 operator+() const { return *this; }
- mat4 operator-() const;
- inline friend mat4 operator*(const mat4 &mat, const float scalar) { return scalar * mat; }
- friend mat4 operator*(const float scalar, const mat4 &mat) { return mat4(
- scalar * mat.m[0], scalar * mat.m[1], scalar * mat.m[2], scalar * mat.m[3],
- scalar * mat.m[4], scalar * mat.m[5], scalar * mat.m[6], scalar * mat.m[7],
- scalar * mat.m[8], scalar * mat.m[9], scalar * mat.m[10], scalar * mat.m[11],
- scalar * mat.m[12], scalar * mat.m[13], scalar * mat.m[14], scalar * mat.m[15] );
- }
- mat4 operator+(const mat4 &mat) const;
- mat4 operator-(const mat4 &mat) const;
- mat4 operator*(const mat4 &mat) const;
- vec4 operator*(const vec4 &vec) const;
- vec3 operator*(const vec3 &vec) const;
- };
- }
- #endif
- /*********************************************************
- * mat4.cpp
- *********************************************************/
- #include "Math/mat4.h"
- #include "Math/mat3.h"
- #include "Math/vec4.h"
- #include "Math/quaternion.h"
- // CWE (CWorx Engine) namespace
- namespace CWE
- {
- //-----------------------------------------------------------------------
- // Static matrix construction
- mat4 mat4::createMatrix(const vec3 &position, const quaternion &orientation, const vec3 &scale)
- {
- // quaternion -> matrix
- mat3 rotMatrix = mat3::ZERO;
- orientation.toMatrix(rotMatrix);
- // Stuff 4x4 matrix
- mat4 matrix = rotMatrix;
- // Scale/Translate
- matrix[0] *= scale.x; matrix[1] *= scale.y; matrix[2] *= scale.z; matrix[3] = position.x;
- matrix[4] *= scale.x; matrix[5] *= scale.y; matrix[6] *= scale.z; matrix[7] = position.y;
- matrix[8] *= scale.x; matrix[9] *= scale.y; matrix[10] *= scale.z; matrix[11] = position.z;
- return matrix;
- }
- //-----------------------------------------------------------------------
- // Static inverse matrix construction
- mat4 mat4::createMatrixInverse(const vec3 &position, const quaternion &orientation, const vec3 &scale)
- {
- // quaternion -> inverse -> matrix
- mat3 rotMatrix = mat3::ZERO;
- orientation.inverse().toMatrix(rotMatrix);
- // Inverse Scale
- vec3 invScale = 1.0f / scale;
- // Apply Scale
- rotMatrix[0] *= invScale.x; rotMatrix[1] *= invScale.x; rotMatrix[2] *= invScale.x;
- rotMatrix[3] *= invScale.y; rotMatrix[4] *= invScale.y; rotMatrix[5] *= invScale.y;
- rotMatrix[6] *= invScale.z; rotMatrix[7] *= invScale.z; rotMatrix[8] *= invScale.z;
- mat4 matrix = rotMatrix;
- // Inverse Translate
- vec3 invTranslate = rotMatrix * -position;
- // Apply Translate
- matrix[3] = invTranslate.x;
- matrix[7] = invTranslate.y;
- matrix[11] = invTranslate.z;
- return matrix;
- }
- //-----------------------------------------------------------------------
- const mat4 mat4::ZERO(
- 0, 0, 0, 0,
- 0, 0, 0, 0,
- 0, 0, 0, 0,
- 0, 0, 0, 0 );
- const mat4 mat4::IDENTITY(
- 1, 0, 0, 0,
- 0, 1, 0, 0,
- 0, 0, 1, 0,
- 0, 0, 0, 1 );
- //-----------------------------------------------------------------------
- mat4::mat4(const vec3 &x, const vec3 &y, const vec3 &z, const vec3 &position)
- {
- vec3 xAxis = x.normalize();
- vec3 yAxis = y.normalize();
- vec3 zAxis = z.normalize();
- m[0] = xAxis.x; m[1] = yAxis.x; m[2] = zAxis.x; m[3] = position.x;
- m[4] = xAxis.y; m[5] = yAxis.y; m[6] = zAxis.y; m[7] = position.y;
- m[8] = xAxis.z; m[9] = yAxis.z; m[10] = zAxis.z; m[11] = position.z;
- m[12] = 0.0f; m[13] = 0.0f; m[14] = 0.0f; m[15] = 1.0f;
- }
- //-----------------------------------------------------------------------
- mat4 &mat4::transpose()
- {
- return *this = mat4(
- m[0], m[4], m[8], m[12],
- m[1], m[5], m[9], m[13],
- m[2], m[6], m[10], m[14],
- m[3], m[7], m[11], m[15] );
- }
- //-----------------------------------------------------------------------
- bool mat4::inverse(const float tolerance) // Introduces even more shitty float errors
- {
- // Determinants of 2x2 submatrices
- float S0 = m[0] * m[5] - m[1] * m[4];
- float S1 = m[0] * m[6] - m[2] * m[4];
- float S2 = m[0] * m[7] - m[3] * m[4];
- float S3 = m[1] * m[6] - m[2] * m[5];
- float S4 = m[1] * m[7] - m[3] * m[5];
- float S5 = m[2] * m[7] - m[3] * m[6];
- float C5 = m[10] * m[15] - m[11] * m[14];
- float C4 = m[9] * m[15] - m[11] * m[13];
- float C3 = m[9] * m[14] - m[10] * m[13];
- float C2 = m[8] * m[15] - m[11] * m[12];
- float C1 = m[8] * m[14] - m[10] * m[12];
- float C0 = m[8] * m[13] - m[9] * m[12];
- // If determinant equals 0, there is no inverse
- float det = S0 * C5 - S1 * C4 + S2 * C3 + S3 * C2 - S4 * C1 + S5 * C0;
- if(fabs(det) <= tolerance) return false;
- // Compute adjugate matrix
- *this = (1 / det) * mat4(
- m[5] * C5 - m[6] * C4 + m[7] * C3, -m[1] * C5 + m[2] * C4 - m[3] * C3,
- m[13] * S5 - m[14] * S4 + m[15] * S3, -m[9] * S5 + m[10] * S4 - m[11] * S3,
- -m[4] * C5 + m[6] * C2 - m[7] * C1, m[0] * C5 - m[2] * C2 + m[3] * C1,
- -m[12] * S5 + m[14] * S2 - m[15] * S1, m[8] * S5 - m[10] * S2 + m[11] * S1,
- m[4] * C4 - m[5] * C2 + m[7] * C0, -m[0] * C4 + m[1] * C2 - m[3] * C0,
- m[12] * S4 - m[13] * S2 + m[15] * S0, -m[8] * S4 + m[9] * S2 - m[11] * S0,
- -m[4] * C3 + m[5] * C1 - m[6] * C0, m[0] * C3 - m[1] * C1 + m[2] * C0,
- -m[12] * S3 + m[13] * S1 - m[14] * S0, m[8] * S3 - m[9] * S1 + m[10] * S0 );
- return true;
- }
- //-----------------------------------------------------------------------
- float mat4::determinant()
- {
- // Determinants of 2x2 submatrices
- float S0 = m[0] * m[5] - m[1] * m[4];
- float S1 = m[0] * m[6] - m[2] * m[4];
- float S2 = m[0] * m[7] - m[3] * m[4];
- float S3 = m[1] * m[6] - m[2] * m[5];
- float S4 = m[1] * m[7] - m[3] * m[5];
- float S5 = m[2] * m[7] - m[3] * m[6];
- float C5 = m[10] * m[15] - m[11] * m[14];
- float C4 = m[9] * m[15] - m[11] * m[13];
- float C3 = m[9] * m[14] - m[10] * m[13];
- float C2 = m[8] * m[15] - m[11] * m[12];
- float C1 = m[8] * m[14] - m[10] * m[12];
- float C0 = m[8] * m[13] - m[9] * m[12];
- return S0 * C5 - S1 * C4 + S2 * C3 + S3 * C2 - S4 * C1 + S5 * C0;
- }
- //-----------------------------------------------------------------------
- bool mat4::operator==(const mat4 &mat) const
- {
- return (
- m[0] == mat.m[0] && m[1] == mat.m[1] && m[2] == mat.m[2] && m[3] == mat.m[3] &&
- m[4] == mat.m[4] && m[5] == mat.m[5] && m[6] == mat.m[6] && m[7] == mat.m[7] &&
- m[8] == mat.m[8] && m[8] == mat.m[8] && m[10] == mat.m[10] && m[11] == mat.m[11] &&
- m[12] == mat.m[12] && m[13] == mat.m[13] && m[14] == mat.m[14] && m[15] == mat.m[15] );
- }
- //-----------------------------------------------------------------------
- mat4 mat4::operator-() const
- {
- return mat4(
- -m[0], -m[1], -m[2], -m[3],
- -m[4], -m[5], -m[6], -m[7],
- -m[8], -m[9], -m[10], -m[11],
- -m[12], -m[13], -m[14], -m[15] );
- }
- //-----------------------------------------------------------------------
- mat4 mat4::operator+(const mat4 &mat) const
- {
- return mat4(
- m[0] + mat.m[0], m[1] + mat.m[1], m[2] + mat.m[2], m[3] + mat.m[3],
- m[4] + mat.m[4], m[5] + mat.m[5], m[6] + mat.m[6], m[7] + mat.m[7],
- m[8] + mat.m[8], m[9] + mat.m[9], m[10] + mat.m[10], m[11] + mat.m[11],
- m[12] + mat.m[12], m[13] + mat.m[13], m[14] + mat.m[14], m[15] + mat.m[15] );
- }
- //-----------------------------------------------------------------------
- mat4 mat4::operator-(const mat4 &mat) const
- {
- return mat4(
- m[0] - mat.m[0], m[1] - mat.m[1], m[2] - mat.m[2], m[3] - mat.m[3],
- m[4] - mat.m[4], m[5] - mat.m[5], m[6] - mat.m[6], m[7] - mat.m[7],
- m[8] - mat.m[8], m[9] - mat.m[9], m[10] - mat.m[10], m[11] - mat.m[11],
- m[12] - mat.m[12], m[13] - mat.m[13], m[14] - mat.m[14], m[15] - mat.m[15] );
- }
- //-----------------------------------------------------------------------
- mat4 mat4::operator*(const mat4 &mat) const
- {
- return mat4(
- m[0] * mat.m[0] + m[1] * mat.m[4] + m[2] * mat.m[8] + m[3] * mat.m[12],
- m[0] * mat.m[1] + m[1] * mat.m[5] + m[2] * mat.m[9] + m[3] * mat.m[13],
- m[0] * mat.m[2] + m[1] * mat.m[6] + m[2] * mat.m[10] + m[3] * mat.m[14],
- m[0] * mat.m[3] + m[1] * mat.m[7] + m[2] * mat.m[11] + m[3] * mat.m[15],
- m[4] * mat.m[0] + m[5] * mat.m[4] + m[6] * mat.m[8] + m[7] * mat.m[12],
- m[4] * mat.m[1] + m[5] * mat.m[5] + m[6] * mat.m[9] + m[7] * mat.m[13],
- m[4] * mat.m[2] + m[5] * mat.m[6] + m[6] * mat.m[10] + m[7] * mat.m[14],
- m[4] * mat.m[3] + m[5] * mat.m[7] + m[6] * mat.m[11] + m[7] * mat.m[15],
- m[8] * mat.m[0] + m[9] * mat.m[4] + m[10] * mat.m[8] + m[11] * mat.m[12],
- m[8] * mat.m[1] + m[9] * mat.m[5] + m[10] * mat.m[9] + m[11] * mat.m[13],
- m[8] * mat.m[2] + m[9] * mat.m[6] + m[10] * mat.m[10] + m[11] * mat.m[14],
- m[8] * mat.m[3] + m[9] * mat.m[7] + m[10] * mat.m[11] + m[11] * mat.m[15],
- m[12] * mat.m[0] + m[13] * mat.m[4] + m[14] * mat.m[8] + m[15] * mat.m[12],
- m[12] * mat.m[1] + m[13] * mat.m[5] + m[14] * mat.m[9] + m[15] * mat.m[13],
- m[12] * mat.m[2] + m[13] * mat.m[6] + m[14] * mat.m[10] + m[15] * mat.m[14],
- m[12] * mat.m[3] + m[13] * mat.m[7] + m[14] * mat.m[11] + m[15] * mat.m[15] );
- }
- //-----------------------------------------------------------------------
- vec4 mat4::operator*(const vec4 &vec) const
- {
- return vec4(
- m[0] * vec.x + m[1] * vec.y + m[2] * vec.z + m[3] * vec.w,
- m[4] * vec.x + m[5] * vec.y + m[6] * vec.z + m[7] * vec.w,
- m[8] * vec.x + m[9] * vec.y + m[10] * vec.z + m[11] * vec.w,
- m[12] * vec.x + m[13] * vec.y + m[14] * vec.z + m[15] * vec.w );
- }
- //-----------------------------------------------------------------------
- vec3 mat4::operator*(const vec3 &vec) const
- {
- return vec3(
- m[0] * vec.x + m[1] * vec.y + m[2] * vec.z + m[3],
- m[4] * vec.x + m[5] * vec.y + m[6] * vec.z + m[7],
- m[8] * vec.x + m[9] * vec.y + m[10] * vec.z + m[11] );
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment