397 lines
7.2 KiB
C
397 lines
7.2 KiB
C
#ifndef H_ENGINE_MATH
|
|
#define H_ENGINE_MATH
|
|
|
|
#include <math.h>
|
|
|
|
#define PI 3.14159265359
|
|
#define DEG2RAD 0.0174533
|
|
|
|
typedef struct
|
|
vec2f_t
|
|
{
|
|
float x;
|
|
float y;
|
|
} vec2f_t;
|
|
|
|
typedef struct
|
|
vec3f_t
|
|
{
|
|
float x;
|
|
float y;
|
|
float z;
|
|
} vec3f_t;
|
|
|
|
typedef struct
|
|
vec4f_t
|
|
{
|
|
float x;
|
|
float y;
|
|
float z;
|
|
float w;
|
|
} vec4f_t;
|
|
|
|
typedef struct
|
|
mat3f_t
|
|
{
|
|
|
|
float mat[9];
|
|
|
|
} mat3f_t;
|
|
|
|
typedef struct
|
|
mat4f_t
|
|
{
|
|
|
|
float mat[16];
|
|
|
|
} mat4f_t;
|
|
|
|
typedef struct
|
|
quack_t
|
|
{
|
|
vec3f_t x;
|
|
vec3f_t y;
|
|
vec3f_t w;
|
|
vec3f_t h;
|
|
} quack_t;
|
|
|
|
static //inline
|
|
quack_t Quad(vec3f_t X, vec3f_t Y, vec3f_t W, vec3f_t H)
|
|
{
|
|
quack_t quad;
|
|
quad.x = X;
|
|
quad.y = Y;
|
|
quad.w = W;
|
|
quad.h = H;
|
|
|
|
return (quad);
|
|
}
|
|
|
|
static //inline
|
|
vec2f_t Vec2f(float x, float y)
|
|
{
|
|
vec2f_t v2;
|
|
v2.x = x;
|
|
v2.y = y;
|
|
return v2;
|
|
}
|
|
|
|
static //inline
|
|
vec3f_t Vec3f(float x, float y, float z)
|
|
{
|
|
vec3f_t v3;
|
|
|
|
v3.x = x;
|
|
v3.y = y;
|
|
v3.z = z;
|
|
|
|
return v3;
|
|
}
|
|
|
|
static //inline
|
|
vec4f_t Vec4f(float x, float y, float z, float w)
|
|
{
|
|
vec4f_t v4;
|
|
v4.x = x;
|
|
v4.y = y;
|
|
v4.z = z;
|
|
v4.w = w;
|
|
|
|
return (v4);
|
|
}
|
|
|
|
static //inline
|
|
int Vec3f_Equals(vec3f_t V1, vec3f_t V2)
|
|
{
|
|
if (V1.x == V2.x &&
|
|
V1.y == V2.y &&
|
|
V1.z == V2.z)
|
|
{
|
|
return (1);
|
|
}
|
|
|
|
return (0);
|
|
}
|
|
|
|
static //inline
|
|
mat3f_t Mat3f_Identity()
|
|
{
|
|
mat3f_t mat;
|
|
|
|
mat.mat[0] = 1.0f;
|
|
mat.mat[1] = 0.0f;
|
|
mat.mat[2] = 0.0f;
|
|
|
|
mat.mat[3] = 0.0f;
|
|
mat.mat[4] = 1.0f;
|
|
mat.mat[5] = 0.0f;
|
|
|
|
mat.mat[6] = 0.0f;
|
|
mat.mat[7] = 0.0f;
|
|
mat.mat[8] = 1.0f;
|
|
|
|
return mat;
|
|
}
|
|
|
|
static //inline
|
|
mat4f_t Mat4f_Identity()
|
|
{
|
|
mat4f_t mat;
|
|
|
|
mat.mat[0] = 1.0f;
|
|
mat.mat[1] = 0.0f;
|
|
mat.mat[2] = 0.0f;
|
|
mat.mat[3] = 0.0f;
|
|
|
|
mat.mat[4] = 0.0f;
|
|
mat.mat[5] = 1.0f;
|
|
mat.mat[6] = 0.0f;
|
|
mat.mat[7] = 0.0f;
|
|
|
|
mat.mat[8] = 0.0f;
|
|
mat.mat[9] = 0.0f;
|
|
mat.mat[10] = 1.0f;
|
|
mat.mat[11] = 0.0f;
|
|
|
|
mat.mat[12] = 0.0f;
|
|
mat.mat[13] = 0.0f;
|
|
mat.mat[14] = 0.0f;
|
|
mat.mat[15] = 1.0f;
|
|
|
|
return mat;
|
|
}
|
|
|
|
static //inline
|
|
vec3f_t NegativeVec3f(vec3f_t v)
|
|
{
|
|
v.x = -v.x;
|
|
v.y = -v.y;
|
|
v.z = -v.z;
|
|
|
|
return v;
|
|
}
|
|
|
|
static //inline
|
|
float DotProductVec2f(vec2f_t v1, vec2f_t v2)
|
|
{
|
|
return (v1.x*v2.x + v1.y*v2.y);
|
|
}
|
|
|
|
static //inline
|
|
float DotProductVec3f(vec3f_t v1, vec3f_t v2)
|
|
{
|
|
return (v1.x*v2.x + v1.y*v2.y + v1.z*v2.z);
|
|
}
|
|
|
|
static //inline
|
|
vec3f_t AddVec3f(vec3f_t v1, vec3f_t v2)
|
|
{
|
|
|
|
vec3f_t v3;
|
|
|
|
v3.x = v2.x + v1.x;
|
|
v3.y = v2.y + v1.y;
|
|
v3.z = v2.z + v1.z;
|
|
|
|
return v3;
|
|
}
|
|
|
|
static //inline
|
|
vec3f_t SubtractVec3f(vec3f_t v1, vec3f_t v2)
|
|
{
|
|
vec3f_t v3;
|
|
|
|
v3.x = v2.x - v1.x;
|
|
v3.y = v2.y - v1.y;
|
|
v3.z = v2.z - v1.z;
|
|
|
|
return v3;
|
|
}
|
|
|
|
static //inline
|
|
vec3f_t MultiplyVec3f(vec3f_t v, float s)
|
|
{
|
|
v.x *= s;
|
|
v.y *= s;
|
|
v.z *= s;
|
|
|
|
return v;
|
|
}
|
|
|
|
static //inline
|
|
float MagnitudeVec3f(vec3f_t v)
|
|
{
|
|
return sqrt(v.x*v.x + v.y*v.y + v.z*v.z);
|
|
}
|
|
|
|
static //inline
|
|
vec3f_t NormalizeVec3f(vec3f_t v)
|
|
{
|
|
float vMag = MagnitudeVec3f(v);
|
|
|
|
v.x /= vMag;
|
|
v.y /= vMag;
|
|
v.z /= vMag;
|
|
|
|
return v;
|
|
}
|
|
|
|
static //inline
|
|
vec3f_t CrossProductVec3f(vec3f_t v1, vec3f_t v2)
|
|
{
|
|
vec3f_t v3;
|
|
|
|
v3.x = (v1.y * v2.z) - (v1.z * v2.y);
|
|
v3.y = (v1.z * v2.x) - (v1.x * v2.z);
|
|
v3.z = (v1.x * v2.y) - (v1.y * v2.x);
|
|
|
|
return v3;
|
|
}
|
|
|
|
static //inline
|
|
mat4f_t TranslationMat4f(float x, float y, float z)
|
|
{
|
|
mat4f_t trans = Mat4f_Identity();
|
|
|
|
trans.mat[12] = x;
|
|
trans.mat[13] = y;
|
|
trans.mat[14] = z;
|
|
|
|
return trans;
|
|
}
|
|
|
|
static //inline
|
|
mat4f_t ScalingMat4f(float x, float y, float z)
|
|
{
|
|
mat4f_t scale = Mat4f_Identity();
|
|
|
|
scale.mat[0] *= x;
|
|
scale.mat[5] *= y;
|
|
scale.mat[10] *= z;
|
|
|
|
return scale;
|
|
}
|
|
|
|
static //inline
|
|
mat4f_t RotationMat4f(float deg, int x, int y, int z)
|
|
{
|
|
|
|
mat4f_t rot = Mat4f_Identity();
|
|
|
|
float rad = deg * DEG2RAD;
|
|
|
|
if (x)
|
|
{
|
|
rot.mat[5] = cos(rad);
|
|
rot.mat[6] = sin(rad);
|
|
rot.mat[9] = -sin(rad);
|
|
rot.mat[10] = cos(rad);
|
|
}
|
|
else if (y)
|
|
{
|
|
rot.mat[0] = cos(rad);
|
|
rot.mat[2]= -sin(rad);
|
|
rot.mat[8] = sin(rad);
|
|
rot.mat[10] = cos(rad);
|
|
}
|
|
else if (z)
|
|
{
|
|
rot.mat[0] = cos(rad);
|
|
rot.mat[1] = sin(rad);
|
|
rot.mat[4] = -sin(rad);
|
|
rot.mat[5] = cos(rad);
|
|
}
|
|
|
|
return rot;
|
|
|
|
}
|
|
|
|
static //inline
|
|
vec4f_t MultiplyVec4fByMat4f(vec4f_t V, mat4f_t M)
|
|
{
|
|
vec4f_t Result;
|
|
|
|
Result.x = M.mat[0]*V.x + M.mat[4]*V.y + M.mat[8]*V.z + M.mat[12]*V.w;
|
|
Result.y = M.mat[1]*V.x + M.mat[5]*V.y + M.mat[9]*V.z + M.mat[13]*V.w;
|
|
Result.z = M.mat[2]*V.x + M.mat[6]*V.y + M.mat[10]*V.z + M.mat[14]*V.w;
|
|
Result.w = M.mat[3]*V.x + M.mat[7]*V.y + M.mat[11]*V.z + M.mat[15]*V.w;
|
|
|
|
return (Result);
|
|
}
|
|
|
|
|
|
static //inline
|
|
mat4f_t MultiplyMat4f(mat4f_t mat1, mat4f_t mat2)
|
|
{
|
|
mat4f_t mat3;
|
|
|
|
mat3.mat[0] = mat1.mat[0]*mat2.mat[0] + mat1.mat[4]*mat2.mat[1] +
|
|
mat1.mat[8]*mat2.mat[2] + mat1.mat[12]*mat2.mat[3];
|
|
|
|
mat3.mat[4] = mat1.mat[0]*mat2.mat[4] + mat1.mat[4]*mat2.mat[5] +
|
|
mat1.mat[8]*mat2.mat[6] + mat1.mat[12]*mat2.mat[7];
|
|
|
|
mat3.mat[8] = mat1.mat[0]*mat2.mat[8] + mat1.mat[4]*mat2.mat[9] +
|
|
mat1.mat[8]*mat2.mat[10] + mat1.mat[12]*mat2.mat[11];
|
|
|
|
mat3.mat[12] = mat1.mat[0]*mat2.mat[12] + mat1.mat[4]*mat2.mat[13] +
|
|
mat1.mat[8]*mat2.mat[14] + mat1.mat[12]*mat2.mat[15];
|
|
|
|
mat3.mat[1] = mat1.mat[1]*mat2.mat[0] + mat1.mat[5]*mat2.mat[1] +
|
|
mat1.mat[9]*mat2.mat[2] + mat1.mat[13]*mat2.mat[3];
|
|
|
|
mat3.mat[5] = mat1.mat[1]*mat2.mat[4] + mat1.mat[5]*mat2.mat[5] +
|
|
mat1.mat[9]*mat2.mat[6] + mat1.mat[13]*mat2.mat[7];
|
|
|
|
mat3.mat[9] = mat1.mat[1]*mat2.mat[8] + mat1.mat[5]*mat2.mat[9] +
|
|
mat1.mat[9]*mat2.mat[10] + mat1.mat[13]*mat2.mat[11];
|
|
|
|
mat3.mat[13] = mat1.mat[1]*mat2.mat[12] + mat1.mat[5]*mat2.mat[13] +
|
|
mat1.mat[9]*mat2.mat[14] + mat1.mat[13]*mat2.mat[15];
|
|
|
|
mat3.mat[2] = mat1.mat[2]*mat2.mat[0] + mat1.mat[6]*mat2.mat[1] +
|
|
mat1.mat[10]*mat2.mat[2] + mat1.mat[14]*mat2.mat[3];
|
|
|
|
mat3.mat[6] = mat1.mat[2]*mat2.mat[4] + mat1.mat[6]*mat2.mat[5] +
|
|
mat1.mat[10]*mat2.mat[6] + mat1.mat[14]*mat2.mat[7];
|
|
|
|
mat3.mat[10] = mat1.mat[2]*mat2.mat[8] + mat1.mat[6]*mat2.mat[9] +
|
|
mat1.mat[10]*mat2.mat[10] + mat1.mat[14]*mat2.mat[11];
|
|
|
|
mat3.mat[14] = mat1.mat[2]*mat2.mat[12] + mat1.mat[6]*mat2.mat[13] +
|
|
mat1.mat[10]*mat2.mat[14] + mat1.mat[14]*mat2.mat[15];
|
|
|
|
mat3.mat[3] = mat1.mat[3]*mat2.mat[0] + mat1.mat[7]*mat2.mat[1] +
|
|
mat1.mat[11]*mat2.mat[2] + mat1.mat[115]*mat2.mat[3];
|
|
|
|
mat3.mat[7] = mat1.mat[3]*mat2.mat[4] + mat1.mat[7]*mat2.mat[5] +
|
|
mat1.mat[11]*mat2.mat[6] + mat1.mat[115]*mat2.mat[7];
|
|
|
|
mat3.mat[11] = mat1.mat[3]*mat2.mat[8] + mat1.mat[7]*mat2.mat[9] +
|
|
mat1.mat[11]*mat2.mat[10] + mat1.mat[115]*mat2.mat[11];
|
|
|
|
mat3.mat[15] = mat1.mat[3]*mat2.mat[12] + mat1.mat[7]*mat2.mat[13] +
|
|
mat1.mat[11]*mat2.mat[14] + mat1.mat[15]*mat2.mat[15];
|
|
|
|
return mat3;
|
|
|
|
}
|
|
|
|
static //inline
|
|
float VE_Fabs(float Num)
|
|
{
|
|
return (Num >= 0 ? Num : -(Num));
|
|
}
|
|
|
|
static //inline
|
|
vec3f_t Vec3f_Fabs(vec3f_t Vec)
|
|
{
|
|
Vec.x = VE_Fabs(Vec.x);
|
|
Vec.y = VE_Fabs(Vec.y);
|
|
Vec.z = VE_Fabs(Vec.z);
|
|
|
|
return (Vec);
|
|
}
|
|
|
|
#endif
|