Compare commits

...

22 Commits

Author SHA1 Message Date
Recep Aslantas
568634a79e tests: dont test isinf == true on fast math 2024-04-01 16:48:58 +03:00
Recep Aslantas
c9c7941a72 tests: dont test isnan on fast math 2024-04-01 14:10:38 +03:00
Recep Aslantas
4e929a81c2 Update x86.h 2024-04-01 13:26:08 +03:00
Recep Aslantas
1d09c41e18 make xor enable in SSEonly + fast math 2024-04-01 13:23:52 +03:00
Recep Aslantas
d8e933b5b1 Update test_project.h 2024-04-01 13:23:22 +03:00
Recep Aslantas
8b15fd51ba common way to identify CGLM_FAST_MATH 2024-04-01 13:23:17 +03:00
Recep Aslantas
9ce0a3b625 tests: disable isnan check for min/max which may not work correctly especially in fast-math environment 2024-04-01 13:22:51 +03:00
Recep Aslantas
00d2e8a4cf suppress warnings 2024-04-01 01:46:25 +03:00
Recep Aslantas
35a12ed033 make SSE2-only features not available in SSE 2024-04-01 00:52:59 +03:00
Recep Aslantas
32a477ef07 separate SSE and SSE2 2024-03-31 23:35:15 +03:00
Recep Aslantas
e3ed9834a1 Update mat2x3.h 2024-03-31 23:06:50 +03:00
Recep Aslantas
8396bbf0b3 coding style 2024-03-31 23:06:30 +03:00
Recep Aslantas
929963c6eb Merge pull request #407 from EasyIP2023/bugfix/mat3x2-multiplication
mat3x2: fix multiplication functions
2024-03-31 13:40:58 +03:00
Recep Aslantas
25b33fab6b Merge pull request #405 from EasyIP2023/bugfix/mat2x4-mutli
mat2x4: fix multiplication functions
2024-03-31 13:40:45 +03:00
Recep Aslantas
c9adbaabd7 Merge pull request #403 from EasyIP2023/bugfix/mat2x3-multiplication
mat2x3: fix multiplication functions
2024-03-31 13:36:39 +03:00
Recep Aslantas
b22e8230d0 Merge pull request #406 from recp/I_macro
dont use I macro defined in standard
2024-03-31 13:30:42 +03:00
Vincent Davis Jr
54dfbc5a28 docs: mat2x4 account for latest mulitplication changes
This also includes tables to explain how
mat2x4, column vectors, and row vectors are
represented. Also includes how resulting
matrix or vector is formed.

Signed-off-by: Vincent Davis Jr <vince@underview.tech>
2024-03-31 00:44:58 -04:00
Vincent Davis Jr
088c66029d docs: mat3x2 account for latest mulitplication changes
This also includes tables to explain how
mat3x2, column vectors, and row vectors are
represented. Also includes how resulting
matrix or vector is formed.

Signed-off-by: Vincent Davis Jr <vince@underview.tech>
2024-03-31 00:39:27 -04:00
Vincent Davis Jr
2283c708c6 mat3x2: fix multiplication functions
Signed-off-by: Vincent Davis Jr <vince@underview.tech>
2024-03-31 00:23:39 -04:00
Vincent Davis Jr
46864ba2f7 mat2x4: fix multiplication functions
Signed-off-by: Vincent Davis Jr <vince@underview.tech>
2024-03-30 22:22:34 -04:00
Vincent Davis Jr
c5dcb93c92 docs: mat2x3 account for latest mulitplication changes
This also includes tables to explain how
mat2x3, column vectors and row vectors are
represented. Also includes how resulting
matrix or vector is formed.

Signed-off-by: Vincent Davis Jr <vince@underview.tech>
2024-03-30 22:08:23 -04:00
Vincent Davis Jr
050bc95264 mat2x3: fix multiplication functions
Signed-off-by: Vincent Davis Jr <vince@underview.tech>
2024-03-30 22:08:19 -04:00
26 changed files with 414 additions and 171 deletions

View File

@@ -23,6 +23,16 @@ Functions:
#. :c:func:`glm_mat2x3_transpose` #. :c:func:`glm_mat2x3_transpose`
#. :c:func:`glm_mat2x3_scale` #. :c:func:`glm_mat2x3_scale`
Represented
~~~~~~~~~~~
.. csv-table:: mat2x3
:header: "", "column 1", "column 2"
"row 1", "m00", "m10"
"row 2", "m01", "m11"
"row 3", "m02", "m12"
Functions documentation Functions documentation
~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~
@@ -51,28 +61,68 @@ Functions documentation
| *[in]* **src** pointer to an array of floats | *[in]* **src** pointer to an array of floats
| *[out]* **dest** destination matrix2x3 | *[out]* **dest** destination matrix2x3
.. c:function:: void glm_mat2x3_mul(mat2x3 m1, mat3x2 m2, mat2 dest) .. c:function:: void glm_mat2x3_mul(mat2x3 m1, mat3x2 m2, mat3 dest)
multiply m1 and m2 to dest multiply m1 and m2 to dest
.. code-block:: c .. code-block:: c
glm_mat2x3_mul(mat2x3, mat3x2, mat2); glm_mat2x3_mul(mat2x3, mat3x2, mat3);
Parameters: Parameters:
| *[in]* **m1** left matrix (mat2x3) | *[in]* **m1** left matrix (mat2x3)
| *[in]* **m2** right matrix (mat3x2) | *[in]* **m2** right matrix (mat3x2)
| *[out]* **dest** destination matrix (mat2) | *[out]* **dest** destination matrix (mat3)
.. c:function:: void glm_mat2x3_mulv(mat2x3 m, vec3 v, vec2 dest) .. csv-table:: mat2x3
:header: "", "column 1", "column 2"
multiply mat2x3 with vec3 (column vector) and store in dest vector "row 1", "a00", "a10"
"row 2", "a01", "a11"
"row 3", "a02", "a12"
.. csv-table:: mat3x2
:header: "", "column 1", "column 2", "column 3"
"row 1", "b00", "b10", "b20"
"row 2", "b01", "b11", "b21"
.. csv-table:: mat3x3
:header: "", "column 1", "column 2", "column 3"
"row 1", "a00 * b00 + a10 * b01", "a00 * b10 + a10 * b11", "a00 * b20 + a10 * b21"
"row 2", "a01 * b00 + a11 * b01", "a01 * b10 + a11 * b11", "a01 * b20 + a11 * b21"
"row 3", "a02 * b00 + a12 * b01", "a02 * b10 + a12 * b11", "a02 * b20 + a12 * b21"
.. c:function:: void glm_mat2x3_mulv(mat2x3 m, vec2 v, vec3 dest)
multiply mat2x3 with vec2 (column vector) and store in dest column vector
Parameters: Parameters:
| *[in]* **m** mat2x3 (left) | *[in]* **m** mat2x3 (left)
| *[in]* **v** vec3 (right, column vector) | *[in]* **v** vec3 (right, column vector)
| *[out]* **dest** destination (result, column vector) | *[out]* **dest** destination (result, column vector)
.. csv-table:: mat2x3
:header: "", "column 1", "column 2"
"row 1", "m00", "m10"
"row 2", "m01", "m11"
"row 3", "m02", "m12"
.. csv-table:: column vec2 (1x2)
:header: "", "column 1"
"row 1", "v0"
"row 2", "v1"
.. csv-table:: column vec3 (1x3)
:header: "", "column 1"
"row 1", "m00 * v0 + m10 * v1"
"row 2", "m01 * v0 + m11 * v1"
"row 3", "m02 * v0 + m12 * v1"
.. c:function:: void glm_mat2x3_transpose(mat2x3 m, mat3x2 dest) .. c:function:: void glm_mat2x3_transpose(mat2x3 m, mat3x2 dest)
transpose matrix and store in dest transpose matrix and store in dest

View File

@@ -23,6 +23,17 @@ Functions:
#. :c:func:`glm_mat2x4_transpose` #. :c:func:`glm_mat2x4_transpose`
#. :c:func:`glm_mat2x4_scale` #. :c:func:`glm_mat2x4_scale`
Represented
~~~~~~~~~~~
.. csv-table:: mat2x4
:header: "", "column 1", "column 2"
"row 1", "m00", "m10"
"row 2", "m01", "m11"
"row 3", "m02", "m12"
"row 4", "m03", "m13"
Functions documentation Functions documentation
~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~
@@ -51,28 +62,72 @@ Functions documentation
| *[in]* **src** pointer to an array of floats | *[in]* **src** pointer to an array of floats
| *[out]* **dest** destination matrix2x4 | *[out]* **dest** destination matrix2x4
.. c:function:: void glm_mat2x4_mul(mat2x4 m1, mat4x2 m2, mat2 dest) .. c:function:: void glm_mat2x4_mul(mat2x4 m1, mat4x2 m2, mat4 dest)
multiply m1 and m2 to dest multiply m1 and m2 to dest
.. code-block:: c .. code-block:: c
glm_mat2x4_mul(mat2x4, mat4x2, mat2); glm_mat2x4_mul(mat2x4, mat4x2, mat4);
Parameters: Parameters:
| *[in]* **m1** left matrix (mat2x4) | *[in]* **m1** left matrix (mat2x4)
| *[in]* **m2** right matrix (mat4x2) | *[in]* **m2** right matrix (mat4x2)
| *[out]* **dest** destination matrix (mat2) | *[out]* **dest** destination matrix (mat4)
.. c:function:: void glm_mat2x4_mulv(mat2x4 m, vec4 v, vec2 dest) .. csv-table:: mat2x4
:header: "", "column 1", "column 2"
multiply mat2x4 with vec4 (column vector) and store in dest vector "row 1", "a00", "a10"
"row 2", "a01", "a11"
"row 3", "a02", "a12"
"row 4", "a03", "a13"
.. csv-table:: mat4x2
:header: "", "column 1", "column 2", "column 3", "column 4"
"row 1", "b00", "b10", "b20", "b30"
"row 2", "b01", "b11", "b21", "b31"
.. csv-table:: mat4x4
:header: "", "column 1", "column 2", "column 3", "column 4"
"row 1", "a00 * b00 + a10 * b01", "a00 * b10 + a10 * b11", "a00 * b20 + a10 * b21", "a00 * b30 + a10 * b31"
"row 2", "a01 * b00 + a11 * b01", "a01 * b10 + a11 * b11", "a01 * b20 + a11 * b21", "a01 * b30 + a11 * b31"
"row 3", "a02 * b00 + a12 * b01", "a02 * b10 + a12 * b11", "a02 * b20 + a12 * b21", "a02 * b30 + a12 * b31"
"row 4", "a03 * b00 + a13 * b01", "a03 * b10 + a13 * b11", "a03 * b20 + a13 * b21", "a03 * b30 + a13 * b31"
.. c:function:: void glm_mat2x4_mulv(mat2x4 m, vec2 v, vec4 dest)
multiply mat2x4 with vec2 (column vector) and store in dest column vector
Parameters: Parameters:
| *[in]* **m** mat2x4 (left) | *[in]* **m** mat2x4 (left)
| *[in]* **v** vec4 (right, column vector) | *[in]* **v** vec2 (right, column vector)
| *[out]* **dest** destination (result, column vector) | *[out]* **dest** destination (result, column vector)
.. csv-table:: mat2x4
:header: "", "column 1", "column 2"
"row 1", "m00", "m10"
"row 2", "m01", "m11"
"row 3", "m02", "m12"
"row 4", "m03", "m13"
.. csv-table:: column vec2 (1x2)
:header: "", "column 1"
"row 1", "v0"
"row 2", "v1"
.. csv-table:: column vec4 (1x4)
:header: "", "column 1"
"row 1", "m00 * v0 + m10 * v1"
"row 2", "m01 * v0 + m11 * v1"
"row 3", "m02 * v0 + m12 * v1"
"row 4", "m03 * v0 + m13 * v1"
.. c:function:: void glm_mat2x4_transpose(mat2x4 m, mat4x2 dest) .. c:function:: void glm_mat2x4_transpose(mat2x4 m, mat4x2 dest)
transpose matrix and store in dest transpose matrix and store in dest

