vecmat.h 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. #ifndef COMMON_VECMAT_H
  2. #define COMMON_VECMAT_H
  3. #include <array>
  4. #include <cmath>
  5. #include <cstddef>
  6. #include <limits>
  7. namespace alu {
  8. class Vector {
  9. alignas(16) std::array<float,4> mVals;
  10. public:
  11. Vector() noexcept = default;
  12. constexpr Vector(float a, float b, float c, float d) noexcept
  13. : mVals{{a, b, c, d}}
  14. { }
  15. float& operator[](size_t idx) noexcept { return mVals[idx]; }
  16. constexpr const float& operator[](size_t idx) const noexcept { return mVals[idx]; }
  17. Vector& operator+=(const Vector &rhs) noexcept
  18. {
  19. mVals[0] += rhs.mVals[0];
  20. mVals[1] += rhs.mVals[1];
  21. mVals[2] += rhs.mVals[2];
  22. mVals[3] += rhs.mVals[3];
  23. return *this;
  24. }
  25. float normalize()
  26. {
  27. const float length{std::sqrt(mVals[0]*mVals[0] + mVals[1]*mVals[1] + mVals[2]*mVals[2])};
  28. if(length > std::numeric_limits<float>::epsilon())
  29. {
  30. float inv_length = 1.0f/length;
  31. mVals[0] *= inv_length;
  32. mVals[1] *= inv_length;
  33. mVals[2] *= inv_length;
  34. return length;
  35. }
  36. mVals[0] = mVals[1] = mVals[2] = 0.0f;
  37. return 0.0f;
  38. }
  39. };
  40. class Matrix {
  41. alignas(16) std::array<std::array<float,4>,4> mVals;
  42. public:
  43. Matrix() noexcept = default;
  44. constexpr Matrix(float aa, float ab, float ac, float ad,
  45. float ba, float bb, float bc, float bd,
  46. float ca, float cb, float cc, float cd,
  47. float da, float db, float dc, float dd) noexcept
  48. : mVals{{{{aa, ab, ac, ad}}, {{ba, bb, bc, bd}}, {{ca, cb, cc, cd}}, {{da, db, dc, dd}}}}
  49. { }
  50. std::array<float,4>& operator[](size_t idx) noexcept { return mVals[idx]; }
  51. constexpr const std::array<float,4>& operator[](size_t idx) const noexcept { return mVals[idx]; }
  52. void setRow(size_t idx, float a, float b, float c, float d) noexcept
  53. {
  54. mVals[idx][0] = a;
  55. mVals[idx][1] = b;
  56. mVals[idx][2] = c;
  57. mVals[idx][3] = d;
  58. }
  59. static const Matrix &Identity() noexcept
  60. {
  61. static constexpr Matrix identity{
  62. 1.0f, 0.0f, 0.0f, 0.0f,
  63. 0.0f, 1.0f, 0.0f, 0.0f,
  64. 0.0f, 0.0f, 1.0f, 0.0f,
  65. 0.0f, 0.0f, 0.0f, 1.0f
  66. };
  67. return identity;
  68. }
  69. };
  70. } // namespace alu
  71. #endif /* COMMON_VECMAT_H */