Compare commits

...

445 Commits

Author SHA1 Message Date
Recep Aslantas
83d5b2c973 docs: add infinite perspective 2026-02-10 22:59:46 +03:00
Recep Aslantas
7e1bdd0676 Merge pull request #489 from Lephar/master
Implement infinite perspective projection matrix creation functions
2026-02-10 22:45:21 +03:00
Ali Emre Gülcü
0dc17e5d47 Implement default infinite perspective projection matrix creation functions 2026-02-10 16:35:50 +03:00
Ali Emre Gülcü
d6c6b4c542 Implement infinite perspective projection matrix creation functions 2026-02-10 12:30:11 +03:00
Recep Aslantas
0356534c0c Merge pull request #488 from lesleyrs/wextra
fix -ffast-math with -Wextra warnings
2026-01-31 14:44:49 +03:00
lesleyrs
5ff0d80c85 fix -ffast-math with -Wextra warnings 2026-01-22 16:09:11 +01:00
Recep Aslantas
1952042f2c Merge pull request #487 from tayoky/master
add glm_vecx_swap functions
2025-11-19 23:44:21 +03:00
tayoky
3aad5823ca add glm_vecx_swap functions 2025-11-15 10:39:14 +01:00
Recep Aslantas
da957fa421 Merge pull request #483 from Lephar/master
Add missing glmc_perspective_resize_**_**() call/clipspace functions
2025-11-08 17:41:00 +03:00
Ali Emre Gülcü
47e5d48749 Add missing glmc_perspective_resize_**_**() call/clipspace functions 2025-11-05 09:56:28 +03:00
Recep Aslantas
a4602f2d5f Merge pull request #478 from fd00/fix-make
Fix `make` on `srcdir != builddir`
2025-06-18 17:44:56 +03:00
Daisuke Fujimura (fd0)
6af4e0d565 Fix make on srcdir != builddir 2025-06-18 20:55:40 +09:00
Recep Aslantas
a311dbfe4c Merge pull request #476 from aganm/double-promotion
Fix double-promotion warnings in tests
2025-05-13 12:33:55 +03:00
Michael Aganier
a761088e15 Fix double-promotion warnings in tests 2025-05-12 17:38:21 -04:00
Recep Aslantas
a886d6e170 Merge pull request #471 from under-view/feature/mat3-tables
mat3: add tables to docs & fix comments
2025-04-24 16:07:51 +03:00
Recep Aslantas
1a8b105ce6 Merge pull request #472 from under-view/mat2-docs-cleanup
mat2: docs cleanup
2025-04-24 16:07:31 +03:00
Vincent Davis Jr
ec5f8074c4 mat2: docs cleanup
Signed-off-by: Vincent Davis Jr <vince@underview.tech>
2025-04-17 18:08:50 -04:00
Vincent Davis Jr
6f5fde8b52 mat3: add tables to docs & fix comments
Signed-off-by: Vincent Davis Jr <vince@underview.tech>
2025-04-17 14:22:00 -04:00
Recep Aslantas
9da4e78c2e Merge pull request #469 from under-view/feature/mat2-tables
mat2: add tables to docs & fix comments
2025-04-11 17:14:17 +03:00
Vincent Davis Jr
27a3ddc928 gitignore: ignore vim swp files
Signed-off-by: Vincent Davis Jr <vince@underview.tech>
2025-04-11 00:13:55 -04:00
Vincent Davis Jr
5d530cd8e0 mat2: add tables to docs & fix comments
Signed-off-by: Vincent Davis Jr <vince@underview.tech>
2025-04-11 00:13:54 -04:00
Vincent Davis Jr
dde053a295 mat2x3[docs]: fix glm_mat2x3_zero parameters
Signed-off-by: Vincent Davis Jr <vince@underview.tech>
2025-04-05 09:58:49 -04:00
Recep Aslantas
2128235d42 Merge pull request #467 from recp/textrans
build texture transform matrix helper
2025-04-05 13:52:15 +03:00
Recep Aslantas
9fb418bcac Update include/cglm/mat3.h
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-04-05 13:36:12 +03:00
Recep Aslantas
5fde20d65c build texture transform matrix helper 2025-04-05 13:32:47 +03:00
Recep Aslantas
ebc65782f8 Merge pull request #466 from recp/integration_1 2025-04-05 06:32:01 +03:00
Recep Aslantas
1bd04c819b some apple simd framework integration helpers 2025-04-04 23:02:12 +03:00
Recep Aslantas
8560da0e70 define __cglm__ to publish cglm availability universally
in this way we wont need to check arbitrary header check e.g. cglm_common_h
2025-04-04 23:01:55 +03:00
Recep Aslantas
ed7a658637 Merge pull request #465 from under-view/feature/mat4x3-tables
mat4x3: add tables to docs & fix comments
2025-04-04 22:57:01 +03:00
Recep Aslantas
bcc475e2b7 Merge pull request #464 from under-view/feature/mat4x2-tables
mat4x2: add tables to docs & fix comments
2025-04-04 22:56:30 +03:00
Vincent Davis Jr
bdca98ba48 mat4x2: add tables to docs & fix comments
Signed-off-by: Vincent Davis Jr <vince@underview.tech>
2025-04-04 13:29:10 -04:00
Vincent Davis Jr
b33e29d50f mat4x3: add tables to docs & fix comments
Signed-off-by: Vincent Davis Jr <vince@underview.tech>
2025-04-04 13:22:27 -04:00
Vincent Davis Jr
4b3e9bb779 mat3x2: fix scale comment
Signed-off-by: Vincent Davis Jr <vince@underview.tech>
2025-04-04 11:04:44 -04:00
Recep Aslantas
214842db27 Merge pull request #462 from under-view/feature/mat3x4-tables
mat3x4: add tables to docs & fix comments
2025-04-03 21:42:27 +03:00
Recep Aslantas
60e4d6c188 Merge pull request #461 from under-view/feature/mat3x2-tables
mat3x2: add tables to docs & fix comments
2025-04-03 21:41:44 +03:00
Recep Aslantas
5063d4b2b0 Merge pull request #460 from under-view/feature/mat2x4-tables
mat2x4: add tables to docs & fix comments
2025-04-03 21:40:57 +03:00
Recep Aslantas
a16bc2ae4a Merge pull request #459 from under-view/feature/mat2x3-tables
mat2x3: add tables to docs & fix comments
2025-04-03 21:38:32 +03:00
Vincent Davis Jr
b694c97204 mat2x4: add tables to docs & fix comments
Signed-off-by: Vincent Davis Jr <vince@underview.tech>
2025-04-03 11:30:34 -04:00
Vincent Davis Jr
4791fe3f24 mat3x4: add tables to docs & fix comments
Signed-off-by: Vincent Davis Jr <vince@underview.tech>
2025-04-03 11:27:00 -04:00
Vincent Davis Jr
b64067a94d mat3x2: add tables to docs & fix comments
Signed-off-by: Vincent Davis Jr <vince@underview.tech>
2025-04-03 01:22:55 -04:00
Vincent Davis Jr
43363e8c43 mat2x3: add tables to docs & fix comments
Signed-off-by: Vincent Davis Jr <vince@underview.tech>
2025-04-02 19:59:20 -04:00
Recep Aslantas
f3094cdc65 add missing almm_*_set1() to arm and wasm 2025-03-19 23:28:58 +03:00
Recep Aslantas
a7bd64952e Update .gitignore 2025-03-19 23:28:26 +03:00
Recep Aslantas
4141298161 Merge pull request #452 from RolandMarchand/add-tau-constants
Added Tau constant definitions to types.h
2025-03-19 17:27:45 +03:00
Recep Aslantas
05979281ac Merge pull request #457 from MarcinKonowalczyk/typo
Typo
2025-03-19 17:24:56 +03:00
Recep Aslantas
4b3dcceb9d Merge pull request #456 from MarcinKonowalczyk/w-conversion
Add -Wconversion
2025-03-19 17:22:55 +03:00
Marcin
cfb8cd9447 more mat4's 2025-03-18 14:17:35 +00:00
Marcin
8d01d1d135 mat4 in docs 2025-03-18 14:14:37 +00:00
Marcin
c6caddc75e frand48 2025-03-18 13:30:59 +00:00
Marcin
8b810c2280 -Wconversion 2025-03-18 13:25:32 +00:00
Marcin
fd3b21f5d7 newline 2025-03-18 13:24:28 +00:00
Marcin
c1ea9e7a69 -Wextra and -Wpedantic 2025-03-18 13:24:23 +00:00
Roland Marchand
44b5952ec3 Added Tau constant definitions to types.h 2025-03-11 08:05:51 -04:00
Recep Aslantas
6e2976d415 Merge pull request #450 from ATMI/affine2d-post
Added 2D Post Transformations
2025-02-22 14:49:35 +03:00
Artemii Miasoedov
9a7f52202d Fixed broken formatting in test_common.c 2025-02-16 15:55:40 +03:00
Artemii Miasoedov
e96b6a382d Added tests for 2D affine post transformations (translate, rotate, scale) 2025-02-16 15:50:53 +03:00
Artemii Miasoedov
091c475422 Implemented 2D affine post transformations (translate, rotate, scale) 2025-02-16 14:39:10 +03:00
Recep Aslantas
144d1e7c29 build: add missing call/aabb2d.h 2025-02-13 22:35:16 +03:00
Recep Aslantas
643700c05e now working on v0.9.6 2025-02-13 12:25:10 +03:00
Recep Aslantas
fb4eac2ee0 Merge pull request #413 from recp/optimize-inv
WIP: More Optimizations and SIMD fixes for MSVC & ARM
2025-02-12 23:08:07 +03:00
Recep Aslantas
4d0a0a7025 Update wasm.h 2025-02-09 15:30:49 +03:00
Recep Aslantas
a88d32c776 Merge branch 'master' into optimize-inv 2025-02-09 15:13:28 +03:00
Recep Aslantas
3bfd31af99 build, win: add missing files 2025-02-09 15:01:55 +03:00
Recep Aslantas
3ee809b9b3 Merge pull request #444 from wethu/wethu-docs-minor-fix-example-numbering
Fix numbering - opengl matrix uniform examples (docs)
2025-01-30 23:10:03 +03:00
Ellis
8cdf496baf Fix numbering 2025-01-30 21:39:17 +10:00
Recep Aslantas
d42bff7773 Update ci.yml 2025-01-25 11:53:27 +03:00
Recep Aslantas
365d43bef4 Update ci.yml 2025-01-25 11:47:32 +03:00
Recep Aslantas
5770fdb336 ci: add arm builds 2025-01-25 11:08:06 +03:00
Recep Aslantas
042d84f058 ci: add arm builds 2025-01-25 10:58:48 +03:00
Recep Aslantas
70a1a946ee arm: use glmm_div where possible to fix ARMv7 <-> ARM64 2025-01-24 22:21:11 +03:00
Recep Aslantas
8ca1f19aa2 arm: use glmm_div where possible to fix ARMv7 <-> ARM64 2025-01-24 22:20:57 +03:00
Recep Aslantas
adb3ac18c0 Merge branch 'master' into optimize-inv 2025-01-24 16:04:49 +03:00
Recep Aslantas
441f2657ab suppress param-name warns 2025-01-24 11:20:49 +03:00
Recep Aslantas
9b660e8bd0 Update cmake-wasm.yml 2025-01-23 14:10:04 +03:00
Recep Aslantas
40a2aca7ec Update cmake-wasm.yml 2025-01-23 13:55:14 +03:00
Recep Aslantas
a48fa8be65 Update cmake-wasm.yml 2025-01-23 13:54:37 +03:00
Recep Aslantas
2f36faa70a Update cmake-wasm.yml 2025-01-23 13:45:19 +03:00
Recep Aslantas
36f59b7b6c Update cmake-wasm.yml 2025-01-23 13:39:30 +03:00
Recep Aslantas
f4993318d2 Update ci.yml 2025-01-23 13:04:37 +03:00
Recep Aslantas
5672370e31 Update ci.yml 2025-01-23 12:49:52 +03:00
Recep Aslantas
ae1b9a3982 Update ci.yml 2025-01-23 12:44:04 +03:00
Recep Aslantas
a18d9c28e7 Update ci.yml 2025-01-23 12:41:08 +03:00
Recep Aslantas
fc91f95bb2 Merge branch 'master' of https://github.com/recp/cglm 2025-01-23 12:24:49 +03:00
Recep Aslantas
39052494a2 Revert "Update ci.yml"
This reverts commit 488f782704.
2025-01-23 12:22:27 +03:00
Recep Aslantas
488f782704 Update ci.yml
Update ci.yml

Update ci.yml
2025-01-23 12:22:09 +03:00
Recep Aslantas
814c354337 Update ci.yml 2025-01-23 12:18:12 +03:00
Recep Aslantas
1ad56f0e94 Update ci.yml 2025-01-23 12:16:07 +03:00
Recep Aslantas
cc54ad3f92 Update ci.yml 2025-01-23 12:15:22 +03:00
Recep Aslantas
3971ef8ef1 Update ci.yml 2025-01-23 01:09:20 +03:00
Recep Aslantas
b4a3ed32d9 Update ci.yml 2025-01-23 01:07:32 +03:00
Recep Aslantas
eb37a28ff5 Update ci.yml 2025-01-23 00:58:02 +03:00
Recep Aslantas
925f9c1d1a Update ci.yml 2025-01-23 00:50:36 +03:00
Recep Aslantas
9f74fd9597 Update ci.yml 2025-01-23 00:44:12 +03:00
Recep Aslantas
99937807cf Update ci.yml 2025-01-23 00:19:52 +03:00
Recep Aslantas
cc79b440e7 Update ci.yml 2025-01-23 00:13:59 +03:00
Recep Aslantas
e161c4d0a7 Update ci.yml 2025-01-23 00:06:00 +03:00
Recep Aslantas
e8c791e91e Merge pull request #441 from MarcinKonowalczyk/perlin
Implement Perlin noise
2025-01-22 23:23:03 +03:00
Recep Aslantas
241b751d8c build, autotools: add missing file 2025-01-22 23:17:23 +03:00
Marcin
dfc9969f85 vectorise fades
fix fade for vec2
2025-01-22 16:49:27 +00:00
Marcin
2b4aef2a29 glm__noiseDetail_fade_vec2 arg restrict 2025-01-22 16:49:26 +00:00
Marcin
fd0131734f fix granNorm arg order 2025-01-22 16:49:26 +00:00
Marcin
9cfa40f423 glm__noiseDetail_taylorInvSqrt 2025-01-22 16:49:26 +00:00
Marcin
b79347eb13 vdivq_f32 2025-01-22 16:49:26 +00:00
Marcin
450d747867 1/7 patch 2025-01-22 14:40:18 +00:00
Recep Aslantas
26e174db46 Merge pull request #442 from duarm/master
Rename struct/aabb2d.h functions to match aabb2d.h, add tests
2025-01-21 10:00:12 +03:00
Recep Aslantas
e605c1d585 Update aabb2d.h 2025-01-21 09:59:48 +03:00
duarm
f815918a74 rename struct/aabb2d.h functions to match aabb2d.h, add tests 2025-01-20 13:29:21 -03:00
Marcin
948642ff33 _glm_ -> glm__ for internal macros 2025-01-20 14:09:05 +00:00
Marcin
23c0f5f660 couple more // comments 2025-01-18 20:11:00 +00:00
Marcin
d3ad1645fc purged // comments in noise.h 2025-01-18 20:11:00 +00:00
Marcin
fa7bc07ae9 changed noiseDetail to #defines
_glm_noiseDetail_mod289
_glm_noiseDetail_permute
_glm_noiseDetail_fade_vec4
_glm_noiseDetail_fade_vec3
_glm_noiseDetail_fade_vec2
_glm_noiseDetail_taylorInvSqrt
_glm_noiseDetail_gradNorm_vec4
_glm_noiseDetail_gradNorm_vec3
_glm_noiseDetail_gradNorm_vec2
_glm_noiseDetail_i2gxyzw
_glm_noiseDetail_i2gxyz
_glm_noiseDetail_i2gxy
2025-01-18 20:11:00 +00:00
Marcin
f32f18a373 sets -> fill 2025-01-18 20:10:59 +00:00
Marcin
082f1878dd glms_vec2_mods doc 2025-01-18 20:10:59 +00:00
Marcin
4b0e7dadd6 vec2 swizzle 2025-01-18 20:10:59 +00:00
Marcin
b45bf1d571 switch deprecation in cglm/call.h to #define 2025-01-18 20:10:59 +00:00
Marcin
8493a6c0d3 fix cglm_vec3/4_swizzle 2025-01-18 20:10:59 +00:00
Marcin
f50736aee7 vec2_step test 2025-01-18 20:10:59 +00:00
Marcin
6bc980f3d9 add missing vec2 step 2025-01-18 20:10:59 +00:00
Marcin
5cffcf74c4 missing glmc_vec2_stepr 2025-01-18 20:10:58 +00:00
Marcin
fb469c779d missing doc 2025-01-18 20:10:58 +00:00
Marcin
8e69157052 missing vec4 steps and stepr 2025-01-18 20:10:58 +00:00
Marcin
6c0e3e9460 deprecate step_uni in favour of steps
This seems to be the newer naming system
2025-01-18 20:10:58 +00:00
Marcin
4ca0c536af steps and stepr test 2025-01-18 20:10:58 +00:00
Marcin
9a1206f3f1 steps and stepr boilerplate 2025-01-18 20:10:58 +00:00
Marcin
c2ebef3867 change steps -> stepr and move to ext 2025-01-18 20:10:57 +00:00
Marcin
0e0eff71ce correct vec4_mods doc 2025-01-18 20:10:57 +00:00
Marcin
6620adcc16 fix invalid types in vec2_frac/floor 2025-01-18 20:10:57 +00:00
Marcin
a986a4d741 add missing floor tests 2025-01-18 20:10:57 +00:00
Marcin
32e7d5cceb mods test 2025-01-18 20:10:57 +00:00
Marcin
e14c730d5c mods boilerplate 2025-01-18 20:10:57 +00:00
Marcin
fbf0014c82 missing vec4_floor doc 2025-01-18 20:10:56 +00:00
Marcin
0483362f5c move mods to ext 2025-01-18 20:10:56 +00:00
Marcin
35af0c04fe remove extra spaces from vec3.h and vec4.h 2025-01-18 13:19:29 +00:00
Marcin
66d51e5771 double spaces in other files 2025-01-18 13:19:29 +00:00
Marcin
5a3a16d9ad double spaces in noise.h 2025-01-18 13:19:29 +00:00
Marcin
651ad8ca32 vec2-ext docs 2025-01-18 12:57:33 +00:00
Marcin
b1192c8638 vec3-ext docs 2025-01-18 12:57:33 +00:00
Marcin
eaf2d7314e vec4-ext docs 2025-01-18 12:57:33 +00:00
Marcin
200b0875ba vec2_floor test 2025-01-18 12:57:32 +00:00
Marcin
9a25fab6f0 vec2_floor boilerplate 2025-01-18 12:57:32 +00:00
Marcin
bfaf413a5d vec2_floor impl 2025-01-18 12:57:32 +00:00
Marcin
9594d0cc86 add missing glms_vec2_abs 2025-01-18 12:57:32 +00:00
Marcin
2890472a0b add missing test entry for vec2_abs 2025-01-18 12:57:32 +00:00
Marcin
c48befca37 vec2_fract test 2025-01-18 12:57:32 +00:00
Marcin
3c9eecd0be vec2_fract boilerplate 2025-01-18 12:57:32 +00:00
Marcin
a9fee1b4d7 vec2_fract 2025-01-18 12:57:31 +00:00
Marcin
52753672bb vec4_fract test 2025-01-18 12:57:31 +00:00
Marcin
68215526cf vec4_floor boilerplate 2025-01-18 12:57:31 +00:00
Marcin
c27ef7e93b vec3_floor struct doc 2025-01-18 12:57:31 +00:00
Marcin
2ba561cc92 move vec4_floor to ext 2025-01-18 12:57:31 +00:00
Marcin
e66f2f3df4 vec3_floor test 2025-01-18 12:57:31 +00:00
Marcin
967c9e0a09 vec3_floor boilerplate 2025-01-18 12:57:31 +00:00
Marcin
1637d2cef1 move vec3_floor to ext 2025-01-18 12:57:30 +00:00
Marcin
2acdd1e4d0 fix _glm_noiseDetail_gradNorm_vec2 2025-01-18 12:57:30 +00:00
Marcin
606ecbceaa vac_muls -> vec_scale 2025-01-18 12:57:30 +00:00
Marcin
f1a72241b1 docs 2025-01-17 20:34:47 +00:00
Marcin
9085ed020a glm_perlin_vec2 test 2025-01-17 20:22:00 +00:00
Marcin
1377a94a17 glm_perlin_vec2 boilerplate 2025-01-17 20:21:59 +00:00
Marcin
a98c270eee glm_perlin_vec2 impl 2025-01-17 20:21:59 +00:00
Marcin
83b67baa23 glm_perlin_vec3 docs 2025-01-17 16:40:07 +00:00
Marcin
ae82a493f7 note 2025-01-17 16:38:19 +00:00
Marcin
98ab6fcbe0 glm_perlin_vec3 test 2025-01-17 16:38:19 +00:00
Marcin
f0529646b2 glm_perlin_vec3 boilerplate 2025-01-17 16:38:19 +00:00
Marcin
585a999d79 docs 2025-01-17 16:38:19 +00:00
Marcin
5f241a2daf glm_perlin_vec3 impl 2025-01-17 16:38:19 +00:00
Marcin
fbdc46b205 more doc 2025-01-17 16:38:18 +00:00
Marcin
ae1bee7481 doc 2025-01-17 16:38:18 +00:00
Marcin
a0d8803f76 perlin.h -> noise.h 2025-01-15 14:05:08 +00:00
Marcin
43c9f84c8c test_perlin 2025-01-15 13:35:10 +00:00
Marcin
71a0dc6c35 minor reshuffle 2025-01-15 13:35:10 +00:00
Marcin
5d34a04496 refactor gNorm 2025-01-15 13:35:10 +00:00
Marcin
b54dff0124 minor comment 2025-01-15 13:35:10 +00:00
Marcin
fda5406ac0 unnecessary zero init 2025-01-15 13:35:10 +00:00
Marcin
f19dc13e39 missed bracket 2025-01-15 13:35:09 +00:00
Marcin
f3f75a2727 impl but buggy 2025-01-15 13:35:09 +00:00
Marcin
c3e16a53f4 work in progress 2025-01-15 13:35:09 +00:00
Marcin
8a2fd9cda9 docs boilerplate 2025-01-14 17:34:51 +00:00
Marcin
98f53c750d test boilerplate 2025-01-14 17:32:56 +00:00
Marcin
3e52d90ecb boilerplate 2025-01-14 17:32:46 +00:00
Marcin
a4cd7e008d initial impl 2025-01-14 17:31:35 +00:00
Recep Aslantas
5861c37a93 Merge pull request #437 from master30f/readme-restructure
Restructure and rephrase README
2025-01-08 11:28:30 +03:00
zorby
aae82c1d4a README: Add chapter about alignment 2025-01-04 11:51:43 +01:00
zorby
7e51ed88e8 README: Add Features 2025-01-04 11:23:37 +01:00
zorby
32a05a579b README: Move Struct API chapter 2025-01-04 11:22:52 +01:00
Recep Aslantas
9b67866154 Merge pull request #438 from master30f/file-cleanup
Remove .vscode and .gitmodules
2025-01-03 23:42:41 +03:00
zorby
bab7d7bb12 Add .vscode to .gitignore 2025-01-03 17:09:44 +01:00
zorby
5a207d84bb Remove .gitmodules
See issue #436.
2025-01-03 10:43:47 +01:00
zorby
7783acae10 Remove .vscode
See issue #436.
2025-01-03 10:40:17 +01:00
zorby
9d079d3cc3 Restructure README 2024-12-30 13:50:11 +01:00
Recep Aslantas
054b2df004 vscode: disable formatOnSave 2024-12-03 14:27:06 +03:00
Recep Aslantas
93a2926a13 Merge pull request #430 from nitrix/feat/cmake-3.13
Bump CMake minimum version to 3.13
2024-09-10 14:06:45 +03:00
Alex Belanger
5484259328 Undid the formatting. 2024-09-09 10:35:24 -04:00
Alex Belanger
e930737807 Bump CMake minimum version to 3.13 2024-09-09 10:06:09 -04:00
Recep Aslantas
c12f318fab supress fast-math warns 2024-08-27 13:40:34 +03:00
Recep Aslantas
b0f35203f9 suppress warns 2024-08-27 12:32:58 +03:00
Recep Aslantas
ad009d4e49 doc: improve briefs 2024-08-27 12:29:43 +03:00
Recep Aslantas
2f619cdd6f newlines 2024-08-27 12:22:42 +03:00
Recep Aslantas
33e78ca2ad suppress warns about va-args 2024-08-27 12:13:28 +03:00
Recep Aslantas
f82d570dec take -pedantic into account to validate CGLM_USE_ANONYMOUS_STRUCT 2024-08-27 11:58:34 +03:00
Recep Aslantas
48839a38a1 fix refract 2024-07-15 12:41:23 +03:00
Recep Aslantas
d491108386 Merge pull request #423 from waywardmonkeys/reduce-typo-count
Reduce typo count.
2024-07-15 11:29:42 +03:00
Bruce Mitchener
068f6951b3 Reduce typo count. 2024-07-14 09:10:19 +07:00
Recep Aslantas
ed731f991d Merge pull request #421 from myfreeer/patch-1
mat4: wasm simd128 for glm_mat4_inv
2024-07-03 17:06:53 +03:00
myfreeer
07dc9520a4 mat4: wasm simd128 for glm_mat4_inv
The function `glm_mat4_inv_wasm` has been implemented, but not used in `glm_mat4_inv`. This commit adds a conditional macro to add the case of wasm and simd128 case for calling `glm_mat4_inv_wasm`.
2024-07-03 20:04:50 +08:00
Recep Aslantas
be0defb7ac Merge pull request #420 from not-kaz/master
Fixed 'missing-prototypes' warnings for some vec2 funcs.
2024-06-11 14:52:02 +03:00
Kaz
5b2c37f73b Fixed 'missing-prototypes' warnings for some vec2 funcs.
Using gcc and missing-prototypes flag shows warnings for:
glmc_vec2_fill, glmc_vec2_eq and glmc_vec2_eqv. 
Seems they were not added to call/vec2.h for some reason. This should fix the warnings.
2024-06-09 11:06:18 +02:00
Recep Aslantas
a93a9ef9a2 Merge pull request #416 from telephone001/quat_slerp_longest
added quat_slerp_longest
2024-05-13 17:26:49 +03:00
Recep Aslantas
c5b2afc1c4 Update quat.h 2024-05-13 17:20:28 +03:00
John Choi
cd5ed1f4c4 added quat_slerp_longest 2024-05-10 22:32:25 -05:00
Recep Aslantas
eb3a51e591 win: suppress C4996; use snprintf() instead of sprintf() 2024-04-22 21:33:31 +03:00
Recep Aslantas
44cd0ae4fd avx: optimize avx mat4 scale and mat4 mul 2024-04-13 00:33:57 +03:00
Recep Aslantas
d75467f93f avx: implement transpose with AVX 2024-04-13 00:12:14 +03:00
Recep Aslantas
45c1beff51 simd: fix glmm_set1, glmm_splat 2024-04-12 21:53:20 +03:00
Recep Aslantas
14c567d9d9 sse: drop unused macros: glmm_shuff1x, glmm_shuff2 2024-04-11 21:57:46 +03:00
Recep Aslantas
480e1de048 sse: make use of int domain as default behavior if possible ( compiler may ignore it )
also use AVX's `_mm_permute_ps`for shuffling single vector
2024-04-11 21:57:16 +03:00
Recep Aslantas
de66f0a67f glmm, avx: optimize splat macros 2024-04-10 23:49:18 +03:00
Recep Aslantas
68bdec4510 simd: use glmm_set1() to optimize broadcasting single float 2024-04-10 22:52:53 +03:00
Recep Aslantas
62c0448e25 simd, msvc: ensure required definitions are exist on msvc 2024-04-07 22:48:11 +03:00
Recep Aslantas
4f00ce0e52 sse: reduce some instructions in mat4 inv 2024-04-07 22:33:37 +03:00
Recep Aslantas
a7845ffc44 msvc, simd: fix simd headers for _M_ARM64EC 2024-04-07 00:54:29 +03:00
Recep Aslantas
bd941ed7fb arm, neon: fix neon support on GCC ARM 2024-04-06 14:23:36 +03:00
Recep Aslantas
87350f809b msvc bug: dont align types due to "ARM32 = C2719: formal parameter with requested alignment of 16 won't be aligned." on ARM32/MSVC
until a good solution.
2024-04-06 14:11:46 +03:00
Recep Aslantas
f50a7a7d00 arm, neon: improve glm_mat4_inv_neon 2024-04-06 14:10:13 +03:00
Recep Aslantas
b3308af146 arm: fix glmm_vhadd on ARM32 2024-04-06 14:09:52 +03:00
Recep Aslantas
a94f839d6d Merge branch 'master' into optimize-inv 2024-04-04 00:31:08 +03:00
Recep Aslantas
0ff0e8948f Update mat4.h 2024-04-03 00:05:42 +03:00
Recep Aslantas
5b772d0eb4 neon: mat4_inv, reduce 1mul for two extra 2xor 2024-04-03 00:03:55 +03:00
Recep Aslantas
c528ca1095 neon: mat4_inv remastered 2024-04-02 13:21:49 +03:00
Recep Aslantas
f0e09776d7 arm, neon: optimize glmm_vhadd and add glmm_vdot 2024-04-02 02:36:16 +03:00
Recep Aslantas
da4224ba32 now working on v0.9.5 2024-04-02 00:52:54 +03:00
Recep Aslantas
1796cc5ce2 Merge pull request #412 from recp/sse_only
separate SSE and SSE2
2024-04-01 17:52:06 +03:00
Recep Aslantas
568634a79e tests: dont test isinf == true on fast math 2024-04-01 16:48:58 +03:00
Recep Aslantas
c9c7941a72 tests: dont test isnan on fast math 2024-04-01 14:10:38 +03:00
Recep Aslantas
4e929a81c2 Update x86.h 2024-04-01 13:26:08 +03:00
Recep Aslantas
1d09c41e18 make xor enable in SSEonly + fast math 2024-04-01 13:23:52 +03:00
Recep Aslantas
d8e933b5b1 Update test_project.h 2024-04-01 13:23:22 +03:00
Recep Aslantas
8b15fd51ba common way to identify CGLM_FAST_MATH 2024-04-01 13:23:17 +03:00
Recep Aslantas
9ce0a3b625 tests: disable isnan check for min/max which may not work correctly especially in fast-math environment 2024-04-01 13:22:51 +03:00
Recep Aslantas
00d2e8a4cf suppress warnings 2024-04-01 01:46:25 +03:00
Recep Aslantas
35a12ed033 make SSE2-only features not available in SSE 2024-04-01 00:52:59 +03:00
Recep Aslantas
9ad7dd3fbc Merge pull request #409 from EasyIP2023/feature/expand-content-width
docs: expand wy-nav-content width to edge of screen
2024-03-31 23:44:40 +03:00
Recep Aslantas
28142b5912 Merge pull request #411 from EasyIP2023/bugfix/mat4x3-multiplication
mat4x3: fix multiplication functions
2024-03-31 23:44:00 +03:00
Recep Aslantas
f07d75c680 Merge pull request #410 from EasyIP2023/bugfix/mat4x2-multiplication
mat4x2: fix multiplication functions
2024-03-31 23:43:11 +03:00
Recep Aslantas
17d8b83a38 Merge pull request #408 from EasyIP2023/bugfix/mat3x4-multiplication
mat3x4: fix multiplication functions
2024-03-31 23:41:40 +03:00
Recep Aslantas
32a477ef07 separate SSE and SSE2 2024-03-31 23:35:15 +03:00
Recep Aslantas
e3ed9834a1 Update mat2x3.h 2024-03-31 23:06:50 +03:00
Recep Aslantas
8396bbf0b3 coding style 2024-03-31 23:06:30 +03:00
Vincent Davis Jr
013ac5dd07 docs: mat4x3 account for latest mulitplication changes
This also includes tables to explain how
mat4x3, column vectors, and row vectors are
represented. Also includes how resulting
matrix or vector is formed.

Signed-off-by: Vincent Davis Jr <vince@underview.tech>
2024-03-31 14:43:31 -04:00
Vincent Davis Jr
a0e3d3766f mat4x3: fix multiplication functions
Signed-off-by: Vincent Davis Jr <vince@underview.tech>
2024-03-31 14:43:30 -04:00
Vincent Davis Jr
fc7f0e13fd docs: mat3x4 account for latest mulitplication changes
This also includes tables to explain how
mat3x4, column vectors, and row vectors are
represented. Also includes how resulting
matrix or vector is formed.

Signed-off-by: Vincent Davis Jr <vince@underview.tech>
2024-03-31 13:43:41 -04:00
Vincent Davis Jr
1340b5d512 mat3x4: fix multiplication functions
Signed-off-by: Vincent Davis Jr <vince@underview.tech>
2024-03-31 13:43:39 -04:00
Vincent Davis Jr
85165dd3e3 docs: mat4x2 account for latest mulitplication changes
This also includes tables to explain how
mat4x2, column vectors, and row vectors are
represented. Also includes how resulting
matrix or vector is formed.

Signed-off-by: Vincent Davis Jr <vince@underview.tech>
2024-03-31 13:40:43 -04:00
Vincent Davis Jr
3445f93fbc mat4x2: fix multiplication functions
Signed-off-by: Vincent Davis Jr <vince@underview.tech>
2024-03-31 13:40:41 -04:00
Vincent Davis Jr
d2642eb206 docs: expand wy-nav-content width to edge of screen
RTD theme's default is 800px as max width for the content,
but we have tables with tons of columns, which need the
full width of the view-port.

Comment from yocto project theme_overrides.css

