Augment raymath.h with useful functions (#2428)
* Augment raymath.h with useful functions * Rename Vector2ClampMagnitude and Vector3ClampMagnitude to Vector2ClampValue and Vector3ClampValue * Remove Vector3{Up,Down,Left,Right,Forward,Backward}
This commit is contained in:
parent
a5daee3812
commit
52befa0815
1 changed files with 171 additions and 0 deletions
171
src/raymath.h
171
src/raymath.h
|
@ -77,6 +77,10 @@
|
||||||
#define PI 3.14159265358979323846f
|
#define PI 3.14159265358979323846f
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef EPSILON
|
||||||
|
#define EPSILON 0.000001f
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef DEG2RAD
|
#ifndef DEG2RAD
|
||||||
#define DEG2RAD (PI/180.0f)
|
#define DEG2RAD (PI/180.0f)
|
||||||
#endif
|
#endif
|
||||||
|
@ -155,6 +159,7 @@ typedef struct float16 {
|
||||||
} float16;
|
} float16;
|
||||||
|
|
||||||
#include <math.h> // Required for: sinf(), cosf(), tan(), atan2f(), sqrtf(), fminf(), fmaxf(), fabs()
|
#include <math.h> // Required for: sinf(), cosf(), tan(), atan2f(), sqrtf(), fminf(), fmaxf(), fabs()
|
||||||
|
#include <stdbool.h> // Required for: bool, false, true
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
// Module Functions Definition - Utils math
|
// Module Functions Definition - Utils math
|
||||||
|
@ -194,6 +199,14 @@ RMAPI float Remap(float value, float inputStart, float inputEnd, float outputSta
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check whether two given floats are almost equal
|
||||||
|
RMAPI bool FloatEquals(float x, float y)
|
||||||
|
{
|
||||||
|
bool result = (fabsf(x - y)) <= (EPSILON * fmaxf(1.0f, fmaxf(fabsf(x), fabsf(y))));
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
// Module Functions Definition - Vector2 math
|
// Module Functions Definition - Vector2 math
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
|
@ -414,6 +427,63 @@ RMAPI Vector2 Vector2MoveTowards(Vector2 v, Vector2 target, float maxDistance)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Invert the given vector
|
||||||
|
RMAPI Vector2 Vector2Invert(Vector2 v)
|
||||||
|
{
|
||||||
|
Vector2 result = { 1.0f / v.x, 1.0f / v.y };
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clamp the components of the vector between
|
||||||
|
// min and max values specified by the given vectors
|
||||||
|
RMAPI Vector2 Vector2Clamp(Vector2 v, Vector2 min, Vector2 max)
|
||||||
|
{
|
||||||
|
Vector2 result = { 0 };
|
||||||
|
|
||||||
|
result.x = fminf(max.x, fmaxf(min.x, v.x));
|
||||||
|
result.y = fminf(max.y, fmaxf(min.y, v.y));
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clamp the magnitude of the vector between two
|
||||||
|
// given min and max values
|
||||||
|
RMAPI Vector2 Vector2ClampValue(Vector2 v, float minMag, float maxMag)
|
||||||
|
{
|
||||||
|
Vector2 result = { 0 };
|
||||||
|
|
||||||
|
float length = (v.x * v.x) + (v.y * v.y);
|
||||||
|
if (length > 0.0f)
|
||||||
|
{
|
||||||
|
length = sqrtf(length);
|
||||||
|
|
||||||
|
if (length < minMag)
|
||||||
|
{
|
||||||
|
float scale = minMag / length;
|
||||||
|
result.x = v.x * scale;
|
||||||
|
result.y = v.y * scale;
|
||||||
|
}
|
||||||
|
else if (length > maxMag)
|
||||||
|
{
|
||||||
|
float scale = maxMag / length;
|
||||||
|
result.x = v.x * scale;
|
||||||
|
result.y = v.y * scale;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check whether two given vectors are almost equal
|
||||||
|
RMAPI bool Vector2Equals(Vector2 p, Vector2 q)
|
||||||
|
{
|
||||||
|
bool result = ((fabsf(p.x - q.x)) <= (EPSILON * fmaxf(1.0f, fmaxf(fabsf(p.x), fabsf(q.x))))) &&
|
||||||
|
((fabsf(p.y - q.y)) <= (EPSILON * fmaxf(1.0f, fmaxf(fabsf(p.y), fabsf(q.y)))));
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
// Module Functions Definition - Vector3 math
|
// Module Functions Definition - Vector3 math
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
|
@ -851,6 +921,96 @@ RMAPI float3 Vector3ToFloatV(Vector3 v)
|
||||||
return buffer;
|
return buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Invert the given vector
|
||||||
|
RMAPI Vector3 Vector3Invert(Vector3 v)
|
||||||
|
{
|
||||||
|
Vector3 result = { 1.0f / v.x, 1.0f / v.y, 1.0f / v.z };
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clamp the components of the vector between
|
||||||
|
// min and max values specified by the given vectors
|
||||||
|
RMAPI Vector3 Vector3Clamp(Vector3 v, Vector3 min, Vector3 max)
|
||||||
|
{
|
||||||
|
Vector3 result = { 0 };
|
||||||
|
|
||||||
|
result.x = fminf(max.x, fmaxf(min.x, v.x));
|
||||||
|
result.y = fminf(max.y, fmaxf(min.y, v.y));
|
||||||
|
result.z = fminf(max.z, fmaxf(min.z, v.z));
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clamp the magnitude of the vector between two
|
||||||
|
// given min and max values
|
||||||
|
RMAPI Vector3 Vector3ClampValue(Vector3 v, float minMag, float maxMag)
|
||||||
|
{
|
||||||
|
Vector3 result = { 0 };
|
||||||
|
|
||||||
|
float length = (v.x * v.x) + (v.y * v.y) + (v.z * v.z);
|
||||||
|
if (length > 0.0f)
|
||||||
|
{
|
||||||
|
length = sqrtf(length);
|
||||||
|
|
||||||
|
if (length < minMag)
|
||||||
|
{
|
||||||
|
float scale = minMag / length;
|
||||||
|
result.x = v.x * scale;
|
||||||
|
result.y = v.y * scale;
|
||||||
|
result.z = v.z * scale;
|
||||||
|
}
|
||||||
|
else if (length > maxMag)
|
||||||
|
{
|
||||||
|
float scale = maxMag / length;
|
||||||
|
result.x = v.x * scale;
|
||||||
|
result.y = v.y * scale;
|
||||||
|
result.z = v.z * scale;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check whether two given vectors are almost equal
|
||||||
|
RMAPI bool Vector3Equals(Vector3 p, Vector3 q)
|
||||||
|
{
|
||||||
|
bool result = ((fabsf(p.x - q.x)) <= (EPSILON * fmaxf(1.0f, fmaxf(fabsf(p.x), fabsf(q.x))))) &&
|
||||||
|
((fabsf(p.y - q.y)) <= (EPSILON * fmaxf(1.0f, fmaxf(fabsf(p.y), fabsf(q.y))))) &&
|
||||||
|
((fabsf(p.z - q.z)) <= (EPSILON * fmaxf(1.0f, fmaxf(fabsf(p.z), fabsf(q.z)))));
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Compute the direction of a refracted ray where v specifies the
|
||||||
|
// normalized direction of the incoming ray, n specifies the
|
||||||
|
// normalized normal vector of the interface of two optical media,
|
||||||
|
// and r specifies the ratio of the refractive index of the medium
|
||||||
|
// from where the ray comes to the refractive index of the medium
|
||||||
|
// on the other side of the surface
|
||||||
|
RMAPI Vector3 Vector3Refract(Vector3 v, Vector3 n, float r)
|
||||||
|
{
|
||||||
|
Vector3 result = { 0 };
|
||||||
|
|
||||||
|
float dot = v.x * n.x + v.y * n.y + v.z * n.z;
|
||||||
|
|
||||||
|
float d = 1.0f - r * r * (1.0f - dot * dot);
|
||||||
|
if (d < 0.0f)
|
||||||
|
{
|
||||||
|
// Total internal reflection
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
d = sqrtf(d);
|
||||||
|
v.x = r * v.x - (r * dot + d) * n.x;
|
||||||
|
v.y = r * v.y - (r * dot + d) * n.y;
|
||||||
|
v.z = r * v.z - (r * dot + d) * n.z;
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
// Module Functions Definition - Matrix math
|
// Module Functions Definition - Matrix math
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
|
@ -1844,4 +2004,15 @@ RMAPI Quaternion QuaternionTransform(Quaternion q, Matrix mat)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check whether two given quaternions are almost equal
|
||||||
|
RMAPI bool QuaternionEquals(Quaternion p, Quaternion q)
|
||||||
|
{
|
||||||
|
bool result = ((fabsf(p.x - q.x)) <= (EPSILON * fmaxf(1.0f, fmaxf(fabsf(p.x), fabsf(q.x))))) &&
|
||||||
|
((fabsf(p.y - q.y)) <= (EPSILON * fmaxf(1.0f, fmaxf(fabsf(p.y), fabsf(q.y))))) &&
|
||||||
|
((fabsf(p.z - q.z)) <= (EPSILON * fmaxf(1.0f, fmaxf(fabsf(p.z), fabsf(q.z))))) &&
|
||||||
|
((fabsf(p.w - q.w)) <= (EPSILON * fmaxf(1.0f, fmaxf(fabsf(p.w), fabsf(q.w)))));
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
#endif // RAYMATH_H
|
#endif // RAYMATH_H
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue