A 2D tile-based sandbox game.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

Matrix3.h 1.7KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. #pragma once
  2. #include <iostream>
  3. #include <cmath>
  4. #include <array>
  5. #include "Vector2.h"
  6. namespace SwanCommon {
  7. template<typename T>
  8. struct Matrix3 {
  9. using Vec = Vector2<T>;
  10. static constexpr std::array<T, 9> identity = {1, 0, 0, 0, 1, 0, 0, 0, 1};
  11. std::array<T, 9> vals;
  12. constexpr Matrix3(): vals(identity) {}
  13. constexpr T *data() {
  14. return vals.data();
  15. }
  16. constexpr const T *data() const {
  17. return vals.data();
  18. }
  19. constexpr T &at(int x, int y) {
  20. return vals[y * 3 + x];
  21. }
  22. constexpr const T &at(int x, int y) const {
  23. return vals[y * 3 + x];
  24. }
  25. constexpr Matrix3<T> &set(std::initializer_list<T> vals) {
  26. this->vals = vals;
  27. return *this;
  28. }
  29. constexpr Matrix3<T> &reset() {
  30. vals = identity;
  31. return *this;
  32. }
  33. constexpr Matrix3<T> &translate(Vec vec) {
  34. at(2, 0) += vec.x;
  35. at(2, 1) += vec.y;
  36. return *this;
  37. }
  38. constexpr Matrix3<T> &scale(Vec vec) {
  39. at(0, 0) *= vec.x;
  40. at(1, 1) *= vec.y;
  41. return *this;
  42. }
  43. constexpr Matrix3<T> &rotate(T rads) {
  44. T s = std::sin(rads);
  45. T c = std::cos(rads);
  46. at(0, 0) += c;
  47. at(1, 0) -= s;
  48. at(0, 1) += s;
  49. at(1, 1) += c;
  50. return *this;
  51. }
  52. static const Matrix3<T> IDENTITY;
  53. template<typename U>
  54. friend std::ostream &operator<<(std::ostream &os, const Matrix3<U> &mat);
  55. };
  56. template<typename T>
  57. const Matrix3<T> Matrix3<T>::IDENTITY = Matrix3<T>();
  58. template<typename T>
  59. std::ostream &operator<<(std::ostream &os, const Matrix3<T> &mat) {
  60. os << '('
  61. << '(' << mat.at(0, 0) << ", " << mat.at(1, 0) << ", " << mat.at(2, 0) << "), "
  62. << '(' << mat.at(0, 1) << ", " << mat.at(1, 1) << ", " << mat.at(2, 1) << "), "
  63. << '(' << mat.at(0, 2) << ", " << mat.at(1, 2) << ", " << mat.at(2, 2) << "))";
  64. return os;
  65. }
  66. }