mirror of
https://github.com/recp/cglm.git
synced 2026-02-17 03:39:05 +00:00
Compare commits
132 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
010b88ee7a | ||
|
|
702da626f1 | ||
|
|
8e008511f4 | ||
|
|
eb0d47cfa1 | ||
|
|
638b9f6dbe | ||
|
|
ab20ebc28c | ||
|
|
701a95583a | ||
|
|
ad9370537c | ||
|
|
43ae3b332a | ||
|
|
8a068c3291 | ||
|
|
4a7c153d2d | ||
|
|
7b0f62f1eb | ||
|
|
0c8dc070d5 | ||
|
|
0822d46cd9 | ||
|
|
3fca734c30 | ||
|
|
5995269195 | ||
|
|
6b32b5dc35 | ||
|
|
a1f7afe055 | ||
|
|
81ae182972 | ||
|
|
de85a4eb2b | ||
|
|
8ac1347f8a | ||
|
|
e7a0906bc2 | ||
|
|
6aa8df8e9b | ||
|
|
2278eba93c | ||
|
|
5ee9bb88df | ||
|
|
349dc274f4 | ||
|
|
b9f9548b06 | ||
|
|
c630293c7d | ||
|
|
406d09e085 | ||
|
|
65de029acb | ||
|
|
f8784ffe8a | ||
|
|
cf8dc82783 | ||
|
|
9af0ebd142 | ||
|
|
82a195f26a | ||
|
|
6abe3f05ab | ||
|
|
f53fd45026 | ||
|
|
c67158ac59 | ||
|
|
af7f8a5436 | ||
|
|
c3b5bb869a | ||
|
|
d6c34d3330 | ||
|
|
13a742f48c | ||
|
|
0330be853c | ||
|
|
5cb800bf29 | ||
|
|
1d19948f30 | ||
|
|
d89c01b39f | ||
|
|
b9aa14d25e | ||
|
|
8ad273475f | ||
|
|
c8211b3a62 | ||
|
|
11dae5126b | ||
|
|
390a5035a8 | ||
|
|
267348af03 | ||
|
|
f9abf2a7df | ||
|
|
f0ffef7820 | ||
|
|
4b9b7aeb20 | ||
|
|
1a74361dfb | ||
|
|
c83f25343f | ||
|
|
f3ea5b4f3e | ||
|
|
9987e1374b | ||
|
|
464b2178ce | ||
|
|
c253769fcd | ||
|
|
b893c79086 | ||
|
|
2336256808 | ||
|
|
52df54e306 | ||
|
|
381e66349a | ||
|
|
7cdeada701 | ||
|
|
841257a208 | ||
|
|
212cf3b22d | ||
|
|
ca9b8ceac3 | ||
|
|
5b0e161502 | ||
|
|
fb23d1998e | ||
|
|
b2084fbacf | ||
|
|
2ea9308361 | ||
|
|
56cbacd9f6 | ||
|
|
1700187f65 | ||
|
|
36024367bc | ||
|
|
dcf5b5c1c4 | ||
|
|
ce09e543ef | ||
|
|
f2073b2277 | ||
|
|
7c10840a85 | ||
|
|
37c2650b0a | ||
|
|
3a48e4cd84 | ||
|
|
378e26140e | ||
|
|
7b25cbb9cb | ||
|
|
bffe103c37 | ||
|
|
51ffe09589 | ||
|
|
d7b37ba245 | ||
|
|
d0671b3e7a | ||
|
|
e98311259c | ||
|
|
37cf6b3206 | ||
|
|
a062f002a0 | ||
|
|
9c57d4b247 | ||
|
|
9fe5efb410 | ||
|
|
495afb8a3d | ||
|
|
ba694f4aec | ||
|
|
8ac767fd2c | ||
|
|
e5fd735e62 | ||
|
|
7797ee7b06 | ||
|
|
78f38db480 | ||
|
|
79087a9813 | ||
|
|
a1283282ef | ||
|
|
0377b99f80 | ||
|
|
971d753392 | ||
|
|
033d0b0fed | ||
|
|
39dc61af54 | ||
|
|
f4f9d85caa | ||
|
|
92f196965e | ||
|
|
fbcbccbf01 | ||
|
|
cf41151534 | ||
|
|
3af861b61e | ||
|
|
0ed88cfda8 | ||
|
|
551ed1bd20 | ||
|
|
a328317c70 | ||
|
|
5aa047efdf | ||
|
|
32e5784564 | ||
|
|
80c2b3712d | ||
|
|
176cc28510 | ||
|
|
712cbee580 | ||
|
|
981fd5ee44 | ||
|
|
092da3e189 | ||
|
|
9ab9e95ce5 | ||
|
|
b46a4ccee5 | ||
|
|
5da864f345 | ||
|
|
3640e402da | ||
|
|
d86f5df776 | ||
|
|
cb54a8b8c5 | ||
|
|
8cb6fa792c | ||
|
|
ef89cd7236 | ||
|
|
a4c7c5e1ba | ||
|
|
2827fbfa79 | ||
|
|
ad823d9681 | ||
|
|
047ed259ae | ||
|
|
0729fd40a4 |
24
.github/workflows/ccpp.yml
vendored
24
.github/workflows/ccpp.yml
vendored
@@ -1,24 +0,0 @@
|
|||||||
name: C/C++ CI
|
|
||||||
|
|
||||||
on: [push]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
|
|
||||||
runs-on: ${{ matrix.os }}
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
os: [ubuntu-latest, macOS-latest]
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v1
|
|
||||||
- name: dependencies
|
|
||||||
run: sh ./build-deps.sh
|
|
||||||
- name: autogen
|
|
||||||
run: sh autogen.sh
|
|
||||||
- name: configure
|
|
||||||
run: ./configure
|
|
||||||
- name: make
|
|
||||||
run: make
|
|
||||||
- name: make check
|
|
||||||
run: make check
|
|
||||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -51,7 +51,6 @@ cscope.*
|
|||||||
test/*.trs
|
test/*.trs
|
||||||
test/test_*
|
test/test_*
|
||||||
*.log
|
*.log
|
||||||
test-*
|
|
||||||
test/.libs/*
|
test/.libs/*
|
||||||
test/tests
|
test/tests
|
||||||
cglm_arm/*
|
cglm_arm/*
|
||||||
@@ -71,3 +70,5 @@ win/x85
|
|||||||
win/Debug
|
win/Debug
|
||||||
cglm-test-ios*
|
cglm-test-ios*
|
||||||
/cglm.pc
|
/cglm.pc
|
||||||
|
test-driver
|
||||||
|
Default-568h@2x.png
|
||||||
|
|||||||
3
.gitmodules
vendored
3
.gitmodules
vendored
@@ -1,3 +0,0 @@
|
|||||||
[submodule "test/lib/cmocka"]
|
|
||||||
path = test/lib/cmocka
|
|
||||||
url = git://git.cryptomilk.org/projects/cmocka.git
|
|
||||||
|
|||||||
12
.travis.yml
12
.travis.yml
@@ -37,10 +37,9 @@ branches:
|
|||||||
- master
|
- master
|
||||||
|
|
||||||
script:
|
script:
|
||||||
- sh ./build-deps.sh
|
|
||||||
- sh ./autogen.sh
|
- sh ./autogen.sh
|
||||||
- if [[ "$CC" == "gcc" && "$CODE_COVERAGE" == "ON" ]]; then
|
- if [[ "$CC" == "gcc" && "$CODE_COVERAGE" == "ON" ]]; then
|
||||||
./configure CFLAGS="-ftest-coverage -fprofile-arcs";
|
./configure CFLAGS="-ftest-coverage -fprofile-arcs -coverage";
|
||||||
else
|
else
|
||||||
./configure;
|
./configure;
|
||||||
fi
|
fi
|
||||||
@@ -49,14 +48,15 @@ script:
|
|||||||
|
|
||||||
after_success:
|
after_success:
|
||||||
- if [[ "$CC" == "gcc" && "$CODE_COVERAGE" == "ON" ]]; then
|
- if [[ "$CC" == "gcc" && "$CODE_COVERAGE" == "ON" ]]; then
|
||||||
pip install --user cpp-coveralls &&
|
pip install --user cpp-coveralls &&
|
||||||
coveralls
|
coveralls
|
||||||
--build-root .
|
--build-root .
|
||||||
--exclude lib
|
--exclude lib
|
||||||
--exclude test
|
--exclude test
|
||||||
--gcov-options '\-lp'
|
--gcov-options '\-lp'
|
||||||
--verbose;
|
--verbose &&
|
||||||
|
bash <(curl -s https://codecov.io/bash);
|
||||||
fi
|
fi
|
||||||
|
|
||||||
after_failure:
|
# after_failure:
|
||||||
- cat ./test-suite.log
|
# - cat ./test-suite.log
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
# CONTRIBUTING
|
# CONTRIBUTING
|
||||||
|
|
||||||
Any contributions (code, documentation, ...) are welcome. This project uses [cmocka](http://cmocka.org) for testing, you may need to check their documentation
|
Any contributions (code, documentation, ...) are welcome.
|
||||||
|
|
||||||
# New Features
|
# New Features
|
||||||
- This library may not accept all new features, it is better to create an issue and get approval before coding
|
- This library may not accept all new features, it is better to create an issue and get approval before coding
|
||||||
- You must add test for every new feature
|
- You must add test for every new feature
|
||||||
- The feature must be compiled in both UNIX/POSIX systems (e.g. macos, linux...) and Windows
|
- The feature must be compiled on both UNIX/POSIX systems (e.g. macos, linux...) and Windows
|
||||||
|
|
||||||
# Code Style
|
# Code Style
|
||||||
This library is written with C99, don't try to add C++ files (yes it can compiled into lib),
|
This library is written with C99, don't try to add C++ files (yes it can compiled into lib),
|
||||||
|
|||||||
4
CREDITS
4
CREDITS
@@ -61,3 +61,7 @@ https://forums.khronos.org/showthread.php/10264-Animations-in-1-4-1-release-note
|
|||||||
https://forums.khronos.org/showthread.php/10644-Animation-Bezier-interpolation
|
https://forums.khronos.org/showthread.php/10644-Animation-Bezier-interpolation
|
||||||
https://forums.khronos.org/showthread.php/10387-2D-Tangents-in-Bezier-Splines?p=34164&viewfull=1#post34164
|
https://forums.khronos.org/showthread.php/10387-2D-Tangents-in-Bezier-Splines?p=34164&viewfull=1#post34164
|
||||||
https://forums.khronos.org/showthread.php/10651-Animation-TCB-Spline-Interpolation-in-COLLADA?highlight=bezier
|
https://forums.khronos.org/showthread.php/10651-Animation-TCB-Spline-Interpolation-in-COLLADA?highlight=bezier
|
||||||
|
|
||||||
|
12. vec2 cross product
|
||||||
|
http://allenchou.net/2013/07/cross-product-of-2d-vectors/
|
||||||
|
|
||||||
|
|||||||
49
Makefile.am
49
Makefile.am
@@ -7,23 +7,21 @@
|
|||||||
#******************************************************************************
|
#******************************************************************************
|
||||||
|
|
||||||
ACLOCAL_AMFLAGS = -I m4
|
ACLOCAL_AMFLAGS = -I m4
|
||||||
|
|
||||||
AM_CFLAGS = -Wall \
|
AM_CFLAGS = -Wall \
|
||||||
-std=gnu99 \
|
-std=gnu11 \
|
||||||
-O3 \
|
-O3 \
|
||||||
-Wstrict-aliasing=2 \
|
-Wstrict-aliasing=2 \
|
||||||
-fstrict-aliasing \
|
-fstrict-aliasing \
|
||||||
-pedantic
|
-pedantic \
|
||||||
|
-Werror=strict-prototypes
|
||||||
|
|
||||||
lib_LTLIBRARIES = libcglm.la
|
lib_LTLIBRARIES = libcglm.la
|
||||||
libcglm_la_LDFLAGS = -no-undefined -version-info 0:1:0
|
libcglm_la_LDFLAGS = -no-undefined -version-info 0:1:0
|
||||||
|
|
||||||
checkLDFLAGS = -L./.libs \
|
checkLDFLAGS = -L./.libs \
|
||||||
-L./test/lib/cmocka/build/src \
|
|
||||||
-lcmocka \
|
|
||||||
-lm \
|
-lm \
|
||||||
-lcglm
|
-lcglm
|
||||||
checkCFLAGS = -I./test/lib/cmocka/include \
|
checkCFLAGS = $(AM_CFLAGS) \
|
||||||
-I./include
|
-I./include
|
||||||
|
|
||||||
check_PROGRAMS = test/tests
|
check_PROGRAMS = test/tests
|
||||||
@@ -34,15 +32,20 @@ test_tests_CFLAGS = $(checkCFLAGS)
|
|||||||
|
|
||||||
cglmdir=$(includedir)/cglm
|
cglmdir=$(includedir)/cglm
|
||||||
cglm_HEADERS = include/cglm/version.h \
|
cglm_HEADERS = include/cglm/version.h \
|
||||||
|
include/cglm/common.h \
|
||||||
|
include/cglm/types.h \
|
||||||
|
include/cglm/types-struct.h \
|
||||||
include/cglm/cglm.h \
|
include/cglm/cglm.h \
|
||||||
include/cglm/call.h \
|
include/cglm/call.h \
|
||||||
|
include/cglm/struct.h \
|
||||||
include/cglm/cam.h \
|
include/cglm/cam.h \
|
||||||
include/cglm/io.h \
|
include/cglm/io.h \
|
||||||
include/cglm/mat4.h \
|
include/cglm/mat4.h \
|
||||||
include/cglm/mat3.h \
|
include/cglm/mat3.h \
|
||||||
include/cglm/types.h \
|
include/cglm/mat2.h \
|
||||||
include/cglm/common.h \
|
|
||||||
include/cglm/affine.h \
|
include/cglm/affine.h \
|
||||||
|
include/cglm/vec2.h \
|
||||||
|
include/cglm/vec2-ext.h \
|
||||||
include/cglm/vec3.h \
|
include/cglm/vec3.h \
|
||||||
include/cglm/vec3-ext.h \
|
include/cglm/vec3-ext.h \
|
||||||
include/cglm/vec4.h \
|
include/cglm/vec4.h \
|
||||||
@@ -60,12 +63,13 @@ cglm_HEADERS = include/cglm/version.h \
|
|||||||
include/cglm/ease.h \
|
include/cglm/ease.h \
|
||||||
include/cglm/curve.h \
|
include/cglm/curve.h \
|
||||||
include/cglm/bezier.h \
|
include/cglm/bezier.h \
|
||||||
include/cglm/types-struct.h \
|
include/cglm/applesimd.h
|
||||||
include/cglm/struct.h
|
|
||||||
|
|
||||||
cglm_calldir=$(includedir)/cglm/call
|
cglm_calldir=$(includedir)/cglm/call
|
||||||
cglm_call_HEADERS = include/cglm/call/mat4.h \
|
cglm_call_HEADERS = include/cglm/call/mat4.h \
|
||||||
include/cglm/call/mat3.h \
|
include/cglm/call/mat3.h \
|
||||||
|
include/cglm/call/mat2.h \
|
||||||
|
include/cglm/call/vec2.h \
|
||||||
include/cglm/call/vec3.h \
|
include/cglm/call/vec3.h \
|
||||||
include/cglm/call/vec4.h \
|
include/cglm/call/vec4.h \
|
||||||
include/cglm/call/affine.h \
|
include/cglm/call/affine.h \
|
||||||
@@ -103,6 +107,8 @@ cglm_simd_neon_HEADERS = include/cglm/simd/neon/mat4.h
|
|||||||
cglm_structdir=$(includedir)/cglm/struct
|
cglm_structdir=$(includedir)/cglm/struct
|
||||||
cglm_struct_HEADERS = include/cglm/struct/mat4.h \
|
cglm_struct_HEADERS = include/cglm/struct/mat4.h \
|
||||||
include/cglm/struct/mat3.h \
|
include/cglm/struct/mat3.h \
|
||||||
|
include/cglm/struct/vec2.h \
|
||||||
|
include/cglm/struct/vec2-ext.h \
|
||||||
include/cglm/struct/vec3.h \
|
include/cglm/struct/vec3.h \
|
||||||
include/cglm/struct/vec3-ext.h \
|
include/cglm/struct/vec3-ext.h \
|
||||||
include/cglm/struct/vec4.h \
|
include/cglm/struct/vec4.h \
|
||||||
@@ -126,8 +132,10 @@ libcglm_la_SOURCES=\
|
|||||||
src/io.c \
|
src/io.c \
|
||||||
src/quat.c \
|
src/quat.c \
|
||||||
src/cam.c \
|
src/cam.c \
|
||||||
|
src/vec2.c \
|
||||||
src/vec3.c \
|
src/vec3.c \
|
||||||
src/vec4.c \
|
src/vec4.c \
|
||||||
|
src/mat2.c \
|
||||||
src/mat3.c \
|
src/mat3.c \
|
||||||
src/mat4.c \
|
src/mat4.c \
|
||||||
src/plane.c \
|
src/plane.c \
|
||||||
@@ -140,19 +148,14 @@ libcglm_la_SOURCES=\
|
|||||||
src/bezier.c
|
src/bezier.c
|
||||||
|
|
||||||
test_tests_SOURCES=\
|
test_tests_SOURCES=\
|
||||||
|
test/runner.c \
|
||||||
test/src/test_common.c \
|
test/src/test_common.c \
|
||||||
test/src/test_main.c \
|
test/src/tests.c \
|
||||||
test/src/test_mat4.c \
|
|
||||||
test/src/test_cam.c \
|
test/src/test_cam.c \
|
||||||
test/src/test_project.c \
|
|
||||||
test/src/test_clamp.c \
|
test/src/test_clamp.c \
|
||||||
test/src/test_euler.c \
|
test/src/test_euler.c \
|
||||||
test/src/test_quat.c \
|
test/src/test_bezier.c \
|
||||||
test/src/test_vec4.c \
|
test/src/test_struct.c
|
||||||
test/src/test_vec3.c \
|
|
||||||
test/src/test_mat3.c \
|
|
||||||
test/src/test_affine.c \
|
|
||||||
test/src/test_bezier.c
|
|
||||||
|
|
||||||
pkgconfig_DATA=cglm.pc
|
pkgconfig_DATA=cglm.pc
|
||||||
|
|
||||||
@@ -160,7 +163,7 @@ pkgconfig_DATA=cglm.pc
|
|||||||
# the source directory that post-build.sh is in. When not
|
# the source directory that post-build.sh is in. When not
|
||||||
# using a prefix, $VPATH will be unset, so we need to fall
|
# using a prefix, $VPATH will be unset, so we need to fall
|
||||||
# back to using . to run the script.
|
# back to using . to run the script.
|
||||||
export VPATH
|
#export VPATH
|
||||||
|
|
||||||
all-local:
|
# all-local:
|
||||||
sh $${VPATH:-.}/post-build.sh
|
# sh $${VPATH:-.}/post-build.sh
|
||||||
|
|||||||
31
README.md
31
README.md
@@ -3,6 +3,7 @@
|
|||||||
[](https://ci.appveyor.com/project/recp/cglm/branch/master)
|
[](https://ci.appveyor.com/project/recp/cglm/branch/master)
|
||||||
[](http://cglm.readthedocs.io/en/latest/?badge=latest)
|
[](http://cglm.readthedocs.io/en/latest/?badge=latest)
|
||||||
[](https://coveralls.io/github/recp/cglm?branch=master)
|
[](https://coveralls.io/github/recp/cglm?branch=master)
|
||||||
|
[](https://codecov.io/gh/recp/cglm)
|
||||||
[](https://www.codacy.com/app/recp/cglm?utm_source=github.com&utm_medium=referral&utm_content=recp/cglm&utm_campaign=Badge_Grade)
|
[](https://www.codacy.com/app/recp/cglm?utm_source=github.com&utm_medium=referral&utm_content=recp/cglm&utm_campaign=Badge_Grade)
|
||||||
[](#backers)
|
[](#backers)
|
||||||
[](#sponsors)
|
[](#sponsors)
|
||||||
@@ -32,7 +33,7 @@ https://github.com/g-truc/glm
|
|||||||
#### Note for new comers (Important):
|
#### Note for new comers (Important):
|
||||||
- `vec4` and `mat4` variables must be aligned. (There will be unaligned versions later)
|
- `vec4` and `mat4` variables must be aligned. (There will be unaligned versions later)
|
||||||
- **in** and **[in, out]** parameters must be initialized (please). But **[out]** parameters not, initializing out param is also redundant
|
- **in** and **[in, out]** parameters must be initialized (please). But **[out]** parameters not, initializing out param is also redundant
|
||||||
- All functions are inline if you don't want to use pre-compiled versions with glmc_ prefix, you can ignore build process. Just incliude headers.
|
- All functions are inline if you don't want to use pre-compiled versions with glmc_ prefix, you can ignore build process. Just include headers.
|
||||||
- if your debugger takes you to cglm headers then make sure you are not trying to copy vec4 to vec3 or alig issues...
|
- if your debugger takes you to cglm headers then make sure you are not trying to copy vec4 to vec3 or alig issues...
|
||||||
- Welcome!
|
- Welcome!
|
||||||
|
|
||||||
@@ -87,6 +88,7 @@ Currently *cglm* uses default clip space configuration (-1, 1) for camera functi
|
|||||||
- easing functions
|
- easing functions
|
||||||
- curves
|
- curves
|
||||||
- curve interpolation helpers (S*M*C, deCasteljau...)
|
- curve interpolation helpers (S*M*C, deCasteljau...)
|
||||||
|
- helpers to convert cglm types to Apple's simd library to pass cglm types to Metal GL without packing them on both sides
|
||||||
- and others...
|
- and others...
|
||||||
|
|
||||||
<hr />
|
<hr />
|
||||||
@@ -129,20 +131,31 @@ glm_mul(T, R, modelMat);
|
|||||||
glm_inv_tr(modelMat);
|
glm_inv_tr(modelMat);
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Struct API
|
||||||
|
|
||||||
|
The struct API works as follows, note the `s` suffix on types, the `glms_` prefix on functions and the `GLMS_` prefix on constants:
|
||||||
|
|
||||||
|
```C
|
||||||
|
#include <cglm/struct.h>
|
||||||
|
|
||||||
|
mat4s mat = GLMS_MAT4_IDENTITY_INIT;
|
||||||
|
mat4s inv = glms_mat4_inv(mat);
|
||||||
|
```
|
||||||
|
|
||||||
|
Struct functions generally take their parameters as *values* and *return* their results, rather than taking pointers and writing to out parameters. That means your parameters can usually be `const`, if you're into that.
|
||||||
|
|
||||||
|
The types used are actually unions that allow access to the same data multiple ways. One of those ways involves anonymous structures, available since C11. MSVC also supports it for earlier C versions out of the box and GCC/Clang do if you enable `-fms-extensions`. To explicitly enable these anonymous structures, `#define CGLM_USE_ANONYMOUS_STRUCT` to `1`, to disable them, to `0`. For backward compatibility, you can also `#define CGLM_NO_ANONYMOUS_STRUCT` (value is irrelevant) to disable them. If you don't specify explicitly, cglm will do a best guess based on your compiler and the C version you're using.
|
||||||
|
|
||||||
## Build
|
## Build
|
||||||
|
|
||||||
### Unix (Autotools)
|
### Unix (Autotools)
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ sh ./build-deps.sh # run only once (dependencies) [Optional].
|
|
||||||
$ # You can pass this step if you don't want to run `make check` for tests.
|
|
||||||
$ # cglm uses cmocka for tests and it may reqiure cmake for building it
|
|
||||||
$
|
|
||||||
$ sh autogen.sh
|
$ sh autogen.sh
|
||||||
$ ./configure
|
$ ./configure
|
||||||
$ make
|
$ make
|
||||||
$ make check # [Optional] (if you run `sh ./build-deps.sh`)
|
$ make check # [Optional]
|
||||||
$ [sudo] make install
|
$ [sudo] make install # [Optional]
|
||||||
```
|
```
|
||||||
|
|
||||||
This will also install pkg-config files so you can use
|
This will also install pkg-config files so you can use
|
||||||
@@ -170,6 +183,10 @@ if `msbuild` won't work (because of multi version VS) then try to build with `de
|
|||||||
$ devenv cglm.sln /Build Release
|
$ devenv cglm.sln /Build Release
|
||||||
```
|
```
|
||||||
|
|
||||||
|
#### Running Tests on Windows
|
||||||
|
|
||||||
|
You can see test project in same visual studio solution file. It is enough to run that project to run tests.
|
||||||
|
|
||||||
### Building Docs
|
### Building Docs
|
||||||
First you need install Sphinx: http://www.sphinx-doc.org/en/master/usage/installation.html
|
First you need install Sphinx: http://www.sphinx-doc.org/en/master/usage/installation.html
|
||||||
then:
|
then:
|
||||||
|
|||||||
@@ -1,23 +0,0 @@
|
|||||||
#! /bin/sh
|
|
||||||
#
|
|
||||||
# Copyright (c), Recep Aslantas.
|
|
||||||
#
|
|
||||||
# MIT License (MIT), http://opensource.org/licenses/MIT
|
|
||||||
# Full license can be found in the LICENSE file
|
|
||||||
#
|
|
||||||
|
|
||||||
# check if deps are pulled
|
|
||||||
git submodule update --init --recursive
|
|
||||||
|
|
||||||
cd $(dirname "$0")
|
|
||||||
|
|
||||||
# general deps: gcc make autoconf automake libtool cmake
|
|
||||||
|
|
||||||
# test - cmocka
|
|
||||||
cd ./test/lib/cmocka
|
|
||||||
rm -rf build
|
|
||||||
mkdir -p build
|
|
||||||
cd build
|
|
||||||
cmake -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Debug ..
|
|
||||||
make -j8
|
|
||||||
cd ../../../../
|
|
||||||
@@ -2,7 +2,7 @@ Pod::Spec.new do |s|
|
|||||||
|
|
||||||
# Description
|
# Description
|
||||||
s.name = "cglm"
|
s.name = "cglm"
|
||||||
s.version = "0.5.1"
|
s.version = "0.6.1"
|
||||||
s.summary = "📽 Optimized OpenGL/Graphics Math (glm) for C"
|
s.summary = "📽 Optimized OpenGL/Graphics Math (glm) for C"
|
||||||
s.description = <<-DESC
|
s.description = <<-DESC
|
||||||
cglm is math library for graphics programming for C. It is similar to original glm but it is written for C instead of C++ (you can use here too). See the documentation or README for all features.
|
cglm is math library for graphics programming for C. It is similar to original glm but it is written for C instead of C++ (you can use here too). See the documentation or README for all features.
|
||||||
|
|||||||
@@ -7,8 +7,11 @@
|
|||||||
#*****************************************************************************
|
#*****************************************************************************
|
||||||
|
|
||||||
AC_PREREQ([2.69])
|
AC_PREREQ([2.69])
|
||||||
AC_INIT([cglm], [0.6.0], [info@recp.me])
|
AC_INIT([cglm], [0.7.0], [info@recp.me])
|
||||||
AM_INIT_AUTOMAKE([-Wall -Werror foreign subdir-objects])
|
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.
|
||||||
|
: ${CFLAGS=""}
|
||||||
|
|
||||||
AC_CONFIG_MACRO_DIR([m4])
|
AC_CONFIG_MACRO_DIR([m4])
|
||||||
AC_CONFIG_SRCDIR([src/])
|
AC_CONFIG_SRCDIR([src/])
|
||||||
|
|||||||
@@ -35,10 +35,13 @@ Follow the :doc:`build` documentation for this
|
|||||||
euler
|
euler
|
||||||
mat4
|
mat4
|
||||||
mat3
|
mat3
|
||||||
|
mat2
|
||||||
vec3
|
vec3
|
||||||
vec3-ext
|
vec3-ext
|
||||||
vec4
|
vec4
|
||||||
vec4-ext
|
vec4-ext
|
||||||
|
vec2
|
||||||
|
vec2-ext
|
||||||
color
|
color
|
||||||
plane
|
plane
|
||||||
project
|
project
|
||||||
|
|||||||
@@ -1,10 +1,7 @@
|
|||||||
Build cglm
|
Build cglm
|
||||||
================================
|
================================
|
||||||
|
|
||||||
| **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.
|
| **cglm** does not have any external dependencies.
|
||||||
|
|
||||||
External dependencies:
|
|
||||||
* cmocka - for unit testing
|
|
||||||
|
|
||||||
**NOTE:**
|
**NOTE:**
|
||||||
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.
|
||||||
@@ -16,8 +13,6 @@ Unix (Autotools):
|
|||||||
.. code-block:: bash
|
.. code-block:: bash
|
||||||
:linenos:
|
:linenos:
|
||||||
|
|
||||||
$ sh ./build-deps.sh # run this only once (dependencies)
|
|
||||||
|
|
||||||
$ sh autogen.sh
|
$ sh autogen.sh
|
||||||
$ ./configure
|
$ ./configure
|
||||||
$ make
|
$ make
|
||||||
@@ -65,4 +60,3 @@ Example build:
|
|||||||
|
|
||||||
$ cd cglm/docs
|
$ cd cglm/docs
|
||||||
$ sphinx-build source build
|
$ sphinx-build source build
|
||||||
|
|
||||||
|
|||||||
@@ -62,9 +62,9 @@ author = u'Recep Aslantas'
|
|||||||
# built documents.
|
# built documents.
|
||||||
#
|
#
|
||||||
# The short X.Y version.
|
# The short X.Y version.
|
||||||
version = u'0.6.0'
|
version = u'0.7.0'
|
||||||
# The full version, including alpha/beta/rc tags.
|
# The full version, including alpha/beta/rc tags.
|
||||||
release = u'0.6.0'
|
release = u'0.7.0'
|
||||||
|
|
||||||
# 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.
|
||||||
|
|||||||
179
docs/source/mat2.rst
Normal file
179
docs/source/mat2.rst
Normal file
@@ -0,0 +1,179 @@
|
|||||||
|
.. default-domain:: C
|
||||||
|
|
||||||
|
mat2
|
||||||
|
====
|
||||||
|
|
||||||
|
Header: cglm/mat2.h
|
||||||
|
|
||||||
|
Table of contents (click to go):
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Macros:
|
||||||
|
|
||||||
|
1. GLM_mat2_IDENTITY_INIT
|
||||||
|
#. GLM_mat2_ZERO_INIT
|
||||||
|
#. GLM_mat2_IDENTITY
|
||||||
|
#. GLM_mat2_ZERO
|
||||||
|
|
||||||
|
Functions:
|
||||||
|
|
||||||
|
1. :c:func:`glm_mat2_copy`
|
||||||
|
#. :c:func:`glm_mat2_identity`
|
||||||
|
#. :c:func:`glm_mat2_identity_array`
|
||||||
|
#. :c:func:`glm_mat2_zero`
|
||||||
|
#. :c:func:`glm_mat2_mul`
|
||||||
|
#. :c:func:`glm_mat2_transpose_to`
|
||||||
|
#. :c:func:`glm_mat2_transpose`
|
||||||
|
#. :c:func:`glm_mat2_mulv`
|
||||||
|
#. :c:func:`glm_mat2_scale`
|
||||||
|
#. :c:func:`glm_mat2_det`
|
||||||
|
#. :c:func:`glm_mat2_inv`
|
||||||
|
#. :c:func:`glm_mat2_trace`
|
||||||
|
#. :c:func:`glm_mat2_swap_col`
|
||||||
|
#. :c:func:`glm_mat2_swap_row`
|
||||||
|
#. :c:func:`glm_mat2_rmc`
|
||||||
|
|
||||||
|
Functions documentation
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
.. c:function:: void glm_mat2_copy(mat2 mat, mat2 dest)
|
||||||
|
|
||||||
|
copy mat2 to another one (dest).
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **mat** source
|
||||||
|
| *[out]* **dest** destination
|
||||||
|
|
||||||
|
.. c:function:: void glm_mat2_identity(mat2 mat)
|
||||||
|
|
||||||
|
copy identity mat2 to mat, or makes mat to identiy
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[out]* **mat** matrix
|
||||||
|
|
||||||
|
.. c:function:: void glm_mat2_identity_array(mat2 * __restrict mat, size_t count)
|
||||||
|
|
||||||
|
make given matrix array's each element identity matrix
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in,out]* **mat** matrix array (must be aligned (16/32) if alignment is not disabled)
|
||||||
|
| *[in]* **count** count of matrices
|
||||||
|
|
||||||
|
.. c:function:: void glm_mat2_zero(mat2 mat)
|
||||||
|
|
||||||
|
make given matrix zero
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in,out]* **mat** matrix to
|
||||||
|
|
||||||
|
.. c:function:: void glm_mat2_mul(mat2 m1, mat2 m2, mat2 dest)
|
||||||
|
|
||||||
|
multiply m1 and m2 to dest
|
||||||
|
m1, m2 and dest matrices can be same matrix, it is possible to write this:
|
||||||
|
|
||||||
|
.. code-block:: c
|
||||||
|
|
||||||
|
mat2 m = GLM_mat2_IDENTITY_INIT;
|
||||||
|
glm_mat2_mul(m, m, m);
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **m1** left matrix
|
||||||
|
| *[in]* **m2** right matrix
|
||||||
|
| *[out]* **dest** destination matrix
|
||||||
|
|
||||||
|
.. c:function:: void glm_mat2_transpose_to(mat2 m, mat2 dest)
|
||||||
|
|
||||||
|
transpose mat4 and store in dest
|
||||||
|
source matrix will not be transposed unless dest is m
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **mat** source
|
||||||
|
| *[out]* **dest** destination
|
||||||
|
|
||||||
|
.. c:function:: void glm_mat2_transpose(mat2 m)
|
||||||
|
|
||||||
|
tranpose mat2 and store result in same matrix
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **mat** source
|
||||||
|
| *[out]* **dest** destination
|
||||||
|
|
||||||
|
.. c:function:: void glm_mat2_mulv(mat2 m, vec2 v, vec2 dest)
|
||||||
|
|
||||||
|
multiply mat4 with vec4 (column vector) and store in dest vector
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **mat** mat2 (left)
|
||||||
|
| *[in]* **v** vec2 (right, column vector)
|
||||||
|
| *[out]* **dest** destination (result, column vector)
|
||||||
|
|
||||||
|
.. c:function:: void glm_mat2_scale(mat2 m, float s)
|
||||||
|
|
||||||
|
multiply matrix with scalar
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in, out]* **mat** matrix
|
||||||
|
| *[in]* **dest** scalar
|
||||||
|
|
||||||
|
.. c:function:: float glm_mat2_det(mat2 mat)
|
||||||
|
|
||||||
|
returns mat2 determinant
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **mat** matrix
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
mat2 determinant
|
||||||
|
|
||||||
|
.. c:function:: void glm_mat2_inv(mat2 mat, mat2 dest)
|
||||||
|
|
||||||
|
inverse mat2 and store in dest
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **mat** matrix
|
||||||
|
| *[out]* **dest** destination (inverse matrix)
|
||||||
|
|
||||||
|
.. c:function:: void glm_mat2_trace(mat2 m)
|
||||||
|
|
||||||
|
| sum of the elements on the main diagonal from upper left to the lower right
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **m** matrix
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
trace of matrix
|
||||||
|
|
||||||
|
.. c:function:: void glm_mat2_swap_col(mat2 mat, int col1, int col2)
|
||||||
|
|
||||||
|
swap two matrix columns
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in, out]* **mat** matrix
|
||||||
|
| *[in]* **col1** col1
|
||||||
|
| *[in]* **col2** col2
|
||||||
|
|
||||||
|
.. c:function:: void glm_mat2_swap_row(mat2 mat, int row1, int row2)
|
||||||
|
|
||||||
|
swap two matrix rows
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in, out]* **mat** matrix
|
||||||
|
| *[in]* **row1** row1
|
||||||
|
| *[in]* **row2** row2
|
||||||
|
|
||||||
|
.. c:function:: float glm_mat2_rmc(vec2 r, mat2 m, vec2 c)
|
||||||
|
|
||||||
|
| **rmc** stands for **Row** * **Matrix** * **Column**
|
||||||
|
|
||||||
|
| helper for R (row vector) * M (matrix) * C (column vector)
|
||||||
|
|
||||||
|
| the result is scalar because R * M = Matrix1x2 (row vector),
|
||||||
|
| then Matrix1x2 * Vec2 (column vector) = Matrix1x1 (Scalar)
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **r** row vector or matrix1x2
|
||||||
|
| *[in]* **m** matrix2x2
|
||||||
|
| *[in]* **c** column vector or matrix2x1
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
scalar value e.g. Matrix1x1
|
||||||
@@ -324,26 +324,24 @@ Functions documentation
|
|||||||
| *[in]* **ori** orientation in world space as quaternion
|
| *[in]* **ori** orientation in world space as quaternion
|
||||||
| *[out]* **dest** result matrix
|
| *[out]* **dest** result matrix
|
||||||
|
|
||||||
.. c:function:: void glm_quat_for(vec3 dir, vec3 fwd, vec3 up, versor dest)
|
.. c:function:: void glm_quat_for(vec3 dir, vec3 up, versor dest)
|
||||||
|
|
||||||
| creates look rotation quaternion
|
| creates look rotation quaternion
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **dir** direction to look
|
| *[in]* **dir** direction to look
|
||||||
| *[in]* **fwd** forward vector
|
|
||||||
| *[in]* **up** up vector
|
| *[in]* **up** up vector
|
||||||
| *[out]* **dest** result matrix
|
| *[out]* **dest** result matrix
|
||||||
|
|
||||||
.. c:function:: void glm_quat_forp(vec3 from, vec3 to, vec3 fwd, vec3 up, versor dest)
|
.. c:function:: void glm_quat_forp(vec3 from, vec3 to, vec3 up, versor dest)
|
||||||
|
|
||||||
| creates look rotation quaternion using source and destination positions p suffix stands for position
|
| creates look rotation quaternion using source and destination positions p suffix stands for position
|
||||||
|
|
||||||
| this is similar to glm_quat_for except this computes direction for glm_quat_for for you.
|
| this is similar to glm_quat_for except this computes direction for glm_quat_for for you.
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **from** source point
|
| *[in]* **from** source point
|
||||||
| *[in]* **to** destination point
|
| *[in]* **to** destination point
|
||||||
| *[in]* **fwd** forward vector
|
|
||||||
| *[in]* **up** up vector
|
| *[in]* **up** up vector
|
||||||
| *[out]* **dest** result matrix
|
| *[out]* **dest** result matrix
|
||||||
|
|
||||||
|
|||||||
@@ -57,6 +57,13 @@ For instance you may called **glm_vec4_** functions for **vec3** data type.
|
|||||||
It will try to write 32 byte but since **vec3** is 24 byte it should throw
|
It will try to write 32 byte but since **vec3** is 24 byte it should throw
|
||||||
memory access error or exit the app without saying anything.
|
memory access error or exit the app without saying anything.
|
||||||
|
|
||||||
|
**UPDATE - IMPORTANT:**
|
||||||
|
|
||||||
|
| On MSVC or some other compilers, if alignment is enabled (default) then double check alignment requirements if you got a crash.
|
||||||
|
|
||||||
|
| If you send GLM_VEC4_ONE or similar macros directly to a function, it may be crashed.
|
||||||
|
| Because compiler may not apply alignment as defined on **typedef** to that macro while passing it (on stack) to a function.
|
||||||
|
|
||||||
Wrong Results:
|
Wrong Results:
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
|||||||
134
docs/source/vec2-ext.rst
Normal file
134
docs/source/vec2-ext.rst
Normal file
@@ -0,0 +1,134 @@
|
|||||||
|
.. default-domain:: C
|
||||||
|
|
||||||
|
vec2 extra
|
||||||
|
==========
|
||||||
|
|
||||||
|
Header: cglm/vec2-ext.h
|
||||||
|
|
||||||
|
There are some functions are in called in extra header. These are called extra
|
||||||
|
because they are not used like other functions in vec2.h in the future some of
|
||||||
|
these functions ma be moved to vec2 header.
|
||||||
|
|
||||||
|
Table of contents (click to go):
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Functions:
|
||||||
|
|
||||||
|
1. :c:func:`glm_vec2_fill`
|
||||||
|
#. :c:func:`glm_vec2_eq`
|
||||||
|
#. :c:func:`glm_vec2_eq_eps`
|
||||||
|
#. :c:func:`glm_vec2_eq_all`
|
||||||
|
#. :c:func:`glm_vec2_eqv`
|
||||||
|
#. :c:func:`glm_vec2_eqv_eps`
|
||||||
|
#. :c:func:`glm_vec2_max`
|
||||||
|
#. :c:func:`glm_vec2_min`
|
||||||
|
#. :c:func:`glm_vec2_isnan`
|
||||||
|
#. :c:func:`glm_vec2_isinf`
|
||||||
|
#. :c:func:`glm_vec2_isvalid`
|
||||||
|
#. :c:func:`glm_vec2_sign`
|
||||||
|
#. :c:func:`glm_vec2_sqrt`
|
||||||
|
|
||||||
|
Functions documentation
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_fill(vec2 v, float val)
|
||||||
|
|
||||||
|
fill a vector with specified value
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in,out]* **dest** destination
|
||||||
|
| *[in]* **val** value
|
||||||
|
|
||||||
|
|
||||||
|
.. c:function:: bool glm_vec2_eq(vec2 v, float val)
|
||||||
|
|
||||||
|
check if vector is equal to value (without epsilon)
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
| *[in]* **val** value
|
||||||
|
|
||||||
|
.. c:function:: bool glm_vec2_eq_eps(vec2 v, float val)
|
||||||
|
|
||||||
|
check if vector is equal to value (with epsilon)
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
| *[in]* **val** value
|
||||||
|
|
||||||
|
.. c:function:: bool glm_vec2_eq_all(vec2 v)
|
||||||
|
|
||||||
|
check if vectors members are equal (without epsilon)
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
|
||||||
|
.. c:function:: bool glm_vec2_eqv(vec2 v1, vec2 v2)
|
||||||
|
|
||||||
|
check if vector is equal to another (without epsilon) vector
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **vec** vector 1
|
||||||
|
| *[in]* **vec** vector 2
|
||||||
|
|
||||||
|
.. c:function:: bool glm_vec2_eqv_eps(vec2 v1, vec2 v2)
|
||||||
|
|
||||||
|
check if vector is equal to another (with epsilon)
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v1** vector1
|
||||||
|
| *[in]* **v2** vector2
|
||||||
|
|
||||||
|
.. c:function:: float glm_vec2_max(vec2 v)
|
||||||
|
|
||||||
|
max value of vector
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
|
||||||
|
.. c:function:: float glm_vec2_min(vec2 v)
|
||||||
|
|
||||||
|
min value of vector
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
|
||||||
|
.. c:function:: bool glm_vec2_isnan(vec2 v)
|
||||||
|
|
||||||
|
| check if one of items is NaN (not a number)
|
||||||
|
| you should only use this in DEBUG mode or very critical asserts
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
|
||||||
|
.. c:function:: bool glm_vec2_isinf(vec2 v)
|
||||||
|
|
||||||
|
| check if one of items is INFINITY
|
||||||
|
| you should only use this in DEBUG mode or very critical asserts
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
|
||||||
|
.. c:function:: bool glm_vec2_isvalid(vec2 v)
|
||||||
|
|
||||||
|
| check if all items are valid number
|
||||||
|
| you should only use this in DEBUG mode or very critical asserts
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_sign(vec2 v, vec2 dest)
|
||||||
|
|
||||||
|
get sign of 32 bit float as +1, -1, 0
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
| *[out]* **dest** sign vector (only keeps signs as -1, 0, -1)
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_sqrt(vec2 v, vec2 dest)
|
||||||
|
|
||||||
|
square root of each vector item
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
| *[out]* **dest** destination vector (sqrt(v))
|
||||||
375
docs/source/vec2.rst
Normal file
375
docs/source/vec2.rst
Normal file
@@ -0,0 +1,375 @@
|
|||||||
|
.. default-domain:: C
|
||||||
|
|
||||||
|
vec2
|
||||||
|
====
|
||||||
|
|
||||||
|
Header: cglm/vec2.h
|
||||||
|
|
||||||
|
Table of contents (click to go):
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Macros:
|
||||||
|
|
||||||
|
1. GLM_vec2_ONE_INIT
|
||||||
|
#. GLM_vec2_ZERO_INIT
|
||||||
|
#. GLM_vec2_ONE
|
||||||
|
#. GLM_vec2_ZERO
|
||||||
|
|
||||||
|
Functions:
|
||||||
|
|
||||||
|
1. :c:func:`glm_vec2`
|
||||||
|
#. :c:func:`glm_vec2_copy`
|
||||||
|
#. :c:func:`glm_vec2_zero`
|
||||||
|
#. :c:func:`glm_vec2_one`
|
||||||
|
#. :c:func:`glm_vec2_dot`
|
||||||
|
#. :c:func:`glm_vec2_cross`
|
||||||
|
#. :c:func:`glm_vec2_norm2`
|
||||||
|
#. :c:func:`glm_vec2_norm`
|
||||||
|
#. :c:func:`glm_vec2_add`
|
||||||
|
#. :c:func:`glm_vec2_adds`
|
||||||
|
#. :c:func:`glm_vec2_sub`
|
||||||
|
#. :c:func:`glm_vec2_subs`
|
||||||
|
#. :c:func:`glm_vec2_mul`
|
||||||
|
#. :c:func:`glm_vec2_scale`
|
||||||
|
#. :c:func:`glm_vec2_scale_as`
|
||||||
|
#. :c:func:`glm_vec2_div`
|
||||||
|
#. :c:func:`glm_vec2_divs`
|
||||||
|
#. :c:func:`glm_vec2_addadd`
|
||||||
|
#. :c:func:`glm_vec2_subadd`
|
||||||
|
#. :c:func:`glm_vec2_muladd`
|
||||||
|
#. :c:func:`glm_vec2_muladds`
|
||||||
|
#. :c:func:`glm_vec2_maxadd`
|
||||||
|
#. :c:func:`glm_vec2_minadd`
|
||||||
|
#. :c:func:`glm_vec2_negate`
|
||||||
|
#. :c:func:`glm_vec2_negate_to`
|
||||||
|
#. :c:func:`glm_vec2_normalize`
|
||||||
|
#. :c:func:`glm_vec2_normalize_to`
|
||||||
|
#. :c:func:`glm_vec2_rotate`
|
||||||
|
#. :c:func:`glm_vec2_distance2`
|
||||||
|
#. :c:func:`glm_vec2_distance`
|
||||||
|
#. :c:func:`glm_vec2_maxv`
|
||||||
|
#. :c:func:`glm_vec2_minv`
|
||||||
|
#. :c:func:`glm_vec2_clamp`
|
||||||
|
#. :c:func:`glm_vec2_lerp`
|
||||||
|
|
||||||
|
Functions documentation
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2(vec4 v4, vec2 dest)
|
||||||
|
|
||||||
|
init vec2 using vec3
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v3** vector3
|
||||||
|
| *[out]* **dest** destination
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_copy(vec2 a, vec2 dest)
|
||||||
|
|
||||||
|
copy all members of [a] to [dest]
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **a** source
|
||||||
|
| *[out]* **dest** destination
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_zero(vec2 v)
|
||||||
|
|
||||||
|
makes all members 0.0f (zero)
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in, out]* **v** vector
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_one(vec2 v)
|
||||||
|
|
||||||
|
makes all members 1.0f (one)
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in, out]* **v** vector
|
||||||
|
|
||||||
|
.. c:function:: float glm_vec2_dot(vec2 a, vec2 b)
|
||||||
|
|
||||||
|
dot product of vec2
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **a** vector1
|
||||||
|
| *[in]* **b** vector2
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
dot product
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_cross(vec2 a, vec2 b, vec2 d)
|
||||||
|
|
||||||
|
cross product of two vector (RH)
|
||||||
|
|
||||||
|
| ref: http://allenchou.net/2013/07/cross-product-of-2d-vectors/
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **a** vector 1
|
||||||
|
| *[in]* **b** vector 2
|
||||||
|
| *[out]* **dest** destination
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Z component of cross product
|
||||||
|
|
||||||
|
.. c:function:: float glm_vec2_norm2(vec2 v)
|
||||||
|
|
||||||
|
norm * norm (magnitude) of vector
|
||||||
|
|
||||||
|
we can use this func instead of calling norm * norm, because it would call
|
||||||
|
sqrtf fuction twice but with this func we can avoid func call, maybe this is
|
||||||
|
not good name for this func
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
square of norm / magnitude
|
||||||
|
|
||||||
|
.. c:function:: float glm_vec2_norm(vec2 vec)
|
||||||
|
|
||||||
|
| euclidean norm (magnitude), also called L2 norm
|
||||||
|
| this will give magnitude of vector in euclidean space
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **vec** vector
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_add(vec2 a, vec2 b, vec2 dest)
|
||||||
|
|
||||||
|
add a vector to b vector store result in dest
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **a** vector1
|
||||||
|
| *[in]* **b** vector2
|
||||||
|
| *[out]* **dest** destination vector
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_adds(vec2 a, float s, vec2 dest)
|
||||||
|
|
||||||
|
add scalar to v vector store result in dest (d = v + vec(s))
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
| *[in]* **s** scalar
|
||||||
|
| *[out]* **dest** destination vector
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_sub(vec2 v1, vec2 v2, vec2 dest)
|
||||||
|
|
||||||
|
subtract b vector from a vector store result in dest (d = v1 - v2)
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **a** vector1
|
||||||
|
| *[in]* **b** vector2
|
||||||
|
| *[out]* **dest** destination vector
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_subs(vec2 v, float s, vec2 dest)
|
||||||
|
|
||||||
|
subtract scalar from v vector store result in dest (d = v - vec(s))
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
| *[in]* **s** scalar
|
||||||
|
| *[out]* **dest** destination vector
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_mul(vec2 a, vec2 b, vec2 d)
|
||||||
|
|
||||||
|
multiply two vector (component-wise multiplication)
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **a** vector
|
||||||
|
| *[in]* **b** scalar
|
||||||
|
| *[out]* **d** result = (a[0] * b[0], a[1] * b[1], a[2] * b[2])
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_scale(vec2 v, float s, vec2 dest)
|
||||||
|
|
||||||
|
multiply/scale vec2 vector with scalar: result = v * s
|
||||||
|
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
| *[in]* **s** scalar
|
||||||
|
| *[out]* **dest** destination vector
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_scale_as(vec2 v, float s, vec2 dest)
|
||||||
|
|
||||||
|
make vec2 vector scale as specified: result = unit(v) * s
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
| *[in]* **s** scalar
|
||||||
|
| *[out]* **dest** destination vector
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_div(vec2 a, vec2 b, vec2 dest)
|
||||||
|
|
||||||
|
div vector with another component-wise division: d = a / b
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **a** vector 1
|
||||||
|
| *[in]* **b** vector 2
|
||||||
|
| *[out]* **dest** result = (a[0] / b[0], a[1] / b[1], a[2] / b[2])
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_divs(vec2 v, float s, vec2 dest)
|
||||||
|
|
||||||
|
div vector with scalar: d = v / s
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
| *[in]* **s** scalar
|
||||||
|
| *[out]* **dest** result = (a[0] / s, a[1] / s, a[2] / s])
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_addadd(vec2 a, vec2 b, vec2 dest)
|
||||||
|
|
||||||
|
| add two vectors and add result to sum
|
||||||
|
| it applies += operator so dest must be initialized
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **a** vector 1
|
||||||
|
| *[in]* **b** vector 2
|
||||||
|
| *[out]* **dest** dest += (a + b)
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_subadd(vec2 a, vec2 b, vec2 dest)
|
||||||
|
|
||||||
|
| sub two vectors and add result to sum
|
||||||
|
| it applies += operator so dest must be initialized
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **a** vector 1
|
||||||
|
| *[in]* **b** vector 2
|
||||||
|
| *[out]* **dest** dest += (a - b)
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_muladd(vec2 a, vec2 b, vec2 dest)
|
||||||
|
|
||||||
|
| mul two vectors and add result to sum
|
||||||
|
| it applies += operator so dest must be initialized
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **a** vector 1
|
||||||
|
| *[in]* **b** vector 2
|
||||||
|
| *[out]* **dest** dest += (a * b)
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_muladds(vec2 a, float s, vec2 dest)
|
||||||
|
|
||||||
|
| mul vector with scalar and add result to sum
|
||||||
|
| it applies += operator so dest must be initialized
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **a** vector
|
||||||
|
| *[in]* **s** scalar
|
||||||
|
| *[out]* **dest** dest += (a * b)
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_maxadd(vec2 a, vec2 b, vec2 dest)
|
||||||
|
|
||||||
|
| add max of two vector to result/dest
|
||||||
|
| it applies += operator so dest must be initialized
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **a** vector 1
|
||||||
|
| *[in]* **b** vector 2
|
||||||
|
| *[out]* **dest** dest += (a * b)
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_minadd(vec2 a, vec2 b, vec2 dest)
|
||||||
|
|
||||||
|
| add min of two vector to result/dest
|
||||||
|
| it applies += operator so dest must be initialized
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **a** vector 1
|
||||||
|
| *[in]* **b** vector 2
|
||||||
|
| *[out]* **dest** dest += (a * b)
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_negate(vec2 v)
|
||||||
|
|
||||||
|
negate vector components
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in, out]* **v** vector
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_negate_to(vec2 v, vec2 dest)
|
||||||
|
|
||||||
|
negate vector components and store result in dest
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
| *[out]* **dest** negated vector
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_normalize(vec2 v)
|
||||||
|
|
||||||
|
normalize vec2 and store result in same vec
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in, out]* **v** vector
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_normalize_to(vec2 vec, vec2 dest)
|
||||||
|
|
||||||
|
normalize vec2 to dest
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **vec** source
|
||||||
|
| *[out]* **dest** destination
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_rotate(vec2 v, float angle, vec2 dest)
|
||||||
|
|
||||||
|
rotate vec2 around axis by angle using Rodrigues' rotation formula
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
| *[in]* **axis** axis vector
|
||||||
|
| *[out]* **dest** destination
|
||||||
|
|
||||||
|
.. c:function:: float glm_vec2_distance2(vec2 v1, vec2 v2)
|
||||||
|
|
||||||
|
squared distance between two vectors
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **mat** vector1
|
||||||
|
| *[in]* **row1** vector2
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
| squared distance (distance * distance)
|
||||||
|
|
||||||
|
.. c:function:: float glm_vec2_distance(vec2 v1, vec2 v2)
|
||||||
|
|
||||||
|
distance between two vectors
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **mat** vector1
|
||||||
|
| *[in]* **row1** vector2
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
| distance
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_maxv(vec2 v1, vec2 v2, vec2 dest)
|
||||||
|
|
||||||
|
max values of vectors
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v1** vector1
|
||||||
|
| *[in]* **v2** vector2
|
||||||
|
| *[out]* **dest** destination
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_minv(vec2 v1, vec2 v2, vec2 dest)
|
||||||
|
|
||||||
|
min values of vectors
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v1** vector1
|
||||||
|
| *[in]* **v2** vector2
|
||||||
|
| *[out]* **dest** destination
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_clamp(vec2 v, float minVal, float maxVal)
|
||||||
|
|
||||||
|
constrain a value to lie between two further values
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in, out]* **v** vector
|
||||||
|
| *[in]* **minVal** minimum value
|
||||||
|
| *[in]* **maxVal** maximum value
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_lerp(vec2 from, vec2 to, float t, vec2 dest)
|
||||||
|
|
||||||
|
linear interpolation between two vector
|
||||||
|
|
||||||
|
| formula: from + s * (to - from)
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **from** from value
|
||||||
|
| *[in]* **to** to value
|
||||||
|
| *[in]* **t** interpolant (amount) clamped between 0 and 1
|
||||||
|
| *[out]* **dest** destination
|
||||||
95
include/cglm/applesimd.h
Normal file
95
include/cglm/applesimd.h
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglm_applesimd_h
|
||||||
|
#define cglm_applesimd_h
|
||||||
|
#if defined(__APPLE__) \
|
||||||
|
&& defined(SIMD_COMPILER_HAS_REQUIRED_FEATURES) \
|
||||||
|
&& defined(SIMD_BASE) \
|
||||||
|
&& defined(SIMD_TYPES) \
|
||||||
|
&& defined(SIMD_VECTOR_TYPES)
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief converts mat4 to Apple's simd type simd_float4x4
|
||||||
|
* @return simd_float4x4
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
simd_float4x4
|
||||||
|
glm_mat4_applesimd(mat4 m) {
|
||||||
|
simd_float4x4 t;
|
||||||
|
|
||||||
|
t.columns[0][0] = m[0][0];
|
||||||
|
t.columns[0][1] = m[0][1];
|
||||||
|
t.columns[0][2] = m[0][2];
|
||||||
|
t.columns[0][3] = m[0][3];
|
||||||
|
|
||||||
|
t.columns[1][0] = m[1][0];
|
||||||
|
t.columns[1][1] = m[1][1];
|
||||||
|
t.columns[1][2] = m[1][2];
|
||||||
|
t.columns[1][3] = m[1][3];
|
||||||
|
|
||||||
|
t.columns[2][0] = m[2][0];
|
||||||
|
t.columns[2][1] = m[2][1];
|
||||||
|
t.columns[2][2] = m[2][2];
|
||||||
|
t.columns[2][3] = m[2][3];
|
||||||
|
|
||||||
|
t.columns[3][0] = m[3][0];
|
||||||
|
t.columns[3][1] = m[3][1];
|
||||||
|
t.columns[3][2] = m[3][2];
|
||||||
|
t.columns[3][3] = m[3][3];
|
||||||
|
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief converts mat3 to Apple's simd type simd_float3x3
|
||||||
|
* @return simd_float3x3
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
simd_float3x3
|
||||||
|
glm_mat3_applesimd(mat3 m) {
|
||||||
|
simd_float3x3 t;
|
||||||
|
|
||||||
|
t.columns[0][0] = m[0][0];
|
||||||
|
t.columns[0][1] = m[0][1];
|
||||||
|
t.columns[0][2] = m[0][2];
|
||||||
|
|
||||||
|
t.columns[1][0] = m[1][0];
|
||||||
|
t.columns[1][1] = m[1][1];
|
||||||
|
t.columns[1][2] = m[1][2];
|
||||||
|
|
||||||
|
t.columns[2][0] = m[2][0];
|
||||||
|
t.columns[2][1] = m[2][1];
|
||||||
|
t.columns[2][2] = m[2][2];
|
||||||
|
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief converts vec4 to Apple's simd type simd_float4
|
||||||
|
* @return simd_float4
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
simd_float4
|
||||||
|
glm_vec4_applesimd(vec4 v) {
|
||||||
|
return (simd_float4){v[0], v[1], v[2], v[3]};
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief converts vec3 to Apple's simd type simd_float3
|
||||||
|
* @return v
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
simd_float3
|
||||||
|
glm_vec3_applesimd(vec3 v) {
|
||||||
|
return (simd_float3){v[0], v[1], v[2]};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif /* cglm_applesimd_h */
|
||||||
@@ -22,9 +22,9 @@
|
|||||||
#define GLM_BEZIER_MAT ((mat4)GLM_BEZIER_MAT_INIT)
|
#define GLM_BEZIER_MAT ((mat4)GLM_BEZIER_MAT_INIT)
|
||||||
#define GLM_HERMITE_MAT ((mat4)GLM_HERMITE_MAT_INIT)
|
#define GLM_HERMITE_MAT ((mat4)GLM_HERMITE_MAT_INIT)
|
||||||
|
|
||||||
#define CGLM_DECASTEL_EPS 1e-9
|
#define CGLM_DECASTEL_EPS 1e-9f
|
||||||
#define CGLM_DECASTEL_MAX 1000
|
#define CGLM_DECASTEL_MAX 1000.0f
|
||||||
#define CGLM_DECASTEL_SMALL 1e-20
|
#define CGLM_DECASTEL_SMALL 1e-20f
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief cubic bezier interpolation
|
* @brief cubic bezier interpolation
|
||||||
|
|||||||
@@ -12,10 +12,12 @@ extern "C" {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "cglm.h"
|
#include "cglm.h"
|
||||||
|
#include "call/vec2.h"
|
||||||
#include "call/vec3.h"
|
#include "call/vec3.h"
|
||||||
#include "call/vec4.h"
|
#include "call/vec4.h"
|
||||||
#include "call/mat4.h"
|
#include "call/mat2.h"
|
||||||
#include "call/mat3.h"
|
#include "call/mat3.h"
|
||||||
|
#include "call/mat4.h"
|
||||||
#include "call/affine.h"
|
#include "call/affine.h"
|
||||||
#include "call/cam.h"
|
#include "call/cam.h"
|
||||||
#include "call/quat.h"
|
#include "call/quat.h"
|
||||||
|
|||||||
79
include/cglm/call/mat2.h
Normal file
79
include/cglm/call/mat2.h
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglmc_mat2_h
|
||||||
|
#define cglmc_mat2_h
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "../cglm.h"
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat2_copy(mat2 mat, mat2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat2_identity(mat2 mat);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat2_identity_array(mat2 * __restrict mat, size_t count);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat2_zero(mat2 mat);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat2_mul(mat2 m1, mat2 m2, mat2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat2_transpose_to(mat2 m, mat2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat2_transpose(mat2 m);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat2_mulv(mat2 m, vec2 v, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_mat2_trace(mat2 m);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat2_scale(mat2 m, float s);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_mat2_det(mat2 mat);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat2_inv(mat2 mat, mat2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat2_swap_col(mat2 mat, int col1, int col2);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat2_swap_row(mat2 mat, int row1, int row2);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_mat2_rmc(vec2 r, mat2 m, vec2 c);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* cglmc_mat2_h */
|
||||||
@@ -24,6 +24,10 @@ CGLM_EXPORT
|
|||||||
void
|
void
|
||||||
glmc_mat3_identity(mat3 mat);
|
glmc_mat3_identity(mat3 mat);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat3_zero(mat3 mat);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_mat3_identity_array(mat3 * __restrict mat, size_t count);
|
glmc_mat3_identity_array(mat3 * __restrict mat, size_t count);
|
||||||
|
|||||||
@@ -33,6 +33,10 @@ CGLM_EXPORT
|
|||||||
void
|
void
|
||||||
glmc_mat4_identity_array(mat4 * __restrict mat, size_t count);
|
glmc_mat4_identity_array(mat4 * __restrict mat, size_t count);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat4_zero(mat4 mat);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_mat4_pick3(mat4 mat, mat3 dest);
|
glmc_mat4_pick3(mat4 mat, mat3 dest);
|
||||||
|
|||||||
@@ -131,11 +131,11 @@ glmc_quat_look(vec3 eye, versor ori, mat4 dest);
|
|||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_quat_for(vec3 dir, vec3 fwd, vec3 up, versor dest);
|
glmc_quat_for(vec3 dir, vec3 up, versor dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_quat_forp(vec3 from, vec3 to, vec3 fwd, vec3 up, versor dest);
|
glmc_quat_forp(vec3 from, vec3 to, vec3 up, versor dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
|
|||||||
155
include/cglm/call/vec2.h
Normal file
155
include/cglm/call/vec2.h
Normal file
@@ -0,0 +1,155 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglmc_vec2_h
|
||||||
|
#define cglmc_vec2_h
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "../cglm.h"
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2(float * __restrict v, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_copy(vec2 a, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_zero(vec2 v);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_one(vec2 v);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_vec2_dot(vec2 a, vec2 b);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_vec2_cross(vec2 a, vec2 b);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_vec2_norm2(vec2 v);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_vec2_norm(vec2 v);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_add(vec2 a, vec2 b, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_adds(vec2 v, float s, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_sub(vec2 a, vec2 b, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_subs(vec2 v, float s, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_mul(vec2 a, vec2 b, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_scale(vec2 v, float s, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_scale_as(vec2 v, float s, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_div(vec2 a, vec2 b, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_divs(vec2 v, float s, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_addadd(vec2 a, vec2 b, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_subadd(vec2 a, vec2 b, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_muladd(vec2 a, vec2 b, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_muladds(vec2 a, float s, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_maxadd(vec2 a, vec2 b, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_minadd(vec2 a, vec2 b, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_negate_to(vec2 v, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_negate(vec2 v);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_normalize(vec2 v);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_normalize_to(vec2 v, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_rotate(vec2 v, float angle, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_vec2_distance2(vec2 a, vec2 b);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_vec2_distance(vec2 a, vec2 b);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_maxv(vec2 a, vec2 b, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_minv(vec2 a, vec2 b, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_clamp(vec2 v, float minval, float maxval);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_lerp(vec2 from, vec2 to, float t, vec2 dest);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* cglmc_vec2_h */
|
||||||
@@ -319,10 +319,7 @@ glm_perspective_resize(float aspect, mat4 proj) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_lookat(vec3 eye,
|
glm_lookat(vec3 eye, vec3 center, vec3 up, mat4 dest) {
|
||||||
vec3 center,
|
|
||||||
vec3 up,
|
|
||||||
mat4 dest) {
|
|
||||||
CGLM_ALIGN(8) vec3 f, u, s;
|
CGLM_ALIGN(8) vec3 f, u, s;
|
||||||
|
|
||||||
glm_vec3_sub(center, eye, f);
|
glm_vec3_sub(center, eye, f);
|
||||||
|
|||||||
@@ -9,10 +9,12 @@
|
|||||||
#define cglm_h
|
#define cglm_h
|
||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
#include "vec2.h"
|
||||||
#include "vec3.h"
|
#include "vec3.h"
|
||||||
#include "vec4.h"
|
#include "vec4.h"
|
||||||
#include "mat4.h"
|
#include "mat4.h"
|
||||||
#include "mat3.h"
|
#include "mat3.h"
|
||||||
|
#include "mat2.h"
|
||||||
#include "affine.h"
|
#include "affine.h"
|
||||||
#include "cam.h"
|
#include "cam.h"
|
||||||
#include "frustum.h"
|
#include "frustum.h"
|
||||||
|
|||||||
@@ -83,6 +83,36 @@ glm_mat3_print(mat3 matrix,
|
|||||||
#undef n
|
#undef n
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat2_print(mat2 matrix,
|
||||||
|
FILE * __restrict ostream) {
|
||||||
|
int i;
|
||||||
|
int j;
|
||||||
|
|
||||||
|
#define m 2
|
||||||
|
#define n 2
|
||||||
|
|
||||||
|
fprintf(ostream, "Matrix (float%dx%d):\n", m, n);
|
||||||
|
|
||||||
|
for (i = 0; i < m; i++) {
|
||||||
|
fprintf(ostream, "\t|");
|
||||||
|
for (j = 0; j < n; j++) {
|
||||||
|
fprintf(ostream, "%0.4f", matrix[j][i]);;
|
||||||
|
|
||||||
|
if (j != n - 1)
|
||||||
|
fprintf(ostream, "\t");
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(ostream, "|\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(ostream, "\n");
|
||||||
|
|
||||||
|
#undef m
|
||||||
|
#undef n
|
||||||
|
}
|
||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec4_print(vec4 vec,
|
glm_vec4_print(vec4 vec,
|
||||||
@@ -149,6 +179,28 @@ glm_ivec3_print(ivec3 vec,
|
|||||||
#undef m
|
#undef m
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec2_print(vec2 vec,
|
||||||
|
FILE * __restrict ostream) {
|
||||||
|
int i;
|
||||||
|
|
||||||
|
#define m 2
|
||||||
|
|
||||||
|
fprintf(ostream, "Vector (float%d):\n\t|", m);
|
||||||
|
|
||||||
|
for (i = 0; i < m; i++) {
|
||||||
|
fprintf(ostream, "%0.4f", vec[i]);
|
||||||
|
|
||||||
|
if (i != m - 1)
|
||||||
|
fprintf(ostream, "\t");
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(ostream, "|\n\n");
|
||||||
|
|
||||||
|
#undef m
|
||||||
|
}
|
||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_versor_print(versor vec,
|
glm_versor_print(versor vec,
|
||||||
|
|||||||
322
include/cglm/mat2.h
Normal file
322
include/cglm/mat2.h
Normal file
@@ -0,0 +1,322 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Macros:
|
||||||
|
GLM_MAT2_IDENTITY_INIT
|
||||||
|
GLM_MAT2_ZERO_INIT
|
||||||
|
GLM_MAT2_IDENTITY
|
||||||
|
GLM_MAT2_ZERO
|
||||||
|
|
||||||
|
Functions:
|
||||||
|
CGLM_INLINE void glm_mat2_copy(mat2 mat, mat2 dest)
|
||||||
|
CGLM_INLINE void glm_mat2_identity(mat2 mat)
|
||||||
|
CGLM_INLINE void glm_mat2_identity_array(mat2 * restrict mat, size_t count)
|
||||||
|
CGLM_INLINE void glm_mat2_zero(mat2 mat)
|
||||||
|
CGLM_INLINE void glm_mat2_mul(mat2 m1, mat2 m2, mat2 dest)
|
||||||
|
CGLM_INLINE void glm_mat2_transpose_to(mat2 m, mat2 dest)
|
||||||
|
CGLM_INLINE void glm_mat2_transpose(mat2 m)
|
||||||
|
CGLM_INLINE void glm_mat2_mulv(mat2 m, vec2 v, vec2 dest)
|
||||||
|
CGLM_INLINE float glm_mat2_trace(mat2 m)
|
||||||
|
CGLM_INLINE void glm_mat2_scale(mat2 m, float s)
|
||||||
|
CGLM_INLINE float glm_mat2_det(mat2 mat)
|
||||||
|
CGLM_INLINE void glm_mat2_inv(mat2 mat, mat2 dest)
|
||||||
|
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 float glm_mat2_rmc(vec2 r, mat2 m, vec2 c)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglm_mat2_h
|
||||||
|
#define cglm_mat2_h
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "vec2.h"
|
||||||
|
|
||||||
|
#ifdef CGLM_SSE_FP
|
||||||
|
# include "simd/sse2/mat2.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define GLM_MAT2_IDENTITY_INIT {{1.0f, 0.0f}, {0.0f, 1.0f}}
|
||||||
|
#define GLM_MAT2_ZERO_INIT {{0.0f, 0.0f}, {0.0f, 0.0f}}
|
||||||
|
|
||||||
|
/* for C only */
|
||||||
|
#define GLM_MAT2_IDENTITY ((mat2)GLM_MAT2_IDENTITY_INIT)
|
||||||
|
#define GLM_MAT2_ZERO ((mat2)GLM_MAT2_ZERO_INIT)
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief copy all members of [mat] to [dest]
|
||||||
|
*
|
||||||
|
* @param[in] mat source
|
||||||
|
* @param[out] dest destination
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat2_copy(mat2 mat, mat2 dest) {
|
||||||
|
glm_vec4_copy(mat[0], dest[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief make given matrix identity. It is identical with below,
|
||||||
|
* but it is more easy to do that with this func especially for members
|
||||||
|
* e.g. glm_mat2_identity(aStruct->aMatrix);
|
||||||
|
*
|
||||||
|
* @code
|
||||||
|
* glm_mat2_copy(GLM_MAT2_IDENTITY, mat); // C only
|
||||||
|
*
|
||||||
|
* // or
|
||||||
|
* mat2 mat = GLM_MAT2_IDENTITY_INIT;
|
||||||
|
* @endcode
|
||||||
|
*
|
||||||
|
* @param[in, out] mat destination
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat2_identity(mat2 mat) {
|
||||||
|
CGLM_ALIGN_MAT mat2 t = GLM_MAT2_IDENTITY_INIT;
|
||||||
|
glm_mat2_copy(t, mat);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief make given matrix array's each element identity matrix
|
||||||
|
*
|
||||||
|
* @param[in, out] mat matrix array (must be aligned (16)
|
||||||
|
* if alignment is not disabled)
|
||||||
|
*
|
||||||
|
* @param[in] count count of matrices
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat2_identity_array(mat2 * __restrict mat, size_t count) {
|
||||||
|
CGLM_ALIGN_MAT mat2 t = GLM_MAT2_IDENTITY_INIT;
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
for (i = 0; i < count; i++) {
|
||||||
|
glm_mat2_copy(t, mat[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief make given matrix zero.
|
||||||
|
*
|
||||||
|
* @param[in, out] mat matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat2_zero(mat2 mat) {
|
||||||
|
CGLM_ALIGN_MAT mat2 t = GLM_MAT2_ZERO_INIT;
|
||||||
|
glm_mat2_copy(t, mat);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief multiply m1 and m2 to dest
|
||||||
|
*
|
||||||
|
* m1, m2 and dest matrices can be same matrix, it is possible to write this:
|
||||||
|
*
|
||||||
|
* @code
|
||||||
|
* mat2 m = GLM_MAT2_IDENTITY_INIT;
|
||||||
|
* glm_mat2_mul(m, m, m);
|
||||||
|
* @endcode
|
||||||
|
*
|
||||||
|
* @param[in] m1 left matrix
|
||||||
|
* @param[in] m2 right matrix
|
||||||
|
* @param[out] dest destination matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat2_mul(mat2 m1, mat2 m2, mat2 dest) {
|
||||||
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
|
glm_mat2_mul_sse2(m1, m2, dest);
|
||||||
|
#else
|
||||||
|
float a00 = m1[0][0], a01 = m1[0][1],
|
||||||
|
a10 = m1[1][0], a11 = m1[1][1],
|
||||||
|
b00 = m2[0][0], b01 = m2[0][1],
|
||||||
|
b10 = m2[1][0], b11 = m2[1][1];
|
||||||
|
|
||||||
|
dest[0][0] = a00 * b00 + a10 * b01;
|
||||||
|
dest[0][1] = a01 * b00 + a11 * b01;
|
||||||
|
dest[1][0] = a00 * b10 + a10 * b11;
|
||||||
|
dest[1][1] = a01 * b10 + a11 * b11;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief transpose mat2 and store in dest
|
||||||
|
*
|
||||||
|
* source matrix will not be transposed unless dest is m
|
||||||
|
*
|
||||||
|
* @param[in] m matrix
|
||||||
|
* @param[out] dest result
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat2_transpose_to(mat2 m, mat2 dest) {
|
||||||
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
|
glm_mat2_transp_sse2(m, dest);
|
||||||
|
#else
|
||||||
|
dest[0][0] = m[0][0];
|
||||||
|
dest[0][1] = m[1][0];
|
||||||
|
dest[1][0] = m[0][1];
|
||||||
|
dest[1][1] = m[1][1];
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief tranpose mat2 and store result in same matrix
|
||||||
|
*
|
||||||
|
* @param[in, out] m source and dest
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat2_transpose(mat2 m) {
|
||||||
|
float tmp;
|
||||||
|
tmp = m[0][1];
|
||||||
|
m[0][1] = m[1][0];
|
||||||
|
m[1][0] = tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief multiply mat2 with vec2 (column vector) and store in dest vector
|
||||||
|
*
|
||||||
|
* @param[in] m mat2 (left)
|
||||||
|
* @param[in] v vec2 (right, column vector)
|
||||||
|
* @param[out] dest vec2 (result, column vector)
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat2_mulv(mat2 m, vec2 v, vec2 dest) {
|
||||||
|
dest[0] = m[0][0] * v[0] + m[1][0] * v[1];
|
||||||
|
dest[1] = m[0][1] * v[0] + m[1][1] * v[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief trace of matrix
|
||||||
|
*
|
||||||
|
* sum of the elements on the main diagonal from upper left to the lower right
|
||||||
|
*
|
||||||
|
* @param[in] m matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_mat2_trace(mat2 m) {
|
||||||
|
return m[0][0] + m[1][1];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief scale (multiply with scalar) matrix
|
||||||
|
*
|
||||||
|
* multiply matrix with scalar
|
||||||
|
*
|
||||||
|
* @param[in, out] m matrix
|
||||||
|
* @param[in] s scalar
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat2_scale(mat2 m, float s) {
|
||||||
|
glm_vec4_scale(m[0], s, m[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief mat2 determinant
|
||||||
|
*
|
||||||
|
* @param[in] mat matrix
|
||||||
|
*
|
||||||
|
* @return determinant
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_mat2_det(mat2 mat) {
|
||||||
|
return mat[0][0] * mat[1][1] - mat[1][0] * mat[0][1];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief inverse mat2 and store in dest
|
||||||
|
*
|
||||||
|
* @param[in] mat matrix
|
||||||
|
* @param[out] dest inverse matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat2_inv(mat2 mat, mat2 dest) {
|
||||||
|
float det;
|
||||||
|
float a = mat[0][0], b = mat[0][1],
|
||||||
|
c = mat[1][0], d = mat[1][1];
|
||||||
|
|
||||||
|
det = 1.0f / (a * d - b * c);
|
||||||
|
|
||||||
|
dest[0][0] = d * det;
|
||||||
|
dest[0][1] = -b * det;
|
||||||
|
dest[1][0] = -c * det;
|
||||||
|
dest[1][1] = a * det;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief swap two matrix columns
|
||||||
|
*
|
||||||
|
* @param[in,out] mat matrix
|
||||||
|
* @param[in] col1 col1
|
||||||
|
* @param[in] col2 col2
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat2_swap_col(mat2 mat, int col1, int col2) {
|
||||||
|
float a, b;
|
||||||
|
|
||||||
|
a = mat[col1][0];
|
||||||
|
b = mat[col1][1];
|
||||||
|
|
||||||
|
mat[col1][0] = mat[col2][0];
|
||||||
|
mat[col1][1] = mat[col2][1];
|
||||||
|
|
||||||
|
mat[col2][0] = a;
|
||||||
|
mat[col2][1] = b;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief swap two matrix rows
|
||||||
|
*
|
||||||
|
* @param[in,out] mat matrix
|
||||||
|
* @param[in] row1 row1
|
||||||
|
* @param[in] row2 row2
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat2_swap_row(mat2 mat, int row1, int row2) {
|
||||||
|
float a, b;
|
||||||
|
|
||||||
|
a = mat[0][row1];
|
||||||
|
b = mat[1][row1];
|
||||||
|
|
||||||
|
mat[0][row1] = mat[0][row2];
|
||||||
|
mat[1][row1] = mat[1][row2];
|
||||||
|
|
||||||
|
mat[0][row2] = a;
|
||||||
|
mat[1][row2] = b;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief helper for R (row vector) * M (matrix) * C (column vector)
|
||||||
|
*
|
||||||
|
* rmc stands for Row * Matrix * Column
|
||||||
|
*
|
||||||
|
* the result is scalar because R * M = Matrix1x2 (row vector),
|
||||||
|
* then Matrix1x2 * Vec2 (column vector) = Matrix1x1 (Scalar)
|
||||||
|
*
|
||||||
|
* @param[in] r row vector or matrix1x2
|
||||||
|
* @param[in] m matrix2x2
|
||||||
|
* @param[in] c column vector or matrix2x1
|
||||||
|
*
|
||||||
|
* @return scalar value e.g. Matrix1x1
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_mat2_rmc(vec2 r, mat2 m, vec2 c) {
|
||||||
|
vec2 tmp;
|
||||||
|
glm_mat2_mulv(m, c, tmp);
|
||||||
|
return glm_vec2_dot(r, tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* cglm_mat2_h */
|
||||||
@@ -446,6 +446,9 @@ glm_mat4_quat(mat4 m, versor dest) {
|
|||||||
/*!
|
/*!
|
||||||
* @brief multiply vector with mat4
|
* @brief multiply vector with mat4
|
||||||
*
|
*
|
||||||
|
* actually the result is vec4, after multiplication the last component
|
||||||
|
* is trimmed. if you need it don't use this func.
|
||||||
|
*
|
||||||
* @param[in] m mat4(affine transform)
|
* @param[in] m mat4(affine transform)
|
||||||
* @param[in] v vec3
|
* @param[in] v vec3
|
||||||
* @param[in] last 4th item to make it vec4
|
* @param[in] last 4th item to make it vec4
|
||||||
|
|||||||
@@ -30,7 +30,14 @@
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_plane_normalize(vec4 plane) {
|
glm_plane_normalize(vec4 plane) {
|
||||||
glm_vec4_scale(plane, 1.0f / glm_vec3_norm(plane), plane);
|
float norm;
|
||||||
|
|
||||||
|
if ((norm = glm_vec3_norm(plane)) == 0.0f) {
|
||||||
|
glm_vec4_zero(plane);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
glm_vec4_scale(plane, 1.0f / norm, plane);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* cglm_plane_h */
|
#endif /* cglm_plane_h */
|
||||||
|
|||||||
@@ -693,32 +693,23 @@ glm_quat_look(vec3 eye, versor ori, mat4 dest) {
|
|||||||
* @brief creates look rotation quaternion
|
* @brief creates look rotation quaternion
|
||||||
*
|
*
|
||||||
* @param[in] dir direction to look
|
* @param[in] dir direction to look
|
||||||
* @param[in] fwd forward vector
|
|
||||||
* @param[in] up up vector
|
* @param[in] up up vector
|
||||||
* @param[out] dest destination quaternion
|
* @param[out] dest destination quaternion
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_quat_for(vec3 dir, vec3 fwd, vec3 up, versor dest) {
|
glm_quat_for(vec3 dir, vec3 up, versor dest) {
|
||||||
CGLM_ALIGN(8) vec3 axis;
|
CGLM_ALIGN_MAT mat3 m;
|
||||||
float dot, angle;
|
|
||||||
|
|
||||||
dot = glm_vec3_dot(dir, fwd);
|
glm_vec3_normalize_to(dir, m[2]);
|
||||||
if (fabsf(dot + 1.0f) < 0.000001f) {
|
|
||||||
glm_quat_init(dest, up[0], up[1], up[2], GLM_PIf);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fabsf(dot - 1.0f) < 0.000001f) {
|
/* No need to negate in LH, but we use RH here */
|
||||||
glm_quat_identity(dest);
|
glm_vec3_negate(m[2]);
|
||||||
return;
|
|
||||||
}
|
glm_vec3_crossn(up, m[2], m[0]);
|
||||||
|
glm_vec3_cross(m[2], m[0], m[1]);
|
||||||
|
|
||||||
angle = acosf(dot);
|
glm_mat3_quat(m, dest);
|
||||||
glm_cross(fwd, dir, axis);
|
|
||||||
glm_normalize(axis);
|
|
||||||
|
|
||||||
glm_quatv(dest, angle, axis);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -727,16 +718,15 @@ glm_quat_for(vec3 dir, vec3 fwd, vec3 up, versor dest) {
|
|||||||
*
|
*
|
||||||
* @param[in] from source point
|
* @param[in] from source point
|
||||||
* @param[in] to destination point
|
* @param[in] to destination point
|
||||||
* @param[in] fwd forward vector
|
|
||||||
* @param[in] up up vector
|
* @param[in] up up vector
|
||||||
* @param[out] dest destination quaternion
|
* @param[out] dest destination quaternion
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_quat_forp(vec3 from, vec3 to, vec3 fwd, vec3 up, versor dest) {
|
glm_quat_forp(vec3 from, vec3 to, vec3 up, versor dest) {
|
||||||
CGLM_ALIGN(8) vec3 dir;
|
CGLM_ALIGN(8) vec3 dir;
|
||||||
glm_vec3_sub(to, from, dir);
|
glm_vec3_sub(to, from, dir);
|
||||||
glm_quat_for(dir, fwd, up, dest);
|
glm_quat_for(dir, up, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
|||||||
@@ -34,17 +34,19 @@ glmm_hadd(float32x4_t v) {
|
|||||||
static inline
|
static inline
|
||||||
float
|
float
|
||||||
glmm_hmin(float32x4_t v) {
|
glmm_hmin(float32x4_t v) {
|
||||||
v = vpmin_f32(vget_low_f32(v), vget_high_f32(v));
|
float32x2_t t;
|
||||||
v = vpmin_f32(v, v);
|
t = vpmin_f32(vget_low_f32(v), vget_high_f32(v));
|
||||||
return vget_lane_f32(v, 0);
|
t = vpmin_f32(t, t);
|
||||||
|
return vget_lane_f32(t, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline
|
static inline
|
||||||
float
|
float
|
||||||
glmm_hmax(float32x4_t v) {
|
glmm_hmax(float32x4_t v) {
|
||||||
v = vpmax_f32(vget_low_f32(v), vget_high_f32(v));
|
float32x2_t t;
|
||||||
v = vpmax_f32(v, v);
|
t = vpmax_f32(vget_low_f32(v), vget_high_f32(v));
|
||||||
return vget_lane_f32(v, 0);
|
t = vpmax_f32(t, t);
|
||||||
|
return vget_lane_f32(t, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline
|
static inline
|
||||||
|
|||||||
45
include/cglm/simd/sse2/mat2.h
Normal file
45
include/cglm/simd/sse2/mat2.h
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglm_mat2_sse_h
|
||||||
|
#define cglm_mat2_sse_h
|
||||||
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
|
|
||||||
|
#include "../../common.h"
|
||||||
|
#include "../intrin.h"
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat2_mul_sse2(mat2 m1, mat2 m2, mat2 dest) {
|
||||||
|
__m128 x0, x1, x2;
|
||||||
|
|
||||||
|
x1 = glmm_load(m1[0]); /* d c b a */
|
||||||
|
x2 = glmm_load(m2[0]); /* h g f e */
|
||||||
|
|
||||||
|
/*
|
||||||
|
dest[0][0] = a * e + c * f;
|
||||||
|
dest[0][1] = b * e + d * f;
|
||||||
|
dest[1][0] = a * g + c * h;
|
||||||
|
dest[1][1] = b * g + d * h;
|
||||||
|
*/
|
||||||
|
x0 = _mm_mul_ps(_mm_movelh_ps(x1, x1), glmm_shuff1(x2, 2, 2, 0, 0));
|
||||||
|
x1 = _mm_mul_ps(_mm_movehl_ps(x1, x1), glmm_shuff1(x2, 3, 3, 1, 1));
|
||||||
|
x1 = _mm_add_ps(x0, x1);
|
||||||
|
|
||||||
|
glmm_store(dest[0], x1);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat2_transp_sse2(mat2 m, mat2 dest) {
|
||||||
|
/* d c b a */
|
||||||
|
/* d b c a */
|
||||||
|
glmm_store(dest[0], glmm_shuff1(glmm_load(m[0]), 3, 1, 2, 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif /* cglm_mat2_sse_h */
|
||||||
@@ -13,8 +13,10 @@ extern "C" {
|
|||||||
|
|
||||||
#include "cglm.h"
|
#include "cglm.h"
|
||||||
#include "types-struct.h"
|
#include "types-struct.h"
|
||||||
|
#include "struct/vec2.h"
|
||||||
#include "struct/vec3.h"
|
#include "struct/vec3.h"
|
||||||
#include "struct/vec4.h"
|
#include "struct/vec4.h"
|
||||||
|
#include "struct/mat2.h"
|
||||||
#include "struct/mat3.h"
|
#include "struct/mat3.h"
|
||||||
#include "struct/mat4.h"
|
#include "struct/mat4.h"
|
||||||
#include "struct/affine.h"
|
#include "struct/affine.h"
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
CGLM_INLINE mat4s glms_scale_make(vec3s v);
|
CGLM_INLINE mat4s glms_scale_make(vec3s v);
|
||||||
CGLM_INLINE mat4s glms_scale(mat4s m, vec3s v);
|
CGLM_INLINE mat4s glms_scale(mat4s m, vec3s v);
|
||||||
CGLM_INLINE mat4s glms_scale_uni(mat4s m, float s);
|
CGLM_INLINE mat4s glms_scale_uni(mat4s m, float s);
|
||||||
CGLM_INLINE mat4s glmx_rotate_x(mat4s m, float angle);
|
CGLM_INLINE mat4s glms_rotate_x(mat4s m, float angle);
|
||||||
CGLM_INLINE mat4s glms_rotate_y(mat4s m, float angle);
|
CGLM_INLINE mat4s glms_rotate_y(mat4s m, float angle);
|
||||||
CGLM_INLINE mat4s glms_rotate_z(mat4s m, float angle);
|
CGLM_INLINE mat4s glms_rotate_z(mat4s m, float angle);
|
||||||
CGLM_INLINE mat4s glms_rotate_make(float angle, vec3s axis);
|
CGLM_INLINE mat4s glms_rotate_make(float angle, vec3s axis);
|
||||||
@@ -169,7 +169,7 @@ glms_scale_uni(mat4s m, float s) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
mat4s
|
mat4s
|
||||||
glmx_rotate_x(mat4s m, float angle) {
|
glms_rotate_x(mat4s m, float angle) {
|
||||||
mat4s r;
|
mat4s r;
|
||||||
glm_rotate_x(m.raw, angle, r.raw);
|
glm_rotate_x(m.raw, angle, r.raw);
|
||||||
return r;
|
return r;
|
||||||
|
|||||||
258
include/cglm/struct/mat2.h
Normal file
258
include/cglm/struct/mat2.h
Normal file
@@ -0,0 +1,258 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Macros:
|
||||||
|
GLM_MAT2_IDENTITY_INIT
|
||||||
|
GLM_MAT2_ZERO_INIT
|
||||||
|
GLM_MAT2_IDENTITY
|
||||||
|
GLM_MAT2_ZERO
|
||||||
|
|
||||||
|
Functions:
|
||||||
|
CGLM_INLINE void glms_mat2_identity(mat2 mat)
|
||||||
|
CGLM_INLINE void glms_mat2_identity_array(mat2 * restrict mat, size_t count)
|
||||||
|
CGLM_INLINE void glms_mat2_zero(mat2 mat)
|
||||||
|
CGLM_INLINE void glms_mat2_mul(mat2 m1, mat2 m2, mat2 dest)
|
||||||
|
CGLM_INLINE void glms_mat2_transpose_to(mat2 m, mat2 dest)
|
||||||
|
CGLM_INLINE void glms_mat2_transpose(mat2 m)
|
||||||
|
CGLM_INLINE void glms_mat2_mulv(mat2 m, vec2 v, vec2 dest)
|
||||||
|
CGLM_INLINE float glms_mat2_trace(mat2 m)
|
||||||
|
CGLM_INLINE void glms_mat2_scale(mat2 m, float s)
|
||||||
|
CGLM_INLINE float glms_mat2_det(mat2 mat)
|
||||||
|
CGLM_INLINE void glms_mat2_inv(mat2 mat, mat2 dest)
|
||||||
|
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 float glms_mat2_rmc(vec2 r, mat2 m, vec2 c)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglms_mat2_h
|
||||||
|
#define cglms_mat2_h
|
||||||
|
|
||||||
|
#include "../common.h"
|
||||||
|
#include "../types-struct.h"
|
||||||
|
#include "../mat2.h"
|
||||||
|
|
||||||
|
#define GLMS_MAT2_IDENTITY_INIT {1.0f, 0.0f, 0.0f, 1.0f}
|
||||||
|
#define GLMS_MAT2_ZERO_INIT {0.0f, 0.0f, 0.0f, 0.0f}
|
||||||
|
|
||||||
|
/* for C only */
|
||||||
|
#define GLMS_MAT2_IDENTITY ((mat3s)GLMS_MAT2_IDENTITY_INIT)
|
||||||
|
#define GLMS_MAT2_ZERO ((mat3s)GLMS_MAT2_ZERO_INIT)
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief make given matrix identity. It is identical with below,
|
||||||
|
* but it is more easy to do that with this func especially for members
|
||||||
|
* e.g. glm_mat2_identity(aStruct->aMatrix);
|
||||||
|
*
|
||||||
|
* @code
|
||||||
|
* glm_mat2_copy(GLM_MAT2_IDENTITY, mat); // C only
|
||||||
|
*
|
||||||
|
* // or
|
||||||
|
* mat2 mat = GLM_MAT2_IDENTITY_INIT;
|
||||||
|
* @endcode
|
||||||
|
*
|
||||||
|
* @returns identity matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
mat2s
|
||||||
|
glms_mat2_identity(void) {
|
||||||
|
mat2s r;
|
||||||
|
glm_mat2_identity(r.raw);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief make given matrix array's each element identity matrix
|
||||||
|
*
|
||||||
|
* @param[in, out] mat matrix array (must be aligned (16)
|
||||||
|
* if alignment is not disabled)
|
||||||
|
*
|
||||||
|
* @param[in] count count of matrices
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glms_mat2_identity_array(mat2s * __restrict mat, size_t count) {
|
||||||
|
CGLM_ALIGN_MAT mat2s t = GLMS_MAT2_IDENTITY_INIT;
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
for (i = 0; i < count; i++) {
|
||||||
|
glm_mat2_copy(t.raw, mat[i].raw);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief make given matrix zero.
|
||||||
|
*
|
||||||
|
* @returns matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
mat2s
|
||||||
|
glms_mat2_zero(void) {
|
||||||
|
mat2s r;
|
||||||
|
glm_mat2_zero(r.raw);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief multiply m1 and m2 to dest
|
||||||
|
*
|
||||||
|
* m1, m2 and dest matrices can be same matrix, it is possible to write this:
|
||||||
|
*
|
||||||
|
* @code
|
||||||
|
* mat2 m = GLM_MAT2_IDENTITY_INIT;
|
||||||
|
* glm_mat2_mul(m, m, m);
|
||||||
|
* @endcode
|
||||||
|
*
|
||||||
|
* @param[in] m1 left matrix
|
||||||
|
* @param[in] m2 right matrix
|
||||||
|
*
|
||||||
|
* @returns matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
mat2s
|
||||||
|
glms_mat2_mul(mat2s m1, mat2s m2) {
|
||||||
|
mat2s r;
|
||||||
|
glm_mat2_mul(m1.raw, m2.raw, r.raw);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief transpose mat2
|
||||||
|
*
|
||||||
|
* @param[in] m matrix to transpose
|
||||||
|
*
|
||||||
|
* @returns transposed matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
mat2s
|
||||||
|
glms_mat2_transpose(mat2s m) {
|
||||||
|
glm_mat2_transpose(m.raw);
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief multiply mat2 with vec2 (column vector) and store in dest vector
|
||||||
|
*
|
||||||
|
* @param[in] m mat2 (left)
|
||||||
|
* @param[in] v vec2 (right, column vector)
|
||||||
|
* @returns vec2 (result, column vector)
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
vec2s
|
||||||
|
glms_mat2_mulv(mat2s m, vec2s v) {
|
||||||
|
vec2s r;
|
||||||
|
glm_mat2_mulv(m.raw, v.raw, r.raw);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief trace of matrix
|
||||||
|
*
|
||||||
|
* sum of the elements on the main diagonal from upper left to the lower right
|
||||||
|
*
|
||||||
|
* @param[in] m matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glms_mat2_trace(mat2s m) {
|
||||||
|
return glm_mat2_trace(m.raw);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief scale (multiply with scalar) matrix
|
||||||
|
*
|
||||||
|
* multiply matrix with scalar
|
||||||
|
*
|
||||||
|
* @param[in, out] m matrix
|
||||||
|
* @param[in] s scalar
|
||||||
|
* @returns matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
mat2s
|
||||||
|
glms_mat2_scale(mat2s m, float s) {
|
||||||
|
glm_mat2_scale(m.raw, s);
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief mat2 determinant
|
||||||
|
*
|
||||||
|
* @param[in] mat matrix
|
||||||
|
*
|
||||||
|
* @return determinant
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glms_mat2_det(mat2s mat) {
|
||||||
|
return glm_mat2_det(mat.raw);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief inverse mat2 and store in dest
|
||||||
|
*
|
||||||
|
* @param[in] mat matrix
|
||||||
|
* @returns matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
mat2s
|
||||||
|
glms_mat2_inv(mat2s mat) {
|
||||||
|
mat2s r;
|
||||||
|
glm_mat2_inv(mat.raw, r.raw);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief swap two matrix columns
|
||||||
|
*
|
||||||
|
* @param[in] mat matrix
|
||||||
|
* @param[in] col1 col1
|
||||||
|
* @param[in] col2 col2
|
||||||
|
* @returns matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
mat2s
|
||||||
|
glms_mat2_swap_col(mat2s mat, int col1, int col2) {
|
||||||
|
glm_mat2_swap_col(mat.raw, col1, col2);
|
||||||
|
return mat;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief swap two matrix rows
|
||||||
|
*
|
||||||
|
* @param[in] mat matrix
|
||||||
|
* @param[in] row1 row1
|
||||||
|
* @param[in] row2 row2
|
||||||
|
* @returns matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
mat2s
|
||||||
|
glms_mat2_swap_row(mat2s mat, int row1, int row2) {
|
||||||
|
glm_mat2_swap_row(mat.raw, row1, row2);
|
||||||
|
return mat;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief helper for R (row vector) * M (matrix) * C (column vector)
|
||||||
|
*
|
||||||
|
* rmc stands for Row * Matrix * Column
|
||||||
|
*
|
||||||
|
* the result is scalar because R * M = Matrix1x2 (row vector),
|
||||||
|
* then Matrix1x2 * Vec2 (column vector) = Matrix1x1 (Scalar)
|
||||||
|
*
|
||||||
|
* @param[in] r row vector or matrix1x2
|
||||||
|
* @param[in] m matrix2x2
|
||||||
|
* @param[in] c column vector or matrix2x1
|
||||||
|
*
|
||||||
|
* @return scalar value e.g. Matrix1x1
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glms_mat2_rmc(vec2s r, mat2s m, vec2s c) {
|
||||||
|
return glm_mat2_rmc(r.raw, m.raw, c.raw);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* cglms_mat2_h */
|
||||||
@@ -14,9 +14,9 @@
|
|||||||
|
|
||||||
Functions:
|
Functions:
|
||||||
CGLM_INLINE mat3s glms_mat3_copy(mat3s mat);
|
CGLM_INLINE mat3s glms_mat3_copy(mat3s mat);
|
||||||
CGLM_INLINE mat3s glms_mat3_identity();
|
CGLM_INLINE mat3s glms_mat3_identity(void);
|
||||||
CGLM_INLINE void glms_mat3_identity_array(mat3s * __restrict mat, size_t count);
|
CGLM_INLINE void glms_mat3_identity_array(mat3s * __restrict mat, size_t count);
|
||||||
CGLM_INLINE mat3s glms_mat3_zero();
|
CGLM_INLINE mat3s glms_mat3_zero(void);
|
||||||
CGLM_INLINE mat3s glms_mat3_mul(mat3s m1, mat3s m2);
|
CGLM_INLINE mat3s glms_mat3_mul(mat3s m1, mat3s m2);
|
||||||
CGLM_INLINE ma3s glms_mat3_transpose(mat3s m);
|
CGLM_INLINE ma3s glms_mat3_transpose(mat3s m);
|
||||||
CGLM_INLINE vec3s glms_mat3_mulv(mat3s m, vec3s v);
|
CGLM_INLINE vec3s glms_mat3_mulv(mat3s m, vec3s v);
|
||||||
@@ -38,12 +38,8 @@
|
|||||||
#include "../mat3.h"
|
#include "../mat3.h"
|
||||||
#include "vec3.h"
|
#include "vec3.h"
|
||||||
|
|
||||||
#define GLMS_MAT3_IDENTITY_INIT {1.0f, 0.0f, 0.0f, \
|
#define GLMS_MAT3_IDENTITY_INIT {GLM_MAT3_IDENTITY_INIT}
|
||||||
0.0f, 1.0f, 0.0f, \
|
#define GLMS_MAT3_ZERO_INIT {GLM_MAT3_ZERO_INIT}
|
||||||
0.0f, 0.0f, 1.0f}
|
|
||||||
#define GLMS_MAT3_ZERO_INIT {0.0f, 0.0f, 0.0f, \
|
|
||||||
0.0f, 0.0f, 0.0f, \
|
|
||||||
0.0f, 0.0f, 0.0f}
|
|
||||||
|
|
||||||
/* for C only */
|
/* for C only */
|
||||||
#define GLMS_MAT3_IDENTITY ((mat3s)GLMS_MAT3_IDENTITY_INIT)
|
#define GLMS_MAT3_IDENTITY ((mat3s)GLMS_MAT3_IDENTITY_INIT)
|
||||||
@@ -79,7 +75,7 @@ glms_mat3_copy(mat3s mat) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
mat3s
|
mat3s
|
||||||
glms_mat3_identity() {
|
glms_mat3_identity(void) {
|
||||||
mat3s r;
|
mat3s r;
|
||||||
glm_mat3_identity(r.raw);
|
glm_mat3_identity(r.raw);
|
||||||
return r;
|
return r;
|
||||||
@@ -111,7 +107,7 @@ glms_mat3_identity_array(mat3s * __restrict mat, size_t count) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
mat3s
|
mat3s
|
||||||
glms_mat3_zero() {
|
glms_mat3_zero(void) {
|
||||||
mat3s r;
|
mat3s r;
|
||||||
glm_mat3_zero(r.raw);
|
glm_mat3_zero(r.raw);
|
||||||
return r;
|
return r;
|
||||||
|
|||||||
@@ -20,9 +20,9 @@
|
|||||||
Functions:
|
Functions:
|
||||||
CGLM_INLINE mat4s glms_mat4_ucopy(mat4s mat);
|
CGLM_INLINE mat4s glms_mat4_ucopy(mat4s mat);
|
||||||
CGLM_INLINE mat4s glms_mat4_copy(mat4s mat);
|
CGLM_INLINE mat4s glms_mat4_copy(mat4s mat);
|
||||||
CGLM_INLINE mat4s glms_mat4_identity();
|
CGLM_INLINE mat4s glms_mat4_identity(void);
|
||||||
CGLM_INLINE void glms_mat4_identity_array(mat4s * __restrict mat, size_t count);
|
CGLM_INLINE void glms_mat4_identity_array(mat4s * __restrict mat, size_t count);
|
||||||
CGLM_INLINE mat4s glms_mat4_zero();
|
CGLM_INLINE mat4s glms_mat4_zero(void);
|
||||||
CGLM_INLINE mat3s glms_mat4_pick3(mat4s mat);
|
CGLM_INLINE mat3s glms_mat4_pick3(mat4s mat);
|
||||||
CGLM_INLINE mat3s glms_mat4_pick3t(mat4s mat);
|
CGLM_INLINE mat3s glms_mat4_pick3t(mat4s mat);
|
||||||
CGLM_INLINE mat4s glms_mat4_ins3(mat3s mat);
|
CGLM_INLINE mat4s glms_mat4_ins3(mat3s mat);
|
||||||
@@ -53,15 +53,8 @@
|
|||||||
#include "vec4.h"
|
#include "vec4.h"
|
||||||
#include "vec3.h"
|
#include "vec3.h"
|
||||||
|
|
||||||
#define GLMS_MAT4_IDENTITY_INIT {1.0f, 0.0f, 0.0f, 0.0f, \
|
#define GLMS_MAT4_IDENTITY_INIT {GLM_MAT4_IDENTITY_INIT}
|
||||||
0.0f, 1.0f, 0.0f, 0.0f, \
|
#define GLMS_MAT4_ZERO_INIT {GLM_MAT4_ZERO_INIT}
|
||||||
0.0f, 0.0f, 1.0f, 0.0f, \
|
|
||||||
0.0f, 0.0f, 0.0f, 1.0f}
|
|
||||||
|
|
||||||
#define GLMS_MAT4_ZERO_INIT {0.0f, 0.0f, 0.0f, 0.0f, \
|
|
||||||
0.0f, 0.0f, 0.0f, 0.0f, \
|
|
||||||
0.0f, 0.0f, 0.0f, 0.0f, \
|
|
||||||
0.0f, 0.0f, 0.0f, 0.0f}
|
|
||||||
|
|
||||||
/* for C only */
|
/* for C only */
|
||||||
#define GLMS_MAT4_IDENTITY ((mat4s)GLMS_MAT4_IDENTITY_INIT)
|
#define GLMS_MAT4_IDENTITY ((mat4s)GLMS_MAT4_IDENTITY_INIT)
|
||||||
@@ -114,7 +107,7 @@ glms_mat4_copy(mat4s mat) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
mat4s
|
mat4s
|
||||||
glms_mat4_identity() {
|
glms_mat4_identity(void) {
|
||||||
mat4s r;
|
mat4s r;
|
||||||
glm_mat4_identity(r.raw);
|
glm_mat4_identity(r.raw);
|
||||||
return r;
|
return r;
|
||||||
@@ -146,7 +139,7 @@ glms_mat4_identity_array(mat4s * __restrict mat, size_t count) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
mat4s
|
mat4s
|
||||||
glms_mat4_zero() {
|
glms_mat4_zero(void) {
|
||||||
mat4s r;
|
mat4s r;
|
||||||
glm_mat4_zero(r.raw);
|
glm_mat4_zero(r.raw);
|
||||||
return r;
|
return r;
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
GLMS_QUAT_IDENTITY
|
GLMS_QUAT_IDENTITY
|
||||||
|
|
||||||
Functions:
|
Functions:
|
||||||
CGLM_INLINE versors glms_quat_identity()
|
CGLM_INLINE versors glms_quat_identity(void)
|
||||||
CGLM_INLINE void glms_quat_identity_array(versor *q, size_t count)
|
CGLM_INLINE void glms_quat_identity_array(versor *q, size_t count)
|
||||||
CGLM_INLINE versors glms_quat_init(float x, float y, float z, float w)
|
CGLM_INLINE versors glms_quat_init(float x, float y, float z, float w)
|
||||||
CGLM_INLINE versors glms_quatv(float angle, vec3s axis)
|
CGLM_INLINE versors glms_quatv(float angle, vec3s axis)
|
||||||
@@ -62,7 +62,7 @@
|
|||||||
* ----------------------------------------------------------------------------
|
* ----------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define GLMS_QUAT_IDENTITY_INIT GLM_QUAT_IDENTITY_INIT
|
#define GLMS_QUAT_IDENTITY_INIT {GLM_QUAT_IDENTITY_INIT}
|
||||||
#define GLMS_QUAT_IDENTITY ((versors)GLMS_QUAT_IDENTITY_INIT)
|
#define GLMS_QUAT_IDENTITY ((versors)GLMS_QUAT_IDENTITY_INIT)
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -72,7 +72,7 @@
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
versors
|
versors
|
||||||
glms_quat_identity() {
|
glms_quat_identity(void) {
|
||||||
versors dest;
|
versors dest;
|
||||||
glm_quat_identity(dest.raw);
|
glm_quat_identity(dest.raw);
|
||||||
return dest;
|
return dest;
|
||||||
@@ -251,7 +251,7 @@ CGLM_INLINE
|
|||||||
vec3s
|
vec3s
|
||||||
glms_quat_imagn(versors q) {
|
glms_quat_imagn(versors q) {
|
||||||
vec3s dest;
|
vec3s dest;
|
||||||
glm_normalize_to(q.imag.raw, dest.raw);
|
glm_normalize_to(q.raw, dest.raw);
|
||||||
return dest;
|
return dest;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -437,15 +437,14 @@ glms_quat_look(vec3s eye, versors ori) {
|
|||||||
* @brief creates look rotation quaternion
|
* @brief creates look rotation quaternion
|
||||||
*
|
*
|
||||||
* @param[in] dir direction to look
|
* @param[in] dir direction to look
|
||||||
* @param[in] fwd forward vector
|
|
||||||
* @param[in] up up vector
|
* @param[in] up up vector
|
||||||
* @returns destination quaternion
|
* @returns destination quaternion
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
versors
|
versors
|
||||||
glms_quat_for(vec3s dir, vec3s fwd, vec3s up) {
|
glms_quat_for(vec3s dir, vec3s up) {
|
||||||
versors dest;
|
versors dest;
|
||||||
glm_quat_for(dir.raw, fwd.raw, up.raw, dest.raw);
|
glm_quat_for(dir.raw, up.raw, dest.raw);
|
||||||
return dest;
|
return dest;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -455,15 +454,14 @@ glms_quat_for(vec3s dir, vec3s fwd, vec3s up) {
|
|||||||
*
|
*
|
||||||
* @param[in] from source point
|
* @param[in] from source point
|
||||||
* @param[in] to destination point
|
* @param[in] to destination point
|
||||||
* @param[in] fwd forward vector
|
|
||||||
* @param[in] up up vector
|
* @param[in] up up vector
|
||||||
* @returns destination quaternion
|
* @returns destination quaternion
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
versors
|
versors
|
||||||
glms_quat_forp(vec3s from, vec3s to, vec3s fwd, vec3s up) {
|
glms_quat_forp(vec3s from, vec3s to, vec3s up) {
|
||||||
versors dest;
|
versors dest;
|
||||||
glm_quat_forp(from.raw, to.raw, fwd.raw, up.raw, dest.raw);
|
glm_quat_forp(from.raw, to.raw, up.raw, dest.raw);
|
||||||
return dest;
|
return dest;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
198
include/cglm/struct/vec2-ext.h
Normal file
198
include/cglm/struct/vec2-ext.h
Normal file
@@ -0,0 +1,198 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief SIMD like functions
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Functions:
|
||||||
|
CGLM_INLINE vec2s glms_vec2_fill(float val)
|
||||||
|
CGLM_INLINE bool glms_vec2_eq(vec2s v, float val)
|
||||||
|
CGLM_INLINE bool glms_vec2_eq_eps(vec2s v, float val)
|
||||||
|
CGLM_INLINE bool glms_vec2_eq_all(vec2s v)
|
||||||
|
CGLM_INLINE bool glms_vec2_eqv(vec2s a, vec2s b)
|
||||||
|
CGLM_INLINE bool glms_vec2_eqv_eps(vec2s a, vec2s b)
|
||||||
|
CGLM_INLINE float glms_vec2_max(vec2s v)
|
||||||
|
CGLM_INLINE float glms_vec2_min(vec2s v)
|
||||||
|
CGLM_INLINE bool glms_vec2_isnan(vec2s v)
|
||||||
|
CGLM_INLINE bool glms_vec2_isinf(vec2s v)
|
||||||
|
CGLM_INLINE bool glms_vec2_isvalid(vec2s v)
|
||||||
|
CGLM_INLINE vec2s glms_vec2_sign(vec2s v)
|
||||||
|
CGLM_INLINE vec2s glms_vec2_sqrt(vec2s v)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglms_vec2s_ext_h
|
||||||
|
#define cglms_vec2s_ext_h
|
||||||
|
|
||||||
|
#include "../common.h"
|
||||||
|
#include "../types-struct.h"
|
||||||
|
#include "../util.h"
|
||||||
|
#include "../vec2-ext.h"
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief fill a vector with specified value
|
||||||
|
*
|
||||||
|
* @param[in] val value
|
||||||
|
* @returns dest
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
vec2s
|
||||||
|
glms_vec2_fill(float val) {
|
||||||
|
vec2s r;
|
||||||
|
glm_vec2_fill(r.raw, val);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief check if vector is equal to value (without epsilon)
|
||||||
|
*
|
||||||
|
* @param[in] v vector
|
||||||
|
* @param[in] val value
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
bool
|
||||||
|
glms_vec2_eq(vec2s v, float val) {
|
||||||
|
return glm_vec2_eq(v.raw, val);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief check if vector is equal to value (with epsilon)
|
||||||
|
*
|
||||||
|
* @param[in] v vector
|
||||||
|
* @param[in] val value
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
bool
|
||||||
|
glms_vec2_eq_eps(vec2s v, float val) {
|
||||||
|
return glm_vec2_eq_eps(v.raw, val);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief check if vectors members are equal (without epsilon)
|
||||||
|
*
|
||||||
|
* @param[in] v vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
bool
|
||||||
|
glms_vec2_eq_all(vec2s v) {
|
||||||
|
return glm_vec2_eq_all(v.raw);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief check if vector is equal to another (without epsilon)
|
||||||
|
*
|
||||||
|
* @param[in] a vector
|
||||||
|
* @param[in] b vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
bool
|
||||||
|
glms_vec2_eqv(vec2s a, vec2s b) {
|
||||||
|
return glm_vec2_eqv(a.raw, b.raw);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief check if vector is equal to another (with epsilon)
|
||||||
|
*
|
||||||
|
* @param[in] a vector
|
||||||
|
* @param[in] b vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
bool
|
||||||
|
glms_vec2_eqv_eps(vec2s a, vec2s b) {
|
||||||
|
return glm_vec2_eqv_eps(a.raw, b.raw);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief max value of vector
|
||||||
|
*
|
||||||
|
* @param[in] v vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glms_vec2_max(vec2s v) {
|
||||||
|
return glm_vec2_max(v.raw);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief min value of vector
|
||||||
|
*
|
||||||
|
* @param[in] v vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glms_vec2_min(vec2s v) {
|
||||||
|
return glm_vec2_min(v.raw);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief check if all items are NaN (not a number)
|
||||||
|
* you should only use this in DEBUG mode or very critical asserts
|
||||||
|
*
|
||||||
|
* @param[in] v vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
bool
|
||||||
|
glms_vec2_isnan(vec2s v) {
|
||||||
|
return glm_vec2_isnan(v.raw);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief check if all items are INFINITY
|
||||||
|
* you should only use this in DEBUG mode or very critical asserts
|
||||||
|
*
|
||||||
|
* @param[in] v vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
bool
|
||||||
|
glms_vec2_isinf(vec2s v) {
|
||||||
|
return glm_vec2_isinf(v.raw);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief check if all items are valid number
|
||||||
|
* you should only use this in DEBUG mode or very critical asserts
|
||||||
|
*
|
||||||
|
* @param[in] v vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
bool
|
||||||
|
glms_vec2_isvalid(vec2s v) {
|
||||||
|
return glm_vec2_isvalid(v.raw);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief get sign of 32 bit float as +1, -1, 0
|
||||||
|
*
|
||||||
|
* Important: It returns 0 for zero/NaN input
|
||||||
|
*
|
||||||
|
* @param v vector
|
||||||
|
* @returns sign vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
vec2s
|
||||||
|
glms_vec2_sign(vec2s v) {
|
||||||
|
vec2s r;
|
||||||
|
glm_vec2_sign(v.raw, r.raw);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief square root of each vector item
|
||||||
|
*
|
||||||
|
* @param[in] v vector
|
||||||
|
* @returns destination vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
vec2s
|
||||||
|
glms_vec2_sqrt(vec2s v) {
|
||||||
|
vec2s r;
|
||||||
|
glm_vec2_sqrt(v.raw, r.raw);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* cglms_vec2s_ext_h */
|
||||||
561
include/cglm/struct/vec2.h
Normal file
561
include/cglm/struct/vec2.h
Normal file
@@ -0,0 +1,561 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Macros:
|
||||||
|
GLMS_VEC2_ONE_INIT
|
||||||
|
GLMS_VEC2_ZERO_INIT
|
||||||
|
GLMS_VEC2_ONE
|
||||||
|
GLMS_VEC2_ZERO
|
||||||
|
|
||||||
|
Functions:
|
||||||
|
CGLM_INLINE vec2s glms_vec2(vec3s v3)
|
||||||
|
CGLM_INLINE void glms_vec2_pack(vec2s dst[], vec2 src[], size_t len)
|
||||||
|
CGLM_INLINE void glms_vec2_unpack(vec2 dst[], vec2s src[], size_t len)
|
||||||
|
CGLM_INLINE vec2s glms_vec2_zero(void)
|
||||||
|
CGLM_INLINE vec2s glms_vec2_one(void)
|
||||||
|
CGLM_INLINE float glms_vec2_dot(vec2s a, vec2s b)
|
||||||
|
CGLM_INLINE float glms_vec2_cross(vec2s a, vec2s b)
|
||||||
|
CGLM_INLINE float glms_vec2_norm2(vec2s v)
|
||||||
|
CGLM_INLINE float glms_vec2_norm(vec2s v)
|
||||||
|
CGLM_INLINE vec2s glms_vec2_add(vec2s a, vec2s b)
|
||||||
|
CGLM_INLINE vec2s glms_vec2_adds(vec2s a, float s)
|
||||||
|
CGLM_INLINE vec2s glms_vec2_sub(vec2s a, vec2s b)
|
||||||
|
CGLM_INLINE vec2s glms_vec2_subs(vec2s a, float s)
|
||||||
|
CGLM_INLINE vec2s glms_vec2_mul(vec2s a, vec2s b)
|
||||||
|
CGLM_INLINE vec2s glms_vec2_scale(vec2s v, float s)
|
||||||
|
CGLM_INLINE vec2s glms_vec2_scale_as(vec2s v, float s)
|
||||||
|
CGLM_INLINE vec2s glms_vec2_div(vec2s a, vec2s b)
|
||||||
|
CGLM_INLINE vec2s glms_vec2_divs(vec2s a, float s)
|
||||||
|
CGLM_INLINE vec2s glms_vec2_addadd(vec2s a, vec2s b, vec2s dest)
|
||||||
|
CGLM_INLINE vec2s glms_vec2_subadd(vec2s a, vec2s b, vec2s dest)
|
||||||
|
CGLM_INLINE vec2s glms_vec2_muladd(vec2s a, vec2s b, vec2s dest)
|
||||||
|
CGLM_INLINE vec2s glms_vec2_muladds(vec2s a, float s, vec2s dest)
|
||||||
|
CGLM_INLINE vec2s glms_vec2_maxadd(vec2s a, vec2s b, vec2s dest)
|
||||||
|
CGLM_INLINE vec2s glms_vec2_minadd(vec2s a, vec2s b, vec2s dest)
|
||||||
|
CGLM_INLINE vec2s glms_vec2_negate(vec2s v)
|
||||||
|
CGLM_INLINE vec2s glms_vec2_normalize(vec2s v)
|
||||||
|
CGLM_INLINE vec2s glms_vec2_rotate(vec2s v, float angle, vec2s axis)
|
||||||
|
CGLM_INLINE float glms_vec2_distance(vec2s a, vec2s b)
|
||||||
|
CGLM_INLINE float glms_vec2_distance2(vec2s a, vec2s b)
|
||||||
|
CGLM_INLINE vec2s glms_vec2_maxv(vec2s a, vec2s b)
|
||||||
|
CGLM_INLINE vec2s glms_vec2_minv(vec2s a, vec2s b)
|
||||||
|
CGLM_INLINE vec2s glms_vec2_clamp(vec2s v, float minVal, float maxVal)
|
||||||
|
CGLM_INLINE vec2s glms_vec2_lerp(vec2s from, vec2s to, float t)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglms_vec2s_h
|
||||||
|
#define cglms_vec2s_h
|
||||||
|
|
||||||
|
#include "../common.h"
|
||||||
|
#include "../types-struct.h"
|
||||||
|
#include "../util.h"
|
||||||
|
#include "../vec2.h"
|
||||||
|
#include "vec2-ext.h"
|
||||||
|
|
||||||
|
#define GLMS_VEC2_ONE_INIT {GLM_VEC2_ONE_INIT}
|
||||||
|
#define GLMS_VEC2_ZERO_INIT {GLM_VEC2_ZERO_INIT}
|
||||||
|
|
||||||
|
#define GLMS_VEC2_ONE ((vec2s)GLMS_VEC2_ONE_INIT)
|
||||||
|
#define GLMS_VEC2_ZERO ((vec2s)GLMS_VEC2_ZERO_INIT)
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief init vec2 using vec2
|
||||||
|
*
|
||||||
|
* @param[in] v4 vector3
|
||||||
|
* @returns destination
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
vec2s
|
||||||
|
glms_vec2(vec3s v3) {
|
||||||
|
vec2s r;
|
||||||
|
glm_vec2(v3.raw, r.raw);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief pack an array of vec2 into an array of vec2s
|
||||||
|
*
|
||||||
|
* @param[out] dst array of vec2
|
||||||
|
* @param[in] src array of vec2s
|
||||||
|
* @param[in] len number of elements
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glms_vec2_pack(vec2s dst[], vec2 src[], size_t len) {
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
for (i = 0; i < len; i++) {
|
||||||
|
glm_vec2_copy(src[i], dst[i].raw);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief unpack an array of vec2s into an array of vec2
|
||||||
|
*
|
||||||
|
* @param[out] dst array of vec2s
|
||||||
|
* @param[in] src array of vec2
|
||||||
|
* @param[in] len number of elements
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glms_vec2_unpack(vec2 dst[], vec2s src[], size_t len) {
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
for (i = 0; i < len; i++) {
|
||||||
|
glm_vec2_copy(src[i].raw, dst[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief make vector zero
|
||||||
|
*
|
||||||
|
* @returns zero vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
vec2s
|
||||||
|
glms_vec2_zero(void) {
|
||||||
|
vec2s r;
|
||||||
|
glm_vec2_zero(r.raw);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief make vector one
|
||||||
|
*
|
||||||
|
* @returns one vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
vec2s
|
||||||
|
glms_vec2_one(void) {
|
||||||
|
vec2s r;
|
||||||
|
glm_vec2_one(r.raw);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief vec2 dot product
|
||||||
|
*
|
||||||
|
* @param[in] a vector1
|
||||||
|
* @param[in] b vector2
|
||||||
|
*
|
||||||
|
* @return dot product
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glms_vec2_dot(vec2s a, vec2s b) {
|
||||||
|
return glm_vec2_dot(a.raw, b.raw);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief vec2 cross product
|
||||||
|
*
|
||||||
|
* REF: http://allenchou.net/2013/07/cross-product-of-2d-vectors/
|
||||||
|
*
|
||||||
|
* @param[in] a vector1
|
||||||
|
* @param[in] b vector2
|
||||||
|
*
|
||||||
|
* @return Z component of cross product
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glms_vec2_cross(vec2s a, vec2s b) {
|
||||||
|
return glm_vec2_cross(a.raw, b.raw);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief norm * norm (magnitude) of vec
|
||||||
|
*
|
||||||
|
* we can use this func instead of calling norm * norm, because it would call
|
||||||
|
* sqrtf fuction twice but with this func we can avoid func call, maybe this is
|
||||||
|
* not good name for this func
|
||||||
|
*
|
||||||
|
* @param[in] v vector
|
||||||
|
*
|
||||||
|
* @return norm * norm
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glms_vec2_norm2(vec2s v) {
|
||||||
|
return glm_vec2_norm2(v.raw);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief norm (magnitude) of vec2
|
||||||
|
*
|
||||||
|
* @param[in] v vector
|
||||||
|
*
|
||||||
|
* @return norm
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glms_vec2_norm(vec2s v) {
|
||||||
|
return glm_vec2_norm(v.raw);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief add a vector to b vector store result in dest
|
||||||
|
*
|
||||||
|
* @param[in] a vector1
|
||||||
|
* @param[in] b vector2
|
||||||
|
* @returns destination vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
vec2s
|
||||||
|
glms_vec2_add(vec2s a, vec2s b) {
|
||||||
|
vec2s r;
|
||||||
|
glm_vec2_add(a.raw, b.raw, r.raw);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief add scalar to v vector store result in dest (d = v + s)
|
||||||
|
*
|
||||||
|
* @param[in] a vector
|
||||||
|
* @param[in] s scalar
|
||||||
|
* @returns destination vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
vec2s
|
||||||
|
glms_vec2_adds(vec2s a, float s) {
|
||||||
|
vec2s r;
|
||||||
|
glm_vec2_adds(a.raw, s, r.raw);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief subtract b vector from a vector store result in dest
|
||||||
|
*
|
||||||
|
* @param[in] a vector1
|
||||||
|
* @param[in] b vector2
|
||||||
|
* @returns destination vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
vec2s
|
||||||
|
glms_vec2_sub(vec2s a, vec2s b) {
|
||||||
|
vec2s r;
|
||||||
|
glm_vec2_sub(a.raw, b.raw, r.raw);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief subtract scalar from v vector store result in dest (d = v - s)
|
||||||
|
*
|
||||||
|
* @param[in] a vector
|
||||||
|
* @param[in] s scalar
|
||||||
|
* @returns destination vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
vec2s
|
||||||
|
glms_vec2_subs(vec2s a, float s) {
|
||||||
|
vec2s r;
|
||||||
|
glm_vec2_subs(a.raw, s, r.raw);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief multiply two vector (component-wise multiplication)
|
||||||
|
*
|
||||||
|
* @param a vector1
|
||||||
|
* @param b vector2
|
||||||
|
* @returns v3 = (a[0] * b[0], a[1] * b[1], a[2] * b[2])
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
vec2s
|
||||||
|
glms_vec2_mul(vec2s a, vec2s b) {
|
||||||
|
vec2s r;
|
||||||
|
glm_vec2_mul(a.raw, b.raw, r.raw);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief multiply/scale vec2 vector with scalar: result = v * s
|
||||||
|
*
|
||||||
|
* @param[in] v vector
|
||||||
|
* @param[in] s scalar
|
||||||
|
* @returns destination vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
vec2s
|
||||||
|
glms_vec2_scale(vec2s v, float s) {
|
||||||
|
vec2s r;
|
||||||
|
glm_vec2_scale(v.raw, s, r.raw);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief make vec2 vector scale as specified: result = unit(v) * s
|
||||||
|
*
|
||||||
|
* @param[in] v vector
|
||||||
|
* @param[in] s scalar
|
||||||
|
* @returns destination vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
vec2s
|
||||||
|
glms_vec2_scale_as(vec2s v, float s) {
|
||||||
|
vec2s r;
|
||||||
|
glm_vec2_scale_as(v.raw, s, r.raw);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief div vector with another component-wise division: d = a / b
|
||||||
|
*
|
||||||
|
* @param[in] a vector 1
|
||||||
|
* @param[in] b vector 2
|
||||||
|
* @returns result = (a[0]/b[0], a[1]/b[1], a[2]/b[2])
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
vec2s
|
||||||
|
glms_vec2_div(vec2s a, vec2s b) {
|
||||||
|
vec2s r;
|
||||||
|
glm_vec2_div(a.raw, b.raw, r.raw);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief div vector with scalar: d = v / s
|
||||||
|
*
|
||||||
|
* @param[in] a vector
|
||||||
|
* @param[in] s scalar
|
||||||
|
* @returns result = (a[0]/s, a[1]/s, a[2]/s)
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
vec2s
|
||||||
|
glms_vec2_divs(vec2s a, float s) {
|
||||||
|
vec2s r;
|
||||||
|
glm_vec2_divs(a.raw, s, r.raw);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief add two vectors and add result to sum
|
||||||
|
*
|
||||||
|
* it applies += operator so dest must be initialized
|
||||||
|
*
|
||||||
|
* @param[in] a vector 1
|
||||||
|
* @param[in] b vector 2
|
||||||
|
* @returns dest += (a + b)
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
vec2s
|
||||||
|
glms_vec2_addadd(vec2s a, vec2s b, vec2s dest) {
|
||||||
|
glm_vec2_addadd(a.raw, b.raw, dest.raw);
|
||||||
|
return dest;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief sub two vectors and add result to dest
|
||||||
|
*
|
||||||
|
* it applies += operator so dest must be initialized
|
||||||
|
*
|
||||||
|
* @param[in] a vector 1
|
||||||
|
* @param[in] b vector 2
|
||||||
|
* @returns dest += (a + b)
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
vec2s
|
||||||
|
glms_vec2_subadd(vec2s a, vec2s b, vec2s dest) {
|
||||||
|
glm_vec2_subadd(a.raw, b.raw, dest.raw);
|
||||||
|
return dest;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief mul two vectors and add result to dest
|
||||||
|
*
|
||||||
|
* it applies += operator so dest must be initialized
|
||||||
|
*
|
||||||
|
* @param[in] a vector 1
|
||||||
|
* @param[in] b vector 2
|
||||||
|
* @returns dest += (a * b)
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
vec2s
|
||||||
|
glms_vec2_muladd(vec2s a, vec2s b, vec2s dest) {
|
||||||
|
glm_vec2_muladd(a.raw, b.raw, dest.raw);
|
||||||
|
return dest;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief mul vector with scalar and add result to sum
|
||||||
|
*
|
||||||
|
* it applies += operator so dest must be initialized
|
||||||
|
*
|
||||||
|
* @param[in] a vector
|
||||||
|
* @param[in] s scalar
|
||||||
|
* @returns dest += (a * b)
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
vec2s
|
||||||
|
glms_vec2_muladds(vec2s a, float s, vec2s dest) {
|
||||||
|
glm_vec2_muladds(a.raw, s, dest.raw);
|
||||||
|
return dest;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief add max of two vector to result/dest
|
||||||
|
*
|
||||||
|
* it applies += operator so dest must be initialized
|
||||||
|
*
|
||||||
|
* @param[in] a vector 1
|
||||||
|
* @param[in] b vector 2
|
||||||
|
* @returns dest += max(a, b)
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
vec2s
|
||||||
|
glms_vec2_maxadd(vec2s a, vec2s b, vec2s dest) {
|
||||||
|
glm_vec2_maxadd(a.raw, b.raw, dest.raw);
|
||||||
|
return dest;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief add min of two vector to result/dest
|
||||||
|
*
|
||||||
|
* it applies += operator so dest must be initialized
|
||||||
|
*
|
||||||
|
* @param[in] a vector 1
|
||||||
|
* @param[in] b vector 2
|
||||||
|
* @returns dest += min(a, b)
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
vec2s
|
||||||
|
glms_vec2_minadd(vec2s a, vec2s b, vec2s dest) {
|
||||||
|
glm_vec2_minadd(a.raw, b.raw, dest.raw);
|
||||||
|
return dest;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief negate vector components
|
||||||
|
*
|
||||||
|
* @param[in] v vector
|
||||||
|
* @returns negated vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
vec2s
|
||||||
|
glms_vec2_negate(vec2s v) {
|
||||||
|
glm_vec2_negate(v.raw);
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief normalize vec2 and store result in same vec
|
||||||
|
*
|
||||||
|
* @param[in] v vector
|
||||||
|
* @returns normalized vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
vec2s
|
||||||
|
glms_vec2_normalize(vec2s v) {
|
||||||
|
glm_vec2_normalize(v.raw);
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief rotate vec2 around axis by angle using Rodrigues' rotation formula
|
||||||
|
*
|
||||||
|
* @param[in] v vector
|
||||||
|
* @param[in] axis axis vector (must be unit vector)
|
||||||
|
* @param[in] angle angle by radians
|
||||||
|
* @returns rotated vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
vec2s
|
||||||
|
glms_vec2_rotate(vec2s v, float angle, vec2s axis) {
|
||||||
|
glm_vec2_rotate(v.raw, angle, axis.raw);
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief distance between two vectors
|
||||||
|
*
|
||||||
|
* @param[in] a vector1
|
||||||
|
* @param[in] b vector2
|
||||||
|
* @return distance
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glms_vec2_distance(vec2s a, vec2s b) {
|
||||||
|
return glm_vec2_distance(a.raw, b.raw);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief squared distance between two vectors
|
||||||
|
*
|
||||||
|
* @param[in] a vector1
|
||||||
|
* @param[in] b vector2
|
||||||
|
* @return squared distance (distance * distance)
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glms_vec2_distance2(vec2s a, vec2s b) {
|
||||||
|
return glm_vec2_distance2(a.raw, b.raw);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief max values of vectors
|
||||||
|
*
|
||||||
|
* @param[in] a vector1
|
||||||
|
* @param[in] b vector2
|
||||||
|
* @returns destination
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
vec2s
|
||||||
|
glms_vec2_maxv(vec2s a, vec2s b) {
|
||||||
|
vec2s r;
|
||||||
|
glm_vec2_maxv(a.raw, b.raw, r.raw);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief min values of vectors
|
||||||
|
*
|
||||||
|
* @param[in] a vector1
|
||||||
|
* @param[in] b vector2
|
||||||
|
* @returns destination
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
vec2s
|
||||||
|
glms_vec2_minv(vec2s a, vec2s b) {
|
||||||
|
vec2s r;
|
||||||
|
glm_vec2_minv(a.raw, b.raw, r.raw);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief clamp vector's individual members between min and max values
|
||||||
|
*
|
||||||
|
* @param[in] v vector
|
||||||
|
* @param[in] minVal minimum value
|
||||||
|
* @param[in] maxVal maximum value
|
||||||
|
* @returns clamped vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
vec2s
|
||||||
|
glms_vec2_clamp(vec2s v, float minVal, float maxVal) {
|
||||||
|
glm_vec2_clamp(v.raw, minVal, maxVal);
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief linear interpolation between two vectors
|
||||||
|
*
|
||||||
|
* formula: from + s * (to - from)
|
||||||
|
*
|
||||||
|
* @param[in] from from value
|
||||||
|
* @param[in] to to value
|
||||||
|
* @param[in] t interpolant (amount)
|
||||||
|
* @returns destination
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
vec2s
|
||||||
|
glms_vec2_lerp(vec2s from, vec2s to, float t) {
|
||||||
|
vec2s r;
|
||||||
|
glm_vec2_lerp(from.raw, to.raw, t, r.raw);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* cglms_vec2s_h */
|
||||||
@@ -19,8 +19,8 @@
|
|||||||
CGLM_INLINE vec3s glms_vec3(vec4s v4);
|
CGLM_INLINE vec3s glms_vec3(vec4s v4);
|
||||||
CGLM_INLINE void glms_vec3_pack(vec3s dst[], vec3 src[], size_t len);
|
CGLM_INLINE void glms_vec3_pack(vec3s dst[], vec3 src[], size_t len);
|
||||||
CGLM_INLINE void glms_vec3_unpack(vec3 dst[], vec3s src[], size_t len);
|
CGLM_INLINE void glms_vec3_unpack(vec3 dst[], vec3s src[], size_t len);
|
||||||
CGLM_INLINE vec3s glms_vec3_zero();
|
CGLM_INLINE vec3s glms_vec3_zero(void);
|
||||||
CGLM_INLINE vec3s glms_vec3_one();
|
CGLM_INLINE vec3s glms_vec3_one(void);
|
||||||
CGLM_INLINE float glms_vec3_dot(vec3s a, vec3s b);
|
CGLM_INLINE float glms_vec3_dot(vec3s a, vec3s b);
|
||||||
CGLM_INLINE float glms_vec3_norm2(vec3s v);
|
CGLM_INLINE float glms_vec3_norm2(vec3s v);
|
||||||
CGLM_INLINE float glms_vec3_norm(vec3s v);
|
CGLM_INLINE float glms_vec3_norm(vec3s v);
|
||||||
@@ -86,15 +86,15 @@
|
|||||||
#include "../vec3.h"
|
#include "../vec3.h"
|
||||||
#include "vec3-ext.h"
|
#include "vec3-ext.h"
|
||||||
|
|
||||||
#define GLMS_VEC3_ONE_INIT {1.0f, 1.0f, 1.0f}
|
#define GLMS_VEC3_ONE_INIT {GLM_VEC3_ONE_INIT}
|
||||||
#define GLMS_VEC3_ZERO_INIT {0.0f, 0.0f, 0.0f}
|
#define GLMS_VEC3_ZERO_INIT {GLM_VEC3_ZERO_INIT}
|
||||||
|
|
||||||
#define GLMS_VEC3_ONE ((vec3s)GLMS_VEC3_ONE_INIT)
|
#define GLMS_VEC3_ONE ((vec3s)GLMS_VEC3_ONE_INIT)
|
||||||
#define GLMS_VEC3_ZERO ((vec3s)GLMS_VEC3_ZERO_INIT)
|
#define GLMS_VEC3_ZERO ((vec3s)GLMS_VEC3_ZERO_INIT)
|
||||||
|
|
||||||
#define GLMS_YUP ((vec3s){0.0f, 1.0f, 0.0f})
|
#define GLMS_YUP ((vec3s){{0.0f, 1.0f, 0.0f}})
|
||||||
#define GLMS_ZUP ((vec3s){0.0f, 0.0f, 1.0f})
|
#define GLMS_ZUP ((vec3s){{0.0f, 0.0f, 1.0f}})
|
||||||
#define GLMS_XUP ((vec3s){1.0f, 0.0f, 0.0f})
|
#define GLMS_XUP ((vec3s){{1.0f, 0.0f, 0.0f}})
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief init vec3 using vec4
|
* @brief init vec3 using vec4
|
||||||
@@ -151,7 +151,7 @@ glms_vec3_unpack(vec3 dst[], vec3s src[], size_t len) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
vec3s
|
vec3s
|
||||||
glms_vec3_zero() {
|
glms_vec3_zero(void) {
|
||||||
vec3s r;
|
vec3s r;
|
||||||
glm_vec3_zero(r.raw);
|
glm_vec3_zero(r.raw);
|
||||||
return r;
|
return r;
|
||||||
@@ -164,7 +164,7 @@ glms_vec3_zero() {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
vec3s
|
vec3s
|
||||||
glms_vec3_one() {
|
glms_vec3_one(void) {
|
||||||
vec3s r;
|
vec3s r;
|
||||||
glm_vec3_one(r.raw);
|
glm_vec3_one(r.raw);
|
||||||
return r;
|
return r;
|
||||||
|
|||||||
@@ -7,12 +7,12 @@
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
Macros:
|
Macros:
|
||||||
GLM_VEC4_ONE_INIT
|
GLMS_VEC4_ONE_INIT
|
||||||
GLM_VEC4_BLACK_INIT
|
GLMS_VEC4_BLACK_INIT
|
||||||
GLM_VEC4_ZERO_INIT
|
GLMS_VEC4_ZERO_INIT
|
||||||
GLM_VEC4_ONE
|
GLMS_VEC4_ONE
|
||||||
GLM_VEC4_BLACK
|
GLMS_VEC4_BLACK
|
||||||
GLM_VEC4_ZERO
|
GLMS_VEC4_ZERO
|
||||||
|
|
||||||
Functions:
|
Functions:
|
||||||
CGLM_INLINE vec4s glms_vec4(vec3s v3, float last);
|
CGLM_INLINE vec4s glms_vec4(vec3s v3, float last);
|
||||||
@@ -72,9 +72,9 @@
|
|||||||
#include "../vec4.h"
|
#include "../vec4.h"
|
||||||
#include "vec4-ext.h"
|
#include "vec4-ext.h"
|
||||||
|
|
||||||
#define GLMS_VEC4_ONE_INIT {1.0f, 1.0f, 1.0f, 1.0f}
|
#define GLMS_VEC4_ONE_INIT {GLM_VEC4_ONE_INIT}
|
||||||
#define GLMS_VEC4_BLACK_INIT {0.0f, 0.0f, 0.0f, 1.0f}
|
#define GLMS_VEC4_BLACK_INIT {GLM_VEC4_BLACK_INIT}
|
||||||
#define GLMS_VEC4_ZERO_INIT {0.0f, 0.0f, 0.0f, 0.0f}
|
#define GLMS_VEC4_ZERO_INIT {GLM_VEC4_ZERO_INIT}
|
||||||
|
|
||||||
#define GLMS_VEC4_ONE ((vec4s)GLM_VEC4_ONE_INIT)
|
#define GLMS_VEC4_ONE ((vec4s)GLM_VEC4_ONE_INIT)
|
||||||
#define GLMS_VEC4_BLACK ((vec4s)GLM_VEC4_BLACK_INIT)
|
#define GLMS_VEC4_BLACK ((vec4s)GLM_VEC4_BLACK_INIT)
|
||||||
@@ -180,7 +180,7 @@ glms_vec4_unpack(vec4 dst[], vec4s src[], size_t len) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
vec4s
|
vec4s
|
||||||
glms_vec4_zero() {
|
glms_vec4_zero(void) {
|
||||||
vec4s r;
|
vec4s r;
|
||||||
glm_vec4_zero(r.raw);
|
glm_vec4_zero(r.raw);
|
||||||
return r;
|
return r;
|
||||||
@@ -193,7 +193,7 @@ glms_vec4_zero() {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
vec4s
|
vec4s
|
||||||
glms_vec4_one() {
|
glms_vec4_one(void) {
|
||||||
vec4s r;
|
vec4s r;
|
||||||
glm_vec4_one(r.raw);
|
glm_vec4_one(r.raw);
|
||||||
return r;
|
return r;
|
||||||
|
|||||||
@@ -10,30 +10,71 @@
|
|||||||
|
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Anonymous structs are available since C11, but we'd like to be compatible
|
||||||
|
* with C99 and C89 too. So let's figure out if we should be using them or not.
|
||||||
|
* It's simply a convenience feature, you can e.g. build the library with
|
||||||
|
* anonymous structs and your application without them and they'll still be
|
||||||
|
* compatible, cglm doesn't use the anonymous structs internally.
|
||||||
|
*/
|
||||||
|
#ifndef CGLM_USE_ANONYMOUS_STRUCT
|
||||||
|
/* If the user doesn't explicitly specify if they want anonymous structs or
|
||||||
|
* not, then we'll try to intuit an appropriate choice. */
|
||||||
|
# if defined(CGLM_NO_ANONYMOUS_STRUCT)
|
||||||
|
/* The user has defined CGLM_NO_ANONYMOUS_STRUCT. This used to be the
|
||||||
|
* only #define governing the use of anonymous structs, so for backward
|
||||||
|
* compatibility, we still honor that choice and disable them. */
|
||||||
|
# define CGLM_USE_ANONYMOUS_STRUCT 0
|
||||||
|
# elif __STDC_VERSION__ >= 20112L || defined(_MSVC_VER)
|
||||||
|
/* We're compiling for C11 or this is the MSVC compiler. In either
|
||||||
|
* case, anonymous structs are available, so use them. */
|
||||||
|
# define CGLM_USE_ANONYMOUS_STRUCT 1
|
||||||
|
# elif defined(_MSC_VER) && (_MSC_VER >= 1900) /* Visual Studio 2015 */
|
||||||
|
/* We can support anonymous structs
|
||||||
|
* since Visual Studio 2015 or 2017 (1910) maybe? */
|
||||||
|
# define CGLM_USE_ANONYMOUS_STRUCT 1
|
||||||
|
# else
|
||||||
|
/* Otherwise, we're presumably building for C99 or C89 and can't rely
|
||||||
|
* on anonymous structs being available. Turn them off. */
|
||||||
|
# define CGLM_USE_ANONYMOUS_STRUCT 0
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef union vec2s {
|
||||||
|
vec2 raw;
|
||||||
|
#if CGLM_USE_ANONYMOUS_STRUCT
|
||||||
|
struct {
|
||||||
|
float x;
|
||||||
|
float y;
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
} vec2s;
|
||||||
|
|
||||||
typedef union vec3s {
|
typedef union vec3s {
|
||||||
#ifndef CGLM_NO_ANONYMOUS_STRUCT
|
vec3 raw;
|
||||||
|
#if CGLM_USE_ANONYMOUS_STRUCT
|
||||||
struct {
|
struct {
|
||||||
float x;
|
float x;
|
||||||
float y;
|
float y;
|
||||||
float z;
|
float z;
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
vec3 raw;
|
|
||||||
} vec3s;
|
} vec3s;
|
||||||
|
|
||||||
typedef union ivec3s {
|
typedef union ivec3s {
|
||||||
#ifndef CGLM_NO_ANONYMOUS_STRUCT
|
ivec3 raw;
|
||||||
|
#if CGLM_USE_ANONYMOUS_STRUCT
|
||||||
struct {
|
struct {
|
||||||
int x;
|
int x;
|
||||||
int y;
|
int y;
|
||||||
int z;
|
int z;
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
ivec3 raw;
|
|
||||||
} ivec3s;
|
} ivec3s;
|
||||||
|
|
||||||
typedef union CGLM_ALIGN_IF(16) vec4s {
|
typedef union CGLM_ALIGN_IF(16) vec4s {
|
||||||
#ifndef CGLM_NO_ANONYMOUS_STRUCT
|
vec4 raw;
|
||||||
|
#if CGLM_USE_ANONYMOUS_STRUCT
|
||||||
struct {
|
struct {
|
||||||
float x;
|
float x;
|
||||||
float y;
|
float y;
|
||||||
@@ -41,11 +82,11 @@ typedef union CGLM_ALIGN_IF(16) vec4s {
|
|||||||
float w;
|
float w;
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
vec4 raw;
|
|
||||||
} vec4s;
|
} vec4s;
|
||||||
|
|
||||||
typedef union CGLM_ALIGN_IF(16) versors {
|
typedef union CGLM_ALIGN_IF(16) versors {
|
||||||
#ifndef CGLM_NO_ANONYMOUS_STRUCT
|
vec4 raw;
|
||||||
|
#if CGLM_USE_ANONYMOUS_STRUCT
|
||||||
struct {
|
struct {
|
||||||
float x;
|
float x;
|
||||||
float y;
|
float y;
|
||||||
@@ -58,23 +99,35 @@ typedef union CGLM_ALIGN_IF(16) versors {
|
|||||||
float real;
|
float real;
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
vec4 raw;
|
|
||||||
} versors;
|
} versors;
|
||||||
|
|
||||||
|
typedef union mat2s {
|
||||||
|
mat2 raw;
|
||||||
|
vec2s col[2];
|
||||||
|
#if CGLM_USE_ANONYMOUS_STRUCT
|
||||||
|
struct {
|
||||||
|
float m00, m01;
|
||||||
|
float m10, m11;
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
} mat2s;
|
||||||
|
|
||||||
typedef union mat3s {
|
typedef union mat3s {
|
||||||
#ifndef CGLM_NO_ANONYMOUS_STRUCT
|
mat3 raw;
|
||||||
|
vec3s col[3];
|
||||||
|
#if CGLM_USE_ANONYMOUS_STRUCT
|
||||||
struct {
|
struct {
|
||||||
float m00, m01, m02;
|
float m00, m01, m02;
|
||||||
float m10, m11, m12;
|
float m10, m11, m12;
|
||||||
float m20, m21, m22;
|
float m20, m21, m22;
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
vec3s col[3];
|
|
||||||
mat3 raw;
|
|
||||||
} mat3s;
|
} mat3s;
|
||||||
|
|
||||||
typedef union CGLM_ALIGN_MAT mat4s {
|
typedef union CGLM_ALIGN_MAT mat4s {
|
||||||
#ifndef CGLM_NO_ANONYMOUS_STRUCT
|
mat4 raw;
|
||||||
|
vec4s col[4];
|
||||||
|
#if CGLM_USE_ANONYMOUS_STRUCT
|
||||||
struct {
|
struct {
|
||||||
float m00, m01, m02, m03;
|
float m00, m01, m02, m03;
|
||||||
float m10, m11, m12, m13;
|
float m10, m11, m12, m13;
|
||||||
@@ -82,8 +135,6 @@ typedef union CGLM_ALIGN_MAT mat4s {
|
|||||||
float m30, m31, m32, m33;
|
float m30, m31, m32, m33;
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
vec4s col[4];
|
|
||||||
mat4 raw;
|
|
||||||
} mat4s;
|
} mat4s;
|
||||||
|
|
||||||
#endif /* cglm_types_struct_h */
|
#endif /* cglm_types_struct_h */
|
||||||
|
|||||||
@@ -36,9 +36,15 @@ typedef float vec2[2];
|
|||||||
typedef float vec3[3];
|
typedef float vec3[3];
|
||||||
typedef int ivec3[3];
|
typedef int ivec3[3];
|
||||||
typedef CGLM_ALIGN_IF(16) float vec4[4];
|
typedef CGLM_ALIGN_IF(16) float vec4[4];
|
||||||
typedef vec4 versor;
|
typedef vec4 versor; /* |x, y, z, w| -> w is the last */
|
||||||
typedef vec3 mat3[3];
|
typedef vec3 mat3[3];
|
||||||
typedef CGLM_ALIGN_MAT vec4 mat4[4];
|
typedef CGLM_ALIGN_IF(16) vec2 mat2[2];
|
||||||
|
typedef CGLM_ALIGN_MAT vec4 mat4[4];
|
||||||
|
|
||||||
|
/*
|
||||||
|
Important: cglm stores quaternion as [x, y, z, w] in memory since v0.4.0
|
||||||
|
it was [w, x, y, z] before v0.4.0 ( v0.3.5 and earlier ). w is real part.
|
||||||
|
*/
|
||||||
|
|
||||||
#define GLM_E 2.71828182845904523536028747135266250 /* e */
|
#define GLM_E 2.71828182845904523536028747135266250 /* e */
|
||||||
#define GLM_LOG2E 1.44269504088896340735992468100189214 /* log2(e) */
|
#define GLM_LOG2E 1.44269504088896340735992468100189214 /* log2(e) */
|
||||||
|
|||||||
189
include/cglm/vec2-ext.h
Normal file
189
include/cglm/vec2-ext.h
Normal file
@@ -0,0 +1,189 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Functions:
|
||||||
|
CGLM_INLINE void glm_vec2_fill(vec2 v, float val)
|
||||||
|
CGLM_INLINE bool glm_vec2_eq(vec2 v, float val);
|
||||||
|
CGLM_INLINE bool glm_vec2_eq_eps(vec2 v, float val);
|
||||||
|
CGLM_INLINE bool glm_vec2_eq_all(vec2 v);
|
||||||
|
CGLM_INLINE bool glm_vec2_eqv(vec2 a, vec2 b);
|
||||||
|
CGLM_INLINE bool glm_vec2_eqv_eps(vec2 a, vec2 b);
|
||||||
|
CGLM_INLINE float glm_vec2_max(vec2 v);
|
||||||
|
CGLM_INLINE float glm_vec2_min(vec2 v);
|
||||||
|
CGLM_INLINE bool glm_vec2_isnan(vec2 v);
|
||||||
|
CGLM_INLINE bool glm_vec2_isinf(vec2 v);
|
||||||
|
CGLM_INLINE bool glm_vec2_isvalid(vec2 v);
|
||||||
|
CGLM_INLINE void glm_vec2_sign(vec2 v, vec2 dest);
|
||||||
|
CGLM_INLINE void glm_vec2_sqrt(vec2 v, vec2 dest);
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglm_vec2_ext_h
|
||||||
|
#define cglm_vec2_ext_h
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "util.h"
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief fill a vector with specified value
|
||||||
|
*
|
||||||
|
* @param[out] v dest
|
||||||
|
* @param[in] val value
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec2_fill(vec2 v, float val) {
|
||||||
|
v[0] = v[1] = val;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief check if vector is equal to value (without epsilon)
|
||||||
|
*
|
||||||
|
* @param[in] v vector
|
||||||
|
* @param[in] val value
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
bool
|
||||||
|
glm_vec2_eq(vec2 v, float val) {
|
||||||
|
return v[0] == val && v[0] == v[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief check if vector is equal to value (with epsilon)
|
||||||
|
*
|
||||||
|
* @param[in] v vector
|
||||||
|
* @param[in] val value
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
bool
|
||||||
|
glm_vec2_eq_eps(vec2 v, float val) {
|
||||||
|
return fabsf(v[0] - val) <= FLT_EPSILON
|
||||||
|
&& fabsf(v[1] - val) <= FLT_EPSILON;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief check if vectors members are equal (without epsilon)
|
||||||
|
*
|
||||||
|
* @param[in] v vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
bool
|
||||||
|
glm_vec2_eq_all(vec2 v) {
|
||||||
|
return v[0] == v[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief check if vector is equal to another (without epsilon)
|
||||||
|
*
|
||||||
|
* @param[in] a vector
|
||||||
|
* @param[in] b vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
bool
|
||||||
|
glm_vec2_eqv(vec2 a, vec2 b) {
|
||||||
|
return a[0] == b[0] && a[1] == b[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief check if vector is equal to another (with epsilon)
|
||||||
|
*
|
||||||
|
* @param[in] a vector
|
||||||
|
* @param[in] b vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
bool
|
||||||
|
glm_vec2_eqv_eps(vec2 a, vec2 b) {
|
||||||
|
return fabsf(a[0] - b[0]) <= FLT_EPSILON
|
||||||
|
&& fabsf(a[1] - b[1]) <= FLT_EPSILON;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief max value of vector
|
||||||
|
*
|
||||||
|
* @param[in] v vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_vec2_max(vec2 v) {
|
||||||
|
return glm_max(v[0], v[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief min value of vector
|
||||||
|
*
|
||||||
|
* @param[in] v vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_vec2_min(vec2 v) {
|
||||||
|
return glm_min(v[0], v[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief check if all items are NaN (not a number)
|
||||||
|
* you should only use this in DEBUG mode or very critical asserts
|
||||||
|
*
|
||||||
|
* @param[in] v vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
bool
|
||||||
|
glm_vec2_isnan(vec2 v) {
|
||||||
|
return isnan(v[0]) || isnan(v[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief check if all items are INFINITY
|
||||||
|
* you should only use this in DEBUG mode or very critical asserts
|
||||||
|
*
|
||||||
|
* @param[in] v vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
bool
|
||||||
|
glm_vec2_isinf(vec2 v) {
|
||||||
|
return isinf(v[0]) || isinf(v[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief check if all items are valid number
|
||||||
|
* you should only use this in DEBUG mode or very critical asserts
|
||||||
|
*
|
||||||
|
* @param[in] v vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
bool
|
||||||
|
glm_vec2_isvalid(vec2 v) {
|
||||||
|
return !glm_vec2_isnan(v) && !glm_vec2_isinf(v);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief get sign of 32 bit float as +1, -1, 0
|
||||||
|
*
|
||||||
|
* Important: It returns 0 for zero/NaN input
|
||||||
|
*
|
||||||
|
* @param v vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec2_sign(vec2 v, vec2 dest) {
|
||||||
|
dest[0] = glm_signf(v[0]);
|
||||||
|
dest[1] = glm_signf(v[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief square root of each vector item
|
||||||
|
*
|
||||||
|
* @param[in] v vector
|
||||||
|
* @param[out] dest destination vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec2_sqrt(vec2 v, vec2 dest) {
|
||||||
|
dest[0] = sqrtf(v[0]);
|
||||||
|
dest[1] = sqrtf(v[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* cglm_vec2_ext_h */
|
||||||
585
include/cglm/vec2.h
Normal file
585
include/cglm/vec2.h
Normal file
@@ -0,0 +1,585 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Macros:
|
||||||
|
GLM_VEC2_ONE_INIT
|
||||||
|
GLM_VEC2_ZERO_INIT
|
||||||
|
GLM_VEC2_ONE
|
||||||
|
GLM_VEC2_ZERO
|
||||||
|
|
||||||
|
Functions:
|
||||||
|
CGLM_INLINE void glm_vec2(float * __restrict v, vec2 dest)
|
||||||
|
CGLM_INLINE void glm_vec2_copy(vec2 a, vec2 dest)
|
||||||
|
CGLM_INLINE void glm_vec2_zero(vec2 v)
|
||||||
|
CGLM_INLINE void glm_vec2_one(vec2 v)
|
||||||
|
CGLM_INLINE float glm_vec2_dot(vec2 a, vec2 b)
|
||||||
|
CGLM_INLINE float glm_vec2_cross(vec2 a, vec2 b)
|
||||||
|
CGLM_INLINE float glm_vec2_norm2(vec2 v)
|
||||||
|
CGLM_INLINE float glm_vec2_norm(vec2 vec)
|
||||||
|
CGLM_INLINE void glm_vec2_add(vec2 a, vec2 b, vec2 dest)
|
||||||
|
CGLM_INLINE void glm_vec2_adds(vec2 v, float s, vec2 dest)
|
||||||
|
CGLM_INLINE void glm_vec2_sub(vec2 a, vec2 b, vec2 dest)
|
||||||
|
CGLM_INLINE void glm_vec2_subs(vec2 v, float s, vec2 dest)
|
||||||
|
CGLM_INLINE void glm_vec2_mul(vec2 a, vec2 b, vec2 d)
|
||||||
|
CGLM_INLINE void glm_vec2_scale(vec2 v, float s, vec2 dest)
|
||||||
|
CGLM_INLINE void glm_vec2_scale_as(vec2 v, float s, vec2 dest)
|
||||||
|
CGLM_INLINE void glm_vec2_div(vec2 a, vec2 b, vec2 dest)
|
||||||
|
CGLM_INLINE void glm_vec2_divs(vec2 v, float s, vec2 dest)
|
||||||
|
CGLM_INLINE void glm_vec2_addadd(vec2 a, vec2 b, vec2 dest)
|
||||||
|
CGLM_INLINE void glm_vec2_subadd(vec2 a, vec2 b, vec2 dest)
|
||||||
|
CGLM_INLINE void glm_vec2_muladd(vec2 a, vec2 b, vec2 dest)
|
||||||
|
CGLM_INLINE void glm_vec2_muladds(vec2 a, float s, vec2 dest)
|
||||||
|
CGLM_INLINE void glm_vec2_maxadd(vec2 a, vec2 b, vec2 dest)
|
||||||
|
CGLM_INLINE void glm_vec2_minadd(vec2 a, vec2 b, vec2 dest)
|
||||||
|
CGLM_INLINE void glm_vec2_negate_to(vec2 v, vec2 dest)
|
||||||
|
CGLM_INLINE void glm_vec2_negate(vec2 v)
|
||||||
|
CGLM_INLINE void glm_vec2_normalize(vec2 v)
|
||||||
|
CGLM_INLINE void glm_vec2_normalize_to(vec2 vec, vec2 dest)
|
||||||
|
CGLM_INLINE void glm_vec2_rotate(vec2 v, float angle, vec2 dest)
|
||||||
|
CGLM_INLINE float glm_vec2_distance2(vec2 a, vec2 b)
|
||||||
|
CGLM_INLINE float glm_vec2_distance(vec2 a, vec2 b)
|
||||||
|
CGLM_INLINE void glm_vec2_maxv(vec2 v1, vec2 v2, vec2 dest)
|
||||||
|
CGLM_INLINE void glm_vec2_minv(vec2 v1, vec2 v2, vec2 dest)
|
||||||
|
CGLM_INLINE void glm_vec2_clamp(vec2 v, float minVal, float maxVal)
|
||||||
|
CGLM_INLINE void glm_vec2_lerp(vec2 from, vec2 to, float t, vec2 dest)
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglm_vec2_h
|
||||||
|
#define cglm_vec2_h
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "util.h"
|
||||||
|
#include "vec2-ext.h"
|
||||||
|
|
||||||
|
#define GLM_VEC2_ONE_INIT {1.0f, 1.0f}
|
||||||
|
#define GLM_VEC2_ZERO_INIT {0.0f, 0.0f}
|
||||||
|
|
||||||
|
#define GLM_VEC2_ONE ((vec2)GLM_VEC2_ONE_INIT)
|
||||||
|
#define GLM_VEC2_ZERO ((vec2)GLM_VEC2_ZERO_INIT)
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief init vec2 using another vector
|
||||||
|
*
|
||||||
|
* @param[in] v a vector
|
||||||
|
* @param[out] dest destination
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec2(float * __restrict v, vec2 dest) {
|
||||||
|
dest[0] = v[0];
|
||||||
|
dest[1] = v[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief copy all members of [a] to [dest]
|
||||||
|
*
|
||||||
|
* @param[in] a source
|
||||||
|
* @param[out] dest destination
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec2_copy(vec2 a, vec2 dest) {
|
||||||
|
dest[0] = a[0];
|
||||||
|
dest[1] = a[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief make vector zero
|
||||||
|
*
|
||||||
|
* @param[in, out] v vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec2_zero(vec2 v) {
|
||||||
|
v[0] = v[1] = 0.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief make vector one
|
||||||
|
*
|
||||||
|
* @param[in, out] v vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec2_one(vec2 v) {
|
||||||
|
v[0] = v[1] = 1.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief vec2 dot product
|
||||||
|
*
|
||||||
|
* @param[in] a vector1
|
||||||
|
* @param[in] b vector2
|
||||||
|
*
|
||||||
|
* @return dot product
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_vec2_dot(vec2 a, vec2 b) {
|
||||||
|
return a[0] * b[0] + a[1] * b[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief vec2 cross product
|
||||||
|
*
|
||||||
|
* REF: http://allenchou.net/2013/07/cross-product-of-2d-vectors/
|
||||||
|
*
|
||||||
|
* @param[in] a vector1
|
||||||
|
* @param[in] b vector2
|
||||||
|
*
|
||||||
|
* @return Z component of cross product
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_vec2_cross(vec2 a, vec2 b) {
|
||||||
|
/* just calculate the z-component */
|
||||||
|
return a[0] * b[1] - a[1] * b[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief norm * norm (magnitude) of vec
|
||||||
|
*
|
||||||
|
* we can use this func instead of calling norm * norm, because it would call
|
||||||
|
* sqrtf fuction twice but with this func we can avoid func call, maybe this is
|
||||||
|
* not good name for this func
|
||||||
|
*
|
||||||
|
* @param[in] v vector
|
||||||
|
*
|
||||||
|
* @return norm * norm
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_vec2_norm2(vec2 v) {
|
||||||
|
return glm_vec2_dot(v, v);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief norm (magnitude) of vec2
|
||||||
|
*
|
||||||
|
* @param[in] vec vector
|
||||||
|
*
|
||||||
|
* @return norm
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_vec2_norm(vec2 vec) {
|
||||||
|
return sqrtf(glm_vec2_norm2(vec));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief add a vector to b vector store result in dest
|
||||||
|
*
|
||||||
|
* @param[in] a vector1
|
||||||
|
* @param[in] b vector2
|
||||||
|
* @param[out] dest destination vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec2_add(vec2 a, vec2 b, vec2 dest) {
|
||||||
|
dest[0] = a[0] + b[0];
|
||||||
|
dest[1] = a[1] + b[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief add scalar to v vector store result in dest (d = v + s)
|
||||||
|
*
|
||||||
|
* @param[in] v vector
|
||||||
|
* @param[in] s scalar
|
||||||
|
* @param[out] dest destination vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec2_adds(vec2 v, float s, vec2 dest) {
|
||||||
|
dest[0] = v[0] + s;
|
||||||
|
dest[1] = v[1] + s;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief subtract b vector from a vector store result in dest
|
||||||
|
*
|
||||||
|
* @param[in] a vector1
|
||||||
|
* @param[in] b vector2
|
||||||
|
* @param[out] dest destination vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec2_sub(vec2 a, vec2 b, vec2 dest) {
|
||||||
|
dest[0] = a[0] - b[0];
|
||||||
|
dest[1] = a[1] - b[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief subtract scalar from v vector store result in dest (d = v - s)
|
||||||
|
*
|
||||||
|
* @param[in] v vector
|
||||||
|
* @param[in] s scalar
|
||||||
|
* @param[out] dest destination vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec2_subs(vec2 v, float s, vec2 dest) {
|
||||||
|
dest[0] = v[0] - s;
|
||||||
|
dest[1] = v[1] - s;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief multiply two vector (component-wise multiplication)
|
||||||
|
*
|
||||||
|
* @param a v1
|
||||||
|
* @param b v2
|
||||||
|
* @param dest v3 = (a[0] * b[0], a[1] * b[1])
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec2_mul(vec2 a, vec2 b, vec2 dest) {
|
||||||
|
dest[0] = a[0] * b[0];
|
||||||
|
dest[1] = a[1] * b[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief multiply/scale vector with scalar: result = v * s
|
||||||
|
*
|
||||||
|
* @param[in] v vector
|
||||||
|
* @param[in] s scalar
|
||||||
|
* @param[out] dest destination vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec2_scale(vec2 v, float s, vec2 dest) {
|
||||||
|
dest[0] = v[0] * s;
|
||||||
|
dest[1] = v[1] * s;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief scale as vector specified: result = unit(v) * s
|
||||||
|
*
|
||||||
|
* @param[in] v vector
|
||||||
|
* @param[in] s scalar
|
||||||
|
* @param[out] dest destination vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec2_scale_as(vec2 v, float s, vec2 dest) {
|
||||||
|
float norm;
|
||||||
|
norm = glm_vec2_norm(v);
|
||||||
|
|
||||||
|
if (norm == 0.0f) {
|
||||||
|
glm_vec2_zero(dest);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
glm_vec2_scale(v, s / norm, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief div vector with another component-wise division: d = a / b
|
||||||
|
*
|
||||||
|
* @param[in] a vector 1
|
||||||
|
* @param[in] b vector 2
|
||||||
|
* @param[out] dest result = (a[0]/b[0], a[1]/b[1])
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec2_div(vec2 a, vec2 b, vec2 dest) {
|
||||||
|
dest[0] = a[0] / b[0];
|
||||||
|
dest[1] = a[1] / b[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief div vector with scalar: d = v / s
|
||||||
|
*
|
||||||
|
* @param[in] v vector
|
||||||
|
* @param[in] s scalar
|
||||||
|
* @param[out] dest result = (a[0]/s, a[1]/s)
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec2_divs(vec2 v, float s, vec2 dest) {
|
||||||
|
dest[0] = v[0] / s;
|
||||||
|
dest[1] = v[1] / s;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief add two vectors and add result to sum
|
||||||
|
*
|
||||||
|
* it applies += operator so dest must be initialized
|
||||||
|
*
|
||||||
|
* @param[in] a vector 1
|
||||||
|
* @param[in] b vector 2
|
||||||
|
* @param[out] dest dest += (a + b)
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec2_addadd(vec2 a, vec2 b, vec2 dest) {
|
||||||
|
dest[0] += a[0] + b[0];
|
||||||
|
dest[1] += a[1] + b[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief sub two vectors and add result to dest
|
||||||
|
*
|
||||||
|
* it applies += operator so dest must be initialized
|
||||||
|
*
|
||||||
|
* @param[in] a vector 1
|
||||||
|
* @param[in] b vector 2
|
||||||
|
* @param[out] dest dest += (a + b)
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec2_subadd(vec2 a, vec2 b, vec2 dest) {
|
||||||
|
dest[0] += a[0] - b[0];
|
||||||
|
dest[1] += a[1] - b[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief mul two vectors and add result to dest
|
||||||
|
*
|
||||||
|
* it applies += operator so dest must be initialized
|
||||||
|
*
|
||||||
|
* @param[in] a vector 1
|
||||||
|
* @param[in] b vector 2
|
||||||
|
* @param[out] dest dest += (a * b)
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec2_muladd(vec2 a, vec2 b, vec2 dest) {
|
||||||
|
dest[0] += a[0] * b[0];
|
||||||
|
dest[1] += a[1] * b[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief mul vector with scalar and add result to sum
|
||||||
|
*
|
||||||
|
* it applies += operator so dest must be initialized
|
||||||
|
*
|
||||||
|
* @param[in] a vector
|
||||||
|
* @param[in] s scalar
|
||||||
|
* @param[out] dest dest += (a * b)
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec2_muladds(vec2 a, float s, vec2 dest) {
|
||||||
|
dest[0] += a[0] * s;
|
||||||
|
dest[1] += a[1] * s;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief add max of two vector to result/dest
|
||||||
|
*
|
||||||
|
* it applies += operator so dest must be initialized
|
||||||
|
*
|
||||||
|
* @param[in] a vector 1
|
||||||
|
* @param[in] b vector 2
|
||||||
|
* @param[out] dest dest += max(a, b)
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec2_maxadd(vec2 a, vec2 b, vec2 dest) {
|
||||||
|
dest[0] += glm_max(a[0], b[0]);
|
||||||
|
dest[1] += glm_max(a[1], b[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief add min of two vector to result/dest
|
||||||
|
*
|
||||||
|
* it applies += operator so dest must be initialized
|
||||||
|
*
|
||||||
|
* @param[in] a vector 1
|
||||||
|
* @param[in] b vector 2
|
||||||
|
* @param[out] dest dest += min(a, b)
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec2_minadd(vec2 a, vec2 b, vec2 dest) {
|
||||||
|
dest[0] += glm_min(a[0], b[0]);
|
||||||
|
dest[1] += glm_min(a[1], b[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief negate vector components and store result in dest
|
||||||
|
*
|
||||||
|
* @param[in] v vector
|
||||||
|
* @param[out] dest result vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec2_negate_to(vec2 v, vec2 dest) {
|
||||||
|
dest[0] = -v[0];
|
||||||
|
dest[1] = -v[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief negate vector components
|
||||||
|
*
|
||||||
|
* @param[in, out] v vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec2_negate(vec2 v) {
|
||||||
|
glm_vec2_negate_to(v, v);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief normalize vector and store result in same vec
|
||||||
|
*
|
||||||
|
* @param[in, out] v vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec2_normalize(vec2 v) {
|
||||||
|
float norm;
|
||||||
|
|
||||||
|
norm = glm_vec2_norm(v);
|
||||||
|
|
||||||
|
if (norm == 0.0f) {
|
||||||
|
v[0] = v[1] = 0.0f;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
glm_vec2_scale(v, 1.0f / norm, v);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief normalize vector to dest
|
||||||
|
*
|
||||||
|
* @param[in] v source
|
||||||
|
* @param[out] dest destination
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec2_normalize_to(vec2 v, vec2 dest) {
|
||||||
|
float norm;
|
||||||
|
|
||||||
|
norm = glm_vec2_norm(v);
|
||||||
|
|
||||||
|
if (norm == 0.0f) {
|
||||||
|
glm_vec2_zero(dest);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
glm_vec2_scale(v, 1.0f / norm, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief rotate vec2 around origin by angle (CCW: counterclockwise)
|
||||||
|
*
|
||||||
|
* Formula:
|
||||||
|
* 𝑥2 = cos(a)𝑥1 − sin(a)𝑦1
|
||||||
|
* 𝑦2 = sin(a)𝑥1 + cos(a)𝑦1
|
||||||
|
*
|
||||||
|
* @param[in] v vector to rotate
|
||||||
|
* @param[in] angle angle by radians
|
||||||
|
* @param[out] dest destination vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec2_rotate(vec2 v, float angle, vec2 dest) {
|
||||||
|
float c, s, x1, y1;
|
||||||
|
|
||||||
|
c = cosf(angle);
|
||||||
|
s = sinf(angle);
|
||||||
|
|
||||||
|
x1 = v[0];
|
||||||
|
y1 = v[1];
|
||||||
|
|
||||||
|
dest[0] = c * x1 - s * y1;
|
||||||
|
dest[1] = s * x1 + c * y1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief squared distance between two vectors
|
||||||
|
*
|
||||||
|
* @param[in] a vector1
|
||||||
|
* @param[in] b vector2
|
||||||
|
* @return returns squared distance (distance * distance)
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_vec2_distance2(vec2 a, vec2 b) {
|
||||||
|
return glm_pow2(b[0] - a[0]) + glm_pow2(b[1] - a[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief distance between two vectors
|
||||||
|
*
|
||||||
|
* @param[in] a vector1
|
||||||
|
* @param[in] b vector2
|
||||||
|
* @return returns distance
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_vec2_distance(vec2 a, vec2 b) {
|
||||||
|
return sqrtf(glm_vec2_distance2(a, b));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief max values of vectors
|
||||||
|
*
|
||||||
|
* @param[in] a vector1
|
||||||
|
* @param[in] b vector2
|
||||||
|
* @param[out] dest destination
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec2_maxv(vec2 a, vec2 b, vec2 dest) {
|
||||||
|
dest[0] = glm_max(a[0], b[0]);
|
||||||
|
dest[1] = glm_max(a[1], b[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief min values of vectors
|
||||||
|
*
|
||||||
|
* @param[in] a vector1
|
||||||
|
* @param[in] b vector2
|
||||||
|
* @param[out] dest destination
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec2_minv(vec2 a, vec2 b, vec2 dest) {
|
||||||
|
dest[0] = glm_min(a[0], b[0]);
|
||||||
|
dest[1] = glm_min(a[1], b[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief clamp vector's individual members between min and max values
|
||||||
|
*
|
||||||
|
* @param[in, out] v vector
|
||||||
|
* @param[in] minval minimum value
|
||||||
|
* @param[in] maxval maximum value
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec2_clamp(vec2 v, float minval, float maxval) {
|
||||||
|
v[0] = glm_clamp(v[0], minval, maxval);
|
||||||
|
v[1] = glm_clamp(v[1], minval, maxval);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief linear interpolation between two vector
|
||||||
|
*
|
||||||
|
* formula: from + s * (to - from)
|
||||||
|
*
|
||||||
|
* @param[in] from from value
|
||||||
|
* @param[in] to to value
|
||||||
|
* @param[in] t interpolant (amount) clamped between 0 and 1
|
||||||
|
* @param[out] dest destination
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec2_lerp(vec2 from, vec2 to, float t, vec2 dest) {
|
||||||
|
vec2 s, v;
|
||||||
|
|
||||||
|
/* from + s * (to - from) */
|
||||||
|
glm_vec2_fill(s, glm_clamp_zo(t));
|
||||||
|
glm_vec2_sub(to, from, v);
|
||||||
|
glm_vec2_mul(s, v, v);
|
||||||
|
glm_vec2_add(from, v, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* cglm_vec2_h */
|
||||||
@@ -111,9 +111,10 @@
|
|||||||
#define GLM_VEC3_ONE ((vec3)GLM_VEC3_ONE_INIT)
|
#define GLM_VEC3_ONE ((vec3)GLM_VEC3_ONE_INIT)
|
||||||
#define GLM_VEC3_ZERO ((vec3)GLM_VEC3_ZERO_INIT)
|
#define GLM_VEC3_ZERO ((vec3)GLM_VEC3_ZERO_INIT)
|
||||||
|
|
||||||
#define GLM_YUP ((vec3){0.0f, 1.0f, 0.0f})
|
#define GLM_YUP ((vec3){0.0f, 1.0f, 0.0f})
|
||||||
#define GLM_ZUP ((vec3){0.0f, 0.0f, 1.0f})
|
#define GLM_ZUP ((vec3){0.0f, 0.0f, 1.0f})
|
||||||
#define GLM_XUP ((vec3){1.0f, 0.0f, 0.0f})
|
#define GLM_XUP ((vec3){1.0f, 0.0f, 0.0f})
|
||||||
|
#define GLM_FORWARD ((vec3){0.0f, 0.0f, -1.0f})
|
||||||
|
|
||||||
#define GLM_XXX GLM_SHUFFLE3(0, 0, 0)
|
#define GLM_XXX GLM_SHUFFLE3(0, 0, 0)
|
||||||
#define GLM_YYY GLM_SHUFFLE3(1, 1, 1)
|
#define GLM_YYY GLM_SHUFFLE3(1, 1, 1)
|
||||||
@@ -996,6 +997,27 @@ glm_vec3_smoothinterpc(vec3 from, vec3 to, float t, vec3 dest) {
|
|||||||
glm_vec3_smoothinterp(from, to, glm_clamp_zo(t), dest);
|
glm_vec3_smoothinterp(from, to, glm_clamp_zo(t), dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief swizzle vector components
|
||||||
|
*
|
||||||
|
* you can use existin masks e.g. GLM_XXX, GLM_ZYX
|
||||||
|
*
|
||||||
|
* @param[in] v source
|
||||||
|
* @param[in] mask mask
|
||||||
|
* @param[out] dest destination
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec3_swizzle(vec3 v, int mask, vec3 dest) {
|
||||||
|
vec3 t;
|
||||||
|
|
||||||
|
t[0] = v[(mask & (3 << 0))];
|
||||||
|
t[1] = v[(mask & (3 << 2)) >> 2];
|
||||||
|
t[2] = v[(mask & (3 << 4)) >> 4];
|
||||||
|
|
||||||
|
glm_vec3_copy(t, dest);
|
||||||
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief vec3 cross product
|
* @brief vec3 cross product
|
||||||
*
|
*
|
||||||
@@ -1054,25 +1076,4 @@ glm_normalize_to(vec3 v, vec3 dest) {
|
|||||||
glm_vec3_normalize_to(v, dest);
|
glm_vec3_normalize_to(v, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief swizzle vector components
|
|
||||||
*
|
|
||||||
* you can use existin masks e.g. GLM_XXX, GLM_ZYX
|
|
||||||
*
|
|
||||||
* @param[in] v source
|
|
||||||
* @param[in] mask mask
|
|
||||||
* @param[out] dest destination
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_vec3_swizzle(vec3 v, int mask, vec3 dest) {
|
|
||||||
vec3 t;
|
|
||||||
|
|
||||||
t[0] = v[(mask & (3 << 0))];
|
|
||||||
t[1] = v[(mask & (3 << 2)) >> 2];
|
|
||||||
t[2] = v[(mask & (3 << 4)) >> 4];
|
|
||||||
|
|
||||||
glm_vec3_copy(t, dest);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* cglm_vec3_h */
|
#endif /* cglm_vec3_h */
|
||||||
|
|||||||
@@ -252,7 +252,7 @@ glm_vec4_abs(vec4 v, vec4 dest) {
|
|||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
glmm_store(dest, glmm_abs(glmm_load(v)));
|
glmm_store(dest, glmm_abs(glmm_load(v)));
|
||||||
#elif defined(CGLM_NEON_FP)
|
#elif defined(CGLM_NEON_FP)
|
||||||
vst1q_f32(dest, vabsq_f32(vld1q_f32(a)));
|
vst1q_f32(dest, vabsq_f32(vld1q_f32(v)));
|
||||||
#else
|
#else
|
||||||
dest[0] = fabsf(v[0]);
|
dest[0] = fabsf(v[0]);
|
||||||
dest[1] = fabsf(v[1]);
|
dest[1] = fabsf(v[1]);
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
#define cglm_version_h
|
#define cglm_version_h
|
||||||
|
|
||||||
#define CGLM_VERSION_MAJOR 0
|
#define CGLM_VERSION_MAJOR 0
|
||||||
#define CGLM_VERSION_MINOR 6
|
#define CGLM_VERSION_MINOR 7
|
||||||
#define CGLM_VERSION_PATCH 0
|
#define CGLM_VERSION_PATCH 0
|
||||||
|
|
||||||
#endif /* cglm_version_h */
|
#endif /* cglm_version_h */
|
||||||
|
|||||||
@@ -1,24 +0,0 @@
|
|||||||
#! /bin/sh
|
|
||||||
#
|
|
||||||
# Copyright (c), Recep Aslantas.
|
|
||||||
#
|
|
||||||
# MIT License (MIT), http://opensource.org/licenses/MIT
|
|
||||||
# Full license can be found in the LICENSE file
|
|
||||||
#
|
|
||||||
|
|
||||||
cd $(dirname "$0")
|
|
||||||
|
|
||||||
mkdir -p "$(pwd)/.libs"
|
|
||||||
|
|
||||||
libmocka_folder=$(pwd)/test/lib/cmocka/build/src/
|
|
||||||
|
|
||||||
if [ "$(uname)" = "Darwin" ]; then
|
|
||||||
libcmocka=libcmocka.0.dylib
|
|
||||||
else
|
|
||||||
libcmocka=libcmocka.so.0
|
|
||||||
fi
|
|
||||||
|
|
||||||
libcmocka_path="$libmocka_folder$libcmocka"
|
|
||||||
if [ -f "$libcmocka_path" ]; then
|
|
||||||
ln -sf "$libcmocka_path" "$(pwd)/.libs/$libcmocka";
|
|
||||||
fi
|
|
||||||
99
src/mat2.c
Normal file
99
src/mat2.c
Normal file
@@ -0,0 +1,99 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "../include/cglm/cglm.h"
|
||||||
|
#include "../include/cglm/call.h"
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat2_copy(mat2 mat, mat2 dest) {
|
||||||
|
glm_mat2_copy(mat, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat2_identity(mat2 mat) {
|
||||||
|
glm_mat2_identity(mat);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat2_identity_array(mat2 * __restrict mat, size_t count) {
|
||||||
|
glm_mat2_identity_array(mat, count);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat2_zero(mat2 mat) {
|
||||||
|
glm_mat2_zero(mat);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat2_mul(mat2 m1, mat2 m2, mat2 dest) {
|
||||||
|
glm_mat2_mul(m1, m2, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat2_transpose_to(mat2 m, mat2 dest) {
|
||||||
|
glm_mat2_transpose_to(m, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat2_transpose(mat2 m) {
|
||||||
|
glm_mat2_transpose(m);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat2_mulv(mat2 m, vec2 v, vec2 dest) {
|
||||||
|
glm_mat2_mulv(m, v, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_mat2_trace(mat2 m) {
|
||||||
|
return glm_mat2_trace(m);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat2_scale(mat2 m, float s) {
|
||||||
|
glm_mat2_scale(m, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_mat2_det(mat2 mat) {
|
||||||
|
return glm_mat2_det(mat);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat2_inv(mat2 mat, mat2 dest) {
|
||||||
|
glm_mat2_inv(mat, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat2_swap_col(mat2 mat, int col1, int col2) {
|
||||||
|
glm_mat2_swap_col(mat, col1, col2);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat2_swap_row(mat2 mat, int row1, int row2) {
|
||||||
|
glm_mat2_swap_row(mat, row1, row2);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_mat2_rmc(vec2 r, mat2 m, vec2 c) {
|
||||||
|
return glm_mat2_rmc(r, m, c);
|
||||||
|
}
|
||||||
@@ -20,6 +20,12 @@ glmc_mat3_identity(mat3 mat) {
|
|||||||
glm_mat3_identity(mat);
|
glm_mat3_identity(mat);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat3_zero(mat3 mat) {
|
||||||
|
glm_mat3_zero(mat);
|
||||||
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_mat3_identity_array(mat3 * __restrict mat, size_t count) {
|
glmc_mat3_identity_array(mat3 * __restrict mat, size_t count) {
|
||||||
|
|||||||
@@ -32,6 +32,12 @@ glmc_mat4_identity_array(mat4 * __restrict mat, size_t count) {
|
|||||||
glm_mat4_identity_array(mat, count);
|
glm_mat4_identity_array(mat, count);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat4_zero(mat4 mat) {
|
||||||
|
glm_mat4_zero(mat);
|
||||||
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_mat4_pick3(mat4 mat, mat3 dest) {
|
glmc_mat4_pick3(mat4 mat, mat3 dest) {
|
||||||
|
|||||||
10
src/quat.c
10
src/quat.c
@@ -59,7 +59,7 @@ glmc_quat_normalize_to(versor q, versor dest) {
|
|||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_quat_normalize(versor q) {
|
glmc_quat_normalize(versor q) {
|
||||||
glm_quat_norm(q);
|
glm_quat_normalize(q);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
@@ -184,14 +184,14 @@ glmc_quat_look(vec3 eye, versor ori, mat4 dest) {
|
|||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_quat_for(vec3 dir, vec3 fwd, vec3 up, versor dest) {
|
glmc_quat_for(vec3 dir, vec3 up, versor dest) {
|
||||||
glm_quat_for(dir, fwd, up, dest);
|
glm_quat_for(dir, up, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_quat_forp(vec3 from, vec3 to, vec3 fwd, vec3 up, versor dest) {
|
glmc_quat_forp(vec3 from, vec3 to, vec3 up, versor dest) {
|
||||||
glm_quat_forp(from, to, fwd, up, dest);
|
glm_quat_forp(from, to, up, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
|
|||||||
213
src/vec2.c
Normal file
213
src/vec2.c
Normal file
@@ -0,0 +1,213 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "../include/cglm/cglm.h"
|
||||||
|
#include "../include/cglm/call.h"
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2(float * __restrict v, vec2 dest) {
|
||||||
|
glm_vec2(v, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_copy(vec2 a, vec2 dest) {
|
||||||
|
glm_vec2_copy(a, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_zero(vec2 v) {
|
||||||
|
glm_vec2_zero(v);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_one(vec2 v) {
|
||||||
|
glm_vec2_one(v);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_vec2_dot(vec2 a, vec2 b) {
|
||||||
|
return glm_vec2_dot(a, b);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_vec2_cross(vec2 a, vec2 b) {
|
||||||
|
return glm_vec2_cross(a, b);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_vec2_norm2(vec2 v) {
|
||||||
|
return glm_vec2_norm2(v);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_vec2_norm(vec2 v) {
|
||||||
|
return glm_vec2_norm(v);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_add(vec2 a, vec2 b, vec2 dest) {
|
||||||
|
glm_vec2_add(a, b, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_adds(vec2 v, float s, vec2 dest) {
|
||||||
|
glm_vec2_adds(v, s, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_sub(vec2 a, vec2 b, vec2 dest) {
|
||||||
|
glm_vec2_sub(a, b, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_subs(vec2 v, float s, vec2 dest) {
|
||||||
|
glm_vec2_subs(v, s, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_mul(vec2 a, vec2 b, vec2 dest) {
|
||||||
|
glm_vec2_mul(a, b, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_scale(vec2 v, float s, vec2 dest) {
|
||||||
|
glm_vec2_scale(v, s, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_scale_as(vec2 v, float s, vec2 dest) {
|
||||||
|
glm_vec2_scale_as(v, s, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_div(vec2 a, vec2 b, vec2 dest) {
|
||||||
|
glm_vec2_div(a, b, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_divs(vec2 v, float s, vec2 dest) {
|
||||||
|
glm_vec2_divs(v, s, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_addadd(vec2 a, vec2 b, vec2 dest) {
|
||||||
|
glm_vec2_addadd(a, b, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_subadd(vec2 a, vec2 b, vec2 dest) {
|
||||||
|
glm_vec2_subadd(a, b, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_muladd(vec2 a, vec2 b, vec2 dest) {
|
||||||
|
glm_vec2_muladd(a, b, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_muladds(vec2 a, float s, vec2 dest) {
|
||||||
|
glm_vec2_muladds(a, s, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_maxadd(vec2 a, vec2 b, vec2 dest) {
|
||||||
|
glm_vec2_maxadd(a, b, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_minadd(vec2 a, vec2 b, vec2 dest) {
|
||||||
|
glm_vec2_minadd(a, b, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_negate_to(vec2 v, vec2 dest) {
|
||||||
|
glm_vec2_negate_to(v, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_negate(vec2 v) {
|
||||||
|
glm_vec2_negate(v);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_normalize(vec2 v) {
|
||||||
|
glm_vec2_normalize(v);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_normalize_to(vec2 v, vec2 dest) {
|
||||||
|
glm_vec2_normalize_to(v, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_rotate(vec2 v, float angle, vec2 dest) {
|
||||||
|
glm_vec2_rotate(v, angle, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_vec2_distance2(vec2 a, vec2 b) {
|
||||||
|
return glm_vec2_distance2(a, b);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_vec2_distance(vec2 a, vec2 b) {
|
||||||
|
return glm_vec2_distance(a, b);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_maxv(vec2 a, vec2 b, vec2 dest) {
|
||||||
|
glm_vec2_maxv(a, b, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_minv(vec2 a, vec2 b, vec2 dest) {
|
||||||
|
glm_vec2_minv(a, b, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_clamp(vec2 v, float minval, float maxval) {
|
||||||
|
glm_vec2_clamp(v, minval, maxval);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_lerp(vec2 from, vec2 to, float t, vec2 dest) {
|
||||||
|
glm_vec2_lerp(from, to, t, dest);
|
||||||
|
}
|
||||||
@@ -239,13 +239,13 @@ glmc_vec3_distance2(vec3 a, vec3 b) {
|
|||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec3_maxv(vec3 a, vec3 b, vec3 dest) {
|
glmc_vec3_maxv(vec3 a, vec3 b, vec3 dest) {
|
||||||
glm_vec3_minv(a, b, dest);
|
glm_vec3_maxv(a, b, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec3_minv(vec3 a, vec3 b, vec3 dest) {
|
glmc_vec3_minv(vec3 a, vec3 b, vec3 dest) {
|
||||||
glm_vec3_maxv(a, b, dest);
|
glm_vec3_minv(a, b, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
|
|||||||
@@ -203,13 +203,13 @@ glmc_vec4_distance2(vec4 a, vec4 b) {
|
|||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec4_maxv(vec4 a, vec4 b, vec4 dest) {
|
glmc_vec4_maxv(vec4 a, vec4 b, vec4 dest) {
|
||||||
glm_vec4_minv(a, b, dest);
|
glm_vec4_maxv(a, b, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec4_minv(vec4 a, vec4 b, vec4 dest) {
|
glmc_vec4_minv(vec4 a, vec4 b, vec4 dest) {
|
||||||
glm_vec4_maxv(a, b, dest);
|
glm_vec4_minv(a, b, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
|
|||||||
119
test/include/common.h
Normal file
119
test/include/common.h
Normal file
@@ -0,0 +1,119 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef tests_common_h
|
||||||
|
#define tests_common_h
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include <cglm/cglm.h>
|
||||||
|
#include <cglm/struct.h>
|
||||||
|
#include <cglm/call.h>
|
||||||
|
|
||||||
|
typedef struct test_status_t {
|
||||||
|
const char *msg;
|
||||||
|
int status;
|
||||||
|
} test_status_t;
|
||||||
|
|
||||||
|
typedef test_status_t (*fntest)(void);
|
||||||
|
|
||||||
|
typedef struct test_entry_t {
|
||||||
|
char *name;
|
||||||
|
fntest entry;
|
||||||
|
int ret;
|
||||||
|
int show_output;
|
||||||
|
} test_entry_t;
|
||||||
|
|
||||||
|
#define RESET "\033[0m"
|
||||||
|
#define BLACK "\033[30m" /* Black */
|
||||||
|
#define RED "\033[31m" /* Red */
|
||||||
|
#define GREEN "\033[32m" /* Green */
|
||||||
|
#define YELLOW "\033[33m" /* Yellow */
|
||||||
|
#define BLUE "\033[34m" /* Blue */
|
||||||
|
#define MAGENTA "\033[35m" /* Magenta */
|
||||||
|
#define CYAN "\033[36m" /* Cyan */
|
||||||
|
#define WHITE "\033[37m" /* White */
|
||||||
|
#define BOLDBLACK "\033[1m\033[30m" /* Bold Black */
|
||||||
|
#define BOLDRED "\033[1m\033[31m" /* Bold Red */
|
||||||
|
#define BOLDGREEN "\033[1m\033[32m" /* Bold Green */
|
||||||
|
#define BOLDYELLOW "\033[1m\033[33m" /* Bold Yellow */
|
||||||
|
#define BOLDBLUE "\033[1m\033[34m" /* Bold Blue */
|
||||||
|
#define BOLDMAGENTA "\033[1m\033[35m" /* Bold Magenta */
|
||||||
|
#define BOLDCYAN "\033[1m\033[36m" /* Bold Cyan */
|
||||||
|
#define BOLDWHITE "\033[1m\033[37m" /* Bold White */
|
||||||
|
|
||||||
|
#define TEST_DECLARE(FUN) test_status_t test_ ## FUN(void);
|
||||||
|
#define TEST_ENTRY(FUN) { #FUN, test_ ## FUN, 0, 0 },
|
||||||
|
#define TEST_LIST static test_entry_t tests[] =
|
||||||
|
|
||||||
|
/* __VA_ARGS__ workaround for MSVC: https://stackoverflow.com/a/5134656 */
|
||||||
|
#define EXPAND(x) x
|
||||||
|
|
||||||
|
#define TEST_OK 1
|
||||||
|
#define TEST_SUCCESS return (test_status_t){NULL, TEST_OK};
|
||||||
|
|
||||||
|
#define TEST_IMPL_ARG1(FUN) \
|
||||||
|
test_status_t test_ ## FUN (void); \
|
||||||
|
test_status_t test_ ## FUN()
|
||||||
|
|
||||||
|
#define TEST_IMPL_ARG2(PREFIX, FUN) TEST_IMPL_ARG1(PREFIX ## FUN)
|
||||||
|
#define TEST_IMPL_ARG3(arg1, arg2, arg3, ...) arg3
|
||||||
|
|
||||||
|
#define TEST_IMPL_CHOOSER(...) \
|
||||||
|
EXPAND(TEST_IMPL_ARG3(__VA_ARGS__, TEST_IMPL_ARG2, TEST_IMPL_ARG1))
|
||||||
|
|
||||||
|
#define TEST_IMPL(...) EXPAND(TEST_IMPL_CHOOSER(__VA_ARGS__)(__VA_ARGS__))
|
||||||
|
|
||||||
|
#define ASSERT_EXT(expr, msg) \
|
||||||
|
if (!(expr)) { \
|
||||||
|
fprintf(stderr, \
|
||||||
|
RED " assert fail" RESET \
|
||||||
|
" in " BOLDCYAN "%s " RESET \
|
||||||
|
"on " BOLDMAGENTA "line %d" RESET \
|
||||||
|
" : " BOLDWHITE " ASSERT(%s)\n" RESET, \
|
||||||
|
__FILE__, \
|
||||||
|
__LINE__, \
|
||||||
|
#expr); \
|
||||||
|
return (test_status_t){msg, 0}; \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define ASSERT_ARG1(expr) ASSERT_EXT(expr, NULL)
|
||||||
|
#define ASSERT_ARG2(expr, msg) ASSERT_EXT(expr, msg)
|
||||||
|
#define ASSERT_ARG3(arg1, arg2, arg3, ...) arg3
|
||||||
|
|
||||||
|
#define ASSERT_CHOOSER(...) ASSERT_ARG3(__VA_ARGS__, ASSERT_ARG2, ASSERT_ARG1)
|
||||||
|
#define ASSERT(...) do { ASSERT_CHOOSER(__VA_ARGS__)(__VA_ARGS__) } while(0);
|
||||||
|
#define ASSERTIFY(expr) do { \
|
||||||
|
test_status_t ts; \
|
||||||
|
ts = expr; \
|
||||||
|
if (ts.status != TEST_OK) { \
|
||||||
|
fprintf(stderr, \
|
||||||
|
RED " assert fail" RESET \
|
||||||
|
" in " BOLDCYAN "%s " RESET \
|
||||||
|
"on " BOLDMAGENTA "line %d" RESET \
|
||||||
|
" : " BOLDWHITE " ASSERTIFY(%s)\n" RESET, \
|
||||||
|
__FILE__, \
|
||||||
|
__LINE__, \
|
||||||
|
#expr); \
|
||||||
|
return (test_status_t){ts.msg, 0}; \
|
||||||
|
} \
|
||||||
|
} while(0);
|
||||||
|
|
||||||
|
#if defined(_WIN32)
|
||||||
|
# define drand48() ((float)(rand() / (RAND_MAX + 1.0)))
|
||||||
|
# define OK_TEXT "ok:"
|
||||||
|
# define FAIL_TEXT "fail:"
|
||||||
|
# define FINAL_TEXT "^_^"
|
||||||
|
#else
|
||||||
|
# define OK_TEXT "✔︎"
|
||||||
|
# define FAIL_TEXT "𐄂"
|
||||||
|
# define FINAL_TEXT "🎉"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* common_h */
|
||||||
Submodule test/lib/cmocka deleted from 5f61d2f188
98
test/runner.c
Normal file
98
test/runner.c
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "include/common.h"
|
||||||
|
#include "tests.h"
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, const char * argv[]) {
|
||||||
|
test_entry_t *entry;
|
||||||
|
test_status_t st;
|
||||||
|
int32_t i, count, passed, failed, maxlen;
|
||||||
|
double start, end, elapsed, total;
|
||||||
|
|
||||||
|
passed = failed = maxlen = 0;
|
||||||
|
total = 0.0;
|
||||||
|
count = sizeof(tests) / sizeof(tests[0]);
|
||||||
|
|
||||||
|
fprintf(stderr, CYAN "\nWelcome to cglm tests\n\n" RESET);
|
||||||
|
|
||||||
|
srand((unsigned int)time(NULL));
|
||||||
|
|
||||||
|
for (i = 0; i < count; i++) {
|
||||||
|
int32_t len;
|
||||||
|
|
||||||
|
entry = tests + i;
|
||||||
|
len = (int32_t)strlen(entry->name);
|
||||||
|
|
||||||
|
maxlen = GLM_MAX(maxlen, len);
|
||||||
|
}
|
||||||
|
|
||||||
|
maxlen += 5;
|
||||||
|
|
||||||
|
fprintf(stderr,
|
||||||
|
BOLDWHITE " %-*s %-*s\n",
|
||||||
|
maxlen, "Test Name", maxlen, "Elapsed Time");
|
||||||
|
|
||||||
|
for (i = 0; i < count; i++) {
|
||||||
|
entry = tests + i;
|
||||||
|
start = clock();
|
||||||
|
st = entry->entry();
|
||||||
|
end = clock();
|
||||||
|
elapsed = (end - start) / CLOCKS_PER_SEC;
|
||||||
|
total += elapsed;
|
||||||
|
|
||||||
|
if (!st.status) {
|
||||||
|
fprintf(stderr,
|
||||||
|
BOLDRED " " FAIL_TEXT BOLDWHITE " %s " RESET, entry->name);
|
||||||
|
if (st.msg) {
|
||||||
|
fprintf(stderr,
|
||||||
|
YELLOW "- %s" RESET,
|
||||||
|
st.msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(stderr, "\n");
|
||||||
|
|
||||||
|
failed++;
|
||||||
|
} else {
|
||||||
|
fprintf(stderr, GREEN " " OK_TEXT RESET " %-*s ", maxlen, entry->name);
|
||||||
|
|
||||||
|
if (elapsed > 0.01)
|
||||||
|
fprintf(stderr, YELLOW "%.2fs", elapsed);
|
||||||
|
else
|
||||||
|
fprintf(stderr, "0");
|
||||||
|
|
||||||
|
fprintf(stderr, "\n" RESET);
|
||||||
|
passed++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (failed == 0) {
|
||||||
|
fprintf(stderr,
|
||||||
|
BOLDGREEN "\n All tests are passed " FINAL_TEXT "\n" RESET);
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(stderr,
|
||||||
|
CYAN "\ncglm test results (%0.2fs):\n" RESET
|
||||||
|
"--------------------------\n"
|
||||||
|
|
||||||
|
MAGENTA "%d" RESET " tests are runned, "
|
||||||
|
GREEN "%d" RESET " %s passed, "
|
||||||
|
RED "%d" RESET " %s failed\n\n" RESET,
|
||||||
|
total,
|
||||||
|
count,
|
||||||
|
passed,
|
||||||
|
passed > 1 ? "are" : "is",
|
||||||
|
failed,
|
||||||
|
failed > 1 ? "are" : "is");
|
||||||
|
|
||||||
|
return failed;
|
||||||
|
}
|
||||||
@@ -1,113 +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"
|
|
||||||
|
|
||||||
void
|
|
||||||
test_affine(void **state) {
|
|
||||||
mat4 t1, t2, t3, t4, t5;
|
|
||||||
|
|
||||||
/* test translate is postmultiplied */
|
|
||||||
glmc_rotate_make(t1, GLM_PI_4f, GLM_YUP);
|
|
||||||
glm_translate_make(t2, (vec3){34, 57, 36});
|
|
||||||
|
|
||||||
glmc_mat4_mul(t1, t2, t3); /* R * T */
|
|
||||||
|
|
||||||
glm_translate(t1, (vec3){34, 57, 36});
|
|
||||||
test_assert_mat4_eq(t1, t3);
|
|
||||||
|
|
||||||
/* test rotate is postmultiplied */
|
|
||||||
glmc_rotate_make(t1, GLM_PI_4f, GLM_YUP);
|
|
||||||
glm_translate_make(t2, (vec3){34, 57, 36});
|
|
||||||
|
|
||||||
glmc_mat4_mul(t2, t1, t3); /* T * R */
|
|
||||||
|
|
||||||
glm_rotate(t2, GLM_PI_4f, GLM_YUP);
|
|
||||||
test_assert_mat4_eq(t2, t3);
|
|
||||||
|
|
||||||
/* test scale is postmultiplied */
|
|
||||||
glmc_rotate_make(t1, GLM_PI_4f, GLM_YUP);
|
|
||||||
glm_translate_make(t2, (vec3){34, 57, 36});
|
|
||||||
glm_scale_make(t4, (vec3){3, 5, 6});
|
|
||||||
|
|
||||||
glmc_mat4_mul(t2, t1, t3); /* T * R */
|
|
||||||
glmc_mat4_mul(t3, t4, t5); /* T * R * S */
|
|
||||||
|
|
||||||
glm_scale(t3, (vec3){3, 5, 6});
|
|
||||||
test_assert_mat4_eq(t3, t5);
|
|
||||||
|
|
||||||
/* test translate_x */
|
|
||||||
glmc_rotate_make(t1, GLM_PI_4f, GLM_YUP);
|
|
||||||
glm_translate_make(t2, (vec3){34, 0, 0});
|
|
||||||
|
|
||||||
glmc_mat4_mul(t1, t2, t3); /* R * T */
|
|
||||||
glm_translate_x(t1, 34);
|
|
||||||
test_assert_mat4_eq(t1, t3);
|
|
||||||
|
|
||||||
/* test translate_y */
|
|
||||||
glmc_rotate_make(t1, GLM_PI_4f, GLM_YUP);
|
|
||||||
glm_translate_make(t2, (vec3){0, 57, 0});
|
|
||||||
|
|
||||||
glmc_mat4_mul(t1, t2, t3); /* R * T */
|
|
||||||
glm_translate_y(t1, 57);
|
|
||||||
test_assert_mat4_eq(t1, t3);
|
|
||||||
|
|
||||||
/* test translate_z */
|
|
||||||
glmc_rotate_make(t1, GLM_PI_4f, GLM_YUP);
|
|
||||||
glm_translate_make(t2, (vec3){0, 0, 36});
|
|
||||||
|
|
||||||
glmc_mat4_mul(t1, t2, t3); /* R * T */
|
|
||||||
glm_translate_z(t1, 36);
|
|
||||||
test_assert_mat4_eq(t1, t3);
|
|
||||||
|
|
||||||
/* test rotate_x */
|
|
||||||
glmc_rotate_make(t1, GLM_PI_4f, (vec3){1, 0, 0});
|
|
||||||
glm_translate_make(t2, (vec3){34, 57, 36});
|
|
||||||
|
|
||||||
glmc_mat4_mul(t2, t1, t3); /* T * R */
|
|
||||||
|
|
||||||
glm_rotate_x(t2, GLM_PI_4f, t2);
|
|
||||||
test_assert_mat4_eq(t2, t3);
|
|
||||||
|
|
||||||
/* test rotate_y */
|
|
||||||
glmc_rotate_make(t1, GLM_PI_4f, (vec3){0, 1, 0});
|
|
||||||
glm_translate_make(t2, (vec3){34, 57, 36});
|
|
||||||
|
|
||||||
glmc_mat4_mul(t2, t1, t3); /* T * R */
|
|
||||||
|
|
||||||
glm_rotate_y(t2, GLM_PI_4f, t2);
|
|
||||||
test_assert_mat4_eq(t2, t3);
|
|
||||||
|
|
||||||
/* test rotate_z */
|
|
||||||
glmc_rotate_make(t1, GLM_PI_4f, (vec3){0, 0, 1});
|
|
||||||
glm_translate_make(t2, (vec3){34, 57, 36});
|
|
||||||
|
|
||||||
glmc_mat4_mul(t2, t1, t3); /* T * R */
|
|
||||||
|
|
||||||
glm_rotate_z(t2, GLM_PI_4f, t2);
|
|
||||||
test_assert_mat4_eq(t2, t3);
|
|
||||||
|
|
||||||
/* test rotate */
|
|
||||||
glmc_rotate_make(t1, GLM_PI_4f, (vec3){0, 0, 1});
|
|
||||||
glm_translate_make(t2, (vec3){34, 57, 36});
|
|
||||||
|
|
||||||
glmc_mat4_mul(t2, t1, t3); /* T * R */
|
|
||||||
glmc_rotate(t2, GLM_PI_4f, (vec3){0, 0, 1});
|
|
||||||
|
|
||||||
test_assert_mat4_eq(t3, t2);
|
|
||||||
|
|
||||||
/* test scale_uni */
|
|
||||||
glmc_rotate_make(t1, GLM_PI_4f, GLM_YUP);
|
|
||||||
glm_translate_make(t2, (vec3){34, 57, 36});
|
|
||||||
glm_scale_make(t4, (vec3){3, 3, 3});
|
|
||||||
|
|
||||||
glmc_mat4_mul(t2, t1, t3); /* T * R */
|
|
||||||
glmc_mat4_mul(t3, t4, t5); /* T * R * S */
|
|
||||||
|
|
||||||
glm_scale_uni(t3, 3);
|
|
||||||
test_assert_mat4_eq(t3, t5);
|
|
||||||
}
|
|
||||||
634
test/src/test_affine.h
Normal file
634
test/src/test_affine.h
Normal file
@@ -0,0 +1,634 @@
|
|||||||
|
/*
|
||||||
|
* 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(GLM_PREFIX, translate) {
|
||||||
|
mat4 m1;
|
||||||
|
vec4 v1 = {1.0f, 2.0f, 3.0f, 1.0f}, v2;
|
||||||
|
|
||||||
|
glm_mat4_identity(m1);
|
||||||
|
GLM(translate)(m1, (vec3){13.0f, 11.0f, 7.0f});
|
||||||
|
glm_mat4_mulv(m1, v1, v2);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v2[0], 14.0f))
|
||||||
|
ASSERT(test_eq(v2[1], 13.0f))
|
||||||
|
ASSERT(test_eq(v2[2], 10.0f))
|
||||||
|
ASSERT(test_eq(v2[3], 1.0f))
|
||||||
|
|
||||||
|
glm_mat4_identity(m1);
|
||||||
|
GLM(translate)(m1, (vec3){1.0f, -1.0f, -5.0f});
|
||||||
|
glm_mat4_mulv(m1, v2, v2);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v2[0], 15.0f))
|
||||||
|
ASSERT(test_eq(v2[1], 12.0f))
|
||||||
|
ASSERT(test_eq(v2[2], 5.0f))
|
||||||
|
ASSERT(test_eq(v2[3], 1.0f))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, translate_to) {
|
||||||
|
mat4 m1, m2;
|
||||||
|
vec4 v1 = {1.0f, 2.0f, 3.0f, 1.0f}, v2;
|
||||||
|
|
||||||
|
glm_mat4_identity(m1);
|
||||||
|
GLM(translate_to)(m1, (vec3){13.0f, 11.0f, 7.0f}, m2);
|
||||||
|
glm_mat4_mulv(m2, v1, v2);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v2[0], 14.0f))
|
||||||
|
ASSERT(test_eq(v2[1], 13.0f))
|
||||||
|
ASSERT(test_eq(v2[2], 10.0f))
|
||||||
|
ASSERT(test_eq(v2[3], 1.0f))
|
||||||
|
|
||||||
|
glm_mat4_identity(m1);
|
||||||
|
GLM(translate_to)(m1, (vec3){1.0f, -1.0f, -5.0f}, m2);
|
||||||
|
glm_mat4_mulv(m2, v2, v2);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v2[0], 15.0f))
|
||||||
|
ASSERT(test_eq(v2[1], 12.0f))
|
||||||
|
ASSERT(test_eq(v2[2], 5.0f))
|
||||||
|
ASSERT(test_eq(v2[3], 1.0f))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, translate_x) {
|
||||||
|
mat4 m1;
|
||||||
|
vec4 v1 = {1.0f, 2.0f, 3.0f, 1.0f}, v2;
|
||||||
|
|
||||||
|
glm_mat4_identity(m1);
|
||||||
|
GLM(translate_x)(m1, 13.0f);
|
||||||
|
glm_mat4_mulv(m1, v1, v2);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v2[0], 14.0f))
|
||||||
|
ASSERT(test_eq(v2[1], 2.0f))
|
||||||
|
ASSERT(test_eq(v2[2], 3.0f))
|
||||||
|
ASSERT(test_eq(v2[3], 1.0f))
|
||||||
|
|
||||||
|
glm_mat4_identity(m1);
|
||||||
|
GLM(translate_x)(m1, -1.0f);
|
||||||
|
glm_mat4_mulv(m1, v2, v2);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v2[0], 13.0f))
|
||||||
|
ASSERT(test_eq(v2[1], 2.0f))
|
||||||
|
ASSERT(test_eq(v2[2], 3.0f))
|
||||||
|
ASSERT(test_eq(v2[3], 1.0f))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, translate_y) {
|
||||||
|
mat4 m1;
|
||||||
|
vec4 v1 = {1.0f, 2.0f, 3.0f, 1.0f}, v2;
|
||||||
|
|
||||||
|
glm_mat4_identity(m1);
|
||||||
|
GLM(translate_y)(m1, 11.0f);
|
||||||
|
glm_mat4_mulv(m1, v1, v2);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v2[0], 1.0f))
|
||||||
|
ASSERT(test_eq(v2[1], 13.0f))
|
||||||
|
ASSERT(test_eq(v2[2], 3.0f))
|
||||||
|
ASSERT(test_eq(v2[3], 1.0f))
|
||||||
|
|
||||||
|
glm_mat4_identity(m1);
|
||||||
|
GLM(translate_y)(m1, -1.0f);
|
||||||
|
glm_mat4_mulv(m1, v2, v2);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v2[0], 1.0f))
|
||||||
|
ASSERT(test_eq(v2[1], 12.0f))
|
||||||
|
ASSERT(test_eq(v2[2], 3.0f))
|
||||||
|
ASSERT(test_eq(v2[3], 1.0f))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, translate_z) {
|
||||||
|
mat4 m1;
|
||||||
|
vec4 v1 = {1.0f, 2.0f, 3.0f, 1.0f}, v2;
|
||||||
|
|
||||||
|
glm_mat4_identity(m1);
|
||||||
|
GLM(translate_z)(m1, 7.0f);
|
||||||
|
glm_mat4_mulv(m1, v1, v2);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v2[0], 1.0f))
|
||||||
|
ASSERT(test_eq(v2[1], 2.0f))
|
||||||
|
ASSERT(test_eq(v2[2], 10.0f))
|
||||||
|
ASSERT(test_eq(v2[3], 1.0f))
|
||||||
|
|
||||||
|
glm_mat4_identity(m1);
|
||||||
|
GLM(translate_z)(m1, -5.0f);
|
||||||
|
glm_mat4_mulv(m1, v2, v2);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v2[0], 1.0f))
|
||||||
|
ASSERT(test_eq(v2[1], 2.0f))
|
||||||
|
ASSERT(test_eq(v2[2], 5.0f))
|
||||||
|
ASSERT(test_eq(v2[3], 1.0f))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, translate_make) {
|
||||||
|
mat4 m1;
|
||||||
|
vec4 v1 = {1.0f, 2.0f, 3.0f, 1.0f}, v2;
|
||||||
|
|
||||||
|
glm_mat4_identity(m1);
|
||||||
|
GLM(translate_make)(m1, (vec3){13.0f, 11.0f, 7.0f});
|
||||||
|
glm_mat4_mulv(m1, v1, v2);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v2[0], 14.0f))
|
||||||
|
ASSERT(test_eq(v2[1], 13.0f))
|
||||||
|
ASSERT(test_eq(v2[2], 10.0f))
|
||||||
|
ASSERT(test_eq(v2[3], 1.0f))
|
||||||
|
|
||||||
|
glm_mat4_identity(m1);
|
||||||
|
GLM(translate_make)(m1, (vec3){1.0f, -1.0f, -5.0f});
|
||||||
|
glm_mat4_mulv(m1, v2, v2);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v2[0], 15.0f))
|
||||||
|
ASSERT(test_eq(v2[1], 12.0f))
|
||||||
|
ASSERT(test_eq(v2[2], 5.0f))
|
||||||
|
ASSERT(test_eq(v2[3], 1.0f))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, scale_to) {
|
||||||
|
mat4 m1, m2;
|
||||||
|
vec4 v1 = {1.0f, 2.0f, 3.0f, 1.0f}, v2;
|
||||||
|
|
||||||
|
glm_mat4_identity(m1);
|
||||||
|
GLM(scale_to)(m1, (vec3){13.0f, 11.0f, 7.0f}, m2);
|
||||||
|
glm_mat4_mulv(m2, v1, v2);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v2[0], 13.0f))
|
||||||
|
ASSERT(test_eq(v2[1], 22.0f))
|
||||||
|
ASSERT(test_eq(v2[2], 21.0f))
|
||||||
|
ASSERT(test_eq(v2[3], 1.0f))
|
||||||
|
|
||||||
|
glm_mat4_identity(m1);
|
||||||
|
GLM(scale_to)(m1, (vec3){1.0f, -1.0f, -5.0f}, m2);
|
||||||
|
glm_mat4_mulv(m2, v2, v2);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v2[0], 13.0f))
|
||||||
|
ASSERT(test_eq(v2[1], -22.0f))
|
||||||
|
ASSERT(test_eq(v2[2], -105.0f))
|
||||||
|
ASSERT(test_eq(v2[3], 1.0f))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, scale_make) {
|
||||||
|
mat4 m1;
|
||||||
|
vec4 v1 = {1.0f, 2.0f, 3.0f, 1.0f}, v2;
|
||||||
|
|
||||||
|
GLM(scale_make)(m1, (vec3){13.0f, 11.0f, 7.0f});
|
||||||
|
glm_mat4_mulv(m1, v1, v2);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v2[0], 13.0f))
|
||||||
|
ASSERT(test_eq(v2[1], 22.0f))
|
||||||
|
ASSERT(test_eq(v2[2], 21.0f))
|
||||||
|
ASSERT(test_eq(v2[3], 1.0f))
|
||||||
|
|
||||||
|
GLM(scale_make)(m1, (vec3){1.0f, -1.0f, -5.0f});
|
||||||
|
glm_mat4_mulv(m1, v2, v2);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v2[0], 13.0f))
|
||||||
|
ASSERT(test_eq(v2[1], -22.0f))
|
||||||
|
ASSERT(test_eq(v2[2], -105.0f))
|
||||||
|
ASSERT(test_eq(v2[3], 1.0f))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, scale) {
|
||||||
|
mat4 m1;
|
||||||
|
vec4 v1 = {1.0f, 2.0f, 3.0f, 1.0f}, v2;
|
||||||
|
|
||||||
|
glm_mat4_identity(m1);
|
||||||
|
GLM(scale)(m1, (vec3){13.0f, 11.0f, 7.0f});
|
||||||
|
glm_mat4_mulv(m1, v1, v2);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v2[0], 13.0f))
|
||||||
|
ASSERT(test_eq(v2[1], 22.0f))
|
||||||
|
ASSERT(test_eq(v2[2], 21.0f))
|
||||||
|
ASSERT(test_eq(v2[3], 1.0f))
|
||||||
|
|
||||||
|
glm_mat4_identity(m1);
|
||||||
|
GLM(scale)(m1, (vec3){1.0f, -1.0f, -5.0f});
|
||||||
|
glm_mat4_mulv(m1, v2, v2);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v2[0], 13.0f))
|
||||||
|
ASSERT(test_eq(v2[1], -22.0f))
|
||||||
|
ASSERT(test_eq(v2[2], -105.0f))
|
||||||
|
ASSERT(test_eq(v2[3], 1.0f))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, scale_uni) {
|
||||||
|
mat4 m1;
|
||||||
|
vec4 v1 = {1.0f, 2.0f, 3.0f, 1.0f}, v2;
|
||||||
|
|
||||||
|
glm_mat4_identity(m1);
|
||||||
|
GLM(scale_uni)(m1, 13.0f);
|
||||||
|
glm_mat4_mulv(m1, v1, v2);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v2[0], 13.0f))
|
||||||
|
ASSERT(test_eq(v2[1], 26.0f))
|
||||||
|
ASSERT(test_eq(v2[2], 39.0f))
|
||||||
|
ASSERT(test_eq(v2[3], 1.0f))
|
||||||
|
|
||||||
|
glm_mat4_identity(m1);
|
||||||
|
GLM(scale_uni)(m1, -5.0f);
|
||||||
|
glm_mat4_mulv(m1, v2, v2);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v2[0], -65.0f))
|
||||||
|
ASSERT(test_eq(v2[1], -130.0f))
|
||||||
|
ASSERT(test_eq(v2[2], -195.0f))
|
||||||
|
ASSERT(test_eq(v2[3], 1.0f))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, rotate_x) {
|
||||||
|
mat4 m1 = GLM_MAT4_IDENTITY_INIT;
|
||||||
|
vec4 v1 = {0.0f, 1.0f, 0.0f, 1.0f}, v2 = {0.0f, 1.0f, 0.0f, 1.0f};
|
||||||
|
|
||||||
|
GLM(rotate_x)(m1, GLM_PI_2f, m1);
|
||||||
|
glm_mat4_mulv(m1, v1, v1);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v1[0], 0.0f))
|
||||||
|
ASSERT(test_eq(v1[1], 0.0f))
|
||||||
|
ASSERT(test_eq(v1[2], 1.0f))
|
||||||
|
|
||||||
|
glm_vec3_copy(v2, v1);
|
||||||
|
|
||||||
|
GLM(rotate_x)(m1, GLM_PI_2f, m1);
|
||||||
|
glm_mat4_mulv(m1, v1, v1);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v1[0], 0.0f))
|
||||||
|
ASSERT(test_eq(v1[1], -1.0f))
|
||||||
|
ASSERT(test_eq(v1[2], 0.0f))
|
||||||
|
|
||||||
|
glm_vec3_copy(v2, v1);
|
||||||
|
|
||||||
|
GLM(rotate_x)(m1, GLM_PI_2f, m1);
|
||||||
|
glm_mat4_mulv(m1, v1, v1);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v1[0], 0.0f))
|
||||||
|
ASSERT(test_eq(v1[1], 0.0f))
|
||||||
|
ASSERT(test_eq(v1[2], -1.0f))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, rotate_y) {
|
||||||
|
mat4 m1 = GLM_MAT4_IDENTITY_INIT;
|
||||||
|
vec4 v1 = {1.0f, 0.0f, 0.0f, 1.0f}, v2 = {1.0f, 0.0f, 0.0f, 1.0f};
|
||||||
|
|
||||||
|
GLM(rotate_y)(m1, GLM_PI_2f, m1);
|
||||||
|
glm_mat4_mulv(m1, v1, v1);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v1[0], 0.0f))
|
||||||
|
ASSERT(test_eq(v1[1], 0.0f))
|
||||||
|
ASSERT(test_eq(v1[2], -1.0f))
|
||||||
|
|
||||||
|
glm_vec3_copy(v2, v1);
|
||||||
|
|
||||||
|
GLM(rotate_y)(m1, GLM_PI_2f, m1);
|
||||||
|
glm_mat4_mulv(m1, v1, v1);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v1[0], -1.0f))
|
||||||
|
ASSERT(test_eq(v1[1], 0.0f))
|
||||||
|
ASSERT(test_eq(v1[2], 0.0f))
|
||||||
|
|
||||||
|
glm_vec3_copy(v2, v1);
|
||||||
|
|
||||||
|
GLM(rotate_y)(m1, GLM_PI_2f, m1);
|
||||||
|
glm_mat4_mulv(m1, v1, v1);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v1[0], 0.0f))
|
||||||
|
ASSERT(test_eq(v1[1], 0.0f))
|
||||||
|
ASSERT(test_eq(v1[2], 1.0f))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, rotate_z) {
|
||||||
|
mat4 m1 = GLM_MAT4_IDENTITY_INIT;
|
||||||
|
vec4 v1 = {0.0f, 1.0f, 0.0f, 1.0f}, v2 = {0.0f, 1.0f, 0.0f, 1.0f};
|
||||||
|
|
||||||
|
GLM(rotate_z)(m1, GLM_PI_2f, m1);
|
||||||
|
glm_mat4_mulv(m1, v1, v1);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v1[0], -1.0f))
|
||||||
|
ASSERT(test_eq(v1[1], 0.0f))
|
||||||
|
ASSERT(test_eq(v1[2], 0.0f))
|
||||||
|
|
||||||
|
glm_vec3_copy(v2, v1);
|
||||||
|
|
||||||
|
GLM(rotate_z)(m1, GLM_PI_2f, m1);
|
||||||
|
glm_mat4_mulv(m1, v1, v1);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v1[0], 0.0f))
|
||||||
|
ASSERT(test_eq(v1[1], -1.0f))
|
||||||
|
ASSERT(test_eq(v1[2], 0.0f))
|
||||||
|
|
||||||
|
glm_vec3_copy(v2, v1);
|
||||||
|
|
||||||
|
GLM(rotate_z)(m1, GLM_PI_2f, m1);
|
||||||
|
glm_mat4_mulv(m1, v1, v1);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v1[0], 1.0f))
|
||||||
|
ASSERT(test_eq(v1[1], 0.0f))
|
||||||
|
ASSERT(test_eq(v1[2], 0.0f))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, rotate_make) {
|
||||||
|
mat4 m1 = GLM_MAT4_IDENTITY_INIT;
|
||||||
|
vec4 v1 = {1.0f, 0.0f, 0.0f, 1.0f};
|
||||||
|
|
||||||
|
/* rotate X around Y = -Z */
|
||||||
|
GLM(rotate_make)(m1, GLM_PI_2f, GLM_YUP);
|
||||||
|
glm_mat4_mulv(m1, v1, v1);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v1[0], 0.0f))
|
||||||
|
ASSERT(test_eq(v1[1], 0.0f))
|
||||||
|
ASSERT(test_eq(v1[2], -1.0f))
|
||||||
|
|
||||||
|
/* rotate -Z around X = Y */
|
||||||
|
GLM(rotate_make)(m1, GLM_PI_2f, GLM_XUP);
|
||||||
|
glm_mat4_mulv(m1, v1, v1);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v1[0], 0.0f))
|
||||||
|
ASSERT(test_eq(v1[1], 1.0f))
|
||||||
|
ASSERT(test_eq(v1[2], 0.0f))
|
||||||
|
|
||||||
|
/* rotate Y around X = +Z */
|
||||||
|
GLM(rotate_make)(m1, GLM_PI_2f, GLM_XUP);
|
||||||
|
glm_mat4_mulv(m1, v1, v1);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v1[0], 0.0f))
|
||||||
|
ASSERT(test_eq(v1[1], 0.0f))
|
||||||
|
ASSERT(test_eq(v1[2], 1.0f))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, rotate) {
|
||||||
|
mat4 m1 = GLM_MAT4_IDENTITY_INIT, m2 = GLM_MAT4_IDENTITY_INIT;
|
||||||
|
vec4 v1 = {1.0f, 0.0f, 0.0f, 1.0f};
|
||||||
|
|
||||||
|
/* 360 deg */
|
||||||
|
glm_rotate(m1, GLM_PI_2f, GLM_YUP);
|
||||||
|
glm_rotate(m1, GLM_PI_2f, GLM_YUP);
|
||||||
|
glm_rotate(m1, GLM_PI_2f, GLM_YUP);
|
||||||
|
glm_rotate(m1, GLM_PI_2f, GLM_YUP);
|
||||||
|
ASSERTIFY(test_assert_mat4_eq(m1, m2))
|
||||||
|
|
||||||
|
/* rotate X around Y = -Z */
|
||||||
|
GLM(rotate)(m1, GLM_PI_2f, GLM_YUP);
|
||||||
|
glm_mat4_mulv(m1, v1, v1);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v1[0], 0.0f))
|
||||||
|
ASSERT(test_eq(v1[1], 0.0f))
|
||||||
|
ASSERT(test_eq(v1[2], -1.0f))
|
||||||
|
|
||||||
|
glm_mat4_identity(m1);
|
||||||
|
|
||||||
|
/* rotate -Z around X = Y */
|
||||||
|
GLM(rotate)(m1, GLM_PI_2f, GLM_XUP);
|
||||||
|
glm_mat4_mulv(m1, v1, v1);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v1[0], 0.0f))
|
||||||
|
ASSERT(test_eq(v1[1], 1.0f))
|
||||||
|
ASSERT(test_eq(v1[2], 0.0f))
|
||||||
|
|
||||||
|
glm_mat4_identity(m1);
|
||||||
|
|
||||||
|
/* rotate Y around X = +Z */
|
||||||
|
GLM(rotate)(m1, GLM_PI_2f, GLM_XUP);
|
||||||
|
glm_mat4_mulv(m1, v1, v1);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v1[0], 0.0f))
|
||||||
|
ASSERT(test_eq(v1[1], 0.0f))
|
||||||
|
ASSERT(test_eq(v1[2], 1.0f))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, rotate_at) {
|
||||||
|
mat4 m1 = GLM_MAT4_IDENTITY_INIT;
|
||||||
|
vec4 v1 = {1.0f, 0.0f, 0.0f, 1.0f};
|
||||||
|
|
||||||
|
GLM(rotate_at)(m1, (vec3){0.5f, 0.0f, 0.0f}, GLM_PI_2f, GLM_YUP);
|
||||||
|
glm_mat4_mulv(m1, v1, v1);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v1[0], 0.5f))
|
||||||
|
ASSERT(test_eq(v1[1], 0.0f))
|
||||||
|
ASSERT(test_eq(v1[2], -0.5f))
|
||||||
|
|
||||||
|
glm_mat4_identity(m1);
|
||||||
|
|
||||||
|
GLM(rotate_at)(m1, GLM_VEC3_ZERO, GLM_PI_2f, GLM_ZUP);
|
||||||
|
glm_mat4_mulv(m1, v1, v1);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v1[0], 0.0f))
|
||||||
|
ASSERT(test_eq(v1[1], 0.5f))
|
||||||
|
ASSERT(test_eq(v1[2], -0.5f))
|
||||||
|
|
||||||
|
glm_mat4_identity(m1);
|
||||||
|
|
||||||
|
v1[0] = 1.0f;
|
||||||
|
v1[1] = 1.0f;
|
||||||
|
v1[2] = 1.0f;
|
||||||
|
|
||||||
|
GLM(rotate_at)(m1, GLM_VEC3_ZERO, GLM_PI_2f, GLM_XUP);
|
||||||
|
glm_mat4_mulv(m1, v1, v1);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v1[0], 1.0f))
|
||||||
|
ASSERT(test_eq(v1[1], -1.0f))
|
||||||
|
ASSERT(test_eq(v1[2], 1.0f))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, rotate_atm) {
|
||||||
|
mat4 m1 = GLM_MAT4_IDENTITY_INIT;
|
||||||
|
vec4 v1 = {1.0f, 0.0f, 0.0f, 1.0f};
|
||||||
|
|
||||||
|
GLM(rotate_atm)(m1, (vec3){0.5f, 0.0f, 0.0f}, GLM_PI_2f, GLM_YUP);
|
||||||
|
glm_mat4_mulv(m1, v1, v1);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v1[0], 0.5f))
|
||||||
|
ASSERT(test_eq(v1[1], 0.0f))
|
||||||
|
ASSERT(test_eq(v1[2], -0.5f))
|
||||||
|
|
||||||
|
GLM(rotate_atm)(m1, GLM_VEC3_ZERO, GLM_PI_2f, GLM_ZUP);
|
||||||
|
glm_mat4_mulv(m1, v1, v1);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v1[0], 0.0f))
|
||||||
|
ASSERT(test_eq(v1[1], 0.5f))
|
||||||
|
ASSERT(test_eq(v1[2], -0.5f))
|
||||||
|
|
||||||
|
v1[0] = 1.0f;
|
||||||
|
v1[1] = 1.0f;
|
||||||
|
v1[2] = 1.0f;
|
||||||
|
|
||||||
|
GLM(rotate_atm)(m1, GLM_VEC3_ZERO, GLM_PI_2f, GLM_XUP);
|
||||||
|
glm_mat4_mulv(m1, v1, v1);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v1[0], 1.0f))
|
||||||
|
ASSERT(test_eq(v1[1], -1.0f))
|
||||||
|
ASSERT(test_eq(v1[2], 1.0f))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, decompose_scalev) {
|
||||||
|
mat4 m1;
|
||||||
|
vec3 s1;
|
||||||
|
|
||||||
|
GLM(scale_make)(m1, (vec3){7.0f, 8.0f, 9.0f});
|
||||||
|
GLM(decompose_scalev)(m1, s1);
|
||||||
|
|
||||||
|
ASSERT(test_eq(s1[0], 7.0f))
|
||||||
|
ASSERT(test_eq(s1[1], 8.0f))
|
||||||
|
ASSERT(test_eq(s1[2], 9.0f))
|
||||||
|
|
||||||
|
GLM(scale)(m1, (vec3){7.0f, 8.0f, 9.0f});
|
||||||
|
GLM(decompose_scalev)(m1, s1);
|
||||||
|
|
||||||
|
ASSERT(test_eq(s1[0], 49.0f))
|
||||||
|
ASSERT(test_eq(s1[1], 64.0f))
|
||||||
|
ASSERT(test_eq(s1[2], 81.0f))
|
||||||
|
|
||||||
|
glm_rotate(m1, GLM_PI_4f, (vec3){23.0f, 45.0f, 66.0f});
|
||||||
|
ASSERT(test_eq(s1[0], 49.0f))
|
||||||
|
ASSERT(test_eq(s1[1], 64.0f))
|
||||||
|
ASSERT(test_eq(s1[2], 81.0f))
|
||||||
|
|
||||||
|
glm_translate(m1, (vec3){4.0f, 5.0f, 6.0f});
|
||||||
|
ASSERT(test_eq(s1[0], 49.0f))
|
||||||
|
ASSERT(test_eq(s1[1], 64.0f))
|
||||||
|
ASSERT(test_eq(s1[2], 81.0f))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, uniscaled) {
|
||||||
|
mat4 m1;
|
||||||
|
|
||||||
|
GLM(scale_make)(m1, (vec3){7.0f, 8.0f, 9.0f});
|
||||||
|
ASSERT(!GLM(uniscaled)(m1))
|
||||||
|
|
||||||
|
GLM(scale_make)(m1, (vec3){7.0f, 7.0f, 7.0f});
|
||||||
|
ASSERT(GLM(uniscaled)(m1))
|
||||||
|
|
||||||
|
glm_rotate(m1, GLM_PI_4f, (vec3){23.0f, 45.0f, 66.0f});
|
||||||
|
ASSERT(GLM(uniscaled)(m1))
|
||||||
|
|
||||||
|
glm_translate(m1, (vec3){4.0f, 5.0f, 6.0f});
|
||||||
|
ASSERT(GLM(uniscaled)(m1))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, decompose_rs) {
|
||||||
|
mat4 m1, m2, r;
|
||||||
|
vec3 s1;
|
||||||
|
|
||||||
|
GLM(scale_make)(m1, (vec3){7.0f, 8.0f, 9.0f});
|
||||||
|
GLM(decompose_rs)(m1, r, s1);
|
||||||
|
|
||||||
|
ASSERT(test_eq(s1[0], 7.0f))
|
||||||
|
ASSERT(test_eq(s1[1], 8.0f))
|
||||||
|
ASSERT(test_eq(s1[2], 9.0f))
|
||||||
|
ASSERTIFY(test_assert_mat4_eq_identity(r));
|
||||||
|
|
||||||
|
GLM(scale)(m1, (vec3){7.0f, 8.0f, 9.0f});
|
||||||
|
GLM(decompose_rs)(m1, r, s1);
|
||||||
|
|
||||||
|
ASSERT(test_eq(s1[0], 49.0f))
|
||||||
|
ASSERT(test_eq(s1[1], 64.0f))
|
||||||
|
ASSERT(test_eq(s1[2], 81.0f))
|
||||||
|
ASSERTIFY(test_assert_mat4_eq_identity(r));
|
||||||
|
|
||||||
|
glm_rotate(m1, GLM_PI_4f, (vec3){23.0f, 45.0f, 66.0f});
|
||||||
|
ASSERT(test_eq(s1[0], 49.0f))
|
||||||
|
ASSERT(test_eq(s1[1], 64.0f))
|
||||||
|
ASSERT(test_eq(s1[2], 81.0f))
|
||||||
|
GLM(decompose_rs)(m1, r, s1);
|
||||||
|
|
||||||
|
glm_mat4_identity(m2);
|
||||||
|
glm_mat4_mul(m2, r, m2);
|
||||||
|
glm_scale(m2, s1);
|
||||||
|
|
||||||
|
ASSERTIFY(test_assert_mat4_eq2(m1, m2, 0.00001f));
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, decompose) {
|
||||||
|
mat4 m1, m2, r;
|
||||||
|
vec4 t;
|
||||||
|
vec3 s;
|
||||||
|
|
||||||
|
GLM(scale_make)(m1, (vec3){7.0f, 8.0f, 9.0f});
|
||||||
|
GLM(decompose)(m1, t, r, s);
|
||||||
|
|
||||||
|
ASSERT(test_eq(s[0], 7.0f))
|
||||||
|
ASSERT(test_eq(s[1], 8.0f))
|
||||||
|
ASSERT(test_eq(s[2], 9.0f))
|
||||||
|
ASSERTIFY(test_assert_mat4_eq_identity(r));
|
||||||
|
|
||||||
|
GLM(scale)(m1, (vec3){7.0f, 8.0f, 9.0f});
|
||||||
|
GLM(decompose)(m1, t, r, s);
|
||||||
|
|
||||||
|
ASSERT(test_eq(s[0], 49.0f))
|
||||||
|
ASSERT(test_eq(s[1], 64.0f))
|
||||||
|
ASSERT(test_eq(s[2], 81.0f))
|
||||||
|
ASSERTIFY(test_assert_mat4_eq_identity(r));
|
||||||
|
|
||||||
|
glm_rotate(m1, GLM_PI_4f, (vec3){23.0f, 45.0f, 66.0f});
|
||||||
|
ASSERT(test_eq(s[0], 49.0f))
|
||||||
|
ASSERT(test_eq(s[1], 64.0f))
|
||||||
|
ASSERT(test_eq(s[2], 81.0f))
|
||||||
|
GLM(decompose)(m1, t, r, s);
|
||||||
|
|
||||||
|
glm_mat4_identity(m2);
|
||||||
|
glm_mat4_mul(m2, r, m2);
|
||||||
|
glm_scale(m2, s);
|
||||||
|
|
||||||
|
ASSERTIFY(test_assert_mat4_eq2(m1, m2, 0.00001f));
|
||||||
|
|
||||||
|
glm_mat4_identity(m1);
|
||||||
|
glm_translate(m1, (vec3){56.0f, 13.0f, 90.0f});
|
||||||
|
glm_rotate(m1, GLM_PI_4f, (vec3){23.0f, 45.0f, 66.0f});
|
||||||
|
glm_scale(m1, (vec3){12.0f, 34.0f, 23.0f});
|
||||||
|
|
||||||
|
GLM(decompose)(m1, t, r, s);
|
||||||
|
|
||||||
|
ASSERT(test_eq(t[0], 56.0f))
|
||||||
|
ASSERT(test_eq(t[1], 13.0f))
|
||||||
|
ASSERT(test_eq(t[2], 90.0f))
|
||||||
|
|
||||||
|
ASSERT(test_eq(s[0], 12.0f))
|
||||||
|
ASSERT(test_eq(s[1], 34.0f))
|
||||||
|
ASSERT(test_eq(s[2], 23.0f))
|
||||||
|
|
||||||
|
glm_mat4_identity(m2);
|
||||||
|
glm_translate(m2, t);
|
||||||
|
glm_mat4_mul(m2, r, m2);
|
||||||
|
glm_scale(m2, s);
|
||||||
|
ASSERTIFY(test_assert_mat4_eq2(m1, m2, 0.00001f));
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
87
test/src/test_affine_mat.h
Normal file
87
test/src/test_affine_mat.h
Normal file
@@ -0,0 +1,87 @@
|
|||||||
|
/*
|
||||||
|
* 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(GLM_PREFIX, mul) {
|
||||||
|
mat4 m1 = GLM_MAT4_IDENTITY_INIT;
|
||||||
|
mat4 m2 = GLM_MAT4_IDENTITY_INIT;
|
||||||
|
mat4 m3;
|
||||||
|
mat4 m4 = GLM_MAT4_ZERO_INIT;
|
||||||
|
int i, j, k;
|
||||||
|
|
||||||
|
test_rand_mat4(m1);
|
||||||
|
test_rand_mat4(m2);
|
||||||
|
|
||||||
|
GLM(mul)(m1, m2, m3);
|
||||||
|
for (i = 0; i < 4; i++) {
|
||||||
|
for (j = 0; j < 4; j++) {
|
||||||
|
for (k = 0; k < 4; k++)
|
||||||
|
/* column-major */
|
||||||
|
m4[i][j] += m1[k][j] * m2[i][k];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ASSERTIFY(test_assert_mat4_eq(m3, m4))
|
||||||
|
|
||||||
|
/* test pre compiled */
|
||||||
|
GLM(mul)(m1, m2, m3);
|
||||||
|
ASSERTIFY(test_assert_mat4_eq(m3, m4))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, mul_rot) {
|
||||||
|
mat4 m1 = GLM_MAT4_IDENTITY_INIT;
|
||||||
|
mat4 m2 = GLM_MAT4_IDENTITY_INIT;
|
||||||
|
mat4 m3;
|
||||||
|
mat4 m4 = GLM_MAT4_ZERO_INIT;
|
||||||
|
int i, j, k;
|
||||||
|
|
||||||
|
glm_rotate(m1, drand48(), (vec3){drand48(), drand48(), drand48()});
|
||||||
|
glm_rotate(m2, drand48(), (vec3){drand48(), drand48(), drand48()});
|
||||||
|
|
||||||
|
GLM(mul_rot)(m1, m2, m3);
|
||||||
|
for (i = 0; i < 4; i++) {
|
||||||
|
for (j = 0; j < 4; j++) {
|
||||||
|
for (k = 0; k < 4; k++)
|
||||||
|
/* column-major */
|
||||||
|
m4[i][j] += m1[k][j] * m2[i][k];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ASSERTIFY(test_assert_mat4_eq(m3, m4))
|
||||||
|
|
||||||
|
/* test pre compiled */
|
||||||
|
GLM(mul_rot)(m1, m2, m3);
|
||||||
|
ASSERTIFY(test_assert_mat4_eq(m3, m4))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, inv_tr) {
|
||||||
|
mat4 m1, m2;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < 10000; i++) {
|
||||||
|
test_rand_mat4(m1);
|
||||||
|
|
||||||
|
glm_mat4_copy(m1, m2);
|
||||||
|
|
||||||
|
/* test inverse precise */
|
||||||
|
GLM(inv_tr)(m1);
|
||||||
|
GLM(inv_tr)(m1);
|
||||||
|
ASSERTIFY(test_assert_mat4_eq(m1, m2))
|
||||||
|
|
||||||
|
/* test inverse precise */
|
||||||
|
GLM(mat4_inv)(m1, m2);
|
||||||
|
GLM(inv_tr)(m2);
|
||||||
|
ASSERTIFY(test_assert_mat4_eq(m1, m2))
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
@@ -35,8 +35,7 @@ test_hermite_plain(float s, float p0, float t0, float t1, float p1) {
|
|||||||
+ t1 * (sss - ss);
|
+ t1 * (sss - ss);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
TEST_IMPL(bezier) {
|
||||||
test_bezier(void **state) {
|
|
||||||
float s, p0, p1, c0, c1, smc, Bs, Bs_plain;
|
float s, p0, p1, c0, c1, smc, Bs, Bs_plain;
|
||||||
|
|
||||||
s = test_rand();
|
s = test_rand();
|
||||||
@@ -50,16 +49,18 @@ test_bezier(void **state) {
|
|||||||
Bs = glm_bezier(s, p0, c0, c1, p1);
|
Bs = glm_bezier(s, p0, c0, c1, p1);
|
||||||
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(test_eq(Bs, Bs_plain));
|
||||||
test_assert_eqf(smc, Bs_plain);
|
ASSERTIFY(test_assert_eqf(smc, Bs_plain))
|
||||||
test_assert_eqf(Bs, smc);
|
ASSERTIFY(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});
|
||||||
Bs = glm_hermite(s, p0, c0, c1, p1);
|
Bs = glm_hermite(s, p0, c0, c1, p1);
|
||||||
Bs_plain = test_hermite_plain(s, p0, c0, c1, p1);
|
Bs_plain = test_hermite_plain(s, p0, c0, c1, p1);
|
||||||
|
|
||||||
assert_true(glm_eq(Bs, Bs_plain));
|
ASSERT(test_eq(Bs, Bs_plain));
|
||||||
assert_true(glm_eq(smc, Bs_plain));
|
ASSERT(test_eq(smc, Bs_plain));
|
||||||
assert_true(glm_eq(Bs, smc));
|
ASSERT(test_eq(Bs, smc));
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,25 +7,24 @@
|
|||||||
|
|
||||||
#include "test_common.h"
|
#include "test_common.h"
|
||||||
|
|
||||||
void
|
TEST_IMPL(camera_lookat) {
|
||||||
test_camera_lookat(void **state) {
|
mat4 view1, view2;
|
||||||
mat4 view1, view2;
|
|
||||||
vec3 center,
|
vec3 center,
|
||||||
eye = {0.024f, 14.6f, 67.04f},
|
eye = {0.024f, 14.6f, 67.04f},
|
||||||
dir = {0.0f, 0.0f, -1.0f},
|
dir = {0.0f, 0.0f, -1.0f},
|
||||||
up = {0.0f, 1.0f, 0.0f}
|
up = {0.0f, 1.0f, 0.0f};
|
||||||
;
|
|
||||||
|
|
||||||
glm_vec3_add(eye, dir, center);
|
glm_vec3_add(eye, dir, center);
|
||||||
glm_lookat(eye, center, up, view1);
|
glm_lookat(eye, center, up, view1);
|
||||||
|
|
||||||
glm_look(eye, dir, up, view2);
|
glm_look(eye, dir, up, view2);
|
||||||
|
|
||||||
test_assert_mat4_eq(view1, view2);
|
ASSERTIFY(test_assert_mat4_eq(view1, view2))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
TEST_IMPL(camera_decomp) {
|
||||||
test_camera_decomp(void **state) {
|
|
||||||
mat4 proj, proj2;
|
mat4 proj, proj2;
|
||||||
vec4 sizes;
|
vec4 sizes;
|
||||||
float aspect, fovy, nearVal, farVal;
|
float aspect, fovy, nearVal, farVal;
|
||||||
@@ -36,19 +35,21 @@ test_camera_decomp(void **state) {
|
|||||||
farVal = 100.0f;
|
farVal = 100.0f;
|
||||||
|
|
||||||
glm_perspective(fovy, aspect, nearVal, farVal, proj);
|
glm_perspective(fovy, aspect, nearVal, farVal, proj);
|
||||||
assert_true(fabsf(aspect - glm_persp_aspect(proj)) < FLT_EPSILON);
|
ASSERT(fabsf(aspect - glm_persp_aspect(proj)) < FLT_EPSILON)
|
||||||
assert_true(fabsf(fovy - glm_persp_fovy(proj)) < FLT_EPSILON);
|
ASSERT(fabsf(fovy - glm_persp_fovy(proj)) < FLT_EPSILON)
|
||||||
assert_true(fabsf(49.984f - glm_deg(glm_persp_fovy(proj))) < FLT_EPSILON);
|
ASSERT(fabsf(49.984f - glm_deg(glm_persp_fovy(proj))) < FLT_EPSILON)
|
||||||
|
|
||||||
glm_persp_sizes(proj, fovy, sizes);
|
glm_persp_sizes(proj, fovy, sizes);
|
||||||
|
|
||||||
glm_frustum(-sizes[0] * 0.5,
|
glm_frustum(-sizes[0] * 0.5f,
|
||||||
sizes[0] * 0.5,
|
sizes[0] * 0.5f,
|
||||||
-sizes[1] * 0.5,
|
-sizes[1] * 0.5f,
|
||||||
sizes[1] * 0.5,
|
sizes[1] * 0.5f,
|
||||||
nearVal,
|
nearVal,
|
||||||
farVal,
|
farVal,
|
||||||
proj2);
|
proj2);
|
||||||
|
|
||||||
test_assert_mat4_eq(proj, proj2);
|
ASSERTIFY(test_assert_mat4_eq(proj, proj2))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,24 +7,25 @@
|
|||||||
|
|
||||||
#include "test_common.h"
|
#include "test_common.h"
|
||||||
|
|
||||||
void
|
TEST_IMPL(clamp) {
|
||||||
test_clamp(void **state) {
|
vec3 v3 = {15.07f, 0.4f, 17.3f};
|
||||||
vec3 v3 = {15.07, 0.4, 17.3};
|
vec4 v4 = {5.07f, 2.3f, 1.3f, 1.4f};
|
||||||
vec4 v4 = {5.07, 2.3, 1.3, 1.4};
|
|
||||||
|
|
||||||
assert_true(glm_clamp(1.6f, 0.0f, 1.0f) == 1.0f);
|
ASSERT(glm_clamp(1.6f, 0.0f, 1.0f) == 1.0f)
|
||||||
assert_true(glm_clamp(-1.6f, 0.0f, 1.0f) == 0.0f);
|
ASSERT(glm_clamp(-1.6f, 0.0f, 1.0f) == 0.0f)
|
||||||
assert_true(glm_clamp(0.6f, 0.0f, 1.0f) == 0.6f);
|
ASSERT(glm_clamp(0.6f, 0.0f, 1.0f) == 0.6f)
|
||||||
|
|
||||||
glm_vec3_clamp(v3, 0.0, 1.0);
|
glm_vec3_clamp(v3, 0.0, 1.0);
|
||||||
glm_vec4_clamp(v4, 1.5, 3.0);
|
glm_vec4_clamp(v4, 1.5, 3.0);
|
||||||
|
|
||||||
assert_true(v3[0] == 1.0f);
|
ASSERT(v3[0] == 1.0f)
|
||||||
assert_true(v3[1] == 0.4f);
|
ASSERT(v3[1] == 0.4f)
|
||||||
assert_true(v3[2] == 1.0f);
|
ASSERT(v3[2] == 1.0f)
|
||||||
|
|
||||||
assert_true(v4[0] == 3.0f);
|
ASSERT(v4[0] == 3.0f)
|
||||||
assert_true(v4[1] == 2.3f);
|
ASSERT(v4[1] == 2.3f)
|
||||||
assert_true(v4[2] == 1.5f);
|
ASSERT(v4[2] == 1.5f)
|
||||||
assert_true(v4[3] == 1.5f);
|
ASSERT(v4[3] == 1.5f)
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,26 +4,20 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "test_common.h"
|
#include "test_common.h"
|
||||||
#include <stdlib.h>
|
#include <time.h>
|
||||||
#include <math.h>
|
|
||||||
|
|
||||||
#define m 4
|
|
||||||
#define n 4
|
|
||||||
|
|
||||||
void
|
void
|
||||||
test_rand_mat4(mat4 dest) {
|
test_rand_mat4(mat4 dest) {
|
||||||
glm_mat4_copy(GLM_MAT4_IDENTITY, dest);
|
glm_mat4_copy(GLM_MAT4_IDENTITY, dest);
|
||||||
|
|
||||||
srand((unsigned int)time(NULL));
|
|
||||||
|
|
||||||
/* random position */
|
/* random position */
|
||||||
dest[3][0] = drand48();
|
dest[3][0] = drand48();
|
||||||
dest[3][1] = drand48();
|
dest[3][1] = drand48();
|
||||||
dest[3][2] = drand48();
|
dest[3][2] = drand48();
|
||||||
|
|
||||||
/* random rotatation around random axis with random angle */
|
/* random rotatation around random axis with random angle */
|
||||||
glm_rotate(dest, drand48(), (vec3){drand48(), drand48(), drand48()});
|
glm_rotate(dest, drand48(), (vec3){drand48(), drand48(), drand48()});
|
||||||
|
|
||||||
/* random scale */
|
/* random scale */
|
||||||
/* glm_scale(dest, (vec3){drand48(), drand48(), drand48()}); */
|
/* glm_scale(dest, (vec3){drand48(), drand48(), drand48()}); */
|
||||||
}
|
}
|
||||||
@@ -32,24 +26,28 @@ void
|
|||||||
test_rand_mat3(mat3 dest) {
|
test_rand_mat3(mat3 dest) {
|
||||||
mat4 m4;
|
mat4 m4;
|
||||||
|
|
||||||
srand((unsigned int)time(NULL));
|
|
||||||
|
|
||||||
/* random rotatation around random axis with random angle */
|
/* random rotatation around random axis with random angle */
|
||||||
glm_rotate_make(m4, drand48(), (vec3){drand48(), drand48(), drand48()});
|
glm_rotate_make(m4, drand48(), (vec3){drand48(), drand48(), drand48()});
|
||||||
glm_mat4_pick3(m4, dest);
|
glm_mat4_pick3(m4, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
test_rand_vec3(vec3 dest) {
|
test_rand_mat2(mat2 dest) {
|
||||||
srand((unsigned int)time(NULL));
|
dest[0][0] = drand48();
|
||||||
|
dest[0][1] = drand48();
|
||||||
|
dest[1][0] = drand48();
|
||||||
|
dest[1][1] = drand48();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
test_rand_vec3(vec3 dest) {
|
||||||
dest[0] = drand48();
|
dest[0] = drand48();
|
||||||
dest[1] = drand48();
|
dest[1] = drand48();
|
||||||
dest[2] = drand48();
|
dest[2] = drand48();
|
||||||
}
|
}
|
||||||
|
|
||||||
vec3s
|
vec3s
|
||||||
test_rand_vec3s() {
|
test_rand_vec3s(void) {
|
||||||
vec3s r;
|
vec3s r;
|
||||||
test_rand_vec3(r.raw);
|
test_rand_vec3(r.raw);
|
||||||
return r;
|
return r;
|
||||||
@@ -57,8 +55,6 @@ test_rand_vec3s() {
|
|||||||
|
|
||||||
void
|
void
|
||||||
test_rand_vec4(vec4 dest) {
|
test_rand_vec4(vec4 dest) {
|
||||||
srand((unsigned int)time(NULL));
|
|
||||||
|
|
||||||
dest[0] = drand48();
|
dest[0] = drand48();
|
||||||
dest[1] = drand48();
|
dest[1] = drand48();
|
||||||
dest[2] = drand48();
|
dest[2] = drand48();
|
||||||
@@ -66,7 +62,7 @@ test_rand_vec4(vec4 dest) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
vec4s
|
vec4s
|
||||||
test_rand_vec4s() {
|
test_rand_vec4s(void) {
|
||||||
vec4s r;
|
vec4s r;
|
||||||
test_rand_vec4(r.raw);
|
test_rand_vec4(r.raw);
|
||||||
return r;
|
return r;
|
||||||
@@ -74,97 +70,272 @@ test_rand_vec4s() {
|
|||||||
|
|
||||||
float
|
float
|
||||||
test_rand(void) {
|
test_rand(void) {
|
||||||
srand((unsigned int)time(NULL));
|
|
||||||
return drand48();
|
return drand48();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
test_rand_quat(versor q) {
|
test_rand_quat(versor q) {
|
||||||
srand((unsigned int)time(NULL));
|
|
||||||
|
|
||||||
glm_quat(q, drand48(), drand48(), drand48(), drand48());
|
glm_quat(q, drand48(), drand48(), drand48(), drand48());
|
||||||
glm_quat_normalize(q);
|
glm_quat_normalize(q);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
test_status_t
|
||||||
test_assert_mat4_eq(mat4 m1, mat4 m2) {
|
test_assert_mat4_eq(mat4 m1, mat4 m2) {
|
||||||
int i, j, k;
|
int i, j;
|
||||||
|
|
||||||
for (i = 0; i < m; i++) {
|
for (i = 0; i < 4; i++) {
|
||||||
for (j = 0; j < n; j++) {
|
for (j = 0; j < 4; j++) {
|
||||||
for (k = 0; k < m; k++)
|
ASSERT(fabsf(m1[i][j] - m2[i][j]) <= 0.0000009)
|
||||||
assert_true(fabsf(m1[i][j] - m2[i][j]) <= 0.0000009);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
test_status_t
|
||||||
|
test_assert_mat4_eqt(mat4 m1, mat4 m2) {
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
for (i = 0; i < 4; i++) {
|
||||||
|
for (j = 0; j < 4; j++) {
|
||||||
|
ASSERT(fabsf(m1[j][i] - m2[i][j]) <= 0.0000009)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
test_status_t
|
||||||
test_assert_mat4_eq2(mat4 m1, mat4 m2, float eps) {
|
test_assert_mat4_eq2(mat4 m1, mat4 m2, float eps) {
|
||||||
int i, j, k;
|
int i, j;
|
||||||
|
|
||||||
for (i = 0; i < m; i++) {
|
for (i = 0; i < 4; i++) {
|
||||||
for (j = 0; j < n; j++) {
|
for (j = 0; j < 4; j++) {
|
||||||
for (k = 0; k < m; k++)
|
ASSERT(fabsf(m1[i][j] - m2[i][j]) <= eps);
|
||||||
assert_true(fabsf(m1[i][j] - m2[i][j]) <= eps);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
test_status_t
|
||||||
|
test_assert_mat2_eqt(mat2 m1, mat2 m2) {
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
for (i = 0; i < 2; i++) {
|
||||||
|
for (j = 0; j < 2; j++) {
|
||||||
|
ASSERT(fabsf(m1[j][i] - m2[i][j]) <= 0.0000009);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
test_status_t
|
||||||
|
test_assert_mat2_eq(mat2 m1, mat2 m2) {
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
for (i = 0; i < 2; i++) {
|
||||||
|
for (j = 0; j < 2; j++) {
|
||||||
|
ASSERT(fabsf(m1[i][j] - m2[i][j]) <= 0.0000009);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
test_status_t
|
||||||
|
test_assert_mat2_eq_identity(mat2 m2) {
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
for (i = 0; i < 2; i++) {
|
||||||
|
for (j = 0; j < 2; j++) {
|
||||||
|
if (i == j) {
|
||||||
|
ASSERT(test_eq(m2[i][j], 1.0f))
|
||||||
|
} else {
|
||||||
|
ASSERT(test_eq(m2[i][j], 0.0f))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
test_status_t
|
||||||
|
test_assert_mat2_eq_zero(mat2 m2) {
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
for (i = 0; i < 2; i++) {
|
||||||
|
for (j = 0; j < 2; j++) {
|
||||||
|
ASSERT(test_eq(m2[i][j], 0.0f))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
test_status_t
|
||||||
test_assert_mat3_eq(mat3 m1, mat3 m2) {
|
test_assert_mat3_eq(mat3 m1, mat3 m2) {
|
||||||
int i, j, k;
|
int i, j;
|
||||||
|
|
||||||
for (i = 0; i < 3; i++) {
|
for (i = 0; i < 3; i++) {
|
||||||
for (j = 0; j < 3; j++) {
|
for (j = 0; j < 3; j++) {
|
||||||
for (k = 0; k < 3; k++)
|
ASSERT(fabsf(m1[i][j] - m2[i][j]) <= 0.0000009);
|
||||||
assert_true(fabsf(m1[i][j] - m2[i][j]) <= 0.0000009);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
test_status_t
|
||||||
|
test_assert_mat3_eqt(mat3 m1, mat3 m2) {
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
for (i = 0; i < 3; i++) {
|
||||||
|
for (j = 0; j < 3; j++) {
|
||||||
|
ASSERT(fabsf(m1[j][i] - m2[i][j]) <= 0.0000009);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
test_status_t
|
||||||
|
test_assert_mat3_eq_identity(mat3 m3) {
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
for (i = 0; i < 3; i++) {
|
||||||
|
for (j = 0; j < 3; j++) {
|
||||||
|
if (i == j) {
|
||||||
|
ASSERT(test_eq(m3[i][j], 1.0f))
|
||||||
|
} else {
|
||||||
|
ASSERT(test_eq(m3[i][j], 0.0f))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
test_status_t
|
||||||
|
test_assert_mat3_eq_zero(mat3 m3) {
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
for (i = 0; i < 3; i++) {
|
||||||
|
for (j = 0; j < 3; j++) {
|
||||||
|
ASSERT(test_eq(m3[i][j], 0.0f))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
test_status_t
|
||||||
|
test_assert_mat4_eq_identity(mat4 m4) {
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
for (i = 0; i < 4; i++) {
|
||||||
|
for (j = 0; j < 4; j++) {
|
||||||
|
if (i == j) {
|
||||||
|
ASSERT(test_eq(m4[i][j], 1.0f))
|
||||||
|
} else {
|
||||||
|
ASSERT(test_eq(m4[i][j], 0.0f))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
test_status_t
|
||||||
|
test_assert_mat4_eq_zero(mat4 m4) {
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
for (i = 0; i < 4; i++) {
|
||||||
|
for (j = 0; j < 4; j++) {
|
||||||
|
ASSERT(test_eq(m4[i][j], 0.0f))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
test_status_t
|
||||||
test_assert_eqf(float a, float b) {
|
test_assert_eqf(float a, float b) {
|
||||||
assert_true(fabsf(a - b) <= 0.000009); /* rounding errors */
|
ASSERT(fabsf(a - b) <= 0.000009); /* rounding errors */
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
test_status_t
|
||||||
|
test_assert_vec2_eq(vec2 v1, vec2 v2) {
|
||||||
|
ASSERT(fabsf(v1[0] - v2[0]) <= 0.000009); /* rounding errors */
|
||||||
|
ASSERT(fabsf(v1[1] - v2[1]) <= 0.000009);
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
test_status_t
|
||||||
test_assert_vec3_eq(vec3 v1, vec3 v2) {
|
test_assert_vec3_eq(vec3 v1, vec3 v2) {
|
||||||
assert_true(fabsf(v1[0] - v2[0]) <= 0.000009); /* rounding errors */
|
ASSERT(fabsf(v1[0] - v2[0]) <= 0.000009); /* rounding errors */
|
||||||
assert_true(fabsf(v1[1] - v2[1]) <= 0.000009);
|
ASSERT(fabsf(v1[1] - v2[1]) <= 0.000009);
|
||||||
assert_true(fabsf(v1[2] - v2[2]) <= 0.000009);
|
ASSERT(fabsf(v1[2] - v2[2]) <= 0.000009);
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
test_status_t
|
||||||
test_assert_vec3s_eq(vec3s v1, vec3s v2) {
|
test_assert_vec3s_eq(vec3s v1, vec3s v2) {
|
||||||
test_assert_vec3_eq(v1.raw, v2.raw);
|
test_assert_vec3_eq(v1.raw, v2.raw);
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
test_status_t
|
||||||
test_assert_vec4_eq(vec4 v1, vec4 v2) {
|
test_assert_vec4_eq(vec4 v1, vec4 v2) {
|
||||||
assert_true(fabsf(v1[0] - v2[0]) <= 0.000009); /* rounding errors */
|
ASSERT(fabsf(v1[0] - v2[0]) <= 0.000009); /* rounding errors */
|
||||||
assert_true(fabsf(v1[1] - v2[1]) <= 0.000009);
|
ASSERT(fabsf(v1[1] - v2[1]) <= 0.000009);
|
||||||
assert_true(fabsf(v1[2] - v2[2]) <= 0.000009);
|
ASSERT(fabsf(v1[2] - v2[2]) <= 0.000009);
|
||||||
assert_true(fabsf(v1[3] - v2[3]) <= 0.000009);
|
ASSERT(fabsf(v1[3] - v2[3]) <= 0.000009);
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
test_status_t
|
||||||
test_assert_vec4s_eq(vec4s v1, vec4s v2) {
|
test_assert_vec4s_eq(vec4s v1, vec4s v2) {
|
||||||
test_assert_vec4_eq(v1.raw, v2.raw);
|
test_assert_vec4_eq(v1.raw, v2.raw);
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
test_status_t
|
||||||
test_assert_quat_eq_abs(versor v1, versor v2) {
|
test_assert_quat_eq_abs(versor v1, versor v2) {
|
||||||
assert_true(fabsf(fabsf(v1[0]) - fabsf(v2[0])) <= 0.0009); /* rounding errors */
|
ASSERT(fabsf(fabsf(v1[0]) - fabsf(v2[0])) <= 0.0009); /* rounding errors */
|
||||||
assert_true(fabsf(fabsf(v1[1]) - fabsf(v2[1])) <= 0.0009);
|
ASSERT(fabsf(fabsf(v1[1]) - fabsf(v2[1])) <= 0.0009);
|
||||||
assert_true(fabsf(fabsf(v1[2]) - fabsf(v2[2])) <= 0.0009);
|
ASSERT(fabsf(fabsf(v1[2]) - fabsf(v2[2])) <= 0.0009);
|
||||||
assert_true(fabsf(fabsf(v1[3]) - fabsf(v2[3])) <= 0.0009);
|
ASSERT(fabsf(fabsf(v1[3]) - fabsf(v2[3])) <= 0.0009);
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
test_status_t
|
||||||
test_assert_quat_eq(versor v1, versor v2) {
|
test_assert_quat_eq(versor v1, versor v2) {
|
||||||
assert_true(fabsf(v1[0] - v2[0]) <= 0.000009); /* rounding errors */
|
ASSERT(fabsf(v1[0] - v2[0]) <= 0.000009); /* rounding errors */
|
||||||
assert_true(fabsf(v1[1] - v2[1]) <= 0.000009);
|
ASSERT(fabsf(v1[1] - v2[1]) <= 0.000009);
|
||||||
assert_true(fabsf(v1[2] - v2[2]) <= 0.000009);
|
ASSERT(fabsf(v1[2] - v2[2]) <= 0.000009);
|
||||||
assert_true(fabsf(v1[3] - v2[3]) <= 0.000009);
|
ASSERT(fabsf(v1[3] - v2[3]) <= 0.000009);
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
}
|
}
|
||||||
|
|
||||||
|
test_status_t
|
||||||
|
test_assert_quat_eq_identity(versor q) {
|
||||||
|
versor p = GLM_QUAT_IDENTITY_INIT;
|
||||||
|
|
||||||
|
ASSERT(fabsf(q[0] - p[0]) <= 0.000009); /* rounding errors */
|
||||||
|
ASSERT(fabsf(q[1] - p[1]) <= 0.000009);
|
||||||
|
ASSERT(fabsf(q[2] - p[2]) <= 0.000009);
|
||||||
|
ASSERT(fabsf(q[3] - p[3]) <= 0.000009);
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|||||||
@@ -8,20 +8,7 @@
|
|||||||
#ifndef test_common_h
|
#ifndef test_common_h
|
||||||
#define test_common_h
|
#define test_common_h
|
||||||
|
|
||||||
#include <stdarg.h>
|
#include "../include/common.h"
|
||||||
#include <stdint.h>
|
|
||||||
#include <stddef.h>
|
|
||||||
#include <setjmp.h>
|
|
||||||
#include <cmocka.h>
|
|
||||||
#include <time.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <math.h>
|
|
||||||
#include <float.h>
|
|
||||||
#include <stdbool.h>
|
|
||||||
|
|
||||||
#include <cglm/cglm.h>
|
|
||||||
#include <cglm/struct.h>
|
|
||||||
#include <cglm/call.h>
|
|
||||||
|
|
||||||
void
|
void
|
||||||
test_rand_mat4(mat4 dest);
|
test_rand_mat4(mat4 dest);
|
||||||
@@ -30,33 +17,72 @@ void
|
|||||||
test_rand_mat3(mat3 dest);
|
test_rand_mat3(mat3 dest);
|
||||||
|
|
||||||
void
|
void
|
||||||
|
test_rand_mat2(mat2 dest);
|
||||||
|
|
||||||
|
test_status_t
|
||||||
test_assert_eqf(float a, float b);
|
test_assert_eqf(float a, float b);
|
||||||
|
|
||||||
void
|
test_status_t
|
||||||
test_assert_mat4_eq(mat4 m1, mat4 m2);
|
test_assert_mat4_eq(mat4 m1, mat4 m2);
|
||||||
|
|
||||||
void
|
test_status_t
|
||||||
|
test_assert_mat4_eqt(mat4 m1, mat4 m2);
|
||||||
|
|
||||||
|
test_status_t
|
||||||
test_assert_mat4_eq2(mat4 m1, mat4 m2, float eps);
|
test_assert_mat4_eq2(mat4 m1, mat4 m2, float eps);
|
||||||
|
|
||||||
void
|
test_status_t
|
||||||
|
test_assert_mat4_eq_identity(mat4 m4);
|
||||||
|
|
||||||
|
test_status_t
|
||||||
|
test_assert_mat4_eq_zero(mat4 m4);
|
||||||
|
|
||||||
|
test_status_t
|
||||||
|
test_assert_mat2_eqt(mat2 m1, mat2 m2);
|
||||||
|
|
||||||
|
test_status_t
|
||||||
|
test_assert_mat2_eq(mat2 m1, mat2 m2);
|
||||||
|
|
||||||
|
test_status_t
|
||||||
|
test_assert_mat2_eq_identity(mat2 m2);
|
||||||
|
|
||||||
|
test_status_t
|
||||||
|
test_assert_mat2_eq_zero(mat2 m2);
|
||||||
|
|
||||||
|
test_status_t
|
||||||
test_assert_mat3_eq(mat3 m1, mat3 m2);
|
test_assert_mat3_eq(mat3 m1, mat3 m2);
|
||||||
|
|
||||||
void
|
test_status_t
|
||||||
|
test_assert_vec2_eq(vec2 v1, vec2 v2);
|
||||||
|
|
||||||
|
test_status_t
|
||||||
|
test_assert_mat3_eqt(mat3 m1, mat3 m2);
|
||||||
|
|
||||||
|
test_status_t
|
||||||
|
test_assert_mat3_eq_identity(mat3 m3);
|
||||||
|
|
||||||
|
test_status_t
|
||||||
|
test_assert_mat3_eq_zero(mat3 m3);
|
||||||
|
|
||||||
|
test_status_t
|
||||||
test_assert_vec3_eq(vec3 v1, vec3 v2);
|
test_assert_vec3_eq(vec3 v1, vec3 v2);
|
||||||
|
|
||||||
void
|
test_status_t
|
||||||
test_assert_vec3s_eq(vec3s v1, vec3s v2);
|
test_assert_vec3s_eq(vec3s v1, vec3s v2);
|
||||||
|
|
||||||
void
|
test_status_t
|
||||||
test_assert_vec4_eq(vec4 v1, vec4 v2);
|
test_assert_vec4_eq(vec4 v1, vec4 v2);
|
||||||
|
|
||||||
void
|
test_status_t
|
||||||
test_assert_vec4s_eq(vec4s v1, vec4s v2);
|
test_assert_vec4s_eq(vec4s v1, vec4s v2);
|
||||||
|
|
||||||
void
|
test_status_t
|
||||||
test_assert_quat_eq(versor v1, versor v2);
|
test_assert_quat_eq(versor v1, versor v2);
|
||||||
|
|
||||||
void
|
test_status_t
|
||||||
|
test_assert_quat_eq_identity(versor q) ;
|
||||||
|
|
||||||
|
test_status_t
|
||||||
test_assert_quat_eq_abs(versor v1, versor v2);
|
test_assert_quat_eq_abs(versor v1, versor v2);
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -77,4 +103,16 @@ test_rand(void);
|
|||||||
void
|
void
|
||||||
test_rand_quat(versor q);
|
test_rand_quat(versor q);
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
bool
|
||||||
|
test_eq(float a, float b) {
|
||||||
|
return fabsf(a - b) <= 1e-6;
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
bool
|
||||||
|
test_eq_th(float a, float b, float th) {
|
||||||
|
return fabsf(a - b) <= th;
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* test_common_h */
|
#endif /* test_common_h */
|
||||||
|
|||||||
@@ -7,10 +7,9 @@
|
|||||||
|
|
||||||
#include "test_common.h"
|
#include "test_common.h"
|
||||||
|
|
||||||
void
|
TEST_IMPL(euler) {
|
||||||
test_euler(void **state) {
|
mat4 rot1, rot2;
|
||||||
mat4 rot1, rot2;
|
vec3 inAngles, outAngles;
|
||||||
vec3 inAngles, outAngles;
|
|
||||||
|
|
||||||
inAngles[0] = glm_rad(-45.0f); /* X angle */
|
inAngles[0] = glm_rad(-45.0f); /* X angle */
|
||||||
inAngles[1] = glm_rad(88.0f); /* Y angle */
|
inAngles[1] = glm_rad(88.0f); /* Y angle */
|
||||||
@@ -22,11 +21,11 @@ test_euler(void **state) {
|
|||||||
glmc_euler_angles(rot1, outAngles);
|
glmc_euler_angles(rot1, outAngles);
|
||||||
|
|
||||||
/* angles must be equal in that range */
|
/* angles must be equal in that range */
|
||||||
test_assert_vec3_eq(inAngles, outAngles);
|
ASSERTIFY(test_assert_vec3_eq(inAngles, outAngles))
|
||||||
|
|
||||||
/* matrices must be equal */
|
/* matrices must be equal */
|
||||||
glmc_euler_xyz(outAngles, rot2);
|
glmc_euler_xyz(outAngles, rot2);
|
||||||
test_assert_mat4_eq(rot1, rot2);
|
ASSERTIFY(test_assert_mat4_eq(rot1, rot2))
|
||||||
|
|
||||||
/* change range */
|
/* change range */
|
||||||
inAngles[0] = glm_rad(-145.0f); /* X angle */
|
inAngles[0] = glm_rad(-145.0f); /* X angle */
|
||||||
@@ -40,5 +39,7 @@ test_euler(void **state) {
|
|||||||
|
|
||||||
/* matrices must be equal */
|
/* matrices must be equal */
|
||||||
glmc_euler_xyz(outAngles, rot2);
|
glmc_euler_xyz(outAngles, rot2);
|
||||||
test_assert_mat4_eq(rot1, rot2);
|
ASSERTIFY(test_assert_mat4_eq(rot1, rot2))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,48 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c), Recep Aslantas.
|
|
||||||
* MIT License (MIT), http://opensource.org/licenses/MIT
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "test_common.h"
|
|
||||||
#include "test_tests.h"
|
|
||||||
|
|
||||||
int
|
|
||||||
main(int argc, const char * argv[]) {
|
|
||||||
const struct CMUnitTest tests[] = {
|
|
||||||
/* mat4 */
|
|
||||||
cmocka_unit_test(test_mat4),
|
|
||||||
|
|
||||||
/* mat3 */
|
|
||||||
cmocka_unit_test(test_mat3),
|
|
||||||
|
|
||||||
/* camera */
|
|
||||||
cmocka_unit_test(test_camera_lookat),
|
|
||||||
cmocka_unit_test(test_camera_decomp),
|
|
||||||
|
|
||||||
/* project */
|
|
||||||
cmocka_unit_test(test_project),
|
|
||||||
|
|
||||||
/* vector */
|
|
||||||
cmocka_unit_test(test_clamp),
|
|
||||||
|
|
||||||
/* euler */
|
|
||||||
cmocka_unit_test(test_euler),
|
|
||||||
|
|
||||||
/* quaternion */
|
|
||||||
cmocka_unit_test(test_quat),
|
|
||||||
|
|
||||||
/* vec4 */
|
|
||||||
cmocka_unit_test(test_vec4),
|
|
||||||
|
|
||||||
/* vec3 */
|
|
||||||
cmocka_unit_test(test_vec3),
|
|
||||||
|
|
||||||
/* affine */
|
|
||||||
cmocka_unit_test(test_affine),
|
|
||||||
|
|
||||||
/* bezier */
|
|
||||||
cmocka_unit_test(test_bezier)
|
|
||||||
};
|
|
||||||
|
|
||||||
return cmocka_run_group_tests(tests, NULL, NULL);
|
|
||||||
}
|
|
||||||
286
test/src/test_mat2.h
Normal file
286
test/src/test_mat2.h
Normal file
@@ -0,0 +1,286 @@
|
|||||||
|
/*
|
||||||
|
* 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"
|
||||||
|
|
||||||
|
#define A_MATRIX2x2 {{1,2},{5,6}}
|
||||||
|
|
||||||
|
#ifndef CGLM_TEST_MAT2_ONCE
|
||||||
|
#define CGLM_TEST_MAT2_ONCE
|
||||||
|
|
||||||
|
TEST_IMPL(MACRO_GLM_MAT2_IDENTITY_INIT) {
|
||||||
|
mat2 m = GLM_MAT2_IDENTITY_INIT;
|
||||||
|
|
||||||
|
ASSERT(test_eq(m[0][0], 1.0f))
|
||||||
|
ASSERT(test_eq(m[0][1], 0.0f))
|
||||||
|
ASSERT(test_eq(m[1][0], 0.0f))
|
||||||
|
ASSERT(test_eq(m[1][1], 1.0f))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(MACRO_GLM_MAT2_ZERO_INIT) {
|
||||||
|
mat2 m = GLM_MAT2_ZERO_INIT;
|
||||||
|
|
||||||
|
ASSERT(test_eq(m[0][0], 0.0f))
|
||||||
|
ASSERT(test_eq(m[0][1], 0.0f))
|
||||||
|
ASSERT(test_eq(m[1][0], 0.0f))
|
||||||
|
ASSERT(test_eq(m[1][1], 0.0f))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(MACRO_GLM_MAT2_IDENTITY) {
|
||||||
|
ASSERT(test_eq(GLM_MAT2_IDENTITY[0][0], 1.0f))
|
||||||
|
ASSERT(test_eq(GLM_MAT2_IDENTITY[0][1], 0.0f))
|
||||||
|
ASSERT(test_eq(GLM_MAT2_IDENTITY[1][0], 0.0f))
|
||||||
|
ASSERT(test_eq(GLM_MAT2_IDENTITY[1][1], 1.0f))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(MACRO_GLM_MAT2_ZERO) {
|
||||||
|
ASSERT(test_eq(GLM_MAT2_ZERO[0][0], 0.0f))
|
||||||
|
ASSERT(test_eq(GLM_MAT2_ZERO[0][1], 0.0f))
|
||||||
|
ASSERT(test_eq(GLM_MAT2_ZERO[1][0], 0.0f))
|
||||||
|
ASSERT(test_eq(GLM_MAT2_ZERO[1][1], 0.0f))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* CGLM_TEST_MAT2_ONCE */
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, mat2_copy) {
|
||||||
|
mat2 m1 = A_MATRIX2x2;
|
||||||
|
mat2 m2 = GLM_MAT2_IDENTITY_INIT;
|
||||||
|
|
||||||
|
GLM(mat2_copy)(m1, m2);
|
||||||
|
|
||||||
|
test_assert_mat2_eq(m1, m2);
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, mat2_identity) {
|
||||||
|
mat2 m1 = GLM_MAT2_IDENTITY_INIT;
|
||||||
|
mat2 m2 = GLM_MAT2_IDENTITY_INIT;
|
||||||
|
mat2 m3;
|
||||||
|
|
||||||
|
GLM(mat2_identity)(m3);
|
||||||
|
|
||||||
|
ASSERTIFY(test_assert_mat2_eq_identity(m1))
|
||||||
|
ASSERTIFY(test_assert_mat2_eq_identity(m2))
|
||||||
|
ASSERTIFY(test_assert_mat2_eq_identity(m3))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, mat2_identity_array) {
|
||||||
|
int i, count;
|
||||||
|
mat2 matrices[4] = {
|
||||||
|
A_MATRIX2x2,
|
||||||
|
A_MATRIX2x2,
|
||||||
|
A_MATRIX2x2,
|
||||||
|
A_MATRIX2x2
|
||||||
|
};
|
||||||
|
|
||||||
|
count = 4;
|
||||||
|
|
||||||
|
GLM(mat2_identity_array)(matrices, count);
|
||||||
|
|
||||||
|
for (i = 0; i < count; i++) {
|
||||||
|
ASSERTIFY(test_assert_mat2_eq_identity(matrices[i]))
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, mat2_zero) {
|
||||||
|
mat2 m1 = GLM_MAT2_ZERO_INIT;
|
||||||
|
mat2 m2 = GLM_MAT2_ZERO_INIT;
|
||||||
|
mat2 m3;
|
||||||
|
|
||||||
|
GLM(mat2_zero)(m3);
|
||||||
|
|
||||||
|
ASSERTIFY(test_assert_mat2_eq_zero(m1))
|
||||||
|
ASSERTIFY(test_assert_mat2_eq_zero(m2))
|
||||||
|
ASSERTIFY(test_assert_mat2_eq_zero(m3))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, mat2_mul) {
|
||||||
|
mat2 m1 = GLM_MAT2_IDENTITY_INIT;
|
||||||
|
mat2 m2 = GLM_MAT2_IDENTITY_INIT;
|
||||||
|
mat2 m3;
|
||||||
|
mat2 m4 = GLM_MAT2_ZERO_INIT;
|
||||||
|
int i, j, k;
|
||||||
|
|
||||||
|
/* test random matrices */
|
||||||
|
/* random matrices */
|
||||||
|
test_rand_mat2(m1);
|
||||||
|
test_rand_mat2(m2);
|
||||||
|
|
||||||
|
GLM(mat2_mul)(m1, m2, m3);
|
||||||
|
for (i = 0; i < 2; i++) {
|
||||||
|
for (j = 0; j < 2; j++) {
|
||||||
|
for (k = 0; k < 2; k++)
|
||||||
|
/* column-major */
|
||||||
|
m4[i][j] += m1[k][j] * m2[i][k];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ASSERTIFY(test_assert_mat2_eq(m3, m4))
|
||||||
|
|
||||||
|
/* test pre compiled */
|
||||||
|
GLM(mat2_mul)(m1, m2, m3);
|
||||||
|
ASSERTIFY(test_assert_mat2_eq(m3, m4))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, mat2_transpose_to) {
|
||||||
|
mat2 mat = A_MATRIX2x2;
|
||||||
|
mat2 m1;
|
||||||
|
|
||||||
|
GLM(mat2_transpose_to)(mat, m1);
|
||||||
|
|
||||||
|
ASSERTIFY(test_assert_mat2_eqt(mat, m1))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, mat2_transpose) {
|
||||||
|
mat2 mat = A_MATRIX2x2;
|
||||||
|
mat2 m1;
|
||||||
|
|
||||||
|
GLM(mat2_copy)(mat, m1);
|
||||||
|
GLM(mat2_transpose)(m1);
|
||||||
|
|
||||||
|
ASSERTIFY(test_assert_mat2_eqt(mat, m1))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, mat2_mulv) {
|
||||||
|
vec2 res;
|
||||||
|
mat2 mat = A_MATRIX2x2;
|
||||||
|
vec2 v = {11.0f, 21.0f};
|
||||||
|
int i;
|
||||||
|
|
||||||
|
GLM(mat2_mulv)(mat, v, res);
|
||||||
|
|
||||||
|
for (i = 0; i < 2; i++) {
|
||||||
|
ASSERT(test_eq(res[i], v[0] * mat[0][i] + v[1] * mat[1][i]))
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, mat2_trace) {
|
||||||
|
mat2 mat = A_MATRIX2x2;
|
||||||
|
float trace;
|
||||||
|
|
||||||
|
trace = GLM(mat2_trace)(mat);
|
||||||
|
|
||||||
|
ASSERT(test_eq(trace, mat[0][0] + mat[1][1]))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, mat2_scale) {
|
||||||
|
mat2 m1 = A_MATRIX2x2;
|
||||||
|
mat2 m2 = A_MATRIX2x2;
|
||||||
|
int i, j, scale;
|
||||||
|
|
||||||
|
scale = rand() % 100;
|
||||||
|
|
||||||
|
GLM(mat2_scale)(m1, (float)scale);
|
||||||
|
|
||||||
|
for (i = 0; i < 2; i++) {
|
||||||
|
for (j = 0; j < 2; j++) {
|
||||||
|
ASSERT(test_eq(m1[i][j], m2[i][j] * scale))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, mat2_det) {
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, mat2_inv) {
|
||||||
|
mat2 m1 = GLM_MAT2_IDENTITY_INIT;
|
||||||
|
mat2 m2 = GLM_MAT2_IDENTITY_INIT;
|
||||||
|
mat2 m3;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
m1[0][0] = 41.0f;
|
||||||
|
m1[0][1] = 0.0f;
|
||||||
|
m1[1][0] = 0.0f;
|
||||||
|
m1[1][1] = 70.0f;
|
||||||
|
|
||||||
|
for (i = 0; i < 10000; i++) {
|
||||||
|
/* test inverse precise */
|
||||||
|
GLM(mat2_inv)(m1, m2);
|
||||||
|
GLM(mat2_inv)(m2, m3);
|
||||||
|
|
||||||
|
ASSERTIFY(test_assert_mat2_eq(m1, m3))
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, mat2_swap_col) {
|
||||||
|
mat2 m1 = A_MATRIX2x2;
|
||||||
|
mat2 m2 = A_MATRIX2x2;
|
||||||
|
|
||||||
|
GLM(mat2_swap_col)(m1, 0, 1);
|
||||||
|
|
||||||
|
ASSERTIFY(test_assert_vec2_eq(m1[0], m2[1]))
|
||||||
|
ASSERTIFY(test_assert_vec2_eq(m1[1], m2[0]))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, mat2_swap_row) {
|
||||||
|
mat2 m1 = A_MATRIX2x2;
|
||||||
|
mat2 m2 = A_MATRIX2x2;
|
||||||
|
|
||||||
|
GLM(mat2_swap_row)(m1, 0, 1);
|
||||||
|
|
||||||
|
ASSERT(test_eq(m1[0][0], m2[0][1]))
|
||||||
|
ASSERT(test_eq(m1[0][1], m2[0][0]))
|
||||||
|
|
||||||
|
ASSERT(test_eq(m1[1][0], m2[1][1]))
|
||||||
|
ASSERT(test_eq(m1[1][1], m2[1][0]))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, mat2_rmc) {
|
||||||
|
mat2 mat = A_MATRIX2x2;
|
||||||
|
vec2 v = {11.0f, 12.0f};
|
||||||
|
vec2 v1;
|
||||||
|
float r1, r2;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
r1 = GLM(mat2_rmc)(v, mat, v);
|
||||||
|
|
||||||
|
for (i = 0; i < 2; i++) {
|
||||||
|
v1[i] = v[0] * mat[i][0] + v[1] * mat[i][1];
|
||||||
|
}
|
||||||
|
|
||||||
|
r2 = v[0] * v1[0] + v[1] * v1[1];
|
||||||
|
|
||||||
|
ASSERT(test_eq(r1, r2))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef A_MATRIX2x2
|
||||||
@@ -1,58 +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"
|
|
||||||
|
|
||||||
#define m 3
|
|
||||||
#define n 3
|
|
||||||
|
|
||||||
void
|
|
||||||
test_mat3(void **state) {
|
|
||||||
mat3 m1 = GLM_MAT3_IDENTITY_INIT;
|
|
||||||
mat3 m2 = GLM_MAT3_IDENTITY_INIT;
|
|
||||||
mat3 m3;
|
|
||||||
mat3 m4 = GLM_MAT3_ZERO_INIT;
|
|
||||||
mat3 m5;
|
|
||||||
int i, j, k;
|
|
||||||
|
|
||||||
/* test identity matrix multiplication */
|
|
||||||
glmc_mat3_mul(m1, m2, m3);
|
|
||||||
for (i = 0; i < m; i++) {
|
|
||||||
for (j = 0; j < n; j++) {
|
|
||||||
if (i == j)
|
|
||||||
assert_true(glm_eq(m3[i][j], 1.0f));
|
|
||||||
else
|
|
||||||
assert_true(glm_eq(m3[i][j], 0.0f));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* test random matrices */
|
|
||||||
/* random matrices */
|
|
||||||
test_rand_mat3(m1);
|
|
||||||
test_rand_mat3(m2);
|
|
||||||
|
|
||||||
glmc_mat3_mul(m1, m2, m3);
|
|
||||||
for (i = 0; i < m; i++) {
|
|
||||||
for (j = 0; j < n; j++) {
|
|
||||||
for (k = 0; k < m; k++)
|
|
||||||
/* column-major */
|
|
||||||
m4[i][j] += m1[k][j] * m2[i][k];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
test_assert_mat3_eq(m3, m4);
|
|
||||||
|
|
||||||
for (i = 0; i < 100000; i++) {
|
|
||||||
test_rand_mat3(m3);
|
|
||||||
test_rand_mat3(m4);
|
|
||||||
|
|
||||||
/* test inverse precise */
|
|
||||||
glmc_mat3_inv(m3, m4);
|
|
||||||
glmc_mat3_inv(m4, m5);
|
|
||||||
test_assert_mat3_eq(m3, m5);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
311
test/src/test_mat3.h
Normal file
311
test/src/test_mat3.h
Normal file
@@ -0,0 +1,311 @@
|
|||||||
|
/*
|
||||||
|
* 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"
|
||||||
|
|
||||||
|
#define A_MATRIX {{1,2,3},{5,6,7},{9,10,11}}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, mat3_copy) {
|
||||||
|
mat3 m1 = A_MATRIX;
|
||||||
|
mat3 m2 = GLM_MAT3_IDENTITY_INIT;
|
||||||
|
|
||||||
|
GLM(mat3_copy)(m1, m2);
|
||||||
|
|
||||||
|
test_assert_mat3_eq(m1, m2);
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, mat3_identity) {
|
||||||
|
mat3 m1 = GLM_MAT3_IDENTITY_INIT;
|
||||||
|
mat3 m2 = GLM_MAT3_IDENTITY_INIT;
|
||||||
|
mat3 m3;
|
||||||
|
|
||||||
|
GLM(mat3_identity)(m3);
|
||||||
|
|
||||||
|
ASSERTIFY(test_assert_mat3_eq_identity(m1))
|
||||||
|
ASSERTIFY(test_assert_mat3_eq_identity(m2))
|
||||||
|
ASSERTIFY(test_assert_mat3_eq_identity(m3))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, mat3_identity_array) {
|
||||||
|
int i, count;
|
||||||
|
mat3 matrices[4] = {
|
||||||
|
A_MATRIX,
|
||||||
|
A_MATRIX,
|
||||||
|
A_MATRIX,
|
||||||
|
A_MATRIX
|
||||||
|
};
|
||||||
|
|
||||||
|
count = 4;
|
||||||
|
|
||||||
|
GLM(mat3_identity_array)(matrices, count);
|
||||||
|
|
||||||
|
for (i = 0; i < count; i++) {
|
||||||
|
ASSERTIFY(test_assert_mat3_eq_identity(matrices[i]))
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, mat3_zero) {
|
||||||
|
mat3 m1 = GLM_MAT3_ZERO_INIT;
|
||||||
|
mat3 m2 = GLM_MAT3_ZERO_INIT;
|
||||||
|
mat3 m3;
|
||||||
|
|
||||||
|
GLM(mat3_zero)(m3);
|
||||||
|
|
||||||
|
ASSERTIFY(test_assert_mat3_eq_zero(m1))
|
||||||
|
ASSERTIFY(test_assert_mat3_eq_zero(m2))
|
||||||
|
ASSERTIFY(test_assert_mat3_eq_zero(m3))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, mat3_mul) {
|
||||||
|
mat3 m1 = GLM_MAT3_IDENTITY_INIT;
|
||||||
|
mat3 m2 = GLM_MAT3_IDENTITY_INIT;
|
||||||
|
mat3 m3;
|
||||||
|
mat3 m4 = GLM_MAT3_ZERO_INIT;
|
||||||
|
int i, j, k;
|
||||||
|
|
||||||
|
/* test random matrices */
|
||||||
|
/* random matrices */
|
||||||
|
test_rand_mat3(m1);
|
||||||
|
test_rand_mat3(m2);
|
||||||
|
|
||||||
|
GLM(mat3_mul)(m1, m2, m3);
|
||||||
|
for (i = 0; i < 3; i++) {
|
||||||
|
for (j = 0; j < 3; j++) {
|
||||||
|
for (k = 0; k < 3; k++)
|
||||||
|
/* column-major */
|
||||||
|
m4[i][j] += m1[k][j] * m2[i][k];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ASSERTIFY(test_assert_mat3_eq(m3, m4))
|
||||||
|
|
||||||
|
/* test pre compiled */
|
||||||
|
GLM(mat3_mul)(m1, m2, m3);
|
||||||
|
ASSERTIFY(test_assert_mat3_eq(m3, m4))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, mat3_mulv) {
|
||||||
|
vec4 res;
|
||||||
|
mat3 mat = A_MATRIX;
|
||||||
|
vec4 v = {1.0f, 2.0f, 3.0f, 4.0f};
|
||||||
|
int i;
|
||||||
|
|
||||||
|
GLM(mat3_mulv)(mat, v, res);
|
||||||
|
|
||||||
|
for (i = 0; i < 3; i++) {
|
||||||
|
ASSERT(test_eq(res[i],
|
||||||
|
v[0] * mat[0][i]
|
||||||
|
+ v[1] * mat[1][i]
|
||||||
|
+ v[2] * mat[2][i]))
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, mat3_trace) {
|
||||||
|
mat3 mat = A_MATRIX;
|
||||||
|
float trace;
|
||||||
|
|
||||||
|
trace = GLM(mat3_trace)(mat);
|
||||||
|
|
||||||
|
ASSERT(test_eq(trace, mat[0][0] + mat[1][1] + mat[2][2]))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, mat3_quat) {
|
||||||
|
mat3 m1, m3;
|
||||||
|
mat4 m2;
|
||||||
|
versor q1, q2, q3;
|
||||||
|
vec3 axis1;
|
||||||
|
vec3 axis2 = {1.9f, 2.3f, 4.5f};
|
||||||
|
|
||||||
|
GLM(quat)(q1, GLM_PI_4f, 1.9f, 2.3f, 4.5f);
|
||||||
|
GLM(quat_mat3)(q1, m1);
|
||||||
|
GLM(mat3_quat)(m1, q2);
|
||||||
|
|
||||||
|
GLM(rotate_make)(m2, GLM_PI_4f, axis2);
|
||||||
|
GLM(mat3_quat)(m1, q3);
|
||||||
|
|
||||||
|
GLM(quat_axis)(q3, axis1);
|
||||||
|
|
||||||
|
GLM(vec3_normalize)(axis1);
|
||||||
|
GLM(vec3_normalize)(axis2);
|
||||||
|
|
||||||
|
GLM(mat4_pick3)(m2, m3);
|
||||||
|
|
||||||
|
ASSERT(test_eq(glm_quat_angle(q3), GLM_PI_4f))
|
||||||
|
ASSERTIFY(test_assert_vec3_eq(axis1, axis2))
|
||||||
|
ASSERTIFY(test_assert_vec4_eq(q1, q2))
|
||||||
|
ASSERTIFY(test_assert_mat3_eq(m1, m3))
|
||||||
|
ASSERTIFY(test_assert_vec4_eq(q1, q3))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, mat3_transpose_to) {
|
||||||
|
mat3 mat = A_MATRIX;
|
||||||
|
mat3 m1;
|
||||||
|
|
||||||
|
GLM(mat3_transpose_to)(mat, m1);
|
||||||
|
|
||||||
|
ASSERTIFY(test_assert_mat3_eqt(mat, m1))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, mat3_transpose) {
|
||||||
|
mat3 mat = A_MATRIX;
|
||||||
|
mat3 m1;
|
||||||
|
|
||||||
|
GLM(mat3_copy)(mat, m1);
|
||||||
|
GLM(mat3_transpose)(m1);
|
||||||
|
|
||||||
|
ASSERTIFY(test_assert_mat3_eqt(mat, m1))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, mat3_scale) {
|
||||||
|
mat3 m1 = A_MATRIX;
|
||||||
|
mat3 m2 = A_MATRIX;
|
||||||
|
int i, j, k, scale;
|
||||||
|
|
||||||
|
scale = rand() % 100;
|
||||||
|
|
||||||
|
GLM(mat3_scale)(m1, (float)scale);
|
||||||
|
|
||||||
|
for (i = 0; i < 3; i++) {
|
||||||
|
for (j = 0; j < 3; j++) {
|
||||||
|
for (k = 0; k < 3; k++)
|
||||||
|
ASSERT(test_eq(m1[i][j], m2[i][j] * scale))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, mat3_det) {
|
||||||
|
mat3 mat;
|
||||||
|
float a, b, c,
|
||||||
|
d, e, f,
|
||||||
|
g, h, i;
|
||||||
|
float det1, det2;
|
||||||
|
|
||||||
|
test_rand_mat3(mat);
|
||||||
|
|
||||||
|
a = mat[0][0]; b = mat[0][1]; c = mat[0][2];
|
||||||
|
d = mat[1][0]; e = mat[1][1]; f = mat[1][2];
|
||||||
|
g = mat[2][0]; h = mat[2][1]; i = mat[2][2];
|
||||||
|
|
||||||
|
det1 = a * (e * i - h * f) - d * (b * i - c * h) + g * (b * f - c * e);
|
||||||
|
det2 = GLM(mat3_det)(mat);
|
||||||
|
|
||||||
|
ASSERT(test_eq(det1, det2))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, mat3_inv) {
|
||||||
|
mat3 m1 = GLM_MAT3_IDENTITY_INIT;
|
||||||
|
mat3 m2 = GLM_MAT3_IDENTITY_INIT;
|
||||||
|
mat3 m3;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < 100000; i++) {
|
||||||
|
test_rand_mat3(m1);
|
||||||
|
test_rand_mat3(m2);
|
||||||
|
|
||||||
|
/* test inverse precise */
|
||||||
|
GLM(mat3_inv)(m1, m2);
|
||||||
|
GLM(mat3_inv)(m2, m3);
|
||||||
|
ASSERTIFY(test_assert_mat3_eq(m1, m3))
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, mat3_swap_col) {
|
||||||
|
mat3 m1 = A_MATRIX;
|
||||||
|
mat3 m2 = A_MATRIX;
|
||||||
|
|
||||||
|
GLM(mat3_swap_col)(m1, 0, 1);
|
||||||
|
|
||||||
|
ASSERTIFY(test_assert_vec3_eq(m1[0], m2[1]))
|
||||||
|
ASSERTIFY(test_assert_vec3_eq(m1[1], m2[0]))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, mat3_swap_row) {
|
||||||
|
mat3 m1 = A_MATRIX;
|
||||||
|
mat3 m2 = A_MATRIX;
|
||||||
|
|
||||||
|
GLM(mat3_swap_row)(m1, 0, 1);
|
||||||
|
|
||||||
|
ASSERT(test_eq(m1[0][0], m2[0][1]))
|
||||||
|
ASSERT(test_eq(m1[0][1], m2[0][0]))
|
||||||
|
ASSERT(test_eq(m1[0][2], m2[0][2]))
|
||||||
|
|
||||||
|
ASSERT(test_eq(m1[1][0], m2[1][1]))
|
||||||
|
ASSERT(test_eq(m1[1][1], m2[1][0]))
|
||||||
|
ASSERT(test_eq(m1[1][2], m2[1][2]))
|
||||||
|
|
||||||
|
ASSERT(test_eq(m1[2][0], m2[2][1]))
|
||||||
|
ASSERT(test_eq(m1[2][1], m2[2][0]))
|
||||||
|
ASSERT(test_eq(m1[2][2], m2[2][2]))
|
||||||
|
|
||||||
|
GLM(mat3_swap_row)(m1, 1, 2);
|
||||||
|
|
||||||
|
ASSERT(test_eq(m1[0][0], m2[0][1]))
|
||||||
|
ASSERT(test_eq(m1[0][1], m2[0][2]))
|
||||||
|
ASSERT(test_eq(m1[0][2], m2[0][0]))
|
||||||
|
|
||||||
|
ASSERT(test_eq(m1[1][0], m2[1][1]))
|
||||||
|
ASSERT(test_eq(m1[1][1], m2[1][2]))
|
||||||
|
ASSERT(test_eq(m1[1][2], m2[1][0]))
|
||||||
|
|
||||||
|
ASSERT(test_eq(m1[2][0], m2[2][1]))
|
||||||
|
ASSERT(test_eq(m1[2][1], m2[2][2]))
|
||||||
|
ASSERT(test_eq(m1[2][2], m2[2][0]))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, mat3_rmc) {
|
||||||
|
mat3 mat = A_MATRIX;
|
||||||
|
vec3 v = {11.0f, 12.0f, 13.0f};
|
||||||
|
vec3 v1;
|
||||||
|
float r1, r2;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
r1 = GLM(mat3_rmc)(v, mat, v);
|
||||||
|
|
||||||
|
for (i = 0; i < 3; i++) {
|
||||||
|
v1[i] = v[0] * mat[i][0]
|
||||||
|
+ v[1] * mat[i][1]
|
||||||
|
+ v[2] * mat[i][2];
|
||||||
|
}
|
||||||
|
|
||||||
|
r2 = v[0] * v1[0] + v[1] * v1[1] + v[2] * v1[2];
|
||||||
|
|
||||||
|
ASSERT(test_eq(r1, r2))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef A_MATRIX
|
||||||
@@ -1,94 +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"
|
|
||||||
|
|
||||||
#define m 4
|
|
||||||
#define n 4
|
|
||||||
|
|
||||||
void
|
|
||||||
test_mat4(void **state) {
|
|
||||||
mat4 m1 = GLM_MAT4_IDENTITY_INIT;
|
|
||||||
mat4 m2 = GLM_MAT4_IDENTITY_INIT;
|
|
||||||
mat4 m3;
|
|
||||||
mat4 m4 = GLM_MAT4_ZERO_INIT;
|
|
||||||
mat4 m5;
|
|
||||||
int i, j, k;
|
|
||||||
|
|
||||||
/* test identity matrix multiplication */
|
|
||||||
glm_mat4_mul(m1, m2, m3);
|
|
||||||
for (i = 0; i < m; i++) {
|
|
||||||
for (j = 0; j < n; j++) {
|
|
||||||
if (i == j)
|
|
||||||
assert_true(glm_eq(m3[i][j], 1.0f));
|
|
||||||
else
|
|
||||||
assert_true(glm_eq(m3[i][j], 0.0f));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* test random matrices */
|
|
||||||
/* random matrices */
|
|
||||||
test_rand_mat4(m1);
|
|
||||||
test_rand_mat4(m2);
|
|
||||||
|
|
||||||
glm_mat4_mul(m1, m2, m3);
|
|
||||||
for (i = 0; i < m; i++) {
|
|
||||||
for (j = 0; j < n; j++) {
|
|
||||||
for (k = 0; k < m; k++)
|
|
||||||
/* column-major */
|
|
||||||
m4[i][j] += m1[k][j] * m2[i][k];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
test_assert_mat4_eq(m3, m4);
|
|
||||||
|
|
||||||
/* test pre compiled */
|
|
||||||
glmc_mat4_mul(m1, m2, m3);
|
|
||||||
test_assert_mat4_eq(m3, m4);
|
|
||||||
|
|
||||||
for (i = 0; i < 100000; i++) {
|
|
||||||
test_rand_mat4(m3);
|
|
||||||
test_rand_mat4(m4);
|
|
||||||
|
|
||||||
/* test inverse precise */
|
|
||||||
glm_mat4_inv_precise(m3, m4);
|
|
||||||
glm_mat4_inv_precise(m4, m5);
|
|
||||||
test_assert_mat4_eq(m3, m5);
|
|
||||||
|
|
||||||
test_rand_mat4(m3);
|
|
||||||
test_rand_mat4(m4);
|
|
||||||
|
|
||||||
glmc_mat4_inv_precise(m3, m4);
|
|
||||||
glmc_mat4_inv_precise(m4, m5);
|
|
||||||
test_assert_mat4_eq(m3, m5);
|
|
||||||
|
|
||||||
/* test inverse rcp */
|
|
||||||
test_rand_mat4(m3);
|
|
||||||
test_rand_mat4(m4);
|
|
||||||
|
|
||||||
glm_mat4_inv_fast(m3, m4);
|
|
||||||
glm_mat4_inv_fast(m4, m5);
|
|
||||||
test_assert_mat4_eq2(m3, m5, 0.0009f);
|
|
||||||
|
|
||||||
test_rand_mat4(m3);
|
|
||||||
test_rand_mat4(m4);
|
|
||||||
|
|
||||||
glmc_mat4_inv(m3, m4);
|
|
||||||
glmc_mat4_inv(m4, m5);
|
|
||||||
test_assert_mat4_eq2(m3, m5, 0.0009f);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* print */
|
|
||||||
glm_mat4_print(m3, stderr);
|
|
||||||
glm_mat4_print(m4, stderr);
|
|
||||||
|
|
||||||
/* test determinant */
|
|
||||||
assert_int_equal(glm_mat4_det(m1), glmc_mat4_det(m1));
|
|
||||||
#if defined( __SSE2__ )
|
|
||||||
assert_int_equal(glmc_mat4_det(m1), glm_mat4_det_sse2(m1));
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
488
test/src/test_mat4.h
Normal file
488
test/src/test_mat4.h
Normal file
@@ -0,0 +1,488 @@
|
|||||||
|
/*
|
||||||
|
* 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"
|
||||||
|
|
||||||
|
#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}}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, mat4_ucopy) {
|
||||||
|
mat4 m1 = A_MATRIX;
|
||||||
|
mat4 m2 = GLM_MAT4_IDENTITY_INIT;
|
||||||
|
|
||||||
|
GLM(mat4_ucopy)(m1, m2);
|
||||||
|
|
||||||
|
ASSERTIFY(test_assert_mat4_eq(m1, m2))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, mat4_copy) {
|
||||||
|
mat4 m1 = A_MATRIX;
|
||||||
|
mat4 m2 = GLM_MAT4_IDENTITY_INIT;
|
||||||
|
|
||||||
|
GLM(mat4_copy)(m1, m2);
|
||||||
|
|
||||||
|
test_assert_mat4_eq(m1, m2);
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, mat4_identity) {
|
||||||
|
mat4 m1 = GLM_MAT4_IDENTITY_INIT;
|
||||||
|
mat4 m2 = GLM_MAT4_IDENTITY_INIT;
|
||||||
|
mat4 m3;
|
||||||
|
|
||||||
|
GLM(mat4_identity)(m3);
|
||||||
|
|
||||||
|
ASSERTIFY(test_assert_mat4_eq_identity(m1))
|
||||||
|
ASSERTIFY(test_assert_mat4_eq_identity(m2))
|
||||||
|
ASSERTIFY(test_assert_mat4_eq_identity(m3))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, mat4_identity_array) {
|
||||||
|
int i, count;
|
||||||
|
mat4 matrices[4] = {
|
||||||
|
A_MATRIX,
|
||||||
|
A_MATRIX,
|
||||||
|
A_MATRIX,
|
||||||
|
A_MATRIX
|
||||||
|
};
|
||||||
|
|
||||||
|
count = 4;
|
||||||
|
|
||||||
|
GLM(mat4_identity_array)(matrices, count);
|
||||||
|
|
||||||
|
for (i = 0; i < count; i++) {
|
||||||
|
ASSERTIFY(test_assert_mat4_eq_identity(matrices[i]))
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, mat4_zero) {
|
||||||
|
mat4 m1 = GLM_MAT4_ZERO_INIT;
|
||||||
|
mat4 m2 = GLM_MAT4_ZERO_INIT;
|
||||||
|
mat4 m3;
|
||||||
|
|
||||||
|
GLM(mat4_zero)(m3);
|
||||||
|
|
||||||
|
ASSERTIFY(test_assert_mat4_eq_zero(m1))
|
||||||
|
ASSERTIFY(test_assert_mat4_eq_zero(m2))
|
||||||
|
ASSERTIFY(test_assert_mat4_eq_zero(m3))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, mat4_pick3) {
|
||||||
|
mat4 m1 = A_MATRIX;
|
||||||
|
mat3 m2 = GLM_MAT3_ZERO_INIT;
|
||||||
|
mat3 m3 = A_MATRIX3;
|
||||||
|
|
||||||
|
GLM(mat4_pick3)(m1, m2);
|
||||||
|
|
||||||
|
ASSERTIFY(test_assert_mat3_eq(m2, m3))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, mat4_pick3t) {
|
||||||
|
mat4 m1 = A_MATRIX;
|
||||||
|
mat3 m2 = GLM_MAT3_ZERO_INIT;
|
||||||
|
mat3 m3 = A_MATRIX3;
|
||||||
|
|
||||||
|
GLM(mat4_pick3t)(m1, m2);
|
||||||
|
|
||||||
|
ASSERTIFY(test_assert_mat3_eqt(m2, m3))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, mat4_ins3) {
|
||||||
|
mat4 m1 = GLM_MAT4_IDENTITY_INIT;
|
||||||
|
mat3 m2 = A_MATRIX3;
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
GLM(mat4_ins3)(m2, m1);
|
||||||
|
|
||||||
|
for (i = 0; i < 3; i++) {
|
||||||
|
for (j = 0; j < 3; j++) {
|
||||||
|
ASSERT(m1[i][j] == m2[i][j])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ASSERT(test_eq(m1[3][0], 0.0f))
|
||||||
|
ASSERT(test_eq(m1[3][1], 0.0f))
|
||||||
|
ASSERT(test_eq(m1[3][2], 0.0f))
|
||||||
|
ASSERT(test_eq(m1[3][3], 1.0f))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, mat4_mul) {
|
||||||
|
mat4 m1 = GLM_MAT4_IDENTITY_INIT;
|
||||||
|
mat4 m2 = GLM_MAT4_IDENTITY_INIT;
|
||||||
|
mat4 m3;
|
||||||
|
mat4 m4 = GLM_MAT4_ZERO_INIT;
|
||||||
|
int i, j, k;
|
||||||
|
|
||||||
|
/* test random matrices */
|
||||||
|
/* random matrices */
|
||||||
|
test_rand_mat4(m1);
|
||||||
|
test_rand_mat4(m2);
|
||||||
|
|
||||||
|
GLM(mat4_mul)(m1, m2, m3);
|
||||||
|
for (i = 0; i < 4; i++) {
|
||||||
|
for (j = 0; j < 4; j++) {
|
||||||
|
for (k = 0; k < 4; k++)
|
||||||
|
/* column-major */
|
||||||
|
m4[i][j] += m1[k][j] * m2[i][k];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ASSERTIFY(test_assert_mat4_eq(m3, m4))
|
||||||
|
|
||||||
|
/* test pre compiled */
|
||||||
|
GLM(mat4_mul)(m1, m2, m3);
|
||||||
|
ASSERTIFY(test_assert_mat4_eq(m3, m4))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, mat4_mulN) {
|
||||||
|
mat4 res1, res2;
|
||||||
|
mat4 m1 = A_MATRIX;
|
||||||
|
mat4 m2 = A_MATRIX;
|
||||||
|
mat4 m3 = A_MATRIX;
|
||||||
|
|
||||||
|
mat4 *matrices[] = {
|
||||||
|
&m1, &m2, &m3
|
||||||
|
};
|
||||||
|
|
||||||
|
GLM(mat4_mulN)(matrices, sizeof(matrices) / sizeof(matrices[0]), res1);
|
||||||
|
|
||||||
|
GLM(mat4_mul)(*matrices[0], *matrices[1], res2);
|
||||||
|
GLM(mat4_mul)(res2, *matrices[2], res2);
|
||||||
|
|
||||||
|
ASSERTIFY(test_assert_mat4_eq(res1, res1))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, mat4_mulv) {
|
||||||
|
vec4 res;
|
||||||
|
mat4 mat = A_MATRIX;
|
||||||
|
vec4 v = {1.0f, 2.0f, 3.0f, 4.0f};
|
||||||
|
int i;
|
||||||
|
|
||||||
|
GLM(mat4_mulv)(mat, v, res);
|
||||||
|
|
||||||
|
for (i = 0; i < 4; i++) {
|
||||||
|
ASSERT(test_eq(res[i],
|
||||||
|
v[0] * mat[0][i]
|
||||||
|
+ v[1] * mat[1][i]
|
||||||
|
+ v[2] * mat[2][i]
|
||||||
|
+ v[3] * mat[3][i]))
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, mat4_mulv3) {
|
||||||
|
vec4 res;
|
||||||
|
mat4 mat = A_MATRIX;
|
||||||
|
vec3 v = {1.0f, 2.0f, 3.0f};
|
||||||
|
float last;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
last = 1.0f;
|
||||||
|
|
||||||
|
GLM(mat4_mulv3)(mat, v, last, res);
|
||||||
|
|
||||||
|
for (i = 0; i < 3; i++) {
|
||||||
|
ASSERT(test_eq(res[i],
|
||||||
|
v[0] * mat[0][i]
|
||||||
|
+ v[1] * mat[1][i]
|
||||||
|
+ v[2] * mat[2][i]
|
||||||
|
+ last * mat[3][i]))
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, mat4_trace) {
|
||||||
|
mat4 mat = A_MATRIX;
|
||||||
|
float trace;
|
||||||
|
|
||||||
|
trace = GLM(mat4_trace)(mat);
|
||||||
|
|
||||||
|
ASSERT(test_eq(trace, mat[0][0] + mat[1][1] + mat[2][2] + mat[3][3]))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, mat4_trace3) {
|
||||||
|
mat4 mat = A_MATRIX;
|
||||||
|
float trace;
|
||||||
|
|
||||||
|
trace = GLM(mat4_trace3)(mat);
|
||||||
|
|
||||||
|
ASSERT(test_eq(trace, mat[0][0] + mat[1][1] + mat[2][2]))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, mat4_quat) {
|
||||||
|
mat4 m1, m2;
|
||||||
|
versor q1, q2, q3;
|
||||||
|
vec3 axis1;
|
||||||
|
vec3 axis2 = {1.9f, 2.3f, 4.5f};
|
||||||
|
|
||||||
|
GLM(quat)(q1, GLM_PI_4f, 1.9f, 2.3f, 4.5f);
|
||||||
|
GLM(quat_mat4)(q1, m1);
|
||||||
|
GLM(mat4_quat)(m1, q2);
|
||||||
|
|
||||||
|
GLM(rotate_make)(m2, GLM_PI_4f, axis2);
|
||||||
|
GLM(mat4_quat)(m1, q3);
|
||||||
|
|
||||||
|
GLM(quat_axis)(q3, axis1);
|
||||||
|
|
||||||
|
GLM(vec3_normalize)(axis1);
|
||||||
|
GLM(vec3_normalize)(axis2);
|
||||||
|
|
||||||
|
ASSERT(test_eq(glm_quat_angle(q3), GLM_PI_4f))
|
||||||
|
ASSERTIFY(test_assert_vec3_eq(axis1, axis2))
|
||||||
|
ASSERTIFY(test_assert_vec4_eq(q1, q2))
|
||||||
|
ASSERTIFY(test_assert_mat4_eq(m1, m2))
|
||||||
|
ASSERTIFY(test_assert_vec4_eq(q1, q3))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, mat4_transpose_to) {
|
||||||
|
mat4 mat = A_MATRIX;
|
||||||
|
mat4 m1;
|
||||||
|
|
||||||
|
GLM(mat4_transpose_to)(mat, m1);
|
||||||
|
|
||||||
|
ASSERTIFY(test_assert_mat4_eqt(mat, m1))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, mat4_transpose) {
|
||||||
|
mat4 mat = A_MATRIX;
|
||||||
|
mat4 m1;
|
||||||
|
|
||||||
|
GLM(mat4_copy)(mat, m1);
|
||||||
|
GLM(mat4_transpose)(m1);
|
||||||
|
|
||||||
|
ASSERTIFY(test_assert_mat4_eqt(mat, m1))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, mat4_scale_p) {
|
||||||
|
mat4 m1 = A_MATRIX;
|
||||||
|
mat4 m2 = A_MATRIX;
|
||||||
|
int i, j, k, scale;
|
||||||
|
|
||||||
|
scale = rand() % 100;
|
||||||
|
|
||||||
|
GLM(mat4_scale_p)(m1, (float)scale);
|
||||||
|
|
||||||
|
for (i = 0; i < 4; i++) {
|
||||||
|
for (j = 0; j < 4; j++) {
|
||||||
|
for (k = 0; k < 4; k++)
|
||||||
|
ASSERT(test_eq(m1[i][j], m2[i][j] * scale))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, mat4_scale) {
|
||||||
|
mat4 m1 = A_MATRIX;
|
||||||
|
mat4 m2 = A_MATRIX;
|
||||||
|
int i, j, k, scale;
|
||||||
|
|
||||||
|
scale = rand() % 100;
|
||||||
|
|
||||||
|
GLM(mat4_scale)(m1, (float)scale);
|
||||||
|
|
||||||
|
for (i = 0; i < 4; i++) {
|
||||||
|
for (j = 0; j < 4; j++) {
|
||||||
|
for (k = 0; k < 4; k++)
|
||||||
|
ASSERT(test_eq(m1[i][j], m2[i][j] * scale))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, mat4_det) {
|
||||||
|
mat4 mat = GLM_MAT4_IDENTITY_INIT;
|
||||||
|
float t[6];
|
||||||
|
float a, b, c, d,
|
||||||
|
e, f, g, h,
|
||||||
|
i, j, k, l,
|
||||||
|
m, n, o, p;
|
||||||
|
float det1, det2;
|
||||||
|
|
||||||
|
test_rand_mat4(mat);
|
||||||
|
|
||||||
|
a = mat[0][0]; b = mat[0][1]; c = mat[0][2]; d = mat[0][3];
|
||||||
|
e = mat[1][0]; f = mat[1][1]; g = mat[1][2]; h = mat[1][3];
|
||||||
|
i = mat[2][0]; j = mat[2][1]; k = mat[2][2]; l = mat[2][3];
|
||||||
|
m = mat[3][0]; n = mat[3][1]; o = mat[3][2]; p = mat[3][3];
|
||||||
|
|
||||||
|
t[0] = k * p - o * l;
|
||||||
|
t[1] = j * p - n * l;
|
||||||
|
t[2] = j * o - n * k;
|
||||||
|
t[3] = i * p - m * l;
|
||||||
|
t[4] = i * o - m * k;
|
||||||
|
t[5] = i * n - m * j;
|
||||||
|
|
||||||
|
det1 = a * (f * t[0] - g * t[1] + h * t[2])
|
||||||
|
- b * (e * t[0] - g * t[3] + h * t[4])
|
||||||
|
+ c * (e * t[1] - f * t[3] + h * t[5])
|
||||||
|
- d * (e * t[2] - f * t[4] + g * t[5]);
|
||||||
|
|
||||||
|
det2 = GLM(mat4_det(mat));
|
||||||
|
|
||||||
|
ASSERT(test_eq(det1, det2))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, mat4_inv) {
|
||||||
|
mat4 m1, m2, m3;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < 100000; i++) {
|
||||||
|
test_rand_mat4(m1);
|
||||||
|
test_rand_mat4(m2);
|
||||||
|
|
||||||
|
/* test inverse precise */
|
||||||
|
GLM(mat4_inv)(m1, m2);
|
||||||
|
GLM(mat4_inv)(m2, m3);
|
||||||
|
ASSERTIFY(test_assert_mat4_eq(m1, m3))
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, mat4_inv_precise) {
|
||||||
|
mat4 m1, m2, m3;
|
||||||
|
mat4 m4, m5, m6;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < 100000; i++) {
|
||||||
|
test_rand_mat4(m1);
|
||||||
|
test_rand_mat4(m2);
|
||||||
|
|
||||||
|
glm_mat4_inv_precise(m1, m2);
|
||||||
|
glm_mat4_inv_precise(m2, m3);
|
||||||
|
ASSERTIFY(test_assert_mat4_eq(m1, m3))
|
||||||
|
|
||||||
|
test_rand_mat4(m4);
|
||||||
|
test_rand_mat4(m5);
|
||||||
|
|
||||||
|
glmc_mat4_inv_precise(m4, m5);
|
||||||
|
glmc_mat4_inv_precise(m5, m6);
|
||||||
|
ASSERTIFY(test_assert_mat4_eq(m4, m6))
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, mat4_inv_fast) {
|
||||||
|
mat4 m1, m2, m3;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < 100000; i++) {
|
||||||
|
test_rand_mat4(m1);
|
||||||
|
test_rand_mat4(m2);
|
||||||
|
|
||||||
|
/* test inverse precise */
|
||||||
|
GLM(mat4_inv_fast)(m1, m2);
|
||||||
|
GLM(mat4_inv_fast)(m2, m3);
|
||||||
|
ASSERTIFY(test_assert_mat4_eq2(m1, m3, 0.0009f))
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, mat4_swap_col) {
|
||||||
|
mat4 m1 = A_MATRIX;
|
||||||
|
mat4 m2 = A_MATRIX;
|
||||||
|
|
||||||
|
GLM(mat4_swap_col)(m1, 0, 1);
|
||||||
|
GLM(mat4_swap_col)(m1, 2, 3);
|
||||||
|
|
||||||
|
ASSERTIFY(test_assert_vec4_eq(m1[0], m2[1]))
|
||||||
|
ASSERTIFY(test_assert_vec4_eq(m1[1], m2[0]))
|
||||||
|
ASSERTIFY(test_assert_vec4_eq(m1[2], m2[3]))
|
||||||
|
ASSERTIFY(test_assert_vec4_eq(m1[3], m2[2]))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, mat4_swap_row) {
|
||||||
|
mat4 m1 = A_MATRIX;
|
||||||
|
mat4 m2 = A_MATRIX;
|
||||||
|
|
||||||
|
GLM(mat4_swap_row)(m1, 0, 1);
|
||||||
|
GLM(mat4_swap_row)(m1, 2, 3);
|
||||||
|
|
||||||
|
ASSERT(test_eq(m1[0][0], m2[0][1]))
|
||||||
|
ASSERT(test_eq(m1[0][1], m2[0][0]))
|
||||||
|
ASSERT(test_eq(m1[0][2], m2[0][3]))
|
||||||
|
ASSERT(test_eq(m1[0][3], m2[0][2]))
|
||||||
|
ASSERT(test_eq(m1[1][0], m2[1][1]))
|
||||||
|
ASSERT(test_eq(m1[1][1], m2[1][0]))
|
||||||
|
ASSERT(test_eq(m1[1][2], m2[1][3]))
|
||||||
|
ASSERT(test_eq(m1[1][3], m2[1][2]))
|
||||||
|
ASSERT(test_eq(m1[2][0], m2[2][1]))
|
||||||
|
ASSERT(test_eq(m1[2][1], m2[2][0]))
|
||||||
|
ASSERT(test_eq(m1[2][2], m2[2][3]))
|
||||||
|
ASSERT(test_eq(m1[2][3], m2[2][2]))
|
||||||
|
ASSERT(test_eq(m1[3][0], m2[3][1]))
|
||||||
|
ASSERT(test_eq(m1[3][1], m2[3][0]))
|
||||||
|
ASSERT(test_eq(m1[3][2], m2[3][3]))
|
||||||
|
ASSERT(test_eq(m1[3][3], m2[3][2]))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, mat4_rmc) {
|
||||||
|
mat4 mat = A_MATRIX;
|
||||||
|
vec4 v = {1.0f, 2.0f, 3.0f, 4.0f};
|
||||||
|
vec4 v1;
|
||||||
|
float r1, r2;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
r1 = GLM(mat4_rmc)(v, mat, v);
|
||||||
|
|
||||||
|
for (i = 0; i < 4; i++) {
|
||||||
|
v1[i] = v[0] * mat[i][0]
|
||||||
|
+ v[1] * mat[i][1]
|
||||||
|
+ v[2] * mat[i][2]
|
||||||
|
+ v[3] * mat[i][3];
|
||||||
|
}
|
||||||
|
|
||||||
|
r2 = v[0] * v1[0] + v[1] * v1[1] + v[2] * v1[2] + v[3] * v1[3];
|
||||||
|
|
||||||
|
ASSERT(test_eq(r1, r2))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef A_MATRIX
|
||||||
|
#undef A_MATRIX3
|
||||||
39
test/src/test_plane.h
Normal file
39
test/src/test_plane.h
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
/*
|
||||||
|
* 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(GLM_PREFIX, plane_normalize) {
|
||||||
|
vec4 p1 = {2.0f, -3.0f, 4.0f, 5.0f}, p2 = {2.0f, -3.0f, 4.0f, 5.0f};
|
||||||
|
float s = 1.0f;
|
||||||
|
float norm;
|
||||||
|
|
||||||
|
GLM(plane_normalize)(p2);
|
||||||
|
|
||||||
|
norm = sqrtf(p1[0] * p1[0] + p1[1] * p1[1] + p1[2] * p1[2]);
|
||||||
|
if (norm == 0.0f) {
|
||||||
|
ASSERT(test_eq(p1[0], 0.0f))
|
||||||
|
ASSERT(test_eq(p1[1], 0.0f))
|
||||||
|
ASSERT(test_eq(p1[2], 0.0f))
|
||||||
|
ASSERT(test_eq(p1[3], 0.0f))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
norm = s / norm;
|
||||||
|
|
||||||
|
ASSERT(test_eq(p1[0] * norm, p2[0]))
|
||||||
|
ASSERT(test_eq(p1[1] * norm, p2[1]))
|
||||||
|
ASSERT(test_eq(p1[2] * norm, p2[2]))
|
||||||
|
ASSERT(test_eq(p1[3] * norm, p2[3]))
|
||||||
|
|
||||||
|
glm_vec4_zero(p1);
|
||||||
|
GLM(plane_normalize)(p1);
|
||||||
|
ASSERTIFY(test_assert_vec4_eq(p1, GLM_VEC4_ZERO))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
@@ -1,31 +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"
|
|
||||||
|
|
||||||
void
|
|
||||||
test_project(void **state) {
|
|
||||||
mat4 model, view, proj, mvp;
|
|
||||||
vec4 viewport = {0.0f, 0.0f, 800.0f, 600.0f};
|
|
||||||
vec3 pos = {13.0f, 45.0f, 0.74f};
|
|
||||||
vec3 projected, unprojected;
|
|
||||||
|
|
||||||
glm_translate_make(model, (vec3){0.0f, 0.0f, -10.0f});
|
|
||||||
glm_lookat((vec3){0.0f, 0.0f, 0.0f}, pos, GLM_YUP, view);
|
|
||||||
|
|
||||||
glm_perspective_default(0.5f, proj);
|
|
||||||
glm_mat4_mulN((mat4 *[]){&proj, &view, &model}, 3, mvp);
|
|
||||||
|
|
||||||
glmc_project(pos, mvp, viewport, projected);
|
|
||||||
glmc_unproject(projected, mvp, viewport, unprojected);
|
|
||||||
|
|
||||||
/* unprojected of projected vector must be same as original one */
|
|
||||||
/* we used 0.01 because of projection floating point errors */
|
|
||||||
assert_true(fabsf(pos[0] - unprojected[0]) < 0.01);
|
|
||||||
assert_true(fabsf(pos[1] - unprojected[1]) < 0.01);
|
|
||||||
assert_true(fabsf(pos[2] - unprojected[2]) < 0.01);
|
|
||||||
}
|
|
||||||
92
test/src/test_project.h
Normal file
92
test/src/test_project.h
Normal file
@@ -0,0 +1,92 @@
|
|||||||
|
/*
|
||||||
|
* 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(GLM_PREFIX, unprojecti) {
|
||||||
|
mat4 model, view, proj, mvp;
|
||||||
|
vec4 viewport = {0.0f, 0.0f, 800.0f, 600.0f};
|
||||||
|
vec3 pos = {13.0f, 45.0f, 0.74f};
|
||||||
|
vec3 projected, unprojected;
|
||||||
|
|
||||||
|
glm_translate_make(model, (vec3){0.0f, 0.0f, -10.0f});
|
||||||
|
glm_lookat((vec3){0.0f, 0.0f, 0.0f}, pos, GLM_YUP, view);
|
||||||
|
|
||||||
|
glm_perspective_default(0.5f, proj);
|
||||||
|
glm_mat4_mulN((mat4 *[]){&proj, &view, &model}, 3, mvp);
|
||||||
|
|
||||||
|
GLM(project)(pos, mvp, viewport, projected);
|
||||||
|
|
||||||
|
glm_mat4_inv(mvp, mvp);
|
||||||
|
GLM(unprojecti)(projected, mvp, viewport, unprojected);
|
||||||
|
|
||||||
|
/* unprojected of projected vector must be same as original one */
|
||||||
|
/* we used 0.01 because of projection floating point errors */
|
||||||
|
ASSERT(fabsf(pos[0] - unprojected[0]) < 0.01)
|
||||||
|
ASSERT(fabsf(pos[1] - unprojected[1]) < 0.01)
|
||||||
|
ASSERT(fabsf(pos[2] - unprojected[2]) < 0.01)
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, unproject) {
|
||||||
|
mat4 model, view, proj, mvp;
|
||||||
|
vec4 viewport = {0.0f, 0.0f, 800.0f, 600.0f};
|
||||||
|
vec3 pos = {13.0f, 45.0f, 0.74f};
|
||||||
|
vec3 projected, unprojected;
|
||||||
|
|
||||||
|
glm_translate_make(model, (vec3){0.0f, 0.0f, -10.0f});
|
||||||
|
glm_lookat((vec3){0.0f, 0.0f, 0.0f}, pos, GLM_YUP, view);
|
||||||
|
|
||||||
|
glm_perspective_default(0.5f, proj);
|
||||||
|
glm_mat4_mulN((mat4 *[]){&proj, &view, &model}, 3, mvp);
|
||||||
|
|
||||||
|
GLM(project)(pos, mvp, viewport, projected);
|
||||||
|
GLM(unproject)(projected, mvp, viewport, unprojected);
|
||||||
|
|
||||||
|
/* unprojected of projected vector must be same as original one */
|
||||||
|
/* we used 0.01 because of projection floating point errors */
|
||||||
|
ASSERT(fabsf(pos[0] - unprojected[0]) < 0.01)
|
||||||
|
ASSERT(fabsf(pos[1] - unprojected[1]) < 0.01)
|
||||||
|
ASSERT(fabsf(pos[2] - unprojected[2]) < 0.01)
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, project) {
|
||||||
|
mat4 model, view, proj, mvp;
|
||||||
|
vec4 viewport = {0.0f, 0.0f, 800.0f, 600.0f};
|
||||||
|
vec3 pos = {13.0f, 45.0f, 0.74f};
|
||||||
|
vec3 projected, unprojected;
|
||||||
|
|
||||||
|
glm_translate_make(model, (vec3){0.0f, 0.0f, -10.0f});
|
||||||
|
glm_lookat((vec3){0.0f, 0.0f, 0.0f}, pos, GLM_YUP, view);
|
||||||
|
|
||||||
|
glm_perspective_default(0.5f, proj);
|
||||||
|
glm_mat4_mulN((mat4 *[]){&proj, &view, &model}, 3, mvp);
|
||||||
|
|
||||||
|
GLM(project)(pos, mvp, viewport, projected);
|
||||||
|
GLM(unproject)(projected, mvp, viewport, unprojected);
|
||||||
|
|
||||||
|
/* unprojected of projected vector must be same as original one */
|
||||||
|
/* we used 0.01 because of projection floating point errors */
|
||||||
|
ASSERT(fabsf(pos[0] - unprojected[0]) < 0.01)
|
||||||
|
ASSERT(fabsf(pos[1] - unprojected[1]) < 0.01)
|
||||||
|
ASSERT(fabsf(pos[2] - unprojected[2]) < 0.01)
|
||||||
|
|
||||||
|
/* test with no projection */
|
||||||
|
glm_mat4_identity(mvp);
|
||||||
|
|
||||||
|
GLM(project)(pos, mvp, viewport, projected);
|
||||||
|
GLM(unproject)(projected, mvp, viewport, unprojected);
|
||||||
|
|
||||||
|
ASSERT(test_eq(pos[0], unprojected[0]))
|
||||||
|
ASSERT(test_eq(pos[1], unprojected[1]))
|
||||||
|
ASSERT(test_eq(pos[2], unprojected[2]))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
@@ -1,201 +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"
|
|
||||||
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
test_quat_mul_raw(versor p, versor q, versor dest) {
|
|
||||||
dest[0] = p[3] * q[0] + p[0] * q[3] + p[1] * q[2] - p[2] * q[1];
|
|
||||||
dest[1] = p[3] * q[1] - p[0] * q[2] + p[1] * q[3] + p[2] * q[0];
|
|
||||||
dest[2] = p[3] * q[2] + p[0] * q[1] - p[1] * q[0] + p[2] * q[3];
|
|
||||||
dest[3] = p[3] * q[3] - p[0] * q[0] - p[1] * q[1] - p[2] * q[2];
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
test_quat(void **state) {
|
|
||||||
mat4 inRot, outRot, view1, view2, rot1, rot2;
|
|
||||||
versor inQuat, outQuat, q3, q4, q5;
|
|
||||||
vec3 eye, axis, imag, v1, v2;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
/* 0. test identiy quat */
|
|
||||||
glm_quat_identity(q4);
|
|
||||||
assert_true(glm_eq(glm_quat_real(q4), cosf(glm_rad(0.0f) * 0.5f)));
|
|
||||||
glm_quat_mat4(q4, rot1);
|
|
||||||
test_assert_mat4_eq2(rot1, GLM_MAT4_IDENTITY, 0.000009);
|
|
||||||
|
|
||||||
/* 1. test quat to mat and mat to quat */
|
|
||||||
for (i = 0; i < 1000; i++) {
|
|
||||||
test_rand_quat(inQuat);
|
|
||||||
|
|
||||||
glmc_quat_mat4(inQuat, inRot);
|
|
||||||
glmc_mat4_quat(inRot, outQuat);
|
|
||||||
glmc_quat_mat4(outQuat, outRot);
|
|
||||||
|
|
||||||
/* 2. test first quat and generated one equality */
|
|
||||||
test_assert_quat_eq_abs(inQuat, outQuat);
|
|
||||||
|
|
||||||
/* 3. test first rot and second rotation */
|
|
||||||
test_assert_mat4_eq2(inRot, outRot, 0.000009); /* almost equal */
|
|
||||||
|
|
||||||
/* 4. test SSE mul and raw mul */
|
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
|
||||||
test_quat_mul_raw(inQuat, outQuat, q3);
|
|
||||||
glm_quat_mul_sse2(inQuat, outQuat, q4);
|
|
||||||
test_assert_quat_eq(q3, q4);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 5. test lookat */
|
|
||||||
test_rand_vec3(eye);
|
|
||||||
glm_quatv(q3, glm_rad(-90.0f), GLM_YUP);
|
|
||||||
|
|
||||||
/* now X axis must be forward axis, Z must be right axis */
|
|
||||||
glm_look(eye, GLM_XUP, GLM_YUP, view1);
|
|
||||||
|
|
||||||
/* create view matrix with quaternion */
|
|
||||||
glm_quat_look(eye, q3, view2);
|
|
||||||
|
|
||||||
test_assert_mat4_eq2(view1, view2, 0.000009);
|
|
||||||
|
|
||||||
/* 6. test quaternion rotation matrix result */
|
|
||||||
test_rand_quat(q3);
|
|
||||||
glm_quat_mat4(q3, rot1);
|
|
||||||
|
|
||||||
/* 6.1 test axis and angle of quat */
|
|
||||||
glm_quat_axis(q3, axis);
|
|
||||||
glm_rotate_make(rot2, glm_quat_angle(q3), axis);
|
|
||||||
|
|
||||||
test_assert_mat4_eq2(rot1, rot2, 0.000009);
|
|
||||||
|
|
||||||
/* 7. test quaternion multiplication (hamilton product),
|
|
||||||
final rotation = first rotation + second = quat1 * quat2
|
|
||||||
*/
|
|
||||||
test_rand_quat(q3);
|
|
||||||
test_rand_quat(q4);
|
|
||||||
|
|
||||||
glm_quat_mul(q3, q4, q5);
|
|
||||||
|
|
||||||
glm_quat_axis(q3, axis);
|
|
||||||
glm_rotate_make(rot1, glm_quat_angle(q3), axis);
|
|
||||||
|
|
||||||
glm_quat_axis(q4, axis);
|
|
||||||
glm_rotate(rot1, glm_quat_angle(q4), axis);
|
|
||||||
|
|
||||||
/* rot2 is combine of two rotation now test with quaternion result */
|
|
||||||
glm_quat_mat4(q5, rot2);
|
|
||||||
|
|
||||||
/* result must be same (almost) */
|
|
||||||
test_assert_mat4_eq2(rot1, rot2, 0.000009);
|
|
||||||
|
|
||||||
/* 8. test quaternion for look rotation */
|
|
||||||
|
|
||||||
/* 8.1 same direction */
|
|
||||||
/* look at from 0, 0, 1 to zero, direction = 0, 0, -1 */
|
|
||||||
glm_quat_for((vec3){0, 0, -1}, (vec3){0, 0, -1}, GLM_YUP, q3);
|
|
||||||
|
|
||||||
/* result must be identity */
|
|
||||||
glm_quat_identity(q4);
|
|
||||||
test_assert_quat_eq(q3, q4);
|
|
||||||
|
|
||||||
/* look at from 0, 0, 1 to zero, direction = 0, 0, -1 */
|
|
||||||
glm_quat_forp(GLM_ZUP, GLM_VEC3_ZERO, (vec3){0, 0, -1}, GLM_YUP, q3);
|
|
||||||
|
|
||||||
/* result must be identity */
|
|
||||||
glm_quat_identity(q4);
|
|
||||||
test_assert_quat_eq(q3, q4);
|
|
||||||
|
|
||||||
/* 8.2 perpendicular */
|
|
||||||
glm_quat_for(GLM_XUP, (vec3){0, 0, -1}, GLM_YUP, q3);
|
|
||||||
|
|
||||||
/* result must be -90 */
|
|
||||||
glm_quatv(q4, glm_rad(-90.0f), GLM_YUP);
|
|
||||||
test_assert_quat_eq(q3, q4);
|
|
||||||
|
|
||||||
/* 9. test imag, real */
|
|
||||||
|
|
||||||
/* 9.1 real */
|
|
||||||
assert_true(glm_eq(glm_quat_real(q4), cosf(glm_rad(-90.0f) * 0.5f)));
|
|
||||||
|
|
||||||
/* 9.1 imag */
|
|
||||||
glm_quat_imag(q4, imag);
|
|
||||||
|
|
||||||
/* axis = Y_UP * sinf(angle * 0.5), YUP = 0, 1, 0 */
|
|
||||||
axis[0] = 0.0f;
|
|
||||||
axis[1] = sinf(glm_rad(-90.0f) * 0.5f) * 1.0f;
|
|
||||||
axis[2] = 0.0f;
|
|
||||||
|
|
||||||
assert_true(glm_vec3_eqv_eps(imag, axis));
|
|
||||||
|
|
||||||
/* 9.2 axis */
|
|
||||||
glm_quat_axis(q4, axis);
|
|
||||||
imag[0] = 0.0f;
|
|
||||||
imag[1] = -1.0f;
|
|
||||||
imag[2] = 0.0f;
|
|
||||||
|
|
||||||
test_assert_vec3_eq(imag, axis);
|
|
||||||
|
|
||||||
/* 10. test rotate vector using quat */
|
|
||||||
/* (0,0,-1) around (1,0,0) must give (0,1,0) */
|
|
||||||
v1[0] = 0.0f; v1[1] = 0.0f; v1[2] = -1.0f;
|
|
||||||
v2[0] = 0.0f; v2[1] = 0.0f; v2[2] = -1.0f;
|
|
||||||
|
|
||||||
glm_vec3_rotate(v1, glm_rad(90.0f), (vec3){1.0f, 0.0f, 0.0f});
|
|
||||||
glm_quatv(q3, glm_rad(90.0f), (vec3){1.0f, 0.0f, 0.0f});
|
|
||||||
|
|
||||||
glm_vec4_scale(q3, 1.5, q3);
|
|
||||||
glm_quat_rotatev(q3, v2, v2);
|
|
||||||
|
|
||||||
/* result must be : (0,1,0) */
|
|
||||||
assert_true(fabsf(v1[0]) <= 0.00009f
|
|
||||||
&& fabsf(v1[1] - 1.0f) <= 0.00009f
|
|
||||||
&& fabsf(v1[2]) <= 0.00009f);
|
|
||||||
|
|
||||||
test_assert_vec3_eq(v1, v2);
|
|
||||||
|
|
||||||
/* 11. test rotate transform */
|
|
||||||
glm_translate_make(rot1, (vec3){-10.0, 45.0f, 8.0f});
|
|
||||||
glm_rotate(rot1, glm_rad(-90), GLM_ZUP);
|
|
||||||
|
|
||||||
glm_quatv(q3, glm_rad(-90.0f), GLM_ZUP);
|
|
||||||
glm_translate_make(rot2, (vec3){-10.0, 45.0f, 8.0f});
|
|
||||||
glm_quat_rotate(rot2, q3, rot2);
|
|
||||||
|
|
||||||
/* result must be same (almost) */
|
|
||||||
test_assert_mat4_eq2(rot1, rot2, 0.000009);
|
|
||||||
|
|
||||||
glm_rotate_make(rot1, glm_rad(-90), GLM_ZUP);
|
|
||||||
glm_translate(rot1, (vec3){-10.0, 45.0f, 8.0f});
|
|
||||||
|
|
||||||
glm_quatv(q3, glm_rad(-90.0f), GLM_ZUP);
|
|
||||||
glm_mat4_identity(rot2);
|
|
||||||
glm_quat_rotate(rot2, q3, rot2);
|
|
||||||
glm_translate(rot2, (vec3){-10.0, 45.0f, 8.0f});
|
|
||||||
|
|
||||||
/* result must be same (almost) */
|
|
||||||
test_assert_mat4_eq2(rot1, rot2, 0.000009);
|
|
||||||
|
|
||||||
/* reverse */
|
|
||||||
glm_rotate_make(rot1, glm_rad(-90), GLM_ZUP);
|
|
||||||
glm_quatv(q3, glm_rad(90.0f), GLM_ZUP);
|
|
||||||
glm_quat_rotate(rot1, q3, rot1);
|
|
||||||
|
|
||||||
/* result must be identity */
|
|
||||||
test_assert_mat4_eq2(rot1, GLM_MAT4_IDENTITY, 0.000009);
|
|
||||||
|
|
||||||
test_rand_quat(q3);
|
|
||||||
|
|
||||||
/* 12. inverse of quat, multiplication must be IDENTITY */
|
|
||||||
glm_quat_inv(q3, q4);
|
|
||||||
glm_quat_mul(q3, q4, q5);
|
|
||||||
|
|
||||||
glm_quat_identity(q3);
|
|
||||||
test_assert_quat_eq(q3, q5);
|
|
||||||
|
|
||||||
/* TODO: add tests for slerp, lerp */
|
|
||||||
}
|
|
||||||
1001
test/src/test_quat.h
Normal file
1001
test/src/test_quat.h
Normal file
File diff suppressed because it is too large
Load Diff
78
test/src/test_struct.c
Normal file
78
test/src/test_struct.c
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
/*
|
||||||
|
* 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(mat3s_identity_init) {
|
||||||
|
mat3s mat3_identity = GLMS_MAT3_IDENTITY_INIT;
|
||||||
|
mat3 mat3_identity_a = GLM_MAT3_IDENTITY_INIT;
|
||||||
|
test_assert_mat3_eq(mat3_identity.raw, mat3_identity_a);
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(mat3s_zero_init) {
|
||||||
|
mat3s mat3_zero = GLMS_MAT3_ZERO_INIT;
|
||||||
|
mat3 mat3_zero_a = GLM_MAT3_ZERO_INIT;
|
||||||
|
test_assert_mat3_eq(mat3_zero.raw, mat3_zero_a);
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(mat4s_identity_init) {
|
||||||
|
mat4s mat4_identity = GLMS_MAT4_IDENTITY_INIT;
|
||||||
|
mat4 mat4_identity_a = GLM_MAT4_IDENTITY_INIT;
|
||||||
|
test_assert_mat4_eq(mat4_identity.raw, mat4_identity_a);
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(mat4s_zero_init) {
|
||||||
|
mat4s mat4_zero = GLMS_MAT4_ZERO_INIT;
|
||||||
|
mat4 mat4_zero_a = GLM_MAT4_ZERO_INIT;
|
||||||
|
test_assert_mat4_eq(mat4_zero.raw, mat4_zero_a);
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(quats_zero_init) {
|
||||||
|
versors quat_zero = GLMS_QUAT_IDENTITY_INIT;
|
||||||
|
versor quat_zero_a = GLM_QUAT_IDENTITY_INIT;
|
||||||
|
test_assert_quat_eq(quat_zero.raw, quat_zero_a);
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(vec3s_one_init) {
|
||||||
|
vec3s vec3_one = GLMS_VEC3_ONE_INIT;
|
||||||
|
vec3 vec3_one_a = GLM_VEC3_ONE_INIT;
|
||||||
|
test_assert_vec3_eq(vec3_one.raw, vec3_one_a);
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(vec3s_zero_init) {
|
||||||
|
vec3s vec3_zero = GLMS_VEC3_ZERO_INIT;
|
||||||
|
vec3 vec3_zero_a = GLM_VEC3_ZERO_INIT;
|
||||||
|
test_assert_vec3_eq(vec3_zero.raw, vec3_zero_a);
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(vec4s_black_init) {
|
||||||
|
vec4s vec4_black = GLMS_VEC4_BLACK_INIT;
|
||||||
|
vec4 vec4_black_a = GLM_VEC4_BLACK_INIT;
|
||||||
|
test_assert_vec4_eq(vec4_black.raw, vec4_black_a);
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(vec4s_one_init) {
|
||||||
|
vec4s vec4_one = GLMS_VEC4_ONE_INIT;
|
||||||
|
vec4 vec4_one_a = GLM_VEC4_ONE_INIT;
|
||||||
|
test_assert_vec4_eq(vec4_one.raw, vec4_one_a);
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(vec4s_zero_init) {
|
||||||
|
vec4s vec4_zero = GLMS_VEC4_ZERO_INIT;
|
||||||
|
vec4 vec4_zero_a = GLM_VEC4_ZERO_INIT;
|
||||||
|
test_assert_vec4_eq(vec4_zero.raw, vec4_zero_a);
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c), Recep Aslantas.
|
|
||||||
* MIT License (MIT), http://opensource.org/licenses/MIT
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef test_tests_h
|
|
||||||
#define test_tests_h
|
|
||||||
|
|
||||||
/* mat4 */
|
|
||||||
void test_mat4(void **state);
|
|
||||||
|
|
||||||
/* mat3 */
|
|
||||||
void test_mat3(void **state);
|
|
||||||
|
|
||||||
/* camera */
|
|
||||||
void
|
|
||||||
test_camera_lookat(void **state);
|
|
||||||
|
|
||||||
void
|
|
||||||
test_camera_decomp(void **state);
|
|
||||||
|
|
||||||
void
|
|
||||||
test_project(void **state);
|
|
||||||
|
|
||||||
void
|
|
||||||
test_clamp(void **state);
|
|
||||||
|
|
||||||
void
|
|
||||||
test_euler(void **state);
|
|
||||||
|
|
||||||
void
|
|
||||||
test_quat(void **state);
|
|
||||||
|
|
||||||
void
|
|
||||||
test_vec4(void **state);
|
|
||||||
|
|
||||||
void
|
|
||||||
test_vec3(void **state);
|
|
||||||
|
|
||||||
void
|
|
||||||
test_affine(void **state);
|
|
||||||
|
|
||||||
void
|
|
||||||
test_bezier(void **state);
|
|
||||||
|
|
||||||
#endif /* test_tests_h */
|
|
||||||
596
test/src/test_vec2.h
Normal file
596
test/src/test_vec2.h
Normal file
@@ -0,0 +1,596 @@
|
|||||||
|
/*
|
||||||
|
* 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"
|
||||||
|
|
||||||
|
#ifndef CGLM_TEST_VEC2_ONCE
|
||||||
|
#define CGLM_TEST_VEC2_ONCE
|
||||||
|
|
||||||
|
/* Macros */
|
||||||
|
|
||||||
|
TEST_IMPL(MACRO_GLM_VEC2_ONE_INIT) {
|
||||||
|
vec2 v = GLM_VEC2_ONE_INIT;
|
||||||
|
|
||||||
|
ASSERT(test_eq(v[0], 1.0f))
|
||||||
|
ASSERT(test_eq(v[1], 1.0f))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(MACRO_GLM_VEC2_ZERO_INIT) {
|
||||||
|
vec2 v = GLM_VEC2_ZERO_INIT;
|
||||||
|
|
||||||
|
ASSERT(test_eq(v[0], 0.0f))
|
||||||
|
ASSERT(test_eq(v[1], 0.0f))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(MACRO_GLM_VEC2_ONE) {
|
||||||
|
ASSERT(test_eq(GLM_VEC2_ONE[0], 1.0f))
|
||||||
|
ASSERT(test_eq(GLM_VEC2_ONE[1], 1.0f))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(MACRO_GLM_VEC2_ZERO) {
|
||||||
|
ASSERT(test_eq(GLM_VEC2_ZERO[0], 0.0f))
|
||||||
|
ASSERT(test_eq(GLM_VEC2_ZERO[0], 0.0f))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* CGLM_TEST_VEC2_ONCE */
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, vec2) {
|
||||||
|
vec4 v4 = {10.0f, 9.0f, 8.0f, 7.0f};
|
||||||
|
vec3 v3 = {11.0f, 12.0f, 13.0f};
|
||||||
|
vec2 v2;
|
||||||
|
|
||||||
|
GLM(vec2)(v4, v2);
|
||||||
|
ASSERT(test_eq(v2[0], v4[0]))
|
||||||
|
ASSERT(test_eq(v2[1], v4[1]))
|
||||||
|
|
||||||
|
GLM(vec2)(v3, v2);
|
||||||
|
ASSERT(test_eq(v2[0], v3[0]))
|
||||||
|
ASSERT(test_eq(v2[1], v3[1]))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, vec2_copy) {
|
||||||
|
vec2 v1 = {10.0f, 9.0f};
|
||||||
|
vec2 v2 = {1.0f, 2.0f};
|
||||||
|
|
||||||
|
GLM(vec2_copy)(v1, v2);
|
||||||
|
|
||||||
|
ASSERTIFY(test_assert_vec2_eq(v1, v2))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, vec2_zero) {
|
||||||
|
vec2 v1 = {10.0f, 9.0f};
|
||||||
|
vec2 v2 = {1.0f, 2.0f};
|
||||||
|
|
||||||
|
GLM(vec2_zero)(v1);
|
||||||
|
GLM(vec2_zero)(v2);
|
||||||
|
|
||||||
|
ASSERTIFY(test_assert_vec2_eq(v1, GLM_VEC2_ZERO))
|
||||||
|
ASSERTIFY(test_assert_vec2_eq(v2, GLM_VEC2_ZERO))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, vec2_one) {
|
||||||
|
vec2 v1 = {10.0f, 9.0f};
|
||||||
|
vec2 v2 = {1.0f, 2.0f};
|
||||||
|
|
||||||
|
GLM(vec2_one)(v1);
|
||||||
|
GLM(vec2_one)(v2);
|
||||||
|
|
||||||
|
ASSERTIFY(test_assert_vec2_eq(v1, GLM_VEC2_ONE))
|
||||||
|
ASSERTIFY(test_assert_vec2_eq(v2, GLM_VEC2_ONE))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, vec2_dot) {
|
||||||
|
vec2 a = {10.0f, 9.0f};
|
||||||
|
vec2 b = {1.0f, 2.0f};
|
||||||
|
float dot1, dot2;
|
||||||
|
|
||||||
|
dot1 = GLM(vec2_dot)(a, b);
|
||||||
|
dot2 = a[0] * b[0] + a[1] * b[1];
|
||||||
|
|
||||||
|
ASSERT(test_eq(dot1, dot2))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, vec2_cross) {
|
||||||
|
vec2 a = {10.0f, 9.0f};
|
||||||
|
vec2 b = {1.0f, 2.0f};
|
||||||
|
float cprod;
|
||||||
|
|
||||||
|
cprod = a[0] * b[1] - a[1] * b[0];
|
||||||
|
|
||||||
|
ASSERT(test_eq(glm_vec2_cross(a, b), cprod))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, vec2_norm2) {
|
||||||
|
vec2 a = {10.0f, 9.0f};
|
||||||
|
float n1, n2;
|
||||||
|
|
||||||
|
n1 = GLM(vec2_norm2)(a);
|
||||||
|
n2 = a[0] * a[0] + a[1] * a[1];
|
||||||
|
|
||||||
|
ASSERT(test_eq(n1, n2))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, vec2_norm) {
|
||||||
|
vec2 a = {10.0f, 9.0f};
|
||||||
|
float n1, n2;
|
||||||
|
|
||||||
|
n1 = GLM(vec2_norm)(a);
|
||||||
|
n2 = sqrtf(a[0] * a[0] + a[1] * a[1]);
|
||||||
|
|
||||||
|
ASSERT(test_eq(n1, n2))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, vec2_add) {
|
||||||
|
vec2 a = {-10.0f, 9.0f};
|
||||||
|
vec2 b = {12.0f, 19.0f};
|
||||||
|
vec2 c, d;
|
||||||
|
|
||||||
|
c[0] = a[0] + b[0];
|
||||||
|
c[1] = a[1] + b[1];
|
||||||
|
|
||||||
|
GLM(vec2_add)(a, b, d);
|
||||||
|
|
||||||
|
ASSERTIFY(test_assert_vec2_eq(c, d))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, vec2_adds) {
|
||||||
|
vec4 a = {-10.0f, 9.0f};
|
||||||
|
vec4 c, d;
|
||||||
|
float s = 7.0f;
|
||||||
|
|
||||||
|
c[0] = a[0] + s;
|
||||||
|
c[1] = a[1] + s;
|
||||||
|
|
||||||
|
GLM(vec2_adds)(a, s, d);
|
||||||
|
|
||||||
|
ASSERTIFY(test_assert_vec2_eq(c, d))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, vec2_sub) {
|
||||||
|
vec2 a = {-10.0f, 9.0f};
|
||||||
|
vec2 b = {12.0f, 19.0f};
|
||||||
|
vec2 c, d;
|
||||||
|
|
||||||
|
c[0] = a[0] - b[0];
|
||||||
|
c[1] = a[1] - b[1];
|
||||||
|
|
||||||
|
GLM(vec2_sub)(a, b, d);
|
||||||
|
|
||||||
|
ASSERTIFY(test_assert_vec2_eq(c, d))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, vec2_subs) {
|
||||||
|
vec2 a = {-10.0f, 9.0f};
|
||||||
|
vec2 c, d;
|
||||||
|
float s = 7.0f;
|
||||||
|
|
||||||
|
c[0] = a[0] - s;
|
||||||
|
c[1] = a[1] - s;
|
||||||
|
|
||||||
|
GLM(vec2_subs)(a, s, d);
|
||||||
|
|
||||||
|
ASSERTIFY(test_assert_vec2_eq(c, d))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, vec2_mul) {
|
||||||
|
vec2 v1 = {2.0f, -3.0f},
|
||||||
|
v2 = {-3.0f, 4.0f},
|
||||||
|
v3;
|
||||||
|
|
||||||
|
GLM(vec2_mul)(v1, v2, v3);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v1[0] * v2[0], v3[0]))
|
||||||
|
ASSERT(test_eq(v1[1] * v2[1], v3[1]))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, vec2_scale) {
|
||||||
|
vec2 v1 = {2.0f, -3.0f}, v2;
|
||||||
|
float s = 7.0f;
|
||||||
|
|
||||||
|
GLM(vec2_scale)(v1, s, v2);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v1[0] * s, v2[0]))
|
||||||
|
ASSERT(test_eq(v1[1] * s, v2[1]))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, vec2_scale_as) {
|
||||||
|
vec2 v1 = {2.0f, -3.0f}, v2;
|
||||||
|
float s = 7.0f;
|
||||||
|
float norm;
|
||||||
|
|
||||||
|
GLM(vec2_scale_as)(v1, s, v2);
|
||||||
|
|
||||||
|
norm = sqrtf(v1[0] * v1[0] + v1[1] * v1[1]);
|
||||||
|
if (norm == 0.0f) {
|
||||||
|
ASSERT(test_eq(v1[0], 0.0f))
|
||||||
|
ASSERT(test_eq(v1[1], 0.0f))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
norm = s / norm;
|
||||||
|
|
||||||
|
ASSERT(test_eq(v1[0] * norm, v2[0]))
|
||||||
|
ASSERT(test_eq(v1[1] * norm, v2[1]))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, vec2_div) {
|
||||||
|
vec2 v1 = {2.0f, -3.0f},
|
||||||
|
v2 = {-3.0f, 4.0f},
|
||||||
|
v3;
|
||||||
|
|
||||||
|
GLM(vec2_div)(v1, v2, v3);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v1[0] / v2[0], v3[0]))
|
||||||
|
ASSERT(test_eq(v1[1] / v2[1], v3[1]))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, vec2_divs) {
|
||||||
|
vec2 v1 = {2.0f, -3.0f}, v2;
|
||||||
|
float s = 7.0f;
|
||||||
|
|
||||||
|
GLM(vec2_divs)(v1, s, v2);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v1[0] / s, v2[0]))
|
||||||
|
ASSERT(test_eq(v1[1] / s, v2[1]))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, vec2_addadd) {
|
||||||
|
vec2 v1 = {2.0f, -3.0f},
|
||||||
|
v2 = {-3.0f, 4.0f},
|
||||||
|
v3 = {1.0f, 2.0f},
|
||||||
|
v4 = {1.0f, 2.0f};
|
||||||
|
|
||||||
|
GLM(vec2_addadd)(v1, v2, v4);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v3[0] + v1[0] + v2[0], v4[0]))
|
||||||
|
ASSERT(test_eq(v3[1] + v1[1] + v2[1], v4[1]))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, vec2_subadd) {
|
||||||
|
vec2 v1 = {2.0f, -3.0f},
|
||||||
|
v2 = {-3.0f, 4.0f},
|
||||||
|
v3 = {1.0f, 2.0f},
|
||||||
|
v4 = {1.0f, 2.0f};
|
||||||
|
|
||||||
|
GLM(vec2_subadd)(v1, v2, v4);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v3[0] + v1[0] - v2[0], v4[0]))
|
||||||
|
ASSERT(test_eq(v3[1] + v1[1] - v2[1], v4[1]))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, vec2_muladd) {
|
||||||
|
vec2 v1 = {2.0f, -3.0f},
|
||||||
|
v2 = {-3.0f, 4.0f},
|
||||||
|
v3 = {1.0f, 2.0f},
|
||||||
|
v4 = {1.0f, 2.0f};
|
||||||
|
|
||||||
|
GLM(vec2_muladd)(v1, v2, v4);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v3[0] + v1[0] * v2[0], v4[0]))
|
||||||
|
ASSERT(test_eq(v3[1] + v1[1] * v2[1], v4[1]))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, vec2_muladds) {
|
||||||
|
vec2 v1 = {2.0f, -3.0f},
|
||||||
|
v2 = {1.0f, 2.0f},
|
||||||
|
v3 = {1.0f, 2.0f};
|
||||||
|
float s = 9.0f;
|
||||||
|
|
||||||
|
GLM(vec2_muladds)(v1, s, v3);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v2[0] + v1[0] * s, v3[0]))
|
||||||
|
ASSERT(test_eq(v2[1] + v1[1] * s, v3[1]))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, vec2_maxadd) {
|
||||||
|
vec2 v1 = {2.0f, -3.0f},
|
||||||
|
v2 = {-3.0f, 4.0f},
|
||||||
|
v3 = {1.0f, 2.0f},
|
||||||
|
v4 = {1.0f, 2.0f};
|
||||||
|
|
||||||
|
GLM(vec2_maxadd)(v1, v2, v4);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v3[0] + glm_max(v1[0], v2[0]), v4[0]))
|
||||||
|
ASSERT(test_eq(v3[1] + glm_max(v1[1], v2[1]), v4[1]))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, vec2_minadd) {
|
||||||
|
vec2 v1 = {2.0f, -3.0f},
|
||||||
|
v2 = {-3.0f, 4.0f},
|
||||||
|
v3 = {1.0f, 2.0f},
|
||||||
|
v4 = {1.0f, 2.0f};
|
||||||
|
|
||||||
|
GLM(vec2_minadd)(v1, v2, v4);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v3[0] + glm_min(v1[0], v2[0]), v4[0]))
|
||||||
|
ASSERT(test_eq(v3[1] + glm_min(v1[1], v2[1]), v4[1]))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, vec2_negate_to) {
|
||||||
|
vec2 v1 = {2.0f, -3.0f},
|
||||||
|
v2 = {-3.0f, 4.0f},
|
||||||
|
v3, v4;
|
||||||
|
|
||||||
|
GLM(vec2_negate_to)(v1, v3);
|
||||||
|
GLM(vec2_negate_to)(v2, v4);
|
||||||
|
|
||||||
|
ASSERT(test_eq(-v1[0], v3[0]))
|
||||||
|
ASSERT(test_eq(-v1[1], v3[1]))
|
||||||
|
|
||||||
|
ASSERT(test_eq(-v2[0], v4[0]))
|
||||||
|
ASSERT(test_eq(-v2[1], v4[1]))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, vec2_negate) {
|
||||||
|
vec2 v1 = {2.0f, -3.0f},
|
||||||
|
v2 = {-3.0f, 4.0f},
|
||||||
|
v3 = {2.0f, -3.0f},
|
||||||
|
v4 = {-3.0f, 4.0f};
|
||||||
|
|
||||||
|
GLM(vec2_negate)(v1);
|
||||||
|
GLM(vec2_negate)(v2);
|
||||||
|
|
||||||
|
ASSERT(test_eq(-v1[0], v3[0]))
|
||||||
|
ASSERT(test_eq(-v1[1], v3[1]))
|
||||||
|
|
||||||
|
ASSERT(test_eq(-v2[0], v4[0]))
|
||||||
|
ASSERT(test_eq(-v2[1], v4[1]))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, vec2_normalize) {
|
||||||
|
vec2 v1 = {2.0f, -3.0f}, v2 = {2.0f, -3.0f};
|
||||||
|
float s = 1.0f;
|
||||||
|
float norm;
|
||||||
|
|
||||||
|
GLM(vec2_normalize)(v2);
|
||||||
|
|
||||||
|
norm = sqrtf(v1[0] * v1[0] + v1[1] * v1[1]);
|
||||||
|
if (norm == 0.0f) {
|
||||||
|
ASSERT(test_eq(v1[0], 0.0f))
|
||||||
|
ASSERT(test_eq(v1[1], 0.0f))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
norm = s / norm;
|
||||||
|
|
||||||
|
ASSERT(test_eq(v1[0] * norm, v2[0]))
|
||||||
|
ASSERT(test_eq(v1[1] * norm, v2[1]))
|
||||||
|
|
||||||
|
glm_vec2_zero(v1);
|
||||||
|
GLM(vec2_normalize)(v1);
|
||||||
|
ASSERTIFY(test_assert_vec2_eq(v1, GLM_VEC2_ZERO))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, vec2_normalize_to) {
|
||||||
|
vec2 v1 = {2.0f, -3.0f}, v2;
|
||||||
|
float s = 1.0f;
|
||||||
|
float norm;
|
||||||
|
|
||||||
|
GLM(vec2_normalize_to)(v1, v2);
|
||||||
|
|
||||||
|
norm = sqrtf(v1[0] * v1[0] + v1[1] * v1[1]);
|
||||||
|
if (norm == 0.0f) {
|
||||||
|
ASSERT(test_eq(v1[0], 0.0f))
|
||||||
|
ASSERT(test_eq(v1[1], 0.0f))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
norm = s / norm;
|
||||||
|
|
||||||
|
ASSERT(test_eq(v1[0] * norm, v2[0]))
|
||||||
|
ASSERT(test_eq(v1[1] * norm, v2[1]))
|
||||||
|
|
||||||
|
glm_vec2_zero(v1);
|
||||||
|
GLM(vec2_normalize_to)(v1, v2);
|
||||||
|
ASSERTIFY(test_assert_vec2_eq(v2, GLM_VEC2_ZERO))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, vec2_rotate) {
|
||||||
|
vec2 v1 = {1.0f, 0.0f};
|
||||||
|
|
||||||
|
GLM(vec2_rotate)(v1, GLM_PI_2f, v1);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v1[0], 0.0f))
|
||||||
|
ASSERT(test_eq(v1[1], 1.0f))
|
||||||
|
|
||||||
|
GLM(vec2_rotate)(v1, GLM_PI_2f, v1);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v1[0], -1.0f))
|
||||||
|
ASSERT(test_eq(v1[1], 0.0f))
|
||||||
|
|
||||||
|
GLM(vec2_rotate)(v1, GLM_PI_2f, v1);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v1[0], 0.0f))
|
||||||
|
ASSERT(test_eq(v1[1], -1.0f))
|
||||||
|
|
||||||
|
GLM(vec2_rotate)(v1, GLM_PI_2f, v1);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v1[0], 1.0f))
|
||||||
|
ASSERT(test_eq(v1[1], 0.0f))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, vec2_distance2) {
|
||||||
|
vec2 v1 = {30.0f, 0.0f},
|
||||||
|
v2 = {0.0f, 0.0f},
|
||||||
|
v3 = {3.0f, 10.0f},
|
||||||
|
v4 = {0.46f, 4.0f};
|
||||||
|
float d;
|
||||||
|
|
||||||
|
d = GLM(vec2_distance2)(v1, v2);
|
||||||
|
ASSERT(test_eq(d, 30.0f * 30.0f))
|
||||||
|
|
||||||
|
d = GLM(vec2_distance2)(v3, v4);
|
||||||
|
ASSERT(test_eq(powf(v3[0] - v4[0], 2.0f)
|
||||||
|
+ powf(v3[1] - v4[1], 2.0f), d))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, vec2_distance) {
|
||||||
|
vec2 v1 = {30.0f, 0.0f},
|
||||||
|
v2 = {0.0f, 0.0f},
|
||||||
|
v3 = {3.0f, 10.0f},
|
||||||
|
v4 = {0.46f, 4.0f};
|
||||||
|
float d;
|
||||||
|
|
||||||
|
d = GLM(vec2_distance)(v1, v2);
|
||||||
|
ASSERT(test_eq(d, 30.0f))
|
||||||
|
|
||||||
|
d = GLM(vec2_distance)(v3, v4);
|
||||||
|
ASSERT(test_eq(sqrtf(powf(v3[0] - v4[0], 2.0f)
|
||||||
|
+ powf(v3[1] - v4[1], 2.0f)), d))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, vec2_maxv) {
|
||||||
|
vec2 v1, v2, v3;
|
||||||
|
vec2 v5 = {-1.456f, -1.456f};
|
||||||
|
vec2 v6 = {11.0f, 11.0f};
|
||||||
|
vec2 v7 = {78.0f, -78.0f};
|
||||||
|
|
||||||
|
GLM(vec2_maxv)(v5, v6, v1);
|
||||||
|
GLM(vec2_maxv)(v5, v7, v2);
|
||||||
|
GLM(vec2_maxv)(v6, v7, v3);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v1[0], 11.0f))
|
||||||
|
ASSERT(test_eq(v1[1], 11.0f))
|
||||||
|
|
||||||
|
ASSERT(test_eq(v2[0], 78.0f))
|
||||||
|
ASSERT(test_eq(v2[1], -1.456f))
|
||||||
|
|
||||||
|
ASSERT(test_eq(v3[0], 78.0f))
|
||||||
|
ASSERT(test_eq(v3[1], 11.0f))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, vec2_minv) {
|
||||||
|
vec2 v1, v2, v3;
|
||||||
|
vec2 v5 = {-1.456f, -1.456f};
|
||||||
|
vec2 v6 = {11.0f, 11.0f};
|
||||||
|
vec2 v7 = {78.0f, -78.0f};
|
||||||
|
|
||||||
|
GLM(vec2_minv)(v5, v6, v1);
|
||||||
|
GLM(vec2_minv)(v5, v7, v2);
|
||||||
|
GLM(vec2_minv)(v6, v7, v3);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v1[0], -1.456f))
|
||||||
|
ASSERT(test_eq(v1[1], -1.456f))
|
||||||
|
|
||||||
|
ASSERT(test_eq(v2[0], -1.456f))
|
||||||
|
ASSERT(test_eq(v2[1], -78.0f))
|
||||||
|
|
||||||
|
ASSERT(test_eq(v3[0], 11.0f))
|
||||||
|
ASSERT(test_eq(v3[1], -78.0f))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, vec2_clamp) {
|
||||||
|
vec2 v1 = {-1.456f, -11.456f};
|
||||||
|
vec2 v2 = {0.110f, 111.0f};
|
||||||
|
vec2 v3 = {78.0f, 32.0f};
|
||||||
|
|
||||||
|
GLM(vec2_clamp)(v1, -1.03f, 30.0f);
|
||||||
|
GLM(vec2_clamp)(v2, 0.11f, 111.0f);
|
||||||
|
GLM(vec2_clamp)(v3, -88.0f, 70.0f);
|
||||||
|
|
||||||
|
ASSERT(test_eq(v1[0], -1.03f))
|
||||||
|
ASSERT(test_eq(v1[1], -1.03f))
|
||||||
|
|
||||||
|
ASSERT(test_eq(v2[0], 0.11f))
|
||||||
|
ASSERT(test_eq(v2[1], 111.0f))
|
||||||
|
|
||||||
|
ASSERT(test_eq(v3[0], 70.0f))
|
||||||
|
ASSERT(test_eq(v3[1], 32.0f))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_IMPL(GLM_PREFIX, vec2_lerp) {
|
||||||
|
vec2 v1 = {-100.0f, -200.0f};
|
||||||
|
vec2 v2 = {100.0f, 200.0f};
|
||||||
|
vec2 v3;
|
||||||
|
|
||||||
|
GLM(vec2_lerp)(v1, v2, 0.5f, v3);
|
||||||
|
ASSERT(test_eq(v3[0], 0.0f))
|
||||||
|
ASSERT(test_eq(v3[1], 0.0f))
|
||||||
|
|
||||||
|
GLM(vec2_lerp)(v1, v2, 0.75f, v3);
|
||||||
|
ASSERT(test_eq(v3[0], 50.0f))
|
||||||
|
ASSERT(test_eq(v3[1], 100.0f))
|
||||||
|
|
||||||
|
TEST_SUCCESS
|
||||||
|
}
|
||||||
@@ -1,113 +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"
|
|
||||||
|
|
||||||
void
|
|
||||||
test_vec3(void **state) {
|
|
||||||
mat3 rot1m3;
|
|
||||||
mat4 rot1;
|
|
||||||
vec3 v, v1, v2;
|
|
||||||
vec3s vs1, vs2, vs3, vs4;
|
|
||||||
|
|
||||||
/* test zero */
|
|
||||||
glm_vec3_zero(v);
|
|
||||||
test_assert_vec3_eq(GLM_VEC3_ZERO, v);
|
|
||||||
|
|
||||||
/* test one */
|
|
||||||
glm_vec3_one(v);
|
|
||||||
test_assert_vec3_eq(GLM_VEC3_ONE, v);
|
|
||||||
|
|
||||||
/* adds, subs, div, divs, mul */
|
|
||||||
glm_vec3_add(v, GLM_VEC3_ONE, v);
|
|
||||||
assert_true(glmc_vec3_eq_eps(v, 2));
|
|
||||||
|
|
||||||
glm_vec3_adds(v, 10, v);
|
|
||||||
assert_true(glmc_vec3_eq_eps(v, 12));
|
|
||||||
|
|
||||||
glm_vec3_sub(v, GLM_VEC3_ONE, v);
|
|
||||||
assert_true(glmc_vec3_eq_eps(v, 11));
|
|
||||||
|
|
||||||
glm_vec3_subs(v, 1, v);
|
|
||||||
assert_true(glmc_vec3_eq_eps(v, 10));
|
|
||||||
|
|
||||||
glm_vec3_broadcast(2, v1);
|
|
||||||
glm_vec3_div(v, v1, v);
|
|
||||||
assert_true(glmc_vec3_eq_eps(v, 5));
|
|
||||||
|
|
||||||
glm_vec3_divs(v, 0.5, v);
|
|
||||||
assert_true(glmc_vec3_eq_eps(v, 10));
|
|
||||||
|
|
||||||
glm_vec3_mul(v, v1, v);
|
|
||||||
assert_true(glmc_vec3_eq_eps(v, 20));
|
|
||||||
|
|
||||||
glm_vec3_scale(v, 0.5, v);
|
|
||||||
assert_true(glmc_vec3_eq_eps(v, 10));
|
|
||||||
|
|
||||||
glm_vec3_normalize_to(v, v1);
|
|
||||||
glm_vec3_scale(v1, 0.8, v1);
|
|
||||||
glm_vec3_scale_as(v, 0.8, v);
|
|
||||||
test_assert_vec3_eq(v1, v);
|
|
||||||
|
|
||||||
/* addadd, subadd, muladd */
|
|
||||||
glm_vec3_one(v);
|
|
||||||
|
|
||||||
glm_vec3_addadd(GLM_VEC3_ONE, GLM_VEC3_ONE, v);
|
|
||||||
assert_true(glmc_vec3_eq_eps(v, 3));
|
|
||||||
|
|
||||||
glm_vec3_subadd(GLM_VEC3_ONE, GLM_VEC3_ZERO, v);
|
|
||||||
assert_true(glmc_vec3_eq_eps(v, 4));
|
|
||||||
|
|
||||||
glm_vec3_broadcast(2, v1);
|
|
||||||
glm_vec3_broadcast(3, v2);
|
|
||||||
glm_vec3_muladd(v1, v2, v);
|
|
||||||
assert_true(glmc_vec3_eq_eps(v, 10));
|
|
||||||
|
|
||||||
/* rotate */
|
|
||||||
glm_vec3_copy(GLM_YUP, v);
|
|
||||||
glm_rotate_make(rot1, glm_rad(90), GLM_XUP);
|
|
||||||
glm_vec3_rotate_m4(rot1, v, v1);
|
|
||||||
glm_mat4_pick3(rot1, rot1m3);
|
|
||||||
glm_vec3_rotate_m3(rot1m3, v, v2);
|
|
||||||
|
|
||||||
test_assert_vec3_eq(v1, v2);
|
|
||||||
test_assert_vec3_eq(v1, GLM_ZUP);
|
|
||||||
|
|
||||||
/* structs */
|
|
||||||
vs1 = test_rand_vec3s();
|
|
||||||
vs2 = test_rand_vec3s();
|
|
||||||
|
|
||||||
vs3 = glms_vec3_add(vs1, vs2);
|
|
||||||
vs4 = glms_vec3_maxv(vs1, vs3);
|
|
||||||
test_assert_vec3s_eq(vs3, vs4);
|
|
||||||
|
|
||||||
/* swizzle */
|
|
||||||
|
|
||||||
/* ZYX */
|
|
||||||
v1[0] = 1;
|
|
||||||
v1[1] = 2;
|
|
||||||
v1[2] = 3;
|
|
||||||
glm_vec3_swizzle(v1, GLM_ZYX, v1);
|
|
||||||
test_assert_vec3_eq(v1, (vec3){3, 2, 1});
|
|
||||||
|
|
||||||
glm_vec3_swizzle(v1, GLM_XXX, v1);
|
|
||||||
test_assert_vec3_eq(v1, (vec3){3, 3, 3});
|
|
||||||
|
|
||||||
v1[0] = 1;
|
|
||||||
v1[1] = 2;
|
|
||||||
v1[2] = 3;
|
|
||||||
|
|
||||||
glm_vec3_swizzle(v1, GLM_YYY, v1);
|
|
||||||
test_assert_vec3_eq(v1, (vec3){2, 2, 2});
|
|
||||||
|
|
||||||
v1[0] = 1;
|
|
||||||
v1[1] = 2;
|
|
||||||
v1[2] = 3;
|
|
||||||
|
|
||||||
glm_vec3_swizzle(v1, GLM_ZZZ, v1);
|
|
||||||
test_assert_vec3_eq(v1, (vec3){3, 3, 3});
|
|
||||||
}
|
|
||||||
1725
test/src/test_vec3.h
Normal file
1725
test/src/test_vec3.h
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,231 +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"
|
|
||||||
|
|
||||||
CGLM_INLINE
|
|
||||||
float
|
|
||||||
test_vec4_dot(vec4 a, vec4 b) {
|
|
||||||
return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];
|
|
||||||
}
|
|
||||||
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
test_vec4_normalize_to(vec4 vec, vec4 dest) {
|
|
||||||
float norm;
|
|
||||||
|
|
||||||
norm = glm_vec4_norm(vec);
|
|
||||||
|
|
||||||
if (norm == 0.0f) {
|
|
||||||
dest[0] = dest[1] = dest[2] = dest[3] = 0.0f;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
glm_vec4_scale(vec, 1.0f / norm, dest);
|
|
||||||
}
|
|
||||||
|
|
||||||
float
|
|
||||||
test_vec4_norm2(vec4 vec) {
|
|
||||||
return test_vec4_dot(vec, vec);
|
|
||||||
}
|
|
||||||
|
|
||||||
float
|
|
||||||
test_vec4_norm(vec4 vec) {
|
|
||||||
return sqrtf(test_vec4_dot(vec, vec));
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
test_vec4_maxv(vec4 v1, vec4 v2, vec4 dest) {
|
|
||||||
dest[0] = glm_max(v1[0], v2[0]);
|
|
||||||
dest[1] = glm_max(v1[1], v2[1]);
|
|
||||||
dest[2] = glm_max(v1[2], v2[2]);
|
|
||||||
dest[3] = glm_max(v1[3], v2[3]);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
test_vec4_minv(vec4 v1, vec4 v2, vec4 dest) {
|
|
||||||
dest[0] = glm_min(v1[0], v2[0]);
|
|
||||||
dest[1] = glm_min(v1[1], v2[1]);
|
|
||||||
dest[2] = glm_min(v1[2], v2[2]);
|
|
||||||
dest[3] = glm_min(v1[3], v2[3]);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
test_vec4_clamp(vec4 v, float minVal, float maxVal) {
|
|
||||||
v[0] = glm_clamp(v[0], minVal, maxVal);
|
|
||||||
v[1] = glm_clamp(v[1], minVal, maxVal);
|
|
||||||
v[2] = glm_clamp(v[2], minVal, maxVal);
|
|
||||||
v[3] = glm_clamp(v[3], minVal, maxVal);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
test_vec4(void **state) {
|
|
||||||
vec4 v, v1, v2, v3, v4;
|
|
||||||
vec4s vs1, vs2, vs3, vs4;
|
|
||||||
int i;
|
|
||||||
float d1, d2;
|
|
||||||
|
|
||||||
for (i = 0; i < 1000; i++) {
|
|
||||||
/* 1. test SSE/SIMD dot product */
|
|
||||||
test_rand_vec4(v);
|
|
||||||
d1 = glm_vec4_dot(v, v);
|
|
||||||
d2 = test_vec4_dot(v, v);
|
|
||||||
|
|
||||||
assert_true(fabsf(d1 - d2) <= 0.000009);
|
|
||||||
|
|
||||||
/* 2. test SIMD normalize */
|
|
||||||
test_vec4_normalize_to(v, v1);
|
|
||||||
glm_vec4_normalize_to(v, v2);
|
|
||||||
glm_vec4_normalize(v);
|
|
||||||
|
|
||||||
/* all must be same */
|
|
||||||
test_assert_vec4_eq(v1, v2);
|
|
||||||
test_assert_vec4_eq(v, v2);
|
|
||||||
|
|
||||||
/* 3. test SIMD norm */
|
|
||||||
test_rand_vec4(v);
|
|
||||||
test_assert_eqf(test_vec4_norm(v), glm_vec4_norm(v));
|
|
||||||
|
|
||||||
/* 3. test SIMD norm2 */
|
|
||||||
test_rand_vec4(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 */
|
|
||||||
glm_vec4_zero(v);
|
|
||||||
test_assert_vec4_eq(GLM_VEC4_ZERO, v);
|
|
||||||
|
|
||||||
/* test one */
|
|
||||||
glm_vec4_one(v);
|
|
||||||
test_assert_vec4_eq(GLM_VEC4_ONE, v);
|
|
||||||
|
|
||||||
/* adds, subs, div, divs, mul */
|
|
||||||
glm_vec4_add(v, GLM_VEC4_ONE, v);
|
|
||||||
assert_true(glmc_vec4_eq_eps(v, 2));
|
|
||||||
|
|
||||||
glm_vec4_adds(v, 10, v);
|
|
||||||
assert_true(glmc_vec4_eq_eps(v, 12));
|
|
||||||
|
|
||||||
glm_vec4_sub(v, GLM_VEC4_ONE, v);
|
|
||||||
assert_true(glmc_vec4_eq_eps(v, 11));
|
|
||||||
|
|
||||||
glm_vec4_subs(v, 1, v);
|
|
||||||
assert_true(glmc_vec4_eq_eps(v, 10));
|
|
||||||
|
|
||||||
glm_vec4_broadcast(2, v1);
|
|
||||||
glm_vec4_div(v, v1, v);
|
|
||||||
assert_true(glmc_vec4_eq_eps(v, 5));
|
|
||||||
|
|
||||||
glm_vec4_divs(v, 0.5, v);
|
|
||||||
assert_true(glmc_vec4_eq_eps(v, 10));
|
|
||||||
|
|
||||||
glm_vec4_mul(v, v1, v);
|
|
||||||
assert_true(glmc_vec4_eq_eps(v, 20));
|
|
||||||
|
|
||||||
glm_vec4_scale(v, 0.5, v);
|
|
||||||
assert_true(glmc_vec4_eq_eps(v, 10));
|
|
||||||
|
|
||||||
glm_vec4_normalize_to(v, v1);
|
|
||||||
glm_vec4_scale(v1, 0.8, v1);
|
|
||||||
glm_vec4_scale_as(v, 0.8, v);
|
|
||||||
test_assert_vec4_eq(v1, v);
|
|
||||||
|
|
||||||
/* addadd, subadd, muladd */
|
|
||||||
glm_vec4_one(v);
|
|
||||||
|
|
||||||
glm_vec4_addadd(GLM_VEC4_ONE, GLM_VEC4_ONE, v);
|
|
||||||
assert_true(glmc_vec4_eq_eps(v, 3));
|
|
||||||
|
|
||||||
glm_vec4_subadd(GLM_VEC4_ONE, GLM_VEC4_ZERO, v);
|
|
||||||
assert_true(glmc_vec4_eq_eps(v, 4));
|
|
||||||
|
|
||||||
glm_vec4_broadcast(2, v1);
|
|
||||||
glm_vec4_broadcast(3, v2);
|
|
||||||
glm_vec4_muladd(v1, v2, v);
|
|
||||||
assert_true(glmc_vec4_eq_eps(v, 10));
|
|
||||||
|
|
||||||
/* min, max */
|
|
||||||
test_rand_vec4(v1);
|
|
||||||
test_rand_vec4(v2);
|
|
||||||
|
|
||||||
glm_vec4_maxv(v1, v2, v3);
|
|
||||||
test_vec4_maxv(v1, v2, v4);
|
|
||||||
test_assert_vec4_eq(v3, v4);
|
|
||||||
|
|
||||||
glm_vec4_minv(v1, v2, v3);
|
|
||||||
test_vec4_minv(v1, v2, v4);
|
|
||||||
test_assert_vec4_eq(v3, v4);
|
|
||||||
|
|
||||||
glm_vec4_print(v3, stderr);
|
|
||||||
glm_vec4_print(v4, stderr);
|
|
||||||
|
|
||||||
/* clamp */
|
|
||||||
glm_vec4_clamp(v3, 0.1, 0.8);
|
|
||||||
test_vec4_clamp(v4, 0.1, 0.8);
|
|
||||||
test_assert_vec4_eq(v3, v4);
|
|
||||||
|
|
||||||
glm_vec4_print(v3, stderr);
|
|
||||||
glm_vec4_print(v4, stderr);
|
|
||||||
|
|
||||||
assert_true(v3[0] >= 0.0999 && v3[0] <= 0.80001); /* rounding erros */
|
|
||||||
assert_true(v3[1] >= 0.0999 && v3[1] <= 0.80001);
|
|
||||||
assert_true(v3[2] >= 0.0999 && v3[2] <= 0.80001);
|
|
||||||
assert_true(v3[3] >= 0.0999 && v3[3] <= 0.80001);
|
|
||||||
|
|
||||||
/* swizzle */
|
|
||||||
|
|
||||||
/* ZYX */
|
|
||||||
v1[0] = 1;
|
|
||||||
v1[1] = 2;
|
|
||||||
v1[2] = 3;
|
|
||||||
v1[3] = 4;
|
|
||||||
|
|
||||||
glm_vec4_swizzle(v1, GLM_WZYX, v1);
|
|
||||||
test_assert_vec4_eq(v1, (vec4){4, 3, 2, 1});
|
|
||||||
|
|
||||||
glm_vec4_swizzle(v1, GLM_XXXX, v1);
|
|
||||||
test_assert_vec4_eq(v1, (vec4){4, 4, 4, 4});
|
|
||||||
|
|
||||||
v1[0] = 1;
|
|
||||||
v1[1] = 2;
|
|
||||||
v1[2] = 3;
|
|
||||||
v1[3] = 4;
|
|
||||||
|
|
||||||
glm_vec4_swizzle(v1, GLM_YYYY, v1);
|
|
||||||
test_assert_vec4_eq(v1, (vec4){2, 2, 2, 2});
|
|
||||||
|
|
||||||
v1[0] = 1;
|
|
||||||
v1[1] = 2;
|
|
||||||
v1[2] = 3;
|
|
||||||
v1[3] = 4;
|
|
||||||
|
|
||||||
glm_vec4_swizzle(v1, GLM_ZZZZ, v1);
|
|
||||||
test_assert_vec4_eq(v1, (vec4){3, 3, 3, 3});
|
|
||||||
|
|
||||||
v1[0] = 1;
|
|
||||||
v1[1] = 2;
|
|
||||||
v1[2] = 3;
|
|
||||||
v1[3] = 4;
|
|
||||||
|
|
||||||
glm_vec4_swizzle(v1, GLM_WWWW, v1);
|
|
||||||
test_assert_vec4_eq(v1, (vec4){4, 4, 4, 4});
|
|
||||||
|
|
||||||
/* structs */
|
|
||||||
vs1 = test_rand_vec4s();
|
|
||||||
vs2 = test_rand_vec4s();
|
|
||||||
|
|
||||||
vs3 = glms_vec4_add(vs1, vs2);
|
|
||||||
vs4 = glms_vec4_maxv(vs1, vs3);
|
|
||||||
test_assert_vec4s_eq(vs3, vs4);
|
|
||||||
}
|
|
||||||
1420
test/src/test_vec4.h
Normal file
1420
test/src/test_vec4.h
Normal file
File diff suppressed because it is too large
Load Diff
51
test/src/tests.c
Normal file
51
test/src/tests.c
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* test inline */
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
||||||
|
#define GLM_PREFIX glm_
|
||||||
|
#define GLM(X) (glm_ ## X)
|
||||||
|
|
||||||
|
#include "test_vec2.h"
|
||||||
|
#include "test_vec3.h"
|
||||||
|
#include "test_vec4.h"
|
||||||
|
#include "test_mat2.h"
|
||||||
|
#include "test_mat3.h"
|
||||||
|
#include "test_mat4.h"
|
||||||
|
#include "test_quat.h"
|
||||||
|
#include "test_project.h"
|
||||||
|
#include "test_plane.h"
|
||||||
|
#include "test_affine.h"
|
||||||
|
#include "test_affine_mat.h"
|
||||||
|
|
||||||
|
#undef GLM
|
||||||
|
#undef GLM_PREFIX
|
||||||
|
|
||||||
|
/* test pre-compiled */
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#define GLM_PREFIX glmc_
|
||||||
|
#define GLM(X) (glmc_ ## X)
|
||||||
|
|
||||||
|
#include "test_vec2.h"
|
||||||
|
#include "test_vec3.h"
|
||||||
|
#include "test_vec4.h"
|
||||||
|
#include "test_mat2.h"
|
||||||
|
#include "test_mat3.h"
|
||||||
|
#include "test_mat4.h"
|
||||||
|
#include "test_quat.h"
|
||||||
|
#include "test_project.h"
|
||||||
|
#include "test_plane.h"
|
||||||
|
#include "test_affine.h"
|
||||||
|
#include "test_affine_mat.h"
|
||||||
|
|
||||||
|
#undef GLM
|
||||||
|
#undef GLM_PREFIX
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
1390
test/tests.h
Normal file
1390
test/tests.h
Normal file
File diff suppressed because it is too large
Load Diff
5
win/.gitignore
vendored
5
win/.gitignore
vendored
@@ -1,4 +1,9 @@
|
|||||||
!cglm.sln
|
!cglm.sln
|
||||||
|
|
||||||
!cglm.vcxproj
|
!cglm.vcxproj
|
||||||
!cglm.vcxproj.filters
|
!cglm.vcxproj.filters
|
||||||
|
|
||||||
|
!cglm-test.vcxproj
|
||||||
|
!cglm-test.vcxproj.filters
|
||||||
|
|
||||||
!packages.config
|
!packages.config
|
||||||
|
|||||||
195
win/cglm-test.vcxproj
Normal file
195
win/cglm-test.vcxproj
Normal file
@@ -0,0 +1,195 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
|
<ProjectConfiguration Include="Debug|Win32">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|Win32">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Debug|x64">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|x64">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="..\test\runner.c" />
|
||||||
|
<ClCompile Include="..\test\src\tests.c" />
|
||||||
|
<ClCompile Include="..\test\src\test_bezier.c" />
|
||||||
|
<ClCompile Include="..\test\src\test_cam.c" />
|
||||||
|
<ClCompile Include="..\test\src\test_clamp.c" />
|
||||||
|
<ClCompile Include="..\test\src\test_common.c" />
|
||||||
|
<ClCompile Include="..\test\src\test_euler.c" />
|
||||||
|
<ClCompile Include="..\test\src\test_struct.c" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="..\test\include\common.h" />
|
||||||
|
<ClInclude Include="..\test\src\test_affine.h" />
|
||||||
|
<ClInclude Include="..\test\src\test_affine_mat.h" />
|
||||||
|
<ClInclude Include="..\test\src\test_common.h" />
|
||||||
|
<ClInclude Include="..\test\src\test_mat2.h" />
|
||||||
|
<ClInclude Include="..\test\src\test_mat3.h" />
|
||||||
|
<ClInclude Include="..\test\src\test_mat4.h" />
|
||||||
|
<ClInclude Include="..\test\src\test_plane.h" />
|
||||||
|
<ClInclude Include="..\test\src\test_project.h" />
|
||||||
|
<ClInclude Include="..\test\src\test_quat.h" />
|
||||||
|
<ClInclude Include="..\test\src\test_vec2.h" />
|
||||||
|
<ClInclude Include="..\test\src\test_vec3.h" />
|
||||||
|
<ClInclude Include="..\test\src\test_vec4.h" />
|
||||||
|
<ClInclude Include="..\test\tests.h" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="cglm.vcxproj">
|
||||||
|
<Project>{ca8bcaf9-cd25-4133-8f62-3d1449b5d2fc}</Project>
|
||||||
|
</ProjectReference>
|
||||||
|
</ItemGroup>
|
||||||
|
<PropertyGroup Label="Globals">
|
||||||
|
<VCProjectVersion>16.0</VCProjectVersion>
|
||||||
|
<ProjectGuid>{200E0DF1-7532-44E6-8273-84FB92C5557E}</ProjectGuid>
|
||||||
|
<Keyword>Win32Proj</Keyword>
|
||||||
|
<RootNamespace>cglmtest</RootNamespace>
|
||||||
|
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v142</PlatformToolset>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v142</PlatformToolset>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v142</PlatformToolset>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v142</PlatformToolset>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||||
|
<ImportGroup Label="ExtensionSettings">
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="Shared">
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<PropertyGroup Label="UserMacros" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<PrecompiledHeader>
|
||||||
|
</PrecompiledHeader>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<SDLCheck>true</SDLCheck>
|
||||||
|
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<ConformanceMode>true</ConformanceMode>
|
||||||
|
<AdditionalIncludeDirectories>../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<PrecompiledHeader>
|
||||||
|
</PrecompiledHeader>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<SDLCheck>true</SDLCheck>
|
||||||
|
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<ConformanceMode>true</ConformanceMode>
|
||||||
|
<AdditionalIncludeDirectories>../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<PrecompiledHeader>
|
||||||
|
</PrecompiledHeader>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<SDLCheck>true</SDLCheck>
|
||||||
|
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<ConformanceMode>true</ConformanceMode>
|
||||||
|
<AdditionalIncludeDirectories>../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<PrecompiledHeader>
|
||||||
|
</PrecompiledHeader>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<SDLCheck>true</SDLCheck>
|
||||||
|
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<ConformanceMode>true</ConformanceMode>
|
||||||
|
<AdditionalIncludeDirectories>../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
|
<ImportGroup Label="ExtensionTargets">
|
||||||
|
</ImportGroup>
|
||||||
|
</Project>
|
||||||
83
win/cglm-test.vcxproj.filters
Normal file
83
win/cglm-test.vcxproj.filters
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup>
|
||||||
|
<Filter Include="src">
|
||||||
|
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||||
|
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="include">
|
||||||
|
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||||
|
<Extensions>h;hh;hpp;hxx;hm;inl;inc;ipp;xsd</Extensions>
|
||||||
|
</Filter>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="..\test\runner.c">
|
||||||
|
<Filter>src</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\test\src\test_bezier.c">
|
||||||
|
<Filter>src</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\test\src\test_cam.c">
|
||||||
|
<Filter>src</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\test\src\test_clamp.c">
|
||||||
|
<Filter>src</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\test\src\test_common.c">
|
||||||
|
<Filter>src</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\test\src\test_euler.c">
|
||||||
|
<Filter>src</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\test\src\test_struct.c">
|
||||||
|
<Filter>src</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\test\src\tests.c">
|
||||||
|
<Filter>src</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="..\test\tests.h">
|
||||||
|
<Filter>include</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\test\src\test_common.h">
|
||||||
|
<Filter>include</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\test\include\common.h">
|
||||||
|
<Filter>include</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_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">
|
||||||
|
<Filter>src</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\test\src\test_affine_mat.h">
|
||||||
|
<Filter>src</Filter>
|
||||||
|
</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>
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
||||||
17
win/cglm.sln
17
win/cglm.sln
@@ -1,10 +1,12 @@
|
|||||||
|
|
||||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
# Visual Studio 15
|
# Visual Studio Version 16
|
||||||
VisualStudioVersion = 15.0.26403.7
|
VisualStudioVersion = 16.0.29123.88
|
||||||
MinimumVisualStudioVersion = 10.0.40219.1
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cglm", "cglm.vcxproj", "{CA8BCAF9-CD25-4133-8F62-3D1449B5D2FC}"
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cglm", "cglm.vcxproj", "{CA8BCAF9-CD25-4133-8F62-3D1449B5D2FC}"
|
||||||
EndProject
|
EndProject
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cglm-test", "cglm-test.vcxproj", "{200E0DF1-7532-44E6-8273-84FB92C5557E}"
|
||||||
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|x64 = Debug|x64
|
Debug|x64 = Debug|x64
|
||||||
@@ -21,8 +23,19 @@ Global
|
|||||||
{CA8BCAF9-CD25-4133-8F62-3D1449B5D2FC}.Release|x64.Build.0 = Release|x64
|
{CA8BCAF9-CD25-4133-8F62-3D1449B5D2FC}.Release|x64.Build.0 = Release|x64
|
||||||
{CA8BCAF9-CD25-4133-8F62-3D1449B5D2FC}.Release|x86.ActiveCfg = Release|Win32
|
{CA8BCAF9-CD25-4133-8F62-3D1449B5D2FC}.Release|x86.ActiveCfg = Release|Win32
|
||||||
{CA8BCAF9-CD25-4133-8F62-3D1449B5D2FC}.Release|x86.Build.0 = Release|Win32
|
{CA8BCAF9-CD25-4133-8F62-3D1449B5D2FC}.Release|x86.Build.0 = Release|Win32
|
||||||
|
{200E0DF1-7532-44E6-8273-84FB92C5557E}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
|
{200E0DF1-7532-44E6-8273-84FB92C5557E}.Debug|x64.Build.0 = Debug|x64
|
||||||
|
{200E0DF1-7532-44E6-8273-84FB92C5557E}.Debug|x86.ActiveCfg = Debug|Win32
|
||||||
|
{200E0DF1-7532-44E6-8273-84FB92C5557E}.Debug|x86.Build.0 = Debug|Win32
|
||||||
|
{200E0DF1-7532-44E6-8273-84FB92C5557E}.Release|x64.ActiveCfg = Release|x64
|
||||||
|
{200E0DF1-7532-44E6-8273-84FB92C5557E}.Release|x64.Build.0 = Release|x64
|
||||||
|
{200E0DF1-7532-44E6-8273-84FB92C5557E}.Release|x86.ActiveCfg = Release|Win32
|
||||||
|
{200E0DF1-7532-44E6-8273-84FB92C5557E}.Release|x86.Build.0 = Release|Win32
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
|
SolutionGuid = {2AEF23C9-433B-428B-BEBC-068BF3AC9A65}
|
||||||
|
EndGlobalSection
|
||||||
EndGlobal
|
EndGlobal
|
||||||
|
|||||||
@@ -28,18 +28,21 @@
|
|||||||
<ClCompile Include="..\src\euler.c" />
|
<ClCompile Include="..\src\euler.c" />
|
||||||
<ClCompile Include="..\src\frustum.c" />
|
<ClCompile Include="..\src\frustum.c" />
|
||||||
<ClCompile Include="..\src\io.c" />
|
<ClCompile Include="..\src\io.c" />
|
||||||
|
<ClCompile Include="..\src\mat2.c" />
|
||||||
<ClCompile Include="..\src\mat3.c" />
|
<ClCompile Include="..\src\mat3.c" />
|
||||||
<ClCompile Include="..\src\mat4.c" />
|
<ClCompile Include="..\src\mat4.c" />
|
||||||
<ClCompile Include="..\src\plane.c" />
|
<ClCompile Include="..\src\plane.c" />
|
||||||
<ClCompile Include="..\src\project.c" />
|
<ClCompile Include="..\src\project.c" />
|
||||||
<ClCompile Include="..\src\quat.c" />
|
<ClCompile Include="..\src\quat.c" />
|
||||||
<ClCompile Include="..\src\sphere.c" />
|
<ClCompile Include="..\src\sphere.c" />
|
||||||
|
<ClCompile Include="..\src\vec2.c" />
|
||||||
<ClCompile Include="..\src\vec3.c" />
|
<ClCompile Include="..\src\vec3.c" />
|
||||||
<ClCompile Include="..\src\vec4.c" />
|
<ClCompile Include="..\src\vec4.c" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="..\include\cglm\affine-mat.h" />
|
<ClInclude Include="..\include\cglm\affine-mat.h" />
|
||||||
<ClInclude Include="..\include\cglm\affine.h" />
|
<ClInclude Include="..\include\cglm\affine.h" />
|
||||||
|
<ClInclude Include="..\include\cglm\applesimd.h" />
|
||||||
<ClInclude Include="..\include\cglm\bezier.h" />
|
<ClInclude Include="..\include\cglm\bezier.h" />
|
||||||
<ClInclude Include="..\include\cglm\box.h" />
|
<ClInclude Include="..\include\cglm\box.h" />
|
||||||
<ClInclude Include="..\include\cglm\call.h" />
|
<ClInclude Include="..\include\cglm\call.h" />
|
||||||
@@ -52,12 +55,14 @@
|
|||||||
<ClInclude Include="..\include\cglm\call\euler.h" />
|
<ClInclude Include="..\include\cglm\call\euler.h" />
|
||||||
<ClInclude Include="..\include\cglm\call\frustum.h" />
|
<ClInclude Include="..\include\cglm\call\frustum.h" />
|
||||||
<ClInclude Include="..\include\cglm\call\io.h" />
|
<ClInclude Include="..\include\cglm\call\io.h" />
|
||||||
|
<ClInclude Include="..\include\cglm\call\mat2.h" />
|
||||||
<ClInclude Include="..\include\cglm\call\mat3.h" />
|
<ClInclude Include="..\include\cglm\call\mat3.h" />
|
||||||
<ClInclude Include="..\include\cglm\call\mat4.h" />
|
<ClInclude Include="..\include\cglm\call\mat4.h" />
|
||||||
<ClInclude Include="..\include\cglm\call\plane.h" />
|
<ClInclude Include="..\include\cglm\call\plane.h" />
|
||||||
<ClInclude Include="..\include\cglm\call\project.h" />
|
<ClInclude Include="..\include\cglm\call\project.h" />
|
||||||
<ClInclude Include="..\include\cglm\call\quat.h" />
|
<ClInclude Include="..\include\cglm\call\quat.h" />
|
||||||
<ClInclude Include="..\include\cglm\call\sphere.h" />
|
<ClInclude Include="..\include\cglm\call\sphere.h" />
|
||||||
|
<ClInclude Include="..\include\cglm\call\vec2.h" />
|
||||||
<ClInclude Include="..\include\cglm\call\vec3.h" />
|
<ClInclude Include="..\include\cglm\call\vec3.h" />
|
||||||
<ClInclude Include="..\include\cglm\call\vec4.h" />
|
<ClInclude Include="..\include\cglm\call\vec4.h" />
|
||||||
<ClInclude Include="..\include\cglm\cam.h" />
|
<ClInclude Include="..\include\cglm\cam.h" />
|
||||||
@@ -69,6 +74,7 @@
|
|||||||
<ClInclude Include="..\include\cglm\euler.h" />
|
<ClInclude Include="..\include\cglm\euler.h" />
|
||||||
<ClInclude Include="..\include\cglm\frustum.h" />
|
<ClInclude Include="..\include\cglm\frustum.h" />
|
||||||
<ClInclude Include="..\include\cglm\io.h" />
|
<ClInclude Include="..\include\cglm\io.h" />
|
||||||
|
<ClInclude Include="..\include\cglm\mat2.h" />
|
||||||
<ClInclude Include="..\include\cglm\mat3.h" />
|
<ClInclude Include="..\include\cglm\mat3.h" />
|
||||||
<ClInclude Include="..\include\cglm\mat4.h" />
|
<ClInclude Include="..\include\cglm\mat4.h" />
|
||||||
<ClInclude Include="..\include\cglm\plane.h" />
|
<ClInclude Include="..\include\cglm\plane.h" />
|
||||||
@@ -94,12 +100,15 @@
|
|||||||
<ClInclude Include="..\include\cglm\struct\euler.h" />
|
<ClInclude Include="..\include\cglm\struct\euler.h" />
|
||||||
<ClInclude Include="..\include\cglm\struct\frustum.h" />
|
<ClInclude Include="..\include\cglm\struct\frustum.h" />
|
||||||
<ClInclude Include="..\include\cglm\struct\io.h" />
|
<ClInclude Include="..\include\cglm\struct\io.h" />
|
||||||
|
<ClInclude Include="..\include\cglm\struct\mat2.h" />
|
||||||
<ClInclude Include="..\include\cglm\struct\mat3.h" />
|
<ClInclude Include="..\include\cglm\struct\mat3.h" />
|
||||||
<ClInclude Include="..\include\cglm\struct\mat4.h" />
|
<ClInclude Include="..\include\cglm\struct\mat4.h" />
|
||||||
<ClInclude Include="..\include\cglm\struct\plane.h" />
|
<ClInclude Include="..\include\cglm\struct\plane.h" />
|
||||||
<ClInclude Include="..\include\cglm\struct\project.h" />
|
<ClInclude Include="..\include\cglm\struct\project.h" />
|
||||||
<ClInclude Include="..\include\cglm\struct\quat.h" />
|
<ClInclude Include="..\include\cglm\struct\quat.h" />
|
||||||
<ClInclude Include="..\include\cglm\struct\sphere.h" />
|
<ClInclude Include="..\include\cglm\struct\sphere.h" />
|
||||||
|
<ClInclude Include="..\include\cglm\struct\vec2-ext.h" />
|
||||||
|
<ClInclude Include="..\include\cglm\struct\vec2.h" />
|
||||||
<ClInclude Include="..\include\cglm\struct\vec3-ext.h" />
|
<ClInclude Include="..\include\cglm\struct\vec3-ext.h" />
|
||||||
<ClInclude Include="..\include\cglm\struct\vec3.h" />
|
<ClInclude Include="..\include\cglm\struct\vec3.h" />
|
||||||
<ClInclude Include="..\include\cglm\struct\vec4-ext.h" />
|
<ClInclude Include="..\include\cglm\struct\vec4-ext.h" />
|
||||||
@@ -107,6 +116,8 @@
|
|||||||
<ClInclude Include="..\include\cglm\types-struct.h" />
|
<ClInclude Include="..\include\cglm\types-struct.h" />
|
||||||
<ClInclude Include="..\include\cglm\types.h" />
|
<ClInclude Include="..\include\cglm\types.h" />
|
||||||
<ClInclude Include="..\include\cglm\util.h" />
|
<ClInclude Include="..\include\cglm\util.h" />
|
||||||
|
<ClInclude Include="..\include\cglm\vec2-ext.h" />
|
||||||
|
<ClInclude Include="..\include\cglm\vec2.h" />
|
||||||
<ClInclude Include="..\include\cglm\vec3-ext.h" />
|
<ClInclude Include="..\include\cglm\vec3-ext.h" />
|
||||||
<ClInclude Include="..\include\cglm\vec3.h" />
|
<ClInclude Include="..\include\cglm\vec3.h" />
|
||||||
<ClInclude Include="..\include\cglm\vec4-ext.h" />
|
<ClInclude Include="..\include\cglm\vec4-ext.h" />
|
||||||
|
|||||||
@@ -1,14 +1,10 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Filter Include="Header Files">
|
<Filter Include="Header Files">
|
||||||
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||||
<Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
|
<Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
|
||||||
</Filter>
|
</Filter>
|
||||||
<Filter Include="Resource Files">
|
|
||||||
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
|
||||||
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
|
||||||
</Filter>
|
|
||||||
<Filter Include="src">
|
<Filter Include="src">
|
||||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||||
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||||
@@ -90,6 +86,12 @@
|
|||||||
<ClCompile Include="..\src\bezier.c">
|
<ClCompile Include="..\src\bezier.c">
|
||||||
<Filter>src</Filter>
|
<Filter>src</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\src\mat2.c">
|
||||||
|
<Filter>src</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\src\vec2.c">
|
||||||
|
<Filter>src</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="..\src\config.h">
|
<ClInclude Include="..\src\config.h">
|
||||||
@@ -257,6 +259,9 @@
|
|||||||
<ClInclude Include="..\include\cglm\call\bezier.h">
|
<ClInclude Include="..\include\cglm\call\bezier.h">
|
||||||
<Filter>include\cglm\call</Filter>
|
<Filter>include\cglm\call</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\include\cglm\vec2.h">
|
||||||
|
<Filter>include\cglm</Filter>
|
||||||
|
</ClInclude>
|
||||||
<ClInclude Include="..\include\cglm\struct\affine.h">
|
<ClInclude Include="..\include\cglm\struct\affine.h">
|
||||||
<Filter>include\cglm\struct</Filter>
|
<Filter>include\cglm\struct</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
@@ -317,5 +322,29 @@
|
|||||||
<ClInclude Include="..\include\cglm\types-struct.h">
|
<ClInclude Include="..\include\cglm\types-struct.h">
|
||||||
<Filter>include\cglm</Filter>
|
<Filter>include\cglm</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\include\cglm\call\mat2.h">
|
||||||
|
<Filter>include\cglm\call</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\include\cglm\call\vec2.h">
|
||||||
|
<Filter>include\cglm\call</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\include\cglm\struct\mat2.h">
|
||||||
|
<Filter>include\cglm\struct</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\include\cglm\applesimd.h">
|
||||||
|
<Filter>include\cglm</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\include\cglm\mat2.h">
|
||||||
|
<Filter>include\cglm</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\include\cglm\vec2-ext.h">
|
||||||
|
<Filter>include\cglm</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\include\cglm\struct\vec2.h">
|
||||||
|
<Filter>include\cglm\struct</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\include\cglm\struct\vec2-ext.h">
|
||||||
|
<Filter>include\cglm\struct</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
Reference in New Issue
Block a user