mirror of
https://github.com/recp/cglm.git
synced 2026-02-17 03:39:05 +00:00
Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b4efcefe7f | ||
|
|
0d2e5a996a | ||
|
|
2b1eece9ac | ||
|
|
c8b8f4f6f0 |
@@ -7,7 +7,7 @@
|
||||
#*****************************************************************************
|
||||
|
||||
AC_PREREQ([2.69])
|
||||
AC_INIT([cglm], [0.5.2], [info@recp.me])
|
||||
AC_INIT([cglm], [0.5.3], [info@recp.me])
|
||||
AM_INIT_AUTOMAKE([-Wall -Werror foreign subdir-objects])
|
||||
|
||||
AC_CONFIG_MACRO_DIR([m4])
|
||||
|
||||
@@ -62,9 +62,9 @@ author = u'Recep Aslantas'
|
||||
# built documents.
|
||||
#
|
||||
# The short X.Y version.
|
||||
version = u'0.5.2'
|
||||
version = u'0.5.3'
|
||||
# The full version, including alpha/beta/rc tags.
|
||||
release = u'0.5.2'
|
||||
release = u'0.5.3'
|
||||
|
||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||
# for a list of supported languages.
|
||||
|
||||
@@ -21,6 +21,7 @@ Functions:
|
||||
1. :c:func:`glm_mat3_copy`
|
||||
#. :c:func:`glm_mat3_identity`
|
||||
#. :c:func:`glm_mat3_identity_array`
|
||||
#. :c:func:`glm_mat3_zero`
|
||||
#. :c:func:`glm_mat3_mul`
|
||||
#. :c:func:`glm_mat3_transpose_to`
|
||||
#. :c:func:`glm_mat3_transpose`
|
||||
@@ -32,6 +33,7 @@ Functions:
|
||||
#. :c:func:`glm_mat3_trace`
|
||||
#. :c:func:`glm_mat3_swap_col`
|
||||
#. :c:func:`glm_mat3_swap_row`
|
||||
#. :c:func:`glm_mat3_rmc`
|
||||
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
@@ -59,6 +61,13 @@ Functions documentation
|
||||
| *[in,out]* **mat** matrix array (must be aligned (16/32) if alignment is not disabled)
|
||||
| *[in]* **count** count of matrices
|
||||
|
||||
.. c:function:: void glm_mat3_zero(mat3 mat)
|
||||
|
||||
make given matrix zero
|
||||
|
||||
Parameters:
|
||||
| *[in,out]* **mat** matrix to
|
||||
|
||||
.. c:function:: void glm_mat3_mul(mat3 m1, mat3 m2, mat3 dest)
|
||||
|
||||
multiply m1 and m2 to dest
|
||||
@@ -161,3 +170,20 @@ Functions documentation
|
||||
| *[in, out]* **mat** matrix
|
||||
| *[in]* **row1** row1
|
||||
| *[in]* **row2** row2
|
||||
|
||||
.. c:function:: float glm_mat3_rmc(vec3 r, mat3 m, vec3 c)
|
||||
|
||||
| **rmc** stands for **Row** * **Matrix** * **Column**
|
||||
|
||||
| helper for R (row vector) * M (matrix) * C (column vector)
|
||||
|
||||
| the result is scalar because R * M = Matrix1x3 (row vector),
|
||||
| then Matrix1x3 * Vec3 (column vector) = Matrix1x1 (Scalar)
|
||||
|
||||
Parameters:
|
||||
| *[in]* **r** row vector or matrix1x3
|
||||
| *[in]* **m** matrix3x3
|
||||
| *[in]* **c** column vector or matrix3x1
|
||||
|
||||
Returns:
|
||||
scalar value e.g. Matrix1x1
|
||||
|
||||
@@ -26,6 +26,7 @@ Functions:
|
||||
#. :c:func:`glm_mat4_copy`
|
||||
#. :c:func:`glm_mat4_identity`
|
||||
#. :c:func:`glm_mat4_identity_array`
|
||||
#. :c:func:`glm_mat4_zero`
|
||||
#. :c:func:`glm_mat4_pick3`
|
||||
#. :c:func:`glm_mat4_pick3t`
|
||||
#. :c:func:`glm_mat4_ins3`
|
||||
@@ -81,6 +82,13 @@ Functions documentation
|
||||
| *[in,out]* **mat** matrix array (must be aligned (16/32) if alignment is not disabled)
|
||||
| *[in]* **count** count of matrices
|
||||
|
||||
.. c:function:: void glm_mat4_zero(mat4 mat)
|
||||
|
||||
make given matrix zero
|
||||
|
||||
Parameters:
|
||||
| *[in,out]* **mat** matrix to
|
||||
|
||||
.. c:function:: void glm_mat4_pick3(mat4 mat, mat3 dest)
|
||||
|
||||
copy upper-left of mat4 to mat3
|
||||
@@ -278,7 +286,7 @@ Functions documentation
|
||||
|
||||
| helper for R (row vector) * M (matrix) * C (column vector)
|
||||
|
||||
| the result is scalar because S * M = Matrix1x4 (row vector),
|
||||
| the result is scalar because R * M = Matrix1x4 (row vector),
|
||||
| then Matrix1x4 * Vec4 (column vector) = Matrix1x1 (Scalar)
|
||||
|
||||
Parameters:
|
||||
|
||||
@@ -40,3 +40,13 @@ SSE and SSE2 Shuffle Option
|
||||
**_mm_shuffle_ps** generates **shufps** instruction even if registers are same.
|
||||
You can force it to generate **pshufd** instruction by defining
|
||||
**CGLM_USE_INT_DOMAIN** macro. As default it is not defined.
|
||||
|
||||
SSE3 and SSE4 Dot Product Options
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
You have to extra options for dot product: **CGLM_SSE4_DOT** and **CGLM_SSE3_DOT**.
|
||||
|
||||
- If **SSE4** is enabled then you can define **CGLM_SSE4_DOT** to force cglm to use **_mm_dp_ps** instruction.
|
||||
- If **SSE3** is enabled then you can define **CGLM_SSE3_DOT** to force cglm to use **_mm_hadd_ps** instructions.
|
||||
|
||||
otherwise cglm will use custom cglm's hadd functions which are optimized too.
|
||||
|
||||
@@ -72,6 +72,10 @@ CGLM_EXPORT
|
||||
void
|
||||
glmc_mat3_swap_row(mat3 mat, int row1, int row2);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_mat3_rmc(vec3 r, mat3 m, vec3 c);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -84,7 +84,7 @@ glm_frustum(float left,
|
||||
mat4 dest) {
|
||||
float rl, tb, fn, nv;
|
||||
|
||||
glm__memzero(float, dest, sizeof(mat4));
|
||||
glm_mat4_zero(dest);
|
||||
|
||||
rl = 1.0f / (right - left);
|
||||
tb = 1.0f / (top - bottom);
|
||||
@@ -122,7 +122,7 @@ glm_ortho(float left,
|
||||
mat4 dest) {
|
||||
float rl, tb, fn;
|
||||
|
||||
glm__memzero(float, dest, sizeof(mat4));
|
||||
glm_mat4_zero(dest);
|
||||
|
||||
rl = 1.0f / (right - left);
|
||||
tb = 1.0f / (top - bottom);
|
||||
@@ -259,7 +259,7 @@ glm_perspective(float fovy,
|
||||
mat4 dest) {
|
||||
float f, fn;
|
||||
|
||||
glm__memzero(float, dest, sizeof(mat4));
|
||||
glm_mat4_zero(dest);
|
||||
|
||||
f = 1.0f / tanf(fovy * 0.5f);
|
||||
fn = 1.0f / (nearVal - farVal);
|
||||
|
||||
@@ -26,34 +26,6 @@
|
||||
# define CGLM_INLINE static inline __attribute((always_inline))
|
||||
#endif
|
||||
|
||||
#define glm__memcpy(type, dest, src, size) \
|
||||
do { \
|
||||
type *srci; \
|
||||
type *srci_end; \
|
||||
type *desti; \
|
||||
\
|
||||
srci = (type *)src; \
|
||||
srci_end = (type *)((char *)srci + size); \
|
||||
desti = (type *)dest; \
|
||||
\
|
||||
while (srci != srci_end) \
|
||||
*desti++ = *srci++; \
|
||||
} while (0)
|
||||
|
||||
#define glm__memset(type, dest, size, val) \
|
||||
do { \
|
||||
type *desti; \
|
||||
type *desti_end; \
|
||||
\
|
||||
desti = (type *)dest; \
|
||||
desti_end = (type *)((char *)desti + size); \
|
||||
\
|
||||
while (desti != desti_end) \
|
||||
*desti++ = val; \
|
||||
} while (0)
|
||||
|
||||
#define glm__memzero(type, dest, size) glm__memset(type, dest, size, 0)
|
||||
|
||||
#include "types.h"
|
||||
#include "simd/intrin.h"
|
||||
|
||||
|
||||
@@ -17,16 +17,19 @@
|
||||
CGLM_INLINE void glm_mat3_copy(mat3 mat, mat3 dest);
|
||||
CGLM_INLINE void glm_mat3_identity(mat3 mat);
|
||||
CGLM_INLINE void glm_mat3_identity_array(mat3 * restrict mat, size_t count);
|
||||
CGLM_INLINE void glm_mat3_zero(mat3 mat);
|
||||
CGLM_INLINE void glm_mat3_mul(mat3 m1, mat3 m2, mat3 dest);
|
||||
CGLM_INLINE void glm_mat3_transpose_to(mat3 m, mat3 dest);
|
||||
CGLM_INLINE void glm_mat3_transpose(mat3 m);
|
||||
CGLM_INLINE void glm_mat3_mulv(mat3 m, vec3 v, vec3 dest);
|
||||
CGLM_INLINE float glm_mat3_trace(mat3 m);
|
||||
CGLM_INLINE void glm_mat3_quat(mat3 m, versor dest);
|
||||
CGLM_INLINE void glm_mat3_scale(mat3 m, float s);
|
||||
CGLM_INLINE float glm_mat3_det(mat3 mat);
|
||||
CGLM_INLINE void glm_mat3_inv(mat3 mat, mat3 dest);
|
||||
CGLM_INLINE void glm_mat3_swap_col(mat3 mat, int col1, int col2);
|
||||
CGLM_INLINE void glm_mat3_swap_row(mat3 mat, int row1, int row2);
|
||||
CGLM_INLINE float glm_mat3_rmc(vec3 r, mat3 m, vec3 c);
|
||||
*/
|
||||
|
||||
#ifndef cglm_mat3_h
|
||||
@@ -63,7 +66,17 @@
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat3_copy(mat3 mat, mat3 dest) {
|
||||
glm__memcpy(float, dest, mat, sizeof(mat3));
|
||||
dest[0][0] = mat[0][0];
|
||||
dest[0][1] = mat[0][1];
|
||||
dest[0][2] = mat[0][2];
|
||||
|
||||
dest[1][0] = mat[1][0];
|
||||
dest[1][1] = mat[1][1];
|
||||
dest[1][2] = mat[1][2];
|
||||
|
||||
dest[2][0] = mat[2][0];
|
||||
dest[2][1] = mat[2][1];
|
||||
dest[2][2] = mat[2][2];
|
||||
}
|
||||
|
||||
/*!
|
||||
@@ -106,6 +119,18 @@ glm_mat3_identity_array(mat3 * __restrict mat, size_t count) {
|
||||
}
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief make given matrix zero.
|
||||
*
|
||||
* @param[in, out] mat matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat3_zero(mat3 mat) {
|
||||
CGLM_ALIGN_MAT mat3 t = GLM_MAT3_ZERO_INIT;
|
||||
glm_mat3_copy(t, mat);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief multiply m1 and m2 to dest
|
||||
*
|
||||
@@ -372,4 +397,26 @@ glm_mat3_swap_row(mat3 mat, int row1, int row2) {
|
||||
mat[2][row2] = tmp[2];
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief helper for R (row vector) * M (matrix) * C (column vector)
|
||||
*
|
||||
* rmc stands for Row * Matrix * Column
|
||||
*
|
||||
* the result is scalar because R * M = Matrix1x3 (row vector),
|
||||
* then Matrix1x3 * Vec3 (column vector) = Matrix1x1 (Scalar)
|
||||
*
|
||||
* @param[in] r row vector or matrix1x3
|
||||
* @param[in] m matrix3x3
|
||||
* @param[in] c column vector or matrix3x1
|
||||
*
|
||||
* @return scalar value e.g. Matrix1x1
|
||||
*/
|
||||
CGLM_INLINE
|
||||
float
|
||||
glm_mat3_rmc(vec3 r, mat3 m, vec3 c) {
|
||||
vec3 tmp;
|
||||
glm_mat3_mulv(m, c, tmp);
|
||||
return glm_vec3_dot(r, tmp);
|
||||
}
|
||||
|
||||
#endif /* cglm_mat3_h */
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
CGLM_INLINE void glm_mat4_copy(mat4 mat, mat4 dest);
|
||||
CGLM_INLINE void glm_mat4_identity(mat4 mat);
|
||||
CGLM_INLINE void glm_mat4_identity_array(mat4 * restrict mat, size_t count);
|
||||
CGLM_INLINE void glm_mat4_zero(mat4 mat);
|
||||
CGLM_INLINE void glm_mat4_pick3(mat4 mat, mat3 dest);
|
||||
CGLM_INLINE void glm_mat4_pick3t(mat4 mat, mat3 dest);
|
||||
CGLM_INLINE void glm_mat4_ins3(mat3 mat, mat4 dest);
|
||||
@@ -31,6 +32,7 @@
|
||||
CGLM_INLINE void glm_mat4_mulv3(mat4 m, vec3 v, vec3 dest);
|
||||
CGLM_INLINE float glm_mat4_trace(mat4 m);
|
||||
CGLM_INLINE float glm_mat4_trace3(mat4 m);
|
||||
CGLM_INLINE void glm_mat4_quat(mat4 m, versor dest) ;
|
||||
CGLM_INLINE void glm_mat4_transpose_to(mat4 m, mat4 dest);
|
||||
CGLM_INLINE void glm_mat4_transpose(mat4 m);
|
||||
CGLM_INLINE void glm_mat4_scale_p(mat4 m, float s);
|
||||
@@ -40,6 +42,7 @@
|
||||
CGLM_INLINE void glm_mat4_inv_fast(mat4 mat, mat4 dest);
|
||||
CGLM_INLINE void glm_mat4_swap_col(mat4 mat, int col1, int col2);
|
||||
CGLM_INLINE void glm_mat4_swap_row(mat4 mat, int row1, int row2);
|
||||
CGLM_INLINE float glm_mat4_rmc(vec4 r, mat4 m, vec4 c);
|
||||
*/
|
||||
|
||||
#ifndef cglm_mat_h
|
||||
@@ -98,7 +101,15 @@
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat4_ucopy(mat4 mat, mat4 dest) {
|
||||
glm__memcpy(float, dest, mat, sizeof(mat4));
|
||||
dest[0][0] = mat[0][0]; dest[1][0] = mat[1][0];
|
||||
dest[0][1] = mat[0][1]; dest[1][1] = mat[1][1];
|
||||
dest[0][2] = mat[0][2]; dest[1][2] = mat[1][2];
|
||||
dest[0][3] = mat[0][3]; dest[1][3] = mat[1][3];
|
||||
|
||||
dest[2][0] = mat[2][0]; dest[3][0] = mat[3][0];
|
||||
dest[2][1] = mat[2][1]; dest[3][1] = mat[3][1];
|
||||
dest[2][2] = mat[2][2]; dest[3][2] = mat[3][2];
|
||||
dest[2][3] = mat[2][3]; dest[3][3] = mat[3][3];
|
||||
}
|
||||
|
||||
/*!
|
||||
@@ -168,6 +179,18 @@ glm_mat4_identity_array(mat4 * __restrict mat, size_t count) {
|
||||
}
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief make given matrix zero.
|
||||
*
|
||||
* @param[in, out] mat matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat4_zero(mat4 mat) {
|
||||
CGLM_ALIGN_MAT mat4 t = GLM_MAT4_ZERO_INIT;
|
||||
glm_mat4_copy(t, mat);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief copy upper-left of mat4 to mat3
|
||||
*
|
||||
@@ -474,10 +497,8 @@ glm_mat4_transpose(mat4 m) {
|
||||
glm_mat4_transp_sse2(m, m);
|
||||
#else
|
||||
mat4 d;
|
||||
|
||||
glm_mat4_transpose_to(m, d);
|
||||
|
||||
glm__memcpy(float, m, d, sizeof(mat4));
|
||||
glm_mat4_ucopy(d, m);
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -682,7 +703,7 @@ glm_mat4_swap_row(mat4 mat, int row1, int row2) {
|
||||
*
|
||||
* rmc stands for Row * Matrix * Column
|
||||
*
|
||||
* the result is scalar because S * M = Matrix1x4 (row vector),
|
||||
* the result is scalar because R * M = Matrix1x4 (row vector),
|
||||
* then Matrix1x4 * Vec4 (column vector) = Matrix1x1 (Scalar)
|
||||
*
|
||||
* @param[in] r row vector or matrix1x4
|
||||
|
||||
@@ -10,6 +10,6 @@
|
||||
|
||||
#define CGLM_VERSION_MAJOR 0
|
||||
#define CGLM_VERSION_MINOR 5
|
||||
#define CGLM_VERSION_PATCH 2
|
||||
#define CGLM_VERSION_PATCH 3
|
||||
|
||||
#endif /* cglm_version_h */
|
||||
|
||||
@@ -91,3 +91,9 @@ void
|
||||
glmc_mat3_swap_row(mat3 mat, int row1, int row2) {
|
||||
glm_mat3_swap_row(mat, row1, row2);
|
||||
}
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_mat3_rmc(vec3 r, mat3 m, vec3 c) {
|
||||
return glm_mat3_rmc(r, m, c);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user