add maths utils
This commit is contained in:
@@ -15,7 +15,6 @@ struct Vec2 {
|
|||||||
};
|
};
|
||||||
|
|
||||||
constexpr Vec2(T X = 0, T Y = 0) : x(X), y(Y) {}
|
constexpr Vec2(T X = 0, T Y = 0) : x(X), y(Y) {}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
@@ -48,6 +47,37 @@ inline bool operator==(const Vec3<T>& vec3, const Vec3<T>& other) {
|
|||||||
return vec3.x == other.x && vec3.y == other.y && vec3.z == other.z;
|
return vec3.x == other.x && vec3.y == other.y && vec3.z == other.z;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
struct Vec4 {
|
||||||
|
union {
|
||||||
|
T x;
|
||||||
|
T r;
|
||||||
|
};
|
||||||
|
|
||||||
|
union {
|
||||||
|
T y;
|
||||||
|
T g;
|
||||||
|
};
|
||||||
|
|
||||||
|
union {
|
||||||
|
T z;
|
||||||
|
T b;
|
||||||
|
};
|
||||||
|
|
||||||
|
union {
|
||||||
|
T w;
|
||||||
|
T a;
|
||||||
|
};
|
||||||
|
|
||||||
|
constexpr Vec4(Vec3<T> vec, T W = 1) : x(vec.x), y(vec.y), z(vec.z), w(W) {}
|
||||||
|
constexpr Vec4(T X = 0, T Y = 0, T Z = 0, T W = 0) : x(X), y(Y), z(Z), w(W) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline bool operator==(const Vec4<T>& vec4, const Vec4<T>& other) {
|
||||||
|
return vec4.x == other.x && vec4.y == other.y && vec4.z == other.z && vec4.w = other.w;
|
||||||
|
}
|
||||||
|
|
||||||
using Vec2i = Vec2<int>;
|
using Vec2i = Vec2<int>;
|
||||||
using Vec2u = Vec2<unsigned int>;
|
using Vec2u = Vec2<unsigned int>;
|
||||||
using Vec2f = Vec2<float>;
|
using Vec2f = Vec2<float>;
|
||||||
@@ -58,6 +88,11 @@ using Vec3u = Vec3<unsigned int>;
|
|||||||
using Vec3f = Vec3<float>;
|
using Vec3f = Vec3<float>;
|
||||||
using Vec3d = Vec3<double>;
|
using Vec3d = Vec3<double>;
|
||||||
|
|
||||||
|
using Vec4i = Vec4<int>;
|
||||||
|
using Vec4u = Vec4<unsigned int>;
|
||||||
|
using Vec4f = Vec4<float>;
|
||||||
|
using Vec4d = Vec4<double>;
|
||||||
|
|
||||||
using Color = Vec3<unsigned char>;
|
using Color = Vec3<unsigned char>;
|
||||||
|
|
||||||
} // namespace td
|
} // namespace td
|
||||||
|
|||||||
113
include/misc/Maths.h
Normal file
113
include/misc/Maths.h
Normal file
@@ -0,0 +1,113 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "Defines.h"
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
|
namespace td {
|
||||||
|
namespace maths {
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////
|
||||||
|
// Vectors //
|
||||||
|
//////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
Vec3<T> operator- (const Vec3<T>& vect) {
|
||||||
|
return { -vect.x, -vect.y, -vect.z };
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
Vec3<T> operator+ (const Vec3<T>& vect, const Vec3<T>& other) {
|
||||||
|
return { vect.x + other.x, vect.y + other.y, vect.z + other.y };
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
Vec3<T> operator- (const Vec3<T>& vect, const Vec3<T>& other) {
|
||||||
|
return vect + (-other);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
Vec3<T> Normalize(const Vec3<T>& vect) {
|
||||||
|
T length = std::sqrt(vect.x * vect.x + vect.y * vect.y + vect.z * vect.z);
|
||||||
|
|
||||||
|
return { vect.x / length, vect.y / length, vect.z / length };
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
T Dot(const Vec3<T>& vect, const Vec3<T>& other) {
|
||||||
|
return vect.x * other.x + vect.y * other.y + vect.z * other.z;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
Vec3<T> Cross(const Vec3<T>& vect, const Vec3<T>& other) {
|
||||||
|
return {
|
||||||
|
vect.y * other.z - vect.z * other.y,
|
||||||
|
vect.z * other.x - vect.x * other.z,
|
||||||
|
vect.x * other.y - vect.y * other.x,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////
|
||||||
|
// Matricies //
|
||||||
|
//////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
struct Mat4 {
|
||||||
|
T x0, x1, x2, x3;
|
||||||
|
T y0, y1, y2, y3;
|
||||||
|
T z0, z1, z2, z3;
|
||||||
|
T w0, w1, w2, w3;
|
||||||
|
|
||||||
|
T operator[] (std::size_t offset) const {
|
||||||
|
return reinterpret_cast<const T*>(this)[offset];
|
||||||
|
}
|
||||||
|
|
||||||
|
T& operator[] (std::size_t offset) {
|
||||||
|
return reinterpret_cast<T*>(this)[offset];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef Mat4<float> Mat4f;
|
||||||
|
typedef Mat4<int> Mat4i;
|
||||||
|
typedef Mat4<double> Mat4d;
|
||||||
|
|
||||||
|
Mat4f Perspective(float fovY, float aspectRatio, float zNear, float zFar);
|
||||||
|
Mat4f LookAt(const Vec3f& eye, const Vec3f& center, const Vec3f& up);
|
||||||
|
|
||||||
|
Mat4f Dot(const Mat4f& mat, const Mat4f& other);
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
Mat4<T> Identity() {
|
||||||
|
Mat4<T> result{};
|
||||||
|
|
||||||
|
result.x0 = static_cast<T>(1);
|
||||||
|
result.y1 = static_cast<T>(1);
|
||||||
|
result.z2 = static_cast<T>(1);
|
||||||
|
result.w3 = static_cast<T>(1);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
Mat4<T> Transpose(const Mat4<T>& mat) {
|
||||||
|
Mat4<T> result;
|
||||||
|
|
||||||
|
result.x1 = mat.y0;
|
||||||
|
result.x2 = mat.z0;
|
||||||
|
result.x3 = mat.w0;
|
||||||
|
result.y0 = mat.x1;
|
||||||
|
result.y2 = mat.z1;
|
||||||
|
result.y3 = mat.w1;
|
||||||
|
result.z0 = mat.x2;
|
||||||
|
result.z1 = mat.y2;
|
||||||
|
result.z3 = mat.w2;
|
||||||
|
result.w0 = mat.x3;
|
||||||
|
result.w1 = mat.y3;
|
||||||
|
result.w2 = mat.z3;
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace maths
|
||||||
|
} // namespace td
|
||||||
58
src/misc/Maths.cpp
Normal file
58
src/misc/Maths.cpp
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
#include "misc/Maths.h"
|
||||||
|
|
||||||
|
namespace td {
|
||||||
|
namespace maths {
|
||||||
|
|
||||||
|
Mat4f Perspective(float fovY, float aspectRatio, float zNear, float zFar) {
|
||||||
|
const float tanHalfFovy = std::tan(fovY / 2.0f);
|
||||||
|
|
||||||
|
Mat4f result{};
|
||||||
|
result.x0 = 1.0f / (aspectRatio * tanHalfFovy);
|
||||||
|
result.y1 = 1.0f / (tanHalfFovy);
|
||||||
|
result.z2 = -(zFar + zNear) / (zFar - zNear);
|
||||||
|
result.z3 = -1.0f;
|
||||||
|
result.w2 = -(2.0f * zFar * zNear) / (zFar - zNear);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
Mat4f LookAt(const Vec3f& eye, const Vec3f& center, const Vec3f& up) {
|
||||||
|
const Vec3f f = Normalize(center - eye);
|
||||||
|
const Vec3f s = Normalize(Cross(f, up));
|
||||||
|
const Vec3f u = Cross(s, f);
|
||||||
|
|
||||||
|
Mat4f result = Identity<float>();
|
||||||
|
result.x0 = s.x;
|
||||||
|
result.y0 = s.y;
|
||||||
|
result.z0 = s.z;
|
||||||
|
result.x1 = u.x;
|
||||||
|
result.y1 = u.y;
|
||||||
|
result.z1 = u.z;
|
||||||
|
result.x2 = -f.x;
|
||||||
|
result.y2 = -f.y;
|
||||||
|
result.z2 = -f.z;
|
||||||
|
result.w0 = -Dot(s, eye);
|
||||||
|
result.w1 = -Dot(u, eye);
|
||||||
|
result.w2 = Dot(f, eye);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
Mat4f Dot(const Mat4f& mat, const Mat4f& other) {
|
||||||
|
Mat4f result {};
|
||||||
|
|
||||||
|
static const int MAT_SIZE = 4;
|
||||||
|
|
||||||
|
for (int i = 0; i < MAT_SIZE; i++) {
|
||||||
|
for (int j = 0; j < MAT_SIZE; j++) {
|
||||||
|
for (int k = 0; k < MAT_SIZE; k++) {
|
||||||
|
result[i * MAT_SIZE + j] += mat[i * MAT_SIZE + k] * other[k * MAT_SIZE + j];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace maths
|
||||||
|
} // namespace td
|
||||||
Reference in New Issue
Block a user