View File

@@ -23,6 +23,15 @@ Functions:
#. :c:func:`glm_mat3x2_transpose` #. :c:func:`glm_mat3x2_transpose`
#. :c:func:`glm_mat3x2_scale` #. :c:func:`glm_mat3x2_scale`
Represented
~~~~~~~~~~~
.. csv-table:: mat3x2
:header: "", "column 1", "column 2", "column 3"
"row 1", "m00", "m10", "m20"
"row 2", "m01", "m11", "m21"
Functions documentation Functions documentation
~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~
@@ -51,28 +60,66 @@ Functions documentation
| *[in]* **src** pointer to an array of floats | *[in]* **src** pointer to an array of floats
| *[out]* **dest** destination matrix3x2 | *[out]* **dest** destination matrix3x2
.. c:function:: void glm_mat3x2_mul(mat3x2 m1, mat2x3 m2, mat3 dest) .. c:function:: void glm_mat3x2_mul(mat3x2 m1, mat2x3 m2, mat2 dest)
multiply m1 and m2 to dest multiply m1 and m2 to dest
.. code-block:: c .. code-block:: c
glm_mat3x2_mul(mat3x2, mat2x3, mat3); glm_mat3x2_mul(mat3x2, mat2x3, mat2);
Parameters: Parameters:
| *[in]* **m1** left matrix (mat3x2) | *[in]* **m1** left matrix (mat3x2)
| *[in]* **m2** right matrix (mat2x3) | *[in]* **m2** right matrix (mat2x3)
| *[out]* **dest** destination matrix (mat3) | *[out]* **dest** destination matrix (mat2)
.. c:function:: void glm_mat3x2_mulv(mat3x2 m, vec2 v, vec3 dest) .. csv-table:: mat3x2
:header: "", "column 1", "column 2", "column 3"
multiply mat3x2 with vec2 (column vector) and store in dest vector "row 1", "a00", "a10", "a20"
"row 2", "a01", "a11", "a21"
.. csv-table:: mat2x3
:header: "", "column 1", "column 2"
"row 1", "b00", "b10"
"row 2", "b01", "b11"
"row 3", "b02", "b12"
.. csv-table:: mat2x2
:header: "", "column 1", "column 2"
"row 1", "a00 * b00 + a10 * b01 + a20 * b02", "a00 * b10 + a10 * b11 + a20 * b12"
"row 2", "a01 * b00 + a11 * b01 + a21 * b02", "a01 * b10 + a11 * b11 + a21 * b12"
.. c:function:: void glm_mat3x2_mulv(mat3x2 m, vec3 v, vec2 dest)
multiply mat3x2 with vec3 (column vector) and store in dest vector
Parameters: Parameters:
| *[in]* **m** mat3x2 (left) | *[in]* **m** mat3x2 (left)
| *[in]* **v** vec3 (right, column vector) | *[in]* **v** vec3 (right, column vector)
| *[out]* **dest** destination (result, column vector) | *[out]* **dest** destination (result, column vector)
.. csv-table:: mat3x2
:header: "", "column 1", "column 2", "column 3"
"row 1", "m00", "m10", "m20"
"row 2", "m01", "m11", "m21"
.. csv-table:: column vec3 (1x3)
:header: "", "column 1"
"row 1", "v0"
"row 2", "v1"
"row 3", "v2"
.. csv-table:: column vec2 (1x2)
:header: "", "column 1"
"row 1", "m00 * v0 + m10 * v1 + m20 * v2"
"row 2", "m01 * v0 + m11 * v1 + m21 * v2"
.. c:function:: void glm_mat3x2_transpose(mat3x2 m, mat2x3 dest) .. c:function:: void glm_mat3x2_transpose(mat3x2 m, mat2x3 dest)
transpose matrix and store in dest transpose matrix and store in dest

View File

@@ -27,11 +27,11 @@ glmc_mat2x3_make(const float * __restrict src, mat2x3 dest);
CGLM_EXPORT CGLM_EXPORT
void void
glmc_mat2x3_mul(mat2x3 m1, mat3x2 m2, mat2 dest); glmc_mat2x3_mul(mat2x3 m1, mat3x2 m2, mat3 dest);
CGLM_EXPORT CGLM_EXPORT
void void
glmc_mat2x3_mulv(mat2x3 m, vec3 v, vec2 dest); glmc_mat2x3_mulv(mat2x3 m, vec2 v, vec3 dest);
CGLM_EXPORT CGLM_EXPORT
void void

View File

@@ -27,11 +27,11 @@ glmc_mat2x4_make(const float * __restrict src, mat2x4 dest);
CGLM_EXPORT CGLM_EXPORT
void void
glmc_mat2x4_mul(mat2x4 m1, mat4x2 m2, mat2 dest); glmc_mat2x4_mul(mat2x4 m1, mat4x2 m2, mat4 dest);
CGLM_EXPORT CGLM_EXPORT
void void
glmc_mat2x4_mulv(mat2x4 m, vec4 v, vec2 dest); glmc_mat2x4_mulv(mat2x4 m, vec2 v, vec4 dest);
CGLM_EXPORT CGLM_EXPORT
void void

View File

@@ -27,11 +27,11 @@ glmc_mat3x2_make(const float * __restrict src, mat3x2 dest);
CGLM_EXPORT CGLM_EXPORT
void void
glmc_mat3x2_mul(mat3x2 m1, mat2x3 m2, mat3 dest); glmc_mat3x2_mul(mat3x2 m1, mat2x3 m2, mat2 dest);
CGLM_EXPORT CGLM_EXPORT
void void
glmc_mat3x2_mulv(mat3x2 m, vec2 v, vec3 dest); glmc_mat3x2_mulv(mat3x2 m, vec3 v, vec2 dest);
CGLM_EXPORT CGLM_EXPORT
void void

View File

@@ -45,6 +45,10 @@
# define CGLM_LIKELY(expr) (expr) # define CGLM_LIKELY(expr) (expr)
#endif #endif
#if defined(_M_FP_FAST) || defined(__FAST_MATH__)
# define CGLM_FAST_MATH
#endif
#define GLM_SHUFFLE4(z, y, x, w) (((z) << 6) | ((y) << 4) | ((x) << 2) | (w)) #define GLM_SHUFFLE4(z, y, x, w) (((z) << 6) | ((y) << 4) | ((x) << 2) | (w))
#define GLM_SHUFFLE3(z, y, x) (((z) << 4) | ((y) << 2) | (x)) #define GLM_SHUFFLE3(z, y, x) (((z) << 4) | ((y) << 2) | (x))

View File

