From 88bac561ec5ff6204fd5e52928b96159da3ea965 Mon Sep 17 00:00:00 2001 From: Doyle Thai Date: Fri, 10 Nov 2017 23:14:50 +1100 Subject: [PATCH] Update vector and rect api to use constructors --- dqn.h | 468 +++++++++++++++++++--------------------------- dqn_unit_test.cpp | 283 ++++++++++++++-------------- 2 files changed, 329 insertions(+), 422 deletions(-) diff --git a/dqn.h b/dqn.h index bb3df59..5366be4 100644 --- a/dqn.h +++ b/dqn.h @@ -82,6 +82,7 @@ // - Get rid of reliance on MAX_PATH // // - Make lib compile and run on Linux with GCC using -03 +// - Make DqnV* operations be static to class for consistency? //////////////////////////////////////////////////////////////////////////////// // Preprocessor Checks @@ -1164,25 +1165,42 @@ DQN_FILE_SCOPE f32 DqnMath_Clampf(f32 val, f32 min, f32 max); //////////////////////////////////////////////////////////////////////////////// // #DqnV2 Public API - 2D Math Vectors //////////////////////////////////////////////////////////////////////////////// -typedef union DqnV2 { - struct { f32 x, y; }; - struct { f32 w, h; }; - struct { f32 min, max; }; - f32 e[2]; -} DqnV2; +class DqnV2i +{ +public: + union + { + struct { i32 x, y; }; + struct { i32 w, h; }; + struct { i32 min, max; }; + i32 e[2]; + }; -typedef union DqnV2i { - struct { i32 x, y; }; - struct { i32 w, h; }; - struct { i32 min, max; }; - i32 e[2]; -} DqnV2i; + DqnV2i(); + DqnV2i(i32 x_, i32 y_); + DqnV2i(f32 x_, f32 y_); + DqnV2i(class DqnV2 a); -// DqnV2 -DQN_FILE_SCOPE DqnV2 DqnV2_1f (f32 xy); -DQN_FILE_SCOPE DqnV2 DqnV2_2f (f32 x, f32 y); -DQN_FILE_SCOPE DqnV2 DqnV2_2i (i32 x, i32 y); // Typecasts 2 integers to 2 floats -DQN_FILE_SCOPE DqnV2 DqnV2_V2i(DqnV2i a); +}; + +class DqnV2 +{ +public: + union + { + struct { f32 x, y; }; + struct { f32 w, h; }; + struct { f32 min, max; }; + f32 e[2]; + }; + + DqnV2(); + DqnV2(f32 xy); + DqnV2(f32 x_, f32 y_); + DqnV2(i32 x_, i32 y_); + DqnV2(DqnV2i a); + +}; DQN_FILE_SCOPE DqnV2 DqnV2_Add (DqnV2 a, DqnV2 b); DQN_FILE_SCOPE DqnV2 DqnV2_Sub (DqnV2 a, DqnV2 b); @@ -1192,11 +1210,11 @@ DQN_FILE_SCOPE DqnV2 DqnV2_Hadamard(DqnV2 a, DqnV2 b); DQN_FILE_SCOPE f32 DqnV2_Dot (DqnV2 a, DqnV2 b); DQN_FILE_SCOPE bool DqnV2_Equals (DqnV2 a, DqnV2 b); -DQN_FILE_SCOPE f32 DqnV2_LengthSquared(DqnV2 a, DqnV2 b); -DQN_FILE_SCOPE f32 DqnV2_Length (DqnV2 a, DqnV2 b); -DQN_FILE_SCOPE DqnV2 DqnV2_Normalise (DqnV2 a); -DQN_FILE_SCOPE bool DqnV2_Overlaps (DqnV2 a, DqnV2 b); -DQN_FILE_SCOPE DqnV2 DqnV2_Perpendicular(DqnV2 a); +DQN_FILE_SCOPE f32 DqnV2_LengthSquared(const DqnV2 a, const DqnV2 b); +DQN_FILE_SCOPE f32 DqnV2_Length (const DqnV2 a, const DqnV2 b); +DQN_FILE_SCOPE DqnV2 DqnV2_Normalise (const DqnV2 a); +DQN_FILE_SCOPE bool DqnV2_Overlaps ( DqnV2 a, DqnV2 b); +DQN_FILE_SCOPE DqnV2 DqnV2_Perpendicular(const DqnV2 a); DQN_FILE_SCOPE DqnV2 DqnV2_ResizeKeepAspectRatio(DqnV2 srcSize, DqnV2 targetSize); DQN_FILE_SCOPE DqnV2 DqnV2_ConstrainToRatio (DqnV2 dim, DqnV2 ratio); // Resize the dimension to fit the aspect ratio provided. Downscale only. @@ -1214,10 +1232,6 @@ DQN_FILE_SCOPE inline DqnV2 &operator+=(DqnV2 &a, DqnV2 b) { return (a = DqnV2_A DQN_FILE_SCOPE inline bool operator==(DqnV2 a, DqnV2 b) { return DqnV2_Equals (a, b); } // DqnV2i -DQN_FILE_SCOPE DqnV2i DqnV2i_2i(i32 x, i32 y); -DQN_FILE_SCOPE DqnV2i DqnV2i_2f(f32 x, f32 y); // Typecasts 2 floats to 2 integers -DQN_FILE_SCOPE DqnV2i DqnV2i_V2(DqnV2 a); - DQN_FILE_SCOPE DqnV2i DqnV2i_Add (DqnV2i a, DqnV2i b); DQN_FILE_SCOPE DqnV2i DqnV2i_Sub (DqnV2i a, DqnV2i b); DQN_FILE_SCOPE DqnV2i DqnV2i_Scalei (DqnV2i a, i32 b); @@ -1239,27 +1253,38 @@ DQN_FILE_SCOPE inline bool operator==(DqnV2i a, DqnV2i b) { return DqnV //////////////////////////////////////////////////////////////////////////////// // #DqnV3 Public API - 3D Math Vectors //////////////////////////////////////////////////////////////////////////////// -typedef union DqnV3 +class DqnV3 { - struct { f32 x, y, z; }; - DqnV2 xy; +public: + union + { + struct { f32 x, y, z; }; + DqnV2 xy; + struct { f32 r, g, b; }; + f32 e[3]; + }; - struct { f32 r, g, b; }; - f32 e[3]; -} DqnV3; + DqnV3(); + DqnV3(f32 xyz); + DqnV3(f32 x_, f32 y_, f32 z_); + DqnV3(i32 x_, i32 y_, i32 z_); +}; -typedef union DqnV3i +class DqnV3i { - struct { i32 x, y, z; }; - struct { i32 r, g, b; }; - i32 e[3]; -} DqnV3i; +public: + union + { + struct { i32 x, y, z; }; + struct { i32 r, g, b; }; + i32 e[3]; + }; + + DqnV3i(i32 x_, i32 y_, i32 z_); + DqnV3i(f32 x_, f32 y_, f32 z_); +}; // DqnV3 -DQN_FILE_SCOPE DqnV3 DqnV3_1f(f32 xyz); -DQN_FILE_SCOPE DqnV3 DqnV3_3f(f32 x, f32 y, f32 z); -DQN_FILE_SCOPE DqnV3 DqnV3_3i(i32 x, i32 y, i32 z); // Create a vector using ints and typecast to floats - DQN_FILE_SCOPE DqnV3 DqnV3_Add (DqnV3 a, DqnV3 b); DQN_FILE_SCOPE DqnV3 DqnV3_Sub (DqnV3 a, DqnV3 b); DQN_FILE_SCOPE DqnV3 DqnV3_Scalei (DqnV3 a, i32 b); @@ -1275,7 +1300,7 @@ DQN_FILE_SCOPE f32 DqnV3_LengthSquared(DqnV3 a, DqnV3 b); DQN_FILE_SCOPE inline DqnV3 operator- (DqnV3 a, DqnV3 b) { return DqnV3_Sub (a, b); } DQN_FILE_SCOPE inline DqnV3 operator+ (DqnV3 a, DqnV3 b) { return DqnV3_Add (a, b); } -DQN_FILE_SCOPE inline DqnV3 operator+ (DqnV3 a, f32 b) { return DqnV3_Add (a, DqnV3_1f(b)); } +DQN_FILE_SCOPE inline DqnV3 operator+ (DqnV3 a, f32 b) { return DqnV3_Add (a, DqnV3(b)); } DQN_FILE_SCOPE inline DqnV3 operator* (DqnV3 a, DqnV3 b) { return DqnV3_Hadamard(a, b); } DQN_FILE_SCOPE inline DqnV3 operator* (DqnV3 a, f32 b) { return DqnV3_Scalef (a, b); } DQN_FILE_SCOPE inline DqnV3 operator* (DqnV3 a, i32 b) { return DqnV3_Scalei (a, b); } @@ -1287,32 +1312,32 @@ DQN_FILE_SCOPE inline DqnV3 &operator-=(DqnV3 &a, DqnV3 b) { return (a = DqnV3_S DQN_FILE_SCOPE inline DqnV3 &operator+=(DqnV3 &a, DqnV3 b) { return (a = DqnV3_Add (a, b)); } DQN_FILE_SCOPE inline bool operator==(DqnV3 a, DqnV3 b) { return DqnV3_Equals (a, b); } -// DqnV3i -DQN_FILE_SCOPE DqnV3i DqnV3i_3i(i32 x, i32 y, i32 z); -DQN_FILE_SCOPE DqnV3i DqnV3i_3f(f32 x, f32 y, f32 z); - //////////////////////////////////////////////////////////////////////////////// // #DqnV4 Public API - 4D Math Vectors //////////////////////////////////////////////////////////////////////////////// -typedef union DqnV4 { - struct +class DqnV4 +{ +public: + union { - f32 x, y, z, w; + struct { f32 x, y, z, w; }; + DqnV3 xyz; + DqnV2 xy; + + struct { f32 r, g, b, a; }; + DqnV3 rgb; + + f32 e[4]; + DqnV2 v2[2]; }; - DqnV3 xyz; - DqnV2 xy; - struct { f32 r, g, b, a; }; - DqnV3 rgb; + DqnV4(); + DqnV4(f32 xyzw); + DqnV4(f32 x_, f32 y_, f32 z_, f32 w_); + DqnV4(i32 x_, i32 y_, i32 z_, i32 w_); + DqnV4(DqnV3 a, f32 w); - f32 e[4]; - DqnV2 v2[2]; -} DqnV4; - -DQN_FILE_SCOPE DqnV4 DqnV4_1f(f32 xyzw); -DQN_FILE_SCOPE DqnV4 DqnV4_4f(f32 x, f32 y, f32 z, f32 w); -DQN_FILE_SCOPE DqnV4 DqnV4_4i(i32 x, i32 y, i32 z, f32 w); // Create a vector using ints and typecast to floats -DQN_FILE_SCOPE DqnV4 DqnV4_V3(DqnV3 a, f32 w); +}; DQN_FILE_SCOPE DqnV4 DqnV4_Add (DqnV4 a, DqnV4 b); DQN_FILE_SCOPE DqnV4 DqnV4_Sub (DqnV4 a, DqnV4 b); @@ -1324,7 +1349,7 @@ DQN_FILE_SCOPE bool DqnV4_Equals (DqnV4 a, DqnV4 b); DQN_FILE_SCOPE inline DqnV4 operator- (DqnV4 a, DqnV4 b) { return DqnV4_Sub (a, b); } DQN_FILE_SCOPE inline DqnV4 operator+ (DqnV4 a, DqnV4 b) { return DqnV4_Add (a, b); } -DQN_FILE_SCOPE inline DqnV4 operator+ (DqnV4 a, f32 b) { return DqnV4_Add (a, DqnV4_1f(b)); } +DQN_FILE_SCOPE inline DqnV4 operator+ (DqnV4 a, f32 b) { return DqnV4_Add (a, DqnV4(b)); } DQN_FILE_SCOPE inline DqnV4 operator* (DqnV4 a, DqnV4 b) { return DqnV4_Hadamard(a, b); } DQN_FILE_SCOPE inline DqnV4 operator* (DqnV4 a, f32 b) { return DqnV4_Scalef (a, b); } DQN_FILE_SCOPE inline DqnV4 operator* (DqnV4 a, i32 b) { return DqnV4_Scalei (a, b); } @@ -1363,23 +1388,25 @@ DQN_FILE_SCOPE DqnV4 DqnMat4_MulV4 (DqnMat4 a, DqnV4 b); //////////////////////////////////////////////////////////////////////////////// // #DqnRect Public API - Rectangles //////////////////////////////////////////////////////////////////////////////// -typedef struct DqnRect +class DqnRect { +public: DqnV2 min; DqnV2 max; -} DqnRect; -DQN_FILE_SCOPE DqnRect DqnRect_4f (f32 minX, f32 minY, f32 maxX, f32 maxY); -DQN_FILE_SCOPE DqnRect DqnRect_4i (i32 minX, i32 minY, i32 maxX, i32 maxY); -DQN_FILE_SCOPE DqnRect DqnRect_Init (DqnV2 origin, DqnV2 size); + DqnRect(); + DqnRect(DqnV2 origin, DqnV2 size); + DqnRect(f32 x, f32 y, f32 w, f32 h); + DqnRect(i32 x, i32 y, i32 w, i32 h); -DQN_FILE_SCOPE void DqnRect_GetSize2f(DqnRect rect, f32 *width, f32 *height); -DQN_FILE_SCOPE void DqnRect_GetSize2i(DqnRect rect, i32 *width, i32 *height); -DQN_FILE_SCOPE DqnV2 DqnRect_GetSizeV2(DqnRect rect); -DQN_FILE_SCOPE DqnV2 DqnRect_GetCenter(DqnRect rect); -DQN_FILE_SCOPE DqnRect DqnRect_ClipRect (DqnRect rect, DqnRect clip); -DQN_FILE_SCOPE DqnRect DqnRect_Move (DqnRect rect, DqnV2 shift); -DQN_FILE_SCOPE bool DqnRect_ContainsP(DqnRect rect, DqnV2 p); + void GetSize (f32 *const width, f32 *const height) const; + DqnV2 GetSize () const; + DqnV2 GetCenter() const; + + DqnRect ClipRect (const DqnRect clip) const; + DqnRect Move (const DqnV2 shift) const; + bool ContainsP(const DqnV2 p) const; +}; //////////////////////////////////////////////////////////////////////////////// // #DqnChar Public API - Char Operations @@ -3227,46 +3254,20 @@ DQN_FILE_SCOPE f32 DqnMath_Clampf(f32 val, f32 min, f32 max) } //////////////////////////////////////////////////////////////////////////////// -// #DqnV2 Init Implementation +// #DqnV2 Implementation //////////////////////////////////////////////////////////////////////////////// -DQN_FILE_SCOPE DqnV2 DqnV2_1f(f32 xy) -{ - DqnV2 result = {0}; - result.x = xy; - result.y = xy; - - return result; -} - -DQN_FILE_SCOPE DqnV2 DqnV2_2f(f32 x, f32 y) -{ - DqnV2 result = {0}; - result.x = x; - result.y = y; - - return result; -} - -DQN_FILE_SCOPE DqnV2 DqnV2_2i(i32 x, i32 y) -{ - DqnV2 result = DqnV2_2f((f32)x, (f32)y); - return result; -} - -DQN_FILE_SCOPE DqnV2 DqnV2_V2i(DqnV2i a) -{ - DqnV2 result = {0}; - result.x = (f32)a.x; - result.y = (f32)a.y; - return result; -} +DqnV2::DqnV2() { } +DqnV2::DqnV2(f32 xy) : x(xy) , y(xy) { } +DqnV2::DqnV2(f32 x_, f32 y_) : x(x_) , y(y_) { } +DqnV2::DqnV2(i32 x_, i32 y_) : x((f32)x_) , y((f32)y_) { } +DqnV2::DqnV2(DqnV2i a) : x((f32)a.x), y((f32)a.y) { } //////////////////////////////////////////////////////////////////////////////// // #DqnV2 Arithmetic Implementation //////////////////////////////////////////////////////////////////////////////// DQN_FILE_SCOPE DqnV2 DqnV2_Add(DqnV2 a, DqnV2 b) { - DqnV2 result = {0}; + DqnV2 result = {}; for (u32 i = 0; i < DQN_ARRAY_COUNT(a.e); i++) result.e[i] = a.e[i] + b.e[i]; @@ -3275,7 +3276,7 @@ DQN_FILE_SCOPE DqnV2 DqnV2_Add(DqnV2 a, DqnV2 b) DQN_FILE_SCOPE DqnV2 DqnV2_Sub(DqnV2 a, DqnV2 b) { - DqnV2 result = {0}; + DqnV2 result = {}; for (u32 i = 0; i < DQN_ARRAY_COUNT(a.e); i++) result.e[i] = a.e[i] - b.e[i]; @@ -3284,7 +3285,7 @@ DQN_FILE_SCOPE DqnV2 DqnV2_Sub(DqnV2 a, DqnV2 b) DQN_FILE_SCOPE DqnV2 DqnV2_Scalei(DqnV2 a, i32 b) { - DqnV2 result = {0}; + DqnV2 result = {}; for (u32 i = 0; i < DQN_ARRAY_COUNT(a.e); i++) result.e[i] = a.e[i] * b; @@ -3293,7 +3294,7 @@ DQN_FILE_SCOPE DqnV2 DqnV2_Scalei(DqnV2 a, i32 b) DQN_FILE_SCOPE DqnV2 DqnV2_Scalef(DqnV2 a, f32 b) { - DqnV2 result = {0}; + DqnV2 result = {}; for (u32 i = 0; i < DQN_ARRAY_COUNT(a.e); i++) result.e[i] = a.e[i] * b; @@ -3302,7 +3303,7 @@ DQN_FILE_SCOPE DqnV2 DqnV2_Scalef(DqnV2 a, f32 b) DQN_FILE_SCOPE DqnV2 DqnV2_Hadamard(DqnV2 a, DqnV2 b) { - DqnV2 result = {0}; + DqnV2 result = {}; for (u32 i = 0; i < DQN_ARRAY_COUNT(a.e); i++) result.e[i] = a.e[i] * b.e[i]; @@ -3333,15 +3334,15 @@ DQN_FILE_SCOPE bool DqnV2_Equals(DqnV2 a, DqnV2 b) return result; } -DQN_FILE_SCOPE f32 DqnV2_LengthSquared(DqnV2 a, DqnV2 b) +DQN_FILE_SCOPE f32 DqnV2_LengthSquared(const DqnV2 a, const DqnV2 b) { - f32 x = b.x - a.x; - f32 y = b.y - a.y; - f32 result = (DQN_SQUARED(x) + DQN_SQUARED(y)); + f32 x_ = b.x - a.x; + f32 y_ = b.y - a.y; + f32 result = (DQN_SQUARED(x_) + DQN_SQUARED(y_)); return result; } -DQN_FILE_SCOPE f32 DqnV2_Length(DqnV2 a, DqnV2 b) +DQN_FILE_SCOPE f32 DqnV2_Length(const DqnV2 a, const DqnV2 b) { f32 lengthSq = DqnV2_LengthSquared(a, b); if (lengthSq == 0) return 0; @@ -3350,31 +3351,30 @@ DQN_FILE_SCOPE f32 DqnV2_Length(DqnV2 a, DqnV2 b) return result; } -DQN_FILE_SCOPE DqnV2 DqnV2_Normalise(DqnV2 a) +DQN_FILE_SCOPE DqnV2 DqnV2_Normalise(const DqnV2 a) { - f32 magnitude = DqnV2_Length(DqnV2_2f(0, 0), a); - if (magnitude == 0) return DqnV2_1f(0.0f); + f32 magnitude = DqnV2_Length(DqnV2(0, 0), a); + if (magnitude == 0) return DqnV2(0.0f); - DqnV2 result = DqnV2_Scalef(a, 1 / magnitude); + DqnV2 result = a * (1.0f / magnitude); return result; } DQN_FILE_SCOPE bool DqnV2_Overlaps(DqnV2 a, DqnV2 b) { bool result = false; - + f32 lenOfA = a.max - a.min; f32 lenOfB = b.max - b.min; if (lenOfA > lenOfB) { DqnV2 tmp = a; - a = b; - b = tmp; + a = b; + b = tmp; } - if ((a.min >= b.min && a.min <= b.max) || - (a.max >= b.min && a.max <= b.max)) + if ((a.min >= b.min && a.min <= b.max) || (a.max >= b.min && a.max <= b.max)) { result = true; } @@ -3382,13 +3382,12 @@ DQN_FILE_SCOPE bool DqnV2_Overlaps(DqnV2 a, DqnV2 b) return result; } -DQN_FILE_SCOPE DqnV2 DqnV2_Perpendicular(DqnV2 a) +DQN_FILE_SCOPE DqnV2 DqnV2_Perpendicular(const DqnV2 a) { - DqnV2 result = DqnV2_2f(a.y, -a.x); + DqnV2 result = DqnV2(a.y, -a.x); return result; } - DQN_FILE_SCOPE DqnV2 DqnV2_ResizeKeepAspectRatio(DqnV2 srcSize, DqnV2 targetSize) { f32 ratioA = srcSize.w / targetSize.w; @@ -3413,33 +3412,12 @@ DQN_FILE_SCOPE DqnV2 DqnV2_ConstrainToRatio(DqnV2 dim, DqnV2 ratio) } //////////////////////////////////////////////////////////////////////////////// -// #DqnV2i Init Implementation +// #DqnV2i Implementation //////////////////////////////////////////////////////////////////////////////// -DQN_FILE_SCOPE DqnV2i DqnV2i_2i(i32 x, i32 y) -{ - DqnV2i result = {0}; - result.x = x; - result.y = y; - return result; -} +DqnV2i::DqnV2i(i32 x_, i32 y_) : x(x_) , y(y_) { } +DqnV2i::DqnV2i(f32 x_, f32 y_) : x((i32)x_) , y((i32)y_) { } +DqnV2i::DqnV2i(DqnV2 a) : x((i32)a.x), y((i32)a.y) { } -DQN_FILE_SCOPE DqnV2i DqnV2i_2f(f32 x, f32 y) -{ - DqnV2i result = DqnV2i_2i((i32)x, (i32)y); - return result; -} - -DQN_FILE_SCOPE DqnV2i DqnV2i_V2(DqnV2 a) -{ - DqnV2i result = {0}; - result.x = (i32)a.x; - result.y = (i32)a.y; - return result; -} - -//////////////////////////////////////////////////////////////////////////////// -// #DqnV2i Arithmetic Implementation -//////////////////////////////////////////////////////////////////////////////// DQN_FILE_SCOPE DqnV2i DqnV2i_Add(DqnV2i a, DqnV2i b) { DqnV2i result = {0}; @@ -3510,29 +3488,13 @@ DQN_FILE_SCOPE bool DqnV2i_Equals(DqnV2i a, DqnV2i b) } //////////////////////////////////////////////////////////////////////////////// -// #DqnV3 Init Implementation +// #DqnV3 Implementation //////////////////////////////////////////////////////////////////////////////// -DQN_FILE_SCOPE DqnV3 DqnV3_1f(f32 xyz) -{ - DqnV3 result = {xyz, xyz, xyz}; - return result; -} +DqnV3::DqnV3() { } +DqnV3::DqnV3(f32 xyz) : x(xyz) , y(xyz) , z(xyz) { } +DqnV3::DqnV3(f32 x_, f32 y_, f32 z_) : x(x_) , y(y_) , z(z_) { } +DqnV3::DqnV3(i32 x_, i32 y_, i32 z_) : x((f32)x_), y((f32)y_), z((f32)z_) { } -DQN_FILE_SCOPE DqnV3 DqnV3_3f(f32 x, f32 y, f32 z) -{ - DqnV3 result = {x, y, z}; - return result; -} - -DQN_FILE_SCOPE DqnV3 DqnV3_3i(i32 x, i32 y, i32 z) -{ - DqnV3 result = {(f32)x, (f32)y, (f32)z}; - return result; -} - -//////////////////////////////////////////////////////////////////////////////// -// #DqnV3 Arithmetic Implementation -//////////////////////////////////////////////////////////////////////////////// DQN_FILE_SCOPE DqnV3 DqnV3_Add(DqnV3 a, DqnV3 b) { DqnV3 result = {0}; @@ -3646,49 +3608,19 @@ DQN_FILE_SCOPE f32 DqnV3_Length(DqnV3 a, DqnV3 b) } //////////////////////////////////////////////////////////////////////////////// -// #DqnV3i Init Implementation +// #DqnV3i Implementation //////////////////////////////////////////////////////////////////////////////// -DQN_FILE_SCOPE DqnV3i DqnV3i_3i(i32 x, i32 y, i32 z) -{ - DqnV3i result = {x, y, z}; - return result; -} - -DQN_FILE_SCOPE DqnV3i DqnV3i_3f(f32 x, f32 y, f32 z) -{ - DqnV3i result = {(i32)x, (i32)y, (i32)z}; - return result; -} +DqnV3i::DqnV3i(i32 x_, i32 y_, i32 z_) : x(x_) , y(y_) , z(z_) { } +DqnV3i::DqnV3i(f32 x_, f32 y_, f32 z_) : x((i32)x_), y((i32)y_), z((i32)z_) { } //////////////////////////////////////////////////////////////////////////////// -// #DqnV4 Init Implementation +// #DqnV4 Implementation //////////////////////////////////////////////////////////////////////////////// -DQN_FILE_SCOPE DqnV4 DqnV4_1f(f32 xyzw) -{ - DqnV4 result = {xyzw, xyzw, xyzw, xyzw}; - return result; -} - -DQN_FILE_SCOPE DqnV4 DqnV4_4f(f32 x, f32 y, f32 z, f32 w) -{ - DqnV4 result = {x, y, z, w}; - return result; -} - -DQN_FILE_SCOPE DqnV4 DqnV4_4i(i32 x, i32 y, i32 z, i32 w) -{ - DqnV4 result = DqnV4_4f((f32)x, (f32)y, (f32)z, (f32)w); - return result; -} - -DQN_FILE_SCOPE DqnV4 DqnV4_V3(DqnV3 a, f32 w) -{ - DqnV4 result; - result.xyz = a; - result.w = w; - return result; -} - +DqnV4::DqnV4() {}; +DqnV4::DqnV4(f32 xyzw) : x(xyzw) , y(xyzw) , z(xyzw) , w(xyzw) { } +DqnV4::DqnV4(f32 x_, f32 y_, f32 z_, f32 w_) : x(x_) , y(y_) , z(z_) , w(w_) { } +DqnV4::DqnV4(i32 x_, i32 y_, i32 z_, i32 w_) : x((f32)x_), y((f32)y_), z((f32)z_), w((f32)w_) { } +DqnV4::DqnV4(DqnV3 a, f32 w) : x(a.x) , y(a.y) , z(a.z) , w(w) { } //////////////////////////////////////////////////////////////////////////////// // #DqnV4 Arithmetic Implementation //////////////////////////////////////////////////////////////////////////////// @@ -3766,7 +3698,7 @@ DQN_FILE_SCOPE bool DqnV4_Equals(DqnV4 a, DqnV4 b) //////////////////////////////////////////////////////////////////////////////// DQN_FILE_SCOPE DqnMat4 DqnMat4_Identity() { - DqnMat4 result = {0}; + DqnMat4 result = {0, 0, 0, 0}; result.e[0][0] = 1; result.e[1][1] = 1; result.e[2][2] = 1; @@ -3809,7 +3741,7 @@ DQN_FILE_SCOPE DqnMat4 DqnMat4_Perspective(f32 fovYDegrees, f32 aspectRatio, f32 DQN_FILE_SCOPE DqnMat4 DqnMat4_LookAt(DqnV3 eye, DqnV3 center, DqnV3 up) { - DqnMat4 result = {0}; + DqnMat4 result = {0, 0, 0, 0}; DqnV3 f = DqnV3_Normalise(DqnV3_Sub(eye, center)); DqnV3 s = DqnV3_Normalise(DqnV3_Cross(up, f)); @@ -3859,7 +3791,7 @@ DQN_FILE_SCOPE DqnMat4 DqnMat4_Rotate(f32 radians, f32 x, f32 y, f32 z) f32 cosVal = cosf(radians); f32 oneMinusCosVal = 1 - cosVal; - DqnV3 axis = DqnV3_Normalise(DqnV3_3f(x, y, z)); + DqnV3 axis = DqnV3_Normalise(DqnV3(x, y, z)); result.e[0][0] = (axis.x * axis.x * oneMinusCosVal) + cosVal; result.e[0][1] = (axis.x * axis.y * oneMinusCosVal) + (axis.z * sinVal); @@ -3878,7 +3810,7 @@ DQN_FILE_SCOPE DqnMat4 DqnMat4_Rotate(f32 radians, f32 x, f32 y, f32 z) DQN_FILE_SCOPE DqnMat4 DqnMat4_Scale(f32 x, f32 y, f32 z) { - DqnMat4 result = {0}; + DqnMat4 result = {0, 0, 0, 0}; result.e[0][0] = x; result.e[1][1] = y; result.e[2][2] = z; @@ -3888,7 +3820,7 @@ DQN_FILE_SCOPE DqnMat4 DqnMat4_Scale(f32 x, f32 y, f32 z) DQN_FILE_SCOPE DqnMat4 DqnMat4_ScaleV3(DqnV3 scale) { - DqnMat4 result = {0}; + DqnMat4 result = {0, 0, 0, 0}; result.e[0][0] = scale.x; result.e[1][1] = scale.y; result.e[2][2] = scale.z; @@ -3923,96 +3855,78 @@ DQN_FILE_SCOPE DqnV4 DqnMat4_MulV4(DqnMat4 a, DqnV4 b) return result; } -//////////////////////////////////////////////////////////////////////////////// -// #DqnRect Init Implementation -//////////////////////////////////////////////////////////////////////////////// -DQN_FILE_SCOPE DqnRect DqnRect_4f(f32 minX, f32 minY, f32 maxX, f32 maxY) -{ - DqnRect result = {0}; - result.min = DqnV2_2f(minX, minY); - result.max = DqnV2_2f(maxX, maxY); - - return result; -} - -DQN_FILE_SCOPE DqnRect DqnRect_4i(i32 minX, i32 minY, i32 maxX, i32 maxY) -{ - DqnRect result = {0}; - result.min = DqnV2_2i(minX, minY); - result.max = DqnV2_2i(maxX, maxY); - - return result; -} - -DQN_FILE_SCOPE DqnRect DqnRect_Init(DqnV2 origin, DqnV2 size) -{ - DqnRect result = {0}; - result.min = origin; - result.max = DqnV2_Add(origin, size); - - return result; -} - //////////////////////////////////////////////////////////////////////////////// // #DqnRect Implementation //////////////////////////////////////////////////////////////////////////////// -DQN_FILE_SCOPE void DqnRect_GetSize2f(DqnRect rect, f32 *width, f32 *height) +DqnRect::DqnRect() {} +DqnRect::DqnRect(DqnV2 origin, DqnV2 size) { - *width = rect.max.x - rect.min.x; - *height = rect.max.y - rect.min.y; + this->min = origin; + this->max = this->min + size; } -DQN_FILE_SCOPE void DqnRect_GetSize2i(DqnRect rect, i32 *width, i32 *height) +DqnRect::DqnRect(f32 x, f32 y, f32 w, f32 h) { - *width = (i32)(rect.max.x - rect.min.x); - *height = (i32)(rect.max.y - rect.min.y); + this->min = DqnV2(x, y); + this->max = DqnV2(x + w, y + h); } -DQN_FILE_SCOPE DqnV2 DqnRect_GetSizeV2(DqnRect rect) +DqnRect::DqnRect(i32 x, i32 y, i32 w, i32 h) { - f32 width = rect.max.x - rect.min.x; - f32 height = rect.max.y - rect.min.y; - DqnV2 result = DqnV2_2f(width, height); + this->min = DqnV2(x, y); + this->max = DqnV2(x + w, y + h); +} + +void DqnRect::GetSize(f32 *const width, f32 *const height) const +{ + if (width) *width = this->max.x - this->min.x; + if (height) *height = this->max.y - this->min.y; +} + +DqnV2 DqnRect::GetSize() const +{ + f32 width = this->max.x - this->min.x; + f32 height = this->max.y - this->min.y; + DqnV2 result = DqnV2(width, height); return result; } -DQN_FILE_SCOPE DqnV2 DqnRect_GetCentre(DqnRect rect) +DqnV2 DqnRect::GetCenter() const { - f32 sumX = rect.min.x + rect.max.x; - f32 sumY = rect.min.y + rect.max.y; - DqnV2 result = DqnV2_Scalef(DqnV2_2f(sumX, sumY), 0.5f); + f32 sumX = this->min.x + this->max.x; + f32 sumY = this->min.y + this->max.y; + DqnV2 result = DqnV2(sumX, sumY) * 0.5f; return result; } -DQN_FILE_SCOPE DqnRect DqnRect_ClipRect(DqnRect rect, DqnRect clip) +DqnRect DqnRect::ClipRect(const DqnRect clip) const { - DqnRect result = {0}; - DqnV2 clipSize = DqnRect_GetSizeV2(clip); + DqnV2 clipSize = clip.GetSize(); - result.max.x = DQN_MIN(rect.max.x, clipSize.w); - result.max.y = DQN_MIN(rect.max.y, clipSize.h); - result.min.x = DQN_MAX(clip.min.x, rect.min.x); - result.min.y = DQN_MAX(clip.min.y, rect.min.y); + DqnRect result; + result.max.x = DQN_MIN(this->max.x, clipSize.w); + result.max.y = DQN_MIN(this->max.y, clipSize.h); + result.min.x = DQN_MAX(clip.min.x, this->min.x); + result.min.y = DQN_MAX(clip.min.y, this->min.y); return result; } -DQN_FILE_SCOPE DqnRect DqnRect_Move(DqnRect rect, DqnV2 shift) +DqnRect DqnRect::Move(const DqnV2 shift) const { - DqnRect result = {0}; - result.min = DqnV2_Add(rect.min, shift); - result.max = DqnV2_Add(rect.max, shift); - + DqnRect result; + result.min = this->min + shift; + result.max = this->max + shift; return result; } -DQN_FILE_SCOPE bool DqnRect_ContainsP(DqnRect rect, DqnV2 p) +bool DqnRect::ContainsP(const DqnV2 p) const { bool outsideOfRectX = false; - if (p.x < rect.min.x || p.x > rect.max.w) + if (p.x < this->min.x || p.x > this->max.w) outsideOfRectX = true; bool outsideOfRectY = false; - if (p.y < rect.min.y || p.y > rect.max.h) + if (p.y < this->min.y || p.y > this->max.h) outsideOfRectY = true; if (outsideOfRectX || outsideOfRectY) return false; diff --git a/dqn_unit_test.cpp b/dqn_unit_test.cpp index 7510a41..72777a4 100644 --- a/dqn_unit_test.cpp +++ b/dqn_unit_test.cpp @@ -83,13 +83,13 @@ void HandmadeMathTestInternal() if (1) { hmm_vec3 hmmVec = HMM_Vec3i(1, 2, 3); - DqnV3 dqnVec = DqnV3_3i(1, 2, 3); + DqnV3 dqnVec = DqnV3(1, 2, 3); DqnMat4 dqnTranslate = DqnMat4_Translate3f(dqnVec.x, dqnVec.y, dqnVec.z); hmm_mat4 hmmTranslate = HMM_Translate(hmmVec); HandmadeMathVerifyMat4(dqnTranslate, hmmTranslate); hmm_vec3 hmmAxis = HMM_Vec3(0.5f, 0.2f, 0.7f); - DqnV3 dqnAxis = DqnV3_3f(0.5f, 0.2f, 0.7f); + DqnV3 dqnAxis = DqnV3(0.5f, 0.2f, 0.7f); f32 rotationInDegrees = 80.0f; DqnMat4 dqnRotate = DqnMat4_Rotate(DQN_DEGREES_TO_RADIANS(rotationInDegrees), dqnAxis.x, @@ -110,7 +110,7 @@ void HandmadeMathTestInternal() // Test Mat4 * MulV4 if (1) { - DqnV4 dqnV4 = DqnV4_4f(1, 2, 3, 4); + DqnV4 dqnV4 = DqnV4(1, 2, 3, 4); hmm_vec4 hmmV4 = HMM_Vec4(1, 2, 3, 4); DqnV4 dqnResult = DqnMat4_MulV4(dqnTSMatrix, dqnV4); @@ -703,7 +703,7 @@ void DqnVX_Test() // V2 Creating if (1) { - DqnV2 vec = DqnV2_2f(5.5f, 5.0f); + DqnV2 vec = DqnV2(5.5f, 5.0f); DQN_ASSERT(vec.x == 5.5f && vec.y == 5.0f); DQN_ASSERT(vec.w == 5.5f && vec.h == 5.0f); LogSuccess("DqnV2(): Creating"); @@ -712,7 +712,7 @@ void DqnVX_Test() // V2 with 2 integers if (1) { - DqnV2 vec = DqnV2_2i(3, 5); + DqnV2 vec = DqnV2(3, 5); DQN_ASSERT(vec.x == 3 && vec.y == 5.0f); DQN_ASSERT(vec.w == 3 && vec.h == 5.0f); LogSuccess("DqnV2(): with 2 integers"); @@ -721,25 +721,25 @@ void DqnVX_Test() // V2 Arithmetic if (1) { - DqnV2 vecA = DqnV2_2f(5, 10); - DqnV2 vecB = DqnV2_2i(2, 3); + DqnV2 vecA = DqnV2(5, 10); + DqnV2 vecB = DqnV2(2, 3); DQN_ASSERT(DqnV2_Equals(vecA, vecB) == false); - DQN_ASSERT(DqnV2_Equals(vecA, DqnV2_2f(5, 10)) == true); - DQN_ASSERT(DqnV2_Equals(vecB, DqnV2_2f(2, 3)) == true); + DQN_ASSERT(DqnV2_Equals(vecA, DqnV2(5, 10)) == true); + DQN_ASSERT(DqnV2_Equals(vecB, DqnV2(2, 3)) == true); - DqnV2 result = DqnV2_Add(vecA, DqnV2_2f(5, 10)); - DQN_ASSERT(DqnV2_Equals(result, DqnV2_2f(10, 20)) == true); + DqnV2 result = DqnV2_Add(vecA, DqnV2(5, 10)); + DQN_ASSERT(DqnV2_Equals(result, DqnV2(10, 20)) == true); - result = DqnV2_Sub(result, DqnV2_2f(5, 10)); - DQN_ASSERT(DqnV2_Equals(result, DqnV2_2f(5, 10)) == true); + result = DqnV2_Sub(result, DqnV2(5, 10)); + DQN_ASSERT(DqnV2_Equals(result, DqnV2(5, 10)) == true); result = DqnV2_Scalef(result, 5); - DQN_ASSERT(DqnV2_Equals(result, DqnV2_2f(25, 50)) == true); + DQN_ASSERT(DqnV2_Equals(result, DqnV2(25, 50)) == true); - result = DqnV2_Hadamard(result, DqnV2_2f(10, 0.5f)); - DQN_ASSERT(DqnV2_Equals(result, DqnV2_2f(250, 25)) == true); + result = DqnV2_Hadamard(result, DqnV2(10.0f, 0.5f)); + DQN_ASSERT(DqnV2_Equals(result, DqnV2(250, 25)) == true); - f32 dotResult = DqnV2_Dot(DqnV2_2f(5, 10), DqnV2_2f(3, 4)); + f32 dotResult = DqnV2_Dot(DqnV2(5, 10), DqnV2(3, 4)); DQN_ASSERT(dotResult == 55); LogSuccess("DqnV2(): Arithmetic"); } @@ -747,29 +747,29 @@ void DqnVX_Test() // Test operator overloading if (1) { - DqnV2 vecA = DqnV2_2f(5, 10); - DqnV2 vecB = DqnV2_2i(2, 3); + DqnV2 vecA = DqnV2(5, 10); + DqnV2 vecB = DqnV2(2, 3); DQN_ASSERT((vecA == vecB) == false); - DQN_ASSERT((vecA == DqnV2_2f(5, 10)) == true); - DQN_ASSERT((vecB == DqnV2_2f(2, 3)) == true); + DQN_ASSERT((vecA == DqnV2(5, 10)) == true); + DQN_ASSERT((vecB == DqnV2(2, 3)) == true); - DqnV2 result = vecA + DqnV2_2f(5, 10); - DQN_ASSERT((result == DqnV2_2f(10, 20)) == true); + DqnV2 result = vecA + DqnV2(5, 10); + DQN_ASSERT((result == DqnV2(10, 20)) == true); - result -= DqnV2_2f(5, 10); - DQN_ASSERT((result == DqnV2_2f(5, 10)) == true); + result -= DqnV2(5, 10); + DQN_ASSERT((result == DqnV2(5, 10)) == true); result *= 5; - DQN_ASSERT((result == DqnV2_2f(25, 50)) == true); + DQN_ASSERT((result == DqnV2(25, 50)) == true); - result = result * DqnV2_2f(10, 0.5f); - DQN_ASSERT((result == DqnV2_2f(250, 25)) == true); + result = result * DqnV2(10.0f, 0.5f); + DQN_ASSERT((result == DqnV2(250, 25)) == true); - result += DqnV2_2f(1, 1); - DQN_ASSERT((result == DqnV2_2f(251, 26)) == true); + result += DqnV2(1, 1); + DQN_ASSERT((result == DqnV2(251, 26)) == true); - result = result - DqnV2_2f(1, 1); - DQN_ASSERT((result == DqnV2_2f(250, 25)) == true); + result = result - DqnV2(1, 1); + DQN_ASSERT((result == DqnV2(250, 25)) == true); LogSuccess("DqnV2(): operator overloading"); } @@ -777,8 +777,8 @@ void DqnVX_Test() if (1) { const f32 EPSILON = 0.001f; - DqnV2 a = DqnV2_2f(0, 0); - DqnV2 b = DqnV2_2f(3, 4); + DqnV2 a = DqnV2(0, 0); + DqnV2 b = DqnV2(3, 4); f32 lengthSq = DqnV2_LengthSquared(a, b); DQN_ASSERT(lengthSq == 25); @@ -796,7 +796,7 @@ void DqnVX_Test() DQN_ASSERT_MSG(diffNormY < EPSILON, "normalised.y: %f, normY: %f\n", normalised.y, normY); - DqnV2 c = DqnV2_2f(3.5f, 8.0f); + DqnV2 c = DqnV2(3.5f, 8.0f); DQN_ASSERT(DqnV2_Overlaps(b, c) == true); DQN_ASSERT(DqnV2_Overlaps(b, a) == false); @@ -809,8 +809,8 @@ void DqnVX_Test() // V2 ConstrainToRatio if (1) { - DqnV2 ratio = DqnV2_2f(16, 9); - DqnV2 dim = DqnV2_2f(2000, 1080); + DqnV2 ratio = DqnV2(16, 9); + DqnV2 dim = DqnV2(2000, 1080); DqnV2 result = DqnV2_ConstrainToRatio(dim, ratio); DQN_ASSERT(result.w == 1920 && result.h == 1080); LogSuccess("DqnV2->ConstrainToRatio()"); @@ -823,7 +823,7 @@ void DqnVX_Test() // V3i Creating if (1) { - DqnV3 vec = DqnV3_3f(5.5f, 5.0f, 5.875f); + DqnV3 vec = DqnV3(5.5f, 5.0f, 5.875f); DQN_ASSERT(vec.x == 5.5f && vec.y == 5.0f && vec.z == 5.875f); DQN_ASSERT(vec.r == 5.5f && vec.g == 5.0f && vec.b == 5.875f); LogSuccess("DqnV3(): Creating"); @@ -832,7 +832,7 @@ void DqnVX_Test() // V3i Creating if (1) { - DqnV3 vec = DqnV3_3i(3, 4, 5); + DqnV3 vec = DqnV3(3, 4, 5); DQN_ASSERT(vec.x == 3 && vec.y == 4 && vec.z == 5); DQN_ASSERT(vec.r == 3 && vec.g == 4 && vec.b == 5); LogSuccess("DqnV3(): Creating"); @@ -841,58 +841,58 @@ void DqnVX_Test() // V3 Arithmetic if (1) { - DqnV3 vecA = DqnV3_3f(5, 10, 15); - DqnV3 vecB = DqnV3_3f(2, 3, 6); + DqnV3 vecA = DqnV3(5, 10, 15); + DqnV3 vecB = DqnV3(2, 3, 6); DQN_ASSERT(DqnV3_Equals(vecA, vecB) == false); - DQN_ASSERT(DqnV3_Equals(vecA, DqnV3_3f(5, 10, 15)) == true); - DQN_ASSERT(DqnV3_Equals(vecB, DqnV3_3f(2, 3, 6)) == true); + DQN_ASSERT(DqnV3_Equals(vecA, DqnV3(5, 10, 15)) == true); + DQN_ASSERT(DqnV3_Equals(vecB, DqnV3(2, 3, 6)) == true); - DqnV3 result = DqnV3_Add(vecA, DqnV3_3f(5, 10, 15)); - DQN_ASSERT(DqnV3_Equals(result, DqnV3_3f(10, 20, 30)) == true); + DqnV3 result = DqnV3_Add(vecA, DqnV3(5, 10, 15)); + DQN_ASSERT(DqnV3_Equals(result, DqnV3(10, 20, 30)) == true); - result = DqnV3_Sub(result, DqnV3_3f(5, 10, 15)); - DQN_ASSERT(DqnV3_Equals(result, DqnV3_3f(5, 10, 15)) == true); + result = DqnV3_Sub(result, DqnV3(5, 10, 15)); + DQN_ASSERT(DqnV3_Equals(result, DqnV3(5, 10, 15)) == true); result = DqnV3_Scalef(result, 5); - DQN_ASSERT(DqnV3_Equals(result, DqnV3_3f(25, 50, 75)) == true); + DQN_ASSERT(DqnV3_Equals(result, DqnV3(25, 50, 75)) == true); - result = DqnV3_Hadamard(result, DqnV3_3f(10.0f, 0.5f, 10.0f)); - DQN_ASSERT(DqnV3_Equals(result, DqnV3_3f(250, 25, 750)) == true); + result = DqnV3_Hadamard(result, DqnV3(10.0f, 0.5f, 10.0f)); + DQN_ASSERT(DqnV3_Equals(result, DqnV3(250, 25, 750)) == true); - f32 dotResult = DqnV3_Dot(DqnV3_3f(5, 10, 2), DqnV3_3f(3, 4, 6)); + f32 dotResult = DqnV3_Dot(DqnV3(5, 10, 2), DqnV3(3, 4, 6)); DQN_ASSERT(dotResult == 67); DqnV3 cross = DqnV3_Cross(vecA, vecB); - DQN_ASSERT(DqnV3_Equals(cross, DqnV3_3f(15, 0, -5)) == true); + DQN_ASSERT(DqnV3_Equals(cross, DqnV3(15, 0, -5)) == true); LogSuccess("DqnV3(): Arithmetic"); } // V3 More Arithmetic if (1) { - DqnV3 vecA = DqnV3_3f(5, 10, 15); - DqnV3 vecB = DqnV3_3f(2, 3, 6); + DqnV3 vecA = DqnV3(5, 10, 15); + DqnV3 vecB = DqnV3(2, 3, 6); DQN_ASSERT((vecA == vecB) == false); - DQN_ASSERT((vecA == DqnV3_3f(5, 10, 15)) == true); - DQN_ASSERT((vecB == DqnV3_3f(2, 3, 6)) == true); + DQN_ASSERT((vecA == DqnV3(5, 10, 15)) == true); + DQN_ASSERT((vecB == DqnV3(2, 3, 6)) == true); - DqnV3 result = vecA + DqnV3_3f(5, 10, 15); - DQN_ASSERT((result == DqnV3_3f(10, 20, 30)) == true); + DqnV3 result = vecA + DqnV3(5, 10, 15); + DQN_ASSERT((result == DqnV3(10, 20, 30)) == true); - result -= DqnV3_3f(5, 10, 15); - DQN_ASSERT((result == DqnV3_3f(5, 10, 15)) == true); + result -= DqnV3(5, 10, 15); + DQN_ASSERT((result == DqnV3(5, 10, 15)) == true); result = result * 5; - DQN_ASSERT((result == DqnV3_3f(25, 50, 75)) == true); + DQN_ASSERT((result == DqnV3(25, 50, 75)) == true); - result *= DqnV3_3f(10.0f, 0.5f, 10.0f); - DQN_ASSERT((result == DqnV3_3f(250, 25, 750)) == true); + result *= DqnV3(10.0f, 0.5f, 10.0f); + DQN_ASSERT((result == DqnV3(250, 25, 750)) == true); - result = result - DqnV3_3f(1, 1, 1); - DQN_ASSERT((result == DqnV3_3f(249, 24, 749)) == true); + result = result - DqnV3(1, 1, 1); + DQN_ASSERT((result == DqnV3(249, 24, 749)) == true); - result += DqnV3_3f(1, 1, 1); - DQN_ASSERT((result == DqnV3_3f(250, 25, 750)) == true); + result += DqnV3(1, 1, 1); + DQN_ASSERT((result == DqnV3(250, 25, 750)) == true); LogSuccess("DqnV3(): More Arithmetic"); } } @@ -904,7 +904,7 @@ void DqnVX_Test() // V4 Creating if (1) { - DqnV4 vec = DqnV4_4f(5.5f, 5.0f, 5.875f, 5.928f); + DqnV4 vec = DqnV4(5.5f, 5.0f, 5.875f, 5.928f); DQN_ASSERT(vec.x == 5.5f && vec.y == 5.0f && vec.z == 5.875f && vec.w == 5.928f); DQN_ASSERT(vec.r == 5.5f && vec.g == 5.0f && vec.b == 5.875f && vec.a == 5.928f); LogSuccess("DqnV4(): Creating"); @@ -913,7 +913,7 @@ void DqnVX_Test() // V4i Creating if (1) { - DqnV4 vec = DqnV4_4i(3, 4, 5, 6); + DqnV4 vec = DqnV4(3, 4, 5, 6); DQN_ASSERT(vec.x == 3 && vec.y == 4 && vec.z == 5 && vec.w == 6); DQN_ASSERT(vec.r == 3 && vec.g == 4 && vec.b == 5 && vec.a == 6); LogSuccess("DqnV4(): Integer ctor creating"); @@ -922,25 +922,25 @@ void DqnVX_Test() // V4 Arithmetic if (1) { - DqnV4 vecA = DqnV4_4f(5, 10, 15, 20); - DqnV4 vecB = DqnV4_4i(2, 3, 6, 8); + DqnV4 vecA = DqnV4(5, 10, 15, 20); + DqnV4 vecB = DqnV4(2, 3, 6, 8); DQN_ASSERT(DqnV4_Equals(vecA, vecB) == false); - DQN_ASSERT(DqnV4_Equals(vecA, DqnV4_4f(5, 10, 15, 20)) == true); - DQN_ASSERT(DqnV4_Equals(vecB, DqnV4_4f(2, 3, 6, 8)) == true); + DQN_ASSERT(DqnV4_Equals(vecA, DqnV4(5, 10, 15, 20)) == true); + DQN_ASSERT(DqnV4_Equals(vecB, DqnV4(2, 3, 6, 8)) == true); - DqnV4 result = DqnV4_Add(vecA, DqnV4_4f(5, 10, 15, 20)); - DQN_ASSERT(DqnV4_Equals(result, DqnV4_4f(10, 20, 30, 40)) == true); + DqnV4 result = DqnV4_Add(vecA, DqnV4(5, 10, 15, 20)); + DQN_ASSERT(DqnV4_Equals(result, DqnV4(10, 20, 30, 40)) == true); - result = DqnV4_Sub(result, DqnV4_4f(5, 10, 15, 20)); - DQN_ASSERT(DqnV4_Equals(result, DqnV4_4f(5, 10, 15, 20)) == true); + result = DqnV4_Sub(result, DqnV4(5, 10, 15, 20)); + DQN_ASSERT(DqnV4_Equals(result, DqnV4(5, 10, 15, 20)) == true); result = DqnV4_Scalef(result, 5); - DQN_ASSERT(DqnV4_Equals(result, DqnV4_4f(25, 50, 75, 100)) == true); + DQN_ASSERT(DqnV4_Equals(result, DqnV4(25, 50, 75, 100)) == true); - result = DqnV4_Hadamard(result, DqnV4_4f(10, 0.5f, 10, 0.25f)); - DQN_ASSERT(DqnV4_Equals(result, DqnV4_4f(250, 25, 750, 25)) == true); + result = DqnV4_Hadamard(result, DqnV4(10.0f, 0.5f, 10.0f, 0.25f)); + DQN_ASSERT(DqnV4_Equals(result, DqnV4(250, 25, 750, 25)) == true); - f32 dotResult = DqnV4_Dot(DqnV4_4f(5, 10, 2, 8), DqnV4_4f(3, 4, 6, 5)); + f32 dotResult = DqnV4_Dot(DqnV4(5, 10, 2, 8), DqnV4(3, 4, 6, 5)); DQN_ASSERT(dotResult == 107); LogSuccess("DqnV4(): Arithmetic"); } @@ -948,29 +948,29 @@ void DqnVX_Test() // V4 More Arthmetic if (1) { - DqnV4 vecA = DqnV4_4f(5, 10, 15, 20); - DqnV4 vecB = DqnV4_4i(2, 3, 6, 8); + DqnV4 vecA = DqnV4(5, 10, 15, 20); + DqnV4 vecB = DqnV4(2, 3, 6, 8); DQN_ASSERT((vecA == vecB) == false); - DQN_ASSERT((vecA == DqnV4_4f(5, 10, 15, 20)) == true); - DQN_ASSERT((vecB == DqnV4_4f(2, 3, 6, 8)) == true); + DQN_ASSERT((vecA == DqnV4(5, 10, 15, 20)) == true); + DQN_ASSERT((vecB == DqnV4(2, 3, 6, 8)) == true); - DqnV4 result = vecA + DqnV4_4f(5, 10, 15, 20); - DQN_ASSERT((result == DqnV4_4f(10, 20, 30, 40)) == true); + DqnV4 result = vecA + DqnV4(5, 10, 15, 20); + DQN_ASSERT((result == DqnV4(10, 20, 30, 40)) == true); - result = result - DqnV4_4f(5, 10, 15, 20); - DQN_ASSERT((result == DqnV4_4f(5, 10, 15, 20)) == true); + result = result - DqnV4(5, 10, 15, 20); + DQN_ASSERT((result == DqnV4(5, 10, 15, 20)) == true); result = result * 5; - DQN_ASSERT((result == DqnV4_4f(25, 50, 75, 100)) == true); + DQN_ASSERT((result == DqnV4(25, 50, 75, 100)) == true); - result *= DqnV4_4f(10, 0.5f, 10, 0.25f); - DQN_ASSERT((result == DqnV4_4f(250, 25, 750, 25)) == true); + result *= DqnV4(10.0f, 0.5f, 10.0f, 0.25f); + DQN_ASSERT((result == DqnV4(250, 25, 750, 25)) == true); - result += DqnV4_4f(1, 1, 1, 1); - DQN_ASSERT((result == DqnV4_4f(251, 26, 751, 26)) == true); + result += DqnV4(1, 1, 1, 1); + DQN_ASSERT((result == DqnV4(251, 26, 751, 26)) == true); - result -= DqnV4_4f(1, 1, 1, 1); - DQN_ASSERT((result == DqnV4_4f(250, 25, 750, 25)) == true); + result -= DqnV4(1, 1, 1, 1); + DQN_ASSERT((result == DqnV4(250, 25, 750, 25)) == true); LogSuccess("DqnV4(): More Arthmetic"); } } @@ -984,17 +984,21 @@ void DqnRect_Test() // Test rect init functions if (1) { - DqnRect rect4f = DqnRect_4f(1.1f, 2.2f, 3.3f, 4.4f); - DqnRect rect4i = DqnRect_4i(1, 2, 3, 4); + DqnRect rect4f = DqnRect(1.1f, 2.2f, 3.3f, 4.4f); + DqnRect rect4i = DqnRect(1, 2, 3, 4); DQN_ASSERT(rect4i.min.x == 1 && rect4i.min.y == 2); - DQN_ASSERT(rect4i.max.x == 3 && rect4i.max.y == 4); - DQN_ASSERT(rect4f.min.x == 1.1f && rect4f.min.y == 2.2f); - DQN_ASSERT(rect4f.max.x == 3.3f && rect4f.max.y == 4.4f); + DQN_ASSERT(rect4i.max.x == 4 && rect4i.max.y == 6); - DqnRect rect = DqnRect_Init(DqnV2_2f(-10, -10), DqnV2_2f(20, 20)); - DQN_ASSERT(DqnV2_Equals(rect.min, DqnV2_2f(-10, -10))); - DQN_ASSERT(DqnV2_Equals(rect.max, DqnV2_2f(10, 10))); + const f32 EPSILON = 0.001f; + f32 diffMaxX = rect4f.max.x - 4.4f; + f32 diffMaxY = rect4f.max.y - 6.6f; + DQN_ASSERT(rect4f.min.x == 1.1f && rect4f.min.y == 2.2f); + DQN_ASSERT(DQN_ABS(diffMaxX) < EPSILON && DQN_ABS(diffMaxY) < EPSILON); + + DqnRect rect = DqnRect(-10, -10, 20, 20); + DQN_ASSERT(DqnV2_Equals(rect.min, DqnV2(-10, -10))); + DQN_ASSERT(DqnV2_Equals(rect.max, DqnV2(10, 10))); LogSuccess("DqnRect(): Test rect init functions"); } @@ -1004,39 +1008,28 @@ void DqnRect_Test() // Test float rect if (1) { - DqnRect rect = DqnRect_Init(DqnV2_2f(-10, -10), DqnV2_2f(20, 20)); + DqnRect rect = DqnRect(DqnV2(-10, -10), DqnV2(20, 20)); f32 width, height; - DqnRect_GetSize2f(rect, &width, &height); + rect.GetSize(&width, &height); DQN_ASSERT(width == 20); DQN_ASSERT(height == 20); - DqnV2 dim = DqnRect_GetSizeV2(rect); - DQN_ASSERT(DqnV2_Equals(dim, DqnV2_2f(20, 20))); + DqnV2 dim = rect.GetSize(); + DQN_ASSERT(DqnV2_Equals(dim, DqnV2(20, 20))); LogSuccess("DqnRect->GetSize(): Test float rect"); } - - // Test rect with float values and GetSize as 2 integers - if (1) - { - DqnRect rect = DqnRect_Init(DqnV2_2f(-10.5f, -10.5f), DqnV2_2f(20.5f, 20.5f)); - i32 width, height; - DqnRect_GetSize2i(rect, &width, &height); - DQN_ASSERT(width == 20); - DQN_ASSERT(height == 20); - LogSuccess("DqnRect->GetSize(): Test rect with float values and GetSize as 2 integers"); - } } // Test rect get centre - DqnRect rect = DqnRect_Init(DqnV2_2f(-10, -10), DqnV2_2f(20, 20)); - DqnV2 rectCenter = DqnRect_GetCentre(rect); - DQN_ASSERT(DqnV2_Equals(rectCenter, DqnV2_2f(0, 0))); + DqnRect rect = DqnRect(DqnV2(-10, -10), DqnV2(20, 20)); + DqnV2 rectCenter = rect.GetCenter(); + DQN_ASSERT(DqnV2_Equals(rectCenter, DqnV2(0, 0))); LogSuccess("DqnRect->GetCentre()"); // Test clipping rect get centre - DqnRect clipRect = DqnRect_4i(-15, -15, 10, 10); - DqnRect clipResult = DqnRect_ClipRect(rect, clipRect); + DqnRect clipRect = DqnRect(-15, -15, 10, 10); + DqnRect clipResult = rect.ClipRect(clipRect); DQN_ASSERT(clipResult.min.x == -10 && clipResult.min.y == -10); DQN_ASSERT(clipResult.max.x == 10 && clipResult.max.y == 10); LogSuccess("DqnRect->ClipRect()"); @@ -1044,29 +1037,29 @@ void DqnRect_Test() // Test shifting rect if (1) { - DqnRect shiftedRect = DqnRect_Move(rect, DqnV2_2f(10, 0)); - DQN_ASSERT(DqnV2_Equals(shiftedRect.min, DqnV2_2f(0, -10))); - DQN_ASSERT(DqnV2_Equals(shiftedRect.max, DqnV2_2f(20, 10))); + DqnRect shiftedRect = rect.Move(DqnV2(10, 0)); + DQN_ASSERT(DqnV2_Equals(shiftedRect.min, DqnV2(0, -10))); + DQN_ASSERT(DqnV2_Equals(shiftedRect.max, DqnV2(20, 10))); // Ensure dimensions have remained the same if (1) { f32 width, height; - DqnRect_GetSize2f(shiftedRect, &width, &height); + shiftedRect.GetSize(&width, &height); DQN_ASSERT(width == 20); DQN_ASSERT(height == 20); - DqnV2 dim = DqnRect_GetSizeV2(shiftedRect); - DQN_ASSERT(DqnV2_Equals(dim, DqnV2_2f(20, 20))); + DqnV2 dim = shiftedRect.GetSize(); + DQN_ASSERT(DqnV2_Equals(dim, DqnV2(20, 20))); } // Test rect contains p if (1) { - DqnV2 inP = DqnV2_2f(5, 5); - DqnV2 outP = DqnV2_2f(100, 100); - DQN_ASSERT(DqnRect_ContainsP(shiftedRect, inP)); - DQN_ASSERT(!DqnRect_ContainsP(shiftedRect, outP)); + DqnV2 inP = DqnV2(5, 5); + DqnV2 outP = DqnV2(100, 100); + DQN_ASSERT(shiftedRect.ContainsP(inP)); + DQN_ASSERT(!shiftedRect.ContainsP(outP)); } LogSuccess("DqnRect->Move()"); @@ -1086,7 +1079,7 @@ void DqnArray_TestInternal(const DqnMemAPI memAPI) // Test basic insert if (1) { - DqnV2 va = DqnV2_2f(5, 10); + DqnV2 va = DqnV2(5, 10); DQN_ASSERT(array.Push(va)); DqnV2 vb = array.data[0]; @@ -1100,7 +1093,7 @@ void DqnArray_TestInternal(const DqnMemAPI memAPI) // Test array resizing and freeing if (1) { - DqnV2 va = DqnV2_2f(10, 15); + DqnV2 va = DqnV2(10, 15); DQN_ASSERT(array.Push(va)); DqnV2 vb = array.data[0]; @@ -1148,7 +1141,7 @@ void DqnArray_TestInternal(const DqnMemAPI memAPI) DQN_ASSERT(array.max >= 11); DQN_ASSERT(array.count == 11); - DqnV2 vc = DqnV2_2f(90, 100); + DqnV2 vc = DqnV2(90, 100); DQN_ASSERT(array.Push(vc)); DQN_ASSERT(array.max >= 12); DQN_ASSERT(array.count == 12); @@ -1170,10 +1163,10 @@ void DqnArray_TestInternal(const DqnMemAPI memAPI) if (1) { - DqnV2 a = DqnV2_2f(1, 2); - DqnV2 b = DqnV2_2f(3, 4); - DqnV2 c = DqnV2_2f(5, 6); - DqnV2 d = DqnV2_2f(7, 8); + DqnV2 a = DqnV2(1, 2); + DqnV2 b = DqnV2(3, 4); + DqnV2 c = DqnV2(5, 6); + DqnV2 d = DqnV2(7, 8); DQN_ASSERT(array.Init(16, memAPI)); DQN_ASSERT(array.Remove(0) == false); @@ -1219,10 +1212,10 @@ void DqnArray_TestInternal(const DqnMemAPI memAPI) if (1) { - DqnV2 a = DqnV2_2f(1, 2); - DqnV2 b = DqnV2_2f(3, 4); - DqnV2 c = DqnV2_2f(5, 6); - DqnV2 d = DqnV2_2f(7, 8); + DqnV2 a = DqnV2(1, 2); + DqnV2 b = DqnV2(3, 4); + DqnV2 c = DqnV2(5, 6); + DqnV2 d = DqnV2(7, 8); DQN_ASSERT(array.Init(16, memAPI));