Simulant  21.12-194
A portable game engine for Windows, OSX, Linux, Dreamcast, and PSP
mat3.h
1 #pragma once
2 
3 #include <array>
4 #include <cstdint>
5 
6 namespace smlt {
7 
8 struct Mat4;
9 struct Degrees;
10 struct Vec3;
11 struct Quaternion;
12 
13 struct Mat3 {
14 private:
15  std::array<float, 9> m;
16 
17 public:
18  static Mat3 from_rotation_x(const Degrees& angle);
19  static Mat3 from_rotation_y(const Degrees& angle);
20  static Mat3 from_rotation_z(const Degrees& angle);
21 
22  Mat3() {
23  m.fill(0);
24  m[0] = m[4] = m[8] = 1.0f;
25  }
26 
27  Mat3(const float* data) {
28  for(std::size_t i = 0; i < 9; ++i) {
29  m[i] = data[i];
30  }
31  }
32 
33  Mat3(const Mat4& rhs);
34  Mat3(const Quaternion& q);
35  Mat3(const Vec3& c0, const Vec3& c1, const Vec3& c2);
36 
37  const float& operator[](const uint32_t index) const {
38  return m[index];
39  }
40 
41  const float& operator[](const int index) const{
42  return m[index];
43  }
44 
45  float& operator[](const uint32_t index) {
46  return m[index];
47  }
48 
49  float& operator[](const int index) {
50  return m[index];
51  }
52 
53  Vec3 transform_vector(const Vec3& v) const;
54 
55  const float* data() const {
56  return &m[0];
57  }
58 
59  void inverse();
60 
61  Mat3 inversed() const {
62  Mat3 ret = *this;
63  ret.inverse();
64  return ret;
65  }
66 
67  void transpose() {
68  std::swap(m[1], m[3]);
69  std::swap(m[2], m[6]);
70  std::swap(m[5], m[7]);
71  }
72 
73  Mat3 transposed() const {
74  Mat3 ret = *this;
75  ret.transpose();
76  return ret;
77  }
78 
79  float determinant() const;
80  Mat3 adjugate() const;
81 
82  Mat3& operator*=(const float rhs) {
83  for(std::size_t i = 0; i < 9; ++i) {
84  m[i] *= rhs;
85  }
86 
87  return *this;
88  }
89 
90  Mat3 operator*(const float rhs) const {
91  return Mat3(*this) *= rhs;
92  }
93 
94 };
95 
96 
97 }
smlt::Mat4
Definition: mat4.h:25
smlt::Vec3
Definition: vec3.h:23
smlt::Quaternion
Definition: quaternion.h:24
smlt::Mat3
Definition: mat3.h:13
smlt
Definition: animation.cpp:25
smlt::Degrees
Definition: degrees.h:7