diff --git a/gfx/math/matrix.c b/gfx/math/matrix.c index fe6f7b7fd9..6b240d6b76 100644 --- a/gfx/math/matrix.c +++ b/gfx/math/matrix.c @@ -92,6 +92,49 @@ void matrix_ortho(math_matrix *mat, MAT_ELEM(*mat, 2, 3) = tz; } +void matrix_scale(math_matrix *out, float x, float y, + float z) +{ + math_matrix mat; + + MAT_ELEM(mat, 0, 0) = x; + MAT_ELEM(mat, 1, 1) = y; + MAT_ELEM(mat, 2, 2) = z; + MAT_ELEM(mat, 3, 3) = 1.0; + + *out = mat; +} + +void matrix_translate(math_matrix *out, float x, + float y, float z) +{ + math_matrix mat; + + MAT_ELEM(mat, 0, 0) = 1.0; + MAT_ELEM(mat, 1, 1) = 1.0; + MAT_ELEM(mat, 2, 2) = 1.0; + MAT_ELEM(mat, 3, 3) = 1.0; + MAT_ELEM(mat, 0, 3) = x; + MAT_ELEM(mat, 1, 3) = y; + MAT_ELEM(mat, 2, 3) = z; + + *out = mat; +} + +void matrix_projection(math_matrix *out, float znear, + float zfar) +{ + math_matrix mat; + + MAT_ELEM(mat, 0, 0) = znear; + MAT_ELEM(mat, 1, 1) = zfar; + MAT_ELEM(mat, 2, 2) = (zfar + znear) / (zfar - znear); + MAT_ELEM(mat, 2, 3) = -2.0f * zfar * znear / (zfar - znear); + MAT_ELEM(mat, 3, 2) = -1.0f; + + *out = mat; +} + void matrix_multiply(math_matrix *out, const math_matrix *a, const math_matrix *b) { @@ -110,4 +153,3 @@ void matrix_multiply(math_matrix *out, *out = mat; } - diff --git a/gfx/math/matrix.h b/gfx/math/matrix.h index 42c93bae9e..0281a21ce8 100644 --- a/gfx/math/matrix.h +++ b/gfx/math/matrix.h @@ -39,5 +39,9 @@ void matrix_ortho(math_matrix *mat, void matrix_multiply(math_matrix *out, const math_matrix *a, const math_matrix *b); +void matrix_scale(math_matrix *out, float x, float y, float z); +void matrix_translate(math_matrix *out, float x, float y, float z); +void matrix_projection(math_matrix *out, float znear, float zfar); + #endif