mirror of
https://github.com/recp/cglm.git
synced 2026-02-17 03:39:05 +00:00
Compare commits
27 Commits
v0.5.2
...
revert-86-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bb8ff25752 | ||
|
|
98244da67f | ||
|
|
14f06a262f | ||
|
|
392565f920 | ||
|
|
120ae9ae99 | ||
|
|
a5f1ed32af | ||
|
|
010e887946 | ||
|
|
6e501ef1f6 | ||
|
|
6ed275734b | ||
|
|
85ca81ce79 | ||
|
|
e909c8268d | ||
|
|
73e6b65da0 | ||
|
|
ecbe36df6b | ||
|
|
d85b5234a9 | ||
|
|
5b80e0e3c2 | ||
|
|
461a4009ba | ||
|
|
8f2f2c5572 | ||
|
|
81a74ba225 | ||
|
|
6c0c5167b0 | ||
|
|
4c5451994f | ||
|
|
73226bd2fd | ||
|
|
8fa21a1837 | ||
|
|
ee1937f28d | ||
|
|
b4efcefe7f | ||
|
|
0d2e5a996a | ||
|
|
2b1eece9ac | ||
|
|
c8b8f4f6f0 |
@@ -57,3 +57,6 @@ after_success:
|
|||||||
--gcov-options '\-lp'
|
--gcov-options '\-lp'
|
||||||
--verbose;
|
--verbose;
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
after_failure:
|
||||||
|
- cat ./test-suite.log
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
#*****************************************************************************
|
#*****************************************************************************
|
||||||
|
|
||||||
AC_PREREQ([2.69])
|
AC_PREREQ([2.69])
|
||||||
AC_INIT([cglm], [0.5.2], [info@recp.me])
|
AC_INIT([cglm], [0.5.4], [info@recp.me])
|
||||||
AM_INIT_AUTOMAKE([-Wall -Werror foreign subdir-objects])
|
AM_INIT_AUTOMAKE([-Wall -Werror foreign subdir-objects])
|
||||||
|
|
||||||
AC_CONFIG_MACRO_DIR([m4])
|
AC_CONFIG_MACRO_DIR([m4])
|
||||||
|
|||||||
@@ -1,9 +1,7 @@
|
|||||||
Building cglm
|
Build cglm
|
||||||
================================
|
================================
|
||||||
|
|
||||||
| **cglm** does not have external dependencies except for unit testing.
|
| **cglm** does not have external dependencies except for unit testing. When you pulled **cglm** repo with submodules all dependencies will be pulled too. `build-deps.sh` will pull all dependencies/submodules and build for you.
|
||||||
| When you pulled cglm repo with submodules all dependencies will be pulled too.
|
|
||||||
| `build-deps.sh` will pull all dependencies/submodules and build for you.
|
|
||||||
|
|
||||||
External dependencies:
|
External dependencies:
|
||||||
* cmocka - for unit testing
|
* cmocka - for unit testing
|
||||||
@@ -12,7 +10,8 @@ External dependencies:
|
|||||||
If you only need to inline versions, you don't need to build **cglm**, you don't need to link it to your program.
|
If you only need to inline versions, you don't need to build **cglm**, you don't need to link it to your program.
|
||||||
Just import cglm to your project as dependency / external lib by copy-paste then use it as usual
|
Just import cglm to your project as dependency / external lib by copy-paste then use it as usual
|
||||||
|
|
||||||
**Unix (Autotools):**
|
Unix (Autotools):
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
.. code-block:: bash
|
.. code-block:: bash
|
||||||
:linenos:
|
:linenos:
|
||||||
@@ -26,11 +25,12 @@ Just import cglm to your project as dependency / external lib by copy-paste then
|
|||||||
$ [sudo] make install # install to system (optional)
|
$ [sudo] make install # install to system (optional)
|
||||||
|
|
||||||
**make** will build cglm to **.libs** sub folder in project folder.
|
**make** will build cglm to **.libs** sub folder in project folder.
|
||||||
If you don't want to install cglm to your system's folder you can get static and dynamic libs in this folder.
|
If you don't want to install **cglm** to your system's folder you can get static and dynamic libs in this folder.
|
||||||
|
|
||||||
**Build dependencies (windows):**
|
Windows (MSBuild):
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
Windows related build files, project files are located in win folder,
|
Windows related build files, project files are located in `win` folder,
|
||||||
make sure you are inside in cglm/win folder.
|
make sure you are inside in cglm/win folder.
|
||||||
|
|
||||||
Code Analysis are enabled, it may take awhile to build.
|
Code Analysis are enabled, it may take awhile to build.
|
||||||
@@ -50,3 +50,19 @@ then try to build with *devenv*:
|
|||||||
$ devenv cglm.sln /Build Release
|
$ devenv cglm.sln /Build Release
|
||||||
|
|
||||||
Currently tests are not available on Windows.
|
Currently tests are not available on Windows.
|
||||||
|
|
||||||
|
Documentation (Sphinx):
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
**cglm** uses sphinx framework for documentation, it allows lot of formats for documentation. To see all options see sphinx build page:
|
||||||
|
|
||||||
|
https://www.sphinx-doc.org/en/master/man/sphinx-build.html
|
||||||
|
|
||||||
|
Example build:
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
:linenos:
|
||||||
|
|
||||||
|
$ cd cglm/docs
|
||||||
|
$ sphinx-build source build
|
||||||
|
|
||||||
|
|||||||
@@ -62,9 +62,9 @@ author = u'Recep Aslantas'
|
|||||||
# built documents.
|
# built documents.
|
||||||
#
|
#
|
||||||
# The short X.Y version.
|
# The short X.Y version.
|
||||||
version = u'0.5.2'
|
version = u'0.5.4'
|
||||||
# The full version, including alpha/beta/rc tags.
|
# The full version, including alpha/beta/rc tags.
|
||||||
release = u'0.5.2'
|
release = u'0.5.4'
|
||||||
|
|
||||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||||
# for a list of supported languages.
|
# for a list of supported languages.
|
||||||
@@ -90,7 +90,7 @@ todo_include_todos = False
|
|||||||
# The theme to use for HTML and HTML Help pages. See the documentation for
|
# The theme to use for HTML and HTML Help pages. See the documentation for
|
||||||
# a list of builtin themes.
|
# a list of builtin themes.
|
||||||
#
|
#
|
||||||
html_theme = 'alabaster'
|
html_theme = 'sphinx_rtd_theme'
|
||||||
|
|
||||||
# Theme options are theme-specific and customize the look and feel of a theme
|
# Theme options are theme-specific and customize the look and feel of a theme
|
||||||
# further. For a list of options available for each theme, see the
|
# further. For a list of options available for each theme, see the
|
||||||
@@ -99,13 +99,13 @@ html_theme = 'alabaster'
|
|||||||
# html_theme_options = {}
|
# html_theme_options = {}
|
||||||
|
|
||||||
html_theme_options = {
|
html_theme_options = {
|
||||||
'github_banner': 'true',
|
# 'github_banner': 'true',
|
||||||
'github_button': 'true',
|
# 'github_button': 'true',
|
||||||
'github_user': 'recp',
|
# 'github_user': 'recp',
|
||||||
'github_repo': 'cglm',
|
# 'github_repo': 'cglm',
|
||||||
'travis_button': 'true',
|
# 'travis_button': 'true',
|
||||||
'show_related': 'true',
|
# 'show_related': 'true',
|
||||||
'fixed_sidebar': 'true'
|
# 'fixed_sidebar': 'true'
|
||||||
}
|
}
|
||||||
|
|
||||||
# Add any paths that contain custom static files (such as style sheets) here,
|
# Add any paths that contain custom static files (such as style sheets) here,
|
||||||
|
|||||||
23
docs/source/features.rst
Normal file
23
docs/source/features.rst
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
Features
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
* general purpose matrix operations (mat4, mat3)
|
||||||
|
* chain matrix multiplication (square only)
|
||||||
|
* general purpose vector operations (cross, dot, rotate, proj, angle...)
|
||||||
|
* affine transforms
|
||||||
|
* matrix decomposition (extract rotation, scaling factor)
|
||||||
|
* optimized affine transform matrices (mul, rigid-body inverse)
|
||||||
|
* camera (lookat)
|
||||||
|
* projections (ortho, perspective)
|
||||||
|
* quaternions
|
||||||
|
* euler angles / yaw-pitch-roll to matrix
|
||||||
|
* extract euler angles
|
||||||
|
* inline or pre-compiled function call
|
||||||
|
* frustum (extract view frustum planes, corners...)
|
||||||
|
* bounding box (AABB in Frustum (culling), crop, merge...)
|
||||||
|
* bounding sphere
|
||||||
|
* project, unproject
|
||||||
|
* easing functions
|
||||||
|
* curves
|
||||||
|
* curve interpolation helpers (SMC, deCasteljau...)
|
||||||
|
* and other...
|
||||||
@@ -9,23 +9,26 @@ Types:
|
|||||||
.. code-block:: c
|
.. code-block:: c
|
||||||
:linenos:
|
:linenos:
|
||||||
|
|
||||||
typedef float vec3[3];
|
typedef float vec2[2];
|
||||||
typedef int ivec3[3];
|
typedef float vec3[3];
|
||||||
typedef CGLM_ALIGN(16) float vec4[4];
|
typedef int ivec3[3];
|
||||||
|
typedef CGLM_ALIGN_IF(16) float vec4[4];
|
||||||
|
typedef vec4 versor;
|
||||||
|
typedef vec3 mat3[3];
|
||||||
|
|
||||||
typedef vec3 mat3[3];
|
#ifdef __AVX__
|
||||||
typedef vec4 mat4[4];
|
typedef CGLM_ALIGN_IF(32) vec4 mat4[4];
|
||||||
|
#else
|
||||||
typedef vec4 versor;
|
typedef CGLM_ALIGN_IF(16) vec4 mat4[4];
|
||||||
|
#endif
|
||||||
|
|
||||||
As you can see types don't store extra informations in favor of space.
|
As you can see types don't store extra informations in favor of space.
|
||||||
You can send these values e.g. matrix to OpenGL directly without casting or calling a function like *value_ptr*
|
You can send these values e.g. matrix to OpenGL directly without casting or calling a function like *value_ptr*
|
||||||
|
|
||||||
Alignment is Required:
|
Alignment Is Required:
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
**vec4** and **mat4** requires 16 byte alignment because vec4 and mat4 operations are
|
**vec4** and **mat4** requires 16 (32 for **mat4** if AVX is enabled) byte alignment because **vec4** and **mat4** operations are vectorized by SIMD instructions (SSE/AVX/NEON).
|
||||||
vectorized by SIMD instructions (SSE/AVX).
|
|
||||||
|
|
||||||
**UPDATE:**
|
**UPDATE:**
|
||||||
By starting v0.4.5 cglm provides an option to disable alignment requirement, it is enabled as default
|
By starting v0.4.5 cglm provides an option to disable alignment requirement, it is enabled as default
|
||||||
@@ -37,10 +40,9 @@ vectorized by SIMD instructions (SSE/AVX).
|
|||||||
Allocations:
|
Allocations:
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
*cglm* doesn't alloc any memory on heap. So it doesn't provide any allocator.
|
*cglm* doesn't alloc any memory on heap. So it doesn't provide any allocator.
|
||||||
You must allocate memory yourself. You should alloc memory for out parameters too if you pass pointer of memory location.
|
You must allocate memory yourself. You should alloc memory for out parameters too if you pass pointer of memory location. When allocating memory, don't forget that **vec4** and **mat4** require alignment.
|
||||||
When allocating memory don't forget that **vec4** and **mat4** requires alignment.
|
|
||||||
|
|
||||||
**NOTE:** Unaligned vec4 and unaligned mat4 operations will be supported in the future. Check todo list.
|
**NOTE:** Unaligned **vec4** and unaligned **mat4** operations will be supported in the future. Check todo list.
|
||||||
Because you may want to multiply a CGLM matrix with external matrix.
|
Because you may want to multiply a CGLM matrix with external matrix.
|
||||||
There is no guarantee that non-CGLM matrix is aligned. Unaligned types will have *u* prefix e.g. **umat4**
|
There is no guarantee that non-CGLM matrix is aligned. Unaligned types will have *u* prefix e.g. **umat4**
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
You can adapt this file completely to your liking, but it should at least
|
You can adapt this file completely to your liking, but it should at least
|
||||||
contain the root `toctree` directive.
|
contain the root `toctree` directive.
|
||||||
|
|
||||||
Welcome to cglm's documentation!
|
cglm Documentation
|
||||||
================================
|
================================
|
||||||
|
|
||||||
**cglm** is optimized 3D math library written in C99 (compatible with C89).
|
**cglm** is optimized 3D math library written in C99 (compatible with C89).
|
||||||
@@ -14,33 +14,36 @@ is considered to be supported as optional.
|
|||||||
|
|
||||||
Also currently only **float** type is supported for most operations.
|
Also currently only **float** type is supported for most operations.
|
||||||
|
|
||||||
**Features**
|
|
||||||
|
|
||||||
* general purpose matrix operations (mat4, mat3)
|
|
||||||
* chain matrix multiplication (square only)
|
|
||||||
* general purpose vector operations (cross, dot, rotate, proj, angle...)
|
|
||||||
* affine transforms
|
|
||||||
* matrix decomposition (extract rotation, scaling factor)
|
|
||||||
* optimized affine transform matrices (mul, rigid-body inverse)
|
|
||||||
* camera (lookat)
|
|
||||||
* projections (ortho, perspective)
|
|
||||||
* quaternions
|
|
||||||
* euler angles / yaw-pitch-roll to matrix
|
|
||||||
* extract euler angles
|
|
||||||
* inline or pre-compiled function call
|
|
||||||
* frustum (extract view frustum planes, corners...)
|
|
||||||
* bounding box (AABB in Frustum (culling), crop, merge...)
|
|
||||||
|
|
||||||
|
|
||||||
.. toctree::
|
.. toctree::
|
||||||
:maxdepth: 1
|
:maxdepth: 2
|
||||||
:caption: Table Of Contents:
|
:caption: Getting Started:
|
||||||
|
|
||||||
|
features
|
||||||
build
|
build
|
||||||
getting_started
|
getting_started
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 2
|
||||||
|
:caption: How To:
|
||||||
|
|
||||||
opengl
|
opengl
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 2
|
||||||
|
:caption: API:
|
||||||
|
|
||||||
api
|
api
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 2
|
||||||
|
:caption: Options:
|
||||||
|
|
||||||
opt
|
opt
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 2
|
||||||
|
:caption: Troubleshooting:
|
||||||
|
|
||||||
troubleshooting
|
troubleshooting
|
||||||
|
|
||||||
Indices and tables
|
Indices and tables
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ Functions:
|
|||||||
1. :c:func:`glm_mat3_copy`
|
1. :c:func:`glm_mat3_copy`
|
||||||
#. :c:func:`glm_mat3_identity`
|
#. :c:func:`glm_mat3_identity`
|
||||||
#. :c:func:`glm_mat3_identity_array`
|
#. :c:func:`glm_mat3_identity_array`
|
||||||
|
#. :c:func:`glm_mat3_zero`
|
||||||
#. :c:func:`glm_mat3_mul`
|
#. :c:func:`glm_mat3_mul`
|
||||||
#. :c:func:`glm_mat3_transpose_to`
|
#. :c:func:`glm_mat3_transpose_to`
|
||||||
#. :c:func:`glm_mat3_transpose`
|
#. :c:func:`glm_mat3_transpose`
|
||||||
@@ -32,6 +33,7 @@ Functions:
|
|||||||
#. :c:func:`glm_mat3_trace`
|
#. :c:func:`glm_mat3_trace`
|
||||||
#. :c:func:`glm_mat3_swap_col`
|
#. :c:func:`glm_mat3_swap_col`
|
||||||
#. :c:func:`glm_mat3_swap_row`
|
#. :c:func:`glm_mat3_swap_row`
|
||||||
|
#. :c:func:`glm_mat3_rmc`
|
||||||
|
|
||||||
Functions documentation
|
Functions documentation
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
@@ -59,6 +61,13 @@ Functions documentation
|
|||||||
| *[in,out]* **mat** matrix array (must be aligned (16/32) if alignment is not disabled)
|
| *[in,out]* **mat** matrix array (must be aligned (16/32) if alignment is not disabled)
|
||||||
| *[in]* **count** count of matrices
|
| *[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)
|
.. c:function:: void glm_mat3_mul(mat3 m1, mat3 m2, mat3 dest)
|
||||||
|
|
||||||
multiply m1 and m2 to dest
|
multiply m1 and m2 to dest
|
||||||
@@ -161,3 +170,20 @@ Functions documentation
|
|||||||
| *[in, out]* **mat** matrix
|
| *[in, out]* **mat** matrix
|
||||||
| *[in]* **row1** row1
|
| *[in]* **row1** row1
|
||||||
| *[in]* **row2** row2
|
| *[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_copy`
|
||||||
#. :c:func:`glm_mat4_identity`
|
#. :c:func:`glm_mat4_identity`
|
||||||
#. :c:func:`glm_mat4_identity_array`
|
#. :c:func:`glm_mat4_identity_array`
|
||||||
|
#. :c:func:`glm_mat4_zero`
|
||||||
#. :c:func:`glm_mat4_pick3`
|
#. :c:func:`glm_mat4_pick3`
|
||||||
#. :c:func:`glm_mat4_pick3t`
|
#. :c:func:`glm_mat4_pick3t`
|
||||||
#. :c:func:`glm_mat4_ins3`
|
#. :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,out]* **mat** matrix array (must be aligned (16/32) if alignment is not disabled)
|
||||||
| *[in]* **count** count of matrices
|
| *[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)
|
.. c:function:: void glm_mat4_pick3(mat4 mat, mat3 dest)
|
||||||
|
|
||||||
copy upper-left of mat4 to mat3
|
copy upper-left of mat4 to mat3
|
||||||
@@ -278,7 +286,7 @@ Functions documentation
|
|||||||
|
|
||||||
| helper for R (row vector) * M (matrix) * C (column vector)
|
| 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)
|
| then Matrix1x4 * Vec4 (column vector) = Matrix1x1 (Scalar)
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
|
|||||||
@@ -43,9 +43,9 @@ array of matrices:
|
|||||||
/* ... */
|
/* ... */
|
||||||
glUniformMatrix4fv(location, count, GL_FALSE, (float *)matrix);
|
glUniformMatrix4fv(location, count, GL_FALSE, (float *)matrix);
|
||||||
|
|
||||||
in this way, passing aray of matrices is same
|
in this way, passing aray of matrices is same
|
||||||
|
|
||||||
Passing / Uniforming Vectors to OpenGL:¶
|
Passing / Uniforming Vectors to OpenGL:
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
You don't need to do extra thing when passing cglm vectors to OpengL or other APIs.
|
You don't need to do extra thing when passing cglm vectors to OpengL or other APIs.
|
||||||
|
|||||||
@@ -40,3 +40,13 @@ SSE and SSE2 Shuffle Option
|
|||||||
**_mm_shuffle_ps** generates **shufps** instruction even if registers are same.
|
**_mm_shuffle_ps** generates **shufps** instruction even if registers are same.
|
||||||
You can force it to generate **pshufd** instruction by defining
|
You can force it to generate **pshufd** instruction by defining
|
||||||
**CGLM_USE_INT_DOMAIN** macro. As default it is not defined.
|
**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.
|
||||||
|
|||||||
@@ -152,7 +152,7 @@ glm_inv_tr(mat4 mat) {
|
|||||||
glm_inv_tr_sse2(mat);
|
glm_inv_tr_sse2(mat);
|
||||||
#else
|
#else
|
||||||
CGLM_ALIGN_MAT mat3 r;
|
CGLM_ALIGN_MAT mat3 r;
|
||||||
CGLM_ALIGN(16) vec3 t;
|
CGLM_ALIGN(8) vec3 t;
|
||||||
|
|
||||||
/* rotate */
|
/* rotate */
|
||||||
glm_mat4_pick3t(mat, r);
|
glm_mat4_pick3t(mat, r);
|
||||||
|
|||||||
@@ -8,6 +8,8 @@
|
|||||||
#ifndef cglm_bezier_h
|
#ifndef cglm_bezier_h
|
||||||
#define cglm_bezier_h
|
#define cglm_bezier_h
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
|
||||||
#define GLM_BEZIER_MAT_INIT {{-1.0f, 3.0f, -3.0f, 1.0f}, \
|
#define GLM_BEZIER_MAT_INIT {{-1.0f, 3.0f, -3.0f, 1.0f}, \
|
||||||
{ 3.0f, -6.0f, 3.0f, 0.0f}, \
|
{ 3.0f, -6.0f, 3.0f, 0.0f}, \
|
||||||
{-3.0f, 3.0f, 0.0f, 0.0f}, \
|
{-3.0f, 3.0f, 0.0f, 0.0f}, \
|
||||||
|
|||||||
@@ -72,6 +72,10 @@ CGLM_EXPORT
|
|||||||
void
|
void
|
||||||
glmc_mat3_swap_row(mat3 mat, int row1, int row2);
|
glmc_mat3_swap_row(mat3 mat, int row1, int row2);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_mat3_rmc(vec3 r, mat3 m, vec3 c);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -84,7 +84,7 @@ glm_frustum(float left,
|
|||||||
mat4 dest) {
|
mat4 dest) {
|
||||||
float rl, tb, fn, nv;
|
float rl, tb, fn, nv;
|
||||||
|
|
||||||
glm__memzero(float, dest, sizeof(mat4));
|
glm_mat4_zero(dest);
|
||||||
|
|
||||||
rl = 1.0f / (right - left);
|
rl = 1.0f / (right - left);
|
||||||
tb = 1.0f / (top - bottom);
|
tb = 1.0f / (top - bottom);
|
||||||
@@ -122,7 +122,7 @@ glm_ortho(float left,
|
|||||||
mat4 dest) {
|
mat4 dest) {
|
||||||
float rl, tb, fn;
|
float rl, tb, fn;
|
||||||
|
|
||||||
glm__memzero(float, dest, sizeof(mat4));
|
glm_mat4_zero(dest);
|
||||||
|
|
||||||
rl = 1.0f / (right - left);
|
rl = 1.0f / (right - left);
|
||||||
tb = 1.0f / (top - bottom);
|
tb = 1.0f / (top - bottom);
|
||||||
@@ -259,7 +259,7 @@ glm_perspective(float fovy,
|
|||||||
mat4 dest) {
|
mat4 dest) {
|
||||||
float f, fn;
|
float f, fn;
|
||||||
|
|
||||||
glm__memzero(float, dest, sizeof(mat4));
|
glm_mat4_zero(dest);
|
||||||
|
|
||||||
f = 1.0f / tanf(fovy * 0.5f);
|
f = 1.0f / tanf(fovy * 0.5f);
|
||||||
fn = 1.0f / (nearVal - farVal);
|
fn = 1.0f / (nearVal - farVal);
|
||||||
|
|||||||
@@ -11,8 +11,10 @@
|
|||||||
#define _USE_MATH_DEFINES /* for windows */
|
#define _USE_MATH_DEFINES /* for windows */
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <stddef.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <float.h>
|
#include <float.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
#if defined(_MSC_VER)
|
#if defined(_MSC_VER)
|
||||||
# ifdef CGLM_DLL
|
# ifdef CGLM_DLL
|
||||||
@@ -26,34 +28,6 @@
|
|||||||
# define CGLM_INLINE static inline __attribute((always_inline))
|
# define CGLM_INLINE static inline __attribute((always_inline))
|
||||||
#endif
|
#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 "types.h"
|
||||||
#include "simd/intrin.h"
|
#include "simd/intrin.h"
|
||||||
|
|
||||||
|
|||||||
@@ -17,16 +17,19 @@
|
|||||||
CGLM_INLINE void glm_mat3_copy(mat3 mat, mat3 dest);
|
CGLM_INLINE void glm_mat3_copy(mat3 mat, mat3 dest);
|
||||||
CGLM_INLINE void glm_mat3_identity(mat3 mat);
|
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_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_mul(mat3 m1, mat3 m2, mat3 dest);
|
||||||
CGLM_INLINE void glm_mat3_transpose_to(mat3 m, 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_transpose(mat3 m);
|
||||||
CGLM_INLINE void glm_mat3_mulv(mat3 m, vec3 v, vec3 dest);
|
CGLM_INLINE void glm_mat3_mulv(mat3 m, vec3 v, vec3 dest);
|
||||||
CGLM_INLINE float glm_mat3_trace(mat3 m);
|
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 void glm_mat3_scale(mat3 m, float s);
|
||||||
CGLM_INLINE float glm_mat3_det(mat3 mat);
|
CGLM_INLINE float glm_mat3_det(mat3 mat);
|
||||||
CGLM_INLINE void glm_mat3_inv(mat3 mat, mat3 dest);
|
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_col(mat3 mat, int col1, int col2);
|
||||||
CGLM_INLINE void glm_mat3_swap_row(mat3 mat, int row1, int row2);
|
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
|
#ifndef cglm_mat3_h
|
||||||
@@ -63,7 +66,17 @@
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat3_copy(mat3 mat, mat3 dest) {
|
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
|
* @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];
|
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 */
|
#endif /* cglm_mat3_h */
|
||||||
|
|||||||
@@ -22,6 +22,7 @@
|
|||||||
CGLM_INLINE void glm_mat4_copy(mat4 mat, mat4 dest);
|
CGLM_INLINE void glm_mat4_copy(mat4 mat, mat4 dest);
|
||||||
CGLM_INLINE void glm_mat4_identity(mat4 mat);
|
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_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_pick3(mat4 mat, mat3 dest);
|
||||||
CGLM_INLINE void glm_mat4_pick3t(mat4 mat, mat3 dest);
|
CGLM_INLINE void glm_mat4_pick3t(mat4 mat, mat3 dest);
|
||||||
CGLM_INLINE void glm_mat4_ins3(mat3 mat, mat4 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 void glm_mat4_mulv3(mat4 m, vec3 v, vec3 dest);
|
||||||
CGLM_INLINE float glm_mat4_trace(mat4 m);
|
CGLM_INLINE float glm_mat4_trace(mat4 m);
|
||||||
CGLM_INLINE float glm_mat4_trace3(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_to(mat4 m, mat4 dest);
|
||||||
CGLM_INLINE void glm_mat4_transpose(mat4 m);
|
CGLM_INLINE void glm_mat4_transpose(mat4 m);
|
||||||
CGLM_INLINE void glm_mat4_scale_p(mat4 m, float s);
|
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_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_col(mat4 mat, int col1, int col2);
|
||||||
CGLM_INLINE void glm_mat4_swap_row(mat4 mat, int row1, int row2);
|
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
|
#ifndef cglm_mat_h
|
||||||
@@ -98,7 +101,15 @@
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat4_ucopy(mat4 mat, mat4 dest) {
|
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
|
* @brief copy upper-left of mat4 to mat3
|
||||||
*
|
*
|
||||||
@@ -474,10 +497,8 @@ glm_mat4_transpose(mat4 m) {
|
|||||||
glm_mat4_transp_sse2(m, m);
|
glm_mat4_transp_sse2(m, m);
|
||||||
#else
|
#else
|
||||||
mat4 d;
|
mat4 d;
|
||||||
|
|
||||||
glm_mat4_transpose_to(m, d);
|
glm_mat4_transpose_to(m, d);
|
||||||
|
glm_mat4_ucopy(d, m);
|
||||||
glm__memcpy(float, m, d, sizeof(mat4));
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -682,7 +703,7 @@ glm_mat4_swap_row(mat4 mat, int row1, int row2) {
|
|||||||
*
|
*
|
||||||
* rmc stands for Row * Matrix * Column
|
* 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)
|
* then Matrix1x4 * Vec4 (column vector) = Matrix1x1 (Scalar)
|
||||||
*
|
*
|
||||||
* @param[in] r row vector or matrix1x4
|
* @param[in] r row vector or matrix1x4
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
#ifndef cglm_project_h
|
#ifndef cglm_project_h
|
||||||
#define cglm_project_h
|
#define cglm_project_h
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
#include "vec3.h"
|
#include "vec3.h"
|
||||||
#include "vec4.h"
|
#include "vec4.h"
|
||||||
#include "mat4.h"
|
#include "mat4.h"
|
||||||
|
|||||||
@@ -19,7 +19,6 @@
|
|||||||
#define cglm_util_h
|
#define cglm_util_h
|
||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include <stdbool.h>
|
|
||||||
|
|
||||||
#define GLM_MIN(X, Y) (((X) < (Y)) ? (X) : (Y))
|
#define GLM_MIN(X, Y) (((X) < (Y)) ? (X) : (Y))
|
||||||
#define GLM_MAX(X, Y) (((X) > (Y)) ? (X) : (Y))
|
#define GLM_MAX(X, Y) (((X) > (Y)) ? (X) : (Y))
|
||||||
|
|||||||
@@ -31,9 +31,6 @@
|
|||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include <stdbool.h>
|
|
||||||
#include <math.h>
|
|
||||||
#include <float.h>
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief fill a vector with specified value
|
* @brief fill a vector with specified value
|
||||||
|
|||||||
@@ -428,8 +428,8 @@ glm_vec3_maxadd(vec3 a, vec3 b, vec3 dest) {
|
|||||||
*
|
*
|
||||||
* it applies += operator so dest must be initialized
|
* it applies += operator so dest must be initialized
|
||||||
*
|
*
|
||||||
* @param[in] a vector
|
* @param[in] a vector 1
|
||||||
* @param[in] b scalar
|
* @param[in] b vector 2
|
||||||
* @param[out] dest dest += min(a, b)
|
* @param[out] dest dest += min(a, b)
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
|
|||||||
@@ -31,9 +31,6 @@
|
|||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "vec3-ext.h"
|
#include "vec3-ext.h"
|
||||||
#include <stdbool.h>
|
|
||||||
#include <math.h>
|
|
||||||
#include <float.h>
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief fill a vector with specified value
|
* @brief fill a vector with specified value
|
||||||
|
|||||||
@@ -576,8 +576,8 @@ glm_vec4_maxadd(vec4 a, vec4 b, vec4 dest) {
|
|||||||
*
|
*
|
||||||
* it applies += operator so dest must be initialized
|
* it applies += operator so dest must be initialized
|
||||||
*
|
*
|
||||||
* @param[in] a vector
|
* @param[in] a vector 1
|
||||||
* @param[in] b scalar
|
* @param[in] b vector 2
|
||||||
* @param[out] dest dest += min(a, b)
|
* @param[out] dest dest += min(a, b)
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
@@ -690,18 +690,9 @@ CGLM_INLINE
|
|||||||
float
|
float
|
||||||
glm_vec4_distance(vec4 a, vec4 b) {
|
glm_vec4_distance(vec4 a, vec4 b) {
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
__m128 x0;
|
return glmm_norm(_mm_sub_ps(glmm_load(b), glmm_load(a)));
|
||||||
x0 = _mm_sub_ps(glmm_load(b), glmm_load(a));
|
|
||||||
x0 = _mm_mul_ps(x0, x0);
|
|
||||||
x0 = _mm_add_ps(x0, glmm_shuff1(x0, 1, 0, 3, 2));
|
|
||||||
return _mm_cvtss_f32(_mm_sqrt_ss(_mm_add_ss(x0,
|
|
||||||
glmm_shuff1(x0, 0, 1, 0, 1))));
|
|
||||||
#elif defined(CGLM_NEON_FP)
|
#elif defined(CGLM_NEON_FP)
|
||||||
float32x4_t v0;
|
return glmm_norm(vsubq_f32(glmm_load(a), glmm_load(b)));
|
||||||
float32_t r;
|
|
||||||
v0 = vsubq_f32(vld1q_f32(a), vld1q_f32(b));
|
|
||||||
r = vaddvq_f32(vmulq_f32(v0, v0));
|
|
||||||
return sqrtf(r);
|
|
||||||
#else
|
#else
|
||||||
return sqrtf(glm_pow2(b[0] - a[0])
|
return sqrtf(glm_pow2(b[0] - a[0])
|
||||||
+ glm_pow2(b[1] - a[1])
|
+ glm_pow2(b[1] - a[1])
|
||||||
|
|||||||
@@ -10,6 +10,6 @@
|
|||||||
|
|
||||||
#define CGLM_VERSION_MAJOR 0
|
#define CGLM_VERSION_MAJOR 0
|
||||||
#define CGLM_VERSION_MINOR 5
|
#define CGLM_VERSION_MINOR 5
|
||||||
#define CGLM_VERSION_PATCH 2
|
#define CGLM_VERSION_PATCH 4
|
||||||
|
|
||||||
#endif /* cglm_version_h */
|
#endif /* cglm_version_h */
|
||||||
|
|||||||
@@ -8,12 +8,17 @@
|
|||||||
|
|
||||||
cd $(dirname "$0")
|
cd $(dirname "$0")
|
||||||
|
|
||||||
mkdir -p .libs
|
mkdir -p "$(pwd)/.libs"
|
||||||
|
|
||||||
|
libmocka_folder=$(pwd)/test/lib/cmocka/build/src/
|
||||||
|
|
||||||
if [ "$(uname)" = "Darwin" ]; then
|
if [ "$(uname)" = "Darwin" ]; then
|
||||||
ln -sf $(pwd)/test/lib/cmocka/build/src/libcmocka.0.dylib \
|
libcmocka=libcmocka.0.dylib
|
||||||
.libs/libcmocka.0.dylib;
|
|
||||||
else
|
else
|
||||||
ln -sf $(pwd)/test/lib/cmocka/build/src/libcmocka.so.0 \
|
libcmocka=libcmocka.so.0
|
||||||
.libs/libcmocka.so.0;
|
fi
|
||||||
|
|
||||||
|
libcmocka_path="$libmocka_folder$libcmocka"
|
||||||
|
if [ -f "$libcmocka_path" ]; then
|
||||||
|
ln -sf "$libcmocka_path" "$(pwd)/.libs/$libcmocka";
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -91,3 +91,9 @@ void
|
|||||||
glmc_mat3_swap_row(mat3 mat, int row1, int row2) {
|
glmc_mat3_swap_row(mat3 mat, int row1, int row2) {
|
||||||
glm_mat3_swap_row(mat, row1, 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);
|
||||||
|
}
|
||||||
|
|||||||
@@ -51,8 +51,8 @@ test_bezier(void **state) {
|
|||||||
Bs_plain = test_bezier_plain(s, p0, c0, c1, p1);
|
Bs_plain = test_bezier_plain(s, p0, c0, c1, p1);
|
||||||
|
|
||||||
assert_true(glm_eq(Bs, Bs_plain));
|
assert_true(glm_eq(Bs, Bs_plain));
|
||||||
assert_true(glm_eq(smc, Bs_plain));
|
test_assert_eqf(smc, Bs_plain);
|
||||||
assert_true(glm_eq(Bs, smc));
|
test_assert_eqf(Bs, smc);
|
||||||
|
|
||||||
/* test cubic hermite */
|
/* test cubic hermite */
|
||||||
smc = glm_smc(s, GLM_HERMITE_MAT, (vec4){p0, p1, c0, c1});
|
smc = glm_smc(s, GLM_HERMITE_MAT, (vec4){p0, p1, c0, c1});
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
#include "test_common.h"
|
#include "test_common.h"
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
#define m 4
|
#define m 4
|
||||||
#define n 4
|
#define n 4
|
||||||
|
|||||||
@@ -93,6 +93,13 @@ test_vec4(void **state) {
|
|||||||
/* 3. test SIMD norm2 */
|
/* 3. test SIMD norm2 */
|
||||||
test_rand_vec4(v);
|
test_rand_vec4(v);
|
||||||
test_assert_eqf(test_vec4_norm2(v), glm_vec4_norm2(v));
|
test_assert_eqf(test_vec4_norm2(v), glm_vec4_norm2(v));
|
||||||
|
|
||||||
|
/* 4. test SSE/SIMD distance */
|
||||||
|
test_rand_vec4(v1);
|
||||||
|
test_rand_vec4(v2);
|
||||||
|
d1 = glm_vec4_distance(v1, v2);
|
||||||
|
d2 = sqrtf(powf(v1[0]-v2[0], 2.0f) + pow(v1[1]-v2[1], 2.0f) + pow(v1[2]-v2[2], 2.0f) + pow(v1[3]-v2[3], 2.0f));
|
||||||
|
assert_true(fabsf(d1 - d2) <= 0.000009);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* test zero */
|
/* test zero */
|
||||||
|
|||||||
Reference in New Issue
Block a user