Signed-off-by: Vincent Davis Jr <vince@underview.tech>
2024-03-31 12:22:13 -04:00
Recep Aslantas
929963c6eb Merge pull request #407 from EasyIP2023/bugfix/mat3x2-multiplication
mat3x2: fix multiplication functions
2024-03-31 13:40:58 +03:00
Recep Aslantas
25b33fab6b Merge pull request #405 from EasyIP2023/bugfix/mat2x4-mutli
mat2x4: fix multiplication functions
2024-03-31 13:40:45 +03:00
Recep Aslantas
c9adbaabd7 Merge pull request #403 from EasyIP2023/bugfix/mat2x3-multiplication
mat2x3: fix multiplication functions
2024-03-31 13:36:39 +03:00
Recep Aslantas
b22e8230d0 Merge pull request #406 from recp/I_macro
dont use I macro defined in standard
2024-03-31 13:30:42 +03:00
Recep Aslantas
bf4c5b4e26 dont use I macro defined in standard 2024-03-31 13:24:50 +03:00
Vincent Davis Jr
54dfbc5a28 docs: mat2x4 account for latest mulitplication changes
This also includes tables to explain how
mat2x4, column vectors, and row vectors are
represented. Also includes how resulting
matrix or vector is formed.

Signed-off-by: Vincent Davis Jr <vince@underview.tech>
2024-03-31 00:44:58 -04:00
Vincent Davis Jr
088c66029d docs: mat3x2 account for latest mulitplication changes
This also includes tables to explain how
mat3x2, column vectors, and row vectors are
represented. Also includes how resulting
matrix or vector is formed.

Signed-off-by: Vincent Davis Jr <vince@underview.tech>
2024-03-31 00:39:27 -04:00
Vincent Davis Jr
2283c708c6 mat3x2: fix multiplication functions
Signed-off-by: Vincent Davis Jr <vince@underview.tech>
2024-03-31 00:23:39 -04:00
Vincent Davis Jr
46864ba2f7 mat2x4: fix multiplication functions
Signed-off-by: Vincent Davis Jr <vince@underview.tech>
2024-03-30 22:22:34 -04:00
Vincent Davis Jr
c5dcb93c92 docs: mat2x3 account for latest mulitplication changes
This also includes tables to explain how
mat2x3, column vectors and row vectors are
represented. Also includes how resulting
matrix or vector is formed.

Signed-off-by: Vincent Davis Jr <vince@underview.tech>
2024-03-30 22:08:23 -04:00
Vincent Davis Jr
050bc95264 mat2x3: fix multiplication functions
Signed-off-by: Vincent Davis Jr <vince@underview.tech>
2024-03-30 22:08:19 -04:00
Recep Aslantas
f388df7f3e fix typos 2024-03-31 04:40:42 +03:00
Recep Aslantas
4c872238d9 dont use I macro defined in standard 2024-03-31 04:22:42 +03:00
Recep Aslantas
8366e51b47 optimize mat4 scalar inv 2024-03-29 22:13:23 +03:00
Recep Aslantas
30b4ea80a9 optimize mat3 scalar inv 2024-03-29 20:59:54 +03:00
Recep Aslantas
edfb5e3984 docs: alignment 2024-03-29 08:42:07 +03:00
Recep Aslantas
4d43241a69 docs: add note to enable config where may not work is some environments 2024-03-29 08:21:14 +03:00
Recep Aslantas
1337e9cdfb docs: ray sphere docs improvements 2024-03-29 08:10:56 +03:00
Recep Aslantas
9df36ce005 docs: ray sphere docs improvements 2024-03-29 08:05:10 +03:00
Recep Aslantas
55521ecd61 Merge pull request #402 from nitrix/fix/struct-api-ray-at
Struct API glms_ray_at incorrect dir param.
2024-03-29 07:55:28 +03:00
Recep Aslantas
829b7dddce now working on v0.9.4 2024-03-29 07:53:48 +03:00
Alex Belanger
2fced7181a Struct API glms_ray_at incorrect dir param. 2024-03-28 14:22:39 -04:00
Recep Aslantas
1de373a9bd normalize: norm == 0.0f to norm < FLT_EPSILON, improving handling of very small vectors to prevent instability and overflow 2024-03-25 02:22:46 +03:00
Recep Aslantas
6a7d03bafb suppress warnings 2024-03-25 02:17:03 +03:00
Recep Aslantas
aad5223da0 change signature of refraction to let caller know if refraction occurs or not 2024-03-24 06:31:29 +03:00
Recep Aslantas
707bff021c Merge pull request #399 from recp/ray
Some missing ray functions
2024-03-23 11:26:17 +03:00
Recep Aslantas
e4c38ccc4c docs: update ray sphere intersection brief 2024-03-22 23:49:05 +03:00
Recep Aslantas
ceaa54aef8 tests: test for ray, reflect, refract and faceforward 2024-03-22 23:44:43 +03:00
Recep Aslantas
da57558078 docs for new ray functions 2024-03-22 22:30:22 +03:00
Recep Aslantas
6ad0aca7e0 fix refract 2024-03-22 21:59:10 +03:00
Recep Aslantas
96e415daa4 build: add missing file 2024-03-22 10:42:29 +03:00
Recep Aslantas
3701305c9e suppress warnings 2024-03-22 10:36:28 +03:00
Recep Aslantas
2b78f9ab47 refract 2024-03-22 00:18:55 +03:00
Recep Aslantas
41d1a8b9eb faceforward 2024-03-21 02:21:28 +03:00
Recep Aslantas
8ea2fd1cd1 reflect missing stuff 2024-03-21 02:21:07 +03:00
Recep Aslantas
8c81443f24 reflect 2024-03-21 00:18:02 +03:00
Recep Aslantas
608e7d9c2c Update CREDITS 2024-03-20 07:33:43 +03:00
Recep Aslantas
73a4fc76d7 ray: point along a ray at a parameter t 2024-03-20 07:24:07 +03:00
Recep Aslantas
aa45d081fc ray: ray sphere intersection 2024-03-20 07:22:36 +03:00
Recep Aslantas
f1d4aea69b win: add missing files to vsproj 2024-03-20 07:16:17 +03:00
Recep Aslantas
0ef8ebe84e Merge pull request #397 from recp/affine-docs
clarify some rotation rules
2024-03-20 01:05:18 +03:00
Recep Aslantas
8b6eca29cf docs: clarify some rotation rules 2024-03-19 23:55:42 +03:00
Recep Aslantas
0fbad944c5 Merge pull request #398 from waywardmonkeys/make-const-floats
Allow passing `const float*` to `make` functions.
2024-03-18 16:48:02 +03:00
Bruce Mitchener
182c28faf8 Allow passing const float* to make functions. 2024-03-18 19:49:50 +07:00
Recep Aslantas
995fb2e347 clarify some rotation rules 2024-03-16 00:34:11 +03:00
Recep Aslantas
838c5078b7 Merge pull request #395 from recp/ndebug
Ndebug
2024-03-02 11:15:18 +03:00
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
252 changed files with 20309 additions and 3068 deletions

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

