Compare commits

..

36 Commits

Author SHA1 Message Date
Recep Aslantas
6183b213e2 suppress sign conversion warnings 2023-06-12 13:56:49 +03:00
Recep Aslantas
768d36f4b6 suppress some warnings on tests 2023-06-12 13:15:47 +03:00
Recep Aslantas
2c39193016 Merge pull request #309 from recp/anonymous-structs-check
Add Enhanced Support for Anonymous Structs
2023-06-10 20:40:26 +03:00
Recep Aslantas
16fcaf7fc0 Update types-struct.h 2023-06-08 06:28:40 +03:00
Recep Aslantas
530ec2d0f8 reduce glms_mat[4|3|2]_make()'s dest parameter
the return value is the dest.
2023-05-16 14:26:11 +03:00
Recep Aslantas
56d9e41465 Merge pull request #303 from EasyIP2023/bug/test-runner
io: fix test runner.c implicit declaration glm_arch_print
2023-05-15 21:33:05 +03:00
Recep Aslantas
610788bed1 Merge branch 'master' into bug/test-runner 2023-05-15 21:32:51 +03:00
Vincent Davis Jr
2d6538ecec io: fix test runner.c implicit declaration glm_arch_print
Problem:

../test/runner.c:29:3: error: implicit declaration of function
‘glm_arch_print’ [-Werror=implicit-function-declaration]
   29 |   glm_arch_print(stderr);
      |   ^~~~~~~~~~~~~~
      |   glm_vec2_print

glm_arch_print is not available unless you add the DEBUG macro.

Signed-off-by: Vincent Davis Jr <vince@underview.tech>
2023-05-15 11:30:13 -05:00
Recep Aslantas
0de379c632 Merge pull request #300 from EasyIP2023/feature/update-readme-meson-build
README: update meson option for running test
2023-05-15 14:57:09 +03:00
Recep Aslantas
31cbd41e3b Merge pull request #302 from EasyIP2023/feature/glm_mat3_make
mat3: add new function glm_mat3_make
2023-05-15 11:18:41 +03:00
Recep Aslantas
c691bc5bc0 Merge pull request #301 from EasyIP2023/feature/glm_mat2_make
mat2: add new function glm_mat2_make
2023-05-15 11:18:27 +03:00
Recep Aslantas
7346e91574 Merge pull request #299 from EasyIP2023/feature/glm_mat4_make
mat4: add new function glm_mat4_make
2023-05-15 11:15:34 +03:00
Vincent Davis Jr
0566a040c0 mat3: add new function glm_mat3_make
Function takes in a 9 element float array
and converts it into a mat3 matrix.

Signed-off-by: Vincent Davis Jr <vince@underview.tech>
2023-05-14 20:56:25 -05:00
Vincent Davis Jr
e6681e78c8 mat2: add new function glm_mat2_make
Function takes in a 4 element float array
and converts it into a mat2 matrix.

Signed-off-by: Vincent Davis Jr <vince@underview.tech>
2023-05-14 20:30:36 -05:00
Vincent Davis Jr
e17f115f91 mat4: add new function glm_mat4_make
Function takes in a 16 element float array
and converts it into a mat4 matrix.

Signed-off-by: Vincent Davis Jr <vince@underview.tech>
2023-05-14 20:10:48 -05:00
Vincent Davis Jr
2631d3b5ea README: update meson option for running test
Running on an already built build directory

meson configure -Denable_tests=true build/

Leads to

ERROR: Unknown options: "enable_tests"

Seems the meson option was updated

Signed-off-by: Vincent Davis Jr <vince@underview.tech>
2023-05-14 19:38:58 -05:00
Recep Aslantas
9772948831 improve printing arch name in tests 2023-05-06 16:28:52 +03:00
Recep Aslantas
988dd13d61 make GLM_TESTS_NO_COLORFUL_OUTPUT work on non-test print colors too 2023-05-06 15:36:41 +03:00
Recep Aslantas
ed09fb5819 fix glm_arch_print_name and print it on tests 2023-05-06 14:58:45 +03:00
Recep Aslantas
c4a348ac71 now working on v0.9.1 2023-05-02 08:22:18 +03:00
Recep Aslantas
7e9d2aa6a4 Merge pull request #295 from myfreeer/patch-1
README: add build docs for WebAssembly
2023-05-02 08:19:25 +03:00
myfreeer
091102e2c1 README: add build docs for WebAssembly
See alse https://github.com/recp/cglm/discussions/282#discussioncomment-5770919
2023-05-02 13:07:59 +08:00
Recep Aslantas
50b1c189b1 update docs 2023-05-01 23:03:19 +03:00
Recep Aslantas
44268d24f9 Merge pull request #293 from recp/fix-simd-signmask
Fix simd signmask
2023-04-22 23:53:50 +03:00
Recep Aslantas
65fd77d255 Merge branch 'master' into fix-simd-signmask 2023-04-22 23:53:20 +03:00
Recep Aslantas
5883ed3495 Merge pull request #292 from myfreeer/fix-simd-signmask-wasm
wasm: replace usage of -0.f to 0x80000000
2023-04-22 10:11:46 +03:00
Recep Aslantas
e2e923554b Merge pull request #291 from recp/fix-simd-signmask
simd, sse: use 0x80000000 insteaf of -0.f to fix fastmath on msvc
2023-04-22 10:11:17 +03:00
myfreeer
6b2c91ecf7 wasm: replace usage of -0.f to 0x80000000
Part of https://github.com/recp/cglm/pull/291
2023-04-22 10:50:54 +08:00
Recep Aslantas
a4b8778be9 fixes for "simd, sse: use 0x80000000 insteaf of -0.f to fix fastmath on msvc" 2023-04-21 22:42:04 +03:00
Recep Aslantas
5ce7dff812 Merge remote-tracking branch 'origin/master' into fix-simd-signmask 2023-04-21 22:31:55 +03:00
Recep Aslantas
13036036c4 fix existing tests build 2023-04-21 22:29:55 +03:00
Recep Aslantas
c1ff76d3b1 fix existing tests build 2023-04-21 22:15:04 +03:00
Recep Aslantas
17b3911e7c fix struct api calls 2023-04-21 21:20:11 +03:00
Recep Aslantas
7307b1cbbe simd, sse: use 0x80000000 insteaf of -0.f to fix fastmath on msvc 2023-04-21 20:36:50 +03:00
Recep Aslantas
391d8670c2 simd, sse: use 0x80000000 insteaf of -0.f to fix fastmath on msvc 2023-04-21 20:14:58 +03:00
Recep Aslantas
8d441902c0 fix struct api calls 2023-04-21 20:07:14 +03:00
69 changed files with 813 additions and 304 deletions

View File

