mirror of
https://github.com/libretro/RetroArch
synced 2025-02-28 12:40:23 +00:00
Cleanups to matrix_3x3.c
This commit is contained in:
parent
8ac346be63
commit
b7aefa71f8
@ -24,51 +24,8 @@
|
||||
#include <math.h>
|
||||
#include <string.h>
|
||||
|
||||
#define floats_are_equal(x, y) (fabs(x - y) <= 0.00001f * ((x) > (y) ? (y) : (x)))
|
||||
#define float_is_zero(x) (floats_are_equal((x) + 1, 1))
|
||||
|
||||
#define MAT_ELEM_3X3(mat, r, c) ((mat).data[3 * (r) + (c)])
|
||||
|
||||
void matrix_3x3_identity(math_matrix_3x3 *mat)
|
||||
{
|
||||
MAT_ELEM_3X3(*mat, 0, 0) = 1.0f;
|
||||
MAT_ELEM_3X3(*mat, 0, 1) = 0;
|
||||
MAT_ELEM_3X3(*mat, 0, 2) = 0;
|
||||
MAT_ELEM_3X3(*mat, 1, 0) = 0;
|
||||
MAT_ELEM_3X3(*mat, 1, 1) = 1.0f;
|
||||
MAT_ELEM_3X3(*mat, 1, 2) = 0;
|
||||
MAT_ELEM_3X3(*mat, 2, 0) = 0;
|
||||
MAT_ELEM_3X3(*mat, 2, 1) = 0;
|
||||
MAT_ELEM_3X3(*mat, 2, 2) = 1.0f;
|
||||
}
|
||||
|
||||
void matrix_3x3_inits(math_matrix_3x3 *mat,
|
||||
const float n11, const float n12, const float n13,
|
||||
const float n21, const float n22, const float n23,
|
||||
const float n31, const float n32, const float n33)
|
||||
{
|
||||
MAT_ELEM_3X3(*mat, 0, 0) = n11;
|
||||
MAT_ELEM_3X3(*mat, 0, 1) = n12;
|
||||
MAT_ELEM_3X3(*mat, 0, 2) = n13;
|
||||
MAT_ELEM_3X3(*mat, 1, 0) = n21;
|
||||
MAT_ELEM_3X3(*mat, 1, 1) = n22;
|
||||
MAT_ELEM_3X3(*mat, 1, 2) = n23;
|
||||
MAT_ELEM_3X3(*mat, 2, 0) = n31;
|
||||
MAT_ELEM_3X3(*mat, 2, 1) = n32;
|
||||
MAT_ELEM_3X3(*mat, 2, 2) = n33;
|
||||
}
|
||||
|
||||
void matrix_3x3_transpose(math_matrix_3x3 *out, const math_matrix_3x3 *in)
|
||||
{
|
||||
unsigned i, j;
|
||||
math_matrix_3x3 mat;
|
||||
|
||||
for (i = 0; i < 3; i++)
|
||||
for (j = 0; j < 3; j++)
|
||||
MAT_ELEM_3X3(mat, j, i) = MAT_ELEM_3X3(*in, i, j);
|
||||
|
||||
*out = mat;
|
||||
}
|
||||
#define FLOATS_ARE_EQUAL(x, y) (fabs(x - y) <= 0.00001f * ((x) > (y) ? (y) : (x)))
|
||||
#define FLOAT_IS_ZERO(x) (FLOATS_ARE_EQUAL((x) + 1, 1))
|
||||
|
||||
void matrix_3x3_multiply(math_matrix_3x3 *out,
|
||||
const math_matrix_3x3 *a, const math_matrix_3x3 *b)
|
||||
@ -90,14 +47,6 @@ void matrix_3x3_multiply(math_matrix_3x3 *out,
|
||||
*out = mat;
|
||||
}
|
||||
|
||||
void matrix_3x3_divide_scalar(math_matrix_3x3 *mat, const float s)
|
||||
{
|
||||
unsigned i, j;
|
||||
for (i = 0; i < 3; i++)
|
||||
for (j = 0; j < 3; j++)
|
||||
MAT_ELEM_3X3(*mat, i, j) /= s;
|
||||
}
|
||||
|
||||
float matrix_3x3_determinant(const math_matrix_3x3 *mat)
|
||||
{
|
||||
float det = MAT_ELEM_3X3(*mat, 0, 0) * (MAT_ELEM_3X3(*mat, 1, 1) * MAT_ELEM_3X3(*mat, 2, 2) - MAT_ELEM_3X3(*mat, 1, 2) * MAT_ELEM_3X3(*mat, 2, 1));
|
||||
@ -128,61 +77,40 @@ bool matrix_3x3_invert(math_matrix_3x3 *mat)
|
||||
{
|
||||
float det = matrix_3x3_determinant(mat);
|
||||
|
||||
if (float_is_zero(det))
|
||||
if (FLOAT_IS_ZERO(det))
|
||||
return false;
|
||||
|
||||
matrix_3x3_adjoint(mat);
|
||||
matrix_3x3_divide_scalar(mat, det);
|
||||
matrix_3x3_divide_scalar(*mat, det);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
*
|
||||
* the following code is Copyright 2009 VMware, Inc. All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the
|
||||
* "Software"), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sub license, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the
|
||||
* next paragraph) shall be included in all copies or substantial portions
|
||||
* of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
|
||||
* IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
|
||||
* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
**************************************************************************/
|
||||
|
||||
bool matrix_3x3_square_to_quad(const float dx0, const float dy0,
|
||||
const float dx1, const float dy1,
|
||||
const float dx3, const float dy3,
|
||||
const float dx2, const float dy2,
|
||||
math_matrix_3x3 *mat)
|
||||
bool matrix_3x3_square_to_quad(
|
||||
const float dx0, const float dy0,
|
||||
const float dx1, const float dy1,
|
||||
const float dx3, const float dy3,
|
||||
const float dx2, const float dy2,
|
||||
math_matrix_3x3 *mat)
|
||||
{
|
||||
float a, b, d, e;
|
||||
float ax = dx0 - dx1 + dx2 - dx3;
|
||||
float ay = dy0 - dy1 + dy2 - dy3;
|
||||
float c = dx0;
|
||||
float f = dy0;
|
||||
float g = 0;
|
||||
float h = 0;
|
||||
|
||||
if (float_is_zero(ax) && float_is_zero(ay))
|
||||
if (FLOAT_IS_ZERO(ax) && FLOAT_IS_ZERO(ay))
|
||||
{
|
||||
/* affine case */
|
||||
matrix_3x3_inits(mat,
|
||||
dx1 - dx0, dy1 - dy0, 0,
|
||||
dx2 - dx1, dy2 - dy1, 0,
|
||||
dx0, dy0, 1);
|
||||
a = dx1 - dx0;
|
||||
b = dx2 - dx1;
|
||||
d = dy1 - dy0;
|
||||
e = dy2 - dy1;
|
||||
}
|
||||
else
|
||||
{
|
||||
float a, b, c, d, e, f, g, h;
|
||||
float ax1 = dx1 - dx2;
|
||||
float ax2 = dx3 - dx2;
|
||||
float ay1 = dy1 - dy2;
|
||||
@ -201,25 +129,25 @@ bool matrix_3x3_square_to_quad(const float dx0, const float dy0,
|
||||
|
||||
a = dx1 - dx0 + g * dx1;
|
||||
b = dx3 - dx0 + h * dx3;
|
||||
c = dx0;
|
||||
d = dy1 - dy0 + g * dy1;
|
||||
e = dy3 - dy0 + h * dy3;
|
||||
f = dy0;
|
||||
|
||||
matrix_3x3_inits(mat,
|
||||
a, d, g,
|
||||
b, e, h,
|
||||
c, f, 1.f);
|
||||
}
|
||||
|
||||
|
||||
matrix_3x3_init(*mat,
|
||||
a, d, g,
|
||||
b, e, h,
|
||||
c, f, 1.f);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool matrix_3x3_quad_to_square(const float sx0, const float sy0,
|
||||
const float sx1, const float sy1,
|
||||
const float sx2, const float sy2,
|
||||
const float sx3, const float sy3,
|
||||
math_matrix_3x3 *mat)
|
||||
bool matrix_3x3_quad_to_square(
|
||||
const float sx0, const float sy0,
|
||||
const float sx1, const float sy1,
|
||||
const float sx2, const float sy2,
|
||||
const float sx3, const float sy3,
|
||||
math_matrix_3x3 *mat)
|
||||
{
|
||||
if (!matrix_3x3_square_to_quad(sx0, sy0, sx1, sy1,
|
||||
sx2, sy2, sx3, sy3,
|
||||
@ -229,15 +157,16 @@ bool matrix_3x3_quad_to_square(const float sx0, const float sy0,
|
||||
return matrix_3x3_invert(mat);
|
||||
}
|
||||
|
||||
bool matrix_3x3_quad_to_quad(const float dx0, const float dy0,
|
||||
const float dx1, const float dy1,
|
||||
const float dx2, const float dy2,
|
||||
const float dx3, const float dy3,
|
||||
const float sx0, const float sy0,
|
||||
const float sx1, const float sy1,
|
||||
const float sx2, const float sy2,
|
||||
const float sx3, const float sy3,
|
||||
math_matrix_3x3 *mat)
|
||||
bool matrix_3x3_quad_to_quad(
|
||||
const float dx0, const float dy0,
|
||||
const float dx1, const float dy1,
|
||||
const float dx2, const float dy2,
|
||||
const float dx3, const float dy3,
|
||||
const float sx0, const float sy0,
|
||||
const float sx1, const float sy1,
|
||||
const float sx2, const float sy2,
|
||||
const float sx3, const float sy3,
|
||||
math_matrix_3x3 *mat)
|
||||
{
|
||||
math_matrix_3x3 quad_to_square, square_to_quad;
|
||||
|
||||
|
@ -34,18 +34,59 @@ typedef struct math_matrix_3x3
|
||||
float data[9];
|
||||
} math_matrix_3x3;
|
||||
|
||||
void matrix_3x3_inits(math_matrix_3x3 *mat,
|
||||
const float n11, const float n12, const float n13,
|
||||
const float n21, const float n22, const float n23,
|
||||
const float n31, const float n32, const float n33);
|
||||
void matrix_3x3_identity(math_matrix_3x3 *mat);
|
||||
void matrix_3x3_transpose(math_matrix_3x3 *out, const math_matrix_3x3 *in);
|
||||
#define MAT_ELEM_3X3(mat, r, c) ((mat).data[3 * (r) + (c)])
|
||||
|
||||
#define matrix_3x3_init(mat, n11, n12, n13, n21, n22, n23, n31, n32, n33) \
|
||||
MAT_ELEM_3X3(mat, 0, 0) = n11; \
|
||||
MAT_ELEM_3X3(mat, 0, 1) = n12; \
|
||||
MAT_ELEM_3X3(mat, 0, 2) = n13; \
|
||||
MAT_ELEM_3X3(mat, 1, 0) = n21; \
|
||||
MAT_ELEM_3X3(mat, 1, 1) = n22; \
|
||||
MAT_ELEM_3X3(mat, 1, 2) = n23; \
|
||||
MAT_ELEM_3X3(mat, 2, 0) = n31; \
|
||||
MAT_ELEM_3X3(mat, 2, 1) = n32; \
|
||||
MAT_ELEM_3X3(mat, 2, 2) = n33
|
||||
|
||||
#define matrix_3x3_identity(mat) \
|
||||
MAT_ELEM_3X3(mat, 0, 0) = 1.0f; \
|
||||
MAT_ELEM_3X3(mat, 0, 1) = 0; \
|
||||
MAT_ELEM_3X3(mat, 0, 2) = 0; \
|
||||
MAT_ELEM_3X3(mat, 1, 0) = 0; \
|
||||
MAT_ELEM_3X3(mat, 1, 1) = 1.0f; \
|
||||
MAT_ELEM_3X3(mat, 1, 2) = 0; \
|
||||
MAT_ELEM_3X3(mat, 2, 0) = 0; \
|
||||
MAT_ELEM_3X3(mat, 2, 1) = 0; \
|
||||
MAT_ELEM_3X3(mat, 2, 2) = 1.0f
|
||||
|
||||
#define matrix_3x3_divide_scalar(mat, s) \
|
||||
MAT_ELEM_3X3(mat, 0, 0) /= s; \
|
||||
MAT_ELEM_3X3(mat, 0, 1) /= s; \
|
||||
MAT_ELEM_3X3(mat, 0, 2) /= s; \
|
||||
MAT_ELEM_3X3(mat, 1, 0) /= s; \
|
||||
MAT_ELEM_3X3(mat, 1, 1) /= s; \
|
||||
MAT_ELEM_3X3(mat, 1, 2) /= s; \
|
||||
MAT_ELEM_3X3(mat, 2, 0) /= s; \
|
||||
MAT_ELEM_3X3(mat, 2, 1) /= s; \
|
||||
MAT_ELEM_3X3(mat, 2, 2) /= s
|
||||
|
||||
#define matrix_3x3_transpose(mat, in) \
|
||||
MAT_ELEM_3X3(mat, 0, 0) = MAT_ELEM_3X3(in, 0, 0); \
|
||||
MAT_ELEM_3X3(mat, 1, 0) = MAT_ELEM_3X3(in, 0, 1); \
|
||||
MAT_ELEM_3X3(mat, 2, 0) = MAT_ELEM_3X3(in, 0, 2); \
|
||||
MAT_ELEM_3X3(mat, 0, 1) = MAT_ELEM_3X3(in, 1, 0); \
|
||||
MAT_ELEM_3X3(mat, 1, 1) = MAT_ELEM_3X3(in, 1, 1); \
|
||||
MAT_ELEM_3X3(mat, 2, 1) = MAT_ELEM_3X3(in, 1, 2); \
|
||||
MAT_ELEM_3X3(mat, 0, 2) = MAT_ELEM_3X3(in, 2, 0); \
|
||||
MAT_ELEM_3X3(mat, 1, 2) = MAT_ELEM_3X3(in, 2, 1); \
|
||||
MAT_ELEM_3X3(mat, 2, 2) = MAT_ELEM_3X3(in, 2, 2)
|
||||
|
||||
void matrix_3x3_multiply(math_matrix_3x3 *out,
|
||||
const math_matrix_3x3 *a, const math_matrix_3x3 *b);
|
||||
void matrix_3x3_divide_scalar(math_matrix_3x3 *mat, const float s);
|
||||
|
||||
float matrix_3x3_determinant(const math_matrix_3x3 *mat);
|
||||
|
||||
void matrix_3x3_adjoint(math_matrix_3x3 *mat);
|
||||
|
||||
bool matrix_3x3_invert(math_matrix_3x3 *mat);
|
||||
|
||||
bool matrix_3x3_square_to_quad(const float dx0, const float dy0,
|
||||
|
Loading…
x
Reference in New Issue
Block a user