@@ -0,0 +1,645 @@
name: CI
on:
push:
branches: [ "master" ]
pull_request:
branches: [ "master" ]
jobs:
build_autotools:
name: Autotools / ${{ matrix.os }} / ${{ matrix.simd }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
include:
# x86/x64 builds
- { os: macos-13, simd: none }
- { os: macos-13, simd: sse }
- { os: macos-13, simd: sse2 }
- { os: macos-13, simd: sse3 }
- { os: macos-13, simd: sse4 }
- { os: macos-13, simd: avx }
- { os: macos-13, simd: avx2 }
- { os: macos-14, simd: none }
- { os: macos-14, simd: sse }
- { os: macos-14, simd: sse2 }
- { os: macos-14, simd: sse3 }
- { os: macos-14, simd: sse4 }
- { os: macos-14, simd: avx }
- { os: macos-14, simd: avx2 }
- { os: ubuntu-22.04, simd: none }
- { os: ubuntu-22.04, simd: sse }
- { os: ubuntu-22.04, simd: sse2 }
- { os: ubuntu-22.04, simd: sse3 }
- { os: ubuntu-22.04, simd: sse4 }
- { os: ubuntu-22.04, simd: avx }
- { os: ubuntu-22.04, simd: avx2 }
- { os: ubuntu-24.04, simd: none }
- { os: ubuntu-24.04, simd: sse }
- { os: ubuntu-24.04, simd: sse2 }
- { os: ubuntu-24.04, simd: sse3 }
- { os: ubuntu-24.04, simd: sse4 }
- { os: ubuntu-24.04, simd: avx }
- { os: ubuntu-24.04, simd: avx2 }
# ARM64 builds
- { os: ubuntu-latest-arm64, simd: neon }
steps:
- uses: actions/checkout@v4
- name: Install Autotools on macOS
if: runner.os == 'macOS'
run: brew upgrade && brew install autoconf automake libtool
- name: Install Autotools on Ubuntu
if: matrix.os == 'ubuntu-22.04' || matrix.os == 'ubuntu-24.04'
run: sudo apt-get install -y autoconf automake libtool
- name: Set SIMD flags
run: |
if [ "${{ matrix.simd }}" == "none" ]; then
export CFLAGS=""
elif [ "${{ matrix.simd }}" == "sse" ]; then
export CFLAGS="-msse"
elif [ "${{ matrix.simd }}" == "sse2" ]; then
export CFLAGS="-msse2"
elif [ "${{ matrix.simd }}" == "sse3" ]; then
export CFLAGS="-msse3"
elif [ "${{ matrix.simd }}" == "sse4" ]; then
export CFLAGS="-msse4"
elif [ "${{ matrix.simd }}" == "avx" ]; then
export CFLAGS="-mavx"
elif [ "${{ matrix.simd }}" == "avx2" ]; then
export CFLAGS="-mavx2"
elif [ "${{ matrix.simd }}" == "neon" ]; then
export CFLAGS="-mfpu=neon"
fi
- name: Generate Autotools
run: ./autogen.sh
- name: Configure Autotools
run: ./configure CFLAGS="$CFLAGS"
- 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_ubuntu:
name: CMake / ${{ matrix.target.os }} / ${{ matrix.target.cc }} / ${{ matrix.target.arch }} / ${{ matrix.target.simd }}
runs-on: ${{ matrix.target.arch == 'arm64' && 'ubuntu-latest-arm64' || matrix.target.os }}
strategy:
fail-fast: false
matrix:
target:
# GCC 11 builds
- { os: ubuntu-20.04, cc: gcc-11, arch: x64, simd: none }
- { os: ubuntu-20.04, cc: gcc-11, arch: x64, simd: sse }
- { os: ubuntu-20.04, cc: gcc-11, arch: x64, simd: sse2 }
- { os: ubuntu-20.04, cc: gcc-11, arch: x64, simd: sse3 }
- { os: ubuntu-20.04, cc: gcc-11, arch: x64, simd: sse4 }
- { os: ubuntu-20.04, cc: gcc-11, arch: x64, simd: avx }
- { os: ubuntu-20.04, cc: gcc-11, arch: x64, simd: avx2 }
# GCC 12 builds
- { os: ubuntu-22.04, cc: gcc-12, arch: x64, simd: none }
- { os: ubuntu-22.04, cc: gcc-12, arch: x64, simd: sse }
- { os: ubuntu-22.04, cc: gcc-12, arch: x64, simd: sse2 }
- { os: ubuntu-22.04, cc: gcc-12, arch: x64, simd: sse3 }
- { os: ubuntu-22.04, cc: gcc-12, arch: x64, simd: sse4 }
- { os: ubuntu-22.04, cc: gcc-12, arch: x64, simd: avx }
- { os: ubuntu-22.04, cc: gcc-12, arch: x64, simd: avx2 }
# GCC 13 builds
- { os: ubuntu-24.04, cc: gcc-13, arch: x64, simd: none }
- { os: ubuntu-24.04, cc: gcc-13, arch: x64, simd: sse }
- { os: ubuntu-24.04, cc: gcc-13, arch: x64, simd: sse2 }
- { os: ubuntu-24.04, cc: gcc-13, arch: x64, simd: sse3 }
- { os: ubuntu-24.04, cc: gcc-13, arch: x64, simd: sse4 }
- { os: ubuntu-24.04, cc: gcc-13, arch: x64, simd: avx }
- { os: ubuntu-24.04, cc: gcc-13, arch: x64, simd: avx2 }
# Clang 12 builds
- { os: ubuntu-20.04, cc: clang-12, arch: x64, simd: none }
- { os: ubuntu-20.04, cc: clang-12, arch: x64, simd: sse }
- { os: ubuntu-20.04, cc: clang-12, arch: x64, simd: sse2 }
- { os: ubuntu-20.04, cc: clang-12, arch: x64, simd: sse3 }
- { os: ubuntu-20.04, cc: clang-12, arch: x64, simd: sse4 }
- { os: ubuntu-20.04, cc: clang-12, arch: x64, simd: avx }
- { os: ubuntu-20.04, cc: clang-12, arch: x64, simd: avx2 }
# Clang 15 builds
- { os: ubuntu-22.04, cc: clang-15, arch: x64, simd: none }
- { os: ubuntu-22.04, cc: clang-15, arch: x64, simd: sse }
- { os: ubuntu-22.04, cc: clang-15, arch: x64, simd: sse2 }
- { os: ubuntu-22.04, cc: clang-15, arch: x64, simd: sse3 }
- { os: ubuntu-22.04, cc: clang-15, arch: x64, simd: sse4 }
- { os: ubuntu-22.04, cc: clang-15, arch: x64, simd: avx }
- { os: ubuntu-22.04, cc: clang-15, arch: x64, simd: avx2 }
# ARM64 builds
- { os: ubuntu-latest, cc: gcc-12, arch: arm64, simd: neon }
- { os: ubuntu-latest, cc: gcc-13, arch: arm64, simd: neon }
# ARMv7 builds
- { os: ubuntu-latest-arm64, cc: gcc-12, arch: armv7, simd: neon }
- { os: ubuntu-latest-arm64, cc: gcc-12, arch: armv7, simd: none }
steps:
- uses: actions/checkout@v4
- name: Add Ubuntu Toolchain PPA
if: matrix.target.os == 'ubuntu-20.04'
run: |
sudo apt-get update
sudo apt-get install -y software-properties-common
sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test
sudo apt-get update
- name: Install Compiler and Ninja
run: |
sudo apt-get install -y ${{ matrix.target.cc }} ninja-build
- name: Set SIMD flags
run: |
if [ "${{ matrix.simd }}" == "none" ]; then
export CFLAGS=""
elif [ "${{ matrix.simd }}" == "sse" ]; then
export CFLAGS="-msse"
elif [ "${{ matrix.simd }}" == "sse2" ]; then
export CFLAGS="-msse2"
elif [ "${{ matrix.simd }}" == "sse3" ]; then
export CFLAGS="-msse3"
elif [ "${{ matrix.simd }}" == "sse4" ]; then
export CFLAGS="-msse4"
elif [ "${{ matrix.simd }}" == "avx" ]; then
export CFLAGS="-mavx"
elif [ "${{ matrix.simd }}" == "avx2" ]; then
export CFLAGS="-mavx2"
elif [ "${{ matrix.simd }}" == "neon" ]; then
export CFLAGS="-mfpu=neon"
fi
- name: Configure CMake
run: |
if [ "${{ matrix.target.arch }}" == "armv7" ]; then
# Build for ARMv7
neon_flags=""
if [ "${{ matrix.simd }}" == "neon" ]; then
neon_flags="-mfpu=neon -mfloat-abi=hard"
fi
cmake -B build -GNinja -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_C_COMPILER=${{ matrix.target.cc }} \
-DCMAKE_C_FLAGS="$CFLAGS -m32 -march=armv7-a ${neon_flags}" \
-DCGLM_STATIC=ON -DCGLM_USE_TEST=ON
elif [ "${{ matrix.target.arch }}" == "arm64" ]; then
# Build for ARM64 (AArch64)
neon_flags=""
if [ "${{ matrix.simd }}" == "neon" ]; then
neon_flags="+simd" # Enable SIMD/NEON features on ARM64
else
neon_flags="+nosimd" # Explicitly disable SIMD/NEON
fi
cmake -B build -GNinja -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_C_COMPILER=${{ matrix.target.cc }} \
-DCMAKE_C_FLAGS="$CFLAGS -march=armv8-a${neon_flags}" \
-DCGLM_STATIC=ON -DCGLM_USE_TEST=ON
else
# Normal build (x86/x64)
cmake -B build -GNinja -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_C_COMPILER=${{ matrix.target.cc }} \
-DCMAKE_C_FLAGS="$CFLAGS" \
-DCGLM_STATIC=ON -DCGLM_USE_TEST=ON
fi
- name: Build
run: cmake --build build
- name: Test
working-directory: build
run: ./tests
build_cmake_macos:
name: CMake / ${{ matrix.os }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [macos-13, 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:
name: CMake / ${{ matrix.os }} / ${{ matrix.simd }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
include:
# x86/x64 builds
- { os: macos-13, simd: none }
- { os: macos-13, simd: sse }
- { os: macos-13, simd: sse2 }
- { os: macos-13, simd: sse3 }
- { os: macos-13, simd: sse4 }
- { os: macos-13, simd: avx }
- { os: macos-13, simd: avx2 }
- { os: macos-14, simd: none }
- { os: macos-14, simd: sse }
- { os: macos-14, simd: sse2 }
- { os: macos-14, simd: sse3 }
- { os: macos-14, simd: sse4 }
- { os: macos-14, simd: avx }
- { os: macos-14, simd: avx2 }
- { os: windows-2022, simd: none }
- { os: windows-2022, simd: sse }
- { os: windows-2022, simd: sse2 }
- { os: windows-2022, simd: sse3 }
- { os: windows-2022, simd: sse4 }
- { os: windows-2022, simd: avx }
- { os: windows-2022, simd: avx2 }
# ARM64 builds
- { os: macos-14-arm64, simd: neon }
steps:
- uses: actions/checkout@v4
- name: Install Ninja on macOS
if: runner.os == 'macOS'
run: brew upgrade && brew install ninja
- name: Set SIMD flags (Windows)
if: runner.os == 'Windows'
shell: pwsh
run: |
$simd = "${{ matrix.simd }}"
if ($simd -eq "none") {
$env:CFLAGS = ""
} elseif ($simd -eq "sse") {
$env:CFLAGS = "-arch:SSE"
} elseif ($simd -eq "sse2") {
$env:CFLAGS = "-arch:SSE2"
} elseif ($simd -eq "sse3") {
$env:CFLAGS = "-arch:SSE3"
} elseif ($simd -eq "sse4") {
$env:CFLAGS = "-arch:SSE4"
} elseif ($simd -eq "avx") {
$env:CFLAGS = "-arch:AVX"
} elseif ($simd -eq "avx2") {
$env:CFLAGS = "-arch:AVX2"
} elseif ($simd -eq "neon") {
$env:CFLAGS = "-arch:NEON"
}
- name: Set SIMD flags (Unix)
if: runner.os != 'Windows'
shell: bash
run: |
if [ "${{ matrix.simd }}" == "none" ]; then
export CFLAGS=""
elif [ "${{ matrix.simd }}" == "sse" ]; then
export CFLAGS="-msse"
elif [ "${{ matrix.simd }}" == "sse2" ]; then
export CFLAGS="-msse2"
elif [ "${{ matrix.simd }}" == "sse3" ]; then
export CFLAGS="-msse3"
elif [ "${{ matrix.simd }}" == "sse4" ]; then
export CFLAGS="-msse4"
elif [ "${{ matrix.simd }}" == "avx" ]; then
export CFLAGS="-mavx"
elif [ "${{ matrix.simd }}" == "avx2" ]; then
export CFLAGS="-mavx2"
elif [ "${{ matrix.simd }}" == "neon" ]; then
export CFLAGS="-mfpu=neon"
fi
- name: Configure CMake (Windows)
if: runner.os == 'Windows'
shell: pwsh
run: cmake -B build -G "Visual Studio 17 2022" -A x64 -T host=x64 -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS="$env:CFLAGS" -DCGLM_STATIC=ON -DCGLM_USE_TEST=ON
- name: Configure CMake (Unix)
if: runner.os != 'Windows'
shell: bash
run: cmake -B build -GNinja -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS="$CFLAGS" -DCGLM_STATIC=ON -DCGLM_USE_TEST=ON
- name: Build
run: cmake --build build
- name: Test (Windows)
if: runner.os == 'Windows'
shell: pwsh
working-directory: build
run: .\Debug\tests.exe
- name: Test (Unix)
if: runner.os != 'Windows'
shell: bash
working-directory: build
run: ./tests
build_meson:
name: Meson / ${{ matrix.os }} / ${{ matrix.simd }}
runs-on: ${{ contains(matrix.os, 'arm64') && 'ubuntu-latest-arm64' || matrix.os }}
strategy:
fail-fast: false
matrix:
include:
# x86/x64 builds
- { os: macos-14, simd: none }
- { os: macos-14, simd: sse }
- { os: macos-14, simd: sse2 }
- { os: macos-14, simd: sse3 }
- { os: macos-14, simd: sse4 }
- { os: macos-14, simd: avx }
- { os: macos-14, simd: avx2 }
- { os: ubuntu-22.04, simd: none }
- { os: ubuntu-22.04, simd: sse }
- { os: ubuntu-22.04, simd: sse2 }
- { os: ubuntu-22.04, simd: sse3 }
- { os: ubuntu-22.04, simd: sse4 }
- { os: ubuntu-22.04, simd: avx }
- { os: ubuntu-22.04, simd: avx2 }
- { os: ubuntu-24.04, simd: none }
- { os: ubuntu-24.04, simd: sse }
- { os: ubuntu-24.04, simd: sse2 }
- { os: ubuntu-24.04, simd: sse3 }
- { os: ubuntu-24.04, simd: sse4 }
- { os: ubuntu-24.04, simd: avx }
- { os: ubuntu-24.04, simd: avx2 }
- { os: windows-2022, simd: none }
- { os: windows-2022, simd: sse }
- { os: windows-2022, simd: sse2 }
- { os: windows-2022, simd: sse3 }
- { os: windows-2022, simd: sse4 }
- { os: windows-2022, simd: avx }
- { os: windows-2022, simd: avx2 }
# ARM64 builds
- { os: ubuntu-latest-arm64, simd: neon }
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: Set SIMD flags (Windows)
if: runner.os == 'Windows'
shell: pwsh
run: |
$simd = "${{ matrix.simd }}"
if ($simd -eq "none") {
$env:CFLAGS = ""
} elseif ($simd -eq "sse") {
$env:CFLAGS = "-arch:SSE"
} elseif ($simd -eq "sse2") {
$env:CFLAGS = "-arch:SSE2"
} elseif ($simd -eq "sse3") {
$env:CFLAGS = "-arch:SSE3"
} elseif ($simd -eq "sse4") {
$env:CFLAGS = "-arch:SSE4"
} elseif ($simd -eq "avx") {
$env:CFLAGS = "-arch:AVX"
} elseif ($simd -eq "avx2") {
$env:CFLAGS = "-arch:AVX2"
} elseif ($simd -eq "neon") {
$env:CFLAGS = "-arch:NEON"
}
- name: Set SIMD flags (Unix)
if: runner.os != 'Windows'
shell: bash
run: |
if [ "${{ matrix.simd }}" == "none" ]; then
export CFLAGS=""
elif [ "${{ matrix.simd }}" == "sse" ]; then
export CFLAGS="-msse"
elif [ "${{ matrix.simd }}" == "sse2" ]; then
export CFLAGS="-msse2"
elif [ "${{ matrix.simd }}" == "sse3" ]; then
export CFLAGS="-msse3"
elif [ "${{ matrix.simd }}" == "sse4" ]; then
export CFLAGS="-msse4"
elif [ "${{ matrix.simd }}" == "avx" ]; then
export CFLAGS="-mavx"
elif [ "${{ matrix.simd }}" == "avx2" ]; then
export CFLAGS="-mavx2"
elif [ "${{ matrix.simd }}" == "neon" ]; then
export CFLAGS="-mfpu=neon"
fi
- name: Build with meson (Windows)
if: runner.os == 'Windows'
shell: pwsh
run: |
meson setup build -Dbuildtype=release --default-library=static -Dbuild_tests=true -Dc_args="$env:CFLAGS"
meson test -C build
- name: Build with meson (Unix)
if: runner.os != 'Windows'
shell: bash
run: |
meson setup build -Dbuildtype=release --default-library=static -Dbuild_tests=true -Dc_args="$CFLAGS"
meson test -C build
build_msbuild:
name: MSBuild / Windows / ${{ matrix.simd }}
runs-on: windows-2022
strategy:
fail-fast: false
matrix:
simd: [none, sse, sse2, sse3, sse4, avx, avx2, neon]
steps:
- uses: actions/checkout@v4
- uses: microsoft/setup-msbuild@v2
- name: Retarget solution
run: |
vswhere -latest -products * -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -property installationPath
$vsInstallPath = vswhere -latest -products * -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -property installationPath
& "$vsInstallPath\Common7\IDE\devenv.com" cglm.sln /Upgrade
- name: Set SIMD flags
run: |
if ($Env:SIMD -eq 'none') {
$Env:CFLAGS=""
} elseif ($Env:SIMD -eq 'sse') {
$Env:CFLAGS="-arch:SSE"
} elseif ($Env:SIMD -eq 'sse2') {
$Env:CFLAGS="-arch:SSE2"
} elseif ($Env:SIMD -eq 'sse3') {
$Env:CFLAGS="-arch:SSE3"
} elseif ($Env:SIMD -eq 'sse4') {
$Env:CFLAGS="-arch:SSE4"
} elseif ($Env:SIMD -eq 'avx') {
$Env:CFLAGS="-arch:AVX"
} elseif ($Env:SIMD -eq 'avx2') {
$Env:CFLAGS="-arch:AVX2"
} elseif ($Env:SIMD -eq 'neon') {
$Env:CFLAGS="-arch:NEON"
}
- name: Build (x86)
working-directory: win
run: msbuild cglm.vcxproj /p:Configuration=Release /p:Platform=x86 /p:PlatformToolset=v143 /p:BuildInParallel=true /p:AdditionalOptions="$Env:CFLAGS"
- name: Build (x64)
working-directory: win
run: msbuild cglm.vcxproj /p:Configuration=Release /p:Platform=x64 /p:PlatformToolset=v143 /p:BuildInParallel=true /p:AdditionalOptions="$Env:CFLAGS"
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_swift:
name: Swift ${{ matrix.swift }} / ${{ matrix.os }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [macos-13, macos-14, ubuntu-22.04]
# This has no test yet.
steps:
- uses: actions/checkout@v4
- name: Build
run: swift build
build_cmake_arm:
name: CMake / ARM / ${{ matrix.os }} / ${{ matrix.arch }} / ${{ matrix.simd }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
include:
# Linux ARM builds
- os: ubuntu-latest-arm64
arch: arm64
simd: neon
- os: ubuntu-latest-arm64
arch: armv7
simd: neon
- os: ubuntu-latest-arm64
arch: armv7
simd: none
# Windows ARM builds
- os: windows-latest-arm64
arch: arm64
simd: neon
- os: windows-latest-arm64
arch: arm
simd: neon
- os: windows-latest-arm64
arch: arm
simd: none
steps:
- uses: actions/checkout@v4
- name: Configure CMake (Windows)
if: runner.os == 'Windows'
shell: pwsh
run: |
$flags = ""
if ("${{ matrix.arch }}" -eq "arm") {
$flags = "-m32 -march=armv7-a"
if ("${{ matrix.simd }}" -eq "neon") {
$flags += " -mfpu=neon"
}
}
elseif ("${{ matrix.simd }}" -eq "neon") {
$flags = "-march=armv8-a+simd"
}
cmake -B build -G "Visual Studio 17 2022" -A ${{ matrix.arch == 'arm64' && 'ARM64' || 'ARM' }} `
-DCMAKE_BUILD_TYPE=Release `
-DCMAKE_C_FLAGS="$flags" `
-DCGLM_STATIC=ON -DCGLM_USE_TEST=ON
- name: Configure CMake (Unix)
if: runner.os != 'Windows'
shell: bash
run: |
flags=""
if [ "${{ matrix.arch }}" = "armv7" ]; then
flags="-m32 -march=armv7-a"
if [ "${{ matrix.simd }}" = "neon" ]; then
flags="$flags -mfpu=neon -mfloat-abi=hard"
fi
elif [ "${{ matrix.simd }}" = "neon" ]; then
flags="-march=armv8-a+simd"
fi
cmake -B build -GNinja -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_C_FLAGS="$flags" \
-DCGLM_STATIC=ON -DCGLM_USE_TEST=ON
- name: Build
run: cmake --build build
- name: Test
working-directory: build
run: ./tests

View File

@@ -23,7 +23,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: Downloading wasi-sdk
run: |
@@ -31,10 +31,20 @@ jobs:
wget --no-verbose https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-${{matrix.wasi_sdk_version}}/wasi-sdk-${{matrix.wasi_sdk_version}}.0-linux.tar.gz
tar xf wasi-sdk-${{matrix.wasi_sdk_version}}.0-linux.tar.gz
# Building a wasm library without needing to define a main():
# https://github.com/WebAssembly/wasi-sdk/issues/332
- name: Modify CMakeLists.txt for WASI
run: |
echo 'if (CMAKE_SYSTEM_NAME STREQUAL "WASI")' >> CMakeLists.txt
echo ' target_link_options(${PROJECT_NAME} PRIVATE -mexec-model=reactor)' >> CMakeLists.txt
echo 'endif()' >> CMakeLists.txt
- name: Configure CMake
# Configure CMake in a 'build' subdirectory. `CMAKE_BUILD_TYPE` is only required if you are using a single-configuration generator such as make.
# See https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html?highlight=cmake_build_type
run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{matrix.BUILD_TYPE}} -DCMAKE_C_FLAGS="${{matrix.C_FLAGS}}" -DCMAKE_TOOLCHAIN_FILE=${{github.workspace}}/wasi-sdk-${{matrix.wasi_sdk_version}}.0/share/cmake/wasi-sdk.cmake -DWASI_SDK_PREFIX=${{github.workspace}}/wasi-sdk-${{matrix.wasi_sdk_version}}.0 -DCGLM_USE_TEST=ON
# Below suppress <<'clock' is deprecated: WASI lacks process-associated clocks; ...>> warns:
# -D_WASI_EMULATED_PROCESS_CLOCKS" -DCMAKE_EXE_LINKER_FLAGS="-lwasi-emulated-process-clocks
run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{matrix.BUILD_TYPE}} -DCMAKE_C_FLAGS="${{matrix.C_FLAGS}} -D_WASI_EMULATED_PROCESS_CLOCKS" -DCMAKE_EXE_LINKER_FLAGS="-lwasi-emulated-process-clocks" -DCMAKE_TOOLCHAIN_FILE=${{github.workspace}}/wasi-sdk-${{matrix.wasi_sdk_version}}.0/share/cmake/wasi-sdk.cmake -DWASI_SDK_PREFIX=${{github.workspace}}/wasi-sdk-${{matrix.wasi_sdk_version}}.0 -DCGLM_STATIC=ON -DCGLM_SHARED=OFF -DCGLM_USE_TEST=ON
- name: Build
# Build your program with the given configuration
@@ -64,7 +74,7 @@ jobs:
C_FLAGS: ['', '-msimd128', '-msse -msse2 -msimd128', '-msse -msse2 -msse3 -msse4 -msimd128']
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: Setup emsdk
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

3
.gitignore vendored
View File

@@ -80,3 +80,6 @@ confdefs.h
cmake-build-debug
*.o.tmp
xcode/*
.vscode
.build
*.swp

0
.gitmodules vendored
View File

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,20 +0,0 @@
{
"configurations": [
{
"name": "Mac",
"includePath": [
"${workspaceFolder}/**"
],
"defines": [],
"macFrameworkPath": [
"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks"
],
"compilerPath": "/usr/bin/clang",
"cStandard": "c23",
"cppStandard": "c++23",
"intelliSenseMode": "macos-clang-arm64",
"configurationProvider": "vector-of-bool.cmake-tools"
}
],
"version": 4
}

31
.vscode/settings.json vendored
View File

@@ -1,31 +0,0 @@
{
"C_Cpp.default.configurationProvider": "vector-of-bool.cmake-tools",
"restructuredtext.confPath": "${workspaceFolder}/docs/source",
"workbench.colorTheme": "Default Light+ Experimental",
"editor.fontSize": 14,
"workbench.colorCustomizations": {
"[Default Light*]": {
"editor.background": "#fefefe",
"sideBar.background": "#fefefe",
"sideBar.foreground": "#343436",
"sideBarTitle.foreground": "#343436",
"sideBar.border": "#e2e2e4",
"statusBar.background": "#fefefe",
"titleBar.activeBackground": "#fefefe",
"tab.activeBackground": "#f4fff4aa",
"tab.inactiveBackground": "#fefefe",
"activityBar.background": "#fefefe",
"editorGroupHeader.tabsBackground": "#fefefe"
},
"[Default Dark*]": {
"editor.background": "#1D1D25",
"sideBar.background": "#1D1D25",
"statusBar.background": "#1D1D25",
"titleBar.activeBackground": "#1D1D25",
"tab.activeBackground": "#2C2C3A",
"tab.inactiveBackground": "#1D1D25",
"activityBar.background": "#1D1D25",
"editorGroupHeader.tabsBackground": "#1D1D25"
}
},
}

199
BUILDING.md Normal file
View File

@@ -0,0 +1,199 @@
# Building the library
cglm can be built using one of the following build systems:
## CMake (All platforms)
```bash
$ mkdir build
$ cd build
$ cmake .. # [Optional] -DCGLM_SHARED=ON
$ make
$ sudo make install # [Optional]
```
### Options with defaults
```CMake
option(CGLM_SHARED "Shared build" ON)
option(CGLM_STATIC "Static build" OFF)
option(CGLM_USE_C99 "" OFF) # C11
option(CGLM_USE_TEST "Enable Tests" OFF) # for make check - make test
```
### Including in a CMake project
#### Header only
This requires no building or installation of cglm.
* Example:
``` cmake
cmake_minimum_required(VERSION 3.8.2)
project(<Your Project Name>)
add_executable(${PROJECT_NAME} src/main.c)
target_link_libraries(${LIBRARY_NAME} PRIVATE
cglm_headers)
add_subdirectory(external/cglm/ EXCLUDE_FROM_ALL)
```
#### Linked
* Example:
```cmake
cmake_minimum_required(VERSION 3.8.2)
project(<Your Project Name>)
add_executable(${PROJECT_NAME} src/main.c)
target_link_libraries(${LIBRARY_NAME} PRIVATE
cglm)
add_subdirectory(external/cglm/)
# or you can use find_package to configure cglm
```
### Using CMake to build for WebAssembly
Since math functions like `sinf` are used, this can not be targeted at `wasm32-unknown-unknown`, one of [wasi-sdk](https://github.com/WebAssembly/wasi-sdk) or [emscripten](https://github.com/emscripten-core/emsdk) should be used.
Should note that shared build is not yet supported for WebAssembly.
For [simd128](https://github.com/WebAssembly/simd) support, add `-msimd128` to `CMAKE_C_FLAGS`, in command line `-DCMAKE_C_FLAGS="-msimd128"`.
For tests, the cmake option `CGLM_USE_TEST` would still work, you'll need a wasi runtime for running tests, see our [ci config file](.github/workflows/cmake-wasm.yml) for a detailed example.
#### WASI SDK
```bash
$ cmake .. \
-DCMAKE_TOOLCHAIN_FILE=/path/to/wasi-sdk-19.0/share/cmake/wasi-sdk.cmake \
-DWASI_SDK_PREFIX=/path/to/wasi-sdk-19.0
```
Where `/path/to/wasi-sdk-19.0/` is the path to extracted [wasi sdk](https://github.com/WebAssembly/wasi-sdk).
In this case it would by default make a static build.
#### Emscripten
```bash
$ emcmake cmake .. \
-DCMAKE_EXE_LINKER_FLAGS="-s STANDALONE_WASM" \
-DCGLM_STATIC=ON
```
The `emcmake` here is the cmake wrapper for Emscripten from installed [emsdk](https://github.com/emscripten-core/emsdk).
## Meson (All platforms)
```bash
$ meson build # [Optional] --default-library=static
$ cd build
$ ninja
$ sudo ninja install # [Optional]
```
### Options with Defaults:
```meson
c_std=c11
buildtype=release
default_library=shared
build_tests=true # to run tests: ninja test
```
### Including in a Meson project
* Example:
```meson
# Clone cglm or create a cglm.wrap under <source_root>/subprojects
project('name', 'c')
cglm_dep = dependency('cglm', fallback : 'cglm', 'cglm_dep')
executable('exe', 'src/main.c', dependencies : cglm_dep)
```
## Swift (Swift Package Manager)
Currently only default build options are supported. Add **cglm** dependency to your project:
```swift
...
Package(
...
dependencies: [
...
.package(url: "https://github.com/recp/cglm", .branch("master")),
]
...
)
```
Now add **cgml** as a dependency to your target. Product choices are:
- **cglm** for inlined version of the library which can be linked only statically
- **cglmc** for a compiled version of the library with no linking limitation
```swift
...
.target(
...
dependencies: [
...
.product(name: "cglm", package: "cglm"),
]
...
)
...
```
## Unix (Autotools)
```bash
$ sh autogen.sh
$ ./configure
$ make
$ make check # [Optional]
$ [sudo] make install # [Optional]
```
This will also install pkg-config files so you can use
`pkg-config --cflags cglm` and `pkg-config --libs cglm` to retrieve compiler
and linker flags.
The files will be installed into the given prefix (usually `/usr/local` by
default on Linux), but your pkg-config may not be configured to actually check
there. You can figure out where it's looking by running `pkg-config --variable
pc_path pkg-config` and change the path the files are installed to via
`./configure --with-pkgconfigdir=/your/path`. Alternatively, you can add the
prefix path to your `PKG_CONFIG_PATH` environment variable.
## Windows (MSBuild)
Windows related build file and project files are located in `win` folder,
make sure you are inside `cglm/win` folder.
Code Analysis is enabled, so it may take awhile to build.
```Powershell
$ cd win
$ .\build.bat
```
if `msbuild` won't work (because of multi version VS) then try to build with `devenv`:
```Powershell
$ devenv cglm.sln /Build Release
```
### Running Tests on Windows
You can see test project in same visual studio solution file. It is enough to run that project to run tests.
# Building the documentation
First you need install Sphinx: http://www.sphinx-doc.org/en/master/usage/installation.html
then:
```bash
$ cd docs
$ sphinx-build source build
```
it will compile docs into build folder, you can run index.html inside that function.

View File

@@ -1,6 +1,6 @@
cmake_minimum_required(VERSION 3.8.2)
cmake_minimum_required(VERSION 3.13)
project(cglm
VERSION 0.9.1
VERSION 0.9.6
HOMEPAGE_URL https://github.com/recp/cglm
DESCRIPTION "OpenGL Mathematics (glm) for C"
LANGUAGES C
@@ -32,18 +32,23 @@ if(CGLM_USE_C99)
endif()
if(MSVC)
add_definitions(-DNDEBUG -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
# Make sure /RTC1 is disabled, otherwise it will use functions from the CRT
foreach(flag_var
CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO)
string(REGEX REPLACE "/RTC(su|[1su])" "" ${flag_var} "${${flag_var}}")
endforeach(flag_var)
add_definitions(-D_WINDOWS -D_USRDLL)
if(NOT CMAKE_BUILD_TYPE MATCHES Debug)
add_definitions(-DNDEBUG)
add_compile_options(/W3 /Ox /Gy /Oi /TC)
foreach(flag_var
CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO)
string(REGEX REPLACE "/RTC(su|[1su])" "" ${flag_var} "${${flag_var}}")
endforeach(flag_var)
endif()
else()
add_compile_options(-Wall -O3)
add_compile_options(-Wall -Wextra -Wpedantic -Wconversion)
if(NOT CMAKE_BUILD_TYPE MATCHES Debug)
add_compile_options(-O3)
endif()
endif()
get_directory_property(hasParent PARENT_DIRECTORY)
@@ -88,8 +93,10 @@ add_library(${PROJECT_NAME}
src/mat4x2.c
src/mat4x3.c
src/plane.c
src/noise.c
src/frustum.c
src/box.c
src/aabb2d.c
src/project.c
src/sphere.c
src/ease.c

14
CREDITS
View File

@@ -82,3 +82,17 @@ http://github.com/microsoft/DirectXMath
17. Pick Matrix
glu project -> project.c
18. Ray sphere intersection
RAY TRACING GEMS
HIGH-QUALITY AND REAL-TIME RENDERING WITH DXR AND OTHER APIS
CHAPTER 7
Precision Improvements for Ray/Sphere Intersection
Eric Haines (1), Johannes Günther (2), and Tomas Akenine-Möller (1)
(1) NVIDIA
(2) Intel
Wyman, C., and Haines, E. Getting Started with RTX Ray Tracing.
https://github.com/NVIDIAGameWorks/GettingStartedWithRTXRayTracing

View File

@@ -23,7 +23,7 @@ checkCFLAGS = $(AM_CFLAGS) \
-std=gnu11 \
-O3 \
-DCGLM_DEFINE_PRINTS \
-I./include
-I$(srcdir)/include
check_PROGRAMS = test/tests
TESTS = $(check_PROGRAMS)
@@ -67,8 +67,10 @@ cglm_HEADERS = include/cglm/version.h \
include/cglm/util.h \
include/cglm/quat.h \
include/cglm/plane.h \
include/cglm/noise.h \
include/cglm/frustum.h \
include/cglm/box.h \
include/cglm/aabb2d.h \
include/cglm/color.h \
include/cglm/project.h \
include/cglm/sphere.h \
@@ -119,6 +121,7 @@ cglm_call_HEADERS = include/cglm/call/mat4.h \
include/cglm/call/quat.h \
include/cglm/call/euler.h \
include/cglm/call/plane.h \
include/cglm/call/noise.h \
include/cglm/call/frustum.h \
include/cglm/call/box.h \
include/cglm/call/project.h \
@@ -128,7 +131,8 @@ cglm_call_HEADERS = include/cglm/call/mat4.h \
include/cglm/call/bezier.h \
include/cglm/call/ray.h \
include/cglm/call/affine.h \
include/cglm/call/affine2d.h
include/cglm/call/affine2d.h \
include/cglm/call/aabb2d.h
cglm_call_clipspacedir=$(includedir)/cglm/call/clipspace
cglm_call_clipspace_HEADERS = include/cglm/call/clipspace/persp_lh_no.h \
@@ -149,7 +153,8 @@ cglm_call_clipspace_HEADERS = include/cglm/call/clipspace/persp_lh_no.h \
cglm_simddir=$(includedir)/cglm/simd
cglm_simd_HEADERS = include/cglm/simd/intrin.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_sse2_HEADERS = include/cglm/simd/sse2/affine.h \
@@ -168,6 +173,17 @@ cglm_simd_neon_HEADERS = include/cglm/simd/neon/affine.h \
include/cglm/simd/neon/mat4.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_struct_HEADERS = include/cglm/struct/mat4.h \
include/cglm/struct/mat4x2.h \
@@ -185,21 +201,27 @@ cglm_struct_HEADERS = include/cglm/struct/mat4.h \
include/cglm/struct/affine2d.h \
include/cglm/struct/vec2.h \
include/cglm/struct/vec2-ext.h \
include/cglm/struct/ivec2.h \
include/cglm/struct/vec3.h \
include/cglm/struct/vec3-ext.h \
include/cglm/struct/ivec3.h \
include/cglm/struct/vec4.h \
include/cglm/struct/vec4-ext.h \
include/cglm/struct/ivec4.h \
include/cglm/struct/io.h \
include/cglm/struct/cam.h \
include/cglm/struct/quat.h \
include/cglm/struct/euler.h \
include/cglm/struct/plane.h \
include/cglm/struct/noise.h \
include/cglm/struct/frustum.h \
include/cglm/struct/box.h \
include/cglm/struct/aabb2d.h \
include/cglm/struct/project.h \
include/cglm/struct/sphere.h \
include/cglm/struct/color.h \
include/cglm/struct/curve.h
include/cglm/struct/curve.h \
include/cglm/struct/ray.h
cglm_struct_clipspacedir=$(includedir)/cglm/struct/clipspace
cglm_struct_clipspace_HEADERS = include/cglm/struct/clipspace/persp_lh_no.h \
@@ -217,6 +239,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_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=\
src/euler.c \
src/affine.c \
@@ -239,6 +265,7 @@ libcglm_la_SOURCES=\
src/mat4x2.c \
src/mat4x3.c \
src/plane.c \
src/noise.c \
src/frustum.c \
src/box.c \
src/project.c \
@@ -248,6 +275,7 @@ libcglm_la_SOURCES=\
src/bezier.c \
src/ray.c \
src/affine2d.c \
src/aabb2d.c \
src/clipspace/ortho_lh_no.c \
src/clipspace/ortho_lh_zo.c \
src/clipspace/ortho_rh_no.c \

496
README.md
View File

@@ -5,14 +5,10 @@
</p>
<br>
<p align="center">
<a href="https://travis-ci.com/recp/cglm">
<img src="https://travis-ci.com/recp/cglm.svg?branch=master"
<a href="https://github.com/recp/cglm/actions/workflows/ci.yml">
<img src="https://github.com/recp/cglm/actions/workflows/ci.yml/badge.svg"
alt="Build Status">
</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">
<img src="https://readthedocs.org/projects/cglm/badge/?version=latest"
alt="Documentation Status">
@@ -43,73 +39,100 @@
<br>
<p align="center">
Highly optimized 2D|3D math library, also known as <b>OpenGL Mathematics (glm) for `C`</b>. <b>cglm</b> provides lot of utils to help math operations to be fast and quick to write. It is community friendly, feel free to bring any issues, bugs you faced.
A highly optimized 2D|3D math library. Also known as OpenGL Mathematics (glm) for C. <b>cglm</b> provides fast and ergonomic math functions to ease graphics programming. It is community friendly feel free to report any bugs and issues you face. <br>
<i>If you're using C++, you might want to check out <a href="https://github.com/g-truc/glm">GLM</a></i>
</p>
- Allocation-free
- Header-only
- SIMD-optimized
- API-agnostic
---
#### 📚 Documentation
### 📚 Documentation
Almost all functions (inline versions) and parameters are documented inside the corresponding headers. <br />
Complete documentation: http://cglm.readthedocs.io
All functions and their parameters are documented above their declaration inside their corresponding headers. <br />
Alternatively, you can read the complete documentation [here](http://cglm.readthedocs.io).
#### 📌 Note for previous versions:
### 🔨 Building
- _dup (duplicate) is changed to _copy. For instance `glm_vec_dup -> glm_vec3_copy`
- OpenGL related functions are dropped to make this lib platform/third-party independent
- make sure you have latest version and feel free to report bugs, troubles
- **[bugfix]** euler angles was implemented in reverse order (extrinsic) it was fixed, now they are intrinsic. Make sure that
you have the latest version
- **[major change]** by starting v0.4.0, quaternions are stored as [x, y, z, w], it was [w, x, y, z] in v0.3.5 and earlier versions
- **[api rename]** by starting v0.4.5, **glm_simd** functions are renamed to **glmm_**
- **[new option]** by starting v0.4.5, you can disable alignment requirement, check options in docs.
- **[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.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
cglm can be used in it's entirety as a header-only library simply by including `cglm/cglm.h`. If you wish to link against it instead, it can be built using one of the supported build systems. Detailed information about building on individual platforms and build systems along with the instructions for building the documentation can be found in [BUILDING.md](./BUILDING.md).
#### 📌 Note for C++ developers:
If you are not aware of the original GLM library yet, you may also want to look at:
https://github.com/g-truc/glm
### ✅ Usage
#### 📌 Note for new comers (Important):
- `vec4` and `mat4` variables must be aligned. (There will be unaligned versions later)
- **in** and **[in, out]** parameters must be initialized (please). But **[out]** parameters not, initializing out param is also redundant
- All functions are inline if you don't want to use pre-compiled versions with glmc_ prefix, you can ignore build process. Just include headers.
- if your debugger takes you to cglm headers then make sure you are not trying to copy vec4 to vec3 or alig issues...
- Welcome!
#### Header-only
#### 📌 Note for experienced developers:
- Since I'm testing this library in my projects, sometimes bugs occurs; finding that bug[s] and making improvements would be more easy with multiple developer/contributor and their projects or knowledge. Consider to make some tests if you suspect something is wrong and any feedbacks, contributions and bug reports are always welcome.
Include the `cglm/cglm.h` header and use functions with the `glm_` prefix.
```c
#include "cglm/cglm.h"
#### 📌 Allocations?
`cglm` doesn't alloc any memory on heap. So it doesn't provide any allocator. You should alloc memory for **out** parameters too if you pass pointer of memory location. Don't forget that **vec4** (also quat/**versor**) and **mat4** must be aligned (16-bytes), because *cglm* uses SIMD instructions to optimize most operations if available.
// ...
#### 📌 Returning vector or matrix... ?
vec2 vector;
glm_vec2_zero(vector);
```
**cglm** supports both *ARRAY API* and *STRUCT API*, so you can return structs if you utilize struct api (`glms_`).
#### Struct API
<hr/>
Include `cglm/struct.h` and use `glms_`.
```c
#include "cglm/struct.h"
<table>
<tbody>
<tr>
<td>
<div>Like some other graphics libraries (especially OpenGL) this library use Column-Major layout to keep matrices in the memory. </div>
<div>&nbsp;</div>
<div>In the future the library may support an option to use row-major layout, CURRENTLY if you need to row-major layout you will need to transpose it. </div>
</td>
<td>
<img src="https://upload.wikimedia.org/wikipedia/commons/3/3f/Matrix_Columns.svg" width="300px" />
</td>
</tr>
</tbody>
</table>
// ...
## 🚀 Features
- **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)
- array api and struct api, you can use arrays or structs.
vec2s vector = glms_vec2_zero();
```
#### Linked
Include `cglm/call.h` and use `glmc_`.
```c
#include "cglm/call.h"
// ...
vec2 vector;
glmc_vec2_zero(vector);
```
### ❗ Alignment
While cglm by default aligns what's necessary, it is possible to disable this by defining `CGLM_ALL_UNALIGNED`. If you're targeting machines with any kind of SIMD support, make sure that all `vec4`, `mat4` and `mat2` arguments you pass to cglm functions are aligned to prevent unexpected crashes, alternatively use the unaligned versions if present.
### Struct API
The struct API works as follows (note the `s` suffix on types, `glms_` prefix on functions and `GLMS_` on constants):
```C
#include <cglm/struct.h>
mat4s mat = GLMS_MAT4_IDENTITY_INIT;
mat4s inv = glms_mat4_inv(mat);
```
Struct functions generally take parameters *by copy* and *return* the results rather than taking pointers and writing to out parameters. That means your variables can usually be `const`, if you're into that.
The types used are actually unions that allow access to the same data in multiple ways. One of these involves anonymous structures available since C11. MSVC supports them in earlier versions out of the box and GCC/Clang as well if you enable `-fms-extensions`.
To explicitly enable anonymous structures `#define CGLM_USE_ANONYMOUS_STRUCT 1`, or `0` to disable them.
For backwards compatibility, you can also `#define CGLM_NO_ANONYMOUS_STRUCT` to disable them. If you don't specify explicitly, cglm will attempt a best guess based on your compiler and C version.
### 📌 Migration notes:
- `_dup` (duplicate) functions were renamed to `_copy`. For instance: `glm_vec_dup` -> `glm_vec3_copy`.
- OpenGL related functions were dropped to make cglm API independent.
- **[bugfix]** Euler angles had been previously implemented in reverse order (extrinsic). This was fixed to be intrinsic.
- **[major change]** Starting with **v0.4.0**, quaternions are stored as [x, y, z, w]. Previously it was [w, x, y, z].
- **[api rename]** Starting with **v0.4.5**, `glm_simd_` functions are renamed to `glmm_`.
- **[new option]** Starting with **v0.4.5**, alignment requirements can be disabled. Read more in the documentation.
- **[major change]** Starting with **v0.5.0**, vec3 functions occupy the **glm_vec3_** namespace. This used to be **glm_vec_** in earlier versions.
- **[major change]** Starting with **v0.5.1**, `vec3` and `mat3` types are not aligned by default.
- **[major change]** Starting with **v0.7.3**, inline print functions are disabled by default in release mode to eliminate printing costs (see the Options chapter of the docs). <br> Colored output can be disabled (see documentation).
- **[major change]** Starting with **v0.8.3**, alternate clipspace configurations are supported. The `CGLM_FORCE_DEPTH_ZERO_TO_ONE` and `CGLM_FORCE_LEFT_HANDED` flags are provided to control clip depth and handedness. This makes it easier to incorporate cglm into projects using graphics APIs such as Vulkan or Metal. See https://cglm.readthedocs.io/en/latest/opt.html#clipspace-option-s
### 🚀 Features
- scalar and simd (sse, avx, neon...) optimizations
- general purpose matrix operations (mat4, mat3)
- chain matrix multiplication (square only)
- general purpose vector operations (cross, dot, rotate, proj, angle...)
@@ -121,49 +144,35 @@ https://github.com/g-truc/glm
- quaternions
- euler angles / yaw-pitch-roll to matrix
- extract euler angles
- inline or pre-compiled function call
- frustum (extract view frustum planes, corners...)
- bounding box (AABB in Frustum (culling), crop, merge...)
- bounding sphere
- project, unproject
- easing functions
- curves
- curve interpolation helpers (S*M*C, deCasteljau...)
- helpers to convert cglm types to Apple's simd library to pass cglm types to Metal GL without packing them on both sides
- curve interpolation helpers (SMC, deCasteljau...)
- comversion helpers from cglm types to Apple's simd library to pass cglm types to Metal GL without packing them on both sides
- ray intersection helpers
- and others...
---
<hr />
<table>
<tbody>
<tr>
<td>
<div>Like other graphics libraries (especially OpenGL), cglm uses column-major layout to keep matrices in memory. </div>
<div>&nbsp;</div>
<div>While we might support row-major matrices in the future, currently if you need your matrices to be in row-major layout you have to transpose them. </div>
</td>
<td>
<img src="https://upload.wikimedia.org/wikipedia/commons/3/3f/Matrix_Columns.svg" width="300px" />
</td>
</tr>
</tbody>
</table>
You have two options to call a function/operation: inline or library call (link)
Almost all functions are marked inline (always_inline) so compiler will probably inline.
To call pre-compiled versions, just use `glmc_` (c stands for 'call') instead of `glm_`.
---
```C
#include <cglm/cglm.h> /* for inline */
#include <cglm/call.h> /* for library call (this also includes cglm.h) */
mat4 rot, trans, rt;
/* ... */
glm_mul(trans, rot, rt); /* inline */
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
You can pass matrices and vectors as array to functions rather than get address.
```C
mat4 m = {
1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1
};
glm_translate(m, (vec3){1.0f, 0.0f, 0.0f});
```
Library contains general purpose mat4 mul and inverse functions, and also contains some special forms (optimized) of these functions for affine transformations' matrices. If you want to multiply two affine transformation matrices you can use glm_mul instead of glm_mat4_mul and glm_inv_tr (ROT + TR) instead glm_mat4_inv
cglm contains general purpose mat4 product and inverse functions but also provides optimized versions for affine transformations. If you want to multiply two affine transformation matrices you can use glm_mul instead of glm_mat4_mul and glm_inv_tr (ROT + TR) instead glm_mat4_inv.
```C
/* multiplication */
mat4 modelMat;
@@ -173,311 +182,9 @@ glm_mul(T, R, modelMat);
glm_inv_tr(modelMat);
```
### Struct API
The struct API works as follows, note the `s` suffix on types, the `glms_` prefix on functions and the `GLMS_` prefix on constants:
```C
#include <cglm/struct.h>
mat4s mat = GLMS_MAT4_IDENTITY_INIT;
mat4s inv = glms_mat4_inv(mat);
```
Struct functions generally take their parameters as *values* and *return* their results, rather than taking pointers and writing to out parameters. That means your parameters can usually be `const`, if you're into that.
The types used are actually unions that allow access to the same data multiple ways. One of those ways involves anonymous structures, available since C11. MSVC also supports it for earlier C versions out of the box and GCC/Clang do if you enable `-fms-extensions`. To explicitly enable these anonymous structures, `#define CGLM_USE_ANONYMOUS_STRUCT` to `1`, to disable them, to `0`. For backward compatibility, you can also `#define CGLM_NO_ANONYMOUS_STRUCT` (value is irrelevant) to disable them. If you don't specify explicitly, cglm will do a best guess based on your compiler and the C version you're using.
## 🔨 Build
### CMake (All platforms)
```bash
$ mkdir build
$ cd build
$ cmake .. # [Optional] -DCGLM_SHARED=ON
$ make
$ sudo make install # [Optional]
```
##### Cmake options with Defaults:
```CMake
option(CGLM_SHARED "Shared build" ON)
option(CGLM_STATIC "Static build" OFF)
option(CGLM_USE_C99 "" OFF) # C11
option(CGLM_USE_TEST "Enable Tests" OFF) # for make check - make test
```
#### Use as header-only library with your CMake project
This requires no building or installation of cglm.
* Example:
``` cmake
cmake_minimum_required(VERSION 3.8.2)
project(<Your Project Name>)
add_executable(${PROJECT_NAME} src/main.c)
target_link_libraries(${LIBRARY_NAME} PRIVATE
cglm_headers)
add_subdirectory(external/cglm/ EXCLUDE_FROM_ALL)
```
#### Use with your CMake project
* Example:
```cmake
cmake_minimum_required(VERSION 3.8.2)
project(<Your Project Name>)
add_executable(${PROJECT_NAME} src/main.c)
target_link_libraries(${LIBRARY_NAME} PRIVATE
cglm)
add_subdirectory(external/cglm/)
# or you can use find_package to configure cglm
```
#### Use CMake to build for WebAssembly
Since math functions like `sinf` is used, this can not be targeted at `wasm32-unknown-unknown`, one of [wasi-sdk](https://github.com/WebAssembly/wasi-sdk) or [emscripten](https://github.com/emscripten-core/emsdk) should be used.
Should note that shared build is not yet supported for WebAssembly.
For [simd128](https://github.com/WebAssembly/simd) support, add `-msimd128` to `CMAKE_C_FLAGS`, in command line `-DCMAKE_C_FLAGS="-msimd128"`.
For tests, the cmake option `CGLM_USE_TEST` would still work, you'll need a wasi runtime for running tests, see our [ci config file](.github/workflows/cmake-wasm.yml) for a detailed example.
##### Use CMake and WASI SDK to build for WebAssembly
```bash
$ cmake .. \
-DCMAKE_TOOLCHAIN_FILE=/path/to/wasi-sdk-19.0/share/cmake/wasi-sdk.cmake \
-DWASI_SDK_PREFIX=/path/to/wasi-sdk-19.0
```
Where `/path/to/wasi-sdk-19.0/` is the path to extracted [wasi sdk](https://github.com/WebAssembly/wasi-sdk).
In this case it would by default make a static build.
##### Use CMake and Emscripten SDK to build for WebAssembly
```bash
$ emcmake cmake .. \
-DCMAKE_EXE_LINKER_FLAGS="-s STANDALONE_WASM" \
-DCGLM_STATIC=ON
```
The `emcmake` here is the cmake wrapper for Emscripten from installed [emsdk](https://github.com/emscripten-core/emsdk).
### Meson (All platforms)
```bash
$ meson build # [Optional] --default-library=static
$ cd build
$ ninja
$ sudo ninja install # [Optional]
```
##### Meson options with Defaults:
```meson
c_std=c11
buildtype=release
default_library=shared
build_tests=true # to run tests: ninja test
```
#### Use with your Meson project
* Example:
```meson
# Clone cglm or create a cglm.wrap under <source_root>/subprojects
project('name', 'c')
cglm_dep = dependency('cglm', fallback : 'cglm', 'cglm_dep')
executable('exe', 'src/main.c', dependencies : cglm_dep)
```
### Swift (Swift Package Manager)
Currently only default build options are supported. Add **cglm** dependency to your project:
```swift
...
Package(
...
dependencies: [
...
.package(url: "https://github.com/recp/cglm", .branch("master")),
]
...
)
```
Now add **cgml** as a dependency to your target. Product choices are:
- **cglm** for inlined version of the library which can be linked only statically
- **cglmc** for a compiled version of the library with no linking limitation
```swift
...
.target(
...
dependencies: [
...
.product(name: "cglm", package: "cglm"),
]
...
)
...
```
### Unix (Autotools)
```bash
$ sh autogen.sh
$ ./configure
$ make
$ make check # [Optional]
$ [sudo] make install # [Optional]
```
This will also install pkg-config files so you can use
`pkg-config --cflags cglm` and `pkg-config --libs cglm` to retrieve compiler
and linker flags.
The files will be installed into the given prefix (usually `/usr/local` by
default on Linux), but your pkg-config may not be configured to actually check
there. You can figure out where it's looking by running `pkg-config --variable
pc_path pkg-config` and change the path the files are installed to via
`./configure --with-pkgconfigdir=/your/path`. Alternatively, you can add the
prefix path to your `PKG_CONFIG_PATH` environment variable.
### Windows (MSBuild)
Windows related build file and project files are located in `win` folder,
make sure you are inside `cglm/win` folder.
Code Analysis is enabled, so it may take awhile to build.
```Powershell
$ cd win
$ .\build.bat
```
if `msbuild` won't work (because of multi version VS) then try to build with `devenv`:
```Powershell
$ devenv cglm.sln /Build Release
```
#### Running Tests on Windows
You can see test project in same visual studio solution file. It is enough to run that project to run tests.
### Building Docs
First you need install Sphinx: http://www.sphinx-doc.org/en/master/usage/installation.html
then:
```bash
$ cd docs
$ sphinx-build source build
```
it will compile docs into build folder, you can run index.html inside that function.
## How to use
If you want to use the inline versions of functions, then include the main header
```C
#include <cglm/cglm.h>
```
the header will include all headers. Then call the func you want e.g. rotate vector by axis:
```C
glm_vec3_rotate(v1, glm_rad(45), (vec3){1.0f, 0.0f, 0.0f});
```
some functions are overloaded :) e.g you can normalize vector:
```C
glm_vec3_normalize(vec);
```
this will normalize vec and store normalized vector into `vec` but if you will store normalized vector into another vector do this:
```C
glm_vec3_normalize_to(vec, result);
```
like this function you may see `_to` postfix, this functions store results to another variables and save temp memory
to call pre-compiled versions include header with `c` postfix, c means call. Pre-compiled versions are just wrappers.
```C
#include <cglm/call.h>
```
this header will include all headers with c postfix. You need to call functions with c posfix:
```C
glmc_vec3_normalize(vec);
```
Function usage and parameters are documented inside related headers. You may see same parameter passed twice in some examples like this:
```C
glm_mat4_mul(m1, m2, m1);
/* or */
glm_mat4_mul(m1, m1, m1);
```
the first two parameter are **[in]** and the last one is **[out]** parameter. After multiplying *m1* and *m2*, the result is stored in *m1*. This is why we send *m1* twice. You may store the result in a different matrix, this is just an example.
### Example: Computing MVP matrix
#### Option 1
```C
mat4 proj, view, model, mvp;
/* init proj, view and model ... */
glm_mat4_mul(proj, view, viewProj);
glm_mat4_mul(viewProj, model, mvp);
```
#### Option 2
```C
mat4 proj, view, model, mvp;
/* init proj, view and model ... */
glm_mat4_mulN((mat4 *[]){&proj, &view, &model}, 3, mvp);
```
## How to send matrix to OpenGL
mat4 is array of vec4 and vec4 is array of floats. `glUniformMatrix4fv` functions accecpts `float*` as `value` (last param), so you can cast mat4 to float* or you can pass first column of matrix as beginning of memory of matrix:
Option 1: Send first column
```C
glUniformMatrix4fv(location, 1, GL_FALSE, matrix[0]);
/* array of matrices */
glUniformMatrix4fv(location, 1, GL_FALSE, matrix[0][0]);
```
Option 2: Cast matrix to pointer type (also valid for multiple dimensional arrays)
```C
glUniformMatrix4fv(location, 1, GL_FALSE, (float *)matrix);
```
You can pass matrices the same way to other APIs e.g. Vulkan, DX...
## Notes
- This library does not support double type... yet
- If headers are not working properly with your compiler, IDE please open an issue, because I'm using GCC and clang to test it maybe sometimes MSVC
**TODO:**
- [ ] Unit tests (In Progress)
- [ ] Unit tests for comparing cglm with glm results
- [x] Add version info
- [ ] Unaligned operations (e.g. `glm_umat4_mul`)
- [x] Extra documentation
- [x] ARM Neon Arch
## Contributors
This project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)].
This project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)]
<a href="https://github.com/recp/cglm/graphs/contributors"><img src="https://opencollective.com/cglm/contributors.svg?width=890&button=false" /></a>
@@ -502,6 +209,3 @@ Support this project by becoming a sponsor. Your logo will show up here with a l
<a href="https://opencollective.com/cglm/sponsor/7/website" target="_blank"><img src="https://opencollective.com/cglm/sponsor/7/avatar.svg"></a>
<a href="https://opencollective.com/cglm/sponsor/8/website" target="_blank"><img src="https://opencollective.com/cglm/sponsor/8/avatar.svg"></a>
<a href="https://opencollective.com/cglm/sponsor/9/website" target="_blank"><img src="https://opencollective.com/cglm/sponsor/9/avatar.svg"></a>
## License
MIT. check the LICENSE file

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
s.name = "cglm"
s.version = "0.9.0"
s.version = "0.9.5"
s.summary = "📽 Highly Optimized Graphics Math (glm) for C"
s.description = <<-DESC
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_INIT([cglm], [0.9.1], [info@recp.me])
AC_INIT([cglm], [0.9.6], [info@recp.me])
AM_INIT_AUTOMAKE([-Wall foreign subdir-objects serial-tests])
# 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 getting 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 getting 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)
================================================================================
Common transfrom functions.
Common transform functions.
Table of contents (click to go):
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -30,7 +30,7 @@ Functions documentation
creates NEW translate transform matrix by *v* vector.
Parameters:
| *[in, out]* **m** affine transfrom
| *[in, out]* **m** affine transform
| *[in]* **v** translate vector [x, y, z]
.. 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
Parameters:
| *[in]* **m** affine transfrom
| *[in]* **m** affine transform
| *[in]* **v** scale vector [x, y, z]
| *[out]* **dest** scaled matrix
@@ -47,7 +47,7 @@ Functions documentation
creates NEW scale matrix by v vector
Parameters:
| *[out]* **m** affine transfrom
| *[out]* **m** affine transform
| *[in]* **v** scale vector [x, y, z]
.. c:function:: void glm_scale(mat4 m, vec3 v)
@@ -56,7 +56,7 @@ Functions documentation
and stores result in same matrix
Parameters:
| *[in, out]* **m** affine transfrom
| *[in, out]* **m** affine transform
| *[in]* **v** scale vector [x, y, z]
.. c:function:: void glm_scale_uni(mat4 m, float s)
@@ -65,7 +65,7 @@ Functions documentation
and stores result in same matrix
Parameters:
| *[in, out]* **m** affine transfrom
| *[in, out]* **m** affine transform
| *[in]* **v** scale factor
.. 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
Parameters:
| *[out]* **m** affine transfrom
| *[out]* **m** affine transform
| *[in]* **axis** angle (radians)
| *[in]* **axis** axis
@@ -86,7 +86,7 @@ Functions documentation
| this should work faster than glm_rotate_at because it reduces one glm_translate.
Parameters:
| *[in, out]* **m** affine transfrom
| *[in, out]* **m** affine transform
| *[in]* **pivot** pivot, anchor point, rotation center
| *[in]* **angle** angle (radians)
| *[in]* **axis** axis
@@ -123,7 +123,7 @@ Functions documentation
DON'T pass projected matrix here
Parameters:
| *[in]* **m** affine transfrom
| *[in]* **m** affine transform
| *[out]* **t** translation vector
| *[out]* **r** rotation matrix (mat4)
| *[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
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):
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

View File

@@ -3,10 +3,8 @@
3D Affine Transforms (post)
================================================================================
Post transfrom 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.
Ther are named af
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) transform.
Table of contents (click to go):
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -33,7 +31,7 @@ Functions documentation
translate existing transform matrix by *v* vector and store result in dest
Parameters:
| *[in]* **m** affine transfrom
| *[in]* **m** affine transform
| *[in]* **v** translate vector [x, y, z]
| *[out]* **dest** translated matrix
@@ -43,7 +41,7 @@ Functions documentation
and stores result in same matrix
Parameters:
| *[in, out]* **m** affine transfrom
| *[in, out]* **m** affine transform
| *[in]* **v** translate vector [x, y, z]
.. c:function:: void glm_translated_x(mat4 m, float x)
@@ -51,7 +49,7 @@ Functions documentation
translate existing transform matrix by x factor
Parameters:
| *[in, out]* **m** affine transfrom
| *[in, out]* **m** affine transform
| *[in]* **v** x factor
.. c:function:: void glm_translated_y(mat4 m, float y)
@@ -59,7 +57,7 @@ Functions documentation
translate existing transform matrix by *y* factor
Parameters:
| *[in, out]* **m** affine transfrom
| *[in, out]* **m** affine transform
| *[in]* **v** y factor
.. c:function:: void glm_translated_z(mat4 m, float z)
@@ -67,7 +65,7 @@ Functions documentation
translate existing transform matrix by *z* factor
Parameters:
| *[in, out]* **m** affine transfrom
| *[in, out]* **m** affine transform
| *[in]* **v** z factor
.. c:function:: void glm_rotated_x(mat4 m, float angle, mat4 dest)
@@ -76,7 +74,7 @@ Functions documentation
and store result in dest
Parameters:
| *[in]* **m** affine transfrom
| *[in]* **m** affine transform
| *[in]* **angle** angle (radians)
| *[out]* **dest** rotated matrix
@@ -86,7 +84,7 @@ Functions documentation
and store result in dest
Parameters:
| *[in]* **m** affine transfrom
| *[in]* **m** affine transform
| *[in]* **angle** angle (radians)
| *[out]* **dest** rotated matrix
@@ -96,7 +94,7 @@ Functions documentation
and store result in dest
Parameters:
| *[in]* **m** affine transfrom
| *[in]* **m** affine transform
| *[in]* **angle** angle (radians)
| *[out]* **dest** rotated matrix
@@ -105,7 +103,7 @@ Functions documentation
rotate existing transform matrix around Z axis by angle and axis
Parameters:
| *[in, out]* **m** affine transfrom
| *[in, out]* **m** affine transform
| *[in]* **angle** angle (radians)
| *[in]* **axis** axis
@@ -114,7 +112,7 @@ Functions documentation
rotate existing transform around given axis by angle at given pivot point (rotation center)
Parameters:
| *[in, out]* **m** affine transfrom
| *[in, out]* **m** affine transform
| *[in]* **pivot** pivot, anchor point, rotation center
| *[in]* **angle** angle (radians)
| *[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)
Parameters:
| *[in, out]* **m** affine transfrom
| *[in, out]* **m** affine transform
| *[in]* **angle** angle (radians)
| *[in]* **axis** axis

View File

@@ -3,7 +3,7 @@
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):
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -41,7 +41,7 @@ Functions documentation
translate existing transform matrix by *v* vector and store result in dest
Parameters:
| *[in]* **m** affine transfrom
| *[in]* **m** affine transform
| *[in]* **v** translate vector [x, y, z]
| *[out]* **dest** translated matrix
@@ -51,7 +51,7 @@ Functions documentation
and stores result in same matrix
Parameters:
| *[in, out]* **m** affine transfrom
| *[in, out]* **m** affine transform
| *[in]* **v** translate vector [x, y, z]
.. c:function:: void glm_translate_x(mat4 m, float x)
@@ -59,7 +59,7 @@ Functions documentation
translate existing transform matrix by x factor
Parameters:
| *[in, out]* **m** affine transfrom
| *[in, out]* **m** affine transform
| *[in]* **v** x factor
.. c:function:: void glm_translate_y(mat4 m, float y)
@@ -67,7 +67,7 @@ Functions documentation
translate existing transform matrix by *y* factor
Parameters:
| *[in, out]* **m** affine transfrom
| *[in, out]* **m** affine transform
| *[in]* **v** y factor
.. c:function:: void glm_translate_z(mat4 m, float z)
@@ -75,59 +75,16 @@ Functions documentation
translate existing transform matrix by *z* factor
Parameters:
| *[in, out]* **m** affine transfrom
| *[in, out]* **m** affine transform
| *[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)
rotate existing transform matrix around X axis by angle
and store result in dest
Parameters:
| *[in]* **m** affine transfrom
| *[in]* **m** affine transform
| *[in]* **angle** angle (radians)
| *[out]* **dest** rotated matrix
@@ -137,7 +94,7 @@ Functions documentation
and store result in dest
Parameters:
| *[in]* **m** affine transfrom
| *[in]* **m** affine transform
| *[in]* **angle** angle (radians)
| *[out]* **dest** rotated matrix
@@ -147,26 +104,33 @@ Functions documentation
and store result in dest
Parameters:
| *[in]* **m** affine transfrom
| *[in]* **m** affine transform
| *[in]* **angle** angle (radians)
| *[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)
rotate existing transform matrix around Z axis by angle and axis
rotate existing transform matrix around given axis by angle at ORIGIN (0,0,0)
**❗IMPORTANT ❗️**
If you need to rotate object around itself e.g. center of object or at
some point [of object] then `glm_rotate_at()` would be better choice to do so.
Even if object's model transform is identity, rotation may not be around
center of object if object does not lay out at ORIGIN perfectly.
Using `glm_rotate_at()` with center of bounding shape ( AABB, Sphere ... )
would be an easy option to rotate around object if object is not at origin.
One another option to rotate around itself at any point is `glm_spin()`
which is perfect if only rotating around model position is desired e.g. not
specific point on model for instance center of geometry or center of mass,
again if geometry is not perfectly centered at origin at identity transform,
rotation may not be around geometry.
Parameters:
| *[in, out]* **m** affine transfrom
| *[in, out]* **m** affine transform
| *[in]* **angle** angle (radians)
| *[in]* **axis** axis
@@ -175,66 +139,16 @@ Functions documentation
rotate existing transform around given axis by angle at given pivot point (rotation center)
Parameters:
| *[in, out]* **m** affine transfrom
| *[in, out]* **m** affine transform
| *[in]* **pivot** pivot, anchor point, rotation center
| *[in]* **angle** angle (radians)
| *[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)
| rotate existing transform matrix around given axis by angle around self (doesn't affected by position)
Parameters:
| *[in, out]* **m** affine transfrom
| *[in, out]* **m** affine transform
| *[in]* **angle** angle (radians)
| *[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.
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.
@@ -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
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
decompose matrix after projected.
@@ -35,7 +35,7 @@ Rotation Center
Rotating functions uses origin as rotation center (pivot/anchor point),
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.
**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.
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)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
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)**
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
:linenos:
TransformMatrix = TransformMatrix * TraslateMatrix; // glm_translate()
TransformMatrix = TransformMatrix * TranslateMatrix; // glm_translate()
TransformMatrix = TransformMatrix * RotateMatrix; // glm_rotate(), glm_quat_rotate()
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
: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
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
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -45,7 +45,7 @@ Functions:
translate existing 2d transform matrix by *v* vector and stores result in same matrix
Parameters:
| *[in, out]* **m** 2d affine transfrom
| *[in, out]* **m** 2d affine transform
| *[in]* **v** translate vector [x, y]
.. 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
Parameters:
| *[in]* **m** 2d affine transfrom
| *[in]* **m** 2d affine transform
| *[in]* **v** translate vector [x, y]
| *[out]* **dest** translated matrix
@@ -62,7 +62,7 @@ Functions:
translate existing 2d transform matrix by x factor
Parameters:
| *[in, out]* **m** 2d affine transfrom
| *[in, out]* **m** 2d affine transform
| *[in]* **x** x factor
.. c:function:: void glm_translate2d_y(mat3 m, float y)
@@ -70,7 +70,7 @@ Functions:
translate existing 2d transform matrix by y factor
Parameters:
| *[in, out]* **m** 2d affine transfrom
| *[in, out]* **m** 2d affine transform
| *[in]* **y** y factor
.. c:function:: void glm_translate2d_make(mat3 m, vec2 v)
@@ -78,7 +78,7 @@ Functions:
creates NEW translate 2d transform matrix by *v* vector
Parameters:
| *[in, out]* **m** affine transfrom
| *[in, out]* **m** affine transform
| *[in]* **v** translate vector [x, y]
.. 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
Parameters:
| *[in]* **m** affine transfrom
| *[in]* **m** affine transform
| *[in]* **v** scale vector [x, y]
| *[out]* **dest** scaled matrix
@@ -95,7 +95,7 @@ Functions:
creates NEW 2d scale matrix by *v* vector
Parameters:
| *[in, out]* **m** affine transfrom
| *[in, out]* **m** affine transform
| *[in]* **v** scale vector [x, y]
.. 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
Parameters:
| *[in, out]* **m** affine transfrom
| *[in, out]* **m** affine transform
| *[in]* **v** translate vector [x, y]
.. 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
Parameters:
| *[in, out]* **m** affine transfrom
| *[in, out]* **m** affine transform
| *[in]* **s** scale factor
.. c:function:: void glm_rotate2d_make(mat3 m, float angle)
@@ -119,7 +119,7 @@ Functions:
creates NEW rotation matrix by angle around *Z* axis
Parameters:
| *[in, out]* **m** affine transfrom
| *[in, out]* **m** affine transform
| *[in]* **angle** angle (radians)
.. 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
Parameters:
| *[in, out]* **m** affine transfrom
| *[in, out]* **m** affine transform
| *[in]* **angle** angle (radians)
.. 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
Parameters:
| *[in]* **m** affine transfrom
| *[in]* **m** affine transform
| *[in]* **angle** angle (radians)
| *[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**
📌 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 you can access items like **.x**, **.y**, **.z**, **.w**, **.r**, **.g**, **.b**, **.a**, **.m00**, **m01**...
@@ -43,6 +43,7 @@ Follow the :doc:`build` documentation for this
cam
frustum
box
aabb2d
quat
euler
mat2
@@ -65,6 +66,7 @@ Follow the :doc:`build` documentation for this
ivec4
color
plane
noise
project
util
io

View File

@@ -9,8 +9,8 @@ By default struct api adds `s` suffix to every type name e.g. vec3s, mat4s, vers
Also struct api `s` suffix to namespace e.g. `glms_vec3_add`, `glms_mat4_mul` etc.
By starting v0.9.0, struct api namespace is configurable. We can omit **glms_** namespace or
even change it with custom name to move existing api integrations to **cglm** more easliy...
We can also add **s** to functin names if we want e.g. `glms_vec3_add()` -> `vec3_add()` or `vec3s_add()`.
even change it with custom name to move existing api integrations to **cglm** more easily...
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.
Since struct apis are inline you don't need to build or link *cglm* against
@@ -91,6 +91,9 @@ To configure the Struct API namespace, you can define the following macros befor
- **CGLM_STRUCT_API_NS**: define name space for struct api, DEFAULT is **glms**
- **CGLM_STRUCT_API_NAME_SUFFIX**: define name suffix, DEFAULT is **empty** e.g defining it as #define CGLM_STRUCT_API_NAME_SUFFIX s will add s suffix to mat4_mul -> mat4s_mul
❗️ IMPORTANT ❗️
It's a good idea to set up your config macros in build settings like CMake, Xcode, or Visual Studio. This is especially important if you're using features like Modules in Xcode, where adding macros directly before the **cglm** headers might not work.
Detailed documentation for Struct API:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

View File

@@ -62,7 +62,7 @@ Functions documentation
| crops a bounding box with another one.
this could be useful for gettng a bbox which fits with view frustum and
this could be useful for getting a bbox which fits with view frustum and
object bounding boxes. In this case you crop view frustum box with objects
box
@@ -75,14 +75,14 @@ Functions documentation
| crops a bounding box with another one.
this could be useful for gettng a bbox which fits with view frustum and
this could be useful for getting a bbox which fits with view frustum and
object bounding boxes. In this case you crop view frustum box with objects
box
Parameters:
| *[in]* **box** bounding box
| *[in]* **cropBox** crop box
| *[in]* **clampBox** miniumum box
| *[in]* **clampBox** minimum box
| *[out]* **dest** cropped bounding box
.. 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.
**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.
Just import cglm to your project as dependency / external lib by copy-paste then use it as usual
.. 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.
Just import cglm to your project as dependency / external lib by copy-paste then use it as usual
CMake (All platforms):
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

View File

@@ -3,17 +3,17 @@
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.
Precompiled versions are in **glmc_** namespace. *c* in the namespace stands for
"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.
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
call versions plus *clgm/cglm.h* (inline verisons)
call versions plus *clgm/cglm.h* (inline versions)

View File

@@ -18,10 +18,10 @@ fast if you don't care specific projection values.
*_decomp* means decompose; these function can help to decompose projection
matrices.
**NOTE**: Be careful when working with high range (very small near, very large
far) projection matrices. You may not get exact value you gave.
**float** type cannot store very high precision so you will lose precision.
Also your projection matrix will be inaccurate due to losing precision
.. note:: Be careful when working with high range (very small near, very large
far) projection matrices. You may not get exact value you gave.
**float** type cannot store very high precision so you will lose precision.
Also your projection matrix will be inaccurate due to losing precision
Table of contents (click to go):
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -36,8 +36,10 @@ Functions:
#. :c:func:`glm_ortho_default`
#. :c:func:`glm_ortho_default_s`
#. :c:func:`glm_perspective`
#. :c:func:`glm_perspective_infinite`
#. :c:func:`glm_persp_move_far`
#. :c:func:`glm_perspective_default`
#. :c:func:`glm_perspective_default_infinite`
#. :c:func:`glm_perspective_resize`
#. :c:func:`glm_lookat`
#. :c:func:`glm_look`
@@ -146,6 +148,21 @@ Functions documentation
| *[in]* **farVal** far clipping planes
| *[out]* **dest** result matrix
.. c:function:: void glm_perspective_infinite(float fovy, float aspect, float nearZ, mat4 dest)
| set up perspective projection matrix with infinite far plane
The far clipping plane is pushed to infinity. This can improve depth
precision for distant objects and is required by some rendering techniques
such as shadow volumes. Dispatches to the appropriate clipspace variant
based on compile-time configuration (LH/RH, NO/ZO).
Parameters:
| *[in]* **fovy** field of view angle (in radians)
| *[in]* **aspect** aspect ratio ( width / height )
| *[in]* **nearZ** near clipping plane
| *[out]* **dest** result matrix
.. c:function:: void glm_persp_move_far(mat4 proj, float deltaFar)
| extend perspective projection matrix's far distance
@@ -165,6 +182,20 @@ Functions documentation
| *[in]* **aspect** aspect aspect ratio ( width / height )
| *[out]* **dest** result matrix
.. c:function:: void glm_perspective_default_infinite(float aspect, mat4 dest)
| set up infinite perspective projection matrix with default near
and angle values
Equivalent to calling :c:func:`glm_perspective_infinite` with
``fovy = GLM_PI_4`` (45°) and ``nearZ = 0.01``. Useful as a
quick drop-in when you need an infinite projection without tuning
the individual parameters.
Parameters:
| *[in]* **aspect** aspect ratio ( width / height )
| *[out]* **dest** result matrix
.. c:function:: void glm_perspective_resize(float aspect, mat4 proj)
| resize perspective matrix by aspect ratio ( width / height )
@@ -178,7 +209,7 @@ Functions documentation
| 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:
| *[in]* **eye** eye vector
@@ -194,7 +225,7 @@ Functions documentation
target self then this might be useful. Because you need to get target
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:
| *[in]* **eye** eye vector
@@ -250,7 +281,7 @@ Functions documentation
.. c:function:: void glm_persp_decomp_y(mat4 proj, float *top, float *bottom)
| 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:
| *[in]* **proj** perspective projection matrix

View File

@@ -62,9 +62,9 @@ author = u'Recep Aslantas'
# built documents.
#
# The short X.Y version.
version = u'0.9.1'
version = u'0.9.6'
# The full version, including alpha/beta/rc tags.
release = u'0.9.1'
release = u'0.9.6'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
@@ -91,6 +91,7 @@ todo_include_todos = False
# a list of builtin themes.
#
html_theme = 'sphinx_rtd_theme'
pygments_style = 'monokai'
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
@@ -111,8 +112,11 @@ html_theme_options = {
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
# html_static_path = ['_static']
html_static_path = ['sphinx-static']
# Add customm CSS and JS files
html_css_files = ['theme_overrides.css']
html_js_files = []
# -- Options for HTMLHelp output ------------------------------------------

View File

@@ -2,7 +2,7 @@ Features
================================================================================
* **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.
* general purpose matrix operations (mat4, mat3)
* chain matrix multiplication (square only)
@@ -18,6 +18,7 @@ Features
* inline or pre-compiled function call
* frustum (extract view frustum planes, corners...)
* bounding box (AABB in Frustum (culling), crop, merge...)
* 2d bounding box (crop, merge...)
* bounding sphere
* project, unproject
* easing functions

View File

@@ -11,9 +11,9 @@ not **vec3**. If you want to store them to save space you msut convert them
yourself.
**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.
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];
#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*
Alignment Is Required:
@@ -35,16 +35,16 @@ Alignment Is Required:
| 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:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*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.
**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.
There is no guarantee that non-CGLM matrix is aligned. Unaligned types will have *u* prefix e.g. **umat4**
.. 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.
There is no guarantee that non-CGLM matrix is aligned. Unaligned types will have *u* prefix e.g. **umat4**
Array vs Struct:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

View File

@@ -24,12 +24,12 @@ Example to print mat4 matrix:
/* ... */
glm_mat4_print(transform, stderr);
**NOTE:** print functions use **%0.4f** precision if you need more
(you probably will in some cases), you can change it temporary.
cglm may provide precision parameter in the future
.. note:: print functions use **%0.4f** precision if you need more
(you probably will in some cases), you can change it temporary.
cglm may provide precision parameter in the future.
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 ;)
* Some print improvements
* New options with default values:
@@ -53,8 +53,11 @@ Functions:
1. :c:func:`glm_mat4_print`
#. :c:func:`glm_mat3_print`
#. :c:func:`glm_vec4_print`
#. :c:func:`glm_ivec4_print`
#. :c:func:`glm_vec3_print`
#. :c:func:`glm_ivec3_print`
#. :c:func:`glm_vec2_print`
#. :c:func:`glm_ivec2_print`
#. :c:func:`glm_versor_print`
#. :c:func:`glm_aabb_print`
@@ -63,7 +66,7 @@ Functions documentation
.. c:function:: void glm_mat4_print(mat4 matrix, FILE * __restrict ostream)
| print mat4 to given stream
| print matrix to given stream
Parameters:
| *[in]* **matrix** matrix
@@ -71,7 +74,7 @@ Functions documentation
.. c:function:: void glm_mat3_print(mat3 matrix, FILE * __restrict ostream)
| print mat3 to given stream
| print matrix to given stream
Parameters:
| *[in]* **matrix** matrix
@@ -79,7 +82,15 @@ Functions documentation
.. 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:
| *[in]* **vec** vector
@@ -87,7 +98,7 @@ Functions documentation
.. c:function:: void glm_vec3_print(vec3 vec, FILE * __restrict ostream)
| print vec3 to given stream
| print vector to given stream
Parameters:
| *[in]* **vec** vector
@@ -95,12 +106,29 @@ Functions documentation
.. c:function:: void glm_ivec3_print(ivec3 vec, FILE * __restrict ostream)
| print ivec3 to given stream
| print vector to given stream
Parameters:
| *[in]* **vec** vector
| *[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)
| print quaternion to given stream
@@ -115,5 +143,5 @@ Functions documentation
Parameters:
| *[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

View File

@@ -21,12 +21,17 @@ Functions:
#. :c:func:`glm_ivec2_copy`
#. :c:func:`glm_ivec2_zero`
#. :c:func:`glm_ivec2_one`
#. :c:func:`glm_ivec2_dot`
#. :c:func:`glm_ivec2_cross`
#. :c:func:`glm_ivec2_add`
#. :c:func:`glm_ivec2_adds`
#. :c:func:`glm_ivec2_sub`
#. :c:func:`glm_ivec2_subs`
#. :c:func:`glm_ivec2_mul`
#. :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_distance`
#. :c:func:`glm_ivec2_maxv`
@@ -67,6 +72,30 @@ Functions documentation
Parameters:
| *[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)
add vector [a] to vector [b] and store result in [dest]
@@ -121,6 +150,33 @@ Functions documentation
| *[in]* **s** scalar
| *[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)
squared distance between two vectors
@@ -143,6 +199,31 @@ Functions documentation
Returns:
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)
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_zero`
#. :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_adds`
#. :c:func:`glm_ivec3_sub`
#. :c:func:`glm_ivec3_subs`
#. :c:func:`glm_ivec3_mul`
#. :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_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_minv`
#. :c:func:`glm_ivec3_clamp`
@@ -67,6 +76,39 @@ Functions documentation
Parameters:
| *[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)
add vector [a] to vector [b] and store result in [dest]
@@ -121,6 +163,33 @@ Functions documentation
| *[in]* **s** scalar
| *[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)
squared distance between two vectors
@@ -143,6 +212,30 @@ Functions documentation
Returns:
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)
set each member of dest to greater of vector a and b

View File

@@ -10,182 +10,862 @@ Table of contents (click to go):
Macros:
1. GLM_mat2_IDENTITY_INIT
#. GLM_mat2_ZERO_INIT
#. GLM_mat2_IDENTITY
#. GLM_mat2_ZERO
1. GLM_MAT2_IDENTITY_INIT
#. GLM_MAT2_ZERO_INIT
#. GLM_MAT2_IDENTITY
#. GLM_MAT2_ZERO
Functions:
1. :c:func:`glm_mat2_copy`
1. :c:func:`glm_mat2_make`
#. :c:func:`glm_mat2_copy`
#. :c:func:`glm_mat2_identity`
#. :c:func:`glm_mat2_identity_array`
#. :c:func:`glm_mat2_zero`
#. :c:func:`glm_mat2_mul`
#. :c:func:`glm_mat2_mulv`
#. :c:func:`glm_mat2_transpose_to`
#. :c:func:`glm_mat2_transpose`
#. :c:func:`glm_mat2_mulv`
#. :c:func:`glm_mat2_scale`
#. :c:func:`glm_mat2_det`
#. :c:func:`glm_mat2_inv`
#. :c:func:`glm_mat2_trace`
#. :c:func:`glm_mat2_swap_col`
#. :c:func:`glm_mat2_swap_row`
#. :c:func:`glm_mat2_det`
#. :c:func:`glm_mat2_trace`
#. :c:func:`glm_mat2_rmc`
#. :c:func:`glm_mat2_make`
Represented
~~~~~~~~~~~
.. csv-table:: mat2x2
:header: "", "column 1", "column 2"
"row 1", "m00", "m10"
"row 2", "m01", "m11"
Functions documentation
~~~~~~~~~~~~~~~~~~~~~~~
.. c:function:: void glm_mat2_copy(mat2 mat, mat2 dest)
.. c:function:: void glm_mat2_make(const float * __restrict src, mat2 dest)
copy mat2 to another one (dest).
Create mat2 (dest) from pointer (src).
.. note:: **@src** must contain at least 4 elements.
Parameters:
| *[in]* **mat** source
| *[out]* **dest** destination
| *[in]* **src** pointer to an array of floats (left)
| *[out]* **dest** destination (result, mat2)
.. c:function:: void glm_mat2_identity(mat2 mat)
.. note:: Mathematical explanation
copy identity mat2 to mat, or makes mat to identiy
.. csv-table:: float array (1x4) **(src)**
:header: "", "column 1"
Parameters:
| *[out]* **mat** matrix
"row 1", "v0"
"row 2", "v1"
"row 3", "v2"
"row 4", "v3"
.. c:function:: void glm_mat2_identity_array(mat2 * __restrict mat, size_t count)
.. csv-table:: mat2 **(dest)**
:header: "", "column 1", "column 2"
make given matrix array's each element identity matrix
"row 1", "v0", "v2"
"row 2", "v1", "v3"
Parameters:
| *[in,out]* **mat** matrix array (must be aligned (16/32) if alignment is not disabled)
| *[in]* **count** count of matrices
.. c:function:: void glm_mat2_zero(mat2 mat)
make given matrix zero
Parameters:
| *[in,out]* **mat** matrix
.. c:function:: void glm_mat2_mul(mat2 m1, mat2 m2, mat2 dest)
multiply m1 and m2 to dest
m1, m2 and dest matrices can be same matrix, it is possible to write this:
.. note:: Example
.. code-block:: c
mat2 m = GLM_mat2_IDENTITY_INIT;
mat2 dest = GLM_MAT2_ZERO_INIT;
float src[4] = { 1.00, 5.00, 8.00, 11.00 };
glm_mat2_make(src, dest);
.. csv-table:: float array (1x4) **(src)**
:header: "", "column 1"
"row 1", "1.00"
"row 2", "5.00"
"row 3", "8.00"
"row 4", "11.00"
.. csv-table:: mat2 **(dest)** Before
:header: "", "column 1", "column 2"
"row 1", "0.00", "0.00"
"row 2", "0.00", "0.00"
.. csv-table:: mat2 **(dest)** After
:header: "", "column 1", "column 2"
"row 1", "1.00", "8.00"
"row 2", "5.00", "11.00"
.. c:function:: void glm_mat2_copy(mat2 mat, mat2 dest)
Copy mat2 (mat) to mat2 (dest).
Parameters:
| *[in]* **mat** mat2 (left,src)
| *[out]* **dest** destination (result, mat2)
.. note:: Mathematical explanation
.. csv-table:: mat2 **(mat)**
:header: "", "column 1", "column 2"
"row 1", "m00", "m10"
"row 2", "m01", "m11"
.. csv-table:: mat2 **(dest)**
:header: "", "column 1", "column 2"
"row 1", "m00", "m10"
"row 2", "m01", "m11"
.. note:: Example
.. code-block:: c
mat2 mat = {{3.00,4.00},{7.00,8.00}};
mat2 dest = GLM_MAT2_ZERO_INIT;
glm_mat2_copy(mat, dest);
.. csv-table:: mat2 **(mat)**
:header: "", "column 1", "column 2"
"row 1", "3.00", "7.00"
"row 2", "4.00", "8.00"
.. csv-table:: mat2 **(dest)** Before
:header: "", "column 1", "column 2"
"row 1", "0.00", "0.00"
"row 2", "0.00", "0.00"
.. csv-table:: mat2 **(dest)** After
:header: "", "column 1", "column 2"
"row 1", "3.00", "7.00"
"row 2", "4.00", "8.00"
.. c:function:: void glm_mat2_identity(mat2 m)
| Copy a mat2 identity to mat2 **(m)**, or makes mat2 **(m)** an identity.
|
| The same thing may be achieved with either of bellow methods,
| but it is more easy to do that with this func especially for members
| e.g. ``glm_mat2_identity(aStruct->aMatrix);``.
.. code-block:: c
glm_mat2_copy(GLM_MAT2_IDENTITY, m);
// or
mat2 mat = GLM_MAT2_IDENTITY_INIT;
Parameters:
| *[in, out]* **m** mat2 (src, dest)
.. note:: Mathematical explanation
.. csv-table:: mat2 **(m)**
:header: "", "column 1", "column 2"
"row 1", "m00", "m10"
"row 2", "m01", "m11"
.. csv-table:: mat2 **(m)**
:header: "", "column 1", "column 2"
"row 1", "1.00", "0.00"
"row 2", "0.00", "1.00"
.. note:: Example
.. code-block:: c
mat2 m = {{3.00,4.00},{7.00,8.00}};
glm_mat2_identity(m);
.. csv-table:: mat2 **(m)**
:header: "", "column 1", "column 2"
"row 1", "3.00", "7.00"
"row 2", "4.00", "8.00"
.. csv-table:: mat2 **(m)**
:header: "", "column 1", "column 2"
"row 1", "1.00", "0.00"
"row 2", "0.00", "1.00"
.. c:function:: void glm_mat2_identity_array(mat2 * __restrict mats, size_t count)
Given an array of mat2's **(mats)** make each matrix an identity matrix.
Parameters:
| *[in, out]* **mats** Array of mat2's (must be aligned (16/32) if alignment is not disabled)
| *[in]* **count** Array size of ``mats`` or number of matrices
.. note:: Mathematical explanation
.. csv-table:: mat2 **(mats[index])**
:header: "", "column 1", "column 2"
"row 1", "m00", "m10"
"row 2", "m01", "m11"
.. csv-table:: mat2 **(mats[index])**
:header: "", "column 1", "column 2"
"row 1", "1.00", "0.00"
"row 2", "0.00", "1.00"
.. note:: Example
.. code-block:: c
size_t count = 3;
mat2 matrices[count] = {
{{1.00,2.00},{5.00,6.00}},
{{3.00,4.00},{7.00,8.00}},
{{5.00,6.00},{9.00,10.00}},
};
glm_mat2_identity_array(matrices, count);
.. csv-table:: mat2 **(mats[0])** Before
:header: "", "column 1", "column 2"
"row 1", "1.00", "5.00"
"row 2", "2.00", "6.00"
.. csv-table:: mat2 **(mats[0])** After
:header: "", "column 1", "column 2"
"row 1", "1.00", "0.00"
"row 2", "0.00", "1.00"
.. csv-table:: mat2 **(mats[1])** Before
:header: "", "column 1", "column 2"
"row 1", "3.00", "7.00"
"row 2", "4.00", "8.00"
.. csv-table:: mat2 **(mats[1])** After
:header: "", "column 1", "column 2"
"row 1", "1.00", "0.00"
"row 2", "0.00", "1.00"
.. csv-table:: mat2 **(mats[2])** Before
:header: "", "column 1", "column 2"
"row 1", "5.00", "9.00"
"row 2", "6.00", "10.00"
.. csv-table:: mat2 **(mats[2])** After
:header: "", "column 1", "column 2"
"row 1", "1.00", "0.00"
"row 2", "0.00", "1.00"
.. c:function:: void glm_mat2_zero(mat2 m)
Zero out the mat2 (m).
Parameters:
| *[in, out]* **m** mat2 (src, dest)
.. note:: Mathematical explanation
.. csv-table:: mat2 **(m)**
:header: "", "column 1", "column 2"
"row 1", "m00", "m10"
"row 2", "m01", "m11"
.. csv-table:: mat2 **(m)**
:header: "", "column 1", "column 2"
"row 1", "0.00", "0.00"
"row 2", "0.00", "0.00"
.. note:: Example
.. code-block:: c
mat2 m = {{19.00,5.00},{2.00,4.00}};
glm_mat2_zero(m);
.. csv-table:: mat2 **(m)** Before
:header: "", "column 1", "column 2"
"row 1", "19.00", "2.00"
"row 2", "5.00", "4.00"
.. csv-table:: mat2 **(m)** After
:header: "", "column 1", "column 2"
"row 1", "0.00", "0.00"
"row 2", "0.00", "0.00"
.. c:function:: void glm_mat2_mul(mat2 m1, mat2 m2, mat2 dest)
| Multiply mat2 (m1) by mat2 (m2) and store in mat2 (dest).
|
| m1, m2 and dest matrices can be same matrix, it is possible to write this:
.. code-block:: c
mat2 m = GLM_MAT2_IDENTITY_INIT;
glm_mat2_mul(m, m, m);
Parameters:
| *[in]* **m1** left matrix
| *[in]* **m2** right matrix
| *[out]* **dest** destination matrix
| *[in]* **m1** mat2 (left)
| *[in]* **m2** mat2 (right)
| *[out]* **dest** destination (result, mat2)
.. c:function:: void glm_mat2_transpose_to(mat2 m, mat2 dest)
.. note:: Mathematical explanation
transpose mat4 and store in dest
source matrix will not be transposed unless dest is m
.. csv-table:: mat2 **(m1)**
:header: "", "column 1", "column 2"
Parameters:
| *[in]* **mat** source
| *[out]* **dest** destination
"row 1", "a00", "a10"
"row 2", "a01", "a11"
.. c:function:: void glm_mat2_transpose(mat2 m)
.. csv-table:: mat2 **(m2)**
:header: "", "column 1", "column 2"
tranpose mat2 and store result in same matrix
"row 1", "b00", "b10"
"row 2", "b01", "b11"
Parameters:
| *[in]* **mat** source
| *[out]* **dest** destination
.. csv-table:: mat2 **(dest)**
:header: "", "column 1", "column 2"
"row 1", "a00 * b00 + a10 * b01", "a00 * b10 + a10 * b11"
"row 2", "a01 * b00 + a11 * b01", "a01 * b10 + a11 * b11"
.. note:: Example
.. code-block:: c
mat2 m = {{19.00,5.00},{2.00,4.00}};
glm_mat2_mul(m, m, m);
.. csv-table:: mat2 **(m1)**
:header: "", "column 1", "column 2"
"row 1", "19.00", "2.00"
"row 2", "5.00", "4.00"
.. csv-table:: mat2 **(m2)**
:header: "", "column 1", "column 2"
"row 1", "19.00", "2.00"
"row 2", "5.00", "4.00"
.. csv-table:: mat2 **(dest)**
:header: "", "column 1", "column 2"
"row 1", "**371.00** = 19.00 * 19.00 + 2.00 * 5.00", "**46.00** = 19.00 * 2.00 + 2.00 * 4.00"
"row 2", "**115.00** = 5.00 * 19.00 + 4.00 * 5.00", "**18.00** = 5.00 * 2.00 + 4.00 * 4.00"
.. c:function:: void glm_mat2_mulv(mat2 m, vec2 v, vec2 dest)
multiply mat2 with vec2 (column vector) and store in dest vector
Multiply mat2 (m) by vec2 (v) and store in vec2 (dest).
Parameters:
| *[in]* **mat** mat2 (left)
| *[in]* **v** vec2 (right, column vector)
| *[out]* **dest** destination (result, column vector)
| *[in]* **m** mat2 (left)
| *[in]* **v** vec2 (right, column vector)
| *[out]* **dest** destination (result, column vector)
.. c:function:: void glm_mat2_scale(mat2 m, float s)
.. note:: Mathematical explanation
multiply matrix with scalar
.. csv-table:: mat2 **(m)**
:header: "", "column 1", "column 2"
"row 1", "m00", "m10"
"row 2", "m01", "m11"
.. csv-table:: column vec2 (1x2) **(v)**
:header: "", "column 1"
"row 1", "v0"
"row 2", "v1"
.. csv-table:: column vec2 (1x2) **(dest)**
:header: "", "column 1"
"row 1", "m00 * v0 + m10 * v1"
"row 2", "m01 * v0 + m11 * v1"
.. note:: Example
.. code-block:: c
vec2 dest;
vec2 v = {33.00,55.00};
mat2 m = {{1.00,2.00},{3.00,4.00}};
glm_mat2_mulv(m, v, dest);
.. csv-table:: mat2 **(m)**
:header: "", "column 1", "column 2"
"row 1", "1.00", "3.00"
"row 2", "2.00", "4.00"
.. csv-table:: column vec2 **(v)**
:header: "", "column 1"
"row 1", "33.00"
"row 2", "55.00"
.. csv-table:: vec2 **(dest)** Result
:header: "", "column 1"
"row 1", "**198.00** = 1.00 * 33.00 + 3.00 * 55.00"
"row 2", "**286.00** = 2.00 * 33.00 + 4.00 * 55.00"
.. c:function:: void glm_mat2_transpose_to(mat2 mat, mat2 dest)
Transpose mat2 (mat) and store in mat2 (dest).
Parameters:
| *[in, out]* **m** matrix
| *[in]* **s** scalar
| *[in]* **mat** mat2 (left,src)
| *[out]* **dest** destination (result, mat2)
.. c:function:: float glm_mat2_det(mat2 mat)
.. note:: Mathematical explanation
returns mat2 determinant
.. csv-table:: mat2 **(mat)**
:header: "", "column 1", "column 2"
"row 1", "m00", "m10"
"row 2", "m01", "m11"
.. csv-table:: mat2 **(dest)**
:header: "", "column 1", "column 2"
"row 1", "m00", "m01"
"row 2", "m10", "m11"
.. note:: Example
.. code-block:: c
mat2 mat = {{1.00,2.00},{3.00,4.00}};
mat2 dest = GLM_MAT2_ZERO_INIT;
glm_mat2_transpose_to(mat, dest);
.. csv-table:: mat2 **(mat)**
:header: "", "column 1", "column 2"
"row 1", "1.00", "3.00"
"row 2", "2.00", "4.00"
.. csv-table:: mat2 **(dest)** Before
:header: "", "column 1", "column 2"
"row 1", "0.00", "0.00"
"row 2", "0.00", "0.00"
.. csv-table:: mat2 **(dest)** After
:header: "", "column 1", "column 2"
"row 1", "1.00", "2.00"
"row 2", "3.00", "4.00"
.. c:function:: void glm_mat2_transpose(mat2 m)
Transpose mat2 (m) and store result in the same matrix.
Parameters:
| *[in]* **mat** matrix
| *[in, out]* **m** mat2 (src, dest)
Returns:
mat2 determinant
.. note:: Mathematical explanation
.. csv-table:: mat2 **(m)** src
:header: "", "column 1", "column 2"
"row 1", "m00", "m10"
"row 2", "m01", "m11"
.. csv-table:: mat2 **(m)** dest
:header: "", "column 1", "column 2"
"row 1", "m00", "m01"
"row 2", "m10", "m11"
.. note:: Example
.. code-block:: c
mat2 m = {{1.00,2.00},{3.00,4.00}};
glm_mat2_transpose(m);
.. csv-table:: mat2 **(m)** Before
:header: "", "column 1", "column 2"
"row 1", "1.00", "3.00"
"row 2", "2.00", "4.00"
.. csv-table:: mat2 **(m)** After
:header: "", "column 1", "column 2"
"row 1", "1.00", "2.00"
"row 2", "3.00", "4.00"
.. c:function:: void glm_mat2_scale(mat2 m, float s)
Multiply mat2 (m) by scalar constant (s).
Parameters:
| *[in, out]* **m** mat2 (src, dest)
| *[in]* **s** float (scalar)
.. note:: Mathematical explanation
.. csv-table:: mat2 **(m)**
:header: "", "column 1", "column 2"
"row 1", "m00 * s", "m10 * s"
"row 2", "m01 * s", "m11 * s"
.. note:: Example
.. code-block:: c
float s = 3.00f;
mat2 m = {{1.00,2.00},{3.00,4.00}};
glm_mat2_scale(m, s);
.. csv-table:: mat2 **(m)** Before
:header: "", "column 1", "column 2"
"row 1", "1.00", "3.00"
"row 2", "2.00", "4.00"
.. csv-table:: mat2 **(m)** After
:header: "", "column 1", "column 2"
"row 1", "**3.00** = 1.00 * 3.00", "**9.00** = 3.00 * 3.00"
"row 2", "**6.00** = 2.00 * 3.00", "**12.00** = 4.00 * 3.00"
.. c:function:: void glm_mat2_inv(mat2 mat, mat2 dest)
inverse mat2 and store in dest
Inverse mat2 (mat) and store in mat2 (dest).
Parameters:
| *[in]* **mat** matrix
| *[out]* **dest** destination (inverse matrix)
| *[in]* **mat** mat2 (left,src)
| *[out]* **dest** destination (result, inverse mat2)
.. c:function:: void glm_mat2_trace(mat2 m)
.. note:: Mathematical explanation
| sum of the elements on the main diagonal from upper left to the lower right
.. csv-table:: mat2 **(mat)**
:header: "", "column 1", "column 2"
Parameters:
| *[in]* **m** matrix
"row 1", "m00", "m10"
"row 2", "m01", "m11"
Returns:
trace of matrix
.. list-table:: mat2 **(dest)**
:header-rows: 1
* -
- column 1
- column 2
* - row 1
- m11 * (1.0f / (m00 * m11 - m01 * m10))
- -m10 * (1.0f / (m00 * m11 - m01 * m10))
* - row 2
- -m01 * (1.0f / (m00 * m11 - m01 * m10))
- m00 * (1.0f / (m00 * m11 - m01 * m10))
.. note:: Example
.. code-block:: c
mat2 dest = GLM_MAT2_ZERO_INIT;
mat2 mat = {{1.00,2.00},{3.00,4.00}};
glm_mat2_inv(mat, dest);
.. csv-table:: mat2 **(mat)** Before
:header: "", "column 1", "column 2"
"row 1", "1.00", "3.00"
"row 2", "2.00", "4.00"
.. list-table:: mat2 **(dest)** After
:header-rows: 1
* -
- column 1
- column 2
* - row 1
- **-2.00** = 4.00 * (1.00 / (1.00 * 4.00 - 2.00 * 3.00))
- **1.50** = -3.00 * (1.00 / (1.00 * 4.00 - 2.00 * 3.00))
* - row 2
- **1.00** = -2.00 * (1.00 / (1.00 * 4.00 - 2.00 * 3.00))
- **-0.50** = 1.00 * (1.00 / (1.00 * 4.00 - 2.00 * 3.00))
.. c:function:: void glm_mat2_swap_col(mat2 mat, int col1, int col2)
swap two matrix columns
Swap two columns in mat2 (mat) and store in same matrix.
Parameters:
| *[in, out]* **mat** matrix
| *[in]* **col1** col1
| *[in]* **col2** col2
| *[in, out]* **mat** mat2 (src, dest)
| *[in]* **col1** Column 1 array index
| *[in]* **col2** Column 2 array index
.. note:: Mathematical explanation
.. csv-table:: mat2 **(mat)** Before
:header: "", "column 1", "column 2"
"row 1", "m00", "m10"
"row 2", "m01", "m11"
.. code-block:: c
glm_mat2_swap_col(mat, 0, 1);
.. csv-table:: mat2 **(mat)** After
:header: "", "column 1", "column 2"
"row 1", "m10", "m00"
"row 2", "m11", "m01"
.. note:: Example
.. code-block:: c
mat2 mat = {{76.00,5.00},{3.00,6.00}};
glm_mat2_swap_col(mat, 0, 1);
.. csv-table:: mat2 **(mat)** Before
:header: "", "column 1", "column 2"
"row 1", "76.00", "3.00"
"row 2", "5.00", "6.00"
.. csv-table:: mat2 **(mat)** After
:header: "", "column 1", "column 2"
"row 1", "3.00", "76.00"
"row 2", "6.00", "5.00"
.. c:function:: void glm_mat2_swap_row(mat2 mat, int row1, int row2)
swap two matrix rows
Swap two rows in mat2 (mat) and store in same matrix.
Parameters:
| *[in, out]* **mat** matrix
| *[in]* **row1** row1
| *[in]* **row2** row2
| *[in, out]* **mat** mat2 (src, dest)
| *[in]* **row1** Row 1 array index
| *[in]* **row2** Row 2 array index
.. note:: Mathematical explanation
.. csv-table:: mat2 **(mat)** Before
:header: "", "column 1", "column 2"
"row 1", "m00", "m10"
"row 2", "m01", "m11"
.. code-block:: c
glm_mat2_swap_row(mat, 0, 1);
.. csv-table:: mat2 **(mat)** After
:header: "", "column 1", "column 2"
"row 1", "m01", "m11"
"row 2", "m00", "m10"
.. note:: Example
.. code-block:: c
mat2 mat = {{76.00,5.00},{3.00,6.00}};
glm_mat2_swap_row(mat, 0, 1);
.. csv-table:: mat2 **(mat)** Before
:header: "", "column 1", "column 2"
"row 1", "76.00", "3.00"
"row 2", "5.00", "6.00"
.. csv-table:: mat2 **(mat)** After
:header: "", "column 1", "column 2"
"row 1", "5.00", "6.00"
"row 2", "76.00", "3.00"
.. c:function:: float glm_mat2_det(mat2 m)
Returns mat2 determinant.
Parameters:
| *[in]* **m** mat2 (src)
Returns:
| mat2 determinant (float)
.. note:: Mathematical explanation
.. csv-table:: mat2 **(m)**
:header: "", "column 1", "column 2"
"row 1", "m00", "m10"
"row 2", "m01", "m11"
.. code-block:: c
m00 * m11 - m10 * m01;
.. note:: Example
.. code-block:: c
mat2 m = {{76.00,5.00},{3.00,6.00}};
glm_mat2_det(m);
.. csv-table:: mat2 **(m)**
:header: "", "column 1", "column 2"
"row 1", "76.00", "3.00"
"row 2", "5.00", "6.00"
.. code-block:: c
441.00 = 76.00 * 6.00 - 3.00 * 5.00;
.. c:function:: void glm_mat2_trace(mat2 m)
| Returns trace of matrix. Which is:
|
| The sum of the elements on the main diagonal from
| upper left corner to the bottom right corner.
Parameters:
| *[in]* **m** mat2 (src)
Returns:
| mat2 trace (float)
.. note:: Mathematical explanation
.. csv-table:: mat2 **(m)**
:header: "", "column 1", "column 2"
"row 1", "m00", "m10"
"row 2", "m01", "m11"
.. code-block:: c
m00 + m11;
.. note:: Example
.. code-block:: c
mat2 m = {{76.00,5.00},{3.00,6.00}};
glm_mat2_trace(m);
.. csv-table:: mat2 **(m)**
:header: "", "column 1", "column 2"
"row 1", "76.00", "3.00"
"row 2", "5.00", "6.00"
.. code-block:: c
82.00 = 76.00 + 6.00;
.. c:function:: float glm_mat2_rmc(vec2 r, mat2 m, vec2 c)
| Helper for R (row vector) * M (matrix) * C (column vector)
| **rmc** stands for **Row** * **Matrix** * **Column**
| helper for R (row vector) * M (matrix) * C (column vector)
| the result is scalar because R * M = Matrix1x2 (row vector),
| then Matrix1x2 * Vec2 (column vector) = Matrix1x1 (Scalar)
| the result is scalar because M * C = ResC (1x2, column vector),
| then if you take the dot_product(R (2x1), ResC (1x2)) = scalar value.
Parameters:
| *[in]* **r** row vector or matrix1x2
| *[in]* **m** matrix2x2
| *[in]* **c** column vector or matrix2x1
| *[in]* **r** vec2 (2x1, row vector)
| *[in]* **m** mat2 (2x2, matrix)
| *[in]* **c** vec2 (1x2, column vector)
Returns:
scalar value e.g. Matrix1x1
| Scalar value (float, 1x1)
.. c:function:: void glm_mat2_make(float * __restrict src, mat2 dest)
.. note:: Mathematical explanation
Create mat2 matrix from pointer
.. csv-table:: row vec2 (2x1) **(r)**
:header: "", "column 1", "column 2"
| NOTE: **@src** must contain at least 4 elements.
"row 1", "a00", "a10"
Parameters:
| *[in]* **src** pointer to an array of floats
| *[out]* **dest** destination matrix2x2
.. csv-table:: mat2 **(m)**
:header: "", "column 1", "column 2"
"row 1", "b00", "b10"
"row 2", "b01", "b11"
.. csv-table:: column vec2 (1x2) **(c)**
:header: "", "column 1"
"row 1", "c00"
"row 2", "c01"
.. code-block:: c
M * C = C (column vector)
dot_product(R, C)
.. csv-table:: column vec2 (1x2) **(C)**
:header: "", "column 1"
"row 1", "b00 * c00 + b10 * c01"
"row 2", "b01 * c00 + b11 * c01"
.. csv-table:: float **(scalar)**
:header: "", "column 1"
"row 1", "a00 * (b00 * c00 + b10 * c01) + a10 * (b01 * c00 + b11 * c01)"
.. note:: Example
.. code-block:: c
vec2 r = {8.00,4.00};
vec2 c = {7.00,2.00};
mat2 m = {{5.00,9.00},{3.00,6.00}};
glm_mat2_rmc(r, m, c);
.. csv-table:: row vec2 (2x1) **(r)**
:header: "", "column 1", "column 2"
"row 1", "8.00", "4.00"
.. csv-table:: mat2 **(m)**
:header: "", "column 1", "column 2"
"row 1", "5.00", "3.00"
"row 2", "9.00", "6.00"
.. csv-table:: column vec2 (1x2) **(c)**
:header: "", "column 1"
"row 1", "7.00"
"row 2", "2.00"
.. csv-table:: column vec2 (1x2) **(C)**
:header: "", "column 1"
"row 1", "**41.00** = 5.00 * 7.00 + 3.00 * 2.00"
"row 2", "**75.00** = 9.00 * 7.00 + 6.00 * 2.00"
.. csv-table:: float (1x1) **(scalar)**
:header: "", "column 1"
"row 1", "**628.00** = 8.00 * 41.00 + 4.00 * 75.00"

View File

@@ -23,70 +23,183 @@ Functions:
#. :c:func:`glm_mat2x3_transpose`
#. :c:func:`glm_mat2x3_scale`
Represented
~~~~~~~~~~~
.. csv-table:: mat2x3
:header: "", "column 1", "column 2"
"row 1", "m00", "m10"
"row 2", "m01", "m11"
"row 3", "m02", "m12"
Functions documentation
~~~~~~~~~~~~~~~~~~~~~~~
.. c:function:: void glm_mat2x3_copy(mat2x3 mat, mat2x3 dest)
.. c:function:: void glm_mat2x3_copy(mat2x3 src, mat2x3 dest)
copy mat2x3 to another one (dest).
Copy mat2x3 (src) to mat2x3 (dest).
Parameters:
| *[in]* **mat** source
| *[out]* **dest** destination
| *[in]* **src** mat2x3 (left)
| *[out]* **dest** destination (result, mat2x3)
.. c:function:: void glm_mat2x3_zero(mat2x3 mat)
.. csv-table:: mat2x3 **(src)**
:header: "", "column 1", "column 2"
make given matrix zero
"row 1", "a00", "a10"
"row 2", "a01", "a11"
"row 3", "a02", "a12"
.. csv-table:: mat2x3 **(dest)**
:header: "", "column 1", "column 2"
"row 1", "b00 = a00", "b10 = a10"
"row 2", "b01 = a01", "b11 = a11"
"row 3", "b02 = a02", "b12 = a12"
.. c:function:: void glm_mat2x3_zero(mat2x3 m)
Zero out the mat2x3 (m).
Parameters:
| *[in,out]* **mat** matrix
| *[in, out]* **m** mat2x3 (src, dest)
.. c:function:: void glm_mat2x3_make(float * __restrict src, mat2x3 dest)
.. csv-table:: mat2x3 **(m)**
:header: "", "column 1", "column 2"
Create mat2x3 matrix from pointer
"row 1", "0.00", "2.00"
"row 2", "5.00", "4.00"
"row 3", "7.00", "6.00"
| NOTE: **@src** must contain at least 6 elements.
.. csv-table:: mat2x3 **(m)**
:header: "", "column 1", "column 2"
"row 1", "0.00", "0.00"
"row 2", "0.00", "0.00"
"row 3", "0.00", "0.00"
.. c:function:: void glm_mat2x3_make(const float * __restrict src, mat2x3 dest)
Create mat2x3 (dest) from pointer (src).
.. note:: **@src** must contain at least 6 elements.
Parameters:
| *[in]* **src** pointer to an array of floats
| *[out]* **dest** destination matrix2x3
| *[in]* **src** pointer to an array of floats (left)
| *[out]* **dest** destination (result, mat2x3)
.. c:function:: void glm_mat2x3_mul(mat2x3 m1, mat3x2 m2, mat2 dest)
.. csv-table:: float array (1x6) **(src)**
:header: "", "column 1"
multiply m1 and m2 to dest
"row 1", "v0"
"row 2", "v1"
"row 3", "v2"
"row 4", "v3"
"row 5", "v4"
"row 6", "v5"
m1, m2 and dest matrices can be same matrix, it is possible to write this:
.. csv-table:: mat2x3 **(dest)**
:header: "", "column 1", "column 2"
"row 1", "v0", "v3"
"row 2", "v1", "v4"
"row 3", "v2", "v5"
.. c:function:: void glm_mat2x3_mul(mat2x3 m1, mat3x2 m2, mat3 dest)
Multiply mat2x3 (m1) by mat3x2 (m2) and store in mat3 (dest).
.. code-block:: c
glm_mat2x3_mul(m, m, m);
glm_mat2x3_mul(mat2x3, mat3x2, mat3);
Parameters:
| *[in]* **m1** left matrix
| *[in]* **m2** right matrix
| *[out]* **dest** destination matrix
| *[in]* **m1** mat2x3 (left)
| *[in]* **m2** mat3x2 (right)
| *[out]* **dest** destination (result, mat3)
.. c:function:: void glm_mat2x3_mulv(mat2x3 m, vec3 v, vec2 dest)
.. csv-table:: mat2x3 **(m1)**
:header: "", "column 1", "column 2"
multiply mat2x3 with vec3 (column vector) and store in dest vector
"row 1", "a00", "a10"
"row 2", "a01", "a11"
"row 3", "a02", "a12"
.. csv-table:: mat3x2 **(m2)**
:header: "", "column 1", "column 2", "column 3"
"row 1", "b00", "b10", "b20"
"row 2", "b01", "b11", "b21"
.. csv-table:: mat3 **(dest)**
:header: "", "column 1", "column 2", "column 3"
"row 1", "a00 * b00 + a10 * b01", "a00 * b10 + a10 * b11", "a00 * b20 + a10 * b21"
"row 2", "a01 * b00 + a11 * b01", "a01 * b10 + a11 * b11", "a01 * b20 + a11 * b21"
"row 3", "a02 * b00 + a12 * b01", "a02 * b10 + a12 * b11", "a02 * b20 + a12 * b21"
.. c:function:: void glm_mat2x3_mulv(mat2x3 m, vec2 v, vec3 dest)
Multiply mat2x3 (m) by vec2 (v) and store in vec3 (dest).
Parameters:
| *[in]* **m** mat2x3 (left)
| *[in]* **v** vec3 (right, column vector)
| *[out]* **dest** destination (result, column vector)
| *[in]* **m** mat2x3 (left)
| *[in]* **v** vec2 (right, column vector)
| *[out]* **dest** destination (result, column vector)
.. c:function:: void glm_mat2x3_transpose(mat2x3 m, mat3x2 dest)
.. csv-table:: mat2x3 **(m)**
:header: "", "column 1", "column 2"
transpose matrix and store in dest
"row 1", "m00", "m10"
"row 2", "m01", "m11"
"row 3", "m02", "m12"
.. csv-table:: column vec2 (1x2) **(v)**
:header: "", "column 1"
"row 1", "v0"
"row 2", "v1"
.. csv-table:: column vec3 (1x3) **(dest)**
:header: "", "column 1"
"row 1", "m00 * v0 + m10 * v1"
"row 2", "m01 * v0 + m11 * v1"
"row 3", "m02 * v0 + m12 * v1"
.. c:function:: void glm_mat2x3_transpose(mat2x3 src, mat3x2 dest)
Transpose mat2x3 (src) and store in mat3x2 (dest).
Parameters:
| *[in]* **m** matrix
| *[out]* **dest** destination
| *[in]* **src** mat2x3 (left)
| *[out]* **dest** destination (result, mat3x2)
.. c:function:: void glm_mat2x3_scale(mat2x3 m, float s)
.. csv-table:: mat2x3 **(src)**
:header: "", "column 1", "column 2"
multiply matrix with scalar
"row 1", "a00", "a10"
"row 2", "a01", "a11"
"row 3", "a02", "a12"
.. csv-table:: mat3x2 **(dest)**
:header: "", "column 1", "column 2", "column 3"
"row 1", "b00 = a00", "b10 = a01", "b20 = a02"
"row 2", "b01 = a10", "b11 = a11", "b21 = a12"
.. c:function:: void glm_mat2x3_scale(mat2x3 m, float s)
Multiply mat2x3 (m) by scalar constant (s).
Parameters:
| *[in, out]* **m** matrix
| *[in]* **s** scalar
| *[in, out]* **m** mat2x3 (src, dest)
| *[in]* **s** float (scalar)
.. csv-table:: mat2x3 **(m)**
:header: "", "column 1", "column 2"
"row 1", "m00 = m00 * s", "m10 = m10 * s"
"row 2", "m01 = m01 * s", "m11 = m11 * s"
"row 3", "m02 = m02 * s", "m12 = m12 * s"

View File

@@ -23,70 +23,197 @@ Functions:
#. :c:func:`glm_mat2x4_transpose`
#. :c:func:`glm_mat2x4_scale`
Represented
~~~~~~~~~~~
.. csv-table:: mat2x4
:header: "", "column 1", "column 2"
"row 1", "m00", "m10"
"row 2", "m01", "m11"
"row 3", "m02", "m12"
"row 4", "m03", "m13"
Functions documentation
~~~~~~~~~~~~~~~~~~~~~~~
.. c:function:: void glm_mat2x4_copy(mat2x4 mat, mat2x4 dest)
.. c:function:: void glm_mat2x4_copy(mat2x4 src, mat2x4 dest)
copy mat2x4 to another one (dest).
Copy mat2x4 (src) to mat2x4 (dest).
Parameters:
| *[in]* **mat** source
| *[out]* **dest** destination
| *[in]* **src** mat2x4 (left)
| *[out]* **dest** destination (result, mat2x4)
.. c:function:: void glm_mat2x4_zero(mat2x4 mat)
.. csv-table:: mat2x4 **(src)**
:header: "", "column 1", "column 2"
make given matrix zero
"row 1", "a00", "a10"
"row 2", "a01", "a11"
"row 3", "a02", "a12"
"row 4", "a03", "a13"
.. csv-table:: mat2x4 **(dest)**
:header: "", "column 1", "column 2"
"row 1", "b00 = a00", "b10 = a10"
"row 2", "b01 = a01", "b11 = a11"
"row 3", "b02 = a02", "b12 = a12"
"row 4", "b03 = a03", "b13 = a13"
.. c:function:: void glm_mat2x4_zero(mat2x4 m)
Zero out the mat2x4 (m).
Parameters:
| *[in,out]* **mat** matrix
| *[in, out]* **m** mat2x4 (src, dest)
.. c:function:: void glm_mat2x4_make(float * __restrict src, mat2x4 dest)
.. csv-table:: mat2x4 **(m)**
:header: "", "column 1", "column 2"
Create mat2x4 matrix from pointer
"row 1", "0.00", "2.00"
"row 2", "5.00", "4.00"
"row 3", "7.00", "6.00"
"row 4", "23.00", "1.00"
| NOTE: **@src** must contain at least 8 elements.
.. csv-table:: mat2x4 **(m)**
:header: "", "column 1", "column 2"
"row 1", "0.00", "0.00"
"row 2", "0.00", "0.00"
"row 3", "0.00", "0.00"
"row 4", "0.00", "0.00"
.. c:function:: void glm_mat2x4_make(const float * __restrict src, mat2x4 dest)
Create mat2x4 (dest) from pointer (src).
.. note:: **@src** must contain at least 8 elements.
Parameters:
| *[in]* **src** pointer to an array of floats
| *[out]* **dest** destination matrix2x4
| *[in]* **src** pointer to an array of floats (left)
| *[out]* **dest** destination (result, mat2x4)
.. c:function:: void glm_mat2x4_mul(mat2x4 m1, mat4x2 m2, mat2 dest)
.. csv-table:: float array (1x8) **(src)**
:header: "", "column 1"
multiply m1 and m2 to dest
"row 1", "v0"
"row 2", "v1"
"row 3", "v2"
"row 4", "v3"
"row 5", "v4"
"row 6", "v5"
"row 7", "v6"
"row 8", "v7"
m1, m2 and dest matrices can be same matrix, it is possible to write this:
.. csv-table:: mat2x4 **(dest)**
:header: "", "column 1", "column 2"
"row 1", "v0", "v4"
"row 2", "v1", "v5"
"row 3", "v2", "v6"
"row 4", "v3", "v7"
.. c:function:: void glm_mat2x4_mul(mat2x4 m1, mat4x2 m2, mat4 dest)
Multiply mat2x4 (m1) by mat4x2 (m2) and store in mat4 (dest).
.. code-block:: c
glm_mat2x4_mul(m, m, m);
glm_mat2x4_mul(mat2x4, mat4x2, mat4);
Parameters:
| *[in]* **m1** left matrix
| *[in]* **m2** right matrix
| *[out]* **dest** destination matrix
| *[in]* **m1** mat2x4 (left)
| *[in]* **m2** mat4x2 (right)
| *[out]* **dest** destination (result, mat4)
.. c:function:: void glm_mat2x4_mulv(mat2x4 m, vec4 v, vec2 dest)
.. csv-table:: mat2x4 **(m1)**
:header: "", "column 1", "column 2"
multiply mat2x4 with vec4 (column vector) and store in dest vector
"row 1", "a00", "a10"
"row 2", "a01", "a11"
"row 3", "a02", "a12"
"row 4", "a03", "a13"
.. csv-table:: mat4x2 **(m2)**
:header: "", "column 1", "column 2", "column 3", "column 4"
"row 1", "b00", "b10", "b20", "b30"
"row 2", "b01", "b11", "b21", "b31"
.. csv-table:: mat4x4 **(dest)**
:header: "", "column 1", "column 2", "column 3", "column 4"
"row 1", "a00 * b00 + a10 * b01", "a00 * b10 + a10 * b11", "a00 * b20 + a10 * b21", "a00 * b30 + a10 * b31"
"row 2", "a01 * b00 + a11 * b01", "a01 * b10 + a11 * b11", "a01 * b20 + a11 * b21", "a01 * b30 + a11 * b31"
"row 3", "a02 * b00 + a12 * b01", "a02 * b10 + a12 * b11", "a02 * b20 + a12 * b21", "a02 * b30 + a12 * b31"
"row 4", "a03 * b00 + a13 * b01", "a03 * b10 + a13 * b11", "a03 * b20 + a13 * b21", "a03 * b30 + a13 * b31"
.. c:function:: void glm_mat2x4_mulv(mat2x4 m, vec2 v, vec4 dest)
Multiply mat2x4 (m) by vec2 (v) and store in vec4 (dest).
Parameters:
| *[in]* **m** mat2x4 (left)
| *[in]* **v** vec4 (right, column vector)
| *[out]* **dest** destination (result, column vector)
| *[in]* **m** mat2x4 (left)
| *[in]* **v** vec2 (right, column vector)
| *[out]* **dest** destination (result, column vector)
.. c:function:: void glm_mat2x4_transpose(mat2x4 m, mat4x2 dest)
.. csv-table:: mat2x4 **(m)**
:header: "", "column 1", "column 2"
transpose matrix and store in dest
"row 1", "m00", "m10"
"row 2", "m01", "m11"
"row 3", "m02", "m12"
"row 4", "m03", "m13"
.. csv-table:: column vec2 (1x2) **(v)**
:header: "", "column 1"
"row 1", "v0"
"row 2", "v1"
.. csv-table:: column vec4 (1x4) **(dest)**
:header: "", "column 1"
"row 1", "m00 * v0 + m10 * v1"
"row 2", "m01 * v0 + m11 * v1"
"row 3", "m02 * v0 + m12 * v1"
"row 4", "m03 * v0 + m13 * v1"
.. c:function:: void glm_mat2x4_transpose(mat2x4 src, mat4x2 dest)
Transpose mat2x4 (src) and store in mat4x2 (dest).
Parameters:
| *[in]* **m** matrix
| *[out]* **dest** destination
| *[in]* **src** mat2x4 (left)
| *[out]* **dest** destination (result, mat4x2)
.. csv-table:: mat2x4 **(src)**
:header: "", "column 1", "column 2"
"row 1", "a00", "a10"
"row 2", "a01", "a11"
"row 3", "a02", "a12"
"row 4", "a03", "a13"
.. csv-table:: mat4x2 **(dest)**
:header: "", "column 1", "column 2", "column 3", "column 4"
"row 1", "b00 = a00", "b10 = a01", "b20 = a02", "b30 = a03"
"row 2", "b01 = a10", "b11 = a11", "b21 = a12", "b31 = a13"
.. c:function:: void glm_mat2x4_scale(mat2x4 m, float s)
multiply matrix with scalar
Multiply mat2x4 (m) by scalar constant (s).
Parameters:
| *[in, out]* **m** matrix
| *[in]* **s** scalar
| *[in, out]* **m** mat2x4 (src, dest)
| *[in]* **s** float (scalar)
.. csv-table:: mat2x4 **(m)**
:header: "", "column 1", "column 2"
"row 1", "m00 = m00 * s", "m10 = m10 * s"
"row 2", "m01 = m01 * s", "m11 = m11 * s"
"row 3", "m02 = m02 * s", "m12 = m12 * s"
"row 4", "m03 = m03 * s", "m13 = m13 * s"

File diff suppressed because it is too large Load Diff

View File

@@ -23,69 +23,174 @@ Functions:
#. :c:func:`glm_mat3x2_transpose`
#. :c:func:`glm_mat3x2_scale`
Represented
~~~~~~~~~~~
.. csv-table:: mat3x2
:header: "", "column 1", "column 2", "column 3"
"row 1", "m00", "m10", "m20"
"row 2", "m01", "m11", "m21"
Functions documentation
~~~~~~~~~~~~~~~~~~~~~~~
.. c:function:: void glm_mat3x2_copy(mat3x2 mat, mat3x2 dest)
.. c:function:: void glm_mat3x2_copy(mat3x2 src, mat3x2 dest)
copy mat3x2 to another one (dest).
Copy mat3x2 (src) to mat3x2 (dest).
Parameters:
| *[in]* **mat** source
| *[out]* **dest** destination
| *[in]* **src** mat3x2 (left)
| *[out]* **dest** destination (result, mat3x2)
.. c:function:: void glm_mat3x2_zero(mat3x2 mat)
.. csv-table:: mat3x2 **(src)**
:header: "", "column 1", "column 2", "column 3"
make given matrix zero
"row 1", "a00", "a10", "a20"
"row 2", "a01", "a11", "a21"
.. csv-table:: mat3x2 **(dest)**
:header: "", "column 1", "column 2", "column 3"
"row 1", "b00 = a00", "b10 = a10", "b20 = a20"
"row 2", "b01 = a01", "b11 = a11", "b21 = a21"
.. c:function:: void glm_mat3x2_zero(mat3x2 m)
Zero out the mat3x2 (m).
Parameters:
| *[in,out]* **mat** matrix
| *[in, out]* **m** mat3x2 (src, dest)
.. c:function:: void glm_mat3x2_make(float * __restrict src, mat3x2 dest)
.. csv-table:: mat3x2 **(m)**
:header: "", "column 1", "column 2", "column 3"
Create mat3x2 matrix from pointer
"row 1", "0.00", "2.00", "15.00"
"row 2", "5.00", "4.00", "6.00"
.. csv-table:: mat3x2 **(m)**
:header: "", "column 1", "column 2", "column 3"
"row 1", "0.00", "0.00", "0.00"
"row 2", "0.00", "0.00", "0.00"
.. c:function:: void glm_mat3x2_make(const float * __restrict src, mat3x2 dest)
Create mat3x2 (dest) from pointer (src).
.. note:: **@src** must contain at least 6 elements.
| NOTE: **@src** must contain at least 6 elements.
Parameters:
| *[in]* **src** pointer to an array of floats
| *[out]* **dest** destination matrix3x2
| *[in]* **src** pointer to an array of floats (left)
| *[out]* **dest** destination (result, mat3x2)
.. c:function:: void glm_mat3x2_mul(mat3x2 m1, mat2x3 m2, mat3 dest)
.. csv-table:: float array (1x6) **(src)**
:header: "", "column 1"
multiply m1 and m2 to dest
"row 1", "v0"
"row 2", "v1"
"row 3", "v2"
"row 4", "v3"
"row 5", "v4"
"row 6", "v5"
m1, m2 and dest matrices can be same matrix, it is possible to write this:
.. csv-table:: mat3x2 **(dest)**
:header: "", "column 1", "column 2", "column 3"
"row 1", "v0", "v2", "v4"
"row 2", "v1", "v3", "v5"
.. c:function:: void glm_mat3x2_mul(mat3x2 m1, mat2x3 m2, mat2 dest)
Multiply mat3x2 (m1) by mat2x3 (m2) and store in mat2 (dest).
.. code-block:: c
glm_mat3x2_mul(m, m, m);
glm_mat3x2_mul(mat3x2, mat2x3, mat2);
Parameters:
| *[in]* **m1** left matrix
| *[in]* **m2** right matrix
| *[out]* **dest** destination matrix
| *[in]* **m1** mat3x2 (left)
| *[in]* **m2** mat2x3 (right)
| *[out]* **dest** destination (result, mat2)
.. c:function:: void glm_mat3x2_mulv(mat3x2 m, vec2 v, vec3 dest)
.. csv-table:: mat3x2 **(m1)**
:header: "", "column 1", "column 2", "column 3"
multiply mat3x2 with vec2 (column vector) and store in dest vector
"row 1", "a00", "a10", "a20"
"row 2", "a01", "a11", "a21"
.. csv-table:: mat2x3 **(m2)**
:header: "", "column 1", "column 2"
"row 1", "b00", "b10"
"row 2", "b01", "b11"
"row 3", "b02", "b12"
.. csv-table:: mat2x2 **(dest)**
:header: "", "column 1", "column 2"
"row 1", "a00 * b00 + a10 * b01 + a20 * b02", "a00 * b10 + a10 * b11 + a20 * b12"
"row 2", "a01 * b00 + a11 * b01 + a21 * b02", "a01 * b10 + a11 * b11 + a21 * b12"
.. c:function:: void glm_mat3x2_mulv(mat3x2 m, vec3 v, vec2 dest)
Multiply mat3x2 (m) by vec3 (v) and store in vec2 (dest).
Parameters:
| *[in]* **m** mat3x2 (left)
| *[in]* **v** vec3 (right, column vector)
| *[out]* **dest** destination (result, column vector)
| *[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)
.. csv-table:: mat3x2 **(m)**
:header: "", "column 1", "column 2", "column 3"
transpose matrix and store in dest
"row 1", "m00", "m10", "m20"
"row 2", "m01", "m11", "m21"
.. csv-table:: column vec3 (1x3) **(v)**
:header: "", "column 1"
"row 1", "v0"
"row 2", "v1"
"row 3", "v2"
.. csv-table:: column vec2 (1x2) **(dest)**
:header: "", "column 1"
"row 1", "m00 * v0 + m10 * v1 + m20 * v2"
"row 2", "m01 * v0 + m11 * v1 + m21 * v2"
.. c:function:: void glm_mat3x2_transpose(mat3x2 src, mat2x3 dest)
Transpose mat3x2 (src) and store in mat2x3 (dest).
Parameters:
| *[in]* **m** matrix
| *[out]* **dest** destination
| *[in]* **src** mat3x2 (left)
| *[out]* **dest** destination (result, mat2x3)
.. c:function:: void glm_mat3x2_scale(mat3x2 m, float s)
.. csv-table:: mat3x2 **(src)**
:header: "", "column 1", "column 2", "column 3"
multiply matrix with scalar
"row 1", "a00", "a10", "a20"
"row 2", "a01", "a11", "a21"
.. csv-table:: mat2x3 **(dest)**
:header: "", "column 1", "column 2"
"row 1", "b00 = a00", "b10 = a01"
"row 2", "b01 = a10", "b11 = a11"
"row 3", "b02 = a20", "b12 = a21"
.. c:function:: void glm_mat3x2_scale(mat3x2 m, float s)
Multiply mat3x2 (m) by scalar constant (s).
Parameters:
| *[in, out]* **m** matrix
| *[in]* **s** scalar
| *[in, out]* **m** mat3x2 (src, dest)
| *[in]* **s** float (scalar)
.. csv-table:: mat3x2 **(m)**
:header: "", "column 1", "column 2", "column 3"
"row 1", "m00 = m00 * s", "m10 = m10 * s", "m20 = m20 * s"
"row 2", "m01 = m01 * s", "m11 = m11 * s", "m21 = m21 * s"

View File

@@ -23,69 +23,204 @@ Functions:
#. :c:func:`glm_mat3x4_transpose`
#. :c:func:`glm_mat3x4_scale`
Represented
~~~~~~~~~~~
.. csv-table:: mat3x4
:header: "", "column 1", "column 2", "column 3"
"row 1", "m00", "m10", "m20"
"row 2", "m01", "m11", "m21"
"row 3", "m02", "m12", "m22"
"row 4", "m03", "m13", "m23"
Functions documentation
~~~~~~~~~~~~~~~~~~~~~~~
.. c:function:: void glm_mat3x4_copy(mat3x4 mat, mat3x4 dest)
.. c:function:: void glm_mat3x4_copy(mat3x4 src, mat3x4 dest)
copy mat3x4 to another one (dest).
Copy mat3x4 (src) to mat3x4 (dest).
Parameters:
| *[in]* **mat** source
| *[out]* **dest** destination
| *[in]* **src** mat3x4 (left)
| *[out]* **dest** destination (result, mat3x4)
.. c:function:: void glm_mat3x4_zero(mat3x4 mat)
.. csv-table:: mat3x4 **(src)**
:header: "", "column 1", "column 2", "column 3"
make given matrix zero
"row 1", "a00", "a10", "a20"
"row 2", "a01", "a11", "a21"
"row 3", "a02", "a12", "a22"
"row 4", "a03", "a13", "a23"
.. csv-table:: mat3x4 **(dest)**
:header: "", "column 1", "column 2", "column 3"
"row 1", "b00 = a00", "b10 = a10", "b20 = a20"
"row 2", "b01 = a01", "b11 = a11", "b21 = a21"
"row 3", "b02 = a02", "b12 = a12", "b22 = a22"
"row 4", "b03 = a03", "b13 = a13", "b23 = a23"
.. c:function:: void glm_mat3x4_zero(mat3x4 m)
Zero out the mat3x4 (m).
Parameters:
| *[in,out]* **mat** matrix
| *[in, out]* **m** mat3x4 (src, dest)
.. c:function:: void glm_mat3x4_make(float * __restrict src, mat3x4 dest)
.. csv-table:: mat3x4 **(m)**
:header: "", "column 1", "column 2", "column 3"
Create mat3x4 matrix from pointer
"row 1", "0.00", "2.00", "78.00"
"row 2", "5.00", "4.00", "12.00"
"row 3", "7.00", "6.00", "32.00"
"row 4", "23.00", "1.00", "9.00"
.. csv-table:: mat3x4 **(m)**
:header: "", "column 1", "column 2", "column 3"
"row 1", "0.00", "0.00", "0.00"
"row 2", "0.00", "0.00", "0.00"
"row 3", "0.00", "0.00", "0.00"
"row 4", "0.00", "0.00", "0.00"
.. c:function:: void glm_mat3x4_make(const float * __restrict src, mat3x4 dest)
Create mat3x4 (dest) from pointer (src).
.. note:: **@src** must contain at least 12 elements.
| NOTE: **@src** must contain at least 12 elements.
Parameters:
| *[in]* **src** pointer to an array of floats
| *[out]* **dest** destination matrix3x4
| *[in]* **src** pointer to an array of floats (left)
| *[out]* **dest** destination (result, mat3x4)
.. c:function:: void glm_mat3x4_mul(mat3x4 m1, mat4x3 m2, mat3 dest)
.. csv-table:: float array (1x12) **(src)**
:header: "", "column 1"
multiply m1 and m2 to dest
"row 1", "v0"
"row 2", "v1"
"row 3", "v2"
"row 4", "v3"
"row 5", "v4"
"row 6", "v5"
"row 7", "v6"
"row 8", "v7"
"row 9", "v8"
"row 10", "v9"
"row 11", "v10"
"row 12", "v11"
m1, m2 and dest matrices can be same matrix, it is possible to write this:
.. csv-table:: mat3x4 **(dest)**
:header: "", "column 1", "column 2", "column 3"
"row 1", "v0", "v4", "v8"
"row 2", "v1", "v5", "v9"
"row 3", "v2", "v6", "v10"
"row 4", "v3", "v7", "v11"
.. c:function:: void glm_mat3x4_mul(mat3x4 m1, mat4x3 m2, mat4 dest)
Multiply mat3x4 (m1) by mat4x3 (m2) and store in mat4 (dest).
.. code-block:: c
glm_mat3x4_mul(m, m, m);
glm_mat3x4_mul(mat3x4, mat4x3, mat4);
Parameters:
| *[in]* **m1** left matrix
| *[in]* **m2** right matrix
| *[out]* **dest** destination matrix
| *[in]* **m1** mat2x4 (left)
| *[in]* **m2** mat4x2 (right)
| *[out]* **dest** destination (result, mat4)
.. c:function:: void glm_mat3x4_mulv(mat3x4 m, vec4 v, vec3 dest)
.. csv-table:: mat3x4 **(m1)**
:header: "", "column 1", "column 2", "column 3"
multiply mat3x4 with vec4 (column vector) and store in dest vector
"row 1", "a00", "a10", "a20"
"row 2", "a01", "a11", "a21"
"row 3", "a02", "a12", "a22"
"row 4", "a03", "a13", "a23"
.. csv-table:: mat4x3 **(m2)**
:header: "", "column 1", "column 2", "column 3", "column 4"
"row 1", "b00", "b10", "b20", "b30"
"row 2", "b01", "b11", "b21", "b31"
"row 3", "b02", "b12", "b22", "b32"
.. csv-table:: mat4x4 **(dest)**
:header: "", "column 1", "column 2", "column 3", "column 4"
"row 1", "a00 * b00 + a10 * b01 + a20 * b02", "a00 * b10 + a10 * b11 + a20 * b12", "a00 * b20 + a10 * b21 + a20 * b22", "a00 * b30 + a10 * b31 + a20 * b32"
"row 2", "a01 * b00 + a11 * b01 + a21 * b02", "a01 * b10 + a11 * b11 + a21 * b12", "a01 * b20 + a11 * b21 + a21 * b22", "a01 * b30 + a11 * b31 + a21 * b32"
"row 3", "a02 * b00 + a12 * b01 + a22 * b02", "a02 * b10 + a12 * b11 + a22 * b12", "a02 * b20 + a12 * b21 + a22 * b22", "a02 * b30 + a12 * b31 + a22 * b32"
"row 4", "a03 * b00 + a13 * b01 + a23 * b02", "a03 * b10 + a13 * b11 + a23 * b12", "a03 * b20 + a13 * b21 + a23 * b22", "a03 * b30 + a13 * b31 + a23 * b32"
.. c:function:: void glm_mat3x4_mulv(mat3x4 m, vec3 v, vec4 dest)
Multiply ma3x4 (m) by vec3 (v) and store in vec4 (dest).
Parameters:
| *[in]* **m** mat3x4 (left)
| *[in]* **v** vec4 (right, column vector)
| *[out]* **dest** destination (result, column vector)
| *[in]* **m** mat3x4 (left)
| *[in]* **v** vec3 (right, column vector)
| *[out]* **dest** destination (result, column vector)
.. c:function:: void glm_mat3x4_transpose(mat3x4 m, mat4x3 dest)
.. csv-table:: mat3x4 **(m)**
:header: "", "column 1", "column 2", "column 3"
transpose matrix and store in dest
"row 1", "m00", "m10", "m20"
"row 2", "m01", "m11", "m21"
"row 3", "m02", "m12", "m22"
"row 4", "m03", "m13", "m23"
.. csv-table:: column vec3 (1x3) **(v)**
:header: "", "column 1"
"row 1", "v0"
"row 2", "v1"
"row 3", "v2"
.. csv-table:: column vec4 (1x4) **(dest)**
:header: "", "column 1"
"row 1", "m00 * v0 + m10 * v1 + m20 * v2"
"row 2", "m01 * v0 + m11 * v1 + m21 * v2"
"row 3", "m02 * v0 + m12 * v1 + m22 * v2"
"row 4", "m03 * v0 + m13 * v1 + m23 * v2"
.. c:function:: void glm_mat3x4_transpose(mat3x4 src, mat4x3 dest)
Transpose mat3x4 (src) and store in mat4x3 (dest).
Parameters:
| *[in]* **m** matrix
| *[out]* **dest** destination
| *[in]* **src** mat3x4 (left)
| *[out]* **dest** destination (result, mat4x3)
.. csv-table:: mat3x4 **(src)**
:header: "", "column 1", "column 2", "column 3"
"row 1", "a00", "a10", "a20"
"row 2", "a01", "a11", "a21"
"row 3", "a02", "a12", "a22"
"row 4", "a03", "a13", "a23"
.. csv-table:: mat4x3 **(dest)**
:header: "", "column 1", "column 2", "column 3", "column 4"
"row 1", "b00 = a00", "b10 = a01", "b20 = a02", "b30 = a03"
"row 2", "b01 = a10", "b11 = a11", "b21 = a12", "b31 = a13"
"row 3", "b02 = a20", "b12 = a21", "b22 = a22", "b32 = a23"
.. c:function:: void glm_mat3x4_scale(mat3x4 m, float s)
multiply matrix with scalar
Multiply mat3x4 (m) by scalar constant (s).
Parameters:
| *[in, out]* **m** matrix
| *[in]* **s** scalar
| *[in, out]* **m** mat3x4 (src, dest)
| *[in]* **s** float (scalar)
.. csv-table:: mat3x4 **(m)**
:header: "", "column 1", "column 2", "column 3"
"row 1", "m00 = m00 * s", "m10 = m10 * s", "m20 = m20 * s"
"row 2", "m01 = m01 * s", "m11 = m11 * s", "m21 = m21 * s"
"row 3", "m02 = m02 * s", "m12 = m12 * s", "m22 = m22 * s"
"row 4", "m03 = m03 * s", "m13 = m13 * s", "m23 = m23 * s"

View File

@@ -34,8 +34,8 @@ Functions:
#. :c:func:`glm_mat4_mulN`
#. :c:func:`glm_mat4_mulv`
#. :c:func:`glm_mat4_mulv3`
#. :c:func:`glm_mat3_trace`
#. :c:func:`glm_mat3_trace3`
#. :c:func:`glm_mat4_trace`
#. :c:func:`glm_mat4_trace3`
#. :c:func:`glm_mat4_quat`
#. :c:func:`glm_mat4_transpose_to`
#. :c:func:`glm_mat4_transpose`
@@ -48,6 +48,7 @@ Functions:
#. :c:func:`glm_mat4_swap_row`
#. :c:func:`glm_mat4_rmc`
#. :c:func:`glm_mat4_make`
#. :c:func:`glm_mat4_textrans`
Functions documentation
~~~~~~~~~~~~~~~~~~~~~~~
@@ -70,7 +71,7 @@ Functions documentation
.. 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:
| *[out]* **mat** matrix
@@ -143,7 +144,7 @@ Functions documentation
.. code-block:: c
mat m1, m2, m3, m4, res;
mat4 m1, m2, m3, m4, res;
glm_mat4_mulN((mat4 *[]){&m1, &m2, &m3, &m4}, 4, res);
Parameters:
@@ -214,7 +215,7 @@ Functions documentation
.. 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:
| *[in]* **m** source
@@ -263,7 +264,7 @@ Functions documentation
| e.g Newton-Raphson. this should work faster than normal,
| 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:
| *[in]* **mat** source
@@ -304,12 +305,24 @@ Functions documentation
Returns:
scalar value e.g. Matrix1x1
.. c:function:: void glm_mat4_make(float * __restrict src, mat4 dest)
.. c:function:: void glm_mat4_make(const float * __restrict src, mat4 dest)
Create mat4 matrix from pointer
| NOTE: **@src** must contain at least 16 elements.
.. note:: **@src** must contain at least 16 elements.
Parameters:
| *[in]* **src** pointer to an array of floats
| *[out]* **dest** destination matrix4x4
.. c:function:: void glm_mat4_textrans(float sx, float sy, float rot, float tx, float ty, mat4 dest)
Create texture transformation matrix, rotation is in radians CCW/RH
Parameters:
| *[in]* **sx** scale x
| *[in]* **sy** scale y
| *[in]* **rot** rotation in radians CCW/RH
| *[in]* **tx** translation x
| *[in]* **ty** translation y
| *[out]* **dest** destination matrix3x3

View File

@@ -23,69 +23,179 @@ Functions:
#. :c:func:`glm_mat4x2_transpose`
#. :c:func:`glm_mat4x2_scale`
Represented
~~~~~~~~~~~
.. csv-table:: mat4x2
:header: "", "column 1", "column 2", "column 3", "column4"
"row 1", "m00", "m10", "m20", "m30"
"row 2", "m01", "m11", "m21", "m31"
Functions documentation
~~~~~~~~~~~~~~~~~~~~~~~
.. c:function:: void glm_mat4x2_copy(mat4x2 mat, mat4x2 dest)
.. c:function:: void glm_mat4x2_copy(mat4x2 src, mat4x2 dest)
copy mat4x2 to another one (dest).
Copy mat4x2 (src) to mat4x2 (dest).
Parameters:
| *[in]* **mat** source
| *[out]* **dest** destination
| *[in]* **src** mat4x2 (left)
| *[out]* **dest** destination (result, mat4x2)
.. c:function:: void glm_mat4x2_zero(mat4x2 mat)
.. csv-table:: mat4x2 **(src)**
:header: "", "column 1", "column 2", "column 3", "column 4"
make given matrix zero
"row 1", "a00", "a10", "a20", "a30"
"row 2", "a01", "a11", "a21", "a31"
.. csv-table:: ma4x2 **(dest)**
:header: "", "column 1", "column 2", "column 3", "column 4"
"row 1", "b00 = a00", "b10 = a10", "b20 = a20", "b30 = a30"
"row 2", "b01 = a01", "b11 = a11", "b21 = a21", "b31 = a31"
.. c:function:: void glm_mat4x2_zero(mat4x2 m)
Zero out the mat4x2 (m).
Parameters:
| *[in,out]* **mat** matrix
| *[in, out]* **m** mat4x2 (src, dest)
.. c:function:: void glm_mat4x2_make(float * __restrict src, mat4x2 dest)
.. csv-table:: mat4x2 **(m)**
:header: "", "column 1", "column 2", "column 3", "column 4"
Create mat4x2 matrix from pointer
"row 1", "0.00", "2.00", "15.00", "44.00"
"row 2", "5.00", "4.00", "6.00", "12.00"
.. csv-table:: mat4x2 **(m)**
:header: "", "column 1", "column 2", "column 3", "column 4"
"row 1", "0.00", "0.00", "0.00", "0.00"
"row 2", "0.00", "0.00", "0.00", "0.00"
.. c:function:: void glm_mat4x2_make(const float * __restrict src, mat4x2 dest)
Create mat4x2 (dest) from pointer (src).
.. note:: **@src** must contain at least 8 elements.
| NOTE: **@src** must contain at least 8 elements.
Parameters:
| *[in]* **src** pointer to an array of floats
| *[out]* **dest** destination matrix4x2
| *[in]* **src** pointer to an array of floats (left)
| *[out]* **dest** destination (result, mat4x2)
.. c:function:: void glm_mat4x2_mul(mat4x2 m1, mat2x4 m2, mat4 dest)
.. csv-table:: float array (1x8) **(src)**
:header: "", "column 1"
multiply m1 and m2 to dest
"row 1", "v0"
"row 2", "v1"
"row 3", "v2"
"row 4", "v3"
"row 5", "v4"
"row 6", "v5"
"row 7", "v6"
"row 8", "v7"
m1, m2 and dest matrices can be same matrix, it is possible to write this:
.. csv-table:: mat4x2 **(dest)**
:header: "", "column 1", "column 2", "column 3", "column 4"
"row 1", "v0", "v2", "v4", "v6"
"row 2", "v1", "v3", "v5", "v7"
.. c:function:: void glm_mat4x2_mul(mat4x2 m1, mat2x4 m2, mat2 dest)
Multiply mat4x2 (m1) by mat2x4 (m2) and store in mat2 (dest).
.. code-block:: c
glm_mat4x2_mul(m, m, m);
glm_mat4x2_mul(mat4x2, mat2x4, mat2);
Parameters:
| *[in]* **m1** left matrix
| *[in]* **m2** right matrix
| *[out]* **dest** destination matrix
| *[in]* **m1** mat4x2 (left)
| *[in]* **m2** mat2x4 (right)
| *[out]* **dest** destination (result, mat2)
.. c:function:: void glm_mat4x2_mulv(mat4x2 m, vec2 v, vec4 dest)
.. csv-table:: mat4x2 **(m1)**
:header: "", "column 1", "column 2", "column 3", "column 4"
multiply mat4x2 with vec2 (column vector) and store in dest vector
"row 1", "a00", "a10", "a20", "a30"
"row 2", "a01", "a11", "a21", "a31"
.. csv-table:: mat2x4 **(m2)**
:header: "", "column 1", "column 2"
"row 1", "b00", "b10"
"row 2", "b01", "b11"
"row 3", "b02", "b12"
"row 4", "b03", "b13"
.. csv-table:: mat2x2 **(dest)**
:header: "", "column 1", "column 2"
"row 1", "a00 * b00 + a10 * b01 + a20 * b02 + a30 * b03", "a00 * b10 + a10 * b11 + a20 * b12 + a30 * b13"
"row 2", "a01 * b00 + a11 * b01 + a21 * b02 + a31 * b03", "a01 * b10 + a11 * b11 + a21 * b12 + a31 * b13"
.. c:function:: void glm_mat4x2_mulv(mat4x2 m, vec4 v, vec2 dest)
Multiply mat4x2 (m) by vec4 (v) and store in vec2 (dest).
Parameters:
| *[in]* **m** mat4x2 (left)
| *[in]* **v** vec2 (right, column vector)
| *[out]* **dest** destination (result, column vector)
| *[in]* **m** mat4x2 (left)
| *[in]* **v** vec4 (right, column vector)
| *[out]* **dest** destination (result, column vector)
.. c:function:: void glm_mat4x2_transpose(mat4x2 m, mat2x4 dest)
.. csv-table:: mat4x2 **(m)**
:header: "", "column 1", "column 2", "column 3", "column 4"
transpose matrix and store in dest
"row 1", "m00", "m10", "m20", "m30"
"row 2", "m01", "m11", "m21", "m31"
.. csv-table:: column vec4 (1x4) **(v)**
:header: "", "column 1"
"row 1", "v0"
"row 2", "v1"
"row 3", "v2"
"row 4", "v3"
.. csv-table:: column vec2 (1x2) **(dest)**
:header: "", "column 1"
"row 1", "m00 * v0 + m10 * v1 + m20 * v2 + m30 * v3"
"row 2", "m01 * v0 + m11 * v1 + m21 * v2 + m31 * v3"
.. c:function:: void glm_mat4x2_transpose(mat4x2 src, mat2x4 dest)
Transpose mat4x2 (src) and store in mat2x4 (dest).
Parameters:
| *[in]* **m** matrix
| *[out]* **dest** destination
| *[in]* **src** mat4x2 (left)
| *[out]* **dest** destination (result, mat2x4)
.. csv-table:: mat4x2 **(src)**
:header: "", "column 1", "column 2", "column 3", "column 4"
"row 1", "a00", "a10", "a20", "a30"
"row 2", "a01", "a11", "a21", "a31"
.. csv-table:: mat2x4 **(dest)**
:header: "", "column 1", "column 2"
"row 1", "b00 = a00", "b10 = a01"
"row 2", "b01 = a10", "b11 = a11"
"row 3", "b02 = a20", "b12 = a21"
"row 4", "b03 = a30", "b13 = a31"
.. c:function:: void glm_mat4x2_scale(mat4x2 m, float s)
multiply matrix with scalar
Multiply mat4x2 (m) by scalar constant (s).
Parameters:
| *[in, out]* **m** matrix
| *[in]* **s** scalar
| *[in, out]* **m** mat4x2 (src, dest)
| *[in]* **s** float (scalar)
.. csv-table:: mat4x2 **(m)**
:header: "", "column 1", "column 2", "column 3", "column 4"
"row 1", "m00 = m00 * s", "m10 = m10 * s", "m20 = m20 * s", "m30 = m30 * s"
"row 2", "m01 = m01 * s", "m11 = m11 * s", "m21 = m21 * s", "m31 = m31 * s"

View File

@@ -23,69 +23,195 @@ Functions:
#. :c:func:`glm_mat4x3_transpose`
#. :c:func:`glm_mat4x3_scale`
Represented
~~~~~~~~~~~
.. csv-table:: mat4x3
:header: "", "column 1", "column 2", "column 3", "column 4"
"row 1", "m00", "m10", "m20", "m30"
"row 2", "m01", "m11", "m21", "m31"
"row 3", "m02", "m12", "m22", "m32"
Functions documentation
~~~~~~~~~~~~~~~~~~~~~~~
.. c:function:: void glm_mat4x3_copy(mat4x3 mat, mat4x3 dest)
.. c:function:: void glm_mat4x3_copy(mat4x3 src, mat4x3 dest)
copy mat4x3 to another one (dest).
Copy mat4x3 (src) to mat4x3 (dest).
Parameters:
| *[in]* **mat** source
| *[out]* **dest** destination
| *[in]* **src** mat4x3 (left)
| *[out]* **dest** destination (result, mat4x3)
.. c:function:: void glm_mat4x3_zero(mat4x3 mat)
.. csv-table:: mat4x3 **(src)**
:header: "", "column 1", "column 2", "column 3", "column 4"
make given matrix zero
"row 1", "a00", "a10", "a20", "a30"
"row 2", "a01", "a11", "a21", "a31"
"row 3", "a02", "a12", "a22", "a32"
.. csv-table:: mat4x3 **(dest)**
:header: "", "column 1", "column 2", "column 3", "column 4"
"row 1", "b00 = a00", "b10 = a10", "b20 = a20", "b30 = a30"
"row 2", "b01 = a01", "b11 = a11", "b21 = a21", "b31 = a31"
"row 3", "b02 = a02", "b12 = a12", "b22 = a22", "b32 = a32"
.. c:function:: void glm_mat4x3_zero(mat4x3 m)
Zero out the mat4x3 (m).
Parameters:
| *[in,out]* **mat** matrix
| *[in, out]* **m** mat4x3 (src, dest)
.. c:function:: void glm_mat4x3_make(float * __restrict src, mat4x3 dest)
.. csv-table:: mat4x3 **(m)**
:header: "", "column 1", "column 2", "column 3", "column 4"
Create mat4x3 matrix from pointer
"row 1", "0.00", "2.00", "15.00", "44.00"
"row 2", "5.00", "4.00", "6.00", "12.00"
"row 3", "88.00", "8.00", "4.30", "15.00"
.. csv-table:: mat4x3 **(m)**
:header: "", "column 1", "column 2", "column 3", "column 4"
"row 1", "0.00", "0.00", "0.00", "0.00"
"row 2", "0.00", "0.00", "0.00", "0.00"
"row3", "0.00", "0.00", "0.00", "0.00"
.. c:function:: void glm_mat4x3_make(const float * __restrict src, mat4x3 dest)
Create mat4x3 (dest) from pointer (src).
.. note:: **@src** must contain at least 12 elements.
| NOTE: **@src** must contain at least 12 elements.
Parameters:
| *[in]* **src** pointer to an array of floats
| *[out]* **dest** destination matrix4x3
| *[in]* **src** pointer to an array of floats (left)
| *[out]* **dest** destination (result, mat4x3)
.. c:function:: void glm_mat4x3_mul(mat4x3 m1, mat3x4 m2, mat4 dest)
.. csv-table:: float array (1x12) **(src)**
:header: "", "column 1"
multiply m1 and m2 to dest
"row 1", "v0"
"row 2", "v1"
"row 3", "v2"
"row 4", "v3"
"row 5", "v4"
"row 6", "v5"
"row 7", "v6"
"row 8", "v7"
"row 9", "v8"
"row 10", "v9"
"row 11", "v10"
"row 12", "v11"
m1, m2 and dest matrices can be same matrix, it is possible to write this:
.. csv-table:: mat4x3 **(dest)**
:header: "", "column 1", "column 2", "column 3", "column 4"
"row 1", "v0", "v3", "v6", "v9"
"row 2", "v1", "v4", "v7", "v10"
"row 3", "v2", "v5", "v8", "v11"
.. c:function:: void glm_mat4x3_mul(mat4x3 m1, mat3x4 m2, mat3 dest)
Multiply mat4x3 (m1) by mat3x4 (m2) and store in mat3 (dest).
.. code-block:: c
glm_mat4x3_mul(m, m, m);
glm_mat4x3_mul(mat4x3, mat3x4, mat3);
Parameters:
| *[in]* **m1** left matrix
| *[in]* **m2** right matrix
| *[out]* **dest** destination matrix
| *[in]* **m1** mat4x3 (left)
| *[in]* **m2** mat3x4 (right)
| *[out]* **dest** destination (result, mat3)
.. c:function:: void glm_mat4x3_mulv(mat4x3 m, vec3 v, vec4 dest)
.. csv-table:: mat4x3 **(m1)**
:header: "", "column 1", "column 2", "column 3", "column 4"
multiply mat4x3 with vec3 (column vector) and store in dest vector
"row 1", "a00", "a10", "a20", "a30"
"row 2", "a01", "a11", "a21", "a31"
"row 3", "a02", "a12", "a22", "a32"
.. csv-table:: mat3x4 **(m2)**
:header: "", "column 1", "column 2", "column 3"
"row 1", "b00", "b10", "b20"
"row 2", "b01", "b11", "b21"
"row 3", "b02", "b12", "b22"
"row 4", "b03", "b13", "b23"
.. csv-table:: mat3x3 **(dest)**
:header: "", "column 1", "column 2", "column 3"
"row 1", "a00 * b00 + a10 * b01 + a20 * b02 + a30 * b03", "a00 * b10 + a10 * b11 + a20 * b12 + a30 * b13", "a00 * b20 + a10 * b21 + a20 * b22 + a30 * b23"
"row 2", "a01 * b00 + a11 * b01 + a21 * b02 + a31 * b03", "a01 * b10 + a11 * b11 + a21 * b12 + a31 * b13", "a01 * b20 + a11 * b21 + a21 * b22 + a31 * b23"
"row 3", "a02 * b00 + a12 * b01 + a22 * b02 + a32 * b03", "a02 * b10 + a12 * b11 + a22 * b12 + a32 * b13", "a02 * b20 + a12 * b21 + a22 * b22 + a32 * b23"
.. c:function:: void glm_mat4x3_mulv(mat4x3 m, vec4 v, vec3 dest)
Multiply mat4x3 (m) by vec4 (v) and store in vec3 (dest).
Parameters:
| *[in]* **m** mat4x3 (left)
| *[in]* **v** vec3 (right, column vector)
| *[out]* **dest** destination (result, column vector)
| *[in]* **m** mat4x3 (left)
| *[in]* **v** vec4 (right, column vector)
| *[out]* **dest** destination (result, column vector)
.. c:function:: void glm_mat4x3_transpose(mat4x3 m, mat3x4 dest)
.. csv-table:: mat4x3 **(m)**
:header: "", "column 1", "column 2", "column 3", "column 4"
transpose matrix and store in dest
"row 1", "m00", "m10", "m20", "m30"
"row 2", "m01", "m11", "m21", "m31"
"row 3", "m02", "m12", "m22", "m32"
.. csv-table:: column vec4 (1x4) **(v)**
:header: "", "column 1"
"row 1", "v0"
"row 2", "v1"
"row 3", "v2"
"row 4", "v3"
.. csv-table:: column vec3 (1x3) **(dest)**
:header: "", "column 1"
"row 1", "m00 * v0 + m10 * v1 + m20 * v2 + m30 * v3"
"row 2", "m01 * v0 + m11 * v1 + m21 * v2 + m31 * v3"
"row 3", "m02 * v0 + m12 * v1 + m22 * v2 + m32 * v3"
.. c:function:: void glm_mat4x3_transpose(mat4x3 src, mat3x4 dest)
Transpose mat4x3 (src) and store in mat3x4 (dest).
Parameters:
| *[in]* **m** matrix
| *[out]* **dest** destination
| *[in]* **src** mat4x3 (left)
| *[out]* **dest** destination (result, mat3x4)
.. c:function:: void glm_mat4x3_scale(mat4x3 m, float s)
.. csv-table:: mat4x3 **(src)**
:header: "", "column 1", "column 2", "column 3", "column 4"
multiply matrix with scalar
"row 1", "a00", "a10", "a20", "a30"
"row 2", "a01", "a11", "a21", "a31"
"row 3", "a02", "a12", "a22", "a32"
.. csv-table:: mat3x4 **(dest)**
:header: "", "column 1", "column 2", "column 3"
"row 1", "b00 = a00", "b10 = a01", "b20 = a02"
"row 2", "b01 = a10", "b11 = a11", "b21 = a12"
"row 3", "b02 = a20", "b12 = a21", "b22 = a22"
"row 4", "b03 = a30", "b13 = a31", "b23 = a32"
.. c:function:: void glm_mat4x3_scale(mat4x3 m, float s)
Multiply mat4x3 (m) by scalar constant (s).
Parameters:
| *[in, out]* **m** matrix
| *[in]* **s** scalar
| *[in, out]* **m** mat4x3 (src, dest)
| *[in]* **s** float (scalar)
.. csv-table:: mat4x3 **(m)**
:header: "", "column 1", "column 2", "column 3", "column 4"
"row 1", "m00 = m00 * s", "m10 = m10 * s", "m20 = m20 * s", "m30 = m30 * s"
"row 2", "m01 = m01 * s", "m11 = m11 * s", "m21 = m21 * s", "m31 = m31 * s"
"row 3", "m02 = m02 * s", "m12 = m12 * s", "m22 = m22 * s", "m32 = m32 * s"

60
docs/source/noise.rst Normal file
View File

@@ -0,0 +1,60 @@
.. default-domain:: C
perlin
================================================================================
Header: cglm/noise.h
Classic Perlin noise implementation.
Based on the work of Stefan Gustavson and Ashima Arts on "webgl-noise":
https://github.com/stegu/webgl-noise
Following Stefan Gustavson's paper "Simplex noise demystified":
http://www.itn.liu.se/~stegu/simplexnoise/simplexnoise.pdf
Implementation based on glm::perlin function:
https://github.com/g-truc/glm/blob/master/glm/gtc/noise.inl
Table of contents (click to go):
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Functions:
1. :c:func:`glm_perlin_vec4`
#. :c:func:`glm_perlin_vec3`
#. :c:func:`glm_perlin_vec2`
Functions documentation
~~~~~~~~~~~~~~~~~~~~~~~
.. c:function:: float glm_perlin_vec4(vec4 point)
| Classic Perlin noise
Parameters:
| *[in]* **point** 4D point
Returns:
| noise value
.. c:function:: float glm_perlin_vec3(vec3 point)
| Classic Perlin noise
Parameters:
| *[in]* **point** 3D point
Returns:
| noise value
.. c:function:: float glm_perlin_vec2(vec2 point)
| Classic Perlin noise
Parameters:
| *[in]* **point** 2D point
Returns:
| noise value

View File

@@ -34,7 +34,7 @@ array of matrices:
/* ... */
glUniformMatrix4fv(location, count, GL_FALSE, matrix[0][0]);
1. Cast matrix to pointer
2. Cast matrix to pointer
--------------------------
.. code-block:: c
@@ -43,14 +43,14 @@ array of matrices:
/* ... */
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:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
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
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

View File

@@ -5,35 +5,33 @@
A few options are provided via macros.
❗️ IMPORTANT ❗️
It's a good idea to set up your config macros in build settings like CMake, Xcode, or Visual Studio. This is especially important if you're using features like Modules in Xcode, where adding macros directly before the **cglm** headers might not work.
Alignment Option
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
As default, cglm requires types to be aligned. Alignment requirements:
By default, **cglm** requires types to be aligned with specific byte requirements:
vec3: 8 byte
vec4: 16 byte
mat4: 16 byte
versor: 16 byte
- vec3: 8 bytes
- vec4: 16 bytes
- mat4: 16 bytes (32 on AVX)
- versor: 16 bytes
By starting **v0.4.5** cglm provides an option to disable alignment requirement.
To enable this option define **CGLM_ALL_UNALIGNED** macro before all headers.
You can define it in Xcode, Visual Studio (or other IDEs) or you can also prefer
to define it in build system. If you use pre-compiled versions then you
have to compile cglm with **CGLM_ALL_UNALIGNED** macro.
Starting with **v0.4.5**, **cglm** offers an option to relax these alignment requirements. To use this option, define the **CGLM_ALL_UNALIGNED** macro before including any headers. This definition can be made within Xcode, Visual Studio, other IDEs, or directly in your build system. If using pre-compiled versions of **cglm**, you'll need to compile them with the **CGLM_ALL_UNALIGNED** macro.
**VERY VERY IMPORTANT:** If you use cglm in multiple projects and
those projects are depends on each other, then
**NOTE:❗️** If you're using **cglm** across multiple interdependent projects:
| *ALWAYS* or *NEVER USE* **CGLM_ALL_UNALIGNED** macro in linked projects
- Always or never use the **CGLM_ALL_UNALIGNED** macro in all linked projects to avoid configuration conflicts. A **cglm** header from one project could require alignment, while a header from another might not, leading to **cglm** functions accessing invalid memory locations.
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
included via 'project B' may not require alignment. In this case
cglm functions will read from and write to **INVALID MEMORY LOCATIONs**.
- **Key Point:** Maintain the same **cglm** configuration across all your projects. For example, if you activate **CGLM_ALL_UNALIGNED** in one project, ensure it's set in the others too.
ALWAYS USE SAME CONFIGURATION / OPTION for **cglm** if you have multiple projects.
**❗NOTE:❗️**
For instance if you set CGLM_ALL_UNALIGNED in a project then set it in other projects too
While **CGLM_ALL_UNALIGNED** allows for flexibility in alignment, it doesn't override C's fundamental alignment rules. For example, an array like *vec4* decays to a pointer (float*) in functions, which must adhere to the alignment requirements of a float pointer (4 bytes). This adherence is crucial because **cglm** directly dereferences these pointers instead of copying data, and failing to meet alignment requirements can lead to unpredictable errors, such as crashes.
You can use `CGLM_ALIGN` and `CGLM_ALIGN_MAT` macros for aligning local variables or struct members. However, when dealing with dynamic memory allocation or custom memory locations, you'll need to ensure alignment requirements are met appropriately for those cases
Clipspace Option[s]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -43,7 +41,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
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`...
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**
2. **CGLM_FORCE_DEPTH_ZERO_TO_ONE**
@@ -78,7 +76,7 @@ SSE and SSE2 Shuffle Option
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
**_mm_shuffle_ps** generates **shufps** instruction even if registers are same.
You can force it to generate **pshufd** instruction by defining
**CGLM_USE_INT_DOMAIN** macro. As default it is not defined.
**CGLM_NO_INT_DOMAIN** macro. As default it is not defined.
SSE3 and SSE4 Dot Product Options
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

View File

@@ -11,9 +11,9 @@ Header: cglm/quat.h
What you can do with quaternions with existing functions is (Some of them):
- You can rotate transform matrix using quaterion
- You can rotate vector using quaterion
- You can create view matrix using quaterion
- You can rotate transform matrix using quaternion
- You can rotate vector using quaternion
- You can create view matrix using quaternion
- You can create a lookrotation (from source point to dest)
Table of contents (click to go):
@@ -55,6 +55,7 @@ Functions:
#. :c:func:`glm_quat_lerp`
#. :c:func:`glm_quat_nlerp`
#. :c:func:`glm_quat_slerp`
#. :c:func:`glm_quat_slerp_longest`
#. :c:func:`glm_quat_look`
#. :c:func:`glm_quat_for`
#. :c:func:`glm_quat_forp`
@@ -351,6 +352,17 @@ Functions documentation
| *[in]* **t** interpolant (amount) clamped between 0 and 1
| *[out]* **dest** result quaternion
.. c:function:: void glm_quat_slerp_longest(versor q, versor r, float t, versor dest)
| interpolates between two quaternions
| using spherical linear interpolation (SLERP) and always takes the longest path
Parameters:
| *[in]* **from** from
| *[in]* **to** to
| *[in]* **t** interpolant (amount) clamped between 0 and 1
| *[out]* **dest** result quaternion
.. c:function:: void glm_quat_look(vec3 eye, versor ori, mat4 dest)
| creates view matrix using quaternion as camera orientation
@@ -422,11 +434,11 @@ Functions documentation
| *[in]* **q** quaternion
| *[in]* **pivot** pivot
.. c:function:: void glm_quat_make(float * __restrict src, versor dest)
.. c:function:: void glm_quat_make(const float * __restrict src, versor dest)
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:
| *[in]* **src** pointer to an array of floats

View File

@@ -13,6 +13,8 @@ Table of contents (click to go):
Functions:
1. :c:func:`glm_ray_triangle`
#. :c:func:`glm_ray_sphere`
#. :c:func:`glm_ray_at`
Functions documentation
~~~~~~~~~~~~~~~~~~~~~~~
@@ -29,3 +31,39 @@ Functions documentation
| *[in]* **v2** third vertex of triangle
| *[in, out]* **d** float pointer to save distance to intersection
| *[out]* **intersection** whether there is intersection
.. c:function:: bool glm_ray_sphere(vec3 origin, vec3 dir, vec4 s, float * __restrict t1, float * __restrict t2)
ray sphere intersection
returns false if there is no intersection if true:
- t1 > 0, t2 > 0: ray intersects the sphere at t1 and t2 both ahead of the origin
- t1 < 0, t2 > 0: ray starts inside the sphere, exits at t2
- t1 < 0, t2 < 0: no intersection ahead of the ray ( returns false )
- the caller can check if the intersection points (t1 and t2) fall within a
specific range (for example, tmin < t1, t2 < tmax) to determine if the
intersections are within a desired segment of the ray
Parameters:
| *[in]* **origin** ray origin
| *[in]* **dir** normalized ray direction
| *[in]* **s** sphere [center.x, center.y, center.z, radii]
| *[out]* **t1** near point1 (closer to origin)
| *[out]* **t2** far point2 (farther from origin)
Return:
| whether there is intersection
.. c:function:: bool glm_ray_at(vec3 orig, vec3 dir, float t, vec3 point)
point using t by 𝐏(𝑡)=𝐀+𝑡𝐛
Parameters:
| *[in]* **origin** ray origin
| *[in]* **dir** ray direction
| *[out]* **t** parameter
| *[out]* **point** point at t
Return:
| point at t

View File

@@ -9,7 +9,7 @@ Header: cglm/sphere.h
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.
Table of contents (click to go):

View File

@@ -0,0 +1,12 @@
@media screen {
/* content column
*
* RTD theme's default is 800px as max width for the content, but we have
* tables with tons of columns, which need the full width of the view-port.
*
* Comment from yocto project theme_overrides.css
*/
.wy-nav-content{ max-width: none; }
}

View File

@@ -3,30 +3,30 @@
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
Memory Allocation:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Again, **cglm** doesn't alloc any memory on heap.
cglm functions works like memcpy; it copies data from src,
makes calculations then copy the result to dest.
Recall that **cglm** does not alloc any memory on the heap.
cglm functions work like memcpy; they copy data from src,
make calculations, then copy the result to dest.
You are responsible for allocation of **src** and **dest** parameters.
Alignment:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
**vec4** and **mat4** types requires 16 byte alignment.
These types are marked with align attribute to let compiler know about this
**vec4** and **mat4** types require 16 byte alignment.
These types are marked with the align attribute to let the compiler know about this
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"**
The alignment attribute has been commented for MSVC
The alignment attribute has been commented out for MSVC
.. code-block:: c
@@ -37,61 +37,61 @@ The alignment attribute has been commented for MSVC
#endif.
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,
you may do it yourself.
**This MSVC issue is still in TODOs.**
**UPDATE:** By starting v0.4.5 cglm provides an option to disable 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.
**UPDATE:** Starting with v0.4.5, cglm provides an option to disable the alignment requirement.
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:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
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.
It will try to write 32 byte but since **vec3** is 24 byte it should throw
memory access error or exit the app without saying anything.
For example, you may have called a **glm_vec4_** function for a **vec3** data type.
It will try to write 32 bytes, but since **vec3** is 24 bytes, it should throw
a memory access error or exit the app without saying anything.
**UPDATE - IMPORTANT:**
| On MSVC or some other compilers, if alignment is enabled (default) then double check alignment requirements if you got a crash.
| If you send GLM_VEC4_ONE or similar macros directly to a function, it may be crashed.
| Because compiler may not apply alignment as defined on **typedef** to that macro while passing it (on stack) to a function.
| If you send GLM_VEC4_ONE or similar macros directly to a function, it may crash.
| Because the compiler may not apply alignment as defined on **typedef** to that macro while passing it (on stack) to a function.
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**,
it will assume that passed param is **vec3** and will normalize it for **vec3**.
Since you need to **vec4** to be normalized in your case, you will get wrong results.
For instance if you use **glm_normalize()** or **glm_vec3_normalize()** for a **vec4**,
it will assume that the passed param is a **vec3**, and will normalize it for **vec3**.
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!
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
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
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
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...
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?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

View File

@@ -68,14 +68,14 @@ Functions documentation
.. 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:
| *[in, out]* **deg** pointer to angle in degrees
.. 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:
| *[in, out]* **rad** pointer to angle in radians

View File

@@ -27,6 +27,8 @@ Functions:
#. :c:func:`glm_vec2_isvalid`
#. :c:func:`glm_vec2_sign`
#. :c:func:`glm_vec2_abs`
#. :c:func:`glm_vec2_fract`
#. :c:func:`glm_vec2_floor`
#. :c:func:`glm_vec2_sqrt`
Functions documentation
@@ -134,6 +136,22 @@ Functions documentation
| *[in]* **v** vector
| *[out]* **dest** destination vector
.. c:function:: void glm_vec2_fract(vec2 v, vec2 dest)
get fractional part of each vector item
Parameters:
| *[in]* **v** vector
| *[out]* **dest** destination vector
.. c:function:: void glm_vec2_floor(vec2 v, vec2 dest)
floor value of each vector item
Parameters:
| *[in]* **v** vector
| *[out]* **dest** destination vector
.. c:function:: void glm_vec2_sqrt(vec2 v, vec2 dest)
square root of each vector item

View File

@@ -45,6 +45,7 @@ Functions:
#. :c:func:`glm_vec2_normalize`
#. :c:func:`glm_vec2_normalize_to`
#. :c:func:`glm_vec2_rotate`
#. :c:func:`glm_vec2_center`
#. :c:func:`glm_vec2_distance2`
#. :c:func:`glm_vec2_distance`
#. :c:func:`glm_vec2_maxv`
@@ -52,6 +53,8 @@ Functions:
#. :c:func:`glm_vec2_clamp`
#. :c:func:`glm_vec2_lerp`
#. :c:func:`glm_vec2_make`
#. :c:func:`glm_vec2_reflect`
#. :c:func:`glm_vec2_refract`
Functions documentation
~~~~~~~~~~~~~~~~~~~~~~~
@@ -116,7 +119,7 @@ Functions documentation
norm * norm (magnitude) of vector
we can use this func instead of calling norm * norm, because it would call
sqrtf fuction twice but with this func we can avoid func call, maybe this is
sqrtf function twice but with this func we can avoid func call, maybe this is
not good name for this func
Parameters:
@@ -314,6 +317,15 @@ Functions documentation
| *[in]* **axis** axis vector
| *[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)
squared distance between two vectors
@@ -375,11 +387,38 @@ Functions documentation
| *[in]* **t** interpolant (amount) clamped between 0 and 1
| *[out]* **dest** destination
.. c:function:: void glm_vec2_make(float * __restrict src, vec2 dest)
.. c:function:: void glm_vec2_make(const float * __restrict src, vec2 dest)
Create two dimensional vector from pointer
| NOTE: **@src** must contain at least 2 elements.
.. note:: **@src** must contain at least 2 elements.
Parameters:
| *[in]* **src** pointer to an array of floats
| *[out]* **dest** destination vector
.. c:function:: void glm_vec2_reflect(vec2 v, vec2 n, vec2 dest)
Reflection vector using an incident ray and a surface normal
Parameters:
| *[in]* **v** incident vector
| *[in]* **n** *❗️ normalized ❗️* normal vector
| *[out]* **dest** destination: reflection result
.. c:function:: bool glm_vec2_refract(vec2 v, vec2 n, float eta, vec2 dest)
Computes refraction vector for an incident vector and a surface normal.
Calculates the refraction vector based on Snell's law. If total internal reflection
occurs (angle too great given eta), dest is set to zero and returns false.
Otherwise, computes refraction vector, stores it in dest, and returns true.
Parameters:
| *[in]* **v** *❗️ normalized ❗️* incident vector
| *[in]* **n** *❗️ normalized ❗️* normal vector
| *[in]* **eta** ratio of indices of refraction (incident/transmitted)
| *[out]* **dest** refraction vector if refraction occurs; zero vector otherwise
Returns:
returns true if refraction occurs; false if total internal reflection occurs.

View File

@@ -28,6 +28,8 @@ Functions:
#. :c:func:`glm_vec3_isvalid`
#. :c:func:`glm_vec3_sign`
#. :c:func:`glm_vec3_abs`
#. :c:func:`glm_vec3_fract`
#. :c:func:`glm_vec3_floor`
#. :c:func:`glm_vec3_sqrt`
Functions documentation
@@ -50,6 +52,14 @@ Functions documentation
| *[in]* **val** value
| *[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)
check if vector is equal to value (without epsilon)
@@ -143,6 +153,22 @@ Functions documentation
| *[in]* **v** vector
| *[out]* **dest** destination vector
.. c:function:: void glm_vec3_fract(vec3 v, vec3 dest)
fractional part of each vector item
Parameters:
| *[in]* **v** vector
| *[out]* **dest** destination vector
.. c:function:: void glm_vec3_floor(vec3 v, vec3 dest)
floor of each vector item
Parameters:
| *[in]* **v** vector
| *[out]* **dest** destination vector
.. c:function:: void glm_vec3_sqrt(vec3 v, vec3 dest)
square root of each vector item

View File

@@ -13,7 +13,7 @@ Header: cglm/vec3.h
We mostly use vectors in graphics math, to make writing code faster
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`,
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
rotate *vec3* with matrix.
@@ -80,6 +80,9 @@ Functions:
#. :c:func:`glm_vec3_clamp`
#. :c:func:`glm_vec3_lerp`
#. :c:func:`glm_vec3_make`
#. :c:func:`glm_vec3_faceforward`
#. :c:func:`glm_vec3_reflect`
#. :c:func:`glm_vec3_refract`
Functions documentation
~~~~~~~~~~~~~~~~~~~~~~~
@@ -148,7 +151,7 @@ Functions documentation
norm * norm (magnitude) of vector
we can use this func instead of calling norm * norm, because it would call
sqrtf fuction twice but with this func we can avoid func call, maybe this is
sqrtf function twice but with this func we can avoid func call, maybe this is
not good name for this func
Parameters:
@@ -309,7 +312,7 @@ Functions documentation
.. c:function:: void glm_vec3_flipsign(vec3 v)
**DEPRACATED!**
**DEPRECATED!**
use :c:func:`glm_vec3_negate`
@@ -318,7 +321,7 @@ Functions documentation
.. c:function:: void glm_vec3_flipsign_to(vec3 v, vec3 dest)
**DEPRACATED!**
**DEPRECATED!**
use :c:func:`glm_vec3_negate_to`
@@ -328,7 +331,7 @@ Functions documentation
.. c:function:: void glm_vec3_inv(vec3 v)
**DEPRACATED!**
**DEPRECATED!**
use :c:func:`glm_vec3_negate`
@@ -337,7 +340,7 @@ Functions documentation
.. c:function:: void glm_vec3_inv_to(vec3 v, vec3 dest)
**DEPRACATED!**
**DEPRECATED!**
use :c:func:`glm_vec3_negate_to`
@@ -377,7 +380,7 @@ Functions documentation
.. c:function:: float glm_vec3_angle(vec3 v1, vec3 v2)
angle betwen two vector
angle between two vector
Parameters:
| *[in]* **v1** vector1
@@ -503,12 +506,49 @@ Functions documentation
| *[in]* **t** interpolant (amount) clamped between 0 and 1
| *[out]* **dest** destination
.. c:function:: void glm_vec3_make(float * __restrict src, vec3 dest)
.. c:function:: void glm_vec3_make(const float * __restrict src, vec3 dest)
Create three dimensional vector from pointer
| NOTE: **@src** must contain at least 3 elements.
.. note::: **@src** must contain at least 3 elements.
Parameters:
| *[in]* **src** pointer to an array of floats
| *[out]* **dest** destination vector
.. c:function:: void glm_vec3_faceforward(vec3 n, vec3 v, vec3 nref, vec3 dest)
A vector pointing in the same direction as another
Parameters:
| *[in]* **n** vector to orient
| *[in]* **v** incident vector
| *[in]* **nref** reference vector
| *[out]* **dest** destination: oriented vector, pointing away from the surface.
.. c:function:: void glm_vec3_reflect(vec3 v, vec3 n, vec3 dest)
Reflection vector using an incident ray and a surface normal
Parameters:
| *[in]* **v** incident vector
| *[in]* **n** *❗️ normalized ❗️* normal vector
| *[out]* **dest** destination: reflection result
.. c:function:: bool glm_vec3_refract(vec3 v, vec3 n, float eta, vec3 dest)
Computes refraction vector for an incident vector and a surface normal.
Calculates the refraction vector based on Snell's law. If total internal reflection
occurs (angle too great given eta), dest is set to zero and returns false.
Otherwise, computes refraction vector, stores it in dest, and returns true.
Parameters:
| *[in]* **v** *❗️ normalized ❗️* incident vector
| *[in]* **n** *❗️ normalized ❗️* normal vector
| *[in]* **eta** ratio of indices of refraction (incident/transmitted)
| *[out]* **dest** refraction vector if refraction occurs; zero vector otherwise
Returns:
returns true if refraction occurs; false if total internal reflection occurs.

View File

@@ -23,6 +23,15 @@ Functions:
#. :c:func:`glm_vec4_eqv_eps`
#. :c:func:`glm_vec4_max`
#. :c:func:`glm_vec4_min`
#. :c:func:`glm_vec4_isnan`
#. :c:func:`glm_vec4_isinf`
#. :c:func:`glm_vec4_isvalid`
#. :c:func:`glm_vec4_sign`
#. :c:func:`glm_vec4_abs`
#. :c:func:`glm_vec4_fract`
#. :c:func:`glm_vec4_floor`
#. :c:func:`glm_vec4_sqrt`
Functions documentation
~~~~~~~~~~~~~~~~~~~~~~~
@@ -129,6 +138,30 @@ Functions documentation
| *[in]* **v** vector
| *[out]* **dest** sign vector (only keeps signs as -1, 0, -1)
.. c:function:: void glm_vec4_abs(vec4 v, vec4 dest)
absolute value of each vector item
Parameters:
| *[in]* **v** vector
| *[out]* **dest** destination vector (abs(v))
.. c:function:: void glm_vec4_fract(vec4 v, vec4 dest)
fractional part of each vector item
Parameters:
| *[in]* **v** vector
| *[out]* **dest** destination vector (fract(v))
.. c:function:: void glm_vec4_floor(vec4 v, vec4 dest)
floor of each vector item
Parameters:
| *[in]* **v** vector
| *[out]* **dest** destination vector (floor(v))
.. c:function:: void glm_vec4_sqrt(vec4 v, vec4 dest)
square root of each vector item

View File

@@ -60,6 +60,8 @@ Functions:
#. :c:func:`glm_vec4_lerp`
#. :c:func:`glm_vec4_cubic`
#. :c:func:`glm_vec4_make`
#. :c:func:`glm_vec4_reflect`
#. :c:func:`glm_vec4_refract`
Functions documentation
~~~~~~~~~~~~~~~~~~~~~~~
@@ -108,6 +110,13 @@ Functions documentation
Parameters:
| *[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)
dot product of vec4
@@ -124,7 +133,7 @@ Functions documentation
norm * norm (magnitude) of vector
we can use this func instead of calling norm * norm, because it would call
sqrtf fuction twice but with this func we can avoid func call, maybe this is
sqrtf function twice but with this func we can avoid func call, maybe this is
not good name for this func
Parameters:
@@ -284,7 +293,7 @@ Functions documentation
.. c:function:: void glm_vec4_flipsign(vec4 v)
**DEPRACATED!**
**DEPRECATED!**
use :c:func:`glm_vec4_negate`
@@ -293,7 +302,7 @@ Functions documentation
.. c:function:: void glm_vec4_flipsign_to(vec4 v, vec4 dest)
**DEPRACATED!**
**DEPRECATED!**
use :c:func:`glm_vec4_negate_to`
@@ -303,7 +312,7 @@ Functions documentation
.. c:function:: void glm_vec4_inv(vec4 v)
**DEPRACATED!**
**DEPRECATED!**
use :c:func:`glm_vec4_negate`
@@ -312,7 +321,7 @@ Functions documentation
.. c:function:: void glm_vec4_inv_to(vec4 v, vec4 dest)
**DEPRACATED!**
**DEPRECATED!**
use :c:func:`glm_vec4_negate_to`
@@ -408,11 +417,42 @@ Functions documentation
| *[in]* **s** parameter
| *[out]* **dest** destination
.. c:function:: void glm_vec4_make(float * __restrict src, vec4 dest)
.. c:function:: void glm_vec4_make(const float * __restrict src, vec4 dest)
Create four dimensional vector from pointer
| NOTE: **@src** must contain at least 4 elements.
.. note:: **@src** must contain at least 4 elements.
Parameters:
| *[in]* **src** pointer to an array of floats
| *[out]* **dest** destination vector
.. c:function:: bool glm_vec4_reflect(vec4 v, vec4 n, vec4 dest)
Reflection vector using an incident ray and a surface normal
Parameters:
| *[in]* **v** incident vector
| *[in]* **n** *❗️ normalized ❗️* normal vector
| *[out]* **dest** destination: reflection result
.. c:function:: bool glm_vec4_refract(vec4 v, vec4 n, float eta, vec4 dest)
computes refraction vector for an incident vector and a surface normal.
Calculates the refraction vector based on Snell's law. If total internal reflection
occurs (angle too great given eta), dest is set to zero and returns false.
Otherwise, computes refraction vector, stores it in dest, and returns true.
This implementation does not explicitly preserve the 'w' component of the
incident vector 'I' in the output 'dest', users requiring the preservation of
the 'w' component should manually adjust 'dest' after calling this function.
Parameters:
| *[in]* **v** *❗️ normalized ❗️* incident vector
| *[in]* **n** *❗️ normalized ❗️* normal vector
| *[in]* **eta** ratio of indices of refraction (incident/transmitted)
| *[out]* **dest** refraction vector if refraction occurs; zero vector otherwise
Returns:
returns true if refraction occurs; false if total internal reflection occurs.

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

@@ -0,0 +1,270 @@
/*
* 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 getting 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 getting 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
* 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]
*/
CGLM_INLINE
@@ -51,9 +51,9 @@ glm_translated(mat4 m, vec3 v) {
*
* 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[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
*
* 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
*/
CGLM_INLINE
@@ -81,9 +81,9 @@ glm_translated_x(mat4 m, float x) {
/*!
* @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
*/
CGLM_INLINE
@@ -95,9 +95,9 @@ glm_translated_y(mat4 m, float y) {
/*!
* @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
*/
CGLM_INLINE
@@ -110,9 +110,9 @@ glm_translated_z(mat4 m, float z) {
* @brief rotate existing transform matrix around X axis by angle
* 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[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
* 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[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
* 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[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
*
* 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] axis axis
*/
@@ -208,9 +208,9 @@ glm_rotated(mat4 m, float angle, vec3 axis) {
* @brief rotate existing transform
* 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] angle angle (radians)
* @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)
*
* 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] axis axis
*/

View File

@@ -35,7 +35,7 @@
* @brief translate existing transform matrix by v vector
* 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]
*/
CGLM_INLINE
@@ -66,7 +66,7 @@ glm_translate(mat4 m, vec3 v) {
*
* source matrix will remain same
*
* @param[in] m affine transfrom
* @param[in] m affine transform
* @param[in] v translate vector [x, y, z]
* @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
*
* @param[in, out] m affine transfrom
* @param[in, out] m affine transform
* @param[in] x x factor
*/
CGLM_INLINE
@@ -98,7 +98,7 @@ glm_translate_x(mat4 m, float x) {
/*!
* @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
*/
CGLM_INLINE
@@ -116,7 +116,7 @@ glm_translate_y(mat4 m, float y) {
/*!
* @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
*/
CGLM_INLINE
@@ -135,7 +135,7 @@ glm_translate_z(mat4 m, float z) {
* @brief rotate existing transform matrix around X axis by angle
* and store result in dest
*
* @param[in] m affine transfrom
* @param[in] m affine transform
* @param[in] angle angle (radians)
* @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
* and store result in dest
*
* @param[in] m affine transfrom
* @param[in] m affine transform
* @param[in] angle angle (radians)
* @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
* and store result in dest
*
* @param[in] m affine transfrom
* @param[in] m affine transform
* @param[in] angle angle (radians)
* @param[out] dest rotated matrix
*/
@@ -207,9 +207,27 @@ 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 at ORIGIN (0,0,0)
*
* @param[in, out] m affine transfrom
* **❗IMPORTANT ❗️**
*
* If you need to rotate object around itself e.g. center of object or at
* some point [of object] then `glm_rotate_at()` would be better choice to do so.
*
* Even if object's model transform is identity, rotation may not be around
* center of object if object does not lay out at ORIGIN perfectly.
*
* Using `glm_rotate_at()` with center of bounding shape ( AABB, Sphere ... )
* would be an easy option to rotate around object if object is not at origin.
*
* One another option to rotate around itself at any point is `glm_spin()`
* which is perfect if only rotating around model position is desired e.g. not
* specific point on model for instance center of geometry or center of mass,
* again if geometry is not perfectly centered at origin at identity transform,
* rotation may not be around geometry.
*
* @param[in, out] m affine transform
* @param[in] angle angle (radians)
* @param[in] axis axis
*/
@@ -225,7 +243,7 @@ glm_rotate(mat4 m, float angle, vec3 axis) {
* @brief rotate existing transform
* 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] angle angle (radians)
* @param[in] axis axis
@@ -250,7 +268,7 @@ glm_rotate_at(mat4 m, vec3 pivot, float angle, vec3 axis) {
* this should work faster than glm_rotate_at because it reduces
* one glm_translate.
*
* @param[out] m affine transfrom
* @param[out] m affine transform
* @param[in] pivot rotation center
* @param[in] angle angle (radians)
* @param[in] axis axis
@@ -268,9 +286,10 @@ 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] axis axis
*/

View File

@@ -44,7 +44,7 @@
/*!
* @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]
*/
CGLM_INLINE
@@ -58,7 +58,7 @@ glm_translate_make(mat4 m, vec3 v) {
* @brief scale existing transform matrix by v vector
* and store result in dest
*
* @param[in] m affine transfrom
* @param[in] m affine transform
* @param[in] v scale vector [x, y, z]
* @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
*
* @param[out] m affine transfrom
* @param[out] m affine transform
* @param[in] v scale vector [x, y, z]
*/
CGLM_INLINE
@@ -91,7 +91,7 @@ glm_scale_make(mat4 m, vec3 v) {
* @brief scales existing transform matrix by v vector
* 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]
*/
CGLM_INLINE
@@ -104,7 +104,7 @@ glm_scale(mat4 m, vec3 v) {
* @brief applies uniform scale to existing transform matrix v = [s, s, s]
* and stores result in same matrix
*
* @param[in, out] m affine transfrom
* @param[in, out] m affine transform
* @param[in] s scale factor
*/
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
*
* @param[out] m affine transfrom
* @param[out] m affine transform
* @param[in] angle angle (radians)
* @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.
* DON'T pass projected matrix here
*
* @param[in] m affine transfrom
* @param[in] m affine transform
* @param[out] t translation vector
* @param[out] r rotation matrix (mat4)
* @param[out] s scaling vector [X, Y, Z]

View File

@@ -0,0 +1,132 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#ifndef cglm_affine2d_post_h
#define cglm_affine2d_post_h
/*
Functions:
CGLM_INLINE void glm_translated2d(mat3 m, vec2 v);
CGLM_INLINE void glm_translated2d_x(mat3 m, float to);
CGLM_INLINE void glm_translated2d_y(mat3 m, float to);
CGLM_INLINE void glm_rotated2d(mat3 m, float angle);
CGLM_INLINE void glm_scaled2d(mat3 m, vec2 v);
CGLM_INLINE void glm_scaled2d_uni(mat3 m, float s);
*/
#include "vec2.h"
/*!
* @brief translate existing transform matrix by v vector
* and store result in same matrix
*
* this is POST transform, applies to existing transform as last transform
*
* @param[in, out] m affine transform
* @param[in] v translate vector [x, y]
*/
CGLM_INLINE
void
glm_translated2d(mat3 m, vec2 v) {
glm_vec2_add(m[2], v, m[2]);
}
/*!
* @brief translate existing transform matrix by x factor
*
* this is POST transform, applies to existing transform as last transform
*
* @param[in, out] m affine transform
* @param[in] x x factor
*/
CGLM_INLINE
void
glm_translated2d_x(mat3 m, float x) {
m[2][0] += x;
}
/*!
* @brief translate existing transform matrix by y factor
*
* this is POST transform, applies to existing transform as last transform
*
* @param[in, out] m affine transform
* @param[in] y y factor
*/
CGLM_INLINE
void
glm_translated2d_y(mat3 m, float y) {
m[2][1] += y;
}
/*!
* @brief rotate existing transform matrix by angle
*
* this is POST transform, applies to existing transform as last transform
*
* @param[in, out] m affine transform
* @param[in] angle angle (radians)
*/
CGLM_INLINE
void
glm_rotated2d(mat3 m, float angle) {
float c = cosf(angle),
s = sinf(angle),
m00 = m[0][0], m10 = m[1][0], m20 = m[2][0],
m01 = m[0][1], m11 = m[1][1], m21 = m[2][1];
m[0][0] = c * m00 - s * m01;
m[1][0] = c * m10 - s * m11;
m[2][0] = c * m20 - s * m21;
m[0][1] = s * m00 + c * m01;
m[1][1] = s * m10 + c * m11;
m[2][1] = s * m20 + c * m21;
}
/*!
* @brief scale existing 2d transform matrix by v vector
*
* this is POST transform, applies to existing transform as last transform
*
* @param[in, out] m affine transform
* @param[in] v scale vector [x, y]
*/
CGLM_INLINE
void
glm_scaled2d(mat3 m, vec2 v) {
m[0][0] *= v[0];
m[1][0] *= v[0];
m[2][0] *= v[0];
m[0][1] *= v[1];
m[1][1] *= v[1];
m[2][1] *= v[1];
}
/*!
* @brief applies uniform scale to existing 2d transform matrix v = [s, s]
*
* this is POST transform, applies to existing transform as last transform
*
* @param[in, out] m affine transform
* @param[in] s scale factor
*/
CGLM_INLINE
void
glm_scaled2d_uni(mat3 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;
}
#endif /* cglm_affine2d_post_h */

View File

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

View File

@@ -14,16 +14,17 @@
&& defined(SIMD_VECTOR_TYPES)
#include "common.h"
#include "struct.h"
/*!
* @brief converts mat4 to Apple's simd type simd_float4x4
* @return simd_float4x4
*/
* @brief converts mat4 to Apple's simd type simd_float4x4
* @return simd_float4x4
*/
CGLM_INLINE
simd_float4x4
glm_mat4_applesimd(mat4 m) {
simd_float4x4 t;
t.columns[0][0] = m[0][0];
t.columns[0][1] = m[0][1];
t.columns[0][2] = m[0][2];
@@ -55,7 +56,7 @@ CGLM_INLINE
simd_float3x3
glm_mat3_applesimd(mat3 m) {
simd_float3x3 t;
t.columns[0][0] = m[0][0];
t.columns[0][1] = m[0][1];
t.columns[0][2] = m[0][2];
@@ -83,7 +84,7 @@ glm_vec4_applesimd(vec4 v) {
/*!
* @brief converts vec3 to Apple's simd type simd_float3
* @return v
* @return simd_float3
*/
CGLM_INLINE
simd_float3
@@ -91,5 +92,45 @@ glm_vec3_applesimd(vec3 v) {
return (simd_float3){v[0], v[1], v[2]};
}
/*!
* @brief generic function to convert cglm types to Apple's simd types
*
* Example usage:
* simd_float4x4 m = applesimd(mat4_value);
* simd_float3 v = applesimd(vec3_value);
*
* @param x cglm type (mat4, mat3, vec4, vec3)
* @return corresponding Apple simd type
*/
#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)
# define applesimd(x) _Generic((x), \
mat4: glm_mat4_applesimd, \
mat3: glm_mat3_applesimd, \
vec4: glm_vec4_applesimd, \
vec3: glm_vec3_applesimd \
)((x))
#endif
#ifdef cglm_types_struct_h
CGLM_INLINE simd_float4x4 glms_mat4_(applesimd)(mat4s m) { return glm_mat4_applesimd(m.raw); }
CGLM_INLINE simd_float3x3 glms_mat3_(applesimd)(mat3s m) { return glm_mat3_applesimd(m.raw); }
CGLM_INLINE simd_float4 glms_vec4_(applesimd)(vec4s v) { return glm_vec4_applesimd(v.raw); }
CGLM_INLINE simd_float3 glms_vec3_(applesimd)(vec3s v) { return glm_vec3_applesimd(v.raw); }
#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)
# undef applesimd
# define applesimd(x) _Generic((x), \
mat4: glm_mat4_applesimd, \
mat3: glm_mat3_applesimd, \
vec4: glm_vec4_applesimd, \
vec3: glm_vec3_applesimd, \
mat4s: glms_mat4_(applesimd), \
mat3s: glms_mat3_(applesimd), \
vec4s: glms_vec4_(applesimd), \
vec3s: glms_vec3_(applesimd) \
)((x))
#endif
#endif
#endif
#endif /* cglm_applesimd_h */

View File

@@ -75,7 +75,7 @@ glm_aabb_merge(vec3 box1[2], vec3 box2[2], vec3 dest[2]) {
/*!
* @brief crops a bounding box with another one.
*
* this could be useful for gettng a bbox which fits with view frustum and
* this could be useful for getting a bbox which fits with view frustum and
* object bounding boxes. In this case you crop view frustum box with objects
* box
*
@@ -98,13 +98,13 @@ glm_aabb_crop(vec3 box[2], vec3 cropBox[2], vec3 dest[2]) {
/*!
* @brief crops a bounding box with another one.
*
* this could be useful for gettng a bbox which fits with view frustum and
* this could be useful for getting a bbox which fits with view frustum and
* object bounding boxes. In this case you crop view frustum box with objects
* box
*
* @param[in] box bounding box
* @param[in] cropBox crop box
* @param[in] clampBox miniumum box
* @param[in] clampBox minimum box
* @param[out] dest cropped bounding box
*/
CGLM_INLINE

View File

@@ -32,7 +32,9 @@ extern "C" {
#include "call/quat.h"
#include "call/euler.h"
#include "call/plane.h"
#include "call/noise.h"
#include "call/frustum.h"
#include "call/aabb2d.h"
#include "call/box.h"
#include "call/io.h"
#include "call/project.h"

View File

@@ -0,0 +1,89 @@
/*
* 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

@@ -76,4 +76,3 @@ glmc_aabb_sphere(vec3 box[2], vec4 s);
}
#endif
#endif /* cglmc_box_h */

View File

@@ -51,6 +51,10 @@ CGLM_EXPORT
void
glmc_perspective(float fovy, float aspect, float nearZ, float farZ, mat4 dest);
CGLM_EXPORT
void
glmc_perspective_infinite(float fovy, float aspect, float nearZ, mat4 dest);
CGLM_EXPORT
void
glmc_persp_move_far(mat4 proj, float deltaFar);
@@ -59,6 +63,10 @@ CGLM_EXPORT
void
glmc_perspective_default(float aspect, mat4 dest);
CGLM_EXPORT
void
glmc_perspective_default_infinite(float aspect, mat4 dest);
CGLM_EXPORT
void
glmc_perspective_resize(float aspect, mat4 proj);

View File

@@ -27,6 +27,10 @@ glmc_perspective_lh_no(float fovy,
float nearVal,
float farVal,
mat4 dest);
CGLM_EXPORT
void
glmc_perspective_resize_lh_no(float aspect, mat4 proj);
CGLM_EXPORT
void

View File

@@ -27,6 +27,10 @@ glmc_perspective_lh_zo(float fovy,
float nearVal,
float farVal,
mat4 dest);
CGLM_EXPORT
void
glmc_perspective_resize_lh_zo(float aspect, mat4 proj);
CGLM_EXPORT
void

View File

@@ -27,6 +27,10 @@ glmc_perspective_rh_no(float fovy,
float nearVal,
float farVal,
mat4 dest);
CGLM_EXPORT
void
glmc_perspective_resize_rh_no(float aspect, mat4 proj);
CGLM_EXPORT
void

View File

@@ -27,6 +27,10 @@ glmc_perspective_rh_zo(float fovy,
float nearVal,
float farVal,
mat4 dest);
CGLM_EXPORT
void
glmc_perspective_resize_rh_zo(float aspect, mat4 proj);
CGLM_EXPORT
void

View File

@@ -49,6 +49,31 @@ CGLM_EXPORT
void
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
}
#endif

View File

@@ -29,6 +29,14 @@ CGLM_EXPORT
void
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
void
glmc_ivec2_add(ivec2 a, ivec2 b, ivec2 dest);
@@ -53,6 +61,82 @@ CGLM_EXPORT
void
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
int
glmc_ivec2_distance2(ivec2 a, ivec2 b);
@@ -61,6 +145,18 @@ CGLM_EXPORT
float
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
void
glmc_ivec2_maxv(ivec2 a, ivec2 b, ivec2 dest);

View File

@@ -29,6 +29,18 @@ CGLM_EXPORT
void
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
void
glmc_ivec3_add(ivec3 a, ivec3 b, ivec3 dest);
@@ -53,6 +65,82 @@ CGLM_EXPORT
void
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
int
glmc_ivec3_distance2(ivec3 a, ivec3 b);
@@ -61,6 +149,18 @@ CGLM_EXPORT
float
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
void
glmc_ivec3_maxv(ivec3 a, ivec3 b, ivec3 dest);

View File

@@ -53,6 +53,70 @@ CGLM_EXPORT
void
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
int
glmc_ivec4_distance2(ivec4 a, ivec4 b);

View File

@@ -13,21 +13,25 @@ extern "C" {
#include "../cglm.h"
CGLM_EXPORT
void
glmc_mat2_make(const float * __restrict src, mat2 dest);
CGLM_EXPORT
void
glmc_mat2_copy(mat2 mat, mat2 dest);
CGLM_EXPORT
void
glmc_mat2_identity(mat2 mat);
glmc_mat2_identity(mat2 m);
CGLM_EXPORT
void
glmc_mat2_identity_array(mat2 * __restrict mat, size_t count);
glmc_mat2_identity_array(mat2 * __restrict mats, size_t count);
CGLM_EXPORT
void
glmc_mat2_zero(mat2 mat);
glmc_mat2_zero(mat2 m);
CGLM_EXPORT
void
@@ -35,28 +39,20 @@ glmc_mat2_mul(mat2 m1, mat2 m2, mat2 dest);
CGLM_EXPORT
void
glmc_mat2_transpose_to(mat2 m, mat2 dest);
glmc_mat2_mulv(mat2 m, vec2 v, vec2 dest);
CGLM_EXPORT
void
glmc_mat2_transpose_to(mat2 mat, mat2 dest);
CGLM_EXPORT
void
glmc_mat2_transpose(mat2 m);
CGLM_EXPORT
void
glmc_mat2_mulv(mat2 m, vec2 v, vec2 dest);
CGLM_EXPORT
float
glmc_mat2_trace(mat2 m);
CGLM_EXPORT
void
glmc_mat2_scale(mat2 m, float s);
CGLM_EXPORT
float
glmc_mat2_det(mat2 mat);
CGLM_EXPORT
void
glmc_mat2_inv(mat2 mat, mat2 dest);
@@ -71,11 +67,15 @@ glmc_mat2_swap_row(mat2 mat, int row1, int row2);
CGLM_EXPORT
float
glmc_mat2_rmc(vec2 r, mat2 m, vec2 c);
glmc_mat2_trace(mat2 m);
CGLM_EXPORT
void
glmc_mat2_make(float * __restrict src, mat2 dest);
float
glmc_mat2_det(mat2 m);
CGLM_EXPORT
float
glmc_mat2_rmc(vec2 r, mat2 m, vec2 c);
#ifdef __cplusplus
}

View File

@@ -15,27 +15,27 @@ extern "C" {
CGLM_EXPORT
void
glmc_mat2x3_copy(mat2x3 mat, mat2x3 dest);
glmc_mat2x3_copy(mat2x3 src, mat2x3 dest);
CGLM_EXPORT
void
glmc_mat2x3_zero(mat2x3 mat);
glmc_mat2x3_zero(mat2x3 m);
CGLM_EXPORT
void
glmc_mat2x3_make(float * __restrict src, mat2x3 dest);
glmc_mat2x3_make(const float * __restrict src, mat2x3 dest);
CGLM_EXPORT
void
glmc_mat2x3_mul(mat2x3 m1, mat3x2 m2, mat2 dest);
glmc_mat2x3_mul(mat2x3 m1, mat3x2 m2, mat3 dest);
CGLM_EXPORT
void
glmc_mat2x3_mulv(mat2x3 m, vec3 v, vec2 dest);
glmc_mat2x3_mulv(mat2x3 m, vec2 v, vec3 dest);
CGLM_EXPORT
void
glmc_mat2x3_transpose(mat2x3 m, mat3x2 dest);
glmc_mat2x3_transpose(mat2x3 src, mat3x2 dest);
CGLM_EXPORT
void

View File

@@ -15,27 +15,27 @@ extern "C" {
CGLM_EXPORT
void
glmc_mat2x4_copy(mat2x4 mat, mat2x4 dest);
glmc_mat2x4_copy(mat2x4 src, mat2x4 dest);
CGLM_EXPORT
void
glmc_mat2x4_zero(mat2x4 mat);
glmc_mat2x4_zero(mat2x4 m);
CGLM_EXPORT
void
glmc_mat2x4_make(float * __restrict src, mat2x4 dest);
glmc_mat2x4_make(const float * __restrict src, mat2x4 dest);
CGLM_EXPORT
void
glmc_mat2x4_mul(mat2x4 m1, mat4x2 m2, mat2 dest);
glmc_mat2x4_mul(mat2x4 m1, mat4x2 m2, mat4 dest);
CGLM_EXPORT
void
glmc_mat2x4_mulv(mat2x4 m, vec4 v, vec2 dest);
glmc_mat2x4_mulv(mat2x4 m, vec2 v, vec4 dest);
CGLM_EXPORT
void
glmc_mat2x4_transpose(mat2x4 m, mat4x2 dest);
glmc_mat2x4_transpose(mat2x4 src, mat4x2 dest);
CGLM_EXPORT
void

View File

@@ -82,7 +82,11 @@ glmc_mat3_rmc(vec3 r, mat3 m, vec3 c);
CGLM_EXPORT
void
glmc_mat3_make(float * __restrict src, mat3 dest);
glmc_mat3_make(const float * __restrict src, mat3 dest);
CGLM_EXPORT
void
glmc_mat3_textrans(float sx, float sy, float rot, float tx, float ty, mat3 dest);
#ifdef __cplusplus
}

View File

@@ -15,27 +15,27 @@ extern "C" {
CGLM_EXPORT
void
glmc_mat3x2_copy(mat3x2 mat, mat3x2 dest);
glmc_mat3x2_copy(mat3x2 src, mat3x2 dest);
CGLM_EXPORT
void
glmc_mat3x2_zero(mat3x2 mat);
glmc_mat3x2_zero(mat3x2 m);
CGLM_EXPORT
void
glmc_mat3x2_make(float * __restrict src, mat3x2 dest);
glmc_mat3x2_make(const float * __restrict src, mat3x2 dest);
CGLM_EXPORT
void
glmc_mat3x2_mul(mat3x2 m1, mat2x3 m2, mat3 dest);
glmc_mat3x2_mul(mat3x2 m1, mat2x3 m2, mat2 dest);
CGLM_EXPORT
void
glmc_mat3x2_mulv(mat3x2 m, vec2 v, vec3 dest);
glmc_mat3x2_mulv(mat3x2 m, vec3 v, vec2 dest);
CGLM_EXPORT
void
glmc_mat3x2_transpose(mat3x2 m, mat2x3 dest);
glmc_mat3x2_transpose(mat3x2 src, mat2x3 dest);
CGLM_EXPORT
void

View File

@@ -15,27 +15,27 @@ extern "C" {
CGLM_EXPORT
void
glmc_mat3x4_copy(mat3x4 mat, mat3x4 dest);
glmc_mat3x4_copy(mat3x4 src, mat3x4 dest);
CGLM_EXPORT
void
glmc_mat3x4_zero(mat3x4 mat);
glmc_mat3x4_zero(mat3x4 m);
CGLM_EXPORT
void
glmc_mat3x4_make(float * __restrict src, mat3x4 dest);
glmc_mat3x4_make(const float * __restrict src, mat3x4 dest);
CGLM_EXPORT
void
glmc_mat3x4_mul(mat3x4 m1, mat4x3 m2, mat3 dest);
glmc_mat3x4_mul(mat3x4 m1, mat4x3 m2, mat4 dest);
CGLM_EXPORT
void
glmc_mat3x4_mulv(mat3x4 m, vec4 v, vec3 dest);
glmc_mat3x4_mulv(mat3x4 m, vec3 v, vec4 dest);
CGLM_EXPORT
void
glmc_mat3x4_transpose(mat3x4 m, mat4x3 dest);
glmc_mat3x4_transpose(mat3x4 src, mat4x3 dest);
CGLM_EXPORT
void

View File

@@ -123,7 +123,11 @@ glmc_mat4_rmc(vec4 r, mat4 m, vec4 c);
CGLM_EXPORT
void
glmc_mat4_make(float * __restrict src, mat4 dest);
glmc_mat4_make(const float * __restrict src, mat4 dest);
CGLM_EXPORT
void
glmc_mat4_textrans(float sx, float sy, float rot, float tx, float ty, mat4 dest);
#ifdef __cplusplus
}

View File

@@ -15,27 +15,27 @@ extern "C" {
CGLM_EXPORT
void
glmc_mat4x2_copy(mat4x2 mat, mat4x2 dest);
glmc_mat4x2_copy(mat4x2 src, mat4x2 dest);
CGLM_EXPORT
void
glmc_mat4x2_zero(mat4x2 mat);
glmc_mat4x2_zero(mat4x2 m);
CGLM_EXPORT
void
glmc_mat4x2_make(float * __restrict src, mat4x2 dest);
glmc_mat4x2_make(const float * __restrict src, mat4x2 dest);
CGLM_EXPORT
void
glmc_mat4x2_mul(mat4x2 m1, mat2x4 m2, mat4 dest);
glmc_mat4x2_mul(mat4x2 m1, mat2x4 m2, mat2 dest);
CGLM_EXPORT
void
glmc_mat4x2_mulv(mat4x2 m, vec2 v, vec4 dest);
glmc_mat4x2_mulv(mat4x2 m, vec4 v, vec2 dest);
CGLM_EXPORT
void
glmc_mat4x2_transpose(mat4x2 m, mat2x4 dest);
glmc_mat4x2_transpose(mat4x2 src, mat2x4 dest);
CGLM_EXPORT
void

View File

@@ -15,27 +15,27 @@ extern "C" {
CGLM_EXPORT
void
glmc_mat4x3_copy(mat4x3 mat, mat4x3 dest);
glmc_mat4x3_copy(mat4x3 src, mat4x3 dest);
CGLM_EXPORT
void
glmc_mat4x3_zero(mat4x3 mat);
glmc_mat4x3_zero(mat4x3 m);
CGLM_EXPORT
void
glmc_mat4x3_make(float * __restrict src, mat4x3 dest);
glmc_mat4x3_make(const float * __restrict src, mat4x3 dest);
CGLM_EXPORT
void
glmc_mat4x3_mul(mat4x3 m1, mat3x4 m2, mat4 dest);
glmc_mat4x3_mul(mat4x3 m1, mat3x4 m2, mat3 dest);
CGLM_EXPORT
void
glmc_mat4x3_mulv(mat4x3 m, vec3 v, vec4 dest);
glmc_mat4x3_mulv(mat4x3 m, vec4 v, vec3 dest);
CGLM_EXPORT
void
glmc_mat4x3_transpose(mat4x3 m, mat3x4 dest);
glmc_mat4x3_transpose(mat4x3 src, mat3x4 dest);
CGLM_EXPORT
void

31
include/cglm/call/noise.h Normal file
View File

@@ -0,0 +1,31 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#ifndef cglmc_noise_h
#define cglmc_noise_h
#ifdef __cplusplus
extern "C" {
#endif
#include "../cglm.h"
CGLM_EXPORT
float
glmc_perlin_vec4(vec4 point);
CGLM_EXPORT
float
glmc_perlin_vec3(vec3 point);
CGLM_EXPORT
float
glmc_perlin_vec2(vec2 point);
#ifdef __cplusplus
}
#endif
#endif /* cglmc_noise_h */

View File

@@ -37,5 +37,3 @@ glmc_pickmatrix(vec2 center, vec2 size, vec4 vp, mat4 dest);
}
#endif
#endif /* cglmc_project_h */

View File

@@ -133,6 +133,10 @@ CGLM_EXPORT
void
glmc_quat_slerp(versor q, versor r, float t, versor dest);
CGLM_EXPORT
void
glmc_quat_slerp_longest(versor q, versor r, float t, versor dest);
CGLM_EXPORT
void
glmc_quat_look(vec3 eye, versor ori, mat4 dest);
@@ -163,7 +167,7 @@ glmc_quat_rotate_atm(mat4 m, versor q, vec3 pivot);
CGLM_EXPORT
void
glmc_quat_make(float * __restrict src, versor dest);
glmc_quat_make(const float * __restrict src, versor dest);
#ifdef __cplusplus
}

View File

@@ -20,7 +20,19 @@ glmc_ray_triangle(vec3 origin,
vec3 v1,
vec3 v2,
float *d);
CGLM_EXPORT
bool
glmc_ray_sphere(vec3 origin,
vec3 dir,
vec4 s,
float * __restrict t1,
float * __restrict t2);
CGLM_EXPORT
void
glmc_ray_at(vec3 orig, vec3 dir, float t, vec3 point);
#ifdef __cplusplus
}
#endif

View File

@@ -17,6 +17,18 @@ CGLM_EXPORT
void
glmc_vec2(float * __restrict v, vec2 dest);
CGLM_EXPORT
void
glmc_vec2_fill(vec2 v, float val);
CGLM_EXPORT
bool
glmc_vec2_eq(vec2 v, float val);
CGLM_EXPORT
bool
glmc_vec2_eqv(vec2 a, vec2 b);
CGLM_EXPORT
void
glmc_vec2_copy(vec2 a, vec2 dest);
@@ -105,6 +117,30 @@ CGLM_EXPORT
void
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
void
glmc_vec2_negate_to(vec2 v, vec2 dest);
@@ -125,6 +161,10 @@ CGLM_EXPORT
void
glmc_vec2_rotate(vec2 v, float angle, vec2 dest);
CGLM_EXPORT
void
glmc_vec2_center(vec2 a, vec2 b, vec2 dest);
CGLM_EXPORT
float
glmc_vec2_distance2(vec2 a, vec2 b);
@@ -149,10 +189,38 @@ CGLM_EXPORT
void
glmc_vec2_abs(vec2 v, vec2 dest);
CGLM_EXPORT
void
glmc_vec2_fract(vec2 v, vec2 dest);
CGLM_EXPORT
void
glmc_vec2_floor(vec2 v, vec2 dest);
CGLM_EXPORT
void
glmc_vec2_mods(vec2 v, float s, vec2 dest);
CGLM_EXPORT
void
glmc_vec2_swizzle(vec2 v, int mask, vec2 dest);
CGLM_EXPORT
void
glmc_vec2_lerp(vec2 from, vec2 to, float t, vec2 dest);
CGLM_EXPORT
void
glmc_vec2_step(vec2 edge, vec2 x, vec2 dest);
CGLM_EXPORT
void
glmc_vec2_steps(float edge, vec2 x, vec2 dest);
CGLM_EXPORT
void
glmc_vec2_stepr(vec2 edge, float x, vec2 dest);
CGLM_EXPORT
void
glmc_vec2_complex_mul(vec2 a, vec2 b, vec2 dest);
@@ -167,7 +235,19 @@ glmc_vec2_complex_conjugate(vec2 a, vec2 dest);
CGLM_EXPORT
void
glmc_vec2_make(float * __restrict src, vec2 dest);
glmc_vec2_make(const float * __restrict src, vec2 dest);
CGLM_EXPORT
void
glmc_vec2_reflect(vec2 v, vec2 n, vec2 dest);
CGLM_EXPORT
bool
glmc_vec2_refract(vec2 v, vec2 n, float eta, vec2 dest);
CGLM_EXPORT
void
glmc_vec2_swap(vec2 a, vec2 b);
#ifdef __cplusplus
}

View File

@@ -19,6 +19,7 @@ extern "C" {
#define glmc_vec3_flipsign_to(v, dest) glmc_vec3_negate_to(v, dest)
#define glmc_vec3_inv(v) glmc_vec3_negate(v)
#define glmc_vec3_inv_to(v, dest) glmc_vec3_negate_to(v, dest)
#define glmc_vec3_step_uni(edge, x, dest) glmc_vec3_steps(edge, x, dest);
CGLM_EXPORT
void
@@ -55,7 +56,7 @@ glmc_vec3_norm(vec3 v);
CGLM_EXPORT
float
glmc_vec3_norm2(vec3 v);
CGLM_EXPORT
float
glmc_vec3_norm_one(vec3 v);
@@ -132,6 +133,30 @@ CGLM_EXPORT
void
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
void
glmc_vec3_negate(vec3 v);
@@ -187,15 +212,15 @@ glmc_vec3_clamp(vec3 v, float minVal, float maxVal);
CGLM_EXPORT
void
glmc_vec3_ortho(vec3 v, vec3 dest);
CGLM_EXPORT
void
glmc_vec3_lerp(vec3 from, vec3 to, float t, vec3 dest);
CGLM_EXPORT
void
glmc_vec3_lerpc(vec3 from, vec3 to, float t, vec3 dest);
CGLM_INLINE
void
glmc_vec3_mix(vec3 from, vec3 to, float t, vec3 dest) {
@@ -207,31 +232,31 @@ void
glmc_vec3_mixc(vec3 from, vec3 to, float t, vec3 dest) {
glmc_vec3_lerpc(from, to, t, dest);
}
CGLM_EXPORT
void
glmc_vec3_step_uni(float edge, vec3 x, vec3 dest);
CGLM_EXPORT
void
glmc_vec3_step(vec3 edge, vec3 x, vec3 dest);
CGLM_EXPORT
void
glmc_vec3_smoothstep_uni(float edge0, float edge1, vec3 x, vec3 dest);
CGLM_EXPORT
void
glmc_vec3_smoothstep(vec3 edge0, vec3 edge1, vec3 x, vec3 dest);
CGLM_EXPORT
void
glmc_vec3_smoothinterp(vec3 from, vec3 to, float t, vec3 dest);
CGLM_EXPORT
void
glmc_vec3_smoothinterpc(vec3 from, vec3 to, float t, vec3 dest);
CGLM_EXPORT
void
glmc_vec3_swizzle(vec3 v, int mask, vec3 dest);
/* ext */
CGLM_EXPORT
@@ -241,7 +266,7 @@ glmc_vec3_mulv(vec3 a, vec3 b, vec3 d);
CGLM_EXPORT
void
glmc_vec3_broadcast(float val, vec3 d);
CGLM_EXPORT
void
glmc_vec3_fill(vec3 v, float val);
@@ -289,15 +314,31 @@ glmc_vec3_isvalid(vec3 v);
CGLM_EXPORT
void
glmc_vec3_sign(vec3 v, vec3 dest);
CGLM_EXPORT
void
glmc_vec3_abs(vec3 v, vec3 dest);
CGLM_EXPORT
void
glmc_vec3_fract(vec3 v, vec3 dest);
CGLM_EXPORT
void
glmc_vec3_floor(vec3 v, vec3 dest);
CGLM_EXPORT
void
glmc_vec3_mods(vec3 v, float s, vec3 dest);
CGLM_EXPORT
void
glmc_vec3_steps(float edge, vec3 x, vec3 dest);
CGLM_EXPORT
void
glmc_vec3_stepr(vec3 edge, float x, vec3 dest);
CGLM_EXPORT
float
glmc_vec3_hadd(vec3 v);
@@ -308,7 +349,23 @@ glmc_vec3_sqrt(vec3 v, vec3 dest);
CGLM_EXPORT
void
glmc_vec3_make(float * __restrict src, vec3 dest);
glmc_vec3_make(const float * __restrict src, vec3 dest);
CGLM_EXPORT
void
glmc_vec3_faceforward(vec3 n, vec3 v, vec3 nref, vec3 dest);
CGLM_EXPORT
void
glmc_vec3_reflect(vec3 v, vec3 n, vec3 dest);
CGLM_EXPORT
bool
glmc_vec3_refract(vec3 v, vec3 n, float eta, vec3 dest);
CGLM_EXPORT
void
glmc_vec3_swap(vec3 a, vec3 b);
#ifdef __cplusplus
}

View File

@@ -20,6 +20,7 @@ extern "C" {
#define glmc_vec4_flipsign_to(v, dest) glmc_vec4_negate_to(v, dest)
#define glmc_vec4_inv(v) glmc_vec4_negate(v)
#define glmc_vec4_inv_to(v, dest) glmc_vec4_negate_to(v, dest)
#define glmc_vec4_step_uni(edge, x, dest) glmc_vec4_steps(edge, x, dest)
CGLM_EXPORT
void
@@ -56,7 +57,7 @@ glmc_vec4_norm(vec4 v);
CGLM_EXPORT
float
glmc_vec4_norm2(vec4 v);
CGLM_EXPORT
float
glmc_vec4_norm_one(vec4 v);
@@ -133,6 +134,30 @@ CGLM_EXPORT
void
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
void
glmc_vec4_negate(vec4 v);
@@ -140,11 +165,11 @@ glmc_vec4_negate(vec4 v);
CGLM_EXPORT
void
glmc_vec4_negate_to(vec4 v, vec4 dest);
CGLM_EXPORT
float
glmc_vec4_distance(vec4 a, vec4 b);
CGLM_EXPORT
float
glmc_vec4_distance2(vec4 a, vec4 b);
@@ -160,15 +185,15 @@ glmc_vec4_minv(vec4 a, vec4 b, vec4 dest);
CGLM_EXPORT
void
glmc_vec4_clamp(vec4 v, float minVal, float maxVal);
CGLM_EXPORT
void
glmc_vec4_lerp(vec4 from, vec4 to, float t, vec4 dest);
CGLM_EXPORT
void
glmc_vec4_lerpc(vec4 from, vec4 to, float t, vec4 dest);
CGLM_INLINE
void
glmc_vec4_mix(vec4 from, vec4 to, float t, vec4 dest) {
@@ -180,27 +205,23 @@ void
glmc_vec4_mixc(vec4 from, vec4 to, float t, vec4 dest) {
glmc_vec4_lerpc(from, to, t, dest);
}
CGLM_EXPORT
void
glmc_vec4_step_uni(float edge, vec4 x, vec4 dest);
CGLM_EXPORT
void
glmc_vec4_step(vec4 edge, vec4 x, vec4 dest);
CGLM_EXPORT
void
glmc_vec4_smoothstep_uni(float edge0, float edge1, vec4 x, vec4 dest);
CGLM_EXPORT
void
glmc_vec4_smoothstep(vec4 edge0, vec4 edge1, vec4 x, vec4 dest);
CGLM_EXPORT
void
glmc_vec4_smoothinterp(vec4 from, vec4 to, float t, vec4 dest);
CGLM_EXPORT
void
glmc_vec4_smoothinterpc(vec4 from, vec4 to, float t, vec4 dest);
@@ -209,6 +230,10 @@ CGLM_EXPORT
void
glmc_vec4_cubic(float s, vec4 dest);
CGLM_EXPORT
void
glmc_vec4_swizzle(vec4 v, int mask, vec4 dest);
/* ext */
CGLM_EXPORT
@@ -218,7 +243,7 @@ glmc_vec4_mulv(vec4 a, vec4 b, vec4 d);
CGLM_EXPORT
void
glmc_vec4_broadcast(float val, vec4 d);
CGLM_EXPORT
void
glmc_vec4_fill(vec4 v, float val);
@@ -266,15 +291,31 @@ glmc_vec4_isvalid(vec4 v);
CGLM_EXPORT
void
glmc_vec4_sign(vec4 v, vec4 dest);
CGLM_EXPORT
void
glmc_vec4_abs(vec4 v, vec4 dest);
CGLM_EXPORT
void
glmc_vec4_fract(vec4 v, vec4 dest);
CGLM_EXPORT
void
glmc_vec4_floor(vec4 v, vec4 dest);
CGLM_EXPORT
void
glmc_vec4_mods(vec4 v, float s, vec4 dest);
CGLM_EXPORT
void
glmc_vec4_steps(float edge, vec4 x, vec4 dest);
CGLM_EXPORT
void
glmc_vec4_stepr(vec4 edge, float x, vec4 dest);
CGLM_EXPORT
float
glmc_vec4_hadd(vec4 v);
@@ -285,10 +326,21 @@ glmc_vec4_sqrt(vec4 v, vec4 dest);
CGLM_EXPORT
void
glmc_vec4_make(float * __restrict src, vec4 dest);
glmc_vec4_make(const float * __restrict src, vec4 dest);
CGLM_EXPORT
void
glmc_vec4_reflect(vec4 v, vec4 n, vec4 dest);
CGLM_EXPORT
bool
glmc_vec4_refract(vec4 v, vec4 n, float eta, vec4 dest);
CGLM_EXPORT
void
glmc_vec4_swap(vec4 a, vec4 b);
#ifdef __cplusplus
}
#endif
#endif /* cglmc_vec4_h */

View File

@@ -25,7 +25,12 @@
float nearZ,
float farZ,
mat4 dest)
CGLM_INLINE void glm_perspective_infinite(float fovy,
float aspect,
float nearZ,
mat4 dest)
CGLM_INLINE void glm_perspective_default(float aspect, mat4 dest)
CGLM_INLINE void glm_perspective_default_infinite(float aspect, mat4 dest)
CGLM_INLINE void glm_perspective_resize(float aspect, mat4 proj)
CGLM_INLINE void glm_lookat(vec3 eye, vec3 center, vec3 up, mat4 dest)
CGLM_INLINE void glm_look(vec3 eye, vec3 dir, vec3 up, mat4 dest)
@@ -87,7 +92,7 @@
#endif
/*!
* @brief set up perspective peprojection matrix
* @brief set up perspective projection matrix
*
* @param[in] left viewport.left
* @param[in] right viewport.right
@@ -274,6 +279,28 @@ glm_perspective(float fovy, float aspect, float nearZ, float farZ, mat4 dest) {
#endif
}
/*!
* @brief set up perspective projection matrix with infinite far plane
*
* @param[in] fovy field of view angle
* @param[in] aspect aspect ratio ( width / height )
* @param[in] nearZ near clipping plane
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_perspective_infinite(float fovy, float aspect, float nearZ, mat4 dest) {
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
glm_perspective_infinite_lh_zo(fovy, aspect, nearZ, dest);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
glm_perspective_infinite_lh_no(fovy, aspect, nearZ, dest);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
glm_perspective_infinite_rh_zo(fovy, aspect, nearZ, dest);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
glm_perspective_infinite_rh_no(fovy, aspect, nearZ, dest);
#endif
}
/*!
* @brief extend perspective projection matrix's far distance
*
@@ -317,6 +344,27 @@ glm_perspective_default(float aspect, mat4 dest) {
#endif
}
/*!
* @brief set up infinite perspective projection matrix with default near
* and angle values
*
* @param[in] aspect aspect ratio ( width / height )
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_perspective_default_infinite(float aspect, mat4 dest) {
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
glm_perspective_default_infinite_lh_zo(aspect, dest);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
glm_perspective_default_infinite_lh_no(aspect, dest);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
glm_perspective_default_infinite_rh_zo(aspect, dest);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
glm_perspective_default_infinite_rh_no(aspect, dest);
#endif
}
/*!
* @brief resize perspective matrix by aspect ratio ( width / height )
* this makes very easy to resize proj matrix when window /viewport
@@ -474,7 +522,7 @@ glm_persp_decomp_x(mat4 proj,
/*!
* @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[out] top top

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