A 2D tile-based sandbox game.
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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 Matrix3(const Matrix3 &mat): vals(mat.vals) {}
  14. constexpr Matrix3 &operator=(const Matrix3 &mat) { vals = mat.vals; }
  15. constexpr T *data() {
  16. return vals.data();
  17. }
  18. constexpr const T *data() const {
  19. return vals.data();
  20. }
  21. constexpr T &at(int x, int y) {
  22. return vals[y * 3 + x];
  23. }
  24. constexpr const T &at(int x, int y) const {
  25. return vals[y * 3 + x];
  26. }
  27. constexpr Matrix3<T> &set(std::initializer_list<T> vals) {
  28. this->vals = vals;
  29. return *this;
  30. }
  31. constexpr Matrix3<T> &reset() {
  32. vals = identity;
  33. return *this;
  34. }
  35. constexpr Matrix3<T> &translate(Vec vec) {
  36. at(2, 0) += vec.x;
  37. at(2, 1) += vec.y;
  38. return *this;
  39. }
  40. constexpr Vec translation() {
  41. return {at(2, 0), at(2, 1)};
  42. }
  43. constexpr Matrix3<T> &scale(Vec vec) {
  44. at(0, 0) *= vec.x;
  45. at(1, 1) *= vec.y;
  46. return *this;
  47. }
  48. constexpr Vec scale() {
  49. return {at(0, 0), at(1, 1)};
  50. }
  51. constexpr Matrix3<T> &rotate(T rads) {
  52. T s = std::sin(rads);
  53. T c = std::cos(rads);
  54. at(0, 0) += c;
  55. at(1, 0) -= s;
  56. at(0, 1) += s;
  57. at(1, 1) += c;
  58. return *this;
  59. }
  60. static const Matrix3<T> IDENTITY;
  61. template<typename U>
  62. friend std::ostream &operator<<(std::ostream &os, const Matrix3<U> &mat);
  63. };
  64. template<typename T>
  65. const Matrix3<T> Matrix3<T>::IDENTITY = Matrix3<T>();
  66. template<typename T>
  67. std::ostream &operator<<(std::ostream &os, const Matrix3<T> &mat) {
  68. os << '('
  69. << '(' << mat.at(0, 0) << ", " << mat.at(1, 0) << ", " << mat.at(2, 0) << "), "
  70. << '(' << mat.at(0, 1) << ", " << mat.at(1, 1) << ", " << mat.at(2, 1) << "), "
  71. << '(' << mat.at(0, 2) << ", " << mat.at(1, 2) << ", " << mat.at(2, 2) << "))";
  72. return os;
  73. }
  74. }