mirror of
https://github.com/libretro/RetroArch
synced 2025-04-01 13:20:43 +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/matrix_4x4.h>
|
||||||
#include <gfx/math/vector_3.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)
|
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;
|
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++)
|
for (i = 0; i < 4; i++)
|
||||||
MAT_ELEM_4X4(*mat, i, i) = 1.0f;
|
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)
|
void matrix_4x4_rotate_x(math_matrix_4x4 *mat, float rad)
|
||||||
{
|
{
|
||||||
float cosine = cosf(rad);
|
float cosine = cosf(rad);
|
||||||
float sine = sinf(rad);
|
float sine = sinf(rad);
|
||||||
|
|
||||||
matrix_4x4_identity(mat);
|
|
||||||
|
|
||||||
|
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, 1, 1) = cosine;
|
||||||
MAT_ELEM_4X4(*mat, 2, 2) = cosine;
|
|
||||||
MAT_ELEM_4X4(*mat, 1, 2) = -sine;
|
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, 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)
|
void matrix_4x4_rotate_y(math_matrix_4x4 *mat, float rad)
|
||||||
{
|
{
|
||||||
float cosine = cosf(rad);
|
float cosine = cosf(rad);
|
||||||
float sine = sinf(rad);
|
float sine = sinf(rad);
|
||||||
|
|
||||||
matrix_4x4_identity(mat);
|
|
||||||
|
|
||||||
MAT_ELEM_4X4(*mat, 0, 0) = cosine;
|
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, 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, 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 cosine = cosf(rad);
|
||||||
float sine = sinf(rad);
|
float sine = sinf(rad);
|
||||||
|
|
||||||
matrix_4x4_identity(mat);
|
|
||||||
|
|
||||||
MAT_ELEM_4X4(*mat, 0, 0) = cosine;
|
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, 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, 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 bottom, float top,
|
||||||
float znear, float zfar)
|
float znear, float zfar)
|
||||||
{
|
{
|
||||||
float rl = right - left;
|
float rl = right - left;
|
||||||
float tb = top - bottom;
|
float tb = top - bottom;
|
||||||
float fn = zfar - znear;
|
float fn = zfar - znear;
|
||||||
|
|
||||||
matrix_4x4_identity(mat);
|
|
||||||
|
|
||||||
MAT_ELEM_4X4(*mat, 0, 0) = 2.0f / rl;
|
MAT_ELEM_4X4(*mat, 0, 0) = 2.0f / rl;
|
||||||
MAT_ELEM_4X4(*mat, 1, 1) = 2.0f / tb;
|
MAT_ELEM_4X4(*mat, 0, 1) = 0.0f;
|
||||||
MAT_ELEM_4X4(*mat, 2, 2) = -2.0f / fn;
|
MAT_ELEM_4X4(*mat, 0, 2) = 0.0f;
|
||||||
MAT_ELEM_4X4(*mat, 0, 3) = -(left + right) / rl;
|
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, 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, 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,
|
void matrix_4x4_scale(math_matrix_4x4 *out, float x, float y,
|
||||||
float z)
|
float z)
|
||||||
{
|
{
|
||||||
memset(out, 0, sizeof(*out));
|
|
||||||
MAT_ELEM_4X4(*out, 0, 0) = x;
|
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, 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, 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;
|
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,
|
void matrix_4x4_translate(math_matrix_4x4 *out, float x,
|
||||||
float y, float z)
|
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, 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, 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, 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 znear,
|
||||||
float zfar)
|
float zfar)
|
||||||
{
|
{
|
||||||
float const a = 1.f / tan(y_fov / 2.f);
|
float const a = 1.f / tan(y_fov / 2.f);
|
||||||
float delta_z = zfar - znear;
|
float delta_z = zfar - znear;
|
||||||
|
|
||||||
memset(out, 0, sizeof(*out));
|
|
||||||
MAT_ELEM_4X4(*out, 0, 0) = a / aspect;
|
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, 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, 2) = -((zfar + znear) / delta_z);
|
||||||
MAT_ELEM_4X4(*out, 2, 3) = -1.f;
|
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, 2) = -((2.f * zfar * znear) / delta_z);
|
||||||
|
MAT_ELEM_4X4(*out, 3, 3) = 1.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TODO/FIXME - finish */
|
/* TODO/FIXME - finish */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user