mirror of
https://github.com/libretro/RetroArch
synced 2025-02-28 22:13:51 +00:00
Turn gfx/math functions into macros
This commit is contained in:
parent
04223b464a
commit
40411e5a6f
@ -772,11 +772,7 @@ endif
|
|||||||
|
|
||||||
OBJ += gfx/video_context_driver.o \
|
OBJ += gfx/video_context_driver.o \
|
||||||
gfx/drivers_context/gfx_null_ctx.o \
|
gfx/drivers_context/gfx_null_ctx.o \
|
||||||
gfx/video_state_tracker.o \
|
gfx/video_state_tracker.o
|
||||||
$(LIBRETRO_COMM_DIR)/gfx/math/vector_2.o \
|
|
||||||
$(LIBRETRO_COMM_DIR)/gfx/math/vector_3.o \
|
|
||||||
$(LIBRETRO_COMM_DIR)/gfx/math/vector_4.o \
|
|
||||||
$(LIBRETRO_COMM_DIR)/gfx/math/matrix_3x3.o
|
|
||||||
|
|
||||||
ifeq ($(HAVE_KMS), 1)
|
ifeq ($(HAVE_KMS), 1)
|
||||||
HAVE_AND_WILL_USE_DRM = 1
|
HAVE_AND_WILL_USE_DRM = 1
|
||||||
|
@ -281,11 +281,6 @@ VIDEO IMAGE
|
|||||||
VIDEO DRIVER
|
VIDEO DRIVER
|
||||||
============================================================ */
|
============================================================ */
|
||||||
|
|
||||||
#include "../libretro-common/gfx/math/matrix_3x3.c"
|
|
||||||
#include "../libretro-common/gfx/math/vector_2.c"
|
|
||||||
#include "../libretro-common/gfx/math/vector_3.c"
|
|
||||||
#include "../libretro-common/gfx/math/vector_4.c"
|
|
||||||
|
|
||||||
#if defined(GEKKO)
|
#if defined(GEKKO)
|
||||||
#ifdef HW_RVL
|
#ifdef HW_RVL
|
||||||
#include "../gfx/drivers/gx_gfx_vi_encoder.c"
|
#include "../gfx/drivers/gx_gfx_vi_encoder.c"
|
||||||
|
@ -1,140 +0,0 @@
|
|||||||
/* Copyright (C) 2010-2017 The RetroArch team
|
|
||||||
*
|
|
||||||
* ---------------------------------------------------------------------------------------
|
|
||||||
* The following license statement only applies to this file (matrix_3x3.c).
|
|
||||||
* ---------------------------------------------------------------------------------------
|
|
||||||
*
|
|
||||||
* 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, sublicense, 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 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 NONINFRINGEMENT.
|
|
||||||
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <gfx/math/matrix_3x3.h>
|
|
||||||
#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))
|
|
||||||
|
|
||||||
bool matrix_3x3_invert(math_matrix_3x3 *mat)
|
|
||||||
{
|
|
||||||
float det = matrix_3x3_determinant(*mat);
|
|
||||||
|
|
||||||
if (FLOAT_IS_ZERO(det))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
matrix_3x3_adjoint(*mat);
|
|
||||||
matrix_3x3_divide_scalar(*mat, det);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
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))
|
|
||||||
{
|
|
||||||
/* affine case */
|
|
||||||
a = dx1 - dx0;
|
|
||||||
b = dx2 - dx1;
|
|
||||||
d = dy1 - dy0;
|
|
||||||
e = dy2 - dy1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
float ax1 = dx1 - dx2;
|
|
||||||
float ax2 = dx3 - dx2;
|
|
||||||
float ay1 = dy1 - dy2;
|
|
||||||
float ay2 = dy3 - dy2;
|
|
||||||
|
|
||||||
/* determinants */
|
|
||||||
float gtop = ax * ay2 - ax2 * ay;
|
|
||||||
float htop = ax1 * ay - ax * ay1;
|
|
||||||
float bottom = ax1 * ay2 - ax2 * ay1;
|
|
||||||
|
|
||||||
if (!bottom)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
g = gtop / bottom;
|
|
||||||
h = htop / bottom;
|
|
||||||
|
|
||||||
a = dx1 - dx0 + g * dx1;
|
|
||||||
b = dx3 - dx0 + h * dx3;
|
|
||||||
d = dy1 - dy0 + g * dy1;
|
|
||||||
e = dy3 - dy0 + h * dy3;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
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)
|
|
||||||
{
|
|
||||||
return matrix_3x3_square_to_quad(sx0, sy0, sx1, sy1,
|
|
||||||
sx2, sy2, sx3, sy3,
|
|
||||||
mat) ? matrix_3x3_invert(mat) : false;
|
|
||||||
}
|
|
||||||
|
|
||||||
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 square_to_quad;
|
|
||||||
|
|
||||||
if (matrix_3x3_square_to_quad(dx0, dy0, dx1, dy1,
|
|
||||||
dx2, dy2, dx3, dy3,
|
|
||||||
&square_to_quad))
|
|
||||||
{
|
|
||||||
math_matrix_3x3 quad_to_square;
|
|
||||||
if (matrix_3x3_quad_to_square(sx0, sy0, sx1, sy1,
|
|
||||||
sx2, sy2, sx3, sy3,
|
|
||||||
&quad_to_square))
|
|
||||||
{
|
|
||||||
matrix_3x3_multiply(*mat, quad_to_square, square_to_quad);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
@ -1,54 +0,0 @@
|
|||||||
/* Copyright (C) 2010-2017 The RetroArch team
|
|
||||||
*
|
|
||||||
* ---------------------------------------------------------------------------------------
|
|
||||||
* The following license statement only applies to this file (vector_2.c).
|
|
||||||
* ---------------------------------------------------------------------------------------
|
|
||||||
*
|
|
||||||
* 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, sublicense, 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 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 NONINFRINGEMENT.
|
|
||||||
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <math.h>
|
|
||||||
|
|
||||||
#include <gfx/math/vector_2.h>
|
|
||||||
|
|
||||||
float vec2_dot(const float *a, const float *b)
|
|
||||||
{
|
|
||||||
return (a[0]*b[0]) + (a[1]*b[1]);
|
|
||||||
}
|
|
||||||
|
|
||||||
float vec2_cross(const float *a, const float *b)
|
|
||||||
{
|
|
||||||
return (a[0]*b[1]) - (a[1]*b[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
void vec2_add(float *dst, const float *src)
|
|
||||||
{
|
|
||||||
dst[0] += src[0];
|
|
||||||
dst[1] += src[1];
|
|
||||||
}
|
|
||||||
|
|
||||||
void vec2_subtract(float *dst, const float *src)
|
|
||||||
{
|
|
||||||
dst[0] -= src[0];
|
|
||||||
dst[1] -= src[1];
|
|
||||||
}
|
|
||||||
|
|
||||||
void vec2_copy(float *dst, const float *src)
|
|
||||||
{
|
|
||||||
dst[0] = src[0];
|
|
||||||
dst[1] = src[1];
|
|
||||||
}
|
|
@ -1,78 +0,0 @@
|
|||||||
/* Copyright (C) 2010-2017 The RetroArch team
|
|
||||||
*
|
|
||||||
* ---------------------------------------------------------------------------------------
|
|
||||||
* The following license statement only applies to this file (vector_3.c).
|
|
||||||
* ---------------------------------------------------------------------------------------
|
|
||||||
*
|
|
||||||
* 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, sublicense, 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 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 NONINFRINGEMENT.
|
|
||||||
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <math.h>
|
|
||||||
|
|
||||||
#include <gfx/math/vector_3.h>
|
|
||||||
|
|
||||||
float vec3_dot(const float *a, const float *b)
|
|
||||||
{
|
|
||||||
return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
|
|
||||||
}
|
|
||||||
|
|
||||||
void vec3_cross(float* dst, const float *a, const float *b)
|
|
||||||
{
|
|
||||||
dst[0] = a[1]*b[2] - a[2]*b[1];
|
|
||||||
dst[1] = a[2]*b[0] - a[0]*b[2];
|
|
||||||
dst[2] = a[0]*b[1] - a[1]*b[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
float vec3_length(const float *a)
|
|
||||||
{
|
|
||||||
float length_sq = vec3_dot(a,a);
|
|
||||||
return sqrtf(length_sq);
|
|
||||||
}
|
|
||||||
|
|
||||||
void vec3_add(float *dst, const float *src)
|
|
||||||
{
|
|
||||||
dst[0] += src[0];
|
|
||||||
dst[1] += src[1];
|
|
||||||
dst[2] += src[2];
|
|
||||||
}
|
|
||||||
|
|
||||||
void vec3_subtract(float *dst, const float *src)
|
|
||||||
{
|
|
||||||
dst[0] -= src[0];
|
|
||||||
dst[1] -= src[1];
|
|
||||||
dst[2] -= src[2];
|
|
||||||
}
|
|
||||||
|
|
||||||
void vec3_scale(float *dst, const float scale)
|
|
||||||
{
|
|
||||||
dst[0] *= scale;
|
|
||||||
dst[1] *= scale;
|
|
||||||
dst[2] *= scale;
|
|
||||||
}
|
|
||||||
|
|
||||||
void vec3_copy(float *dst, const float *src)
|
|
||||||
{
|
|
||||||
dst[0] = src[0];
|
|
||||||
dst[1] = src[1];
|
|
||||||
dst[2] = src[2];
|
|
||||||
}
|
|
||||||
|
|
||||||
void vec3_normalize(float *dst)
|
|
||||||
{
|
|
||||||
float length = vec3_length(dst);
|
|
||||||
vec3_scale(dst,1.0f/length);
|
|
||||||
}
|
|
@ -1,58 +0,0 @@
|
|||||||
/* Copyright (C) 2010-2017 The RetroArch team
|
|
||||||
*
|
|
||||||
* ---------------------------------------------------------------------------------------
|
|
||||||
* The following license statement only applies to this file (vector_4.c).
|
|
||||||
* ---------------------------------------------------------------------------------------
|
|
||||||
*
|
|
||||||
* 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, sublicense, 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 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 NONINFRINGEMENT.
|
|
||||||
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <math.h>
|
|
||||||
|
|
||||||
#include <gfx/math/vector_4.h>
|
|
||||||
|
|
||||||
void vec4_add(float *dst, const float *src)
|
|
||||||
{
|
|
||||||
dst[0] += src[0];
|
|
||||||
dst[1] += src[1];
|
|
||||||
dst[2] += src[2];
|
|
||||||
dst[3] += src[3];
|
|
||||||
}
|
|
||||||
|
|
||||||
void vec4_subtract(float *dst, const float *src)
|
|
||||||
{
|
|
||||||
dst[0] -= src[0];
|
|
||||||
dst[1] -= src[1];
|
|
||||||
dst[2] -= src[2];
|
|
||||||
dst[3] -= src[3];
|
|
||||||
}
|
|
||||||
|
|
||||||
void vec4_scale(float *dst, const float scale)
|
|
||||||
{
|
|
||||||
dst[0] *= scale;
|
|
||||||
dst[1] *= scale;
|
|
||||||
dst[2] *= scale;
|
|
||||||
dst[3] *= scale;
|
|
||||||
}
|
|
||||||
|
|
||||||
void vec4_copy(float *dst, const float *src)
|
|
||||||
{
|
|
||||||
dst[0] = src[0];
|
|
||||||
dst[1] = src[1];
|
|
||||||
dst[2] = src[2];
|
|
||||||
dst[3] = src[3];
|
|
||||||
}
|
|
@ -24,8 +24,11 @@
|
|||||||
#define __LIBRETRO_SDK_GFX_MATH_MATRIX_3X3_H__
|
#define __LIBRETRO_SDK_GFX_MATH_MATRIX_3X3_H__
|
||||||
|
|
||||||
#include <boolean.h>
|
#include <boolean.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
#include <retro_common_api.h>
|
#include <retro_common_api.h>
|
||||||
|
#include <retro_inline.h>
|
||||||
|
|
||||||
RETRO_BEGIN_DECLS
|
RETRO_BEGIN_DECLS
|
||||||
|
|
||||||
@ -131,27 +134,120 @@ typedef struct math_matrix_3x3
|
|||||||
MAT_ELEM_3X3(mat, 2, 1) = -(MAT_ELEM_3X3(mat, 0, 0) * MAT_ELEM_3X3(mat, 2, 1) - MAT_ELEM_3X3(mat, 0, 1) * MAT_ELEM_3X3(mat, 2, 0)); \
|
MAT_ELEM_3X3(mat, 2, 1) = -(MAT_ELEM_3X3(mat, 0, 0) * MAT_ELEM_3X3(mat, 2, 1) - MAT_ELEM_3X3(mat, 0, 1) * MAT_ELEM_3X3(mat, 2, 0)); \
|
||||||
MAT_ELEM_3X3(mat, 2, 2) = (MAT_ELEM_3X3(mat, 0, 0) * MAT_ELEM_3X3(mat, 1, 1) - MAT_ELEM_3X3(mat, 0, 1) * MAT_ELEM_3X3(mat, 1, 0))
|
MAT_ELEM_3X3(mat, 2, 2) = (MAT_ELEM_3X3(mat, 0, 0) * MAT_ELEM_3X3(mat, 1, 1) - MAT_ELEM_3X3(mat, 0, 1) * MAT_ELEM_3X3(mat, 1, 0))
|
||||||
|
|
||||||
bool matrix_3x3_invert(math_matrix_3x3 *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))
|
||||||
|
|
||||||
bool matrix_3x3_square_to_quad(const float dx0, const float dy0,
|
static INLINE bool matrix_3x3_invert(math_matrix_3x3 *mat)
|
||||||
const float dx1, const float dy1,
|
{
|
||||||
const float dx3, const float dy3,
|
float det = matrix_3x3_determinant(*mat);
|
||||||
const float dx2, const float dy2,
|
|
||||||
math_matrix_3x3 *mat);
|
if (FLOAT_IS_ZERO(det))
|
||||||
bool matrix_3x3_quad_to_square(const float sx0, const float sy0,
|
return false;
|
||||||
const float sx1, const float sy1,
|
|
||||||
const float sx2, const float sy2,
|
matrix_3x3_adjoint(*mat);
|
||||||
const float sx3, const float sy3,
|
matrix_3x3_divide_scalar(*mat, det);
|
||||||
math_matrix_3x3 *mat);
|
|
||||||
bool matrix_3x3_quad_to_quad(const float dx0, const float dy0,
|
return true;
|
||||||
const float dx1, const float dy1,
|
}
|
||||||
const float dx2, const float dy2,
|
|
||||||
const float dx3, const float dy3,
|
static INLINE bool matrix_3x3_square_to_quad(
|
||||||
const float sx0, const float sy0,
|
const float dx0, const float dy0,
|
||||||
const float sx1, const float sy1,
|
const float dx1, const float dy1,
|
||||||
const float sx2, const float sy2,
|
const float dx3, const float dy3,
|
||||||
const float sx3, const float sy3,
|
const float dx2, const float dy2,
|
||||||
math_matrix_3x3 *mat);
|
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))
|
||||||
|
{
|
||||||
|
/* affine case */
|
||||||
|
a = dx1 - dx0;
|
||||||
|
b = dx2 - dx1;
|
||||||
|
d = dy1 - dy0;
|
||||||
|
e = dy2 - dy1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
float ax1 = dx1 - dx2;
|
||||||
|
float ax2 = dx3 - dx2;
|
||||||
|
float ay1 = dy1 - dy2;
|
||||||
|
float ay2 = dy3 - dy2;
|
||||||
|
|
||||||
|
/* determinants */
|
||||||
|
float gtop = ax * ay2 - ax2 * ay;
|
||||||
|
float htop = ax1 * ay - ax * ay1;
|
||||||
|
float bottom = ax1 * ay2 - ax2 * ay1;
|
||||||
|
|
||||||
|
if (!bottom)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
g = gtop / bottom;
|
||||||
|
h = htop / bottom;
|
||||||
|
|
||||||
|
a = dx1 - dx0 + g * dx1;
|
||||||
|
b = dx3 - dx0 + h * dx3;
|
||||||
|
d = dy1 - dy0 + g * dy1;
|
||||||
|
e = dy3 - dy0 + h * dy3;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
matrix_3x3_init(*mat,
|
||||||
|
a, d, g,
|
||||||
|
b, e, h,
|
||||||
|
c, f, 1.f);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static INLINE 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)
|
||||||
|
{
|
||||||
|
return matrix_3x3_square_to_quad(sx0, sy0, sx1, sy1,
|
||||||
|
sx2, sy2, sx3, sy3,
|
||||||
|
mat) ? matrix_3x3_invert(mat) : false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static INLINE 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 square_to_quad;
|
||||||
|
|
||||||
|
if (matrix_3x3_square_to_quad(dx0, dy0, dx1, dy1,
|
||||||
|
dx2, dy2, dx3, dy3,
|
||||||
|
&square_to_quad))
|
||||||
|
{
|
||||||
|
math_matrix_3x3 quad_to_square;
|
||||||
|
if (matrix_3x3_quad_to_square(sx0, sy0, sx1, sy1,
|
||||||
|
sx2, sy2, sx3, sy3,
|
||||||
|
&quad_to_square))
|
||||||
|
{
|
||||||
|
matrix_3x3_multiply(*mat, quad_to_square, square_to_quad);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
RETRO_END_DECLS
|
RETRO_END_DECLS
|
||||||
|
|
||||||
|
@ -24,6 +24,7 @@
|
|||||||
#define __LIBRETRO_SDK_GFX_MATH_VECTOR_2_H__
|
#define __LIBRETRO_SDK_GFX_MATH_VECTOR_2_H__
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
#include <retro_common_api.h>
|
#include <retro_common_api.h>
|
||||||
|
|
||||||
@ -31,15 +32,21 @@ RETRO_BEGIN_DECLS
|
|||||||
|
|
||||||
typedef float vec2_t[2];
|
typedef float vec2_t[2];
|
||||||
|
|
||||||
float vec2_dot(const float *a, const float *b);
|
#define vec2_dot(a, b) ((a[0] * b[0]) + (a[1] * b[1]))
|
||||||
|
|
||||||
float vec2_cross(const float *a, const float *b) ;
|
#define vec2_cross(a, b) ((a[0]*b[1]) - (a[1]*b[0]))
|
||||||
|
|
||||||
void vec2_add(float *dst, const float *src);
|
#define vec2_add(dst, src) \
|
||||||
|
dst[0] += src[0]; \
|
||||||
|
dst[1] += src[1]
|
||||||
|
|
||||||
void vec2_subtract(float *dst, const float *src);
|
#define vec2_subtract(dst, src) \
|
||||||
|
dst[0] -= src[0]; \
|
||||||
|
dst[1] -= src[1]
|
||||||
|
|
||||||
void vec2_copy(float *dst, const float *src);
|
#define vec2_copy(dst, src) \
|
||||||
|
dst[0] = src[0]; \
|
||||||
|
dst[1] = src[1]
|
||||||
|
|
||||||
RETRO_END_DECLS
|
RETRO_END_DECLS
|
||||||
|
|
||||||
|
@ -24,6 +24,7 @@
|
|||||||
#define __LIBRETRO_SDK_GFX_MATH_VECTOR_3_H__
|
#define __LIBRETRO_SDK_GFX_MATH_VECTOR_3_H__
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
#include <retro_common_api.h>
|
#include <retro_common_api.h>
|
||||||
|
|
||||||
@ -31,21 +32,36 @@ RETRO_BEGIN_DECLS
|
|||||||
|
|
||||||
typedef float vec3_t[3];
|
typedef float vec3_t[3];
|
||||||
|
|
||||||
float vec3_dot(const float *a, const float *b);
|
#define vec3_dot(a, b) (a[0] * b[0] + a[1] * b[1] + a[2] * b[2])
|
||||||
|
|
||||||
void vec3_cross(float* dst, const float *a, const float *b);
|
#define vec3_cross(dst, a, b) \
|
||||||
|
dst[0] = a[1]*b[2] - a[2]*b[1]; \
|
||||||
|
dst[1] = a[2]*b[0] - a[0]*b[2]; \
|
||||||
|
dst[2] = a[0]*b[1] - a[1]*b[0]
|
||||||
|
|
||||||
float vec3_length(const float *a);
|
#define vec3_length(a) sqrtf(vec3_dot(a,a))
|
||||||
|
|
||||||
void vec3_add(float *dst, const float *src);
|
#define vec3_add(dst, src) \
|
||||||
|
dst[0] += src[0]; \
|
||||||
|
dst[1] += src[1]; \
|
||||||
|
dst[2] += src[2]
|
||||||
|
|
||||||
void vec3_subtract(float *dst, const float *src);
|
#define vec3_subtract(dst, src) \
|
||||||
|
dst[0] -= src[0]; \
|
||||||
|
dst[1] -= src[1]; \
|
||||||
|
dst[2] -= src[2]
|
||||||
|
|
||||||
void vec3_scale(float *dst, const float scale);
|
#define vec3_scale(dst, scale) \
|
||||||
|
dst[0] *= scale; \
|
||||||
|
dst[1] *= scale; \
|
||||||
|
dst[2] *= scale
|
||||||
|
|
||||||
void vec3_copy(float *dst, const float *src);
|
#define vec3_copy(dst, src) \
|
||||||
|
dst[0] = src[0]; \
|
||||||
|
dst[1] = src[1]; \
|
||||||
|
dst[2] = src[2]
|
||||||
|
|
||||||
void vec3_normalize(float *dst);
|
#define vec3_normalize(dst) vec3_scale(dst,1.0f / vec3_length(dst))
|
||||||
|
|
||||||
RETRO_END_DECLS
|
RETRO_END_DECLS
|
||||||
|
|
||||||
|
@ -24,6 +24,7 @@
|
|||||||
#define __LIBRETRO_SDK_GFX_MATH_VECTOR_4_H__
|
#define __LIBRETRO_SDK_GFX_MATH_VECTOR_4_H__
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
#include <retro_common_api.h>
|
#include <retro_common_api.h>
|
||||||
|
|
||||||
@ -31,13 +32,29 @@ RETRO_BEGIN_DECLS
|
|||||||
|
|
||||||
typedef float vec4_t[4];
|
typedef float vec4_t[4];
|
||||||
|
|
||||||
void vec4_add(float *dst, const float *src);
|
#define vec4_add(dst, src) \
|
||||||
|
dst[0] += src[0]; \
|
||||||
|
dst[1] += src[1]; \
|
||||||
|
dst[2] += src[2]; \
|
||||||
|
dst[3] += src[3]
|
||||||
|
|
||||||
void vec4_subtract(float *dst, const float *src);
|
#define vec4_subtract(dst, src) \
|
||||||
|
dst[0] -= src[0]; \
|
||||||
|
dst[1] -= src[1]; \
|
||||||
|
dst[2] -= src[2]; \
|
||||||
|
dst[3] -= src[3]
|
||||||
|
|
||||||
void vec4_scale(float *dst, const float scale);
|
#define vec4_scale(dst, scale) \
|
||||||
|
dst[0] *= scale; \
|
||||||
|
dst[1] *= scale; \
|
||||||
|
dst[2] *= scale; \
|
||||||
|
dst[3] *= scale
|
||||||
|
|
||||||
void vec4_copy(float *dst, const float *src);
|
#define vec4_copy(dst, src) \
|
||||||
|
dst[0] = src[0]; \
|
||||||
|
dst[1] = src[1]; \
|
||||||
|
dst[2] = src[2]; \
|
||||||
|
dst[3] = src[3]
|
||||||
|
|
||||||
RETRO_END_DECLS
|
RETRO_END_DECLS
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user