gb.hpp - Matrix(2,3)
This commit is contained in:
parent
002c631c6c
commit
5c0fb2c0e7
|
@ -7,7 +7,7 @@ library | latest version | category | languages | description
|
||||||
----------------|----------------|----------|-----------|-------------
|
----------------|----------------|----------|-----------|-------------
|
||||||
**gb_string.h** | 0.93 | strings | C, C++ | A better string library for C & C++
|
**gb_string.h** | 0.93 | strings | C, C++ | A better string library for C & C++
|
||||||
**gb_ini.h** | 0.91 | misc | C, C++ | A simple ini file loader library for C & C++
|
**gb_ini.h** | 0.91 | misc | C, C++ | A simple ini file loader library for C & C++
|
||||||
**gb.hpp** | 0.07 | misc | C++11 | (Experimental) A C++11 helper library without STL geared towards game development
|
**gb.hpp** | 0.08 | misc | C++11 | (Experimental) A C++11 helper library without STL geared towards game development
|
||||||
|
|
||||||
## FAQ
|
## FAQ
|
||||||
|
|
||||||
|
|
448
gb.hpp
448
gb.hpp
|
@ -1,7 +1,8 @@
|
||||||
// gb.hpp - v0.07 - public domain C++11 helper library - no warranty implied; use at your own risk
|
// gb.hpp - v0.08 - public domain C++11 helper library - no warranty implied; use at your own risk
|
||||||
// (Experimental) A C++11 helper library without STL geared towards game development
|
// (Experimental) A C++11 helper library without STL geared towards game development
|
||||||
//
|
//
|
||||||
// Version History:
|
// Version History:
|
||||||
|
// 0.08 - Matrix(2,3)
|
||||||
// 0.07 - Bug Fixes
|
// 0.07 - Bug Fixes
|
||||||
// 0.06 - Os spec ideas
|
// 0.06 - Os spec ideas
|
||||||
// 0.05 - Transform Type and Quaternion Functions
|
// 0.05 - Transform Type and Quaternion Functions
|
||||||
|
@ -71,7 +72,9 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
/// ///
|
||||||
/// System OS ///
|
/// System OS ///
|
||||||
|
/// ///
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
#if defined(_WIN32) || defined(_WIN64)
|
#if defined(_WIN32) || defined(_WIN64)
|
||||||
#define GB_SYSTEM_WINDOWS
|
#define GB_SYSTEM_WINDOWS
|
||||||
|
@ -97,7 +100,9 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
/// ///
|
||||||
/// Environment Bit Size ///
|
/// Environment Bit Size ///
|
||||||
|
/// ///
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
#if defined(_WIN32) || defined(_WIN64)
|
#if defined(_WIN32) || defined(_WIN64)
|
||||||
#if defined(_WIN64)
|
#if defined(_WIN64)
|
||||||
|
@ -160,14 +165,18 @@ gb__assert_handler(bool condition, const char* condition_str,
|
||||||
}
|
}
|
||||||
fprintf(stderr, "\n");
|
fprintf(stderr, "\n");
|
||||||
|
|
||||||
abort();
|
abort(); // TODO(bill): is abort() portable and good?
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#if !defined(GB_BASIC_TYPES_WITHOUT_NAMESPACE)
|
||||||
namespace gb
|
namespace gb
|
||||||
{
|
{
|
||||||
|
#endif // GB_BASIC_TYPES_WITHOUT_NAMESPACE
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
/// ///
|
||||||
/// Types ///
|
/// Types ///
|
||||||
|
/// ///
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
|
||||||
using u8 = uint8_t;
|
using u8 = uint8_t;
|
||||||
|
@ -222,9 +231,17 @@ using uintptr = uintptr_t;
|
||||||
|
|
||||||
using ptrdiff = ptrdiff_t;
|
using ptrdiff = ptrdiff_t;
|
||||||
|
|
||||||
|
#if !defined(GB_BASIC_TYPES_WITHOUT_NAMESPACE)
|
||||||
|
} // namespace gb
|
||||||
|
#endif // GB_BASIC_TYPES_WITHOUT_NAMESPACE
|
||||||
|
|
||||||
|
|
||||||
|
namespace gb
|
||||||
|
{
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
/// ///
|
||||||
/// C++11 Move Semantics ///
|
/// C++11 Move Semantics ///
|
||||||
|
/// ///
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
template <typename T> struct Remove_Reference { using Type = T; };
|
template <typename T> struct Remove_Reference { using Type = T; };
|
||||||
template <typename T> struct Remove_Reference<T&> { using Type = T; };
|
template <typename T> struct Remove_Reference<T&> { using Type = T; };
|
||||||
|
@ -252,22 +269,24 @@ move(T&& t)
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
/// ///
|
||||||
/// Defer ///
|
/// Defer ///
|
||||||
|
/// ///
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
namespace impl
|
namespace impl
|
||||||
{
|
{
|
||||||
template <typename Fn>
|
template <typename Func>
|
||||||
struct Defer
|
struct Defer
|
||||||
{
|
{
|
||||||
Fn fn;
|
Func func;
|
||||||
|
|
||||||
Defer(Fn&& fn) : fn{forward<Fn>(fn)} {}
|
Defer(Func&& func) : func{gb::forward<Func>(func)} {}
|
||||||
~Defer() { fn(); };
|
~Defer() { func(); };
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename Fn>
|
template <typename Func>
|
||||||
Defer<Fn>
|
Defer<Func>
|
||||||
defer_fn(Fn&& fn) { return Defer<Fn>(forward<Fn>(fn)); }
|
defer_func(Func&& func) { return Defer<Func>(gb::forward<Func>(func)); }
|
||||||
} // namespace impl
|
} // namespace impl
|
||||||
} // namespace gb
|
} // namespace gb
|
||||||
|
|
||||||
|
@ -275,12 +294,14 @@ defer_fn(Fn&& fn) { return Defer<Fn>(forward<Fn>(fn)); }
|
||||||
#define GB_DEFER_1(x, y) x##y
|
#define GB_DEFER_1(x, y) x##y
|
||||||
#define GB_DEFER_2(x, y) GB_DEFER_1(x, y)
|
#define GB_DEFER_2(x, y) GB_DEFER_1(x, y)
|
||||||
#define GB_DEFER_3(x) GB_DEFER_2(GB_DEFER_2(GB_DEFER_2(x, __COUNTER__), _), __LINE__)
|
#define GB_DEFER_3(x) GB_DEFER_2(GB_DEFER_2(GB_DEFER_2(x, __COUNTER__), _), __LINE__)
|
||||||
#define defer(code) auto GB_DEFER_3(_defer_) = gb::impl::defer_fn([&](){code;})
|
#define defer(code) auto GB_DEFER_3(_defer_) = gb::impl::defer_func([&](){code;})
|
||||||
|
|
||||||
namespace gb
|
namespace gb
|
||||||
{
|
{
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
/// ///
|
||||||
/// Memory ///
|
/// Memory ///
|
||||||
|
/// ///
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
|
||||||
struct Mutex
|
struct Mutex
|
||||||
|
@ -420,7 +441,9 @@ make_temporary_arena_memory(Arena_Allocator& arena)
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
/// ///
|
||||||
/// String ///
|
/// String ///
|
||||||
|
/// ///
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
using String = char*;
|
using String = char*;
|
||||||
using String_Size = u32;
|
using String_Size = u32;
|
||||||
|
@ -458,7 +481,9 @@ void trim_string(String& str, const char* cut_set);
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
/// ///
|
||||||
/// Array ///
|
/// Array ///
|
||||||
|
/// ///
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
|
@ -498,7 +523,9 @@ template <typename T> void set_array_allocation(Array<T>& a, usize allocation);
|
||||||
template <typename T> void grow_array(Array<T>& a, usize min_allocation = 0);
|
template <typename T> void grow_array(Array<T>& a, usize min_allocation = 0);
|
||||||
|
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
/// ///
|
||||||
/// Hash Table ///
|
/// Hash Table ///
|
||||||
|
/// ///
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
|
@ -562,7 +589,9 @@ template <typename T> void remove_entry_from_hash_table(Hash_Table<T>& h, const
|
||||||
template <typename T> void remove_all_from_hash_table(Hash_Table<T>& h, u64 key);
|
template <typename T> void remove_all_from_hash_table(Hash_Table<T>& h, u64 key);
|
||||||
|
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
/// ///
|
||||||
/// Array ///
|
/// Array ///
|
||||||
|
/// ///
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
template <typename T>
|
template <typename T>
|
||||||
inline Array<T>::Array(Allocator& a, usize count_)
|
inline Array<T>::Array(Allocator& a, usize count_)
|
||||||
|
@ -693,7 +722,9 @@ grow_array(Array<T>& a, usize min_allocation)
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
/// ///
|
||||||
/// Hash Table ///
|
/// Hash Table ///
|
||||||
|
/// ///
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
namespace impl
|
namespace impl
|
||||||
{
|
{
|
||||||
|
@ -1042,7 +1073,9 @@ remove_all_from_hash_table(Hash_Table<T>& h, u64 key)
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
/// ///
|
||||||
/// Hash ///
|
/// Hash ///
|
||||||
|
/// ///
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
|
||||||
namespace hash
|
namespace hash
|
||||||
|
@ -1063,7 +1096,9 @@ u64 murmur64(const void* key, usize num_bytes, u64 seed = 0x9747b28c);
|
||||||
} // namespace hash
|
} // namespace hash
|
||||||
|
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
/// ///
|
||||||
/// Os ///
|
/// Os ///
|
||||||
|
/// ///
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
|
||||||
namespace os
|
namespace os
|
||||||
|
@ -1170,7 +1205,9 @@ void name_of_file(File& file, const char* buffer, usize buffer_len);
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
/// ///
|
||||||
/// Time ///
|
/// Time ///
|
||||||
|
/// ///
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
|
||||||
struct Time
|
struct Time
|
||||||
|
@ -1226,7 +1263,9 @@ Time& operator%=(Time& left, Time right);
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
/// ///
|
||||||
/// Math Types ///
|
/// Math Types ///
|
||||||
|
/// ///
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
|
||||||
struct Vector2
|
struct Vector2
|
||||||
|
@ -1337,7 +1376,9 @@ struct Transform
|
||||||
};
|
};
|
||||||
|
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
/// ///
|
||||||
/// Math Type Op Overloads ///
|
/// Math Type Op Overloads ///
|
||||||
|
/// ///
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
|
||||||
// Vector2 Operators
|
// Vector2 Operators
|
||||||
|
@ -1423,6 +1464,42 @@ Quaternion operator/(const Quaternion& a, f32 s);
|
||||||
|
|
||||||
Vector3 operator*(const Quaternion& a, const Vector3& v); // Rotate v by a
|
Vector3 operator*(const Quaternion& a, const Vector3& v); // Rotate v by a
|
||||||
|
|
||||||
|
// Matrix2 Operators
|
||||||
|
bool operator==(const Matrix2& a, const Matrix2& b);
|
||||||
|
bool operator!=(const Matrix2& a, const Matrix2& b);
|
||||||
|
|
||||||
|
Matrix2 operator+(const Matrix2& a, const Matrix2& b);
|
||||||
|
Matrix2 operator-(const Matrix2& a, const Matrix2& b);
|
||||||
|
|
||||||
|
Matrix2 operator*(const Matrix2& a, const Matrix2& b);
|
||||||
|
Vector2 operator*(const Matrix2& a, const Vector2& v);
|
||||||
|
Matrix2 operator*(const Matrix2& a, f32 scalar);
|
||||||
|
Matrix2 operator*(f32 scalar, const Matrix2& a);
|
||||||
|
|
||||||
|
Matrix2 operator/(const Matrix2& a, f32 scalar);
|
||||||
|
|
||||||
|
Matrix2& operator+=(Matrix2& a, const Matrix2& b);
|
||||||
|
Matrix2& operator-=(Matrix2& a, const Matrix2& b);
|
||||||
|
Matrix2& operator*=(Matrix2& a, const Matrix2& b);
|
||||||
|
|
||||||
|
// Matrix3 Operators
|
||||||
|
bool operator==(const Matrix3& a, const Matrix3& b);
|
||||||
|
bool operator!=(const Matrix3& a, const Matrix3& b);
|
||||||
|
|
||||||
|
Matrix3 operator+(const Matrix3& a, const Matrix3& b);
|
||||||
|
Matrix3 operator-(const Matrix3& a, const Matrix3& b);
|
||||||
|
|
||||||
|
Matrix3 operator*(const Matrix3& a, const Matrix3& b);
|
||||||
|
Vector3 operator*(const Matrix3& a, const Vector3& v);
|
||||||
|
Matrix3 operator*(const Matrix3& a, f32 scalar);
|
||||||
|
Matrix3 operator*(f32 scalar, const Matrix3& a);
|
||||||
|
|
||||||
|
Matrix3 operator/(const Matrix3& a, f32 scalar);
|
||||||
|
|
||||||
|
Matrix3& operator+=(Matrix3& a, const Matrix3& b);
|
||||||
|
Matrix3& operator-=(Matrix3& a, const Matrix3& b);
|
||||||
|
Matrix3& operator*=(Matrix3& a, const Matrix3& b);
|
||||||
|
|
||||||
// Matrix4 Operators
|
// Matrix4 Operators
|
||||||
bool operator==(const Matrix4& a, const Matrix4& b);
|
bool operator==(const Matrix4& a, const Matrix4& b);
|
||||||
bool operator!=(const Matrix4& a, const Matrix4& b);
|
bool operator!=(const Matrix4& a, const Matrix4& b);
|
||||||
|
@ -1450,7 +1527,9 @@ Transform operator/(const Transform& ws, const Transform& ps);
|
||||||
Transform& operator/=(Transform& ws, const Transform& ps);
|
Transform& operator/=(Transform& ws, const Transform& ps);
|
||||||
|
|
||||||
//////////////////////////////////
|
//////////////////////////////////
|
||||||
|
/// ///
|
||||||
/// Math Functions & Constants ///
|
/// Math Functions & Constants ///
|
||||||
|
/// ///
|
||||||
//////////////////////////////////
|
//////////////////////////////////
|
||||||
extern const Vector2 VECTOR2_ZERO;
|
extern const Vector2 VECTOR2_ZERO;
|
||||||
extern const Vector3 VECTOR3_ZERO;
|
extern const Vector3 VECTOR3_ZERO;
|
||||||
|
@ -1591,13 +1670,22 @@ inline Quaternion squad(const Quaternion& p,
|
||||||
const Quaternion& b,
|
const Quaternion& b,
|
||||||
const Quaternion& q,
|
const Quaternion& q,
|
||||||
f32 t);
|
f32 t);
|
||||||
|
// Matrix2 functions
|
||||||
|
Matrix2 transpose(const Matrix2& m);
|
||||||
|
f32 determinant(const Matrix2& m);
|
||||||
|
Matrix2 inverse(const Matrix2& m);
|
||||||
|
Matrix2 hadamard_product(const Matrix2& a, const Matrix2&b);
|
||||||
|
|
||||||
|
// Matrix3 functions
|
||||||
|
Matrix3 transpose(const Matrix3& m);
|
||||||
|
f32 determinant(const Matrix3& m);
|
||||||
|
Matrix3 inverse(const Matrix3& m);
|
||||||
|
Matrix3 hadamard_product(const Matrix3& a, const Matrix3&b);
|
||||||
|
|
||||||
// Matrix4 functions
|
// Matrix4 functions
|
||||||
Matrix4 transpose(const Matrix4& m);
|
Matrix4 transpose(const Matrix4& m);
|
||||||
f32 determinant(const Matrix4& m);
|
f32 determinant(const Matrix4& m);
|
||||||
|
|
||||||
Matrix4 inverse(const Matrix4& m);
|
Matrix4 inverse(const Matrix4& m);
|
||||||
|
|
||||||
Matrix4 hadamard_product(const Matrix4& a, const Matrix4&b);
|
Matrix4 hadamard_product(const Matrix4& a, const Matrix4&b);
|
||||||
|
|
||||||
Matrix4 quaternion_to_matrix4(const Quaternion& a);
|
Matrix4 quaternion_to_matrix4(const Quaternion& a);
|
||||||
|
@ -1735,13 +1823,17 @@ s32 get_uniform_location(Shader_Program* program, const char* name);
|
||||||
///
|
///
|
||||||
///
|
///
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
/// ///
|
||||||
/// Implemenation ///
|
/// Implemenation ///
|
||||||
|
/// ///
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
#ifdef GB_IMPLEMENTATION
|
#ifdef GB_IMPLEMENTATION
|
||||||
namespace gb
|
namespace gb
|
||||||
{
|
{
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
/// ///
|
||||||
/// Memory ///
|
/// Memory ///
|
||||||
|
/// ///
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
|
||||||
Mutex::Mutex()
|
Mutex::Mutex()
|
||||||
|
@ -1925,7 +2017,9 @@ void Arena_Allocator::check()
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
/// ///
|
||||||
/// String ///
|
/// String ///
|
||||||
|
/// ///
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
String make_string(Allocator& a, const char* str)
|
String make_string(Allocator& a, const char* str)
|
||||||
{
|
{
|
||||||
|
@ -2115,7 +2209,9 @@ void trim_string(String& str, const char* cut_set)
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
/// ///
|
||||||
/// Hash ///
|
/// Hash ///
|
||||||
|
/// ///
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
|
||||||
namespace hash
|
namespace hash
|
||||||
|
@ -2478,7 +2574,9 @@ u64 murmur64(const void* key, usize num_bytes, u64 seed)
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
/// ///
|
||||||
/// Time ///
|
/// Time ///
|
||||||
|
/// ///
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
#ifdef GB_SYSTEM_WINDOWS
|
#ifdef GB_SYSTEM_WINDOWS
|
||||||
|
|
||||||
|
@ -2686,7 +2784,9 @@ Time& operator%=(Time& left, Time right)
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
/// ///
|
||||||
/// Math ///
|
/// Math ///
|
||||||
|
/// ///
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
|
||||||
const Vector2 VECTOR2_ZERO = {0, 0};
|
const Vector2 VECTOR2_ZERO = {0, 0};
|
||||||
|
@ -3025,6 +3125,193 @@ Vector3 operator*(const Quaternion& a, const Vector3& v) // Rotate v by q
|
||||||
return (v + a.w * t + math::cross(a.xyz, t));
|
return (v + a.w * t + math::cross(a.xyz, t));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Matrix2 Operators
|
||||||
|
bool operator==(const Matrix2& a, const Matrix2& b)
|
||||||
|
{
|
||||||
|
for (usize i = 0; i < 4; i++)
|
||||||
|
{
|
||||||
|
if (a[i] != b[i])
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator!=(const Matrix2& a, const Matrix2& b)
|
||||||
|
{
|
||||||
|
return !operator==(a, b);
|
||||||
|
}
|
||||||
|
|
||||||
|
Matrix2 operator+(const Matrix2& a, const Matrix2& b)
|
||||||
|
{
|
||||||
|
Matrix2 mat;
|
||||||
|
mat[0] = a[0] + b[0];
|
||||||
|
mat[1] = a[1] + b[1];
|
||||||
|
return mat;
|
||||||
|
}
|
||||||
|
|
||||||
|
Matrix2 operator-(const Matrix2& a, const Matrix2& b)
|
||||||
|
{
|
||||||
|
Matrix2 mat;
|
||||||
|
mat[0] = a[0] - b[0];
|
||||||
|
mat[1] = a[1] - b[1];
|
||||||
|
return mat;
|
||||||
|
}
|
||||||
|
|
||||||
|
Matrix2 operator*(const Matrix2& a, const Matrix2& b)
|
||||||
|
{
|
||||||
|
Matrix2 result;
|
||||||
|
result[0] = a[0] * b[0][0] + a[1] * b[0][1];
|
||||||
|
result[1] = a[0] * b[1][0] + a[1] * b[1][1];
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
Vector2 operator*(const Matrix2& a, const Vector2& v)
|
||||||
|
{
|
||||||
|
Vector2 mul0 = a[0] * v[0];
|
||||||
|
Vector2 mul1 = a[1] * v[1];
|
||||||
|
|
||||||
|
return mul0 + mul1;
|
||||||
|
}
|
||||||
|
|
||||||
|
Matrix2 operator*(const Matrix2& a, f32 scalar)
|
||||||
|
{
|
||||||
|
Matrix2 mat;
|
||||||
|
mat[0] = a[0] * scalar;
|
||||||
|
mat[1] = a[1] * scalar;
|
||||||
|
return mat;
|
||||||
|
}
|
||||||
|
|
||||||
|
Matrix2 operator*(f32 scalar, const Matrix2& a)
|
||||||
|
{
|
||||||
|
Matrix2 mat;
|
||||||
|
mat[0] = a[0] * scalar;
|
||||||
|
mat[1] = a[1] * scalar;
|
||||||
|
return mat;
|
||||||
|
}
|
||||||
|
|
||||||
|
Matrix2 operator/(const Matrix2& a, f32 scalar)
|
||||||
|
{
|
||||||
|
Matrix2 mat;
|
||||||
|
mat[0] = a[0] / scalar;
|
||||||
|
mat[1] = a[1] / scalar;
|
||||||
|
return mat;
|
||||||
|
}
|
||||||
|
|
||||||
|
Matrix2& operator+=(Matrix2& a, const Matrix2& b)
|
||||||
|
{
|
||||||
|
return (a = a + b);
|
||||||
|
}
|
||||||
|
|
||||||
|
Matrix2& operator-=(Matrix2& a, const Matrix2& b)
|
||||||
|
{
|
||||||
|
return (a = a - b);
|
||||||
|
}
|
||||||
|
|
||||||
|
Matrix2& operator*=(Matrix2& a, const Matrix2& b)
|
||||||
|
{
|
||||||
|
return (a = a * b);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Matrix3 Operators
|
||||||
|
bool operator==(const Matrix3& a, const Matrix3& b)
|
||||||
|
{
|
||||||
|
for (usize i = 0; i < 3; i++)
|
||||||
|
{
|
||||||
|
if (a[i] != b[i])
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator!=(const Matrix3& a, const Matrix3& b)
|
||||||
|
{
|
||||||
|
return !operator==(a, b);
|
||||||
|
}
|
||||||
|
|
||||||
|
Matrix3 operator+(const Matrix3& a, const Matrix3& b)
|
||||||
|
{
|
||||||
|
Matrix3 mat;
|
||||||
|
mat[0] = a[0] + b[0];
|
||||||
|
mat[1] = a[1] + b[1];
|
||||||
|
mat[2] = a[2] + b[2];
|
||||||
|
return mat;
|
||||||
|
}
|
||||||
|
|
||||||
|
Matrix3 operator-(const Matrix3& a, const Matrix3& b)
|
||||||
|
{
|
||||||
|
Matrix3 mat;
|
||||||
|
mat[0] = a[0] - b[0];
|
||||||
|
mat[1] = a[1] - b[1];
|
||||||
|
mat[2] = a[2] - b[2];
|
||||||
|
return mat;
|
||||||
|
}
|
||||||
|
|
||||||
|
Matrix3 operator*(const Matrix3& a, const Matrix3& b)
|
||||||
|
{
|
||||||
|
Matrix3 result;
|
||||||
|
result[0] = a[0] * b[0][0] + a[1] * b[0][1] + a[2] * b[0][2];
|
||||||
|
result[1] = a[0] * b[1][0] + a[1] * b[1][1] + a[2] * b[1][2];
|
||||||
|
result[2] = a[0] * b[2][0] + a[1] * b[2][1] + a[2] * b[2][2];
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
Vector3 operator*(const Matrix3& a, const Vector3& v)
|
||||||
|
{
|
||||||
|
Vector3 mul0 = a[0] * v[0];
|
||||||
|
Vector3 mul1 = a[1] * v[1];
|
||||||
|
Vector3 mul2 = a[2] * v[2];
|
||||||
|
|
||||||
|
return mul0 + mul1 + mul2;
|
||||||
|
}
|
||||||
|
|
||||||
|
Matrix3 operator*(const Matrix3& a, f32 scalar)
|
||||||
|
{
|
||||||
|
Matrix3 mat;
|
||||||
|
mat[0] = a[0] * scalar;
|
||||||
|
mat[1] = a[1] * scalar;
|
||||||
|
mat[2] = a[2] * scalar;
|
||||||
|
return mat;
|
||||||
|
}
|
||||||
|
|
||||||
|
Matrix3 operator*(f32 scalar, const Matrix3& a)
|
||||||
|
{
|
||||||
|
Matrix3 mat;
|
||||||
|
mat[0] = a[0] * scalar;
|
||||||
|
mat[1] = a[1] * scalar;
|
||||||
|
mat[2] = a[2] * scalar;
|
||||||
|
return mat;
|
||||||
|
}
|
||||||
|
|
||||||
|
Matrix3 operator/(const Matrix3& a, f32 scalar)
|
||||||
|
{
|
||||||
|
Matrix3 mat;
|
||||||
|
mat[0] = a[0] / scalar;
|
||||||
|
mat[1] = a[1] / scalar;
|
||||||
|
mat[2] = a[2] / scalar;
|
||||||
|
return mat;
|
||||||
|
}
|
||||||
|
|
||||||
|
Matrix3& operator+=(Matrix3& a, const Matrix3& b)
|
||||||
|
{
|
||||||
|
return (a = a + b);
|
||||||
|
}
|
||||||
|
|
||||||
|
Matrix3& operator-=(Matrix3& a, const Matrix3& b)
|
||||||
|
{
|
||||||
|
return (a = a - b);
|
||||||
|
}
|
||||||
|
|
||||||
|
Matrix3& operator*=(Matrix3& a, const Matrix3& b)
|
||||||
|
{
|
||||||
|
return (a = a * b);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Matrix4 Operators
|
// Matrix4 Operators
|
||||||
bool operator==(const Matrix4& a, const Matrix4& b)
|
bool operator==(const Matrix4& a, const Matrix4& b)
|
||||||
{
|
{
|
||||||
|
@ -3044,16 +3331,20 @@ bool operator!=(const Matrix4& a, const Matrix4& b)
|
||||||
Matrix4 operator+(const Matrix4& a, const Matrix4& b)
|
Matrix4 operator+(const Matrix4& a, const Matrix4& b)
|
||||||
{
|
{
|
||||||
Matrix4 mat;
|
Matrix4 mat;
|
||||||
for (usize i = 0; i < 4; i++)
|
mat[0] = a[0] + b[0];
|
||||||
mat[i] = a[i] + b[i];
|
mat[1] = a[1] + b[1];
|
||||||
|
mat[2] = a[2] + b[2];
|
||||||
|
mat[3] = a[3] + b[3];
|
||||||
return mat;
|
return mat;
|
||||||
}
|
}
|
||||||
|
|
||||||
Matrix4 operator-(const Matrix4& a, const Matrix4& b)
|
Matrix4 operator-(const Matrix4& a, const Matrix4& b)
|
||||||
{
|
{
|
||||||
Matrix4 mat;
|
Matrix4 mat;
|
||||||
for (usize i = 0; i < 4; i++)
|
mat[0] = a[0] - b[0];
|
||||||
mat[i] = a[i] - b[i];
|
mat[1] = a[1] - b[1];
|
||||||
|
mat[2] = a[2] - b[2];
|
||||||
|
mat[3] = a[3] - b[3];
|
||||||
return mat;
|
return mat;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3074,33 +3365,36 @@ Vector4 operator*(const Matrix4& a, const Vector4& v)
|
||||||
Vector4 mul2 = a[2] * v[2];
|
Vector4 mul2 = a[2] * v[2];
|
||||||
Vector4 mul3 = a[3] * v[3];
|
Vector4 mul3 = a[3] * v[3];
|
||||||
|
|
||||||
Vector4 add0 = mul0 + mul1;
|
return mul0 + mul1 + mul2 + mul3;
|
||||||
Vector4 add1 = mul2 + mul3;
|
|
||||||
|
|
||||||
return add0 + add1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Matrix4 operator*(const Matrix4& a, f32 scalar)
|
Matrix4 operator*(const Matrix4& a, f32 scalar)
|
||||||
{
|
{
|
||||||
Matrix4 mat;
|
Matrix4 mat;
|
||||||
for (usize i = 0; i < 4; i++)
|
mat[0] = a[0] * scalar;
|
||||||
mat[i] = a[i] * scalar;
|
mat[1] = a[1] * scalar;
|
||||||
|
mat[2] = a[2] * scalar;
|
||||||
|
mat[3] = a[3] * scalar;
|
||||||
return mat;
|
return mat;
|
||||||
}
|
}
|
||||||
|
|
||||||
Matrix4 operator*(f32 scalar, const Matrix4& a)
|
Matrix4 operator*(f32 scalar, const Matrix4& a)
|
||||||
{
|
{
|
||||||
Matrix4 mat;
|
Matrix4 mat;
|
||||||
for (usize i = 0; i < 4; i++)
|
mat[0] = a[0] * scalar;
|
||||||
mat[i] = a[i] * scalar;
|
mat[1] = a[1] * scalar;
|
||||||
|
mat[2] = a[2] * scalar;
|
||||||
|
mat[3] = a[3] * scalar;
|
||||||
return mat;
|
return mat;
|
||||||
}
|
}
|
||||||
|
|
||||||
Matrix4 operator/(const Matrix4& a, f32 scalar)
|
Matrix4 operator/(const Matrix4& a, f32 scalar)
|
||||||
{
|
{
|
||||||
Matrix4 mat;
|
Matrix4 mat;
|
||||||
for (usize i = 0; i < 4; i++)
|
mat[0] = a[0] / scalar;
|
||||||
mat[i] = a[i] / scalar;
|
mat[1] = a[1] / scalar;
|
||||||
|
mat[2] = a[2] / scalar;
|
||||||
|
mat[3] = a[3] / scalar;
|
||||||
return mat;
|
return mat;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3160,7 +3454,9 @@ Transform& operator/=(Transform& ws, const Transform& ps)
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
/// ///
|
||||||
/// Math Functions ///
|
/// Math Functions ///
|
||||||
|
/// ///
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
@ -3528,6 +3824,100 @@ inline Quaternion squad(const Quaternion& p,
|
||||||
return slerp(slerp(p, q, t), slerp(a, b, t), 2.0f * t * (1.0f - t));
|
return slerp(slerp(p, q, t), slerp(a, b, t), 2.0f * t * (1.0f - t));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Matrix2 functions
|
||||||
|
Matrix2 transpose(const Matrix2& m)
|
||||||
|
{
|
||||||
|
Matrix2 result;
|
||||||
|
|
||||||
|
for (usize i = 0; i < 2; i++)
|
||||||
|
{
|
||||||
|
for (usize j = 0; j < 2; j++)
|
||||||
|
result[i][j] = m[j][i];
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
f32 determinant(const Matrix2& m)
|
||||||
|
{
|
||||||
|
return m[0][0] * m[1][1] - m[1][0] * m[0][1];
|
||||||
|
}
|
||||||
|
|
||||||
|
Matrix2 inverse(const Matrix2& m)
|
||||||
|
{
|
||||||
|
f32 inv_det = 1.0f / (m[0][0] * m[1][1] - m[1][0] * m[0][1]);
|
||||||
|
Matrix2 result;
|
||||||
|
|
||||||
|
result[0][0] = m[1][1] * inv_det;
|
||||||
|
result[0][1] = -m[0][1] * inv_det;
|
||||||
|
result[1][0] = -m[1][0] * inv_det;
|
||||||
|
result[1][1] = m[0][0] * inv_det;
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
Matrix2 hadamard_product(const Matrix2& a, const Matrix2&b)
|
||||||
|
{
|
||||||
|
Matrix2 result;
|
||||||
|
|
||||||
|
result[0] = a[0] * b[0];
|
||||||
|
result[1] = a[1] * b[1];
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Matrix3 functions
|
||||||
|
Matrix3 transpose(const Matrix3& m)
|
||||||
|
{
|
||||||
|
Matrix3 result;
|
||||||
|
|
||||||
|
for (usize i = 0; i < 3; i++)
|
||||||
|
{
|
||||||
|
for (usize j = 0; j < 3; j++)
|
||||||
|
result[i][j] = m[j][i];
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
f32 determinant(const Matrix3& m)
|
||||||
|
{
|
||||||
|
return ( m[0][0] * (m[1][1] * m[2][2] - m[2][1] * m[1][2])
|
||||||
|
-m[1][0] * (m[0][1] * m[2][2] - m[2][1] * m[0][2])
|
||||||
|
+m[2][0] * (m[0][1] * m[1][2] - m[1][1] * m[0][2]));
|
||||||
|
}
|
||||||
|
|
||||||
|
Matrix3 inverse(const Matrix3& m)
|
||||||
|
{
|
||||||
|
f32 inv_det = 1.0f / (
|
||||||
|
+ m[0][0] * (m[1][1] * m[2][2] - m[2][1] * m[1][2])
|
||||||
|
- m[1][0] * (m[0][1] * m[2][2] - m[2][1] * m[0][2])
|
||||||
|
+ m[2][0] * (m[0][1] * m[1][2] - m[1][1] * m[0][2]));
|
||||||
|
|
||||||
|
Matrix3 result;
|
||||||
|
|
||||||
|
result[0][0] = +(m[1][1] * m[2][2] - m[2][1] * m[1][2]) * inv_det;
|
||||||
|
result[1][0] = -(m[1][0] * m[2][2] - m[2][0] * m[1][2]) * inv_det;
|
||||||
|
result[2][0] = +(m[1][0] * m[2][1] - m[2][0] * m[1][1]) * inv_det;
|
||||||
|
result[0][1] = -(m[0][1] * m[2][2] - m[2][1] * m[0][2]) * inv_det;
|
||||||
|
result[1][1] = +(m[0][0] * m[2][2] - m[2][0] * m[0][2]) * inv_det;
|
||||||
|
result[2][1] = -(m[0][0] * m[2][1] - m[2][0] * m[0][1]) * inv_det;
|
||||||
|
result[0][2] = +(m[0][1] * m[1][2] - m[1][1] * m[0][2]) * inv_det;
|
||||||
|
result[1][2] = -(m[0][0] * m[1][2] - m[1][0] * m[0][2]) * inv_det;
|
||||||
|
result[2][2] = +(m[0][0] * m[1][1] - m[1][0] * m[0][1]) * inv_det;
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
Matrix3 hadamard_product(const Matrix3& a, const Matrix3&b)
|
||||||
|
{
|
||||||
|
Matrix3 result;
|
||||||
|
|
||||||
|
result[0] = a[0] * b[0];
|
||||||
|
result[1] = a[1] * b[1];
|
||||||
|
result[2] = a[2] * b[2];
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Matrix4 functions
|
// Matrix4 functions
|
||||||
Matrix4 transpose(const Matrix4& m)
|
Matrix4 transpose(const Matrix4& m)
|
||||||
|
@ -3652,8 +4042,10 @@ Matrix4 hadamard_product(const Matrix4& a, const Matrix4& b)
|
||||||
{
|
{
|
||||||
Matrix4 result;
|
Matrix4 result;
|
||||||
|
|
||||||
for (usize i = 0; i < 4; i++)
|
result[0] = a[0] * b[0];
|
||||||
result[i] = a[i] * b[i];
|
result[1] = a[1] * b[1];
|
||||||
|
result[2] = a[2] * b[2];
|
||||||
|
result[3] = a[3] * b[3];
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue