Added LookAt for matrix

This commit is contained in:
Zak Strange
2016-03-23 16:54:10 -07:00
parent 77b4b04d13
commit 2d4520fda6

View File

@@ -27,7 +27,7 @@
#define HANDMADE_MATH_IMPLEMENTATION #define HANDMADE_MATH_IMPLEMENTATION
#define HANDMADE_MATH_CPP_MODE #define HANDMADE_MATH_CPP_MODE
#include "HandmadeMade.h" #include "HandmadeMath.h"
All other files should just #include "HandmadeMath.h" without the #define. All other files should just #include "HandmadeMath.h" without the #define.
========================================================================== ==========================================================================
@@ -45,6 +45,7 @@
Functionality: Functionality:
Matt Mascarenhas (@miblo_) Matt Mascarenhas (@miblo_)
Fixes: Fixes:
Jeroen van Rijn (@J_vanRijn) Jeroen van Rijn (@J_vanRijn)
*/ */
@@ -196,40 +197,46 @@ typedef union mat4
} mat4; } mat4;
HMMDEF HINLINE float Power(float Base, int Exponent); HMMDEF HINLINE float Power(float Base, int Exponent);
HMMDEF HINLINE float Clamp(float Min, float Value, float Max);
HMMDEF HINLINE vec3 Normalize(vec3 A);
HMMDEF HINLINE vec3 Cross(vec3 VecOne, vec3 VecTwo);
HMMDEF HINLINE float Dot(vec3 VecOne, vec3 VecTwo);
HMMDEF HINLINE vec2 V2i(int X, int Y); HMMDEF HINLINE vec2 Vec2i(int X, int Y);
HMMDEF HINLINE vec2 V2(float X, float Y); HMMDEF HINLINE vec2 Vec2(float X, float Y);
HMMDEF HINLINE vec3 V3(float X, float Y, float Z); HMMDEF HINLINE vec3 Vec3(float X, float Y, float Z);
HMMDEF HINLINE vec3 V3i(int X, int Y, int Z); HMMDEF HINLINE vec3 Vec3i(int X, int Y, int Z);
HMMDEF HINLINE vec4 V4(float X, float Y, float Z, float W); HMMDEF HINLINE vec4 Vec4(float X, float Y, float Z, float W);
HMMDEF HINLINE vec4 V4i(int X, int Y, int Z, int W); HMMDEF HINLINE vec4 Vec4i(int X, int Y, int Z, int W);
HMMDEF HINLINE vec2 AddV2(vec2 Left, vec2 Right); HMMDEF HINLINE vec2 AddVec2(vec2 Left, vec2 Right);
HMMDEF HINLINE vec3 AddV3(vec3 Left, vec3 Right); HMMDEF HINLINE vec3 AddVec3(vec3 Left, vec3 Right);
HMMDEF HINLINE vec4 AddV4(vec4 Left, vec4 Right); HMMDEF HINLINE vec4 AddVec4(vec4 Left, vec4 Right);
HMMDEF HINLINE vec2 SubtractV2(vec2 Left, vec2 Right); HMMDEF HINLINE vec2 SubtractVec2(vec2 Left, vec2 Right);
HMMDEF HINLINE vec3 SubtractV3(vec3 Left, vec3 Right); HMMDEF HINLINE vec3 SubtractVec3(vec3 Left, vec3 Right);
HMMDEF HINLINE vec4 SubtractV4(vec4 Left, vec4 Right); HMMDEF HINLINE vec4 SubtractVec4(vec4 Left, vec4 Right);
HMMDEF HINLINE vec2 MultiplyV2(vec2 Left, vec2 Right); HMMDEF HINLINE vec2 MultiplyVec2(vec2 Left, vec2 Right);
HMMDEF HINLINE vec3 MultiplyV3(vec3 Left, vec3 Right); HMMDEF HINLINE vec3 MultiplyVec3(vec3 Left, vec3 Right);
HMMDEF HINLINE vec4 MultiplyV4(vec4 Left, vec4 Right); HMMDEF HINLINE vec4 MultiplyVec4(vec4 Left, vec4 Right);
HMMDEF HINLINE vec2 DivideV2(vec2 Left, vec2 Right); HMMDEF HINLINE vec2 DivideVec2(vec2 Left, vec2 Right);
HMMDEF HINLINE vec3 DivideV3(vec3 Left, vec3 Right); HMMDEF HINLINE vec3 DivideVec3(vec3 Left, vec3 Right);
HMMDEF HINLINE vec4 DivideV4(vec4 Left, vec4 Right); HMMDEF HINLINE vec4 DivideVec4(vec4 Left, vec4 Right);
HMMDEF mat4 Mat4(void); HMMDEF mat4 Mat4(void);
HMMDEF mat4 Mat4d(float Diagonal); HMMDEF mat4 Mat4d(float Diagonal);
HMMDEF mat4 MultiplyMat4(mat4 Left, mat4 Right); HMMDEF mat4 MultiplyMat4(mat4 Left, mat4 Right);
HMMDEF mat4 Orthographic(float Left, float Right, float Bottom, float Top, float Near, float Far); HMMDEF mat4 Orthographic(float Left, float Right, float Bottom, float Top, float Near, float Far);
HMMDEF mat4 Perspective(float FOV, float AspectRatio, float Near, float Far); HMMDEF mat4 Pespective(float FOV, float AspectRatio, float Near, float Far);
HMMDEF mat4 Translate(vec3 Translation); HMMDEF mat4 Translate(vec3 Translation);
HMMDEF mat4 Rotate(float Angle, vec3 Axis); HMMDEF mat4 Rotate(float Angle, vec3 Axis);
HMMDEF mat4 Scale(vec3 Scale); HMMDEF mat4 Scale(vec3 Scale);
HMMDEF mat4 LookAt(vec3 Eye, vec3 Center, vec3 Up);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
@@ -371,8 +378,32 @@ Normalize(vec3 A)
return(Result); return(Result);
} }
HMMDEF HINLINE vec3
Cross(vec3 VecOne, vec3 VecTwo)
{
vec3 Result;
Result.X = (VecOne.Y * VecTwo.Z) - (VecOne.Z * VecTwo.Y);
Result.Y = (VecOne.Z * VecTwo.X) - (VecOne.X * VecTwo.Z);
Result.Z = (VecOne.X * VecTwo.Y) - (VecOne.Y * VecTwo.X);
return(Result);
}
HMMDEF HINLINE float
Dot(vec3 VecOne, vec3 VecTwo)
{
float Result = 0;
Result = (VecOne.X * VecTwo.X) +
(VecOne.Y * VecTwo.Y) +
(VecOne.Z * VecTwo.Z);
return(Result);
}
HMMDEF HINLINE vec2 HMMDEF HINLINE vec2
V2(float X, float Y) Vec2(float X, float Y)
{ {
vec2 Result; vec2 Result;
@@ -383,7 +414,7 @@ V2(float X, float Y)
} }
HMMDEF HINLINE vec2 HMMDEF HINLINE vec2
V2i(int X, int Y) Vec2i(int X, int Y)
{ {
vec2 Result; vec2 Result;
@@ -394,7 +425,7 @@ V2i(int X, int Y)
} }
HMMDEF HINLINE vec3 HMMDEF HINLINE vec3
V3(float X, float Y, float Z) Vec3(float X, float Y, float Z)
{ {
vec3 Result; vec3 Result;
@@ -406,7 +437,7 @@ V3(float X, float Y, float Z)
} }
HMMDEF HINLINE vec3 HMMDEF HINLINE vec3
V3i(int X, int Y, int Z) Vec3i(int X, int Y, int Z)
{ {
vec3 Result; vec3 Result;
@@ -418,7 +449,7 @@ V3i(int X, int Y, int Z)
} }
HMMDEF HINLINE vec4 HMMDEF HINLINE vec4
V4(float X, float Y, float Z, float W) Vec4(float X, float Y, float Z, float W)
{ {
vec4 Result; vec4 Result;
@@ -431,7 +462,7 @@ V4(float X, float Y, float Z, float W)
} }
HMMDEF HINLINE vec4 HMMDEF HINLINE vec4
V4i(int X, int Y, int Z, int W) Vec4i(int X, int Y, int Z, int W)
{ {
vec4 Result; vec4 Result;
@@ -444,7 +475,7 @@ V4i(int X, int Y, int Z, int W)
} }
HMMDEF HINLINE vec2 HMMDEF HINLINE vec2
AddV2(vec2 Left, vec2 Right) AddVec2(vec2 Left, vec2 Right)
{ {
vec2 Result; vec2 Result;
@@ -455,7 +486,7 @@ AddV2(vec2 Left, vec2 Right)
} }
HMMDEF HINLINE vec3 HMMDEF HINLINE vec3
AddV3(vec3 Left, vec3 Right) AddVec3(vec3 Left, vec3 Right)
{ {
vec3 Result; vec3 Result;
@@ -467,7 +498,7 @@ AddV3(vec3 Left, vec3 Right)
} }
HMMDEF HINLINE vec4 HMMDEF HINLINE vec4
AddV4(vec4 Left, vec4 Right) AddVec4(vec4 Left, vec4 Right)
{ {
vec4 Result; vec4 Result;
@@ -480,7 +511,7 @@ AddV4(vec4 Left, vec4 Right)
} }
HMMDEF HINLINE vec2 HMMDEF HINLINE vec2
SubtractV2(vec2 Left, vec2 Right) SubtractVec2(vec2 Left, vec2 Right)
{ {
vec2 Result; vec2 Result;
@@ -491,7 +522,7 @@ SubtractV2(vec2 Left, vec2 Right)
} }
HMMDEF HINLINE vec3 HMMDEF HINLINE vec3
SubtractV3(vec3 Left, vec3 Right) SubtractVec3(vec3 Left, vec3 Right)
{ {
vec3 Result; vec3 Result;
@@ -503,7 +534,7 @@ SubtractV3(vec3 Left, vec3 Right)
} }
HMMDEF HINLINE vec4 HMMDEF HINLINE vec4
SubtractV4(vec4 Left, vec4 Right) SubtractVec4(vec4 Left, vec4 Right)
{ {
vec4 Result; vec4 Result;
@@ -516,7 +547,7 @@ SubtractV4(vec4 Left, vec4 Right)
} }
HMMDEF HINLINE vec2 HMMDEF HINLINE vec2
MultiplyV2(vec2 Left, vec2 Right) MultiplyVec2(vec2 Left, vec2 Right)
{ {
vec2 Result; vec2 Result;
@@ -527,7 +558,7 @@ MultiplyV2(vec2 Left, vec2 Right)
} }
HMMDEF HINLINE vec3 HMMDEF HINLINE vec3
MultiplyV3(vec3 Left, vec3 Right) MultiplyVec3(vec3 Left, vec3 Right)
{ {
vec3 Result; vec3 Result;
@@ -539,7 +570,7 @@ MultiplyV3(vec3 Left, vec3 Right)
} }
HMMDEF HINLINE vec4 HMMDEF HINLINE vec4
MultiplyV4(vec4 Left, vec4 Right) MultiplyVec4(vec4 Left, vec4 Right)
{ {
vec4 Result; vec4 Result;
@@ -552,7 +583,7 @@ MultiplyV4(vec4 Left, vec4 Right)
} }
HMMDEF HINLINE vec2 HMMDEF HINLINE vec2
DivideV2(vec2 Left, vec2 Right) DivideVec2(vec2 Left, vec2 Right)
{ {
vec2 Result; vec2 Result;
@@ -563,7 +594,7 @@ DivideV2(vec2 Left, vec2 Right)
} }
HMMDEF HINLINE vec3 HMMDEF HINLINE vec3
DivideV3(vec3 Left, vec3 Right) DivideVec3(vec3 Left, vec3 Right)
{ {
vec3 Result; vec3 Result;
@@ -575,7 +606,7 @@ DivideV3(vec3 Left, vec3 Right)
} }
HMMDEF HINLINE vec4 HMMDEF HINLINE vec4
DivideV4(vec4 Left, vec4 Right) DivideVec4(vec4 Left, vec4 Right)
{ {
vec4 Result; vec4 Result;
@@ -586,7 +617,7 @@ DivideV4(vec4 Left, vec4 Right)
return(Result); return(Result);
} }
\
HMMDEF mat4 Mat4() HMMDEF mat4 Mat4()
{ {
mat4 Result; mat4 Result;
@@ -668,7 +699,7 @@ Orthographic(float Left, float Right, float Bottom, float Top, float Near, float
} }
HMMDEF mat4 HMMDEF mat4
Perspective(float FOV, float AspectRatio, float Near, float Far) Pespective(float FOV, float AspectRatio, float Near, float Far)
{ {
mat4 Result = Mat4d(1.0f); mat4 Result = Mat4d(1.0f);
@@ -713,6 +744,42 @@ Rotate(float Angle, vec3 Axis)
return(Result); return(Result);
} }
HMMDEF mat4
LookAt(vec3 Eye, vec3 Center, vec3 Up)
{
mat4 Result = {};
// returns vec3 Normalize(Center - Eye);
// returns vec3 Cross(Center - Eye, Up);
// Normalize Cross Product
// Cross(CrossResult, NormalizeResult)
vec3 F = Normalize(Center - Eye);
vec3 S = Cross(F, Up);
vec3 U = Cross(F, S);
Result.Elements[0][0] = S.X;
Result.Elements[0][1] = U.X;
Result.Elements[0][2] = -F.X;
Result.Elements[1][0] = S.Y;
Result.Elements[1][1] = U.Y;
Result.Elements[1][2] = -F.Y;
Result.Elements[2][0] = S.Z;
Result.Elements[2][1] = U.Z;
Result.Elements[2][2] = -F.Y;
Result.Elements[3][0] = -Dot(S, Eye);
Result.Elements[3][1] = -Dot(U, Eye);
Result.Elements[3][2] = Dot(F, Eye);
Result.Elements[3][3] = 1.0f;
return(Result);
}
HMMDEF mat4 HMMDEF mat4
Scale(vec3 Scale) Scale(vec3 Scale)
{ {
@@ -730,7 +797,7 @@ Scale(vec3 Scale)
HMMDEF HINLINE vec2 HMMDEF HINLINE vec2
Add(vec2 Left, vec2 Right) Add(vec2 Left, vec2 Right)
{ {
vec2 Result = AddV2(Left, Right); vec2 Result = AddVec2(Left, Right);
return(Result); return(Result);
} }
@@ -738,7 +805,7 @@ Add(vec2 Left, vec2 Right)
HMMDEF HINLINE vec3 HMMDEF HINLINE vec3
Add(vec3 Left, vec3 Right) Add(vec3 Left, vec3 Right)
{ {
vec3 Result = AddV3(Left, Right); vec3 Result = AddVec3(Left, Right);
return(Result); return(Result);
} }
@@ -746,7 +813,7 @@ Add(vec3 Left, vec3 Right)
HMMDEF HINLINE vec4 HMMDEF HINLINE vec4
Add(vec4 Left, vec4 Right) Add(vec4 Left, vec4 Right)
{ {
vec4 Result = AddV4(Left, Right); vec4 Result = AddVec4(Left, Right);
return(Result); return(Result);
} }
@@ -754,7 +821,7 @@ Add(vec4 Left, vec4 Right)
HMMDEF HINLINE vec2 HMMDEF HINLINE vec2
Subtract(vec2 Left, vec2 Right) Subtract(vec2 Left, vec2 Right)
{ {
vec2 Result = SubtractV2(Left, Right); vec2 Result = SubtractVec2(Left, Right);
return(Result); return(Result);
} }
@@ -762,7 +829,7 @@ Subtract(vec2 Left, vec2 Right)
HMMDEF HINLINE vec3 HMMDEF HINLINE vec3
Subtract(vec3 Left, vec3 Right) Subtract(vec3 Left, vec3 Right)
{ {
vec3 Result = SubtractV3(Left, Right); vec3 Result = SubtractVec3(Left, Right);
return(Result); return(Result);
} }
@@ -770,7 +837,7 @@ Subtract(vec3 Left, vec3 Right)
HMMDEF HINLINE vec4 HMMDEF HINLINE vec4
Subtract(vec4 Left, vec4 Right) Subtract(vec4 Left, vec4 Right)
{ {
vec4 Result = SubtractV4(Left, Right); vec4 Result = SubtractVec4(Left, Right);
return(Result); return(Result);
} }
@@ -778,7 +845,7 @@ Subtract(vec4 Left, vec4 Right)
HMMDEF HINLINE vec2 HMMDEF HINLINE vec2
Multiply(vec2 Left, vec2 Right) Multiply(vec2 Left, vec2 Right)
{ {
vec2 Result = MultiplyV2(Left, Right); vec2 Result = MultiplyVec2(Left, Right);
return(Result); return(Result);
} }
@@ -786,7 +853,7 @@ Multiply(vec2 Left, vec2 Right)
HMMDEF HINLINE vec3 HMMDEF HINLINE vec3
Multiply(vec3 Left, vec3 Right) Multiply(vec3 Left, vec3 Right)
{ {
vec3 Result = MultiplyV3(Left, Right); vec3 Result = MultiplyVec3(Left, Right);
return(Result); return(Result);
} }
@@ -794,7 +861,7 @@ Multiply(vec3 Left, vec3 Right)
HMMDEF HINLINE vec4 HMMDEF HINLINE vec4
Multiply(vec4 Left, vec4 Right) Multiply(vec4 Left, vec4 Right)
{ {
vec4 Result = MultiplyV4(Left, Right); vec4 Result = MultiplyVec4(Left, Right);
return(Result); return(Result);
} }
@@ -810,7 +877,7 @@ Multiply(mat4 Left, mat4 Right)
HMMDEF HINLINE vec2 HMMDEF HINLINE vec2
Divide(vec2 Left, vec2 Right) Divide(vec2 Left, vec2 Right)
{ {
vec2 Result = DivideV2(Left, Right); vec2 Result = DivideVec2(Left, Right);
return(Result); return(Result);
} }
@@ -818,7 +885,7 @@ Divide(vec2 Left, vec2 Right)
HMMDEF HINLINE vec3 HMMDEF HINLINE vec3
Divide(vec3 Left, vec3 Right) Divide(vec3 Left, vec3 Right)
{ {
vec3 Result = DivideV3(Left, Right); vec3 Result = DivideVec3(Left, Right);
return(Result); return(Result);
} }
@@ -826,7 +893,7 @@ Divide(vec3 Left, vec3 Right)
HMMDEF HINLINE vec4 HMMDEF HINLINE vec4
Divide(vec4 Left, vec4 Right) Divide(vec4 Left, vec4 Right)
{ {
vec4 Result = DivideV4(Left, Right); vec4 Result = DivideVec4(Left, Right);
return(Result); return(Result);
} }