@@ -1,6 +1,6 @@
cmake_minimum_required(VERSION 3.8.2) cmake_minimum_required(VERSION 3.8.2)
project(cglm project(cglm
VERSION 0.9.0 VERSION 0.9.1
HOMEPAGE_URL https://github.com/recp/cglm HOMEPAGE_URL https://github.com/recp/cglm
DESCRIPTION "OpenGL Mathematics (glm) for C" DESCRIPTION "OpenGL Mathematics (glm) for C"
LANGUAGES C LANGUAGES C

View File

@@ -243,11 +243,6 @@ test_tests_SOURCES=\
test/runner.c \ test/runner.c \
test/src/test_common.c \ test/src/test_common.c \
test/src/tests.c \ test/src/tests.c \
test/src/test_cam.c \
test/src/test_cam_lh_zo.c \
test/src/test_cam_rh_zo.c \
test/src/test_cam_lh_no.c \
test/src/test_cam_rh_no.c \
test/src/test_clamp.c \ test/src/test_clamp.c \
test/src/test_euler.c \ test/src/test_euler.c \
test/src/test_bezier.c \ test/src/test_bezier.c \

View File

@@ -242,6 +242,38 @@ add_subdirectory(external/cglm/)
# or you can use find_package to configure cglm # or you can use find_package to configure cglm
``` ```
#### Use CMake to build for WebAssembly
Since math functions like `sinf` is used, this can not be targeted at `wasm32-unknown-unknown`, one of [wasi-sdk](https://github.com/WebAssembly/wasi-sdk) or [emscripten](https://github.com/emscripten-core/emsdk) should be used.
Should note that shared build is not yet supported for WebAssembly.
For [simd128](https://github.com/WebAssembly/simd) support, add `-msimd128` to `CMAKE_C_FLAGS`, in command line `-DCMAKE_C_FLAGS="-msimd128"`.
For tests, the cmake option `CGLM_USE_TEST` would still work, you'll need a wasi runtime for running tests, see our [ci config file](.github/workflows/cmake-wasm.yml) for a detailed example.
##### Use CMake and WASI SDK to build for WebAssembly
```bash
$ cmake .. \
-DCMAKE_TOOLCHAIN_FILE=/path/to/wasi-sdk-19.0/share/cmake/wasi-sdk.cmake \
-DWASI_SDK_PREFIX=/path/to/wasi-sdk-19.0
```
Where `/path/to/wasi-sdk-19.0/` is the path to extracted [wasi sdk](https://github.com/WebAssembly/wasi-sdk).
In this case it would by default make a static build.
##### Use CMake and Emscripten SDK to build for WebAssembly
```bash
$ emcmake cmake .. \
-DCMAKE_EXE_LINKER_FLAGS="-s STANDALONE_WASM" \
-DCGLM_STATIC=ON
```
The `emcmake` here is the cmake wrapper for Emscripten from installed [emsdk](https://github.com/emscripten-core/emsdk).
### Meson (All platforms) ### Meson (All platforms)
```bash ```bash
@@ -257,7 +289,7 @@ $ sudo ninja install # [Optional]
c_std=c11 c_std=c11
buildtype=release buildtype=release
default_library=shared default_library=shared
enable_tests=false # to run tests: ninja test build_tests=true # to run tests: ninja test
``` ```
#### Use with your Meson project #### Use with your Meson project
* Example: * Example:

View File

@@ -2,7 +2,7 @@ Pod::Spec.new do |s|
# Description # Description
s.name = "cglm" s.name = "cglm"
s.version = "0.8.9" s.version = "0.9.0"
s.summary = "📽 Highly Optimized Graphics Math (glm) for C" s.summary = "📽 Highly Optimized Graphics Math (glm) for C"
s.description = <<-DESC s.description = <<-DESC
cglm is math library for graphics programming for C. See the documentation or README for all features. cglm is math library for graphics programming for C. See the documentation or README for all features.

View File

@@ -7,7 +7,7 @@
#***************************************************************************** #*****************************************************************************
AC_PREREQ([2.69]) AC_PREREQ([2.69])
AC_INIT([cglm], [0.9.0], [info@recp.me]) AC_INIT([cglm], [0.9.1], [info@recp.me])
AM_INIT_AUTOMAKE([-Wall -Werror foreign subdir-objects serial-tests]) AM_INIT_AUTOMAKE([-Wall -Werror foreign subdir-objects serial-tests])
# Don't use the default cflags (-O2 -g), we set ours manually in Makefile.am. # Don't use the default cflags (-O2 -g), we set ours manually in Makefile.am.

View File

@@ -1,59 +1,28 @@
API documentation 📚 API documentation
================================ ================================
Some functions may exist twice, **cglm** provides a few APIs for similar functions.
once for their namespace and once for global namespace
to make easier to write very common functions
For instance, in general we use :code:`glm_vec3_dot` to get dot product * 📦 **Inline API**: All functions are inline. You can include **cglm/cglm.h** header
of two **vec3**. Now we can also do this with :code:`glm_dot`, to use this API. This is the default API. `glm_` is namespace/prefix for this API.
same for *_cross* and so on... * 📦 **Call API**: All functions are not inline. You need to build *cglm* and link it
to your project. You can include **cglm/call.h** header to use this API. `glmc_` is namespace/prefix for this API.
The original function stays where it is, the function in global namespace And also there are also sub categories:
of same name is just an alias, so there is no call version of those functions.
e.g there is no func like :code:`glmc_dot` because *glm_dot* is just alias for
:code:`glm_vec3_dot`
By including **cglm/cglm.h** header you will include all inline version * 📦 **Array API**: Types are raw arrays and functions takes array as argument. You can include **cglm/cglm.h** header
of functions. Since functions in this header[s] are inline you don't need to to use this API. This is the default API. `glm_` is namespace/prefix for this API.
build or link *cglm* against your project. * 📦 **Struct API**: Types are union/struct and functions takes struct as argument and return structs if needed. You can include **cglm/struct.h** header
to use this API. This also includes **cglm/cglm.h** header.`glms_` is namespace/prefix for this API but your can omit or change it, see struct api docs.
* 📦 **SIMD API**: SIMD functions and helpers. `glmm_` is namespace/prefix for this API.
But by including **cglm/call.h** header you will include all *non-inline* 📌 Since struct api and call api are built top of inline array api, follow inline array api docs for individual functions.
version of functions. You need to build *cglm* and link it.
Follow the :doc:`build` documentation for this
.. toctree:: .. toctree::
:maxdepth: 1 :maxdepth: 1
:caption: API categories: :caption: API documentations:
affine api_inline_array
affine-mat api_struct
affine2d api_call
cam api_simd
frustum
box
quat
euler
mat2
mat3
mat4
vec2
vec2-ext
vec3
vec3-ext
vec4
vec4-ext
ivec2
ivec3
ivec4
color
plane
project
util
io
call
sphere
curve
bezier
version
ray

11
docs/source/api_call.rst Normal file
View File

@@ -0,0 +1,11 @@
Call API
================================
Call API is pre-built API for making calls from library. It is built on top of the array api. **glmc_** is the namespace for the call api.
**c** stands for call.
You need to built cglm to use call api. See build instructions (:doc:`build`) for more details.
The functions except namespace **glmc_** are same as inline api. See ( :doc:`api_inline_array` ) for more details.
📌 In the future we can define option to forward inline functions or struct api to call api.

View File

@@ -0,0 +1,70 @@
Array API - Inline (Default)
========================================
This is the default API of *cglm*. All functions are forced to be inlined
and struct api, call api uses this inline api to share implementation.
📌 Call api is also array api but it is not inlined.
In the future there may be option to forward struct api to call api instead of inline api to reduce binary size if needed.
📌 **USE this API docs for similar functions in struct and call api**
📌 In struct api you can omit namespace e.g :code:`glms_vec3_dot` can be called as :code:`vec3_dot` in struct api, see :doc:`struct-api` to configure struct api for more details.
📌 In struct api functions can return struct/union
📌 In struct api you can access items like **.x**, **.y**, **.z**, **.w**, **.r**, **.g**, **.b**, **.a**, **.m00**, **m01**...
Some functions may exist twice, once for their namespace and once for global namespace
to make easier to write very common functions
For instance, in general we use :code:`glm_vec3_dot` to get dot product
of two **vec3**. Now we can also do this with :code:`glm_dot`,
same for *_cross* and so on...
The original function stays where it is, the function in global namespace
of same name is just an alias, so there is no call version of those functions.
e.g there is no func like :code:`glmc_dot` because *glm_dot* is just alias for
:code:`glm_vec3_dot`
By including **cglm/cglm.h** header you will include all inline version
of functions. Since functions in this header[s] are inline you don't need to
build or link *cglm* against your project.
But by including **cglm/call.h** header you will include all *non-inline*
version of functions. You need to build *cglm* and link it.
Follow the :doc:`build` documentation for this
.. toctree::
:maxdepth: 1
:caption: API categories:
affine
affine-mat
affine2d
cam
frustum
box
quat
euler
mat2
mat3
mat4
vec2
vec2-ext
vec3
vec3-ext
vec4
vec4-ext
ivec2
ivec3
ivec4
color
plane
project
util
io
call
sphere
curve
bezier
version
ray

12
docs/source/api_simd.rst Normal file
View File

@@ -0,0 +1,12 @@
SIMD API
================================
SIMD api is special api for SIMD operations. **glmm_** prefix is used for SIMD operations in cglm. It is used in many places in cglm.
You can use it for your own SIMD operations too. In the future the api may be extended by time.
Supported SIMD architectures ( may vary by time )
* SSE / SSE2
* AVX
* NEON
* WASM 128

View File

@@ -0,0 +1,98 @@
Struct API
================================
Struct API is alternative API to array api to use **cglm** with improved type safety and easy to use.
Since struct api is built top of array api, every struct API is not documented here.
See array api documentation for more information for individual functions.
By default struct api adds `s` suffix to every type name e.g. vec3s, mat4s, versors etc.
Also struct api `s` suffix to namespace e.g. `glms_vec3_add`, `glms_mat4_mul` etc.
By starting v0.9.0, struct api namespace is configurable. We can omit **glms_** namespace or
even change it with custom name to move existing api integrations to **cglm** more easliy...
We can also add **s** to functin names if we want e.g. `glms_vec3_add()` -> `vec3_add()` or `vec3s_add()`.
By including **cglm/struct.h** header you will include all struct api. It will also include **cglm/cglm.h** too.
Since struct apis are inline you don't need to build or link *cglm* against
your project unless if you want to use pre-built call-api too.
Struct API is built top of array api. So you can mix them.
Use **.raw** union member to access raw array data to use it with array api.
Unlike array api ([0], [1], [0][0] ...), it is also possible to use struct api
with **.x**, **.y**, **.z**, **.w**, **.r**, **.g**, **.b**, **.a**, **.m00**, **m01**...
accessors to access individual elements/properties of vectors and matrices.
Struct API usage:
-----------------
.. code-block:: c
#include <cglm/struct.h>
mat4s m1 = glms_mat4_identity(); /* init... */
mat4s m2 = glms_mat4_identity(); /* init... */
mat4s m3 = glms_mat4_mul(glms_mat4_mul(m1, m2), glms_mat4_mul(m3, m4));
vec3s v1 = { 1.0f, 0.0f, 0.0f };
vec3s v2 = { 0.0f, 1.0f, 0.0f };
vec4s v4 = { 0.0f, 1.0f, 0.0f, 0.0f };
vec4 v5a = { 0.0f, 1.0f, 0.0f, 0.0f };
mat4s m4 = glms_rotate(m3, M_PI_2,
glms_vec3_cross(glms_vec3_add(v1, v6)
glms_vec3_add(v1, v7)));
v1.x = 1.0f; v1.y = 0.0f; v1.z = 0.0f;
// or
v1.raw[0] = 1.0f; v1.raw[1] = 0.0f; v1.raw[2] = 0.0f;
/* use struct api with array api (mix them). */
/* use .raw to access array and use it with array api */
glm_vec4_add(m4.col[0].raw, v5a, m4.col[0].raw);
glm_mat4_mulv(m4.raw, v4.raw, v5a);
or omit `glms_` namespace completely (see options below):
.. code-block:: c
#define CGLM_OMIT_NS_FROM_STRUCT_API
#include <cglm/struct.h>
mat4s m1 = mat4_identity(); /* init... */
mat4s m2 = mat4_identity(); /* init... */
mat4s m3 = mat4_mul(mat4_mul(m1, m2), mat4_mul(m3, m4));
vec3s v1 = { 1.0f, 0.0f, 0.0f };
vec3s v2 = { 0.0f, 1.0f, 0.0f };
vec4s v4 = { 0.0f, 1.0f, 0.0f, 0.0f };
vec4 v5a = { 0.0f, 1.0f, 0.0f, 0.0f };
mat4s m4 = glms_rotate(m3, M_PI_2,
vec3_cross(vec3_add(v1, v6)
vec3_add(v1, v7)));
v1.x = 1.0f; v1.y = 0.0f; v1.z = 0.0f;
// or
v1.raw[0] = 1.0f; v1.raw[1] = 0.0f; v1.raw[2] = 0.0f;
/* use struct api with array api (mix them) */
glm_vec4_add(m4.col[0].raw, v5a, m4.col[0].raw);
glm_mat4_mulv(m4.raw, v4.raw, v5a);
Configuring the Struct API:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
To configure the Struct API namespace, you can define the following macros before including the cglm/struct.h header:
- **CGLM_OMIT_NS_FROM_STRUCT_API**: omits CGLM_STRUCT_API_NS (`glms_`) namespace completely if there is sub namespace e.g `mat4_`, `vec4_` ... DEFAULT is not defined
- **CGLM_STRUCT_API_NS**: define name space for struct api, DEFAULT is **glms**
- **CGLM_STRUCT_API_NAME_SUFFIX**: define name suffix, DEFAULT is **empty** e.g defining it as #define CGLM_STRUCT_API_NAME_SUFFIX s will add s suffix to mat4_mul -> mat4s_mul
Detailed documentation for Struct API:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Since struct api if built top of array api, see array api functions for more information about individual functions.

View File

@@ -62,16 +62,16 @@ author = u'Recep Aslantas'
# built documents. # built documents.
# #
# The short X.Y version. # The short X.Y version.
version = u'0.9.0' version = u'0.9.1'
# The full version, including alpha/beta/rc tags. # The full version, including alpha/beta/rc tags.
release = u'0.9.0' release = u'0.9.1'
# 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.
# #
# This is also used if you do content translation via gettext catalogs. # This is also used if you do content translation via gettext catalogs.
# Usually you set "language" from the command line for these cases. # Usually you set "language" from the command line for these cases.
language = None language = 'en'
# List of patterns, relative to source directory, that match files and # List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files. # directories to ignore when looking for source files.
@@ -111,7 +111,7 @@ html_theme_options = {
# 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,
# relative to this directory. They are copied after the builtin static files, # relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css". # so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['_static'] # html_static_path = ['_static']
# -- Options for HTMLHelp output ------------------------------------------ # -- Options for HTMLHelp output ------------------------------------------

View File

@@ -1,7 +1,7 @@
Features Features
================================================================================ ================================================================================
* **scalar** and **simd** (sse, avx, neon...) optimizations * **scalar** and **simd** (sse, avx, neon, wasm...) optimizations
* option to use different clipspaces e.g. Left Handed, Zero-to-One... (currrently right handed negative-one is default) * option to use different clipspaces e.g. Left Handed, Zero-to-One... (currrently right handed negative-one is default)
* array api and struct api, you can use arrays or structs. * array api and struct api, you can use arrays or structs.
* general purpose matrix operations (mat4, mat3) * general purpose matrix operations (mat4, mat3)

View File

@@ -28,7 +28,7 @@ considered to be supported as optional.
opengl opengl
.. toctree:: .. toctree::
:maxdepth: 2 :maxdepth: 3
:caption: API: :caption: API:
api api

View File

@@ -32,6 +32,7 @@ Functions:
#. :c:func:`glm_mat2_swap_col` #. :c:func:`glm_mat2_swap_col`
#. :c:func:`glm_mat2_swap_row` #. :c:func:`glm_mat2_swap_row`
#. :c:func:`glm_mat2_rmc` #. :c:func:`glm_mat2_rmc`
#. :c:func:`glm_mat2_make`
Functions documentation Functions documentation
~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~
@@ -177,3 +178,13 @@ Functions documentation
Returns: Returns:
scalar value e.g. Matrix1x1 scalar value e.g. Matrix1x1
.. c:function:: void glm_mat2_make(float * __restrict src, mat2 dest)
Create mat2 matrix from pointer
| NOTE: **@src** must contain 4 elements.
Parameters:
| *[in]* **src** pointer to an array of floats
| *[out]* **dest** destination matrix2x2

View File

@@ -34,6 +34,7 @@ Functions:
#. :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` #. :c:func:`glm_mat3_rmc`
#. :c:func:`glm_mat3_make`
Functions documentation Functions documentation
~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~
@@ -187,3 +188,13 @@ Functions documentation
Returns: Returns:
scalar value e.g. Matrix1x1 scalar value e.g. Matrix1x1
.. c:function:: void glm_mat3_make(float * __restrict src, mat3 dest)
Create mat3 matrix from pointer
| NOTE: **@src** must contain 9 elements.
Parameters:
| *[in]* **src** pointer to an array of floats
| *[out]* **dest** destination matrix3x3

View File

@@ -47,6 +47,7 @@ Functions:
#. :c:func:`glm_mat4_swap_col` #. :c:func:`glm_mat4_swap_col`
#. :c:func:`glm_mat4_swap_row` #. :c:func:`glm_mat4_swap_row`
#. :c:func:`glm_mat4_rmc` #. :c:func:`glm_mat4_rmc`
#. :c:func:`glm_mat4_make`
Functions documentation Functions documentation
~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~
@@ -302,3 +303,13 @@ Functions documentation
Returns: Returns:
scalar value e.g. Matrix1x1 scalar value e.g. Matrix1x1
.. c:function:: void glm_mat4_make(float * __restrict src, mat4 dest)
Create mat4 matrix from pointer
| NOTE: **@src** must contain 16 elements.
Parameters:
| *[in]* **src** pointer to an array of floats
| *[out]* **dest** destination matrix4x4

View File

@@ -1,6 +1,6 @@
.. default-domain:: C .. default-domain:: C
Options 🛠️ Options
=============================================================================== ===============================================================================
A few options are provided via macros. A few options are provided via macros.
@@ -90,6 +90,16 @@ You have to extra options for dot product: **CGLM_SSE4_DOT** and **CGLM_SSE3_DOT
otherwise cglm will use custom cglm's hadd functions which are optimized too. otherwise cglm will use custom cglm's hadd functions which are optimized too.
Struct API Options
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
To configure the Struct API namespace, you can define the following macros before including the cglm/struct.h header:
- **CGLM_OMIT_NS_FROM_STRUCT_API**: omits CGLM_STRUCT_API_NS (`glms_`) namespace completely if there is sub namespace e.g `mat4_`, `vec4_` ... DEFAULT is not defined
- **CGLM_STRUCT_API_NS**: define name space for struct api, DEFAULT is **glms**
- **CGLM_STRUCT_API_NAME_SUFFIX**: define name suffix, DEFAULT is **empty** e.g defining it as #define CGLM_STRUCT_API_NAME_SUFFIX s will add s suffix to mat4_mul -> mat4s_mul
Print Options Print Options
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

View File

@@ -73,6 +73,10 @@ CGLM_EXPORT
float float
glmc_mat2_rmc(vec2 r, mat2 m, vec2 c); glmc_mat2_rmc(vec2 r, mat2 m, vec2 c);
CGLM_EXPORT
void
glmc_mat2_make(float * __restrict src, mat2 dest);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View File

@@ -80,6 +80,10 @@ CGLM_EXPORT
float float
glmc_mat3_rmc(vec3 r, mat3 m, vec3 c); glmc_mat3_rmc(vec3 r, mat3 m, vec3 c);
CGLM_EXPORT
void
glmc_mat3_make(float * __restrict src, mat3 dest);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View File

@@ -121,6 +121,10 @@ CGLM_EXPORT
float float
glmc_mat4_rmc(vec4 r, mat4 m, vec4 c); glmc_mat4_rmc(vec4 r, mat4 m, vec4 c);
CGLM_EXPORT
void
glmc_mat4_make(float * __restrict src, mat4 dest);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View File

@@ -13,6 +13,7 @@
CGLM_INLINE void glm_vec3_print(vec3 vec, FILE *ostream); CGLM_INLINE void glm_vec3_print(vec3 vec, FILE *ostream);
CGLM_INLINE void glm_ivec3_print(ivec3 vec, FILE *ostream); CGLM_INLINE void glm_ivec3_print(ivec3 vec, FILE *ostream);
CGLM_INLINE void glm_versor_print(versor vec, FILE *ostream); CGLM_INLINE void glm_versor_print(versor vec, FILE *ostream);
CGLM_INLINE void glm_arch_print(FILE *ostream);
*/ */
/* /*
@@ -52,12 +53,20 @@
# define CGLM_PRINT_MAX_TO_SHORT 1e5f # define CGLM_PRINT_MAX_TO_SHORT 1e5f
#endif #endif
#ifndef CGLM_PRINT_COLOR #ifndef GLM_TESTS_NO_COLORFUL_OUTPUT
# define CGLM_PRINT_COLOR "\033[36m" # ifndef CGLM_PRINT_COLOR
#endif # define CGLM_PRINT_COLOR "\033[36m"
# endif
#ifndef CGLM_PRINT_COLOR_RESET # ifndef CGLM_PRINT_COLOR_RESET
# define CGLM_PRINT_COLOR_RESET "\033[0m" # define CGLM_PRINT_COLOR_RESET "\033[0m"
# endif
#else
# ifndef CGLM_PRINT_COLOR
# define CGLM_PRINT_COLOR
# endif
# ifndef CGLM_PRINT_COLOR_RESET
# define CGLM_PRINT_COLOR_RESET
# endif
#endif #endif
/*! /*!
@@ -67,26 +76,40 @@
*/ */
CGLM_INLINE CGLM_INLINE
void void
glm_arch_print_name(FILE* __restrict ostream) { glm_arch_print(FILE* __restrict ostream) {
fprintf(ostream, CGLM_PRINT_COLOR "arch: "
#if defined(CGLM_SIMD_WASM) #if defined(CGLM_SIMD_WASM)
fprintf(ostream, CGLM_PRINT_COLOR "\ncglm arch: wasm SIMD128" "wasm SIMD128"
"\n\n" CGLM_PRINT_COLOR_RESET);
#elif defined(CGLM_SIMD_x86) #elif defined(CGLM_SIMD_x86)
fprintf(ostream, CGLM_PRINT_COLOR "\ncglm arch: x86 SSE*" "x86 SSE* "
#ifdef __AVX__ # ifdef __AVX__
" AVX" " AVX"
#endif # endif
"\n\n" CGLM_PRINT_COLOR_RESET); #elif defined(CGLM_SIMD_ARM)
#elif defined(CGLM_SIMD_ARM) "arm"
fprintf(ostream, CGLM_PRINT_COLOR "\ncglm arch: arm" # ifndef __ARM_NEON_FP
#ifndef __ARM_NEON_FP
" NEON_FP" " NEON_FP"
#endif # endif
#ifdef CGLM_ARM64 # ifdef CGLM_ARM64
" ARM64" " ARM64"
# endif
#else
"uncommon"
#endif #endif
"\n\n" CGLM_PRINT_COLOR_RESET); CGLM_PRINT_COLOR_RESET);
#endif }
/*!
* @brief prints current SIMD path in general
*
* @param[in] ostream stream to print e.g. stdout, stderr, FILE ...
*/
CGLM_INLINE
void
glm_arch_print_name(FILE* __restrict ostream) {
fprintf(ostream, CGLM_PRINT_COLOR "\ncglm ");
glm_arch_print(ostream);
fprintf(ostream, "\n\n" CGLM_PRINT_COLOR_RESET);
} }
CGLM_INLINE CGLM_INLINE
@@ -369,6 +392,8 @@ glm_aabb_print(vec3 bbox[2],
#define glm_vec2_print(v, s) (void)v; (void)s; #define glm_vec2_print(v, s) (void)v; (void)s;
#define glm_versor_print(v, s) (void)v; (void)s; #define glm_versor_print(v, s) (void)v; (void)s;
#define glm_aabb_print(v, t, s) (void)v; (void)t; (void)s; #define glm_aabb_print(v, t, s) (void)v; (void)t; (void)s;
#define glm_arch_print(s) (void)s;
#define glm_arch_print_name(s) (void)s;
#endif #endif
#endif /* cglm_io_h */ #endif /* cglm_io_h */

View File

@@ -28,6 +28,7 @@
CGLM_INLINE void glm_mat2_swap_col(mat2 mat, int col1, int col2) CGLM_INLINE void glm_mat2_swap_col(mat2 mat, int col1, int col2)
CGLM_INLINE void glm_mat2_swap_row(mat2 mat, int row1, int row2) CGLM_INLINE void glm_mat2_swap_row(mat2 mat, int row1, int row2)
CGLM_INLINE float glm_mat2_rmc(vec2 r, mat2 m, vec2 c) CGLM_INLINE float glm_mat2_rmc(vec2 r, mat2 m, vec2 c)
CGLM_INLINE void glm_mat2_make(float * restrict src, mat2 dest)
*/ */
#ifndef cglm_mat2_h #ifndef cglm_mat2_h
@@ -345,4 +346,19 @@ glm_mat2_rmc(vec2 r, mat2 m, vec2 c) {
return glm_vec2_dot(r, tmp); return glm_vec2_dot(r, tmp);
} }
/*!
* @brief Create mat2 matrix from pointer
*
* @param[in] src pointer to an array of floats
* @param[out] dest matrix
*/
CGLM_INLINE
void
glm_mat2_make(float * __restrict src, mat2 dest) {
dest[0][0] = src[0];
dest[0][1] = src[1];
dest[1][0] = src[2];
dest[1][1] = src[3];
}
#endif /* cglm_mat2_h */ #endif /* cglm_mat2_h */

View File

@@ -30,6 +30,7 @@
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); CGLM_INLINE float glm_mat3_rmc(vec3 r, mat3 m, vec3 c);
CGLM_INLINE void glm_mat3_make(float * restrict src, mat3 dest);
*/ */
#ifndef cglm_mat3_h #ifndef cglm_mat3_h
@@ -427,4 +428,26 @@ glm_mat3_rmc(vec3 r, mat3 m, vec3 c) {
return glm_vec3_dot(r, tmp); return glm_vec3_dot(r, tmp);
} }
/*!
* @brief Create mat3 matrix from pointer
*
* @param[in] src pointer to an array of floats
* @param[out] dest matrix
*/
CGLM_INLINE
void
glm_mat3_make(float * __restrict src, mat3 dest) {
dest[0][0] = src[0];
dest[0][1] = src[1];
dest[0][2] = src[2];
dest[1][0] = src[3];
dest[1][1] = src[4];
dest[1][2] = src[5];
dest[2][0] = src[6];
dest[2][1] = src[7];
dest[2][2] = src[8];
}
#endif /* cglm_mat3_h */ #endif /* cglm_mat3_h */

View File

@@ -43,6 +43,7 @@
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); CGLM_INLINE float glm_mat4_rmc(vec4 r, mat4 m, vec4 c);
CGLM_INLINE void glm_mat4_make(float * restrict src, mat4 dest);
*/ */
#ifndef cglm_mat_h #ifndef cglm_mat_h
@@ -781,4 +782,24 @@ glm_mat4_rmc(vec4 r, mat4 m, vec4 c) {
return glm_vec4_dot(r, tmp); return glm_vec4_dot(r, tmp);
} }
/*!
* @brief Create mat4 matrix from pointer
*
* @param[in] src pointer to an array of floats
* @param[out] dest matrix
*/
CGLM_INLINE
void
glm_mat4_make(float * __restrict src, mat4 dest) {
dest[0][0] = src[0]; dest[1][0] = src[4];
dest[0][1] = src[1]; dest[1][1] = src[5];
dest[0][2] = src[2]; dest[1][2] = src[6];
dest[0][3] = src[3]; dest[1][3] = src[7];
dest[2][0] = src[8]; dest[3][0] = src[12];
dest[2][1] = src[9]; dest[3][1] = src[13];
dest[2][2] = src[10]; dest[3][2] = src[14];
dest[2][3] = src[11]; dest[3][3] = src[15];
}
#endif /* cglm_mat_h */ #endif /* cglm_mat_h */

View File

@@ -52,6 +52,10 @@ glmm_float32x4_init(float x, float y, float z, float w) {
# define glmm_float32x4_init(x, y, z, w) { x, y, z, w } # define glmm_float32x4_init(x, y, z, w) { x, y, z, w }
#endif #endif
#define glmm_float32x4_SIGNMASK_PNPN glmm_float32x4_init( 0.f, -0.f, 0.f, -0.f)
#define glmm_float32x4_SIGNMASK_NPNP glmm_float32x4_init(-0.f, 0.f, -0.f, 0.f)
#define glmm_float32x4_SIGNMASK_NPPN glmm_float32x4_init(-0.f, 0.f, 0.f, -0.f)
static inline static inline
float32x4_t float32x4_t
glmm_abs(float32x4_t v) { glmm_abs(float32x4_t v) {

View File

@@ -99,7 +99,6 @@
# endif # endif
#endif #endif
/* WebAssembly */ /* WebAssembly */
#if defined(__wasm__) && defined(__wasm_simd128__) #if defined(__wasm__) && defined(__wasm_simd128__)
# ifndef CGLM_SIMD_WASM # ifndef CGLM_SIMD_WASM

View File

@@ -108,7 +108,7 @@ glm_mat4_det_neon(mat4 mat) {
float32x4_t r0, r1, r2, r3, x0, x1, x2; float32x4_t r0, r1, r2, r3, x0, x1, x2;
float32x2_t ij, op, mn, kl, nn, mm, jj, ii, gh, ef, t12, t34; float32x2_t ij, op, mn, kl, nn, mm, jj, ii, gh, ef, t12, t34;
float32x4x2_t a1; float32x4x2_t a1;
float32x4_t x3 = glmm_float32x4_init(0.f, -0.f, 0.f, -0.f); float32x4_t x3 = glmm_float32x4_SIGNMASK_PNPN;
/* 127 <- 0, [square] det(A) = det(At) */ /* 127 <- 0, [square] det(A) = det(At) */
r0 = glmm_load(mat[0]); /* d c b a */ r0 = glmm_load(mat[0]); /* d c b a */
@@ -181,7 +181,7 @@ glm_mat4_inv_neon(mat4 mat, mat4 dest) {
x0, x1, x2, x3, x4, x5, x6, x7, x8; x0, x1, x2, x3, x4, x5, x6, x7, x8;
float32x4x2_t a1; float32x4x2_t a1;
float32x2_t lp, ko, hg, jn, im, fe, ae, bf, cg, dh; float32x2_t lp, ko, hg, jn, im, fe, ae, bf, cg, dh;
float32x4_t x9 = glmm_float32x4_init(-0.f, 0.f, -0.f, 0.f); float32x4_t x9 = glmm_float32x4_SIGNMASK_NPNP;
x8 = vrev64q_f32(x9); x8 = vrev64q_f32(x9);

View File

@@ -23,7 +23,8 @@ glm_quat_mul_neon(versor p, versor q, versor dest) {
*/ */
glmm_128 xp, xq, xqr, r, x, y, z, s2, s3; glmm_128 xp, xq, xqr, r, x, y, z, s2, s3;
glmm_128 s1 = glmm_float32x4_init(-0.f, 0.f, 0.f, -0.f); glmm_128 s1 = glmm_float32x4_SIGNMASK_NPPN;
float32x2_t qh, ql; float32x2_t qh, ql;
xp = glmm_load(p); /* 3 2 1 0 */ xp = glmm_load(p); /* 3 2 1 0 */

View File

@@ -98,7 +98,7 @@ glm_inv_tr_sse2(mat4 mat) {
x2 = glmm_shuff1(r3, 0, 0, 0, 0); x2 = glmm_shuff1(r3, 0, 0, 0, 0);
x3 = glmm_shuff1(r3, 1, 1, 1, 1); x3 = glmm_shuff1(r3, 1, 1, 1, 1);
x4 = glmm_shuff1(r3, 2, 2, 2, 2); x4 = glmm_shuff1(r3, 2, 2, 2, 2);
x5 = _mm_set1_ps(-0.f); x5 = glmm_float32x4_SIGNMASK_NEG;
x0 = glmm_fmadd(r0, x2, glmm_fmadd(r1, x3, _mm_mul_ps(r2, x4))); x0 = glmm_fmadd(r0, x2, glmm_fmadd(r1, x3, _mm_mul_ps(r2, x4)));
x0 = _mm_xor_ps(x0, x5); x0 = _mm_xor_ps(x0, x5);

View File

@@ -153,7 +153,7 @@ glm_mat4_det_sse2(mat4 mat) {
_mm_shuffle_ps(x0, x1, _MM_SHUFFLE(2, 2, 3, 1)), _mm_shuffle_ps(x0, x1, _MM_SHUFFLE(2, 2, 3, 1)),
x2); x2);
x2 = _mm_xor_ps(x2, _mm_set_ps(-0.f, 0.f, -0.f, 0.f)); x2 = _mm_xor_ps(x2, glmm_float32x4_SIGNMASK_NPNP);
return glmm_hadd(_mm_mul_ps(x2, r0)); return glmm_hadd(_mm_mul_ps(x2, r0));
} }
@@ -166,7 +166,8 @@ glm_mat4_inv_fast_sse2(mat4 mat, mat4 dest) {
t0, t1, t2, t3, t4, t5, t0, t1, t2, t3, t4, t5,
x0, x1, x2, x3, x4, x5, x6, x7, x8, x9; x0, x1, x2, x3, x4, x5, x6, x7, x8, x9;
x8 = _mm_set_ps(-0.f, 0.f, -0.f, 0.f); /* x8 = _mm_set_ps(-0.f, 0.f, -0.f, 0.f); */
x8 = glmm_float32x4_SIGNMASK_NPNP;
x9 = glmm_shuff1(x8, 2, 1, 2, 1); x9 = glmm_shuff1(x8, 2, 1, 2, 1);
/* 127 <- 0 */ /* 127 <- 0 */
@@ -302,7 +303,8 @@ glm_mat4_inv_sse2(mat4 mat, mat4 dest) {
t0, t1, t2, t3, t4, t5, t0, t1, t2, t3, t4, t5,
x0, x1, x2, x3, x4, x5, x6, x7, x8, x9; x0, x1, x2, x3, x4, x5, x6, x7, x8, x9;
x8 = _mm_set_ps(-0.f, 0.f, -0.f, 0.f); /* x8 = _mm_set_ps(-0.f, 0.f, -0.f, 0.f); */
x8 = glmm_float32x4_SIGNMASK_NPNP;
x9 = glmm_shuff1(x8, 2, 1, 2, 1); x9 = glmm_shuff1(x8, 2, 1, 2, 1);
/* 127 <- 0 */ /* 127 <- 0 */

View File

@@ -26,9 +26,9 @@ glm_quat_mul_sse2(versor p, versor q, versor dest) {
xp = glmm_load(p); /* 3 2 1 0 */ xp = glmm_load(p); /* 3 2 1 0 */
xq = glmm_load(q); xq = glmm_load(q);
x1 = _mm_set_ps(-0.f, 0.f, -0.f, 0.f); /* TODO: _mm_set1_ss() + shuff ? */ x1 = glmm_float32x4_SIGNMASK_NPNP; /* TODO: _mm_set1_ss() + shuff ? */
r = _mm_mul_ps(glmm_splat_w(xp), xq); r = _mm_mul_ps(glmm_splat_w(xp), xq);
x2 = _mm_unpackhi_ps(x1, x1); x2 = _mm_unpackhi_ps(x1, x1);
x3 = glmm_shuff1(x1, 3, 2, 0, 1); x3 = glmm_shuff1(x1, 3, 2, 0, 1);
x = glmm_splat_x(xp); x = glmm_splat_x(xp);

View File

@@ -26,6 +26,16 @@
#define glmm_splat_z(x) glmm_splat(x, 2) #define glmm_splat_z(x) glmm_splat(x, 2)
#define glmm_splat_w(x) glmm_splat(x, 3) #define glmm_splat_w(x) glmm_splat(x, 3)
#define GLMM_NEGZEROf 0x80000000 /* 0x80000000 ---> -0.0f */
/* _mm_set_ps(X, Y, Z, W); */
#define GLMM__SIGNMASKf(X, Y, Z, W) wasm_i32x4_const(X, Y, Z, W)
#define glmm_float32x4_SIGNMASK_PNPN GLMM__SIGNMASKf(0, GLMM_NEGZEROf, 0, GLMM_NEGZEROf)
#define glmm_float32x4_SIGNMASK_NPNP GLMM__SIGNMASKf(GLMM_NEGZEROf, 0, GLMM_NEGZEROf, 0)
#define glmm_float32x4_SIGNMASK_NPPN GLMM__SIGNMASKf(GLMM_NEGZEROf, 0, 0, GLMM_NEGZEROf)
#define glmm_float32x4_SIGNMASK_NEG wasm_i32x4_const_splat(GLMM_NEGZEROf)
static inline static inline
glmm_128 glmm_128
glmm_abs(glmm_128 x) { glmm_abs(glmm_128 x) {

View File

@@ -164,8 +164,8 @@ glm_mat4_det_wasm(mat4 mat) {
x2 = glmm_fmadd(glmm_shuff1(r1, 2, 3, 3, 3), x2 = glmm_fmadd(glmm_shuff1(r1, 2, 3, 3, 3),
wasm_i32x4_shuffle(x0, x1, 1, 3, 6, 6), wasm_i32x4_shuffle(x0, x1, 1, 3, 6, 6),
x2); x2);
/* x2 = wasm_v128_xor(x2, wasm_f32x4_const(0.f, -0.f, 0.f, -0.f)); */
x2 = wasm_v128_xor(x2, wasm_f32x4_const(0.f, -0.f, 0.f, -0.f)); x2 = wasm_v128_xor(x2, glmm_float32x4_SIGNMASK_PNPN);
return glmm_hadd(wasm_f32x4_mul(x2, r0)); return glmm_hadd(wasm_f32x4_mul(x2, r0));
} }
@@ -178,7 +178,8 @@ glm_mat4_inv_fast_wasm(mat4 mat, mat4 dest) {
t0, t1, t2, t3, t4, t5, t0, t1, t2, t3, t4, t5,
x0, x1, x2, x3, x4, x5, x6, x7, x8, x9; x0, x1, x2, x3, x4, x5, x6, x7, x8, x9;
x8 = wasm_f32x4_const(0.f, -0.f, 0.f, -0.f); /* x8 = wasm_f32x4_const(0.f, -0.f, 0.f, -0.f); */
x8 = glmm_float32x4_SIGNMASK_PNPN;
x9 = glmm_shuff1(x8, 2, 1, 2, 1); x9 = glmm_shuff1(x8, 2, 1, 2, 1);
/* 127 <- 0 */ /* 127 <- 0 */
@@ -318,7 +319,8 @@ glm_mat4_inv_wasm(mat4 mat, mat4 dest) {
t0, t1, t2, t3, t4, t5, t0, t1, t2, t3, t4, t5,
x0, x1, x2, x3, x4, x5, x6, x7, x8, x9; x0, x1, x2, x3, x4, x5, x6, x7, x8, x9;
x8 = wasm_f32x4_const(0.f, -0.f, 0.f, -0.f); /* x8 = wasm_f32x4_const(0.f, -0.f, 0.f, -0.f); */
x8 = glmm_float32x4_SIGNMASK_PNPN;
x9 = glmm_shuff1(x8, 2, 1, 2, 1); x9 = glmm_shuff1(x8, 2, 1, 2, 1);
/* 127 <- 0 */ /* 127 <- 0 */

View File

@@ -26,7 +26,8 @@ glm_quat_mul_wasm(versor p, versor q, versor dest) {
xp = glmm_load(p); /* 3 2 1 0 */ xp = glmm_load(p); /* 3 2 1 0 */
xq = glmm_load(q); xq = glmm_load(q);
x1 = wasm_f32x4_const(0.f, -0.f, 0.f, -0.f); /* TODO: _mm_set1_ss() + shuff ? */ /* x1 = wasm_f32x4_const(0.f, -0.f, 0.f, -0.f); */
x1 = glmm_float32x4_SIGNMASK_PNPN; /* TODO: _mm_set1_ss() + shuff ? */
r = wasm_f32x4_mul(glmm_splat_w(xp), xq); r = wasm_f32x4_mul(glmm_splat_w(xp), xq);
/* x2 = _mm_unpackhi_ps(x1, x1); */ /* x2 = _mm_unpackhi_ps(x1, x1); */
x2 = wasm_i32x4_shuffle(x1, x1, 2, 6, 3, 7); x2 = wasm_i32x4_shuffle(x1, x1, 2, 6, 3, 7);

View File

@@ -54,10 +54,24 @@
# endif # endif
#endif #endif
/* Note that `0x80000000` corresponds to `INT_MIN` for a 32-bit int. */
#define GLMM_NEGZEROf ((int)0x80000000) /* 0x80000000 ---> -0.0f */
#define GLMM__SIGNMASKf(X, Y, Z, W) \
_mm_castsi128_ps(_mm_set_epi32(X, Y, Z, W))
/* _mm_set_ps(X, Y, Z, W); */
#define glmm_float32x4_SIGNMASK_PNPN GLMM__SIGNMASKf(0, GLMM_NEGZEROf, 0, GLMM_NEGZEROf)
#define glmm_float32x4_SIGNMASK_NPNP GLMM__SIGNMASKf(GLMM_NEGZEROf, 0, GLMM_NEGZEROf, 0)
#define glmm_float32x4_SIGNMASK_NPPN GLMM__SIGNMASKf(GLMM_NEGZEROf, 0, 0, GLMM_NEGZEROf)
#define glmm_float32x4_SIGNMASK_NEG _mm_castsi128_ps(_mm_set1_epi32(GLMM_NEGZEROf)) /* _mm_set1_ps(-0.0f) */
#define glmm_float32x8_SIGNMASK_NEG _mm256_castsi256_ps(_mm256_set1_epi32(GLMM_NEGZEROf))
static inline static inline
__m128 __m128
glmm_abs(__m128 x) { glmm_abs(__m128 x) {
return _mm_andnot_ps(_mm_set1_ps(-0.0f), x); return _mm_andnot_ps(glmm_float32x4_SIGNMASK_NEG, x);
} }
static inline static inline
@@ -256,7 +270,8 @@ glmm_fnmsub(__m128 a, __m128 b, __m128 c) {
#ifdef __FMA__ #ifdef __FMA__
return _mm_fnmsub_ps(a, b, c); return _mm_fnmsub_ps(a, b, c);
#else #else
return _mm_xor_ps(_mm_add_ps(_mm_mul_ps(a, b), c), _mm_set1_ps(-0.0f)); return _mm_xor_ps(_mm_add_ps(_mm_mul_ps(a, b), c),
glmm_float32x4_SIGNMASK_NEG);
#endif #endif
} }
@@ -298,7 +313,7 @@ glmm256_fnmsub(__m256 a, __m256 b, __m256 c) {
return _mm256_fmsub_ps(a, b, c); return _mm256_fmsub_ps(a, b, c);
#else #else
return _mm256_xor_ps(_mm256_sub_ps(_mm256_mul_ps(a, b), c), return _mm256_xor_ps(_mm256_sub_ps(_mm256_mul_ps(a, b), c),
_mm256_set1_ps(-0.0f)); glmm_float32x8_SIGNMASK_NEG);
#endif #endif
} }
#endif #endif

View File

@@ -31,7 +31,7 @@ glms_aabb_(transform)(vec3s box[2], mat4s m, vec3s dest[2]) {
vec3 rawBox[2]; vec3 rawBox[2];
vec3 rawDest[2]; vec3 rawDest[2];
glms_vec3_unpack(rawBox, box, 2); glms_vec3_(unpack)(rawBox, box, 2);
glm_aabb_transform(rawBox, m.raw, rawDest); glm_aabb_transform(rawBox, m.raw, rawDest);
glms_vec3_pack(dest, rawDest, 2); glms_vec3_pack(dest, rawDest, 2);
} }
@@ -53,10 +53,10 @@ glms_aabb_(merge)(vec3s box1[2], vec3s box2[2], vec3s dest[2]) {
vec3 rawBox2[2]; vec3 rawBox2[2];
vec3 rawDest[2]; vec3 rawDest[2];
glms_vec3_unpack(rawBox1, box1, 2); glms_vec3_(unpack)(rawBox1, box1, 2);
glms_vec3_unpack(rawBox2, box2, 2); glms_vec3_(unpack)(rawBox2, box2, 2);
glm_aabb_merge(rawBox1, rawBox2, rawDest); glm_aabb_merge(rawBox1, rawBox2, rawDest);
glms_vec3_pack(dest, rawDest, 2); glms_vec3_(pack)(dest, rawDest, 2);
} }
/*! /*!
@@ -77,10 +77,10 @@ glms_aabb_(crop)(vec3s box[2], vec3s cropBox[2], vec3s dest[2]) {
vec3 rawCropBox[2]; vec3 rawCropBox[2];
vec3 rawDest[2]; vec3 rawDest[2];
glms_vec3_unpack(rawBox, box, 2); glms_vec3_(unpack)(rawBox, box, 2);
glms_vec3_unpack(rawCropBox, cropBox, 2); glms_vec3_(unpack)(rawCropBox, cropBox, 2);
glm_aabb_crop(rawBox, rawCropBox, rawDest); glm_aabb_crop(rawBox, rawCropBox, rawDest);
glms_vec3_pack(dest, rawDest, 2); glms_vec3_(pack)(dest, rawDest, 2);
} }
/*! /*!
@@ -101,8 +101,8 @@ glms_aabb_(crop_until)(vec3s box[2],
vec3s cropBox[2], vec3s cropBox[2],
vec3s clampBox[2], vec3s clampBox[2],
vec3s dest[2]) { vec3s dest[2]) {
glms_aabb_crop(box, cropBox, dest); glms_aabb_(crop)(box, cropBox, dest);
glms_aabb_merge(clampBox, dest, dest); glms_aabb_(merge)(clampBox, dest, dest);
} }
/*! /*!
@@ -125,8 +125,8 @@ glms_aabb_(frustum)(vec3s box[2], vec4s planes[6]) {
vec3 rawBox[2]; vec3 rawBox[2];
vec4 rawPlanes[6]; vec4 rawPlanes[6];
glms_vec3_unpack(rawBox, box, 2); glms_vec3_(unpack)(rawBox, box, 2);
glms_vec4_unpack(rawPlanes, planes, 6); glms_vec4_(unpack)(rawPlanes, planes, 6);
return glm_aabb_frustum(rawBox, rawPlanes); return glm_aabb_frustum(rawBox, rawPlanes);
} }
@@ -138,8 +138,8 @@ glms_aabb_(frustum)(vec3s box[2], vec4s planes[6]) {
CGLM_INLINE CGLM_INLINE
void void
glms_aabb_(invalidate)(vec3s box[2]) { glms_aabb_(invalidate)(vec3s box[2]) {
box[0] = glms_vec3_broadcast(FLT_MAX); box[0] = glms_vec3_(broadcast)(FLT_MAX);
box[1] = glms_vec3_broadcast(-FLT_MAX); box[1] = glms_vec3_(broadcast)(-FLT_MAX);
} }
/*! /*!
@@ -151,7 +151,7 @@ CGLM_INLINE
bool bool
glms_aabb_(isvalid)(vec3s box[2]) { glms_aabb_(isvalid)(vec3s box[2]) {
vec3 rawBox[2]; vec3 rawBox[2];
glms_vec3_unpack(rawBox, box, 2); glms_vec3_(unpack)(rawBox, box, 2);
return glm_aabb_isvalid(rawBox); return glm_aabb_isvalid(rawBox);
} }
@@ -174,7 +174,7 @@ glms_aabb_(size)(vec3s box[2]) {
CGLM_INLINE CGLM_INLINE
float float
glms_aabb_(radius)(vec3s box[2]) { glms_aabb_(radius)(vec3s box[2]) {
return glms_aabb_size(box) * 0.5f; return glms_aabb_(size)(box) * 0.5f;
} }
/*! /*!
@@ -186,7 +186,7 @@ glms_aabb_(radius)(vec3s box[2]) {
CGLM_INLINE CGLM_INLINE
vec3s vec3s
glms_aabb_(center)(vec3s box[2]) { glms_aabb_(center)(vec3s box[2]) {
return glms_vec3_center(box[0], box[1]); return glms_vec3_(center)(box[0], box[1]);
} }
/*! /*!
@@ -201,8 +201,8 @@ glms_aabb_(aabb)(vec3s box[2], vec3s other[2]) {
vec3 rawBox[2]; vec3 rawBox[2];
vec3 rawOther[2]; vec3 rawOther[2];
glms_vec3_unpack(rawBox, box, 2); glms_vec3_(unpack)(rawBox, box, 2);
glms_vec3_unpack(rawOther, other, 2); glms_vec3_(unpack)(rawOther, other, 2);
return glm_aabb_aabb(rawBox, rawOther); return glm_aabb_aabb(rawBox, rawOther);
} }
@@ -220,7 +220,7 @@ bool
glms_aabb_(sphere)(vec3s box[2], vec4s s) { glms_aabb_(sphere)(vec3s box[2], vec4s s) {
vec3 rawBox[2]; vec3 rawBox[2];
glms_vec3_unpack(rawBox, box, 2); glms_vec3_(unpack)(rawBox, box, 2);
return glm_aabb_sphere(rawBox, s.raw); return glm_aabb_sphere(rawBox, s.raw);
} }
@@ -235,7 +235,7 @@ bool
glms_aabb_(point)(vec3s box[2], vec3s point) { glms_aabb_(point)(vec3s box[2], vec3s point) {
vec3 rawBox[2]; vec3 rawBox[2];
glms_vec3_unpack(rawBox, box, 2); glms_vec3_(unpack)(rawBox, box, 2);
return glm_aabb_point(rawBox, point.raw); return glm_aabb_point(rawBox, point.raw);
} }
@@ -251,8 +251,8 @@ glms_aabb_(contains)(vec3s box[2], vec3s other[2]) {
vec3 rawBox[2]; vec3 rawBox[2];
vec3 rawOther[2]; vec3 rawOther[2];
glms_vec3_unpack(rawBox, box, 2); glms_vec3_(unpack)(rawBox, box, 2);
glms_vec3_unpack(rawOther, other, 2); glms_vec3_(unpack)(rawOther, other, 2);
return glm_aabb_contains(rawBox, rawOther); return glm_aabb_contains(rawBox, rawOther);
} }

View File

@@ -64,7 +64,7 @@ glms_ortho_aabb_lh_no(vec3s box[2]) {
mat4s dest; mat4s dest;
vec3 rawBox[2]; vec3 rawBox[2];
glms_vec3_unpack(rawBox, box, 2); glms_vec3_(unpack)(rawBox, box, 2);
glm_ortho_aabb_lh_no(rawBox, dest.raw); glm_ortho_aabb_lh_no(rawBox, dest.raw);
return dest; return dest;
@@ -87,7 +87,7 @@ glms_ortho_aabb_p_lh_no(vec3s box[2], float padding) {
mat4s dest; mat4s dest;
vec3 rawBox[2]; vec3 rawBox[2];
glms_vec3_unpack(rawBox, box, 2); glms_vec3_(unpack)(rawBox, box, 2);
glm_ortho_aabb_p_lh_no(rawBox, padding, dest.raw); glm_ortho_aabb_p_lh_no(rawBox, padding, dest.raw);
return dest; return dest;
@@ -110,7 +110,7 @@ glms_ortho_aabb_pz_lh_no(vec3s box[2], float padding) {
mat4s dest; mat4s dest;
vec3 rawBox[2]; vec3 rawBox[2];
glms_vec3_unpack(rawBox, box, 2); glms_vec3_(unpack)(rawBox, box, 2);
glm_ortho_aabb_pz_lh_no(rawBox, padding, dest.raw); glm_ortho_aabb_pz_lh_no(rawBox, padding, dest.raw);
return dest; return dest;

View File

@@ -64,7 +64,7 @@ glms_ortho_aabb_lh_zo(vec3s box[2]) {
mat4s dest; mat4s dest;
vec3 rawBox[2]; vec3 rawBox[2];
glms_vec3_unpack(rawBox, box, 2); glms_vec3_(unpack)(rawBox, box, 2);
glm_ortho_aabb_lh_zo(rawBox, dest.raw); glm_ortho_aabb_lh_zo(rawBox, dest.raw);
return dest; return dest;
@@ -87,7 +87,7 @@ glms_ortho_aabb_p_lh_zo(vec3s box[2], float padding) {
mat4s dest; mat4s dest;
vec3 rawBox[2]; vec3 rawBox[2];
glms_vec3_unpack(rawBox, box, 2); glms_vec3_(unpack)(rawBox, box, 2);
glm_ortho_aabb_p_lh_zo(rawBox, padding, dest.raw); glm_ortho_aabb_p_lh_zo(rawBox, padding, dest.raw);
return dest; return dest;
@@ -110,7 +110,7 @@ glms_ortho_aabb_pz_lh_zo(vec3s box[2], float padding) {
mat4s dest; mat4s dest;
vec3 rawBox[2]; vec3 rawBox[2];
glms_vec3_unpack(rawBox, box, 2); glms_vec3_(unpack)(rawBox, box, 2);
glm_ortho_aabb_pz_lh_zo(rawBox, padding, dest.raw); glm_ortho_aabb_pz_lh_zo(rawBox, padding, dest.raw);
return dest; return dest;

View File

@@ -64,7 +64,7 @@ glms_ortho_aabb_rh_no(vec3s box[2]) {
mat4s dest; mat4s dest;
vec3 rawBox[2]; vec3 rawBox[2];
glms_vec3_unpack(rawBox, box, 2); glms_vec3_(unpack)(rawBox, box, 2);
glm_ortho_aabb_rh_no(rawBox, dest.raw); glm_ortho_aabb_rh_no(rawBox, dest.raw);
return dest; return dest;
@@ -87,7 +87,7 @@ glms_ortho_aabb_p_rh_no(vec3s box[2], float padding) {
mat4s dest; mat4s dest;
vec3 rawBox[2]; vec3 rawBox[2];
glms_vec3_unpack(rawBox, box, 2); glms_vec3_(unpack)(rawBox, box, 2);
glm_ortho_aabb_p_rh_no(rawBox, padding, dest.raw); glm_ortho_aabb_p_rh_no(rawBox, padding, dest.raw);
return dest; return dest;
@@ -110,7 +110,7 @@ glms_ortho_aabb_pz_rh_no(vec3s box[2], float padding) {
mat4s dest; mat4s dest;
vec3 rawBox[2]; vec3 rawBox[2];
glms_vec3_unpack(rawBox, box, 2); glms_vec3_(unpack)(rawBox, box, 2);
glm_ortho_aabb_pz_rh_no(rawBox, padding, dest.raw); glm_ortho_aabb_pz_rh_no(rawBox, padding, dest.raw);
return dest; return dest;

View File

@@ -64,7 +64,7 @@ glms_ortho_aabb_rh_zo(vec3s box[2]) {
mat4s dest; mat4s dest;
vec3 rawBox[2]; vec3 rawBox[2];
glms_vec3_unpack(rawBox, box, 2); glms_vec3_(unpack)(rawBox, box, 2);
glm_ortho_aabb_rh_zo(rawBox, dest.raw); glm_ortho_aabb_rh_zo(rawBox, dest.raw);
return dest; return dest;
@@ -87,7 +87,7 @@ glms_ortho_aabb_p_rh_zo(vec3s box[2], float padding) {
mat4s dest; mat4s dest;
vec3 rawBox[2]; vec3 rawBox[2];
glms_vec3_unpack(rawBox, box, 2); glms_vec3_(unpack)(rawBox, box, 2);
glm_ortho_aabb_p_rh_zo(rawBox, padding, dest.raw); glm_ortho_aabb_p_rh_zo(rawBox, padding, dest.raw);
return dest; return dest;
@@ -110,7 +110,7 @@ glms_ortho_aabb_pz_rh_zo(vec3s box[2], float padding) {
mat4s dest; mat4s dest;
vec3 rawBox[2]; vec3 rawBox[2];
glms_vec3_unpack(rawBox, box, 2); glms_vec3_(unpack)(rawBox, box, 2);
glm_ortho_aabb_pz_rh_zo(rawBox, padding, dest.raw); glm_ortho_aabb_pz_rh_zo(rawBox, padding, dest.raw);
return dest; return dest;

View File

@@ -57,7 +57,7 @@ void
glms_frustum_planes(mat4s m, vec4s dest[6]) { glms_frustum_planes(mat4s m, vec4s dest[6]) {
vec4 rawDest[6]; vec4 rawDest[6];
glm_frustum_planes(m.raw, rawDest); glm_frustum_planes(m.raw, rawDest);
glms_vec4_pack(dest, rawDest, 6); glms_vec4_(pack)(dest, rawDest, 6);
} }
/*! /*!
@@ -88,7 +88,7 @@ void
glms_frustum_corners(mat4s invMat, vec4s dest[8]) { glms_frustum_corners(mat4s invMat, vec4s dest[8]) {
vec4 rawDest[8]; vec4 rawDest[8];
glm_frustum_corners(invMat.raw, rawDest); glm_frustum_corners(invMat.raw, rawDest);
glms_vec4_pack(dest, rawDest, 8); glms_vec4_(pack)(dest, rawDest, 8);
} }
/*! /*!
@@ -103,7 +103,7 @@ glms_frustum_center(vec4s corners[8]) {
vec4 rawCorners[8]; vec4 rawCorners[8];
vec4s r; vec4s r;
glms_vec4_unpack(rawCorners, corners, 8); glms_vec4_(unpack)(rawCorners, corners, 8);
glm_frustum_center(rawCorners, r.raw); glm_frustum_center(rawCorners, r.raw);
return r; return r;
} }
@@ -121,9 +121,9 @@ glms_frustum_box(vec4s corners[8], mat4s m, vec3s box[2]) {
vec4 rawCorners[8]; vec4 rawCorners[8];
vec3 rawBox[2]; vec3 rawBox[2];
glms_vec4_unpack(rawCorners, corners, 8); glms_vec4_(unpack)(rawCorners, corners, 8);
glm_frustum_box(rawCorners, m.raw, rawBox); glm_frustum_box(rawCorners, m.raw, rawBox);
glms_vec3_pack(box, rawBox, 2); glms_vec3_(pack)(box, rawBox, 2);
} }
/*! /*!
@@ -147,9 +147,9 @@ glms_frustum_corners_at(vec4s corners[8],
vec4 rawCorners[8]; vec4 rawCorners[8];
vec4 rawPlaneCorners[4]; vec4 rawPlaneCorners[4];
glms_vec4_unpack(rawCorners, corners, 8); glms_vec4_(unpack)(rawCorners, corners, 8);
glm_frustum_corners_at(rawCorners, splitDist, farDist, rawPlaneCorners); glm_frustum_corners_at(rawCorners, splitDist, farDist, rawPlaneCorners);
glms_vec4_pack(planeCorners, rawPlaneCorners, 8); glms_vec4_(pack)(planeCorners, rawPlaneCorners, 8);
} }
#endif /* cglms_frustums_h */ #endif /* cglms_frustums_h */

View File

@@ -75,7 +75,7 @@ glms_aabb_print(vec3s bbox[2],
FILE * __restrict ostream) { FILE * __restrict ostream) {
vec3 rawBbox[2]; vec3 rawBbox[2];
glms_vec3_unpack(rawBbox, bbox, 2); glms_vec3_(unpack)(rawBbox, bbox, 2);
glm_aabb_print(rawBbox, tag, ostream); glm_aabb_print(rawBbox, tag, ostream);
} }

View File

@@ -27,6 +27,7 @@
CGLM_INLINE void glms_mat2_swap_col(mat2 mat, int col1, int col2) CGLM_INLINE void glms_mat2_swap_col(mat2 mat, int col1, int col2)
CGLM_INLINE void glms_mat2_swap_row(mat2 mat, int row1, int row2) CGLM_INLINE void glms_mat2_swap_row(mat2 mat, int row1, int row2)
CGLM_INLINE float glms_mat2_rmc(vec2 r, mat2 m, vec2 c) CGLM_INLINE float glms_mat2_rmc(vec2 r, mat2 m, vec2 c)
CGLM_INLINE float glms_mat42_make(float * __restrict src);
*/ */
#ifndef cglms_mat2_h #ifndef cglms_mat2_h
@@ -258,4 +259,18 @@ glms_mat2_(rmc)(vec2s r, mat2s m, vec2s c) {
return glm_mat2_rmc(r.raw, m.raw, c.raw); return glm_mat2_rmc(r.raw, m.raw, c.raw);
} }
/*!
* @brief Create mat2 matrix from pointer
*
* @param[in] src pointer to an array of floats
* @return constructed matrix from raw pointer
*/
CGLM_INLINE
mat2s
glms_mat2_(make)(float * __restrict src) {
mat2s r;
glm_mat2_make(src, r.raw);
return r;
}
#endif /* cglms_mat2_h */ #endif /* cglms_mat2_h */

View File

@@ -28,6 +28,7 @@
CGLM_INLINE mat3s glms_mat3_swap_col(mat3s mat, int col1, int col2); CGLM_INLINE mat3s glms_mat3_swap_col(mat3s mat, int col1, int col2);
CGLM_INLINE mat3s glms_mat3_swap_row(mat3s mat, int row1, int row2); CGLM_INLINE mat3s glms_mat3_swap_row(mat3s mat, int row1, int row2);
CGLM_INLINE float glms_mat3_rmc(vec3s r, mat3s m, vec3s c); CGLM_INLINE float glms_mat3_rmc(vec3s r, mat3s m, vec3s c);
CGLM_INLINE float glms_mat3_make(float * __restrict src);
*/ */
#ifndef cglms_mat3s_h #ifndef cglms_mat3s_h
@@ -285,4 +286,18 @@ glms_mat3_(rmc)(vec3s r, mat3s m, vec3s c) {
return glm_mat3_rmc(r.raw, m.raw, c.raw); return glm_mat3_rmc(r.raw, m.raw, c.raw);
} }
/*!
* @brief Create mat3 matrix from pointer
*
* @param[in] src pointer to an array of floats
* @return constructed matrix from raw pointer
*/
CGLM_INLINE
mat3s
glms_mat3_(make)(float * __restrict src) {
mat3s r;
glm_mat3_make(src, r.raw);
return r;
}
#endif /* cglms_mat3s_h */ #endif /* cglms_mat3s_h */

View File

@@ -42,6 +42,7 @@
CGLM_INLINE mat4s glms_mat4_swap_col(mat4s mat, int col1, int col2); CGLM_INLINE mat4s glms_mat4_swap_col(mat4s mat, int col1, int col2);
CGLM_INLINE mat4s glms_mat4_swap_row(mat4s mat, int row1, int row2); CGLM_INLINE mat4s glms_mat4_swap_row(mat4s mat, int row1, int row2);
CGLM_INLINE float glms_mat4_rmc(vec4s r, mat4s m, vec4s c); CGLM_INLINE float glms_mat4_rmc(vec4s r, mat4s m, vec4s c);
CGLM_INLINE float glms_mat4_make(float * __restrict src);
*/ */
#ifndef cglms_mat4s_h #ifndef cglms_mat4s_h
@@ -240,7 +241,7 @@ glms_mat4_(mulN)(mat4s * __restrict matrices[], uint32_t len) {
size_t i; size_t i;
for (i = 0; i < len; i++) { for (i = 0; i < len; i++) {
r = glms_mat4_mul(r, *matrices[i]); r = glms_mat4_(mul)(r, *matrices[i]);
} }
return r; return r;
@@ -459,4 +460,18 @@ glms_mat4_(rmc)(vec4s r, mat4s m, vec4s c) {
return glm_mat4_rmc(r.raw, m.raw, c.raw); return glm_mat4_rmc(r.raw, m.raw, c.raw);
} }
/*!
* @brief Create mat4 matrix from pointer
*
* @param[in] src pointer to an array of floats
* @return constructed matrix from raw pointer
*/
CGLM_INLINE
mat4s
glms_mat4_(make)(float * __restrict src) {
mat4s r;
glm_mat4_make(src, r.raw);
return r;
}
#endif /* cglms_mat4s_h */ #endif /* cglms_mat4s_h */

View File

@@ -25,10 +25,17 @@
* only #define governing the use of anonymous structs, so for backward * only #define governing the use of anonymous structs, so for backward
* compatibility, we still honor that choice and disable them. */ * compatibility, we still honor that choice and disable them. */
# define CGLM_USE_ANONYMOUS_STRUCT 0 # define CGLM_USE_ANONYMOUS_STRUCT 0
# elif __STDC_VERSION__ >= 20112L || defined(_MSVC_VER) # elif (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) || \
(defined(__cplusplus) && __cplusplus >= 201103L)
/* We're compiling for C11 or this is the MSVC compiler. In either /* We're compiling for C11 or this is the MSVC compiler. In either
* case, anonymous structs are available, so use them. */ * case, anonymous structs are available, so use them. */
# define CGLM_USE_ANONYMOUS_STRUCT 1 # define CGLM_USE_ANONYMOUS_STRUCT 1
# elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6))
/* GCC 4.6 and onwards support anonymous structs as an extension */
# define CGLM_USE_ANONYMOUS_STRUCT 1
# elif defined(__clang__) && __clang_major__ >= 3
/* Clang 3.0 and onwards support anonymous structs as an extension */
# define CGLM_USE_ANONYMOUS_STRUCT 1
# elif defined(_MSC_VER) && (_MSC_VER >= 1900) /* Visual Studio 2015 */ # elif defined(_MSC_VER) && (_MSC_VER >= 1900) /* Visual Studio 2015 */
/* We can support anonymous structs /* We can support anonymous structs
* since Visual Studio 2015 or 2017 (1910) maybe? */ * since Visual Studio 2015 or 2017 (1910) maybe? */

View File

@@ -709,7 +709,7 @@ glm_vec4_negate_to(vec4 v, vec4 dest) {
#if defined(__wasm__) && defined(__wasm_simd128__) #if defined(__wasm__) && defined(__wasm_simd128__)
glmm_store(dest, wasm_f32x4_neg(glmm_load(v))); glmm_store(dest, wasm_f32x4_neg(glmm_load(v)));
#elif defined( __SSE__ ) || defined( __SSE2__ ) #elif defined( __SSE__ ) || defined( __SSE2__ )
glmm_store(dest, _mm_xor_ps(glmm_load(v), _mm_set1_ps(-0.0f))); glmm_store(dest, _mm_xor_ps(glmm_load(v), glmm_float32x4_SIGNMASK_NEG));
#elif defined(CGLM_NEON_FP) #elif defined(CGLM_NEON_FP)
vst1q_f32(dest, vnegq_f32(vld1q_f32(v))); vst1q_f32(dest, vnegq_f32(vld1q_f32(v)));
#else #else

View File

@@ -10,6 +10,6 @@
#define CGLM_VERSION_MAJOR 0 #define CGLM_VERSION_MAJOR 0
#define CGLM_VERSION_MINOR 9 #define CGLM_VERSION_MINOR 9
#define CGLM_VERSION_PATCH 0 #define CGLM_VERSION_PATCH 1
#endif /* cglm_version_h */ #endif /* cglm_version_h */

View File

@@ -1,5 +1,5 @@
project('cglm', 'c', project('cglm', 'c',
version : '0.9.0', version : '0.9.1',
license : 'mit', license : 'mit',
default_options : [ default_options : [
'c_std=c11', 'c_std=c11',
@@ -108,11 +108,6 @@ if get_option('build_tests') == true
test_src = files( test_src = files(
'test/runner.c', 'test/runner.c',
'test/src/test_bezier.c', 'test/src/test_bezier.c',
'test/src/test_cam.c',
'test/src/test_cam_lh_no.c',
'test/src/test_cam_lh_zo.c',
'test/src/test_cam_rh_no.c',
'test/src/test_cam_rh_zo.c',
'test/src/test_clamp.c', 'test/src/test_clamp.c',
'test/src/test_common.c', 'test/src/test_common.c',
'test/src/test_euler.c', 'test/src/test_euler.c',

View File

@@ -97,3 +97,9 @@ float
glmc_mat2_rmc(vec2 r, mat2 m, vec2 c) { glmc_mat2_rmc(vec2 r, mat2 m, vec2 c) {
return glm_mat2_rmc(r, m, c); return glm_mat2_rmc(r, m, c);
} }
CGLM_EXPORT
void
glmc_mat2_make(float * __restrict src, mat2 dest) {
glm_mat2_make(src, dest);
}

View File

@@ -103,3 +103,9 @@ float
glmc_mat3_rmc(vec3 r, mat3 m, vec3 c) { glmc_mat3_rmc(vec3 r, mat3 m, vec3 c) {
return glm_mat3_rmc(r, m, c); return glm_mat3_rmc(r, m, c);
} }
CGLM_EXPORT
void
glmc_mat3_make(float * __restrict src, mat3 dest) {
glm_mat3_make(src, dest);
}

View File

@@ -163,3 +163,9 @@ float
glmc_mat4_rmc(vec4 r, mat4 m, vec4 c) { glmc_mat4_rmc(vec4 r, mat4 m, vec4 c) {
return glm_mat4_rmc(r, m, c); return glm_mat4_rmc(r, m, c);
} }
CGLM_EXPORT
void
glmc_mat4_make(float * __restrict src, mat4 dest) {
glm_mat4_make(src, dest);
}

View File

@@ -5,11 +5,6 @@ set(TESTFILES
runner.c runner.c
src/test_euler.c src/test_euler.c
src/test_bezier.c src/test_bezier.c
src/test_cam.c
src/test_cam_lh_zo.c
src/test_cam_rh_zo.c
src/test_cam_lh_no.c
src/test_cam_rh_no.c
src/test_struct.c src/test_struct.c
src/test_clamp.c src/test_clamp.c
src/test_common.c src/test_common.c

View File

@@ -25,7 +25,9 @@ main(int argc, const char * argv[]) {
total = 0.0; total = 0.0;
count = sizeof(tests) / sizeof(tests[0]); count = sizeof(tests) / sizeof(tests[0]);
fprintf(stderr, CYAN "\nWelcome to cglm tests\n\n" RESET); fprintf(stderr, CYAN "\nWelcome to cglm tests ( " RESET);
glm_arch_print(stderr);
fprintf(stderr, CYAN " )\n\n" RESET);
srand((unsigned int)time(NULL)); srand((unsigned int)time(NULL));

View File

@@ -1,55 +0,0 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#include "test_common.h"
TEST_IMPL(camera_lookat) {
mat4 view1, view2;
vec3 center,
eye = {0.024f, 14.6f, 67.04f},
dir = {0.0f, 0.0f, -1.0f},
up = {0.0f, 1.0f, 0.0f};
glm_vec3_add(eye, dir, center);
glm_lookat(eye, center, up, view1);
glm_look(eye, dir, up, view2);
ASSERTIFY(test_assert_mat4_eq(view1, view2))
TEST_SUCCESS
}
TEST_IMPL(camera_decomp) {
mat4 proj, proj2;
vec4 sizes;
float aspect, fovy, nearZ, farZ;
aspect = 0.782f;
fovy = glm_rad(49.984f);
nearZ = 0.1f;
farZ = 100.0f;
glm_perspective(fovy, aspect, nearZ, farZ, proj);
ASSERT(fabsf(aspect - glm_persp_aspect(proj)) < GLM_FLT_EPSILON)
ASSERT(fabsf(fovy - glm_persp_fovy(proj)) < GLM_FLT_EPSILON)
ASSERT(fabsf(49.984f - glm_deg(glm_persp_fovy(proj))) < GLM_FLT_EPSILON)
glm_persp_sizes(proj, fovy, sizes);
glm_frustum(-sizes[0] * 0.5f,
sizes[0] * 0.5f,
-sizes[1] * 0.5f,
sizes[1] * 0.5f,
nearZ,
farZ,
proj2);
ASSERTIFY(test_assert_mat4_eq(proj, proj2))
TEST_SUCCESS
}

View File

@@ -11,16 +11,16 @@ TEST_IMPL(GLM_PREFIX, frustum) {
mat4 proj; mat4 proj;
vec4 vp = {0.0f, 0.0f, 800.0f, 600.0f}; vec4 vp = {0.0f, 0.0f, 800.0f, 600.0f};
float left, right, top, bottom, znear, zfar; float left, right, top, bottom, znear, zfar;
znear = 0.1f; znear = 0.1f;
zfar = 100.0f; zfar = 100.0f;
left = -100.0f; left = -100.0f;
right = 100.0f; right = 100.0f;
bottom = -100.0f; bottom = -100.0f;
top = 100.0f; top = 100.0f;
GLM(frustum)(left, right, bottom, top, znear, zfar, proj); GLM(frustum)(left, right, bottom, top, znear, zfar, proj);
ASSERT(test_eq(proj[0][1], 0.0f)) ASSERT(test_eq(proj[0][1], 0.0f))
ASSERT(test_eq(proj[0][2], 0.0f)) ASSERT(test_eq(proj[0][2], 0.0f))
ASSERT(test_eq(proj[0][3], 0.0f)) ASSERT(test_eq(proj[0][3], 0.0f))
@@ -42,22 +42,22 @@ TEST_IMPL(GLM_PREFIX, frustum) {
/* perspective test */ /* perspective test */
GLM(mat4_mulv)(proj, v1, v3); GLM(mat4_mulv)(proj, v1, v3);
GLM(project)(v3, proj, vp, v3); GLM(project)(v3, proj, vp, v3);
ASSERT(v3[0] > v1[0]) ASSERT(v3[0] > v1[0])
ASSERT(v3[1] > v1[1]) ASSERT(v3[1] > v1[1])
GLM(mat4_mulv)(proj, v2, v4); GLM(mat4_mulv)(proj, v2, v4);
GLM(project)(v4, proj, vp, v4); GLM(project)(v4, proj, vp, v4);
ASSERT(v4[0] < v3[0]) ASSERT(v4[0] < v3[0])
ASSERT(v4[1] < v3[1]) ASSERT(v4[1] < v3[1])
/* not infinity */ /* not infinity */
ASSERT(!GLM(vec4_isinf)(proj[0])) ASSERT(!GLM(vec4_isinf)(proj[0]))
ASSERT(!GLM(vec4_isinf)(proj[1])) ASSERT(!GLM(vec4_isinf)(proj[1]))
ASSERT(!GLM(vec4_isinf)(proj[2])) ASSERT(!GLM(vec4_isinf)(proj[2]))
ASSERT(!GLM(vec4_isinf)(proj[3])) ASSERT(!GLM(vec4_isinf)(proj[3]))
/* not NaN */ /* not NaN */
ASSERT(!GLM(vec4_isnan)(proj[0])) ASSERT(!GLM(vec4_isnan)(proj[0]))
ASSERT(!GLM(vec4_isnan)(proj[1])) ASSERT(!GLM(vec4_isnan)(proj[1]))
@@ -66,3 +66,50 @@ TEST_IMPL(GLM_PREFIX, frustum) {
TEST_SUCCESS TEST_SUCCESS
} }
TEST_IMPL(GLM_PREFIX, camera_lookat) {
mat4 view1, view2;
vec3 center,
eye = {0.024f, 14.6f, 67.04f},
dir = {0.0f, 0.0f, -1.0f},
up = {0.0f, 1.0f, 0.0f};
glm_vec3_add(eye, dir, center);
glm_lookat(eye, center, up, view1);
glm_look(eye, dir, up, view2);
ASSERTIFY(test_assert_mat4_eq(view1, view2))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, camera_decomp) {
mat4 proj, proj2;
vec4 sizes;
float aspect, fovy, nearZ, farZ;
aspect = 0.782f;
fovy = glm_rad(49.984f);
nearZ = 0.1f;
farZ = 100.0f;
glm_perspective(fovy, aspect, nearZ, farZ, proj);
ASSERT(fabsf(aspect - glm_persp_aspect(proj)) < GLM_FLT_EPSILON)
ASSERT(fabsf(fovy - glm_persp_fovy(proj)) < GLM_FLT_EPSILON)
ASSERT(fabsf(49.984f - glm_deg(glm_persp_fovy(proj))) < GLM_FLT_EPSILON)
glm_persp_sizes(proj, fovy, sizes);
glm_frustum(-sizes[0] * 0.5f,
sizes[0] * 0.5f,
-sizes[1] * 0.5f,
sizes[1] * 0.5f,
nearZ,
farZ,
proj2);
ASSERTIFY(test_assert_mat4_eq(proj, proj2))
TEST_SUCCESS
}

View File

@@ -6,15 +6,17 @@
*/ */
#include "test_common.h" #include "test_common.h"
#include "../../include/cglm/clipspace/persp_lh_no.h"
#include "../../include/cglm/call/clipspace/persp_lh_no.h"
TEST_IMPL(perspective_lh_no) { TEST_IMPL(GLM_PREFIX, perspective_lh_no) {
mat4 dst; mat4 dst;
const float fovy = glm_rad(45.0f); const float fovy = glm_rad(45.0f);
const float aspect = 640/480.0f; const float aspect = 640/480.0f;
const float zNearVal = 0.1f; const float zNearVal = 0.1f;
const float zFarVal = 100.0f; const float zFarVal = 100.0f;
glm_perspective_lh_no(fovy, aspect, zNearVal, zFarVal, dst); GLM(perspective_lh_no)(fovy, aspect, zNearVal, zFarVal, dst);
/* Sanity mk. I: longhand version */ /* Sanity mk. I: longhand version */
ASSERT(test_eq(dst[0][0], 1.0f / (tanf(fovy / 2) * aspect))) ASSERT(test_eq(dst[0][0], 1.0f / (tanf(fovy / 2) * aspect)))

View File

@@ -6,15 +6,17 @@
*/ */
#include "test_common.h" #include "test_common.h"
#include "../../include/cglm/clipspace/persp_lh_zo.h"
#include "../../include/cglm/call/clipspace/persp_lh_zo.h"
TEST_IMPL(perspective_lh_zo) { TEST_IMPL(GLM_PREFIX, perspective_lh_zo) {
mat4 dst; mat4 dst;
const float fovy = glm_rad(45.0f); const float fovy = glm_rad(45.0f);
const float aspect = 640/480.0f; const float aspect = 640/480.0f;
const float zNearVal = 0.1f; const float zNearVal = 0.1f;
const float zFarVal = 100.0f; const float zFarVal = 100.0f;
glm_perspective_lh_zo(fovy, aspect, zNearVal, zFarVal, dst); GLM(perspective_lh_zo)(fovy, aspect, zNearVal, zFarVal, dst);
/* Sanity mk. I: longhand version */ /* Sanity mk. I: longhand version */
ASSERT(test_eq(dst[0][0], 1.0f / (tanf(fovy / 2) * aspect))) ASSERT(test_eq(dst[0][0], 1.0f / (tanf(fovy / 2) * aspect)))

View File

@@ -6,15 +6,17 @@
*/ */
#include "test_common.h" #include "test_common.h"
#include "../../include/cglm/clipspace/persp_rh_no.h"
#include "../../include/cglm/call/clipspace/persp_rh_no.h"
TEST_IMPL(perspective_rh_no) { TEST_IMPL(GLM_PREFIX, perspective_rh_no) {
mat4 dst; mat4 dst;
const float fovy = glm_rad(45.0f); const float fovy = glm_rad(45.0f);
const float aspect = 640/480.0f; const float aspect = 640/480.0f;
const float zNearVal = 0.1f; const float zNearVal = 0.1f;
const float zFarVal = 100.0f; const float zFarVal = 100.0f;
glm_perspective_rh_no(fovy, aspect, zNearVal, zFarVal, dst); GLM(perspective_rh_no)(fovy, aspect, zNearVal, zFarVal, dst);
/* Sanity mk. I: longhand version */ /* Sanity mk. I: longhand version */
ASSERT(test_eq(dst[0][0], 1.0f / (tanf(fovy / 2) * aspect))) ASSERT(test_eq(dst[0][0], 1.0f / (tanf(fovy / 2) * aspect)))

View File

@@ -6,15 +6,17 @@
*/ */
#include "test_common.h" #include "test_common.h"
#include "../../include/cglm/clipspace/persp_rh_zo.h"
#include "../../include/cglm/call/clipspace/persp_rh_zo.h"
TEST_IMPL(perspective_rh_zo) { TEST_IMPL(GLM_PREFIX, perspective_rh_zo) {
mat4 dst; mat4 dst;
const float fovy = glm_rad(45.0f); const float fovy = glm_rad(45.0f);
const float aspect = 640/480.0f; const float aspect = 640/480.0f;
const float zNearVal = 0.1f; const float zNearVal = 0.1f;
const float zFarVal = 100.0f; const float zFarVal = 100.0f;
glm_perspective_rh_zo(fovy, aspect, zNearVal, zFarVal, dst); GLM(perspective_rh_zo)(fovy, aspect, zNearVal, zFarVal, dst);
/* Sanity mk. I: longhand version */ /* Sanity mk. I: longhand version */
ASSERT(test_eq(dst[0][0], 1 / (tanf(fovy / 2) * aspect))) ASSERT(test_eq(dst[0][0], 1 / (tanf(fovy / 2) * aspect)))

View File

@@ -10,6 +10,10 @@
#include "../include/common.h" #include "../include/common.h"
#if !defined(_WIN32) && !defined(_MSC_VER)
# pragma GCC diagnostic ignored "-Wstrict-prototypes"
#endif
void void
test_rand_mat4(mat4 dest); test_rand_mat4(mat4 dest);

View File

@@ -8,6 +8,7 @@
#include "test_common.h" #include "test_common.h"
#define A_MATRIX2x2 {{1,2},{5,6}} #define A_MATRIX2x2 {{1,2},{5,6}}
#define MAT2_ARRAY {1, 5, 2, 7}
#ifndef CGLM_TEST_MAT2_ONCE #ifndef CGLM_TEST_MAT2_ONCE
#define CGLM_TEST_MAT2_ONCE #define CGLM_TEST_MAT2_ONCE
@@ -80,7 +81,7 @@ TEST_IMPL(GLM_PREFIX, mat2_identity) {
} }
TEST_IMPL(GLM_PREFIX, mat2_identity_array) { TEST_IMPL(GLM_PREFIX, mat2_identity_array) {
int i, count; size_t i, count;
mat2 matrices[4] = { mat2 matrices[4] = {
A_MATRIX2x2, A_MATRIX2x2,
A_MATRIX2x2, A_MATRIX2x2,
@@ -283,4 +284,19 @@ TEST_IMPL(GLM_PREFIX, mat2_rmc) {
TEST_SUCCESS TEST_SUCCESS
} }
TEST_IMPL(GLM_PREFIX, mat2_make) {
mat2 dest;
unsigned int i, j;
float src[4] = MAT2_ARRAY;
GLM(mat2_make)(src, dest);
for (i = 0, j = 0; i < sizeof(src) / sizeof(float); i+=2, j++) {
ASSERT(test_eq(dest[j][0], src[i]))
ASSERT(test_eq(dest[j][1], src[i+1]))
}
TEST_SUCCESS
}
#undef A_MATRIX2x2 #undef A_MATRIX2x2

View File

@@ -8,6 +8,7 @@
#include "test_common.h" #include "test_common.h"
#define A_MATRIX {{1,2,3},{5,6,7},{9,10,11}} #define A_MATRIX {{1,2,3},{5,6,7},{9,10,11}}
#define MAT3_ARRAY {1, 5, 2, 7, 12, 1, 4, 6, 0}
TEST_IMPL(GLM_PREFIX, mat3_copy) { TEST_IMPL(GLM_PREFIX, mat3_copy) {
mat3 m1 = A_MATRIX; mat3 m1 = A_MATRIX;
@@ -35,7 +36,7 @@ TEST_IMPL(GLM_PREFIX, mat3_identity) {
} }
TEST_IMPL(GLM_PREFIX, mat3_identity_array) { TEST_IMPL(GLM_PREFIX, mat3_identity_array) {
int i, count; size_t i, count;
mat3 matrices[4] = { mat3 matrices[4] = {
A_MATRIX, A_MATRIX,
A_MATRIX, A_MATRIX,
@@ -308,4 +309,21 @@ TEST_IMPL(GLM_PREFIX, mat3_rmc) {
TEST_SUCCESS TEST_SUCCESS
} }
TEST_IMPL(GLM_PREFIX, mat3_make) {
mat3 dest;
unsigned int i, j;
float src[9] = MAT3_ARRAY;
GLM(mat3_make)(src, dest);
for (i = 0, j = 0; i < sizeof(src) / sizeof(float); i+=3, j++) {
ASSERT(test_eq(dest[j][0], src[i]))
ASSERT(test_eq(dest[j][1], src[i+1]))
ASSERT(test_eq(dest[j][2], src[i+2]))
}
TEST_SUCCESS
}
#undef A_MATRIX #undef A_MATRIX

View File

@@ -9,6 +9,7 @@
#define A_MATRIX {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}} #define A_MATRIX {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}}
#define A_MATRIX3 {{1,2,3},{5,6,7},{9,10,11}} #define A_MATRIX3 {{1,2,3},{5,6,7},{9,10,11}}
#define MAT4_ARRAY {1, 5, 2, 7, 12, 1, 4, 6, 0, 8, 1, 0, 6, 5, 0, 1}
TEST_IMPL(GLM_PREFIX, mat4_ucopy) { TEST_IMPL(GLM_PREFIX, mat4_ucopy) {
mat4 m1 = A_MATRIX; mat4 m1 = A_MATRIX;
@@ -47,7 +48,7 @@ TEST_IMPL(GLM_PREFIX, mat4_identity) {
} }
TEST_IMPL(GLM_PREFIX, mat4_identity_array) { TEST_IMPL(GLM_PREFIX, mat4_identity_array) {
int i, count; size_t i, count;
mat4 matrices[4] = { mat4 matrices[4] = {
A_MATRIX, A_MATRIX,
A_MATRIX, A_MATRIX,
@@ -484,5 +485,22 @@ TEST_IMPL(GLM_PREFIX, mat4_rmc) {
TEST_SUCCESS TEST_SUCCESS
} }
TEST_IMPL(GLM_PREFIX, mat4_make) {
mat4 dest;
unsigned int i, j;
float src[16] = MAT4_ARRAY;
GLM(mat4_make)(src, dest);
for (i = 0, j = 0; i < sizeof(src) / sizeof(float); i+=4, j++) {
ASSERT(test_eq(dest[j][0], src[i]))
ASSERT(test_eq(dest[j][1], src[i+1]))
ASSERT(test_eq(dest[j][2], src[i+2]))
ASSERT(test_eq(dest[j][3], src[i+3]))
}
TEST_SUCCESS
}
#undef A_MATRIX #undef A_MATRIX
#undef A_MATRIX3 #undef A_MATRIX3

View File

@@ -56,7 +56,7 @@ TEST_IMPL(GLM_PREFIX, quat_identity) {
} }
TEST_IMPL(GLM_PREFIX, quat_identity_array) { TEST_IMPL(GLM_PREFIX, quat_identity_array) {
int i, count; size_t i, count;
versor quats[4] = { versor quats[4] = {
{1.0f, 2.0f, 3.0f, 4.0f}, {1.0f, 2.0f, 3.0f, 4.0f},
{1.0f, 2.0f, 3.0f, 4.0f}, {1.0f, 2.0f, 3.0f, 4.0f},

View File

@@ -28,7 +28,11 @@
#include "test_affine2d.h" #include "test_affine2d.h"
#include "test_affine_mat.h" #include "test_affine_mat.h"
#include "test_ray.h" #include "test_ray.h"
#include "test_camera.h" #include "test_cam.h"
#include "test_cam_lh_no.h"
#include "test_cam_lh_zo.h"
#include "test_cam_rh_no.h"
#include "test_cam_rh_zo.h"
#undef GLM #undef GLM
#undef GLM_PREFIX #undef GLM_PREFIX
@@ -55,7 +59,11 @@
#include "test_affine2d.h" #include "test_affine2d.h"
#include "test_affine_mat.h" #include "test_affine_mat.h"
#include "test_ray.h" #include "test_ray.h"
#include "test_camera.h" #include "test_cam.h"
#include "test_cam_lh_no.h"
#include "test_cam_lh_zo.h"
#include "test_cam_rh_no.h"
#include "test_cam_rh_zo.h"
#undef GLM #undef GLM
#undef GLM_PREFIX #undef GLM_PREFIX

View File

@@ -124,6 +124,7 @@ TEST_DECLARE(glm_mat4_inv_precise)
TEST_DECLARE(glm_mat4_swap_col) TEST_DECLARE(glm_mat4_swap_col)
TEST_DECLARE(glm_mat4_swap_row) TEST_DECLARE(glm_mat4_swap_row)
TEST_DECLARE(glm_mat4_rmc) TEST_DECLARE(glm_mat4_rmc)
TEST_DECLARE(glm_mat4_make)
TEST_DECLARE(glmc_mat4_ucopy) TEST_DECLARE(glmc_mat4_ucopy)
TEST_DECLARE(glmc_mat4_copy) TEST_DECLARE(glmc_mat4_copy)
@@ -150,6 +151,7 @@ TEST_DECLARE(glmc_mat4_inv_fast)
TEST_DECLARE(glmc_mat4_swap_col) TEST_DECLARE(glmc_mat4_swap_col)
TEST_DECLARE(glmc_mat4_swap_row) TEST_DECLARE(glmc_mat4_swap_row)
TEST_DECLARE(glmc_mat4_rmc) TEST_DECLARE(glmc_mat4_rmc)
TEST_DECLARE(glmc_mat4_make)
/* mat3 */ /* mat3 */
TEST_DECLARE(glm_mat3_copy) TEST_DECLARE(glm_mat3_copy)
@@ -168,6 +170,7 @@ TEST_DECLARE(glm_mat3_inv)
TEST_DECLARE(glm_mat3_swap_col) TEST_DECLARE(glm_mat3_swap_col)
TEST_DECLARE(glm_mat3_swap_row) TEST_DECLARE(glm_mat3_swap_row)
TEST_DECLARE(glm_mat3_rmc) TEST_DECLARE(glm_mat3_rmc)
TEST_DECLARE(glm_mat3_make)
TEST_DECLARE(glmc_mat3_copy) TEST_DECLARE(glmc_mat3_copy)
TEST_DECLARE(glmc_mat3_identity) TEST_DECLARE(glmc_mat3_identity)
@@ -185,6 +188,7 @@ TEST_DECLARE(glmc_mat3_inv)
TEST_DECLARE(glmc_mat3_swap_col) TEST_DECLARE(glmc_mat3_swap_col)
TEST_DECLARE(glmc_mat3_swap_row) TEST_DECLARE(glmc_mat3_swap_row)
TEST_DECLARE(glmc_mat3_rmc) TEST_DECLARE(glmc_mat3_rmc)
TEST_DECLARE(glmc_mat3_make)
TEST_DECLARE(MACRO_GLM_MAT2_IDENTITY_INIT) TEST_DECLARE(MACRO_GLM_MAT2_IDENTITY_INIT)
TEST_DECLARE(MACRO_GLM_MAT2_ZERO_INIT) TEST_DECLARE(MACRO_GLM_MAT2_ZERO_INIT)
@@ -205,6 +209,7 @@ TEST_DECLARE(glm_mat2_inv)
TEST_DECLARE(glm_mat2_swap_col) TEST_DECLARE(glm_mat2_swap_col)
TEST_DECLARE(glm_mat2_swap_row) TEST_DECLARE(glm_mat2_swap_row)
TEST_DECLARE(glm_mat2_rmc) TEST_DECLARE(glm_mat2_rmc)
TEST_DECLARE(glm_mat2_make)
TEST_DECLARE(glmc_mat2_copy) TEST_DECLARE(glmc_mat2_copy)
TEST_DECLARE(glmc_mat2_identity) TEST_DECLARE(glmc_mat2_identity)
@@ -221,14 +226,22 @@ TEST_DECLARE(glmc_mat2_inv)
TEST_DECLARE(glmc_mat2_swap_col) TEST_DECLARE(glmc_mat2_swap_col)
TEST_DECLARE(glmc_mat2_swap_row) TEST_DECLARE(glmc_mat2_swap_row)
TEST_DECLARE(glmc_mat2_rmc) TEST_DECLARE(glmc_mat2_rmc)
TEST_DECLARE(glmc_mat2_make)
/* camera (incl [LR]H cross [NZ]O) */ /* camera (incl [LR]H cross [NZ]O) */
TEST_DECLARE(perspective_lh_zo) TEST_DECLARE(glm_perspective_lh_zo)
TEST_DECLARE(perspective_rh_zo) TEST_DECLARE(glm_perspective_rh_zo)
TEST_DECLARE(perspective_lh_no) TEST_DECLARE(glm_perspective_lh_no)
TEST_DECLARE(perspective_rh_no) TEST_DECLARE(glm_perspective_rh_no)
TEST_DECLARE(camera_lookat) TEST_DECLARE(glm_camera_lookat)
TEST_DECLARE(camera_decomp) TEST_DECLARE(glm_camera_decomp)
TEST_DECLARE(glmc_perspective_lh_zo)
TEST_DECLARE(glmc_perspective_rh_zo)
TEST_DECLARE(glmc_perspective_lh_no)
TEST_DECLARE(glmc_perspective_rh_no)
TEST_DECLARE(glmc_camera_lookat)
TEST_DECLARE(glmc_camera_decomp)
TEST_DECLARE(glm_frustum) TEST_DECLARE(glm_frustum)
@@ -958,6 +971,7 @@ TEST_LIST {
TEST_ENTRY(glm_mat4_swap_col) TEST_ENTRY(glm_mat4_swap_col)
TEST_ENTRY(glm_mat4_swap_row) TEST_ENTRY(glm_mat4_swap_row)
TEST_ENTRY(glm_mat4_rmc) TEST_ENTRY(glm_mat4_rmc)
TEST_ENTRY(glm_mat4_make)
TEST_ENTRY(glmc_mat4_ucopy) TEST_ENTRY(glmc_mat4_ucopy)
TEST_ENTRY(glmc_mat4_copy) TEST_ENTRY(glmc_mat4_copy)
@@ -984,6 +998,7 @@ TEST_LIST {
TEST_ENTRY(glmc_mat4_swap_col) TEST_ENTRY(glmc_mat4_swap_col)
TEST_ENTRY(glmc_mat4_swap_row) TEST_ENTRY(glmc_mat4_swap_row)
TEST_ENTRY(glmc_mat4_rmc) TEST_ENTRY(glmc_mat4_rmc)
TEST_ENTRY(glmc_mat4_make)
/* mat3 */ /* mat3 */
TEST_ENTRY(glm_mat3_copy) TEST_ENTRY(glm_mat3_copy)
@@ -1002,6 +1017,7 @@ TEST_LIST {
TEST_ENTRY(glm_mat3_swap_col) TEST_ENTRY(glm_mat3_swap_col)
TEST_ENTRY(glm_mat3_swap_row) TEST_ENTRY(glm_mat3_swap_row)
TEST_ENTRY(glm_mat3_rmc) TEST_ENTRY(glm_mat3_rmc)
TEST_ENTRY(glm_mat3_make)
TEST_ENTRY(glmc_mat3_copy) TEST_ENTRY(glmc_mat3_copy)
TEST_ENTRY(glmc_mat3_identity) TEST_ENTRY(glmc_mat3_identity)
@@ -1019,6 +1035,7 @@ TEST_LIST {
TEST_ENTRY(glmc_mat3_swap_col) TEST_ENTRY(glmc_mat3_swap_col)
TEST_ENTRY(glmc_mat3_swap_row) TEST_ENTRY(glmc_mat3_swap_row)
TEST_ENTRY(glmc_mat3_rmc) TEST_ENTRY(glmc_mat3_rmc)
TEST_ENTRY(glmc_mat3_make)
TEST_ENTRY(MACRO_GLM_MAT2_IDENTITY_INIT) TEST_ENTRY(MACRO_GLM_MAT2_IDENTITY_INIT)
TEST_ENTRY(MACRO_GLM_MAT2_ZERO_INIT) TEST_ENTRY(MACRO_GLM_MAT2_ZERO_INIT)
@@ -1039,6 +1056,7 @@ TEST_LIST {
TEST_ENTRY(glm_mat2_swap_col) TEST_ENTRY(glm_mat2_swap_col)
TEST_ENTRY(glm_mat2_swap_row) TEST_ENTRY(glm_mat2_swap_row)
TEST_ENTRY(glm_mat2_rmc) TEST_ENTRY(glm_mat2_rmc)
TEST_ENTRY(glm_mat2_make)
TEST_ENTRY(glmc_mat2_copy) TEST_ENTRY(glmc_mat2_copy)
TEST_ENTRY(glmc_mat2_identity) TEST_ENTRY(glmc_mat2_identity)
@@ -1055,14 +1073,22 @@ TEST_LIST {
TEST_ENTRY(glmc_mat2_swap_col) TEST_ENTRY(glmc_mat2_swap_col)
TEST_ENTRY(glmc_mat2_swap_row) TEST_ENTRY(glmc_mat2_swap_row)
TEST_ENTRY(glmc_mat2_rmc) TEST_ENTRY(glmc_mat2_rmc)
TEST_ENTRY(glmc_mat2_make)
/* camera (incl [LR]H cross [NZ]O) */ /* camera (incl [LR]H cross [NZ]O) */
TEST_ENTRY(perspective_lh_zo) TEST_ENTRY(glm_perspective_lh_zo)
TEST_ENTRY(perspective_rh_zo) TEST_ENTRY(glm_perspective_rh_zo)
TEST_ENTRY(perspective_lh_no) TEST_ENTRY(glm_perspective_lh_no)
TEST_ENTRY(perspective_rh_no) TEST_ENTRY(glm_perspective_rh_no)
TEST_ENTRY(camera_lookat) TEST_ENTRY(glm_camera_lookat)
TEST_ENTRY(camera_decomp) TEST_ENTRY(glm_camera_decomp)
TEST_ENTRY(glmc_perspective_lh_zo)
TEST_ENTRY(glmc_perspective_rh_zo)
TEST_ENTRY(glmc_perspective_lh_no)
TEST_ENTRY(glmc_perspective_rh_no)
TEST_ENTRY(glmc_camera_lookat)
TEST_ENTRY(glmc_camera_decomp)
TEST_ENTRY(glm_frustum) TEST_ENTRY(glm_frustum)

View File

@@ -46,11 +46,6 @@
<ClCompile Include="..\test\runner.c" /> <ClCompile Include="..\test\runner.c" />
<ClCompile Include="..\test\src\tests.c" /> <ClCompile Include="..\test\src\tests.c" />
<ClCompile Include="..\test\src\test_bezier.c" /> <ClCompile Include="..\test\src\test_bezier.c" />
<ClCompile Include="..\test\src\test_cam.c" />
<ClCompile Include="..\test\src\test_cam_lh_no.c" />
<ClCompile Include="..\test\src\test_cam_lh_zo.c" />
<ClCompile Include="..\test\src\test_cam_rh_no.c" />
<ClCompile Include="..\test\src\test_cam_rh_zo.c" />
<ClCompile Include="..\test\src\test_clamp.c" /> <ClCompile Include="..\test\src\test_clamp.c" />
<ClCompile Include="..\test\src\test_common.c" /> <ClCompile Include="..\test\src\test_common.c" />
<ClCompile Include="..\test\src\test_euler.c" /> <ClCompile Include="..\test\src\test_euler.c" />
@@ -61,7 +56,11 @@
<ClInclude Include="..\test\src\test_affine.h" /> <ClInclude Include="..\test\src\test_affine.h" />
<ClInclude Include="..\test\src\test_affine2d.h" /> <ClInclude Include="..\test\src\test_affine2d.h" />
<ClInclude Include="..\test\src\test_affine_mat.h" /> <ClInclude Include="..\test\src\test_affine_mat.h" />
<ClInclude Include="..\test\src\test_camera.h" /> <ClInclude Include="..\test\src\test_cam.h" />
<ClInclude Include="..\test\src\test_cam_lh_no.h" />
<ClInclude Include="..\test\src\test_cam_lh_zo.h" />
<ClInclude Include="..\test\src\test_cam_rh_no.h" />
<ClInclude Include="..\test\src\test_cam_rh_zo.h" />
<ClInclude Include="..\test\src\test_common.h" /> <ClInclude Include="..\test\src\test_common.h" />
<ClInclude Include="..\test\src\test_ivec2.h" /> <ClInclude Include="..\test\src\test_ivec2.h" />
<ClInclude Include="..\test\src\test_ivec3.h" /> <ClInclude Include="..\test\src\test_ivec3.h" />
@@ -72,10 +71,10 @@
<ClInclude Include="..\test\src\test_plane.h" /> <ClInclude Include="..\test\src\test_plane.h" />
<ClInclude Include="..\test\src\test_project.h" /> <ClInclude Include="..\test\src\test_project.h" />
<ClInclude Include="..\test\src\test_quat.h" /> <ClInclude Include="..\test\src\test_quat.h" />
<ClInclude Include="..\test\src\test_ray.h" />
<ClInclude Include="..\test\src\test_vec2.h" /> <ClInclude Include="..\test\src\test_vec2.h" />
<ClInclude Include="..\test\src\test_vec3.h" /> <ClInclude Include="..\test\src\test_vec3.h" />
<ClInclude Include="..\test\src\test_vec4.h" /> <ClInclude Include="..\test\src\test_vec4.h" />
<ClInclude Include="..\test\src\test_ray.h" />
<ClInclude Include="..\test\tests.h" /> <ClInclude Include="..\test\tests.h" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@@ -17,9 +17,6 @@
<ClCompile Include="..\test\src\test_bezier.c"> <ClCompile Include="..\test\src\test_bezier.c">
<Filter>src</Filter> <Filter>src</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\test\src\test_cam.c">
<Filter>src</Filter>
</ClCompile>
<ClCompile Include="..\test\src\test_clamp.c"> <ClCompile Include="..\test\src\test_clamp.c">
<Filter>src</Filter> <Filter>src</Filter>
</ClCompile> </ClCompile>
@@ -35,18 +32,6 @@
<ClCompile Include="..\test\src\tests.c"> <ClCompile Include="..\test\src\tests.c">
<Filter>src</Filter> <Filter>src</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\test\src\test_cam_lh_no.c">
<Filter>src</Filter>
</ClCompile>
<ClCompile Include="..\test\src\test_cam_lh_zo.c">
<Filter>src</Filter>
</ClCompile>
<ClCompile Include="..\test\src\test_cam_rh_no.c">
<Filter>src</Filter>
</ClCompile>
<ClCompile Include="..\test\src\test_cam_rh_zo.c">
<Filter>src</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="..\test\tests.h"> <ClInclude Include="..\test\tests.h">
@@ -58,46 +43,28 @@
<ClInclude Include="..\test\include\common.h"> <ClInclude Include="..\test\include\common.h">
<Filter>include</Filter> <Filter>include</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\test\src\test_mat3.h">
<Filter>src</Filter>
</ClInclude>
<ClInclude Include="..\test\src\test_mat4.h">
<Filter>src</Filter>
</ClInclude>
<ClInclude Include="..\test\src\test_project.h">
<Filter>src</Filter>
</ClInclude>
<ClInclude Include="..\test\src\test_quat.h">
<Filter>src</Filter>
</ClInclude>
<ClInclude Include="..\test\src\test_vec3.h">
<Filter>src</Filter>
</ClInclude>
<ClInclude Include="..\test\src\test_vec4.h">
<Filter>src</Filter>
</ClInclude>
<ClInclude Include="..\test\src\test_affine.h"> <ClInclude Include="..\test\src\test_affine.h">
<Filter>src</Filter> <Filter>src</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\test\src\test_affine_mat.h"> <ClInclude Include="..\test\src\test_affine_mat.h">
<Filter>src</Filter> <Filter>src</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\test\src\test_mat2.h">
<Filter>src</Filter>
</ClInclude>
<ClInclude Include="..\test\src\test_plane.h">
<Filter>src</Filter>
</ClInclude>
<ClInclude Include="..\test\src\test_vec2.h">
<Filter>src</Filter>
</ClInclude>
<ClInclude Include="..\test\src\test_ray.h">
<Filter>src</Filter>
</ClInclude>
<ClInclude Include="..\test\src\test_affine2d.h"> <ClInclude Include="..\test\src\test_affine2d.h">
<Filter>src</Filter> <Filter>src</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\test\src\test_camera.h"> <ClInclude Include="..\test\src\test_cam.h">
<Filter>src</Filter>
</ClInclude>
<ClInclude Include="..\test\src\test_cam_lh_no.h">
<Filter>src</Filter>
</ClInclude>
<ClInclude Include="..\test\src\test_cam_lh_zo.h">
<Filter>src</Filter>
</ClInclude>
<ClInclude Include="..\test\src\test_cam_rh_no.h">
<Filter>src</Filter>
</ClInclude>
<ClInclude Include="..\test\src\test_cam_rh_zo.h">
<Filter>src</Filter> <Filter>src</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\test\src\test_ivec2.h"> <ClInclude Include="..\test\src\test_ivec2.h">
@@ -109,5 +76,35 @@
<ClInclude Include="..\test\src\test_ivec4.h"> <ClInclude Include="..\test\src\test_ivec4.h">
<Filter>src</Filter> <Filter>src</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\test\src\test_mat2.h">
<Filter>src</Filter>
</ClInclude>
<ClInclude Include="..\test\src\test_mat3.h">
<Filter>src</Filter>
</ClInclude>
<ClInclude Include="..\test\src\test_mat4.h">
<Filter>src</Filter>
</ClInclude>
<ClInclude Include="..\test\src\test_plane.h">
<Filter>src</Filter>
</ClInclude>
<ClInclude Include="..\test\src\test_project.h">
<Filter>src</Filter>
</ClInclude>
<ClInclude Include="..\test\src\test_quat.h">
<Filter>src</Filter>
</ClInclude>
<ClInclude Include="..\test\src\test_ray.h">
<Filter>src</Filter>
</ClInclude>
<ClInclude Include="..\test\src\test_vec2.h">
<Filter>src</Filter>
</ClInclude>
<ClInclude Include="..\test\src\test_vec3.h">
<Filter>src</Filter>
</ClInclude>
<ClInclude Include="..\test\src\test_vec4.h">
<Filter>src</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
</Project> </Project>