squash! First iteration of Type-Generic RayMath

This commit is contained in:
JayLCypher 2024-07-18 13:02:18 +02:00
parent d7c1d9ab37
commit e84d765684

View File

@ -1,252 +1,324 @@
#ifndef RAYMATH_H
#include "raymath.h" #include "raymath.h"
#endif
void rl_tgempty(void);
#if __STDC_VERSION__ < 201112L #if __STDC_VERSION__ < 201112L
#warning _Generic is a C11 directive and requires at least C11 compatibility. #warning _Generic is a C11 directive and requires at least C11 compatibility.
#endif #endif
void tgrarted(void);
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
// Module Functions Definition - TGVector // Module Functions Definition - TGVector
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
#define RLEquals(a, b) _Generic((a), \ #define RLEquals(a, b) _Generic((a), \
Vector2: _Generic((b), \ Vector2: _Generic((b), \
Vector2: Vector2Equals, \ Vector2: Vector2Equals, \
default: tgrarted), \ default: rl_tgempty \
), \
Vector3: _Generic((b), \ Vector3: _Generic((b), \
Vector3: Vector3Equals, \ Vector3: Vector3Equals, \
default: tgrarted), \ default: rl_tgempty \
), \
Vector4: _Generic((b), \ Vector4: _Generic((b), \
Vector4: Vector4Equals, \ Vector4: Vector4Equals, \
default: tgrarted), \ default: rl_tgempty \
default: _Generic((b), \ ), \
default: FloatEquals))(a, b) default: _Generic((b), \
default: FloatEquals \
) \
) (a, b)
#define RLClamp(val, min, max) _Generic((val), \ #define RLClamp(val, min, max) _Generic((val), \
Vector2: _Generic((min), \ Vector2: _Generic((min), \
Vector2: _Generic((max), \ Vector2: _Generic((max), \
Vector2: Vector2Clamp, \ Vector2: Vector2Clamp, \
default: tgrarted), \ default: rl_tgempty \
default: _Generic((max), \ ), \
default: Vector2ClampValue)), \ default: _Generic((max), \
default: Vector2ClampValue \
) \
), \
Vector3: _Generic((min), \ Vector3: _Generic((min), \
Vector3: _Generic((max), \ Vector3: _Generic((max), \
Vector3: Vector3Clamp, \ Vector3: Vector3Clamp, \
default: tgrarted), \ default: rl_tgempty \
default: _Generic((max), \ ), \
default: Vector3ClampValue)), \ default: _Generic((max), \
default: _Generic((min), \ default: Vector3ClampValue \
default: _Generic((max), \ ) \
default: Clamp)))(val, min, max) ), \
default: _Generic((min), \
default: _Generic((max), \
default: Clamp \
) \
) \
) (val, min, max)
#define RLLerp(a, b, amount) _Generic((a), \ #define RLLerp(a, b, amount) _Generic((a), \
Vector2: _Generic((b), \ Vector2: _Generic((b), \
Vector2: Vector2Lerp, \ Vector2: Vector2Lerp, \
default: tgrarted), \ default: rl_tgempty \
Vector3: _Generic((b), \ ), \
Vector3: Vector3Lerp, \ Vector3: _Generic((b), \
default: tgrarted), \ Vector3: Vector3Lerp, \
Vector4: _Generic((b), \ default: rl_tgempty \
Vector4: Vector4Lerp, \ ), \
default: tgrarted), \ Vector4: _Generic((b), \
default: _Generic((b), \ Vector4: Vector4Lerp, \
default: Lerp))(a, b, amount) default: rl_tgempty \
), \
default: _Generic((b), \
default: Lerp \
) \
) (a, b, amount)
#define VectorZero(v) _Generic((v), \ #define VectorZero(v) _Generic((v), \
Vector2: Vector2Zero, \ Vector2: Vector2Zero, \
Vector3: Vector3Zero, \ Vector3: Vector3Zero, \
Vector4: Vector4Zero)() Vector4: Vector4Zero \
) ()
#define VectorOne(v) _Generic((v), \ #define VectorOne(v) _Generic((v), \
Vector2: Vector2One, \ Vector2: Vector2One, \
Vector3: Vector3One, \ Vector3: Vector3One, \
Vector4: Vector4One)() Vector4: Vector4One \
) ()
#define VectorAdd(v, x) _Generic((v), \ #define VectorAdd(v, x) _Generic((v), \
Vector2: _Generic((x), \ Vector2: _Generic((x), \
Vector2: Vector2Add, \ Vector2: Vector2Add, \
default: Vector2AddValue), \ default: Vector2AddValue \
), \
Vector3: _Generic((x), \ Vector3: _Generic((x), \
Vector3: Vector3Add, \ Vector3: Vector3Add, \
default: Vector3AddValue), \ default: Vector3AddValue \
), \
Vector4: _Generic((x), \ Vector4: _Generic((x), \
Vector4: Vector4Add, \ Vector4: Vector4Add, \
default: Vector4AddValue))(v, x) default: Vector4AddValue \
) \
) (v, x)
#define VectorSubtract(v, x) _Generic((v), \ #define VectorSubtract(v, x) _Generic((v), \
Vector2: _Generic((x), \ Vector2: _Generic((x), \
Vector2: Vector2Subtract, \ Vector2: Vector2Subtract, \
default: Vector2SubtractValue), \ default: Vector2SubtractValue \
), \
Vector3: _Generic((x), \ Vector3: _Generic((x), \
Vector3: Vector3Subtract, \ Vector3: Vector3Subtract, \
default: Vector3SubtractValue), \ default: Vector3SubtractValue \
), \
Vector4: _Generic((x), \ Vector4: _Generic((x), \
Vector4: Vector4Subtract, \ Vector4: Vector4Subtract, \
default: Vector4SubtractValue))(v, x) default: Vector4SubtractValue \
) \
) (v, x)
#define VectorLength(v) _Generic((v), \ #define VectorLength(v) _Generic((v), \
Vector2: Vector2Length, \ Vector2: Vector2Length, \
Vector3: Vector3Length, \ Vector3: Vector3Length, \
Vector4: Vector4Length)(v) Vector4: Vector4Length \
) (v)
#define VectorLengthSqr(v) _Generic((v), \ #define VectorLengthSqr(v) _Generic((v), \
Vector2: Vector2LengthSqr, \ Vector2: Vector2LengthSqr, \
Vector3: Vector3LengthSqr, \ Vector3: Vector3LengthSqr, \
Vector4: Vector4LengthSqr)(v) Vector4: Vector4LengthSqr \
) (v)
#define VectorDotProduct(v1, v2) _Generic((v1), \ #define VectorDotProduct(v1, v2) _Generic((v1), \
Vector2: _Generic((v2), \ Vector2: _Generic((v2), \
Vector2: Vector2DotProduct, \ Vector2: Vector2DotProduct, \
default: tgrarted), \ default: rl_tgempty \
), \
Vector3: _Generic((v2), \ Vector3: _Generic((v2), \
Vector3: Vector3DotProduct, \ Vector3: Vector3DotProduct, \
default: tgrarted), \ default: rl_tgempty \
), \
Vector4: _Generic((v2), \ Vector4: _Generic((v2), \
Vector4: Vector4DotProduct, \ Vector4: Vector4DotProduct, \
default: tgrarted), \ default: rl_tgempty \
default: tgrarted)(v1, v2) ) \
) (v1, v2)
#define VectorDistance(v1, v2) _Generic((v1), \ #define VectorDistance(v1, v2) _Generic((v1), \
Vector2: _Generic((v2), \ Vector2: _Generic((v2), \
Vector2: Vector2Distance, \ Vector2: Vector2Distance, \
default: tgrarted), \ default: rl_tgempty \
), \
Vector3: _Generic((v2), \ Vector3: _Generic((v2), \
Vector3: Vector3Distance, \ Vector3: Vector3Distance, \
default: tgrarted), \ default: rl_tgempty \
), \
Vector4: _Generic((v2), \ Vector4: _Generic((v2), \
Vector4: Vector4Distance, \ Vector4: Vector4Distance, \
default: tgrarted), \ default: rl_tgempty \
default: tgrarted)(v1, v2) ) \
) (v1, v2)
#define VectorDistanceSqr(v1, v2) _Generic((v1), \ #define VectorDistanceSqr(v1, v2) _Generic((v1), \
Vector2: _Generic((v2), \ Vector2: _Generic((v2), \
Vector2: Vector2DistanceSqr, \ Vector2: Vector2DistanceSqr, \
default: tgrarted), \ default: rl_tgempty \
), \
Vector3: _Generic((v2), \ Vector3: _Generic((v2), \
Vector3: Vector3DistanceSqr, \ Vector3: Vector3DistanceSqr, \
default: tgrarted), \ default: rl_tgempty \
), \
Vector4: _Generic((v2), \ Vector4: _Generic((v2), \
Vector4: Vector4DistanceSqr, \ Vector4: Vector4DistanceSqr, \
default: tgrarted), \ default: rl_tgempty \
default: tgrarted)(v1, v2) ) \
) (v1, v2)
#define VectorAngle(v1, v2) _Generic((v1), \ #define VectorAngle(v1, v2) _Generic((v1), \
Vector2: _Generic((v2), \ Vector2: _Generic((v2), \
Vector2: Vector2Angle, \ Vector2: Vector2Angle, \
default: tgrarted), \ default: rl_tgempty \
), \
Vector3: _Generic((v2), \ Vector3: _Generic((v2), \
Vector3: Vector3Angle, \ Vector3: Vector3Angle, \
default: tgrarted))(v1, v2) default: rl_tgempty \
) \
) (v1, v2)
#define VectorScale(v, scalar) _Generic((v), \ #define VectorScale(v, scalar) _Generic((v), \
Vector2: Vector2Scale, \ Vector2: Vector2Scale, \
Vector3: Vector3Scale, \ Vector3: Vector3Scale, \
Vector4: Vector4Scale)(v, scalar) Vector4: Vector4Scale \
) (v, scalar)
#define VectorMultiply(v1, v2) _Generic((v1), \ #define VectorMultiply(v1, v2) _Generic((v1), \
Vector2: _Generic((v2), \ Vector2: _Generic((v2), \
Vector2: Vector2Multiply, \ Vector2: Vector2Multiply, \
default: tgrarted), \ default: rl_tgempty \
), \
Vector3: _Generic((v2), \ Vector3: _Generic((v2), \
Vector3: Vector3Multiply, \ Vector3: Vector3Multiply, \
default: tgrarted), \ default: rl_tgempty \
), \
Vector4: _Generic((v2), \ Vector4: _Generic((v2), \
Vector4: Vector4Multiply, \ Vector4: Vector4Multiply, \
default: tgrarted))(v1, v2) default: rl_tgempty \
) \
) (v1, v2)
#define VectorNegate(v) _Generic((v), \ #define VectorNegate(v) _Generic((v), \
Vector2: Vector2Negate, \ Vector2: Vector2Negate, \
Vector3: Vector3Negate, \ Vector3: Vector3Negate, \
Vector4: Vector4Negate)(v) Vector4: Vector4Negate \
) (v)
#define VectorDivide(v1, v2) _Generic((v1), \ #define VectorDivide(v1, v2) _Generic((v1), \
Vector2: _Generic((v2), \ Vector2: _Generic((v2), \
Vector2: Vector2Divide, \ Vector2: Vector2Divide, \
default: tgrarted), \ default: rl_tgempty \
), \
Vector3: _Generic((v2), \ Vector3: _Generic((v2), \
Vector3: Vector3Divide, \ Vector3: Vector3Divide, \
default: tgrarted), \ default: rl_tgempty \
), \
Vector4: _Generic((v2), \ Vector4: _Generic((v2), \
Vector4: Vector4Divide, \ Vector4: Vector4Divide, \
default: tgrarted))(v1, v2) default: rl_tgempty \
) \
) (v1, v2)
#define VectorNormalize(v) _Generic((v), \ #define VectorNormalize(v) _Generic((v), \
Vector2: Vector2Normalize, \ Vector2: Vector2Normalize, \
Vector3: Vector3Normalize, \ Vector3: Vector3Normalize, \
Vector4: Vector4Normalize)(v) Vector4: Vector4Normalize \
) (v)
#define VectorTransform(v, m) _Generic((v), \ #define VectorTransform(v, m) _Generic((v), \
Vector2: Vector2Transform, \ Vector2: Vector2Transform, \
Vector3: Vector3Transform)(v, m) Vector3: Vector3Transform \
) (v, m)
#define VectorReflect(v, normal) _Generic((v), \ #define VectorReflect(v, normal) _Generic((v), \
Vector2: _Generic((normal), \ Vector2: _Generic((normal), \
Vector2: Vector2Reflect, \ Vector2: Vector2Reflect, \
default: tgrarted), \ default: rl_tgempty \
), \
Vector3: _Generic((normal), \ Vector3: _Generic((normal), \
Vector3: Vector3Reflect, \ Vector3: Vector3Reflect, \
default: tgrarted))(v, normal) default: rl_tgempty \
) \
) (v, normal)
#define VectorMin(v1, v2) _Generic((v1), \ #define VectorMin(v1, v2) _Generic((v1), \
Vector2: _Generic((v2), \ Vector2: _Generic((v2), \
Vector2: Vector2Min, \ Vector2: Vector2Min, \
default: tgrarted), \ default: rl_tgempty \
), \
Vector3: _Generic((v2), \ Vector3: _Generic((v2), \
Vector3: Vector3Min, \ Vector3: Vector3Min, \
default: tgrarted), \ default: rl_tgempty \
), \
Vector4: _Generic((v2), \ Vector4: _Generic((v2), \
Vector4: Vector4Min, \ Vector4: Vector4Min, \
default: tgrarted))(v1, v2) default: rl_tgempty \
) \
) (v1, v2)
#define VectorMax(v1, v2) _Generic((v1), \ #define VectorMax(v1, v2) _Generic((v1), \
Vector2: _Generic((v2), \ Vector2: _Generic((v2), \
Vector2: Vector2Max, \ Vector2: Vector2Max, \
default: tgrarted), \ default: rl_tgempty \
), \
Vector3: _Generic((v2), \ Vector3: _Generic((v2), \
Vector3: Vector3Max, \ Vector3: Vector3Max, \
default: tgrarted), \ default: rl_tgempty \
), \
Vector4: _Generic((v2), \ Vector4: _Generic((v2), \
Vector4: Vector4Max, \ Vector4: Vector4Max, \
default: tgrarted))(v1, v2) default: rl_tgempty \
) \
) (v1, v2)
/* /*
* Macro disabled due to too big a difference in rotation semantics. * Macro disabled due to too big a difference in rotation semantics.
#define VectorRotate(v, f) _Generic((f), \ #define VectorRotate(v, f) _Generic((f), \
Quaternion: _Generic((v), \ Quaternion: _Generic((v), \
Vector3: Vector3RotateByQuaternion, \ Vector3: Vector3RotateByQuaternion, \
default: tgrarted\ default: rl_tgempty\
), \ ), \
default: _Generic((v), \ default: _Generic((v), \
Vector2: Vector2Rotate, \ Vector2: Vector2Rotate, \
default: tgrarted \ default: rl_tgempty \
)\ )\
) (v, f) ) (v, f)
*/ */
#define VectorMoveTowards(v, target, d) _Generic((v), \ #define VectorMoveTowards(v, target, d) _Generic((v), \
Vector2: _Generic((target), \ Vector2: _Generic((target), \
Vector2: Vector2MoveTowards, \ Vector2: Vector2MoveTowards, \
default: tgrarted), \ default: rl_tgempty \
Vector3: _Generic((target), \ ), \
Vector3: Vector3MoveTowards, \ Vector3: _Generic((target), \
default: tgrarted), \ Vector3: Vector3MoveTowards, \
Vector4: _Generic((target), \ default: rl_tgempty \
Vector4: Vector4MoveTowards, \ ), \
default: tgrarted))(v, target, d) Vector4: _Generic((target), \
Vector4: Vector4MoveTowards, \
default: rl_tgempty \
) \
) (v, target, d)
#define VectorInvert(v) _Generic((v), \ #define VectorInvert(v) _Generic((v), \
Vector2: Vector2Invert, \ Vector2: Vector2Invert, \
Vector3: Vector3Invert, \ Vector3: Vector3Invert, \
Vector4: Vector4Invert)(v) Vector4: Vector4Invert \
) (v)
#define VectorRefract(v, n, ratio) _Generic((v), \ #define VectorRefract(v, n, ratio) _Generic((v), \
Vector2: _Generic((n), \ Vector2: _Generic((n), \
Vector2: Vector2Refract, \ Vector2: Vector2Refract, \
default: tgrarted), \ default: rl_tgempty \
Vector3: _Generic((n), \ ), \
Vector3: Vector3Refract, \ Vector3: _Generic((n), \
default: tgrarted))(v, n, ratio) Vector3: Vector3Refract, \
default: rl_tgempty \
) \
) (v, n, ratio)