From 693551b11a390b4cb0dfd5b2443ade0b5e970b6a Mon Sep 17 00:00:00 2001 From: Kyle De'Vir Date: Sun, 5 Jun 2016 18:02:55 +1000 Subject: [PATCH] Fixed Rotate function and precomputed SinTheta and CosTheta --- HandmadeMath.h | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/HandmadeMath.h b/HandmadeMath.h index 4249389..02895a6 100644 --- a/HandmadeMath.h +++ b/HandmadeMath.h @@ -800,19 +800,22 @@ hmm_mat4 HMM_Rotate(float Angle, hmm_vec3 Axis) { hmm_mat4 Result = HMM_Mat4d(1.0f); - - Result.Elements[0][0] = Axis.X * Axis.X * (1.0f - cosf(HMM_ToRadians(Angle))) + cosf(HMM_ToRadians(Angle)); - Result.Elements[0][1] = Axis.Y * Axis.X * (1.0f - cosf(HMM_ToRadians(Angle))) + Axis.Z * (sinf(HMM_ToRadians(Angle))); - Result.Elements[0][2] = Axis.X * Axis.Z * (1.0f - cosf(HMM_ToRadians(Angle))) - Axis.Y * (sinf(HMM_ToRadians(Angle))); - - Result.Elements[1][0] = Axis.X * Axis.Y * (1.0f - cosf(HMM_ToRadians(Angle))) - Axis.Z * (sinf(HMM_ToRadians(Angle))); - Result.Elements[1][1] = Axis.Y * Axis.Y * (1.0f - cosf(HMM_ToRadians(Angle))) + (cosf(HMM_ToRadians(Angle))); - Result.Elements[1][2] = Axis.Y * Axis.Z * (1.0f - cosf(HMM_ToRadians(Angle))) + Axis.X * (sinf(HMM_ToRadians(Angle))); - - Result.Elements[2][0] = Axis.X * Axis.Z * (1.0f - cosf(HMM_ToRadians(Angle))) + Axis.Y * (sinf(HMM_ToRadians(Angle))); - Result.Elements[2][1] = Axis.Y * Axis.Z * (1.0f - cosf(HMM_ToRadians(Angle))) - Axis.X * (sinf(HMM_ToRadians(Angle))); - Result.Elements[2][2] = Axis.Z * Axis.Z * (1.0f - cosf(HMM_ToRadians(Angle))) * (cosf(HMM_ToRadians(Angle))); - + + SinTheta = sinf(HMM_ToRadians(Angle)); + CosTheta = cosf(HMM_ToRadians(Angle)); + + Result.Elements[0][0] = (Axis.X * Axis.X * (1.0f - CosTheta)) + CosTheta; + Result.Elements[0][1] = (Axis.X * Axis.Y * (1.0f - CosTheta)) - (Axis.Z * SinTheta); + Result.Elements[0][2] = (Axis.X * Axis.Z * (1.0f - CosTheta)) + (Axis.Y * SinTheta); + + Result.Elements[1][0] = (Axis.X * Axis.Y * (1.0f - CosTheta)) + (Axis.Z * SinTheta); + Result.Elements[1][1] = (Axis.Y * Axis.Y * (1.0f - CosTheta)) + CosTheta; + Result.Elements[1][2] = (Axis.Y * Axis.Z * (1.0f - CosTheta)) - (Axis.X * SinTheta); + + Result.Elements[2][0] = (Axis.X * Axis.Z * (1.0f - CosTheta)) - (Axis.Y * SinTheta); + Result.Elements[2][1] = (Axis.Y * Axis.Z * (1.0f - CosTheta)) + (Axis.X * SinTheta); + Result.Elements[2][2] = (Axis.Z * Axis.Z * (1.0f - CosTheta)) + CosTheta); + return (Result); }