Compare commits

..

181 Commits

Author SHA1 Message Date
Recep Aslantas
772238f53f update cmake to respect DEBUG 2024-03-01 12:01:58 +03:00
Recep Aslantas
b9e62b6fe5 use NDEBUG to check DEBUG mode 2024-03-01 12:00:01 +03:00
Recep Aslantas
c9e2b81e99 test: fix ivec2 and ivec3 comparison and suppress warnings 2024-02-24 06:55:45 +03:00
Recep Aslantas
ee18e58815 test: fix ivec2 and ivec3 comparison and suppress warnings 2024-02-24 06:50:07 +03:00
Recep Aslantas
85ee366861 move deprecated glmc_aabb2d_size to right place 2024-02-24 06:33:30 +03:00
Recep Aslantas
0e4201b816 suppress warnings: C4244: 'function': conversion from 'int' to 'float' 2024-02-24 06:10:48 +03:00
Recep Aslantas
b7e4c96738 Merge pull request #392 from duarm/master
aabb2d_zero, aabb2d_diagonal and aabb2d_size
2024-02-24 05:58:49 +03:00
duarm
0d92bfc722 docs and call api for _aabb2d_zero 2024-02-23 14:07:58 -03:00
duarm
237432969d macro for call api too 2024-02-23 14:01:26 -03:00
duarm
131ac68ad3 size -> diag, new sizev 2024-02-23 13:53:25 -03:00
duarm
7e6a463256 call api 2024-02-19 14:38:05 -03:00
duarm
e312f282b4 glm_aabb2d_zero, _size -> _diagonal, new _size 2024-02-19 14:34:30 -03:00
Recep Aslantas
78fb330850 Merge pull request #391 from waywardmonkeys/ci-add-arm64-uwp
ci: Add ARM64 UWP for WindowsStore.
2024-02-12 12:23:31 +03:00
Recep Aslantas
4896b2ea8d Merge pull request #390 from waywardmonkeys/doc-improvements
Doc improvements
2024-02-12 12:21:59 +03:00
Bruce Mitchener
366e0d44e2 ci: Add ARM64 UWP for WindowsStore.
This is one of the core vcpkg targets and I'm trying to enable
the cglm port there to support UWP, so we should have it in the
CI here.
2024-02-12 09:17:56 +07:00
Bruce Mitchener
47a27f9d07 ci / docs: Turn sphinx warnings into errors.
This will help prevent future warnings from sphinx.
2024-02-12 09:01:29 +07:00
Bruce Mitchener
7957179808 docs: Remove duplicate definitions. 2024-02-12 09:00:08 +07:00
Bruce Mitchener
3e79c4d799 docs: Additions and corrections.
* Add missing doc for `glm_vec4_one`.
* mat4: correct links to some functions.
2024-02-12 08:49:50 +07:00
Bruce Mitchener
af5048595f docs: Use .. note:: to display better.
Also, make sure the note content has a blank line after it to
remove a warning from Sphinx.
2024-02-11 23:43:35 +07:00
Bruce Mitchener
270d2b9d05 docs: Add missing aabb2d, fix broken link. 2024-02-11 23:43:35 +07:00
Recep Aslantas
eb9a200b6c Merge pull request #389 from waywardmonkeys/aabb2d-struct-api
aabb2d: Fix struct api.
2024-02-11 19:09:58 +03:00
Bruce Mitchener
fd661d1b43 aabb2d: Fix struct api. 2024-02-11 06:41:39 +07:00
Recep Aslantas
db6f9641ab Merge pull request #387 from waywardmonkeys/remove-narrowing-conversion
glm_ease_back_inout: Use float constant for float var.
2024-02-10 23:49:37 +03:00
Recep Aslantas
125002cfb3 Merge pull request #388 from waywardmonkeys/remove-appveyor
ci: Remove appveyor.
2024-02-10 23:43:25 +03:00
Bruce Mitchener
bb9a35caaf ci: Remove appveyor.
This is now handled by the GitHub Actions CI.
2024-02-10 22:47:33 +07:00
Recep Aslantas
b89315f2c5 Merge pull request #386 from waywardmonkeys/improve-ci
Add additional CI via GitHub Actions.
2024-02-10 17:29:42 +03:00
Bruce Mitchener
e80d163d71 glm_ease_back_inout: Use float constant for float var. 2024-02-10 19:47:38 +07:00
Bruce Mitchener
74c5e86d0c Add additional CI via GitHub Actions. 2024-02-10 14:10:12 +07:00
Recep Aslantas
45134b1265 Merge pull request #384 from waywardmonkeys/fix-more-typos
Fix typos.
2024-02-08 17:18:29 +03:00
Recep Aslantas
b63b2b90b3 Merge pull request #383 from tarhses/structapi-ivec
Implement struct API for ivec2, ivec3, and ivec4
2024-02-08 17:13:03 +03:00
Bruce Mitchener
e4419c4f18 Fix typos. 2024-02-08 15:12:30 +07:00
Pierre Luycx
17f3ea5fab Implement struct API for ivec2, ivec3, and ivec4 2024-02-07 20:53:40 +01:00
Recep Aslantas
a8685ed6ab Merge pull request #381 from vitassuper/vector_improvements
Add new functions for ivec2 and ivec3
2024-01-27 19:33:45 +03:00
Vitaliy Klychkov
029bead207 Update ivec2 and ivec3 documentation 2024-01-27 13:45:27 +00:00
Vitaliy Klychkov
30845124b4 Add additional functions for ivec2 and ivec3 2024-01-27 13:11:04 +00:00
Recep Aslantas
80d5064476 docs: update read the docs package versions 2024-01-15 21:44:48 +03:00
Recep Aslantas
2bd97f6599 Merge pull request #379 from recp/simd_min_max
simd: min / max helpers
2024-01-11 00:21:10 +03:00
Recep Aslantas
6d8dd42ac2 simd: use new glmm_min/max in vec4 where possible 2024-01-11 00:14:28 +03:00
Recep Aslantas
dab86796a4 simd: min / max helpers 2024-01-09 21:35:39 +03:00
Recep Aslantas
4b93cb3e05 Merge pull request #378 from recp/win32_intrin
win32, simd: ensure we are on msvc when checking MSVC specific headers
2024-01-08 00:10:43 +03:00
Recep Aslantas
a682b9e6cf win32, tests: fix drand48() error on mingw 2024-01-04 12:49:45 +03:00
Recep Aslantas
bca93a379d win32, simd: ensure we are on msvc when checking MSVC specific headers 2024-01-04 11:54:42 +03:00
Recep Aslantas
34f0d59f5a now working on v0.9.3 2023-12-31 15:19:36 +03:00
Recep Aslantas
c878161518 Update project.h 2023-12-31 13:49:06 +03:00
Recep Aslantas
3b1d4fc546 struct: add missing glms_project_z() 2023-12-31 13:46:51 +03:00
Recep Aslantas
5be1c2f059 struct: fix glms_rotate_atm signature 2023-12-31 13:21:08 +03:00
Recep Aslantas
67ce1519c5 tests: fix comparing integers in tests 2023-12-30 23:47:58 +03:00
Recep Aslantas
86743c98e5 build: add missing files 2023-12-30 23:35:03 +03:00
Recep Aslantas
015e859075 fix some doc typos & warnings 2023-12-30 23:11:15 +03:00
Recep Aslantas
3a2a26e5a4 Merge pull request #377 from telephone001/euler_to_quat_lh 2023-12-30 21:31:28 +03:00
John Choi
1ccd9af866 added comment about rh vs lh zsin 2023-12-30 12:06:40 -06:00
John Choi
aa20b8ae7f added implementation of euler_to_quat_lh and fixed the tests. Now I gotta decide what to name the macros for controlling lefthand and also make call functions for rh and lh conditionally declared 2023-12-28 11:01:01 -06:00
John Choi
fa6244c42b added tests for euler_to_quat_lh. Currently they don't have any euler->mat4->quat tests because there is no left handed version of those. But I could try to find a way to change it 2023-12-28 10:31:14 -06:00
John Choi
c998d0186a made struct versions of euler to quat. Also fixed up documentation in euler to quat struct. 2023-12-28 09:52:17 -06:00
John Choi
a94861dd5d cleaned up documentation for euler to quat functions and also created the lh file. Made a handed struct file so I remember to do that 2023-12-28 09:21:05 -06:00
Recep Aslantas
040926999a Merge pull request #369 from telephone001/master
euler to quat functions
2023-12-25 10:42:04 +03:00
Recep Aslantas
40cfbe9717 Merge pull request #373 from BeeverFeever/master
ivec += and -= functions
2023-12-25 10:34:10 +03:00
John Choi
d820410435 Merge remote-tracking branch 'refs/remotes/origin/master' 2023-12-24 23:59:34 -06:00
John Choi
39c0c1e784 added handed folder and also made rh tests for the euler->quat functions. Still deciding on what to name the macro for lefthanded stuff 2023-12-24 23:58:29 -06:00
BeeverFeever
4c9b32324d Add tests for ivec -= and += functions 2023-12-25 12:51:33 +11:00
BeeverFeever
921ab6640b Implement -= and += functions for ivecs 2023-12-25 12:51:10 +11:00
BeeverFeever
7701a1a789 Add int min and max functions 2023-12-25 12:50:29 +11:00
telephone001.mdl
46aaf250fa Merge branch 'master' into master 2023-12-14 14:19:22 -06:00
John Choi
42b5e834d1 re-added the euler->mat4->quat tests 2023-12-14 12:00:58 -06:00
John Choi
732a403112 changed last parameter to be destination and also removed the euler->mat4->quat test. 2023-12-13 08:57:10 -06:00
Recep Aslantas
559a6588c8 readthedocs 2023-12-12 13:19:19 +03:00
Recep Aslantas
8277473202 Create .readthedocs.yaml 2023-12-12 13:02:04 +03:00
Recep Aslantas
97575bdcd6 fix glmm_fmsub() on arm-neon: https://github.com/recp/cglm/pull/364 thanks to @gottfriedleibniz 2023-12-12 11:24:25 +03:00
Recep Aslantas
bc2a918ad0 Merge pull request #374 from waywardmonkeys/update-ci-checkout-action
ci: Update to `actions/checkout@v4` from `v3`.
2023-12-11 21:49:09 +03:00
Bruce Mitchener
8ebcc3aceb ci: Update to actions/checkout@v4 from v3. 2023-12-11 22:33:29 +07:00
BeeverFeever
d341478342 testing new ivec* funcs 2023-12-11 20:18:18 +11:00
John Choi
7e4383cb3d found out I was using glm_euler_xyz_quat in some testers that tests other types. I thought I changed it yesterday. Also there is still a problem with quaternion axis multiplication vs euler to mat4 to quat 2023-12-10 11:46:50 -06:00
Recep Aslantas
b45657f673 Update tests.h 2023-12-10 20:39:52 +03:00
telephone001.mdl
e24675c6e0 Merge branch 'recp:master' into master 2023-12-10 11:38:51 -06:00
Recep Aslantas
2e6e4a9a44 Merge branch 'master' of https://github.com/recp/cglm 2023-12-10 20:30:52 +03:00
Recep Aslantas
4f88a027bc Merge pull request #364 from BeeverFeever/master
New subtraction family of vector functions
2023-12-10 20:29:19 +03:00
Recep Aslantas
673263265b fix glmm_fmsub() on arm-neon 2023-12-10 20:28:39 +03:00
Recep Aslantas
dd9235dfee fix glmm_fmsub() on arm-neon 2023-12-10 17:13:11 +03:00
BeeverFeever
4c4a69ddfe Should be all 2023-12-11 01:08:10 +11:00
John Choi
d6139559b6 Merge remote-tracking branch 'refs/remotes/origin/master' 2023-12-10 01:19:12 -06:00
John Choi
2eb9a67a3a fixed up the code to fit with the style, Also found out that I was calculating my quaternion rotations the opposite way (zyx order instead of xyz order) 2023-12-10 01:16:09 -06:00
Recep Aslantas
8a1d1cf35d fix glmm_fmsub() on arm-neon 2023-12-10 10:06:36 +03:00
telephone001.mdl
fee2b7d344 Merge branch 'recp:master' into master 2023-12-09 23:41:25 -06:00
BeeverFeever
865faad116 Fix simd versions 2023-12-10 15:49:59 +11:00
Recep Aslantas
7ccf199066 Merge pull request #372 from EasyIP2023/bugfix/docs-non-square
docs: 2/2 fixes https://github.com/recp/cglm/issues/371
2023-12-09 23:08:29 +03:00
Vincent Davis Jr
047138321c docs: 2/2 fixes https://github.com/recp/cglm/issues/371
Second commit for fixing non-square matrix
multiplication docs.

Signed-off-by: Vincent Davis Jr <vince@underview.tech>
2023-12-09 14:28:57 -05:00
Recep Aslantas
75b99ef87d fixes: https://github.com/recp/cglm/issues/371 2023-12-09 21:28:53 +03:00
John Choi
036fd4848b moved all my stuff to euler because it fits there better. Also, had to move my tests into a single euler test because it wouldn't work outside that one test. Maybe later I will create test_euler.h like how test_quat.h works 2023-12-09 00:38:38 -06:00
John Choi
666d692dfb fixed the bug with the tester. Its weird that the broken tester worked on my computer 2023-12-08 23:06:36 -06:00
John Choi
ec3796973e finished but trying to figure out why its not running in wasm 2023-12-08 14:15:49 -06:00
telephone001.mdl
45f2fff22f Merge branch 'recp:master' into master 2023-12-08 13:09:24 -06:00
John Choi
4ee6aea037 made quat struct and also exported it 2023-12-08 13:05:53 -06:00
John Choi
2f7dbad6a8 finally done with tests and all euler to quaternion functions 2023-12-08 12:19:09 -06:00
Recep Aslantas
5ae0cd4618 Merge pull request #367 from v1993/struct-clipspace-fixes
Fix struct clipspace headers
2023-12-08 15:12:12 +03:00
Valeri Ochinski
23d03ffe6c Fix struct clipspace headers
Add missing includes, fix signatures
2023-12-08 10:14:43 +03:00
John Choi
c5694c5c17 made all the functions. I have miscalculated some stuff and am currently trying to test them. I have created all the testing functions as well 2023-12-08 00:26:33 -06:00
John Choi
d67ac97323 got the euler to quat xyz working and got the tests to pass 2023-12-07 12:21:55 -06:00
John Choi
05ea35ffec made euler to quat xyz. Now I'm trying to test if it works or not 2023-12-07 10:29:07 -06:00
Recep Aslantas
05d45872a3 Merge pull request #355 from duarm/aabb2d
aabb2d
2023-12-06 22:58:31 +03:00
duarm
c431bbf190 fix procedure comment on transform 2023-12-06 16:54:46 -03:00
duarm
340292c0fb fix transform 2023-12-06 16:52:55 -03:00
duarm
2106f9ebcb remove _aabb2d_frustum 2023-12-06 16:48:48 -03:00
duarm
c1d78d835b changing from mat4 to mat3 2023-12-06 16:34:18 -03:00
duarm
de80b8325f Merge branch 'master' into aabb2d 2023-12-06 16:14:00 -03:00
duarm
7061df0066 circle docs fixup 2023-12-06 16:14:59 -03:00
duarm
eb73e4123b docs fix 2023-12-06 16:13:08 -03:00
BeeverFeever
22140d8e1b Fix test 2023-12-05 19:48:54 +11:00
BeeverFeever
39602ef4d7 Fix vec4 functions 2023-12-05 18:49:10 +11:00
Recep Aslantas
abb71a8e32 fixes: https://github.com/recp/cglm/pull/360#issuecomment-1838122934 2023-12-05 10:31:46 +03:00
BeeverFeever
f8b6573de8 Write tests for new functions 2023-12-04 23:28:56 +11:00
BeeverFeever
15f29e05eb Fixed missed function 2023-12-04 23:28:29 +11:00
BeeverFeever
7696374f1e Vector subtraction functions
Add subtraction family of functions for vectors.
2023-12-04 21:32:19 +11:00
duarm
44d103fa00 typos 2023-12-03 02:36:04 -03:00
duarm
c29f077bed Merge branch 'master' into aabb2d 2023-12-02 21:02:20 -03:00
duarm
2a975a7d0a circle fix, new copy func 2023-12-02 21:00:21 -03:00
Recep Aslantas
049db64a0f Merge pull request #360 from v1993/meson-header-only-subproject
meson: don't build by default if used in a subproject
2023-12-02 15:49:24 +03:00
Recep Aslantas
e71694bb57 Merge branch 'master' into meson-header-only-subproject 2023-12-02 15:48:54 +03:00
Recep Aslantas
8754158fbe Merge pull request #362 from myfreeer/patch-1
ci: initial support of meson and emscripten
2023-12-02 11:13:20 +03:00
Recep Aslantas
e1a0892097 Merge branch 'master' into patch-1 2023-12-02 11:12:43 +03:00
Recep Aslantas
9b26aff466 Merge pull request #361 from myfreeer/myfreeer-patch-4
wasm: prefer pmin/pmax
2023-12-02 11:12:15 +03:00
myfreeer
24e417107b ci: initial support of meson and emscripten
It seems that meson only supports emscripten as a compiler to wasm at present, wasi-sdk support is not completed yet, so this only adds ci build scripts for emscripten.

References:
* <f41bdae368>
* <https://github.com/mesonbuild/meson/pull/11862>
2023-12-02 11:08:33 +08:00
myfreeer
009405adcd wasm: prefer pmin/pmax
According to [emscripten](https://emscripten.org/docs/porting/simd.html) and [v8](b6520eda5e/src/compiler/backend/x64/code-generator-x64.cc (L2661-L2699)), `[f32x4|f64x2].[min|max]` compiles to much more instructions than `[f32x4|f64x2].[pmin|pmax]`.
It is defined in [spec](https://github.com/WebAssembly/spec/blob/main/proposals/simd/SIMD.md#floating-point-min-and-max) that the difference between pmin/pmax and min/max is NaN-propagating behavior, and the equivalent to the x86 `_mm_min_ps`/`_mm_max_ps` is pmin/pmax in [v8](b6520eda5e/src/compiler/backend/x64/code-generator-x64.cc (L2740-L2747)).
This should make functions with min/max faster on webassembly, and align with the existing behavior with x86 sse.
2023-12-02 09:54:49 +08:00
Valeri
0b2006dd47 meson: don't build by default if used in a subproject 2023-12-02 01:44:54 +03:00
Recep Aslantas
1fdc1c8675 struct: remove _vec_inv from struct function lists 2023-12-01 11:18:48 +03:00
Recep Aslantas
6e1d6d505b Merge pull request #357 from v1993/vs-fix
Use the appropriate version of alignof
2023-12-01 11:11:11 +03:00
Valeri
45cf4710c4 Use the appropriate version of alignof 2023-12-01 04:19:47 +03:00
duarm
056b28e4da Merge branch 'master' into aabb2d 2023-11-19 10:00:00 -03:00
Recep Aslantas
c6e58bd44a Update vec4-ext.h 2023-11-16 13:06:51 +03:00
Recep Aslantas
a81c0f076a Merge pull request #356 from havrik/patch-1
Fix definition logic misspell in 'glm_quat_normalize_to' -> cglm/quat.h
2023-11-16 13:05:42 +03:00
havrik
ab684b7c66 Fix definition logic misspell in 'glm_quat_normalize_to' -> cglm/quat.h 2023-11-16 11:38:47 +03:00
duarm
53bde05bd9 aabb2d functions 2023-11-11 08:13:28 -03:00
Recep Aslantas
58a4b47830 Merge pull request #354 from One234Fi/revise_troubleshooting_page
Fix spelling and grammar on troubleshooting page
2023-11-09 10:44:06 +03:00
One234Fi
1bfa53f44c spelling and grammar revision 2023-11-08 16:41:07 -06:00
Recep Aslantas
d93b46bab7 Merge pull request #350 from duarm/vec2_center
adding glm_vec2_center
2023-10-15 00:17:47 +03:00
duarm
9efc255451 struct api 2023-10-14 14:24:25 -03:00
duarm
9484155c98 adding vec2_center 2023-10-11 16:51:14 -03:00
Recep Aslantas
509078817c fix glm_ivec2|3_fill and glm_ivec2|3_eq params continue 2023-09-05 20:41:55 +03:00
Recep Aslantas
126f809dae fix glm_ivec2|3_fill and glm_ivec2|3_eq params 2023-09-05 20:19:33 +03:00
Recep Aslantas
e0e7e380e5 Merge pull request #346 from duarm/master
eqv, eq, fill for ivec2 and ivec3, documentation fixes
2023-09-05 09:34:28 +03:00
duarm
d3169b12a7 missing call functions from vec2 2023-09-04 20:14:59 -03:00
duarm
9d0c9fdb87 adding ivec2, ivec3, ivec4 prints, eqv, eq and fill, documentation fixes 2023-09-04 20:07:37 -03:00
Recep Aslantas
f496146bce Merge pull request #345 from telephone001/ins3_bugfix
Fixed glms_mat4_ins3 bug.
2023-08-30 13:03:16 +03:00
LAPTOP-GHFRJ92J\John
54632ecce5 mat4_ins3 should copy mat3s to upper left mat4s. Previously, it just made a new mat4s r and put the mat3 into that and returned it. Now it takes in a mat4s and copies the mat3s to that. 2023-08-29 02:13:24 -05:00
Recep Aslantas
61478d2563 now working on v0.9.2 2023-08-10 09:20:39 +03:00
Recep Aslantas
cdd4d0e83e Merge pull request #340 from recp/non-square-matrix
add some missing non-square matrix funcs
2023-08-07 17:58:05 +03:00
Recep Aslantas
54dfc4b4f0 Merge branch 'master' into non-square-matrix 2023-08-07 15:37:44 +03:00
Recep Aslantas
f6cb3ba31a Merge pull request #343 from EasyIP2023/non-square-matrix
add docs and tests to non-square-matrix branch
2023-08-07 14:41:08 +03:00
Vincent Davis Jr
da51741c50 test: add missing mat4x3 tests
Signed-off-by: Vincent Davis Jr <vince@underview.tech>
2023-08-06 14:12:46 -04:00
Vincent Davis Jr
a5d8e61c2b test: add missing mat4x2 tests
Signed-off-by: Vincent Davis Jr <vince@underview.tech>
2023-08-06 14:12:26 -04:00
Vincent Davis Jr
f0f7b67ef4 test: add missing mat3x4 tests
Signed-off-by: Vincent Davis Jr <vince@underview.tech>
2023-08-06 14:12:26 -04:00
Vincent Davis Jr
eece0b7bc9 test: add missing mat3x2 tests
Signed-off-by: Vincent Davis Jr <vince@underview.tech>
2023-08-06 14:12:26 -04:00
Vincent Davis Jr
37d20f7da8 test: add missing mat2x4 tests
Signed-off-by: Vincent Davis Jr <vince@underview.tech>
2023-08-06 14:12:26 -04:00
Vincent Davis Jr
006e4ffbdf test: add missing mat2x3 tests
Signed-off-by: Vincent Davis Jr <vince@underview.tech>
2023-08-06 14:12:26 -04:00
Vincent Davis Jr
aa37c1aa74 fix array subscript is outside array bounds
warning: array subscript # is outside array bounds
of ‘float[#]’ [-Warray-bounds]

Commit also fixes variable order when calculating
multiplication between two matrices.

Signed-off-by: Vincent Davis Jr <vince@underview.tech>
2023-08-06 14:12:24 -04:00
Vincent Davis Jr
0fb9e73ec1 docs: add missing non-square matrix funcs
Functions include:
	* glm_mat#x#_copy
	* glm_mat#x#_zero
	* glm_mat#x#_mul
	* glm_mat#x#_mulv
	* glm_mat#x#_transpose
	* glm_mat#x#_scale

Commit also includes some minor changes to
	* mat2
	* mat3
	* mat4

Signed-off-by: Vincent Davis Jr <vince@underview.tech>
2023-08-05 20:54:24 -04:00
Recep Aslantas
129287b809 Merge pull request #341 from taisei-project/assume-aligned-detection
more robust __builtin_assume_aligned detection
2023-08-01 18:22:24 +03:00
Andrei Alexeyev
2724620d83 more robust __builtin_assume_aligned detection
__builtin_assume_aligned is available since GCC 4.7, but __has_builtin
was added much later. Check for the GCC version if __has_builtin is not
available.

Users can also define CGLM_HAVE_BUILTIN_ASSUME_ALIGNED to either 1 or 0
to explicitly enable/disable the use of __builtin_assume_aligned. Meson
will do it automatically (by performing a configure-time test).
2023-07-31 22:33:51 +02:00
Recep Aslantas
4d5653b1f6 add some missing non-square matrix funcs in struct api 2023-07-22 14:17:26 +03:00
Recep Aslantas
dbb85f24c8 add some missing non-square matrix funcs 2023-07-22 13:37:36 +03:00
Recep Aslantas
6e9e91be05 add _mul for non-square matrices 2023-07-22 12:00:23 +03:00
Recep Aslantas
1e077fd125 add some missing non-square matrix funcs 2023-07-22 01:21:14 +03:00
Recep Aslantas
cb4a1b2677 Merge pull request #338 from EasyIP2023/feature/mat4x3
add new matrix mat4x3
2023-07-18 09:09:00 +03:00
Recep Aslantas
924db3307e Merge pull request #339 from EasyIP2023/bug/fix-mat4x2s
types-struct: fix mat4x2s struct members
2023-07-18 09:07:41 +03:00
Vincent Davis Jr
e9df003e56 types-struct: fix mat4x2s struct members
union mat4x2s { struct {  } } contains
members with incorrect naming.

Signed-off-by: Vincent Davis Jr <vince@underview.tech>
2023-07-17 23:09:40 -04:00
Vincent Davis Jr
3d292c3a2e add new matrix mat4x3
Initial function being

glm_mat4x3_make

Signed-off-by: Vincent Davis Jr <vince@underview.tech>
2023-07-17 22:57:52 -04:00
Recep Aslantas
4bb7e778c4 Merge pull request #337 from EasyIP2023/feature/mat4x2
add new matrix mat4x2
2023-07-17 10:41:09 +03:00
Vincent Davis Jr
2df26c0ecf add new matrix mat4x2
Initial function being

glm_mat4x2_make

Signed-off-by: Vincent Davis Jr <vince@underview.tech>
2023-07-16 20:19:25 -04:00
Recep Aslantas
5193b50133 Merge pull request #334 from EasyIP2023/feature/mat3x4
add new matrix mat3x4
2023-07-16 23:32:05 +03:00
Recep Aslantas
ef8954ccbc Merge branch 'master' into feature/mat3x4 2023-07-16 23:31:33 +03:00
Recep Aslantas
91b40eb7eb Merge pull request #335 from EasyIP2023/fix/comments-docs
docs: fix mat#x# comments and documentation
2023-07-16 23:29:38 +03:00
Vincent Davis Jr
82892085b3 docs: fix mat#x# comments and documentation
Signed-off-by: Vincent Davis Jr <vince@underview.tech>
2023-07-16 15:46:35 -04:00
Vincent Davis Jr
e09cf11f1c add new matrix mat3x4
Initial function being

glm_mat3x4_make

Signed-off-by: Vincent Davis Jr <vince@underview.tech>
2023-07-16 15:41:36 -04:00
Recep Aslantas
8966f296ac Merge pull request #333 from EasyIP2023/feature/mat3x2
add new matrix mat3x2
2023-07-16 12:10:45 +03:00
Vincent Davis Jr
4e44e74d48 add new matrix mat3x2
Initial function being

glm_mat3x2_make

Signed-off-by: Vincent Davis Jr <vince@underview.tech>
2023-07-15 18:48:50 -04:00
Recep Aslantas
f817c4cbb0 Merge pull request #332 from EasyIP2023/fix/mat2x3
add missing mat2x# test and mat2x3 window headers
2023-07-15 23:55:19 +03:00
Vincent Davis Jr
dd6a0b3175 add missing mat2x# test and mat2x3 window headers
Missing tests where
	* MACRO_GLM_MAT2X3_ZERO_INIT
	* MACRO_GLM_MAT2X3_ZERO
	* mat2x3s_zero_init
	* mat2x3s_zero
	* mat2x4s_zero_init
	* mat2x4s_zero

Commit:
	* removes (mat2x3) from
	  ((mat2x3)GLM_MAT2X3_ZERO_INIT) to fix
	  error: array initialized from non-constant array expression
	* removes test_assert_mat2x3_eq_zero
	  from test/src/test_struct.c
	* adds TEST_IMPL(mat2x3s_zero) to
	  test/src/test_struct.c

Signed-off-by: Vincent Davis Jr <vince@underview.tech>
2023-07-15 16:16:03 -04:00
Recep Aslantas
1401af4c34 Merge pull request #331 from EasyIP2023/feature/mat2x4
add new matrix mat2x4
2023-07-15 22:33:54 +03:00
Vincent Davis Jr
fe7471e8f8 add new matrix mat2x4
Initial function being

glm_mat2x4_make

Signed-off-by: Vincent Davis Jr <vince@underview.tech>
2023-07-15 14:32:48 -04:00
Recep Aslantas
1ca261b118 Merge pull request #330 from EasyIP2023/feature/mat2x3
add new matrix mat2x3
2023-07-15 11:03:59 +03:00
Vincent Davis Jr
6317ed90e7 add new matrix mat2x3
Initial function being

glm_mat2x3_make

Signed-off-by: Vincent Davis Jr <vince@underview.tech>
2023-07-14 18:57:45 -04:00
Recep Aslantas
3b683cf28c Merge pull request #328 from recp/werror
drop "-Werror" to allow skip warnings on production build
2023-07-13 11:09:16 +03:00
190 changed files with 15235 additions and 572 deletions

236
.github/workflows/ci.yml vendored Normal file
View File

@@ -0,0 +1,236 @@
name: CI
on:
push:
branches: [ "master" ]
pull_request:
branches: [ "master" ]
jobs:
build_autotools:
name: Autotools / ${{ matrix.os }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [macos-12, macos-14, ubuntu-22.04]
steps:
- uses: actions/checkout@v4
- name: Install Autotools
if: runner.os == 'macOS'
run: brew upgrade && brew install autoconf automake libtool
- name: Generate Autotools
run: ./autogen.sh
- name: Configure Autotools
run: ./configure
- name: Build
run: make
- name: Test
run: make check
build_cmake_ios:
name: CMake / iOS
runs-on: macos-14
steps:
- uses: actions/checkout@v4
- name: Configure CMake
run: |
cmake \
-B build \
-GXcode \
-DCMAKE_SYSTEM_NAME=iOS \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_ALLOWED=NO \
-DCGLM_STATIC=ON \
-DCGLM_USE_TEST=ON
- name: Build
run: cmake --build build
build_cmake_macos:
name: CMake / ${{ matrix.os }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [macos-12, macos-14]
steps:
- uses: actions/checkout@v4
- name: Install Ninja
if: runner.os == 'macOS'
run: brew upgrade && brew install ninja
- name: Configure CMake
run: |
cmake \
-B build \
-GNinja \
-DCMAKE_BUILD_TYPE=Release \
-DCGLM_STATIC=ON \
-DCGLM_USE_TEST=ON
- name: Build
run: cmake --build build
- name: Test
working-directory: build
run: ./tests
build_cmake_ubuntu:
name: CMake / ${{ matrix.target.os }} / ${{ matrix.target.cc }}
runs-on: ${{ matrix.target.os }}
strategy:
fail-fast: false
matrix:
target:
- { os: ubuntu-20.04, cc: gcc-11 }
- { os: ubuntu-22.04, cc: gcc-12 }
- { os: ubuntu-22.04, cc: gcc-13 }
- { os: ubuntu-20.04, cc: clang-12 }
- { os: ubuntu-22.04, cc: clang-15 }
steps:
- uses: actions/checkout@v4
- name: Install Compiler and Ninja
run: |
sudo apt-get update -y
sudo apt-get install -y ${{ matrix.target.cc }} ninja-build
- name: Configure CMake
run: |
cmake \
-B build \
-GNinja \
-DCMAKE_C_COMPILER=${{ matrix.target.cc }} \
-DCMAKE_BUILD_TYPE=Release \
-DCGLM_STATIC=ON \
-DCGLM_USE_TEST=ON
- name: Build
run: cmake --build build
- name: Test
working-directory: build
run: ./tests
build_cmake_windows:
name: CMake / ${{ matrix.platform.name }}
runs-on: windows-2022
strategy:
fail-fast: false
matrix:
platform:
- { name: Windows (x64), flags: -A x64 }
- { name: Windows (x86), flags: -A Win32 }
- { name: Windows (clang-cl x64), flags: -T ClangCL -A x64 }
- { name: Windows (clang-cl x86), flags: -T ClangCL -A Win32 }
- { name: Windows (ARM), flags: -A ARM, skip_tests: true, skip_build: true } # This fails to build.
- { name: Windows (ARM64), flags: -A ARM64, skip_tests: true }
- { name: UWP (ARM64), flags: -A ARM64, -DCMAKE_SYSTEM_NAME=WindowsStore -DCMAKE_SYSTEM_VERSION="10.0", skip_tests: true }
- { name: UWP (x64), flags: -A x64 -DCMAKE_SYSTEM_NAME=WindowsStore -DCMAKE_SYSTEM_VERSION="10.0", skip_tests: true }
steps:
- uses: actions/checkout@v4
- name: Configure CMake
run: cmake -B build `
-DCGLM_STATIC=ON `
-DCGLM_USE_TEST=ON `
${{ matrix.platform.flags }}
- name: Build
if: ${{ !matrix.platform.skip_build }}
run: cmake --build build --config Release --parallel
- name: Test
if: ${{ !matrix.platform.skip_tests }}
working-directory: build
run: .\Release\tests.exe
build_documentation:
name: Documentation
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.12'
- name: Install Dependencies
working-directory: docs
run: python3 -m pip install -r requirements.txt
- name: Build
working-directory: docs
run: sphinx-build -W --keep-going source build
build_meson:
name: Meson / ${{ matrix.os }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [macos-14, ubuntu-22.04]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.12'
cache: 'pip'
- name: Install meson
run: python3 -m pip install meson ninja
- name: Build
run: meson setup build -Dbuildtype=release --default-library=static -Dbuild_tests=true
- name: Test
run: meson test -C build
build_msbuild:
name: MSBuild / Windows
runs-on: windows-2022
# This has no test yet.
# It could also try building for ARM, ARM64, ARM64EC, but those fail currently.
steps:
- uses: actions/checkout@v4
- uses: microsoft/setup-msbuild@v2
- name: Build (x86)
working-directory: win
run: msbuild cglm.vcxproj /p:Configuration=Release /p:Platform=x86 /p:BuildInParallel=true
- name: Build (x64)
working-directory: win
run: msbuild cglm.vcxproj /p:Configuration=Release /p:Platform=x64 /p:BuildInParallel=true
build_swift:
name: Swift ${{ matrix.swift }} / ${{ matrix.os }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [macos-12, macos-14, ubuntu-22.04]
# This has no test yet.
steps:
- uses: actions/checkout@v4
- name: Build
run: swift build

View File

@@ -23,7 +23,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v4
- name: Downloading wasi-sdk - name: Downloading wasi-sdk
run: | run: |
@@ -64,7 +64,7 @@ jobs:
C_FLAGS: ['', '-msimd128', '-msse -msse2 -msimd128', '-msse -msse2 -msse3 -msse4 -msimd128'] C_FLAGS: ['', '-msimd128', '-msse -msse2 -msimd128', '-msse -msse2 -msse3 -msse4 -msimd128']
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v4
- name: Setup emsdk - name: Setup emsdk
uses: mymindstorm/setup-emsdk@v12 uses: mymindstorm/setup-emsdk@v12

79
.github/workflows/meson-wasm.yml vendored Normal file
View File

@@ -0,0 +1,79 @@
name: Meson WebAssembly
on:
push:
branches: [ "master" ]
pull_request:
branches: [ "master" ]
env:
wasmtime_version: v7.0.0
wasmer_version: v3.1.1
jobs:
build_emsdk:
strategy:
matrix:
BUILD_TYPE: [debug, debugoptimized, release, minsize]
C_FLAGS: ['', '-msimd128', '-msse -msse2 -msimd128', '-msse -msse2 -msse3 -msse4 -msimd128']
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup emsdk
uses: mymindstorm/setup-emsdk@v13
- name: Verify emsdk
run: emcc -v
- name: Creating cross file
run: |
cat << EOF > ${{github.workspace}}/meson_cross_emsdk.txt
[binaries]
c = '`which emcc`'
cpp = '`which em++`'
ar = '`which emar`'
[built-in options]
c_args = ['-Wno-unused-parameter']
c_link_args = ['-s', 'STANDALONE_WASM']
cpp_args = ['-Wno-unused-parameter']
cpp_link_args = ['-s', 'STANDALONE_WASM']
[host_machine]
system = 'emscripten'
cpu_family = 'wasm32'
cpu = 'wasm32'
endian = 'little'
EOF
cat ${{github.workspace}}/meson_cross_emsdk.txt
- uses: actions/setup-python@v4
- name: Install meson
run: |
sudo python3 -m pip install meson ninja
- name: Build with meson
run: |
meson setup build -Dbuildtype=${{matrix.BUILD_TYPE}} --cross-file ${{github.workspace}}/meson_cross_emsdk.txt --default-library=static -Dbuild_tests=true
meson test -C build
- name: Test with wasmtime
run: |
cd ${{github.workspace}}
ls -lh ${{github.workspace}}/build/
wget --no-verbose https://github.com/bytecodealliance/wasmtime/releases/download/${{env.wasmtime_version}}/wasmtime-${{env.wasmtime_version}}-x86_64-linux.tar.xz
tar xf wasmtime-${{env.wasmtime_version}}-x86_64-linux.tar.xz
./wasmtime-${{env.wasmtime_version}}-x86_64-linux/wasmtime run --wasm-features simd ${{github.workspace}}/build/tests.wasm
- name: Test with wasmer
run: |
cd ${{github.workspace}}
mkdir wasmer
cd wasmer
wget --no-verbose https://github.com/wasmerio/wasmer/releases/download/${{env.wasmer_version}}/wasmer-linux-amd64.tar.gz
tar xf wasmer-linux-amd64.tar.gz
./bin/wasmer run --enable-simd ${{github.workspace}}/build/tests.wasm

39
.readthedocs.yaml Normal file
View File

@@ -0,0 +1,39 @@
# Read the Docs configuration file for Sphinx projects
# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
# Required
version: 2
# Set the OS, Python version and other tools you might need
build:
os: ubuntu-22.04
tools:
python: "3.12"
# You can also specify other tool versions:
# nodejs: "20"
# rust: "1.70"
# golang: "1.20"
# Build documentation in the "docs/" directory with Sphinx
sphinx:
configuration: docs/source/conf.py
# You can configure Sphinx to use a different builder, for instance use the dirhtml builder for simpler URLs
# builder: "dirhtml"
# Fail on all warnings to avoid broken references
# fail_on_warning: true
# Optionally build your docs in additional formats such as PDF and ePub
# formats:
# - pdf
# - epub
# Optional but recommended, declare the Python requirements required
# to build your documentation
# See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html
# python:
# install:
# - requirements: docs/requirements.txt
python:
install:
- requirements: docs/requirements.txt

View File

@@ -1,6 +1,6 @@
cmake_minimum_required(VERSION 3.8.2) cmake_minimum_required(VERSION 3.8.2)
project(cglm project(cglm
VERSION 0.9.1 VERSION 0.9.3
HOMEPAGE_URL https://github.com/recp/cglm HOMEPAGE_URL https://github.com/recp/cglm
DESCRIPTION "OpenGL Mathematics (glm) for C" DESCRIPTION "OpenGL Mathematics (glm) for C"
LANGUAGES C LANGUAGES C
@@ -32,18 +32,23 @@ if(CGLM_USE_C99)
endif() endif()
if(MSVC) if(MSVC)
add_definitions(-DNDEBUG -D_WINDOWS -D_USRDLL) add_definitions(-D_WINDOWS -D_USRDLL)
add_compile_options(/W3 /Ox /Gy /Oi /TC)
# Ref: https://skia.googlesource.com/third_party/sdl/+/refs/heads/master/CMakeLists.txt#225 if(NOT CMAKE_BUILD_TYPE MATCHES Debug)
# Make sure /RTC1 is disabled, otherwise it will use functions from the CRT add_definitions(-DNDEBUG)
add_compile_options(/W3 /Ox /Gy /Oi /TC)
foreach(flag_var foreach(flag_var
CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO) CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO)
string(REGEX REPLACE "/RTC(su|[1su])" "" ${flag_var} "${${flag_var}}") string(REGEX REPLACE "/RTC(su|[1su])" "" ${flag_var} "${${flag_var}}")
endforeach(flag_var) endforeach(flag_var)
endif()
else() else()
add_compile_options(-Wall -O3) add_compile_options(-Wall)
if(NOT CMAKE_BUILD_TYPE MATCHES Debug)
add_compile_options(-O3)
endif()
endif() endif()
get_directory_property(hasParent PARENT_DIRECTORY) get_directory_property(hasParent PARENT_DIRECTORY)
@@ -79,8 +84,14 @@ add_library(${PROJECT_NAME}
src/vec4.c src/vec4.c
src/ivec4.c src/ivec4.c
src/mat2.c src/mat2.c
src/mat2x3.c
src/mat2x4.c
src/mat3.c src/mat3.c
src/mat3x2.c
src/mat3x4.c
src/mat4.c src/mat4.c
src/mat4x2.c
src/mat4x3.c
src/plane.c src/plane.c
src/frustum.c src/frustum.c
src/box.c src/box.c

View File

@@ -42,8 +42,14 @@ cglm_HEADERS = include/cglm/version.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/mat4x2.h \
include/cglm/mat4x3.h \
include/cglm/mat3.h \ include/cglm/mat3.h \
include/cglm/mat3x2.h \
include/cglm/mat3x4.h \
include/cglm/mat2.h \ include/cglm/mat2.h \
include/cglm/mat2x3.h \
include/cglm/mat2x4.h \
include/cglm/affine-pre.h \ include/cglm/affine-pre.h \
include/cglm/affine-post.h \ include/cglm/affine-post.h \
include/cglm/affine.h \ include/cglm/affine.h \
@@ -63,6 +69,7 @@ cglm_HEADERS = include/cglm/version.h \
include/cglm/plane.h \ include/cglm/plane.h \
include/cglm/frustum.h \ include/cglm/frustum.h \
include/cglm/box.h \ include/cglm/box.h \
include/cglm/aabb2d.h \
include/cglm/color.h \ include/cglm/color.h \
include/cglm/project.h \ include/cglm/project.h \
include/cglm/sphere.h \ include/cglm/sphere.h \
@@ -94,8 +101,14 @@ cglm_clipspace_HEADERS = include/cglm/clipspace/persp.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/mat4x2.h \
include/cglm/call/mat4x3.h \
include/cglm/call/mat3.h \ include/cglm/call/mat3.h \
include/cglm/call/mat3x2.h \
include/cglm/call/mat3x4.h \
include/cglm/call/mat2.h \ include/cglm/call/mat2.h \
include/cglm/call/mat2x3.h \
include/cglm/call/mat2x4.h \
include/cglm/call/vec2.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 \
@@ -137,7 +150,8 @@ cglm_call_clipspace_HEADERS = include/cglm/call/clipspace/persp_lh_no.h \
cglm_simddir=$(includedir)/cglm/simd cglm_simddir=$(includedir)/cglm/simd
cglm_simd_HEADERS = include/cglm/simd/intrin.h \ cglm_simd_HEADERS = include/cglm/simd/intrin.h \
include/cglm/simd/x86.h \ include/cglm/simd/x86.h \
include/cglm/simd/arm.h include/cglm/simd/arm.h \
include/cglm/simd/wasm.h
cglm_simd_sse2dir=$(includedir)/cglm/simd/sse2 cglm_simd_sse2dir=$(includedir)/cglm/simd/sse2
cglm_simd_sse2_HEADERS = include/cglm/simd/sse2/affine.h \ cglm_simd_sse2_HEADERS = include/cglm/simd/sse2/affine.h \
@@ -156,10 +170,27 @@ cglm_simd_neon_HEADERS = include/cglm/simd/neon/affine.h \
include/cglm/simd/neon/mat4.h \ include/cglm/simd/neon/mat4.h \
include/cglm/simd/neon/quat.h include/cglm/simd/neon/quat.h
cglm_simd_wasmdir=$(includedir)/cglm/simd/wasm
cglm_simd_wasm_HEADERS = include/cglm/simd/wasm/affine.h \
include/cglm/simd/wasm/mat2.h \
include/cglm/simd/wasm/mat3.h \
include/cglm/simd/wasm/mat4.h \
include/cglm/simd/wasm/quat.h
cglm_handeddir=$(includedir)/cglm/handed
cglm_handed_HEADERS = include/cglm/handed/euler_to_quat_lh.h \
include/cglm/handed/euler_to_quat_rh.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/mat4x2.h \
include/cglm/struct/mat4x3.h \
include/cglm/struct/mat3.h \ include/cglm/struct/mat3.h \
include/cglm/struct/mat3x2.h \
include/cglm/struct/mat3x4.h \
include/cglm/struct/mat2.h \ include/cglm/struct/mat2.h \
include/cglm/struct/mat2x3.h \
include/cglm/struct/mat2x4.h \
include/cglm/struct/affine-pre.h \ include/cglm/struct/affine-pre.h \
include/cglm/struct/affine-post.h \ include/cglm/struct/affine-post.h \
include/cglm/struct/affine-mat.h \ include/cglm/struct/affine-mat.h \
@@ -167,10 +198,13 @@ cglm_struct_HEADERS = include/cglm/struct/mat4.h \
include/cglm/struct/affine2d.h \ include/cglm/struct/affine2d.h \
include/cglm/struct/vec2.h \ include/cglm/struct/vec2.h \
include/cglm/struct/vec2-ext.h \ include/cglm/struct/vec2-ext.h \
include/cglm/struct/ivec2.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/ivec3.h \
include/cglm/struct/vec4.h \ include/cglm/struct/vec4.h \
include/cglm/struct/vec4-ext.h \ include/cglm/struct/vec4-ext.h \
include/cglm/struct/ivec4.h \
include/cglm/struct/io.h \ include/cglm/struct/io.h \
include/cglm/struct/cam.h \ include/cglm/struct/cam.h \
include/cglm/struct/quat.h \ include/cglm/struct/quat.h \
@@ -178,6 +212,7 @@ cglm_struct_HEADERS = include/cglm/struct/mat4.h \
include/cglm/struct/plane.h \ include/cglm/struct/plane.h \
include/cglm/struct/frustum.h \ include/cglm/struct/frustum.h \
include/cglm/struct/box.h \ include/cglm/struct/box.h \
include/cglm/struct/aabb2d.h \
include/cglm/struct/project.h \ include/cglm/struct/project.h \
include/cglm/struct/sphere.h \ include/cglm/struct/sphere.h \
include/cglm/struct/color.h \ include/cglm/struct/color.h \
@@ -199,6 +234,10 @@ cglm_struct_clipspace_HEADERS = include/cglm/struct/clipspace/persp_lh_no.h \
include/cglm/struct/clipspace/project_no.h \ include/cglm/struct/clipspace/project_no.h \
include/cglm/struct/clipspace/project_zo.h include/cglm/struct/clipspace/project_zo.h
cglm_struct_handeddir=$(includedir)/cglm/struct/handed
cglm_struct_handed_HEADERS = include/cglm/struct/handed/euler_to_quat_lh.h \
include/cglm/struct/handed/euler_to_quat_rh.h
libcglm_la_SOURCES=\ libcglm_la_SOURCES=\
src/euler.c \ src/euler.c \
src/affine.c \ src/affine.c \
@@ -212,8 +251,14 @@ libcglm_la_SOURCES=\
src/vec4.c \ src/vec4.c \
src/ivec4.c \ src/ivec4.c \
src/mat2.c \ src/mat2.c \
src/mat2x3.c \
src/mat2x4.c \
src/mat3.c \ src/mat3.c \
src/mat3x2.c \
src/mat3x4.c \
src/mat4.c \ src/mat4.c \
src/mat4x2.c \
src/mat4x3.c \
src/plane.c \ src/plane.c \
src/frustum.c \ src/frustum.c \
src/box.c \ src/box.c \

View File

@@ -5,14 +5,10 @@
</p> </p>
<br> <br>
<p align="center"> <p align="center">
<a href="https://travis-ci.com/recp/cglm"> <a href="https://github.com/recp/cglm/actions/workflows/ci.yml">
<img src="https://travis-ci.com/recp/cglm.svg?branch=master" <img src="https://github.com/recp/cglm/actions/workflows/ci.yml/badge.svg"
alt="Build Status"> alt="Build Status">
</a> </a>
<a href="https://ci.appveyor.com/project/recp/cglm/branch/master">
<img src="https://ci.appveyor.com/api/projects/status/av7l3gc0yhfex8y4/branch/master?svg=true"
alt="Windows Build Status">
</a>
<a href="http://cglm.readthedocs.io/en/latest/?badge=latest"> <a href="http://cglm.readthedocs.io/en/latest/?badge=latest">
<img src="https://readthedocs.org/projects/cglm/badge/?version=latest" <img src="https://readthedocs.org/projects/cglm/badge/?version=latest"
alt="Documentation Status"> alt="Documentation Status">
@@ -66,7 +62,7 @@ you have the latest version
- **[major change]** by starting v0.5.0, vec3 functions use **glm_vec3_** namespace, it was **glm_vec_** until v0.5.0 - **[major change]** by starting v0.5.0, vec3 functions use **glm_vec3_** namespace, it was **glm_vec_** until v0.5.0
- **[major change]** by starting v0.5.1, built-in alignment is removed from **vec3** and **mat3** types - **[major change]** by starting v0.5.1, built-in alignment is removed from **vec3** and **mat3** types
- **[major change]** by starting v0.7.3, inline print functions are disabled in release/production mode to eliminate print costs (see options in documentation). Print output also improved. You can disable colors if you need (see documentation) - **[major change]** by starting v0.7.3, inline print functions are disabled in release/production mode to eliminate print costs (see options in documentation). Print output also improved. You can disable colors if you need (see documentation)
- **[major change]** by starting v0.8.3, **cglm** supports alternative clipspace configuations e.g. Left Handed, Zero-to-One (_zo)... `CGLM_FORCE_DEPTH_ZERO_TO_ONE` and `CGLM_FORCE_LEFT_HANDED` is provided to control clipspace. You should be able to use **cglm** with Vulkan, DirectX and Metal now... see https://cglm.readthedocs.io/en/latest/opt.html#clipspace-option-s - **[major change]** by starting v0.8.3, **cglm** supports alternative clipspace configurations e.g. Left Handed, Zero-to-One (_zo)... `CGLM_FORCE_DEPTH_ZERO_TO_ONE` and `CGLM_FORCE_LEFT_HANDED` is provided to control clipspace. You should be able to use **cglm** with Vulkan, DirectX and Metal now... see https://cglm.readthedocs.io/en/latest/opt.html#clipspace-option-s
#### 📌 Note for C++ developers: #### 📌 Note for C++ developers:
If you are not aware of the original GLM library yet, you may also want to look at: If you are not aware of the original GLM library yet, you may also want to look at:
@@ -108,7 +104,7 @@ https://github.com/g-truc/glm
## 🚀 Features ## 🚀 Features
- **scalar** and **simd** (sse, avx, neon...) optimizations - **scalar** and **simd** (sse, avx, neon...) optimizations
- option to use different clipspaces e.g. Left Handed, Zero-to-One... (currrently right handed negative-one is default) - option to use different clipspaces e.g. Left Handed, Zero-to-One... (currently right handed negative-one is default)
- array api and struct api, you can use arrays or structs. - array api and struct api, you can use arrays or structs.
- general purpose matrix operations (mat4, mat3) - general purpose matrix operations (mat4, mat3)
- chain matrix multiplication (square only) - chain matrix multiplication (square only)
@@ -148,7 +144,7 @@ To call pre-compiled versions, just use `glmc_` (c stands for 'call') instead of
glm_mul(trans, rot, rt); /* inline */ glm_mul(trans, rot, rt); /* inline */
glmc_mul(trans, rot, rt); /* call from library */ glmc_mul(trans, rot, rt); /* call from library */
``` ```
Most of math functions are optimized manualy with SSE2 if available, if not? Dont worry there are non-sse versions of all operations Most of math functions are optimized manually with SSE2 if available, if not? Dont worry there are non-sse versions of all operations
You can pass matrices and vectors as array to functions rather than get address. You can pass matrices and vectors as array to functions rather than get address.

View File

@@ -1,7 +0,0 @@
image: Visual Studio 2017
build_script:
- ps: >-
cd win
.\build.bat

0
autogen.sh Normal file → Executable file
View File

View File

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

View File

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

0
docs/make.bat Normal file → Executable file
View File

4
docs/requirements.txt Normal file
View File

@@ -0,0 +1,4 @@
# Defining the exact version will make sure things don't break
sphinx==7.2.6
sphinx_rtd_theme==2.0.0
readthedocs-sphinx-search==0.3.2

198
docs/source/aabb2d.rst Normal file
View File

@@ -0,0 +1,198 @@
.. default-domain:: C
2d axis aligned bounding box (AABB)
================================================================================
Header: cglm/aabb2d.h
Some convenient functions provided for AABB.
**Definition of aabb:**
cglm defines an aabb as a two dimensional array of vec2's.
The first element is the **min** point and the second one is the **max** point.
If you have another type e.g. struct or even another representation then you must
convert it before and after calling a cglm aabb2d function.
Table of contents (click to go):
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Macros:
1. :c:func:`glm_aabb2d_size`
Functions:
1. :c:func:`glm_aabb2d_copy`
#. :c:func:`glm_aabb2d_zero`
#. :c:func:`glm_aabb2d_transform`
#. :c:func:`glm_aabb2d_merge`
#. :c:func:`glm_aabb2d_crop`
#. :c:func:`glm_aabb2d_crop_until`
#. :c:func:`glm_aabb2d_invalidate`
#. :c:func:`glm_aabb2d_isvalid`
#. :c:func:`glm_aabb2d_diag`
#. :c:func:`glm_aabb2d_sizev`
#. :c:func:`glm_aabb2d_radius`
#. :c:func:`glm_aabb2d_center`
#. :c:func:`glm_aabb2d_aabb`
#. :c:func:`glm_aabb2d_circle`
#. :c:func:`glm_aabb2d_point`
#. :c:func:`glm_aabb2d_contains`
Functions documentation
~~~~~~~~~~~~~~~~~~~~~~~
.. c:function:: void glm_aabb2d_copy(vec2 aabb[2], vec2 dest[2])
| copy all members of [aabb] to [dest]
Parameters:
| *[in]* **aabb** bounding box
| *[out]* **dest** destination
.. c:function:: void glm_aabb2d_zero(vec2 aabb[2])
| makes all members of [aabb] 0.0f (zero)
Parameters:
| *[in, out]* **aabb** bounding box
.. c:function:: void glm_aabb2d_transform(vec2 aabb[2], mat3 m, vec2 dest[2])
| apply transform to Axis-Aligned Bounding Box
Parameters:
| *[in]* **aabb** bounding box
| *[in]* **m** transform matrix
| *[out]* **dest** transformed bounding box
.. c:function:: void glm_aabb2d_merge(vec2 aabb1[2], vec2 aabb2[2], vec2 dest[2])
| merges two AABB bounding box and creates new one
two aabb must be in the same space
Parameters:
| *[in]* **aabb1** bounding box 1
| *[in]* **aabb2** bounding box 2
| *[out]* **dest** merged bounding box
.. c:function:: void glm_aabb2d_crop(vec2 aabb[2], vec2 cropAabb[2], vec2 dest[2])
| crops a bounding box with another one.
this could be useful for gettng a bbox which fits with view frustum and
object bounding boxes. In this case you crop view frustum box with objects
box
Parameters:
| *[in]* **aabb** bounding box 1
| *[in]* **cropAabb** crop box
| *[out]* **dest** cropped bounding box
.. c:function:: void glm_aabb2d_crop_until(vec2 aabb[2], vec2 cropAabb[2], vec2 clampAabb[2], vec2 dest[2])
| crops a bounding box with another one.
this could be useful for gettng a bbox which fits with view frustum and
object bounding boxes. In this case you crop view frustum box with objects
box
Parameters:
| *[in]* **aabb** bounding box
| *[in]* **cropAabb** crop box
| *[in]* **clampAabb** minimum box
| *[out]* **dest** cropped bounding box
.. c:function:: void glm_aabb2d_invalidate(vec2 aabb[2])
| invalidate AABB min and max values
| It fills *max* values with -FLT_MAX and *min* values with +FLT_MAX
Parameters:
| *[in, out]* **aabb** bounding box
.. c:function:: bool glm_aabb2d_isvalid(vec2 aabb[2])
| check if AABB is valid or not
Parameters:
| *[in]* **aabb** bounding box
Returns:
returns true if aabb is valid otherwise false
.. c:function:: float glm_aabb2d_diag(vec2 aabb[2])
| distance between min and max
Parameters:
| *[in]* **aabb** bounding box
Returns:
distance between min - max
.. c:function:: void glm_aabb2d_sizev(vec2 aabb[2], vec2 dest)
| size vector of aabb
Parameters:
| *[in]* **aabb** bounding box
| *[out]* **dest** size vector
Returns:
size vector of aabb max - min
.. c:function:: float glm_aabb2d_radius(vec2 aabb[2])
| radius of sphere which surrounds AABB
Parameters:
| *[in]* **aabb** bounding box
.. c:function:: void glm_aabb2d_center(vec2 aabb[2], vec2 dest)
| computes center point of AABB
Parameters:
| *[in]* **aabb** bounding box
| *[out]* **dest** center of bounding box
.. c:function:: bool glm_aabb2d_aabb(vec2 aabb[2], vec2 other[2])
| check if two AABB intersects
Parameters:
| *[in]* **aabb** bounding box
| *[out]* **other** other bounding box
.. c:function:: bool glm_aabb2d_circle(vec2 aabb[2], vec3 c)
| check if AABB intersects with sphere
| https://github.com/erich666/GraphicsGems/blob/master/gems/BoxSphere.c
| Solid Box - Solid Sphere test.
Parameters:
| *[in]* **aabb** solid bounding box
| *[out]* **c** solid circle
.. c:function:: bool glm_aabb2d_point(vec2 aabb[2], vec2 point)
| check if point is inside of AABB
Parameters:
| *[in]* **aabb** bounding box
| *[out]* **point** point
.. c:function:: bool glm_aabb2d_contains(vec2 aabb[2], vec2 other[2])
| check if AABB contains other AABB
Parameters:
| *[in]* **aabb** bounding box
| *[out]* **other** other bounding box

View File

@@ -3,7 +3,7 @@
3D Affine Transforms (common) 3D Affine Transforms (common)
================================================================================ ================================================================================
Common transfrom functions. Common transform functions.
Table of contents (click to go): Table of contents (click to go):
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -30,7 +30,7 @@ Functions documentation
creates NEW translate transform matrix by *v* vector. creates NEW translate transform matrix by *v* vector.
Parameters: Parameters:
| *[in, out]* **m** affine transfrom | *[in, out]* **m** affine transform
| *[in]* **v** translate vector [x, y, z] | *[in]* **v** translate vector [x, y, z]
.. c:function:: void glm_scale_to(mat4 m, vec3 v, mat4 dest) .. c:function:: void glm_scale_to(mat4 m, vec3 v, mat4 dest)
@@ -38,7 +38,7 @@ Functions documentation
scale existing transform matrix by *v* vector and store result in dest scale existing transform matrix by *v* vector and store result in dest
Parameters: Parameters:
| *[in]* **m** affine transfrom | *[in]* **m** affine transform
| *[in]* **v** scale vector [x, y, z] | *[in]* **v** scale vector [x, y, z]
| *[out]* **dest** scaled matrix | *[out]* **dest** scaled matrix
@@ -47,7 +47,7 @@ Functions documentation
creates NEW scale matrix by v vector creates NEW scale matrix by v vector
Parameters: Parameters:
| *[out]* **m** affine transfrom | *[out]* **m** affine transform
| *[in]* **v** scale vector [x, y, z] | *[in]* **v** scale vector [x, y, z]
.. c:function:: void glm_scale(mat4 m, vec3 v) .. c:function:: void glm_scale(mat4 m, vec3 v)
@@ -56,7 +56,7 @@ Functions documentation
and stores result in same matrix and stores result in same matrix
Parameters: Parameters:
| *[in, out]* **m** affine transfrom | *[in, out]* **m** affine transform
| *[in]* **v** scale vector [x, y, z] | *[in]* **v** scale vector [x, y, z]
.. c:function:: void glm_scale_uni(mat4 m, float s) .. c:function:: void glm_scale_uni(mat4 m, float s)
@@ -65,7 +65,7 @@ Functions documentation
and stores result in same matrix and stores result in same matrix
Parameters: Parameters:
| *[in, out]* **m** affine transfrom | *[in, out]* **m** affine transform
| *[in]* **v** scale factor | *[in]* **v** scale factor
.. c:function:: void glm_rotate_make(mat4 m, float angle, vec3 axis) .. c:function:: void glm_rotate_make(mat4 m, float angle, vec3 axis)
@@ -74,7 +74,7 @@ Functions documentation
axis will be normalized so you don't need to normalize it axis will be normalized so you don't need to normalize it
Parameters: Parameters:
| *[out]* **m** affine transfrom | *[out]* **m** affine transform
| *[in]* **axis** angle (radians) | *[in]* **axis** angle (radians)
| *[in]* **axis** axis | *[in]* **axis** axis
@@ -86,7 +86,7 @@ Functions documentation
| this should work faster than glm_rotate_at because it reduces one glm_translate. | this should work faster than glm_rotate_at because it reduces one glm_translate.
Parameters: Parameters:
| *[in, out]* **m** affine transfrom | *[in, out]* **m** affine transform
| *[in]* **pivot** pivot, anchor point, rotation center | *[in]* **pivot** pivot, anchor point, rotation center
| *[in]* **angle** angle (radians) | *[in]* **angle** angle (radians)
| *[in]* **axis** axis | *[in]* **axis** axis
@@ -123,7 +123,7 @@ Functions documentation
DON'T pass projected matrix here DON'T pass projected matrix here
Parameters: Parameters:
| *[in]* **m** affine transfrom | *[in]* **m** affine transform
| *[out]* **t** translation vector | *[out]* **t** translation vector
| *[out]* **r** rotation matrix (mat4) | *[out]* **r** rotation matrix (mat4)
| *[out]* **s** scaling vector [X, Y, Z] | *[out]* **s** scaling vector [X, Y, Z]

View File

@@ -25,7 +25,7 @@ You cannot use :c:func:`glm_mul` anymore.
Same is also true for :c:func:`glm_inv_tr` if you only have rotation and Same is also true for :c:func:`glm_inv_tr` if you only have rotation and
translation then it will work as expected, otherwise you cannot use that. translation then it will work as expected, otherwise you cannot use that.
In the future it may accept scale factors too but currectly it does not. In the future it may accept scale factors too but currently it does not.
Table of contents (click func go): Table of contents (click func go):
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

View File

@@ -3,10 +3,8 @@
3D Affine Transforms (post) 3D Affine Transforms (post)
================================================================================ ================================================================================
Post transfrom functions are similar to pre transform functions except order of application is reversed. Post transform functions are similar to pre transform functions except order of application is reversed.
Post transform functions are applied after the object is transformed with given (model matrix) transfrom. Post transform functions are applied after the object is transformed with given (model matrix) transform.
Ther are named af
Table of contents (click to go): Table of contents (click to go):
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -33,7 +31,7 @@ Functions documentation
translate existing transform matrix by *v* vector and store result in dest translate existing transform matrix by *v* vector and store result in dest
Parameters: Parameters:
| *[in]* **m** affine transfrom | *[in]* **m** affine transform
| *[in]* **v** translate vector [x, y, z] | *[in]* **v** translate vector [x, y, z]
| *[out]* **dest** translated matrix | *[out]* **dest** translated matrix
@@ -43,7 +41,7 @@ Functions documentation
and stores result in same matrix and stores result in same matrix
Parameters: Parameters:
| *[in, out]* **m** affine transfrom | *[in, out]* **m** affine transform
| *[in]* **v** translate vector [x, y, z] | *[in]* **v** translate vector [x, y, z]
.. c:function:: void glm_translated_x(mat4 m, float x) .. c:function:: void glm_translated_x(mat4 m, float x)
@@ -51,7 +49,7 @@ Functions documentation
translate existing transform matrix by x factor translate existing transform matrix by x factor
Parameters: Parameters:
| *[in, out]* **m** affine transfrom | *[in, out]* **m** affine transform
| *[in]* **v** x factor | *[in]* **v** x factor
.. c:function:: void glm_translated_y(mat4 m, float y) .. c:function:: void glm_translated_y(mat4 m, float y)
@@ -59,7 +57,7 @@ Functions documentation
translate existing transform matrix by *y* factor translate existing transform matrix by *y* factor
Parameters: Parameters:
| *[in, out]* **m** affine transfrom | *[in, out]* **m** affine transform
| *[in]* **v** y factor | *[in]* **v** y factor
.. c:function:: void glm_translated_z(mat4 m, float z) .. c:function:: void glm_translated_z(mat4 m, float z)
@@ -67,7 +65,7 @@ Functions documentation
translate existing transform matrix by *z* factor translate existing transform matrix by *z* factor
Parameters: Parameters:
| *[in, out]* **m** affine transfrom | *[in, out]* **m** affine transform
| *[in]* **v** z factor | *[in]* **v** z factor
.. c:function:: void glm_rotated_x(mat4 m, float angle, mat4 dest) .. c:function:: void glm_rotated_x(mat4 m, float angle, mat4 dest)
@@ -76,7 +74,7 @@ Functions documentation
and store result in dest and store result in dest
Parameters: Parameters:
| *[in]* **m** affine transfrom | *[in]* **m** affine transform
| *[in]* **angle** angle (radians) | *[in]* **angle** angle (radians)
| *[out]* **dest** rotated matrix | *[out]* **dest** rotated matrix
@@ -86,7 +84,7 @@ Functions documentation
and store result in dest and store result in dest
Parameters: Parameters:
| *[in]* **m** affine transfrom | *[in]* **m** affine transform
| *[in]* **angle** angle (radians) | *[in]* **angle** angle (radians)
| *[out]* **dest** rotated matrix | *[out]* **dest** rotated matrix
@@ -96,7 +94,7 @@ Functions documentation
and store result in dest and store result in dest
Parameters: Parameters:
| *[in]* **m** affine transfrom | *[in]* **m** affine transform
| *[in]* **angle** angle (radians) | *[in]* **angle** angle (radians)
| *[out]* **dest** rotated matrix | *[out]* **dest** rotated matrix
@@ -105,7 +103,7 @@ Functions documentation
rotate existing transform matrix around Z axis by angle and axis rotate existing transform matrix around Z axis by angle and axis
Parameters: Parameters:
| *[in, out]* **m** affine transfrom | *[in, out]* **m** affine transform
| *[in]* **angle** angle (radians) | *[in]* **angle** angle (radians)
| *[in]* **axis** axis | *[in]* **axis** axis
@@ -114,7 +112,7 @@ Functions documentation
rotate existing transform around given axis by angle at given pivot point (rotation center) rotate existing transform around given axis by angle at given pivot point (rotation center)
Parameters: Parameters:
| *[in, out]* **m** affine transfrom | *[in, out]* **m** affine transform
| *[in]* **pivot** pivot, anchor point, rotation center | *[in]* **pivot** pivot, anchor point, rotation center
| *[in]* **angle** angle (radians) | *[in]* **angle** angle (radians)
| *[in]* **axis** axis | *[in]* **axis** axis
@@ -124,6 +122,6 @@ Functions documentation
| rotate existing transform matrix around given axis by angle around self (doesn't affected by position) | rotate existing transform matrix around given axis by angle around self (doesn't affected by position)
Parameters: Parameters:
| *[in, out]* **m** affine transfrom | *[in, out]* **m** affine transform
| *[in]* **angle** angle (radians) | *[in]* **angle** angle (radians)
| *[in]* **axis** axis | *[in]* **axis** axis

View File

@@ -3,7 +3,7 @@
3D Affine Transforms (pre) 3D Affine Transforms (pre)
================================================================================ ================================================================================
Pre transfrom functions which are regular transfrom functions. Pre transform functions which are regular transform functions.
Table of contents (click to go): Table of contents (click to go):
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -41,7 +41,7 @@ Functions documentation
translate existing transform matrix by *v* vector and store result in dest translate existing transform matrix by *v* vector and store result in dest
Parameters: Parameters:
| *[in]* **m** affine transfrom | *[in]* **m** affine transform
| *[in]* **v** translate vector [x, y, z] | *[in]* **v** translate vector [x, y, z]
| *[out]* **dest** translated matrix | *[out]* **dest** translated matrix
@@ -51,7 +51,7 @@ Functions documentation
and stores result in same matrix and stores result in same matrix
Parameters: Parameters:
| *[in, out]* **m** affine transfrom | *[in, out]* **m** affine transform
| *[in]* **v** translate vector [x, y, z] | *[in]* **v** translate vector [x, y, z]
.. c:function:: void glm_translate_x(mat4 m, float x) .. c:function:: void glm_translate_x(mat4 m, float x)
@@ -59,7 +59,7 @@ Functions documentation
translate existing transform matrix by x factor translate existing transform matrix by x factor
Parameters: Parameters:
| *[in, out]* **m** affine transfrom | *[in, out]* **m** affine transform
| *[in]* **v** x factor | *[in]* **v** x factor
.. c:function:: void glm_translate_y(mat4 m, float y) .. c:function:: void glm_translate_y(mat4 m, float y)
@@ -67,7 +67,7 @@ Functions documentation
translate existing transform matrix by *y* factor translate existing transform matrix by *y* factor
Parameters: Parameters:
| *[in, out]* **m** affine transfrom | *[in, out]* **m** affine transform
| *[in]* **v** y factor | *[in]* **v** y factor
.. c:function:: void glm_translate_z(mat4 m, float z) .. c:function:: void glm_translate_z(mat4 m, float z)
@@ -75,59 +75,16 @@ Functions documentation
translate existing transform matrix by *z* factor translate existing transform matrix by *z* factor
Parameters: Parameters:
| *[in, out]* **m** affine transfrom | *[in, out]* **m** affine transform
| *[in]* **v** z factor | *[in]* **v** z factor
.. c:function:: void glm_translate_make(mat4 m, vec3 v)
creates NEW translate transform matrix by *v* vector.
Parameters:
| *[in, out]* **m** affine transfrom
| *[in]* **v** translate vector [x, y, z]
.. c:function:: void glm_scale_to(mat4 m, vec3 v, mat4 dest)
scale existing transform matrix by *v* vector and store result in dest
Parameters:
| *[in]* **m** affine transfrom
| *[in]* **v** scale vector [x, y, z]
| *[out]* **dest** scaled matrix
.. c:function:: void glm_scale_make(mat4 m, vec3 v)
creates NEW scale matrix by v vector
Parameters:
| *[out]* **m** affine transfrom
| *[in]* **v** scale vector [x, y, z]
.. c:function:: void glm_scale(mat4 m, vec3 v)
scales existing transform matrix by v vector
and stores result in same matrix
Parameters:
| *[in, out]* **m** affine transfrom
| *[in]* **v** scale vector [x, y, z]
.. c:function:: void glm_scale_uni(mat4 m, float s)
applies uniform scale to existing transform matrix v = [s, s, s]
and stores result in same matrix
Parameters:
| *[in, out]* **m** affine transfrom
| *[in]* **v** scale factor
.. c:function:: void glm_rotate_x(mat4 m, float angle, mat4 dest) .. c:function:: void glm_rotate_x(mat4 m, float angle, mat4 dest)
rotate existing transform matrix around X axis by angle rotate existing transform matrix around X axis by angle
and store result in dest and store result in dest
Parameters: Parameters:
| *[in]* **m** affine transfrom | *[in]* **m** affine transform
| *[in]* **angle** angle (radians) | *[in]* **angle** angle (radians)
| *[out]* **dest** rotated matrix | *[out]* **dest** rotated matrix
@@ -137,7 +94,7 @@ Functions documentation
and store result in dest and store result in dest
Parameters: Parameters:
| *[in]* **m** affine transfrom | *[in]* **m** affine transform
| *[in]* **angle** angle (radians) | *[in]* **angle** angle (radians)
| *[out]* **dest** rotated matrix | *[out]* **dest** rotated matrix
@@ -147,26 +104,16 @@ Functions documentation
and store result in dest and store result in dest
Parameters: Parameters:
| *[in]* **m** affine transfrom | *[in]* **m** affine transform
| *[in]* **angle** angle (radians) | *[in]* **angle** angle (radians)
| *[out]* **dest** rotated matrix | *[out]* **dest** rotated matrix
.. c:function:: void glm_rotate_make(mat4 m, float angle, vec3 axis)
creates NEW rotation matrix by angle and axis,
axis will be normalized so you don't need to normalize it
Parameters:
| *[out]* **m** affine transfrom
| *[in]* **axis** angle (radians)
| *[in]* **axis** axis
.. c:function:: void glm_rotate(mat4 m, float angle, vec3 axis) .. c:function:: void glm_rotate(mat4 m, float angle, vec3 axis)
rotate existing transform matrix around Z axis by angle and axis rotate existing transform matrix around Z axis by angle and axis
Parameters: Parameters:
| *[in, out]* **m** affine transfrom | *[in, out]* **m** affine transform
| *[in]* **angle** angle (radians) | *[in]* **angle** angle (radians)
| *[in]* **axis** axis | *[in]* **axis** axis
@@ -175,66 +122,16 @@ Functions documentation
rotate existing transform around given axis by angle at given pivot point (rotation center) rotate existing transform around given axis by angle at given pivot point (rotation center)
Parameters: Parameters:
| *[in, out]* **m** affine transfrom | *[in, out]* **m** affine transform
| *[in]* **pivot** pivot, anchor point, rotation center | *[in]* **pivot** pivot, anchor point, rotation center
| *[in]* **angle** angle (radians) | *[in]* **angle** angle (radians)
| *[in]* **axis** axis | *[in]* **axis** axis
.. c:function:: void glm_rotate_atm(mat4 m, vec3 pivot, float angle, vec3 axis)
| creates NEW rotation matrix by angle and axis at given point
| this creates rotation matrix, it assumes you don't have a matrix
| this should work faster than glm_rotate_at because it reduces one glm_translate.
Parameters:
| *[in, out]* **m** affine transfrom
| *[in]* **pivot** pivot, anchor point, rotation center
| *[in]* **angle** angle (radians)
| *[in]* **axis** axis
.. c:function:: void glm_decompose_scalev(mat4 m, vec3 s)
decompose scale vector
Parameters:
| *[in]* **m** affine transform
| *[out]* **s** scale vector (Sx, Sy, Sz)
.. c:function:: bool glm_uniscaled(mat4 m)
returns true if matrix is uniform scaled.
This is helpful for creating normal matrix.
Parameters:
| *[in]* **m** matrix
.. c:function:: void glm_decompose_rs(mat4 m, mat4 r, vec3 s)
decompose rotation matrix (mat4) and scale vector [Sx, Sy, Sz]
DON'T pass projected matrix here
Parameters:
| *[in]* **m** affine transform
| *[out]* **r** rotation matrix
| *[out]* **s** scale matrix
.. c:function:: void glm_decompose(mat4 m, vec4 t, mat4 r, vec3 s)
decompose affine transform, TODO: extract shear factors.
DON'T pass projected matrix here
Parameters:
| *[in]* **m** affine transfrom
| *[out]* **t** translation vector
| *[out]* **r** rotation matrix (mat4)
| *[out]* **s** scaling vector [X, Y, Z]
.. c:function:: void glm_spin(mat4 m, float angle, vec3 axis) .. c:function:: void glm_spin(mat4 m, float angle, vec3 axis)
| rotate existing transform matrix around given axis by angle around self (doesn't affected by position) | rotate existing transform matrix around given axis by angle around self (doesn't affected by position)
Parameters: Parameters:
| *[in, out]* **m** affine transfrom | *[in, out]* **m** affine transform
| *[in]* **angle** angle (radians) | *[in]* **angle** angle (radians)
| *[in]* **axis** axis | *[in]* **axis** axis

View File

@@ -13,7 +13,7 @@ Post functions (`T' = T * Tnew`) are like `glm_translated`, `glm_rotated` which
`glm_translate`, `glm_rotate` are pre functions and are similar to C++ **glm** which you are familiar with. `glm_translate`, `glm_rotate` are pre functions and are similar to C++ **glm** which you are familiar with.
In new versions of **cglm** we added `glm_translated`, `glm_rotated`... which are post functions, In new versions of **cglm** we added `glm_translated`, `glm_rotated`... which are post functions,
they are useful in some cases, e.g. append transform to existing transform (apply/append transform as last transfrom T' = T * Tnew). they are useful in some cases, e.g. append transform to existing transform (apply/append transform as last transform T' = T * Tnew).
Post functions are named after pre functions with `ed` suffix, e.g. `glm_translate` -> `glm_translated`. So don't mix them up. Post functions are named after pre functions with `ed` suffix, e.g. `glm_translate` -> `glm_translated`. So don't mix them up.
@@ -24,7 +24,7 @@ a matrix for you. You don't need to pass identity matrix.
But other functions expect you have a matrix and you want to transform them. If But other functions expect you have a matrix and you want to transform them. If
you didn't have any existing matrix you have to initialize matrix to identity you didn't have any existing matrix you have to initialize matrix to identity
before sending to transfrom functions. before sending to transform functions.
There are also functions to decompose transform matrix. These functions can't There are also functions to decompose transform matrix. These functions can't
decompose matrix after projected. decompose matrix after projected.
@@ -35,7 +35,7 @@ Rotation Center
Rotating functions uses origin as rotation center (pivot/anchor point), Rotating functions uses origin as rotation center (pivot/anchor point),
since scale factors are stored in rotation matrix, same may also true for scalling. since scale factors are stored in rotation matrix, same may also true for scalling.
cglm provides some functions for rotating around at given point e.g. cglm provides some functions for rotating around at given point e.g.
**glm_rotate_at**, **glm_quat_rotate_at**. Use them or follow next section for algorihm ("Rotate or Scale around specific Point (Pivot Point / Anchor Point)"). **glm_rotate_at**, **glm_quat_rotate_at**. Use them or follow next section for algorithm ("Rotate or Scale around specific Point (Pivot Point / Anchor Point)").
Also **cglm** provides :c:func:`glm_spin` and :c:func:`glm_spinned` functions to rotate around itself. No need to give pivot. Also **cglm** provides :c:func:`glm_spin` and :c:func:`glm_spinned` functions to rotate around itself. No need to give pivot.
These functions are useful for rotating around center of object. These functions are useful for rotating around center of object.
@@ -43,7 +43,7 @@ These functions are useful for rotating around center of object.
Rotate or Scale around specific Point (Anchor Point) Rotate or Scale around specific Point (Anchor Point)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
If you want to rotate model around arbibtrary point follow these steps: If you want to rotate model around arbitrary point follow these steps:
1. Move model from pivot point to origin: **translate(-pivot.x, -pivot.y, -pivot.z)** 1. Move model from pivot point to origin: **translate(-pivot.x, -pivot.y, -pivot.z)**
2. Apply rotation (or scaling maybe) 2. Apply rotation (or scaling maybe)
@@ -82,11 +82,11 @@ helpers functions works like this (cglm provides reverse order as `ed` suffix e.
.. code-block:: c .. code-block:: c
:linenos: :linenos:
TransformMatrix = TransformMatrix * TraslateMatrix; // glm_translate() TransformMatrix = TransformMatrix * TranslateMatrix; // glm_translate()
TransformMatrix = TransformMatrix * RotateMatrix; // glm_rotate(), glm_quat_rotate() TransformMatrix = TransformMatrix * RotateMatrix; // glm_rotate(), glm_quat_rotate()
TransformMatrix = TransformMatrix * ScaleMatrix; // glm_scale() TransformMatrix = TransformMatrix * ScaleMatrix; // glm_scale()
As you can see it is multipled as right matrix. For instance what will happen if you call `glm_translate` twice? As you can see it is multiplied as right matrix. For instance what will happen if you call `glm_translate` twice?
.. code-block:: c .. code-block:: c
:linenos: :linenos:

View File

@@ -14,7 +14,7 @@ a matrix for you. You don't need to pass identity matrix.
But other functions expect you have a matrix and you want to transform them. If But other functions expect you have a matrix and you want to transform them. If
you didn't have any existing matrix you have to initialize matrix to identity you didn't have any existing matrix you have to initialize matrix to identity
before sending to transfrom functions. before sending to transform functions.
Transforms Order Transforms Order
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -45,7 +45,7 @@ Functions:
translate existing 2d transform matrix by *v* vector and stores result in same matrix translate existing 2d transform matrix by *v* vector and stores result in same matrix
Parameters: Parameters:
| *[in, out]* **m** 2d affine transfrom | *[in, out]* **m** 2d affine transform
| *[in]* **v** translate vector [x, y] | *[in]* **v** translate vector [x, y]
.. c:function:: void glm_translate2d_to(mat3 m, vec2 v, mat3 dest) .. c:function:: void glm_translate2d_to(mat3 m, vec2 v, mat3 dest)
@@ -53,7 +53,7 @@ Functions:
translate existing 2d transform matrix by *v* vector and store result in dest translate existing 2d transform matrix by *v* vector and store result in dest
Parameters: Parameters:
| *[in]* **m** 2d affine transfrom | *[in]* **m** 2d affine transform
| *[in]* **v** translate vector [x, y] | *[in]* **v** translate vector [x, y]
| *[out]* **dest** translated matrix | *[out]* **dest** translated matrix
@@ -62,7 +62,7 @@ Functions:
translate existing 2d transform matrix by x factor translate existing 2d transform matrix by x factor
Parameters: Parameters:
| *[in, out]* **m** 2d affine transfrom | *[in, out]* **m** 2d affine transform
| *[in]* **x** x factor | *[in]* **x** x factor
.. c:function:: void glm_translate2d_y(mat3 m, float y) .. c:function:: void glm_translate2d_y(mat3 m, float y)
@@ -70,7 +70,7 @@ Functions:
translate existing 2d transform matrix by y factor translate existing 2d transform matrix by y factor
Parameters: Parameters:
| *[in, out]* **m** 2d affine transfrom | *[in, out]* **m** 2d affine transform
| *[in]* **y** y factor | *[in]* **y** y factor
.. c:function:: void glm_translate2d_make(mat3 m, vec2 v) .. c:function:: void glm_translate2d_make(mat3 m, vec2 v)
@@ -78,7 +78,7 @@ Functions:
creates NEW translate 2d transform matrix by *v* vector creates NEW translate 2d transform matrix by *v* vector
Parameters: Parameters:
| *[in, out]* **m** affine transfrom | *[in, out]* **m** affine transform
| *[in]* **v** translate vector [x, y] | *[in]* **v** translate vector [x, y]
.. c:function:: void glm_scale2d_to(mat3 m, vec2 v, mat3 dest) .. c:function:: void glm_scale2d_to(mat3 m, vec2 v, mat3 dest)
@@ -86,7 +86,7 @@ Functions:
scale existing 2d transform matrix by *v* vector and store result in dest scale existing 2d transform matrix by *v* vector and store result in dest
Parameters: Parameters:
| *[in]* **m** affine transfrom | *[in]* **m** affine transform
| *[in]* **v** scale vector [x, y] | *[in]* **v** scale vector [x, y]
| *[out]* **dest** scaled matrix | *[out]* **dest** scaled matrix
@@ -95,7 +95,7 @@ Functions:
creates NEW 2d scale matrix by *v* vector creates NEW 2d scale matrix by *v* vector
Parameters: Parameters:
| *[in, out]* **m** affine transfrom | *[in, out]* **m** affine transform
| *[in]* **v** scale vector [x, y] | *[in]* **v** scale vector [x, y]
.. c:function:: void glm_scale2d(mat3 m, vec2 v) .. c:function:: void glm_scale2d(mat3 m, vec2 v)
@@ -103,7 +103,7 @@ Functions:
scales existing 2d transform matrix by *v* vector and stores result in same matrix scales existing 2d transform matrix by *v* vector and stores result in same matrix
Parameters: Parameters:
| *[in, out]* **m** affine transfrom | *[in, out]* **m** affine transform
| *[in]* **v** translate vector [x, y] | *[in]* **v** translate vector [x, y]
.. c:function:: void glm_scale2d_uni(mat3 m, float s) .. c:function:: void glm_scale2d_uni(mat3 m, float s)
@@ -111,7 +111,7 @@ Functions:
applies uniform scale to existing 2d transform matrix v = [s, s] and stores result in same matrix applies uniform scale to existing 2d transform matrix v = [s, s] and stores result in same matrix
Parameters: Parameters:
| *[in, out]* **m** affine transfrom | *[in, out]* **m** affine transform
| *[in]* **s** scale factor | *[in]* **s** scale factor
.. c:function:: void glm_rotate2d_make(mat3 m, float angle) .. c:function:: void glm_rotate2d_make(mat3 m, float angle)
@@ -119,7 +119,7 @@ Functions:
creates NEW rotation matrix by angle around *Z* axis creates NEW rotation matrix by angle around *Z* axis
Parameters: Parameters:
| *[in, out]* **m** affine transfrom | *[in, out]* **m** affine transform
| *[in]* **angle** angle (radians) | *[in]* **angle** angle (radians)
.. c:function:: void glm_rotate2d(mat3 m, float angle) .. c:function:: void glm_rotate2d(mat3 m, float angle)
@@ -127,7 +127,7 @@ Functions:
rotate existing 2d transform matrix around *Z* axis by angle and store result in same matrix rotate existing 2d transform matrix around *Z* axis by angle and store result in same matrix
Parameters: Parameters:
| *[in, out]* **m** affine transfrom | *[in, out]* **m** affine transform
| *[in]* **angle** angle (radians) | *[in]* **angle** angle (radians)
.. c:function:: void glm_rotate2d_to(mat3 m, float angle, mat3 dest) .. c:function:: void glm_rotate2d_to(mat3 m, float angle, mat3 dest)
@@ -135,6 +135,6 @@ Functions:
rotate existing 2d transform matrix around *Z* axis by angle and store result in dest rotate existing 2d transform matrix around *Z* axis by angle and store result in dest
Parameters: Parameters:
| *[in]* **m** affine transfrom | *[in]* **m** affine transform
| *[in]* **angle** angle (radians) | *[in]* **angle** angle (radians)
| *[out]* **dest** rotated matrix | *[out]* **dest** rotated matrix

View File

@@ -9,7 +9,7 @@ In the future there may be option to forward struct api to call api instead of i
📌 **USE this API docs for similar functions in struct and call api** 📌 **USE this API docs for similar functions in struct and call api**
📌 In struct api you can omit namespace e.g :code:`glms_vec3_dot` can be called as :code:`vec3_dot` in struct api, see :doc:`struct-api` to configure struct api for more details. 📌 In struct api you can omit namespace e.g :code:`glms_vec3_dot` can be called as :code:`vec3_dot` in struct api, see :doc:`api_struct` to configure struct api for more details.
📌 In struct api functions can return struct/union 📌 In struct api functions can return struct/union
📌 In struct api you can access items like **.x**, **.y**, **.z**, **.w**, **.r**, **.g**, **.b**, **.a**, **.m00**, **m01**... 📌 In struct api you can access items like **.x**, **.y**, **.z**, **.w**, **.r**, **.g**, **.b**, **.a**, **.m00**, **m01**...
@@ -43,11 +43,18 @@ Follow the :doc:`build` documentation for this
cam cam
frustum frustum
box box
aabb2d
quat quat
euler euler
mat2 mat2
mat2x3
mat2x4
mat3 mat3
mat3x2
mat3x4
mat4 mat4
mat4x2
mat4x3
vec2 vec2
vec2-ext vec2-ext
vec3 vec3

View File

@@ -10,7 +10,7 @@ Also struct api `s` suffix to namespace e.g. `glms_vec3_add`, `glms_mat4_mul` et
By starting v0.9.0, struct api namespace is configurable. We can omit **glms_** namespace or By starting v0.9.0, struct api namespace is configurable. We can omit **glms_** namespace or
even change it with custom name to move existing api integrations to **cglm** more easliy... even change it with custom name to move existing api integrations to **cglm** more easliy...
We can also add **s** to functin names if we want e.g. `glms_vec3_add()` -> `vec3_add()` or `vec3s_add()`. We can also add **s** to function names if we want e.g. `glms_vec3_add()` -> `vec3_add()` or `vec3s_add()`.
By including **cglm/struct.h** header you will include all struct api. It will also include **cglm/cglm.h** too. By including **cglm/struct.h** header you will include all struct api. It will also include **cglm/cglm.h** too.
Since struct apis are inline you don't need to build or link *cglm* against Since struct apis are inline you don't need to build or link *cglm* against

View File

@@ -82,7 +82,7 @@ Functions documentation
Parameters: Parameters:
| *[in]* **box** bounding box | *[in]* **box** bounding box
| *[in]* **cropBox** crop box | *[in]* **cropBox** crop box
| *[in]* **clampBox** miniumum box | *[in]* **clampBox** minimum box
| *[out]* **dest** cropped bounding box | *[out]* **dest** cropped bounding box
.. c:function:: bool glm_aabb_frustum(vec3 box[2], vec4 planes[6]) .. c:function:: bool glm_aabb_frustum(vec3 box[2], vec4 planes[6])

View File

@@ -3,9 +3,9 @@ Build cglm
| **cglm** does not have any external dependencies. | **cglm** does not have any external dependencies.
**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.
Just import cglm to your project as dependency / external lib by copy-paste then use it as usual Just import cglm to your project as dependency / external lib by copy-paste then use it as usual
CMake (All platforms): CMake (All platforms):
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

View File

@@ -3,17 +3,17 @@
precompiled functions (call) precompiled functions (call)
================================================================================ ================================================================================
All funcitons in **glm_** namespace are forced to **inline**. All functions in **glm_** namespace are forced to **inline**.
Most functions also have pre-compiled version. Most functions also have pre-compiled version.
Precompiled versions are in **glmc_** namespace. *c* in the namespace stands for Precompiled versions are in **glmc_** namespace. *c* in the namespace stands for
"call". "call".
Since precompiled functions are just wrapper for inline verisons, Since precompiled functions are just wrapper for inline versions,
these functions are not documented individually. these functions are not documented individually.
It would be duplicate documentation also it It would be duplicate documentation also it
would be hard to sync documentation between inline and call verison for me. would be hard to sync documentation between inline and call version for me.
By including **clgm/cglm.h** you include all inline verisons. To get precompiled By including **clgm/cglm.h** you include all inline versions. To get precompiled
versions you need to include **cglm/call.h** header it also includes all versions you need to include **cglm/call.h** header it also includes all
call versions plus *clgm/cglm.h* (inline verisons) call versions plus *clgm/cglm.h* (inline versions)

View File

@@ -18,7 +18,7 @@ fast if you don't care specific projection values.
*_decomp* means decompose; these function can help to decompose projection *_decomp* means decompose; these function can help to decompose projection
matrices. matrices.
**NOTE**: Be careful when working with high range (very small near, very large .. note:: Be careful when working with high range (very small near, very large
far) projection matrices. You may not get exact value you gave. far) projection matrices. You may not get exact value you gave.
**float** type cannot store very high precision so you will lose precision. **float** type cannot store very high precision so you will lose precision.
Also your projection matrix will be inaccurate due to losing precision Also your projection matrix will be inaccurate due to losing precision
@@ -178,7 +178,7 @@ Functions documentation
| set up view matrix | set up view matrix
**NOTE:** The UP vector must not be parallel to the line of sight from the eye point to the reference point. .. note:: The UP vector must not be parallel to the line of sight from the eye point to the reference point.
Parameters: Parameters:
| *[in]* **eye** eye vector | *[in]* **eye** eye vector
@@ -194,7 +194,7 @@ Functions documentation
target self then this might be useful. Because you need to get target target self then this might be useful. Because you need to get target
from direction. from direction.
**NOTE:** The UP vector must not be parallel to the line of sight from the eye point to the reference point. .. note:: The UP vector must not be parallel to the line of sight from the eye point to the reference point.
Parameters: Parameters:
| *[in]* **eye** eye vector | *[in]* **eye** eye vector
@@ -250,7 +250,7 @@ Functions documentation
.. c:function:: void glm_persp_decomp_y(mat4 proj, float *top, float *bottom) .. c:function:: void glm_persp_decomp_y(mat4 proj, float *top, float *bottom)
| decomposes top and bottom values of perspective projection. | decomposes top and bottom values of perspective projection.
| y stands for y axis (top / botom axis) | y stands for y axis (top / bottom axis)
Parameters: Parameters:
| *[in]* **proj** perspective projection matrix | *[in]* **proj** perspective projection matrix

View File

@@ -62,9 +62,9 @@ author = u'Recep Aslantas'
# built documents. # built documents.
# #
# The short X.Y version. # The short X.Y version.
version = u'0.9.1' version = u'0.9.2'
# The full version, including alpha/beta/rc tags. # The full version, including alpha/beta/rc tags.
release = u'0.9.1' release = u'0.9.2'
# 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.

View File

@@ -2,7 +2,7 @@ Features
================================================================================ ================================================================================
* **scalar** and **simd** (sse, avx, neon, wasm...) optimizations * **scalar** and **simd** (sse, avx, neon, wasm...) optimizations
* option to use different clipspaces e.g. Left Handed, Zero-to-One... (currrently right handed negative-one is default) * option to use different clipspaces e.g. Left Handed, Zero-to-One... (currently right handed negative-one is default)
* array api and struct api, you can use arrays or structs. * array api and struct api, you can use arrays or structs.
* general purpose matrix operations (mat4, mat3) * general purpose matrix operations (mat4, mat3)
* chain matrix multiplication (square only) * chain matrix multiplication (square only)
@@ -18,6 +18,7 @@ Features
* inline or pre-compiled function call * inline or pre-compiled function call
* frustum (extract view frustum planes, corners...) * frustum (extract view frustum planes, corners...)
* bounding box (AABB in Frustum (culling), crop, merge...) * bounding box (AABB in Frustum (culling), crop, merge...)
* 2d bounding box (crop, merge...)
* bounding sphere * bounding sphere
* project, unproject * project, unproject
* easing functions * easing functions

View File

@@ -11,9 +11,9 @@ not **vec3**. If you want to store them to save space you msut convert them
yourself. yourself.
**vec4** is used to speed up functions need to corners. This is why frustum **vec4** is used to speed up functions need to corners. This is why frustum
fucntions use *vec4* instead of *vec3* functions use *vec4* instead of *vec3*
Currenty related-functions use [-1, 1] clip space configuration to extract Currently related-functions use [-1, 1] clip space configuration to extract
corners but you can override it by prodiving **GLM_CUSTOM_CLIPSPACE** macro. corners but you can override it by prodiving **GLM_CUSTOM_CLIPSPACE** macro.
If you provide it then you have to all bottom macros as *vec4* If you provide it then you have to all bottom macros as *vec4*

View File

@@ -22,7 +22,7 @@ Types:
typedef CGLM_ALIGN_IF(16) vec4 mat4[4]; typedef CGLM_ALIGN_IF(16) vec4 mat4[4];
#endif #endif
As you can see types don't store extra informations in favor of space. As you can see types don't store extra information in favor of space.
You can send these values e.g. matrix to OpenGL directly without casting or calling a function like *value_ptr* You can send these values e.g. matrix to OpenGL directly without casting or calling a function like *value_ptr*
Alignment Is Required: Alignment Is Required:
@@ -35,16 +35,16 @@ Alignment Is Required:
| Check :doc:`opt` page for more details | Check :doc:`opt` page for more details
Also alignment is disabled for older msvc verisons as default. Now alignment is only required in Visual Studio 2017 version 15.6+ if CGLM_ALL_UNALIGNED macro is not defined. Also alignment is disabled for older msvc versions as default. Now alignment is only required in Visual Studio 2017 version 15.6+ if CGLM_ALL_UNALIGNED macro is not defined.
Allocations: Allocations:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*cglm* doesn't alloc any memory on heap. So it doesn't provide any allocator. *cglm* doesn't alloc any memory on heap. So it doesn't provide any allocator.
You must allocate memory yourself. You should alloc memory for out parameters too if you pass pointer of memory location. When allocating memory, don't forget that **vec4** and **mat4** require alignment. You must allocate memory yourself. You should alloc memory for out parameters too if you pass pointer of memory location. When allocating memory, don't forget that **vec4** and **mat4** require alignment.
**NOTE:** Unaligned **vec4** and unaligned **mat4** operations will be supported in the future. Check todo list. .. note:: Unaligned **vec4** and unaligned **mat4** operations will be supported in the future. Check todo list.
Because you may want to multiply a CGLM matrix with external matrix. Because you may want to multiply a CGLM matrix with external matrix.
There is no guarantee that non-CGLM matrix is aligned. Unaligned types will have *u* prefix e.g. **umat4** There is no guarantee that non-CGLM matrix is aligned. Unaligned types will have *u* prefix e.g. **umat4**
Array vs Struct: Array vs Struct:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

View File

@@ -24,12 +24,12 @@ Example to print mat4 matrix:
/* ... */ /* ... */
glm_mat4_print(transform, stderr); glm_mat4_print(transform, stderr);
**NOTE:** print functions use **%0.4f** precision if you need more .. note:: print functions use **%0.4f** precision if you need more
(you probably will in some cases), you can change it temporary. (you probably will in some cases), you can change it temporary.
cglm may provide precision parameter in the future cglm may provide precision parameter in the future.
Changes since **v0.7.3**: Changes since **v0.7.3**:
* Now mis-alignment of columns are fixed: larger numbers are printed via %g and others are printed via %f. Column withs are calculated before print. * Now mis-alignment of columns are fixed: larger numbers are printed via %g and others are printed via %f. Column widths are calculated before print.
* Now values are colorful ;) * Now values are colorful ;)
* Some print improvements * Some print improvements
* New options with default values: * New options with default values:
@@ -53,8 +53,11 @@ Functions:
1. :c:func:`glm_mat4_print` 1. :c:func:`glm_mat4_print`
#. :c:func:`glm_mat3_print` #. :c:func:`glm_mat3_print`
#. :c:func:`glm_vec4_print` #. :c:func:`glm_vec4_print`
#. :c:func:`glm_ivec4_print`
#. :c:func:`glm_vec3_print` #. :c:func:`glm_vec3_print`
#. :c:func:`glm_ivec3_print` #. :c:func:`glm_ivec3_print`
#. :c:func:`glm_vec2_print`
#. :c:func:`glm_ivec2_print`
#. :c:func:`glm_versor_print` #. :c:func:`glm_versor_print`
#. :c:func:`glm_aabb_print` #. :c:func:`glm_aabb_print`
@@ -63,7 +66,7 @@ Functions documentation
.. c:function:: void glm_mat4_print(mat4 matrix, FILE * __restrict ostream) .. c:function:: void glm_mat4_print(mat4 matrix, FILE * __restrict ostream)
| print mat4 to given stream | print matrix to given stream
Parameters: Parameters:
| *[in]* **matrix** matrix | *[in]* **matrix** matrix
@@ -71,7 +74,7 @@ Functions documentation
.. c:function:: void glm_mat3_print(mat3 matrix, FILE * __restrict ostream) .. c:function:: void glm_mat3_print(mat3 matrix, FILE * __restrict ostream)
| print mat3 to given stream | print matrix to given stream
Parameters: Parameters:
| *[in]* **matrix** matrix | *[in]* **matrix** matrix
@@ -79,7 +82,15 @@ Functions documentation
.. c:function:: void glm_vec4_print(vec4 vec, FILE * __restrict ostream) .. c:function:: void glm_vec4_print(vec4 vec, FILE * __restrict ostream)
| print vec4 to given stream | print vector to given stream
Parameters:
| *[in]* **vec** vector
| *[in]* **ostream** FILE to write
.. c:function:: void glm_ivec4_print(ivec4 vec, FILE * __restrict ostream)
| print vector to given stream
Parameters: Parameters:
| *[in]* **vec** vector | *[in]* **vec** vector
@@ -87,7 +98,7 @@ Functions documentation
.. c:function:: void glm_vec3_print(vec3 vec, FILE * __restrict ostream) .. c:function:: void glm_vec3_print(vec3 vec, FILE * __restrict ostream)
| print vec3 to given stream | print vector to given stream
Parameters: Parameters:
| *[in]* **vec** vector | *[in]* **vec** vector
@@ -95,12 +106,29 @@ Functions documentation
.. c:function:: void glm_ivec3_print(ivec3 vec, FILE * __restrict ostream) .. c:function:: void glm_ivec3_print(ivec3 vec, FILE * __restrict ostream)
| print ivec3 to given stream | print vector to given stream
Parameters: Parameters:
| *[in]* **vec** vector | *[in]* **vec** vector
| *[in]* **ostream** FILE to write | *[in]* **ostream** FILE to write
.. c:function:: void glm_vec2_print(vec2 vec, FILE * __restrict ostream)
| print vector to given stream
Parameters:
| *[in]* **vec** vector
| *[in]* **ostream** FILE to write
.. c:function:: void glm_ivec2_print(ivec2 vec, FILE * __restrict ostream)
| print vector to given stream
Parameters:
| *[in]* **vec** vector
| *[in]* **ostream** FILE to write
.. c:function:: void glm_versor_print(versor vec, FILE * __restrict ostream) .. c:function:: void glm_versor_print(versor vec, FILE * __restrict ostream)
| print quaternion to given stream | print quaternion to given stream
@@ -115,5 +143,5 @@ Functions documentation
Parameters: Parameters:
| *[in]* **vec** aabb (axis-aligned bounding box) | *[in]* **vec** aabb (axis-aligned bounding box)
| *[in]* **tag** tag to find it more easly in logs | *[in]* **tag** tag to find it more easily in logs
| *[in]* **ostream** FILE to write | *[in]* **ostream** FILE to write

View File

@@ -21,12 +21,17 @@ Functions:
#. :c:func:`glm_ivec2_copy` #. :c:func:`glm_ivec2_copy`
#. :c:func:`glm_ivec2_zero` #. :c:func:`glm_ivec2_zero`
#. :c:func:`glm_ivec2_one` #. :c:func:`glm_ivec2_one`
#. :c:func:`glm_ivec2_dot`
#. :c:func:`glm_ivec2_cross`
#. :c:func:`glm_ivec2_add` #. :c:func:`glm_ivec2_add`
#. :c:func:`glm_ivec2_adds` #. :c:func:`glm_ivec2_adds`
#. :c:func:`glm_ivec2_sub` #. :c:func:`glm_ivec2_sub`
#. :c:func:`glm_ivec2_subs` #. :c:func:`glm_ivec2_subs`
#. :c:func:`glm_ivec2_mul` #. :c:func:`glm_ivec2_mul`
#. :c:func:`glm_ivec2_scale` #. :c:func:`glm_ivec2_scale`
#. :c:func:`glm_ivec2_div`
#. :c:func:`glm_ivec2_divs`
#. :c:func:`glm_ivec2_mod`
#. :c:func:`glm_ivec2_distance2` #. :c:func:`glm_ivec2_distance2`
#. :c:func:`glm_ivec2_distance` #. :c:func:`glm_ivec2_distance`
#. :c:func:`glm_ivec2_maxv` #. :c:func:`glm_ivec2_maxv`
@@ -67,6 +72,30 @@ Functions documentation
Parameters: Parameters:
| *[out]* **v** vector | *[out]* **v** vector
.. c:function:: int glm_ivec2_dot(ivec2 a, ivec2 b)
dot product of ivec2
Parameters:
| *[in]* **a** vector1
| *[in]* **b** vector2
Returns:
dot product
.. c:function:: int glm_ivec2_cross(ivec2 a, ivec2 b)
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
Returns:
Z component of cross product
.. c:function:: void glm_ivec2_add(ivec2 a, ivec2 b, ivec2 dest) .. c:function:: void glm_ivec2_add(ivec2 a, ivec2 b, ivec2 dest)
add vector [a] to vector [b] and store result in [dest] add vector [a] to vector [b] and store result in [dest]
@@ -121,6 +150,33 @@ Functions documentation
| *[in]* **s** scalar | *[in]* **s** scalar
| *[out]* **dest** destination | *[out]* **dest** destination
.. c:function:: void glm_ivec2_div(ivec2 a, ivec2 b, ivec2 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_ivec2_divs(ivec2 v, int s, ivec2 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_ivec2_mod(ivec2 a, ivec2 b, ivec2 dest)
mod vector with another component-wise modulo: d = a % b
Parameters:
| *[in]* **a** vector
| *[in]* **b** scalar
| *[out]* **dest** result = (a[0] % b[0], a[1] % b[1])
.. c:function:: int glm_ivec2_distance2(ivec2 a, ivec2 b) .. c:function:: int glm_ivec2_distance2(ivec2 a, ivec2 b)
squared distance between two vectors squared distance between two vectors
@@ -143,6 +199,31 @@ Functions documentation
Returns: Returns:
distance distance
.. c:function:: void glm_ivec2_fill(ivec2 v, int val)
fill a vector with specified value
Parameters:
| *[out]* **v** vector
| *[in]* **val** value
.. c:function:: bool glm_ivec2_eq(ivec2 v, int val)
check if vector is equal to value
Parameters:
| *[in]* **v** vector
| *[in]* **val** value
.. c:function:: bool glm_ivec2_eqv(ivec2 v1, ivec2 v2)
check if vector is equal to another vector
Parameters:
| *[in]* **vec** vector 1
| *[in]* **vec** vector 2
.. c:function:: void glm_ivec2_maxv(ivec2 a, ivec2 b, ivec2 dest) .. c:function:: void glm_ivec2_maxv(ivec2 a, ivec2 b, ivec2 dest)
set each member of dest to greater of vector a and b set each member of dest to greater of vector a and b

View File

@@ -21,14 +21,23 @@ Functions:
#. :c:func:`glm_ivec3_copy` #. :c:func:`glm_ivec3_copy`
#. :c:func:`glm_ivec3_zero` #. :c:func:`glm_ivec3_zero`
#. :c:func:`glm_ivec3_one` #. :c:func:`glm_ivec3_one`
#. :c:func:`glm_ivec3_dot`
#. :c:func:`glm_ivec3_norm2`
#. :c:func:`glm_ivec3_norm`
#. :c:func:`glm_ivec3_add` #. :c:func:`glm_ivec3_add`
#. :c:func:`glm_ivec3_adds` #. :c:func:`glm_ivec3_adds`
#. :c:func:`glm_ivec3_sub` #. :c:func:`glm_ivec3_sub`
#. :c:func:`glm_ivec3_subs` #. :c:func:`glm_ivec3_subs`
#. :c:func:`glm_ivec3_mul` #. :c:func:`glm_ivec3_mul`
#. :c:func:`glm_ivec3_scale` #. :c:func:`glm_ivec3_scale`
#. :c:func:`glm_ivec3_div`
#. :c:func:`glm_ivec3_divs`
#. :c:func:`glm_ivec3_mod`
#. :c:func:`glm_ivec3_distance2` #. :c:func:`glm_ivec3_distance2`
#. :c:func:`glm_ivec3_distance` #. :c:func:`glm_ivec3_distance`
#. :c:func:`glm_ivec3_fill`
#. :c:func:`glm_ivec3_eq`
#. :c:func:`glm_ivec3_eqv`
#. :c:func:`glm_ivec3_maxv` #. :c:func:`glm_ivec3_maxv`
#. :c:func:`glm_ivec3_minv` #. :c:func:`glm_ivec3_minv`
#. :c:func:`glm_ivec3_clamp` #. :c:func:`glm_ivec3_clamp`
@@ -67,6 +76,39 @@ Functions documentation
Parameters: Parameters:
| *[out]* **v** vector | *[out]* **v** vector
.. c:function:: int glm_ivec3_dot(ivec3 a, ivec3 b)
dot product of ivec3
Parameters:
| *[in]* **a** vector1
| *[in]* **b** vector2
Returns:
dot product
.. c:function:: int glm_ivec3_norm2(ivec3 v)
norm * norm (magnitude) of vector
we can use this func instead of calling norm * norm, because it would call
sqrtf function 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, cast to an integer
.. c:function:: int glm_ivec3_norm(ivec3 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_ivec3_add(ivec3 a, ivec3 b, ivec3 dest) .. c:function:: void glm_ivec3_add(ivec3 a, ivec3 b, ivec3 dest)
add vector [a] to vector [b] and store result in [dest] add vector [a] to vector [b] and store result in [dest]
@@ -121,6 +163,33 @@ Functions documentation
| *[in]* **s** scalar | *[in]* **s** scalar
| *[out]* **dest** destination | *[out]* **dest** destination
.. c:function:: void glm_ivec3_div(ivec3 a, ivec3 b, ivec3 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_ivec3_divs(ivec3 v, int s, ivec3 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_ivec3_mod(ivec3 a, ivec3 b, ivec3 dest)
mod vector with another component-wise modulo: d = a % b
Parameters:
| *[in]* **a** vector
| *[in]* **b** scalar
| *[out]* **dest** result = (a[0] % b[0], a[1] % b[1], a[2] % b[2])
.. c:function:: int glm_ivec3_distance2(ivec3 a, ivec3 b) .. c:function:: int glm_ivec3_distance2(ivec3 a, ivec3 b)
squared distance between two vectors squared distance between two vectors
@@ -143,6 +212,30 @@ Functions documentation
Returns: Returns:
distance distance
.. c:function:: void glm_ivec3_fill(ivec3 v, int val)
fill a vector with specified value
Parameters:
| *[out]* **v** vector
| *[in]* **val** value
.. c:function:: bool glm_ivec3_eq(ivec3 v, int val)
check if vector is equal to value
Parameters:
| *[in]* **v** vector
| *[in]* **val** value
.. c:function:: bool glm_ivec3_eqv(ivec3 v1, ivec3 v2)
check if vector is equal to another vector
Parameters:
| *[in]* **vec** vector 1
| *[in]* **vec** vector 2
.. c:function:: void glm_ivec3_maxv(ivec3 a, ivec3 b, ivec3 dest) .. c:function:: void glm_ivec3_maxv(ivec3 a, ivec3 b, ivec3 dest)
set each member of dest to greater of vector a and b set each member of dest to greater of vector a and b

View File

@@ -47,7 +47,7 @@ Functions documentation
.. c:function:: void glm_mat2_identity(mat2 mat) .. c:function:: void glm_mat2_identity(mat2 mat)
copy identity mat2 to mat, or makes mat to identiy copy identity mat2 to mat, or makes mat to identity
Parameters: Parameters:
| *[out]* **mat** matrix | *[out]* **mat** matrix
@@ -65,11 +65,12 @@ Functions documentation
make given matrix zero make given matrix zero
Parameters: Parameters:
| *[in,out]* **mat** matrix to | *[in,out]* **mat** matrix
.. c:function:: void glm_mat2_mul(mat2 m1, mat2 m2, mat2 dest) .. c:function:: void glm_mat2_mul(mat2 m1, mat2 m2, mat2 dest)
multiply m1 and m2 to dest multiply m1 and m2 to dest
m1, m2 and dest matrices can be same matrix, it is possible to write this: m1, m2 and dest matrices can be same matrix, it is possible to write this:
.. code-block:: c .. code-block:: c
@@ -93,7 +94,7 @@ Functions documentation
.. c:function:: void glm_mat2_transpose(mat2 m) .. c:function:: void glm_mat2_transpose(mat2 m)
tranpose mat2 and store result in same matrix transpose mat2 and store result in same matrix
Parameters: Parameters:
| *[in]* **mat** source | *[in]* **mat** source
@@ -101,7 +102,7 @@ Functions documentation
.. c:function:: void glm_mat2_mulv(mat2 m, vec2 v, vec2 dest) .. c:function:: void glm_mat2_mulv(mat2 m, vec2 v, vec2 dest)
multiply mat4 with vec4 (column vector) and store in dest vector multiply mat2 with vec2 (column vector) and store in dest vector
Parameters: Parameters:
| *[in]* **mat** mat2 (left) | *[in]* **mat** mat2 (left)
@@ -113,8 +114,8 @@ Functions documentation
multiply matrix with scalar multiply matrix with scalar
Parameters: Parameters:
| *[in, out]* **mat** matrix | *[in, out]* **m** matrix
| *[in]* **dest** scalar | *[in]* **s** scalar
.. c:function:: float glm_mat2_det(mat2 mat) .. c:function:: float glm_mat2_det(mat2 mat)
@@ -183,7 +184,7 @@ Functions documentation
Create mat2 matrix from pointer Create mat2 matrix from pointer
| NOTE: **@src** must contain 4 elements. .. note:: **@src** must contain at least 4 elements.
Parameters: Parameters:
| *[in]* **src** pointer to an array of floats | *[in]* **src** pointer to an array of floats

90
docs/source/mat2x3.rst Normal file
View File

@@ -0,0 +1,90 @@
.. default-domain:: C
mat2x3
======
Header: cglm/mat2x3.h
Table of contents (click to go):
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Macros:
1. GLM_MAT2X3_ZERO_INIT
#. GLM_MAT2X3_ZERO
Functions:
1. :c:func:`glm_mat2x3_copy`
#. :c:func:`glm_mat2x3_zero`
#. :c:func:`glm_mat2x3_make`
#. :c:func:`glm_mat2x3_mul`
#. :c:func:`glm_mat2x3_mulv`
#. :c:func:`glm_mat2x3_transpose`
#. :c:func:`glm_mat2x3_scale`
Functions documentation
~~~~~~~~~~~~~~~~~~~~~~~
.. c:function:: void glm_mat2x3_copy(mat2x3 mat, mat2x3 dest)
copy mat2x3 to another one (dest).
Parameters:
| *[in]* **mat** source
| *[out]* **dest** destination
.. c:function:: void glm_mat2x3_zero(mat2x3 mat)
make given matrix zero
Parameters:
| *[in,out]* **mat** matrix
.. c:function:: void glm_mat2x3_make(float * __restrict src, mat2x3 dest)
Create mat2x3 matrix from pointer
.. note:: **@src** must contain at least 6 elements.
Parameters:
| *[in]* **src** pointer to an array of floats
| *[out]* **dest** destination matrix2x3
.. c:function:: void glm_mat2x3_mul(mat2x3 m1, mat3x2 m2, mat2 dest)
multiply m1 and m2 to dest
.. code-block:: c
glm_mat2x3_mul(mat2x3, mat3x2, mat2);
Parameters:
| *[in]* **m1** left matrix (mat2x3)
| *[in]* **m2** right matrix (mat3x2)
| *[out]* **dest** destination matrix (mat2)
.. c:function:: void glm_mat2x3_mulv(mat2x3 m, vec3 v, vec2 dest)
multiply mat2x3 with vec3 (column vector) and store in dest vector
Parameters:
| *[in]* **m** mat2x3 (left)
| *[in]* **v** vec3 (right, column vector)
| *[out]* **dest** destination (result, column vector)
.. c:function:: void glm_mat2x3_transpose(mat2x3 m, mat3x2 dest)
transpose matrix and store in dest
Parameters:
| *[in]* **m** matrix
| *[out]* **dest** destination
.. c:function:: void glm_mat2x3_scale(mat2x3 m, float s)
multiply matrix with scalar
Parameters:
| *[in, out]* **m** matrix
| *[in]* **s** scalar

90
docs/source/mat2x4.rst Normal file
View File

@@ -0,0 +1,90 @@
.. default-domain:: C
mat2x4
======
Header: cglm/mat2x4.h
Table of contents (click to go):
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Macros:
1. GLM_MAT2X4_ZERO_INIT
#. GLM_MAT2X4_ZERO
Functions:
1. :c:func:`glm_mat2x4_copy`
#. :c:func:`glm_mat2x4_zero`
#. :c:func:`glm_mat2x4_make`
#. :c:func:`glm_mat2x4_mul`
#. :c:func:`glm_mat2x4_mulv`
#. :c:func:`glm_mat2x4_transpose`
#. :c:func:`glm_mat2x4_scale`
Functions documentation
~~~~~~~~~~~~~~~~~~~~~~~
.. c:function:: void glm_mat2x4_copy(mat2x4 mat, mat2x4 dest)
copy mat2x4 to another one (dest).
Parameters:
| *[in]* **mat** source
| *[out]* **dest** destination
.. c:function:: void glm_mat2x4_zero(mat2x4 mat)
make given matrix zero
Parameters:
| *[in,out]* **mat** matrix
.. c:function:: void glm_mat2x4_make(float * __restrict src, mat2x4 dest)
Create mat2x4 matrix from pointer
.. note:: **@src** must contain at least 8 elements.
Parameters:
| *[in]* **src** pointer to an array of floats
| *[out]* **dest** destination matrix2x4
.. c:function:: void glm_mat2x4_mul(mat2x4 m1, mat4x2 m2, mat2 dest)
multiply m1 and m2 to dest
.. code-block:: c
glm_mat2x4_mul(mat2x4, mat4x2, mat2);
Parameters:
| *[in]* **m1** left matrix (mat2x4)
| *[in]* **m2** right matrix (mat4x2)
| *[out]* **dest** destination matrix (mat2)
.. c:function:: void glm_mat2x4_mulv(mat2x4 m, vec4 v, vec2 dest)
multiply mat2x4 with vec4 (column vector) and store in dest vector
Parameters:
| *[in]* **m** mat2x4 (left)
| *[in]* **v** vec4 (right, column vector)
| *[out]* **dest** destination (result, column vector)
.. c:function:: void glm_mat2x4_transpose(mat2x4 m, mat4x2 dest)
transpose matrix and store in dest
Parameters:
| *[in]* **m** matrix
| *[out]* **dest** destination
.. c:function:: void glm_mat2x4_scale(mat2x4 m, float s)
multiply matrix with scalar
Parameters:
| *[in, out]* **m** matrix
| *[in]* **s** scalar

View File

@@ -49,7 +49,7 @@ Functions documentation
.. c:function:: void glm_mat3_identity(mat3 mat) .. c:function:: void glm_mat3_identity(mat3 mat)
copy identity mat3 to mat, or makes mat to identiy copy identity mat3 to mat, or makes mat to identity
Parameters: Parameters:
| *[out]* **mat** matrix | *[out]* **mat** matrix
@@ -72,6 +72,7 @@ Functions documentation
.. c:function:: void glm_mat3_mul(mat3 m1, mat3 m2, mat3 dest) .. c:function:: void glm_mat3_mul(mat3 m1, mat3 m2, mat3 dest)
multiply m1 and m2 to dest multiply m1 and m2 to dest
m1, m2 and dest matrices can be same matrix, it is possible to write this: m1, m2 and dest matrices can be same matrix, it is possible to write this:
.. code-block:: c .. code-block:: c
@@ -95,7 +96,7 @@ Functions documentation
.. c:function:: void glm_mat3_transpose(mat3 m) .. c:function:: void glm_mat3_transpose(mat3 m)
tranpose mat3 and store result in same matrix transpose mat3 and store result in same matrix
Parameters: Parameters:
| *[in]* **mat** source | *[in]* **mat** source
@@ -103,10 +104,10 @@ Functions documentation
.. c:function:: void glm_mat3_mulv(mat3 m, vec3 v, vec3 dest) .. c:function:: void glm_mat3_mulv(mat3 m, vec3 v, vec3 dest)
multiply mat4 with vec4 (column vector) and store in dest vector multiply mat3 with vec3 (column vector) and store in dest vector
Parameters: Parameters:
| *[in]* **mat** mat3 (left) | *[in]* **m** mat3 (left)
| *[in]* **v** vec3 (right, column vector) | *[in]* **v** vec3 (right, column vector)
| *[out]* **dest** destination (result, column vector) | *[out]* **dest** destination (result, column vector)
@@ -123,8 +124,8 @@ Functions documentation
multiply matrix with scalar multiply matrix with scalar
Parameters: Parameters:
| *[in, out]* **mat** matrix | *[in, out]* **m** matrix
| *[in]* **dest** scalar | *[in]* **s** scalar
.. c:function:: float glm_mat3_det(mat3 mat) .. c:function:: float glm_mat3_det(mat3 mat)
@@ -193,7 +194,7 @@ Functions documentation
Create mat3 matrix from pointer Create mat3 matrix from pointer
| NOTE: **@src** must contain 9 elements. .. note:: **@src** must contain at least 9 elements.
Parameters: Parameters:
| *[in]* **src** pointer to an array of floats | *[in]* **src** pointer to an array of floats

90
docs/source/mat3x2.rst Normal file
View File

@@ -0,0 +1,90 @@
.. default-domain:: C
mat3x2
======
Header: cglm/mat3x2.h
Table of contents (click to go):
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Macros:
1. GLM_MAT3X2_ZERO_INIT
#. GLM_MAT3X2_ZERO
Functions:
1. :c:func:`glm_mat3x2_copy`
#. :c:func:`glm_mat3x2_zero`
#. :c:func:`glm_mat3x2_make`
#. :c:func:`glm_mat3x2_mul`
#. :c:func:`glm_mat3x2_mulv`
#. :c:func:`glm_mat3x2_transpose`
#. :c:func:`glm_mat3x2_scale`
Functions documentation
~~~~~~~~~~~~~~~~~~~~~~~
.. c:function:: void glm_mat3x2_copy(mat3x2 mat, mat3x2 dest)
copy mat3x2 to another one (dest).
Parameters:
| *[in]* **mat** source
| *[out]* **dest** destination
.. c:function:: void glm_mat3x2_zero(mat3x2 mat)
make given matrix zero
Parameters:
| *[in,out]* **mat** matrix
.. c:function:: void glm_mat3x2_make(float * __restrict src, mat3x2 dest)
Create mat3x2 matrix from pointer
.. note:: **@src** must contain at least 6 elements.
Parameters:
| *[in]* **src** pointer to an array of floats
| *[out]* **dest** destination matrix3x2
.. c:function:: void glm_mat3x2_mul(mat3x2 m1, mat2x3 m2, mat3 dest)
multiply m1 and m2 to dest
.. code-block:: c
glm_mat3x2_mul(mat3x2, mat2x3, mat3);
Parameters:
| *[in]* **m1** left matrix (mat3x2)
| *[in]* **m2** right matrix (mat2x3)
| *[out]* **dest** destination matrix (mat3)
.. c:function:: void glm_mat3x2_mulv(mat3x2 m, vec2 v, vec3 dest)
multiply mat3x2 with vec2 (column vector) and store in dest vector
Parameters:
| *[in]* **m** mat3x2 (left)
| *[in]* **v** vec3 (right, column vector)
| *[out]* **dest** destination (result, column vector)
.. c:function:: void glm_mat3x2_transpose(mat3x2 m, mat2x3 dest)
transpose matrix and store in dest
Parameters:
| *[in]* **m** matrix
| *[out]* **dest** destination
.. c:function:: void glm_mat3x2_scale(mat3x2 m, float s)
multiply matrix with scalar
Parameters:
| *[in, out]* **m** matrix
| *[in]* **s** scalar

90
docs/source/mat3x4.rst Normal file
View File

@@ -0,0 +1,90 @@
.. default-domain:: C
mat3x4
======
Header: cglm/mat3x4.h
Table of contents (click to go):
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Macros:
1. GLM_MAT3X4_ZERO_INIT
#. GLM_MAT3X4_ZERO
Functions:
1. :c:func:`glm_mat3x4_copy`
#. :c:func:`glm_mat3x4_zero`
#. :c:func:`glm_mat3x4_make`
#. :c:func:`glm_mat3x4_mul`
#. :c:func:`glm_mat3x4_mulv`
#. :c:func:`glm_mat3x4_transpose`
#. :c:func:`glm_mat3x4_scale`
Functions documentation
~~~~~~~~~~~~~~~~~~~~~~~
.. c:function:: void glm_mat3x4_copy(mat3x4 mat, mat3x4 dest)
copy mat3x4 to another one (dest).
Parameters:
| *[in]* **mat** source
| *[out]* **dest** destination
.. c:function:: void glm_mat3x4_zero(mat3x4 mat)
make given matrix zero
Parameters:
| *[in,out]* **mat** matrix
.. c:function:: void glm_mat3x4_make(float * __restrict src, mat3x4 dest)
Create mat3x4 matrix from pointer
.. note::: **@src** must contain at least 12 elements.
Parameters:
| *[in]* **src** pointer to an array of floats
| *[out]* **dest** destination matrix3x4
.. c:function:: void glm_mat3x4_mul(mat3x4 m1, mat4x3 m2, mat3 dest)
multiply m1 and m2 to dest
.. code-block:: c
glm_mat3x4_mul(mat3x4, mat4x3, mat3);
Parameters:
| *[in]* **m1** left matrix (mat3x4)
| *[in]* **m2** right matrix (mat4x3)
| *[out]* **dest** destination matrix (mat3)
.. c:function:: void glm_mat3x4_mulv(mat3x4 m, vec4 v, vec3 dest)
multiply mat3x4 with vec4 (column vector) and store in dest vector
Parameters:
| *[in]* **m** mat3x4 (left)
| *[in]* **v** vec4 (right, column vector)
| *[out]* **dest** destination (result, column vector)
.. c:function:: void glm_mat3x4_transpose(mat3x4 m, mat4x3 dest)
transpose matrix and store in dest
Parameters:
| *[in]* **m** matrix
| *[out]* **dest** destination
.. c:function:: void glm_mat3x4_scale(mat3x4 m, float s)
multiply matrix with scalar
Parameters:
| *[in, out]* **m** matrix
| *[in]* **s** scalar

View File

@@ -34,8 +34,8 @@ Functions:
#. :c:func:`glm_mat4_mulN` #. :c:func:`glm_mat4_mulN`
#. :c:func:`glm_mat4_mulv` #. :c:func:`glm_mat4_mulv`
#. :c:func:`glm_mat4_mulv3` #. :c:func:`glm_mat4_mulv3`
#. :c:func:`glm_mat3_trace` #. :c:func:`glm_mat4_trace`
#. :c:func:`glm_mat3_trace3` #. :c:func:`glm_mat4_trace3`
#. :c:func:`glm_mat4_quat` #. :c:func:`glm_mat4_quat`
#. :c:func:`glm_mat4_transpose_to` #. :c:func:`glm_mat4_transpose_to`
#. :c:func:`glm_mat4_transpose` #. :c:func:`glm_mat4_transpose`
@@ -70,7 +70,7 @@ Functions documentation
.. c:function:: void glm_mat4_identity(mat4 mat) .. c:function:: void glm_mat4_identity(mat4 mat)
copy identity mat4 to mat, or makes mat to identiy copy identity mat4 to mat, or makes mat to identity
Parameters: Parameters:
| *[out]* **mat** matrix | *[out]* **mat** matrix
@@ -119,6 +119,7 @@ Functions documentation
.. c:function:: void glm_mat4_mul(mat4 m1, mat4 m2, mat4 dest) .. c:function:: void glm_mat4_mul(mat4 m1, mat4 m2, mat4 dest)
multiply m1 and m2 to dest multiply m1 and m2 to dest
m1, m2 and dest matrices can be same matrix, it is possible to write this: m1, m2 and dest matrices can be same matrix, it is possible to write this:
.. code-block:: c .. code-block:: c
@@ -157,7 +158,6 @@ Functions documentation
Parameters: Parameters:
| *[in]* **m** mat4 (left) | *[in]* **m** mat4 (left)
| *[in]* **v** vec4 (right, column vector) | *[in]* **v** vec4 (right, column vector)
| *[in]* **last** 4th item to make it vec4
| *[out]* **dest** vec4 (result, column vector) | *[out]* **dest** vec4 (result, column vector)
.. c:function:: void glm_mat4_mulv3(mat4 m, vec3 v, float last, vec3 dest) .. c:function:: void glm_mat4_mulv3(mat4 m, vec3 v, float last, vec3 dest)
@@ -214,7 +214,7 @@ Functions documentation
.. c:function:: void glm_mat4_transpose(mat4 m) .. c:function:: void glm_mat4_transpose(mat4 m)
tranpose mat4 and store result in same matrix transpose mat4 and store result in same matrix
Parameters: Parameters:
| *[in]* **m** source | *[in]* **m** source
@@ -263,7 +263,7 @@ Functions documentation
| e.g Newton-Raphson. this should work faster than normal, | e.g Newton-Raphson. this should work faster than normal,
| to get more precise use glm_mat4_inv version. | to get more precise use glm_mat4_inv version.
| NOTE: You will lose precision, glm_mat4_inv is more accurate .. note:: You will lose precision, glm_mat4_inv is more accurate
Parameters: Parameters:
| *[in]* **mat** source | *[in]* **mat** source
@@ -308,7 +308,7 @@ Functions documentation
Create mat4 matrix from pointer Create mat4 matrix from pointer
| NOTE: **@src** must contain 16 elements. .. note:: **@src** must contain at least 16 elements.
Parameters: Parameters:
| *[in]* **src** pointer to an array of floats | *[in]* **src** pointer to an array of floats

90
docs/source/mat4x2.rst Normal file
View File

@@ -0,0 +1,90 @@
.. default-domain:: C
mat4x2
======
Header: cglm/mat4x2.h
Table of contents (click to go):
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Macros:
1. GLM_MAT4X2_ZERO_INIT
#. GLM_MAT4X2_ZERO
Functions:
1. :c:func:`glm_mat4x2_copy`
#. :c:func:`glm_mat4x2_zero`
#. :c:func:`glm_mat4x2_make`
#. :c:func:`glm_mat4x2_mul`
#. :c:func:`glm_mat4x2_mulv`
#. :c:func:`glm_mat4x2_transpose`
#. :c:func:`glm_mat4x2_scale`
Functions documentation
~~~~~~~~~~~~~~~~~~~~~~~
.. c:function:: void glm_mat4x2_copy(mat4x2 mat, mat4x2 dest)
copy mat4x2 to another one (dest).
Parameters:
| *[in]* **mat** source
| *[out]* **dest** destination
.. c:function:: void glm_mat4x2_zero(mat4x2 mat)
make given matrix zero
Parameters:
| *[in,out]* **mat** matrix
.. c:function:: void glm_mat4x2_make(float * __restrict src, mat4x2 dest)
Create mat4x2 matrix from pointer
.. note:: **@src** must contain at least 8 elements.
Parameters:
| *[in]* **src** pointer to an array of floats
| *[out]* **dest** destination matrix4x2
.. c:function:: void glm_mat4x2_mul(mat4x2 m1, mat2x4 m2, mat4 dest)
multiply m1 and m2 to dest
.. code-block:: c
glm_mat4x2_mul(mat4x2, mat2x4, mat4);
Parameters:
| *[in]* **m1** left matrix (mat4x2)
| *[in]* **m2** right matrix (mat2x4)
| *[out]* **dest** destination matrix (mat4)
.. c:function:: void glm_mat4x2_mulv(mat4x2 m, vec2 v, vec4 dest)
multiply mat4x2 with vec2 (column vector) and store in dest vector
Parameters:
| *[in]* **m** mat4x2 (left)
| *[in]* **v** vec2 (right, column vector)
| *[out]* **dest** destination (result, column vector)
.. c:function:: void glm_mat4x2_transpose(mat4x2 m, mat2x4 dest)
transpose matrix and store in dest
Parameters:
| *[in]* **m** matrix
| *[out]* **dest** destination
.. c:function:: void glm_mat4x2_scale(mat4x2 m, float s)
multiply matrix with scalar
Parameters:
| *[in, out]* **m** matrix
| *[in]* **s** scalar

90
docs/source/mat4x3.rst Normal file
View File

@@ -0,0 +1,90 @@
.. default-domain:: C
mat4x3
======
Header: cglm/mat4x3.h
Table of contents (click to go):
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Macros:
1. GLM_MAT4X3_ZERO_INIT
#. GLM_MAT4X3_ZERO
Functions:
1. :c:func:`glm_mat4x3_copy`
#. :c:func:`glm_mat4x3_zero`
#. :c:func:`glm_mat4x3_make`
#. :c:func:`glm_mat4x3_mul`
#. :c:func:`glm_mat4x3_mulv`
#. :c:func:`glm_mat4x3_transpose`
#. :c:func:`glm_mat4x3_scale`
Functions documentation
~~~~~~~~~~~~~~~~~~~~~~~
.. c:function:: void glm_mat4x3_copy(mat4x3 mat, mat4x3 dest)
copy mat4x3 to another one (dest).
Parameters:
| *[in]* **mat** source
| *[out]* **dest** destination
.. c:function:: void glm_mat4x3_zero(mat4x3 mat)
make given matrix zero
Parameters:
| *[in,out]* **mat** matrix
.. c:function:: void glm_mat4x3_make(float * __restrict src, mat4x3 dest)
Create mat4x3 matrix from pointer
.. note:: **@src** must contain at least 12 elements.
Parameters:
| *[in]* **src** pointer to an array of floats
| *[out]* **dest** destination matrix4x3
.. c:function:: void glm_mat4x3_mul(mat4x3 m1, mat3x4 m2, mat4 dest)
multiply m1 and m2 to dest
.. code-block:: c
glm_mat4x3_mul(mat4x3, mat3x4, mat4);
Parameters:
| *[in]* **m1** left matrix (mat4x3)
| *[in]* **m2** right matrix (mat3x4)
| *[out]* **dest** destination matrix (mat4)
.. c:function:: void glm_mat4x3_mulv(mat4x3 m, vec3 v, vec4 dest)
multiply mat4x3 with vec3 (column vector) and store in dest vector
Parameters:
| *[in]* **m** mat4x3 (left)
| *[in]* **v** vec3 (right, column vector)
| *[out]* **dest** destination (result, column vector)
.. c:function:: void glm_mat4x3_transpose(mat4x3 m, mat3x4 dest)
transpose matrix and store in dest
Parameters:
| *[in]* **m** matrix
| *[out]* **dest** destination
.. c:function:: void glm_mat4x3_scale(mat4x3 m, float s)
multiply matrix with scalar
Parameters:
| *[in, out]* **m** matrix
| *[in]* **s** scalar

View File

@@ -43,14 +43,14 @@ array of matrices:
/* ... */ /* ... */
glUniformMatrix4fv(location, count, GL_FALSE, (float *)matrix); glUniformMatrix4fv(location, count, GL_FALSE, (float *)matrix);
in this way, passing aray of matrices is same in this way, passing array of matrices is same
Passing / Uniforming Vectors to OpenGL: Passing / Uniforming Vectors to OpenGL:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
You don't need to do extra thing when passing cglm vectors to OpengL or other APIs. You don't need to do extra thing when passing cglm vectors to OpengL or other APIs.
Because a function like **glUniform4fv** accepts vector as pointer. cglm's vectors Because a function like **glUniform4fv** accepts vector as pointer. cglm's vectors
are array of floats. So you can pass it directly ot those functions: are array of floats. So you can pass it directly to those functions:
.. code-block:: c .. code-block:: c

View File

@@ -29,7 +29,7 @@ have to compile cglm with **CGLM_ALL_UNALIGNED** macro.
if you do not know what you are doing. Because a cglm header included if you do not know what you are doing. Because a cglm header included
via 'project A' may force types to be aligned and another cglm header via 'project A' may force types to be aligned and another cglm header
included via 'project B' may not require alignment. In this case included via 'project B' may not require alignment. In this case
cglm functions will read from and write to **INVALID MEMORY LOCATIONs**. cglm functions will read from and write to **INVALID MEMORY LOCATIONSNs**.
ALWAYS USE SAME CONFIGURATION / OPTION for **cglm** if you have multiple projects. ALWAYS USE SAME CONFIGURATION / OPTION for **cglm** if you have multiple projects.
@@ -43,7 +43,7 @@ By starting **v0.8.3** cglm provides options to switch between clipspace configu
Clipspace related files are located at `include/cglm/[struct]/clipspace.h` but Clipspace related files are located at `include/cglm/[struct]/clipspace.h` but
these are included in related files like `cam.h`. If you don't want to change your existing these are included in related files like `cam.h`. If you don't want to change your existing
clipspace configuration and want to use different clipspace function like `glm_lookat_zo` or `glm_lookat_lh_zo`... clipspace configuration and want to use different clipspace function like `glm_lookat_zo` or `glm_lookat_lh_zo`...
then you can include individual headers or just define `CGLM_CLIPSPACE_INCLUDE_ALL` which will iclude all headers for you. then you can include individual headers or just define `CGLM_CLIPSPACE_INCLUDE_ALL` which will include all headers for you.
1. **CGLM_CLIPSPACE_INCLUDE_ALL** 1. **CGLM_CLIPSPACE_INCLUDE_ALL**
2. **CGLM_FORCE_DEPTH_ZERO_TO_ONE** 2. **CGLM_FORCE_DEPTH_ZERO_TO_ONE**

View File

@@ -426,7 +426,7 @@ Functions documentation
Create quaternion from pointer Create quaternion from pointer
| NOTE: **@src** must contain at least 4 elements. cglm store quaternions as [x, y, z, w]. .. note:: **@src** must contain at least 4 elements. cglm store quaternions as [x, y, z, w].
Parameters: Parameters:
| *[in]* **src** pointer to an array of floats | *[in]* **src** pointer to an array of floats

View File

@@ -9,7 +9,7 @@ Header: cglm/sphere.h
Sphere Representation in cglm is *vec4*: **[center.x, center.y, center.z, radii]** Sphere Representation in cglm is *vec4*: **[center.x, center.y, center.z, radii]**
You can call any vec3 function by pasing sphere. Because first three elements You can call any vec3 function by passing sphere. Because first three elements
defines center of sphere. defines center of sphere.
Table of contents (click to go): Table of contents (click to go):

View File

@@ -3,30 +3,30 @@
Troubleshooting Troubleshooting
================================================================================ ================================================================================
It is possible that sometimes you may get crashes or wrong results. It is possible that you may sometimes get crashes or wrong results.
Follow these topics Follow these topics
Memory Allocation: Memory Allocation:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Again, **cglm** doesn't alloc any memory on heap. Recall that **cglm** does not alloc any memory on the heap.
cglm functions works like memcpy; it copies data from src, cglm functions work like memcpy; they copy data from src,
makes calculations then copy the result to dest. make calculations, then copy the result to dest.
You are responsible for allocation of **src** and **dest** parameters. You are responsible for allocation of **src** and **dest** parameters.
Alignment: Alignment:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
**vec4** and **mat4** types requires 16 byte alignment. **vec4** and **mat4** types require 16 byte alignment.
These types are marked with align attribute to let compiler know about this These types are marked with the align attribute to let the compiler know about this
requirement. requirement.
But since MSVC (Windows) throws the error: Since MSVC (Windows) throws this error:
**"formal parameter with requested alignment of 16 won't be aligned"** **"formal parameter with requested alignment of 16 won't be aligned"**
The alignment attribute has been commented for MSVC The alignment attribute has been commented out for MSVC
.. code-block:: c .. code-block:: c
@@ -37,61 +37,61 @@ The alignment attribute has been commented for MSVC
#endif. #endif.
So MSVC may not know about alignment requirements when creating variables. So MSVC may not know about alignment requirements when creating variables.
The interesting thing is that, if I remember correctly Visual Studio 2017 The interesting thing is that, if I remember correctly, Visual Studio 2017
doesn't throw the above error. So we may uncomment that line for Visual Studio 2017, doesn't throw the above error. So we may uncomment that line for Visual Studio 2017,
you may do it yourself. you may do it yourself.
**This MSVC issue is still in TODOs.** **This MSVC issue is still in TODOs.**
**UPDATE:** By starting v0.4.5 cglm provides an option to disable alignment requirement. **UPDATE:** Starting with v0.4.5, cglm provides an option to disable the alignment requirement.
Also alignment is disabled for older msvc verisons as default. Now alignment is only required in Visual Studio 2017 version 15.6+ if CGLM_ALL_UNALIGNED macro is not defined. Also, alignment is disabled for older msvc versions by default. Now alignment is only required in Visual Studio 2017 version 15.6+ if the CGLM_ALL_UNALIGNED macro is not defined.
Crashes, Invalid Memory Access: Crashes, Invalid Memory Access:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Probably you are trying to write to invalid memory location. Most likely, you are trying to write to an invalid memory location.
You may used wrong function for what you want to do. You may have used a wrong function for what you want to do.
For instance you may called **glm_vec4_** functions for **vec3** data type. For example, you may have called a **glm_vec4_** function for a **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 bytes, but since **vec3** is 24 bytes, it should throw
memory access error or exit the app without saying anything. a memory access error or exit the app without saying anything.
**UPDATE - IMPORTANT:** **UPDATE - IMPORTANT:**
| On MSVC or some other compilers, if alignment is enabled (default) then double check alignment requirements if you got a crash. | 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. | If you send GLM_VEC4_ONE or similar macros directly to a function, it may crash.
| Because compiler may not apply alignment as defined on **typedef** to that macro while passing it (on stack) to a function. | Because the compiler may not apply alignment as defined on **typedef** to that macro while passing it (on stack) to a function.
Wrong Results: Wrong Results:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Again, you may used wrong function. Again, you may have used a wrong function.
For instance if you use **glm_normalize()** or **glm_vec3_normalize()** for **vec4**, For instance if you use **glm_normalize()** or **glm_vec3_normalize()** for a **vec4**,
it will assume that passed param is **vec3** and will normalize it for **vec3**. it will assume that the passed param is a **vec3**, and will normalize it for **vec3**.
Since you need to **vec4** to be normalized in your case, you will get wrong results. Since you need a **vec4** to be normalized in your case, you will get wrong results.
Accessing vec4 type with vec3 functions is valid, you will not get any error, exception or crash. Accessing a vec4 type with vec3 functions is valid, you will not get any error, exception or crash.
You only get wrong results if you don't know what you are doing! You only get wrong results if you don't know what you are doing!
So be carefull, when your IDE (Xcode, Visual Studio ...) tried to autocomplete function names, READ IT :) So be careful, when your IDE (Xcode, Visual Studio ...) tries to autocomplete function names, READ IT :)
**Also implementation may be wrong please let us know by creating an issue on Github.** **Also implementation may be wrong, please let us know by creating an issue on Github.**
BAD_ACCESS : Thread 1: EXC_BAD_ACCESS (code=EXC_I386_GPFLT) or Similar Errors/Crashes BAD_ACCESS : Thread 1: EXC_BAD_ACCESS (code=EXC_I386_GPFLT) or Similar Errors/Crashes
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
This is similar issue with alignment. For instance if you compiled **cglm** with This is a similar issue with alignment. For instance if you compiled **cglm** with
AVX (**-mavx**, intentionally or not) and if you use **cglm** in an environment that doesn't AVX (**-mavx**, intentionally or not) and if you use **cglm** in an environment that doesn't
support AVX (or if AVX is disabled intentionally) e.g. environment that max support SSE2/3/4, support AVX (or if AVX is disabled intentionally) e.g. environment that max support SSE2/3/4,
then you probably get **BAD ACCESS** or similar... then you probably get **BAD ACCESS** or similar...
Because if you compile **cglm** with AVX it aligns **mat4** with 32 byte boundary, Because if you compile **cglm** with AVX it aligns **mat4** with 32 byte boundary,
and your project aligns that as 16 byte boundary... and your project aligns that as a 16 byte boundary...
Check alignment, supported vector extension or simd in **cglm** and linked projects... Check alignment, supported vector extension, or simd in **cglm** and linked projects...
Other Issues? Other Issues?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

View File

@@ -68,14 +68,14 @@ Functions documentation
.. c:function:: void glm_make_rad(float *degm) .. c:function:: void glm_make_rad(float *degm)
| convert exsisting degree to radians. this will override degrees value | convert existing degree to radians. this will override degrees value
Parameters: Parameters:
| *[in, out]* **deg** pointer to angle in degrees | *[in, out]* **deg** pointer to angle in degrees
.. c:function:: void glm_make_deg(float *rad) .. c:function:: void glm_make_deg(float *rad)
| convert exsisting radians to degree. this will override radians value | convert existing radians to degree. this will override radians value
Parameters: Parameters:
| *[in, out]* **rad** pointer to angle in radians | *[in, out]* **rad** pointer to angle in radians

View File

@@ -45,6 +45,7 @@ Functions:
#. :c:func:`glm_vec2_normalize` #. :c:func:`glm_vec2_normalize`
#. :c:func:`glm_vec2_normalize_to` #. :c:func:`glm_vec2_normalize_to`
#. :c:func:`glm_vec2_rotate` #. :c:func:`glm_vec2_rotate`
#. :c:func:`glm_vec2_center`
#. :c:func:`glm_vec2_distance2` #. :c:func:`glm_vec2_distance2`
#. :c:func:`glm_vec2_distance` #. :c:func:`glm_vec2_distance`
#. :c:func:`glm_vec2_maxv` #. :c:func:`glm_vec2_maxv`
@@ -116,7 +117,7 @@ Functions documentation
norm * norm (magnitude) of vector norm * norm (magnitude) of vector
we can use this func instead of calling norm * norm, because it would call 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 sqrtf function twice but with this func we can avoid func call, maybe this is
not good name for this func not good name for this func
Parameters: Parameters:
@@ -314,6 +315,15 @@ Functions documentation
| *[in]* **axis** axis vector | *[in]* **axis** axis vector
| *[out]* **dest** destination | *[out]* **dest** destination
.. c:function:: void glm_vec2_center(vec2 v1, vec2 v2, vec2 dest)
find center point of two vector
Parameters:
| *[in]* **v1** vector1
| *[in]* **v2** vector2
| *[out]* **dest** center point
.. c:function:: float glm_vec2_distance2(vec2 v1, vec2 v2) .. c:function:: float glm_vec2_distance2(vec2 v1, vec2 v2)
squared distance between two vectors squared distance between two vectors
@@ -379,7 +389,8 @@ Functions documentation
Create two dimensional vector from pointer Create two dimensional vector from pointer
| NOTE: **@src** must contain at least 2 elements. .. note:: **@src** must contain at least 2 elements.
Parameters: Parameters:
| *[in]* **src** pointer to an array of floats | *[in]* **src** pointer to an array of floats
| *[out]* **dest** destination vector | *[out]* **dest** destination vector

View File

@@ -50,6 +50,14 @@ Functions documentation
| *[in]* **val** value | *[in]* **val** value
| *[out]* **dest** destination | *[out]* **dest** destination
.. c:function:: void glm_vec3_fill(vec3 v, float val)
fill a vector with specified value
Parameters:
| *[out]* **v** vector
| *[in]* **val** value
.. c:function:: bool glm_vec3_eq(vec3 v, float val) .. c:function:: bool glm_vec3_eq(vec3 v, float val)
check if vector is equal to value (without epsilon) check if vector is equal to value (without epsilon)

View File

@@ -13,7 +13,7 @@ Header: cglm/vec3.h
We mostly use vectors in graphics math, to make writing code faster We mostly use vectors in graphics math, to make writing code faster
and easy to read, some *vec3* functions are aliased in global namespace. and easy to read, some *vec3* functions are aliased in global namespace.
For instance :c:func:`glm_dot` is alias of :c:func:`glm_vec3_dot`, For instance :c:func:`glm_dot` is alias of :c:func:`glm_vec3_dot`,
alias means inline wrapper here. There is no call verison of alias functions alias means inline wrapper here. There is no call version of alias functions
There are also functions for rotating *vec3* vector. **_m4**, **_m3** prefixes There are also functions for rotating *vec3* vector. **_m4**, **_m3** prefixes
rotate *vec3* with matrix. rotate *vec3* with matrix.
@@ -148,7 +148,7 @@ Functions documentation
norm * norm (magnitude) of vector norm * norm (magnitude) of vector
we can use this func instead of calling norm * norm, because it would call 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 sqrtf function twice but with this func we can avoid func call, maybe this is
not good name for this func not good name for this func
Parameters: Parameters:
@@ -309,7 +309,7 @@ Functions documentation
.. c:function:: void glm_vec3_flipsign(vec3 v) .. c:function:: void glm_vec3_flipsign(vec3 v)
**DEPRACATED!** **DEPRECATED!**
use :c:func:`glm_vec3_negate` use :c:func:`glm_vec3_negate`
@@ -318,7 +318,7 @@ Functions documentation
.. c:function:: void glm_vec3_flipsign_to(vec3 v, vec3 dest) .. c:function:: void glm_vec3_flipsign_to(vec3 v, vec3 dest)
**DEPRACATED!** **DEPRECATED!**
use :c:func:`glm_vec3_negate_to` use :c:func:`glm_vec3_negate_to`
@@ -328,7 +328,7 @@ Functions documentation
.. c:function:: void glm_vec3_inv(vec3 v) .. c:function:: void glm_vec3_inv(vec3 v)
**DEPRACATED!** **DEPRECATED!**
use :c:func:`glm_vec3_negate` use :c:func:`glm_vec3_negate`
@@ -337,7 +337,7 @@ Functions documentation
.. c:function:: void glm_vec3_inv_to(vec3 v, vec3 dest) .. c:function:: void glm_vec3_inv_to(vec3 v, vec3 dest)
**DEPRACATED!** **DEPRECATED!**
use :c:func:`glm_vec3_negate_to` use :c:func:`glm_vec3_negate_to`
@@ -377,7 +377,7 @@ Functions documentation
.. c:function:: float glm_vec3_angle(vec3 v1, vec3 v2) .. c:function:: float glm_vec3_angle(vec3 v1, vec3 v2)
angle betwen two vector angle between two vector
Parameters: Parameters:
| *[in]* **v1** vector1 | *[in]* **v1** vector1
@@ -507,7 +507,7 @@ Functions documentation
Create three dimensional vector from pointer Create three dimensional vector from pointer
| NOTE: **@src** must contain at least 3 elements. .. note::: **@src** must contain at least 3 elements.
Parameters: Parameters:
| *[in]* **src** pointer to an array of floats | *[in]* **src** pointer to an array of floats

View File

@@ -108,6 +108,13 @@ Functions documentation
Parameters: Parameters:
| *[in, out]* **v** vector | *[in, out]* **v** vector
.. c:function:: void glm_vec4_one(vec4 v)
makes all members one
Parameters:
| *[in, out]* **v** vector
.. c:function:: float glm_vec4_dot(vec4 a, vec4 b) .. c:function:: float glm_vec4_dot(vec4 a, vec4 b)
dot product of vec4 dot product of vec4
@@ -124,7 +131,7 @@ Functions documentation
norm * norm (magnitude) of vector norm * norm (magnitude) of vector
we can use this func instead of calling norm * norm, because it would call 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 sqrtf function twice but with this func we can avoid func call, maybe this is
not good name for this func not good name for this func
Parameters: Parameters:
@@ -284,7 +291,7 @@ Functions documentation
.. c:function:: void glm_vec4_flipsign(vec4 v) .. c:function:: void glm_vec4_flipsign(vec4 v)
**DEPRACATED!** **DEPRECATED!**
use :c:func:`glm_vec4_negate` use :c:func:`glm_vec4_negate`
@@ -293,7 +300,7 @@ Functions documentation
.. c:function:: void glm_vec4_flipsign_to(vec4 v, vec4 dest) .. c:function:: void glm_vec4_flipsign_to(vec4 v, vec4 dest)
**DEPRACATED!** **DEPRECATED!**
use :c:func:`glm_vec4_negate_to` use :c:func:`glm_vec4_negate_to`
@@ -303,7 +310,7 @@ Functions documentation
.. c:function:: void glm_vec4_inv(vec4 v) .. c:function:: void glm_vec4_inv(vec4 v)
**DEPRACATED!** **DEPRECATED!**
use :c:func:`glm_vec4_negate` use :c:func:`glm_vec4_negate`
@@ -312,7 +319,7 @@ Functions documentation
.. c:function:: void glm_vec4_inv_to(vec4 v, vec4 dest) .. c:function:: void glm_vec4_inv_to(vec4 v, vec4 dest)
**DEPRACATED!** **DEPRECATED!**
use :c:func:`glm_vec4_negate_to` use :c:func:`glm_vec4_negate_to`
@@ -412,7 +419,8 @@ Functions documentation
Create four dimensional vector from pointer Create four dimensional vector from pointer
| NOTE: **@src** must contain at least 4 elements. .. note:: **@src** must contain at least 4 elements.
Parameters: Parameters:
| *[in]* **src** pointer to an array of floats | *[in]* **src** pointer to an array of floats
| *[out]* **dest** destination vector | *[out]* **dest** destination vector

271
include/cglm/aabb2d.h Normal file
View File

@@ -0,0 +1,271 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#ifndef cglm_aabb2d_h
#define cglm_aabb2d_h
#include "common.h"
#include "vec2.h"
#include "util.h"
/* DEPRECATED! use _diag */
#define glm_aabb2d_size(aabb) glm_aabb2d_diag(aabb)
/*!
* @brief make [aabb] zero
*
* @param[in, out] aabb aabb
*/
CGLM_INLINE
void
glm_aabb2d_zero(vec2 aabb[2]) {
glm_vec2_zero(aabb[0]);
glm_vec2_zero(aabb[1]);
}
/*!
* @brief copy all members of [aabb] to [dest]
*
* @param[in] aabb source
* @param[out] dest destination
*/
CGLM_INLINE
void
glm_aabb2d_copy(vec2 aabb[2], vec2 dest[2]) {
glm_vec2_copy(aabb[0], dest[0]);
glm_vec2_copy(aabb[1], dest[1]);
}
/*!
* @brief apply transform to Axis-Aligned Bounding aabb
*
* @param[in] aabb bounding aabb
* @param[in] m transform matrix
* @param[out] dest transformed bounding aabb
*/
CGLM_INLINE
void
glm_aabb2d_transform(vec2 aabb[2], mat3 m, vec2 dest[2]) {
vec2 v[2], xa, xb, ya, yb;
glm_vec2_scale(m[0], aabb[0][0], xa);
glm_vec2_scale(m[0], aabb[1][0], xb);
glm_vec2_scale(m[1], aabb[0][1], ya);
glm_vec2_scale(m[1], aabb[1][1], yb);
/* translation + min(xa, xb) + min(ya, yb) */
glm_vec2(m[2], v[0]);
glm_vec2_minadd(xa, xb, v[0]);
glm_vec2_minadd(ya, yb, v[0]);
/* translation + max(xa, xb) + max(ya, yb) */
glm_vec2(m[2], v[1]);
glm_vec2_maxadd(xa, xb, v[1]);
glm_vec2_maxadd(ya, yb, v[1]);
glm_vec2_copy(v[0], dest[0]);
glm_vec2_copy(v[1], dest[1]);
}
/*!
* @brief merges two AABB bounding aabb and creates new one
*
* two aabb must be in same space, if one of aabb is in different space then
* you should consider to convert it's space by glm_aabb_space
*
* @param[in] aabb1 bounding aabb 1
* @param[in] aabb2 bounding aabb 2
* @param[out] dest merged bounding aabb
*/
CGLM_INLINE
void
glm_aabb2d_merge(vec2 aabb1[2], vec2 aabb2[2], vec2 dest[2]) {
dest[0][0] = glm_min(aabb1[0][0], aabb2[0][0]);
dest[0][1] = glm_min(aabb1[0][1], aabb2[0][1]);
dest[1][0] = glm_max(aabb1[1][0], aabb2[1][0]);
dest[1][1] = glm_max(aabb1[1][1], aabb2[1][1]);
}
/*!
* @brief crops a bounding aabb with another one.
*
* this could be useful for gettng a baabb which fits with view frustum and
* object bounding aabbes. In this case you crop view frustum aabb with objects
* aabb
*
* @param[in] aabb bounding aabb 1
* @param[in] cropAabb crop aabb
* @param[out] dest cropped bounding aabb
*/
CGLM_INLINE
void
glm_aabb2d_crop(vec2 aabb[2], vec2 cropAabb[2], vec2 dest[2]) {
dest[0][0] = glm_max(aabb[0][0], cropAabb[0][0]);
dest[0][1] = glm_max(aabb[0][1], cropAabb[0][1]);
dest[1][0] = glm_min(aabb[1][0], cropAabb[1][0]);
dest[1][1] = glm_min(aabb[1][1], cropAabb[1][1]);
}
/*!
* @brief crops a bounding aabb with another one.
*
* this could be useful for gettng a baabb which fits with view frustum and
* object bounding aabbes. In this case you crop view frustum aabb with objects
* aabb
*
* @param[in] aabb bounding aabb
* @param[in] cropAabb crop aabb
* @param[in] clampAabb minimum aabb
* @param[out] dest cropped bounding aabb
*/
CGLM_INLINE
void
glm_aabb2d_crop_until(vec2 aabb[2],
vec2 cropAabb[2],
vec2 clampAabb[2],
vec2 dest[2]) {
glm_aabb2d_crop(aabb, cropAabb, dest);
glm_aabb2d_merge(clampAabb, dest, dest);
}
/*!
* @brief invalidate AABB min and max values
*
* @param[in, out] aabb bounding aabb
*/
CGLM_INLINE
void
glm_aabb2d_invalidate(vec2 aabb[2]) {
glm_vec2_fill(aabb[0], FLT_MAX);
glm_vec2_fill(aabb[1], -FLT_MAX);
}
/*!
* @brief check if AABB is valid or not
*
* @param[in] aabb bounding aabb
*/
CGLM_INLINE
bool
glm_aabb2d_isvalid(vec2 aabb[2]) {
return glm_vec2_max(aabb[0]) != FLT_MAX
&& glm_vec2_min(aabb[1]) != -FLT_MAX;
}
/*!
* @brief distance between of min and max
*
* @param[in] aabb bounding aabb
*/
CGLM_INLINE
float
glm_aabb2d_diag(vec2 aabb[2]) {
return glm_vec2_distance(aabb[0], aabb[1]);
}
/*!
* @brief size of aabb
*
* @param[in] aabb bounding aabb
* @param[out] dest size
*/
CGLM_INLINE
void
glm_aabb2d_sizev(vec2 aabb[2], vec2 dest) {
glm_vec2_sub(aabb[1], aabb[0], dest);
}
/*!
* @brief radius of sphere which surrounds AABB
*
* @param[in] aabb bounding aabb
*/
CGLM_INLINE
float
glm_aabb2d_radius(vec2 aabb[2]) {
return glm_aabb2d_diag(aabb) * 0.5f;
}
/*!
* @brief computes center point of AABB
*
* @param[in] aabb bounding aabb
* @param[out] dest center of bounding aabb
*/
CGLM_INLINE
void
glm_aabb2d_center(vec2 aabb[2], vec2 dest) {
glm_vec2_center(aabb[0], aabb[1], dest);
}
/*!
* @brief check if two AABB intersects
*
* @param[in] aabb bounding aabb
* @param[in] other other bounding aabb
*/
CGLM_INLINE
bool
glm_aabb2d_aabb(vec2 aabb[2], vec2 other[2]) {
return (aabb[0][0] <= other[1][0] && aabb[1][0] >= other[0][0])
&& (aabb[0][1] <= other[1][1] && aabb[1][1] >= other[0][1]);
}
/*!
* @brief check if AABB intersects with a circle
*
* Circle Representation in cglm: [center.x, center.y, radii]
*
* @param[in] aabb solid bounding aabb
* @param[in] c solid circle
*/
CGLM_INLINE
bool
glm_aabb2d_circle(vec2 aabb[2], vec3 c) {
float dmin;
int a, b;
a = (c[0] < aabb[0][0]) + (c[0] > aabb[1][0]);
b = (c[1] < aabb[0][1]) + (c[1] > aabb[1][1]);
dmin = glm_pow2((c[0] - aabb[!(a - 1)][0]) * (a != 0))
+ glm_pow2((c[1] - aabb[!(b - 1)][1]) * (b != 0));
return dmin <= glm_pow2(c[2]);
}
/*!
* @brief check if point is inside of AABB
*
* @param[in] aabb bounding aabb
* @param[in] point point
*/
CGLM_INLINE
bool
glm_aabb2d_point(vec2 aabb[2], vec2 point) {
return (point[0] >= aabb[0][0] && point[0] <= aabb[1][0])
&& (point[1] >= aabb[0][1] && point[1] <= aabb[1][1]);
}
/*!
* @brief check if AABB contains other AABB
*
* @param[in] aabb bounding aabb
* @param[in] other other bounding aabb
*/
CGLM_INLINE
bool
glm_aabb2d_contains(vec2 aabb[2], vec2 other[2]) {
return (aabb[0][0] <= other[0][0] && aabb[1][0] >= other[1][0])
&& (aabb[0][1] <= other[0][1] && aabb[1][1] >= other[1][1]);
}
#endif /* cglm_aabb2d_h */

View File

@@ -34,9 +34,9 @@
* @brief translate existing transform matrix by v vector * @brief translate existing transform matrix by v vector
* and stores result in same matrix * and stores result in same matrix
* *
* this is POST transform, applies to existing transform as last transfrom * this is POST transform, applies to existing transform as last transform
* *
* @param[in, out] m affine transfrom * @param[in, out] m affine transform
* @param[in] v translate vector [x, y, z] * @param[in] v translate vector [x, y, z]
*/ */
CGLM_INLINE CGLM_INLINE
@@ -51,9 +51,9 @@ glm_translated(mat4 m, vec3 v) {
* *
* source matrix will remain same * source matrix will remain same
* *
* this is POST transform, applies to existing transform as last transfrom * this is POST transform, applies to existing transform as last transform
* *
* @param[in] m affine transfrom * @param[in] m affine transform
* @param[in] v translate vector [x, y, z] * @param[in] v translate vector [x, y, z]
* @param[out] dest translated matrix * @param[out] dest translated matrix
*/ */
@@ -67,9 +67,9 @@ glm_translated_to(mat4 m, vec3 v, mat4 dest) {
/*! /*!
* @brief translate existing transform matrix by x factor * @brief translate existing transform matrix by x factor
* *
* this is POST transform, applies to existing transform as last transfrom * this is POST transform, applies to existing transform as last transform
* *
* @param[in, out] m affine transfrom * @param[in, out] m affine transform
* @param[in] x x factor * @param[in] x x factor
*/ */
CGLM_INLINE CGLM_INLINE
@@ -81,9 +81,9 @@ glm_translated_x(mat4 m, float x) {
/*! /*!
* @brief translate existing transform matrix by y factor * @brief translate existing transform matrix by y factor
* *
* this is POST transform, applies to existing transform as last transfrom * this is POST transform, applies to existing transform as last transform
* *
* @param[in, out] m affine transfrom * @param[in, out] m affine transform
* @param[in] y y factor * @param[in] y y factor
*/ */
CGLM_INLINE CGLM_INLINE
@@ -95,9 +95,9 @@ glm_translated_y(mat4 m, float y) {
/*! /*!
* @brief translate existing transform matrix by z factor * @brief translate existing transform matrix by z factor
* *
* this is POST transform, applies to existing transform as last transfrom * this is POST transform, applies to existing transform as last transform
* *
* @param[in, out] m affine transfrom * @param[in, out] m affine transform
* @param[in] z z factor * @param[in] z z factor
*/ */
CGLM_INLINE CGLM_INLINE
@@ -110,9 +110,9 @@ glm_translated_z(mat4 m, float z) {
* @brief rotate existing transform matrix around X axis by angle * @brief rotate existing transform matrix around X axis by angle
* and store result in dest * and store result in dest
* *
* this is POST transform, applies to existing transform as last transfrom * this is POST transform, applies to existing transform as last transform
* *
* @param[in] m affine transfrom * @param[in] m affine transform
* @param[in] angle angle (radians) * @param[in] angle angle (radians)
* @param[out] dest rotated matrix * @param[out] dest rotated matrix
*/ */
@@ -137,9 +137,9 @@ glm_rotated_x(mat4 m, float angle, mat4 dest) {
* @brief rotate existing transform matrix around Y axis by angle * @brief rotate existing transform matrix around Y axis by angle
* and store result in dest * and store result in dest
* *
* this is POST transform, applies to existing transform as last transfrom * this is POST transform, applies to existing transform as last transform
* *
* @param[in] m affine transfrom * @param[in] m affine transform
* @param[in] angle angle (radians) * @param[in] angle angle (radians)
* @param[out] dest rotated matrix * @param[out] dest rotated matrix
*/ */
@@ -164,9 +164,9 @@ glm_rotated_y(mat4 m, float angle, mat4 dest) {
* @brief rotate existing transform matrix around Z axis by angle * @brief rotate existing transform matrix around Z axis by angle
* and store result in dest * and store result in dest
* *
* this is POST transform, applies to existing transform as last transfrom * this is POST transform, applies to existing transform as last transform
* *
* @param[in] m affine transfrom * @param[in] m affine transform
* @param[in] angle angle (radians) * @param[in] angle angle (radians)
* @param[out] dest rotated matrix * @param[out] dest rotated matrix
*/ */
@@ -190,9 +190,9 @@ glm_rotated_z(mat4 m, float angle, mat4 dest) {
/*! /*!
* @brief rotate existing transform matrix around given axis by angle * @brief rotate existing transform matrix around given axis by angle
* *
* this is POST transform, applies to existing transform as last transfrom * this is POST transform, applies to existing transform as last transform
* *
* @param[in, out] m affine transfrom * @param[in, out] m affine transform
* @param[in] angle angle (radians) * @param[in] angle angle (radians)
* @param[in] axis axis * @param[in] axis axis
*/ */
@@ -208,9 +208,9 @@ glm_rotated(mat4 m, float angle, vec3 axis) {
* @brief rotate existing transform * @brief rotate existing transform
* around given axis by angle at given pivot point (rotation center) * around given axis by angle at given pivot point (rotation center)
* *
* this is POST transform, applies to existing transform as last transfrom * this is POST transform, applies to existing transform as last transform
* *
* @param[in, out] m affine transfrom * @param[in, out] m affine transform
* @param[in] pivot rotation center * @param[in] pivot rotation center
* @param[in] angle angle (radians) * @param[in] angle angle (radians)
* @param[in] axis axis * @param[in] axis axis
@@ -230,9 +230,9 @@ glm_rotated_at(mat4 m, vec3 pivot, float angle, vec3 axis) {
/*! /*!
* @brief rotate existing transform matrix around given axis by angle around self (doesn't affected by position) * @brief rotate existing transform matrix around given axis by angle around self (doesn't affected by position)
* *
* this is POST transform, applies to existing transform as last transfrom * this is POST transform, applies to existing transform as last transform
* *
* @param[in, out] m affine transfrom * @param[in, out] m affine transform
* @param[in] angle angle (radians) * @param[in] angle angle (radians)
* @param[in] axis axis * @param[in] axis axis
*/ */

View File

@@ -35,7 +35,7 @@
* @brief translate existing transform matrix by v vector * @brief translate existing transform matrix by v vector
* and stores result in same matrix * and stores result in same matrix
* *
* @param[in, out] m affine transfrom * @param[in, out] m affine transform
* @param[in] v translate vector [x, y, z] * @param[in] v translate vector [x, y, z]
*/ */
CGLM_INLINE CGLM_INLINE
@@ -66,7 +66,7 @@ glm_translate(mat4 m, vec3 v) {
* *
* source matrix will remain same * source matrix will remain same
* *
* @param[in] m affine transfrom * @param[in] m affine transform
* @param[in] v translate vector [x, y, z] * @param[in] v translate vector [x, y, z]
* @param[out] dest translated matrix * @param[out] dest translated matrix
*/ */
@@ -80,7 +80,7 @@ glm_translate_to(mat4 m, vec3 v, mat4 dest) {
/*! /*!
* @brief translate existing transform matrix by x factor * @brief translate existing transform matrix by x factor
* *
* @param[in, out] m affine transfrom * @param[in, out] m affine transform
* @param[in] x x factor * @param[in] x x factor
*/ */
CGLM_INLINE CGLM_INLINE
@@ -98,7 +98,7 @@ glm_translate_x(mat4 m, float x) {
/*! /*!
* @brief translate existing transform matrix by y factor * @brief translate existing transform matrix by y factor
* *
* @param[in, out] m affine transfrom * @param[in, out] m affine transform
* @param[in] y y factor * @param[in] y y factor
*/ */
CGLM_INLINE CGLM_INLINE
@@ -116,7 +116,7 @@ glm_translate_y(mat4 m, float y) {
/*! /*!
* @brief translate existing transform matrix by z factor * @brief translate existing transform matrix by z factor
* *
* @param[in, out] m affine transfrom * @param[in, out] m affine transform
* @param[in] z z factor * @param[in] z z factor
*/ */
CGLM_INLINE CGLM_INLINE
@@ -135,7 +135,7 @@ glm_translate_z(mat4 m, float z) {
* @brief rotate existing transform matrix around X axis by angle * @brief rotate existing transform matrix around X axis by angle
* and store result in dest * and store result in dest
* *
* @param[in] m affine transfrom * @param[in] m affine transform
* @param[in] angle angle (radians) * @param[in] angle angle (radians)
* @param[out] dest rotated matrix * @param[out] dest rotated matrix
*/ */
@@ -160,7 +160,7 @@ glm_rotate_x(mat4 m, float angle, mat4 dest) {
* @brief rotate existing transform matrix around Y axis by angle * @brief rotate existing transform matrix around Y axis by angle
* and store result in dest * and store result in dest
* *
* @param[in] m affine transfrom * @param[in] m affine transform
* @param[in] angle angle (radians) * @param[in] angle angle (radians)
* @param[out] dest rotated matrix * @param[out] dest rotated matrix
*/ */
@@ -185,7 +185,7 @@ glm_rotate_y(mat4 m, float angle, mat4 dest) {
* @brief rotate existing transform matrix around Z axis by angle * @brief rotate existing transform matrix around Z axis by angle
* and store result in dest * and store result in dest
* *
* @param[in] m affine transfrom * @param[in] m affine transform
* @param[in] angle angle (radians) * @param[in] angle angle (radians)
* @param[out] dest rotated matrix * @param[out] dest rotated matrix
*/ */
@@ -209,7 +209,7 @@ glm_rotate_z(mat4 m, float angle, mat4 dest) {
/*! /*!
* @brief rotate existing transform matrix around given axis by angle * @brief rotate existing transform matrix around given axis by angle
* *
* @param[in, out] m affine transfrom * @param[in, out] m affine transform
* @param[in] angle angle (radians) * @param[in] angle angle (radians)
* @param[in] axis axis * @param[in] axis axis
*/ */
@@ -225,7 +225,7 @@ glm_rotate(mat4 m, float angle, vec3 axis) {
* @brief rotate existing transform * @brief rotate existing transform
* around given axis by angle at given pivot point (rotation center) * around given axis by angle at given pivot point (rotation center)
* *
* @param[in, out] m affine transfrom * @param[in, out] m affine transform
* @param[in] pivot rotation center * @param[in] pivot rotation center
* @param[in] angle angle (radians) * @param[in] angle angle (radians)
* @param[in] axis axis * @param[in] axis axis
@@ -250,7 +250,7 @@ glm_rotate_at(mat4 m, vec3 pivot, float angle, vec3 axis) {
* this should work faster than glm_rotate_at because it reduces * this should work faster than glm_rotate_at because it reduces
* one glm_translate. * one glm_translate.
* *
* @param[out] m affine transfrom * @param[out] m affine transform
* @param[in] pivot rotation center * @param[in] pivot rotation center
* @param[in] angle angle (radians) * @param[in] angle angle (radians)
* @param[in] axis axis * @param[in] axis axis
@@ -270,7 +270,7 @@ glm_rotate_atm(mat4 m, vec3 pivot, float angle, vec3 axis) {
/*! /*!
* @brief rotate existing transform matrix around given axis by angle around self (doesn't affected by position) * @brief rotate existing transform matrix around given axis by angle around self (doesn't affected by position)
* *
* @param[in, out] m affine transfrom * @param[in, out] m affine transform
* @param[in] angle angle (radians) * @param[in] angle angle (radians)
* @param[in] axis axis * @param[in] axis axis
*/ */

View File

@@ -44,7 +44,7 @@
/*! /*!
* @brief creates NEW translate transform matrix by v vector * @brief creates NEW translate transform matrix by v vector
* *
* @param[out] m affine transfrom * @param[out] m affine transform
* @param[in] v translate vector [x, y, z] * @param[in] v translate vector [x, y, z]
*/ */
CGLM_INLINE CGLM_INLINE
@@ -58,7 +58,7 @@ glm_translate_make(mat4 m, vec3 v) {
* @brief scale existing transform matrix by v vector * @brief scale existing transform matrix by v vector
* and store result in dest * and store result in dest
* *
* @param[in] m affine transfrom * @param[in] m affine transform
* @param[in] v scale vector [x, y, z] * @param[in] v scale vector [x, y, z]
* @param[out] dest scaled matrix * @param[out] dest scaled matrix
*/ */
@@ -75,7 +75,7 @@ glm_scale_to(mat4 m, vec3 v, mat4 dest) {
/*! /*!
* @brief creates NEW scale matrix by v vector * @brief creates NEW scale matrix by v vector
* *
* @param[out] m affine transfrom * @param[out] m affine transform
* @param[in] v scale vector [x, y, z] * @param[in] v scale vector [x, y, z]
*/ */
CGLM_INLINE CGLM_INLINE
@@ -91,7 +91,7 @@ glm_scale_make(mat4 m, vec3 v) {
* @brief scales existing transform matrix by v vector * @brief scales existing transform matrix by v vector
* and stores result in same matrix * and stores result in same matrix
* *
* @param[in, out] m affine transfrom * @param[in, out] m affine transform
* @param[in] v scale vector [x, y, z] * @param[in] v scale vector [x, y, z]
*/ */
CGLM_INLINE CGLM_INLINE
@@ -104,7 +104,7 @@ glm_scale(mat4 m, vec3 v) {
* @brief applies uniform scale to existing transform matrix v = [s, s, s] * @brief applies uniform scale to existing transform matrix v = [s, s, s]
* and stores result in same matrix * and stores result in same matrix
* *
* @param[in, out] m affine transfrom * @param[in, out] m affine transform
* @param[in] s scale factor * @param[in] s scale factor
*/ */
CGLM_INLINE CGLM_INLINE
@@ -119,7 +119,7 @@ glm_scale_uni(mat4 m, float s) {
* *
* axis will be normalized so you don't need to normalize it * axis will be normalized so you don't need to normalize it
* *
* @param[out] m affine transfrom * @param[out] m affine transform
* @param[in] angle angle (radians) * @param[in] angle angle (radians)
* @param[in] axis axis * @param[in] axis axis
*/ */
@@ -220,7 +220,7 @@ glm_decompose_rs(mat4 m, mat4 r, vec3 s) {
* @brief decompose affine transform, TODO: extract shear factors. * @brief decompose affine transform, TODO: extract shear factors.
* DON'T pass projected matrix here * DON'T pass projected matrix here
* *
* @param[in] m affine transfrom * @param[in] m affine transform
* @param[out] t translation vector * @param[out] t translation vector
* @param[out] r rotation matrix (mat4) * @param[out] r rotation matrix (mat4)
* @param[out] s scaling vector [X, Y, Z] * @param[out] s scaling vector [X, Y, Z]

View File

@@ -33,7 +33,7 @@
* @brief translate existing 2d transform matrix by v vector * @brief translate existing 2d transform matrix by v vector
* and stores result in same matrix * and stores result in same matrix
* *
* @param[in, out] m affine transfrom * @param[in, out] m affine transform
* @param[in] v translate vector [x, y] * @param[in] v translate vector [x, y]
*/ */
CGLM_INLINE CGLM_INLINE
@@ -50,7 +50,7 @@ glm_translate2d(mat3 m, vec2 v) {
* *
* source matrix will remain same * source matrix will remain same
* *
* @param[in] m affine transfrom * @param[in] m affine transform
* @param[in] v translate vector [x, y] * @param[in] v translate vector [x, y]
* @param[out] dest translated matrix * @param[out] dest translated matrix
*/ */
@@ -64,7 +64,7 @@ glm_translate2d_to(mat3 m, vec2 v, mat3 dest) {
/*! /*!
* @brief translate existing 2d transform matrix by x factor * @brief translate existing 2d transform matrix by x factor
* *
* @param[in, out] m affine transfrom * @param[in, out] m affine transform
* @param[in] x x factor * @param[in] x x factor
*/ */
CGLM_INLINE CGLM_INLINE
@@ -78,7 +78,7 @@ glm_translate2d_x(mat3 m, float x) {
/*! /*!
* @brief translate existing 2d transform matrix by y factor * @brief translate existing 2d transform matrix by y factor
* *
* @param[in, out] m affine transfrom * @param[in, out] m affine transform
* @param[in] y y factor * @param[in] y y factor
*/ */
CGLM_INLINE CGLM_INLINE
@@ -92,7 +92,7 @@ glm_translate2d_y(mat3 m, float y) {
/*! /*!
* @brief creates NEW translate 2d transform matrix by v vector * @brief creates NEW translate 2d transform matrix by v vector
* *
* @param[out] m affine transfrom * @param[out] m affine transform
* @param[in] v translate vector [x, y] * @param[in] v translate vector [x, y]
*/ */
CGLM_INLINE CGLM_INLINE
@@ -107,7 +107,7 @@ glm_translate2d_make(mat3 m, vec2 v) {
* @brief scale existing 2d transform matrix by v vector * @brief scale existing 2d transform matrix by v vector
* and store result in dest * and store result in dest
* *
* @param[in] m affine transfrom * @param[in] m affine transform
* @param[in] v scale vector [x, y] * @param[in] v scale vector [x, y]
* @param[out] dest scaled matrix * @param[out] dest scaled matrix
*/ */
@@ -130,7 +130,7 @@ glm_scale2d_to(mat3 m, vec2 v, mat3 dest) {
/*! /*!
* @brief creates NEW 2d scale matrix by v vector * @brief creates NEW 2d scale matrix by v vector
* *
* @param[out] m affine transfrom * @param[out] m affine transform
* @param[in] v scale vector [x, y] * @param[in] v scale vector [x, y]
*/ */
CGLM_INLINE CGLM_INLINE
@@ -145,7 +145,7 @@ glm_scale2d_make(mat3 m, vec2 v) {
* @brief scales existing 2d transform matrix by v vector * @brief scales existing 2d transform matrix by v vector
* and stores result in same matrix * and stores result in same matrix
* *
* @param[in, out] m affine transfrom * @param[in, out] m affine transform
* @param[in] v scale vector [x, y] * @param[in] v scale vector [x, y]
*/ */
CGLM_INLINE CGLM_INLINE
@@ -164,7 +164,7 @@ glm_scale2d(mat3 m, vec2 v) {
* @brief applies uniform scale to existing 2d transform matrix v = [s, s] * @brief applies uniform scale to existing 2d transform matrix v = [s, s]
* and stores result in same matrix * and stores result in same matrix
* *
* @param[in, out] m affine transfrom * @param[in, out] m affine transform
* @param[in] s scale factor * @param[in] s scale factor
*/ */
CGLM_INLINE CGLM_INLINE
@@ -182,7 +182,7 @@ glm_scale2d_uni(mat3 m, float s) {
/*! /*!
* @brief creates NEW rotation matrix by angle around Z axis * @brief creates NEW rotation matrix by angle around Z axis
* *
* @param[out] m affine transfrom * @param[out] m affine transform
* @param[in] angle angle (radians) * @param[in] angle angle (radians)
*/ */
CGLM_INLINE CGLM_INLINE
@@ -210,7 +210,7 @@ glm_rotate2d_make(mat3 m, float angle) {
* @brief rotate existing 2d transform matrix around Z axis by angle * @brief rotate existing 2d transform matrix around Z axis by angle
* and store result in same matrix * and store result in same matrix
* *
* @param[in, out] m affine transfrom * @param[in, out] m affine transform
* @param[in] angle angle (radians) * @param[in] angle angle (radians)
*/ */
CGLM_INLINE CGLM_INLINE
@@ -237,7 +237,7 @@ glm_rotate2d(mat3 m, float angle) {
* @brief rotate existing 2d transform matrix around Z axis by angle * @brief rotate existing 2d transform matrix around Z axis by angle
* and store result in dest * and store result in dest
* *
* @param[in] m affine transfrom * @param[in] m affine transform
* @param[in] angle angle (radians) * @param[in] angle angle (radians)
* @param[out] dest destination * @param[out] dest destination
*/ */

View File

@@ -104,7 +104,7 @@ glm_aabb_crop(vec3 box[2], vec3 cropBox[2], vec3 dest[2]) {
* *
* @param[in] box bounding box * @param[in] box bounding box
* @param[in] cropBox crop box * @param[in] cropBox crop box
* @param[in] clampBox miniumum box * @param[in] clampBox minimum box
* @param[out] dest cropped bounding box * @param[out] dest cropped bounding box
*/ */
CGLM_INLINE CGLM_INLINE

View File

@@ -19,14 +19,21 @@ extern "C" {
#include "call/ivec3.h" #include "call/ivec3.h"
#include "call/ivec4.h" #include "call/ivec4.h"
#include "call/mat2.h" #include "call/mat2.h"
#include "call/mat2x3.h"
#include "call/mat2x4.h"
#include "call/mat3.h" #include "call/mat3.h"
#include "call/mat3x2.h"
#include "call/mat3x4.h"
#include "call/mat4.h" #include "call/mat4.h"
#include "call/mat4x2.h"
#include "call/mat4x3.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"
#include "call/euler.h" #include "call/euler.h"
#include "call/plane.h" #include "call/plane.h"
#include "call/frustum.h" #include "call/frustum.h"
#include "call/aabb2d.h"
#include "call/box.h" #include "call/box.h"
#include "call/io.h" #include "call/io.h"
#include "call/project.h" #include "call/project.h"

View File

@@ -0,0 +1,91 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#ifndef cglmc_aabb2d_h
#define cglmc_aabb2d_h
#ifdef __cplusplus
extern "C" {
#endif
#include "../cglm.h"
/* DEPRECATED! use _diag */
#define glmc_aabb2d_size(aabb) glmc_aabb2d_diag(aabb)
CGLM_EXPORT
void
glmc_aabb2d_zero(vec2 aabb[2]);
CGLM_EXPORT
void
glmc_aabb2d_copy(vec2 aabb[2], vec2 dest[2]);
CGLM_EXPORT
void
glmc_aabb2d_transform(vec2 aabb[2], mat3 m, vec2 dest[2]);
CGLM_EXPORT
void
glmc_aabb2d_merge(vec2 aabb1[2], vec2 aabb2[2], vec2 dest[2]);
CGLM_EXPORT
void
glmc_aabb2d_crop(vec2 aabb[2], vec2 cropAabb[2], vec2 dest[2]);
CGLM_EXPORT
void
glmc_aabb2d_crop_until(vec2 aabb[2],
vec2 cropAabb[2],
vec2 clampAabb[2],
vec2 dest[2]);
CGLM_EXPORT
void
glmc_aabb2d_invalidate(vec2 aabb[2]);
CGLM_EXPORT
bool
glmc_aabb2d_isvalid(vec2 aabb[2]);
CGLM_EXPORT
float
glmc_aabb2d_diag(vec2 aabb[2]);
CGLM_EXPORT
void
glmc_aabb2d_sizev(vec2 aabb[2], vec2 dest);
CGLM_EXPORT
float
glmc_aabb2d_radius(vec2 aabb[2]);
CGLM_EXPORT
void
glmc_aabb2d_center(vec2 aabb[2], vec2 dest);
CGLM_EXPORT
bool
glmc_aabb2d_aabb(vec2 aabb[2], vec2 other[2]);
CGLM_EXPORT
bool
glmc_aabb2d_point(vec2 aabb[2], vec2 point);
CGLM_EXPORT
bool
glmc_aabb2d_contains(vec2 aabb[2], vec2 other[2]);
CGLM_EXPORT
bool
glmc_aabb2d_circle(vec2 aabb[2], vec3 s);
#ifdef __cplusplus
}
#endif
#endif /* cglmc_aabb2d_h */

View File

@@ -49,6 +49,31 @@ CGLM_EXPORT
void void
glmc_euler_by_order(vec3 angles, glm_euler_seq axis, mat4 dest); glmc_euler_by_order(vec3 angles, glm_euler_seq axis, mat4 dest);
CGLM_EXPORT
void
glmc_euler_xyz_quat(vec3 angles, versor dest);
CGLM_EXPORT
void
glmc_euler_xzy_quat(vec3 angles, versor dest);
CGLM_EXPORT
void
glmc_euler_yxz_quat(vec3 angles, versor dest);
CGLM_EXPORT
void
glmc_euler_yzx_quat(vec3 angles, versor dest);
CGLM_EXPORT
void
glmc_euler_zxy_quat(vec3 angles, versor dest);
CGLM_EXPORT
void
glmc_euler_zyx_quat(vec3 angles, versor dest);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View File

@@ -29,6 +29,14 @@ CGLM_EXPORT
void void
glmc_ivec2_one(ivec2 v); glmc_ivec2_one(ivec2 v);
CGLM_EXPORT
int
glmc_ivec2_dot(ivec2 a, ivec2 b);
CGLM_EXPORT
int
glmc_ivec2_cross(ivec2 a, ivec2 b);
CGLM_EXPORT CGLM_EXPORT
void void
glmc_ivec2_add(ivec2 a, ivec2 b, ivec2 dest); glmc_ivec2_add(ivec2 a, ivec2 b, ivec2 dest);
@@ -53,6 +61,82 @@ CGLM_EXPORT
void void
glmc_ivec2_scale(ivec2 v, int s, ivec2 dest); glmc_ivec2_scale(ivec2 v, int s, ivec2 dest);
CGLM_EXPORT
void
glmc_ivec2_div(ivec2 a, ivec2 b, ivec2 dest);
CGLM_EXPORT
void
glmc_ivec2_divs(ivec2 v, int s, ivec2 dest);
CGLM_EXPORT
void
glmc_ivec2_mod(ivec2 a, ivec2 b, ivec2 dest);
CGLM_EXPORT
void
glmc_ivec2_addadd(ivec2 a, ivec2 b, ivec2 dest);
CGLM_EXPORT
void
glmc_ivec2_addadds(ivec2 a, int s, ivec2 dest);
CGLM_EXPORT
void
glmc_ivec2_subadd(ivec2 a, ivec2 b, ivec2 dest);
CGLM_EXPORT
void
glmc_ivec2_subadds(ivec2 a, int s, ivec2 dest);
CGLM_EXPORT
void
glmc_ivec2_muladd(ivec2 a, ivec2 b, ivec2 dest);
CGLM_EXPORT
void
glmc_ivec2_muladds(ivec2 a, int s, ivec2 dest);
CGLM_EXPORT
void
glmc_ivec2_maxadd(ivec2 a, ivec2 b, ivec2 dest);
CGLM_EXPORT
void
glmc_ivec2_minadd(ivec2 a, ivec2 b, ivec2 dest);
CGLM_EXPORT
void
glmc_ivec2_subsub(ivec2 a, ivec2 b, ivec2 dest);
CGLM_EXPORT
void
glmc_ivec2_subsubs(ivec2 a, int s, ivec2 dest);
CGLM_EXPORT
void
glmc_ivec2_addsub(ivec2 a, ivec2 b, ivec2 dest);
CGLM_EXPORT
void
glmc_ivec2_addsubs(ivec2 a, int s, ivec2 dest);
CGLM_EXPORT
void
glmc_ivec2_mulsub(ivec2 a, ivec2 b, ivec2 dest);
CGLM_EXPORT
void
glmc_ivec2_mulsubs(ivec2 a, int s, ivec2 dest);
CGLM_EXPORT
void
glmc_ivec2_maxsub(ivec2 a, ivec2 b, ivec2 dest);
CGLM_EXPORT
void
glmc_ivec2_minsub(ivec2 a, ivec2 b, ivec2 dest);
CGLM_EXPORT CGLM_EXPORT
int int
glmc_ivec2_distance2(ivec2 a, ivec2 b); glmc_ivec2_distance2(ivec2 a, ivec2 b);
@@ -61,6 +145,18 @@ CGLM_EXPORT
float float
glmc_ivec2_distance(ivec2 a, ivec2 b); glmc_ivec2_distance(ivec2 a, ivec2 b);
CGLM_EXPORT
void
glmc_ivec2_fill(ivec2 v, int val);
CGLM_EXPORT
bool
glmc_ivec2_eq(ivec2 v, int val);
CGLM_EXPORT
bool
glmc_ivec2_eqv(ivec2 a, ivec2 b);
CGLM_EXPORT CGLM_EXPORT
void void
glmc_ivec2_maxv(ivec2 a, ivec2 b, ivec2 dest); glmc_ivec2_maxv(ivec2 a, ivec2 b, ivec2 dest);

View File

@@ -29,6 +29,18 @@ CGLM_EXPORT
void void
glmc_ivec3_one(ivec3 v); glmc_ivec3_one(ivec3 v);
CGLM_EXPORT
int
glmc_ivec3_dot(ivec3 a, ivec3 b);
CGLM_EXPORT
int
glmc_ivec3_norm2(ivec3 v);
CGLM_EXPORT
int
glmc_ivec3_norm(ivec3 v);
CGLM_EXPORT CGLM_EXPORT
void void
glmc_ivec3_add(ivec3 a, ivec3 b, ivec3 dest); glmc_ivec3_add(ivec3 a, ivec3 b, ivec3 dest);
@@ -53,6 +65,82 @@ CGLM_EXPORT
void void
glmc_ivec3_scale(ivec3 v, int s, ivec3 dest); glmc_ivec3_scale(ivec3 v, int s, ivec3 dest);
CGLM_EXPORT
void
glmc_ivec3_div(ivec3 a, ivec3 b, ivec3 dest);
CGLM_EXPORT
void
glmc_ivec3_divs(ivec3 v, int s, ivec3 dest);
CGLM_EXPORT
void
glmc_ivec3_mod(ivec3 a, ivec3 b, ivec3 dest);
CGLM_EXPORT
void
glmc_ivec3_addadd(ivec3 a, ivec3 b, ivec3 dest);
CGLM_EXPORT
void
glmc_ivec3_addadds(ivec3 a, int s, ivec3 dest);
CGLM_EXPORT
void
glmc_ivec3_subadd(ivec3 a, ivec3 b, ivec3 dest);
CGLM_EXPORT
void
glmc_ivec3_subadds(ivec3 a, int s, ivec3 dest);
CGLM_EXPORT
void
glmc_ivec3_muladd(ivec3 a, ivec3 b, ivec3 dest);
CGLM_EXPORT
void
glmc_ivec3_muladds(ivec3 a, int s, ivec3 dest);
CGLM_EXPORT
void
glmc_ivec3_maxadd(ivec3 a, ivec3 b, ivec3 dest);
CGLM_EXPORT
void
glmc_ivec3_minadd(ivec3 a, ivec3 b, ivec3 dest);
CGLM_EXPORT
void
glmc_ivec3_subsub(ivec3 a, ivec3 b, ivec3 dest);
CGLM_EXPORT
void
glmc_ivec3_subsubs(ivec3 a, int s, ivec3 dest);
CGLM_EXPORT
void
glmc_ivec3_addsub(ivec3 a, ivec3 b, ivec3 dest);
CGLM_EXPORT
void
glmc_ivec3_addsubs(ivec3 a, int s, ivec3 dest);
CGLM_EXPORT
void
glmc_ivec3_mulsub(ivec3 a, ivec3 b, ivec3 dest);
CGLM_EXPORT
void
glmc_ivec3_mulsubs(ivec3 a, int s, ivec3 dest);
CGLM_EXPORT
void
glmc_ivec3_maxsub(ivec3 a, ivec3 b, ivec3 dest);
CGLM_EXPORT
void
glmc_ivec3_minsub(ivec3 a, ivec3 b, ivec3 dest);
CGLM_EXPORT CGLM_EXPORT
int int
glmc_ivec3_distance2(ivec3 a, ivec3 b); glmc_ivec3_distance2(ivec3 a, ivec3 b);
@@ -61,6 +149,18 @@ CGLM_EXPORT
float float
glmc_ivec3_distance(ivec3 a, ivec3 b); glmc_ivec3_distance(ivec3 a, ivec3 b);
CGLM_EXPORT
void
glmc_ivec3_fill(ivec3 v, int val);
CGLM_EXPORT
bool
glmc_ivec3_eq(ivec3 v, int val);
CGLM_EXPORT
bool
glmc_ivec3_eqv(ivec3 a, ivec3 b);
CGLM_EXPORT CGLM_EXPORT
void void
glmc_ivec3_maxv(ivec3 a, ivec3 b, ivec3 dest); glmc_ivec3_maxv(ivec3 a, ivec3 b, ivec3 dest);

View File

@@ -53,6 +53,70 @@ CGLM_EXPORT
void void
glmc_ivec4_scale(ivec4 v, int s, ivec4 dest); glmc_ivec4_scale(ivec4 v, int s, ivec4 dest);
CGLM_EXPORT
void
glmc_ivec4_addadd(ivec4 a, ivec4 b, ivec4 dest);
CGLM_EXPORT
void
glmc_ivec4_addadds(ivec4 a, int s, ivec4 dest);
CGLM_EXPORT
void
glmc_ivec4_subadd(ivec4 a, ivec4 b, ivec4 dest);
CGLM_EXPORT
void
glmc_ivec4_subadds(ivec4 a, int s, ivec4 dest);
CGLM_EXPORT
void
glmc_ivec4_muladd(ivec4 a, ivec4 b, ivec4 dest);
CGLM_EXPORT
void
glmc_ivec4_muladds(ivec4 a, int s, ivec4 dest);
CGLM_EXPORT
void
glmc_ivec4_maxadd(ivec4 a, ivec4 b, ivec4 dest);
CGLM_EXPORT
void
glmc_ivec4_minadd(ivec4 a, ivec4 b, ivec4 dest);
CGLM_EXPORT
void
glmc_ivec4_subsub(ivec4 a, ivec4 b, ivec4 dest);
CGLM_EXPORT
void
glmc_ivec4_subsubs(ivec4 a, int s, ivec4 dest);
CGLM_EXPORT
void
glmc_ivec4_addsub(ivec4 a, ivec4 b, ivec4 dest);
CGLM_EXPORT
void
glmc_ivec4_addsubs(ivec4 a, int s, ivec4 dest);
CGLM_EXPORT
void
glmc_ivec4_mulsub(ivec4 a, ivec4 b, ivec4 dest);
CGLM_EXPORT
void
glmc_ivec4_mulsubs(ivec4 a, int s, ivec4 dest);
CGLM_EXPORT
void
glmc_ivec4_maxsub(ivec4 a, ivec4 b, ivec4 dest);
CGLM_EXPORT
void
glmc_ivec4_minsub(ivec4 a, ivec4 b, ivec4 dest);
CGLM_EXPORT CGLM_EXPORT
int int
glmc_ivec4_distance2(ivec4 a, ivec4 b); glmc_ivec4_distance2(ivec4 a, ivec4 b);

View File

@@ -0,0 +1,47 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#ifndef cglmc_mat2x3_h
#define cglmc_mat2x3_h
#ifdef __cplusplus
extern "C" {
#endif
#include "../cglm.h"
CGLM_EXPORT
void
glmc_mat2x3_copy(mat2x3 mat, mat2x3 dest);
CGLM_EXPORT
void
glmc_mat2x3_zero(mat2x3 mat);
CGLM_EXPORT
void
glmc_mat2x3_make(float * __restrict src, mat2x3 dest);
CGLM_EXPORT
void
glmc_mat2x3_mul(mat2x3 m1, mat3x2 m2, mat2 dest);
CGLM_EXPORT
void
glmc_mat2x3_mulv(mat2x3 m, vec3 v, vec2 dest);
CGLM_EXPORT
void
glmc_mat2x3_transpose(mat2x3 m, mat3x2 dest);
CGLM_EXPORT
void
glmc_mat2x3_scale(mat2x3 m, float s);
#ifdef __cplusplus
}
#endif
#endif /* cglmc_mat2x3_h */

View File

@@ -0,0 +1,47 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#ifndef cglmc_mat2x4_h
#define cglmc_mat2x4_h
#ifdef __cplusplus
extern "C" {
#endif
#include "../cglm.h"
CGLM_EXPORT
void
glmc_mat2x4_copy(mat2x4 mat, mat2x4 dest);
CGLM_EXPORT
void
glmc_mat2x4_zero(mat2x4 mat);
CGLM_EXPORT
void
glmc_mat2x4_make(float * __restrict src, mat2x4 dest);
CGLM_EXPORT
void
glmc_mat2x4_mul(mat2x4 m1, mat4x2 m2, mat2 dest);
CGLM_EXPORT
void
glmc_mat2x4_mulv(mat2x4 m, vec4 v, vec2 dest);
CGLM_EXPORT
void
glmc_mat2x4_transpose(mat2x4 m, mat4x2 dest);
CGLM_EXPORT
void
glmc_mat2x4_scale(mat2x4 m, float s);
#ifdef __cplusplus
}
#endif
#endif /* cglmc_mat2x4_h */

View File

@@ -0,0 +1,47 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#ifndef cglmc_mat3x2_h
#define cglmc_mat3x2_h
#ifdef __cplusplus
extern "C" {
#endif
#include "../cglm.h"
CGLM_EXPORT
void
glmc_mat3x2_copy(mat3x2 mat, mat3x2 dest);
CGLM_EXPORT
void
glmc_mat3x2_zero(mat3x2 mat);
CGLM_EXPORT
void
glmc_mat3x2_make(float * __restrict src, mat3x2 dest);
CGLM_EXPORT
void
glmc_mat3x2_mul(mat3x2 m1, mat2x3 m2, mat3 dest);
CGLM_EXPORT
void
glmc_mat3x2_mulv(mat3x2 m, vec2 v, vec3 dest);
CGLM_EXPORT
void
glmc_mat3x2_transpose(mat3x2 m, mat2x3 dest);
CGLM_EXPORT
void
glmc_mat3x2_scale(mat3x2 m, float s);
#ifdef __cplusplus
}
#endif
#endif /* cglmc_mat3x2_h */

View File

@@ -0,0 +1,47 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#ifndef cglmc_mat3x4_h
#define cglmc_mat3x4_h
#ifdef __cplusplus
extern "C" {
#endif
#include "../cglm.h"
CGLM_EXPORT
void
glmc_mat3x4_copy(mat3x4 mat, mat3x4 dest);
CGLM_EXPORT
void
glmc_mat3x4_zero(mat3x4 mat);
CGLM_EXPORT
void
glmc_mat3x4_make(float * __restrict src, mat3x4 dest);
CGLM_EXPORT
void
glmc_mat3x4_mul(mat3x4 m1, mat4x3 m2, mat3 dest);
CGLM_EXPORT
void
glmc_mat3x4_mulv(mat3x4 m, vec4 v, vec3 dest);
CGLM_EXPORT
void
glmc_mat3x4_transpose(mat3x4 m, mat4x3 dest);
CGLM_EXPORT
void
glmc_mat3x4_scale(mat3x4 m, float s);
#ifdef __cplusplus
}
#endif
#endif /* cglmc_mat3x4_h */

View File

@@ -0,0 +1,47 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#ifndef cglmc_mat4x2_h
#define cglmc_mat4x2_h
#ifdef __cplusplus
extern "C" {
#endif
#include "../cglm.h"
CGLM_EXPORT
void
glmc_mat4x2_copy(mat4x2 mat, mat4x2 dest);
CGLM_EXPORT
void
glmc_mat4x2_zero(mat4x2 mat);
CGLM_EXPORT
void
glmc_mat4x2_make(float * __restrict src, mat4x2 dest);
CGLM_EXPORT
void
glmc_mat4x2_mul(mat4x2 m1, mat2x4 m2, mat4 dest);
CGLM_EXPORT
void
glmc_mat4x2_mulv(mat4x2 m, vec2 v, vec4 dest);
CGLM_EXPORT
void
glmc_mat4x2_transpose(mat4x2 m, mat2x4 dest);
CGLM_EXPORT
void
glmc_mat4x2_scale(mat4x2 m, float s);
#ifdef __cplusplus
}
#endif
#endif /* cglmc_mat4x2_h */

View File

@@ -0,0 +1,47 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#ifndef cglmc_mat4x3_h
#define cglmc_mat4x3_h
#ifdef __cplusplus
extern "C" {
#endif
#include "../cglm.h"
CGLM_EXPORT
void
glmc_mat4x3_copy(mat4x3 mat, mat4x3 dest);
CGLM_EXPORT
void
glmc_mat4x3_zero(mat4x3 mat);
CGLM_EXPORT
void
glmc_mat4x3_make(float * __restrict src, mat4x3 dest);
CGLM_EXPORT
void
glmc_mat4x3_mul(mat4x3 m1, mat3x4 m2, mat4 dest);
CGLM_EXPORT
void
glmc_mat4x3_mulv(mat4x3 m, vec3 v, vec4 dest);
CGLM_EXPORT
void
glmc_mat4x3_transpose(mat4x3 m, mat3x4 dest);
CGLM_EXPORT
void
glmc_mat4x3_scale(mat4x3 m, float s);
#ifdef __cplusplus
}
#endif
#endif /* cglmc_mat4x3_h */

View File

@@ -105,6 +105,30 @@ CGLM_EXPORT
void void
glmc_vec2_minadd(vec2 a, vec2 b, vec2 dest); glmc_vec2_minadd(vec2 a, vec2 b, vec2 dest);
CGLM_EXPORT
void
glmc_vec2_subsub(vec2 a, vec2 b, vec2 dest);
CGLM_EXPORT
void
glmc_vec2_addsub(vec2 a, vec2 b, vec2 dest);
CGLM_EXPORT
void
glmc_vec2_mulsub(vec2 a, vec2 b, vec2 dest);
CGLM_EXPORT
void
glmc_vec2_mulsubs(vec2 a, float s, vec2 dest);
CGLM_EXPORT
void
glmc_vec2_maxsub(vec2 a, vec2 b, vec2 dest);
CGLM_EXPORT
void
glmc_vec2_minsub(vec2 a, vec2 b, vec2 dest);
CGLM_EXPORT CGLM_EXPORT
void void
glmc_vec2_negate_to(vec2 v, vec2 dest); glmc_vec2_negate_to(vec2 v, vec2 dest);
@@ -125,6 +149,10 @@ CGLM_EXPORT
void void
glmc_vec2_rotate(vec2 v, float angle, vec2 dest); glmc_vec2_rotate(vec2 v, float angle, vec2 dest);
CGLM_EXPORT
void
glmc_vec2_center(vec2 a, vec2 b, vec2 dest);
CGLM_EXPORT CGLM_EXPORT
float float
glmc_vec2_distance2(vec2 a, vec2 b); glmc_vec2_distance2(vec2 a, vec2 b);

View File

@@ -132,6 +132,30 @@ CGLM_EXPORT
void void
glmc_vec3_minadd(vec3 a, vec3 b, vec3 dest); glmc_vec3_minadd(vec3 a, vec3 b, vec3 dest);
CGLM_EXPORT
void
glmc_vec3_subsub(vec3 a, vec3 b, vec3 dest);
CGLM_EXPORT
void
glmc_vec3_addsub(vec3 a, vec3 b, vec3 dest);
CGLM_EXPORT
void
glmc_vec3_mulsub(vec3 a, vec3 b, vec3 dest);
CGLM_EXPORT
void
glmc_vec3_mulsubs(vec3 a, float s, vec3 dest);
CGLM_EXPORT
void
glmc_vec3_maxsub(vec3 a, vec3 b, vec3 dest);
CGLM_EXPORT
void
glmc_vec3_minsub(vec3 a, vec3 b, vec3 dest);
CGLM_EXPORT CGLM_EXPORT
void void
glmc_vec3_negate(vec3 v); glmc_vec3_negate(vec3 v);

View File

@@ -133,6 +133,30 @@ CGLM_EXPORT
void void
glmc_vec4_minadd(vec4 a, vec4 b, vec4 dest); glmc_vec4_minadd(vec4 a, vec4 b, vec4 dest);
CGLM_EXPORT
void
glmc_vec4_subsub(vec4 a, vec4 b, vec4 dest);
CGLM_EXPORT
void
glmc_vec4_addsub(vec4 a, vec4 b, vec4 dest);
CGLM_EXPORT
void
glmc_vec4_mulsub(vec4 a, vec4 b, vec4 dest);
CGLM_EXPORT
void
glmc_vec4_mulsubs(vec4 a, float s, vec4 dest);
CGLM_EXPORT
void
glmc_vec4_maxsub(vec4 a, vec4 b, vec4 dest);
CGLM_EXPORT
void
glmc_vec4_minsub(vec4 a, vec4 b, vec4 dest);
CGLM_EXPORT CGLM_EXPORT
void void
glmc_vec4_negate(vec4 v); glmc_vec4_negate(vec4 v);

View File

@@ -474,7 +474,7 @@ glm_persp_decomp_x(mat4 proj,
/*! /*!
* @brief decomposes top and bottom values of perspective projection. * @brief decomposes top and bottom values of perspective projection.
* y stands for y axis (top / botom axis) * y stands for y axis (top / bottom axis)
* *
* @param[in] proj perspective projection matrix * @param[in] proj perspective projection matrix
* @param[out] top top * @param[out] top top

View File

@@ -16,14 +16,21 @@
#include "ivec3.h" #include "ivec3.h"
#include "ivec4.h" #include "ivec4.h"
#include "mat4.h" #include "mat4.h"
#include "mat4x2.h"
#include "mat4x3.h"
#include "mat3.h" #include "mat3.h"
#include "mat3x2.h"
#include "mat3x4.h"
#include "mat2.h" #include "mat2.h"
#include "mat2x3.h"
#include "mat2x4.h"
#include "affine.h" #include "affine.h"
#include "cam.h" #include "cam.h"
#include "frustum.h" #include "frustum.h"
#include "quat.h" #include "quat.h"
#include "euler.h" #include "euler.h"
#include "plane.h" #include "plane.h"
#include "aabb2d.h"
#include "box.h" #include "box.h"
#include "color.h" #include "color.h"
#include "util.h" #include "util.h"

View File

@@ -266,7 +266,7 @@ glm_persp_decomp_x_lh_no(mat4 proj,
* @brief decomposes top and bottom values of perspective projection * @brief decomposes top and bottom values of perspective projection
* with a left-hand coordinate system and a * with a left-hand coordinate system and a
* clip-space of [-1, 1]. * clip-space of [-1, 1].
* y stands for y axis (top / botom axis) * y stands for y axis (top / bottom axis)
* *
* @param[in] proj perspective projection matrix * @param[in] proj perspective projection matrix
* @param[out] top top * @param[out] top top

View File

@@ -266,7 +266,7 @@ glm_persp_decomp_x_rh_no(mat4 proj,
* @brief decomposes top and bottom values of perspective projection * @brief decomposes top and bottom values of perspective projection
* with a right-hand coordinate system and a * with a right-hand coordinate system and a
* clip-space of [-1, 1]. * clip-space of [-1, 1].
* y stands for y axis (top / botom axis) * y stands for y axis (top / bottom axis)
* *
* @param[in] proj perspective projection matrix * @param[in] proj perspective projection matrix
* @param[out] top top * @param[out] top top

View File

@@ -235,7 +235,7 @@ glm_ease_back_inout(float t) {
o = 1.70158f; o = 1.70158f;
s = o * 1.525f; s = o * 1.525f;
x = 0.5; x = 0.5f;
n = t / 0.5f; n = t / 0.5f;
if (n < 1.0f) { if (n < 1.0f) {

View File

@@ -9,7 +9,7 @@
NOTE: NOTE:
angles must be passed as [X-Angle, Y-Angle, Z-angle] order angles must be passed as [X-Angle, Y-Angle, Z-angle] order
For instance you don't pass angles as [Z-Angle, X-Angle, Y-angle] to For instance you don't pass angles as [Z-Angle, X-Angle, Y-angle] to
glm_euler_zxy funciton, All RELATED functions accept angles same order glm_euler_zxy function, All RELATED functions accept angles same order
which is [X, Y, Z]. which is [X, Y, Z].
*/ */
@@ -30,6 +30,12 @@
CGLM_INLINE void glm_euler_by_order(vec3 angles, CGLM_INLINE void glm_euler_by_order(vec3 angles,
glm_euler_seq ord, glm_euler_seq ord,
mat4 dest); mat4 dest);
CGLM_INLINE void glm_euler_xyz_quat(vec3 angles, versor dest);
CGLM_INLINE void glm_euler_xzy_quat(vec3 angles, versor dest);
CGLM_INLINE void glm_euler_yxz_quat(vec3 angles, versor dest);
CGLM_INLINE void glm_euler_yzx_quat(vec3 angles, versor dest);
CGLM_INLINE void glm_euler_zxy_quat(vec3 angles, versor dest);
CGLM_INLINE void glm_euler_zyx_quat(vec3 angles, versor dest);
*/ */
#ifndef cglm_euler_h #ifndef cglm_euler_h
@@ -37,6 +43,47 @@
#include "common.h" #include "common.h"
#ifdef CGLM_FORCE_LEFT_HANDED
# include "handed/euler_to_quat_lh.h"
#else
# include "handed/euler_to_quat_rh.h"
#endif
#ifndef CGLM_CLIPSPACE_INCLUDE_ALL
# if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
# include "clipspace/ortho_lh_zo.h"
# include "clipspace/persp_lh_zo.h"
# include "clipspace/view_lh_zo.h"
# elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
# include "clipspace/ortho_lh_no.h"
# include "clipspace/persp_lh_no.h"
# include "clipspace/view_lh_no.h"
# elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
# include "clipspace/ortho_rh_zo.h"
# include "clipspace/persp_rh_zo.h"
# include "clipspace/view_rh_zo.h"
# elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
# include "clipspace/ortho_rh_no.h"
# include "clipspace/persp_rh_no.h"
# include "clipspace/view_rh_no.h"
# endif
#else
# include "clipspace/ortho_lh_zo.h"
# include "clipspace/persp_lh_zo.h"
# include "clipspace/ortho_lh_no.h"
# include "clipspace/persp_lh_no.h"
# include "clipspace/ortho_rh_zo.h"
# include "clipspace/persp_rh_zo.h"
# include "clipspace/ortho_rh_no.h"
# include "clipspace/persp_rh_no.h"
# include "clipspace/view_lh_zo.h"
# include "clipspace/view_lh_no.h"
# include "clipspace/view_rh_zo.h"
# include "clipspace/view_rh_no.h"
#endif
/*! /*!
* if you have axis order like vec3 orderVec = [0, 1, 2] or [0, 2, 1]... * if you have axis order like vec3 orderVec = [0, 1, 2] or [0, 2, 1]...
* vector then you can convert it to this enum by doing this: * vector then you can convert it to this enum by doing this:
@@ -188,7 +235,6 @@ glm_euler_xzy(vec3 angles, mat4 dest) {
dest[3][3] = 1.0f; dest[3][3] = 1.0f;
} }
/*! /*!
* @brief build rotation matrix from euler angles * @brief build rotation matrix from euler angles
* *
@@ -448,4 +494,108 @@ glm_euler_by_order(vec3 angles, glm_euler_seq ord, mat4 dest) {
dest[3][3] = 1.0f; dest[3][3] = 1.0f;
} }
/*!
* @brief creates NEW quaternion using rotation angles and does
* rotations in x y z order (roll pitch yaw)
*
* @param[in] angles angles x y z (radians)
* @param[out] dest quaternion
*/
CGLM_INLINE
void
glm_euler_xyz_quat(vec3 angles, versor dest) {
#ifdef CGLM_FORCE_LEFT_HANDED
glm_euler_xyz_quat_lh(angles, dest);
#else
glm_euler_xyz_quat_rh(angles, dest);
#endif
}
/*!
* @brief creates NEW quaternion using rotation angles and does
* rotations in x z y order (roll yaw pitch)
*
* @param[in] angles angles x y z (radians)
* @param[out] dest quaternion
*/
CGLM_INLINE
void
glm_euler_xzy_quat(vec3 angles, versor dest) {
#ifdef CGLM_FORCE_LEFT_HANDED
glm_euler_xzy_quat_lh(angles, dest);
#else
glm_euler_xzy_quat_rh(angles, dest);
#endif
}
/*!
* @brief creates NEW quaternion using rotation angles and does
* rotations in y x z order (pitch roll yaw)
*
* @param[in] angles angles x y z (radians)
* @param[out] dest quaternion
*/
CGLM_INLINE
void
glm_euler_yxz_quat(vec3 angles, versor dest) {
#ifdef CGLM_FORCE_LEFT_HANDED
glm_euler_yxz_quat_lh(angles, dest);
#else
glm_euler_yxz_quat_rh(angles, dest);
#endif
}
/*!
* @brief creates NEW quaternion using rotation angles and does
* rotations in y z x order (pitch yaw roll)
*
* @param[in] angles angles x y z (radians)
* @param[out] dest quaternion
*/
CGLM_INLINE
void
glm_euler_yzx_quat(vec3 angles, versor dest) {
#ifdef CGLM_FORCE_LEFT_HANDED
glm_euler_yzx_quat_lh(angles, dest);
#else
glm_euler_yzx_quat_rh(angles, dest);
#endif
}
/*!
* @brief creates NEW quaternion using rotation angles and does
* rotations in z x y order (yaw roll pitch)
*
* @param[in] angles angles x y z (radians)
* @param[out] dest quaternion
*/
CGLM_INLINE
void
glm_euler_zxy_quat(vec3 angles, versor dest) {
#ifdef CGLM_FORCE_LEFT_HANDED
glm_euler_zxy_quat_lh(angles, dest);
#else
glm_euler_zxy_quat_rh(angles, dest);
#endif
}
/*!
* @brief creates NEW quaternion using rotation angles and does
* rotations in z y x order (yaw pitch roll)
*
* @param[in] angles angles x y z (radians)
* @param[out] dest quaternion
*/
CGLM_INLINE
void
glm_euler_zyx_quat(vec3 angles, versor dest) {
#ifdef CGLM_FORCE_LEFT_HANDED
glm_euler_zyx_quat_lh(angles, dest);
#else
glm_euler_zyx_quat_rh(angles, dest);
#endif
}
#endif /* cglm_euler_h */ #endif /* cglm_euler_h */

View File

@@ -0,0 +1,167 @@
/*
* 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_euler_xyz_quat_lh(vec3 angles, versor dest);
CGLM_INLINE void glm_euler_xzy_quat_lh(vec3 angles, versor dest);
CGLM_INLINE void glm_euler_yxz_quat_lh(vec3 angles, versor dest);
CGLM_INLINE void glm_euler_yzx_quat_lh(vec3 angles, versor dest);
CGLM_INLINE void glm_euler_zxy_quat_lh(vec3 angles, versor dest);
CGLM_INLINE void glm_euler_zyx_quat_lh(vec3 angles, versor dest);
*/
/*
Things to note:
The only difference between euler to quat rh vs lh is that the zsin part is negative
*/
#ifndef cglm_euler_to_quat_lh_h
#define cglm_euler_to_quat_lh_h
#include "../common.h"
/*!
* @brief creates NEW quaternion using rotation angles and does
* rotations in x y z order in left hand (roll pitch yaw)
*
* @param[in] angles angles x y z (radians)
* @param[out] dest quaternion
*/
CGLM_INLINE
void
glm_euler_xyz_quat_lh(vec3 angles, versor dest) {
float xc, yc, zc,
xs, ys, zs;
xs = sinf(angles[0] * 0.5f); xc = cosf(angles[0] * 0.5f);
ys = sinf(angles[1] * 0.5f); yc = cosf(angles[1] * 0.5f);
zs = -sinf(angles[2] * 0.5f); zc = cosf(angles[2] * 0.5f);
dest[0] = xc * ys * zs + xs * yc * zc;
dest[1] = xc * ys * zc - xs * yc * zs;
dest[2] = xc * yc * zs + xs * ys * zc;
dest[3] = xc * yc * zc - xs * ys * zs;
}
/*!
* @brief creates NEW quaternion using rotation angles and does
* rotations in x z y order in left hand (roll yaw pitch)
*
* @param[in] angles angles x y z (radians)
* @param[out] dest quaternion
*/
CGLM_INLINE
void
glm_euler_xzy_quat_lh(vec3 angles, versor dest) {
float xc, yc, zc,
xs, ys, zs;
xs = sinf(angles[0] * 0.5f); xc = cosf(angles[0] * 0.5f);
ys = sinf(angles[1] * 0.5f); yc = cosf(angles[1] * 0.5f);
zs = -sinf(angles[2] * 0.5f); zc = cosf(angles[2] * 0.5f);
dest[0] = -xc * zs * ys + xs * zc * yc;
dest[1] = xc * zc * ys - xs * zs * yc;
dest[2] = xc * zs * yc + xs * zc * ys;
dest[3] = xc * zc * yc + xs * zs * ys;
}
/*!
* @brief creates NEW quaternion using rotation angles and does
* rotations in y x z order in left hand (pitch roll yaw)
*
* @param[in] angles angles x y z (radians)
* @param[out] dest quaternion
*/
CGLM_INLINE
void
glm_euler_yxz_quat_lh(vec3 angles, versor dest) {
float xc, yc, zc,
xs, ys, zs;
xs = sinf(angles[0] * 0.5f); xc = cosf(angles[0] * 0.5f);
ys = sinf(angles[1] * 0.5f); yc = cosf(angles[1] * 0.5f);
zs = -sinf(angles[2] * 0.5f); zc = cosf(angles[2] * 0.5f);
dest[0] = yc * xs * zc + ys * xc * zs;
dest[1] = -yc * xs * zs + ys * xc * zc;
dest[2] = yc * xc * zs - ys * xs * zc;
dest[3] = yc * xc * zc + ys * xs * zs;
}
/*!
* @brief creates NEW quaternion using rotation angles and does
* rotations in y z x order in left hand (pitch yaw roll)
*
* @param[in] angles angles x y z (radians)
* @param[out] dest quaternion
*/
CGLM_INLINE
void
glm_euler_yzx_quat_lh(vec3 angles, versor dest) {
float xc, yc, zc,
xs, ys, zs;
xs = sinf(angles[0] * 0.5f); xc = cosf(angles[0] * 0.5f);
ys = sinf(angles[1] * 0.5f); yc = cosf(angles[1] * 0.5f);
zs = -sinf(angles[2] * 0.5f); zc = cosf(angles[2] * 0.5f);
dest[0] = yc * zc * xs + ys * zs * xc;
dest[1] = yc * zs * xs + ys * zc * xc;
dest[2] = yc * zs * xc - ys * zc * xs;
dest[3] = yc * zc * xc - ys * zs * xs;
}
/*!
* @brief creates NEW quaternion using rotation angles and does
* rotations in z x y order in left hand (yaw roll pitch)
*
* @param[in] angles angles x y z (radians)
* @param[out] dest quaternion
*/
CGLM_INLINE
void
glm_euler_zxy_quat_lh(vec3 angles, versor dest) {
float xc, yc, zc,
xs, ys, zs;
xs = sinf(angles[0] * 0.5f); xc = cosf(angles[0] * 0.5f);
ys = sinf(angles[1] * 0.5f); yc = cosf(angles[1] * 0.5f);
zs = -sinf(angles[2] * 0.5f); zc = cosf(angles[2] * 0.5f);
dest[0] = zc * xs * yc - zs * xc * ys;
dest[1] = zc * xc * ys + zs * xs * yc;
dest[2] = zc * xs * ys + zs * xc * yc;
dest[3] = zc * xc * yc - zs * xs * ys;
}
/*!
* @brief creates NEW quaternion using rotation angles and does
* rotations in z y x order in left hand (yaw pitch roll)
*
* @param[in] angles angles x y z (radians)
* @param[out] dest quaternion
*/
CGLM_INLINE
void
glm_euler_zyx_quat_lh(vec3 angles, versor dest) {
float xc, yc, zc,
xs, ys, zs;
xs = sinf(angles[0] * 0.5f); xc = cosf(angles[0] * 0.5f);
ys = sinf(angles[1] * 0.5f); yc = cosf(angles[1] * 0.5f);
zs = -sinf(angles[2] * 0.5f); zc = cosf(angles[2] * 0.5f);
dest[0] = zc * yc * xs - zs * ys * xc;
dest[1] = zc * ys * xc + zs * yc * xs;
dest[2] = -zc * ys * xs + zs * yc * xc;
dest[3] = zc * yc * xc + zs * ys * xs;
}
#endif /*cglm_euler_to_quat_lh_h*/

View File

@@ -0,0 +1,170 @@
/*
* 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_euler_xyz_quat_rh(vec3 angles, versor dest);
CGLM_INLINE void glm_euler_xzy_quat_rh(vec3 angles, versor dest);
CGLM_INLINE void glm_euler_yxz_quat_rh(vec3 angles, versor dest);
CGLM_INLINE void glm_euler_yzx_quat_rh(vec3 angles, versor dest);
CGLM_INLINE void glm_euler_zxy_quat_rh(vec3 angles, versor dest);
CGLM_INLINE void glm_euler_zyx_quat_rh(vec3 angles, versor dest);
*/
/*
Things to note:
The only difference between euler to quat rh vs lh is that the zsin part is negative
*/
#ifndef cglm_euler_to_quat_rh_h
#define cglm_euler_to_quat_rh_h
#include "../common.h"
/*!
* @brief creates NEW quaternion using rotation angles and does
* rotations in x y z order in right hand (roll pitch yaw)
*
* @param[in] angles angles x y z (radians)
* @param[out] dest quaternion
*/
CGLM_INLINE
void
glm_euler_xyz_quat_rh(vec3 angles, versor dest) {
float xc, yc, zc,
xs, ys, zs;
xs = sinf(angles[0] * 0.5f); xc = cosf(angles[0] * 0.5f);
ys = sinf(angles[1] * 0.5f); yc = cosf(angles[1] * 0.5f);
zs = sinf(angles[2] * 0.5f); zc = cosf(angles[2] * 0.5f);
dest[0] = xc * ys * zs + xs * yc * zc;
dest[1] = xc * ys * zc - xs * yc * zs;
dest[2] = xc * yc * zs + xs * ys * zc;
dest[3] = xc * yc * zc - xs * ys * zs;
}
/*!
* @brief creates NEW quaternion using rotation angles and does
* rotations in x z y order in right hand (roll yaw pitch)
*
* @param[in] angles angles x y z (radians)
* @param[out] dest quaternion
*/
CGLM_INLINE
void
glm_euler_xzy_quat_rh(vec3 angles, versor dest) {
float xc, yc, zc,
xs, ys, zs;
xs = sinf(angles[0] * 0.5f); xc = cosf(angles[0] * 0.5f);
ys = sinf(angles[1] * 0.5f); yc = cosf(angles[1] * 0.5f);
zs = sinf(angles[2] * 0.5f); zc = cosf(angles[2] * 0.5f);
dest[0] = -xc * zs * ys + xs * zc * yc;
dest[1] = xc * zc * ys - xs * zs * yc;
dest[2] = xc * zs * yc + xs * zc * ys;
dest[3] = xc * zc * yc + xs * zs * ys;
}
/*!
* @brief creates NEW quaternion using rotation angles and does
* rotations in y x z order in right hand (pitch roll yaw)
*
* @param[in] angles angles x y z (radians)
* @param[out] dest quaternion
*/
CGLM_INLINE
void
glm_euler_yxz_quat_rh(vec3 angles, versor dest) {
float xc, yc, zc,
xs, ys, zs;
xs = sinf(angles[0] * 0.5f); xc = cosf(angles[0] * 0.5f);
ys = sinf(angles[1] * 0.5f); yc = cosf(angles[1] * 0.5f);
zs = sinf(angles[2] * 0.5f); zc = cosf(angles[2] * 0.5f);
dest[0] = yc * xs * zc + ys * xc * zs;
dest[1] = -yc * xs * zs + ys * xc * zc;
dest[2] = yc * xc * zs - ys * xs * zc;
dest[3] = yc * xc * zc + ys * xs * zs;
}
/*!
* @brief creates NEW quaternion using rotation angles and does
* rotations in y z x order in right hand (pitch yaw roll)
*
* @param[in] angles angles x y z (radians)
* @param[out] dest quaternion
*/
CGLM_INLINE
void
glm_euler_yzx_quat_rh(vec3 angles, versor dest) {
float xc, yc, zc,
xs, ys, zs;
xs = sinf(angles[0] * 0.5f); xc = cosf(angles[0] * 0.5f);
ys = sinf(angles[1] * 0.5f); yc = cosf(angles[1] * 0.5f);
zs = sinf(angles[2] * 0.5f); zc = cosf(angles[2] * 0.5f);
dest[0] = yc * zc * xs + ys * zs * xc;
dest[1] = yc * zs * xs + ys * zc * xc;
dest[2] = yc * zs * xc - ys * zc * xs;
dest[3] = yc * zc * xc - ys * zs * xs;
}
/*!
* @brief creates NEW quaternion using rotation angles and does
* rotations in z x y order in right hand (yaw roll pitch)
*
* @param[in] angles angles x y z (radians)
* @param[out] dest quaternion
*/
CGLM_INLINE
void
glm_euler_zxy_quat_rh(vec3 angles, versor dest) {
float xc, yc, zc,
xs, ys, zs;
xs = sinf(angles[0] * 0.5f); xc = cosf(angles[0] * 0.5f);
ys = sinf(angles[1] * 0.5f); yc = cosf(angles[1] * 0.5f);
zs = sinf(angles[2] * 0.5f); zc = cosf(angles[2] * 0.5f);
dest[0] = zc * xs * yc - zs * xc * ys;
dest[1] = zc * xc * ys + zs * xs * yc;
dest[2] = zc * xs * ys + zs * xc * yc;
dest[3] = zc * xc * yc - zs * xs * ys;
}
/*!
* @brief creates NEW quaternion using rotation angles and does
* rotations in z y x order in right hand (yaw pitch roll)
*
* @param[in] angles angles x y z (radians)
* @param[out] dest quaternion
*/
CGLM_INLINE
void
glm_euler_zyx_quat_rh(vec3 angles, versor dest) {
float xc, yc, zc,
xs, ys, zs;
xs = sinf(angles[0] * 0.5f); xc = cosf(angles[0] * 0.5f);
ys = sinf(angles[1] * 0.5f); yc = cosf(angles[1] * 0.5f);
zs = sinf(angles[2] * 0.5f); zc = cosf(angles[2] * 0.5f);
dest[0] = zc * yc * xs - zs * ys * xc;
dest[1] = zc * ys * xc + zs * yc * xs;
dest[2] = -zc * ys * xs + zs * yc * xc;
dest[3] = zc * yc * xc + zs * ys * xs;
}
#endif /*cglm_euler_to_quat_rh_h*/

View File

@@ -10,8 +10,11 @@
CGLM_INLINE void glm_mat4_print(mat4 matrix, FILE *ostream); CGLM_INLINE void glm_mat4_print(mat4 matrix, FILE *ostream);
CGLM_INLINE void glm_mat3_print(mat3 matrix, FILE *ostream); CGLM_INLINE void glm_mat3_print(mat3 matrix, FILE *ostream);
CGLM_INLINE void glm_vec4_print(vec4 vec, FILE *ostream); CGLM_INLINE void glm_vec4_print(vec4 vec, FILE *ostream);
CGLM_INLINE void glm_ivec4_print(ivec4 vec, FILE *ostream);
CGLM_INLINE void glm_vec3_print(vec3 vec, FILE *ostream); CGLM_INLINE void glm_vec3_print(vec3 vec, FILE *ostream);
CGLM_INLINE void glm_ivec3_print(ivec3 vec, FILE *ostream); CGLM_INLINE void glm_ivec3_print(ivec3 vec, FILE *ostream);
CGLM_INLINE void glm_vec2_print(vec2 vec, FILE *ostream);
CGLM_INLINE void glm_ivec2_print(ivec2 vec, FILE *ostream);
CGLM_INLINE void glm_versor_print(versor vec, FILE *ostream); CGLM_INLINE void glm_versor_print(versor vec, FILE *ostream);
CGLM_INLINE void glm_arch_print(FILE *ostream); CGLM_INLINE void glm_arch_print(FILE *ostream);
*/ */
@@ -35,7 +38,7 @@
#ifndef cglm_io_h #ifndef cglm_io_h
#define cglm_io_h #define cglm_io_h
#if defined(DEBUG) || defined(_DEBUG) \ #if !defined(NDEBUG) \
|| defined(CGLM_DEFINE_PRINTS) || defined(CGLM_LIB_SRC) \ || defined(CGLM_DEFINE_PRINTS) || defined(CGLM_LIB_SRC) \
|| defined(CGLM_NO_PRINTS_NOOP) || defined(CGLM_NO_PRINTS_NOOP)
@@ -261,6 +264,24 @@ glm_vec4_print(vec4 vec,
#undef m #undef m
} }
CGLM_INLINE
void
glm_ivec4_print(ivec4 vec,
FILE * __restrict ostream) {
int i;
#define m 4
fprintf(ostream, "Vector (int%d): " CGLM_PRINT_COLOR "\n (", m);
for (i = 0; i < m; i++)
fprintf(ostream, " % d", vec[i]);
fprintf(ostream, " )" CGLM_PRINT_COLOR_RESET "\n\n");
#undef m
}
CGLM_INLINE CGLM_INLINE
void void
glm_vec3_print(vec3 vec, glm_vec3_print(vec3 vec,
@@ -323,6 +344,24 @@ glm_vec2_print(vec2 vec,
#undef m #undef m
} }
CGLM_INLINE
void
glm_ivec2_print(ivec2 vec,
FILE * __restrict ostream) {
int i;
#define m 2
fprintf(ostream, "Vector (int%d): " CGLM_PRINT_COLOR "\n (", m);
for (i = 0; i < m; i++)
fprintf(ostream, " % d", vec[i]);
fprintf(ostream, " )" CGLM_PRINT_COLOR_RESET "\n\n");
#undef m
}
CGLM_INLINE CGLM_INLINE
void void
glm_versor_print(versor vec, glm_versor_print(versor vec,
@@ -387,9 +426,11 @@ glm_aabb_print(vec3 bbox[2],
#define glm_mat3_print(v, s) (void)v; (void)s; #define glm_mat3_print(v, s) (void)v; (void)s;
#define glm_mat2_print(v, s) (void)v; (void)s; #define glm_mat2_print(v, s) (void)v; (void)s;
#define glm_vec4_print(v, s) (void)v; (void)s; #define glm_vec4_print(v, s) (void)v; (void)s;
#define glm_ivec4_print(v, s) (void)v; (void)s;
#define glm_vec3_print(v, s) (void)v; (void)s; #define glm_vec3_print(v, s) (void)v; (void)s;
#define glm_ivec3_print(v, s) (void)v; (void)s; #define glm_ivec3_print(v, s) (void)v; (void)s;
#define glm_vec2_print(v, s) (void)v; (void)s; #define glm_vec2_print(v, s) (void)v; (void)s;
#define glm_ivec2_print(v, s) (void)v; (void)s;
#define glm_versor_print(v, s) (void)v; (void)s; #define glm_versor_print(v, s) (void)v; (void)s;
#define glm_aabb_print(v, t, s) (void)v; (void)t; (void)s; #define glm_aabb_print(v, t, s) (void)v; (void)t; (void)s;
#define glm_arch_print(s) (void)s; #define glm_arch_print(s) (void)s;

View File

@@ -17,14 +17,38 @@
CGLM_INLINE void glm_ivec2_copy(ivec2 a, ivec2 dest) CGLM_INLINE void glm_ivec2_copy(ivec2 a, ivec2 dest)
CGLM_INLINE void glm_ivec2_zero(ivec2 v) CGLM_INLINE void glm_ivec2_zero(ivec2 v)
CGLM_INLINE void glm_ivec2_one(ivec2 v) CGLM_INLINE void glm_ivec2_one(ivec2 v)
CGLM_INLINE int glm_ivec2_dot(ivec2 a, ivec2 b)
CGLM_INLINE int glm_ivec2_cross(ivec2 a, ivec2 b)
CGLM_INLINE void glm_ivec2_add(ivec2 a, ivec2 b, ivec2 dest) CGLM_INLINE void glm_ivec2_add(ivec2 a, ivec2 b, ivec2 dest)
CGLM_INLINE void glm_ivec2_adds(ivec2 v, int s, ivec2 dest) CGLM_INLINE void glm_ivec2_adds(ivec2 v, int s, ivec2 dest)
CGLM_INLINE void glm_ivec2_sub(ivec2 a, ivec2 b, ivec2 dest) CGLM_INLINE void glm_ivec2_sub(ivec2 a, ivec2 b, ivec2 dest)
CGLM_INLINE void glm_ivec2_subs(ivec2 v, int s, ivec2 dest) CGLM_INLINE void glm_ivec2_subs(ivec2 v, int s, ivec2 dest)
CGLM_INLINE void glm_ivec2_mul(ivec2 a, ivec2 b, ivec2 dest) CGLM_INLINE void glm_ivec2_mul(ivec2 a, ivec2 b, ivec2 dest)
CGLM_INLINE void glm_ivec2_scale(ivec2 v, int s, ivec2 dest) CGLM_INLINE void glm_ivec2_scale(ivec2 v, int s, ivec2 dest)
CGLM_INLINE void glm_ivec2_div(ivec2 a, ivec2 b, ivec2 dest)
CGLM_INLINE void glm_ivec2_divs(ivec2 v, int s, ivec2 dest)
CGLM_INLINE void glm_ivec2_mod(ivec2 a, ivec2 b, ivec2 dest)
CGLM_INLINE void glm_ivec2_addadd(ivec2 a, ivec2 b, ivec2 dest)
CGLM_INLINE void glm_ivec2_addadds(ivec2 a, int s, ivec2 dest)
CGLM_INLINE void glm_ivec2_subadd(ivec2 a, ivec2 b, ivec2 dest)
CGLM_INLINE void glm_ivec2_subadds(ivec2 a, int s, ivec2 dest)
CGLM_INLINE void glm_ivec2_muladd(ivec2 a, ivec2 b, ivec2 dest)
CGLM_INLINE void glm_ivec2_muladds(ivec2 a, int s, ivec2 dest)
CGLM_INLINE void glm_ivec2_maxadd(ivec2 a, ivec2 b, ivec2 dest)
CGLM_INLINE void glm_ivec2_minadd(ivec2 a, ivec2 b, ivec2 dest)
CGLM_INLINE void glm_ivec2_subsub(ivec2 a, ivec2 b, ivec2 dest)
CGLM_INLINE void glm_ivec2_subsubs(ivec2 a, int s, ivec2 dest)
CGLM_INLINE void glm_ivec2_addsub(ivec2 a, ivec2 b, ivec2 dest)
CGLM_INLINE void glm_ivec2_addsubs(ivec2 a, int s, ivec2 dest)
CGLM_INLINE void glm_ivec2_mulsub(ivec2 a, ivec2 b, ivec2 dest)
CGLM_INLINE void glm_ivec2_mulsubs(ivec2 a, int s, ivec2 dest)
CGLM_INLINE void glm_ivec2_maxsub(ivec2 a, ivec2 b, ivec2 dest)
CGLM_INLINE void glm_ivec2_minsub(ivec2 a, ivec2 b, ivec2 dest)
CGLM_INLINE int glm_ivec2_distance2(ivec2 a, ivec2 b) CGLM_INLINE int glm_ivec2_distance2(ivec2 a, ivec2 b)
CGLM_INLINE float glm_ivec2_distance(ivec2 a, ivec2 b) CGLM_INLINE float glm_ivec2_distance(ivec2 a, ivec2 b)
CGLM_INLINE void glm_ivec2_fill(ivec2 v, int val);
CGLM_INLINE bool glm_ivec2_eq(ivec2 v, int val);
CGLM_INLINE bool glm_ivec2_eqv(ivec2 a, ivec2 b);
CGLM_INLINE void glm_ivec2_maxv(ivec2 a, ivec2 b, ivec2 dest) CGLM_INLINE void glm_ivec2_maxv(ivec2 a, ivec2 b, ivec2 dest)
CGLM_INLINE void glm_ivec2_minv(ivec2 a, ivec2 b, ivec2 dest) CGLM_INLINE void glm_ivec2_minv(ivec2 a, ivec2 b, ivec2 dest)
CGLM_INLINE void glm_ivec2_clamp(ivec2 v, int minVal, int maxVal) CGLM_INLINE void glm_ivec2_clamp(ivec2 v, int minVal, int maxVal)
@@ -35,6 +59,7 @@
#define cglm_ivec2_h #define cglm_ivec2_h
#include "common.h" #include "common.h"
#include "util.h"
#define GLM_IVEC2_ONE_INIT {1, 1} #define GLM_IVEC2_ONE_INIT {1, 1}
#define GLM_IVEC2_ZERO_INIT {0, 0} #define GLM_IVEC2_ZERO_INIT {0, 0}
@@ -90,6 +115,36 @@ glm_ivec2_one(ivec2 v) {
v[0] = v[1] = 1; v[0] = v[1] = 1;
} }
/*!
* @brief ivec2 dot product
*
* @param[in] a vector1
* @param[in] b vector2
*
* @return dot product
*/
CGLM_INLINE
int
glm_ivec2_dot(ivec2 a, ivec2 b) {
return a[0] * b[0] + a[1] * b[1];
}
/*!
* @brief ivec2 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
int
glm_ivec2_cross(ivec2 a, ivec2 b) {
return a[0] * b[1] - a[1] * b[0];
}
/*! /*!
* @brief add vector [a] to vector [b] and store result in [dest] * @brief add vector [a] to vector [b] and store result in [dest]
* *
@@ -149,7 +204,7 @@ glm_ivec2_subs(ivec2 v, int s, ivec2 dest) {
/*! /*!
* @brief multiply vector [a] with vector [b] and store result in [dest] * @brief multiply vector [a] with vector [b] and store result in [dest]
* *
* @param[in] a frist vector * @param[in] a first vector
* @param[in] b second vector * @param[in] b second vector
* @param[out] dest destination * @param[out] dest destination
*/ */
@@ -174,6 +229,304 @@ glm_ivec2_scale(ivec2 v, int s, ivec2 dest) {
dest[1] = v[1] * s; dest[1] = v[1] * s;
} }
/*!
* @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_ivec2_div(ivec2 a, ivec2 b, ivec2 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_ivec2_divs(ivec2 v, int s, ivec2 dest) {
dest[0] = v[0] / s;
dest[1] = v[1] / s;
}
/*!
* @brief mod vector with another component-wise modulo: 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_ivec2_mod(ivec2 a, ivec2 b, ivec2 dest) {
dest[0] = a[0] % b[0];
dest[1] = a[1] % b[1];
}
/*!
* @brief add vector [a] with vector [b] and add result to vector [dest]
*
* applies += operator so dest must be initialized
*
* @param[in] a first vector
* @param[in] b second vector
* @param[out] dest dest += (a + b)
*/
CGLM_INLINE
void
glm_ivec2_addadd(ivec2 a, ivec2 b, ivec2 dest) {
dest[0] += a[0] + b[0];
dest[1] += a[1] + b[1];
}
/*!
* @brief add scalar [s] onto vector [a] and add result to vector [dest]
*
* applies += operator so dest must be initialized
*
* @param[in] a vector
* @param[in] s scalar
* @param[out] dest dest += (a + s)
*/
CGLM_INLINE
void
glm_ivec2_addadds(ivec2 a, int s, ivec2 dest) {
dest[0] += a[0] + s;
dest[1] += a[1] + s;
}
/*!
* @brief subtract vector [a] from vector [b] and add result to [dest]
*
* applies += operator so dest must be initialized
*
* @param[in] a first vector
* @param[in] b second vector
* @param[out] dest dest += (a - b)
*/
CGLM_INLINE
void
glm_ivec2_subadd(ivec2 a, ivec2 b, ivec2 dest) {
dest[0] += a[0] - b[0];
dest[1] += a[1] - b[1];
}
/*!
* @brief subtract scalar [s] from vector [a] and add result to [dest]
*
* applies += operator so dest must be initialized
*
* @param[in] a first
* @param[in] s scalar
* @param[out] dest dest += (a - s)
*/
CGLM_INLINE
void
glm_ivec2_subadds(ivec2 a, int s, ivec2 dest) {
dest[0] += a[0] - s;
dest[1] += a[1] - s;
}
/*!
* @brief multiply vector [a] with vector [b] and add result to [dest]
*
* applies += operator so dest must be initialized
*
* @param[in] a first vector
* @param[in] b second vector
* @param[out] dest dest += (a * b)
*/
CGLM_INLINE
void
glm_ivec2_muladd(ivec2 a, ivec2 b, ivec2 dest) {
dest[0] += a[0] * b[0];
dest[1] += a[1] * b[1];
}
/*!
* @brief multiply vector [a] with scalar [s] and add result to [dest]
*
* applies += operator so dest must be initialized
*
* @param[in] a vector
* @param[in] s scalar
* @param[out] dest dest += (a * s)
*/
CGLM_INLINE
void
glm_ivec2_muladds(ivec2 a, int s, ivec2 dest) {
dest[0] += a[0] * s;
dest[1] += a[1] * s;
}
/*!
* @brief add maximum of vector [a] and vector [b] to vector [dest]
*
* applies += operator so dest must be initialized
*
* @param[in] a first vector
* @param[in] b second vector
* @param[out] dest dest += max(a, b)
*/
CGLM_INLINE
void
glm_ivec2_maxadd(ivec2 a, ivec2 b, ivec2 dest) {
dest[0] += glm_imax(a[0], b[0]);
dest[1] += glm_imax(a[1], b[1]);
}
/*!
* @brief add minimum of vector [a] and vector [b] to vector [dest]
*
* applies += operator so dest must be initialized
*
* @param[in] a first vector
* @param[in] b second vector
* @param[out] dest dest += min(a, b)
*/
CGLM_INLINE
void
glm_ivec2_minadd(ivec2 a, ivec2 b, ivec2 dest) {
dest[0] += glm_imin(a[0], b[0]);
dest[1] += glm_imin(a[1], b[1]);
}
/*!
* @brief subtract vector [a] from vector [b] and subtract result from [dest]
*
* applies -= operator so dest must be initialized
*
* @param[in] a first vector
* @param[in] b second vector
* @param[out] dest dest -= (a - b)
*/
CGLM_INLINE
void
glm_ivec2_subsub(ivec2 a, ivec2 b, ivec2 dest) {
dest[0] -= a[0] - b[0];
dest[1] -= a[1] - b[1];
}
/*!
* @brief subtract scalar [s] from vector [a] and subtract result from [dest]
*
* applies -= operator so dest must be initialized
*
* @param[in] a vector
* @param[in] s scalar
* @param[out] dest dest -= (a - s)
*/
CGLM_INLINE
void
glm_ivec2_subsubs(ivec2 a, int s, ivec2 dest) {
dest[0] -= a[0] - s;
dest[1] -= a[1] - s;
}
/*!
* @brief add vector [a] to vector [b] and subtract the result from [dest]
*
* applies -= operator so dest must be initialized
*
* @param[in] a vector
* @param[in] b scalar
* @param[out] dest dest -= (a + b)
*/
CGLM_INLINE
void
glm_ivec2_addsub(ivec2 a, ivec2 b, ivec2 dest) {
dest[0] -= a[0] + b[0];
dest[1] -= a[1] + b[1];
}
/*!
* @brief add scalar [s] to vector [a] and subtract the result from [dest]
*
* 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_ivec2_addsubs(ivec2 a, int s, ivec2 dest) {
dest[0] -= a[0] + s;
dest[1] -= a[1] + s;
}
/*!
* @brief multiply vector [a] and vector [b] and subtract the result from [dest]
*
* applies -= operator so dest must be initialized
*
* @param[in] a vector
* @param[in] b scalar
* @param[out] dest dest -= (a * b)
*/
CGLM_INLINE
void
glm_ivec2_mulsub(ivec2 a, ivec2 b, ivec2 dest) {
dest[0] -= a[0] * b[0];
dest[1] -= a[1] * b[1];
}
/*!
* @brief multiply vector [a] with scalar [s] and subtract the result from [dest]
*
* applies -= operator so dest must be initialized
*
* @param[in] a vector
* @param[in] s scalar
* @param[out] dest dest -= (a * s)
*/
CGLM_INLINE
void
glm_ivec2_mulsubs(ivec2 a, int s, ivec2 dest) {
dest[0] -= a[0] * s;
dest[1] -= a[1] * s;
}
/*!
* @brief subtract maximum of vector [a] and vector [b] from vector [dest]
*
* applies += operator so dest must be initialized
*
* @param[in] a first vector
* @param[in] b second vector
* @param[out] dest dest -= max(a, b)
*/
CGLM_INLINE
void
glm_ivec2_maxsub(ivec2 a, ivec2 b, ivec2 dest) {
dest[0] -= glm_imax(a[0], b[0]);
dest[1] -= glm_imax(a[1], b[1]);
}
/*!
* @brief subtract minimum of vector [a] and vector [b] from vector [dest]
*
* applies -= operator so dest must be initialized
*
* @param[in] a first vector
* @param[in] b second vector
* @param[out] dest dest -= min(a, b)
*/
CGLM_INLINE
void
glm_ivec2_minsub(ivec2 a, ivec2 b, ivec2 dest) {
dest[0] -= glm_imin(a[0], b[0]);
dest[1] -= glm_imin(a[1], b[1]);
}
/*! /*!
* @brief squared distance between two vectors * @brief squared distance between two vectors
* *
@@ -203,6 +556,44 @@ glm_ivec2_distance(ivec2 a, ivec2 b) {
return sqrtf((float)glm_ivec2_distance2(a, b)); return sqrtf((float)glm_ivec2_distance2(a, b));
} }
/*!
* @brief fill a vector with specified value
*
* @param[out] v dest
* @param[in] val value
*/
CGLM_INLINE
void
glm_ivec2_fill(ivec2 v, int val) {
v[0] = v[1] = val;
}
/*!
* @brief check if vector is equal to value
*
* @param[in] v vector
* @param[in] val value
*/
CGLM_INLINE
bool
glm_ivec2_eq(ivec2 v, int val) {
return v[0] == val && v[0] == v[1];
}
/*!
* @brief check if vector is equal to another
*
* @param[in] a vector
* @param[in] b vector
*/
CGLM_INLINE
bool
glm_ivec2_eqv(ivec2 a, ivec2 b) {
return a[0] == b[0]
&& a[1] == b[1];
}
/*! /*!
* @brief set each member of dest to greater of vector a and b * @brief set each member of dest to greater of vector a and b
* *

View File

@@ -17,14 +17,39 @@
CGLM_INLINE void glm_ivec3_copy(ivec3 a, ivec3 dest) CGLM_INLINE void glm_ivec3_copy(ivec3 a, ivec3 dest)
CGLM_INLINE void glm_ivec3_zero(ivec3 v) CGLM_INLINE void glm_ivec3_zero(ivec3 v)
CGLM_INLINE void glm_ivec3_one(ivec3 v) CGLM_INLINE void glm_ivec3_one(ivec3 v)
CGLM_INLINE int glm_ivec3_dot(ivec3 a, ivec3 b)
CGLM_INLINE int glm_ivec3_norm2(ivec3 v)
CGLM_INLINE int glm_ivec3_norm(ivec3 v)
CGLM_INLINE void glm_ivec3_add(ivec3 a, ivec3 b, ivec3 dest) CGLM_INLINE void glm_ivec3_add(ivec3 a, ivec3 b, ivec3 dest)
CGLM_INLINE void glm_ivec3_adds(ivec3 v, int s, ivec3 dest) CGLM_INLINE void glm_ivec3_adds(ivec3 v, int s, ivec3 dest)
CGLM_INLINE void glm_ivec3_sub(ivec3 a, ivec3 b, ivec3 dest) CGLM_INLINE void glm_ivec3_sub(ivec3 a, ivec3 b, ivec3 dest)
CGLM_INLINE void glm_ivec3_subs(ivec3 v, int s, ivec3 dest) CGLM_INLINE void glm_ivec3_subs(ivec3 v, int s, ivec3 dest)
CGLM_INLINE void glm_ivec3_mul(ivec3 a, ivec3 b, ivec3 dest) CGLM_INLINE void glm_ivec3_mul(ivec3 a, ivec3 b, ivec3 dest)
CGLM_INLINE void glm_ivec3_scale(ivec3 v, int s, ivec3 dest) CGLM_INLINE void glm_ivec3_scale(ivec3 v, int s, ivec3 dest)
CGLM_INLINE void glm_ivec3_div(ivec3 a, ivec3 b, ivec3 dest)
CGLM_INLINE void glm_ivec3_divs(ivec3 v, int s, ivec3 dest)
CGLM_INLINE void glm_ivec3_mod(ivec3 a, ivec3 b, ivec3 dest)
CGLM_INLINE void glm_ivec3_addadd(ivec3 a, ivec3 b, ivec3 dest)
CGLM_INLINE void glm_ivec3_addadds(ivec3 a, int s, ivec3 dest)
CGLM_INLINE void glm_ivec3_subadd(ivec3 a, ivec3 b, ivec3 dest)
CGLM_INLINE void glm_ivec3_subadds(ivec3 a, int s, ivec3 dest)
CGLM_INLINE void glm_ivec3_muladd(ivec3 a, ivec3 b, ivec3 dest)
CGLM_INLINE void glm_ivec3_muladds(ivec3 a, int s, ivec3 dest)
CGLM_INLINE void glm_ivec3_maxadd(ivec3 a, ivec3 b, ivec3 dest)
CGLM_INLINE void glm_ivec3_minadd(ivec3 a, ivec3 b, ivec3 dest)
CGLM_INLINE void glm_ivec3_subsub(ivec3 a, ivec3 b, ivec3 dest)
CGLM_INLINE void glm_ivec3_subsubs(ivec3 a, int s, ivec3 dest)
CGLM_INLINE void glm_ivec3_addsub(ivec3 a, ivec3 b, ivec3 dest)
CGLM_INLINE void glm_ivec3_addsubs(ivec3 a, int s, ivec3 dest)
CGLM_INLINE void glm_ivec3_mulsub(ivec3 a, ivec3 b, ivec3 dest)
CGLM_INLINE void glm_ivec3_mulsubs(ivec3 a, int s, ivec3 dest)
CGLM_INLINE void glm_ivec3_maxsub(ivec3 a, ivec3 b, ivec3 dest)
CGLM_INLINE void glm_ivec3_minsub(ivec3 a, ivec3 b, ivec3 dest)
CGLM_INLINE int glm_ivec3_distance2(ivec3 a, ivec3 b) CGLM_INLINE int glm_ivec3_distance2(ivec3 a, ivec3 b)
CGLM_INLINE float glm_ivec3_distance(ivec3 a, ivec3 b) CGLM_INLINE float glm_ivec3_distance(ivec3 a, ivec3 b)
CGLM_INLINE void glm_ivec3_fill(ivec3 v, int val);
CGLM_INLINE bool glm_ivec3_eq(ivec3 v, int val);
CGLM_INLINE bool glm_ivec3_eqv(ivec3 a, ivec3 b);
CGLM_INLINE void glm_ivec3_maxv(ivec3 a, ivec3 b, ivec3 dest) CGLM_INLINE void glm_ivec3_maxv(ivec3 a, ivec3 b, ivec3 dest)
CGLM_INLINE void glm_ivec3_minv(ivec3 a, ivec3 b, ivec3 dest) CGLM_INLINE void glm_ivec3_minv(ivec3 a, ivec3 b, ivec3 dest)
CGLM_INLINE void glm_ivec3_clamp(ivec3 v, int minVal, int maxVal) CGLM_INLINE void glm_ivec3_clamp(ivec3 v, int minVal, int maxVal)
@@ -35,6 +60,7 @@
#define cglm_ivec3_h #define cglm_ivec3_h
#include "common.h" #include "common.h"
#include "util.h"
#define GLM_IVEC3_ONE_INIT {1, 1, 1} #define GLM_IVEC3_ONE_INIT {1, 1, 1}
#define GLM_IVEC3_ZERO_INIT {0, 0, 0} #define GLM_IVEC3_ZERO_INIT {0, 0, 0}
@@ -92,6 +118,51 @@ glm_ivec3_one(ivec3 v) {
v[0] = v[1] = v[2] = 1; v[0] = v[1] = v[2] = 1;
} }
/*!
* @brief ivec3 dot product
*
* @param[in] a vector1
* @param[in] b vector2
*
* @return dot product
*/
CGLM_INLINE
int
glm_ivec3_dot(ivec3 a, ivec3 b) {
return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
}
/*!
* @brief norm * norm (magnitude) of vec
*
* we can use this func instead of calling norm * norm, because it would call
* sqrtf function 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
int
glm_ivec3_norm2(ivec3 v) {
return glm_ivec3_dot(v, v);
}
/*!
* @brief euclidean norm (magnitude), also called L2 norm
* this will give magnitude of vector in euclidean space
*
* @param[in] v vector
*
* @return norm
*/
CGLM_INLINE
int
glm_ivec3_norm(ivec3 v) {
return (int)sqrtf((float)glm_ivec3_norm2(v));
}
/*! /*!
* @brief add vector [a] to vector [b] and store result in [dest] * @brief add vector [a] to vector [b] and store result in [dest]
* *
@@ -155,7 +226,7 @@ glm_ivec3_subs(ivec3 v, int s, ivec3 dest) {
/*! /*!
* @brief multiply vector [a] with vector [b] and store result in [dest] * @brief multiply vector [a] with vector [b] and store result in [dest]
* *
* @param[in] a frist vector * @param[in] a first vector
* @param[in] b second vector * @param[in] b second vector
* @param[out] dest destination * @param[out] dest destination
*/ */
@@ -182,6 +253,325 @@ glm_ivec3_scale(ivec3 v, int s, ivec3 dest) {
dest[2] = v[2] * s; dest[2] = v[2] * s;
} }
/*!
* @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], a[2]/b[2])
*/
CGLM_INLINE
void
glm_ivec3_div(ivec3 a, ivec3 b, ivec3 dest) {
dest[0] = a[0] / b[0];
dest[1] = a[1] / b[1];
dest[2] = a[2] / b[2];
}
/*!
* @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, a[2]/s)
*/
CGLM_INLINE
void
glm_ivec3_divs(ivec3 v, int s, ivec3 dest) {
dest[0] = v[0] / s;
dest[1] = v[1] / s;
dest[2] = v[2] / s;
}
/*!
* @brief Element-wise modulo operation on ivec3 vectors: dest = a % b
*
* Performs element-wise modulo on each component of vectors `a` and `b`.
*
* @param[in] a vector 1
* @param[in] b vector 2
* @param[out] dest result = (a[0]%b[0], a[1]%b[1], a[2]%b[2])
*/
CGLM_INLINE
void
glm_ivec3_mod(ivec3 a, ivec3 b, ivec3 dest) {
dest[0] = a[0] % b[0];
dest[1] = a[1] % b[1];
dest[2] = a[2] % b[2];
}
/*!
* @brief add vector [a] with vector [b] and add result to vector [dest]
*
* applies += operator so dest must be initialized
*
* @param[in] a first vector
* @param[in] b second vector
* @param[out] dest dest += (a + b)
*/
CGLM_INLINE
void
glm_ivec3_addadd(ivec3 a, ivec3 b, ivec3 dest) {
dest[0] += a[0] + b[0];
dest[1] += a[1] + b[1];
dest[2] += a[2] + b[2];
}
/*!
* @brief add scalar [s] onto vector [a] and add result to vector [dest]
*
* applies += operator so dest must be initialized
*
* @param[in] a vector
* @param[in] s scalar
* @param[out] dest dest += (a + s)
*/
CGLM_INLINE
void
glm_ivec3_addadds(ivec3 a, int s, ivec3 dest) {
dest[0] += a[0] + s;
dest[1] += a[1] + s;
dest[2] += a[2] + s;
}
/*!
* @brief subtract vector [a] from vector [b] and add result to [dest]
*
* applies += operator so dest must be initialized
*
* @param[in] a first vector
* @param[in] b second vector
* @param[out] dest dest += (a - b)
*/
CGLM_INLINE
void
glm_ivec3_subadd(ivec3 a, ivec3 b, ivec3 dest) {
dest[0] += a[0] - b[0];
dest[1] += a[1] - b[1];
dest[2] += a[2] - b[2];
}
/*!
* @brief subtract scalar [s] from vector [a] and add result to [dest]
*
* applies += operator so dest must be initialized
*
* @param[in] a first
* @param[in] s scalar
* @param[out] dest dest += (a - s)
*/
CGLM_INLINE
void
glm_ivec3_subadds(ivec3 a, int s, ivec3 dest) {
dest[0] += a[0] - s;
dest[1] += a[1] - s;
dest[2] += a[2] - s;
}
/*!
* @brief multiply vector [a] with vector [b] and add result to [dest]
*
* applies += operator so dest must be initialized
*
* @param[in] a first vector
* @param[in] b second vector
* @param[out] dest dest += (a * b)
*/
CGLM_INLINE
void
glm_ivec3_muladd(ivec3 a, ivec3 b, ivec3 dest) {
dest[0] += a[0] * b[0];
dest[1] += a[1] * b[1];
dest[2] += a[2] * b[2];
}
/*!
* @brief multiply vector [a] with scalar [s] and add result to [dest]
*
* applies += operator so dest must be initialized
*
* @param[in] a vector
* @param[in] s scalar
* @param[out] dest dest += (a * s)
*/
CGLM_INLINE
void
glm_ivec3_muladds(ivec3 a, int s, ivec3 dest) {
dest[0] += a[0] * s;
dest[1] += a[1] * s;
dest[2] += a[2] * s;
}
/*!
* @brief add maximum of vector [a] and vector [b] to vector [dest]
*
* applies += operator so dest must be initialized
*
* @param[in] a first vector
* @param[in] b second vector
* @param[out] dest dest += max(a, b)
*/
CGLM_INLINE
void
glm_ivec3_maxadd(ivec3 a, ivec3 b, ivec3 dest) {
dest[0] += glm_imax(a[0], b[0]);
dest[1] += glm_imax(a[1], b[1]);
dest[2] += glm_imax(a[2], b[2]);
}
/*!
* @brief add minimum of vector [a] and vector [b] to vector [dest]
*
* applies += operator so dest must be initialized
*
* @param[in] a first vector
* @param[in] b second vector
* @param[out] dest dest += min(a, b)
*/
CGLM_INLINE
void
glm_ivec3_minadd(ivec3 a, ivec3 b, ivec3 dest) {
dest[0] += glm_imin(a[0], b[0]);
dest[1] += glm_imin(a[1], b[1]);
dest[2] += glm_imin(a[2], b[2]);
}
/*!
* @brief subtract vector [a] from vector [b] and subtract result from [dest]
*
* applies -= operator so dest must be initialized
*
* @param[in] a first vector
* @param[in] b second vector
* @param[out] dest dest -= (a - b)
*/
CGLM_INLINE
void
glm_ivec3_subsub(ivec3 a, ivec3 b, ivec3 dest) {
dest[0] -= a[0] - b[0];
dest[1] -= a[1] - b[1];
dest[2] -= a[2] - b[2];
}
/*!
* @brief subtract scalar [s] from vector [a] and subtract result from [dest]
*
* applies -= operator so dest must be initialized
*
* @param[in] a vector
* @param[in] s scalar
* @param[out] dest dest -= (a - s)
*/
CGLM_INLINE
void
glm_ivec3_subsubs(ivec3 a, int s, ivec3 dest) {
dest[0] -= a[0] - s;
dest[1] -= a[1] - s;
dest[2] -= a[2] - s;
}
/*!
* @brief add vector [a] to vector [b] and subtract the result from [dest]
*
* applies -= operator so dest must be initialized
*
* @param[in] a vector
* @param[in] b scalar
* @param[out] dest dest -= (a + b)
*/
CGLM_INLINE
void
glm_ivec3_addsub(ivec3 a, ivec3 b, ivec3 dest) {
dest[0] -= a[0] + b[0];
dest[1] -= a[1] + b[1];
dest[2] -= a[2] + b[2];
}
/*!
* @brief add scalar [s] to vector [a] and subtract the result from [dest]
*
* 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_ivec3_addsubs(ivec3 a, int s, ivec3 dest) {
dest[0] -= a[0] + s;
dest[1] -= a[1] + s;
dest[2] -= a[2] + s;
}
/*!
* @brief multiply vector [a] and vector [b] and subtract the result from [dest]
*
* applies -= operator so dest must be initialized
*
* @param[in] a vector
* @param[in] b scalar
* @param[out] dest dest -= (a * b)
*/
CGLM_INLINE
void
glm_ivec3_mulsub(ivec3 a, ivec3 b, ivec3 dest) {
dest[0] -= a[0] * b[0];
dest[1] -= a[1] * b[1];
dest[2] -= a[2] * b[2];
}
/*!
* @brief multiply vector [a] with scalar [s] and subtract the result from [dest]
*
* applies -= operator so dest must be initialized
*
* @param[in] a vector
* @param[in] s scalar
* @param[out] dest dest -= (a * s)
*/
CGLM_INLINE
void
glm_ivec3_mulsubs(ivec3 a, int s, ivec3 dest) {
dest[0] -= a[0] * s;
dest[1] -= a[1] * s;
dest[2] -= a[2] * s;
}
/*!
* @brief subtract maximum of vector [a] and vector [b] from vector [dest]
*
* applies += operator so dest must be initialized
*
* @param[in] a first vector
* @param[in] b second vector
* @param[out] dest dest -= max(a, b)
*/
CGLM_INLINE
void
glm_ivec3_maxsub(ivec3 a, ivec3 b, ivec3 dest) {
dest[0] -= glm_imax(a[0], b[0]);
dest[1] -= glm_imax(a[1], b[1]);
dest[2] -= glm_imax(a[2], b[2]);
}
/*!
* @brief subtract minimum of vector [a] and vector [b] from vector [dest]
*
* applies -= operator so dest must be initialized
*
* @param[in] a first vector
* @param[in] b second vector
* @param[out] dest dest -= min(a, b)
*/
CGLM_INLINE
void
glm_ivec3_minsub(ivec3 a, ivec3 b, ivec3 dest) {
dest[0] -= glm_imin(a[0], b[0]);
dest[1] -= glm_imin(a[1], b[1]);
dest[2] -= glm_imin(a[2], b[2]);
}
/*! /*!
* @brief squared distance between two vectors * @brief squared distance between two vectors
* *
@@ -212,6 +602,44 @@ glm_ivec3_distance(ivec3 a, ivec3 b) {
return sqrtf((float)glm_ivec3_distance2(a, b)); return sqrtf((float)glm_ivec3_distance2(a, b));
} }
/*!
* @brief fill a vector with specified value
*
* @param[out] v dest
* @param[in] val value
*/
CGLM_INLINE
void
glm_ivec3_fill(ivec3 v, int val) {
v[0] = v[1] = v[2] = val;
}
/*!
* @brief check if vector is equal to value
*
* @param[in] v vector
* @param[in] val value
*/
CGLM_INLINE
bool
glm_ivec3_eq(ivec3 v, int val) {
return v[0] == val && v[0] == v[1] && v[0] == v[2];
}
/*!
* @brief check if vector is equal to another
*
* @param[in] a vector
* @param[in] b vector
*/
CGLM_INLINE
bool
glm_ivec3_eqv(ivec3 a, ivec3 b) {
return a[0] == b[0]
&& a[1] == b[1]
&& a[2] == b[2];
}
/*! /*!
* @brief set each member of dest to greater of vector a and b * @brief set each member of dest to greater of vector a and b
* *

View File

@@ -23,6 +23,22 @@
CGLM_INLINE void glm_ivec4_subs(ivec4 v, int s, ivec4 dest) CGLM_INLINE void glm_ivec4_subs(ivec4 v, int s, ivec4 dest)
CGLM_INLINE void glm_ivec4_mul(ivec4 a, ivec4 b, ivec4 dest) CGLM_INLINE void glm_ivec4_mul(ivec4 a, ivec4 b, ivec4 dest)
CGLM_INLINE void glm_ivec4_scale(ivec4 v, int s, ivec4 dest) CGLM_INLINE void glm_ivec4_scale(ivec4 v, int s, ivec4 dest)
CGLM_INLINE void glm_ivec4_addadd(ivec4 a, ivec4 b, ivec4 dest)
CGLM_INLINE void glm_ivec4_addadds(ivec4 a, int s, ivec4 dest)
CGLM_INLINE void glm_ivec4_subadd(ivec4 a, ivec4 b, ivec4 dest)
CGLM_INLINE void glm_ivec4_subadds(ivec4 a, int s, ivec4 dest)
CGLM_INLINE void glm_ivec4_muladd(ivec4 a, ivec4 b, ivec4 dest)
CGLM_INLINE void glm_ivec4_muladds(ivec4 a, int s, ivec4 dest)
CGLM_INLINE void glm_ivec4_maxadd(ivec4 a, ivec4 b, ivec4 dest)
CGLM_INLINE void glm_ivec4_minadd(ivec4 a, ivec4 b, ivec4 dest)
CGLM_INLINE void glm_ivec4_subsub(ivec4 a, ivec4 b, ivec4 dest)
CGLM_INLINE void glm_ivec4_subsubs(ivec4 a, int s, ivec4 dest)
CGLM_INLINE void glm_ivec4_addsub(ivec4 a, ivec4 b, ivec4 dest)
CGLM_INLINE void glm_ivec4_addsubs(ivec4 a, int s, ivec4 dest)
CGLM_INLINE void glm_ivec4_mulsub(ivec4 a, ivec4 b, ivec4 dest)
CGLM_INLINE void glm_ivec4_mulsubs(ivec4 a, int s, ivec4 dest)
CGLM_INLINE void glm_ivec4_maxsub(ivec4 a, ivec4 b, ivec4 dest)
CGLM_INLINE void glm_ivec4_minsub(ivec4 a, ivec4 b, ivec4 dest)
CGLM_INLINE int glm_ivec4_distance2(ivec4 a, ivec4 b) CGLM_INLINE int glm_ivec4_distance2(ivec4 a, ivec4 b)
CGLM_INLINE float glm_ivec4_distance(ivec4 a, ivec4 b) CGLM_INLINE float glm_ivec4_distance(ivec4 a, ivec4 b)
CGLM_INLINE void glm_ivec4_maxv(ivec4 a, ivec4 b, ivec4 dest) CGLM_INLINE void glm_ivec4_maxv(ivec4 a, ivec4 b, ivec4 dest)
@@ -35,6 +51,7 @@
#define cglm_ivec4_h #define cglm_ivec4_h
#include "common.h" #include "common.h"
#include "util.h"
#define GLM_IVEC4_ONE_INIT {1, 1, 1, 1} #define GLM_IVEC4_ONE_INIT {1, 1, 1, 1}
#define GLM_IVEC4_ZERO_INIT {0, 0, 0, 0} #define GLM_IVEC4_ZERO_INIT {0, 0, 0, 0}
@@ -162,7 +179,7 @@ glm_ivec4_subs(ivec4 v, int s, ivec4 dest) {
/*! /*!
* @brief multiply vector [a] with vector [b] and store result in [dest] * @brief multiply vector [a] with vector [b] and store result in [dest]
* *
* @param[in] a frist vector * @param[in] a first vector
* @param[in] b second vector * @param[in] b second vector
* @param[out] dest destination * @param[out] dest destination
*/ */
@@ -191,6 +208,294 @@ glm_ivec4_scale(ivec4 v, int s, ivec4 dest) {
dest[3] = v[3] * s; dest[3] = v[3] * s;
} }
/*!
* @brief add vector [a] with vector [b] and add result to vector [dest]
*
* applies += operator so dest must be initialized
*
* @param[in] a first vector
* @param[in] b second vector
* @param[out] dest dest += (a + b)
*/
CGLM_INLINE
void
glm_ivec4_addadd(ivec4 a, ivec4 b, ivec4 dest) {
dest[0] += a[0] + b[0];
dest[1] += a[1] + b[1];
dest[2] += a[2] + b[2];
dest[3] += a[3] + b[3];
}
/*!
* @brief add scalar [s] onto vector [a] and add result to vector [dest]
*
* applies += operator so dest must be initialized
*
* @param[in] a vector
* @param[in] s scalar
* @param[out] dest dest += (a + s)
*/
CGLM_INLINE
void
glm_ivec4_addadds(ivec4 a, int s, ivec4 dest) {
dest[0] += a[0] + s;
dest[1] += a[1] + s;
dest[2] += a[2] + s;
dest[3] += a[3] + s;
}
/*!
* @brief subtract vector [a] from vector [b] and add result to [dest]
*
* applies += operator so dest must be initialized
*
* @param[in] a first vector
* @param[in] b second vector
* @param[out] dest dest += (a - b)
*/
CGLM_INLINE
void
glm_ivec4_subadd(ivec4 a, ivec4 b, ivec4 dest) {
dest[0] += a[0] - b[0];
dest[1] += a[1] - b[1];
dest[2] += a[2] - b[2];
dest[3] += a[3] - b[3];
}
/*!
* @brief subtract scalar [s] from vector [a] and add result to [dest]
*
* applies += operator so dest must be initialized
*
* @param[in] a first
* @param[in] s scalar
* @param[out] dest dest += (a - s)
*/
CGLM_INLINE
void
glm_ivec4_subadds(ivec4 a, int s, ivec4 dest) {
dest[0] += a[0] - s;
dest[1] += a[1] - s;
dest[2] += a[2] - s;
dest[3] += a[3] - s;
}
/*!
* @brief multiply vector [a] with vector [b] and add result to [dest]
*
* applies += operator so dest must be initialized
*
* @param[in] a first vector
* @param[in] b second vector
* @param[out] dest dest += (a * b)
*/
CGLM_INLINE
void
glm_ivec4_muladd(ivec4 a, ivec4 b, ivec4 dest) {
dest[0] += a[0] * b[0];
dest[1] += a[1] * b[1];
dest[2] += a[2] * b[2];
dest[3] += a[3] * b[3];
}
/*!
* @brief multiply vector [a] with scalar [s] and add result to [dest]
*
* applies += operator so dest must be initialized
*
* @param[in] a vector
* @param[in] s scalar
* @param[out] dest dest += (a * s)
*/
CGLM_INLINE
void
glm_ivec4_muladds(ivec4 a, int s, ivec4 dest) {
dest[0] += a[0] * s;
dest[1] += a[1] * s;
dest[2] += a[2] * s;
dest[3] += a[3] * s;
}
/*!
* @brief add maximum of vector [a] and vector [b] to vector [dest]
*
* applies += operator so dest must be initialized
*
* @param[in] a first vector
* @param[in] b second vector
* @param[out] dest dest += max(a, b)
*/
CGLM_INLINE
void
glm_ivec4_maxadd(ivec4 a, ivec4 b, ivec4 dest) {
dest[0] += glm_imax(a[0], b[0]);
dest[1] += glm_imax(a[1], b[1]);
dest[2] += glm_imax(a[2], b[2]);
dest[3] += glm_imax(a[3], b[3]);
}
/*!
* @brief add minimum of vector [a] and vector [b] to vector [dest]
*
* applies += operator so dest must be initialized
*
* @param[in] a first vector
* @param[in] b second vector
* @param[out] dest dest += min(a, b)
*/
CGLM_INLINE
void
glm_ivec4_minadd(ivec4 a, ivec4 b, ivec4 dest) {
dest[0] += glm_imin(a[0], b[0]);
dest[1] += glm_imin(a[1], b[1]);
dest[2] += glm_imin(a[2], b[2]);
dest[3] += glm_imin(a[3], b[3]);
}
/*!
* @brief subtract vector [a] from vector [b] and subtract result from [dest]
*
* applies -= operator so dest must be initialized
*
* @param[in] a first vector
* @param[in] b second vector
* @param[out] dest dest -= (a - b)
*/
CGLM_INLINE
void
glm_ivec4_subsub(ivec4 a, ivec4 b, ivec4 dest) {
dest[0] -= a[0] - b[0];
dest[1] -= a[1] - b[1];
dest[2] -= a[2] - b[2];
dest[3] -= a[3] - b[3];
}
/*!
* @brief subtract scalar [s] from vector [a] and subtract result from [dest]
*
* applies -= operator so dest must be initialized
*
* @param[in] a vector
* @param[in] s scalar
* @param[out] dest dest -= (a - s)
*/
CGLM_INLINE
void
glm_ivec4_subsubs(ivec4 a, int s, ivec4 dest) {
dest[0] -= a[0] - s;
dest[1] -= a[1] - s;
dest[2] -= a[2] - s;
dest[3] -= a[3] - s;
}
/*!
* @brief add vector [a] to vector [b] and subtract the result from [dest]
*
* applies -= operator so dest must be initialized
*
* @param[in] a vector
* @param[in] b scalar
* @param[out] dest dest -= (a + b)
*/
CGLM_INLINE
void
glm_ivec4_addsub(ivec4 a, ivec4 b, ivec4 dest) {
dest[0] -= a[0] + b[0];
dest[1] -= a[1] + b[1];
dest[2] -= a[2] + b[2];
dest[3] -= a[3] + b[3];
}
/*!
* @brief add scalar [s] to vector [a] and subtract the result from [dest]
*
* 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_ivec4_addsubs(ivec4 a, int s, ivec4 dest) {
dest[0] -= a[0] + s;
dest[1] -= a[1] + s;
dest[2] -= a[2] + s;
dest[3] -= a[3] + s;
}
/*!
* @brief multiply vector [a] and vector [b] and subtract the result from [dest]
*
* applies -= operator so dest must be initialized
*
* @param[in] a vector
* @param[in] b scalar
* @param[out] dest dest -= (a * b)
*/
CGLM_INLINE
void
glm_ivec4_mulsub(ivec4 a, ivec4 b, ivec4 dest) {
dest[0] -= a[0] * b[0];
dest[1] -= a[1] * b[1];
dest[2] -= a[2] * b[2];
dest[3] -= a[3] * b[3];
}
/*!
* @brief multiply vector [a] with scalar [s] and subtract the result from [dest]
*
* applies -= operator so dest must be initialized
*
* @param[in] a vector
* @param[in] s scalar
* @param[out] dest dest -= (a * s)
*/
CGLM_INLINE
void
glm_ivec4_mulsubs(ivec4 a, int s, ivec4 dest) {
dest[0] -= a[0] * s;
dest[1] -= a[1] * s;
dest[2] -= a[2] * s;
dest[3] -= a[3] * s;
}
/*!
* @brief subtract maximum of vector [a] and vector [b] from vector [dest]
*
* applies += operator so dest must be initialized
*
* @param[in] a first vector
* @param[in] b second vector
* @param[out] dest dest -= max(a, b)
*/
CGLM_INLINE
void
glm_ivec4_maxsub(ivec4 a, ivec4 b, ivec4 dest) {
dest[0] -= glm_imax(a[0], b[0]);
dest[1] -= glm_imax(a[1], b[1]);
dest[2] -= glm_imax(a[2], b[2]);
dest[3] -= glm_imax(a[3], b[3]);
}
/*!
* @brief subtract minimum of vector [a] and vector [b] from vector [dest]
*
* applies -= operator so dest must be initialized
*
* @param[in] a first vector
* @param[in] b second vector
* @param[out] dest dest -= min(a, b)
*/
CGLM_INLINE
void
glm_ivec4_minsub(ivec4 a, ivec4 b, ivec4 dest) {
dest[0] -= glm_imin(a[0], b[0]);
dest[1] -= glm_imin(a[1], b[1]);
dest[2] -= glm_imin(a[2], b[2]);
dest[3] -= glm_imin(a[3], b[3]);
}
/*! /*!
* @brief squared distance between two vectors * @brief squared distance between two vectors
* *

View File

@@ -180,7 +180,7 @@ glm_mat2_transpose_to(mat2 m, mat2 dest) {
} }
/*! /*!
* @brief tranpose mat2 and store result in same matrix * @brief transpose mat2 and store result in same matrix
* *
* @param[in, out] m source and dest * @param[in, out] m source and dest
*/ */

154
include/cglm/mat2x3.h Normal file
View File

@@ -0,0 +1,154 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
/*
Macros:
GLM_MAT2X3_ZERO_INIT
GLM_MAT2X3_ZERO
Functions:
CGLM_INLINE void glm_mat2x3_copy(mat2x3 mat, mat2x3 dest);
CGLM_INLINE void glm_mat2x3_zero(mat2x3 mat);
CGLM_INLINE void glm_mat2x3_make(float * __restrict src, mat2x3 dest);
CGLM_INLINE void glm_mat2x3_mul(mat2x3 m1, mat3x2 m2, mat2 dest);
CGLM_INLINE void glm_mat2x3_mulv(mat2x3 m, vec3 v, vec2 dest);
CGLM_INLINE void glm_mat2x3_transpose(mat2x3 m, mat3x2 dest);
CGLM_INLINE void glm_mat2x3_scale(mat2x3 m, float s);
*/
#ifndef cglm_mat2x3_h
#define cglm_mat2x3_h
#include "common.h"
#define GLM_MAT2X3_ZERO_INIT {{0.0f, 0.0f, 0.0f}, {0.0f, 0.0f, 0.0f}}
/* for C only */
#define GLM_MAT2X3_ZERO GLM_MAT2X3_ZERO_INIT
/*!
* @brief copy all members of [mat] to [dest]
*
* @param[in] mat source
* @param[out] dest destination
*/
CGLM_INLINE
void
glm_mat2x3_copy(mat2x3 mat, mat2x3 dest) {
dest[0][0] = mat[0][0];
dest[0][1] = mat[0][1];
dest[0][2] = mat[0][2];
dest[1][0] = mat[1][0];
dest[1][1] = mat[1][1];
dest[1][2] = mat[1][2];
}
/*!
* @brief make given matrix zero.
*
* @param[in, out] mat matrix
*/
CGLM_INLINE
void
glm_mat2x3_zero(mat2x3 mat) {
CGLM_ALIGN_MAT mat2x3 t = GLM_MAT2X3_ZERO_INIT;
glm_mat2x3_copy(t, mat);
}
/*!
* @brief Create mat2x3 matrix from pointer
*
* @param[in] src pointer to an array of floats
* @param[out] dest matrix
*/
CGLM_INLINE
void
glm_mat2x3_make(float * __restrict src, mat2x3 dest) {
dest[0][0] = src[0];
dest[0][1] = src[1];
dest[0][2] = src[2];
dest[1][0] = src[3];
dest[1][1] = src[4];
dest[1][2] = src[5];
}
/*!
* @brief multiply m1 and m2 to dest
*
* @code
* glm_mat2x3_mul(mat2x3, mat3x2, mat2);
* @endcode
*
* @param[in] m1 left matrix (mat2x3)
* @param[in] m2 right matrix (mat3x2)
* @param[out] dest destination matrix (mat2)
*/
CGLM_INLINE
void
glm_mat2x3_mul(mat2x3 m1, mat3x2 m2, mat2 dest) {
float a00 = m1[0][0], a01 = m1[0][1], a02 = m1[0][2],
a10 = m1[1][0], a11 = m1[1][1], a12 = m1[1][2],
b00 = m2[0][0], b01 = m2[0][1],
b10 = m2[1][0], b11 = m2[1][1],
b20 = m2[2][0], b21 = m2[2][1];
dest[0][0] = a00 * b00 + a01 * b10 + a02 * b20;
dest[0][1] = a00 * b01 + a01 * b11 + a02 * b21;
dest[1][0] = a10 * b00 + a11 * b10 + a12 * b20;
dest[1][1] = a10 * b01 + a11 * b11 + a12 * b21;
}
/*!
* @brief multiply matrix with column vector and store in dest vector
*
* @param[in] m matrix (left)
* @param[in] v vector (right, column vector)
* @param[out] dest result vector
*/
CGLM_INLINE
void
glm_mat2x3_mulv(mat2x3 m, vec3 v, vec2 dest) {
float v0 = v[0], v1 = v[1], v2 = v[2];
dest[0] = m[0][0] * v0 + m[0][1] * v1 + m[0][2] * v2;
dest[1] = m[1][0] * v0 + m[1][1] * v1 + m[1][2] * v2;
}
/*!
* @brief transpose matrix and store in dest
*
* @param[in] m matrix
* @param[out] dest result
*/
CGLM_INLINE
void
glm_mat2x3_transpose(mat2x3 m, mat3x2 dest) {
dest[0][0] = m[0][0]; dest[0][1] = m[1][0];
dest[1][0] = m[0][1]; dest[1][1] = m[1][1];
dest[2][0] = m[0][2]; dest[2][1] = m[1][2];
}
/*!
* @brief scale (multiply with scalar) matrix
*
* multiply matrix with scalar
*
* @param[in, out] m matrix
* @param[in] s scalar
*/
CGLM_INLINE
void
glm_mat2x3_scale(mat2x3 m, float s) {
m[0][0] *= s; m[0][1] *= s; m[0][2] *= s;
m[1][0] *= s; m[1][1] *= s; m[1][2] *= s;
}
#endif

154
include/cglm/mat2x4.h Normal file
View File

@@ -0,0 +1,154 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
/*
Macros:
GLM_MAT2X4_ZERO_INIT
GLM_MAT2X4_ZERO
Functions:
CGLM_INLINE void glm_mat2x4_copy(mat2x4 mat, mat2x4 dest);
CGLM_INLINE void glm_mat2x4_zero(mat2x4 mat);
CGLM_INLINE void glm_mat2x4_make(float * __restrict src, mat2x4 dest);
CGLM_INLINE void glm_mat2x4_mul(mat2x4 m1, mat4x2 m2, mat2 dest);
CGLM_INLINE void glm_mat2x4_mulv(mat2x4 m, vec4 v, vec2 dest);
CGLM_INLINE void glm_mat2x4_transpose(mat2x4 m, mat4x2 dest);
CGLM_INLINE void glm_mat2x4_scale(mat2x4 m, float s);
*/
#ifndef cglm_mat2x4_h
#define cglm_mat2x4_h
#include "common.h"
#include "vec4.h"
#define GLM_MAT2X4_ZERO_INIT {{0.0f, 0.0f, 0.0f, 0.0f}, {0.0f, 0.0f, 0.0f, 0.0f}}
/* for C only */
#define GLM_MAT2X4_ZERO GLM_MAT2X4_ZERO_INIT
/*!
* @brief copy all members of [mat] to [dest]
*
* @param[in] mat source
* @param[out] dest destination
*/
CGLM_INLINE
void
glm_mat2x4_copy(mat2x4 mat, mat2x4 dest) {
glm_vec4_ucopy(mat[0], dest[0]);
glm_vec4_ucopy(mat[1], dest[1]);
}
/*!
* @brief make given matrix zero.
*
* @param[in, out] mat matrix
*/
CGLM_INLINE
void
glm_mat2x4_zero(mat2x4 mat) {
CGLM_ALIGN_MAT mat2x4 t = GLM_MAT2X4_ZERO_INIT;
glm_mat2x4_copy(t, mat);
}
/*!
* @brief Create mat2x4 matrix from pointer
*
* @param[in] src pointer to an array of floats
* @param[out] dest matrix
*/
CGLM_INLINE
void
glm_mat2x4_make(float * __restrict src, mat2x4 dest) {
dest[0][0] = src[0];
dest[0][1] = src[1];
dest[0][2] = src[2];
dest[0][3] = src[3];
dest[1][0] = src[4];
dest[1][1] = src[5];
dest[1][2] = src[6];
dest[1][3] = src[7];
}
/*!
* @brief multiply m1 and m2 to dest
*
* @code
* glm_mat2x4_mul(mat2x4, mat4x2, mat2);
* @endcode
*
* @param[in] m1 left matrix (mat2x4)
* @param[in] m2 right matrix (mat4x2)
* @param[out] dest destination matrix (mat2)
*/
CGLM_INLINE
void
glm_mat2x4_mul(mat2x4 m1, mat4x2 m2, mat2 dest) {
float a00 = m1[0][0], a01 = m1[0][1], a02 = m1[0][2], a03 = m1[0][3],
a10 = m1[1][0], a11 = m1[1][1], a12 = m1[1][2], a13 = m1[1][3],
b00 = m2[0][0], b01 = m2[0][1],
b10 = m2[1][0], b11 = m2[1][1],
b20 = m2[2][0], b21 = m2[2][1],
b30 = m2[3][0], b31 = m2[3][1];
dest[0][0] = a00 * b00 + a01 * b10 + a02 * b20 + a03 * b30;
dest[0][1] = a00 * b01 + a01 * b11 + a02 * b21 + a03 * b31;
dest[1][0] = a10 * b00 + a11 * b10 + a12 * b20 + a13 * b30;
dest[1][1] = a10 * b01 + a11 * b11 + a12 * b21 + a13 * b31;
}
/*!
* @brief multiply matrix with column vector and store in dest vector
*
* @param[in] m matrix (left)
* @param[in] v vector (right, column vector)
* @param[out] dest result vector
*/
CGLM_INLINE
void
glm_mat2x4_mulv(mat2x4 m, vec4 v, vec2 dest) {
float v0 = v[0], v1 = v[1], v2 = v[2], v3 = v[3];
dest[0] = m[0][0] * v0 + m[0][1] * v1 + m[0][2] * v2 + m[0][3] * v3;
dest[1] = m[1][0] * v0 + m[1][1] * v1 + m[1][2] * v2 + m[1][3] * v3;
}
/*!
* @brief transpose matrix and store in dest
*
* @param[in] m matrix
* @param[out] dest result
*/
CGLM_INLINE
void
glm_mat2x4_transpose(mat2x4 m, mat4x2 dest) {
dest[0][0] = m[0][0]; dest[0][1] = m[1][0];
dest[1][0] = m[0][1]; dest[1][1] = m[1][1];
dest[2][0] = m[0][2]; dest[2][1] = m[1][2];
dest[3][0] = m[0][3]; dest[3][1] = m[1][3];
}
/*!
* @brief scale (multiply with scalar) matrix
*
* multiply matrix with scalar
*
* @param[in, out] m matrix
* @param[in] s scalar
*/
CGLM_INLINE
void
glm_mat2x4_scale(mat2x4 m, float s) {
m[0][0] *= s; m[0][1] *= s; m[0][2] *= s; m[0][3] *= s;
m[1][0] *= s; m[1][1] *= s; m[1][2] *= s; m[1][3] *= s;
}
#endif

View File

@@ -201,7 +201,7 @@ glm_mat3_transpose_to(mat3 m, mat3 dest) {
} }
/*! /*!
* @brief tranpose mat3 and store result in same matrix * @brief transpose mat3 and store result in same matrix
* *
* @param[in, out] m source and dest * @param[in, out] m source and dest
*/ */

162
include/cglm/mat3x2.h Normal file
View File

@@ -0,0 +1,162 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
/*
Macros:
GLM_MAT3X2_ZERO_INIT
GLM_MAT3X2_ZERO
Functions:
CGLM_INLINE void glm_mat3x2_copy(mat3x2 mat, mat3x2 dest);
CGLM_INLINE void glm_mat3x2_zero(mat3x2 mat);
CGLM_INLINE void glm_mat3x2_make(float * __restrict src, mat3x2 dest);
CGLM_INLINE void glm_mat3x2_mul(mat3x2 m1, mat2x3 m2, mat3 dest);
CGLM_INLINE void glm_mat3x2_mulv(mat3x2 m, vec2 v, vec3 dest);
CGLM_INLINE void glm_mat3x2_transpose(mat3x2 m, mat2x3 dest);
CGLM_INLINE void glm_mat3x2_scale(mat3x2 m, float s);
*/
#ifndef cglm_mat3x2_h
#define cglm_mat3x2_h
#include "common.h"
#define GLM_MAT3X2_ZERO_INIT {{0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}}
/* for C only */
#define GLM_MAT3X2_ZERO GLM_MAT3X2_ZERO_INIT
/*!
* @brief copy all members of [mat] to [dest]
*
* @param[in] mat source
* @param[out] dest destination
*/
CGLM_INLINE
void
glm_mat3x2_copy(mat3x2 mat, mat3x2 dest) {
dest[0][0] = mat[0][0];
dest[0][1] = mat[0][1];
dest[1][0] = mat[1][0];
dest[1][1] = mat[1][1];
dest[2][0] = mat[2][0];
dest[2][1] = mat[2][1];
}
/*!
* @brief make given matrix zero.
*
* @param[in, out] mat matrix
*/
CGLM_INLINE
void
glm_mat3x2_zero(mat3x2 mat) {
CGLM_ALIGN_MAT mat3x2 t = GLM_MAT3X2_ZERO_INIT;
glm_mat3x2_copy(t, mat);
}
/*!
* @brief Create mat3x2 matrix from pointer
*
* @param[in] src pointer to an array of floats
* @param[out] dest matrix
*/
CGLM_INLINE
void
glm_mat3x2_make(float * __restrict src, mat3x2 dest) {
dest[0][0] = src[0];
dest[0][1] = src[1];
dest[1][0] = src[2];
dest[1][1] = src[3];
dest[2][0] = src[4];
dest[2][1] = src[5];
}
/*!
* @brief multiply m1 and m2 to dest
*
* @code
* glm_mat3x2_mul(mat3x2, mat2x3, mat3);
* @endcode
*
* @param[in] m1 left matrix (mat3x2)
* @param[in] m2 right matrix (mat2x3)
* @param[out] dest destination matrix (mat3)
*/
CGLM_INLINE
void
glm_mat3x2_mul(mat3x2 m1, mat2x3 m2, mat3 dest) {
float a00 = m1[0][0], a01 = m1[0][1],
a10 = m1[1][0], a11 = m1[1][1],
a20 = m1[2][0], a21 = m1[2][1],
b00 = m2[0][0], b01 = m2[0][1], b02 = m2[0][2],
b10 = m2[1][0], b11 = m2[1][1], b12 = m2[1][2];
dest[0][0] = a00 * b00 + a01 * b10;
dest[0][1] = a00 * b01 + a01 * b11;
dest[0][2] = a00 * b02 + a01 * b12;
dest[1][0] = a10 * b00 + a11 * b10;
dest[1][1] = a10 * b01 + a11 * b11;
dest[1][2] = a10 * b02 + a11 * b12;
dest[2][0] = a20 * b00 + a21 * b10;
dest[2][1] = a20 * b01 + a21 * b11;
dest[2][2] = a20 * b02 + a21 * b12;
}
/*!
* @brief multiply matrix with column vector and store in dest vector
*
* @param[in] m matrix (left)
* @param[in] v vector (right, column vector)
* @param[out] dest result vector
*/
CGLM_INLINE
void
glm_mat3x2_mulv(mat3x2 m, vec2 v, vec3 dest) {
float v0 = v[0], v1 = v[1];
dest[0] = m[0][0] * v0 + m[0][1] * v1;
dest[1] = m[1][0] * v0 + m[1][1] * v1;
dest[2] = m[2][0] * v0 + m[2][1] * v1;
}
/*!
* @brief transpose matrix and store in dest
*
* @param[in] m matrix
* @param[out] dest result
*/
CGLM_INLINE
void
glm_mat3x2_transpose(mat3x2 m, mat2x3 dest) {
dest[0][0] = m[0][0]; dest[0][1] = m[1][0]; dest[0][2] = m[2][0];
dest[1][0] = m[0][1]; dest[1][1] = m[1][1]; dest[1][2] = m[2][1];
}
/*!
* @brief scale (multiply with scalar) matrix
*
* multiply matrix with scalar
*
* @param[in, out] m matrix
* @param[in] s scalar
*/
CGLM_INLINE
void
glm_mat3x2_scale(mat3x2 m, float s) {
m[0][0] *= s; m[0][1] *= s; m[1][0] *= s;
m[1][1] *= s; m[2][0] *= s; m[2][1] *= s;
}
#endif

171
include/cglm/mat3x4.h Normal file
View File

@@ -0,0 +1,171 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
/*
Macros:
GLM_MAT3X4_ZERO_INIT
GLM_MAT3X4_ZERO
Functions:
CGLM_INLINE void glm_mat3x4_copy(mat3x4 mat, mat3x4 dest);
CGLM_INLINE void glm_mat3x4_zero(mat3x4 mat);
CGLM_INLINE void glm_mat3x4_make(float * __restrict src, mat3x4 dest);
CGLM_INLINE void glm_mat3x4_mul(mat3x4 m1, mat4x3 m2, mat3 dest);
CGLM_INLINE void glm_mat3x4_mulv(mat3x4 m, vec4 v, vec3 dest);
CGLM_INLINE void glm_mat3x4_transpose(mat3x4 m, mat4x3 dest);
CGLM_INLINE void glm_mat3x4_scale(mat3x4 m, float s);
*/
#ifndef cglm_mat3x4_h
#define cglm_mat3x4_h
#include "common.h"
#define GLM_MAT3X4_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}}
/* for C only */
#define GLM_MAT3X4_ZERO GLM_MAT3X4_ZERO_INIT
/*!
* @brief copy all members of [mat] to [dest]
*
* @param[in] mat source
* @param[out] dest destination
*/
CGLM_INLINE
void
glm_mat3x4_copy(mat3x4 mat, mat3x4 dest) {
glm_vec4_ucopy(mat[0], dest[0]);
glm_vec4_ucopy(mat[1], dest[1]);
glm_vec4_ucopy(mat[2], dest[2]);
}
/*!
* @brief make given matrix zero.
*
* @param[in, out] mat matrix
*/
CGLM_INLINE
void
glm_mat3x4_zero(mat3x4 mat) {
CGLM_ALIGN_MAT mat3x4 t = GLM_MAT3X4_ZERO_INIT;
glm_mat3x4_copy(t, mat);
}
/*!
* @brief Create mat3x4 matrix from pointer
*
* @param[in] src pointer to an array of floats
* @param[out] dest matrix
*/
CGLM_INLINE
void
glm_mat3x4_make(float * __restrict src, mat3x4 dest) {
dest[0][0] = src[0];
dest[0][1] = src[1];
dest[0][2] = src[2];
dest[0][3] = src[3];
dest[1][0] = src[4];
dest[1][1] = src[5];
dest[1][2] = src[6];
dest[1][3] = src[7];
dest[2][0] = src[8];
dest[2][1] = src[9];
dest[2][2] = src[10];
dest[2][3] = src[11];
}
/*!
* @brief multiply m1 and m2 to dest
*
* @code
* glm_mat3x4_mul(mat3x4, mat4x3, mat3);
* @endcode
*
* @param[in] m1 left matrix (mat3x4)
* @param[in] m2 right matrix (mat4x3)
* @param[out] dest destination matrix (mat3)
*/
CGLM_INLINE
void
glm_mat3x4_mul(mat3x4 m1, mat4x3 m2, mat3 dest) {
float a00 = m1[0][0], a01 = m1[0][1], a02 = m1[0][2], a03 = m1[0][3],
a10 = m1[1][0], a11 = m1[1][1], a12 = m1[1][2], a13 = m1[1][3],
a20 = m1[2][0], a21 = m1[2][1], a22 = m1[2][2], a23 = m1[2][3],
b00 = m2[0][0], b01 = m2[0][1], b02 = m2[0][2],
b10 = m2[1][0], b11 = m2[1][1], b12 = m2[1][2],
b20 = m2[2][0], b21 = m2[2][1], b22 = m2[2][2],
b30 = m2[3][0], b31 = m2[3][1], b32 = m2[3][2];
dest[0][0] = a00 * b00 + a01 * b10 + a02 * b20 + a03 * b30;
dest[0][1] = a00 * b01 + a01 * b11 + a02 * b21 + a03 * b31;
dest[0][2] = a00 * b02 + a01 * b12 + a02 * b22 + a03 * b32;
dest[1][0] = a10 * b00 + a11 * b10 + a12 * b20 + a13 * b30;
dest[1][1] = a10 * b01 + a11 * b11 + a12 * b21 + a13 * b31;
dest[1][2] = a10 * b02 + a11 * b12 + a12 * b22 + a13 * b32;
dest[2][0] = a20 * b00 + a21 * b10 + a22 * b20 + a23 * b30;
dest[2][1] = a20 * b01 + a21 * b11 + a22 * b21 + a23 * b31;
dest[2][2] = a20 * b02 + a21 * b12 + a22 * b22 + a23 * b32;
}
/*!
* @brief multiply matrix with column vector and store in dest vector
*
* @param[in] m matrix (left)
* @param[in] v vector (right, column vector)
* @param[out] dest result vector
*/
CGLM_INLINE
void
glm_mat3x4_mulv(mat3x4 m, vec4 v, vec3 dest) {
float v0 = v[0], v1 = v[1], v2 = v[2], v3 = v[3];
dest[0] = m[0][0] * v0 + m[0][1] * v1 + m[0][2] * v2 + m[0][3] * v3;
dest[1] = m[1][0] * v0 + m[1][1] * v1 + m[1][2] * v2 + m[1][3] * v3;
dest[2] = m[2][0] * v0 + m[2][1] * v1 + m[2][2] * v2 + m[2][3] * v3;
}
/*!
* @brief transpose matrix and store in dest
*
* @param[in] m matrix
* @param[out] dest result
*/
CGLM_INLINE
void
glm_mat3x4_transpose(mat3x4 m, mat4x3 dest) {
dest[0][0] = m[0][0]; dest[0][1] = m[1][0]; dest[0][2] = m[2][0];
dest[1][0] = m[0][1]; dest[1][1] = m[1][1]; dest[1][2] = m[2][1];
dest[2][0] = m[0][2]; dest[2][1] = m[1][2]; dest[2][2] = m[2][2];
dest[3][0] = m[0][3]; dest[3][1] = m[1][3]; dest[3][2] = m[2][3];
}
/*!
* @brief scale (multiply with scalar) matrix
*
* multiply matrix with scalar
*
* @param[in, out] m matrix
* @param[in] s scalar
*/
CGLM_INLINE
void
glm_mat3x4_scale(mat3x4 m, float s) {
m[0][0] *= s; m[1][0] *= s; m[2][0] *= s;
m[0][1] *= s; m[1][1] *= s; m[2][1] *= s;
m[0][2] *= s; m[1][2] *= s; m[2][2] *= s;
m[0][3] *= s; m[1][3] *= s; m[2][3] *= s;
}
#endif

View File

@@ -69,7 +69,7 @@
# include "simd/wasm/mat4.h" # include "simd/wasm/mat4.h"
#endif #endif
#ifdef DEBUG #ifndef NDEBUG
# include <assert.h> # include <assert.h>
#endif #endif
@@ -376,7 +376,7 @@ void
glm_mat4_mulN(mat4 * __restrict matrices[], uint32_t len, mat4 dest) { glm_mat4_mulN(mat4 * __restrict matrices[], uint32_t len, mat4 dest) {
uint32_t i; uint32_t i;
#ifdef DEBUG #ifndef NDEBUG
assert(len > 1 && "there must be least 2 matrices to go!"); assert(len > 1 && "there must be least 2 matrices to go!");
#endif #endif
@@ -537,7 +537,7 @@ glm_mat4_transpose_to(mat4 m, mat4 dest) {
} }
/*! /*!
* @brief tranpose mat4 and store result in same matrix * @brief transpose mat4 and store result in same matrix
* *
* @param[in, out] m source and dest * @param[in, out] m source and dest
*/ */

184
include/cglm/mat4x2.h Normal file
View File

@@ -0,0 +1,184 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
/*
Macros:
GLM_MAT4X2_ZERO_INIT
GLM_MAT4X2_ZERO
Functions:
CGLM_INLINE void glm_mat4x2_copy(mat4x2 mat, mat4x2 dest);
CGLM_INLINE void glm_mat4x2_zero(mat4x2 mat);
CGLM_INLINE void glm_mat4x2_make(float * __restrict src, mat4x2 dest);
CGLM_INLINE void glm_mat4x2_mul(mat4x2 m1, mat2x4 m2, mat4 dest);
CGLM_INLINE void glm_mat4x2_mulv(mat4x2 m, vec2 v, vec4 dest);
CGLM_INLINE void glm_mat4x2_transpose(mat4x2 m, mat2x4 dest);
CGLM_INLINE void glm_mat4x2_scale(mat4x2 m, float s);
*/
#ifndef cglm_mat4x2_h
#define cglm_mat4x2_h
#include "common.h"
#define GLM_MAT4X2_ZERO_INIT {{0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 0.0f}}
/* for C only */
#define GLM_MAT4X2_ZERO GLM_MAT4X2_ZERO_INIT
/*!
* @brief copy all members of [mat] to [dest]
*
* @param[in] mat source
* @param[out] dest destination
*/
CGLM_INLINE
void
glm_mat4x2_copy(mat4x2 mat, mat4x2 dest) {
dest[0][0] = mat[0][0];
dest[0][1] = mat[0][1];
dest[1][0] = mat[1][0];
dest[1][1] = mat[1][1];
dest[2][0] = mat[2][0];
dest[2][1] = mat[2][1];
dest[3][0] = mat[3][0];
dest[3][1] = mat[3][1];
}
/*!
* @brief make given matrix zero.
*
* @param[in, out] mat matrix
*/
CGLM_INLINE
void
glm_mat4x2_zero(mat4x2 mat) {
CGLM_ALIGN_MAT mat4x2 t = GLM_MAT4X2_ZERO_INIT;
glm_mat4x2_copy(t, mat);
}
/*!
* @brief Create mat4x2 matrix from pointer
*
* @param[in] src pointer to an array of floats
* @param[out] dest matrix
*/
CGLM_INLINE
void
glm_mat4x2_make(float * __restrict src, mat4x2 dest) {
dest[0][0] = src[0];
dest[0][1] = src[1];
dest[1][0] = src[2];
dest[1][1] = src[3];
dest[2][0] = src[4];
dest[2][1] = src[5];
dest[3][0] = src[6];
dest[3][1] = src[7];
}
/*!
* @brief multiply m1 and m2 to dest
*
* @code
* glm_mat4x2_mul(mat4x2, mat2x4, mat4);
* @endcode
*
* @param[in] m1 left matrix (mat4x2)
* @param[in] m2 right matrix (mat2x4)
* @param[out] dest destination matrix (mat4)
*/
CGLM_INLINE
void
glm_mat4x2_mul(mat4x2 m1, mat2x4 m2, mat4 dest) {
float a00 = m1[0][0], a01 = m1[0][1],
a10 = m1[1][0], a11 = m1[1][1],
a20 = m1[2][0], a21 = m1[2][1],
a30 = m1[3][0], a31 = m1[3][1],
b00 = m2[0][0], b01 = m2[0][1], b02 = m2[0][2], b03 = m2[0][3],
b10 = m2[1][0], b11 = m2[1][1], b12 = m2[1][2], b13 = m2[1][3];
dest[0][0] = a00 * b00 + a01 * b10;
dest[0][1] = a00 * b01 + a01 * b11;
dest[0][2] = a00 * b02 + a01 * b12;
dest[0][3] = a00 * b03 + a01 * b13;
dest[1][0] = a10 * b00 + a11 * b10;
dest[1][1] = a10 * b01 + a11 * b11;
dest[1][2] = a10 * b02 + a11 * b12;
dest[1][3] = a10 * b03 + a11 * b13;
dest[2][0] = a20 * b00 + a21 * b10;
dest[2][1] = a20 * b01 + a21 * b11;
dest[2][2] = a20 * b02 + a21 * b12;
dest[2][3] = a20 * b03 + a21 * b13;
dest[3][0] = a30 * b00 + a31 * b10;
dest[3][1] = a30 * b01 + a31 * b11;
dest[3][2] = a30 * b02 + a31 * b12;
dest[3][3] = a30 * b03 + a31 * b13;
}
/*!
* @brief multiply matrix with column vector and store in dest vector
*
* @param[in] m matrix (left)
* @param[in] v vector (right, column vector)
* @param[out] dest result vector
*/
CGLM_INLINE
void
glm_mat4x2_mulv(mat4x2 m, vec2 v, vec4 dest) {
float v0 = v[0], v1 = v[1];
dest[0] = m[0][0] * v0 + m[0][1] * v1;
dest[1] = m[1][0] * v0 + m[1][1] * v1;
dest[2] = m[2][0] * v0 + m[2][1] * v1;
dest[3] = m[3][0] * v0 + m[3][1] * v1;
}
/*!
* @brief transpose matrix and store in dest
*
* @param[in] m matrix
* @param[out] dest result
*/
CGLM_INLINE
void
glm_mat4x2_transpose(mat4x2 m, mat2x4 dest) {
dest[0][0] = m[0][0];
dest[0][1] = m[1][0];
dest[0][2] = m[2][0];
dest[0][3] = m[3][0];
dest[1][0] = m[0][1];
dest[1][1] = m[1][1];
dest[1][2] = m[2][1];
dest[1][3] = m[3][1];
}
/*!
* @brief scale (multiply with scalar) matrix
*
* multiply matrix with scalar
*
* @param[in, out] m matrix
* @param[in] s scalar
*/
CGLM_INLINE
void
glm_mat4x2_scale(mat4x2 m, float s) {
m[0][0] *= s; m[0][1] *= s; m[1][0] *= s; m[1][1] *= s;
m[2][0] *= s; m[2][1] *= s; m[3][0] *= s; m[3][1] *= s;
}
#endif

201
include/cglm/mat4x3.h Normal file
View File

@@ -0,0 +1,201 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
/*
Macros:
GLM_MAT4X3_ZERO_INIT
GLM_MAT4X3_ZERO
Functions:
CGLM_INLINE void glm_mat4x3_copy(mat4x3 mat, mat4x3 dest);
CGLM_INLINE void glm_mat4x3_zero(mat4x3 mat);
CGLM_INLINE void glm_mat4x3_make(float * __restrict src, mat4x3 dest);
CGLM_INLINE void glm_mat4x3_mul(mat4x3 m1, mat3x4 m2, mat4 dest);
CGLM_INLINE void glm_mat4x3_mulv(mat4x3 m, vec3 v, vec4 dest);
CGLM_INLINE void glm_mat4x3_transpose(mat4x3 m, mat3x4 dest);
CGLM_INLINE void glm_mat4x3_scale(mat4x3 m, float s);
*/
#ifndef cglm_mat4x3_h
#define cglm_mat4x3_h
#include "common.h"
#define GLM_MAT4X3_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}}
/* for C only */
#define GLM_MAT4X3_ZERO GLM_MAT4X3_ZERO_INIT
/*!
* @brief copy all members of [mat] to [dest]
*
* @param[in] mat source
* @param[out] dest destination
*/
CGLM_INLINE
void
glm_mat4x3_copy(mat4x3 mat, mat4x3 dest) {
dest[0][0] = mat[0][0];
dest[0][1] = mat[0][1];
dest[0][2] = mat[0][2];
dest[1][0] = mat[1][0];
dest[1][1] = mat[1][1];
dest[1][2] = mat[1][2];
dest[2][0] = mat[2][0];
dest[2][1] = mat[2][1];
dest[2][2] = mat[2][2];
dest[3][0] = mat[3][0];
dest[3][1] = mat[3][1];
dest[3][2] = mat[3][2];
}
/*!
* @brief make given matrix zero.
*
* @param[in, out] mat matrix
*/
CGLM_INLINE
void
glm_mat4x3_zero(mat4x3 mat) {
CGLM_ALIGN_MAT mat4x3 t = GLM_MAT4X3_ZERO_INIT;
glm_mat4x3_copy(t, mat);
}
/*!
* @brief Create mat4x3 matrix from pointer
*
* @param[in] src pointer to an array of floats
* @param[out] dest matrix
*/
CGLM_INLINE
void
glm_mat4x3_make(float * __restrict src, mat4x3 dest) {
dest[0][0] = src[0];
dest[0][1] = src[1];
dest[0][2] = src[2];
dest[1][0] = src[3];
dest[1][1] = src[4];
dest[1][2] = src[5];
dest[2][0] = src[6];
dest[2][1] = src[7];
dest[2][2] = src[8];
dest[3][0] = src[9];
dest[3][1] = src[10];
dest[3][2] = src[11];
}
/*!
* @brief multiply m1 and m2 to dest
*
* @code
* glm_mat4x3_mul(mat4x3, mat3x4, mat4);
* @endcode
*
* @param[in] m1 left matrix (mat4x3)
* @param[in] m2 right matrix (mat3x4)
* @param[out] dest destination matrix (mat4)
*/
CGLM_INLINE
void
glm_mat4x3_mul(mat4x3 m1, mat3x4 m2, mat4 dest) {
float a00 = m1[0][0], a01 = m1[0][1], a02 = m1[0][2],
a10 = m1[1][0], a11 = m1[1][1], a12 = m1[1][2],
a20 = m1[2][0], a21 = m1[2][1], a22 = m1[2][2],
a30 = m1[3][0], a31 = m1[3][1], a32 = m1[3][2],
b00 = m2[0][0], b01 = m2[0][1], b02 = m2[0][2], b03 = m2[0][3],
b10 = m2[1][0], b11 = m2[1][1], b12 = m2[1][2], b13 = m2[1][3],
b20 = m2[2][0], b21 = m2[2][1], b22 = m2[2][2], b23 = m2[2][3];
dest[0][0] = a00 * b00 + a01 * b10 + a02 * b20;
dest[0][1] = a00 * b01 + a01 * b11 + a02 * b21;
dest[0][2] = a00 * b02 + a01 * b12 + a02 * b22;
dest[0][3] = a00 * b03 + a01 * b13 + a02 * b23;
dest[1][0] = a10 * b00 + a11 * b10 + a12 * b20;
dest[1][1] = a10 * b01 + a11 * b11 + a12 * b21;
dest[1][2] = a10 * b02 + a11 * b12 + a12 * b22;
dest[1][3] = a10 * b03 + a11 * b13 + a12 * b23;
dest[2][0] = a20 * b00 + a21 * b10 + a22 * b20;
dest[2][1] = a20 * b01 + a21 * b11 + a22 * b21;
dest[2][2] = a20 * b02 + a21 * b12 + a22 * b22;
dest[2][3] = a20 * b03 + a21 * b13 + a22 * b23;
dest[3][0] = a30 * b00 + a31 * b10 + a32 * b20;
dest[3][1] = a30 * b01 + a31 * b11 + a32 * b21;
dest[3][2] = a30 * b02 + a31 * b12 + a32 * b22;
dest[3][3] = a30 * b03 + a31 * b13 + a32 * b23;
}
/*!
* @brief multiply matrix with column vector and store in dest vector
*
* @param[in] m matrix (left)
* @param[in] v vector (right, column vector)
* @param[out] dest result vector
*/
CGLM_INLINE
void
glm_mat4x3_mulv(mat4x3 m, vec3 v, vec4 dest) {
float v0 = v[0], v1 = v[1], v2 = v[2];
dest[0] = m[0][0] * v0 + m[0][1] * v1 + m[0][2] * v2;
dest[1] = m[1][0] * v0 + m[1][1] * v1 + m[1][2] * v2;
dest[2] = m[2][0] * v0 + m[2][1] * v1 + m[2][2] * v2;
dest[3] = m[3][0] * v0 + m[3][1] * v1 + m[3][2] * v2;
}
/*!
* @brief transpose matrix and store in dest
*
* @param[in] m matrix
* @param[out] dest result
*/
CGLM_INLINE
void
glm_mat4x3_transpose(mat4x3 m, mat3x4 dest) {
dest[0][0] = m[0][0];
dest[0][1] = m[1][0];
dest[0][2] = m[2][0];
dest[0][3] = m[3][0];
dest[1][0] = m[0][1];
dest[1][1] = m[1][1];
dest[1][2] = m[2][1];
dest[1][3] = m[3][1];
dest[2][0] = m[0][2];
dest[2][1] = m[1][2];
dest[2][2] = m[2][2];
dest[2][3] = m[3][2];
}
/*!
* @brief scale (multiply with scalar) matrix
*
* multiply matrix with scalar
*
* @param[in, out] m matrix
* @param[in] s scalar
*/
CGLM_INLINE
void
glm_mat4x3_scale(mat4x3 m, float s) {
m[0][0] *= s; m[0][1] *= s; m[0][2] *= s; m[1][0] *= s;
m[1][1] *= s; m[1][2] *= s; m[2][0] *= s; m[2][1] *= s;
m[2][2] *= s; m[3][0] *= s; m[3][1] *= s; m[3][2] *= s;
}
#endif

View File

@@ -258,7 +258,7 @@ glm_quat_normalize_to(versor q, versor dest) {
} }
glmm_store(dest, wasm_f32x4_div(x0, wasm_f32x4_sqrt(xdot))); glmm_store(dest, wasm_f32x4_div(x0, wasm_f32x4_sqrt(xdot)));
#elif defined( __SSE2__ ) || defined( __SSE2__ ) #elif defined( __SSE__ ) || defined( __SSE2__ )
__m128 xdot, x0; __m128 xdot, x0;
float dot; float dot;
@@ -703,7 +703,7 @@ glm_quat_nlerp(versor from, versor to, float t, versor dest) {
* *
* @param[in] from from * @param[in] from from
* @param[in] to to * @param[in] to to
* @param[in] t amout * @param[in] t amount
* @param[out] dest result quaternion * @param[out] dest result quaternion
*/ */
CGLM_INLINE CGLM_INLINE

View File

@@ -56,11 +56,9 @@ glmm_float32x4_init(float x, float y, float z, float w) {
#define glmm_float32x4_SIGNMASK_NPNP glmm_float32x4_init(-0.f, 0.f, -0.f, 0.f) #define glmm_float32x4_SIGNMASK_NPNP glmm_float32x4_init(-0.f, 0.f, -0.f, 0.f)
#define glmm_float32x4_SIGNMASK_NPPN glmm_float32x4_init(-0.f, 0.f, 0.f, -0.f) #define glmm_float32x4_SIGNMASK_NPPN glmm_float32x4_init(-0.f, 0.f, 0.f, -0.f)
static inline static inline float32x4_t glmm_abs(float32x4_t v) { return vabsq_f32(v); }
float32x4_t static inline float32x4_t glmm_min(float32x4_t a, float32x4_t b) { return vminq_f32(a, b); }
glmm_abs(float32x4_t v) { static inline float32x4_t glmm_max(float32x4_t a, float32x4_t b) { return vmaxq_f32(a, b); }
return vabsq_f32(v);
}
static inline static inline
float32x4_t float32x4_t
@@ -174,11 +172,7 @@ glmm_fnmadd(float32x4_t a, float32x4_t b, float32x4_t c) {
static inline static inline
float32x4_t float32x4_t
glmm_fmsub(float32x4_t a, float32x4_t b, float32x4_t c) { glmm_fmsub(float32x4_t a, float32x4_t b, float32x4_t c) {
#if CGLM_ARM64 return glmm_fmadd(a, b, vnegq_f32(c));
return vfmsq_f32(c, a, b);
#else
return vmlsq_f32(c, a, b);
#endif
} }
static inline static inline

View File

@@ -63,7 +63,7 @@
#endif #endif
/* ARM Neon */ /* ARM Neon */
#if defined(_WIN32) #if defined(_WIN32) && defined(_MSC_VER)
/* TODO: non-ARM stuff already inported, will this be better option */ /* TODO: non-ARM stuff already inported, will this be better option */
/* # include <intrin.h> */ /* # include <intrin.h> */

View File

@@ -36,11 +36,9 @@
#define glmm_float32x4_SIGNMASK_NPPN GLMM__SIGNMASKf(GLMM_NEGZEROf, 0, 0, GLMM_NEGZEROf) #define glmm_float32x4_SIGNMASK_NPPN GLMM__SIGNMASKf(GLMM_NEGZEROf, 0, 0, GLMM_NEGZEROf)
#define glmm_float32x4_SIGNMASK_NEG wasm_i32x4_const_splat(GLMM_NEGZEROf) #define glmm_float32x4_SIGNMASK_NEG wasm_i32x4_const_splat(GLMM_NEGZEROf)
static inline static inline glmm_128 glmm_abs(glmm_128 x) { return wasm_f32x4_abs(x); }
glmm_128 static inline glmm_128 glmm_min(glmm_128 a, glmm_128 b) { return wasm_f32x4_pmin(b, a); }
glmm_abs(glmm_128 x) { static inline glmm_128 glmm_max(glmm_128 a, glmm_128 b) { return wasm_f32x4_pmax(b, a); }
return wasm_f32x4_abs(x);
}
static inline static inline
glmm_128 glmm_128

View File

@@ -74,6 +74,9 @@ glmm_abs(__m128 x) {
return _mm_andnot_ps(glmm_float32x4_SIGNMASK_NEG, x); return _mm_andnot_ps(glmm_float32x4_SIGNMASK_NEG, x);
} }
static inline __m128 glmm_min(__m128 a, __m128 b) { return _mm_min_ps(a, b); }
static inline __m128 glmm_max(__m128 a, __m128 b) { return _mm_max_ps(a, b); }
static inline static inline
__m128 __m128
glmm_vhadd(__m128 v) { glmm_vhadd(__m128 v) {

View File

@@ -16,9 +16,18 @@ extern "C" {
#include "struct/vec2.h" #include "struct/vec2.h"
#include "struct/vec3.h" #include "struct/vec3.h"
#include "struct/vec4.h" #include "struct/vec4.h"
#include "struct/ivec2.h"
#include "struct/ivec3.h"
#include "struct/ivec4.h"
#include "struct/mat2.h" #include "struct/mat2.h"
#include "struct/mat2x3.h"
#include "struct/mat2x4.h"
#include "struct/mat3.h" #include "struct/mat3.h"
#include "struct/mat3x2.h"
#include "struct/mat3x4.h"
#include "struct/mat4.h" #include "struct/mat4.h"
#include "struct/mat4x2.h"
#include "struct/mat4x3.h"
#include "struct/affine.h" #include "struct/affine.h"
#include "struct/frustum.h" #include "struct/frustum.h"
#include "struct/plane.h" #include "struct/plane.h"

Some files were not shown because too many files have changed in this diff Show More