summaryrefslogtreecommitdiffhomepage
path: root/src/raymath.h
diff options
context:
space:
mode:
authorchriscamacho <[email protected]>2020-08-23 20:01:26 +0100
committerGitHub <[email protected]>2020-08-23 21:01:26 +0200
commitd140dc81c04674019f388030842d72c69c6800d6 (patch)
tree65db0eb541de80d06d42ca2a4e805cf1de885c7f /src/raymath.h
parent816856eb75bcf05bc3961eef2a52e3b8b1cd4efe (diff)
downloadraylib-d140dc81c04674019f388030842d72c69c6800d6.tar.gz
raylib-d140dc81c04674019f388030842d72c69c6800d6.zip
work on quat and matrix math - deleted multiple copies of raymath.h causing issues (#1359)
Co-authored-by: codifies <[email protected]>
Diffstat (limited to 'src/raymath.h')
-rw-r--r--src/raymath.h147
1 files changed, 55 insertions, 92 deletions
diff --git a/src/raymath.h b/src/raymath.h
index b51573e7..893b7cf4 100644
--- a/src/raymath.h
+++ b/src/raymath.h
@@ -78,6 +78,8 @@
#define PI 3.14159265358979323846
#endif
+
+
#ifndef DEG2RAD
#define DEG2RAD (PI/180.0f)
#endif
@@ -926,6 +928,8 @@ RMDEF Matrix MatrixRotateZ(float angle)
return result;
}
+
+
// Returns scaling matrix
RMDEF Matrix MatrixScale(float x, float y, float z)
{
@@ -963,6 +967,17 @@ RMDEF Matrix MatrixMultiply(Matrix left, Matrix right)
return result;
}
+// TODO suboptimal should be able to create this matrix in one go
+// this is an aditional 3 matrix multiplies!
+RMDEF Matrix MatrixRotateZYX(Vector3 v)
+{
+ Matrix result = MatrixRotateZ(v.z);
+ result = MatrixMultiply(result, MatrixRotateY(v.y));
+ result = MatrixMultiply(result, MatrixRotateX(v.x));
+
+ return result;
+}
+
// Returns perspective projection matrix
RMDEF Matrix MatrixFrustum(double left, double right, double bottom, double top, double near, double far)
{
@@ -1297,105 +1312,53 @@ RMDEF Quaternion QuaternionFromVector3ToVector3(Vector3 from, Vector3 to)
}
// Returns a quaternion for a given rotation matrix
-RMDEF Quaternion QuaternionFromMatrix(Matrix mat)
-{
- Quaternion result = { 0 };
-
- float trace = MatrixTrace(mat);
-
- if (trace > 0.0f)
- {
- float s = sqrtf(trace + 1)*2.0f;
- float invS = 1.0f/s;
-
- result.w = s*0.25f;
- result.x = (mat.m6 - mat.m9)*invS;
- result.y = (mat.m8 - mat.m2)*invS;
- result.z = (mat.m1 - mat.m4)*invS;
- }
- else
- {
- float m00 = mat.m0, m11 = mat.m5, m22 = mat.m10;
-
- if (m00 > m11 && m00 > m22)
- {
- float s = (float)sqrt(1.0f + m00 - m11 - m22)*2.0f;
- float invS = 1.0f/s;
-
- result.w = (mat.m6 - mat.m9)*invS;
- result.x = s*0.25f;
- result.y = (mat.m4 + mat.m1)*invS;
- result.z = (mat.m8 + mat.m2)*invS;
- }
- else if (m11 > m22)
- {
- float s = sqrtf(1.0f + m11 - m00 - m22)*2.0f;
- float invS = 1.0f/s;
-
- result.w = (mat.m8 - mat.m2)*invS;
- result.x = (mat.m4 + mat.m1)*invS;
- result.y = s*0.25f;
- result.z = (mat.m9 + mat.m6)*invS;
- }
- else
- {
- float s = sqrtf(1.0f + m22 - m00 - m11)*2.0f;
- float invS = 1.0f/s;
-
- result.w = (mat.m1 - mat.m4)*invS;
- result.x = (mat.m8 + mat.m2)*invS;
- result.y = (mat.m9 + mat.m6)*invS;
- result.z = s*0.25f;
- }
- }
-
- return result;
+RMDEF Quaternion QuaternionFromMatrix(Matrix m)
+{
+ Quaternion q;
+ if ( m.m0 > m.m5 && m.m0 > m.m10 ) {
+ float s = sqrt( 1.0 + m.m0 - m.m5 - m.m10 ) * 2;
+ q.x = 0.25 * s;
+ q.y = (m.m4 + m.m1 ) / s;
+ q.z = (m.m2 + m.m8 ) / s;
+ q.w = (m.m9 - m.m6 ) / s;
+ } else if ( m.m5 > m.m10 ) {
+ float s = sqrt( 1.0 + m.m5 - m.m0 - m.m10 ) * 2;
+ q.x = (m.m4 + m.m1 ) / s;
+ q.y = 0.25 * s;
+ q.z = (m.m9 + m.m6 ) / s;
+ q.w = (m.m2 - m.m8 ) / s;
+ } else {
+ float s = sqrt( 1.0 + m.m10 - m.m0 - m.m5 ) * 2;
+ q.x = (m.m2 + m.m8 ) / s;
+ q.y = (m.m9 + m.m6 ) / s;
+ q.z = 0.25 * s;
+ q.w = (m.m4 - m.m1 ) / s;
+ }
+ return q;
}
// Returns a matrix for a given quaternion
RMDEF Matrix QuaternionToMatrix(Quaternion q)
{
- Matrix result = { 0 };
-
- float x = q.x, y = q.y, z = q.z, w = q.w;
-
- float x2 = x + x;
- float y2 = y + y;
- float z2 = z + z;
-
- float length = QuaternionLength(q);
- float lengthSquared = length*length;
-
- float xx = x*x2/lengthSquared;
- float xy = x*y2/lengthSquared;
- float xz = x*z2/lengthSquared;
-
- float yy = y*y2/lengthSquared;
- float yz = y*z2/lengthSquared;
- float zz = z*z2/lengthSquared;
-
- float wx = w*x2/lengthSquared;
- float wy = w*y2/lengthSquared;
- float wz = w*z2/lengthSquared;
+ Matrix m = MatrixIdentity();
+ float a2=2*(q.x*q.x), b2=2*(q.y*q.y), c2=2*(q.z*q.z); //, d2=2*(q.w*q.w);
+
+ float ab=2*(q.x*q.y), ac=2*(q.x*q.z), bc=2*(q.y*q.z);
+ float ad=2*(q.x*q.w), bd=2*(q.y*q.w), cd=2*(q.z*q.w);
- result.m0 = 1.0f - (yy + zz);
- result.m1 = xy - wz;
- result.m2 = xz + wy;
- result.m3 = 0.0f;
- result.m4 = xy + wz;
- result.m5 = 1.0f - (xx + zz);
- result.m6 = yz - wx;
- result.m7 = 0.0f;
- result.m8 = xz - wy;
- result.m9 = yz + wx;
- result.m10 = 1.0f - (xx + yy);
- result.m11 = 0.0f;
- result.m12 = 0.0f;
- result.m13 = 0.0f;
- result.m14 = 0.0f;
- result.m15 = 1.0f;
+ m.m0 = 1 - b2 - c2;
+ m.m1 = ab - cd;
+ m.m2 = ac + bd;
+
+ m.m4 = ab + cd;
+ m.m5 = 1 - a2 - c2;
+ m.m6 = bc - ad;
+
+ m.m8 = ac - bd;
+ m.m9 = bc + ad;
+ m.m10 = 1 - a2 - b2;
- return result;
+ return m;
}
// Returns rotation quaternion for an angle and axis