// NOTE: Table Of Contents ========================================================================= // Index | Disable #define | Description // ================================================================================================= // [$VEC2] Dqn_V2, V2i | DQN_NO_V2 | // [$VEC3] Dqn_V3, V3i | DQN_NO_V3 | // [$VEC4] Dqn_V4, V4i | DQN_NO_V4 | // [$MAT4] Dqn_M4 | DQN_NO_M4 | // [$RECT] Dqn_Rect | DQN_NO_RECT | // [$MATH] Other | | // ================================================================================================= #if !defined(DQN_NO_V2) // NOTE: [$VEC2] Vector2 =========================================================================== struct Dqn_V2I { int32_t x, y; Dqn_V2I() = default; Dqn_V2I(Dqn_f32 x_, Dqn_f32 y_): x((int32_t)x_), y((int32_t)y_) {} Dqn_V2I(int32_t x_, int32_t y_): x(x_), y(y_) {} Dqn_V2I(int32_t xy): x(xy), y(xy) {} bool operator!=(Dqn_V2I other) const { return !(*this == other); } bool operator==(Dqn_V2I other) const { return (x == other.x) && (y == other.y); } bool operator>=(Dqn_V2I other) const { return (x >= other.x) && (y >= other.y); } bool operator<=(Dqn_V2I other) const { return (x <= other.x) && (y <= other.y); } bool operator< (Dqn_V2I other) const { return (x < other.x) && (y < other.y); } bool operator> (Dqn_V2I other) const { return (x > other.x) && (y > other.y); } Dqn_V2I operator- (Dqn_V2I other) const { Dqn_V2I result(x - other.x, y - other.y); return result; } Dqn_V2I operator+ (Dqn_V2I other) const { Dqn_V2I result(x + other.x, y + other.y); return result; } Dqn_V2I operator* (Dqn_V2I other) const { Dqn_V2I result(x * other.x, y * other.y); return result; } Dqn_V2I operator* (Dqn_f32 other) const { Dqn_V2I result(x * other, y * other); return result; } Dqn_V2I operator* (int32_t other) const { Dqn_V2I result(x * other, y * other); return result; } Dqn_V2I operator/ (Dqn_V2I other) const { Dqn_V2I result(x / other.x, y / other.y); return result; } Dqn_V2I operator/ (Dqn_f32 other) const { Dqn_V2I result(x / other, y / other); return result; } Dqn_V2I operator/ (int32_t other) const { Dqn_V2I result(x / other, y / other); return result; } Dqn_V2I &operator*=(Dqn_V2I other) { *this = *this * other; return *this; } Dqn_V2I &operator*=(Dqn_f32 other) { *this = *this * other; return *this; } Dqn_V2I &operator*=(int32_t other) { *this = *this * other; return *this; } Dqn_V2I &operator-=(Dqn_V2I other) { *this = *this - other; return *this; } Dqn_V2I &operator+=(Dqn_V2I other) { *this = *this + other; return *this; } }; struct Dqn_V2 { Dqn_f32 x, y; Dqn_V2() = default; Dqn_V2(Dqn_f32 a) : x(a), y(a) {} Dqn_V2(int32_t a) : x((Dqn_f32)a), y((Dqn_f32)a) {} Dqn_V2(Dqn_f32 x, Dqn_f32 y): x(x), y(y) {} Dqn_V2(int32_t x, int32_t y): x((Dqn_f32)x), y((Dqn_f32)y) {} Dqn_V2(Dqn_V2I a) : x((Dqn_f32)a.x),y((Dqn_f32)a.y){} bool operator!=(Dqn_V2 other) const { return !(*this == other); } bool operator==(Dqn_V2 other) const { return (x == other.x) && (y == other.y); } bool operator>=(Dqn_V2 other) const { return (x >= other.x) && (y >= other.y); } bool operator<=(Dqn_V2 other) const { return (x <= other.x) && (y <= other.y); } bool operator< (Dqn_V2 other) const { return (x < other.x) && (y < other.y); } bool operator> (Dqn_V2 other) const { return (x > other.x) && (y > other.y); } Dqn_V2 operator- (Dqn_V2 other) const { Dqn_V2 result(x - other.x, y - other.y); return result; } Dqn_V2 operator+ (Dqn_V2 other) const { Dqn_V2 result(x + other.x, y + other.y); return result; } Dqn_V2 operator* (Dqn_V2 other) const { Dqn_V2 result(x * other.x, y * other.y); return result; } Dqn_V2 operator* (Dqn_f32 other) const { Dqn_V2 result(x * other, y * other); return result; } Dqn_V2 operator* (int32_t other) const { Dqn_V2 result(x * other, y * other); return result; } Dqn_V2 operator/ (Dqn_V2 other) const { Dqn_V2 result(x / other.x, y / other.y); return result; } Dqn_V2 operator/ (Dqn_f32 other) const { Dqn_V2 result(x / other, y / other); return result; } Dqn_V2 operator/ (int32_t other) const { Dqn_V2 result(x / other, y / other); return result; } Dqn_V2 &operator*=(Dqn_V2 other) { *this = *this * other; return *this; } Dqn_V2 &operator*=(Dqn_f32 other) { *this = *this * other; return *this; } Dqn_V2 &operator*=(int32_t other) { *this = *this * other; return *this; } Dqn_V2 &operator/=(Dqn_V2 other) { *this = *this / other; return *this; } Dqn_V2 &operator/=(Dqn_f32 other) { *this = *this / other; return *this; } Dqn_V2 &operator/=(int32_t other) { *this = *this / other; return *this; } Dqn_V2 &operator-=(Dqn_V2 other) { *this = *this - other; return *this; } Dqn_V2 &operator+=(Dqn_V2 other) { *this = *this + other; return *this; } }; DQN_API Dqn_V2I Dqn_V2ToV2I(Dqn_V2 a); DQN_API Dqn_V2 Dqn_V2Min(Dqn_V2 a, Dqn_V2 b); DQN_API Dqn_V2 Dqn_V2Max(Dqn_V2 a, Dqn_V2 b); DQN_API Dqn_V2 Dqn_V2Abs(Dqn_V2 a); DQN_API Dqn_f32 Dqn_V2Dot(Dqn_V2 a, Dqn_V2 b); DQN_API Dqn_f32 Dqn_V2LengthSq(Dqn_V2 a, Dqn_V2 b); DQN_API Dqn_V2 Dqn_V2Normalise(Dqn_V2 a); DQN_API Dqn_V2 Dqn_V2Perpendicular(Dqn_V2 a); #endif // !defined(DQN_NO_V2) #if !defined(DQN_NO_V3) // NOTE: [$VEC3] Vector3 =========================================================================== struct Dqn_V3 { Dqn_f32 x, y, z; Dqn_V3() = default; Dqn_V3(Dqn_f32 a) : x(a), y(a), z(a) {} Dqn_V3(int32_t a) : x(DQN_CAST(Dqn_f32)a), y(DQN_CAST(Dqn_f32)a), z(DQN_CAST(Dqn_f32)a) {} Dqn_V3(Dqn_f32 x, Dqn_f32 y, Dqn_f32 z): x(x), y(y), z(z) {} Dqn_V3(int32_t x, int32_t y, Dqn_f32 z): x(DQN_CAST(Dqn_f32)x), y(DQN_CAST(Dqn_f32)y), z(DQN_CAST(Dqn_f32)z) {} Dqn_V3(Dqn_V2 xy, Dqn_f32 z) : x(xy.x), y(xy.y), z(z) {} bool operator!= (Dqn_V3 other) const { return !(*this == other); } bool operator== (Dqn_V3 other) const { return (x == other.x) && (y == other.y) && (z == other.z); } bool operator>= (Dqn_V3 other) const { return (x >= other.x) && (y >= other.y) && (z >= other.z); } bool operator<= (Dqn_V3 other) const { return (x <= other.x) && (y <= other.y) && (z <= other.z); } bool operator< (Dqn_V3 other) const { return (x < other.x) && (y < other.y) && (z < other.z); } bool operator> (Dqn_V3 other) const { return (x > other.x) && (y > other.y) && (z > other.z); } Dqn_V3 operator- (Dqn_V3 other) const { Dqn_V3 result(x - other.x, y - other.y, z - other.z); return result; } Dqn_V3 operator+ (Dqn_V3 other) const { Dqn_V3 result(x + other.x, y + other.y, z + other.z); return result; } Dqn_V3 operator* (Dqn_V3 other) const { Dqn_V3 result(x * other.x, y * other.y, z * other.z); return result; } Dqn_V3 operator* (Dqn_f32 other) const { Dqn_V3 result(x * other, y * other, z * other); return result; } Dqn_V3 operator* (int32_t other) const { Dqn_V3 result(x * other, y * other, z * other); return result; } Dqn_V3 operator/ (Dqn_V3 other) const { Dqn_V3 result(x / other.x, y / other.y, z / other.z); return result; } Dqn_V3 operator/ (Dqn_f32 other) const { Dqn_V3 result(x / other, y / other, z / other); return result; } Dqn_V3 operator/ (int32_t other) const { Dqn_V3 result(x / other, y / other, z / other); return result; } Dqn_V3 &operator*=(Dqn_V3 other) { *this = *this * other; return *this; } Dqn_V3 &operator*=(Dqn_f32 other) { *this = *this * other; return *this; } Dqn_V3 &operator*=(int32_t other) { *this = *this * other; return *this; } Dqn_V3 &operator/=(Dqn_V3 other) { *this = *this / other; return *this; } Dqn_V3 &operator/=(Dqn_f32 other) { *this = *this / other; return *this; } Dqn_V3 &operator/=(int32_t other) { *this = *this / other; return *this; } Dqn_V3 &operator-=(Dqn_V3 other) { *this = *this - other; return *this; } Dqn_V3 &operator+=(Dqn_V3 other) { *this = *this + other; return *this; } }; DQN_API Dqn_f32 Dqn_V3LengthSq(Dqn_V3 a); DQN_API Dqn_f32 Dqn_V3Length(Dqn_V3 a); DQN_API Dqn_V3 Dqn_V3Normalise(Dqn_V3 a); #endif // !defined(DQN_NO_V3) #if !defined(DQN_NO_V4) // NOTE: [$VEC4] Vector4 =========================================================================== #if defined(DQN_NO_V3) #error "Dqn_Rect requires Dqn_V3 hence DQN_NO_V3 must *not* be defined" #endif union Dqn_V4 { struct { Dqn_f32 x, y, z, w; }; struct { Dqn_f32 r, g, b, a; }; struct { Dqn_V2 min; Dqn_V2 max; } v2; Dqn_V3 rgb; Dqn_f32 e[4]; Dqn_V4() = default; Dqn_V4(Dqn_f32 xyzw) : x(xyzw), y(xyzw), z(xyzw), w(xyzw) {} Dqn_V4(Dqn_f32 x, Dqn_f32 y, Dqn_f32 z, Dqn_f32 w): x(x), y(y), z(z), w(w) {} Dqn_V4(int32_t x, int32_t y, int32_t z, int32_t w): x(DQN_CAST(Dqn_f32)x), y(DQN_CAST(Dqn_f32)y), z(DQN_CAST(Dqn_f32)z), w(DQN_CAST(Dqn_f32)w) {} Dqn_V4(Dqn_V3 xyz, Dqn_f32 w) : x(xyz.x), y(xyz.y), z(xyz.z), w(w) {} Dqn_V4(Dqn_V2 v2) : x(v2.x), y(v2.y), z(v2.x), w(v2.y) {} bool operator!=(Dqn_V4 other) const { return !(*this == other); } bool operator==(Dqn_V4 other) const { return (x == other.x) && (y == other.y) && (z == other.z) && (w == other.w); } bool operator>=(Dqn_V4 other) const { return (x >= other.x) && (y >= other.y) && (z >= other.z) && (w >= other.w); } bool operator<=(Dqn_V4 other) const { return (x <= other.x) && (y <= other.y) && (z <= other.z) && (w <= other.w); } bool operator< (Dqn_V4 other) const { return (x < other.x) && (y < other.y) && (z < other.z) && (w < other.w); } bool operator> (Dqn_V4 other) const { return (x > other.x) && (y > other.y) && (z > other.z) && (w > other.w); } Dqn_V4 operator- (Dqn_V4 other) const { Dqn_V4 result(x - other.x, y - other.y, z - other.z, w - other.w); return result; } Dqn_V4 operator+ (Dqn_V4 other) const { Dqn_V4 result(x + other.x, y + other.y, z + other.z, w + other.w); return result; } Dqn_V4 operator* (Dqn_V4 other) const { Dqn_V4 result(x * other.x, y * other.y, z * other.z, w * other.w); return result; } Dqn_V4 operator* (Dqn_f32 other) const { Dqn_V4 result(x * other, y * other, z * other, w * other); return result; } Dqn_V4 operator* (int32_t other) const { Dqn_V4 result(x * other, y * other, z * other, w * other); return result; } Dqn_V4 operator/ (Dqn_f32 other) const { Dqn_V4 result(x / other, y / other, z / other, w / other); return result; } Dqn_V4 &operator*=(Dqn_V4 other) { *this = *this * other; return *this; } Dqn_V4 &operator*=(Dqn_f32 other) { *this = *this * other; return *this; } Dqn_V4 &operator*=(int32_t other) { *this = *this * other; return *this; } Dqn_V4 &operator-=(Dqn_V4 other) { *this = *this - other; return *this; } Dqn_V4 &operator+=(Dqn_V4 other) { *this = *this + other; return *this; } }; #endif // !defined(DQN_NO_V4) #if !defined(DQN_NO_M4) // NOTE: [$MAT4] Dqn_M4 ============================================================================ // NOTE: Column major matrix struct Dqn_M4 { Dqn_f32 columns[4][4]; }; DQN_API Dqn_f32 Dqn_V4Dot(Dqn_V4 a, Dqn_V4 b); DQN_API Dqn_M4 Dqn_M4_Identity(); DQN_API Dqn_M4 Dqn_M4_ScaleF(Dqn_f32 x, Dqn_f32 y, Dqn_f32 z); DQN_API Dqn_M4 Dqn_M4_Scale(Dqn_V3 xyz); DQN_API Dqn_M4 Dqn_M4_TranslateF(Dqn_f32 x, Dqn_f32 y, Dqn_f32 z); DQN_API Dqn_M4 Dqn_M4_Translate(Dqn_V3 xyz); DQN_API Dqn_M4 Dqn_M4_Transpose(Dqn_M4 mat); DQN_API Dqn_M4 Dqn_M4_Rotate(Dqn_V3 axis, Dqn_f32 radians); DQN_API Dqn_M4 Dqn_M4_Orthographic(Dqn_f32 left, Dqn_f32 right, Dqn_f32 bottom, Dqn_f32 top, Dqn_f32 z_near, Dqn_f32 z_far); DQN_API Dqn_M4 Dqn_M4_Perspective(Dqn_f32 fov /*radians*/, Dqn_f32 aspect, Dqn_f32 z_near, Dqn_f32 z_far); DQN_API Dqn_M4 Dqn_M4_Add(Dqn_M4 lhs, Dqn_M4 rhs); DQN_API Dqn_M4 Dqn_M4_Sub(Dqn_M4 lhs, Dqn_M4 rhs); DQN_API Dqn_M4 Dqn_M4_Mul(Dqn_M4 lhs, Dqn_M4 rhs); DQN_API Dqn_M4 Dqn_M4_Div(Dqn_M4 lhs, Dqn_M4 rhs); DQN_API Dqn_M4 Dqn_M4_AddF(Dqn_M4 lhs, Dqn_f32 rhs); DQN_API Dqn_M4 Dqn_M4_SubF(Dqn_M4 lhs, Dqn_f32 rhs); DQN_API Dqn_M4 Dqn_M4_MulF(Dqn_M4 lhs, Dqn_f32 rhs); DQN_API Dqn_M4 Dqn_M4_DivF(Dqn_M4 lhs, Dqn_f32 rhs); #if !defined(DQN_NO_FSTRING8) DQN_API Dqn_FString8<256> Dqn_M4_ColumnMajorString(Dqn_M4 mat); #endif #endif // !defined(DQN_M4) // NOTE: [$RECT] Dqn_Rect ========================================================================== #if !defined(DQN_NO_RECT) #if defined(DQN_NO_V2) #error "Dqn_Rect requires Dqn_V2 hence DQN_NO_V2 must *not* be defined" #endif struct Dqn_Rect { Dqn_V2 min, max; Dqn_Rect() = default; Dqn_Rect(Dqn_V2 min, Dqn_V2 max) : min(min), max(max) {} Dqn_Rect(Dqn_V2I min, Dqn_V2I max) : min(min), max(max) {} Dqn_Rect(Dqn_f32 x, Dqn_f32 y, Dqn_f32 max_x, Dqn_f32 max_y) : min(x, y), max(max_x, max_y) {} bool operator==(Dqn_Rect other) const { return (min == other.min) && (max == other.max); } }; struct Dqn_RectI32 { Dqn_V2I min, max; Dqn_RectI32() = default; Dqn_RectI32(Dqn_V2I min, Dqn_V2I max) : min(min), max(max) {} }; DQN_API Dqn_Rect Dqn_Rect_InitFromPosAndSize(Dqn_V2 pos, Dqn_V2 size); DQN_API Dqn_V2 Dqn_Rect_Center(Dqn_Rect rect); DQN_API bool Dqn_Rect_ContainsPoint(Dqn_Rect rect, Dqn_V2 p); DQN_API bool Dqn_Rect_ContainsRect(Dqn_Rect a, Dqn_Rect b); DQN_API Dqn_V2 Dqn_Rect_Size(Dqn_Rect rect); DQN_API Dqn_Rect Dqn_Rect_Move(Dqn_Rect src, Dqn_V2 move_amount); DQN_API Dqn_Rect Dqn_Rect_MoveTo(Dqn_Rect src, Dqn_V2 dest); DQN_API bool Dqn_Rect_Intersects(Dqn_Rect a, Dqn_Rect b); DQN_API Dqn_Rect Dqn_Rect_Intersection(Dqn_Rect a, Dqn_Rect b); DQN_API Dqn_Rect Dqn_Rect_Union(Dqn_Rect a, Dqn_Rect b); DQN_API Dqn_Rect Dqn_Rect_FromRectI32(Dqn_RectI32 a); DQN_API Dqn_V2I Dqn_RectI32_Size(Dqn_RectI32 rect); #endif // !defined(DQN_NO_RECT) // NOTE: [$MATH] Other ============================================================================= DQN_API Dqn_V2 Dqn_Lerp_V2(Dqn_V2 a, Dqn_f32 t, Dqn_V2 b); DQN_API Dqn_f32 Dqn_Lerp_F32(Dqn_f32 a, Dqn_f32 t, Dqn_f32 b);