#ifndef COMMON_VECMAT_H
|
|
#define COMMON_VECMAT_H
|
|
|
|
#include <cmath>
|
|
#include <array>
|
|
#include <limits>
|
|
#include <algorithm>
|
|
|
|
#include "math_defs.h"
|
|
|
|
namespace alu {
|
|
|
|
class Vector {
|
|
alignas(16) std::array<float,4> mVals{};
|
|
|
|
public:
|
|
constexpr Vector() noexcept = default;
|
|
constexpr Vector(float a, float b, float c, float d) noexcept
|
|
: mVals{{a, b, c, d}}
|
|
{ }
|
|
Vector(const Vector &rhs) noexcept
|
|
{ std::copy(rhs.mVals.begin(), rhs.mVals.end(), mVals.begin()); }
|
|
|
|
Vector& operator=(const Vector &rhs) noexcept
|
|
{
|
|
std::copy(rhs.mVals.begin(), rhs.mVals.end(), mVals.begin());
|
|
return *this;
|
|
}
|
|
|
|
float& operator[](size_t idx) noexcept { return mVals[idx]; }
|
|
constexpr const float& operator[](size_t idx) const noexcept { return mVals[idx]; }
|
|
|
|
Vector& operator+=(const Vector &rhs) noexcept
|
|
{
|
|
mVals[0] += rhs.mVals[0];
|
|
mVals[1] += rhs.mVals[1];
|
|
mVals[2] += rhs.mVals[2];
|
|
mVals[3] += rhs.mVals[3];
|
|
return *this;
|
|
}
|
|
|
|
float normalize()
|
|
{
|
|
const float length{std::sqrt(mVals[0]*mVals[0] + mVals[1]*mVals[1] + mVals[2]*mVals[2])};
|
|
if(length > std::numeric_limits<float>::epsilon())
|
|
{
|
|
float inv_length = 1.0f/length;
|
|
mVals[0] *= inv_length;
|
|
mVals[1] *= inv_length;
|
|
mVals[2] *= inv_length;
|
|
return length;
|
|
}
|
|
mVals[0] = mVals[1] = mVals[2] = 0.0f;
|
|
return 0.0f;
|
|
}
|
|
};
|
|
|
|
class Matrix {
|
|
alignas(16) std::array<std::array<float,4>,4> mVals{};
|
|
|
|
public:
|
|
constexpr Matrix() noexcept = default;
|
|
constexpr Matrix(float aa, float ab, float ac, float ad,
|
|
float ba, float bb, float bc, float bd,
|
|
float ca, float cb, float cc, float cd,
|
|
float da, float db, float dc, float dd) noexcept
|
|
: mVals{{{{aa, ab, ac, ad}}, {{ba, bb, bc, bd}}, {{ca, cb, cc, cd}}, {{da, db, dc, dd}}}}
|
|
{ }
|
|
Matrix(const Matrix &rhs) noexcept
|
|
{ std::copy(rhs.mVals.begin(), rhs.mVals.end(), mVals.begin()); }
|
|
|
|
Matrix& operator=(const Matrix &rhs) noexcept
|
|
{
|
|
std::copy(rhs.mVals.begin(), rhs.mVals.end(), mVals.begin());
|
|
return *this;
|
|
}
|
|
|
|
std::array<float,4>& operator[](size_t idx) noexcept { return mVals[idx]; }
|
|
constexpr const std::array<float,4>& operator[](size_t idx) const noexcept { return mVals[idx]; }
|
|
|
|
void setRow(size_t idx, float a, float b, float c, float d) noexcept
|
|
{
|
|
mVals[idx][0] = a;
|
|
mVals[idx][1] = b;
|
|
mVals[idx][2] = c;
|
|
mVals[idx][3] = d;
|
|
}
|
|
|
|
static const Matrix &Identity() noexcept
|
|
{
|
|
static constexpr Matrix identity{
|
|
1.0f, 0.0f, 0.0f, 0.0f,
|
|
0.0f, 1.0f, 0.0f, 0.0f,
|
|
0.0f, 0.0f, 1.0f, 0.0f,
|
|
0.0f, 0.0f, 0.0f, 1.0f
|
|
};
|
|
return identity;
|
|
}
|
|
};
|
|
|
|
} // namespace alu
|
|
|
|
#endif /* COMMON_VECMAT_H */
|