aboutsummaryrefslogtreecommitdiff
path: root/src/raymath.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/raymath.h')
-rw-r--r--src/raymath.h114
1 files changed, 64 insertions, 50 deletions
diff --git a/src/raymath.h b/src/raymath.h
index fe0b8947..c29c6b95 100644
--- a/src/raymath.h
+++ b/src/raymath.h
@@ -191,8 +191,8 @@ RMDEF void QuaternionNormalize(Quaternion *q); // Normalize pro
RMDEF void QuaternionInvert(Quaternion *quat); // Invert provided quaternion
RMDEF Quaternion QuaternionMultiply(Quaternion q1, Quaternion q2); // Calculate two quaternion multiplication
RMDEF Quaternion QuaternionLerp(Quaternion q1, Quaternion q2, float amount); // Calculate linear interpolation between two quaternions
-RMDEF Quaternion QuaternionSlerp(Quaternion q1, Quaternion q2, float amount); // Calculates spherical linear interpolation between two quaternions
RMDEF Quaternion QuaternionNlerp(Quaternion q1, Quaternion q2, float amount); // Calculate slerp-optimized interpolation between two quaternions
+RMDEF Quaternion QuaternionSlerp(Quaternion q1, Quaternion q2, float amount); // Calculates spherical linear interpolation between two quaternions
RMDEF Quaternion QuaternionFromVector3ToVector3(Vector3 from, Vector3 to); // Calculate quaternion based on the rotation from one vector to another
RMDEF Quaternion QuaternionFromMatrix(Matrix matrix); // Returns a quaternion for a given rotation matrix
RMDEF Matrix QuaternionToMatrix(Quaternion q); // Returns a matrix for a given quaternion
@@ -227,21 +227,31 @@ RMDEF float Clamp(float value, float min, float max)
//----------------------------------------------------------------------------------
// Vector with components value 0.0f
-RMDEF Vector2 Vector2Zero(void) { return (Vector2){ 0.0f, 0.0f }; }
+RMDEF Vector2 Vector2Zero(void)
+{
+ Vector2 tmp = {0.0f, 0.0f};
+ return tmp;
+}
// Vector with components value 1.0f
-RMDEF Vector2 Vector2One(void) { return (Vector2){ 1.0f, 1.0f }; }
+RMDEF Vector2 Vector2One(void)
+{
+ Vector2 tmp = {1.0f, 1.0f};
+ return tmp;
+}
// Add two vectors (v1 + v2)
RMDEF Vector2 Vector2Add(Vector2 v1, Vector2 v2)
{
- return (Vector2){ v1.x + v2.x, v1.y + v2.y };
+ Vector2 tmp = { v1.x + v2.x, v1.y + v2.y };
+ return tmp;
}
// Subtract two vectors (v1 - v2)
RMDEF Vector2 Vector2Subtract(Vector2 v1, Vector2 v2)
{
- return (Vector2){ v1.x - v2.x, v1.y - v2.y };
+ Vector2 tmp = { v1.x - v2.x, v1.y - v2.y };
+ return tmp;
}
// Calculate vector length
@@ -289,7 +299,8 @@ RMDEF void Vector2Negate(Vector2 *v)
// Divide vector by a float value
RMDEF void Vector2Divide(Vector2 *v, float div)
{
- *v = (Vector2){v->x/div, v->y/div};
+ Vector2 tmp = {v->x/div, v->y/div};
+ *v = tmp;
}
// Normalize provided vector
@@ -303,21 +314,31 @@ RMDEF void Vector2Normalize(Vector2 *v)
//----------------------------------------------------------------------------------
// Vector with components value 0.0f
-RMDEF Vector3 Vector3Zero(void) { return (Vector3){ 0.0f, 0.0f, 0.0f }; }
+RMDEF Vector3 Vector3Zero(void)
+{
+ Vector3 tmp = { 0.0f, 0.0f, 0.0f };
+ return tmp;
+}
// Vector with components value 1.0f
-RMDEF Vector3 Vector3One(void) { return (Vector3){ 1.0f, 1.0f, 1.0f }; }
+RMDEF Vector3 Vector3One(void)
+{
+ Vector3 tmp = { 1.0f, 1.0f, 1.0f };
+ return tmp;
+}
// Add two vectors
RMDEF Vector3 Vector3Add(Vector3 v1, Vector3 v2)
{
- return (Vector3){ v1.x + v2.x, v1.y + v2.y, v1.z + v2.z };
+ Vector3 tmp = { v1.x + v2.x, v1.y + v2.y, v1.z + v2.z };
+ return tmp;
}
// Substract two vectors
RMDEF Vector3 Vector3Subtract(Vector3 v1, Vector3 v2)
{
- return (Vector3){ v1.x - v2.x, v1.y - v2.y, v1.z - v2.z };
+ Vector3 tmp = { v1.x - v2.x, v1.y - v2.y, v1.z - v2.z };
+ return tmp;
}
// Multiply vector by scalar
@@ -365,12 +386,14 @@ RMDEF Vector3 Vector3Perpendicular(Vector3 v)
if (fabsf(v.y) < min)
{
min = fabsf(v.y);
- cardinalAxis = (Vector3){0.0f, 1.0f, 0.0f};
+ Vector3 tmp = {0.0f, 1.0f, 0.0f};
+ cardinalAxis = tmp;
}
if (fabsf(v.z) < min)
{
- cardinalAxis = (Vector3){0.0f, 0.0f, 1.0f};
+ Vector3 tmp = {0.0f, 0.0f, 1.0f};
+ cardinalAxis = tmp;
}
result = Vector3CrossProduct(v, cardinalAxis);
@@ -740,8 +763,6 @@ RMDEF Matrix MatrixRotate(Vector3 axis, float angle)
{
Matrix result;
- Matrix mat = MatrixIdentity();
-
float x = axis.x, y = axis.y, z = axis.z;
float length = sqrtf(x*x + y*y + z*z);
@@ -758,33 +779,25 @@ RMDEF Matrix MatrixRotate(Vector3 axis, float angle)
float cosres = cosf(angle);
float t = 1.0f - cosres;
- // Cache some matrix values (speed optimization)
- float a00 = mat.m0, a01 = mat.m1, a02 = mat.m2, a03 = mat.m3;
- float a10 = mat.m4, a11 = mat.m5, a12 = mat.m6, a13 = mat.m7;
- float a20 = mat.m8, a21 = mat.m9, a22 = mat.m10, a23 = mat.m11;
+ result.m0 = x*x*t + cosres;
+ result.m1 = y*x*t + z*sinres;
+ result.m2 = z*x*t - y*sinres;
+ result.m3 = 0.0f;
- // Construct the elements of the rotation matrix
- float b00 = x*x*t + cosres, b01 = y*x*t + z*sinres, b02 = z*x*t - y*sinres;
- float b10 = x*y*t - z*sinres, b11 = y*y*t + cosres, b12 = z*y*t + x*sinres;
- float b20 = x*z*t + y*sinres, b21 = y*z*t - x*sinres, b22 = z*z*t + cosres;
-
- // Perform rotation-specific matrix multiplication
- result.m0 = a00*b00 + a10*b01 + a20*b02;
- result.m1 = a01*b00 + a11*b01 + a21*b02;
- result.m2 = a02*b00 + a12*b01 + a22*b02;
- result.m3 = a03*b00 + a13*b01 + a23*b02;
- result.m4 = a00*b10 + a10*b11 + a20*b12;
- result.m5 = a01*b10 + a11*b11 + a21*b12;
- result.m6 = a02*b10 + a12*b11 + a22*b12;
- result.m7 = a03*b10 + a13*b11 + a23*b12;
- result.m8 = a00*b20 + a10*b21 + a20*b22;
- result.m9 = a01*b20 + a11*b21 + a21*b22;
- result.m10 = a02*b20 + a12*b21 + a22*b22;
- result.m11 = a03*b20 + a13*b21 + a23*b22;
- result.m12 = mat.m12;
- result.m13 = mat.m13;
- result.m14 = mat.m14;
- result.m15 = mat.m15;
+ result.m4 = x*y*t - z*sinres;
+ result.m5 = y*y*t + cosres;
+ result.m6 = z*y*t + x*sinres;
+ result.m7 = 0.0f;
+
+ result.m8 = x*z*t + y*sinres;
+ result.m9 = y*z*t - x*sinres;
+ result.m10 = z*z*t + cosres;
+ result.m11 = 0.0f;
+
+ result.m12 = 0.0f;
+ result.m13 = 0.0f;
+ result.m14 = 0.0f;
+ result.m15 = 1.0f;
return result;
}
@@ -1011,7 +1024,8 @@ RMDEF float *MatrixToFloat(Matrix mat)
// Returns identity quaternion
RMDEF Quaternion QuaternionIdentity(void)
{
- return (Quaternion){ 0.0f, 0.0f, 0.0f, 1.0f };
+ Quaternion q = { 0.0f, 0.0f, 0.0f, 1.0f };
+ return q;
}
// Computes the length of a quaternion
@@ -1083,6 +1097,15 @@ RMDEF Quaternion QuaternionLerp(Quaternion q1, Quaternion q2, float amount)
return result;
}
+// Calculate slerp-optimized interpolation between two quaternions
+RMDEF Quaternion QuaternionNlerp(Quaternion q1, Quaternion q2, float amount)
+{
+ Quaternion result = QuaternionLerp(q1, q2, amount);
+ QuaternionNormalize(&result);
+
+ return result;
+}
+
// Calculates spherical linear interpolation between two quaternions
RMDEF Quaternion QuaternionSlerp(Quaternion q1, Quaternion q2, float amount)
{
@@ -1119,15 +1142,6 @@ RMDEF Quaternion QuaternionSlerp(Quaternion q1, Quaternion q2, float amount)
return result;
}
-// Calculate slerp-optimized interpolation between two quaternions
-RMDEF Quaternion QuaternionNlerp(Quaternion q1, Quaternion q2, float amount)
-{
- Quaternion result = QuaternionLerp(q1, q2, amount);
- QuaternionNormalize(&result);
-
- return result;
-}
-
// Calculate quaternion based on the rotation from one vector to another
RMDEF Quaternion QuaternionFromVector3ToVector3(Vector3 from, Vector3 to)
{