Advertisement
SDL2

C++ integer timer with programmable settings

Jul 7th, 2020
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 15.92 KB | None | 0 0
  1. #pragma once
  2. #include <cmath>
  3. #include <cfloat>
  4. #include <memory>
  5. #include <iostream>
  6. #include <cassert>
  7.  
  8. class Vector3 {
  9. public:
  10.   //Constructors
  11.   Vector3() {}
  12.   explicit Vector3(float b) : x(b), y(b), z(b) {}
  13.   explicit Vector3(const float* b) : x(b[0]), y(b[1]), z(b[2]) {}
  14.   explicit Vector3(float x, float y, float z) : x(x), y(y), z(z) {}
  15.  
  16.   //General
  17.   inline static Vector3 Zero() { return Vector3(0.0f); }
  18.   inline static Vector3 Ones() { return Vector3(1.0f); }
  19.   inline static Vector3 UnitX() { return Vector3(1, 0, 0); }
  20.   inline static Vector3 UnitY() { return Vector3(0, 1, 0); }
  21.   inline static Vector3 UnitZ() { return Vector3(0, 0, 1); }
  22.  
  23.   //Setters
  24.   inline void Set(float _x, float _y, float _z) { x = _x; y = _y; z = _z; }
  25.   inline void SetZero() { x = 0.0f; y = 0.0f; z = 0.0f; }
  26.   inline void SetOnes() { x = 1.0f; y = 1.0f; z = 1.0f; }
  27.   inline void SetUnitX() { x = 1.0f; y = 0.0f; z = 0.0f; }
  28.   inline void SetUnitY() { x = 0.0f; y = 1.0f; z = 0.0f; }
  29.   inline void SetUnitZ() { x = 0.0f; y = 0.0f; z = 1.0f; }
  30.  
  31.   //Basic operatios
  32.   inline Vector3 operator+(float b) const {
  33.     return Vector3(x + b, y + b, z + b);
  34.   }
  35.   inline Vector3 operator-(float b) const {
  36.     return Vector3(x - b, y - b, z - b);
  37.   }
  38.   inline Vector3 operator*(float b) const {
  39.     return Vector3(x * b, y * b, z * b);
  40.   }
  41.   inline Vector3 operator/(float b) const {
  42.     return Vector3(x / b, y / b, z / b);
  43.   }
  44.   inline Vector3 operator+(const Vector3& b) const {
  45.     return Vector3(x + b.x, y + b.y, z + b.z);
  46.   }
  47.   inline Vector3 operator-(const Vector3& b) const {
  48.     return Vector3(x - b.x, y - b.y, z - b.z);
  49.   }
  50.   inline Vector3 operator*(const Vector3& b) const {
  51.     return Vector3(x * b.x, y * b.y, z * b.z);
  52.   }
  53.   inline Vector3 operator/(const Vector3& b) const {
  54.     return Vector3(x / b.x, y / b.y, z / b.z);
  55.   }
  56.   inline void operator+=(float b) {
  57.     x += b; y += b; z += b;
  58.   }
  59.   inline void operator-=(float b) {
  60.     x -= b; y -= b; z -= b;
  61.   }
  62.   inline void operator*=(float b) {
  63.     x *= b; y *= b; z *= b;
  64.   }
  65.   inline void operator/=(float b) {
  66.     x /= b; y /= b; z /= b;
  67.   }
  68.   inline void operator+=(const Vector3& b) {
  69.     x += b.x; y += b.y; z += b.z;
  70.   }
  71.   inline void operator-=(const Vector3& b) {
  72.     x -= b.x; y -= b.y; z -= b.z;
  73.   }
  74.   inline void operator*=(const Vector3& b) {
  75.     x *= b.x; y *= b.y; z *= b.z;
  76.   }
  77.   inline void operator/=(const Vector3& b) {
  78.     x /= b.x; y /= b.y; z /= b.z;
  79.   }
  80.   inline Vector3 operator-() const {
  81.     return Vector3(-x, -y, -z);
  82.   }
  83.  
  84.   //Vector algebra
  85.   inline float Dot(const Vector3& b) const {
  86.     return x*b.x + y*b.y + z*b.z;
  87.   }
  88.   inline Vector3 Cross(const Vector3& b) const {
  89.     return Vector3(y*b.z - z*b.y, z*b.x - x*b.z, x*b.y - y*b.x);
  90.   }
  91.   inline float MagSq() const {
  92.     return x*x + y*y + z*z;
  93.   }
  94.   inline float Mag() const {
  95.     return std::sqrt(MagSq());
  96.   }
  97.  
  98.   //Normalization
  99.   inline void Normalize() {
  100.     (*this) /= Mag();
  101.   }
  102.   inline void NormalizeSafe() {
  103.     (*this) /= (Mag() + FLT_EPSILON);
  104.   }
  105.   inline Vector3 Normalized() const {
  106.     return (*this) / Mag();
  107.   }
  108.   inline Vector3 NormalizedSafe() const {
  109.     return (*this) / (Mag() + FLT_EPSILON);
  110.   }
  111.   inline float Angle(const Vector3& b) const {
  112.     return std::acos(Normalized().Dot(b.Normalized()));
  113.   }
  114.   inline float AngleSafe(const Vector3& b) const {
  115.     return std::acos(NormalizedSafe().Dot(b.NormalizedSafe()));
  116.   }
  117.   inline void ClipMag(float m) {
  118.     assert(m > 0.0f);
  119.     const float r = MagSq() / (m * m);
  120.     if (r > 1.0f) {
  121.       (*this) /= std::sqrt(r);
  122.     }
  123.   }
  124.  
  125.   //Other
  126.   inline bool IsNDC() const {
  127.     return (x > -1.0f && x < 1.0f && y > -1.0f && y < 1.0f && z > -1.0f && z < 1.0f);
  128.   }
  129.  
  130.   //Components
  131.   float x, y, z;
  132. };
  133. inline Vector3 operator/(float b, const Vector3& v) {
  134.   return Vector3(b / v.x, b / v.y, b / v.z);
  135. }
  136. inline void operator/=(float b, Vector3& v) {
  137.   v.x = b / v.x; v.y = b / v.y; v.z = b / v.z;
  138. }
  139.  
  140. class Vector4 {
  141. public:
  142.   Vector4() {}
  143.   explicit Vector4(float b) : x(b), y(b), z(b), w(b) {}
  144.   explicit Vector4(const Vector3& xyz, float w) : x(xyz.x), y(xyz.y), z(xyz.z), w(w) {}
  145.   explicit Vector4(float x, float y, float z, float w) : x(x), y(y), z(z), w(w) {}
  146.  
  147.   inline Vector3 XYZ() const { return Vector3(x, y, z); }
  148.   inline Vector3 XYZNormalized() const { return Vector3(x, y, z).Normalized(); }
  149.   inline Vector3 Homogenized() const { return Vector3(x/w, y/w, z/w); }
  150.  
  151.   inline Vector4 operator*(float b) const {
  152.     return Vector4(x * b, y * b, z * b, w * b);
  153.   }
  154.   inline Vector4 operator/(float b) const {
  155.     return Vector4(x / b, y / b, z / b, w / b);
  156.   }
  157.   inline void operator*=(float b) {
  158.     x *= b; y *= b; z *= b; w *= b;
  159.   }
  160.   inline void operator/=(float b) {
  161.     x /= b; y /= b; z /= b; w /= b;
  162.   }
  163.  
  164.   inline float Dot(const Vector4& b) const { return x*b.x + y*b.y + z*b.z + w*b.w; }
  165.  
  166.   //Components
  167.   float x, y, z, w;
  168. };
  169.  
  170. class Matrix4 {
  171. public:
  172.   //Constructors
  173.   Matrix4() {}
  174.   explicit Matrix4(float b) { Fill(b); }
  175.  
  176.   //General
  177.   inline void Fill(float b) {
  178.     std::fill(m, m + 16, b);
  179.   }
  180.   inline void MakeZero() {
  181.     Fill(0.0f);
  182.   }
  183.   inline void MakeIdentity() {
  184.     m[0]  = 1.0f; m[1]  = 0.0f; m[2]  = 0.0f; m[3]  = 0.0f;
  185.     m[4]  = 0.0f; m[5]  = 1.0f; m[6]  = 0.0f; m[7]  = 0.0f;
  186.     m[8]  = 0.0f; m[9]  = 0.0f; m[10] = 1.0f; m[11] = 0.0f;
  187.     m[12] = 0.0f; m[13] = 0.0f; m[14] = 0.0f; m[15] = 1.0f;
  188.   }
  189.   inline void MakeRotX(float a) {
  190.     m[0] =  1.0f; m[1]  = 0.0f;        m[2]  = 0.0f;         m[3]  = 0.0f;
  191.     m[4] =  0.0f; m[5]  = std::cos(a); m[6]  = -std::sin(a); m[7]  = 0.0f;
  192.     m[8] =  0.0f; m[9]  = std::sin(a); m[10] = std::cos(a);  m[11] = 0.0f;
  193.     m[12] = 0.0f; m[13] = 0.0f;        m[14] = 0.0f;         m[15] = 1.0f;
  194.   }
  195.   inline void MakeRotY(float a) {
  196.     m[0]  = std::cos(a);  m[1]  = 0.0f; m[2]  = std::sin(a); m[3]  = 0.0f;
  197.     m[4]  = 0.0f;         m[5]  = 1.0f; m[6]  = 0.0f;        m[7]  = 0.0f;
  198.     m[8]  = -std::sin(a); m[9]  = 0.0f; m[10] = std::cos(a); m[11] = 0.0f;
  199.     m[12] = 0.0f;         m[13] = 0.0f; m[14] = 0.0f;        m[15] = 1.0f;
  200.   }
  201.   inline void MakeRotZ(float a) {
  202.     m[0]  = std::cos(a); m[1]  = -std::sin(a); m[2]  = 0.0f; m[3]  = 0.0f;
  203.     m[4]  = std::sin(a); m[5]  = std::cos(a);  m[6]  = 0.0f; m[7]  = 0.0f;
  204.     m[8]  = 0.0f;        m[9]  = 0.0f;         m[10] = 1.0f; m[11] = 0.0f;
  205.     m[12] = 0.0f;        m[13] = 0.0f;         m[14] = 0.0f; m[15] = 1.0f;
  206.   }
  207.   inline void MakeTrans(const Vector3& t) {
  208.     m[0]  = 1.0f; m[1]  = 0.0f; m[2]  = 0.0f; m[3]  = t.x;
  209.     m[4]  = 0.0f; m[5]  = 1.0f; m[6]  = 0.0f; m[7]  = t.y;
  210.     m[8]  = 0.0f; m[9]  = 0.0f; m[10] = 1.0f; m[11] = t.z;
  211.     m[12] = 0.0f; m[13] = 0.0f; m[14] = 0.0f; m[15] = 1.0f;
  212.   }
  213.   inline void MakeScale(const Vector3& s) {
  214.     m[0]  = s.x;  m[1]  = 0.0f; m[2]  = 0.0f; m[3]  = 0.0f;
  215.     m[4]  = 0.0f; m[5]  = s.y;  m[6]  = 0.0f; m[7]  = 0.0f;
  216.     m[8]  = 0.0f; m[9]  = 0.0f; m[10] = s.z;  m[11] = 0.0f;
  217.     m[12] = 0.0f; m[13] = 0.0f; m[14] = 0.0f; m[15] = 1.0f;
  218.   }
  219.  
  220.   //Statics
  221.   inline static Matrix4 Zero() { Matrix4 m; m.MakeZero(); return m; }
  222.   inline static Matrix4 Identity() { Matrix4 m; m.MakeIdentity(); return m; }
  223.   inline static Matrix4 RotX(float a) { Matrix4 m; m.MakeRotX(a); return m; }
  224.   inline static Matrix4 RotY(float a) { Matrix4 m; m.MakeRotY(a); return m; }
  225.   inline static Matrix4 RotZ(float a) { Matrix4 m; m.MakeRotZ(a); return m; }
  226.   inline static Matrix4 Trans(const Vector3& t) { Matrix4 m; m.MakeTrans(t); return m; }
  227.   inline static Matrix4 Scale(float s) { Matrix4 m; m.MakeScale(Vector3(s)); return m; }
  228.   inline static Matrix4 Scale(const Vector3& s) { Matrix4 m; m.MakeScale(s); return m; }
  229.  
  230.   //Some getters
  231.   inline Vector3 XAxis() const {
  232.     return Vector3(m[0], m[4], m[8]);
  233.   }
  234.   inline Vector3 YAxis() const {
  235.     return Vector3(m[1], m[5], m[9]);
  236.   }
  237.   inline Vector3 ZAxis() const {
  238.     return Vector3(m[2], m[6], m[10]);
  239.   }
  240.   inline Vector3 Translation() const {
  241.     return Vector3(m[3], m[7], m[11]);
  242.   }
  243.   inline Vector3 Scale() const {
  244.     return Vector3(m[0], m[5], m[10]);
  245.   }
  246.  
  247.   //Setters
  248.   inline void SetTranslation(const Vector3& t) {
  249.     m[3] = t.x;
  250.     m[7] = t.y;
  251.     m[11] = t.z;
  252.   }
  253.   inline void SetXAxis(const Vector3& t) {
  254.     m[0] = t.x;
  255.     m[4] = t.y;
  256.     m[8] = t.z;
  257.   }
  258.   inline void SetYAxis(const Vector3& t) {
  259.     m[1] = t.x;
  260.     m[5] = t.y;
  261.     m[9] = t.z;
  262.   }
  263.   inline void SetZAxis(const Vector3& t) {
  264.     m[2] = t.x;
  265.     m[6] = t.y;
  266.     m[10] = t.z;
  267.   }
  268.   inline void SetScale(const Vector3& s) {
  269.     m[0] = s.x;
  270.     m[5] = s.y;
  271.     m[10] = s.z;
  272.   }
  273.  
  274.   //Transformations
  275.   inline Matrix4 Transposed() const {
  276.     Matrix4 out;
  277.     out.m[0]  = m[0]; out.m[1]  = m[4]; out.m[2]  = m[8];  out.m[3]  = m[12];
  278.     out.m[4]  = m[1]; out.m[5]  = m[5]; out.m[6]  = m[9];  out.m[7]  = m[13];
  279.     out.m[8]  = m[2]; out.m[9]  = m[6]; out.m[10] = m[10]; out.m[11] = m[14];
  280.     out.m[12] = m[3]; out.m[13] = m[7]; out.m[14] = m[11]; out.m[15] = m[15];
  281.     return out;
  282.   }
  283.   inline void Translate(const Vector3& t) {
  284.     m[3] += t.x;
  285.     m[7] += t.y;
  286.     m[11] += t.z;
  287.   }
  288.   inline void Stretch(const Vector3& s) {
  289.     m[0] *= s.x;
  290.     m[5] *= s.y;
  291.     m[10] *= s.z;
  292.   }
  293.  
  294.   //Basic operatios
  295.   inline Matrix4 operator+(const Matrix4& b) const {
  296.     Matrix4 out;
  297.     for (int i = 0; i < 16; ++i) { out.m[i] = m[i] + b.m[i]; }
  298.     return out;
  299.   }
  300.   inline Matrix4 operator-(const Matrix4& b) const {
  301.     Matrix4 out;
  302.     for (int i = 0; i < 16; ++i) { out.m[i] = m[i] - b.m[i]; }
  303.     return out;
  304.   }
  305.   inline void operator+=(const Matrix4& b) {
  306.     for (int i = 0; i < 16; ++i) { m[i] += b.m[i]; }
  307.   }
  308.   inline void operator-=(const Matrix4& b) {
  309.     for (int i = 0; i < 16; ++i) { m[i] -= b.m[i]; }
  310.   }
  311.   inline void operator*=(float b) {
  312.     for (int i = 0; i < 16; ++i) { m[i] *= b; }
  313.   }
  314.   inline void operator/=(float b) {
  315.     operator*=(1.0f / b);
  316.   }
  317.  
  318.   //Multiplication
  319.   Matrix4 operator*(const Matrix4& b) const {
  320.     Matrix4 out;
  321.     out.m[0]  = b.m[0]*m[0]  + b.m[4]*m[1]  + b.m[8] *m[2]  + b.m[12]*m[3];
  322.     out.m[1]  = b.m[1]*m[0]  + b.m[5]*m[1]  + b.m[9] *m[2]  + b.m[13]*m[3];
  323.     out.m[2]  = b.m[2]*m[0]  + b.m[6]*m[1]  + b.m[10]*m[2]  + b.m[14]*m[3];
  324.     out.m[3]  = b.m[3]*m[0]  + b.m[7]*m[1]  + b.m[11]*m[2]  + b.m[15]*m[3];
  325.  
  326.     out.m[4]  = b.m[0]*m[4]  + b.m[4]*m[5]  + b.m[8] *m[6]  + b.m[12]*m[7];
  327.     out.m[5]  = b.m[1]*m[4]  + b.m[5]*m[5]  + b.m[9] *m[6]  + b.m[13]*m[7];
  328.     out.m[6]  = b.m[2]*m[4]  + b.m[6]*m[5]  + b.m[10]*m[6]  + b.m[14]*m[7];
  329.     out.m[7]  = b.m[3]*m[4]  + b.m[7]*m[5]  + b.m[11]*m[6]  + b.m[15]*m[7];
  330.  
  331.     out.m[8]  = b.m[0]*m[8]  + b.m[4]*m[9]  + b.m[8] *m[10] + b.m[12]*m[11];
  332.     out.m[9]  = b.m[1]*m[8]  + b.m[5]*m[9]  + b.m[9] *m[10] + b.m[13]*m[11];
  333.     out.m[10] = b.m[2]*m[8]  + b.m[6]*m[9]  + b.m[10]*m[10] + b.m[14]*m[11];
  334.     out.m[11] = b.m[3]*m[8]  + b.m[7]*m[9]  + b.m[11]*m[10] + b.m[15]*m[11];
  335.  
  336.     out.m[12] = b.m[0]*m[12] + b.m[4]*m[13] + b.m[8] *m[14] + b.m[12]*m[15];
  337.     out.m[13] = b.m[1]*m[12] + b.m[5]*m[13] + b.m[9] *m[14] + b.m[13]*m[15];
  338.     out.m[14] = b.m[2]*m[12] + b.m[6]*m[13] + b.m[10]*m[14] + b.m[14]*m[15];
  339.     out.m[15] = b.m[3]*m[12] + b.m[7]*m[13] + b.m[11]*m[14] + b.m[15]*m[15];
  340.     return out;
  341.   }
  342.   void operator*=(const Matrix4& b) {
  343.     (*this) = operator*(b);
  344.   }
  345.   Vector4 operator*(const Vector4& b) const {
  346.     return Vector4(
  347.       m[0]*b.x  + m[1]*b.y  + m[2]*b.z  + m[3]*b.w,
  348.       m[4]*b.x  + m[5]*b.y  + m[6]*b.z  + m[7]*b.w,
  349.       m[8]*b.x  + m[9]*b.y  + m[10]*b.z + m[11]*b.w,
  350.       m[12]*b.x + m[13]*b.y + m[14]*b.z + m[15]*b.w
  351.     );
  352.   }
  353.   Vector3 MulPoint(const Vector3& b) const {
  354.     const Vector3 p(
  355.       m[0] * b.x + m[1] * b.y + m[2] * b.z + m[3],
  356.       m[4] * b.x + m[5] * b.y + m[6] * b.z + m[7],
  357.       m[8] * b.x + m[9] * b.y + m[10] * b.z + m[11]
  358.     );
  359.     const float w = m[12] * b.x + m[13] * b.y + m[14] * b.z + m[15];
  360.     return p / w;
  361.   }
  362.   Vector3 MulDirection(const Vector3& b) const {
  363.     return Vector3(
  364.       m[0] * b.x + m[1] * b.y + m[2] * b.z,
  365.       m[4] * b.x + m[5] * b.y + m[6] * b.z,
  366.       m[8] * b.x + m[9] * b.y + m[10] * b.z
  367.     );
  368.   }
  369.  
  370.   //Inverse
  371.   Matrix4 Inverse() const {
  372.     Matrix4 inv;
  373.  
  374.     inv.m[0] = m[5] * m[10] * m[15] -
  375.       m[5] * m[11] * m[14] -
  376.       m[9] * m[6] * m[15] +
  377.       m[9] * m[7] * m[14] +
  378.       m[13] * m[6] * m[11] -
  379.       m[13] * m[7] * m[10];
  380.  
  381.     inv.m[4] = -m[4] * m[10] * m[15] +
  382.       m[4] * m[11] * m[14] +
  383.       m[8] * m[6] * m[15] -
  384.       m[8] * m[7] * m[14] -
  385.       m[12] * m[6] * m[11] +
  386.       m[12] * m[7] * m[10];
  387.  
  388.     inv.m[8] = m[4] * m[9] * m[15] -
  389.       m[4] * m[11] * m[13] -
  390.       m[8] * m[5] * m[15] +
  391.       m[8] * m[7] * m[13] +
  392.       m[12] * m[5] * m[11] -
  393.       m[12] * m[7] * m[9];
  394.  
  395.     inv.m[12] = -m[4] * m[9] * m[14] +
  396.       m[4] * m[10] * m[13] +
  397.       m[8] * m[5] * m[14] -
  398.       m[8] * m[6] * m[13] -
  399.       m[12] * m[5] * m[10] +
  400.       m[12] * m[6] * m[9];
  401.  
  402.     inv.m[1] = -m[1] * m[10] * m[15] +
  403.       m[1] * m[11] * m[14] +
  404.       m[9] * m[2] * m[15] -
  405.       m[9] * m[3] * m[14] -
  406.       m[13] * m[2] * m[11] +
  407.       m[13] * m[3] * m[10];
  408.  
  409.     inv.m[5] = m[0] * m[10] * m[15] -
  410.       m[0] * m[11] * m[14] -
  411.       m[8] * m[2] * m[15] +
  412.       m[8] * m[3] * m[14] +
  413.       m[12] * m[2] * m[11] -
  414.       m[12] * m[3] * m[10];
  415.  
  416.     inv.m[9] = -m[0] * m[9] * m[15] +
  417.       m[0] * m[11] * m[13] +
  418.       m[8] * m[1] * m[15] -
  419.       m[8] * m[3] * m[13] -
  420.       m[12] * m[1] * m[11] +
  421.       m[12] * m[3] * m[9];
  422.  
  423.     inv.m[13] = m[0] * m[9] * m[14] -
  424.       m[0] * m[10] * m[13] -
  425.       m[8] * m[1] * m[14] +
  426.       m[8] * m[2] * m[13] +
  427.       m[12] * m[1] * m[10] -
  428.       m[12] * m[2] * m[9];
  429.  
  430.     inv.m[2] = m[1] * m[6] * m[15] -
  431.       m[1] * m[7] * m[14] -
  432.       m[5] * m[2] * m[15] +
  433.       m[5] * m[3] * m[14] +
  434.       m[13] * m[2] * m[7] -
  435.       m[13] * m[3] * m[6];
  436.  
  437.     inv.m[6] = -m[0] * m[6] * m[15] +
  438.       m[0] * m[7] * m[14] +
  439.       m[4] * m[2] * m[15] -
  440.       m[4] * m[3] * m[14] -
  441.       m[12] * m[2] * m[7] +
  442.       m[12] * m[3] * m[6];
  443.  
  444.     inv.m[10] = m[0] * m[5] * m[15] -
  445.       m[0] * m[7] * m[13] -
  446.       m[4] * m[1] * m[15] +
  447.       m[4] * m[3] * m[13] +
  448.       m[12] * m[1] * m[7] -
  449.       m[12] * m[3] * m[5];
  450.  
  451.     inv.m[14] = -m[0] * m[5] * m[14] +
  452.       m[0] * m[6] * m[13] +
  453.       m[4] * m[1] * m[14] -
  454.       m[4] * m[2] * m[13] -
  455.       m[12] * m[1] * m[6] +
  456.       m[12] * m[2] * m[5];
  457.  
  458.     inv.m[3] = -m[1] * m[6] * m[11] +
  459.       m[1] * m[7] * m[10] +
  460.       m[5] * m[2] * m[11] -
  461.       m[5] * m[3] * m[10] -
  462.       m[9] * m[2] * m[7] +
  463.       m[9] * m[3] * m[6];
  464.  
  465.     inv.m[7] = m[0] * m[6] * m[11] -
  466.       m[0] * m[7] * m[10] -
  467.       m[4] * m[2] * m[11] +
  468.       m[4] * m[3] * m[10] +
  469.       m[8] * m[2] * m[7] -
  470.       m[8] * m[3] * m[6];
  471.  
  472.     inv.m[11] = -m[0] * m[5] * m[11] +
  473.       m[0] * m[7] * m[9] +
  474.       m[4] * m[1] * m[11] -
  475.       m[4] * m[3] * m[9] -
  476.       m[8] * m[1] * m[7] +
  477.       m[8] * m[3] * m[5];
  478.  
  479.     inv.m[15] = m[0] * m[5] * m[10] -
  480.       m[0] * m[6] * m[9] -
  481.       m[4] * m[1] * m[10] +
  482.       m[4] * m[2] * m[9] +
  483.       m[8] * m[1] * m[6] -
  484.       m[8] * m[2] * m[5];
  485.  
  486.     const float det = m[0] * inv.m[0] + m[1] * inv.m[4] + m[2] * inv.m[8] + m[3] * inv.m[12];
  487.     inv /= det;
  488.     return inv;
  489.   }
  490.  
  491.   //Components
  492.   float m[16];
  493. };
  494.  
  495. //Debug printing
  496. inline std::ostream& operator<<(std::ostream& out, const Vector3& v) {
  497.   out << v.x << ", " << v.y << ", " << v.z;
  498.   return out;
  499. }
  500. inline std::ostream& operator<<(std::ostream& out, const Vector4& v) {
  501.   out << v.x << ", " << v.y << ", " << v.z << ", " << v.w;
  502.   return out;
  503. }
  504. inline std::ostream& operator<<(std::ostream& out, const Matrix4& m) {
  505.   out << m.m[0]  << ", " << m.m[1]  << ", " << m.m[2]  << ", " << m.m[3] << "\n";
  506.   out << m.m[4]  << ", " << m.m[5]  << ", " << m.m[6]  << ", " << m.m[7] << "\n";
  507.   out << m.m[8]  << ", " << m.m[9]  << ", " << m.m[10] << ", " << m.m[11] << "\n";
  508.   out << m.m[12] << ", " << m.m[13] << ", " << m.m[14] << ", " << m.m[15];
  509.   return out;
  510. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement