412 lines
27 KiB
C
412 lines
27 KiB
C
#pragma once
|
|
#include "dqn.h"
|
|
|
|
/*
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// $$\ $$\ $$$$$$\ $$$$$$$$\ $$\ $$\
|
|
// $$$\ $$$ |$$ __$$\\__$$ __|$$ | $$ |
|
|
// $$$$\ $$$$ |$$ / $$ | $$ | $$ | $$ |
|
|
// $$\$$\$$ $$ |$$$$$$$$ | $$ | $$$$$$$$ |
|
|
// $$ \$$$ $$ |$$ __$$ | $$ | $$ __$$ |
|
|
// $$ |\$ /$$ |$$ | $$ | $$ | $$ | $$ |
|
|
// $$ | \_/ $$ |$$ | $$ | $$ | $$ | $$ |
|
|
// \__| \__|\__| \__| \__| \__| \__|
|
|
//
|
|
// dqn_math.h -- Basic math functions
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// [$VEC2] DN_V2F32, V2I32 -- DN_V2
|
|
// [$VEC3] DN_V3F32, V3I32 -- DN_V3
|
|
// [$VEC4] DN_V4F32, V4I32 -- DN_V4
|
|
// [$MAT4] DN_M4 -- DN_M4
|
|
// [$M2x3] DN_M2x3 --
|
|
// [$RECT] DN_Rect -- DN_RECT
|
|
// [$MATH] Other --
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
*/
|
|
|
|
DN_MSVC_WARNING_PUSH
|
|
DN_MSVC_WARNING_DISABLE(4201) // warning C4201: nonstandard extension used: nameless struct/union
|
|
#if !defined(DN_NO_V2)
|
|
// NOTE: [$VEC2] Vector2 ///////////////////////////////////////////////////////////////////////////
|
|
union DN_V2I32
|
|
{
|
|
struct { int32_t x, y; };
|
|
struct { int32_t w, h; };
|
|
int32_t data[2];
|
|
};
|
|
|
|
union DN_V2U16
|
|
{
|
|
struct { uint16_t x, y; };
|
|
struct { uint16_t w, h; };
|
|
uint16_t data[2];
|
|
};
|
|
|
|
union DN_V2F32
|
|
{
|
|
struct { DN_F32 x, y; };
|
|
struct { DN_F32 w, h; };
|
|
DN_F32 data[2];
|
|
};
|
|
#endif // !defined(DN_NO_V2)
|
|
|
|
#if !defined(DN_NO_V3)
|
|
// NOTE: [$VEC3] Vector3 ///////////////////////////////////////////////////////////////////////////
|
|
union DN_V3F32
|
|
{
|
|
struct { DN_F32 x, y, z; };
|
|
struct { DN_F32 r, g, b; };
|
|
DN_F32 data[3];
|
|
};
|
|
|
|
#endif // !defined(DN_NO_V3)
|
|
|
|
#if !defined(DN_NO_V4)
|
|
// NOTE: [$VEC4] Vector4 ///////////////////////////////////////////////////////////////////////////
|
|
union DN_V4F32
|
|
{
|
|
struct { DN_F32 x, y, z, w; };
|
|
struct { DN_F32 r, g, b, a; };
|
|
#if !defined(DN_NO_V3)
|
|
DN_V3F32 rgb;
|
|
DN_V3F32 xyz;
|
|
#endif
|
|
DN_F32 data[4];
|
|
};
|
|
#endif // !defined(DN_NO_V4)
|
|
DN_MSVC_WARNING_POP
|
|
|
|
#if !defined(DN_NO_M4)
|
|
// NOTE: [$MAT4] DN_M4 ////////////////////////////////////////////////////////////////////////////
|
|
struct DN_M4
|
|
{
|
|
DN_F32 columns[4][4]; // Column major matrix
|
|
};
|
|
#endif // !defined(DN_M4)
|
|
|
|
// NOTE: [$M2x3] DN_M2x3 //////////////////////////////////////////////////////////////////////////
|
|
union DN_M2x3
|
|
{
|
|
DN_F32 e[6];
|
|
DN_F32 row[2][3];
|
|
};
|
|
|
|
// NOTE: [$RECT] DN_Rect //////////////////////////////////////////////////////////////////////////
|
|
#if !defined(DN_NO_RECT)
|
|
#if defined(DN_NO_V2)
|
|
#error "Rectangles requires V2, DN_NO_V2 must not be defined"
|
|
#endif
|
|
struct DN_Rect
|
|
{
|
|
DN_V2F32 pos, size;
|
|
};
|
|
|
|
struct DN_RectMinMax
|
|
{
|
|
DN_V2F32 min, max;
|
|
};
|
|
|
|
enum DN_RectCutClip
|
|
{
|
|
DN_RectCutClip_No,
|
|
DN_RectCutClip_Yes,
|
|
};
|
|
|
|
enum DN_RectCutSide
|
|
{
|
|
DN_RectCutSide_Left,
|
|
DN_RectCutSide_Right,
|
|
DN_RectCutSide_Top,
|
|
DN_RectCutSide_Bottom,
|
|
};
|
|
|
|
struct DN_RectCut
|
|
{
|
|
DN_Rect* rect;
|
|
DN_RectCutSide side;
|
|
};
|
|
#endif // !defined(DN_NO_RECT)
|
|
|
|
// NOTE: [$MATH] Other /////////////////////////////////////////////////////////////////////////////
|
|
// NOTE: API
|
|
struct DN_RaycastLineIntersectV2Result
|
|
{
|
|
bool hit; // True if there was an intersection, false if the lines are parallel
|
|
DN_F32 t_a; // Distance along `dir_a` that the intersection occurred, e.g. `origin_a + (dir_a * t_a)`
|
|
DN_F32 t_b; // Distance along `dir_b` that the intersection occurred, e.g. `origin_b + (dir_b * t_b)`
|
|
};
|
|
|
|
#if !defined(DN_NO_V2)
|
|
// NOTE: [$VEC2] Vector2 ///////////////////////////////////////////////////////////////////////////
|
|
#define DN_V2I32_Zero DN_LITERAL(DN_V2I32){{(int32_t)(0), (int32_t)(0)}}
|
|
#define DN_V2I32_One DN_LITERAL(DN_V2I32){{(int32_t)(1), (int32_t)(1)}}
|
|
#define DN_V2I32_Init1N(x) DN_LITERAL(DN_V2I32){{(int32_t)(x), (int32_t)(x)}}
|
|
#define DN_V2I32_Init2N(x, y) DN_LITERAL(DN_V2I32){{(int32_t)(x), (int32_t)(y)}}
|
|
#define DN_V2I32_InitV2(xy) DN_LITERAL(DN_V2I32){{(int32_t)(xy).x, (int32_t)(xy).y}}
|
|
|
|
DN_API bool operator!= (DN_V2I32 lhs, DN_V2I32 rhs);
|
|
DN_API bool operator== (DN_V2I32 lhs, DN_V2I32 rhs);
|
|
DN_API bool operator>= (DN_V2I32 lhs, DN_V2I32 rhs);
|
|
DN_API bool operator<= (DN_V2I32 lhs, DN_V2I32 rhs);
|
|
DN_API bool operator< (DN_V2I32 lhs, DN_V2I32 rhs);
|
|
DN_API bool operator> (DN_V2I32 lhs, DN_V2I32 rhs);
|
|
DN_API DN_V2I32 operator- (DN_V2I32 lhs, DN_V2I32 rhs);
|
|
DN_API DN_V2I32 operator- (DN_V2I32 lhs);
|
|
DN_API DN_V2I32 operator+ (DN_V2I32 lhs, DN_V2I32 rhs);
|
|
DN_API DN_V2I32 operator* (DN_V2I32 lhs, DN_V2I32 rhs);
|
|
DN_API DN_V2I32 operator* (DN_V2I32 lhs, DN_F32 rhs);
|
|
DN_API DN_V2I32 operator* (DN_V2I32 lhs, int32_t rhs);
|
|
DN_API DN_V2I32 operator/ (DN_V2I32 lhs, DN_V2I32 rhs);
|
|
DN_API DN_V2I32 operator/ (DN_V2I32 lhs, DN_F32 rhs);
|
|
DN_API DN_V2I32 operator/ (DN_V2I32 lhs, int32_t rhs);
|
|
DN_API DN_V2I32 & operator*= (DN_V2I32& lhs, DN_V2I32 rhs);
|
|
DN_API DN_V2I32 & operator*= (DN_V2I32& lhs, DN_F32 rhs);
|
|
DN_API DN_V2I32 & operator*= (DN_V2I32& lhs, int32_t rhs);
|
|
DN_API DN_V2I32 & operator/= (DN_V2I32& lhs, DN_V2I32 rhs);
|
|
DN_API DN_V2I32 & operator/= (DN_V2I32& lhs, DN_F32 rhs);
|
|
DN_API DN_V2I32 & operator/= (DN_V2I32& lhs, int32_t rhs);
|
|
DN_API DN_V2I32 & operator-= (DN_V2I32& lhs, DN_V2I32 rhs);
|
|
DN_API DN_V2I32 & operator+= (DN_V2I32& lhs, DN_V2I32 rhs);
|
|
|
|
DN_API DN_V2I32 DN_V2I32_Min (DN_V2I32 a, DN_V2I32 b);
|
|
DN_API DN_V2I32 DN_V2I32_Max (DN_V2I32 a, DN_V2I32 b);
|
|
DN_API DN_V2I32 DN_V2I32_Abs (DN_V2I32 a);
|
|
|
|
#define DN_V2U16_Zero DN_LITERAL(DN_V2U16){{(uint16_t)(0), (uint16_t)(0)}}
|
|
#define DN_V2U16_One DN_LITERAL(DN_V2U16){{(uint16_t)(1), (uint16_t)(1)}}
|
|
#define DN_V2U16_Init1N(x) DN_LITERAL(DN_V2U16){{(uint16_t)(x), (uint16_t)(x)}}
|
|
#define DN_V2U16_Init2N(x, y) DN_LITERAL(DN_V2U16){{(uint16_t)(x), (uint16_t)(y)}}
|
|
|
|
DN_API bool operator!= (DN_V2U16 lhs, DN_V2U16 rhs);
|
|
DN_API bool operator== (DN_V2U16 lhs, DN_V2U16 rhs);
|
|
DN_API bool operator>= (DN_V2U16 lhs, DN_V2U16 rhs);
|
|
DN_API bool operator<= (DN_V2U16 lhs, DN_V2U16 rhs);
|
|
DN_API bool operator< (DN_V2U16 lhs, DN_V2U16 rhs);
|
|
DN_API bool operator> (DN_V2U16 lhs, DN_V2U16 rhs);
|
|
DN_API DN_V2U16 operator- (DN_V2U16 lhs, DN_V2U16 rhs);
|
|
DN_API DN_V2U16 operator+ (DN_V2U16 lhs, DN_V2U16 rhs);
|
|
DN_API DN_V2U16 operator* (DN_V2U16 lhs, DN_V2U16 rhs);
|
|
DN_API DN_V2U16 operator* (DN_V2U16 lhs, DN_F32 rhs);
|
|
DN_API DN_V2U16 operator* (DN_V2U16 lhs, int32_t rhs);
|
|
DN_API DN_V2U16 operator/ (DN_V2U16 lhs, DN_V2U16 rhs);
|
|
DN_API DN_V2U16 operator/ (DN_V2U16 lhs, DN_F32 rhs);
|
|
DN_API DN_V2U16 operator/ (DN_V2U16 lhs, int32_t rhs);
|
|
DN_API DN_V2U16 & operator*= (DN_V2U16& lhs, DN_V2U16 rhs);
|
|
DN_API DN_V2U16 & operator*= (DN_V2U16& lhs, DN_F32 rhs);
|
|
DN_API DN_V2U16 & operator*= (DN_V2U16& lhs, int32_t rhs);
|
|
DN_API DN_V2U16 & operator/= (DN_V2U16& lhs, DN_V2U16 rhs);
|
|
DN_API DN_V2U16 & operator/= (DN_V2U16& lhs, DN_F32 rhs);
|
|
DN_API DN_V2U16 & operator/= (DN_V2U16& lhs, int32_t rhs);
|
|
DN_API DN_V2U16 & operator-= (DN_V2U16& lhs, DN_V2U16 rhs);
|
|
DN_API DN_V2U16 & operator+= (DN_V2U16& lhs, DN_V2U16 rhs);
|
|
|
|
#define DN_V2F32_Zero DN_LITERAL(DN_V2F32){{(DN_F32)(0), (DN_F32)(0)}}
|
|
#define DN_V2F32_One DN_LITERAL(DN_V2F32){{(DN_F32)(1), (DN_F32)(1)}}
|
|
#define DN_V2F32_Init1N(x) DN_LITERAL(DN_V2F32){{(DN_F32)(x), (DN_F32)(x)}}
|
|
#define DN_V2F32_Init2N(x, y) DN_LITERAL(DN_V2F32){{(DN_F32)(x), (DN_F32)(y)}}
|
|
#define DN_V2F32_InitV2I32(xy) DN_LITERAL(DN_V2F32){{(DN_F32)(xy).x, (DN_F32)(xy).y}}
|
|
|
|
DN_API bool operator!= (DN_V2F32 lhs, DN_V2F32 rhs);
|
|
DN_API bool operator== (DN_V2F32 lhs, DN_V2F32 rhs);
|
|
DN_API bool operator>= (DN_V2F32 lhs, DN_V2F32 rhs);
|
|
DN_API bool operator<= (DN_V2F32 lhs, DN_V2F32 rhs);
|
|
DN_API bool operator< (DN_V2F32 lhs, DN_V2F32 rhs);
|
|
DN_API bool operator> (DN_V2F32 lhs, DN_V2F32 rhs);
|
|
|
|
DN_API DN_V2F32 operator- (DN_V2F32 lhs);
|
|
DN_API DN_V2F32 operator- (DN_V2F32 lhs, DN_V2F32 rhs);
|
|
DN_API DN_V2F32 operator- (DN_V2F32 lhs, DN_V2I32 rhs);
|
|
DN_API DN_V2F32 operator- (DN_V2F32 lhs, DN_F32 rhs);
|
|
DN_API DN_V2F32 operator- (DN_V2F32 lhs, int32_t rhs);
|
|
|
|
DN_API DN_V2F32 operator+ (DN_V2F32 lhs, DN_V2F32 rhs);
|
|
DN_API DN_V2F32 operator+ (DN_V2F32 lhs, DN_V2I32 rhs);
|
|
DN_API DN_V2F32 operator+ (DN_V2F32 lhs, DN_F32 rhs);
|
|
DN_API DN_V2F32 operator+ (DN_V2F32 lhs, int32_t rhs);
|
|
|
|
DN_API DN_V2F32 operator* (DN_V2F32 lhs, DN_V2F32 rhs);
|
|
DN_API DN_V2F32 operator* (DN_V2F32 lhs, DN_V2I32 rhs);
|
|
DN_API DN_V2F32 operator* (DN_V2F32 lhs, DN_F32 rhs);
|
|
DN_API DN_V2F32 operator* (DN_V2F32 lhs, int32_t rhs);
|
|
|
|
DN_API DN_V2F32 operator/ (DN_V2F32 lhs, DN_V2F32 rhs);
|
|
DN_API DN_V2F32 operator/ (DN_V2F32 lhs, DN_V2I32 rhs);
|
|
DN_API DN_V2F32 operator/ (DN_V2F32 lhs, DN_F32 rhs);
|
|
DN_API DN_V2F32 operator/ (DN_V2F32 lhs, int32_t rhs);
|
|
|
|
DN_API DN_V2F32 & operator*= (DN_V2F32& lhs, DN_V2F32 rhs);
|
|
DN_API DN_V2F32 & operator*= (DN_V2F32& lhs, DN_V2I32 rhs);
|
|
DN_API DN_V2F32 & operator*= (DN_V2F32& lhs, DN_F32 rhs);
|
|
DN_API DN_V2F32 & operator*= (DN_V2F32& lhs, int32_t rhs);
|
|
|
|
DN_API DN_V2F32 & operator/= (DN_V2F32& lhs, DN_V2F32 rhs);
|
|
DN_API DN_V2F32 & operator/= (DN_V2F32& lhs, DN_V2I32 rhs);
|
|
DN_API DN_V2F32 & operator/= (DN_V2F32& lhs, DN_F32 rhs);
|
|
DN_API DN_V2F32 & operator/= (DN_V2F32& lhs, int32_t rhs);
|
|
|
|
DN_API DN_V2F32 & operator-= (DN_V2F32& lhs, DN_V2F32 rhs);
|
|
DN_API DN_V2F32 & operator-= (DN_V2F32& lhs, DN_V2I32 rhs);
|
|
DN_API DN_V2F32 & operator-= (DN_V2F32& lhs, DN_F32 rhs);
|
|
DN_API DN_V2F32 & operator-= (DN_V2F32& lhs, int32_t rhs);
|
|
|
|
DN_API DN_V2F32 & operator+= (DN_V2F32& lhs, DN_V2F32 rhs);
|
|
DN_API DN_V2F32 & operator+= (DN_V2F32& lhs, DN_V2I32 rhs);
|
|
DN_API DN_V2F32 & operator+= (DN_V2F32& lhs, DN_F32 rhs);
|
|
DN_API DN_V2F32 & operator+= (DN_V2F32& lhs, int32_t rhs);
|
|
|
|
DN_API DN_V2F32 DN_V2_Min (DN_V2F32 a, DN_V2F32 b);
|
|
DN_API DN_V2F32 DN_V2_Max (DN_V2F32 a, DN_V2F32 b);
|
|
DN_API DN_V2F32 DN_V2_Abs (DN_V2F32 a);
|
|
DN_API DN_F32 DN_V2_Dot (DN_V2F32 a, DN_V2F32 b);
|
|
DN_API DN_F32 DN_V2_LengthSq_V2x2 (DN_V2F32 lhs, DN_V2F32 rhs);
|
|
DN_API DN_F32 DN_V2_Length_V2x2 (DN_V2F32 lhs, DN_V2F32 rhs);
|
|
DN_API DN_F32 DN_V2_LengthSq (DN_V2F32 lhs);
|
|
DN_API DN_F32 DN_V2_Length (DN_V2F32 lhs);
|
|
DN_API DN_V2F32 DN_V2_Normalise (DN_V2F32 a);
|
|
DN_API DN_V2F32 DN_V2_Perpendicular (DN_V2F32 a);
|
|
DN_API DN_V2F32 DN_V2_Reflect (DN_V2F32 in, DN_V2F32 surface);
|
|
DN_API DN_F32 DN_V2_Area (DN_V2F32 a);
|
|
#endif // !defined(DN_NO_V2)
|
|
#if !defined(DN_NO_V3)
|
|
// NOTE: [$VEC3] Vector3 ///////////////////////////////////////////////////////////////////////////
|
|
#define DN_V3F32_Init1N(x) DN_LITERAL(DN_V3F32){{(DN_F32)(x), (DN_F32)(x), (DN_F32)(x)}}
|
|
#define DN_V3F32_Init3F32(x, y, z) DN_LITERAL(DN_V3F32){{(DN_F32)(x), (DN_F32)(y), (DN_F32)(z)}}
|
|
#define DN_V3F32_InitV2F32_1F32(xy, z) DN_LITERAL(DN_V3F32){{(DN_F32)(xy.x), (DN_F32)(xy.y), (DN_F32)(z)}}
|
|
|
|
DN_API bool operator== (DN_V3F32 lhs, DN_V3F32 rhs);
|
|
DN_API bool operator!= (DN_V3F32 lhs, DN_V3F32 rhs);
|
|
DN_API bool operator>= (DN_V3F32 lhs, DN_V3F32 rhs);
|
|
DN_API bool operator<= (DN_V3F32 lhs, DN_V3F32 rhs);
|
|
DN_API bool operator< (DN_V3F32 lhs, DN_V3F32 rhs);
|
|
DN_API bool operator> (DN_V3F32 lhs, DN_V3F32 rhs);
|
|
DN_API DN_V3F32 operator- (DN_V3F32 lhs, DN_V3F32 rhs);
|
|
DN_API DN_V3F32 operator- (DN_V3F32 lhs);
|
|
DN_API DN_V3F32 operator+ (DN_V3F32 lhs, DN_V3F32 rhs);
|
|
DN_API DN_V3F32 operator* (DN_V3F32 lhs, DN_V3F32 rhs);
|
|
DN_API DN_V3F32 operator* (DN_V3F32 lhs, DN_F32 rhs);
|
|
DN_API DN_V3F32 operator* (DN_V3F32 lhs, int32_t rhs);
|
|
DN_API DN_V3F32 operator/ (DN_V3F32 lhs, DN_V3F32 rhs);
|
|
DN_API DN_V3F32 operator/ (DN_V3F32 lhs, DN_F32 rhs);
|
|
DN_API DN_V3F32 operator/ (DN_V3F32 lhs, int32_t rhs);
|
|
DN_API DN_V3F32 & operator*= (DN_V3F32 &lhs, DN_V3F32 rhs);
|
|
DN_API DN_V3F32 & operator*= (DN_V3F32 &lhs, DN_F32 rhs);
|
|
DN_API DN_V3F32 & operator*= (DN_V3F32 &lhs, int32_t rhs);
|
|
DN_API DN_V3F32 & operator/= (DN_V3F32 &lhs, DN_V3F32 rhs);
|
|
DN_API DN_V3F32 & operator/= (DN_V3F32 &lhs, DN_F32 rhs);
|
|
DN_API DN_V3F32 & operator/= (DN_V3F32 &lhs, int32_t rhs);
|
|
DN_API DN_V3F32 & operator-= (DN_V3F32 &lhs, DN_V3F32 rhs);
|
|
DN_API DN_V3F32 & operator+= (DN_V3F32 &lhs, DN_V3F32 rhs);
|
|
DN_API DN_F32 DN_V3F32_LengthSq (DN_V3F32 a);
|
|
DN_API DN_F32 DN_V3F32_Length (DN_V3F32 a);
|
|
DN_API DN_V3F32 DN_V3F32_Normalise (DN_V3F32 a);
|
|
#endif // !defined(DN_NO_V3)
|
|
#if !defined(DN_NO_V4)
|
|
// NOTE: [$VEC4] Vector4 ///////////////////////////////////////////////////////////////////////////
|
|
#define DN_V4F32_Init1N(x) DN_LITERAL(DN_V4F32){{(DN_F32)(x), (DN_F32)(x), (DN_F32)(x), (DN_F32)(x)}}
|
|
#define DN_V4F32_Init4N(x, y, z, w) DN_LITERAL(DN_V4F32){{(DN_F32)(x), (DN_F32)(y), (DN_F32)(z), (DN_F32)(w)}}
|
|
#define DN_V4F32_InitV3_1N(xyz, w) DN_LITERAL(DN_V4F32){{xyz.x, xyz.y, xyz.z, w}}
|
|
DN_API bool operator== (DN_V4F32 lhs, DN_V4F32 rhs);
|
|
DN_API bool operator!= (DN_V4F32 lhs, DN_V4F32 rhs);
|
|
DN_API bool operator<= (DN_V4F32 lhs, DN_V4F32 rhs);
|
|
DN_API bool operator< (DN_V4F32 lhs, DN_V4F32 rhs);
|
|
DN_API bool operator> (DN_V4F32 lhs, DN_V4F32 rhs);
|
|
DN_API DN_V4F32 operator- (DN_V4F32 lhs, DN_V4F32 rhs);
|
|
DN_API DN_V4F32 operator- (DN_V4F32 lhs);
|
|
DN_API DN_V4F32 operator+ (DN_V4F32 lhs, DN_V4F32 rhs);
|
|
DN_API DN_V4F32 operator* (DN_V4F32 lhs, DN_V4F32 rhs);
|
|
DN_API DN_V4F32 operator* (DN_V4F32 lhs, DN_F32 rhs);
|
|
DN_API DN_V4F32 operator* (DN_V4F32 lhs, int32_t rhs);
|
|
DN_API DN_V4F32 operator/ (DN_V4F32 lhs, DN_F32 rhs);
|
|
DN_API DN_V4F32 & operator*= (DN_V4F32 &lhs, DN_V4F32 rhs);
|
|
DN_API DN_V4F32 & operator*= (DN_V4F32 &lhs, DN_F32 rhs);
|
|
DN_API DN_V4F32 & operator*= (DN_V4F32 &lhs, int32_t rhs);
|
|
DN_API DN_V4F32 & operator-= (DN_V4F32 &lhs, DN_V4F32 rhs);
|
|
DN_API DN_V4F32 & operator+= (DN_V4F32 &lhs, DN_V4F32 rhs);
|
|
#endif // !defined(DN_NO_V4)
|
|
#if !defined(DN_NO_M4)
|
|
// NOTE: [$MAT4] DN_M4 ////////////////////////////////////////////////////////////////////////////
|
|
DN_API DN_F32 DN_V4F32Dot (DN_V4F32 a, DN_V4F32 b);
|
|
DN_API DN_M4 DN_M4_Identity ();
|
|
DN_API DN_M4 DN_M4_ScaleF (DN_F32 x, DN_F32 y, DN_F32 z);
|
|
DN_API DN_M4 DN_M4_Scale (DN_V3F32 xyz);
|
|
DN_API DN_M4 DN_M4_TranslateF (DN_F32 x, DN_F32 y, DN_F32 z);
|
|
DN_API DN_M4 DN_M4_Translate (DN_V3F32 xyz);
|
|
DN_API DN_M4 DN_M4_Transpose (DN_M4 mat);
|
|
DN_API DN_M4 DN_M4_Rotate (DN_V3F32 axis, DN_F32 radians);
|
|
DN_API DN_M4 DN_M4_Orthographic (DN_F32 left, DN_F32 right, DN_F32 bottom, DN_F32 top, DN_F32 z_near, DN_F32 z_far);
|
|
DN_API DN_M4 DN_M4_Perspective (DN_F32 fov /*radians*/, DN_F32 aspect, DN_F32 z_near, DN_F32 z_far);
|
|
DN_API DN_M4 DN_M4_Add (DN_M4 lhs, DN_M4 rhs);
|
|
DN_API DN_M4 DN_M4_Sub (DN_M4 lhs, DN_M4 rhs);
|
|
DN_API DN_M4 DN_M4_Mul (DN_M4 lhs, DN_M4 rhs);
|
|
DN_API DN_M4 DN_M4_Div (DN_M4 lhs, DN_M4 rhs);
|
|
DN_API DN_M4 DN_M4_AddF (DN_M4 lhs, DN_F32 rhs);
|
|
DN_API DN_M4 DN_M4_SubF (DN_M4 lhs, DN_F32 rhs);
|
|
DN_API DN_M4 DN_M4_MulF (DN_M4 lhs, DN_F32 rhs);
|
|
DN_API DN_M4 DN_M4_DivF (DN_M4 lhs, DN_F32 rhs);
|
|
#if !defined(DN_NO_FSTR8)
|
|
DN_API DN_FStr8<256> DN_M4_ColumnMajorString (DN_M4 mat);
|
|
#endif
|
|
#endif // !defined(DN_NO_M4)
|
|
// NOTE: [$M2x3] DN_M2x3 //////////////////////////////////////////////////////////////////////////
|
|
DN_API bool operator== (DN_M2x3 const &lhs, DN_M2x3 const &rhs);
|
|
DN_API bool operator!= (DN_M2x3 const &lhs, DN_M2x3 const &rhs);
|
|
DN_API DN_M2x3 DN_M2x3_Identity ();
|
|
DN_API DN_M2x3 DN_M2x3_Translate (DN_V2F32 offset);
|
|
DN_API DN_M2x3 DN_M2x3_Scale (DN_V2F32 scale);
|
|
DN_API DN_M2x3 DN_M2x3_Rotate (DN_F32 radians);
|
|
DN_API DN_M2x3 DN_M2x3_Mul (DN_M2x3 m1, DN_M2x3 m2);
|
|
DN_API DN_V2F32 DN_M2x3_Mul2F32 (DN_M2x3 m1, DN_F32 x, DN_F32 y);
|
|
DN_API DN_V2F32 DN_M2x3_MulV2 (DN_M2x3 m1, DN_V2F32 v2);
|
|
#if !defined(DN_NO_RECT)
|
|
// NOTE: [$RECT] DN_Rect //////////////////////////////////////////////////////////////////////////
|
|
#define DN_Rect_Init2V2(pos, size) DN_LITERAL(DN_Rect){(pos), (size)}
|
|
#define DN_Rect_Init4N(x, y, w, h) DN_LITERAL(DN_Rect){DN_LITERAL(DN_V2F32){{x, y}}, DN_LITERAL(DN_V2F32){{w, h}}}
|
|
|
|
DN_API bool operator== (const DN_Rect& lhs, const DN_Rect& rhs);
|
|
DN_API DN_V2F32 DN_Rect_Center (DN_Rect rect);
|
|
DN_API bool DN_Rect_ContainsPoint (DN_Rect rect, DN_V2F32 p);
|
|
DN_API bool DN_Rect_ContainsRect (DN_Rect a, DN_Rect b);
|
|
DN_API DN_Rect DN_Rect_Expand (DN_Rect a, DN_F32 amount);
|
|
DN_API DN_Rect DN_Rect_ExpandV2 (DN_Rect a, DN_V2F32 amount);
|
|
DN_API bool DN_Rect_Intersects (DN_Rect a, DN_Rect b);
|
|
DN_API DN_Rect DN_Rect_Intersection (DN_Rect a, DN_Rect b);
|
|
DN_API DN_Rect DN_Rect_Union (DN_Rect a, DN_Rect b);
|
|
DN_API DN_RectMinMax DN_Rect_MinMax (DN_Rect a);
|
|
DN_API DN_F32 DN_Rect_Area (DN_Rect a);
|
|
DN_API DN_V2F32 DN_Rect_InterpolatedPoint (DN_Rect rect, DN_V2F32 t01);
|
|
DN_API DN_V2F32 DN_Rect_TopLeft (DN_Rect rect);
|
|
DN_API DN_V2F32 DN_Rect_TopRight (DN_Rect rect);
|
|
DN_API DN_V2F32 DN_Rect_BottomLeft (DN_Rect rect);
|
|
DN_API DN_V2F32 DN_Rect_BottomRight (DN_Rect rect);
|
|
|
|
DN_API DN_Rect DN_Rect_CutLeftClip (DN_Rect *rect, DN_F32 amount, DN_RectCutClip clip);
|
|
DN_API DN_Rect DN_Rect_CutRightClip (DN_Rect *rect, DN_F32 amount, DN_RectCutClip clip);
|
|
DN_API DN_Rect DN_Rect_CutTopClip (DN_Rect *rect, DN_F32 amount, DN_RectCutClip clip);
|
|
DN_API DN_Rect DN_Rect_CutBottomClip (DN_Rect *rect, DN_F32 amount, DN_RectCutClip clip);
|
|
|
|
#define DN_Rect_CutLeft(rect, amount) DN_Rect_CutLeftClip(rect, amount, DN_RectCutClip_Yes)
|
|
#define DN_Rect_CutRight(rect, amount) DN_Rect_CutRightClip(rect, amount, DN_RectCutClip_Yes)
|
|
#define DN_Rect_CutTop(rect, amount) DN_Rect_CutTopClip(rect, amount, DN_RectCutClip_Yes)
|
|
#define DN_Rect_CutBottom(rect, amount) DN_Rect_CutBottomClip(rect, amount, DN_RectCutClip_Yes)
|
|
|
|
#define DN_Rect_CutLeftNoClip(rect, amount) DN_Rect_CutLeftClip(rect, amount, DN_RectCutClip_No)
|
|
#define DN_Rect_CutRightNoClip(rect, amount) DN_Rect_CutRightClip(rect, amount, DN_RectCutClip_No)
|
|
#define DN_Rect_CutTopNoClip(rect, amount) DN_Rect_CutTopClip(rect, amount, DN_RectCutClip_No)
|
|
#define DN_Rect_CutBottomNoClip(rect, amount) DN_Rect_CutBottomClip(rect, amount, DN_RectCutClip_No)
|
|
|
|
DN_API DN_Rect DN_RectCut_Cut (DN_RectCut rect_cut, DN_V2F32 size, DN_RectCutClip clip);
|
|
#define DN_RectCut_Init(rect, side) DN_LITERAL(DN_RectCut){rect, side}
|
|
#define DN_RectCut_Left(rect) DN_LITERAL(DN_RectCut){rect, DN_RectCutSide_Left}
|
|
#define DN_RectCut_Right(rect) DN_LITERAL(DN_RectCut){rect, DN_RectCutSide_Right}
|
|
#define DN_RectCut_Top(rect) DN_LITERAL(DN_RectCut){rect, DN_RectCutSide_Top}
|
|
#define DN_RectCut_Bottom(rect) DN_LITERAL(DN_RectCut){rect, DN_RectCutSide_Bottom}
|
|
#endif // !defined(DN_NO_RECT)
|
|
// NOTE: [$MATH] Other /////////////////////////////////////////////////////////////////////////////
|
|
DN_API DN_RaycastLineIntersectV2Result DN_Raycast_LineIntersectV2(DN_V2F32 origin_a, DN_V2F32 dir_a, DN_V2F32 origin_b, DN_V2F32 dir_b);
|
|
DN_API DN_V2F32 DN_Lerp_V2F32 (DN_V2F32 a, DN_F32 t, DN_V2F32 b);
|
|
DN_API DN_F32 DN_Lerp_F32 (DN_F32 a, DN_F32 t, DN_F32 b);
|