Matrix code 4x4 - prevent memsets

This commit is contained in:
twinaphex 2016-11-04 15:50:28 +01:00
parent 1a1b221ddd
commit cd2599456a

View File

@ -26,7 +26,7 @@
#include <gfx/math/matrix_4x4.h>
#include <gfx/math/vector_3.h>
#define MAT_ELEM_4X4(mat, r, c) ((mat).data[4 * (c) + (r)])
#define MAT_ELEM_4X4(mat, row, column) ((mat).data[4 * (column) + (row)])
void matrix_4x4_copy(math_matrix_4x4 *dst, const math_matrix_4x4 *src)
{
@ -44,7 +44,22 @@ void matrix_4x4_identity(math_matrix_4x4 *mat)
{
unsigned i;
memset(mat, 0, sizeof(*mat));
MAT_ELEM_4X4(*mat, 0, 1) = 0.0f;
MAT_ELEM_4X4(*mat, 0, 2) = 0.0f;
MAT_ELEM_4X4(*mat, 0, 3) = 0.0f;
MAT_ELEM_4X4(*mat, 1, 0) = 0.0f;
MAT_ELEM_4X4(*mat, 1, 2) = 0.0f;
MAT_ELEM_4X4(*mat, 1, 3) = 0.0f;
MAT_ELEM_4X4(*mat, 2, 0) = 0.0f;
MAT_ELEM_4X4(*mat, 2, 1) = 0.0f;
MAT_ELEM_4X4(*mat, 2, 3) = 0.0f;
MAT_ELEM_4X4(*mat, 3, 0) = 0.0f;
MAT_ELEM_4X4(*mat, 3, 1) = 0.0f;
MAT_ELEM_4X4(*mat, 3, 2) = 0.0f;
for (i = 0; i < 4; i++)
MAT_ELEM_4X4(*mat, i, i) = 1.0f;
}
@ -69,15 +84,25 @@ void matrix_4x4_transpose(math_matrix_4x4 *out, const math_matrix_4x4 *in)
*/
void matrix_4x4_rotate_x(math_matrix_4x4 *mat, float rad)
{
float cosine = cosf(rad);
float sine = sinf(rad);
matrix_4x4_identity(mat);
float cosine = cosf(rad);
float sine = sinf(rad);
MAT_ELEM_4X4(*mat, 0, 0) = 1.0f;
MAT_ELEM_4X4(*mat, 0, 1) = 0.0f;
MAT_ELEM_4X4(*mat, 0, 2) = 0.0f;
MAT_ELEM_4X4(*mat, 0, 3) = 0.0f;
MAT_ELEM_4X4(*mat, 1, 0) = 0.0f;
MAT_ELEM_4X4(*mat, 1, 1) = cosine;
MAT_ELEM_4X4(*mat, 2, 2) = cosine;
MAT_ELEM_4X4(*mat, 1, 2) = -sine;
MAT_ELEM_4X4(*mat, 1, 3) = 0.0f;
MAT_ELEM_4X4(*mat, 2, 0) = 0.0f;
MAT_ELEM_4X4(*mat, 2, 1) = sine;
MAT_ELEM_4X4(*mat, 2, 2) = cosine;
MAT_ELEM_4X4(*mat, 2, 3) = 0.0f;
MAT_ELEM_4X4(*mat, 3, 0) = 0.0f;
MAT_ELEM_4X4(*mat, 3, 1) = 0.0f;
MAT_ELEM_4X4(*mat, 3, 2) = 0.0f;
MAT_ELEM_4X4(*mat, 3, 3) = 1.0f;
}
/*
@ -86,15 +111,28 @@ void matrix_4x4_rotate_x(math_matrix_4x4 *mat, float rad)
*/
void matrix_4x4_rotate_y(math_matrix_4x4 *mat, float rad)
{
float cosine = cosf(rad);
float sine = sinf(rad);
matrix_4x4_identity(mat);
float cosine = cosf(rad);
float sine = sinf(rad);
MAT_ELEM_4X4(*mat, 0, 0) = cosine;
MAT_ELEM_4X4(*mat, 2, 2) = cosine;
MAT_ELEM_4X4(*mat, 0, 1) = 0.0f;
MAT_ELEM_4X4(*mat, 0, 2) = -sine;
MAT_ELEM_4X4(*mat, 0, 3) = 0.0f;
MAT_ELEM_4X4(*mat, 1, 0) = 0.0f;
MAT_ELEM_4X4(*mat, 1, 1) = 1.0f;
MAT_ELEM_4X4(*mat, 1, 2) = 0.0f;
MAT_ELEM_4X4(*mat, 1, 3) = 0.0f;
MAT_ELEM_4X4(*mat, 2, 0) = sine;
MAT_ELEM_4X4(*mat, 2, 1) = 0.0f;
MAT_ELEM_4X4(*mat, 2, 2) = cosine;
MAT_ELEM_4X4(*mat, 2, 3) = 0.0f;
MAT_ELEM_4X4(*mat, 3, 0) = 0.0f;
MAT_ELEM_4X4(*mat, 3, 1) = 0.0f;
MAT_ELEM_4X4(*mat, 3, 2) = 0.0f;
MAT_ELEM_4X4(*mat, 3, 3) = 1.0f;
}
/*
@ -106,12 +144,22 @@ void matrix_4x4_rotate_z(math_matrix_4x4 *mat, float rad)
float cosine = cosf(rad);
float sine = sinf(rad);
matrix_4x4_identity(mat);
MAT_ELEM_4X4(*mat, 0, 0) = cosine;
MAT_ELEM_4X4(*mat, 1, 1) = cosine;
MAT_ELEM_4X4(*mat, 0, 1) = -sine;
MAT_ELEM_4X4(*mat, 0, 2) = 0.0f;
MAT_ELEM_4X4(*mat, 0, 3) = 0.0f;
MAT_ELEM_4X4(*mat, 1, 0) = sine;
MAT_ELEM_4X4(*mat, 1, 1) = cosine;
MAT_ELEM_4X4(*mat, 1, 2) = 0.0f;
MAT_ELEM_4X4(*mat, 1, 3) = 0.0f;
MAT_ELEM_4X4(*mat, 2, 0) = 0.0f;
MAT_ELEM_4X4(*mat, 2, 1) = 0.0f;
MAT_ELEM_4X4(*mat, 2, 2) = 1.0f;
MAT_ELEM_4X4(*mat, 2, 3) = 0.0f;
MAT_ELEM_4X4(*mat, 3, 0) = 0.0f;
MAT_ELEM_4X4(*mat, 3, 1) = 0.0f;
MAT_ELEM_4X4(*mat, 3, 2) = 0.0f;
MAT_ELEM_4X4(*mat, 3, 3) = 1.0f;
}
/*
@ -122,27 +170,46 @@ void matrix_4x4_ortho(math_matrix_4x4 *mat,
float bottom, float top,
float znear, float zfar)
{
float rl = right - left;
float tb = top - bottom;
float fn = zfar - znear;
matrix_4x4_identity(mat);
float rl = right - left;
float tb = top - bottom;
float fn = zfar - znear;
MAT_ELEM_4X4(*mat, 0, 0) = 2.0f / rl;
MAT_ELEM_4X4(*mat, 1, 1) = 2.0f / tb;
MAT_ELEM_4X4(*mat, 2, 2) = -2.0f / fn;
MAT_ELEM_4X4(*mat, 0, 1) = 0.0f;
MAT_ELEM_4X4(*mat, 0, 2) = 0.0f;
MAT_ELEM_4X4(*mat, 0, 3) = -(left + right) / rl;
MAT_ELEM_4X4(*mat, 1, 0) = 0.0f;
MAT_ELEM_4X4(*mat, 1, 1) = 2.0f / tb;
MAT_ELEM_4X4(*mat, 1, 2) = 0.0f;
MAT_ELEM_4X4(*mat, 1, 3) = -(top + bottom) / tb;
MAT_ELEM_4X4(*mat, 2, 0) = 0.0f;
MAT_ELEM_4X4(*mat, 2, 1) = 0.0f;
MAT_ELEM_4X4(*mat, 2, 2) = -2.0f / fn;
MAT_ELEM_4X4(*mat, 2, 3) = -(zfar + znear) / fn;
MAT_ELEM_4X4(*mat, 3, 0) = 0.0f;
MAT_ELEM_4X4(*mat, 3, 1) = 0.0f;
MAT_ELEM_4X4(*mat, 3, 2) = 0.0f;
MAT_ELEM_4X4(*mat, 3, 3) = 1.0f;
}
void matrix_4x4_scale(math_matrix_4x4 *out, float x, float y,
float z)
{
memset(out, 0, sizeof(*out));
MAT_ELEM_4X4(*out, 0, 0) = x;
MAT_ELEM_4X4(*out, 0, 1) = 0.0f;
MAT_ELEM_4X4(*out, 0, 2) = 0.0f;
MAT_ELEM_4X4(*out, 0, 3) = 0.0f;
MAT_ELEM_4X4(*out, 1, 0) = 0.0f;
MAT_ELEM_4X4(*out, 1, 1) = y;
MAT_ELEM_4X4(*out, 1, 2) = 0.0f;
MAT_ELEM_4X4(*out, 1, 3) = 0.0f;
MAT_ELEM_4X4(*out, 2, 0) = 0.0f;
MAT_ELEM_4X4(*out, 2, 1) = 0.0f;
MAT_ELEM_4X4(*out, 2, 2) = z;
MAT_ELEM_4X4(*out, 2, 3) = 0.0f;
MAT_ELEM_4X4(*out, 3, 0) = 0.0f;
MAT_ELEM_4X4(*out, 3, 1) = 0.0f;
MAT_ELEM_4X4(*out, 3, 2) = 0.0f;
MAT_ELEM_4X4(*out, 3, 3) = 1.0f;
}
@ -154,10 +221,22 @@ void matrix_4x4_scale(math_matrix_4x4 *out, float x, float y,
void matrix_4x4_translate(math_matrix_4x4 *out, float x,
float y, float z)
{
matrix_4x4_identity(out);
MAT_ELEM_4X4(*out, 0, 0) = 0.0f;
MAT_ELEM_4X4(*out, 0, 1) = 0.0f;
MAT_ELEM_4X4(*out, 0, 2) = 0.0f;
MAT_ELEM_4X4(*out, 0, 3) = x;
MAT_ELEM_4X4(*out, 1, 0) = 0.0f;
MAT_ELEM_4X4(*out, 1, 1) = 1.0f;
MAT_ELEM_4X4(*out, 1, 2) = 1.0f;
MAT_ELEM_4X4(*out, 1, 3) = y;
MAT_ELEM_4X4(*out, 2, 0) = 0.0f;
MAT_ELEM_4X4(*out, 2, 1) = 0.0f;
MAT_ELEM_4X4(*out, 2, 2) = 1.0f;
MAT_ELEM_4X4(*out, 2, 3) = z;
MAT_ELEM_4X4(*out, 3, 0) = 0.0f;
MAT_ELEM_4X4(*out, 3, 1) = 0.0f;
MAT_ELEM_4X4(*out, 3, 2) = 0.0f;
MAT_ELEM_4X4(*out, 3, 3) = 1.0f;
}
/*
@ -169,15 +248,25 @@ void matrix_4x4_projection(math_matrix_4x4 *out,
float znear,
float zfar)
{
float const a = 1.f / tan(y_fov / 2.f);
float delta_z = zfar - znear;
float const a = 1.f / tan(y_fov / 2.f);
float delta_z = zfar - znear;
memset(out, 0, sizeof(*out));
MAT_ELEM_4X4(*out, 0, 0) = a / aspect;
MAT_ELEM_4X4(*out, 0, 1) = 0.0f;
MAT_ELEM_4X4(*out, 0, 2) = 0.0f;
MAT_ELEM_4X4(*out, 0, 3) = 0.0f;
MAT_ELEM_4X4(*out, 1, 0) = 0.0f;
MAT_ELEM_4X4(*out, 1, 1) = a;
MAT_ELEM_4X4(*out, 1, 2) = 0.0f;
MAT_ELEM_4X4(*out, 1, 3) = 0.0f;
MAT_ELEM_4X4(*out, 2, 0) = 0.0f;
MAT_ELEM_4X4(*out, 2, 1) = 0.0f;
MAT_ELEM_4X4(*out, 2, 2) = -((zfar + znear) / delta_z);
MAT_ELEM_4X4(*out, 2, 3) = -1.f;
MAT_ELEM_4X4(*out, 3, 0) = 0.0f;
MAT_ELEM_4X4(*out, 3, 1) = 0.0f;
MAT_ELEM_4X4(*out, 3, 2) = -((2.f * zfar * znear) / delta_z);
MAT_ELEM_4X4(*out, 3, 3) = 1.0f;
}
/* TODO/FIXME - finish */