|
|
@ -227,21 +227,29 @@ 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 +297,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 +312,29 @@ 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 +382,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 +759,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 +775,25 @@ RMDEF Matrix MatrixRotate(Vector3 axis, float angle) |
|
|
|
float cosres = cosf(angle); |
|
|
|
float t = 1.0f - cosres; |
|
|
|
|
|
|
|
o">// Cache some matrix values (speed optimization) |
|
|
|
kt">float a00 = mat.m0, a01 = mat.m1, a02 = mat.m2, a03 = mat.m3; |
|
|
|
kt">float a10 = mat.m4, a11 = mat.m5, a12 = mat.m6, a13 = mat.m7; |
|
|
|
kt">float a20 = mat.m8, a21 = mat.m9, a22 = mat.m10, a23 = mat.m11; |
|
|
|
n">result.m0 = x*x*t + cosres; |
|
|
|
n">result.m1 = y*x*t + z*sinres; |
|
|
|
n">result.m2 = z*x*t - y*sinres; |
|
|
|
n">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 +1020,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 |
|
|
|