@@ -14,8 +14,8 @@
CGLM_INLINE void glm_mat2x3_copy(mat2x3 mat, mat2x3 dest); CGLM_INLINE void glm_mat2x3_copy(mat2x3 mat, mat2x3 dest);
CGLM_INLINE void glm_mat2x3_zero(mat2x3 mat); CGLM_INLINE void glm_mat2x3_zero(mat2x3 mat);
CGLM_INLINE void glm_mat2x3_make(const float * __restrict src, mat2x3 dest); CGLM_INLINE void glm_mat2x3_make(const float * __restrict src, mat2x3 dest);
CGLM_INLINE void glm_mat2x3_mul(mat2x3 m1, mat3x2 m2, mat2 dest); CGLM_INLINE void glm_mat2x3_mul(mat2x3 m1, mat3x2 m2, mat3 dest);
CGLM_INLINE void glm_mat2x3_mulv(mat2x3 m, vec3 v, vec2 dest); CGLM_INLINE void glm_mat2x3_mulv(mat2x3 m, vec2 v, vec3 dest);
CGLM_INLINE void glm_mat2x3_transpose(mat2x3 m, mat3x2 dest); CGLM_INLINE void glm_mat2x3_transpose(mat2x3 m, mat3x2 dest);
CGLM_INLINE void glm_mat2x3_scale(mat2x3 m, float s); CGLM_INLINE void glm_mat2x3_scale(mat2x3 m, float s);
*/ */
@@ -82,7 +82,7 @@ glm_mat2x3_make(const float * __restrict src, mat2x3 dest) {
* @brief multiply m1 and m2 to dest * @brief multiply m1 and m2 to dest
* *
* @code * @code
* glm_mat2x3_mul(mat2x3, mat3x2, mat2); * glm_mat2x3_mul(mat2x3, mat3x2, mat3);
* @endcode * @endcode
* *
* @param[in] m1 left matrix (mat2x3) * @param[in] m1 left matrix (mat2x3)
@@ -91,7 +91,7 @@ glm_mat2x3_make(const float * __restrict src, mat2x3 dest) {
*/ */
CGLM_INLINE CGLM_INLINE
void void
glm_mat2x3_mul(mat2x3 m1, mat3x2 m2, mat2 dest) { glm_mat2x3_mul(mat2x3 m1, mat3x2 m2, mat3 dest) {
float a00 = m1[0][0], a01 = m1[0][1], a02 = m1[0][2], float a00 = m1[0][0], a01 = m1[0][1], a02 = m1[0][2],
a10 = m1[1][0], a11 = m1[1][1], a12 = m1[1][2], a10 = m1[1][0], a11 = m1[1][1], a12 = m1[1][2],
@@ -99,11 +99,17 @@ glm_mat2x3_mul(mat2x3 m1, mat3x2 m2, mat2 dest) {
b10 = m2[1][0], b11 = m2[1][1], b10 = m2[1][0], b11 = m2[1][1],
b20 = m2[2][0], b21 = m2[2][1]; b20 = m2[2][0], b21 = m2[2][1];
dest[0][0] = a00 * b00 + a01 * b10 + a02 * b20; dest[0][0] = a00 * b00 + a10 * b01;
dest[0][1] = a00 * b01 + a01 * b11 + a02 * b21; dest[0][1] = a01 * b00 + a11 * b01;
dest[0][2] = a02 * b00 + a12 * b01;
dest[1][0] = a10 * b00 + a11 * b10 + a12 * b20; dest[1][0] = a00 * b10 + a10 * b11;
dest[1][1] = a10 * b01 + a11 * b11 + a12 * b21; dest[1][1] = a01 * b10 + a11 * b11;
dest[1][2] = a02 * b10 + a12 * b11;
dest[2][0] = a00 * b20 + a10 * b21;
dest[2][1] = a01 * b20 + a11 * b21;
dest[2][2] = a02 * b20 + a12 * b21;
} }
/*! /*!
@@ -115,11 +121,12 @@ glm_mat2x3_mul(mat2x3 m1, mat3x2 m2, mat2 dest) {
*/ */
CGLM_INLINE CGLM_INLINE
void void
glm_mat2x3_mulv(mat2x3 m, vec3 v, vec2 dest) { glm_mat2x3_mulv(mat2x3 m, vec2 v, vec3 dest) {
float v0 = v[0], v1 = v[1], v2 = v[2]; float v0 = v[0], v1 = v[1];
dest[0] = m[0][0] * v0 + m[0][1] * v1 + m[0][2] * v2; dest[0] = m[0][0] * v0 + m[1][0] * v1;
dest[1] = m[1][0] * v0 + m[1][1] * v1 + m[1][2] * v2; dest[1] = m[0][1] * v0 + m[1][1] * v1;
dest[2] = m[0][2] * v0 + m[1][2] * v1;
} }
/*! /*!

View File

@@ -14,8 +14,8 @@
CGLM_INLINE void glm_mat2x4_copy(mat2x4 mat, mat2x4 dest); CGLM_INLINE void glm_mat2x4_copy(mat2x4 mat, mat2x4 dest);
CGLM_INLINE void glm_mat2x4_zero(mat2x4 mat); CGLM_INLINE void glm_mat2x4_zero(mat2x4 mat);
CGLM_INLINE void glm_mat2x4_make(const float * __restrict src, mat2x4 dest); CGLM_INLINE void glm_mat2x4_make(const float * __restrict src, mat2x4 dest);
CGLM_INLINE void glm_mat2x4_mul(mat2x4 m1, mat4x2 m2, mat2 dest); CGLM_INLINE void glm_mat2x4_mul(mat2x4 m1, mat4x2 m2, mat4 dest);
CGLM_INLINE void glm_mat2x4_mulv(mat2x4 m, vec4 v, vec2 dest); CGLM_INLINE void glm_mat2x4_mulv(mat2x4 m, vec2 v, vec4 dest);
CGLM_INLINE void glm_mat2x4_transpose(mat2x4 m, mat4x2 dest); CGLM_INLINE void glm_mat2x4_transpose(mat2x4 m, mat4x2 dest);
CGLM_INLINE void glm_mat2x4_scale(mat2x4 m, float s); CGLM_INLINE void glm_mat2x4_scale(mat2x4 m, float s);
*/ */
@@ -80,16 +80,16 @@ glm_mat2x4_make(const float * __restrict src, mat2x4 dest) {
* @brief multiply m1 and m2 to dest * @brief multiply m1 and m2 to dest
* *
* @code * @code
* glm_mat2x4_mul(mat2x4, mat4x2, mat2); * glm_mat2x4_mul(mat2x4, mat4x2, mat4);
* @endcode * @endcode
* *
* @param[in] m1 left matrix (mat2x4) * @param[in] m1 left matrix (mat2x4)
* @param[in] m2 right matrix (mat4x2) * @param[in] m2 right matrix (mat4x2)
* @param[out] dest destination matrix (mat2) * @param[out] dest destination matrix (mat4)
*/ */
CGLM_INLINE CGLM_INLINE
void void
glm_mat2x4_mul(mat2x4 m1, mat4x2 m2, mat2 dest) { glm_mat2x4_mul(mat2x4 m1, mat4x2 m2, mat4 dest) {
float a00 = m1[0][0], a01 = m1[0][1], a02 = m1[0][2], a03 = m1[0][3], float a00 = m1[0][0], a01 = m1[0][1], a02 = m1[0][2], a03 = m1[0][3],
a10 = m1[1][0], a11 = m1[1][1], a12 = m1[1][2], a13 = m1[1][3], a10 = m1[1][0], a11 = m1[1][1], a12 = m1[1][2], a13 = m1[1][3],
@@ -98,15 +98,29 @@ glm_mat2x4_mul(mat2x4 m1, mat4x2 m2, mat2 dest) {
b20 = m2[2][0], b21 = m2[2][1], b20 = m2[2][0], b21 = m2[2][1],
b30 = m2[3][0], b31 = m2[3][1]; b30 = m2[3][0], b31 = m2[3][1];
dest[0][0] = a00 * b00 + a01 * b10 + a02 * b20 + a03 * b30; dest[0][0] = a00 * b00 + a10 * b01;
dest[0][1] = a00 * b01 + a01 * b11 + a02 * b21 + a03 * b31; dest[0][1] = a01 * b00 + a11 * b01;
dest[0][2] = a02 * b00 + a12 * b01;
dest[0][3] = a03 * b00 + a13 * b01;
dest[1][0] = a10 * b00 + a11 * b10 + a12 * b20 + a13 * b30; dest[1][0] = a00 * b10 + a10 * b11;
dest[1][1] = a10 * b01 + a11 * b11 + a12 * b21 + a13 * b31; dest[1][1] = a01 * b10 + a11 * b11;
dest[1][2] = a02 * b10 + a12 * b11;
dest[1][3] = a03 * b10 + a13 * b11;
dest[2][0] = a00 * b20 + a10 * b21;
dest[2][1] = a01 * b20 + a11 * b21;
dest[2][2] = a02 * b20 + a12 * b21;
dest[2][3] = a03 * b20 + a13 * b21;
dest[3][0] = a00 * b30 + a10 * b31;
dest[3][1] = a01 * b30 + a11 * b31;
dest[3][2] = a02 * b30 + a12 * b31;
dest[3][3] = a03 * b30 + a13 * b31;
} }
/*! /*!
* @brief multiply matrix with column vector and store in dest vector * @brief multiply matrix with column vector and store in dest column vector
* *
* @param[in] m matrix (left) * @param[in] m matrix (left)
* @param[in] v vector (right, column vector) * @param[in] v vector (right, column vector)
@@ -114,11 +128,13 @@ glm_mat2x4_mul(mat2x4 m1, mat4x2 m2, mat2 dest) {
*/ */
CGLM_INLINE CGLM_INLINE
void void
glm_mat2x4_mulv(mat2x4 m, vec4 v, vec2 dest) { glm_mat2x4_mulv(mat2x4 m, vec2 v, vec4 dest) {
float v0 = v[0], v1 = v[1], v2 = v[2], v3 = v[3]; float v0 = v[0], v1 = v[1];
dest[0] = m[0][0] * v0 + m[0][1] * v1 + m[0][2] * v2 + m[0][3] * v3; dest[0] = m[0][0] * v0 + m[1][0] * v1;
dest[1] = m[1][0] * v0 + m[1][1] * v1 + m[1][2] * v2 + m[1][3] * v3; dest[1] = m[0][1] * v0 + m[1][1] * v1;
dest[2] = m[0][2] * v0 + m[1][2] * v1;
dest[3] = m[0][3] * v0 + m[1][3] * v1;
} }
/*! /*!

View File

@@ -14,8 +14,8 @@
CGLM_INLINE void glm_mat3x2_copy(mat3x2 mat, mat3x2 dest); CGLM_INLINE void glm_mat3x2_copy(mat3x2 mat, mat3x2 dest);
CGLM_INLINE void glm_mat3x2_zero(mat3x2 mat); CGLM_INLINE void glm_mat3x2_zero(mat3x2 mat);
CGLM_INLINE void glm_mat3x2_make(const float * __restrict src, mat3x2 dest); CGLM_INLINE void glm_mat3x2_make(const float * __restrict src, mat3x2 dest);
CGLM_INLINE void glm_mat3x2_mul(mat3x2 m1, mat2x3 m2, mat3 dest); CGLM_INLINE void glm_mat3x2_mul(mat3x2 m1, mat2x3 m2, mat2 dest);
CGLM_INLINE void glm_mat3x2_mulv(mat3x2 m, vec2 v, vec3 dest); CGLM_INLINE void glm_mat3x2_mulv(mat3x2 m, vec3 v, vec2 dest);
CGLM_INLINE void glm_mat3x2_transpose(mat3x2 m, mat2x3 dest); CGLM_INLINE void glm_mat3x2_transpose(mat3x2 m, mat2x3 dest);
CGLM_INLINE void glm_mat3x2_scale(mat3x2 m, float s); CGLM_INLINE void glm_mat3x2_scale(mat3x2 m, float s);
*/ */
@@ -84,16 +84,16 @@ glm_mat3x2_make(const float * __restrict src, mat3x2 dest) {
* @brief multiply m1 and m2 to dest * @brief multiply m1 and m2 to dest
* *
* @code * @code
* glm_mat3x2_mul(mat3x2, mat2x3, mat3); * glm_mat3x2_mul(mat3x2, mat2x3, mat2);
* @endcode * @endcode
* *
* @param[in] m1 left matrix (mat3x2) * @param[in] m1 left matrix (mat3x2)
* @param[in] m2 right matrix (mat2x3) * @param[in] m2 right matrix (mat2x3)
* @param[out] dest destination matrix (mat3) * @param[out] dest destination matrix (mat2)
*/ */
CGLM_INLINE CGLM_INLINE
void void
glm_mat3x2_mul(mat3x2 m1, mat2x3 m2, mat3 dest) { glm_mat3x2_mul(mat3x2 m1, mat2x3 m2, mat2 dest) {
float a00 = m1[0][0], a01 = m1[0][1], float a00 = m1[0][0], a01 = m1[0][1],
a10 = m1[1][0], a11 = m1[1][1], a10 = m1[1][0], a11 = m1[1][1],
a20 = m1[2][0], a21 = m1[2][1], a20 = m1[2][0], a21 = m1[2][1],
@@ -101,21 +101,15 @@ glm_mat3x2_mul(mat3x2 m1, mat2x3 m2, mat3 dest) {
b00 = m2[0][0], b01 = m2[0][1], b02 = m2[0][2], b00 = m2[0][0], b01 = m2[0][1], b02 = m2[0][2],
b10 = m2[1][0], b11 = m2[1][1], b12 = m2[1][2]; b10 = m2[1][0], b11 = m2[1][1], b12 = m2[1][2];
dest[0][0] = a00 * b00 + a01 * b10; dest[0][0] = a00 * b00 + a10 * b01 + a20 * b02;
dest[0][1] = a00 * b01 + a01 * b11; dest[0][1] = a01 * b00 + a11 * b01 + a21 * b02;
dest[0][2] = a00 * b02 + a01 * b12;
dest[1][0] = a10 * b00 + a11 * b10; dest[1][0] = a00 * b10 + a10 * b11 + a20 * b12;
dest[1][1] = a10 * b01 + a11 * b11; dest[1][1] = a01 * b10 + a11 * b11 + a21 * b12;
dest[1][2] = a10 * b02 + a11 * b12;
dest[2][0] = a20 * b00 + a21 * b10;
dest[2][1] = a20 * b01 + a21 * b11;
dest[2][2] = a20 * b02 + a21 * b12;
} }
/*! /*!
* @brief multiply matrix with column vector and store in dest vector * @brief multiply matrix with column vector and store in dest column vector
* *
* @param[in] m matrix (left) * @param[in] m matrix (left)
* @param[in] v vector (right, column vector) * @param[in] v vector (right, column vector)
@@ -123,12 +117,11 @@ glm_mat3x2_mul(mat3x2 m1, mat2x3 m2, mat3 dest) {
*/ */
CGLM_INLINE CGLM_INLINE
void void
glm_mat3x2_mulv(mat3x2 m, vec2 v, vec3 dest) { glm_mat3x2_mulv(mat3x2 m, vec3 v, vec2 dest) {
float v0 = v[0], v1 = v[1]; float v0 = v[0], v1 = v[1], v2 = v[2];
dest[0] = m[0][0] * v0 + m[0][1] * v1; dest[0] = m[0][0] * v0 + m[1][0] * v1 + m[2][0] * v2;
dest[1] = m[1][0] * v0 + m[1][1] * v1; dest[1] = m[0][1] * v0 + m[1][1] * v1 + m[2][1] * v2;
dest[2] = m[2][0] * v0 + m[2][1] * v1;
} }
/*! /*!

View File

@@ -10,6 +10,9 @@
#if defined( _MSC_VER ) #if defined( _MSC_VER )
# if (defined(_M_AMD64) || defined(_M_X64)) || _M_IX86_FP == 2 # if (defined(_M_AMD64) || defined(_M_X64)) || _M_IX86_FP == 2
# ifndef __SSE__
# define __SSE__
# endif
# ifndef __SSE2__ # ifndef __SSE2__
# define __SSE2__ # define __SSE2__
# endif # endif
@@ -24,15 +27,22 @@
# endif # endif
#endif #endif
#if defined( __SSE__ ) || defined( __SSE2__ ) #if defined(__SSE__)
# include <xmmintrin.h> # include <xmmintrin.h>
# include <emmintrin.h>
# define CGLM_SSE_FP 1 # define CGLM_SSE_FP 1
# ifndef CGLM_SIMD_x86 # ifndef CGLM_SIMD_x86
# define CGLM_SIMD_x86 # define CGLM_SIMD_x86
# endif # endif
#endif #endif
#if defined(__SSE2__)
# include <emmintrin.h>
# define CGLM_SSE2_FP 1
# ifndef CGLM_SIMD_x86
# define CGLM_SIMD_x86
# endif
#endif
#if defined(__SSE3__) #if defined(__SSE3__)
# include <pmmintrin.h> # include <pmmintrin.h>
# ifndef CGLM_SIMD_x86 # ifndef CGLM_SIMD_x86

View File

@@ -21,7 +21,7 @@
#define glmm_set1(x) _mm_set1_ps(x) #define glmm_set1(x) _mm_set1_ps(x)
#define glmm_128 __m128 #define glmm_128 __m128
#ifdef CGLM_USE_INT_DOMAIN #if defined(CGLM_USE_INT_DOMAIN) && defined(__SSE2__)
# define glmm_shuff1(xmm, z, y, x, w) \ # define glmm_shuff1(xmm, z, y, x, w) \
_mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(xmm), \ _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(xmm), \
_MM_SHUFFLE(z, y, x, w))) _MM_SHUFFLE(z, y, x, w)))
@@ -55,17 +55,40 @@
#endif #endif
/* Note that `0x80000000` corresponds to `INT_MIN` for a 32-bit int. */ /* Note that `0x80000000` corresponds to `INT_MIN` for a 32-bit int. */
#define GLMM_NEGZEROf ((int)0x80000000) /* 0x80000000 ---> -0.0f */
#if defined(__SSE2__)
# define GLMM_NEGZEROf ((int)0x80000000) /* 0x80000000 ---> -0.0f */
# define GLMM_POSZEROf ((int)0x00000000) /* 0x00000000 ---> +0.0f */
#else
# ifdef CGLM_FAST_MATH
union { int i; float f; } static GLMM_NEGZEROf_TU = { .i = (int)0x80000000 };
# define GLMM_NEGZEROf GLMM_NEGZEROf_TU.f
# define GLMM_POSZEROf 0.0f
# else
# define GLMM_NEGZEROf -0.0f
# define GLMM_POSZEROf 0.0f
# endif
#endif
#if defined(__SSE2__)
# define GLMM__SIGNMASKf(X, Y, Z, W) \ # define GLMM__SIGNMASKf(X, Y, Z, W) \
_mm_castsi128_ps(_mm_set_epi32(X, Y, Z, W)) _mm_castsi128_ps(_mm_set_epi32(X, Y, Z, W))
/* _mm_set_ps(X, Y, Z, W); */ /* _mm_set_ps(X, Y, Z, W); */
#else
# define GLMM__SIGNMASKf(X, Y, Z, W) _mm_set_ps(X, Y, Z, W)
#endif
#define glmm_float32x4_SIGNMASK_PNPN GLMM__SIGNMASKf(0, GLMM_NEGZEROf, 0, GLMM_NEGZEROf) #define glmm_float32x4_SIGNMASK_PNPN GLMM__SIGNMASKf(GLMM_POSZEROf, GLMM_NEGZEROf, GLMM_POSZEROf, GLMM_NEGZEROf)
#define glmm_float32x4_SIGNMASK_NPNP GLMM__SIGNMASKf(GLMM_NEGZEROf, 0, GLMM_NEGZEROf, 0) #define glmm_float32x4_SIGNMASK_NPNP GLMM__SIGNMASKf(GLMM_NEGZEROf, GLMM_POSZEROf, GLMM_NEGZEROf, GLMM_POSZEROf)
#define glmm_float32x4_SIGNMASK_NPPN GLMM__SIGNMASKf(GLMM_NEGZEROf, 0, 0, GLMM_NEGZEROf) #define glmm_float32x4_SIGNMASK_NPPN GLMM__SIGNMASKf(GLMM_NEGZEROf, GLMM_POSZEROf, GLMM_POSZEROf, GLMM_NEGZEROf)
/* fasth math prevents -0.0f to work */
#if defined(__SSE2__)
# define glmm_float32x4_SIGNMASK_NEG _mm_castsi128_ps(_mm_set1_epi32(GLMM_NEGZEROf)) /* _mm_set1_ps(-0.0f) */ # define glmm_float32x4_SIGNMASK_NEG _mm_castsi128_ps(_mm_set1_epi32(GLMM_NEGZEROf)) /* _mm_set1_ps(-0.0f) */
#else
# define glmm_float32x4_SIGNMASK_NEG _mm_set1_ps(GLMM_NEGZEROf)
#endif
#define glmm_float32x8_SIGNMASK_NEG _mm256_castsi256_ps(_mm256_set1_epi32(GLMM_NEGZEROf)) #define glmm_float32x8_SIGNMASK_NEG _mm256_castsi256_ps(_mm256_set1_epi32(GLMM_NEGZEROf))
static inline static inline
@@ -207,6 +230,7 @@ glmm_norm_inf(__m128 a) {
return _mm_cvtss_f32(glmm_vhmax(glmm_abs(a))); return _mm_cvtss_f32(glmm_vhmax(glmm_abs(a)));
} }
#if defined(__SSE2__)
static inline static inline
__m128 __m128
glmm_load3(float v[3]) { glmm_load3(float v[3]) {
@@ -225,6 +249,7 @@ glmm_store3(float v[3], __m128 vx) {
_mm_storel_pi(CGLM_CASTPTR_ASSUME_ALIGNED(v, __m64), vx); _mm_storel_pi(CGLM_CASTPTR_ASSUME_ALIGNED(v, __m64), vx);
_mm_store_ss(&v[2], glmm_shuff1(vx, 2, 2, 2, 2)); _mm_store_ss(&v[2], glmm_shuff1(vx, 2, 2, 2, 2));
} }
#endif
static inline static inline
__m128 __m128

View File

@@ -14,7 +14,7 @@
CGLM_INLINE mat2x3s glms_mat2x3_zero(void); CGLM_INLINE mat2x3s glms_mat2x3_zero(void);
CGLM_INLINE mat2x3s glms_mat2x3_make(const float * __restrict src); CGLM_INLINE mat2x3s glms_mat2x3_make(const float * __restrict src);
CGLM_INLINE mat2s glms_mat2x3_mul(mat2x3s m1, mat3x2s m2); CGLM_INLINE mat2s glms_mat2x3_mul(mat2x3s m1, mat3x2s m2);
CGLM_INLINE vec2s glms_mat2x3_mulv(mat2x3s m, vec3s v); CGLM_INLINE vec3s glms_mat2x3_mulv(mat2x3s m, vec2s v);
CGLM_INLINE mat3x2s glms_mat2x3_transpose(mat2x3s m); CGLM_INLINE mat3x2s glms_mat2x3_transpose(mat2x3s m);
CGLM_INLINE mat2x3s glms_mat2x3_scale(mat2x3s m, float s); CGLM_INLINE mat2x3s glms_mat2x3_scale(mat2x3s m, float s);
*/ */
@@ -73,9 +73,9 @@ glms_mat2x3_(make)(const float * __restrict src) {
* @returns destination matrix (mat2s) * @returns destination matrix (mat2s)
*/ */
CGLM_INLINE CGLM_INLINE
mat2s mat3s
glms_mat2x3_(mul)(mat2x3s m1, mat3x2s m2) { glms_mat2x3_(mul)(mat2x3s m1, mat3x2s m2) {
mat2s r; mat3s r;
glm_mat2x3_mul(m1.raw, m2.raw, r.raw); glm_mat2x3_mul(m1.raw, m2.raw, r.raw);
return r; return r;
} }
@@ -85,12 +85,12 @@ glms_mat2x3_(mul)(mat2x3s m1, mat3x2s m2) {
* *
* @param[in] m matrix (left) * @param[in] m matrix (left)
* @param[in] v vector (right, column vector) * @param[in] v vector (right, column vector)
* @param[out] dest result vector * @returns destination vector (vec3s)
*/ */
CGLM_INLINE CGLM_INLINE
vec2s vec3s
glms_mat2x3_(mulv)(mat2x3s m, vec3s v) { glms_mat2x3_(mulv)(mat2x3s m, vec2s v) {
vec2s r; vec3s r;
glm_mat2x3_mulv(m.raw, v.raw, r.raw); glm_mat2x3_mulv(m.raw, v.raw, r.raw);
return r; return r;
} }

View File

@@ -14,7 +14,7 @@
CGLM_INLINE mat2x4s glms_mat2x4_zero(void); CGLM_INLINE mat2x4s glms_mat2x4_zero(void);
CGLM_INLINE mat2x4s glms_mat2x4_make(const float * __restrict src); CGLM_INLINE mat2x4s glms_mat2x4_make(const float * __restrict src);
CGLM_INLINE mat2s glms_mat2x4_mul(mat2x4s m1, mat4x2s m2); CGLM_INLINE mat2s glms_mat2x4_mul(mat2x4s m1, mat4x2s m2);
CGLM_INLINE vec2s glms_mat2x4_mulv(mat2x4s m, vec4s v); CGLM_INLINE vec4s glms_mat2x4_mulv(mat2x4s m, vec2s v);
CGLM_INLINE mat4x2s glms_mat2x4_transpose(mat2x4s m); CGLM_INLINE mat4x2s glms_mat2x4_transpose(mat2x4s m);
CGLM_INLINE mat2x4s glms_mat2x4_scale(mat2x4s m, float s); CGLM_INLINE mat2x4s glms_mat2x4_scale(mat2x4s m, float s);
*/ */
@@ -73,24 +73,24 @@ glms_mat2x4_(make)(const float * __restrict src) {
* @returns destination matrix (mat2s) * @returns destination matrix (mat2s)
*/ */
CGLM_INLINE CGLM_INLINE
mat2s mat4s
glms_mat2x4_(mul)(mat2x4s m1, mat4x2s m2) { glms_mat2x4_(mul)(mat2x4s m1, mat4x2s m2) {
mat2s r; mat4s r;
glm_mat2x4_mul(m1.raw, m2.raw, r.raw); glm_mat2x4_mul(m1.raw, m2.raw, r.raw);
return r; return r;
} }
/*! /*!
* @brief multiply matrix with column vector and store in dest vector * @brief multiply matrix with column vector and store in dest column vector
* *
* @param[in] m matrix (left) * @param[in] m matrix (left)
* @param[in] v vector (right, column vector) * @param[in] v vector (right, column vector)
* @param[out] dest result vector * @param[out] dest result vector
*/ */
CGLM_INLINE CGLM_INLINE
vec2s vec4s
glms_mat2x4_(mulv)(mat2x4s m, vec4s v) { glms_mat2x4_(mulv)(mat2x4s m, vec2s v) {
vec2s r; vec4s r;
glm_mat2x4_mulv(m.raw, v.raw, r.raw); glm_mat2x4_mulv(m.raw, v.raw, r.raw);
return r; return r;
} }

View File

@@ -13,8 +13,8 @@
Functions: Functions:
CGLM_INLINE mat3x2s glms_mat3x2_zero(void); CGLM_INLINE mat3x2s glms_mat3x2_zero(void);
CGLM_INLINE mat3x2s glms_mat3x2_make(const float * __restrict src); CGLM_INLINE mat3x2s glms_mat3x2_make(const float * __restrict src);
CGLM_INLINE mat3s glms_mat3x2_mul(mat3x2s m1, mat2x3s m2); CGLM_INLINE mat2s glms_mat3x2_mul(mat3x2s m1, mat2x3s m2);
CGLM_INLINE vec3s glms_mat3x2_mulv(mat3x2s m, vec2s v); CGLM_INLINE vec2s glms_mat3x2_mulv(mat3x2s m, vec3s v);
CGLM_INLINE mat2x3s glms_mat3x2_transpose(mat3x2s m); CGLM_INLINE mat2x3s glms_mat3x2_transpose(mat3x2s m);
CGLM_INLINE mat3x2s glms_mat3x2_scale(mat3x2s m, float s); CGLM_INLINE mat3x2s glms_mat3x2_scale(mat3x2s m, float s);
*/ */
@@ -73,9 +73,9 @@ glms_mat3x2_(make)(const float * __restrict src) {
* @returns destination matrix (mat3s) * @returns destination matrix (mat3s)
*/ */
CGLM_INLINE CGLM_INLINE
mat3s mat2s
glms_mat3x2_(mul)(mat3x2s m1, mat2x3s m2) { glms_mat3x2_(mul)(mat3x2s m1, mat2x3s m2) {
mat3s r; mat2s r;
glm_mat3x2_mul(m1.raw, m2.raw, r.raw); glm_mat3x2_mul(m1.raw, m2.raw, r.raw);
return r; return r;
} }
@@ -88,9 +88,9 @@ glms_mat3x2_(mul)(mat3x2s m1, mat2x3s m2) {
* @param[out] dest result vector * @param[out] dest result vector
*/ */
CGLM_INLINE CGLM_INLINE
vec3s vec2s
glms_mat3x2_(mulv)(mat3x2s m, vec2s v) { glms_mat3x2_(mulv)(mat3x2s m, vec3s v) {
vec3s r; vec2s r;
glm_mat3x2_mulv(m.raw, v.raw, r.raw); glm_mat3x2_mulv(m.raw, v.raw, r.raw);
return r; return r;
} }

View File

@@ -28,13 +28,13 @@ glmc_mat2x3_make(const float * __restrict src, mat2x3 dest) {
CGLM_EXPORT CGLM_EXPORT
void void
glmc_mat2x3_mul(mat2x3 m1, mat3x2 m2, mat2 dest) { glmc_mat2x3_mul(mat2x3 m1, mat3x2 m2, mat3 dest) {
glm_mat2x3_mul(m1, m2, dest); glm_mat2x3_mul(m1, m2, dest);
} }
CGLM_EXPORT CGLM_EXPORT
void void
glmc_mat2x3_mulv(mat2x3 m, vec3 v, vec2 dest) { glmc_mat2x3_mulv(mat2x3 m, vec2 v, vec3 dest) {
glm_mat2x3_mulv(m, v, dest); glm_mat2x3_mulv(m, v, dest);
} }

View File

@@ -28,13 +28,13 @@ glmc_mat2x4_make(const float * __restrict src, mat2x4 dest) {
CGLM_EXPORT CGLM_EXPORT
void void
glmc_mat2x4_mul(mat2x4 m1, mat4x2 m2, mat2 dest) { glmc_mat2x4_mul(mat2x4 m1, mat4x2 m2, mat4 dest) {
glm_mat2x4_mul(m1, m2, dest); glm_mat2x4_mul(m1, m2, dest);
} }
CGLM_EXPORT CGLM_EXPORT
void void
glmc_mat2x4_mulv(mat2x4 m, vec4 v, vec2 dest) { glmc_mat2x4_mulv(mat2x4 m, vec2 v, vec4 dest) {
glm_mat2x4_mulv(m, v, dest); glm_mat2x4_mulv(m, v, dest);
} }

View File

@@ -28,13 +28,13 @@ glmc_mat3x2_make(const float * __restrict src, mat3x2 dest) {
CGLM_EXPORT CGLM_EXPORT
void void
glmc_mat3x2_mul(mat3x2 m1, mat2x3 m2, mat3 dest) { glmc_mat3x2_mul(mat3x2 m1, mat2x3 m2, mat2 dest) {
glm_mat3x2_mul(m1, m2, dest); glm_mat3x2_mul(m1, m2, dest);
} }
CGLM_EXPORT CGLM_EXPORT
void void
glmc_mat3x2_mulv(mat3x2 m, vec2 v, vec3 dest) { glmc_mat3x2_mulv(mat3x2 m, vec3 v, vec2 dest) {
glm_mat3x2_mulv(m, v, dest); glm_mat3x2_mulv(m, v, dest);
} }

View File

@@ -83,42 +83,42 @@ TEST_IMPL(GLM_PREFIX, mat2x3_mul) {
mat2x3 m1 = GLM_MAT2X3_ZERO_INIT; mat2x3 m1 = GLM_MAT2X3_ZERO_INIT;
mat3x2 m2 = GLM_MAT3X2_ZERO_INIT; mat3x2 m2 = GLM_MAT3X2_ZERO_INIT;
mat2 m3 = GLM_MAT2_ZERO_INIT; mat3 m3 = GLM_MAT3_ZERO_INIT;
mat2 m4 = GLM_MAT2_ZERO_INIT; mat3 m4 = GLM_MAT3_ZERO_INIT;
int i, j, k; int c, r, k;
/* test random matrices */ /* test random matrices */
/* random matrices */ /* random matrices */
test_rand_mat2x3(m1); test_rand_mat2x3(m1);
test_rand_mat3x2(m2); test_rand_mat3x2(m2);
for (i = 0; i < 2; i++) { for (r = 0; r < 3; r++) {
for (j = 0; j < 2; j++) { for (c = 0; c < 3; c++) {
for (k = 0; k < 3; k++) { for (k = 0; k < 2; k++) {
m4[i][j] += m1[i][k] * m2[k][j]; m4[c][r] += m1[k][r] * m2[c][k];
} }
} }
} }
GLM(mat2x3_mul)(m1, m2, m3); GLM(mat2x3_mul)(m1, m2, m3);
ASSERTIFY(test_assert_mat2_eq(m3, m4)) ASSERTIFY(test_assert_mat3_eq(m3, m4))
TEST_SUCCESS TEST_SUCCESS
} }
TEST_IMPL(GLM_PREFIX, mat2x3_mulv) { TEST_IMPL(GLM_PREFIX, mat2x3_mulv) {
mat2x3 mat = A_MATRIX2X3; mat2x3 mat = A_MATRIX2X3;
vec3 v = {11.0f, 21.0f, 31.0f}; vec2 v = {11.0f, 21.0f};
int i; int i;
vec2 dest; vec3 dest;
float res = 0.0; float res = 0.0;
GLM(mat2x3_mulv)(mat, v, dest); GLM(mat2x3_mulv)(mat, v, dest);
for (i = 0; i < 2; i++) { for (i = 0; i < 3; i++) {
res = mat[i][0] * v[0] + mat[i][1] * v[1] + mat[i][2] * v[2]; res = mat[0][i] * v[0] + mat[1][i] * v[1];
ASSERT(test_eq(dest[i], res)) ASSERT(test_eq(dest[i], res))
} }

View File

@@ -86,42 +86,42 @@ TEST_IMPL(GLM_PREFIX, mat2x4_mul) {
mat2x4 m1 = GLM_MAT2X4_ZERO_INIT; mat2x4 m1 = GLM_MAT2X4_ZERO_INIT;
mat4x2 m2 = GLM_MAT4X2_ZERO_INIT; mat4x2 m2 = GLM_MAT4X2_ZERO_INIT;
mat2 m3 = GLM_MAT2_ZERO_INIT; mat4 m3 = GLM_MAT4_ZERO_INIT;
mat2 m4 = GLM_MAT2_ZERO_INIT; mat4 m4 = GLM_MAT4_ZERO_INIT;
int i, j, k; int c, r, k;
/* test random matrices */ /* test random matrices */
/* random matrices */ /* random matrices */
test_rand_mat2x4(m1); test_rand_mat2x4(m1);
test_rand_mat4x2(m2); test_rand_mat4x2(m2);
for (i = 0; i < 2; i++) { for (r = 0; r < 4; r++) {
for (j = 0; j < 2; j++) { for (c = 0; c < 4; c++) {
for (k = 0; k < 4; k++) { for (k = 0; k < 2; k++) {
m4[i][j] += m1[i][k] * m2[k][j]; m4[c][r] += m1[k][r] * m2[c][k];
} }
} }
} }
GLM(mat2x4_mul)(m1, m2, m3); GLM(mat2x4_mul)(m1, m2, m3);
ASSERTIFY(test_assert_mat2_eq(m3, m4)) ASSERTIFY(test_assert_mat4_eq(m3, m4))
TEST_SUCCESS TEST_SUCCESS
} }
TEST_IMPL(GLM_PREFIX, mat2x4_mulv) { TEST_IMPL(GLM_PREFIX, mat2x4_mulv) {
mat2x4 mat = A_MATRIX2X4; mat2x4 mat = A_MATRIX2X4;
vec4 v = {11.0f, 21.0f, 31.0f, 41.0f}; vec2 v = {11.0f, 21.0f};
int i; int i;
vec2 dest; vec4 dest;
float res = 0.0; float res = 0.0;
GLM(mat2x4_mulv)(mat, v, dest); GLM(mat2x4_mulv)(mat, v, dest);
for (i = 0; i < 2; i++) { for (i = 0; i < 4; i++) {
res = mat[i][0] * v[0] + mat[i][1] * v[1] + mat[i][2] * v[2] + mat[i][3] * v[3]; res = mat[0][i] * v[0] + mat[1][i] * v[1];
ASSERT(test_eq(dest[i], res)) ASSERT(test_eq(dest[i], res))
} }

View File

@@ -84,40 +84,40 @@ TEST_IMPL(GLM_PREFIX, mat3x2_mul) {
mat3x2 m1 = GLM_MAT3X2_ZERO_INIT; mat3x2 m1 = GLM_MAT3X2_ZERO_INIT;
mat2x3 m2 = GLM_MAT2X3_ZERO_INIT; mat2x3 m2 = GLM_MAT2X3_ZERO_INIT;
mat3 m3 = GLM_MAT3_ZERO_INIT; mat2 m3 = GLM_MAT2_ZERO_INIT;
mat3 m4 = GLM_MAT3_ZERO_INIT; mat2 m4 = GLM_MAT2_ZERO_INIT;
int i, j, k; int c, r, k;
test_rand_mat3x2(m1); test_rand_mat3x2(m1);
test_rand_mat2x3(m2); test_rand_mat2x3(m2);
for (i = 0; i < 3; i++) { for (r = 0; r < 2; r++) {
for (j = 0; j < 3; j++) { for (c = 0; c < 2; c++) {
for (k = 0; k < 2; k++) { for (k = 0; k < 3; k++) {
m4[i][j] += m1[i][k] * m2[k][j]; m4[c][r] += m1[k][r] * m2[c][k];
} }
} }
} }
GLM(mat3x2_mul)(m1, m2, m3); GLM(mat3x2_mul)(m1, m2, m3);
ASSERTIFY(test_assert_mat3_eq(m3, m4)) ASSERTIFY(test_assert_mat2_eq(m3, m4))
TEST_SUCCESS TEST_SUCCESS
} }
TEST_IMPL(GLM_PREFIX, mat3x2_mulv) { TEST_IMPL(GLM_PREFIX, mat3x2_mulv) {
mat3x2 mat = A_MATRIX3X2; mat3x2 mat = A_MATRIX3X2;
vec2 v = {11.0f, 21.0f}; vec3 v = {11.0f, 21.0f, 31.0f};
int i; int i;
vec3 dest; vec2 dest;
float res = 0.0; float res = 0.0;
GLM(mat3x2_mulv)(mat, v, dest); GLM(mat3x2_mulv)(mat, v, dest);
for (i = 0; i < 3; i++) { for (i = 0; i < 2; i++) {
res = mat[i][0] * v[0] + mat[i][1] * v[1]; res = mat[0][i] * v[0] + mat[1][i] * v[1] + mat[2][i] * v[2];
ASSERT(test_eq(dest[i], res)) ASSERT(test_eq(dest[i], res))
} }

View File

@@ -26,9 +26,15 @@ TEST_IMPL(GLM_PREFIX, unprojecti) {
/* unprojected of projected vector must be same as original one */ /* unprojected of projected vector must be same as original one */
/* we used 0.01 because of projection floating point errors */ /* we used 0.01 because of projection floating point errors */
#ifndef CGLM_FAST_MATH
ASSERT(fabsf(pos[0] - unprojected[0]) < 0.01) ASSERT(fabsf(pos[0] - unprojected[0]) < 0.01)
ASSERT(fabsf(pos[1] - unprojected[1]) < 0.01) ASSERT(fabsf(pos[1] - unprojected[1]) < 0.01)
ASSERT(fabsf(pos[2] - unprojected[2]) < 0.01) ASSERT(fabsf(pos[2] - unprojected[2]) < 0.01)
#else
ASSERT(fabsf(pos[0] - unprojected[0]) < 0.1)
ASSERT(fabsf(pos[1] - unprojected[1]) < 0.1)
ASSERT(fabsf(pos[2] - unprojected[2]) < 0.1)
#endif
TEST_SUCCESS TEST_SUCCESS
} }
@@ -50,9 +56,16 @@ TEST_IMPL(GLM_PREFIX, unproject) {
/* unprojected of projected vector must be same as original one */ /* unprojected of projected vector must be same as original one */
/* we used 0.01 because of projection floating point errors */ /* we used 0.01 because of projection floating point errors */
#ifndef CGLM_FAST_MATH
ASSERT(fabsf(pos[0] - unprojected[0]) < 0.01) ASSERT(fabsf(pos[0] - unprojected[0]) < 0.01)
ASSERT(fabsf(pos[1] - unprojected[1]) < 0.01) ASSERT(fabsf(pos[1] - unprojected[1]) < 0.01)
ASSERT(fabsf(pos[2] - unprojected[2]) < 0.01) ASSERT(fabsf(pos[2] - unprojected[2]) < 0.01)
#else
ASSERT(fabsf(pos[0] - unprojected[0]) < 0.1)
ASSERT(fabsf(pos[1] - unprojected[1]) < 0.1)
ASSERT(fabsf(pos[2] - unprojected[2]) < 0.1)
#endif
TEST_SUCCESS TEST_SUCCESS
} }
@@ -74,9 +87,16 @@ TEST_IMPL(GLM_PREFIX, project) {
/* unprojected of projected vector must be same as original one */ /* unprojected of projected vector must be same as original one */
/* we used 0.01 because of projection floating point errors */ /* we used 0.01 because of projection floating point errors */
#ifndef CGLM_FAST_MATH
ASSERT(fabsf(pos[0] - unprojected[0]) < 0.01) ASSERT(fabsf(pos[0] - unprojected[0]) < 0.01)
ASSERT(fabsf(pos[1] - unprojected[1]) < 0.01) ASSERT(fabsf(pos[1] - unprojected[1]) < 0.01)
ASSERT(fabsf(pos[2] - unprojected[2]) < 0.01) ASSERT(fabsf(pos[2] - unprojected[2]) < 0.01)
#else
ASSERT(fabsf(pos[0] - unprojected[0]) < 0.1)
ASSERT(fabsf(pos[1] - unprojected[1]) < 0.1)
ASSERT(fabsf(pos[2] - unprojected[2]) < 0.1)
#endif
/* test with no projection */ /* test with no projection */
glm_mat4_identity(mvp); glm_mat4_identity(mvp);

View File

@@ -802,11 +802,13 @@ TEST_IMPL(GLM_PREFIX, vec2_refract) {
/* Air to Glass (eta = 1.0 / 1.5) */ /* Air to Glass (eta = 1.0 / 1.5) */
eta = 1.0f / 1.5f; eta = 1.0f / 1.5f;
r = GLM(vec2_refract)(v, N, eta, dest); r = GLM(vec2_refract)(v, N, eta, dest);
ASSERT(r == true);
ASSERT(dest[1] < -sqrtf(0.5f)); // Expect bending towards the normal ASSERT(dest[1] < -sqrtf(0.5f)); // Expect bending towards the normal
/* Glass to Water (eta = 1.5 / 1.33) */ /* Glass to Water (eta = 1.5 / 1.33) */
eta = 1.5f / 1.33f; eta = 1.5f / 1.33f;
r = GLM(vec2_refract)(v, N, eta, dest); r = GLM(vec2_refract)(v, N, eta, dest);
ASSERT(r == true);
ASSERT(dest[1] < -sqrtf(0.5f)); // Expect bending towards the normal, less bending than air to glass ASSERT(dest[1] < -sqrtf(0.5f)); // Expect bending towards the normal, less bending than air to glass
/* Diamond to Air (eta = 2.42 / 1.0) */ /* Diamond to Air (eta = 2.42 / 1.0) */

View File

@@ -1673,14 +1673,16 @@ TEST_IMPL(GLM_PREFIX, vec3_eqv_eps) {
TEST_IMPL(GLM_PREFIX, vec3_max) { TEST_IMPL(GLM_PREFIX, vec3_max) {
vec3 v1 = {2.104f, -3.012f, -4.10f}, v2 = {-12.35f, -31.140f, -43.502f}; vec3 v1 = {2.104f, -3.012f, -4.10f}, v2 = {-12.35f, -31.140f, -43.502f};
vec3 v3 = {INFINITY, 0.0f, 0.0f}, v4 = {NAN, INFINITY, 2.0f}; vec3 v3 = {INFINITY, 0.0f, 0.0f}/*, v4 = {NAN, INFINITY, 2.0f}*/;
vec3 v5 = {NAN, -1.0f, -1.0f}, v6 = {-1.0f, -11.0f, 11.0f}; vec3 /*v5 = {NAN, -1.0f, -1.0f}, */v6 = {-1.0f, -11.0f, 11.0f};
ASSERT(test_eq(GLM(vec3_max)(v1), 2.104f)) ASSERT(test_eq(GLM(vec3_max)(v1), 2.104f))
ASSERT(test_eq(GLM(vec3_max)(v2), -12.35f)) ASSERT(test_eq(GLM(vec3_max)(v2), -12.35f))
#ifndef CGLM_FAST_MATH
ASSERT(isinf(GLM(vec3_max)(v3))) ASSERT(isinf(GLM(vec3_max)(v3)))
ASSERT(isnan(GLM(vec3_max)(v4))) #endif
ASSERT(isnan(GLM(vec3_max)(v5))) // ASSERT(isnan(GLM(vec3_max)(v4)))
// ASSERT(isnan(GLM(vec3_max)(v5)))
ASSERT(test_eq(GLM(vec3_max)(v6), 11.0f)) ASSERT(test_eq(GLM(vec3_max)(v6), 11.0f))
TEST_SUCCESS TEST_SUCCESS
@@ -1688,20 +1690,21 @@ TEST_IMPL(GLM_PREFIX, vec3_max) {
TEST_IMPL(GLM_PREFIX, vec3_min) { TEST_IMPL(GLM_PREFIX, vec3_min) {
vec3 v1 = {2.104f, -3.012f, -4.10f}, v2 = {-12.35f, -31.140f, -43.502f}; vec3 v1 = {2.104f, -3.012f, -4.10f}, v2 = {-12.35f, -31.140f, -43.502f};
vec3 v3 = {INFINITY, 0.0f, 0.0f}, v4 = {NAN, INFINITY, 2.0f}; vec3 v3 = {INFINITY, 0.0f, 0.0f}/*, v4 = {NAN, INFINITY, 2.0f}*/;
vec3 v5 = {NAN, -1.0f, -1.0f}, v6 = {-1.0f, -11.0f, 11.0f}; vec3 /*v5 = {NAN, -1.0f, -1.0f},*/ v6 = {-1.0f, -11.0f, 11.0f};
ASSERT(test_eq(GLM(vec3_min)(v1), -4.10f)) ASSERT(test_eq(GLM(vec3_min)(v1), -4.10f))
ASSERT(test_eq(GLM(vec3_min)(v2), -43.502f)) ASSERT(test_eq(GLM(vec3_min)(v2), -43.502f))
ASSERT(test_eq(GLM(vec3_min)(v3), 0.0f)) ASSERT(test_eq(GLM(vec3_min)(v3), 0.0f))
ASSERT(isnan(GLM(vec3_min)(v4))) // ASSERT(isnan(GLM(vec3_min)(v4)))
ASSERT(isnan(GLM(vec3_min)(v5))) // ASSERT(isnan(GLM(vec3_min)(v5)))
ASSERT(test_eq(GLM(vec3_min)(v6), -11.0f)) ASSERT(test_eq(GLM(vec3_min)(v6), -11.0f))
TEST_SUCCESS TEST_SUCCESS
} }
TEST_IMPL(GLM_PREFIX, vec3_isnan) { TEST_IMPL(GLM_PREFIX, vec3_isnan) {
#ifndef CGLM_FAST_MATH
vec3 v1 = {2.104f, -3.012f, -4.10f}, v2 = {-12.35f, -31.140f, -43.502f}; vec3 v1 = {2.104f, -3.012f, -4.10f}, v2 = {-12.35f, -31.140f, -43.502f};
vec3 v3 = {INFINITY, 0.0f, 0.0f}, v4 = {NAN, INFINITY, 2.0f}; vec3 v3 = {INFINITY, 0.0f, 0.0f}, v4 = {NAN, INFINITY, 2.0f};
vec3 v5 = {NAN, -1.0f, -1.0f}, v6 = {-1.0f, -1.0f, 11.0f}; vec3 v5 = {NAN, -1.0f, -1.0f}, v6 = {-1.0f, -1.0f, 11.0f};
@@ -1712,11 +1715,12 @@ TEST_IMPL(GLM_PREFIX, vec3_isnan) {
ASSERT(GLM(vec3_isnan)(v4)) ASSERT(GLM(vec3_isnan)(v4))
ASSERT(GLM(vec3_isnan)(v5)) ASSERT(GLM(vec3_isnan)(v5))
ASSERT(!GLM(vec3_isnan)(v6)) ASSERT(!GLM(vec3_isnan)(v6))
#endif
TEST_SUCCESS TEST_SUCCESS
} }
TEST_IMPL(GLM_PREFIX, vec3_isinf) { TEST_IMPL(GLM_PREFIX, vec3_isinf) {
#ifndef CGLM_FAST_MATH
vec3 v1 = {2.104f, -3.012f, -4.10f}, v2 = {-12.35f, -31.140f, -43.502f}; vec3 v1 = {2.104f, -3.012f, -4.10f}, v2 = {-12.35f, -31.140f, -43.502f};
vec3 v3 = {INFINITY, 0.0f, 0.0f}, v4 = {NAN, INFINITY, 2.0f}; vec3 v3 = {INFINITY, 0.0f, 0.0f}, v4 = {NAN, INFINITY, 2.0f};
vec3 v5 = {NAN, -1.0f, -1.0f}, v6 = {-1.0f, -1.0f, 11.0f}; vec3 v5 = {NAN, -1.0f, -1.0f}, v6 = {-1.0f, -1.0f, 11.0f};
@@ -1727,11 +1731,12 @@ TEST_IMPL(GLM_PREFIX, vec3_isinf) {
ASSERT(GLM(vec3_isinf)(v4)) ASSERT(GLM(vec3_isinf)(v4))
ASSERT(!GLM(vec3_isinf)(v5)) ASSERT(!GLM(vec3_isinf)(v5))
ASSERT(!GLM(vec3_isinf)(v6)) ASSERT(!GLM(vec3_isinf)(v6))
#endif
TEST_SUCCESS TEST_SUCCESS
} }
TEST_IMPL(GLM_PREFIX, vec3_isvalid) { TEST_IMPL(GLM_PREFIX, vec3_isvalid) {
#ifndef CGLM_FAST_MATH
vec3 v1 = {2.104f, -3.012f, -4.10f}, v2 = {-12.35f, -31.140f, -43.502f}; vec3 v1 = {2.104f, -3.012f, -4.10f}, v2 = {-12.35f, -31.140f, -43.502f};
vec3 v3 = {INFINITY, 0.0f, 0.0f}, v4 = {NAN, INFINITY, 2.0f}; vec3 v3 = {INFINITY, 0.0f, 0.0f}, v4 = {NAN, INFINITY, 2.0f};
vec3 v5 = {NAN, -1.0f, -1.0f}, v6 = {-1.0f, -1.0f, 11.0f}; vec3 v5 = {NAN, -1.0f, -1.0f}, v6 = {-1.0f, -1.0f, 11.0f};
@@ -1742,7 +1747,7 @@ TEST_IMPL(GLM_PREFIX, vec3_isvalid) {
ASSERT(!GLM(vec3_isvalid)(v4)) ASSERT(!GLM(vec3_isvalid)(v4))
ASSERT(!GLM(vec3_isvalid)(v5)) ASSERT(!GLM(vec3_isvalid)(v5))
ASSERT(GLM(vec3_isvalid)(v6)) ASSERT(GLM(vec3_isvalid)(v6))
#endif
TEST_SUCCESS TEST_SUCCESS
} }
@@ -1908,6 +1913,7 @@ TEST_IMPL(GLM_PREFIX, vec3_refract) {
r = GLM(vec3_refract)(v, N, eta, dest); r = GLM(vec3_refract)(v, N, eta, dest);
/* Expect bending towards the normal */ /* Expect bending towards the normal */
ASSERT(r == true);
ASSERT(dest[1] < -sqrtf(0.5f)); ASSERT(dest[1] < -sqrtf(0.5f));
/* Glass to Water (eta = 1.5 / 1.33) */ /* Glass to Water (eta = 1.5 / 1.33) */
@@ -1915,6 +1921,7 @@ TEST_IMPL(GLM_PREFIX, vec3_refract) {
r = GLM(vec3_refract)(v, N, eta, dest); r = GLM(vec3_refract)(v, N, eta, dest);
/* Expect bending towards the normal, less bending than air to glass */ /* Expect bending towards the normal, less bending than air to glass */
ASSERT(r == true);
ASSERT(dest[1] < -sqrtf(0.5f)); ASSERT(dest[1] < -sqrtf(0.5f));
/* Diamond to Air (eta = 2.42 / 1.0) */ /* Diamond to Air (eta = 2.42 / 1.0) */

View File

@@ -1345,15 +1345,17 @@ TEST_IMPL(GLM_PREFIX, vec4_max) {
vec4 v1 = {2.104f, -3.012f, -4.10f, -4.10f}; vec4 v1 = {2.104f, -3.012f, -4.10f, -4.10f};
vec4 v2 = {-12.35f, -31.140f, -43.502f, -43.502f}; vec4 v2 = {-12.35f, -31.140f, -43.502f, -43.502f};
vec4 v3 = {INFINITY, 0.0f, 0.0f, 0.0f}; vec4 v3 = {INFINITY, 0.0f, 0.0f, 0.0f};
vec4 v4 = {NAN, INFINITY, 2.0f, 2.0f}; // vec4 v4 = {NAN, INFINITY, 2.0f, 2.0f};
vec4 v5 = {NAN, -1.0f, -1.0f, -1.0f}; // vec4 v5 = {NAN, -1.0f, -1.0f, -1.0f};
vec4 v6 = {-1.0f, -11.0f, 11.0f, 11.0f}; vec4 v6 = {-1.0f, -11.0f, 11.0f, 11.0f};
ASSERT(test_eq(GLM(vec4_max)(v1), 2.104f)) ASSERT(test_eq(GLM(vec4_max)(v1), 2.104f))
ASSERT(test_eq(GLM(vec4_max)(v2), -12.35f)) ASSERT(test_eq(GLM(vec4_max)(v2), -12.35f))
#ifndef CGLM_FAST_MATH
ASSERT(isinf(GLM(vec4_max)(v3))) ASSERT(isinf(GLM(vec4_max)(v3)))
ASSERT(isnan(GLM(vec4_max)(v4))) #endif
ASSERT(isnan(GLM(vec4_max)(v5))) // ASSERT(isnan(GLM(vec4_max)(v4)))
// ASSERT(isnan(GLM(vec4_max)(v5)))
ASSERT(test_eq(GLM(vec4_max)(v6), 11.0f)) ASSERT(test_eq(GLM(vec4_max)(v6), 11.0f))
TEST_SUCCESS TEST_SUCCESS
@@ -1363,21 +1365,22 @@ TEST_IMPL(GLM_PREFIX, vec4_min) {
vec4 v1 = {2.104f, -3.012f, -4.10f, -4.10f}; vec4 v1 = {2.104f, -3.012f, -4.10f, -4.10f};
vec4 v2 = {-12.35f, -31.140f, -43.502f, -43.502f}; vec4 v2 = {-12.35f, -31.140f, -43.502f, -43.502f};
vec4 v3 = {INFINITY, 0.0f, 0.0f, 0.0f}; vec4 v3 = {INFINITY, 0.0f, 0.0f, 0.0f};
vec4 v4 = {NAN, INFINITY, 2.0f, 2.0f}; // vec4 v4 = {NAN, INFINITY, 2.0f, 2.0f};
vec4 v5 = {NAN, -1.0f, -1.0f, -1.0f}; // vec4 v5 = {NAN, -1.0f, -1.0f, -1.0f};
vec4 v6 = {-1.0f, -11.0f, 11.0f, 11.0f}; vec4 v6 = {-1.0f, -11.0f, 11.0f, 11.0f};
ASSERT(test_eq(GLM(vec4_min)(v1), -4.10f)) ASSERT(test_eq(GLM(vec4_min)(v1), -4.10f))
ASSERT(test_eq(GLM(vec4_min)(v2), -43.502f)) ASSERT(test_eq(GLM(vec4_min)(v2), -43.502f))
ASSERT(test_eq(GLM(vec4_min)(v3), 0.0f)) ASSERT(test_eq(GLM(vec4_min)(v3), 0.0f))
ASSERT(isnan(GLM(vec4_min)(v4))) // ASSERT(isnan(GLM(vec4_min)(v4)))
ASSERT(isnan(GLM(vec4_min)(v5))) // ASSERT(isnan(GLM(vec4_min)(v5)))
ASSERT(test_eq(GLM(vec4_min)(v6), -11.0f)) ASSERT(test_eq(GLM(vec4_min)(v6), -11.0f))
TEST_SUCCESS TEST_SUCCESS
} }
TEST_IMPL(GLM_PREFIX, vec4_isnan) { TEST_IMPL(GLM_PREFIX, vec4_isnan) {
#ifndef CGLM_FAST_MATH
vec4 v1 = {2.104f, -3.012f, -4.10f, -4.10f}; vec4 v1 = {2.104f, -3.012f, -4.10f, -4.10f};
vec4 v2 = {-12.35f, -31.140f, -43.502f, -43.502f}; vec4 v2 = {-12.35f, -31.140f, -43.502f, -43.502f};
vec4 v3 = {INFINITY, 0.0f, 0.0f, 0.0f}; vec4 v3 = {INFINITY, 0.0f, 0.0f, 0.0f};
@@ -1391,11 +1394,12 @@ TEST_IMPL(GLM_PREFIX, vec4_isnan) {
ASSERT(GLM(vec4_isnan)(v4)) ASSERT(GLM(vec4_isnan)(v4))
ASSERT(GLM(vec4_isnan)(v5)) ASSERT(GLM(vec4_isnan)(v5))
ASSERT(!GLM(vec4_isnan)(v6)) ASSERT(!GLM(vec4_isnan)(v6))
#endif
TEST_SUCCESS TEST_SUCCESS
} }
TEST_IMPL(GLM_PREFIX, vec4_isinf) { TEST_IMPL(GLM_PREFIX, vec4_isinf) {
#ifndef CGLM_FAST_MATH
vec4 v1 = {2.104f, -3.012f, -4.10f, -4.10f}; vec4 v1 = {2.104f, -3.012f, -4.10f, -4.10f};
vec4 v2 = {-12.35f, -31.140f, -43.502f, -43.502f}; vec4 v2 = {-12.35f, -31.140f, -43.502f, -43.502f};
vec4 v3 = {INFINITY, 0.0f, 0.0f, 0.0f}; vec4 v3 = {INFINITY, 0.0f, 0.0f, 0.0f};
@@ -1409,11 +1413,12 @@ TEST_IMPL(GLM_PREFIX, vec4_isinf) {
ASSERT(GLM(vec4_isinf)(v4)) ASSERT(GLM(vec4_isinf)(v4))
ASSERT(!GLM(vec4_isinf)(v5)) ASSERT(!GLM(vec4_isinf)(v5))
ASSERT(!GLM(vec4_isinf)(v6)) ASSERT(!GLM(vec4_isinf)(v6))
#endif
TEST_SUCCESS TEST_SUCCESS
} }
TEST_IMPL(GLM_PREFIX, vec4_isvalid) { TEST_IMPL(GLM_PREFIX, vec4_isvalid) {
#ifndef CGLM_FAST_MATH
vec4 v1 = {2.104f, -3.012f, -4.10f, -4.10f}; vec4 v1 = {2.104f, -3.012f, -4.10f, -4.10f};
vec4 v2 = {-12.35f, -31.140f, -43.502f, -43.502f}; vec4 v2 = {-12.35f, -31.140f, -43.502f, -43.502f};
vec4 v3 = {INFINITY, 0.0f, 0.0f, 0.0f}; vec4 v3 = {INFINITY, 0.0f, 0.0f, 0.0f};
@@ -1427,7 +1432,7 @@ TEST_IMPL(GLM_PREFIX, vec4_isvalid) {
ASSERT(!GLM(vec4_isvalid)(v4)) ASSERT(!GLM(vec4_isvalid)(v4))
ASSERT(!GLM(vec4_isvalid)(v5)) ASSERT(!GLM(vec4_isvalid)(v5))
ASSERT(GLM(vec4_isvalid)(v6)) ASSERT(GLM(vec4_isvalid)(v6))
#endif
TEST_SUCCESS TEST_SUCCESS
} }
@@ -1591,11 +1596,13 @@ TEST_IMPL(GLM_PREFIX, vec4_refract) {
/* Air to Glass (eta = 1.0 / 1.5) */ /* Air to Glass (eta = 1.0 / 1.5) */
eta = 1.0f / 1.5f; eta = 1.0f / 1.5f;
r = GLM(vec4_refract)(v, N, eta, dest); r = GLM(vec4_refract)(v, N, eta, dest);
ASSERT(r == true);
ASSERT(dest[1] < -sqrtf(0.5f)); // Expect bending towards the normal ASSERT(dest[1] < -sqrtf(0.5f)); // Expect bending towards the normal
/* Glass to Water (eta = 1.5 / 1.33) */ /* Glass to Water (eta = 1.5 / 1.33) */
eta = 1.5f / 1.33f; eta = 1.5f / 1.33f;
r = GLM(vec4_refract)(v, N, eta, dest); r = GLM(vec4_refract)(v, N, eta, dest);
ASSERT(r == true);
ASSERT(dest[1] < -sqrtf(0.5f)); // Expect bending towards the normal, less bending than air to glass ASSERT(dest[1] < -sqrtf(0.5f)); // Expect bending towards the normal, less bending than air to glass
/* Diamond to Air (eta = 2.42 / 1.0) */ /* Diamond to Air (eta = 2.42 / 1.0) */

View File

@@ -1494,13 +1494,13 @@ TEST_LIST {
TEST_ENTRY(glm_mat2x4_transpose) TEST_ENTRY(glm_mat2x4_transpose)
TEST_ENTRY(glm_mat2x4_scale) TEST_ENTRY(glm_mat2x4_scale)
TEST_ENTRY(glm_mat2x4_copy) TEST_ENTRY(glmc_mat2x4_copy)
TEST_ENTRY(glm_mat2x4_zero) TEST_ENTRY(glmc_mat2x4_zero)
TEST_ENTRY(glm_mat2x4_make) TEST_ENTRY(glmc_mat2x4_make)
TEST_ENTRY(glm_mat2x4_mul) TEST_ENTRY(glmc_mat2x4_mul)
TEST_ENTRY(glm_mat2x4_mulv) TEST_ENTRY(glmc_mat2x4_mulv)
TEST_ENTRY(glm_mat2x4_transpose) TEST_ENTRY(glmc_mat2x4_transpose)
TEST_ENTRY(glm_mat2x4_scale) TEST_ENTRY(glmc_mat2x4_scale)
/* camera (incl [LR]H cross [NZ]O) */ /* camera (incl [LR]H cross [NZ]O) */
TEST_ENTRY(glm_perspective_lh_zo) TEST_ENTRY(glm_perspective_lh_zo)