From cd2599456a24fdbf7e882817de6a9a6f25dd87b9 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Fri, 4 Nov 2016 15:50:28 +0100 Subject: [PATCH] Matrix code 4x4 - prevent memsets --- libretro-common/gfx/math/matrix_4x4.c | 143 +++++++++++++++++++++----- 1 file changed, 116 insertions(+), 27 deletions(-) diff --git a/libretro-common/gfx/math/matrix_4x4.c b/libretro-common/gfx/math/matrix_4x4.c index 42604d069d..2b03e987ef 100644 --- a/libretro-common/gfx/math/matrix_4x4.c +++ b/libretro-common/gfx/math/matrix_4x4.c @@ -26,7 +26,7 @@ #include #include -#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 */