Compare commits

...

31 Commits

Author SHA1 Message Date
Recep Aslantas
63e60f46f3 Merge pull request #88 from yushli/master
Update quat.h
2019-04-30 10:20:26 +03:00
Recep Aslantas
f28260e20b Merge branch 'master' into master 2019-04-30 10:16:55 +03:00
yushli
d232ab7865 Update quat.h
fix typo
2019-04-30 14:47:20 +08:00
Recep Aslantas
e3b52100e3 Merge pull request #87 from recp/revert-86-const
Revert "mark readonly parameters as const"
2019-04-30 09:40:30 +03:00
Recep Aslantas
bb8ff25752 Revert "mark readonly parameters as const" 2019-04-30 08:19:07 +03:00
Recep Aslantas
98244da67f Merge pull request #86 from recp/const
mark readonly parameters as const
2019-04-29 17:58:51 +03:00
Recep Aslantas
14f06a262f Merge branch 'master' into const 2019-04-28 21:55:23 +03:00
Recep Aslantas
392565f920 mark readonly parameters as const (continue) 2019-04-28 21:48:19 +03:00
Recep Aslantas
120ae9ae99 buil: fix linking cmocka 2019-04-28 19:43:58 +03:00
Recep Aslantas
a5f1ed32af build: don't link libcmocka if not exists 2019-04-28 19:24:09 +03:00
Recep Aslantas
010e887946 build: don't link libcmocka if not exists 2019-04-28 19:21:13 +03:00
Recep Aslantas
6e501ef1f6 build: don't link libcmocka if not exists 2019-04-28 19:15:55 +03:00
Recep Aslantas
6ed275734b mark readonly parameters as const 2019-04-28 12:15:43 +03:00
Recep Aslantas
85ca81ce79 Merge pull request #84 from haxpor/fix_82
Resolve vec4 : glm_vec4_distance() to satisfy compiling on armv7
2019-04-27 10:09:44 +03:00
Recep Aslantas
e909c8268d Merge branch 'master' into fix_82 2019-04-27 09:37:08 +03:00
Recep Aslantas
73e6b65da0 test: fix comparing floats in bezier tests 2019-04-27 09:36:15 +03:00
Recep Aslantas
ecbe36df6b Merge branch 'master' into fix_82 2019-04-21 00:24:52 +03:00
Recep Aslantas
d85b5234a9 ci: print test logs after failure 2019-04-21 00:19:17 +03:00
Wasin Thonkaew
5b80e0e3c2 test cases for glm_vec4_distance 2019-04-19 03:04:00 +08:00
Wasin Thonkaew
461a4009ba refactor vec4 : glm_vec4_distance for SSE/SSE2
According to suggestion by recp at
https://github.com/recp/cglm/issues/82#issuecomment-483051704.
2019-04-19 02:07:57 +08:00
Wasin Thonkaew
8f2f2c5572 Fix to use armv7 compatible function for glm_vec4_distance
Before it used armv8 only function thus it leads to build failed for
Android with target of armv7 i.e. armeabi-v7a. This fixed that issue.
2019-04-19 01:47:50 +08:00
Recep Aslantas
81a74ba225 move 'stdbool.h' to common header, add missing common.h header to public headers 2019-03-31 18:58:20 +03:00
Recep Aslantas
6c0c5167b0 docs: fix some parameter docs 2019-03-31 18:53:31 +03:00
Alejandro Coto Gutiérrez
4c5451994f Include stddef.h to ensure size_t and other dependent types (#79) 2019-03-29 08:54:09 +03:00
Wasin Thonkaew
73226bd2fd Fulfill #76 (#77)
* Fulfill #76
2019-03-20 09:32:31 +03:00
Recep Aslantas
8fa21a1837 docs: use sphinx_rtd_theme theme dor documentation 2019-03-17 09:33:38 +03:00
Recep Aslantas
ee1937f28d now working on v0.5.4 2019-03-17 09:29:36 +03:00
Recep Aslantas
b4efcefe7f drop glm__memcpy, glm__memset and glm__memzero
* implement mat3_zero and mat4_zero functions
* copy matrix items manually in ucopy functions
2019-02-13 10:14:53 +03:00
Recep Aslantas
0d2e5a996a docs: add SSE3 and SSE4 dot product options 2019-02-13 10:13:06 +03:00
Recep Aslantas
2b1eece9ac mat3: add rmc for mat3 2019-02-13 10:12:49 +03:00
Recep Aslantas
c8b8f4f6f0 now working on v0.5.3 2019-02-13 10:00:57 +03:00
31 changed files with 268 additions and 125 deletions

View File

@@ -57,3 +57,6 @@ after_success:
--gcov-options '\-lp' --gcov-options '\-lp'
--verbose; --verbose;
fi fi
after_failure:
- cat ./test-suite.log

View File

@@ -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])

View File

@@ -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

View File

@@ -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
View 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...

View File

@@ -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**

View File

@@ -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

View File

@@ -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

View File

@@ -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:

View File

@@ -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.

View File

@@ -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.

View File

@@ -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);

View File

@@ -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}, \

View File

@@ -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

View File

@@ -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);

View File

@@ -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"

View File

@@ -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 */

View File

@@ -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

View File

@@ -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"

View File

@@ -233,7 +233,7 @@ glm_quat_normalize_to(versor q, versor dest) {
dot = glm_vec4_norm2(q); dot = glm_vec4_norm2(q);
if (dot <= 0.0f) { if (dot <= 0.0f) {
glm_quat_identity(q); glm_quat_identity(dest);
return; return;
} }

View File

@@ -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))

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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])

View File

@@ -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 */

View File

@@ -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

View File

@@ -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);
}

View File

@@ -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});

View File

@@ -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

View File

@@ -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 */