mirror of
https://github.com/libretro/RetroArch
synced 2025-03-29 22:20:21 +00:00
Matrix code 4x4 - prevent memsets
This commit is contained in:
parent
1a1b221ddd
commit
cd2599456a
@ -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 */
|
||||
|
Loading…
x
Reference in New Issue
Block a user