diff --git a/HandmadeMath.h b/HandmadeMath.h index 6cf1cd1..912b2ad 100644 --- a/HandmadeMath.h +++ b/HandmadeMath.h @@ -257,6 +257,7 @@ HMMDEF hmm_vec4 HMM_DivideVec4(hmm_vec4 Left, hmm_vec4 Right); HMMDEF hmm_mat4 HMM_Mat4(void); HMMDEF hmm_mat4 HMM_Mat4d(float Diagonal); HMMDEF hmm_mat4 HMM_MultiplyMat4(hmm_mat4 Left, hmm_mat4 Right); +HMMDEF hmm_vec4 HMM_MultiplyMat4ByVec4(hmm_mat4 Matrix, hmm_vec4 Vector); HMMDEF hmm_mat4 HMM_Orthographic(float Left, float Right, float Bottom, float Top, float Near, float Far); HMMDEF hmm_mat4 HMM_Perspective(float FOV, float AspectRatio, float Near, float Far); @@ -284,6 +285,7 @@ HMMDEF hmm_vec2 HMM_Multiply(int X, int Y); HMMDEF hmm_vec3 HMM_Multiply(int X, int Y, int Z); HMMDEF hmm_vec4 HMM_Multiply(int X, int Y, int Z, int W); HMMDEF hmm_mat4 HMM_Multiply(hmm_mat4 Left, hmm_mat4 Right); +HMMDEF hmm_vec4 HMM_Multiply(hmm_mat4 Matrix, hmm_vec4 Vector); HMMDEF hmm_vec2 HMM_Divide(int X, int Y); HMMDEF hmm_vec3 HMM_Divide(int X, int Y, int Z); @@ -305,6 +307,8 @@ HMMDEF hmm_mat4 operator*(hmm_mat4 Left, hmm_mat4 Right); HMMDEF hmm_vec3 operator*(hmm_vec3 Left, float Right); HMMDEF hmm_vec2 operator*(hmm_vec2 Left, float Right); +HMMDEF hmm_vec4 operator*(hmm_mat4 Matrix, hmm_vec4 Vector); + HMMDEF hmm_vec2 operator/(hmm_vec2 Left, hmm_vec2 Right); HMMDEF hmm_vec3 operator/(hmm_vec3 Left, hmm_vec3 Right); HMMDEF hmm_vec4 operator/(hmm_vec4 Left, hmm_vec4 Right); @@ -708,6 +712,26 @@ HMM_MultiplyMat4(hmm_mat4 Left, hmm_mat4 Right) return (Result); } +hmm_vec4 +HMM_MultiplyMat4ByVec4(hmm_mat4 Matrix, hmm_vec4 Vector) +{ + hmm_vec4 Result = HMM_Vec4(0.0f, 0.0f, 0.0f, 0.0f); + + int Rows, Columns; + for(Rows = 0; Rows < 4; ++Rows) + { + float Sum = 0; + for(Columns = 0; Columns < 4; ++Columns) + { + Sum += Matrix.Elements[Rows][Columns] * Vector.Elements[Columns]; + } + + Result.Elements[Rows] = Sum; + } + + return (Result); +} + hmm_mat4 HMM_Orthographic(float Left, float Right, float Bottom, float Top, float Near, float Far) { @@ -896,6 +920,14 @@ Multiply(hmm_mat4 Left, hmm_mat4 Right) return (Result); } +HINLINE hmm_vec4 +Multiply(hmm_mat4 Matrix, hmm_vec4 Vector) +{ + hmm_vec4 Result = HMM_MultiplyMat4ByVec4(Matrix, Vector); + + return (Result); +} + HINLINE hmm_vec2 Divide(hmm_vec2 Left, hmm_vec2 Right) { @@ -1023,6 +1055,14 @@ operator*(hmm_mat4 Left, hmm_mat4 Right) return (Result); } +HINLINE hmm_vec4 +operator*(hmm_mat4 Matrix, hmm_vec4 Vector) +{ + hmm_vec4 Result = Multiply(Matrix, Vector); + + return (Result); +} + HINLINE hmm_vec2 operator/(hmm_vec2 Left, hmm_vec2 Right) {