mirror of
https://github.com/recp/cglm.git
synced 2026-02-17 03:39:05 +00:00
Compare commits
515 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2de1133012 | ||
|
|
12dc054e49 | ||
|
|
ebba4eea8e | ||
|
|
aa2fa89e6c | ||
|
|
7b0eee497e | ||
|
|
04008d9c3f | ||
|
|
11b1588105 | ||
|
|
7c81482248 | ||
|
|
f3f29bd383 | ||
|
|
0d0d22f96c | ||
|
|
7df5aa2e26 | ||
|
|
7cc4c37afb | ||
|
|
abe29a788a | ||
|
|
c5655bbd2e | ||
|
|
47e0045015 | ||
|
|
8f09cc8583 | ||
|
|
d6a0ac320b | ||
|
|
616d38c13a | ||
|
|
9e12908556 | ||
|
|
405cda6ee9 | ||
|
|
1b0322e51c | ||
|
|
4a308dcd9e | ||
|
|
fec396950b | ||
|
|
981af0565e | ||
|
|
1d215ef5f3 | ||
|
|
2b7cfde64f | ||
|
|
c783c42101 | ||
|
|
bddcfedead | ||
|
|
34e7438271 | ||
|
|
485ff6bc46 | ||
|
|
4ab9ab4772 | ||
|
|
a5ff477fc8 | ||
|
|
254570d006 | ||
|
|
681f20d540 | ||
|
|
fd87f6e2c3 | ||
|
|
2c12c6dce5 | ||
|
|
5619527fd3 | ||
|
|
8b1c3c3fc4 | ||
|
|
ec852c7682 | ||
|
|
5433c9ed6c | ||
|
|
2a2d51624b | ||
|
|
5fa908602f | ||
|
|
9da74f9654 | ||
|
|
dddb077b13 | ||
|
|
6107287c9a | ||
|
|
7dccbef6e3 | ||
|
|
d920a62be2 | ||
|
|
73f32b9ef7 | ||
|
|
2e5257bcc1 | ||
|
|
65b0b461ab | ||
|
|
e34601f578 | ||
|
|
fa01a3077b | ||
|
|
54f805a62d | ||
|
|
a05b282fad | ||
|
|
66f6bbde6c | ||
|
|
4054d9a190 | ||
|
|
c1112f0063 | ||
|
|
b62e922f32 | ||
|
|
3c53bed709 | ||
|
|
a2b6d71558 | ||
|
|
fdfceb9f5b | ||
|
|
d273daecfe | ||
|
|
92b75a1345 | ||
|
|
640795a771 | ||
|
|
cad265ebcd | ||
|
|
387c33fb4d | ||
|
|
77585de397 | ||
|
|
a9b06e4b35 | ||
|
|
7976ac78f2 | ||
|
|
208f8073ad | ||
|
|
009fb966a6 | ||
|
|
09fd9f86b9 | ||
|
|
2ff4ae0b4c | ||
|
|
aa0a195e98 | ||
|
|
87092e6849 | ||
|
|
89ced4166a | ||
|
|
6080099434 | ||
|
|
f3735c9036 | ||
|
|
2242e9a5e1 | ||
|
|
a12364d486 | ||
|
|
b133c2e3e3 | ||
|
|
0127d30fa8 | ||
|
|
9b13b2f872 | ||
|
|
40d903c2bc | ||
|
|
06016220c0 | ||
|
|
bb751d32ca | ||
|
|
6dc37f6cc9 | ||
|
|
5ff42799b2 | ||
|
|
2326e627b5 | ||
|
|
c18fe8098f | ||
|
|
a9ed8470b4 | ||
|
|
332087da61 | ||
|
|
56c43d7a74 | ||
|
|
649f390662 | ||
|
|
0818bbdf51 | ||
|
|
edd1517f85 | ||
|
|
d0c2e8233c | ||
|
|
87837aa074 | ||
|
|
62ab6c56c0 | ||
|
|
a2985aa444 | ||
|
|
7274cee153 | ||
|
|
79c44fdbfa | ||
|
|
c32e986497 | ||
|
|
b953fcf1bd | ||
|
|
c0a4c245f0 | ||
|
|
acc0885e52 | ||
|
|
f49e8f9991 | ||
|
|
d2e5a3cd5b | ||
|
|
a1485a14f6 | ||
|
|
271e3b15d6 | ||
|
|
74cf89a82f | ||
|
|
8698082411 | ||
|
|
799de548f4 | ||
|
|
671dae3e22 | ||
|
|
7e142132bf | ||
|
|
0ccd58da01 | ||
|
|
4211c230cc | ||
|
|
269bdb3dbd | ||
|
|
b032b803ca | ||
|
|
26a638e11d | ||
|
|
099522ada3 | ||
|
|
4903dd62ea | ||
|
|
95161f7776 | ||
|
|
f0942c13a1 | ||
|
|
8eddeb77d0 | ||
|
|
cbed29820b | ||
|
|
3ec6bad5b3 | ||
|
|
fefc3dc32d | ||
|
|
203d40208c | ||
|
|
c45445c613 | ||
|
|
73c6766806 | ||
|
|
65dff25ed5 | ||
|
|
c2584c0fe6 | ||
|
|
bd951f96be | ||
|
|
1200372ced | ||
|
|
75a5ca153d | ||
|
|
5a9593d9bc | ||
|
|
edf46aaf2b | ||
|
|
e2ba795603 | ||
|
|
5e6b566d6a | ||
|
|
c973768495 | ||
|
|
6d8e2cc92d | ||
|
|
010dda6a77 | ||
|
|
345c7307ef | ||
|
|
f485c928b1 | ||
|
|
e895fe884e | ||
|
|
18fe47d0c7 | ||
|
|
a84ebc4aaa | ||
|
|
5c35c4ef5d | ||
|
|
f79674f66a | ||
|
|
e40373a1fa | ||
|
|
47807b7955 | ||
|
|
38cb693834 | ||
|
|
7bcd7609eb | ||
|
|
90eb164a43 | ||
|
|
78b2e2d2cc | ||
|
|
e60e7b5750 | ||
|
|
c1331a1dd4 | ||
|
|
339adab783 | ||
|
|
7bf38a3062 | ||
|
|
99076be6bb | ||
|
|
eb332acd7e | ||
|
|
c67f7a14a1 | ||
|
|
83f6db1bf8 | ||
|
|
e493149a0a | ||
|
|
38019f0913 | ||
|
|
bc6b751429 | ||
|
|
be68d57499 | ||
|
|
1fb5f89eaa | ||
|
|
6470a91265 | ||
|
|
d4235b2431 | ||
|
|
0ef028244a | ||
|
|
a8543bc813 | ||
|
|
cf3888d734 | ||
|
|
b8e978862e | ||
|
|
dfba2072f7 | ||
|
|
2bf576c2cd | ||
|
|
3abf47f175 | ||
|
|
2fc51c67a3 | ||
|
|
34753546f2 | ||
|
|
1711db4fef | ||
|
|
373b8d216a | ||
|
|
7f9487fd62 | ||
|
|
686deb8eb1 | ||
|
|
a392ac3012 | ||
|
|
fabc655919 | ||
|
|
7eada03909 | ||
|
|
ad4a763d47 | ||
|
|
1f9765c5e5 | ||
|
|
b3a464bf89 | ||
|
|
69b5584f11 | ||
|
|
00523f0b89 | ||
|
|
31f313caff | ||
|
|
010b88ee7a | ||
|
|
702da626f1 | ||
|
|
8e008511f4 | ||
|
|
eb0d47cfa1 | ||
|
|
638b9f6dbe | ||
|
|
ab20ebc28c | ||
|
|
701a95583a | ||
|
|
ad9370537c | ||
|
|
43ae3b332a | ||
|
|
8a068c3291 | ||
|
|
4a7c153d2d | ||
|
|
7b0f62f1eb | ||
|
|
0c8dc070d5 | ||
|
|
0822d46cd9 | ||
|
|
3fca734c30 | ||
|
|
5995269195 | ||
|
|
6b32b5dc35 | ||
|
|
a1f7afe055 | ||
|
|
81ae182972 | ||
|
|
de85a4eb2b | ||
|
|
8ac1347f8a | ||
|
|
e7a0906bc2 | ||
|
|
6aa8df8e9b | ||
|
|
2278eba93c | ||
|
|
5ee9bb88df | ||
|
|
349dc274f4 | ||
|
|
b9f9548b06 | ||
|
|
c630293c7d | ||
|
|
406d09e085 | ||
|
|
65de029acb | ||
|
|
f8784ffe8a | ||
|
|
cf8dc82783 | ||
|
|
9af0ebd142 | ||
|
|
82a195f26a | ||
|
|
6abe3f05ab | ||
|
|
f53fd45026 | ||
|
|
c67158ac59 | ||
|
|
af7f8a5436 | ||
|
|
c3b5bb869a | ||
|
|
d6c34d3330 | ||
|
|
13a742f48c | ||
|
|
0330be853c | ||
|
|
5cb800bf29 | ||
|
|
1d19948f30 | ||
|
|
d89c01b39f | ||
|
|
b9aa14d25e | ||
|
|
8ad273475f | ||
|
|
c8211b3a62 | ||
|
|
11dae5126b | ||
|
|
390a5035a8 | ||
|
|
267348af03 | ||
|
|
f9abf2a7df | ||
|
|
f0ffef7820 | ||
|
|
4b9b7aeb20 | ||
|
|
1a74361dfb | ||
|
|
c83f25343f | ||
|
|
f3ea5b4f3e | ||
|
|
9987e1374b | ||
|
|
464b2178ce | ||
|
|
c253769fcd | ||
|
|
b893c79086 | ||
|
|
2336256808 | ||
|
|
52df54e306 | ||
|
|
381e66349a | ||
|
|
7cdeada701 | ||
|
|
841257a208 | ||
|
|
212cf3b22d | ||
|
|
ca9b8ceac3 | ||
|
|
5b0e161502 | ||
|
|
fb23d1998e | ||
|
|
b2084fbacf | ||
|
|
2ea9308361 | ||
|
|
56cbacd9f6 | ||
|
|
1700187f65 | ||
|
|
36024367bc | ||
|
|
dcf5b5c1c4 | ||
|
|
ce09e543ef | ||
|
|
f2073b2277 | ||
|
|
7c10840a85 | ||
|
|
37c2650b0a | ||
|
|
3a48e4cd84 | ||
|
|
378e26140e | ||
|
|
7b25cbb9cb | ||
|
|
bffe103c37 | ||
|
|
51ffe09589 | ||
|
|
d7b37ba245 | ||
|
|
d0671b3e7a | ||
|
|
e98311259c | ||
|
|
37cf6b3206 | ||
|
|
a062f002a0 | ||
|
|
9c57d4b247 | ||
|
|
9fe5efb410 | ||
|
|
495afb8a3d | ||
|
|
ba694f4aec | ||
|
|
8ac767fd2c | ||
|
|
e5fd735e62 | ||
|
|
7797ee7b06 | ||
|
|
78f38db480 | ||
|
|
79087a9813 | ||
|
|
a1283282ef | ||
|
|
0377b99f80 | ||
|
|
971d753392 | ||
|
|
033d0b0fed | ||
|
|
39dc61af54 | ||
|
|
f4f9d85caa | ||
|
|
92f196965e | ||
|
|
fbcbccbf01 | ||
|
|
cf41151534 | ||
|
|
3af861b61e | ||
|
|
0ed88cfda8 | ||
|
|
551ed1bd20 | ||
|
|
a328317c70 | ||
|
|
5aa047efdf | ||
|
|
32e5784564 | ||
|
|
80c2b3712d | ||
|
|
176cc28510 | ||
|
|
712cbee580 | ||
|
|
981fd5ee44 | ||
|
|
092da3e189 | ||
|
|
9ab9e95ce5 | ||
|
|
b46a4ccee5 | ||
|
|
5da864f345 | ||
|
|
27cc9c3351 | ||
|
|
3640e402da | ||
|
|
d86f5df776 | ||
|
|
cb54a8b8c5 | ||
|
|
8cb6fa792c | ||
|
|
6af1f5af04 | ||
|
|
62f4685f86 | ||
|
|
03fda193a5 | ||
|
|
cfaf01afaa | ||
|
|
a450ab2d9c | ||
|
|
1d804781de | ||
|
|
144624962a | ||
|
|
4639f3184a | ||
|
|
43b36f1dc1 | ||
|
|
ef89cd7236 | ||
|
|
d03d4b8df5 | ||
|
|
e294fc744b | ||
|
|
90a7aba1bd | ||
|
|
02fdea941c | ||
|
|
c87499d234 | ||
|
|
ec553106f8 | ||
|
|
5bf5ceeb40 | ||
|
|
cb1d0ef6b5 | ||
|
|
cc75dc7f34 | ||
|
|
a651827012 | ||
|
|
caba5b3c7c | ||
|
|
b231645131 | ||
|
|
99cff9e74e | ||
|
|
bbb52f352c | ||
|
|
a4c7c5e1ba | ||
|
|
44f36559c3 | ||
|
|
4a9eb8d630 | ||
|
|
2827fbfa79 | ||
|
|
ad823d9681 | ||
|
|
24de86c1a4 | ||
|
|
2025b35757 | ||
|
|
1fdd459733 | ||
|
|
f0be6eb448 | ||
|
|
047ed259ae | ||
|
|
3797c55154 | ||
|
|
817da18f3a | ||
|
|
099239e3f5 | ||
|
|
9a73d969a7 | ||
|
|
290f54bad4 | ||
|
|
b9de553f23 | ||
|
|
2b1126a2fc | ||
|
|
b22170794a | ||
|
|
7485674106 | ||
|
|
f7b45776e9 | ||
|
|
12a7298474 | ||
|
|
4e1872c3ac | ||
|
|
5a66515631 | ||
|
|
56339b9caa | ||
|
|
8affe9878f | ||
|
|
f26601bfa7 | ||
|
|
d322a0ba8f | ||
|
|
ba2031d977 | ||
|
|
fd3b0634d2 | ||
|
|
1d1bf8e91a | ||
|
|
f108bb4c71 | ||
|
|
2adb4c5593 | ||
|
|
6fa5173cfd | ||
|
|
bc1969ab75 | ||
|
|
3ff902de9c | ||
|
|
892a7c7dce | ||
|
|
f04078dc33 | ||
|
|
63e60f46f3 | ||
|
|
f28260e20b | ||
|
|
d232ab7865 | ||
|
|
e3b52100e3 | ||
|
|
bb8ff25752 | ||
|
|
98244da67f | ||
|
|
14f06a262f | ||
|
|
392565f920 | ||
|
|
120ae9ae99 | ||
|
|
a5f1ed32af | ||
|
|
010e887946 | ||
|
|
6e501ef1f6 | ||
|
|
6ed275734b | ||
|
|
85ca81ce79 | ||
|
|
e909c8268d | ||
|
|
73e6b65da0 | ||
|
|
ecbe36df6b | ||
|
|
d85b5234a9 | ||
|
|
5b80e0e3c2 | ||
|
|
461a4009ba | ||
|
|
8f2f2c5572 | ||
|
|
1aa54dc110 | ||
|
|
1de8aeb940 | ||
|
|
c25469829a | ||
|
|
81a74ba225 | ||
|
|
6c0c5167b0 | ||
|
|
0729fd40a4 | ||
|
|
4c5451994f | ||
|
|
674e05213a | ||
|
|
f848e4451a | ||
|
|
73226bd2fd | ||
|
|
8fa21a1837 | ||
|
|
ee1937f28d | ||
|
|
b4efcefe7f | ||
|
|
0d2e5a996a | ||
|
|
2b1eece9ac | ||
|
|
c8b8f4f6f0 | ||
|
|
1a34ffcf4b | ||
|
|
af088a1059 | ||
|
|
18f06743ed | ||
|
|
60cfc87009 | ||
|
|
4e5879497e | ||
|
|
7848dda1dd | ||
|
|
1e121a4855 | ||
|
|
0f223db7d3 | ||
|
|
a4e2c39c1d | ||
|
|
c22231f296 | ||
|
|
730cb1e9f7 | ||
|
|
b0e48a56ca | ||
|
|
11a6e4471e | ||
|
|
60cb4beb0a | ||
|
|
32ddf49756 | ||
|
|
807d5589b4 | ||
|
|
59b9e54879 | ||
|
|
fc7f958167 | ||
|
|
31bb303c55 | ||
|
|
be6aa9a89a | ||
|
|
f65f1d491b | ||
|
|
f0c2a2984e | ||
|
|
b117f3bf80 | ||
|
|
07e60bd098 | ||
|
|
e3d3cd8ab8 | ||
|
|
d17c99215d | ||
|
|
dc6eb492c1 | ||
|
|
7219b02d23 | ||
|
|
21834b4ffb | ||
|
|
2ef9c23a6c | ||
|
|
92605f845a | ||
|
|
b23d65bef5 | ||
|
|
2f632c6311 | ||
|
|
b47d148b81 | ||
|
|
a5bc2f710e | ||
|
|
6d6954b208 | ||
|
|
4e08b7e335 | ||
|
|
aee381d869 | ||
|
|
b4bf8f3537 | ||
|
|
0b8c63a90e | ||
|
|
ef6134263e | ||
|
|
9af61d2101 | ||
|
|
463099350a | ||
|
|
89f64f0794 | ||
|
|
d794f17e51 | ||
|
|
a7cdbcec2b | ||
|
|
20a2312351 | ||
|
|
08479f38ce | ||
|
|
dadae4b773 | ||
|
|
20360f2296 | ||
|
|
aa2b0f2631 | ||
|
|
280ac72fd8 | ||
|
|
7405d5e1d0 | ||
|
|
eefafefbae | ||
|
|
b9021978cb | ||
|
|
3fd12032e6 | ||
|
|
59ee8c1fd2 | ||
|
|
b00f2b9ccc | ||
|
|
d3c50147cb | ||
|
|
98da3daf82 | ||
|
|
2e1790ccf9 | ||
|
|
cc5f533fc9 | ||
|
|
2d63d7e0cd | ||
|
|
3738499927 | ||
|
|
1d527dc2f0 | ||
|
|
43c4d05d4a | ||
|
|
c5f5032fcc | ||
|
|
5d605ce372 | ||
|
|
c216c0cb7e | ||
|
|
eb8e0df6df | ||
|
|
1775bf7458 | ||
|
|
3adeac06f8 | ||
|
|
669777eb37 | ||
|
|
02f6c67393 | ||
|
|
564324f5d2 | ||
|
|
93e6c3c102 | ||
|
|
857265b892 | ||
|
|
fc14cedf89 | ||
|
|
7a80178357 | ||
|
|
720b617ee0 | ||
|
|
3dc9070909 | ||
|
|
6b2b4b4f12 | ||
|
|
c8fc460ba1 | ||
|
|
5b3aabc103 | ||
|
|
af812e86eb | ||
|
|
059bdfdd4b | ||
|
|
ef0653640f | ||
|
|
e5d61b3433 | ||
|
|
73c073cf32 | ||
|
|
1362bef50f | ||
|
|
7d783eeace | ||
|
|
e12e79b1a5 | ||
|
|
6cd3d52dc5 | ||
|
|
fb2cac9816 | ||
|
|
4e63325f55 | ||
|
|
96c3e604ff | ||
|
|
090f940f50 |
1
.gitattributes
vendored
Normal file
1
.gitattributes
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
*.h linguist-language=C
|
||||||
8
.github/FUNDING.yml
vendored
Normal file
8
.github/FUNDING.yml
vendored
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
# These are supported funding model platforms
|
||||||
|
|
||||||
|
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
|
||||||
|
patreon: # Replace with a single Patreon username
|
||||||
|
open_collective: cglm
|
||||||
|
ko_fi: # Replace with a single Ko-fi username
|
||||||
|
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
|
||||||
|
custom: # Replace with a single custom sponsorship URL
|
||||||
9
.gitignore
vendored
9
.gitignore
vendored
@@ -51,7 +51,6 @@ cscope.*
|
|||||||
test/*.trs
|
test/*.trs
|
||||||
test/test_*
|
test/test_*
|
||||||
*.log
|
*.log
|
||||||
test-*
|
|
||||||
test/.libs/*
|
test/.libs/*
|
||||||
test/tests
|
test/tests
|
||||||
cglm_arm/*
|
cglm_arm/*
|
||||||
@@ -69,3 +68,11 @@ win/cglm_test_*
|
|||||||
win/x64
|
win/x64
|
||||||
win/x85
|
win/x85
|
||||||
win/Debug
|
win/Debug
|
||||||
|
cglm-test-ios*
|
||||||
|
/cglm.pc
|
||||||
|
test-driver
|
||||||
|
Default-568h@2x.png
|
||||||
|
build/
|
||||||
|
conftest.dir/*
|
||||||
|
confdefs.h
|
||||||
|
*.xcuserdatad
|
||||||
|
|||||||
3
.gitmodules
vendored
3
.gitmodules
vendored
@@ -1,3 +0,0 @@
|
|||||||
[submodule "test/lib/cmocka"]
|
|
||||||
path = test/lib/cmocka
|
|
||||||
url = git://git.cryptomilk.org/projects/cmocka.git
|
|
||||||
|
|||||||
15
.travis.yml
15
.travis.yml
@@ -4,6 +4,12 @@ os:
|
|||||||
- linux
|
- linux
|
||||||
- osx
|
- osx
|
||||||
|
|
||||||
|
arch:
|
||||||
|
- amd64
|
||||||
|
- ppc64le
|
||||||
|
- s390x
|
||||||
|
- arm64
|
||||||
|
|
||||||
sudo: required
|
sudo: required
|
||||||
dist: trusty
|
dist: trusty
|
||||||
|
|
||||||
@@ -37,10 +43,9 @@ branches:
|
|||||||
- master
|
- master
|
||||||
|
|
||||||
script:
|
script:
|
||||||
- sh ./build-deps.sh
|
|
||||||
- sh ./autogen.sh
|
- sh ./autogen.sh
|
||||||
- if [[ "$CC" == "gcc" && "$CODE_COVERAGE" == "ON" ]]; then
|
- if [[ "$CC" == "gcc" && "$CODE_COVERAGE" == "ON" ]]; then
|
||||||
./configure CFLAGS="-ftest-coverage -fprofile-arcs";
|
./configure CFLAGS="-ftest-coverage -fprofile-arcs -coverage";
|
||||||
else
|
else
|
||||||
./configure;
|
./configure;
|
||||||
fi
|
fi
|
||||||
@@ -55,5 +60,9 @@ after_success:
|
|||||||
--exclude lib
|
--exclude lib
|
||||||
--exclude test
|
--exclude test
|
||||||
--gcov-options '\-lp'
|
--gcov-options '\-lp'
|
||||||
--verbose;
|
--verbose &&
|
||||||
|
bash <(curl -s https://codecov.io/bash);
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# after_failure:
|
||||||
|
# - cat ./test-suite.log
|
||||||
|
|||||||
4
.vscode/settings.json
vendored
Normal file
4
.vscode/settings.json
vendored
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"C_Cpp.default.configurationProvider": "vector-of-bool.cmake-tools",
|
||||||
|
"restructuredtext.confPath": "${workspaceFolder}/docs/source"
|
||||||
|
}
|
||||||
128
CMakeLists.txt
Normal file
128
CMakeLists.txt
Normal file
@@ -0,0 +1,128 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.8.2)
|
||||||
|
project(cglm VERSION 0.8.1 LANGUAGES C)
|
||||||
|
|
||||||
|
set(CMAKE_C_STANDARD 11)
|
||||||
|
set(CMAKE_C_STANDARD_REQUIRED YES)
|
||||||
|
set(DEFAULT_BUILD_TYPE "Release")
|
||||||
|
|
||||||
|
set(CGLM_BUILD)
|
||||||
|
option(CGLM_SHARED "Shared build" ON)
|
||||||
|
option(CGLM_STATIC "Static build" OFF)
|
||||||
|
option(CGLM_USE_C99 "" OFF)
|
||||||
|
option(CGLM_USE_TEST "Enable Tests" OFF)
|
||||||
|
|
||||||
|
if(NOT CGLM_STATIC AND CGLM_SHARED)
|
||||||
|
set(CGLM_BUILD SHARED)
|
||||||
|
else(CGLM_STATIC)
|
||||||
|
set(CGLM_BUILD STATIC)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(CGLM_USE_C99)
|
||||||
|
set(CMAKE_C_STANDARD 99)
|
||||||
|
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)
|
||||||
|
else()
|
||||||
|
add_compile_options(-Wall -Werror -O3)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
|
||||||
|
message(STATUS "Setting build type to '${DEFAULT_BUILD_TYPE}' as none was specified.")
|
||||||
|
set(CMAKE_BUILD_TYPE "${DEFAULT_BUILD_TYPE}" CACHE STRING "Choose the type of build." FORCE)
|
||||||
|
# Set the possible values of build type for cmake-gui
|
||||||
|
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
include(GNUInstallDirs)
|
||||||
|
|
||||||
|
set(CPACK_PROJECT_NAME ${PROJECT_NAME})
|
||||||
|
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
|
||||||
|
include(CPack)
|
||||||
|
|
||||||
|
# Target Start
|
||||||
|
add_library(${PROJECT_NAME}
|
||||||
|
${CGLM_BUILD}
|
||||||
|
src/euler.c
|
||||||
|
src/affine.c
|
||||||
|
src/io.c
|
||||||
|
src/quat.c
|
||||||
|
src/cam.c
|
||||||
|
src/vec2.c
|
||||||
|
src/vec3.c
|
||||||
|
src/vec4.c
|
||||||
|
src/mat2.c
|
||||||
|
src/mat3.c
|
||||||
|
src/mat4.c
|
||||||
|
src/plane.c
|
||||||
|
src/frustum.c
|
||||||
|
src/box.c
|
||||||
|
src/project.c
|
||||||
|
src/sphere.c
|
||||||
|
src/ease.c
|
||||||
|
src/curve.c
|
||||||
|
src/bezier.c
|
||||||
|
src/ray.c
|
||||||
|
src/affine2d.c
|
||||||
|
)
|
||||||
|
|
||||||
|
if(CGLM_SHARED)
|
||||||
|
add_definitions(-DCGLM_EXPORTS)
|
||||||
|
else()
|
||||||
|
target_compile_definitions(${PROJECT_NAME} PUBLIC -DCGLM_STATIC)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set_target_properties(${PROJECT_NAME} PROPERTIES
|
||||||
|
VERSION ${PROJECT_VERSION}
|
||||||
|
SOVERSION ${PROJECT_VERSION_MAJOR})
|
||||||
|
|
||||||
|
target_include_directories(${PROJECT_NAME}
|
||||||
|
PUBLIC
|
||||||
|
$<INSTALL_INTERFACE:include>
|
||||||
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
|
||||||
|
PRIVATE
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/src
|
||||||
|
)
|
||||||
|
|
||||||
|
# Target for header-only usage
|
||||||
|
add_library(${PROJECT_NAME}_headers INTERFACE)
|
||||||
|
target_include_directories(${PROJECT_NAME}_headers INTERFACE
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/include)
|
||||||
|
|
||||||
|
# Test Configuration
|
||||||
|
if(CGLM_USE_TEST)
|
||||||
|
include(CTest)
|
||||||
|
enable_testing()
|
||||||
|
add_subdirectory(test)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Install
|
||||||
|
install(TARGETS ${PROJECT_NAME}
|
||||||
|
EXPORT ${PROJECT_NAME}
|
||||||
|
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||||
|
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||||
|
RUNTIME DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
||||||
|
|
||||||
|
install(DIRECTORY include/${PROJECT_NAME} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
|
||||||
|
PATTERN ".*" EXCLUDE)
|
||||||
|
|
||||||
|
# Config
|
||||||
|
export(TARGETS ${PROJECT_NAME}
|
||||||
|
NAMESPACE ${PROJECT_NAME}::
|
||||||
|
FILE "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
|
||||||
|
)
|
||||||
|
|
||||||
|
install(EXPORT ${PROJECT_NAME}
|
||||||
|
FILE "${PROJECT_NAME}Config.cmake"
|
||||||
|
NAMESPACE ${PROJECT_NAME}::
|
||||||
|
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME})
|
||||||
|
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
# CONTRIBUTING
|
# CONTRIBUTING
|
||||||
|
|
||||||
Any contributions (code, documentation, ...) are welcome. This project uses [cmocka](http://cmocka.org) for testing, you may need to check their documentation
|
Any contributions (code, documentation, ...) are welcome.
|
||||||
|
|
||||||
# New Features
|
# New Features
|
||||||
- This library may not accept all new features, it is better to create an issue and get approval before coding
|
- This library may not accept all new features, it is better to create an issue and get approval before coding
|
||||||
- You must add test for every new feature
|
- You must add test for every new feature
|
||||||
- The feature must be compiled in both UNIX/POSIX systems (e.g. macos, linux...) and Windows
|
- The feature must be compiled on both UNIX/POSIX systems (e.g. macos, linux...) and Windows
|
||||||
|
|
||||||
# Code Style
|
# Code Style
|
||||||
This library is written with C99, don't try to add C++ files (yes it can compiled into lib),
|
This library is written with C99, don't try to add C++ files (yes it can compiled into lib),
|
||||||
|
|||||||
30
CREDITS
30
CREDITS
@@ -1,7 +1,7 @@
|
|||||||
This library [initially] used some [piece of] implementations
|
This library [initially] used some [piece of] implementations
|
||||||
(may include codes) from these open source projects/resources:
|
(may include codes) from these open source projects/resources:
|
||||||
|
|
||||||
1. Affine Transforms
|
1. Initial Affine Transforms
|
||||||
The original glm repo (g-truc), url: https://github.com/g-truc/glm
|
The original glm repo (g-truc), url: https://github.com/g-truc/glm
|
||||||
|
|
||||||
LICENSE[S]:
|
LICENSE[S]:
|
||||||
@@ -11,7 +11,7 @@ LICENSE[S]:
|
|||||||
|
|
||||||
FULL LICENSE: https://github.com/g-truc/glm/blob/master/copying.txt
|
FULL LICENSE: https://github.com/g-truc/glm/blob/master/copying.txt
|
||||||
|
|
||||||
2. Quaternions
|
2. Initial Quaternions
|
||||||
Anton's OpenGL 4 Tutorials book source code:
|
Anton's OpenGL 4 Tutorials book source code:
|
||||||
|
|
||||||
LICENSE:
|
LICENSE:
|
||||||
@@ -47,6 +47,30 @@ http://old.cescg.org/CESCG-2002/DSykoraJJelinek/
|
|||||||
7. Quaternions
|
7. Quaternions
|
||||||
Initial mat4_quat is borrowed from Apple's simd library
|
Initial mat4_quat is borrowed from Apple's simd library
|
||||||
|
|
||||||
|
|
||||||
8. Vector Rotation using Quaternion
|
8. Vector Rotation using Quaternion
|
||||||
https://gamedev.stackexchange.com/questions/28395/rotating-vector3-by-a-quaternion
|
https://gamedev.stackexchange.com/questions/28395/rotating-vector3-by-a-quaternion
|
||||||
|
|
||||||
|
9. Sphere AABB intersect
|
||||||
|
https://github.com/erich666/GraphicsGems/blob/master/gems/BoxSphere.c
|
||||||
|
|
||||||
|
10. Horizontal add
|
||||||
|
https://stackoverflow.com/questions/6996764/fastest-way-to-do-horizontal-float-vector-sum-on-x86
|
||||||
|
|
||||||
|
11. de casteljau implementation and comments
|
||||||
|
https://forums.khronos.org/showthread.php/10264-Animations-in-1-4-1-release-notes-revision-A/page2?highlight=bezier
|
||||||
|
https://forums.khronos.org/showthread.php/10644-Animation-Bezier-interpolation
|
||||||
|
https://forums.khronos.org/showthread.php/10387-2D-Tangents-in-Bezier-Splines?p=34164&viewfull=1#post34164
|
||||||
|
https://forums.khronos.org/showthread.php/10651-Animation-TCB-Spline-Interpolation-in-COLLADA?highlight=bezier
|
||||||
|
|
||||||
|
12. vec2 cross product
|
||||||
|
http://allenchou.net/2013/07/cross-product-of-2d-vectors/
|
||||||
|
|
||||||
|
13. Ray triangle intersect
|
||||||
|
Möller–Trumbore ray-triangle intersection algorithm, from "Fast, Minimum Storage Ray/Triangle Intersection"
|
||||||
|
Authors:
|
||||||
|
Thomas Möller (tompa@clarus.se)
|
||||||
|
Ben Trumbore (wbt@graphics.cornell.edu)
|
||||||
|
Link to paper: http://webserver2.tecgraf.puc-rio.br/~mgattass/cg/trbRR/Fast%20MinimumStorage%20RayTriangle%20Intersection.pdf
|
||||||
|
|
||||||
|
14. ARM NEON: Matrix Vector Multiplication
|
||||||
|
https://stackoverflow.com/a/57793352/2676533
|
||||||
|
|||||||
180
Makefile.am
Normal file
180
Makefile.am
Normal file
@@ -0,0 +1,180 @@
|
|||||||
|
#******************************************************************************
|
||||||
|
# Copyright (c), Recep Aslantas. *
|
||||||
|
# *
|
||||||
|
# MIT License (MIT), http://opensource.org/licenses/MIT *
|
||||||
|
# Full license can be found in the LICENSE file *
|
||||||
|
# *
|
||||||
|
#******************************************************************************
|
||||||
|
|
||||||
|
ACLOCAL_AMFLAGS = -I m4
|
||||||
|
AM_CFLAGS = -Wall \
|
||||||
|
-std=gnu11 \
|
||||||
|
-O3 \
|
||||||
|
-Wstrict-aliasing=2 \
|
||||||
|
-fstrict-aliasing \
|
||||||
|
-Werror=strict-prototypes
|
||||||
|
|
||||||
|
lib_LTLIBRARIES = libcglm.la
|
||||||
|
libcglm_la_LDFLAGS = -no-undefined -version-info 0:1:0
|
||||||
|
|
||||||
|
checkLDFLAGS = -L./.libs \
|
||||||
|
-lm \
|
||||||
|
-lcglm
|
||||||
|
checkCFLAGS = $(AM_CFLAGS) \
|
||||||
|
-std=gnu11 \
|
||||||
|
-O3 \
|
||||||
|
-DCGLM_DEFINE_PRINTS \
|
||||||
|
-I./include
|
||||||
|
|
||||||
|
check_PROGRAMS = test/tests
|
||||||
|
TESTS = $(check_PROGRAMS)
|
||||||
|
|
||||||
|
test_tests_LDFLAGS = $(checkLDFLAGS)
|
||||||
|
test_tests_CFLAGS = $(checkCFLAGS)
|
||||||
|
|
||||||
|
cglmdir=$(includedir)/cglm
|
||||||
|
cglm_HEADERS = include/cglm/version.h \
|
||||||
|
include/cglm/common.h \
|
||||||
|
include/cglm/types.h \
|
||||||
|
include/cglm/types-struct.h \
|
||||||
|
include/cglm/cglm.h \
|
||||||
|
include/cglm/call.h \
|
||||||
|
include/cglm/struct.h \
|
||||||
|
include/cglm/cam.h \
|
||||||
|
include/cglm/io.h \
|
||||||
|
include/cglm/mat4.h \
|
||||||
|
include/cglm/mat3.h \
|
||||||
|
include/cglm/mat2.h \
|
||||||
|
include/cglm/affine.h \
|
||||||
|
include/cglm/vec2.h \
|
||||||
|
include/cglm/vec2-ext.h \
|
||||||
|
include/cglm/vec3.h \
|
||||||
|
include/cglm/vec3-ext.h \
|
||||||
|
include/cglm/vec4.h \
|
||||||
|
include/cglm/vec4-ext.h \
|
||||||
|
include/cglm/euler.h \
|
||||||
|
include/cglm/util.h \
|
||||||
|
include/cglm/quat.h \
|
||||||
|
include/cglm/affine-mat.h \
|
||||||
|
include/cglm/plane.h \
|
||||||
|
include/cglm/frustum.h \
|
||||||
|
include/cglm/box.h \
|
||||||
|
include/cglm/color.h \
|
||||||
|
include/cglm/project.h \
|
||||||
|
include/cglm/sphere.h \
|
||||||
|
include/cglm/ease.h \
|
||||||
|
include/cglm/curve.h \
|
||||||
|
include/cglm/bezier.h \
|
||||||
|
include/cglm/applesimd.h \
|
||||||
|
include/cglm/ray.h \
|
||||||
|
include/cglm/affine2d.h
|
||||||
|
|
||||||
|
cglm_calldir=$(includedir)/cglm/call
|
||||||
|
cglm_call_HEADERS = include/cglm/call/mat4.h \
|
||||||
|
include/cglm/call/mat3.h \
|
||||||
|
include/cglm/call/mat2.h \
|
||||||
|
include/cglm/call/vec2.h \
|
||||||
|
include/cglm/call/vec3.h \
|
||||||
|
include/cglm/call/vec4.h \
|
||||||
|
include/cglm/call/affine.h \
|
||||||
|
include/cglm/call/io.h \
|
||||||
|
include/cglm/call/cam.h \
|
||||||
|
include/cglm/call/quat.h \
|
||||||
|
include/cglm/call/euler.h \
|
||||||
|
include/cglm/call/plane.h \
|
||||||
|
include/cglm/call/frustum.h \
|
||||||
|
include/cglm/call/box.h \
|
||||||
|
include/cglm/call/project.h \
|
||||||
|
include/cglm/call/sphere.h \
|
||||||
|
include/cglm/call/ease.h \
|
||||||
|
include/cglm/call/curve.h \
|
||||||
|
include/cglm/call/bezier.h \
|
||||||
|
include/cglm/call/ray.h \
|
||||||
|
include/cglm/call/affine2d.h
|
||||||
|
|
||||||
|
cglm_simddir=$(includedir)/cglm/simd
|
||||||
|
cglm_simd_HEADERS = include/cglm/simd/intrin.h \
|
||||||
|
include/cglm/simd/x86.h \
|
||||||
|
include/cglm/simd/arm.h
|
||||||
|
|
||||||
|
cglm_simd_sse2dir=$(includedir)/cglm/simd/sse2
|
||||||
|
cglm_simd_sse2_HEADERS = include/cglm/simd/sse2/affine.h \
|
||||||
|
include/cglm/simd/sse2/mat4.h \
|
||||||
|
include/cglm/simd/sse2/mat3.h \
|
||||||
|
include/cglm/simd/sse2/mat2.h \
|
||||||
|
include/cglm/simd/sse2/quat.h
|
||||||
|
|
||||||
|
cglm_simd_avxdir=$(includedir)/cglm/simd/avx
|
||||||
|
cglm_simd_avx_HEADERS = include/cglm/simd/avx/mat4.h \
|
||||||
|
include/cglm/simd/avx/affine.h
|
||||||
|
|
||||||
|
cglm_simd_neondir=$(includedir)/cglm/simd/neon
|
||||||
|
cglm_simd_neon_HEADERS = include/cglm/simd/neon/mat4.h
|
||||||
|
|
||||||
|
cglm_structdir=$(includedir)/cglm/struct
|
||||||
|
cglm_struct_HEADERS = include/cglm/struct/mat4.h \
|
||||||
|
include/cglm/struct/mat3.h \
|
||||||
|
include/cglm/struct/mat2.h \
|
||||||
|
include/cglm/struct/vec2.h \
|
||||||
|
include/cglm/struct/vec2-ext.h \
|
||||||
|
include/cglm/struct/vec3.h \
|
||||||
|
include/cglm/struct/vec3-ext.h \
|
||||||
|
include/cglm/struct/vec4.h \
|
||||||
|
include/cglm/struct/vec4-ext.h \
|
||||||
|
include/cglm/struct/affine.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/frustum.h \
|
||||||
|
include/cglm/struct/box.h \
|
||||||
|
include/cglm/struct/project.h \
|
||||||
|
include/cglm/struct/sphere.h \
|
||||||
|
include/cglm/struct/color.h \
|
||||||
|
include/cglm/struct/curve.h \
|
||||||
|
include/cglm/struct/affine2d.h
|
||||||
|
|
||||||
|
libcglm_la_SOURCES=\
|
||||||
|
src/euler.c \
|
||||||
|
src/affine.c \
|
||||||
|
src/io.c \
|
||||||
|
src/quat.c \
|
||||||
|
src/cam.c \
|
||||||
|
src/vec2.c \
|
||||||
|
src/vec3.c \
|
||||||
|
src/vec4.c \
|
||||||
|
src/mat2.c \
|
||||||
|
src/mat3.c \
|
||||||
|
src/mat4.c \
|
||||||
|
src/plane.c \
|
||||||
|
src/frustum.c \
|
||||||
|
src/box.c \
|
||||||
|
src/project.c \
|
||||||
|
src/sphere.c \
|
||||||
|
src/ease.c \
|
||||||
|
src/curve.c \
|
||||||
|
src/bezier.c \
|
||||||
|
src/ray.c \
|
||||||
|
src/affine2d.c
|
||||||
|
|
||||||
|
test_tests_SOURCES=\
|
||||||
|
test/runner.c \
|
||||||
|
test/src/test_common.c \
|
||||||
|
test/src/tests.c \
|
||||||
|
test/src/test_cam.c \
|
||||||
|
test/src/test_clamp.c \
|
||||||
|
test/src/test_euler.c \
|
||||||
|
test/src/test_bezier.c \
|
||||||
|
test/src/test_struct.c
|
||||||
|
|
||||||
|
pkgconfig_DATA=cglm.pc
|
||||||
|
|
||||||
|
# When running configure with --prefix, $VPATH references
|
||||||
|
# the source directory that post-build.sh is in. When not
|
||||||
|
# using a prefix, $VPATH will be unset, so we need to fall
|
||||||
|
# back to using . to run the script.
|
||||||
|
#export VPATH
|
||||||
|
|
||||||
|
# all-local:
|
||||||
|
# sh $${VPATH:-.}/post-build.sh
|
||||||
44
Package.swift
Normal file
44
Package.swift
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
// swift-tools-version:5.2
|
||||||
|
|
||||||
|
import PackageDescription
|
||||||
|
|
||||||
|
let package = Package(
|
||||||
|
name: "cglm",
|
||||||
|
products: [
|
||||||
|
.library(name: "cglm", type: .static, targets: ["cglmHeader"]),
|
||||||
|
.library(name: "cglmc", targets: ["cglmCompiled"]),
|
||||||
|
],
|
||||||
|
dependencies: [],
|
||||||
|
targets: [
|
||||||
|
.target(
|
||||||
|
name: "cglmCompiled",
|
||||||
|
path: "./",
|
||||||
|
exclude: [
|
||||||
|
"./docs",
|
||||||
|
"./src/swift",
|
||||||
|
"./include",
|
||||||
|
"./test",
|
||||||
|
"./win",
|
||||||
|
],
|
||||||
|
sources: [
|
||||||
|
"./src",
|
||||||
|
],
|
||||||
|
publicHeadersPath: "./include"
|
||||||
|
),
|
||||||
|
.target(
|
||||||
|
name: "cglmHeader",
|
||||||
|
path: "./",
|
||||||
|
exclude: [
|
||||||
|
"./docs",
|
||||||
|
"./include",
|
||||||
|
"./test",
|
||||||
|
"./win",
|
||||||
|
],
|
||||||
|
sources: [
|
||||||
|
"./src/swift",
|
||||||
|
],
|
||||||
|
publicHeadersPath: "./include"
|
||||||
|
),
|
||||||
|
],
|
||||||
|
cLanguageStandard: .c11
|
||||||
|
)
|
||||||
255
README.md
255
README.md
@@ -3,20 +3,19 @@
|
|||||||
[](https://ci.appveyor.com/project/recp/cglm/branch/master)
|
[](https://ci.appveyor.com/project/recp/cglm/branch/master)
|
||||||
[](http://cglm.readthedocs.io/en/latest/?badge=latest)
|
[](http://cglm.readthedocs.io/en/latest/?badge=latest)
|
||||||
[](https://coveralls.io/github/recp/cglm?branch=master)
|
[](https://coveralls.io/github/recp/cglm?branch=master)
|
||||||
|
[](https://codecov.io/gh/recp/cglm)
|
||||||
[](https://www.codacy.com/app/recp/cglm?utm_source=github.com&utm_medium=referral&utm_content=recp/cglm&utm_campaign=Badge_Grade)
|
[](https://www.codacy.com/app/recp/cglm?utm_source=github.com&utm_medium=referral&utm_content=recp/cglm&utm_campaign=Badge_Grade)
|
||||||
[](#backers)
|
[](#backers)
|
||||||
[](#sponsors)
|
[](#sponsors)
|
||||||
|
|
||||||
The original glm library is for C++ only (templates, namespaces, classes...), this library targeted to C99 but currently you can use it for C89 safely by language extensions e.g `__restrict`
|
|
||||||
|
|
||||||
#### Documentation
|
#### Documentation
|
||||||
|
|
||||||
Almost all functions (inline versions) and parameters are documented inside related headers. <br />
|
Almost all functions (inline versions) and parameters are documented inside the corresponding headers. <br />
|
||||||
Complete documentation: http://cglm.readthedocs.io
|
Complete documentation: http://cglm.readthedocs.io
|
||||||
|
|
||||||
#### Note for previous versions:
|
#### Note for previous versions:
|
||||||
|
|
||||||
- _dup (duplicate) is changed to _copy. For instance `glm_vec_dup -> glm_vec_copy`
|
- _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
|
- 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
|
- 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
|
- **[bugfix]** euler angles was implemented in reverse order (extrinsic) it was fixed, now they are intrinsic. Make sure that
|
||||||
@@ -24,15 +23,18 @@ 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
|
- **[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_**
|
- **[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.
|
- **[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)
|
||||||
|
|
||||||
#### Note for C++ developers:
|
#### Note for C++ developers:
|
||||||
If you don't aware about original GLM library yet, you may also want to look at:
|
If you are not aware of the original GLM library yet, you may also want to look at:
|
||||||
https://github.com/g-truc/glm
|
https://github.com/g-truc/glm
|
||||||
|
|
||||||
#### Note for new comers (Important):
|
#### Note for new comers (Important):
|
||||||
- `vec4` and `mat4` variables must be aligned. (There will be unaligned versions later)
|
- `vec4` and `mat4` variables must be aligned. (There will be unaligned versions later)
|
||||||
- **in** and **[in, out]** parameters must be initialized (please). But **[out]** parameters not, initializing out param is also redundant
|
- **in** and **[in, out]** parameters must be initialized (please). But **[out]** parameters not, initializing out param is also redundant
|
||||||
- All functions are inline if you don't want to use pre-compiled versions with glmc_ prefix, you can ignore build process. Just incliude headers.
|
- All functions are inline if you don't want to use pre-compiled versions with glmc_ prefix, you can ignore build process. Just include headers.
|
||||||
- if your debugger takes you to cglm headers then make sure you are not trying to copy vec4 to vec3 or alig issues...
|
- if your debugger takes you to cglm headers then make sure you are not trying to copy vec4 to vec3 or alig issues...
|
||||||
- Welcome!
|
- Welcome!
|
||||||
|
|
||||||
@@ -43,7 +45,8 @@ https://github.com/g-truc/glm
|
|||||||
`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.
|
`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... ?
|
#### Returning vector or matrix... ?
|
||||||
Since almost all types are arrays and **C** doesn't allow returning arrays, so **cglm** doesn't support this feature. In the future *cglm* may use **struct** for some types for this purpose.
|
|
||||||
|
**cglm** supports both *ARRAY API* and *STRUCT API*, so you can return structs if you utilize struct api (`glms_`).
|
||||||
|
|
||||||
#### Other APIs like Vulkan, Metal, Dx?
|
#### Other APIs like Vulkan, Metal, Dx?
|
||||||
Currently *cglm* uses default clip space configuration (-1, 1) for camera functions (perspective, extract corners...), in the future other clip space configurations will be supported
|
Currently *cglm* uses default clip space configuration (-1, 1) for camera functions (perspective, extract corners...), in the future other clip space configurations will be supported
|
||||||
@@ -66,10 +69,11 @@ Currently *cglm* uses default clip space configuration (-1, 1) for camera functi
|
|||||||
</table>
|
</table>
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
|
- array api and struct api, you can use arrays or structs.
|
||||||
- general purpose matrix operations (mat4, mat3)
|
- general purpose matrix operations (mat4, mat3)
|
||||||
- chain matrix multiplication (square only)
|
- chain matrix multiplication (square only)
|
||||||
- general purpose vector operations (cross, dot, rotate, proj, angle...)
|
- general purpose vector operations (cross, dot, rotate, proj, angle...)
|
||||||
- affine transforms
|
- affine transformations
|
||||||
- matrix decomposition (extract rotation, scaling factor)
|
- matrix decomposition (extract rotation, scaling factor)
|
||||||
- optimized affine transform matrices (mul, rigid-body inverse)
|
- optimized affine transform matrices (mul, rigid-body inverse)
|
||||||
- camera (lookat)
|
- camera (lookat)
|
||||||
@@ -80,12 +84,19 @@ Currently *cglm* uses default clip space configuration (-1, 1) for camera functi
|
|||||||
- inline or pre-compiled function call
|
- inline or pre-compiled function call
|
||||||
- frustum (extract view frustum planes, corners...)
|
- frustum (extract view frustum planes, corners...)
|
||||||
- bounding box (AABB in Frustum (culling), crop, merge...)
|
- bounding box (AABB in Frustum (culling), crop, merge...)
|
||||||
|
- bounding sphere
|
||||||
- project, unproject
|
- 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
|
||||||
|
- ray intersection helpers
|
||||||
|
- and others...
|
||||||
|
|
||||||
<hr />
|
<hr />
|
||||||
|
|
||||||
You have two option to call a function/operation: inline or library call (link)
|
You have two option to call a function/operation: inline or library call (link)
|
||||||
Almost all functions are marked inline (always_inline) so compiler probably will inline.
|
Almost all functions are marked inline (always_inline) so compiler will probably inline.
|
||||||
To call pre-compiled version, just use `glmc_` (c stands for 'call') instead of `glm_`.
|
To call pre-compiled version, just use `glmc_` (c stands for 'call') instead of `glm_`.
|
||||||
|
|
||||||
```C
|
```C
|
||||||
@@ -112,7 +123,7 @@ You can pass matrices and vectors as array to functions rather than get address.
|
|||||||
glm_translate(m, (vec3){1.0f, 0.0f, 0.0f});
|
glm_translate(m, (vec3){1.0f, 0.0f, 0.0f});
|
||||||
```
|
```
|
||||||
|
|
||||||
Library contains general purpose mat4 mul and inverse functions but also contains some special form (optimized) of these functions for affine transform matrices. If you want to multiply two affine transform matrices you can use glm_mul instead of glm_mat4_mul and glm_inv_tr (ROT + TR) instead glm_mat4_inv
|
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
|
||||||
```C
|
```C
|
||||||
/* multiplication */
|
/* multiplication */
|
||||||
mat4 modelMat;
|
mat4 modelMat;
|
||||||
@@ -122,59 +133,161 @@ glm_mul(T, R, modelMat);
|
|||||||
glm_inv_tr(modelMat);
|
glm_inv_tr(modelMat);
|
||||||
```
|
```
|
||||||
|
|
||||||
## Contributors
|
### Struct API
|
||||||
|
|
||||||
This project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)].
|
The struct API works as follows, note the `s` suffix on types, the `glms_` prefix on functions and the `GLMS_` prefix on constants:
|
||||||
<a href="graphs/contributors"><img src="https://opencollective.com/cglm/contributors.svg?width=890&button=false" /></a>
|
|
||||||
|
|
||||||
|
```C
|
||||||
|
#include <cglm/struct.h>
|
||||||
|
|
||||||
## Backers
|
mat4s mat = GLMS_MAT4_IDENTITY_INIT;
|
||||||
|
mat4s inv = glms_mat4_inv(mat);
|
||||||
|
```
|
||||||
|
|
||||||
Thank you to all our backers! 🙏 [[Become a backer](https://opencollective.com/cglm#backer)]
|
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.
|
||||||
|
|
||||||
<a href="https://opencollective.com/cglm#backers" target="_blank"><img src="https://opencollective.com/cglm/backers.svg?width=890"></a>
|
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.
|
||||||
|
|
||||||
|
|
||||||
## Sponsors
|
|
||||||
|
|
||||||
Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [[Become a sponsor](https://opencollective.com/cglm#sponsor)]
|
|
||||||
|
|
||||||
<a href="https://opencollective.com/cglm/sponsor/0/website" target="_blank"><img src="https://opencollective.com/cglm/sponsor/0/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/cglm/sponsor/1/website" target="_blank"><img src="https://opencollective.com/cglm/sponsor/1/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/cglm/sponsor/2/website" target="_blank"><img src="https://opencollective.com/cglm/sponsor/2/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/cglm/sponsor/3/website" target="_blank"><img src="https://opencollective.com/cglm/sponsor/3/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/cglm/sponsor/4/website" target="_blank"><img src="https://opencollective.com/cglm/sponsor/4/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/cglm/sponsor/5/website" target="_blank"><img src="https://opencollective.com/cglm/sponsor/5/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/cglm/sponsor/6/website" target="_blank"><img src="https://opencollective.com/cglm/sponsor/6/avatar.svg"></a>
|
|
||||||
<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
|
|
||||||
|
|
||||||
## Build
|
## 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
|
||||||
|
```
|
||||||
|
|
||||||
|
### 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
|
||||||
|
enable_tests=false # 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)
|
### Unix (Autotools)
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ sh ./build-deps.sh # run only once (dependencies) [Optional].
|
|
||||||
$ # You can pass this step if you don't want to run `make check` for tests.
|
|
||||||
$ # cglm uses cmocka for tests and it may reqiure cmake for building it
|
|
||||||
$
|
|
||||||
$ sh autogen.sh
|
$ sh autogen.sh
|
||||||
$ ./configure
|
$ ./configure
|
||||||
$ make
|
$ make
|
||||||
$ make check # [Optional] (if you run `sh ./build-deps.sh`)
|
$ make check # [Optional]
|
||||||
$ [sudo] make install
|
$ [sudo] make install # [Optional]
|
||||||
```
|
```
|
||||||
|
|
||||||
|
This will also install pkg-config files so you can use
|
||||||
|
`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 (MSBuild)
|
||||||
Windows related build files, project files are located in `win` folder,
|
Windows related build file and project files are located in `win` folder,
|
||||||
make sure you are inside `cglm/win` folder.
|
make sure you are inside `cglm/win` folder.
|
||||||
Code Analysis are enabled, it may take awhile to build
|
Code Analysis is enabled, so it may take awhile to build.
|
||||||
|
|
||||||
```Powershell
|
```Powershell
|
||||||
$ cd win
|
$ cd win
|
||||||
@@ -185,6 +298,10 @@ if `msbuild` won't work (because of multi version VS) then try to build with `de
|
|||||||
$ devenv cglm.sln /Build Release
|
$ devenv cglm.sln /Build Release
|
||||||
```
|
```
|
||||||
|
|
||||||
|
#### Running Tests on Windows
|
||||||
|
|
||||||
|
You can see test project in same visual studio solution file. It is enough to run that project to run tests.
|
||||||
|
|
||||||
### Building Docs
|
### Building Docs
|
||||||
First you need install Sphinx: http://www.sphinx-doc.org/en/master/usage/installation.html
|
First you need install Sphinx: http://www.sphinx-doc.org/en/master/usage/installation.html
|
||||||
then:
|
then:
|
||||||
@@ -195,21 +312,21 @@ $ sphinx-build source build
|
|||||||
it will compile docs into build folder, you can run index.html inside that function.
|
it will compile docs into build folder, you can run index.html inside that function.
|
||||||
|
|
||||||
## How to use
|
## How to use
|
||||||
If you want to use inline versions of funcstions then; include main header
|
If you want to use the inline versions of functions, then include the main header
|
||||||
```C
|
```C
|
||||||
#include <cglm/cglm.h>
|
#include <cglm/cglm.h>
|
||||||
```
|
```
|
||||||
the header will include all headers. Then call func you want e.g. rotate vector by axis:
|
the header will include all headers. Then call the func you want e.g. rotate vector by axis:
|
||||||
```C
|
```C
|
||||||
glm_vec_rotate(v1, glm_rad(45), (vec3){1.0f, 0.0f, 0.0f});
|
glm_vec3_rotate(v1, glm_rad(45), (vec3){1.0f, 0.0f, 0.0f});
|
||||||
```
|
```
|
||||||
some functions are overloaded :) e.g you can normalize vector:
|
some functions are overloaded :) e.g you can normalize vector:
|
||||||
```C
|
```C
|
||||||
glm_vec_normalize(vec);
|
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:
|
this will normalize vec and store normalized vector into `vec` but if you will store normalized vector into another vector do this:
|
||||||
```C
|
```C
|
||||||
glm_vec_normalize_to(vec, result);
|
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
|
like this function you may see `_to` postfix, this functions store results to another variables and save temp memory
|
||||||
|
|
||||||
@@ -220,7 +337,7 @@ to call pre-compiled versions include header with `c` postfix, c means call. Pre
|
|||||||
```
|
```
|
||||||
this header will include all headers with c postfix. You need to call functions with c posfix:
|
this header will include all headers with c postfix. You need to call functions with c posfix:
|
||||||
```C
|
```C
|
||||||
glmc_vec_normalize(vec);
|
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:
|
Function usage and parameters are documented inside related headers. You may see same parameter passed twice in some examples like this:
|
||||||
@@ -230,7 +347,7 @@ glm_mat4_mul(m1, m2, m1);
|
|||||||
/* or */
|
/* or */
|
||||||
glm_mat4_mul(m1, m1, m1);
|
glm_mat4_mul(m1, m1, m1);
|
||||||
```
|
```
|
||||||
the first two parameter are **[in]** and the last one is **[out]** parameter. After multiplied *m1* and *m2* the result is stored in *m1*. This is why we send *m1* twice. You may store result in different matrix, this just an example.
|
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
|
### Example: Computing MVP matrix
|
||||||
|
|
||||||
@@ -270,7 +387,7 @@ Option 2: Cast matrix to pointer type (also valid for multiple dimensional array
|
|||||||
glUniformMatrix4fv(location, 1, GL_FALSE, (float *)matrix);
|
glUniformMatrix4fv(location, 1, GL_FALSE, (float *)matrix);
|
||||||
```
|
```
|
||||||
|
|
||||||
You can pass same way to another APIs e.g. Vulkan, DX...
|
You can pass matrices the same way to other APIs e.g. Vulkan, DX...
|
||||||
|
|
||||||
## Notes
|
## Notes
|
||||||
|
|
||||||
@@ -284,3 +401,35 @@ You can pass same way to another APIs e.g. Vulkan, DX...
|
|||||||
- [ ] Unaligned operations (e.g. `glm_umat4_mul`)
|
- [ ] Unaligned operations (e.g. `glm_umat4_mul`)
|
||||||
- [x] Extra documentation
|
- [x] Extra documentation
|
||||||
- [ ] ARM Neon Arch (In Progress)
|
- [ ] ARM Neon Arch (In Progress)
|
||||||
|
|
||||||
|
|
||||||
|
## Contributors
|
||||||
|
|
||||||
|
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>
|
||||||
|
|
||||||
|
|
||||||
|
## Backers
|
||||||
|
|
||||||
|
Thank you to all our backers! 🙏 [[Become a backer](https://opencollective.com/cglm#backer)]
|
||||||
|
|
||||||
|
<a href="https://opencollective.com/cglm#backers" target="_blank"><img src="https://opencollective.com/cglm/backers.svg?width=890"></a>
|
||||||
|
|
||||||
|
|
||||||
|
## Sponsors
|
||||||
|
|
||||||
|
Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [[Become a sponsor](https://opencollective.com/cglm#sponsor)]
|
||||||
|
|
||||||
|
<a href="https://opencollective.com/cglm/sponsor/0/website" target="_blank"><img src="https://opencollective.com/cglm/sponsor/0/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/cglm/sponsor/1/website" target="_blank"><img src="https://opencollective.com/cglm/sponsor/1/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/cglm/sponsor/2/website" target="_blank"><img src="https://opencollective.com/cglm/sponsor/2/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/cglm/sponsor/3/website" target="_blank"><img src="https://opencollective.com/cglm/sponsor/3/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/cglm/sponsor/4/website" target="_blank"><img src="https://opencollective.com/cglm/sponsor/4/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/cglm/sponsor/5/website" target="_blank"><img src="https://opencollective.com/cglm/sponsor/5/avatar.svg"></a>
|
||||||
|
<a href="https://opencollective.com/cglm/sponsor/6/website" target="_blank"><img src="https://opencollective.com/cglm/sponsor/6/avatar.svg"></a>
|
||||||
|
<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
|
||||||
|
|||||||
@@ -1,23 +0,0 @@
|
|||||||
#! /bin/sh
|
|
||||||
#
|
|
||||||
# Copyright (c), Recep Aslantas.
|
|
||||||
#
|
|
||||||
# MIT License (MIT), http://opensource.org/licenses/MIT
|
|
||||||
# Full license can be found in the LICENSE file
|
|
||||||
#
|
|
||||||
|
|
||||||
# check if deps are pulled
|
|
||||||
git submodule update --init --recursive
|
|
||||||
|
|
||||||
cd $(dirname "$0")
|
|
||||||
|
|
||||||
# general deps: gcc make autoconf automake libtool cmake
|
|
||||||
|
|
||||||
# test - cmocka
|
|
||||||
cd ./test/lib/cmocka
|
|
||||||
rm -rf build
|
|
||||||
mkdir -p build
|
|
||||||
cd build
|
|
||||||
cmake -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Debug ..
|
|
||||||
make -j8
|
|
||||||
cd ../../../../
|
|
||||||
11
cglm.pc.in
Normal file
11
cglm.pc.in
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
prefix=@prefix@
|
||||||
|
exec_prefix=@exec_prefix@
|
||||||
|
libdir=@libdir@
|
||||||
|
includedir=@includedir@
|
||||||
|
|
||||||
|
Name: @PACKAGE_NAME@
|
||||||
|
Description: OpenGL Mathematics (glm) for C
|
||||||
|
URL: https://github.com/recp/cglm
|
||||||
|
Version: @PACKAGE_VERSION@
|
||||||
|
Cflags: -I${includedir}
|
||||||
|
Libs: -L${libdir} -lcglm @LIBS@
|
||||||
15
cglm.podspec
15
cglm.podspec
@@ -2,10 +2,10 @@ Pod::Spec.new do |s|
|
|||||||
|
|
||||||
# Description
|
# Description
|
||||||
s.name = "cglm"
|
s.name = "cglm"
|
||||||
s.version = "0.4.4"
|
s.version = "0.8.0"
|
||||||
s.summary = "📽 Optimized OpenGL/Graphics Math (glm) for C"
|
s.summary = "📽 Highly Optimized Graphics Math (glm) for C"
|
||||||
s.description = <<-DESC
|
s.description = <<-DESC
|
||||||
cglm is math library for graphics programming for C. It is similar to original glm but it is written for C instead of C++ (you can use here too). See the documentation or README for all features.
|
cglm is math library for graphics programming for C. See the documentation or README for all features.
|
||||||
DESC
|
DESC
|
||||||
|
|
||||||
s.documentation_url = "http://cglm.readthedocs.io"
|
s.documentation_url = "http://cglm.readthedocs.io"
|
||||||
@@ -25,4 +25,13 @@ cglm is math library for graphics programming for C. It is similar to original g
|
|||||||
|
|
||||||
# Linking
|
# Linking
|
||||||
s.library = "m"
|
s.library = "m"
|
||||||
|
|
||||||
|
# Configuration
|
||||||
|
s.pod_target_xcconfig = {
|
||||||
|
'CLANG_ENABLE_MODULES' => 'NO',
|
||||||
|
'CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES' => 'YES',
|
||||||
|
'CLANG_WARN_DOCUMENTATION_COMMENTS' => 'NO',
|
||||||
|
'GCC_C_LANGUAGE_STANDARD' => 'gnu11',
|
||||||
|
'GCC_PREPROCESSOR_DEFINITIONS' => '$(inherited) GLM_TESTS_NO_COLORFUL_OUTPUT'
|
||||||
|
}
|
||||||
end
|
end
|
||||||
|
|||||||
24
configure.ac
24
configure.ac
@@ -7,13 +7,30 @@
|
|||||||
#*****************************************************************************
|
#*****************************************************************************
|
||||||
|
|
||||||
AC_PREREQ([2.69])
|
AC_PREREQ([2.69])
|
||||||
AC_INIT([cglm], [0.4.5], [info@recp.me])
|
AC_INIT([cglm], [0.8.1], [info@recp.me])
|
||||||
AM_INIT_AUTOMAKE([-Wall -Werror foreign subdir-objects])
|
AM_INIT_AUTOMAKE([-Wall -Werror foreign subdir-objects serial-tests])
|
||||||
|
|
||||||
|
# Don't use the default cflags (-O2 -g), we set ours manually in Makefile.am.
|
||||||
|
: ${CFLAGS=""}
|
||||||
|
|
||||||
AC_CONFIG_MACRO_DIR([m4])
|
AC_CONFIG_MACRO_DIR([m4])
|
||||||
AC_CONFIG_SRCDIR([src/])
|
AC_CONFIG_SRCDIR([src/])
|
||||||
AC_CONFIG_HEADERS([config.h])
|
AC_CONFIG_HEADERS([config.h])
|
||||||
|
|
||||||
|
# Dependencies for pkg-config.
|
||||||
|
PKG_PROG_PKG_CONFIG
|
||||||
|
# Ancient versions of pkg-config (such as the one used in Travis CI)
|
||||||
|
# don't have this macro, so we need to do it manually.
|
||||||
|
m4_ifdef([PKG_INSTALLDIR], [
|
||||||
|
PKG_INSTALLDIR
|
||||||
|
], [
|
||||||
|
AC_ARG_WITH([pkgconfigdir],
|
||||||
|
[AS_HELP_STRING([--with-pkgconfigdir],
|
||||||
|
[pkg-config installation directory ['${libdir}/pkgconfig']])],,
|
||||||
|
[with_pkgconfigdir=]'${libdir}/pkgconfig')
|
||||||
|
AC_SUBST([pkgconfigdir], [$with_pkgconfigdir])
|
||||||
|
])
|
||||||
|
|
||||||
# Checks for programs.
|
# Checks for programs.
|
||||||
AC_PROG_CC
|
AC_PROG_CC
|
||||||
AM_PROG_CC_C_O
|
AM_PROG_CC_C_O
|
||||||
@@ -29,6 +46,7 @@ LT_INIT
|
|||||||
# Checks for libraries.
|
# Checks for libraries.
|
||||||
AC_CHECK_LIB([m], [floor])
|
AC_CHECK_LIB([m], [floor])
|
||||||
|
|
||||||
|
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
|
||||||
AC_SYS_LARGEFILE
|
AC_SYS_LARGEFILE
|
||||||
|
|
||||||
# Checks for header files.
|
# Checks for header files.
|
||||||
@@ -52,6 +70,6 @@ AC_TYPE_UINT8_T
|
|||||||
# Checks for library functions.
|
# Checks for library functions.
|
||||||
AC_FUNC_ERROR_AT_LINE
|
AC_FUNC_ERROR_AT_LINE
|
||||||
|
|
||||||
AC_CONFIG_FILES([makefile])
|
AC_CONFIG_FILES([Makefile cglm.pc])
|
||||||
|
|
||||||
AC_OUTPUT
|
AC_OUTPUT
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
.. default-domain:: C
|
.. default-domain:: C
|
||||||
|
|
||||||
affine transform matrix (specialized functions)
|
3D Affine Transform Matrix (specialized functions)
|
||||||
================================================================================
|
================================================================================
|
||||||
|
|
||||||
Header: cglm/affine-mat.h
|
Header: cglm/affine-mat.h
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
.. default-domain:: C
|
.. default-domain:: C
|
||||||
|
|
||||||
affine transforms
|
3D Affine Transforms
|
||||||
================================================================================
|
================================================================================
|
||||||
|
|
||||||
Header: cglm/affine.h
|
Header: cglm/affine.h
|
||||||
@@ -45,6 +45,8 @@ The implementation would be:
|
|||||||
glm_rotate(m, angle, axis);
|
glm_rotate(m, angle, axis);
|
||||||
glm_translate(m, pivotInv); /* pivotInv = -pivot */
|
glm_translate(m, pivotInv); /* pivotInv = -pivot */
|
||||||
|
|
||||||
|
.. _TransformsOrder:
|
||||||
|
|
||||||
Transforms Order
|
Transforms Order
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
|||||||
140
docs/source/affine2d.rst
Normal file
140
docs/source/affine2d.rst
Normal file
@@ -0,0 +1,140 @@
|
|||||||
|
.. default-domain:: C
|
||||||
|
|
||||||
|
2D Affine Transforms
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
Header: cglm/affine2d.h
|
||||||
|
|
||||||
|
2D Transforms uses `2d` suffix for naming. If there is no 2D suffix it is 3D function.
|
||||||
|
|
||||||
|
Initialize Transform Matrices
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
Functions with **_make** prefix expect you don't have a matrix and they create
|
||||||
|
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.
|
||||||
|
|
||||||
|
Transforms Order
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
See :ref:`TransformsOrder` to read similar section.
|
||||||
|
|
||||||
|
|
||||||
|
Table of contents (click to go):
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Functions:
|
||||||
|
|
||||||
|
1. :c:func:`glm_translate2d`
|
||||||
|
#. :c:func:`glm_translate2d_to`
|
||||||
|
#. :c:func:`glm_translate2d_x`
|
||||||
|
#. :c:func:`glm_translate2d_y`
|
||||||
|
#. :c:func:`glm_translate2d_make`
|
||||||
|
#. :c:func:`glm_scale2d_to`
|
||||||
|
#. :c:func:`glm_scale2d_make`
|
||||||
|
#. :c:func:`glm_scale2d`
|
||||||
|
#. :c:func:`glm_scale2d_uni`
|
||||||
|
#. :c:func:`glm_rotate2d_make`
|
||||||
|
#. :c:func:`glm_rotate2d`
|
||||||
|
#. :c:func:`glm_rotate2d_to`
|
||||||
|
|
||||||
|
.. c:function:: void glm_translate2d(mat3 m, vec2 v)
|
||||||
|
|
||||||
|
translate existing 2d transform matrix by *v* vector and stores result in same matrix
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in, out]* **m** 2d affine transfrom
|
||||||
|
| *[in]* **v** translate vector [x, y]
|
||||||
|
|
||||||
|
.. c:function:: void glm_translate2d_to(mat3 m, vec2 v, mat3 dest)
|
||||||
|
|
||||||
|
translate existing 2d transform matrix by *v* vector and store result in dest
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **m** 2d affine transfrom
|
||||||
|
| *[in]* **v** translate vector [x, y]
|
||||||
|
| *[out]* **dest** translated matrix
|
||||||
|
|
||||||
|
.. c:function:: void glm_translate2d_x(mat3 m, float x)
|
||||||
|
|
||||||
|
translate existing 2d transform matrix by x factor
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in, out]* **m** 2d affine transfrom
|
||||||
|
| *[in]* **x** x factor
|
||||||
|
|
||||||
|
.. c:function:: void glm_translate2d_y(mat3 m, float y)
|
||||||
|
|
||||||
|
translate existing 2d transform matrix by y factor
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in, out]* **m** 2d affine transfrom
|
||||||
|
| *[in]* **y** y factor
|
||||||
|
|
||||||
|
.. c:function:: void glm_translate2d_make(mat3 m, vec2 v)
|
||||||
|
|
||||||
|
creates NEW translate 2d transform matrix by *v* vector
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in, out]* **m** affine transfrom
|
||||||
|
| *[in]* **v** translate vector [x, y]
|
||||||
|
|
||||||
|
.. c:function:: void glm_scale2d_to(mat3 m, vec2 v, mat3 dest)
|
||||||
|
|
||||||
|
scale existing 2d transform matrix by *v* vector and store result in dest
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **m** affine transfrom
|
||||||
|
| *[in]* **v** scale vector [x, y]
|
||||||
|
| *[out]* **dest** scaled matrix
|
||||||
|
|
||||||
|
.. c:function:: void glm_scale2d_make(mat3 m, vec2 v)
|
||||||
|
|
||||||
|
creates NEW 2d scale matrix by *v* vector
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in, out]* **m** affine transfrom
|
||||||
|
| *[in]* **v** scale vector [x, y]
|
||||||
|
|
||||||
|
.. c:function:: void glm_scale2d(mat3 m, vec2 v)
|
||||||
|
|
||||||
|
scales existing 2d transform matrix by *v* vector and stores result in same matrix
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in, out]* **m** affine transfrom
|
||||||
|
| *[in]* **v** translate vector [x, y]
|
||||||
|
|
||||||
|
.. c:function:: void glm_scale2d_uni(mat3 m, float s)
|
||||||
|
|
||||||
|
applies uniform scale to existing 2d transform matrix v = [s, s] and stores result in same matrix
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in, out]* **m** affine transfrom
|
||||||
|
| *[in]* **s** scale factor
|
||||||
|
|
||||||
|
.. c:function:: void glm_rotate2d_make(mat3 m, float angle)
|
||||||
|
|
||||||
|
creates NEW rotation matrix by angle around *Z* axis
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in, out]* **m** affine transfrom
|
||||||
|
| *[in]* **angle** angle (radians)
|
||||||
|
|
||||||
|
.. c:function:: void glm_rotate2d(mat3 m, float angle)
|
||||||
|
|
||||||
|
rotate existing 2d transform matrix around *Z* axis by angle and store result in same matrix
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in, out]* **m** affine transfrom
|
||||||
|
| *[in]* **angle** angle (radians)
|
||||||
|
|
||||||
|
.. c:function:: void glm_rotate2d_to(mat3 m, float angle, mat3 dest)
|
||||||
|
|
||||||
|
rotate existing 2d transform matrix around *Z* axis by angle and store result in dest
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **m** affine transfrom
|
||||||
|
| *[in]* **angle** angle (radians)
|
||||||
|
| *[out]* **dest** rotated matrix
|
||||||
@@ -5,14 +5,14 @@ Some functions may exist twice,
|
|||||||
once for their namespace and once for global namespace
|
once for their namespace and once for global namespace
|
||||||
to make easier to write very common functions
|
to make easier to write very common functions
|
||||||
|
|
||||||
For instance, in general we use :code:`glm_vec_dot` to get dot product
|
For instance, in general we use :code:`glm_vec3_dot` to get dot product
|
||||||
of two **vec3**. Now we can also do this with :code:`glm_dot`,
|
of two **vec3**. Now we can also do this with :code:`glm_dot`,
|
||||||
same for *_cross* and so on...
|
same for *_cross* and so on...
|
||||||
|
|
||||||
The original function stays where it is, the function in global namespace
|
The original function stays where it is, the function in global namespace
|
||||||
of same name is just an alias, so there is no call version of those functions.
|
of same name is just an alias, so there is no call version of those functions.
|
||||||
e.g there is no func like :code:`glmc_dot` because *glm_dot* is just alias for
|
e.g there is no func like :code:`glmc_dot` because *glm_dot* is just alias for
|
||||||
:code:`glm_vec_dot`
|
:code:`glm_vec3_dot`
|
||||||
|
|
||||||
By including **cglm/cglm.h** header you will include all inline version
|
By including **cglm/cglm.h** header you will include all inline version
|
||||||
of functions. Since functions in this header[s] are inline you don't need to
|
of functions. Since functions in this header[s] are inline you don't need to
|
||||||
@@ -28,6 +28,7 @@ Follow the :doc:`build` documentation for this
|
|||||||
|
|
||||||
affine
|
affine
|
||||||
affine-mat
|
affine-mat
|
||||||
|
affine2d
|
||||||
cam
|
cam
|
||||||
frustum
|
frustum
|
||||||
box
|
box
|
||||||
@@ -35,13 +36,21 @@ Follow the :doc:`build` documentation for this
|
|||||||
euler
|
euler
|
||||||
mat4
|
mat4
|
||||||
mat3
|
mat3
|
||||||
|
mat2
|
||||||
vec3
|
vec3
|
||||||
vec3-ext
|
vec3-ext
|
||||||
vec4
|
vec4
|
||||||
vec4-ext
|
vec4-ext
|
||||||
|
vec2
|
||||||
|
vec2-ext
|
||||||
color
|
color
|
||||||
plane
|
plane
|
||||||
project
|
project
|
||||||
util
|
util
|
||||||
io
|
io
|
||||||
call
|
call
|
||||||
|
sphere
|
||||||
|
curve
|
||||||
|
bezier
|
||||||
|
version
|
||||||
|
ray
|
||||||
|
|||||||
89
docs/source/bezier.rst
Normal file
89
docs/source/bezier.rst
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
.. default-domain:: C
|
||||||
|
|
||||||
|
Bezier
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
Header: cglm/bezier.h
|
||||||
|
|
||||||
|
Common helpers for cubic bezier and similar curves.
|
||||||
|
|
||||||
|
Table of contents (click to go):
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Functions:
|
||||||
|
|
||||||
|
1. :c:func:`glm_bezier`
|
||||||
|
2. :c:func:`glm_hermite`
|
||||||
|
3. :c:func:`glm_decasteljau`
|
||||||
|
|
||||||
|
Functions documentation
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
.. c:function:: float glm_bezier(float s, float p0, float c0, float c1, float p1)
|
||||||
|
|
||||||
|
| cubic bezier interpolation
|
||||||
|
| formula:
|
||||||
|
|
||||||
|
.. code-block:: text
|
||||||
|
|
||||||
|
B(s) = P0*(1-s)^3 + 3*C0*s*(1-s)^2 + 3*C1*s^2*(1-s) + P1*s^3
|
||||||
|
|
||||||
|
| similar result using matrix:
|
||||||
|
|
||||||
|
.. code-block:: text
|
||||||
|
|
||||||
|
B(s) = glm_smc(t, GLM_BEZIER_MAT, (vec4){p0, c0, c1, p1})
|
||||||
|
|
||||||
|
| glm_eq(glm_smc(...), glm_bezier(...)) should return TRUE
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **s** parameter between 0 and 1
|
||||||
|
| *[in]* **p0** begin point
|
||||||
|
| *[in]* **c0** control point 1
|
||||||
|
| *[in]* **c1** control point 2
|
||||||
|
| *[in]* **p1** end point
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
B(s)
|
||||||
|
|
||||||
|
.. c:function:: float glm_hermite(float s, float p0, float t0, float t1, float p1)
|
||||||
|
|
||||||
|
| cubic hermite interpolation
|
||||||
|
| formula:
|
||||||
|
|
||||||
|
.. code-block:: text
|
||||||
|
|
||||||
|
H(s) = P0*(2*s^3 - 3*s^2 + 1) + T0*(s^3 - 2*s^2 + s) + P1*(-2*s^3 + 3*s^2) + T1*(s^3 - s^2)
|
||||||
|
|
||||||
|
| similar result using matrix:
|
||||||
|
|
||||||
|
.. code-block:: text
|
||||||
|
|
||||||
|
H(s) = glm_smc(t, GLM_HERMITE_MAT, (vec4){p0, p1, c0, c1})
|
||||||
|
|
||||||
|
| glm_eq(glm_smc(...), glm_hermite(...)) should return TRUE
|
||||||
|
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **s** parameter between 0 and 1
|
||||||
|
| *[in]* **p0** begin point
|
||||||
|
| *[in]* **t0** tangent 1
|
||||||
|
| *[in]* **t1** tangent 2
|
||||||
|
| *[in]* **p1** end point
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
B(s)
|
||||||
|
|
||||||
|
.. c:function:: float glm_decasteljau(float prm, float p0, float c0, float c1, float p1)
|
||||||
|
|
||||||
|
| iterative way to solve cubic equation
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **prm** parameter between 0 and 1
|
||||||
|
| *[in]* **p0** begin point
|
||||||
|
| *[in]* **c0** control point 1
|
||||||
|
| *[in]* **c1** control point 2
|
||||||
|
| *[in]* **p1** end point
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
parameter to use in cubic equation
|
||||||
@@ -28,6 +28,11 @@ Functions:
|
|||||||
#. :c:func:`glm_aabb_isvalid`
|
#. :c:func:`glm_aabb_isvalid`
|
||||||
#. :c:func:`glm_aabb_size`
|
#. :c:func:`glm_aabb_size`
|
||||||
#. :c:func:`glm_aabb_radius`
|
#. :c:func:`glm_aabb_radius`
|
||||||
|
#. :c:func:`glm_aabb_center`
|
||||||
|
#. :c:func:`glm_aabb_aabb`
|
||||||
|
#. :c:func:`glm_aabb_sphere`
|
||||||
|
#. :c:func:`glm_aabb_point`
|
||||||
|
#. :c:func:`glm_aabb_contains`
|
||||||
|
|
||||||
Functions documentation
|
Functions documentation
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
@@ -131,3 +136,46 @@ Functions documentation
|
|||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **box** bounding box
|
| *[in]* **box** bounding box
|
||||||
|
|
||||||
|
.. c:function:: void glm_aabb_center(vec3 box[2], vec3 dest)
|
||||||
|
|
||||||
|
| computes center point of AABB
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **box** bounding box
|
||||||
|
| *[out]* **dest** center of bounding box
|
||||||
|
|
||||||
|
.. c:function:: bool glm_aabb_aabb(vec3 box[2], vec3 other[2])
|
||||||
|
|
||||||
|
| check if two AABB intersects
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **box** bounding box
|
||||||
|
| *[out]* **other** other bounding box
|
||||||
|
|
||||||
|
.. c:function:: bool glm_aabb_sphere(vec3 box[2], vec4 s)
|
||||||
|
|
||||||
|
| check if AABB intersects with sphere
|
||||||
|
|
||||||
|
| https://github.com/erich666/GraphicsGems/blob/master/gems/BoxSphere.c
|
||||||
|
| Solid Box - Solid Sphere test.
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **box** solid bounding box
|
||||||
|
| *[out]* **s** solid sphere
|
||||||
|
|
||||||
|
.. c:function:: bool glm_aabb_point(vec3 box[2], vec3 point)
|
||||||
|
|
||||||
|
| check if point is inside of AABB
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **box** bounding box
|
||||||
|
| *[out]* **point** point
|
||||||
|
|
||||||
|
.. c:function:: bool glm_aabb_contains(vec3 box[2], vec3 other[2])
|
||||||
|
|
||||||
|
| check if AABB contains other AABB
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **box** bounding box
|
||||||
|
| *[out]* **other** other bounding box
|
||||||
|
|||||||
@@ -1,23 +1,108 @@
|
|||||||
Building cglm
|
Build cglm
|
||||||
================================
|
================================
|
||||||
|
|
||||||
| **cglm** does not have external dependencies except for unit testing.
|
| **cglm** does not have any external dependencies.
|
||||||
| When you pulled cglm repo with submodules all dependencies will be pulled too.
|
|
||||||
| `build-deps.sh` will pull all dependencies/submodules and build for you.
|
|
||||||
|
|
||||||
External dependencies:
|
|
||||||
* cmocka - for unit testing
|
|
||||||
|
|
||||||
**NOTE:**
|
**NOTE:**
|
||||||
If you only need to inline versions, you don't need to build **cglm**, you don't need to link it to your program.
|
If you only need to inline versions, you don't need to build **cglm**, you don't need to link it to your program.
|
||||||
Just import cglm to your project as dependency / external lib by copy-paste then use it as usual
|
Just import cglm to your project as dependency / external lib by copy-paste then use it as usual
|
||||||
|
|
||||||
**Unix (Autotools):**
|
CMake (All platforms):
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
.. code-block:: bash
|
.. code-block:: bash
|
||||||
:linenos:
|
:linenos:
|
||||||
|
|
||||||
$ sh ./build-deps.sh # run this only once (dependencies)
|
$ mkdir build
|
||||||
|
$ cd build
|
||||||
|
$ cmake .. # [Optional] -DCGLM_SHARED=ON
|
||||||
|
$ make
|
||||||
|
$ sudo make install # [Optional]
|
||||||
|
|
||||||
|
**make** will build cglm to **build** folder.
|
||||||
|
If you don't want to install **cglm** to your system's folder you can get static and dynamic libs in this folder.
|
||||||
|
|
||||||
|
**CMake Options:**
|
||||||
|
|
||||||
|
.. code-block:: CMake
|
||||||
|
:linenos:
|
||||||
|
|
||||||
|
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 example**
|
||||||
|
This requires no building or installation of cglm.
|
||||||
|
|
||||||
|
.. code-block:: CMake
|
||||||
|
:linenos:
|
||||||
|
|
||||||
|
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**
|
||||||
|
|
||||||
|
.. code-block:: CMake
|
||||||
|
:linenos:
|
||||||
|
|
||||||
|
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/)
|
||||||
|
|
||||||
|
Meson (All platforms):
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
.. code-block::
|
||||||
|
:linenos:
|
||||||
|
|
||||||
|
$ meson build # [Optional] --default-library=static
|
||||||
|
$ cd build
|
||||||
|
$ ninja
|
||||||
|
$ sudo ninja install # [Optional]
|
||||||
|
|
||||||
|
**Meson Options:**
|
||||||
|
|
||||||
|
.. code-block::
|
||||||
|
:linenos:
|
||||||
|
|
||||||
|
c_std=c11
|
||||||
|
buildtype=release
|
||||||
|
default_library=shared
|
||||||
|
enable_tests=false # to run tests: ninja test
|
||||||
|
|
||||||
|
|
||||||
|
**Use with your Meson project**
|
||||||
|
|
||||||
|
.. code-block::
|
||||||
|
:linenos:
|
||||||
|
|
||||||
|
# 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)
|
||||||
|
|
||||||
|
|
||||||
|
Unix (Autotools):
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
:linenos:
|
||||||
|
|
||||||
$ sh autogen.sh
|
$ sh autogen.sh
|
||||||
$ ./configure
|
$ ./configure
|
||||||
@@ -26,11 +111,12 @@ Just import cglm to your project as dependency / external lib by copy-paste then
|
|||||||
$ [sudo] make install # install to system (optional)
|
$ [sudo] make install # install to system (optional)
|
||||||
|
|
||||||
**make** will build cglm to **.libs** sub folder in project folder.
|
**make** will build cglm to **.libs** sub folder in project folder.
|
||||||
If you don't want to install cglm to your system's folder you can get static and dynamic libs in this folder.
|
If you don't want to install **cglm** to your system's folder you can get static and dynamic libs in this folder.
|
||||||
|
|
||||||
**Build dependencies (windows):**
|
Windows (MSBuild):
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
Windows related build files, project files are located in win folder,
|
Windows related build files, project files are located in `win` folder,
|
||||||
make sure you are inside in cglm/win folder.
|
make sure you are inside in cglm/win folder.
|
||||||
|
|
||||||
Code Analysis are enabled, it may take awhile to build.
|
Code Analysis are enabled, it may take awhile to build.
|
||||||
@@ -50,3 +136,18 @@ then try to build with *devenv*:
|
|||||||
$ devenv cglm.sln /Build Release
|
$ devenv cglm.sln /Build Release
|
||||||
|
|
||||||
Currently tests are not available on Windows.
|
Currently tests are not available on Windows.
|
||||||
|
|
||||||
|
Documentation (Sphinx):
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
**cglm** uses sphinx framework for documentation, it allows lot of formats for documentation. To see all options see sphinx build page:
|
||||||
|
|
||||||
|
https://www.sphinx-doc.org/en/master/man/sphinx-build.html
|
||||||
|
|
||||||
|
Example build:
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
:linenos:
|
||||||
|
|
||||||
|
$ cd cglm/docs
|
||||||
|
$ sphinx-build source build
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ There are many convenient functions for camera. For instance :c:func:`glm_look`
|
|||||||
is just wrapper for :c:func:`glm_lookat`. Sometimes you only have direction
|
is just wrapper for :c:func:`glm_lookat`. Sometimes you only have direction
|
||||||
instead of target, so that makes easy to build view matrix using direction.
|
instead of target, so that makes easy to build view matrix using direction.
|
||||||
There is also :c:func:`glm_look_anyup` function which can help build view matrix
|
There is also :c:func:`glm_look_anyup` function which can help build view matrix
|
||||||
without providing UP axis. It uses :c:func:`glm_vec_ortho` to get a UP axis and
|
without providing UP axis. It uses :c:func:`glm_vec3_ortho` to get a UP axis and
|
||||||
builds view matrix.
|
builds view matrix.
|
||||||
|
|
||||||
You can also *_default* versions of ortho and perspective to build projection
|
You can also *_default* versions of ortho and perspective to build projection
|
||||||
@@ -36,6 +36,7 @@ Functions:
|
|||||||
#. :c:func:`glm_ortho_default`
|
#. :c:func:`glm_ortho_default`
|
||||||
#. :c:func:`glm_ortho_default_s`
|
#. :c:func:`glm_ortho_default_s`
|
||||||
#. :c:func:`glm_perspective`
|
#. :c:func:`glm_perspective`
|
||||||
|
#. :c:func:`glm_persp_move_far`
|
||||||
#. :c:func:`glm_perspective_default`
|
#. :c:func:`glm_perspective_default`
|
||||||
#. :c:func:`glm_perspective_resize`
|
#. :c:func:`glm_perspective_resize`
|
||||||
#. :c:func:`glm_lookat`
|
#. :c:func:`glm_lookat`
|
||||||
@@ -145,6 +146,16 @@ Functions documentation
|
|||||||
| *[in]* **farVal** far clipping planes
|
| *[in]* **farVal** far clipping planes
|
||||||
| *[out]* **dest** result matrix
|
| *[out]* **dest** result matrix
|
||||||
|
|
||||||
|
.. c:function:: void glm_persp_move_far(mat4 proj, float deltaFar)
|
||||||
|
|
||||||
|
| extend perspective projection matrix's far distance
|
||||||
|
|
||||||
|
| this function does not guarantee far >= near, be aware of that!
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in, out]* **proj** projection matrix to extend
|
||||||
|
| *[in]* **deltaFar** distance from existing far (negative to shink)
|
||||||
|
|
||||||
.. c:function:: void glm_perspective_default(float aspect, mat4 dest)
|
.. c:function:: void glm_perspective_default(float aspect, mat4 dest)
|
||||||
|
|
||||||
| set up perspective projection matrix with default near/far
|
| set up perspective projection matrix with default near/far
|
||||||
@@ -167,11 +178,13 @@ Functions documentation
|
|||||||
|
|
||||||
| set up view matrix
|
| set up view matrix
|
||||||
|
|
||||||
|
**NOTE:** The UP vector must not be parallel to the line of sight from the eye point to the reference point.
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **eye** eye vector
|
| *[in]* **eye** eye vector
|
||||||
| *[in]* **center** center vector
|
| *[in]* **center** center vector
|
||||||
| *[in]* **up** up vector
|
| *[in]* **up** up vector
|
||||||
| *[out]* **dest** result matrix
|
| *[out]* **dest** result matrix
|
||||||
|
|
||||||
.. c:function:: void glm_look(vec3 eye, vec3 dir, vec3 up, mat4 dest)
|
.. c:function:: void glm_look(vec3 eye, vec3 dir, vec3 up, mat4 dest)
|
||||||
|
|
||||||
@@ -181,9 +194,11 @@ Functions documentation
|
|||||||
target self then this might be useful. Because you need to get target
|
target self then this might be useful. Because you need to get target
|
||||||
from direction.
|
from direction.
|
||||||
|
|
||||||
|
**NOTE:** The UP vector must not be parallel to the line of sight from the eye point to the reference point.
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **eye** eye vector
|
| *[in]* **eye** eye vector
|
||||||
| *[in]* **center** direction vector
|
| *[in]* **dir** direction vector
|
||||||
| *[in]* **up** up vector
|
| *[in]* **up** up vector
|
||||||
| *[out]* **dest** result matrix
|
| *[out]* **dest** result matrix
|
||||||
|
|
||||||
@@ -197,7 +212,7 @@ Functions documentation
|
|||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **eye** eye vector
|
| *[in]* **eye** eye vector
|
||||||
| *[in]* **center** direction vector
|
| *[in]* **dir** direction vector
|
||||||
| *[out]* **dest** result matrix
|
| *[out]* **dest** result matrix
|
||||||
|
|
||||||
.. c:function:: void glm_persp_decomp(mat4 proj, float *nearVal, float *farVal, float *top, float *bottom, float *left, float *right)
|
.. c:function:: void glm_persp_decomp(mat4 proj, float *nearVal, float *farVal, float *top, float *bottom, float *left, float *right)
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
|
|
||||||
# If your documentation needs a minimal Sphinx version, state it here.
|
# If your documentation needs a minimal Sphinx version, state it here.
|
||||||
#
|
#
|
||||||
# needs_sphinx = '1.0'
|
# needs_sphinx = '3.0'
|
||||||
|
|
||||||
# Add any Sphinx extension module names here, as strings. They can be
|
# Add any Sphinx extension module names here, as strings. They can be
|
||||||
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
|
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
|
||||||
@@ -62,9 +62,9 @@ author = u'Recep Aslantas'
|
|||||||
# built documents.
|
# built documents.
|
||||||
#
|
#
|
||||||
# The short X.Y version.
|
# The short X.Y version.
|
||||||
version = u'0.4.5'
|
version = u'0.8.1'
|
||||||
# The full version, including alpha/beta/rc tags.
|
# The full version, including alpha/beta/rc tags.
|
||||||
release = u'0.4.5'
|
release = u'0.8.1'
|
||||||
|
|
||||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||||
# for a list of supported languages.
|
# for a list of supported languages.
|
||||||
@@ -90,7 +90,7 @@ todo_include_todos = False
|
|||||||
# The theme to use for HTML and HTML Help pages. See the documentation for
|
# The theme to use for HTML and HTML Help pages. See the documentation for
|
||||||
# a list of builtin themes.
|
# a list of builtin themes.
|
||||||
#
|
#
|
||||||
html_theme = 'alabaster'
|
html_theme = 'sphinx_rtd_theme'
|
||||||
|
|
||||||
# Theme options are theme-specific and customize the look and feel of a theme
|
# Theme options are theme-specific and customize the look and feel of a theme
|
||||||
# further. For a list of options available for each theme, see the
|
# further. For a list of options available for each theme, see the
|
||||||
@@ -99,13 +99,13 @@ html_theme = 'alabaster'
|
|||||||
# html_theme_options = {}
|
# html_theme_options = {}
|
||||||
|
|
||||||
html_theme_options = {
|
html_theme_options = {
|
||||||
'github_banner': 'true',
|
# 'github_banner': 'true',
|
||||||
'github_button': 'true',
|
# 'github_button': 'true',
|
||||||
'github_user': 'recp',
|
# 'github_user': 'recp',
|
||||||
'github_repo': 'cglm',
|
# 'github_repo': 'cglm',
|
||||||
'travis_button': 'true',
|
# 'travis_button': 'true',
|
||||||
'show_related': 'true',
|
# 'show_related': 'true',
|
||||||
'fixed_sidebar': 'true'
|
# 'fixed_sidebar': 'true'
|
||||||
}
|
}
|
||||||
|
|
||||||
# Add any paths that contain custom static files (such as style sheets) here,
|
# Add any paths that contain custom static files (such as style sheets) here,
|
||||||
@@ -197,3 +197,7 @@ epub_exclude_files = ['search.html']
|
|||||||
|
|
||||||
# If true, `todo` and `todoList` produce output, else they produce nothing.
|
# If true, `todo` and `todoList` produce output, else they produce nothing.
|
||||||
todo_include_todos = True
|
todo_include_todos = True
|
||||||
|
|
||||||
|
# -- Options for the C domain ------------------------------------------------
|
||||||
|
|
||||||
|
c_id_attributes = ['__restrict']
|
||||||
|
|||||||
41
docs/source/curve.rst
Normal file
41
docs/source/curve.rst
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
.. default-domain:: C
|
||||||
|
|
||||||
|
Curve
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
Header: cglm/curve.h
|
||||||
|
|
||||||
|
Common helpers for common curves. For specific curve see its header/doc
|
||||||
|
e.g bezier
|
||||||
|
|
||||||
|
Table of contents (click to go):
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Functions:
|
||||||
|
|
||||||
|
1. :c:func:`glm_smc`
|
||||||
|
|
||||||
|
Functions documentation
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
.. c:function:: float glm_smc(float s, mat4 m, vec4 c)
|
||||||
|
|
||||||
|
| helper function to calculate **S** * **M** * **C** multiplication for curves
|
||||||
|
|
||||||
|
| this function does not encourage you to use SMC, instead it is a helper if you use SMC.
|
||||||
|
|
||||||
|
| if you want to specify S as vector then use more generic glm_mat4_rmc() func.
|
||||||
|
|
||||||
|
| Example usage:
|
||||||
|
|
||||||
|
.. code-block:: c
|
||||||
|
|
||||||
|
Bs = glm_smc(s, GLM_BEZIER_MAT, (vec4){p0, c0, c1, p1})
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **s** parameter between 0 and 1 (this will be [s3, s2, s, 1])
|
||||||
|
| *[in]* **m** basis matrix
|
||||||
|
| *[out]* **c** position/control vector
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
scalar value e.g. Bs
|
||||||
26
docs/source/features.rst
Normal file
26
docs/source/features.rst
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
Features
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
* array api and struct api, you can use arrays or structs.
|
||||||
|
* general purpose matrix operations (mat4, mat3)
|
||||||
|
* chain matrix multiplication (square only)
|
||||||
|
* general purpose vector operations (cross, dot, rotate, proj, angle...)
|
||||||
|
* affine transformations
|
||||||
|
* matrix decomposition (extract rotation, scaling factor)
|
||||||
|
* optimized affine transform matrices (mul, rigid-body inverse)
|
||||||
|
* camera (lookat)
|
||||||
|
* projections (ortho, perspective)
|
||||||
|
* quaternions
|
||||||
|
* euler angles / yaw-pitch-roll to matrix
|
||||||
|
* extract euler angles
|
||||||
|
* inline or pre-compiled function call
|
||||||
|
* frustum (extract view frustum planes, corners...)
|
||||||
|
* bounding box (AABB in Frustum (culling), crop, merge...)
|
||||||
|
* bounding sphere
|
||||||
|
* project, unproject
|
||||||
|
* easing functions
|
||||||
|
* curves
|
||||||
|
* curve interpolation helpers (SMC, deCasteljau...)
|
||||||
|
* helpers to convert 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...
|
||||||
@@ -127,7 +127,7 @@ Functions documentation
|
|||||||
.. code-block:: c
|
.. code-block:: c
|
||||||
|
|
||||||
for (j = 0; j < 4; j++) {
|
for (j = 0; j < 4; j++) {
|
||||||
glm_vec_center(corners[i], corners[i + 4], centerCorners[i]);
|
glm_vec3_center(corners[i], corners[i + 4], centerCorners[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
corners[i + 4] is far of corners[i] point.
|
corners[i + 4] is far of corners[i] point.
|
||||||
|
|||||||
@@ -9,23 +9,26 @@ Types:
|
|||||||
.. code-block:: c
|
.. code-block:: c
|
||||||
:linenos:
|
:linenos:
|
||||||
|
|
||||||
typedef float vec3[3];
|
typedef float vec2[2];
|
||||||
typedef int ivec3[3];
|
typedef float vec3[3];
|
||||||
typedef CGLM_ALIGN(16) float vec4[4];
|
typedef int ivec3[3];
|
||||||
|
typedef CGLM_ALIGN_IF(16) float vec4[4];
|
||||||
|
typedef vec4 versor;
|
||||||
|
typedef vec3 mat3[3];
|
||||||
|
|
||||||
typedef vec3 mat3[3];
|
#ifdef __AVX__
|
||||||
typedef vec4 mat4[4];
|
typedef CGLM_ALIGN_IF(32) vec4 mat4[4];
|
||||||
|
#else
|
||||||
typedef vec4 versor;
|
typedef CGLM_ALIGN_IF(16) vec4 mat4[4];
|
||||||
|
#endif
|
||||||
|
|
||||||
As you can see types don't store extra informations in favor of space.
|
As you can see types don't store extra informations in favor of space.
|
||||||
You can send these values e.g. matrix to OpenGL directly without casting or calling a function like *value_ptr*
|
You can send these values e.g. matrix to OpenGL directly without casting or calling a function like *value_ptr*
|
||||||
|
|
||||||
Alignment is Required:
|
Alignment Is Required:
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
**vec4** and **mat4** requires 16 byte alignment because vec4 and mat4 operations are
|
**vec4** and **mat4** requires 16 (32 for **mat4** if AVX is enabled) byte alignment because **vec4** and **mat4** operations are vectorized by SIMD instructions (SSE/AVX/NEON).
|
||||||
vectorized by SIMD instructions (SSE/AVX).
|
|
||||||
|
|
||||||
**UPDATE:**
|
**UPDATE:**
|
||||||
By starting v0.4.5 cglm provides an option to disable alignment requirement, it is enabled as default
|
By starting v0.4.5 cglm provides an option to disable alignment requirement, it is enabled as default
|
||||||
@@ -37,10 +40,9 @@ vectorized by SIMD instructions (SSE/AVX).
|
|||||||
Allocations:
|
Allocations:
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
*cglm* doesn't alloc any memory on heap. So it doesn't provide any allocator.
|
*cglm* doesn't alloc any memory on heap. So it doesn't provide any allocator.
|
||||||
You must allocate memory yourself. You should alloc memory for out parameters too if you pass pointer of memory location.
|
You must allocate memory yourself. You should alloc memory for out parameters too if you pass pointer of memory location. When allocating memory, don't forget that **vec4** and **mat4** require alignment.
|
||||||
When allocating memory don't forget that **vec4** and **mat4** requires alignment.
|
|
||||||
|
|
||||||
**NOTE:** Unaligned vec4 and unaligned mat4 operations will be supported in the future. Check todo list.
|
**NOTE:** Unaligned **vec4** and unaligned **mat4** operations will be supported in the future. Check todo list.
|
||||||
Because you may want to multiply a CGLM matrix with external matrix.
|
Because you may want to multiply a CGLM matrix with external matrix.
|
||||||
There is no guarantee that non-CGLM matrix is aligned. Unaligned types will have *u* prefix e.g. **umat4**
|
There is no guarantee that non-CGLM matrix is aligned. Unaligned types will have *u* prefix e.g. **umat4**
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
You can adapt this file completely to your liking, but it should at least
|
You can adapt this file completely to your liking, but it should at least
|
||||||
contain the root `toctree` directive.
|
contain the root `toctree` directive.
|
||||||
|
|
||||||
Welcome to cglm's documentation!
|
cglm Documentation
|
||||||
================================
|
================================
|
||||||
|
|
||||||
**cglm** is optimized 3D math library written in C99 (compatible with C89).
|
**cglm** is optimized 3D math library written in C99 (compatible with C89).
|
||||||
@@ -14,33 +14,36 @@ is considered to be supported as optional.
|
|||||||
|
|
||||||
Also currently only **float** type is supported for most operations.
|
Also currently only **float** type is supported for most operations.
|
||||||
|
|
||||||
**Features**
|
|
||||||
|
|
||||||
* general purpose matrix operations (mat4, mat3)
|
|
||||||
* chain matrix multiplication (square only)
|
|
||||||
* general purpose vector operations (cross, dot, rotate, proj, angle...)
|
|
||||||
* affine transforms
|
|
||||||
* matrix decomposition (extract rotation, scaling factor)
|
|
||||||
* optimized affine transform matrices (mul, rigid-body inverse)
|
|
||||||
* camera (lookat)
|
|
||||||
* projections (ortho, perspective)
|
|
||||||
* quaternions
|
|
||||||
* euler angles / yaw-pitch-roll to matrix
|
|
||||||
* extract euler angles
|
|
||||||
* inline or pre-compiled function call
|
|
||||||
* frustum (extract view frustum planes, corners...)
|
|
||||||
* bounding box (AABB in Frustum (culling), crop, merge...)
|
|
||||||
|
|
||||||
|
|
||||||
.. toctree::
|
.. toctree::
|
||||||
:maxdepth: 1
|
:maxdepth: 2
|
||||||
:caption: Table Of Contents:
|
:caption: Getting Started:
|
||||||
|
|
||||||
|
features
|
||||||
build
|
build
|
||||||
getting_started
|
getting_started
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 2
|
||||||
|
:caption: How To:
|
||||||
|
|
||||||
opengl
|
opengl
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 2
|
||||||
|
:caption: API:
|
||||||
|
|
||||||
api
|
api
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 2
|
||||||
|
:caption: Options:
|
||||||
|
|
||||||
opt
|
opt
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 2
|
||||||
|
:caption: Troubleshooting:
|
||||||
|
|
||||||
troubleshooting
|
troubleshooting
|
||||||
|
|
||||||
Indices and tables
|
Indices and tables
|
||||||
|
|||||||
@@ -28,6 +28,23 @@ Example to print mat4 matrix:
|
|||||||
(you probably will in some cases), you can change it temporary.
|
(you probably will in some cases), you can change it temporary.
|
||||||
cglm may provide precision parameter in the future
|
cglm may provide precision parameter in the future
|
||||||
|
|
||||||
|
Changes since **v0.7.3**:
|
||||||
|
* 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 values are colorful ;)
|
||||||
|
* Some print improvements
|
||||||
|
* New options with default values:
|
||||||
|
|
||||||
|
.. code-block:: c
|
||||||
|
|
||||||
|
#define CGLM_PRINT_PRECISION 5
|
||||||
|
#define CGLM_PRINT_MAX_TO_SHORT 1e5
|
||||||
|
#define CGLM_PRINT_COLOR "\033[36m"
|
||||||
|
#define CGLM_PRINT_COLOR_RESET "\033[0m"
|
||||||
|
|
||||||
|
* Inline prints are only enabled in DEBUG mode and if **CGLM_DEFINE_PRINTS** is defined.
|
||||||
|
|
||||||
|
Check options page.
|
||||||
|
|
||||||
Table of contents (click to go):
|
Table of contents (click to go):
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
|||||||
179
docs/source/mat2.rst
Normal file
179
docs/source/mat2.rst
Normal file
@@ -0,0 +1,179 @@
|
|||||||
|
.. default-domain:: C
|
||||||
|
|
||||||
|
mat2
|
||||||
|
====
|
||||||
|
|
||||||
|
Header: cglm/mat2.h
|
||||||
|
|
||||||
|
Table of contents (click to go):
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Macros:
|
||||||
|
|
||||||
|
1. GLM_mat2_IDENTITY_INIT
|
||||||
|
#. GLM_mat2_ZERO_INIT
|
||||||
|
#. GLM_mat2_IDENTITY
|
||||||
|
#. GLM_mat2_ZERO
|
||||||
|
|
||||||
|
Functions:
|
||||||
|
|
||||||
|
1. :c:func:`glm_mat2_copy`
|
||||||
|
#. :c:func:`glm_mat2_identity`
|
||||||
|
#. :c:func:`glm_mat2_identity_array`
|
||||||
|
#. :c:func:`glm_mat2_zero`
|
||||||
|
#. :c:func:`glm_mat2_mul`
|
||||||
|
#. :c:func:`glm_mat2_transpose_to`
|
||||||
|
#. :c:func:`glm_mat2_transpose`
|
||||||
|
#. :c:func:`glm_mat2_mulv`
|
||||||
|
#. :c:func:`glm_mat2_scale`
|
||||||
|
#. :c:func:`glm_mat2_det`
|
||||||
|
#. :c:func:`glm_mat2_inv`
|
||||||
|
#. :c:func:`glm_mat2_trace`
|
||||||
|
#. :c:func:`glm_mat2_swap_col`
|
||||||
|
#. :c:func:`glm_mat2_swap_row`
|
||||||
|
#. :c:func:`glm_mat2_rmc`
|
||||||
|
|
||||||
|
Functions documentation
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
.. c:function:: void glm_mat2_copy(mat2 mat, mat2 dest)
|
||||||
|
|
||||||
|
copy mat2 to another one (dest).
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **mat** source
|
||||||
|
| *[out]* **dest** destination
|
||||||
|
|
||||||
|
.. c:function:: void glm_mat2_identity(mat2 mat)
|
||||||
|
|
||||||
|
copy identity mat2 to mat, or makes mat to identiy
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[out]* **mat** matrix
|
||||||
|
|
||||||
|
.. c:function:: void glm_mat2_identity_array(mat2 * __restrict mat, size_t count)
|
||||||
|
|
||||||
|
make given matrix array's each element identity matrix
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in,out]* **mat** matrix array (must be aligned (16/32) if alignment is not disabled)
|
||||||
|
| *[in]* **count** count of matrices
|
||||||
|
|
||||||
|
.. c:function:: void glm_mat2_zero(mat2 mat)
|
||||||
|
|
||||||
|
make given matrix zero
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in,out]* **mat** matrix to
|
||||||
|
|
||||||
|
.. c:function:: void glm_mat2_mul(mat2 m1, mat2 m2, mat2 dest)
|
||||||
|
|
||||||
|
multiply m1 and m2 to dest
|
||||||
|
m1, m2 and dest matrices can be same matrix, it is possible to write this:
|
||||||
|
|
||||||
|
.. code-block:: c
|
||||||
|
|
||||||
|
mat2 m = GLM_mat2_IDENTITY_INIT;
|
||||||
|
glm_mat2_mul(m, m, m);
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **m1** left matrix
|
||||||
|
| *[in]* **m2** right matrix
|
||||||
|
| *[out]* **dest** destination matrix
|
||||||
|
|
||||||
|
.. c:function:: void glm_mat2_transpose_to(mat2 m, mat2 dest)
|
||||||
|
|
||||||
|
transpose mat4 and store in dest
|
||||||
|
source matrix will not be transposed unless dest is m
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **mat** source
|
||||||
|
| *[out]* **dest** destination
|
||||||
|
|
||||||
|
.. c:function:: void glm_mat2_transpose(mat2 m)
|
||||||
|
|
||||||
|
tranpose mat2 and store result in same matrix
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **mat** source
|
||||||
|
| *[out]* **dest** destination
|
||||||
|
|
||||||
|
.. c:function:: void glm_mat2_mulv(mat2 m, vec2 v, vec2 dest)
|
||||||
|
|
||||||
|
multiply mat4 with vec4 (column vector) and store in dest vector
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **mat** mat2 (left)
|
||||||
|
| *[in]* **v** vec2 (right, column vector)
|
||||||
|
| *[out]* **dest** destination (result, column vector)
|
||||||
|
|
||||||
|
.. c:function:: void glm_mat2_scale(mat2 m, float s)
|
||||||
|
|
||||||
|
multiply matrix with scalar
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in, out]* **mat** matrix
|
||||||
|
| *[in]* **dest** scalar
|
||||||
|
|
||||||
|
.. c:function:: float glm_mat2_det(mat2 mat)
|
||||||
|
|
||||||
|
returns mat2 determinant
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **mat** matrix
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
mat2 determinant
|
||||||
|
|
||||||
|
.. c:function:: void glm_mat2_inv(mat2 mat, mat2 dest)
|
||||||
|
|
||||||
|
inverse mat2 and store in dest
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **mat** matrix
|
||||||
|
| *[out]* **dest** destination (inverse matrix)
|
||||||
|
|
||||||
|
.. c:function:: void glm_mat2_trace(mat2 m)
|
||||||
|
|
||||||
|
| sum of the elements on the main diagonal from upper left to the lower right
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **m** matrix
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
trace of matrix
|
||||||
|
|
||||||
|
.. c:function:: void glm_mat2_swap_col(mat2 mat, int col1, int col2)
|
||||||
|
|
||||||
|
swap two matrix columns
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in, out]* **mat** matrix
|
||||||
|
| *[in]* **col1** col1
|
||||||
|
| *[in]* **col2** col2
|
||||||
|
|
||||||
|
.. c:function:: void glm_mat2_swap_row(mat2 mat, int row1, int row2)
|
||||||
|
|
||||||
|
swap two matrix rows
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in, out]* **mat** matrix
|
||||||
|
| *[in]* **row1** row1
|
||||||
|
| *[in]* **row2** row2
|
||||||
|
|
||||||
|
.. c:function:: float glm_mat2_rmc(vec2 r, mat2 m, vec2 c)
|
||||||
|
|
||||||
|
| **rmc** stands for **Row** * **Matrix** * **Column**
|
||||||
|
|
||||||
|
| helper for R (row vector) * M (matrix) * C (column vector)
|
||||||
|
|
||||||
|
| the result is scalar because R * M = Matrix1x2 (row vector),
|
||||||
|
| then Matrix1x2 * Vec2 (column vector) = Matrix1x1 (Scalar)
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **r** row vector or matrix1x2
|
||||||
|
| *[in]* **m** matrix2x2
|
||||||
|
| *[in]* **c** column vector or matrix2x1
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
scalar value e.g. Matrix1x1
|
||||||
@@ -20,15 +20,20 @@ Functions:
|
|||||||
|
|
||||||
1. :c:func:`glm_mat3_copy`
|
1. :c:func:`glm_mat3_copy`
|
||||||
#. :c:func:`glm_mat3_identity`
|
#. :c:func:`glm_mat3_identity`
|
||||||
|
#. :c:func:`glm_mat3_identity_array`
|
||||||
|
#. :c:func:`glm_mat3_zero`
|
||||||
#. :c:func:`glm_mat3_mul`
|
#. :c:func:`glm_mat3_mul`
|
||||||
#. :c:func:`glm_mat3_transpose_to`
|
#. :c:func:`glm_mat3_transpose_to`
|
||||||
#. :c:func:`glm_mat3_transpose`
|
#. :c:func:`glm_mat3_transpose`
|
||||||
#. :c:func:`glm_mat3_mulv`
|
#. :c:func:`glm_mat3_mulv`
|
||||||
|
#. :c:func:`glm_mat3_quat`
|
||||||
#. :c:func:`glm_mat3_scale`
|
#. :c:func:`glm_mat3_scale`
|
||||||
#. :c:func:`glm_mat3_det`
|
#. :c:func:`glm_mat3_det`
|
||||||
#. :c:func:`glm_mat3_inv`
|
#. :c:func:`glm_mat3_inv`
|
||||||
|
#. :c:func:`glm_mat3_trace`
|
||||||
#. :c:func:`glm_mat3_swap_col`
|
#. :c:func:`glm_mat3_swap_col`
|
||||||
#. :c:func:`glm_mat3_swap_row`
|
#. :c:func:`glm_mat3_swap_row`
|
||||||
|
#. :c:func:`glm_mat3_rmc`
|
||||||
|
|
||||||
Functions documentation
|
Functions documentation
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
@@ -48,6 +53,21 @@ Functions documentation
|
|||||||
Parameters:
|
Parameters:
|
||||||
| *[out]* **mat** matrix
|
| *[out]* **mat** matrix
|
||||||
|
|
||||||
|
.. c:function:: void glm_mat3_identity_array(mat3 * __restrict mat, size_t count)
|
||||||
|
|
||||||
|
make given matrix array's each element identity matrix
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in,out]* **mat** matrix array (must be aligned (16/32) if alignment is not disabled)
|
||||||
|
| *[in]* **count** count of matrices
|
||||||
|
|
||||||
|
.. c:function:: void glm_mat3_zero(mat3 mat)
|
||||||
|
|
||||||
|
make given matrix zero
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in,out]* **mat** matrix to
|
||||||
|
|
||||||
.. c:function:: void glm_mat3_mul(mat3 m1, mat3 m2, mat3 dest)
|
.. c:function:: void glm_mat3_mul(mat3 m1, mat3 m2, mat3 dest)
|
||||||
|
|
||||||
multiply m1 and m2 to dest
|
multiply m1 and m2 to dest
|
||||||
@@ -89,6 +109,14 @@ Functions documentation
|
|||||||
| *[in]* **v** vec3 (right, column vector)
|
| *[in]* **v** vec3 (right, column vector)
|
||||||
| *[out]* **dest** destination (result, column vector)
|
| *[out]* **dest** destination (result, column vector)
|
||||||
|
|
||||||
|
.. c:function:: void glm_mat3_quat(mat3 m, versor dest)
|
||||||
|
|
||||||
|
convert mat3 to quaternion
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **m** rotation matrix
|
||||||
|
| *[out]* **dest** destination quaternion
|
||||||
|
|
||||||
.. c:function:: void glm_mat3_scale(mat3 m, float s)
|
.. c:function:: void glm_mat3_scale(mat3 m, float s)
|
||||||
|
|
||||||
multiply matrix with scalar
|
multiply matrix with scalar
|
||||||
@@ -115,6 +143,16 @@ Functions documentation
|
|||||||
| *[in]* **mat** matrix
|
| *[in]* **mat** matrix
|
||||||
| *[out]* **dest** destination (inverse matrix)
|
| *[out]* **dest** destination (inverse matrix)
|
||||||
|
|
||||||
|
.. c:function:: void glm_mat3_trace(mat3 m)
|
||||||
|
|
||||||
|
| sum of the elements on the main diagonal from upper left to the lower right
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **m** matrix
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
trace of matrix
|
||||||
|
|
||||||
.. c:function:: void glm_mat3_swap_col(mat3 mat, int col1, int col2)
|
.. c:function:: void glm_mat3_swap_col(mat3 mat, int col1, int col2)
|
||||||
|
|
||||||
swap two matrix columns
|
swap two matrix columns
|
||||||
@@ -132,3 +170,20 @@ Functions documentation
|
|||||||
| *[in, out]* **mat** matrix
|
| *[in, out]* **mat** matrix
|
||||||
| *[in]* **row1** row1
|
| *[in]* **row1** row1
|
||||||
| *[in]* **row2** row2
|
| *[in]* **row2** row2
|
||||||
|
|
||||||
|
.. c:function:: float glm_mat3_rmc(vec3 r, mat3 m, vec3 c)
|
||||||
|
|
||||||
|
| **rmc** stands for **Row** * **Matrix** * **Column**
|
||||||
|
|
||||||
|
| helper for R (row vector) * M (matrix) * C (column vector)
|
||||||
|
|
||||||
|
| the result is scalar because R * M = Matrix1x3 (row vector),
|
||||||
|
| then Matrix1x3 * Vec3 (column vector) = Matrix1x1 (Scalar)
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **r** row vector or matrix1x3
|
||||||
|
| *[in]* **m** matrix3x3
|
||||||
|
| *[in]* **c** column vector or matrix3x1
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
scalar value e.g. Matrix1x1
|
||||||
|
|||||||
@@ -25,6 +25,8 @@ Functions:
|
|||||||
1. :c:func:`glm_mat4_ucopy`
|
1. :c:func:`glm_mat4_ucopy`
|
||||||
#. :c:func:`glm_mat4_copy`
|
#. :c:func:`glm_mat4_copy`
|
||||||
#. :c:func:`glm_mat4_identity`
|
#. :c:func:`glm_mat4_identity`
|
||||||
|
#. :c:func:`glm_mat4_identity_array`
|
||||||
|
#. :c:func:`glm_mat4_zero`
|
||||||
#. :c:func:`glm_mat4_pick3`
|
#. :c:func:`glm_mat4_pick3`
|
||||||
#. :c:func:`glm_mat4_pick3t`
|
#. :c:func:`glm_mat4_pick3t`
|
||||||
#. :c:func:`glm_mat4_ins3`
|
#. :c:func:`glm_mat4_ins3`
|
||||||
@@ -32,6 +34,9 @@ Functions:
|
|||||||
#. :c:func:`glm_mat4_mulN`
|
#. :c:func:`glm_mat4_mulN`
|
||||||
#. :c:func:`glm_mat4_mulv`
|
#. :c:func:`glm_mat4_mulv`
|
||||||
#. :c:func:`glm_mat4_mulv3`
|
#. :c:func:`glm_mat4_mulv3`
|
||||||
|
#. :c:func:`glm_mat3_trace`
|
||||||
|
#. :c:func:`glm_mat3_trace3`
|
||||||
|
#. :c:func:`glm_mat4_quat`
|
||||||
#. :c:func:`glm_mat4_transpose_to`
|
#. :c:func:`glm_mat4_transpose_to`
|
||||||
#. :c:func:`glm_mat4_transpose`
|
#. :c:func:`glm_mat4_transpose`
|
||||||
#. :c:func:`glm_mat4_scale_p`
|
#. :c:func:`glm_mat4_scale_p`
|
||||||
@@ -41,6 +46,7 @@ Functions:
|
|||||||
#. :c:func:`glm_mat4_inv_fast`
|
#. :c:func:`glm_mat4_inv_fast`
|
||||||
#. :c:func:`glm_mat4_swap_col`
|
#. :c:func:`glm_mat4_swap_col`
|
||||||
#. :c:func:`glm_mat4_swap_row`
|
#. :c:func:`glm_mat4_swap_row`
|
||||||
|
#. :c:func:`glm_mat4_rmc`
|
||||||
|
|
||||||
Functions documentation
|
Functions documentation
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
@@ -68,6 +74,21 @@ Functions documentation
|
|||||||
Parameters:
|
Parameters:
|
||||||
| *[out]* **mat** matrix
|
| *[out]* **mat** matrix
|
||||||
|
|
||||||
|
.. c:function:: void glm_mat4_identity_array(mat4 * __restrict mat, size_t count)
|
||||||
|
|
||||||
|
make given matrix array's each element identity matrix
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in,out]* **mat** matrix array (must be aligned (16/32) if alignment is not disabled)
|
||||||
|
| *[in]* **count** count of matrices
|
||||||
|
|
||||||
|
.. c:function:: void glm_mat4_zero(mat4 mat)
|
||||||
|
|
||||||
|
make given matrix zero
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in,out]* **mat** matrix to
|
||||||
|
|
||||||
.. c:function:: void glm_mat4_pick3(mat4 mat, mat3 dest)
|
.. c:function:: void glm_mat4_pick3(mat4 mat, mat3 dest)
|
||||||
|
|
||||||
copy upper-left of mat4 to mat3
|
copy upper-left of mat4 to mat3
|
||||||
@@ -135,16 +156,51 @@ Functions documentation
|
|||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **m** mat4 (left)
|
| *[in]* **m** mat4 (left)
|
||||||
| *[in]* **v** vec4 (right, column vector)
|
| *[in]* **v** vec4 (right, column vector)
|
||||||
|
| *[in]* **last** 4th item to make it vec4
|
||||||
| *[out]* **dest** vec4 (result, column vector)
|
| *[out]* **dest** vec4 (result, column vector)
|
||||||
|
|
||||||
.. c:function:: void glm_mat4_mulv3(mat4 m, vec3 v, vec3 dest)
|
.. c:function:: void glm_mat4_mulv3(mat4 m, vec3 v, float last, vec3 dest)
|
||||||
|
|
||||||
multiply vector with mat4's mat3 part(rotation)
|
| multiply **vec3** with **mat4** and get **vec3** as result
|
||||||
|
|
|
||||||
|
| actually the result is **vec4**, after multiplication,
|
||||||
|
the last component is trimmed, if you need the result's last component
|
||||||
|
then don't use this function and consider to use **glm_mat4_mulv()**
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **m** mat4 (left)
|
| *[in]* **m** mat4(affine transform)
|
||||||
| *[in]* **v** vec3 (right, column vector)
|
| *[in]* **v** vec3
|
||||||
| *[out]* **dest** vec3 (result, column vector)
|
| *[in]* **last** 4th item to make it vec4
|
||||||
|
| *[out]* **dest** result vector (vec3)
|
||||||
|
|
||||||
|
.. c:function:: void glm_mat4_trace(mat4 m)
|
||||||
|
|
||||||
|
| sum of the elements on the main diagonal from upper left to the lower right
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **m** matrix
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
trace of matrix
|
||||||
|
|
||||||
|
.. c:function:: void glm_mat4_trace3(mat4 m)
|
||||||
|
|
||||||
|
| trace of matrix (rotation part)
|
||||||
|
| sum of the elements on the main diagonal from upper left to the lower right
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **m** matrix
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
trace of matrix
|
||||||
|
|
||||||
|
.. c:function:: void glm_mat4_quat(mat4 m, versor dest)
|
||||||
|
|
||||||
|
convert mat4's rotation part to quaternion
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **m** affine matrix
|
||||||
|
| *[out]* **dest** destination quaternion
|
||||||
|
|
||||||
.. c:function:: void glm_mat4_transpose_to(mat4 m, mat4 dest)
|
.. c:function:: void glm_mat4_transpose_to(mat4 m, mat4 dest)
|
||||||
|
|
||||||
@@ -229,3 +285,20 @@ Functions documentation
|
|||||||
| *[in, out]* **mat** matrix
|
| *[in, out]* **mat** matrix
|
||||||
| *[in]* **row1** row1
|
| *[in]* **row1** row1
|
||||||
| *[in]* **row2** row2
|
| *[in]* **row2** row2
|
||||||
|
|
||||||
|
.. c:function:: float glm_mat4_rmc(vec4 r, mat4 m, vec4 c)
|
||||||
|
|
||||||
|
| **rmc** stands for **Row** * **Matrix** * **Column**
|
||||||
|
|
||||||
|
| helper for R (row vector) * M (matrix) * C (column vector)
|
||||||
|
|
||||||
|
| the result is scalar because R * M = Matrix1x4 (row vector),
|
||||||
|
| then Matrix1x4 * Vec4 (column vector) = Matrix1x1 (Scalar)
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **r** row vector or matrix1x4
|
||||||
|
| *[in]* **m** matrix4x4
|
||||||
|
| *[in]* **c** column vector or matrix4x1
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
scalar value e.g. Matrix1x1
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ array of matrices:
|
|||||||
|
|
||||||
in this way, passing aray of matrices is same
|
in this way, passing aray of matrices is same
|
||||||
|
|
||||||
Passing / Uniforming Vectors to OpenGL:¶
|
Passing / Uniforming Vectors to OpenGL:
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
You don't need to do extra thing when passing cglm vectors to OpengL or other APIs.
|
You don't need to do extra thing when passing cglm vectors to OpengL or other APIs.
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ versor: 16 byte
|
|||||||
By starting **v0.4.5** cglm provides an option to disable alignment requirement.
|
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.
|
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
|
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 verisons then you
|
to define it in build system. If you use pre-compiled versions then you
|
||||||
have to compile cglm with **CGLM_ALL_UNALIGNED** macro.
|
have to compile cglm with **CGLM_ALL_UNALIGNED** macro.
|
||||||
|
|
||||||
**VERY VERY IMPORTANT:** If you use cglm in multiple projects and
|
**VERY VERY IMPORTANT:** If you use cglm in multiple projects and
|
||||||
@@ -40,3 +40,46 @@ SSE and SSE2 Shuffle Option
|
|||||||
**_mm_shuffle_ps** generates **shufps** instruction even if registers are same.
|
**_mm_shuffle_ps** generates **shufps** instruction even if registers are same.
|
||||||
You can force it to generate **pshufd** instruction by defining
|
You can force it to generate **pshufd** instruction by defining
|
||||||
**CGLM_USE_INT_DOMAIN** macro. As default it is not defined.
|
**CGLM_USE_INT_DOMAIN** macro. As default it is not defined.
|
||||||
|
|
||||||
|
SSE3 and SSE4 Dot Product Options
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
You have to extra options for dot product: **CGLM_SSE4_DOT** and **CGLM_SSE3_DOT**.
|
||||||
|
|
||||||
|
- If **SSE4** is enabled then you can define **CGLM_SSE4_DOT** to force cglm to use **_mm_dp_ps** instruction.
|
||||||
|
- If **SSE3** is enabled then you can define **CGLM_SSE3_DOT** to force cglm to use **_mm_hadd_ps** instructions.
|
||||||
|
|
||||||
|
otherwise cglm will use custom cglm's hadd functions which are optimized too.
|
||||||
|
|
||||||
|
Print Options
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
1. **CGLM_DEFINE_PRINTS**
|
||||||
|
2. **CGLM_NO_PRINTS_NOOP** (use CGLM_DEFINE_PRINTS)
|
||||||
|
|
||||||
|
Inline prints are only enabled in **DEBUG** mode or if **CGLM_DEFINE_PRINTS** is defined.
|
||||||
|
**glmc_** versions will always print too.
|
||||||
|
|
||||||
|
Because **cglm** tried to enable print functions in debug mode and disable them in
|
||||||
|
release/production mode to eliminate printing costs when we do not need them.
|
||||||
|
|
||||||
|
**cglm** checks **DEBUG** or **_DEBUG** macros to test debug mode, if these are not working for you then you can use
|
||||||
|
**CGLM_DEFINE_PRINTS** to force enable, or create a PR to introduce new macro to test against debugging mode.
|
||||||
|
|
||||||
|
If DEBUG mode is not enabled then print functions will be emptied to eliminate print function calls.
|
||||||
|
You can disable this feature too by defining **CGLM_DEFINE_PRINTS** macro top of cglm header
|
||||||
|
or in project/build settings...
|
||||||
|
|
||||||
|
3. **CGLM_PRINT_PRECISION** 5
|
||||||
|
|
||||||
|
precision.
|
||||||
|
|
||||||
|
4. **CGLM_PRINT_MAX_TO_SHORT** 1e5
|
||||||
|
|
||||||
|
if a number is greater than this value then %g will be used, since this is shorten print you won't be able to see high precision.
|
||||||
|
|
||||||
|
5. **CGLM_PRINT_COLOR** "\033[36m"
|
||||||
|
6. **CGLM_PRINT_COLOR_RESET** "\033[0m"
|
||||||
|
|
||||||
|
You can disable colorful print output by defining **CGLM_PRINT_COLOR** and **CGLM_PRINT_COLOR_RESET** as empty macro.
|
||||||
|
Because some terminals may not support colors.
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ Macros:
|
|||||||
Functions:
|
Functions:
|
||||||
|
|
||||||
1. :c:func:`glm_quat_identity`
|
1. :c:func:`glm_quat_identity`
|
||||||
|
#. :c:func:`glm_quat_identity_array`
|
||||||
#. :c:func:`glm_quat_init`
|
#. :c:func:`glm_quat_init`
|
||||||
#. :c:func:`glm_quat`
|
#. :c:func:`glm_quat`
|
||||||
#. :c:func:`glm_quatv`
|
#. :c:func:`glm_quatv`
|
||||||
@@ -70,6 +71,14 @@ Functions documentation
|
|||||||
Parameters:
|
Parameters:
|
||||||
| *[in, out]* **q** quaternion
|
| *[in, out]* **q** quaternion
|
||||||
|
|
||||||
|
.. c:function:: void glm_quat_identity_array(versor * __restrict q, size_t count)
|
||||||
|
|
||||||
|
| make given quaternion array's each element identity quaternion
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in, out]* **q** quat array (must be aligned (16) if alignment is not disabled)
|
||||||
|
| *[in]* **count** count of quaternions
|
||||||
|
|
||||||
.. c:function:: void glm_quat_init(versor q, float x, float y, float z, float w)
|
.. c:function:: void glm_quat_init(versor q, float x, float y, float z, float w)
|
||||||
|
|
||||||
| inits quaternion with given values
|
| inits quaternion with given values
|
||||||
@@ -315,26 +324,24 @@ Functions documentation
|
|||||||
| *[in]* **ori** orientation in world space as quaternion
|
| *[in]* **ori** orientation in world space as quaternion
|
||||||
| *[out]* **dest** result matrix
|
| *[out]* **dest** result matrix
|
||||||
|
|
||||||
.. c:function:: void glm_quat_for(vec3 dir, vec3 fwd, vec3 up, versor dest)
|
.. c:function:: void glm_quat_for(vec3 dir, vec3 up, versor dest)
|
||||||
|
|
||||||
| creates look rotation quaternion
|
| creates look rotation quaternion
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **dir** direction to look
|
| *[in]* **dir** direction to look
|
||||||
| *[in]* **fwd** forward vector
|
|
||||||
| *[in]* **up** up vector
|
| *[in]* **up** up vector
|
||||||
| *[out]* **dest** result matrix
|
| *[out]* **dest** result matrix
|
||||||
|
|
||||||
.. c:function:: void glm_quat_forp(vec3 from, vec3 to, vec3 fwd, vec3 up, versor dest)
|
.. c:function:: void glm_quat_forp(vec3 from, vec3 to, vec3 up, versor dest)
|
||||||
|
|
||||||
| creates look rotation quaternion using source and destination positions p suffix stands for position
|
| creates look rotation quaternion using source and destination positions p suffix stands for position
|
||||||
|
|
||||||
| this is similar to glm_quat_for except this computes direction for glm_quat_for for you.
|
| this is similar to glm_quat_for except this computes direction for glm_quat_for for you.
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **from** source point
|
| *[in]* **from** source point
|
||||||
| *[in]* **to** destination point
|
| *[in]* **to** destination point
|
||||||
| *[in]* **fwd** forward vector
|
|
||||||
| *[in]* **up** up vector
|
| *[in]* **up** up vector
|
||||||
| *[out]* **dest** result matrix
|
| *[out]* **dest** result matrix
|
||||||
|
|
||||||
@@ -367,7 +374,7 @@ Functions documentation
|
|||||||
| *[in]* **q** quaternion
|
| *[in]* **q** quaternion
|
||||||
| *[in]* **pivot** pivot
|
| *[in]* **pivot** pivot
|
||||||
|
|
||||||
.. c:function:: void glm_quat_rotate(mat4 m, versor q, mat4 dest)
|
.. c:function:: void glm_quat_rotate_atm(mat4 m, versor q, vec3 pivot)
|
||||||
|
|
||||||
| rotate NEW transform matrix using quaternion at pivot point
|
| rotate NEW transform matrix using quaternion at pivot point
|
||||||
| this creates rotation matrix, it assumes you don't have a matrix
|
| this creates rotation matrix, it assumes you don't have a matrix
|
||||||
|
|||||||
31
docs/source/ray.rst
Normal file
31
docs/source/ray.rst
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
.. default-domain:: C
|
||||||
|
|
||||||
|
ray
|
||||||
|
====
|
||||||
|
|
||||||
|
Header: cglm/ray.h
|
||||||
|
|
||||||
|
This is for collision-checks used by ray-tracers and the like.
|
||||||
|
|
||||||
|
Table of contents (click to go):
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Functions:
|
||||||
|
|
||||||
|
1. :c:func:`glm_ray_triangle`
|
||||||
|
|
||||||
|
Functions documentation
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
.. c:function:: bool glm_ray_triangle(vec3 origin, vec3 direction, vec3 v0, vec3 v1, vec3 v2, float *d)
|
||||||
|
|
||||||
|
Möller–Trumbore ray-triangle intersection algorithm
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **origin** origin of ray
|
||||||
|
| *[in]* **direction** direction of ray
|
||||||
|
| *[in]* **v0** first vertex of triangle
|
||||||
|
| *[in]* **v1** second vertex of triangle
|
||||||
|
| *[in]* **v2** third vertex of triangle
|
||||||
|
| *[in, out]* **d** float pointer to save distance to intersection
|
||||||
|
| *[out]* **intersection** whether there is intersection
|
||||||
74
docs/source/sphere.rst
Normal file
74
docs/source/sphere.rst
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
.. default-domain:: C
|
||||||
|
|
||||||
|
Sphere
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
Header: cglm/sphere.h
|
||||||
|
|
||||||
|
**Definition of sphere:**
|
||||||
|
|
||||||
|
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
|
||||||
|
defines center of sphere.
|
||||||
|
|
||||||
|
Table of contents (click to go):
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Functions:
|
||||||
|
|
||||||
|
1. :c:func:`glm_sphere_radii`
|
||||||
|
#. :c:func:`glm_sphere_transform`
|
||||||
|
#. :c:func:`glm_sphere_merge`
|
||||||
|
#. :c:func:`glm_sphere_sphere`
|
||||||
|
#. :c:func:`glm_sphere_point`
|
||||||
|
|
||||||
|
Functions documentation
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
.. c:function:: float glm_sphere_radii(vec4 s)
|
||||||
|
|
||||||
|
| helper for getting sphere radius
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **s** sphere
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
returns radii
|
||||||
|
|
||||||
|
.. c:function:: void glm_sphere_transform(vec4 s, mat4 m, vec4 dest)
|
||||||
|
|
||||||
|
| apply transform to sphere, it is just wrapper for glm_mat4_mulv3
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **s** sphere
|
||||||
|
| *[in]* **m** transform matrix
|
||||||
|
| *[out]* **dest** transformed sphere
|
||||||
|
|
||||||
|
.. c:function:: void glm_sphere_merge(vec4 s1, vec4 s2, vec4 dest)
|
||||||
|
|
||||||
|
| merges two spheres and creates a new one
|
||||||
|
|
||||||
|
two sphere must be in same space, for instance if one in world space then
|
||||||
|
the other must be in world space too, not in local space.
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **s1** sphere 1
|
||||||
|
| *[in]* **s2** sphere 2
|
||||||
|
| *[out]* **dest** merged/extended sphere
|
||||||
|
|
||||||
|
.. c:function:: bool glm_sphere_sphere(vec4 s1, vec4 s2)
|
||||||
|
|
||||||
|
| check if two sphere intersects
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **s1** sphere
|
||||||
|
| *[in]* **s2** other sphere
|
||||||
|
|
||||||
|
.. c:function:: bool glm_sphere_point(vec4 s, vec3 point)
|
||||||
|
|
||||||
|
| check if sphere intersects with point
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **s** sphere
|
||||||
|
| *[in]* **point** point
|
||||||
@@ -57,12 +57,19 @@ For instance you may called **glm_vec4_** functions for **vec3** data type.
|
|||||||
It will try to write 32 byte but since **vec3** is 24 byte it should throw
|
It will try to write 32 byte but since **vec3** is 24 byte it should throw
|
||||||
memory access error or exit the app without saying anything.
|
memory access error or exit the app without saying anything.
|
||||||
|
|
||||||
|
**UPDATE - IMPORTANT:**
|
||||||
|
|
||||||
|
| On MSVC or some other compilers, if alignment is enabled (default) then double check alignment requirements if you got a crash.
|
||||||
|
|
||||||
|
| If you send GLM_VEC4_ONE or similar macros directly to a function, it may be crashed.
|
||||||
|
| Because compiler may not apply alignment as defined on **typedef** to that macro while passing it (on stack) to a function.
|
||||||
|
|
||||||
Wrong Results:
|
Wrong Results:
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
Again, you may used wrong function.
|
Again, you may used wrong function.
|
||||||
|
|
||||||
For instance if you use **glm_normalize()** or **glm_vec_normalize()** for **vec4**,
|
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**.
|
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.
|
Since you need to **vec4** to be normalized in your case, you will get wrong results.
|
||||||
|
|
||||||
@@ -73,6 +80,19 @@ So be carefull, when your IDE (Xcode, Visual Studio ...) tried to autocomplete f
|
|||||||
|
|
||||||
**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
|
||||||
|
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...
|
||||||
|
|
||||||
|
Check alignment, supported vector extension or simd in **cglm** and linked projects...
|
||||||
|
|
||||||
Other Issues?
|
Other Issues?
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ Functions:
|
|||||||
#. :c:func:`glm_max`
|
#. :c:func:`glm_max`
|
||||||
#. :c:func:`glm_clamp`
|
#. :c:func:`glm_clamp`
|
||||||
#. :c:func:`glm_lerp`
|
#. :c:func:`glm_lerp`
|
||||||
|
#. :c:func:`glm_swapf`
|
||||||
|
|
||||||
Functions documentation
|
Functions documentation
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
@@ -136,3 +137,46 @@ Functions documentation
|
|||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
interpolated value
|
interpolated value
|
||||||
|
|
||||||
|
.. c:function:: bool glm_eq(float a, float b)
|
||||||
|
|
||||||
|
check if two float equal with using EPSILON
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **a** a
|
||||||
|
| *[in]* **b** b
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
true if a and b are equal
|
||||||
|
|
||||||
|
.. c:function:: float glm_percent(float from, float to, float current)
|
||||||
|
|
||||||
|
percentage of current value between start and end value
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **from** from value
|
||||||
|
| *[in]* **to** to value
|
||||||
|
| *[in]* **current** value between from and to values
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
percentage of current value
|
||||||
|
|
||||||
|
.. c:function:: float glm_percentc(float from, float to, float current)
|
||||||
|
|
||||||
|
clamped percentage of current value between start and end value
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **from** from value
|
||||||
|
| *[in]* **to** to value
|
||||||
|
| *[in]* **current** value between from and to values
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
clamped normalized percent (0-100 in 0-1)
|
||||||
|
|
||||||
|
.. c:function:: void glm_swapf(float *a, float *b)
|
||||||
|
|
||||||
|
swap two float values
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **a** float 1
|
||||||
|
| *[in]* **b** float 2
|
||||||
|
|||||||
134
docs/source/vec2-ext.rst
Normal file
134
docs/source/vec2-ext.rst
Normal file
@@ -0,0 +1,134 @@
|
|||||||
|
.. default-domain:: C
|
||||||
|
|
||||||
|
vec2 extra
|
||||||
|
==========
|
||||||
|
|
||||||
|
Header: cglm/vec2-ext.h
|
||||||
|
|
||||||
|
There are some functions are in called in extra header. These are called extra
|
||||||
|
because they are not used like other functions in vec2.h in the future some of
|
||||||
|
these functions ma be moved to vec2 header.
|
||||||
|
|
||||||
|
Table of contents (click to go):
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Functions:
|
||||||
|
|
||||||
|
1. :c:func:`glm_vec2_fill`
|
||||||
|
#. :c:func:`glm_vec2_eq`
|
||||||
|
#. :c:func:`glm_vec2_eq_eps`
|
||||||
|
#. :c:func:`glm_vec2_eq_all`
|
||||||
|
#. :c:func:`glm_vec2_eqv`
|
||||||
|
#. :c:func:`glm_vec2_eqv_eps`
|
||||||
|
#. :c:func:`glm_vec2_max`
|
||||||
|
#. :c:func:`glm_vec2_min`
|
||||||
|
#. :c:func:`glm_vec2_isnan`
|
||||||
|
#. :c:func:`glm_vec2_isinf`
|
||||||
|
#. :c:func:`glm_vec2_isvalid`
|
||||||
|
#. :c:func:`glm_vec2_sign`
|
||||||
|
#. :c:func:`glm_vec2_sqrt`
|
||||||
|
|
||||||
|
Functions documentation
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_fill(vec2 v, float val)
|
||||||
|
|
||||||
|
fill a vector with specified value
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in,out]* **dest** destination
|
||||||
|
| *[in]* **val** value
|
||||||
|
|
||||||
|
|
||||||
|
.. c:function:: bool glm_vec2_eq(vec2 v, float val)
|
||||||
|
|
||||||
|
check if vector is equal to value (without epsilon)
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
| *[in]* **val** value
|
||||||
|
|
||||||
|
.. c:function:: bool glm_vec2_eq_eps(vec2 v, float val)
|
||||||
|
|
||||||
|
check if vector is equal to value (with epsilon)
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
| *[in]* **val** value
|
||||||
|
|
||||||
|
.. c:function:: bool glm_vec2_eq_all(vec2 v)
|
||||||
|
|
||||||
|
check if vectors members are equal (without epsilon)
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
|
||||||
|
.. c:function:: bool glm_vec2_eqv(vec2 v1, vec2 v2)
|
||||||
|
|
||||||
|
check if vector is equal to another (without epsilon) vector
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **vec** vector 1
|
||||||
|
| *[in]* **vec** vector 2
|
||||||
|
|
||||||
|
.. c:function:: bool glm_vec2_eqv_eps(vec2 v1, vec2 v2)
|
||||||
|
|
||||||
|
check if vector is equal to another (with epsilon)
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v1** vector1
|
||||||
|
| *[in]* **v2** vector2
|
||||||
|
|
||||||
|
.. c:function:: float glm_vec2_max(vec2 v)
|
||||||
|
|
||||||
|
max value of vector
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
|
||||||
|
.. c:function:: float glm_vec2_min(vec2 v)
|
||||||
|
|
||||||
|
min value of vector
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
|
||||||
|
.. c:function:: bool glm_vec2_isnan(vec2 v)
|
||||||
|
|
||||||
|
| check if one of items is NaN (not a number)
|
||||||
|
| you should only use this in DEBUG mode or very critical asserts
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
|
||||||
|
.. c:function:: bool glm_vec2_isinf(vec2 v)
|
||||||
|
|
||||||
|
| check if one of items is INFINITY
|
||||||
|
| you should only use this in DEBUG mode or very critical asserts
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
|
||||||
|
.. c:function:: bool glm_vec2_isvalid(vec2 v)
|
||||||
|
|
||||||
|
| check if all items are valid number
|
||||||
|
| you should only use this in DEBUG mode or very critical asserts
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_sign(vec2 v, vec2 dest)
|
||||||
|
|
||||||
|
get sign of 32 bit float as +1, -1, 0
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
| *[out]* **dest** sign vector (only keeps signs as -1, 0, -1)
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_sqrt(vec2 v, vec2 dest)
|
||||||
|
|
||||||
|
square root of each vector item
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
| *[out]* **dest** destination vector (sqrt(v))
|
||||||
375
docs/source/vec2.rst
Normal file
375
docs/source/vec2.rst
Normal file
@@ -0,0 +1,375 @@
|
|||||||
|
.. default-domain:: C
|
||||||
|
|
||||||
|
vec2
|
||||||
|
====
|
||||||
|
|
||||||
|
Header: cglm/vec2.h
|
||||||
|
|
||||||
|
Table of contents (click to go):
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Macros:
|
||||||
|
|
||||||
|
1. GLM_vec2_ONE_INIT
|
||||||
|
#. GLM_vec2_ZERO_INIT
|
||||||
|
#. GLM_vec2_ONE
|
||||||
|
#. GLM_vec2_ZERO
|
||||||
|
|
||||||
|
Functions:
|
||||||
|
|
||||||
|
1. :c:func:`glm_vec2`
|
||||||
|
#. :c:func:`glm_vec2_copy`
|
||||||
|
#. :c:func:`glm_vec2_zero`
|
||||||
|
#. :c:func:`glm_vec2_one`
|
||||||
|
#. :c:func:`glm_vec2_dot`
|
||||||
|
#. :c:func:`glm_vec2_cross`
|
||||||
|
#. :c:func:`glm_vec2_norm2`
|
||||||
|
#. :c:func:`glm_vec2_norm`
|
||||||
|
#. :c:func:`glm_vec2_add`
|
||||||
|
#. :c:func:`glm_vec2_adds`
|
||||||
|
#. :c:func:`glm_vec2_sub`
|
||||||
|
#. :c:func:`glm_vec2_subs`
|
||||||
|
#. :c:func:`glm_vec2_mul`
|
||||||
|
#. :c:func:`glm_vec2_scale`
|
||||||
|
#. :c:func:`glm_vec2_scale_as`
|
||||||
|
#. :c:func:`glm_vec2_div`
|
||||||
|
#. :c:func:`glm_vec2_divs`
|
||||||
|
#. :c:func:`glm_vec2_addadd`
|
||||||
|
#. :c:func:`glm_vec2_subadd`
|
||||||
|
#. :c:func:`glm_vec2_muladd`
|
||||||
|
#. :c:func:`glm_vec2_muladds`
|
||||||
|
#. :c:func:`glm_vec2_maxadd`
|
||||||
|
#. :c:func:`glm_vec2_minadd`
|
||||||
|
#. :c:func:`glm_vec2_negate`
|
||||||
|
#. :c:func:`glm_vec2_negate_to`
|
||||||
|
#. :c:func:`glm_vec2_normalize`
|
||||||
|
#. :c:func:`glm_vec2_normalize_to`
|
||||||
|
#. :c:func:`glm_vec2_rotate`
|
||||||
|
#. :c:func:`glm_vec2_distance2`
|
||||||
|
#. :c:func:`glm_vec2_distance`
|
||||||
|
#. :c:func:`glm_vec2_maxv`
|
||||||
|
#. :c:func:`glm_vec2_minv`
|
||||||
|
#. :c:func:`glm_vec2_clamp`
|
||||||
|
#. :c:func:`glm_vec2_lerp`
|
||||||
|
|
||||||
|
Functions documentation
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2(float * v, vec2 dest)
|
||||||
|
|
||||||
|
init vec2 using vec3 or vec4
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
| *[out]* **dest** destination
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_copy(vec2 a, vec2 dest)
|
||||||
|
|
||||||
|
copy all members of [a] to [dest]
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **a** source
|
||||||
|
| *[out]* **dest** destination
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_zero(vec2 v)
|
||||||
|
|
||||||
|
makes all members 0.0f (zero)
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in, out]* **v** vector
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_one(vec2 v)
|
||||||
|
|
||||||
|
makes all members 1.0f (one)
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in, out]* **v** vector
|
||||||
|
|
||||||
|
.. c:function:: float glm_vec2_dot(vec2 a, vec2 b)
|
||||||
|
|
||||||
|
dot product of vec2
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **a** vector1
|
||||||
|
| *[in]* **b** vector2
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
dot product
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_cross(vec2 a, vec2 b, vec2 d)
|
||||||
|
|
||||||
|
cross product of two vector (RH)
|
||||||
|
|
||||||
|
| ref: http://allenchou.net/2013/07/cross-product-of-2d-vectors/
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **a** vector 1
|
||||||
|
| *[in]* **b** vector 2
|
||||||
|
| *[out]* **dest** destination
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Z component of cross product
|
||||||
|
|
||||||
|
.. c:function:: float glm_vec2_norm2(vec2 v)
|
||||||
|
|
||||||
|
norm * norm (magnitude) of vector
|
||||||
|
|
||||||
|
we can use this func instead of calling norm * norm, because it would call
|
||||||
|
sqrtf fuction twice but with this func we can avoid func call, maybe this is
|
||||||
|
not good name for this func
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
square of norm / magnitude
|
||||||
|
|
||||||
|
.. c:function:: float glm_vec2_norm(vec2 vec)
|
||||||
|
|
||||||
|
| euclidean norm (magnitude), also called L2 norm
|
||||||
|
| this will give magnitude of vector in euclidean space
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **vec** vector
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_add(vec2 a, vec2 b, vec2 dest)
|
||||||
|
|
||||||
|
add a vector to b vector store result in dest
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **a** vector1
|
||||||
|
| *[in]* **b** vector2
|
||||||
|
| *[out]* **dest** destination vector
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_adds(vec2 a, float s, vec2 dest)
|
||||||
|
|
||||||
|
add scalar to v vector store result in dest (d = v + vec(s))
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
| *[in]* **s** scalar
|
||||||
|
| *[out]* **dest** destination vector
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_sub(vec2 v1, vec2 v2, vec2 dest)
|
||||||
|
|
||||||
|
subtract b vector from a vector store result in dest (d = v1 - v2)
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **a** vector1
|
||||||
|
| *[in]* **b** vector2
|
||||||
|
| *[out]* **dest** destination vector
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_subs(vec2 v, float s, vec2 dest)
|
||||||
|
|
||||||
|
subtract scalar from v vector store result in dest (d = v - vec(s))
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
| *[in]* **s** scalar
|
||||||
|
| *[out]* **dest** destination vector
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_mul(vec2 a, vec2 b, vec2 d)
|
||||||
|
|
||||||
|
multiply two vector (component-wise multiplication)
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **a** vector
|
||||||
|
| *[in]* **b** scalar
|
||||||
|
| *[out]* **d** result = (a[0] * b[0], a[1] * b[1], a[2] * b[2])
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_scale(vec2 v, float s, vec2 dest)
|
||||||
|
|
||||||
|
multiply/scale vec2 vector with scalar: result = v * s
|
||||||
|
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
| *[in]* **s** scalar
|
||||||
|
| *[out]* **dest** destination vector
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_scale_as(vec2 v, float s, vec2 dest)
|
||||||
|
|
||||||
|
make vec2 vector scale as specified: result = unit(v) * s
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
| *[in]* **s** scalar
|
||||||
|
| *[out]* **dest** destination vector
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_div(vec2 a, vec2 b, vec2 dest)
|
||||||
|
|
||||||
|
div vector with another component-wise division: d = a / b
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **a** vector 1
|
||||||
|
| *[in]* **b** vector 2
|
||||||
|
| *[out]* **dest** result = (a[0] / b[0], a[1] / b[1], a[2] / b[2])
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_divs(vec2 v, float s, vec2 dest)
|
||||||
|
|
||||||
|
div vector with scalar: d = v / s
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
| *[in]* **s** scalar
|
||||||
|
| *[out]* **dest** result = (a[0] / s, a[1] / s, a[2] / s])
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_addadd(vec2 a, vec2 b, vec2 dest)
|
||||||
|
|
||||||
|
| add two vectors and add result to sum
|
||||||
|
| it applies += operator so dest must be initialized
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **a** vector 1
|
||||||
|
| *[in]* **b** vector 2
|
||||||
|
| *[out]* **dest** dest += (a + b)
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_subadd(vec2 a, vec2 b, vec2 dest)
|
||||||
|
|
||||||
|
| sub two vectors and add result to sum
|
||||||
|
| it applies += operator so dest must be initialized
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **a** vector 1
|
||||||
|
| *[in]* **b** vector 2
|
||||||
|
| *[out]* **dest** dest += (a - b)
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_muladd(vec2 a, vec2 b, vec2 dest)
|
||||||
|
|
||||||
|
| mul two vectors and add result to sum
|
||||||
|
| it applies += operator so dest must be initialized
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **a** vector 1
|
||||||
|
| *[in]* **b** vector 2
|
||||||
|
| *[out]* **dest** dest += (a * b)
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_muladds(vec2 a, float s, vec2 dest)
|
||||||
|
|
||||||
|
| mul vector with scalar and add result to sum
|
||||||
|
| it applies += operator so dest must be initialized
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **a** vector
|
||||||
|
| *[in]* **s** scalar
|
||||||
|
| *[out]* **dest** dest += (a * b)
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_maxadd(vec2 a, vec2 b, vec2 dest)
|
||||||
|
|
||||||
|
| add max of two vector to result/dest
|
||||||
|
| it applies += operator so dest must be initialized
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **a** vector 1
|
||||||
|
| *[in]* **b** vector 2
|
||||||
|
| *[out]* **dest** dest += (a * b)
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_minadd(vec2 a, vec2 b, vec2 dest)
|
||||||
|
|
||||||
|
| add min of two vector to result/dest
|
||||||
|
| it applies += operator so dest must be initialized
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **a** vector 1
|
||||||
|
| *[in]* **b** vector 2
|
||||||
|
| *[out]* **dest** dest += (a * b)
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_negate(vec2 v)
|
||||||
|
|
||||||
|
negate vector components
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in, out]* **v** vector
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_negate_to(vec2 v, vec2 dest)
|
||||||
|
|
||||||
|
negate vector components and store result in dest
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
| *[out]* **dest** negated vector
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_normalize(vec2 v)
|
||||||
|
|
||||||
|
normalize vec2 and store result in same vec
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in, out]* **v** vector
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_normalize_to(vec2 vec, vec2 dest)
|
||||||
|
|
||||||
|
normalize vec2 to dest
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **vec** source
|
||||||
|
| *[out]* **dest** destination
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_rotate(vec2 v, float angle, vec2 dest)
|
||||||
|
|
||||||
|
rotate vec2 around axis by angle using Rodrigues' rotation formula
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
| *[in]* **axis** axis vector
|
||||||
|
| *[out]* **dest** destination
|
||||||
|
|
||||||
|
.. c:function:: float glm_vec2_distance2(vec2 v1, vec2 v2)
|
||||||
|
|
||||||
|
squared distance between two vectors
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **mat** vector1
|
||||||
|
| *[in]* **row1** vector2
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
| squared distance (distance * distance)
|
||||||
|
|
||||||
|
.. c:function:: float glm_vec2_distance(vec2 v1, vec2 v2)
|
||||||
|
|
||||||
|
distance between two vectors
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **mat** vector1
|
||||||
|
| *[in]* **row1** vector2
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
| distance
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_maxv(vec2 v1, vec2 v2, vec2 dest)
|
||||||
|
|
||||||
|
max values of vectors
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v1** vector1
|
||||||
|
| *[in]* **v2** vector2
|
||||||
|
| *[out]* **dest** destination
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_minv(vec2 v1, vec2 v2, vec2 dest)
|
||||||
|
|
||||||
|
min values of vectors
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v1** vector1
|
||||||
|
| *[in]* **v2** vector2
|
||||||
|
| *[out]* **dest** destination
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_clamp(vec2 v, float minVal, float maxVal)
|
||||||
|
|
||||||
|
constrain a value to lie between two further values
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in, out]* **v** vector
|
||||||
|
| *[in]* **minVal** minimum value
|
||||||
|
| *[in]* **maxVal** maximum value
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_lerp(vec2 from, vec2 to, float t, vec2 dest)
|
||||||
|
|
||||||
|
linear interpolation between two vector
|
||||||
|
|
||||||
|
| formula: from + s * (to - from)
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **from** from value
|
||||||
|
| *[in]* **to** to value
|
||||||
|
| *[in]* **t** interpolant (amount) clamped between 0 and 1
|
||||||
|
| *[out]* **dest** destination
|
||||||
@@ -14,25 +14,25 @@ Table of contents (click to go):
|
|||||||
|
|
||||||
Functions:
|
Functions:
|
||||||
|
|
||||||
1. :c:func:`glm_vec_mulv`
|
1. :c:func:`glm_vec3_mulv`
|
||||||
#. :c:func:`glm_vec_broadcast`
|
#. :c:func:`glm_vec3_broadcast`
|
||||||
#. :c:func:`glm_vec_eq`
|
#. :c:func:`glm_vec3_eq`
|
||||||
#. :c:func:`glm_vec_eq_eps`
|
#. :c:func:`glm_vec3_eq_eps`
|
||||||
#. :c:func:`glm_vec_eq_all`
|
#. :c:func:`glm_vec3_eq_all`
|
||||||
#. :c:func:`glm_vec_eqv`
|
#. :c:func:`glm_vec3_eqv`
|
||||||
#. :c:func:`glm_vec_eqv_eps`
|
#. :c:func:`glm_vec3_eqv_eps`
|
||||||
#. :c:func:`glm_vec_max`
|
#. :c:func:`glm_vec3_max`
|
||||||
#. :c:func:`glm_vec_min`
|
#. :c:func:`glm_vec3_min`
|
||||||
#. :c:func:`glm_vec_isnan`
|
#. :c:func:`glm_vec3_isnan`
|
||||||
#. :c:func:`glm_vec_isinf`
|
#. :c:func:`glm_vec3_isinf`
|
||||||
#. :c:func:`glm_vec_isvalid`
|
#. :c:func:`glm_vec3_isvalid`
|
||||||
#. :c:func:`glm_vec_sign`
|
#. :c:func:`glm_vec3_sign`
|
||||||
#. :c:func:`glm_vec_sqrt`
|
#. :c:func:`glm_vec3_sqrt`
|
||||||
|
|
||||||
Functions documentation
|
Functions documentation
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
.. c:function:: void glm_vec_mulv(vec3 a, vec3 b, vec3 d)
|
.. c:function:: void glm_vec3_mulv(vec3 a, vec3 b, vec3 d)
|
||||||
|
|
||||||
multiplies individual items
|
multiplies individual items
|
||||||
|
|
||||||
@@ -41,7 +41,7 @@ Functions documentation
|
|||||||
| *[in]* **b** vec2
|
| *[in]* **b** vec2
|
||||||
| *[out]* **d** destination (v1[0] * v2[0], v1[1] * v2[1], v1[2] * v2[2])
|
| *[out]* **d** destination (v1[0] * v2[0], v1[1] * v2[1], v1[2] * v2[2])
|
||||||
|
|
||||||
.. c:function:: void glm_vec_broadcast(float val, vec3 d)
|
.. c:function:: void glm_vec3_broadcast(float val, vec3 d)
|
||||||
|
|
||||||
fill a vector with specified value
|
fill a vector with specified value
|
||||||
|
|
||||||
@@ -49,7 +49,7 @@ Functions documentation
|
|||||||
| *[in]* **val** value
|
| *[in]* **val** value
|
||||||
| *[out]* **dest** destination
|
| *[out]* **dest** destination
|
||||||
|
|
||||||
.. c:function:: bool glm_vec_eq(vec3 v, float val)
|
.. c:function:: bool glm_vec3_eq(vec3 v, float val)
|
||||||
|
|
||||||
check if vector is equal to value (without epsilon)
|
check if vector is equal to value (without epsilon)
|
||||||
|
|
||||||
@@ -57,7 +57,7 @@ Functions documentation
|
|||||||
| *[in]* **v** vector
|
| *[in]* **v** vector
|
||||||
| *[in]* **val** value
|
| *[in]* **val** value
|
||||||
|
|
||||||
.. c:function:: bool glm_vec_eq_eps(vec3 v, float val)
|
.. c:function:: bool glm_vec3_eq_eps(vec3 v, float val)
|
||||||
|
|
||||||
check if vector is equal to value (with epsilon)
|
check if vector is equal to value (with epsilon)
|
||||||
|
|
||||||
@@ -65,14 +65,14 @@ Functions documentation
|
|||||||
| *[in]* **v** vector
|
| *[in]* **v** vector
|
||||||
| *[in]* **val** value
|
| *[in]* **val** value
|
||||||
|
|
||||||
.. c:function:: bool glm_vec_eq_all(vec3 v)
|
.. c:function:: bool glm_vec3_eq_all(vec3 v)
|
||||||
|
|
||||||
check if vectors members are equal (without epsilon)
|
check if vectors members are equal (without epsilon)
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **v** vector
|
| *[in]* **v** vector
|
||||||
|
|
||||||
.. c:function:: bool glm_vec_eqv(vec3 v1, vec3 v2)
|
.. c:function:: bool glm_vec3_eqv(vec3 v1, vec3 v2)
|
||||||
|
|
||||||
check if vector is equal to another (without epsilon) vector
|
check if vector is equal to another (without epsilon) vector
|
||||||
|
|
||||||
@@ -80,7 +80,7 @@ Functions documentation
|
|||||||
| *[in]* **vec** vector 1
|
| *[in]* **vec** vector 1
|
||||||
| *[in]* **vec** vector 2
|
| *[in]* **vec** vector 2
|
||||||
|
|
||||||
.. c:function:: bool glm_vec_eqv_eps(vec3 v1, vec3 v2)
|
.. c:function:: bool glm_vec3_eqv_eps(vec3 v1, vec3 v2)
|
||||||
|
|
||||||
check if vector is equal to another (with epsilon)
|
check if vector is equal to another (with epsilon)
|
||||||
|
|
||||||
@@ -88,21 +88,21 @@ Functions documentation
|
|||||||
| *[in]* **v1** vector1
|
| *[in]* **v1** vector1
|
||||||
| *[in]* **v2** vector2
|
| *[in]* **v2** vector2
|
||||||
|
|
||||||
.. c:function:: float glm_vec_max(vec3 v)
|
.. c:function:: float glm_vec3_max(vec3 v)
|
||||||
|
|
||||||
max value of vector
|
max value of vector
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **v** vector
|
| *[in]* **v** vector
|
||||||
|
|
||||||
.. c:function:: float glm_vec_min(vec3 v)
|
.. c:function:: float glm_vec3_min(vec3 v)
|
||||||
|
|
||||||
min value of vector
|
min value of vector
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **v** vector
|
| *[in]* **v** vector
|
||||||
|
|
||||||
.. c:function:: bool glm_vec_isnan(vec3 v)
|
.. c:function:: bool glm_vec3_isnan(vec3 v)
|
||||||
|
|
||||||
| check if one of items is NaN (not a number)
|
| check if one of items is NaN (not a number)
|
||||||
| you should only use this in DEBUG mode or very critical asserts
|
| you should only use this in DEBUG mode or very critical asserts
|
||||||
@@ -110,7 +110,7 @@ Functions documentation
|
|||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **v** vector
|
| *[in]* **v** vector
|
||||||
|
|
||||||
.. c:function:: bool glm_vec_isinf(vec3 v)
|
.. c:function:: bool glm_vec3_isinf(vec3 v)
|
||||||
|
|
||||||
| check if one of items is INFINITY
|
| check if one of items is INFINITY
|
||||||
| you should only use this in DEBUG mode or very critical asserts
|
| you should only use this in DEBUG mode or very critical asserts
|
||||||
@@ -118,7 +118,7 @@ Functions documentation
|
|||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **v** vector
|
| *[in]* **v** vector
|
||||||
|
|
||||||
.. c:function:: bool glm_vec_isvalid(vec3 v)
|
.. c:function:: bool glm_vec3_isvalid(vec3 v)
|
||||||
|
|
||||||
| check if all items are valid number
|
| check if all items are valid number
|
||||||
| you should only use this in DEBUG mode or very critical asserts
|
| you should only use this in DEBUG mode or very critical asserts
|
||||||
@@ -126,7 +126,7 @@ Functions documentation
|
|||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **v** vector
|
| *[in]* **v** vector
|
||||||
|
|
||||||
.. c:function:: void glm_vec_sign(vec3 v, vec3 dest)
|
.. c:function:: void glm_vec3_sign(vec3 v, vec3 dest)
|
||||||
|
|
||||||
get sign of 32 bit float as +1, -1, 0
|
get sign of 32 bit float as +1, -1, 0
|
||||||
|
|
||||||
@@ -134,7 +134,7 @@ Functions documentation
|
|||||||
| *[in]* **v** vector
|
| *[in]* **v** vector
|
||||||
| *[out]* **dest** sign vector (only keeps signs as -1, 0, -1)
|
| *[out]* **dest** sign vector (only keeps signs as -1, 0, -1)
|
||||||
|
|
||||||
.. c:function:: void glm_vec_sqrt(vec3 v, vec3 dest)
|
.. c:function:: void glm_vec3_sqrt(vec3 v, vec3 dest)
|
||||||
|
|
||||||
square root of each vector item
|
square root of each vector item
|
||||||
|
|
||||||
|
|||||||
@@ -5,9 +5,14 @@ vec3
|
|||||||
|
|
||||||
Header: cglm/vec3.h
|
Header: cglm/vec3.h
|
||||||
|
|
||||||
|
**Important:** *cglm* was used **glm_vec_** namespace for vec3 functions until
|
||||||
|
**v0.5.0**, since **v0.5.0** cglm uses **glm_vec3_** namespace for vec3.
|
||||||
|
|
||||||
|
Also `glm_vec3_flipsign` has been renamed to `glm_vec3_negate`
|
||||||
|
|
||||||
We mostly use vectors in graphics math, to make writing code faster
|
We mostly use vectors in graphics math, to make writing code faster
|
||||||
and easy to read, some *vec3* functions are aliased in global namespace.
|
and easy to read, some *vec3* functions are aliased in global namespace.
|
||||||
For instance :c:func:`glm_dot` is alias of :c:func:`glm_vec_dot`,
|
For instance :c:func:`glm_dot` is alias of :c:func:`glm_vec3_dot`,
|
||||||
alias means inline wrapper here. There is no call verison of alias functions
|
alias means inline wrapper here. There is no call verison of alias functions
|
||||||
|
|
||||||
There are also functions for rotating *vec3* vector. **_m4**, **_m3** prefixes
|
There are also functions for rotating *vec3* vector. **_m4**, **_m3** prefixes
|
||||||
@@ -18,7 +23,7 @@ Table of contents (click to go):
|
|||||||
|
|
||||||
Macros:
|
Macros:
|
||||||
|
|
||||||
1. glm_vec_dup(v, dest)
|
1. glm_vec3_dup(v, dest)
|
||||||
#. GLM_VEC3_ONE_INIT
|
#. GLM_VEC3_ONE_INIT
|
||||||
#. GLM_VEC3_ZERO_INIT
|
#. GLM_VEC3_ZERO_INIT
|
||||||
#. GLM_VEC3_ONE
|
#. GLM_VEC3_ONE
|
||||||
@@ -30,44 +35,50 @@ Macros:
|
|||||||
Functions:
|
Functions:
|
||||||
|
|
||||||
1. :c:func:`glm_vec3`
|
1. :c:func:`glm_vec3`
|
||||||
#. :c:func:`glm_vec_copy`
|
#. :c:func:`glm_vec3_copy`
|
||||||
#. :c:func:`glm_vec_zero`
|
#. :c:func:`glm_vec3_zero`
|
||||||
#. :c:func:`glm_vec_one`
|
#. :c:func:`glm_vec3_one`
|
||||||
#. :c:func:`glm_vec_dot`
|
#. :c:func:`glm_vec3_dot`
|
||||||
#. :c:func:`glm_vec_cross`
|
#. :c:func:`glm_vec3_norm2`
|
||||||
#. :c:func:`glm_vec_norm2`
|
#. :c:func:`glm_vec3_norm`
|
||||||
#. :c:func:`glm_vec_norm`
|
#. :c:func:`glm_vec3_add`
|
||||||
#. :c:func:`glm_vec_add`
|
#. :c:func:`glm_vec3_adds`
|
||||||
#. :c:func:`glm_vec_adds`
|
#. :c:func:`glm_vec3_sub`
|
||||||
#. :c:func:`glm_vec_sub`
|
#. :c:func:`glm_vec3_subs`
|
||||||
#. :c:func:`glm_vec_subs`
|
#. :c:func:`glm_vec3_mul`
|
||||||
#. :c:func:`glm_vec_mul`
|
#. :c:func:`glm_vec3_scale`
|
||||||
#. :c:func:`glm_vec_scale`
|
#. :c:func:`glm_vec3_scale_as`
|
||||||
#. :c:func:`glm_vec_scale_as`
|
#. :c:func:`glm_vec3_div`
|
||||||
#. :c:func:`glm_vec_div`
|
#. :c:func:`glm_vec3_divs`
|
||||||
#. :c:func:`glm_vec_divs`
|
#. :c:func:`glm_vec3_addadd`
|
||||||
#. :c:func:`glm_vec_addadd`
|
#. :c:func:`glm_vec3_subadd`
|
||||||
#. :c:func:`glm_vec_subadd`
|
#. :c:func:`glm_vec3_muladd`
|
||||||
#. :c:func:`glm_vec_muladd`
|
#. :c:func:`glm_vec3_muladds`
|
||||||
#. :c:func:`glm_vec_muladds`
|
#. :c:func:`glm_vec3_maxadd`
|
||||||
#. :c:func:`glm_vec_flipsign`
|
#. :c:func:`glm_vec3_minadd`
|
||||||
#. :c:func:`glm_vec_flipsign_to`
|
#. :c:func:`glm_vec3_flipsign`
|
||||||
#. :c:func:`glm_vec_inv`
|
#. :c:func:`glm_vec3_flipsign_to`
|
||||||
#. :c:func:`glm_vec_inv_to`
|
#. :c:func:`glm_vec3_inv`
|
||||||
#. :c:func:`glm_vec_normalize`
|
#. :c:func:`glm_vec3_inv_to`
|
||||||
#. :c:func:`glm_vec_normalize_to`
|
#. :c:func:`glm_vec3_negate`
|
||||||
#. :c:func:`glm_vec_distance`
|
#. :c:func:`glm_vec3_negate_to`
|
||||||
#. :c:func:`glm_vec_angle`
|
#. :c:func:`glm_vec3_normalize`
|
||||||
#. :c:func:`glm_vec_rotate`
|
#. :c:func:`glm_vec3_normalize_to`
|
||||||
#. :c:func:`glm_vec_rotate_m4`
|
#. :c:func:`glm_vec3_cross`
|
||||||
#. :c:func:`glm_vec_rotate_m3`
|
#. :c:func:`glm_vec3_crossn`
|
||||||
#. :c:func:`glm_vec_proj`
|
#. :c:func:`glm_vec3_distance2`
|
||||||
#. :c:func:`glm_vec_center`
|
#. :c:func:`glm_vec3_distance`
|
||||||
#. :c:func:`glm_vec_maxv`
|
#. :c:func:`glm_vec3_angle`
|
||||||
#. :c:func:`glm_vec_minv`
|
#. :c:func:`glm_vec3_rotate`
|
||||||
#. :c:func:`glm_vec_ortho`
|
#. :c:func:`glm_vec3_rotate_m4`
|
||||||
#. :c:func:`glm_vec_clamp`
|
#. :c:func:`glm_vec3_rotate_m3`
|
||||||
#. :c:func:`glm_vec_lerp`
|
#. :c:func:`glm_vec3_proj`
|
||||||
|
#. :c:func:`glm_vec3_center`
|
||||||
|
#. :c:func:`glm_vec3_maxv`
|
||||||
|
#. :c:func:`glm_vec3_minv`
|
||||||
|
#. :c:func:`glm_vec3_ortho`
|
||||||
|
#. :c:func:`glm_vec3_clamp`
|
||||||
|
#. :c:func:`glm_vec3_lerp`
|
||||||
|
|
||||||
Functions documentation
|
Functions documentation
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
@@ -80,7 +91,7 @@ Functions documentation
|
|||||||
| *[in]* **v4** vector4
|
| *[in]* **v4** vector4
|
||||||
| *[out]* **dest** destination
|
| *[out]* **dest** destination
|
||||||
|
|
||||||
.. c:function:: void glm_vec_copy(vec3 a, vec3 dest)
|
.. c:function:: void glm_vec3_copy(vec3 a, vec3 dest)
|
||||||
|
|
||||||
copy all members of [a] to [dest]
|
copy all members of [a] to [dest]
|
||||||
|
|
||||||
@@ -88,21 +99,21 @@ Functions documentation
|
|||||||
| *[in]* **a** source
|
| *[in]* **a** source
|
||||||
| *[out]* **dest** destination
|
| *[out]* **dest** destination
|
||||||
|
|
||||||
.. c:function:: void glm_vec_zero(vec3 v)
|
.. c:function:: void glm_vec3_zero(vec3 v)
|
||||||
|
|
||||||
makes all members 0.0f (zero)
|
makes all members 0.0f (zero)
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in, out]* **v** vector
|
| *[in, out]* **v** vector
|
||||||
|
|
||||||
.. c:function:: void glm_vec_one(vec3 v)
|
.. c:function:: void glm_vec3_one(vec3 v)
|
||||||
|
|
||||||
makes all members 1.0f (one)
|
makes all members 1.0f (one)
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in, out]* **v** vector
|
| *[in, out]* **v** vector
|
||||||
|
|
||||||
.. c:function:: float glm_vec_dot(vec3 a, vec3 b)
|
.. c:function:: float glm_vec3_dot(vec3 a, vec3 b)
|
||||||
|
|
||||||
dot product of vec3
|
dot product of vec3
|
||||||
|
|
||||||
@@ -113,16 +124,25 @@ Functions documentation
|
|||||||
Returns:
|
Returns:
|
||||||
dot product
|
dot product
|
||||||
|
|
||||||
.. c:function:: void glm_vec_cross(vec3 a, vec3 b, vec3 d)
|
.. c:function:: void glm_vec3_cross(vec3 a, vec3 b, vec3 d)
|
||||||
|
|
||||||
cross product
|
cross product of two vector (RH)
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **a** source 1
|
| *[in]* **a** vector 1
|
||||||
| *[in]* **b** source 2
|
| *[in]* **b** vector 2
|
||||||
| *[out]* **d** destination
|
| *[out]* **dest** destination
|
||||||
|
|
||||||
.. c:function:: float glm_vec_norm2(vec3 v)
|
.. c:function:: void glm_vec3_crossn(vec3 a, vec3 b, vec3 dest)
|
||||||
|
|
||||||
|
cross product of two vector (RH) and normalize the result
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **a** vector 1
|
||||||
|
| *[in]* **b** vector 2
|
||||||
|
| *[out]* **dest** destination
|
||||||
|
|
||||||
|
.. c:function:: float glm_vec3_norm2(vec3 v)
|
||||||
|
|
||||||
norm * norm (magnitude) of vector
|
norm * norm (magnitude) of vector
|
||||||
|
|
||||||
@@ -136,14 +156,15 @@ Functions documentation
|
|||||||
Returns:
|
Returns:
|
||||||
square of norm / magnitude
|
square of norm / magnitude
|
||||||
|
|
||||||
.. c:function:: float glm_vec_norm(vec3 vec)
|
.. c:function:: float glm_vec3_norm(vec3 vec)
|
||||||
|
|
||||||
norm (magnitude) of vec3
|
| euclidean norm (magnitude), also called L2 norm
|
||||||
|
| this will give magnitude of vector in euclidean space
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **vec** vector
|
| *[in]* **vec** vector
|
||||||
|
|
||||||
.. c:function:: void glm_vec_add(vec3 a, vec3 b, vec3 dest)
|
.. c:function:: void glm_vec3_add(vec3 a, vec3 b, vec3 dest)
|
||||||
|
|
||||||
add a vector to b vector store result in dest
|
add a vector to b vector store result in dest
|
||||||
|
|
||||||
@@ -152,7 +173,7 @@ Functions documentation
|
|||||||
| *[in]* **b** vector2
|
| *[in]* **b** vector2
|
||||||
| *[out]* **dest** destination vector
|
| *[out]* **dest** destination vector
|
||||||
|
|
||||||
.. c:function:: void glm_vec_adds(vec3 a, float s, vec3 dest)
|
.. c:function:: void glm_vec3_adds(vec3 a, float s, vec3 dest)
|
||||||
|
|
||||||
add scalar to v vector store result in dest (d = v + vec(s))
|
add scalar to v vector store result in dest (d = v + vec(s))
|
||||||
|
|
||||||
@@ -161,7 +182,7 @@ Functions documentation
|
|||||||
| *[in]* **s** scalar
|
| *[in]* **s** scalar
|
||||||
| *[out]* **dest** destination vector
|
| *[out]* **dest** destination vector
|
||||||
|
|
||||||
.. c:function:: void glm_vec_sub(vec3 v1, vec3 v2, vec3 dest)
|
.. c:function:: void glm_vec3_sub(vec3 v1, vec3 v2, vec3 dest)
|
||||||
|
|
||||||
subtract b vector from a vector store result in dest (d = v1 - v2)
|
subtract b vector from a vector store result in dest (d = v1 - v2)
|
||||||
|
|
||||||
@@ -170,7 +191,7 @@ Functions documentation
|
|||||||
| *[in]* **b** vector2
|
| *[in]* **b** vector2
|
||||||
| *[out]* **dest** destination vector
|
| *[out]* **dest** destination vector
|
||||||
|
|
||||||
.. c:function:: void glm_vec_subs(vec3 v, float s, vec3 dest)
|
.. c:function:: void glm_vec3_subs(vec3 v, float s, vec3 dest)
|
||||||
|
|
||||||
subtract scalar from v vector store result in dest (d = v - vec(s))
|
subtract scalar from v vector store result in dest (d = v - vec(s))
|
||||||
|
|
||||||
@@ -179,7 +200,7 @@ Functions documentation
|
|||||||
| *[in]* **s** scalar
|
| *[in]* **s** scalar
|
||||||
| *[out]* **dest** destination vector
|
| *[out]* **dest** destination vector
|
||||||
|
|
||||||
.. c:function:: void glm_vec_mul(vec3 a, vec3 b, vec3 d)
|
.. c:function:: void glm_vec3_mul(vec3 a, vec3 b, vec3 d)
|
||||||
|
|
||||||
multiply two vector (component-wise multiplication)
|
multiply two vector (component-wise multiplication)
|
||||||
|
|
||||||
@@ -188,7 +209,7 @@ Functions documentation
|
|||||||
| *[in]* **b** scalar
|
| *[in]* **b** scalar
|
||||||
| *[out]* **d** result = (a[0] * b[0], a[1] * b[1], a[2] * b[2])
|
| *[out]* **d** result = (a[0] * b[0], a[1] * b[1], a[2] * b[2])
|
||||||
|
|
||||||
.. c:function:: void glm_vec_scale(vec3 v, float s, vec3 dest)
|
.. c:function:: void glm_vec3_scale(vec3 v, float s, vec3 dest)
|
||||||
|
|
||||||
multiply/scale vec3 vector with scalar: result = v * s
|
multiply/scale vec3 vector with scalar: result = v * s
|
||||||
|
|
||||||
@@ -198,7 +219,7 @@ Functions documentation
|
|||||||
| *[in]* **s** scalar
|
| *[in]* **s** scalar
|
||||||
| *[out]* **dest** destination vector
|
| *[out]* **dest** destination vector
|
||||||
|
|
||||||
.. c:function:: void glm_vec_scale_as(vec3 v, float s, vec3 dest)
|
.. c:function:: void glm_vec3_scale_as(vec3 v, float s, vec3 dest)
|
||||||
|
|
||||||
make vec3 vector scale as specified: result = unit(v) * s
|
make vec3 vector scale as specified: result = unit(v) * s
|
||||||
|
|
||||||
@@ -207,7 +228,7 @@ Functions documentation
|
|||||||
| *[in]* **s** scalar
|
| *[in]* **s** scalar
|
||||||
| *[out]* **dest** destination vector
|
| *[out]* **dest** destination vector
|
||||||
|
|
||||||
.. c:function:: void glm_vec_div(vec3 a, vec3 b, vec3 dest)
|
.. c:function:: void glm_vec3_div(vec3 a, vec3 b, vec3 dest)
|
||||||
|
|
||||||
div vector with another component-wise division: d = a / b
|
div vector with another component-wise division: d = a / b
|
||||||
|
|
||||||
@@ -216,7 +237,7 @@ Functions documentation
|
|||||||
| *[in]* **b** vector 2
|
| *[in]* **b** vector 2
|
||||||
| *[out]* **dest** result = (a[0] / b[0], a[1] / b[1], a[2] / b[2])
|
| *[out]* **dest** result = (a[0] / b[0], a[1] / b[1], a[2] / b[2])
|
||||||
|
|
||||||
.. c:function:: void glm_vec_divs(vec3 v, float s, vec3 dest)
|
.. c:function:: void glm_vec3_divs(vec3 v, float s, vec3 dest)
|
||||||
|
|
||||||
div vector with scalar: d = v / s
|
div vector with scalar: d = v / s
|
||||||
|
|
||||||
@@ -225,7 +246,7 @@ Functions documentation
|
|||||||
| *[in]* **s** scalar
|
| *[in]* **s** scalar
|
||||||
| *[out]* **dest** result = (a[0] / s, a[1] / s, a[2] / s])
|
| *[out]* **dest** result = (a[0] / s, a[1] / s, a[2] / s])
|
||||||
|
|
||||||
.. c:function:: void glm_vec_addadd(vec3 a, vec3 b, vec3 dest)
|
.. c:function:: void glm_vec3_addadd(vec3 a, vec3 b, vec3 dest)
|
||||||
|
|
||||||
| add two vectors and add result to sum
|
| add two vectors and add result to sum
|
||||||
| it applies += operator so dest must be initialized
|
| it applies += operator so dest must be initialized
|
||||||
@@ -235,7 +256,7 @@ Functions documentation
|
|||||||
| *[in]* **b** vector 2
|
| *[in]* **b** vector 2
|
||||||
| *[out]* **dest** dest += (a + b)
|
| *[out]* **dest** dest += (a + b)
|
||||||
|
|
||||||
.. c:function:: void glm_vec_subadd(vec3 a, vec3 b, vec3 dest)
|
.. c:function:: void glm_vec3_subadd(vec3 a, vec3 b, vec3 dest)
|
||||||
|
|
||||||
| sub two vectors and add result to sum
|
| sub two vectors and add result to sum
|
||||||
| it applies += operator so dest must be initialized
|
| it applies += operator so dest must be initialized
|
||||||
@@ -245,7 +266,7 @@ Functions documentation
|
|||||||
| *[in]* **b** vector 2
|
| *[in]* **b** vector 2
|
||||||
| *[out]* **dest** dest += (a - b)
|
| *[out]* **dest** dest += (a - b)
|
||||||
|
|
||||||
.. c:function:: void glm_vec_muladd(vec3 a, vec3 b, vec3 dest)
|
.. c:function:: void glm_vec3_muladd(vec3 a, vec3 b, vec3 dest)
|
||||||
|
|
||||||
| mul two vectors and add result to sum
|
| mul two vectors and add result to sum
|
||||||
| it applies += operator so dest must be initialized
|
| it applies += operator so dest must be initialized
|
||||||
@@ -255,7 +276,7 @@ Functions documentation
|
|||||||
| *[in]* **b** vector 2
|
| *[in]* **b** vector 2
|
||||||
| *[out]* **dest** dest += (a * b)
|
| *[out]* **dest** dest += (a * b)
|
||||||
|
|
||||||
.. c:function:: void glm_vec_muladds(vec3 a, float s, vec3 dest)
|
.. c:function:: void glm_vec3_muladds(vec3 a, float s, vec3 dest)
|
||||||
|
|
||||||
| mul vector with scalar and add result to sum
|
| mul vector with scalar and add result to sum
|
||||||
| it applies += operator so dest must be initialized
|
| it applies += operator so dest must be initialized
|
||||||
@@ -265,44 +286,87 @@ Functions documentation
|
|||||||
| *[in]* **s** scalar
|
| *[in]* **s** scalar
|
||||||
| *[out]* **dest** dest += (a * b)
|
| *[out]* **dest** dest += (a * b)
|
||||||
|
|
||||||
.. c:function:: void glm_vec_flipsign(vec3 v)
|
.. c:function:: void glm_vec3_maxadd(vec3 a, vec3 b, vec3 dest)
|
||||||
|
|
||||||
flip sign of all vec3 members
|
| add max of two vector to result/dest
|
||||||
|
| it applies += operator so dest must be initialized
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **a** vector 1
|
||||||
|
| *[in]* **b** vector 2
|
||||||
|
| *[out]* **dest** dest += (a * b)
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec3_minadd(vec3 a, vec3 b, vec3 dest)
|
||||||
|
|
||||||
|
| add min of two vector to result/dest
|
||||||
|
| it applies += operator so dest must be initialized
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **a** vector 1
|
||||||
|
| *[in]* **b** vector 2
|
||||||
|
| *[out]* **dest** dest += (a * b)
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec3_flipsign(vec3 v)
|
||||||
|
|
||||||
|
**DEPRACATED!**
|
||||||
|
|
||||||
|
use :c:func:`glm_vec3_negate`
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in, out]* **v** vector
|
| *[in, out]* **v** vector
|
||||||
|
|
||||||
.. c:function:: void glm_vec_flipsign_to(vec3 v, vec3 dest)
|
.. c:function:: void glm_vec3_flipsign_to(vec3 v, vec3 dest)
|
||||||
|
|
||||||
flip sign of all vec3 members and store result in dest
|
**DEPRACATED!**
|
||||||
|
|
||||||
|
use :c:func:`glm_vec3_negate_to`
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **v** vector
|
| *[in]* **v** vector
|
||||||
| *[out]* **dest** negated vector
|
| *[out]* **dest** negated vector
|
||||||
|
|
||||||
.. c:function:: void glm_vec_inv(vec3 v)
|
.. c:function:: void glm_vec3_inv(vec3 v)
|
||||||
|
|
||||||
make vector as inverse/opposite of itself
|
**DEPRACATED!**
|
||||||
|
|
||||||
|
use :c:func:`glm_vec3_negate`
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in, out]* **v** vector
|
| *[in, out]* **v** vector
|
||||||
|
|
||||||
.. c:function:: void glm_vec_inv_to(vec3 v, vec3 dest)
|
.. c:function:: void glm_vec3_inv_to(vec3 v, vec3 dest)
|
||||||
|
|
||||||
inverse/opposite vector
|
**DEPRACATED!**
|
||||||
|
|
||||||
|
use :c:func:`glm_vec3_negate_to`
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **v** source
|
| *[in]* **v** source
|
||||||
| *[out]* **dest** destination
|
| *[out]* **dest** destination
|
||||||
|
|
||||||
.. c:function:: void glm_vec_normalize(vec3 v)
|
.. c:function:: void glm_vec3_negate(vec3 v)
|
||||||
|
|
||||||
|
negate vector components
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in, out]* **v** vector
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec3_negate_to(vec3 v, vec3 dest)
|
||||||
|
|
||||||
|
negate vector components and store result in dest
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
| *[out]* **dest** negated vector
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec3_normalize(vec3 v)
|
||||||
|
|
||||||
normalize vec3 and store result in same vec
|
normalize vec3 and store result in same vec
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in, out]* **v** vector
|
| *[in, out]* **v** vector
|
||||||
|
|
||||||
.. c:function:: void glm_vec_normalize_to(vec3 vec, vec3 dest)
|
.. c:function:: void glm_vec3_normalize_to(vec3 vec, vec3 dest)
|
||||||
|
|
||||||
normalize vec3 to dest
|
normalize vec3 to dest
|
||||||
|
|
||||||
@@ -310,7 +374,7 @@ Functions documentation
|
|||||||
| *[in]* **vec** source
|
| *[in]* **vec** source
|
||||||
| *[out]* **dest** destination
|
| *[out]* **dest** destination
|
||||||
|
|
||||||
.. c:function:: float glm_vec_angle(vec3 v1, vec3 v2)
|
.. c:function:: float glm_vec3_angle(vec3 v1, vec3 v2)
|
||||||
|
|
||||||
angle betwen two vector
|
angle betwen two vector
|
||||||
|
|
||||||
@@ -321,16 +385,16 @@ Functions documentation
|
|||||||
Return:
|
Return:
|
||||||
| angle as radians
|
| angle as radians
|
||||||
|
|
||||||
.. c:function:: void glm_vec_rotate(vec3 v, float angle, vec3 axis)
|
.. c:function:: void glm_vec3_rotate(vec3 v, float angle, vec3 axis)
|
||||||
|
|
||||||
rotate vec3 around axis by angle using Rodrigues' rotation formula
|
rotate vec3 around axis by angle using Rodrigues' rotation formula
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in, out]* **v** vector
|
| *[in, out]* **v** vector
|
||||||
| *[in]* **axis** axis vector (will be normalized)
|
| *[in]* **axis** axis vector (will be normalized)
|
||||||
| *[out]* **angle** angle (radians)
|
| *[in]* **angle** angle (radians)
|
||||||
|
|
||||||
.. c:function:: void glm_vec_rotate_m4(mat4 m, vec3 v, vec3 dest)
|
.. c:function:: void glm_vec3_rotate_m4(mat4 m, vec3 v, vec3 dest)
|
||||||
|
|
||||||
apply rotation matrix to vector
|
apply rotation matrix to vector
|
||||||
|
|
||||||
@@ -339,7 +403,7 @@ Functions documentation
|
|||||||
| *[in]* **v** vector
|
| *[in]* **v** vector
|
||||||
| *[out]* **dest** rotated vector
|
| *[out]* **dest** rotated vector
|
||||||
|
|
||||||
.. c:function:: void glm_vec_rotate_m3(mat3 m, vec3 v, vec3 dest)
|
.. c:function:: void glm_vec3_rotate_m3(mat3 m, vec3 v, vec3 dest)
|
||||||
|
|
||||||
apply rotation matrix to vector
|
apply rotation matrix to vector
|
||||||
|
|
||||||
@@ -348,7 +412,7 @@ Functions documentation
|
|||||||
| *[in]* **v** vector
|
| *[in]* **v** vector
|
||||||
| *[out]* **dest** rotated vector
|
| *[out]* **dest** rotated vector
|
||||||
|
|
||||||
.. c:function:: void glm_vec_proj(vec3 a, vec3 b, vec3 dest)
|
.. c:function:: void glm_vec3_proj(vec3 a, vec3 b, vec3 dest)
|
||||||
|
|
||||||
project a vector onto b vector
|
project a vector onto b vector
|
||||||
|
|
||||||
@@ -357,7 +421,7 @@ Functions documentation
|
|||||||
| *[in]* **b** vector2
|
| *[in]* **b** vector2
|
||||||
| *[out]* **dest** projected vector
|
| *[out]* **dest** projected vector
|
||||||
|
|
||||||
.. c:function:: void glm_vec_center(vec3 v1, vec3 v2, vec3 dest)
|
.. c:function:: void glm_vec3_center(vec3 v1, vec3 v2, vec3 dest)
|
||||||
|
|
||||||
find center point of two vector
|
find center point of two vector
|
||||||
|
|
||||||
@@ -366,18 +430,29 @@ Functions documentation
|
|||||||
| *[in]* **v2** vector2
|
| *[in]* **v2** vector2
|
||||||
| *[out]* **dest** center point
|
| *[out]* **dest** center point
|
||||||
|
|
||||||
.. c:function:: float glm_vec_distance(vec3 v1, vec3 v2)
|
.. c:function:: float glm_vec3_distance2(vec3 v1, vec3 v2)
|
||||||
|
|
||||||
|
squared distance between two vectors
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v1** vector1
|
||||||
|
| *[in]* **v2** vector2
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
| squared distance (distance * distance)
|
||||||
|
|
||||||
|
.. c:function:: float glm_vec3_distance(vec3 v1, vec3 v2)
|
||||||
|
|
||||||
distance between two vectors
|
distance between two vectors
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **mat** vector1
|
| *[in]* **v1** vector1
|
||||||
| *[in]* **row1** vector2
|
| *[in]* **v2** vector2
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
| distance
|
| distance
|
||||||
|
|
||||||
.. c:function:: void glm_vec_maxv(vec3 v1, vec3 v2, vec3 dest)
|
.. c:function:: void glm_vec3_maxv(vec3 v1, vec3 v2, vec3 dest)
|
||||||
|
|
||||||
max values of vectors
|
max values of vectors
|
||||||
|
|
||||||
@@ -386,7 +461,7 @@ Functions documentation
|
|||||||
| *[in]* **v2** vector2
|
| *[in]* **v2** vector2
|
||||||
| *[out]* **dest** destination
|
| *[out]* **dest** destination
|
||||||
|
|
||||||
.. c:function:: void glm_vec_minv(vec3 v1, vec3 v2, vec3 dest)
|
.. c:function:: void glm_vec3_minv(vec3 v1, vec3 v2, vec3 dest)
|
||||||
|
|
||||||
min values of vectors
|
min values of vectors
|
||||||
|
|
||||||
@@ -395,15 +470,15 @@ Functions documentation
|
|||||||
| *[in]* **v2** vector2
|
| *[in]* **v2** vector2
|
||||||
| *[out]* **dest** destination
|
| *[out]* **dest** destination
|
||||||
|
|
||||||
.. c:function:: void glm_vec_ortho(vec3 v, vec3 dest)
|
.. c:function:: void glm_vec3_ortho(vec3 v, vec3 dest)
|
||||||
|
|
||||||
possible orthogonal/perpendicular vector
|
possible orthogonal/perpendicular vector
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **mat** vector
|
| *[in]* **v** vector
|
||||||
| *[out]* **dest** orthogonal/perpendicular vector
|
| *[out]* **dest** orthogonal/perpendicular vector
|
||||||
|
|
||||||
.. c:function:: void glm_vec_clamp(vec3 v, float minVal, float maxVal)
|
.. c:function:: void glm_vec3_clamp(vec3 v, float minVal, float maxVal)
|
||||||
|
|
||||||
constrain a value to lie between two further values
|
constrain a value to lie between two further values
|
||||||
|
|
||||||
@@ -412,7 +487,7 @@ Functions documentation
|
|||||||
| *[in]* **minVal** minimum value
|
| *[in]* **minVal** minimum value
|
||||||
| *[in]* **maxVal** maximum value
|
| *[in]* **maxVal** maximum value
|
||||||
|
|
||||||
.. c:function:: void glm_vec_lerp(vec3 from, vec3 to, float t, vec3 dest)
|
.. c:function:: void glm_vec3_lerp(vec3 from, vec3 to, float t, vec3 dest)
|
||||||
|
|
||||||
linear interpolation between two vector
|
linear interpolation between two vector
|
||||||
|
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ Functions:
|
|||||||
1. :c:func:`glm_vec4`
|
1. :c:func:`glm_vec4`
|
||||||
#. :c:func:`glm_vec4_copy3`
|
#. :c:func:`glm_vec4_copy3`
|
||||||
#. :c:func:`glm_vec4_copy`
|
#. :c:func:`glm_vec4_copy`
|
||||||
|
#. :c:func:`glm_vec4_ucopy`
|
||||||
#. :c:func:`glm_vec4_zero`
|
#. :c:func:`glm_vec4_zero`
|
||||||
#. :c:func:`glm_vec4_one`
|
#. :c:func:`glm_vec4_one`
|
||||||
#. :c:func:`glm_vec4_dot`
|
#. :c:func:`glm_vec4_dot`
|
||||||
@@ -42,10 +43,14 @@ Functions:
|
|||||||
#. :c:func:`glm_vec4_subadd`
|
#. :c:func:`glm_vec4_subadd`
|
||||||
#. :c:func:`glm_vec4_muladd`
|
#. :c:func:`glm_vec4_muladd`
|
||||||
#. :c:func:`glm_vec4_muladds`
|
#. :c:func:`glm_vec4_muladds`
|
||||||
|
#. :c:func:`glm_vec4_maxadd`
|
||||||
|
#. :c:func:`glm_vec4_minadd`
|
||||||
#. :c:func:`glm_vec4_flipsign`
|
#. :c:func:`glm_vec4_flipsign`
|
||||||
#. :c:func:`glm_vec_flipsign_to`
|
#. :c:func:`glm_vec4_flipsign_to`
|
||||||
#. :c:func:`glm_vec4_inv`
|
#. :c:func:`glm_vec4_inv`
|
||||||
#. :c:func:`glm_vec4_inv_to`
|
#. :c:func:`glm_vec4_inv_to`
|
||||||
|
#. :c:func:`glm_vec4_negate`
|
||||||
|
#. :c:func:`glm_vec4_negate_to`
|
||||||
#. :c:func:`glm_vec4_normalize`
|
#. :c:func:`glm_vec4_normalize`
|
||||||
#. :c:func:`glm_vec4_normalize_to`
|
#. :c:func:`glm_vec4_normalize_to`
|
||||||
#. :c:func:`glm_vec4_distance`
|
#. :c:func:`glm_vec4_distance`
|
||||||
@@ -53,11 +58,7 @@ Functions:
|
|||||||
#. :c:func:`glm_vec4_minv`
|
#. :c:func:`glm_vec4_minv`
|
||||||
#. :c:func:`glm_vec4_clamp`
|
#. :c:func:`glm_vec4_clamp`
|
||||||
#. :c:func:`glm_vec4_lerp`
|
#. :c:func:`glm_vec4_lerp`
|
||||||
#. :c:func:`glm_vec4_isnan`
|
#. :c:func:`glm_vec4_cubic`
|
||||||
#. :c:func:`glm_vec4_isinf`
|
|
||||||
#. :c:func:`glm_vec4_isvalid`
|
|
||||||
#. :c:func:`glm_vec4_sign`
|
|
||||||
#. :c:func:`glm_vec4_sqrt`
|
|
||||||
|
|
||||||
Functions documentation
|
Functions documentation
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
@@ -89,6 +90,16 @@ Functions documentation
|
|||||||
| *[in]* **v** source
|
| *[in]* **v** source
|
||||||
| *[in]* **dest** destination
|
| *[in]* **dest** destination
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec4_ucopy(vec4 v, vec4 dest)
|
||||||
|
|
||||||
|
copy all members of [a] to [dest]
|
||||||
|
|
||||||
|
| alignment is not required
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** source
|
||||||
|
| *[in]* **dest** destination
|
||||||
|
|
||||||
.. c:function:: void glm_vec4_zero(vec4 v)
|
.. c:function:: void glm_vec4_zero(vec4 v)
|
||||||
|
|
||||||
makes all members zero
|
makes all members zero
|
||||||
@@ -123,7 +134,8 @@ Functions documentation
|
|||||||
|
|
||||||
.. c:function:: float glm_vec4_norm(vec4 vec)
|
.. c:function:: float glm_vec4_norm(vec4 vec)
|
||||||
|
|
||||||
norm (magnitude) of vec4
|
| euclidean norm (magnitude), also called L2 norm
|
||||||
|
| this will give magnitude of vector in euclidean space
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **vec** vector
|
| *[in]* **vec** vector
|
||||||
@@ -249,16 +261,40 @@ Functions documentation
|
|||||||
| *[in]* **s** scalar
|
| *[in]* **s** scalar
|
||||||
| *[out]* **dest** dest += (a * b)
|
| *[out]* **dest** dest += (a * b)
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec4_maxadd(vec4 a, vec4 b, vec4 dest)
|
||||||
|
|
||||||
|
| add max of two vector to result/dest
|
||||||
|
| it applies += operator so dest must be initialized
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **a** vector 1
|
||||||
|
| *[in]* **b** vector 2
|
||||||
|
| *[out]* **dest** dest += (a * b)
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec4_minadd(vec4 a, vec4 b, vec4 dest)
|
||||||
|
|
||||||
|
| add min of two vector to result/dest
|
||||||
|
| it applies += operator so dest must be initialized
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **a** vector 1
|
||||||
|
| *[in]* **b** vector 2
|
||||||
|
| *[out]* **dest** dest += (a * b)
|
||||||
|
|
||||||
.. c:function:: void glm_vec4_flipsign(vec4 v)
|
.. c:function:: void glm_vec4_flipsign(vec4 v)
|
||||||
|
|
||||||
flip sign of all vec4 members
|
**DEPRACATED!**
|
||||||
|
|
||||||
|
use :c:func:`glm_vec4_negate`
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in, out]* **v** vector
|
| *[in, out]* **v** vector
|
||||||
|
|
||||||
.. c:function:: void glm_vec4_flipsign_to(vec4 v, vec4 dest)
|
.. c:function:: void glm_vec4_flipsign_to(vec4 v, vec4 dest)
|
||||||
|
|
||||||
flip sign of all vec4 members and store result in dest
|
**DEPRACATED!**
|
||||||
|
|
||||||
|
use :c:func:`glm_vec4_negate_to`
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **v** vector
|
| *[in]* **v** vector
|
||||||
@@ -266,19 +302,38 @@ Functions documentation
|
|||||||
|
|
||||||
.. c:function:: void glm_vec4_inv(vec4 v)
|
.. c:function:: void glm_vec4_inv(vec4 v)
|
||||||
|
|
||||||
make vector as inverse/opposite of itself
|
**DEPRACATED!**
|
||||||
|
|
||||||
|
use :c:func:`glm_vec4_negate`
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in, out]* **v** vector
|
| *[in, out]* **v** vector
|
||||||
|
|
||||||
.. c:function:: void glm_vec4_inv_to(vec4 v, vec4 dest)
|
.. c:function:: void glm_vec4_inv_to(vec4 v, vec4 dest)
|
||||||
|
|
||||||
inverse/opposite vector
|
**DEPRACATED!**
|
||||||
|
|
||||||
|
use :c:func:`glm_vec4_negate_to`
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **v** source
|
| *[in]* **v** source
|
||||||
| *[out]* **dest** destination
|
| *[out]* **dest** destination
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec4_negate(vec4 v)
|
||||||
|
|
||||||
|
negate vector components
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in, out]* **v** vector
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec4_negate_to(vec4 v, vec4 dest)
|
||||||
|
|
||||||
|
negate vector components and store result in dest
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
| *[out]* **dest** negated vector
|
||||||
|
|
||||||
.. c:function:: void glm_vec4_normalize(vec4 v)
|
.. c:function:: void glm_vec4_normalize(vec4 v)
|
||||||
|
|
||||||
normalize vec4 and store result in same vec
|
normalize vec4 and store result in same vec
|
||||||
@@ -343,3 +398,11 @@ Functions documentation
|
|||||||
| *[in]* **to** to value
|
| *[in]* **to** to value
|
||||||
| *[in]* **t** interpolant (amount) clamped between 0 and 1
|
| *[in]* **t** interpolant (amount) clamped between 0 and 1
|
||||||
| *[out]* **dest** destination
|
| *[out]* **dest** destination
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec4_cubic(float s, vec4 dest)
|
||||||
|
|
||||||
|
helper to fill vec4 as [S^3, S^2, S, 1]
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **s** parameter
|
||||||
|
| *[out]* **dest** destination
|
||||||
|
|||||||
15
docs/source/version.rst
Normal file
15
docs/source/version.rst
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
.. default-domain:: C
|
||||||
|
|
||||||
|
version
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
Header: cglm/version.h
|
||||||
|
|
||||||
|
**cglm** uses semantic versioning (http://semver.org) which is MAJOR.MINOR.PATCH
|
||||||
|
|
||||||
|
| **CGLM_VERSION_MAJOR** is major number of the version.
|
||||||
|
| **CGLM_VERSION_MINOR** is minor number of the version.
|
||||||
|
| **CGLM_VERSION_PATCH** is patch number of the version.
|
||||||
|
|
||||||
|
every release increases these numbers. You can check existing version by
|
||||||
|
including `cglm/version.h`
|
||||||
@@ -151,8 +151,8 @@ glm_inv_tr(mat4 mat) {
|
|||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
glm_inv_tr_sse2(mat);
|
glm_inv_tr_sse2(mat);
|
||||||
#else
|
#else
|
||||||
CGLM_ALIGN(16) mat3 r;
|
CGLM_ALIGN_MAT mat3 r;
|
||||||
CGLM_ALIGN(16) vec3 t;
|
CGLM_ALIGN(8) vec3 t;
|
||||||
|
|
||||||
/* rotate */
|
/* rotate */
|
||||||
glm_mat4_pick3t(mat, r);
|
glm_mat4_pick3t(mat, r);
|
||||||
@@ -160,8 +160,8 @@ glm_inv_tr(mat4 mat) {
|
|||||||
|
|
||||||
/* translate */
|
/* translate */
|
||||||
glm_mat3_mulv(r, mat[3], t);
|
glm_mat3_mulv(r, mat[3], t);
|
||||||
glm_vec_flipsign(t);
|
glm_vec3_negate(t);
|
||||||
glm_vec_copy(t, mat[3]);
|
glm_vec3_copy(t, mat[3]);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -40,52 +40,6 @@
|
|||||||
#include "mat4.h"
|
#include "mat4.h"
|
||||||
#include "affine-mat.h"
|
#include "affine-mat.h"
|
||||||
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_mat4_mul(mat4 m1, mat4 m2, mat4 dest);
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief translate existing transform matrix by v vector
|
|
||||||
* and store result in dest
|
|
||||||
*
|
|
||||||
* @param[in] m affine transfrom
|
|
||||||
* @param[in] v translate vector [x, y, z]
|
|
||||||
* @param[out] dest translated matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_translate_to(mat4 m, vec3 v, mat4 dest) {
|
|
||||||
mat4 t = GLM_MAT4_IDENTITY_INIT;
|
|
||||||
|
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
|
||||||
glmm_store(dest[3],
|
|
||||||
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_load(t[0]),
|
|
||||||
_mm_set1_ps(v[0])),
|
|
||||||
_mm_mul_ps(glmm_load(t[1]),
|
|
||||||
_mm_set1_ps(v[1]))),
|
|
||||||
_mm_add_ps(_mm_mul_ps(glmm_load(t[2]),
|
|
||||||
_mm_set1_ps(v[2])),
|
|
||||||
glmm_load(t[3]))))
|
|
||||||
;
|
|
||||||
|
|
||||||
glmm_store(dest[0], glmm_load(m[0]));
|
|
||||||
glmm_store(dest[1], glmm_load(m[1]));
|
|
||||||
glmm_store(dest[2], glmm_load(m[2]));
|
|
||||||
#else
|
|
||||||
vec4 v1, v2, v3;
|
|
||||||
|
|
||||||
glm_vec4_scale(t[0], v[0], v1);
|
|
||||||
glm_vec4_scale(t[1], v[1], v2);
|
|
||||||
glm_vec4_scale(t[2], v[2], v3);
|
|
||||||
|
|
||||||
glm_vec4_add(v1, t[3], t[3]);
|
|
||||||
glm_vec4_add(v2, t[3], t[3]);
|
|
||||||
glm_vec4_add(v3, t[3], t[3]);
|
|
||||||
|
|
||||||
glm__memcpy(float, dest, t, sizeof(mat4));
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief translate existing transform matrix by v vector
|
* @brief translate existing transform matrix by v vector
|
||||||
* and stores result in same matrix
|
* and stores result in same matrix
|
||||||
@@ -119,6 +73,23 @@ glm_translate(mat4 m, vec3 v) {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief translate existing transform matrix by v vector
|
||||||
|
* and store result in dest
|
||||||
|
*
|
||||||
|
* source matrix will remain same
|
||||||
|
*
|
||||||
|
* @param[in] m affine transfrom
|
||||||
|
* @param[in] v translate vector [x, y, z]
|
||||||
|
* @param[out] dest translated matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_translate_to(mat4 m, vec3 v, mat4 dest) {
|
||||||
|
glm_mat4_copy(m, dest);
|
||||||
|
glm_translate(dest, v);
|
||||||
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief translate existing transform matrix by x factor
|
* @brief translate existing transform matrix by x factor
|
||||||
*
|
*
|
||||||
@@ -194,8 +165,8 @@ glm_translate_z(mat4 m, float z) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_translate_make(mat4 m, vec3 v) {
|
glm_translate_make(mat4 m, vec3 v) {
|
||||||
mat4 t = GLM_MAT4_IDENTITY_INIT;
|
glm_mat4_identity(m);
|
||||||
glm_translate_to(t, v, m);
|
glm_vec3_copy(v, m[3]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -225,8 +196,10 @@ glm_scale_to(mat4 m, vec3 v, mat4 dest) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_scale_make(mat4 m, vec3 v) {
|
glm_scale_make(mat4 m, vec3 v) {
|
||||||
mat4 t = GLM_MAT4_IDENTITY_INIT;
|
glm_mat4_identity(m);
|
||||||
glm_scale_to(t, v, m);
|
m[0][0] = v[0];
|
||||||
|
m[1][1] = v[1];
|
||||||
|
m[2][2] = v[2];
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -252,7 +225,7 @@ glm_scale(mat4 m, vec3 v) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_scale_uni(mat4 m, float s) {
|
glm_scale_uni(mat4 m, float s) {
|
||||||
vec3 v = { s, s, s };
|
CGLM_ALIGN(8) vec3 v = { s, s, s };
|
||||||
glm_scale_to(m, v, m);
|
glm_scale_to(m, v, m);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -267,7 +240,7 @@ glm_scale_uni(mat4 m, float s) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_rotate_x(mat4 m, float angle, mat4 dest) {
|
glm_rotate_x(mat4 m, float angle, mat4 dest) {
|
||||||
mat4 t = GLM_MAT4_IDENTITY_INIT;
|
CGLM_ALIGN_MAT mat4 t = GLM_MAT4_IDENTITY_INIT;
|
||||||
float c, s;
|
float c, s;
|
||||||
|
|
||||||
c = cosf(angle);
|
c = cosf(angle);
|
||||||
@@ -292,7 +265,7 @@ glm_rotate_x(mat4 m, float angle, mat4 dest) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_rotate_y(mat4 m, float angle, mat4 dest) {
|
glm_rotate_y(mat4 m, float angle, mat4 dest) {
|
||||||
mat4 t = GLM_MAT4_IDENTITY_INIT;
|
CGLM_ALIGN_MAT mat4 t = GLM_MAT4_IDENTITY_INIT;
|
||||||
float c, s;
|
float c, s;
|
||||||
|
|
||||||
c = cosf(angle);
|
c = cosf(angle);
|
||||||
@@ -317,7 +290,7 @@ glm_rotate_y(mat4 m, float angle, mat4 dest) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_rotate_z(mat4 m, float angle, mat4 dest) {
|
glm_rotate_z(mat4 m, float angle, mat4 dest) {
|
||||||
mat4 t = GLM_MAT4_IDENTITY_INIT;
|
CGLM_ALIGN_MAT mat4 t = GLM_MAT4_IDENTITY_INIT;
|
||||||
float c, s;
|
float c, s;
|
||||||
|
|
||||||
c = cosf(angle);
|
c = cosf(angle);
|
||||||
@@ -343,18 +316,18 @@ glm_rotate_z(mat4 m, float angle, mat4 dest) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_rotate_make(mat4 m, float angle, vec3 axis) {
|
glm_rotate_make(mat4 m, float angle, vec3 axis) {
|
||||||
vec3 axisn, v, vs;
|
CGLM_ALIGN(8) vec3 axisn, v, vs;
|
||||||
float c;
|
float c;
|
||||||
|
|
||||||
c = cosf(angle);
|
c = cosf(angle);
|
||||||
|
|
||||||
glm_vec_normalize_to(axis, axisn);
|
glm_vec3_normalize_to(axis, axisn);
|
||||||
glm_vec_scale(axisn, 1.0f - c, v);
|
glm_vec3_scale(axisn, 1.0f - c, v);
|
||||||
glm_vec_scale(axisn, sinf(angle), vs);
|
glm_vec3_scale(axisn, sinf(angle), vs);
|
||||||
|
|
||||||
glm_vec_scale(axisn, v[0], m[0]);
|
glm_vec3_scale(axisn, v[0], m[0]);
|
||||||
glm_vec_scale(axisn, v[1], m[1]);
|
glm_vec3_scale(axisn, v[1], m[1]);
|
||||||
glm_vec_scale(axisn, v[2], m[2]);
|
glm_vec3_scale(axisn, v[2], m[2]);
|
||||||
|
|
||||||
m[0][0] += c; m[1][0] -= vs[2]; m[2][0] += vs[1];
|
m[0][0] += c; m[1][0] -= vs[2]; m[2][0] += vs[1];
|
||||||
m[0][1] += vs[2]; m[1][1] += c; m[2][1] -= vs[0];
|
m[0][1] += vs[2]; m[1][1] += c; m[2][1] -= vs[0];
|
||||||
@@ -374,7 +347,7 @@ glm_rotate_make(mat4 m, float angle, vec3 axis) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_rotate(mat4 m, float angle, vec3 axis) {
|
glm_rotate(mat4 m, float angle, vec3 axis) {
|
||||||
mat4 rot;
|
CGLM_ALIGN_MAT mat4 rot;
|
||||||
glm_rotate_make(rot, angle, axis);
|
glm_rotate_make(rot, angle, axis);
|
||||||
glm_mul_rot(m, rot, m);
|
glm_mul_rot(m, rot, m);
|
||||||
}
|
}
|
||||||
@@ -391,9 +364,9 @@ glm_rotate(mat4 m, float angle, vec3 axis) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_rotate_at(mat4 m, vec3 pivot, float angle, vec3 axis) {
|
glm_rotate_at(mat4 m, vec3 pivot, float angle, vec3 axis) {
|
||||||
vec3 pivotInv;
|
CGLM_ALIGN(8) vec3 pivotInv;
|
||||||
|
|
||||||
glm_vec_inv_to(pivot, pivotInv);
|
glm_vec3_negate_to(pivot, pivotInv);
|
||||||
|
|
||||||
glm_translate(m, pivot);
|
glm_translate(m, pivot);
|
||||||
glm_rotate(m, angle, axis);
|
glm_rotate(m, angle, axis);
|
||||||
@@ -416,12 +389,11 @@ glm_rotate_at(mat4 m, vec3 pivot, float angle, vec3 axis) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_rotate_atm(mat4 m, vec3 pivot, float angle, vec3 axis) {
|
glm_rotate_atm(mat4 m, vec3 pivot, float angle, vec3 axis) {
|
||||||
vec3 pivotInv;
|
CGLM_ALIGN(8) vec3 pivotInv;
|
||||||
|
|
||||||
glm_vec_inv_to(pivot, pivotInv);
|
glm_vec3_negate_to(pivot, pivotInv);
|
||||||
|
|
||||||
glm_mat4_identity(m);
|
glm_translate_make(m, pivot);
|
||||||
glm_vec_copy(pivot, m[3]);
|
|
||||||
glm_rotate(m, angle, axis);
|
glm_rotate(m, angle, axis);
|
||||||
glm_translate(m, pivotInv);
|
glm_translate(m, pivotInv);
|
||||||
}
|
}
|
||||||
@@ -435,9 +407,9 @@ glm_rotate_atm(mat4 m, vec3 pivot, float angle, vec3 axis) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_decompose_scalev(mat4 m, vec3 s) {
|
glm_decompose_scalev(mat4 m, vec3 s) {
|
||||||
s[0] = glm_vec_norm(m[0]);
|
s[0] = glm_vec3_norm(m[0]);
|
||||||
s[1] = glm_vec_norm(m[1]);
|
s[1] = glm_vec3_norm(m[1]);
|
||||||
s[2] = glm_vec_norm(m[2]);
|
s[2] = glm_vec3_norm(m[2]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -451,10 +423,9 @@ glm_decompose_scalev(mat4 m, vec3 s) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
bool
|
bool
|
||||||
glm_uniscaled(mat4 m) {
|
glm_uniscaled(mat4 m) {
|
||||||
vec3 s;
|
CGLM_ALIGN(8) vec3 s;
|
||||||
glm_decompose_scalev(m, s);
|
glm_decompose_scalev(m, s);
|
||||||
|
return glm_vec3_eq_all(s);
|
||||||
return glm_vec_eq_all(s);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -468,31 +439,31 @@ glm_uniscaled(mat4 m) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_decompose_rs(mat4 m, mat4 r, vec3 s) {
|
glm_decompose_rs(mat4 m, mat4 r, vec3 s) {
|
||||||
vec4 t = {0.0f, 0.0f, 0.0f, 1.0f};
|
CGLM_ALIGN(16) vec4 t = {0.0f, 0.0f, 0.0f, 1.0f};
|
||||||
vec3 v;
|
CGLM_ALIGN(8) vec3 v;
|
||||||
|
|
||||||
glm_vec4_copy(m[0], r[0]);
|
glm_vec4_copy(m[0], r[0]);
|
||||||
glm_vec4_copy(m[1], r[1]);
|
glm_vec4_copy(m[1], r[1]);
|
||||||
glm_vec4_copy(m[2], r[2]);
|
glm_vec4_copy(m[2], r[2]);
|
||||||
glm_vec4_copy(t, r[3]);
|
glm_vec4_copy(t, r[3]);
|
||||||
|
|
||||||
s[0] = glm_vec_norm(m[0]);
|
s[0] = glm_vec3_norm(m[0]);
|
||||||
s[1] = glm_vec_norm(m[1]);
|
s[1] = glm_vec3_norm(m[1]);
|
||||||
s[2] = glm_vec_norm(m[2]);
|
s[2] = glm_vec3_norm(m[2]);
|
||||||
|
|
||||||
glm_vec4_scale(r[0], 1.0f/s[0], r[0]);
|
glm_vec4_scale(r[0], 1.0f/s[0], r[0]);
|
||||||
glm_vec4_scale(r[1], 1.0f/s[1], r[1]);
|
glm_vec4_scale(r[1], 1.0f/s[1], r[1]);
|
||||||
glm_vec4_scale(r[2], 1.0f/s[2], r[2]);
|
glm_vec4_scale(r[2], 1.0f/s[2], r[2]);
|
||||||
|
|
||||||
/* Note from Apple Open Source (asume that the matrix is orthonormal):
|
/* Note from Apple Open Source (assume that the matrix is orthonormal):
|
||||||
check for a coordinate system flip. If the determinant
|
check for a coordinate system flip. If the determinant
|
||||||
is -1, then negate the matrix and the scaling factors. */
|
is -1, then negate the matrix and the scaling factors. */
|
||||||
glm_vec_cross(m[0], m[1], v);
|
glm_vec3_cross(m[0], m[1], v);
|
||||||
if (glm_vec_dot(v, m[2]) < 0.0f) {
|
if (glm_vec3_dot(v, m[2]) < 0.0f) {
|
||||||
glm_vec4_flipsign(r[0]);
|
glm_vec4_negate(r[0]);
|
||||||
glm_vec4_flipsign(r[1]);
|
glm_vec4_negate(r[1]);
|
||||||
glm_vec4_flipsign(r[2]);
|
glm_vec4_negate(r[2]);
|
||||||
glm_vec_flipsign(s);
|
glm_vec3_negate(s);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
268
include/cglm/affine2d.h
Normal file
268
include/cglm/affine2d.h
Normal file
@@ -0,0 +1,268 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Functions:
|
||||||
|
CGLM_INLINE void glm_translate2d(mat3 m, vec2 v)
|
||||||
|
CGLM_INLINE void glm_translate2d_to(mat3 m, vec2 v, mat3 dest)
|
||||||
|
CGLM_INLINE void glm_translate2d_x(mat3 m, float x)
|
||||||
|
CGLM_INLINE void glm_translate2d_y(mat3 m, float y)
|
||||||
|
CGLM_INLINE void glm_translate2d_make(mat3 m, vec2 v)
|
||||||
|
CGLM_INLINE void glm_scale2d_to(mat3 m, vec2 v, mat3 dest)
|
||||||
|
CGLM_INLINE void glm_scale2d_make(mat3 m, vec2 v)
|
||||||
|
CGLM_INLINE void glm_scale2d(mat3 m, vec2 v)
|
||||||
|
CGLM_INLINE void glm_scale2d_uni(mat3 m, float s)
|
||||||
|
CGLM_INLINE void glm_rotate2d_make(mat3 m, float angle)
|
||||||
|
CGLM_INLINE void glm_rotate2d(mat3 m, float angle)
|
||||||
|
CGLM_INLINE void glm_rotate2d_to(mat3 m, float angle, mat3 dest)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglm_affine2d_h
|
||||||
|
#define cglm_affine2d_h
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "util.h"
|
||||||
|
#include "vec2.h"
|
||||||
|
#include "mat3.h"
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief translate existing 2d transform matrix by v vector
|
||||||
|
* and stores result in same matrix
|
||||||
|
*
|
||||||
|
* @param[in, out] m affine transfrom
|
||||||
|
* @param[in] v translate vector [x, y]
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_translate2d(mat3 m, vec2 v) {
|
||||||
|
m[2][0] = m[0][0] * v[0] + m[1][0] * v[1] + m[2][0];
|
||||||
|
m[2][1] = m[0][1] * v[0] + m[1][1] * v[1] + m[2][1];
|
||||||
|
m[2][2] = m[0][2] * v[0] + m[1][2] * v[1] + m[2][2];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief translate existing 2d transform matrix by v vector
|
||||||
|
* and store result in dest
|
||||||
|
*
|
||||||
|
* source matrix will remain same
|
||||||
|
*
|
||||||
|
* @param[in] m affine transfrom
|
||||||
|
* @param[in] v translate vector [x, y]
|
||||||
|
* @param[out] dest translated matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_translate2d_to(mat3 m, vec2 v, mat3 dest) {
|
||||||
|
glm_mat3_copy(m, dest);
|
||||||
|
glm_translate2d(dest, v);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief translate existing 2d transform matrix by x factor
|
||||||
|
*
|
||||||
|
* @param[in, out] m affine transfrom
|
||||||
|
* @param[in] x x factor
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_translate2d_x(mat3 m, float x) {
|
||||||
|
m[2][0] = m[0][0] * x + m[2][0];
|
||||||
|
m[2][1] = m[0][1] * x + m[2][1];
|
||||||
|
m[2][2] = m[0][2] * x + m[2][2];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief translate existing 2d transform matrix by y factor
|
||||||
|
*
|
||||||
|
* @param[in, out] m affine transfrom
|
||||||
|
* @param[in] y y factor
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_translate2d_y(mat3 m, float y) {
|
||||||
|
m[2][0] = m[1][0] * y + m[2][0];
|
||||||
|
m[2][1] = m[1][1] * y + m[2][1];
|
||||||
|
m[2][2] = m[1][2] * y + m[2][2];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief creates NEW translate 2d transform matrix by v vector
|
||||||
|
*
|
||||||
|
* @param[out] m affine transfrom
|
||||||
|
* @param[in] v translate vector [x, y]
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_translate2d_make(mat3 m, vec2 v) {
|
||||||
|
glm_mat3_identity(m);
|
||||||
|
m[2][0] = v[0];
|
||||||
|
m[2][1] = v[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief scale existing 2d transform matrix by v vector
|
||||||
|
* and store result in dest
|
||||||
|
*
|
||||||
|
* @param[in] m affine transfrom
|
||||||
|
* @param[in] v scale vector [x, y]
|
||||||
|
* @param[out] dest scaled matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_scale2d_to(mat3 m, vec2 v, mat3 dest) {
|
||||||
|
dest[0][0] = m[0][0] * v[0];
|
||||||
|
dest[0][1] = m[0][1] * v[0];
|
||||||
|
dest[0][2] = m[0][2] * v[0];
|
||||||
|
|
||||||
|
dest[1][0] = m[1][0] * v[1];
|
||||||
|
dest[1][1] = m[1][1] * v[1];
|
||||||
|
dest[1][2] = m[1][2] * v[1];
|
||||||
|
|
||||||
|
dest[2][0] = m[2][0];
|
||||||
|
dest[2][1] = m[2][1];
|
||||||
|
dest[2][2] = m[2][2];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief creates NEW 2d scale matrix by v vector
|
||||||
|
*
|
||||||
|
* @param[out] m affine transfrom
|
||||||
|
* @param[in] v scale vector [x, y]
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_scale2d_make(mat3 m, vec2 v) {
|
||||||
|
glm_mat3_identity(m);
|
||||||
|
m[0][0] = v[0];
|
||||||
|
m[1][1] = v[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief scales existing 2d transform matrix by v vector
|
||||||
|
* and stores result in same matrix
|
||||||
|
*
|
||||||
|
* @param[in, out] m affine transfrom
|
||||||
|
* @param[in] v scale vector [x, y]
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_scale2d(mat3 m, vec2 v) {
|
||||||
|
m[0][0] = m[0][0] * v[0];
|
||||||
|
m[0][1] = m[0][1] * v[0];
|
||||||
|
m[0][2] = m[0][2] * v[0];
|
||||||
|
|
||||||
|
m[1][0] = m[1][0] * v[1];
|
||||||
|
m[1][1] = m[1][1] * v[1];
|
||||||
|
m[1][2] = m[1][2] * v[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @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] s scale factor
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_scale2d_uni(mat3 m, float s) {
|
||||||
|
m[0][0] = m[0][0] * s;
|
||||||
|
m[0][1] = m[0][1] * s;
|
||||||
|
m[0][2] = m[0][2] * s;
|
||||||
|
|
||||||
|
m[1][0] = m[1][0] * s;
|
||||||
|
m[1][1] = m[1][1] * s;
|
||||||
|
m[1][2] = m[1][2] * s;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief creates NEW rotation matrix by angle around Z axis
|
||||||
|
*
|
||||||
|
* @param[out] m affine transfrom
|
||||||
|
* @param[in] angle angle (radians)
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_rotate2d_make(mat3 m, float angle) {
|
||||||
|
float c, s;
|
||||||
|
|
||||||
|
s = sinf(angle);
|
||||||
|
c = cosf(angle);
|
||||||
|
|
||||||
|
m[0][0] = c;
|
||||||
|
m[0][1] = s;
|
||||||
|
m[0][2] = 0;
|
||||||
|
|
||||||
|
m[1][0] = -s;
|
||||||
|
m[1][1] = c;
|
||||||
|
m[1][2] = 0;
|
||||||
|
|
||||||
|
m[2][0] = 0.0f;
|
||||||
|
m[2][1] = 0.0f;
|
||||||
|
m[2][2] = 1.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @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] angle angle (radians)
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_rotate2d(mat3 m, float angle) {
|
||||||
|
float m00 = m[0][0], m10 = m[1][0],
|
||||||
|
m01 = m[0][1], m11 = m[1][1],
|
||||||
|
m02 = m[0][2], m12 = m[1][2];
|
||||||
|
float c, s;
|
||||||
|
|
||||||
|
s = sinf(angle);
|
||||||
|
c = cosf(angle);
|
||||||
|
|
||||||
|
m[0][0] = m00 * c + m10 * s;
|
||||||
|
m[0][1] = m01 * c + m11 * s;
|
||||||
|
m[0][2] = m02 * c + m12 * s;
|
||||||
|
|
||||||
|
m[1][0] = m00 * -s + m10 * c;
|
||||||
|
m[1][1] = m01 * -s + m11 * c;
|
||||||
|
m[1][2] = m02 * -s + m12 * c;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief rotate existing 2d transform matrix around Z axis by angle
|
||||||
|
* and store result in dest
|
||||||
|
*
|
||||||
|
* @param[in] m affine transfrom
|
||||||
|
* @param[in] angle angle (radians)
|
||||||
|
* @param[out] dest destination
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_rotate2d_to(mat3 m, float angle, mat3 dest) {
|
||||||
|
float m00 = m[0][0], m10 = m[1][0],
|
||||||
|
m01 = m[0][1], m11 = m[1][1],
|
||||||
|
m02 = m[0][2], m12 = m[1][2];
|
||||||
|
float c, s;
|
||||||
|
|
||||||
|
s = sinf(angle);
|
||||||
|
c = cosf(angle);
|
||||||
|
|
||||||
|
dest[0][0] = m00 * c + m10 * s;
|
||||||
|
dest[0][1] = m01 * c + m11 * s;
|
||||||
|
dest[0][2] = m02 * c + m12 * s;
|
||||||
|
|
||||||
|
dest[1][0] = m00 * -s + m10 * c;
|
||||||
|
dest[1][1] = m01 * -s + m11 * c;
|
||||||
|
dest[1][2] = m02 * -s + m12 * c;
|
||||||
|
|
||||||
|
dest[2][0] = m[2][0];
|
||||||
|
dest[2][1] = m[2][1];
|
||||||
|
dest[2][2] = m[2][2];
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* cglm_affine2d_h */
|
||||||
95
include/cglm/applesimd.h
Normal file
95
include/cglm/applesimd.h
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglm_applesimd_h
|
||||||
|
#define cglm_applesimd_h
|
||||||
|
#if defined(__APPLE__) \
|
||||||
|
&& defined(SIMD_COMPILER_HAS_REQUIRED_FEATURES) \
|
||||||
|
&& defined(SIMD_BASE) \
|
||||||
|
&& defined(SIMD_TYPES) \
|
||||||
|
&& defined(SIMD_VECTOR_TYPES)
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief converts mat4 to Apple's simd type simd_float4x4
|
||||||
|
* @return simd_float4x4
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
simd_float4x4
|
||||||
|
glm_mat4_applesimd(mat4 m) {
|
||||||
|
simd_float4x4 t;
|
||||||
|
|
||||||
|
t.columns[0][0] = m[0][0];
|
||||||
|
t.columns[0][1] = m[0][1];
|
||||||
|
t.columns[0][2] = m[0][2];
|
||||||
|
t.columns[0][3] = m[0][3];
|
||||||
|
|
||||||
|
t.columns[1][0] = m[1][0];
|
||||||
|
t.columns[1][1] = m[1][1];
|
||||||
|
t.columns[1][2] = m[1][2];
|
||||||
|
t.columns[1][3] = m[1][3];
|
||||||
|
|
||||||
|
t.columns[2][0] = m[2][0];
|
||||||
|
t.columns[2][1] = m[2][1];
|
||||||
|
t.columns[2][2] = m[2][2];
|
||||||
|
t.columns[2][3] = m[2][3];
|
||||||
|
|
||||||
|
t.columns[3][0] = m[3][0];
|
||||||
|
t.columns[3][1] = m[3][1];
|
||||||
|
t.columns[3][2] = m[3][2];
|
||||||
|
t.columns[3][3] = m[3][3];
|
||||||
|
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief converts mat3 to Apple's simd type simd_float3x3
|
||||||
|
* @return simd_float3x3
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
simd_float3x3
|
||||||
|
glm_mat3_applesimd(mat3 m) {
|
||||||
|
simd_float3x3 t;
|
||||||
|
|
||||||
|
t.columns[0][0] = m[0][0];
|
||||||
|
t.columns[0][1] = m[0][1];
|
||||||
|
t.columns[0][2] = m[0][2];
|
||||||
|
|
||||||
|
t.columns[1][0] = m[1][0];
|
||||||
|
t.columns[1][1] = m[1][1];
|
||||||
|
t.columns[1][2] = m[1][2];
|
||||||
|
|
||||||
|
t.columns[2][0] = m[2][0];
|
||||||
|
t.columns[2][1] = m[2][1];
|
||||||
|
t.columns[2][2] = m[2][2];
|
||||||
|
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief converts vec4 to Apple's simd type simd_float4
|
||||||
|
* @return simd_float4
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
simd_float4
|
||||||
|
glm_vec4_applesimd(vec4 v) {
|
||||||
|
return (simd_float4){v[0], v[1], v[2], v[3]};
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief converts vec3 to Apple's simd type simd_float3
|
||||||
|
* @return v
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
simd_float3
|
||||||
|
glm_vec3_applesimd(vec3 v) {
|
||||||
|
return (simd_float3){v[0], v[1], v[2]};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif /* cglm_applesimd_h */
|
||||||
154
include/cglm/bezier.h
Normal file
154
include/cglm/bezier.h
Normal file
@@ -0,0 +1,154 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglm_bezier_h
|
||||||
|
#define cglm_bezier_h
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
|
||||||
|
#define GLM_BEZIER_MAT_INIT {{-1.0f, 3.0f, -3.0f, 1.0f}, \
|
||||||
|
{ 3.0f, -6.0f, 3.0f, 0.0f}, \
|
||||||
|
{-3.0f, 3.0f, 0.0f, 0.0f}, \
|
||||||
|
{ 1.0f, 0.0f, 0.0f, 0.0f}}
|
||||||
|
#define GLM_HERMITE_MAT_INIT {{ 2.0f, -3.0f, 0.0f, 1.0f}, \
|
||||||
|
{-2.0f, 3.0f, 0.0f, 0.0f}, \
|
||||||
|
{ 1.0f, -2.0f, 1.0f, 0.0f}, \
|
||||||
|
{ 1.0f, -1.0f, 0.0f, 0.0f}}
|
||||||
|
/* for C only */
|
||||||
|
#define GLM_BEZIER_MAT ((mat4)GLM_BEZIER_MAT_INIT)
|
||||||
|
#define GLM_HERMITE_MAT ((mat4)GLM_HERMITE_MAT_INIT)
|
||||||
|
|
||||||
|
#define CGLM_DECASTEL_EPS 1e-9f
|
||||||
|
#define CGLM_DECASTEL_MAX 1000.0f
|
||||||
|
#define CGLM_DECASTEL_SMALL 1e-20f
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief cubic bezier interpolation
|
||||||
|
*
|
||||||
|
* Formula:
|
||||||
|
* B(s) = P0*(1-s)^3 + 3*C0*s*(1-s)^2 + 3*C1*s^2*(1-s) + P1*s^3
|
||||||
|
*
|
||||||
|
* similar result using matrix:
|
||||||
|
* B(s) = glm_smc(t, GLM_BEZIER_MAT, (vec4){p0, c0, c1, p1})
|
||||||
|
*
|
||||||
|
* glm_eq(glm_smc(...), glm_bezier(...)) should return TRUE
|
||||||
|
*
|
||||||
|
* @param[in] s parameter between 0 and 1
|
||||||
|
* @param[in] p0 begin point
|
||||||
|
* @param[in] c0 control point 1
|
||||||
|
* @param[in] c1 control point 2
|
||||||
|
* @param[in] p1 end point
|
||||||
|
*
|
||||||
|
* @return B(s)
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_bezier(float s, float p0, float c0, float c1, float p1) {
|
||||||
|
float x, xx, ss, xs3, a;
|
||||||
|
|
||||||
|
x = 1.0f - s;
|
||||||
|
xx = x * x;
|
||||||
|
ss = s * s;
|
||||||
|
xs3 = (s - ss) * 3.0f;
|
||||||
|
a = p0 * xx + c0 * xs3;
|
||||||
|
|
||||||
|
return a + s * (c1 * xs3 + p1 * ss - a);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief cubic hermite interpolation
|
||||||
|
*
|
||||||
|
* Formula:
|
||||||
|
* H(s) = P0*(2*s^3 - 3*s^2 + 1) + T0*(s^3 - 2*s^2 + s)
|
||||||
|
* + P1*(-2*s^3 + 3*s^2) + T1*(s^3 - s^2)
|
||||||
|
*
|
||||||
|
* similar result using matrix:
|
||||||
|
* H(s) = glm_smc(t, GLM_HERMITE_MAT, (vec4){p0, p1, c0, c1})
|
||||||
|
*
|
||||||
|
* glm_eq(glm_smc(...), glm_hermite(...)) should return TRUE
|
||||||
|
*
|
||||||
|
* @param[in] s parameter between 0 and 1
|
||||||
|
* @param[in] p0 begin point
|
||||||
|
* @param[in] t0 tangent 1
|
||||||
|
* @param[in] t1 tangent 2
|
||||||
|
* @param[in] p1 end point
|
||||||
|
*
|
||||||
|
* @return H(s)
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_hermite(float s, float p0, float t0, float t1, float p1) {
|
||||||
|
float ss, d, a, b, c, e, f;
|
||||||
|
|
||||||
|
ss = s * s;
|
||||||
|
a = ss + ss;
|
||||||
|
c = a + ss;
|
||||||
|
b = a * s;
|
||||||
|
d = s * ss;
|
||||||
|
f = d - ss;
|
||||||
|
e = b - c;
|
||||||
|
|
||||||
|
return p0 * (e + 1.0f) + t0 * (f - ss + s) + t1 * f - p1 * e;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief iterative way to solve cubic equation
|
||||||
|
*
|
||||||
|
* @param[in] prm parameter between 0 and 1
|
||||||
|
* @param[in] p0 begin point
|
||||||
|
* @param[in] c0 control point 1
|
||||||
|
* @param[in] c1 control point 2
|
||||||
|
* @param[in] p1 end point
|
||||||
|
*
|
||||||
|
* @return parameter to use in cubic equation
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_decasteljau(float prm, float p0, float c0, float c1, float p1) {
|
||||||
|
float u, v, a, b, c, d, e, f;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (prm - p0 < CGLM_DECASTEL_SMALL)
|
||||||
|
return 0.0f;
|
||||||
|
|
||||||
|
if (p1 - prm < CGLM_DECASTEL_SMALL)
|
||||||
|
return 1.0f;
|
||||||
|
|
||||||
|
u = 0.0f;
|
||||||
|
v = 1.0f;
|
||||||
|
|
||||||
|
for (i = 0; i < CGLM_DECASTEL_MAX; i++) {
|
||||||
|
/* de Casteljau Subdivision */
|
||||||
|
a = (p0 + c0) * 0.5f;
|
||||||
|
b = (c0 + c1) * 0.5f;
|
||||||
|
c = (c1 + p1) * 0.5f;
|
||||||
|
d = (a + b) * 0.5f;
|
||||||
|
e = (b + c) * 0.5f;
|
||||||
|
f = (d + e) * 0.5f; /* this one is on the curve! */
|
||||||
|
|
||||||
|
/* The curve point is close enough to our wanted t */
|
||||||
|
if (fabsf(f - prm) < CGLM_DECASTEL_EPS)
|
||||||
|
return glm_clamp_zo((u + v) * 0.5f);
|
||||||
|
|
||||||
|
/* dichotomy */
|
||||||
|
if (f < prm) {
|
||||||
|
p0 = f;
|
||||||
|
c0 = e;
|
||||||
|
c1 = c;
|
||||||
|
u = (u + v) * 0.5f;
|
||||||
|
} else {
|
||||||
|
c0 = a;
|
||||||
|
c1 = d;
|
||||||
|
p1 = f;
|
||||||
|
v = (u + v) * 0.5f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return glm_clamp_zo((u + v) * 0.5f);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* cglm_bezier_h */
|
||||||
@@ -23,35 +23,31 @@
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_aabb_transform(vec3 box[2], mat4 m, vec3 dest[2]) {
|
glm_aabb_transform(vec3 box[2], mat4 m, vec3 dest[2]) {
|
||||||
vec3 v[2], xa, xb, ya, yb, za, zb, tmp;
|
vec3 v[2], xa, xb, ya, yb, za, zb;
|
||||||
|
|
||||||
glm_vec_scale(m[0], box[0][0], xa);
|
glm_vec3_scale(m[0], box[0][0], xa);
|
||||||
glm_vec_scale(m[0], box[1][0], xb);
|
glm_vec3_scale(m[0], box[1][0], xb);
|
||||||
|
|
||||||
glm_vec_scale(m[1], box[0][1], ya);
|
glm_vec3_scale(m[1], box[0][1], ya);
|
||||||
glm_vec_scale(m[1], box[1][1], yb);
|
glm_vec3_scale(m[1], box[1][1], yb);
|
||||||
|
|
||||||
glm_vec_scale(m[2], box[0][2], za);
|
glm_vec3_scale(m[2], box[0][2], za);
|
||||||
glm_vec_scale(m[2], box[1][2], zb);
|
glm_vec3_scale(m[2], box[1][2], zb);
|
||||||
|
|
||||||
/* min(xa, xb) + min(ya, yb) + min(za, zb) + translation */
|
/* translation + min(xa, xb) + min(ya, yb) + min(za, zb) */
|
||||||
glm_vec_minv(xa, xb, v[0]);
|
glm_vec3(m[3], v[0]);
|
||||||
glm_vec_minv(ya, yb, tmp);
|
glm_vec3_minadd(xa, xb, v[0]);
|
||||||
glm_vec_add(v[0], tmp, v[0]);
|
glm_vec3_minadd(ya, yb, v[0]);
|
||||||
glm_vec_minv(za, zb, tmp);
|
glm_vec3_minadd(za, zb, v[0]);
|
||||||
glm_vec_add(v[0], tmp, v[0]);
|
|
||||||
glm_vec_add(v[0], m[3], v[0]);
|
|
||||||
|
|
||||||
/* max(xa, xb) + max(ya, yb) + max(za, zb) + translation */
|
/* translation + max(xa, xb) + max(ya, yb) + max(za, zb) */
|
||||||
glm_vec_maxv(xa, xb, v[1]);
|
glm_vec3(m[3], v[1]);
|
||||||
glm_vec_maxv(ya, yb, tmp);
|
glm_vec3_maxadd(xa, xb, v[1]);
|
||||||
glm_vec_add(v[1], tmp, v[1]);
|
glm_vec3_maxadd(ya, yb, v[1]);
|
||||||
glm_vec_maxv(za, zb, tmp);
|
glm_vec3_maxadd(za, zb, v[1]);
|
||||||
glm_vec_add(v[1], tmp, v[1]);
|
|
||||||
glm_vec_add(v[1], m[3], v[1]);
|
|
||||||
|
|
||||||
glm_vec_copy(v[0], dest[0]);
|
glm_vec3_copy(v[0], dest[0]);
|
||||||
glm_vec_copy(v[1], dest[1]);
|
glm_vec3_copy(v[1], dest[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -162,8 +158,8 @@ glm_aabb_frustum(vec3 box[2], vec4 planes[6]) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_aabb_invalidate(vec3 box[2]) {
|
glm_aabb_invalidate(vec3 box[2]) {
|
||||||
glm_vec_broadcast(FLT_MAX, box[0]);
|
glm_vec3_broadcast(FLT_MAX, box[0]);
|
||||||
glm_vec_broadcast(-FLT_MAX, box[1]);
|
glm_vec3_broadcast(-FLT_MAX, box[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -174,8 +170,8 @@ glm_aabb_invalidate(vec3 box[2]) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
bool
|
bool
|
||||||
glm_aabb_isvalid(vec3 box[2]) {
|
glm_aabb_isvalid(vec3 box[2]) {
|
||||||
return glm_vec_max(box[0]) != FLT_MAX
|
return glm_vec3_max(box[0]) != FLT_MAX
|
||||||
&& glm_vec_min(box[1]) != -FLT_MAX;
|
&& glm_vec3_min(box[1]) != -FLT_MAX;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -186,7 +182,7 @@ glm_aabb_isvalid(vec3 box[2]) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
float
|
float
|
||||||
glm_aabb_size(vec3 box[2]) {
|
glm_aabb_size(vec3 box[2]) {
|
||||||
return glm_vec_distance(box[0], box[1]);
|
return glm_vec3_distance(box[0], box[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -200,4 +196,86 @@ glm_aabb_radius(vec3 box[2]) {
|
|||||||
return glm_aabb_size(box) * 0.5f;
|
return glm_aabb_size(box) * 0.5f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief computes center point of AABB
|
||||||
|
*
|
||||||
|
* @param[in] box bounding box
|
||||||
|
* @param[out] dest center of bounding box
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_aabb_center(vec3 box[2], vec3 dest) {
|
||||||
|
glm_vec3_center(box[0], box[1], dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief check if two AABB intersects
|
||||||
|
*
|
||||||
|
* @param[in] box bounding box
|
||||||
|
* @param[in] other other bounding box
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
bool
|
||||||
|
glm_aabb_aabb(vec3 box[2], vec3 other[2]) {
|
||||||
|
return (box[0][0] <= other[1][0] && box[1][0] >= other[0][0])
|
||||||
|
&& (box[0][1] <= other[1][1] && box[1][1] >= other[0][1])
|
||||||
|
&& (box[0][2] <= other[1][2] && box[1][2] >= other[0][2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief check if AABB intersects with sphere
|
||||||
|
*
|
||||||
|
* https://github.com/erich666/GraphicsGems/blob/master/gems/BoxSphere.c
|
||||||
|
* Solid Box - Solid Sphere test.
|
||||||
|
*
|
||||||
|
* Sphere Representation in cglm: [center.x, center.y, center.z, radii]
|
||||||
|
*
|
||||||
|
* @param[in] box solid bounding box
|
||||||
|
* @param[in] s solid sphere
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
bool
|
||||||
|
glm_aabb_sphere(vec3 box[2], vec4 s) {
|
||||||
|
float dmin;
|
||||||
|
int a, b, c;
|
||||||
|
|
||||||
|
a = (s[0] < box[0][0]) + (s[0] > box[1][0]);
|
||||||
|
b = (s[1] < box[0][1]) + (s[1] > box[1][1]);
|
||||||
|
c = (s[2] < box[0][2]) + (s[2] > box[1][2]);
|
||||||
|
|
||||||
|
dmin = glm_pow2((s[0] - box[!(a - 1)][0]) * (a != 0))
|
||||||
|
+ glm_pow2((s[1] - box[!(b - 1)][1]) * (b != 0))
|
||||||
|
+ glm_pow2((s[2] - box[!(c - 1)][2]) * (c != 0));
|
||||||
|
|
||||||
|
return dmin <= glm_pow2(s[3]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief check if point is inside of AABB
|
||||||
|
*
|
||||||
|
* @param[in] box bounding box
|
||||||
|
* @param[in] point point
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
bool
|
||||||
|
glm_aabb_point(vec3 box[2], vec3 point) {
|
||||||
|
return (point[0] >= box[0][0] && point[0] <= box[1][0])
|
||||||
|
&& (point[1] >= box[0][1] && point[1] <= box[1][1])
|
||||||
|
&& (point[2] >= box[0][2] && point[2] <= box[1][2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief check if AABB contains other AABB
|
||||||
|
*
|
||||||
|
* @param[in] box bounding box
|
||||||
|
* @param[in] other other bounding box
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
bool
|
||||||
|
glm_aabb_contains(vec3 box[2], vec3 other[2]) {
|
||||||
|
return (box[0][0] <= other[0][0] && box[1][0] >= other[1][0])
|
||||||
|
&& (box[0][1] <= other[0][1] && box[1][1] >= other[1][1])
|
||||||
|
&& (box[0][2] <= other[0][2] && box[1][2] >= other[1][2]);
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* cglm_box_h */
|
#endif /* cglm_box_h */
|
||||||
|
|||||||
@@ -12,10 +12,12 @@ extern "C" {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "cglm.h"
|
#include "cglm.h"
|
||||||
|
#include "call/vec2.h"
|
||||||
#include "call/vec3.h"
|
#include "call/vec3.h"
|
||||||
#include "call/vec4.h"
|
#include "call/vec4.h"
|
||||||
#include "call/mat4.h"
|
#include "call/mat2.h"
|
||||||
#include "call/mat3.h"
|
#include "call/mat3.h"
|
||||||
|
#include "call/mat4.h"
|
||||||
#include "call/affine.h"
|
#include "call/affine.h"
|
||||||
#include "call/cam.h"
|
#include "call/cam.h"
|
||||||
#include "call/quat.h"
|
#include "call/quat.h"
|
||||||
@@ -25,6 +27,12 @@ extern "C" {
|
|||||||
#include "call/box.h"
|
#include "call/box.h"
|
||||||
#include "call/io.h"
|
#include "call/io.h"
|
||||||
#include "call/project.h"
|
#include "call/project.h"
|
||||||
|
#include "call/sphere.h"
|
||||||
|
#include "call/ease.h"
|
||||||
|
#include "call/curve.h"
|
||||||
|
#include "call/bezier.h"
|
||||||
|
#include "call/ray.h"
|
||||||
|
#include "call/affine2d.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -97,6 +97,20 @@ CGLM_EXPORT
|
|||||||
void
|
void
|
||||||
glmc_decompose(mat4 m, vec4 t, mat4 r, vec3 s);
|
glmc_decompose(mat4 m, vec4 t, mat4 r, vec3 s);
|
||||||
|
|
||||||
|
/* affine-mat */
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mul(mat4 m1, mat4 m2, mat4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mul_rot(mat4 m1, mat4 m2, mat4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_inv_tr(mat4 mat);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
67
include/cglm/call/affine2d.h
Normal file
67
include/cglm/call/affine2d.h
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglmc_affine2d_h
|
||||||
|
#define cglmc_affine2d_h
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "../cglm.h"
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_translate2d_make(mat3 m, vec2 v);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_translate2d_to(mat3 m, vec2 v, mat3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_translate2d(mat3 m, vec2 v);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_translate2d_x(mat3 m, float to);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_translate2d_y(mat3 m, float to);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_scale2d_to(mat3 m, vec2 v, mat3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_scale2d_make(mat3 m, vec2 v);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_scale2d(mat3 m, vec2 v);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_scale2d_uni(mat3 m, float s);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_rotate2d_make(mat3 m, float angle);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_rotate2d(mat3 m, float angle);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_rotate2d_to(mat3 m, float angle, mat3 dest);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* cglmc_affine2d_h */
|
||||||
31
include/cglm/call/bezier.h
Normal file
31
include/cglm/call/bezier.h
Normal 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_bezier_h
|
||||||
|
#define cglmc_bezier_h
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "../cglm.h"
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_bezier(float s, float p0, float c0, float c1, float p1);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_hermite(float s, float p0, float t0, float t1, float p1);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_decasteljau(float prm, float p0, float c0, float c1, float p1);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* cglmc_bezier_h */
|
||||||
@@ -32,6 +32,46 @@ glmc_aabb_crop_until(vec3 box[2],
|
|||||||
vec3 clampBox[2],
|
vec3 clampBox[2],
|
||||||
vec3 dest[2]);
|
vec3 dest[2]);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
bool
|
||||||
|
glmc_aabb_frustum(vec3 box[2], vec4 planes[6]);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_aabb_invalidate(vec3 box[2]);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
bool
|
||||||
|
glmc_aabb_isvalid(vec3 box[2]);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_aabb_size(vec3 box[2]);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_aabb_radius(vec3 box[2]);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_aabb_center(vec3 box[2], vec3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
bool
|
||||||
|
glmc_aabb_aabb(vec3 box[2], vec3 other[2]);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
bool
|
||||||
|
glmc_aabb_point(vec3 box[2], vec3 point);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
bool
|
||||||
|
glmc_aabb_contains(vec3 box[2], vec3 other[2]);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
bool
|
||||||
|
glmc_aabb_sphere(vec3 box[2], vec4 s);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -33,6 +33,26 @@ glmc_ortho(float left,
|
|||||||
float farVal,
|
float farVal,
|
||||||
mat4 dest);
|
mat4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_ortho_aabb(vec3 box[2], mat4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_ortho_aabb_p(vec3 box[2], float padding, mat4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_ortho_aabb_pz(vec3 box[2], float padding, mat4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_ortho_default(float aspect, mat4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_ortho_default_s(float aspect, float size, mat4 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_perspective(float fovy,
|
glmc_perspective(float fovy,
|
||||||
@@ -41,6 +61,18 @@ glmc_perspective(float fovy,
|
|||||||
float farVal,
|
float farVal,
|
||||||
mat4 dest);
|
mat4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_persp_move_far(mat4 proj, float deltaFar);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_perspective_default(float aspect, mat4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_perspective_resize(float aspect, mat4 proj);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_lookat(vec3 eye, vec3 center, vec3 up, mat4 dest);
|
glmc_lookat(vec3 eye, vec3 center, vec3 up, mat4 dest);
|
||||||
@@ -53,6 +85,58 @@ CGLM_EXPORT
|
|||||||
void
|
void
|
||||||
glmc_look_anyup(vec3 eye, vec3 dir, mat4 dest);
|
glmc_look_anyup(vec3 eye, vec3 dir, mat4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_persp_decomp(mat4 proj,
|
||||||
|
float * __restrict nearVal,
|
||||||
|
float * __restrict farVal,
|
||||||
|
float * __restrict top,
|
||||||
|
float * __restrict bottom,
|
||||||
|
float * __restrict left,
|
||||||
|
float * __restrict right);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_persp_decompv(mat4 proj, float dest[6]);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_persp_decomp_x(mat4 proj,
|
||||||
|
float * __restrict left,
|
||||||
|
float * __restrict right);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_persp_decomp_y(mat4 proj,
|
||||||
|
float * __restrict top,
|
||||||
|
float * __restrict bottom);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_persp_decomp_z(mat4 proj,
|
||||||
|
float * __restrict nearVal,
|
||||||
|
float * __restrict farVal);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_persp_decomp_far(mat4 proj, float * __restrict farVal);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_persp_decomp_near(mat4 proj, float * __restrict nearVal);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_persp_fovy(mat4 proj);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_persp_aspect(mat4 proj);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_persp_sizes(mat4 proj, float fovy, vec4 dest);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
23
include/cglm/call/curve.h
Normal file
23
include/cglm/call/curve.h
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglmc_curve_h
|
||||||
|
#define cglmc_curve_h
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "../cglm.h"
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_smc(float s, mat4 m, vec4 c);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* cglmc_curve_h */
|
||||||
143
include/cglm/call/ease.h
Normal file
143
include/cglm/call/ease.h
Normal file
@@ -0,0 +1,143 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglmc_ease_h
|
||||||
|
#define cglmc_ease_h
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "../cglm.h"
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_ease_linear(float t);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_ease_sine_in(float t);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_ease_sine_out(float t);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_ease_sine_inout(float t);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_ease_quad_in(float t);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_ease_quad_out(float t);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_ease_quad_inout(float t);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_ease_cubic_in(float t);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_ease_cubic_out(float t);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_ease_cubic_inout(float t);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_ease_quart_in(float t);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_ease_quart_out(float t);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_ease_quart_inout(float t);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_ease_quint_in(float t);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_ease_quint_out(float t);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_ease_quint_inout(float t);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_ease_exp_in(float t);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_ease_exp_out(float t);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_ease_exp_inout(float t);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_ease_circ_in(float t);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_ease_circ_out(float t);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_ease_circ_inout(float t);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_ease_back_in(float t);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_ease_back_out(float t);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_ease_back_inout(float t);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_ease_elast_in(float t);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_ease_elast_out(float t);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_ease_elast_inout(float t);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_ease_bounce_out(float t);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_ease_bounce_in(float t);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_ease_bounce_inout(float t);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* cglmc_ease_h */
|
||||||
@@ -47,7 +47,7 @@ glmc_euler_yxz(vec3 angles, mat4 dest);
|
|||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_euler_by_order(vec3 angles, glm_euler_sq axis, mat4 dest);
|
glmc_euler_by_order(vec3 angles, glm_euler_seq axis, mat4 dest);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
|
|
||||||
#ifndef cglmc_io_h
|
#ifndef cglmc_io_h
|
||||||
#define cglmc_io_h
|
#define cglmc_io_h
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
79
include/cglm/call/mat2.h
Normal file
79
include/cglm/call/mat2.h
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglmc_mat2_h
|
||||||
|
#define cglmc_mat2_h
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "../cglm.h"
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat2_copy(mat2 mat, mat2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat2_identity(mat2 mat);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat2_identity_array(mat2 * __restrict mat, size_t count);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat2_zero(mat2 mat);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat2_mul(mat2 m1, mat2 m2, mat2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat2_transpose_to(mat2 m, mat2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat2_transpose(mat2 m);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat2_mulv(mat2 m, vec2 v, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_mat2_trace(mat2 m);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat2_scale(mat2 m, float s);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_mat2_det(mat2 mat);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat2_inv(mat2 mat, mat2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat2_swap_col(mat2 mat, int col1, int col2);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat2_swap_row(mat2 mat, int row1, int row2);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_mat2_rmc(vec2 r, mat2 m, vec2 c);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* cglmc_mat2_h */
|
||||||
@@ -24,6 +24,14 @@ CGLM_EXPORT
|
|||||||
void
|
void
|
||||||
glmc_mat3_identity(mat3 mat);
|
glmc_mat3_identity(mat3 mat);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat3_zero(mat3 mat);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat3_identity_array(mat3 * __restrict mat, size_t count);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_mat3_mul(mat3 m1, mat3 m2, mat3 dest);
|
glmc_mat3_mul(mat3 m1, mat3 m2, mat3 dest);
|
||||||
@@ -40,6 +48,14 @@ CGLM_EXPORT
|
|||||||
void
|
void
|
||||||
glmc_mat3_mulv(mat3 m, vec3 v, vec3 dest);
|
glmc_mat3_mulv(mat3 m, vec3 v, vec3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_mat3_trace(mat3 m);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat3_quat(mat3 m, versor dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_mat3_scale(mat3 m, float s);
|
glmc_mat3_scale(mat3 m, float s);
|
||||||
@@ -60,6 +76,10 @@ CGLM_EXPORT
|
|||||||
void
|
void
|
||||||
glmc_mat3_swap_row(mat3 mat, int row1, int row2);
|
glmc_mat3_swap_row(mat3 mat, int row1, int row2);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_mat3_rmc(vec3 r, mat3 m, vec3 c);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -29,6 +29,14 @@ CGLM_EXPORT
|
|||||||
void
|
void
|
||||||
glmc_mat4_identity(mat4 mat);
|
glmc_mat4_identity(mat4 mat);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat4_identity_array(mat4 * __restrict mat, size_t count);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat4_zero(mat4 mat);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_mat4_pick3(mat4 mat, mat3 dest);
|
glmc_mat4_pick3(mat4 mat, mat3 dest);
|
||||||
@@ -53,6 +61,18 @@ CGLM_EXPORT
|
|||||||
void
|
void
|
||||||
glmc_mat4_mulv(mat4 m, vec4 v, vec4 dest);
|
glmc_mat4_mulv(mat4 m, vec4 v, vec4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat4_mulv3(mat4 m, vec3 v, float last, vec3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_mat4_trace(mat4 m);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_mat4_trace3(mat4 m);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_mat4_quat(mat4 m, versor dest);
|
glmc_mat4_quat(mat4 m, versor dest);
|
||||||
@@ -85,6 +105,10 @@ CGLM_EXPORT
|
|||||||
void
|
void
|
||||||
glmc_mat4_inv_precise(mat4 mat, mat4 dest);
|
glmc_mat4_inv_precise(mat4 mat, mat4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat4_inv_fast(mat4 mat, mat4 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_mat4_swap_col(mat4 mat, int col1, int col2);
|
glmc_mat4_swap_col(mat4 mat, int col1, int col2);
|
||||||
@@ -93,6 +117,10 @@ CGLM_EXPORT
|
|||||||
void
|
void
|
||||||
glmc_mat4_swap_row(mat4 mat, int row1, int row2);
|
glmc_mat4_swap_row(mat4 mat, int row1, int row2);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_mat4_rmc(vec4 r, mat4 m, vec4 c);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -17,6 +17,10 @@ CGLM_EXPORT
|
|||||||
void
|
void
|
||||||
glmc_quat_identity(versor q);
|
glmc_quat_identity(versor q);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_quat_identity_array(versor * __restrict q, size_t count);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_quat_init(versor q, float x, float y, float z, float w);
|
glmc_quat_init(versor q, float x, float y, float z, float w);
|
||||||
@@ -87,7 +91,7 @@ glmc_quat_angle(versor q);
|
|||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_quat_axis(versor q, versor dest);
|
glmc_quat_axis(versor q, vec3 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
@@ -113,6 +117,10 @@ CGLM_EXPORT
|
|||||||
void
|
void
|
||||||
glmc_quat_lerp(versor from, versor to, float t, versor dest);
|
glmc_quat_lerp(versor from, versor to, float t, versor dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_quat_lerpc(versor from, versor to, float t, versor dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_quat_slerp(versor q, versor r, float t, versor dest);
|
glmc_quat_slerp(versor q, versor r, float t, versor dest);
|
||||||
@@ -123,11 +131,11 @@ glmc_quat_look(vec3 eye, versor ori, mat4 dest);
|
|||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_quat_for(vec3 dir, vec3 fwd, vec3 up, versor dest);
|
glmc_quat_for(vec3 dir, vec3 up, versor dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_quat_forp(vec3 from, vec3 to, vec3 fwd, vec3 up, versor dest);
|
glmc_quat_forp(vec3 from, vec3 to, vec3 up, versor dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
|
|||||||
27
include/cglm/call/ray.h
Normal file
27
include/cglm/call/ray.h
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglmc_ray_h
|
||||||
|
#define cglmc_ray_h
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
#include "../cglm.h"
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
bool
|
||||||
|
glmc_ray_triangle(vec3 origin,
|
||||||
|
vec3 direction,
|
||||||
|
vec3 v0,
|
||||||
|
vec3 v1,
|
||||||
|
vec3 v2,
|
||||||
|
float *d);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* cglmc_ray_h */
|
||||||
39
include/cglm/call/sphere.h
Normal file
39
include/cglm/call/sphere.h
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglmc_sphere_h
|
||||||
|
#define cglmc_sphere_h
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "../cglm.h"
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_sphere_radii(vec4 s);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_sphere_transform(vec4 s, mat4 m, vec4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_sphere_merge(vec4 s1, vec4 s2, vec4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
bool
|
||||||
|
glmc_sphere_sphere(vec4 s1, vec4 s2);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
bool
|
||||||
|
glmc_sphere_point(vec4 s, vec3 point);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* cglmc_sphere_h */
|
||||||
155
include/cglm/call/vec2.h
Normal file
155
include/cglm/call/vec2.h
Normal file
@@ -0,0 +1,155 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglmc_vec2_h
|
||||||
|
#define cglmc_vec2_h
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "../cglm.h"
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2(float * __restrict v, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_copy(vec2 a, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_zero(vec2 v);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_one(vec2 v);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_vec2_dot(vec2 a, vec2 b);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_vec2_cross(vec2 a, vec2 b);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_vec2_norm2(vec2 v);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_vec2_norm(vec2 v);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_add(vec2 a, vec2 b, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_adds(vec2 v, float s, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_sub(vec2 a, vec2 b, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_subs(vec2 v, float s, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_mul(vec2 a, vec2 b, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_scale(vec2 v, float s, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_scale_as(vec2 v, float s, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_div(vec2 a, vec2 b, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_divs(vec2 v, float s, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_addadd(vec2 a, vec2 b, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_subadd(vec2 a, vec2 b, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_muladd(vec2 a, vec2 b, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_muladds(vec2 a, float s, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_maxadd(vec2 a, vec2 b, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_minadd(vec2 a, vec2 b, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_negate_to(vec2 v, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_negate(vec2 v);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_normalize(vec2 v);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_normalize_to(vec2 v, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_rotate(vec2 v, float angle, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_vec2_distance2(vec2 a, vec2 b);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_vec2_distance(vec2 a, vec2 b);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_maxv(vec2 a, vec2 b, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_minv(vec2 a, vec2 b, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_clamp(vec2 v, float minval, float maxval);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_lerp(vec2 from, vec2 to, float t, vec2 dest);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* cglmc_vec2_h */
|
||||||
@@ -14,7 +14,11 @@ extern "C" {
|
|||||||
#include "../cglm.h"
|
#include "../cglm.h"
|
||||||
|
|
||||||
/* DEPRECATED! use _copy, _ucopy versions */
|
/* DEPRECATED! use _copy, _ucopy versions */
|
||||||
#define glmc_vec_dup(v, dest) glmc_vec_copy(v, dest)
|
#define glmc_vec_dup(v, dest) glmc_vec3_copy(v, dest)
|
||||||
|
#define glmc_vec3_flipsign(v) glmc_vec3_negate(v)
|
||||||
|
#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)
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
@@ -22,209 +26,285 @@ glmc_vec3(vec4 v4, vec3 dest);
|
|||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_copy(vec3 a, vec3 dest);
|
glmc_vec3_copy(vec3 a, vec3 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_zero(vec3 v);
|
glmc_vec3_zero(vec3 v);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_one(vec3 v);
|
glmc_vec3_one(vec3 v);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
float
|
float
|
||||||
glmc_vec_dot(vec3 a, vec3 b);
|
glmc_vec3_dot(vec3 a, vec3 b);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_cross(vec3 a, vec3 b, vec3 d);
|
glmc_vec3_cross(vec3 a, vec3 b, vec3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec3_crossn(vec3 a, vec3 b, vec3 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
float
|
float
|
||||||
glmc_vec_norm(vec3 vec);
|
glmc_vec3_norm(vec3 v);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
float
|
float
|
||||||
glmc_vec_norm2(vec3 vec);
|
glmc_vec3_norm2(vec3 v);
|
||||||
|
|
||||||
CGLM_EXPORT
|
|
||||||
void
|
|
||||||
glmc_vec_normalize_to(vec3 vec, vec3 dest);
|
|
||||||
|
|
||||||
CGLM_EXPORT
|
|
||||||
void
|
|
||||||
glmc_vec_normalize(vec3 v);
|
|
||||||
|
|
||||||
CGLM_EXPORT
|
|
||||||
void
|
|
||||||
glmc_vec_add(vec3 v1, vec3 v2, vec3 dest);
|
|
||||||
|
|
||||||
CGLM_EXPORT
|
|
||||||
void
|
|
||||||
glmc_vec_adds(vec3 v, float s, vec3 dest);
|
|
||||||
|
|
||||||
CGLM_EXPORT
|
|
||||||
void
|
|
||||||
glmc_vec_sub(vec3 a, vec3 b, vec3 dest);
|
|
||||||
|
|
||||||
CGLM_EXPORT
|
|
||||||
void
|
|
||||||
glmc_vec_subs(vec3 v, float s, vec3 dest);
|
|
||||||
|
|
||||||
CGLM_EXPORT
|
|
||||||
void
|
|
||||||
glmc_vec_mul(vec3 a, vec3 b, vec3 d);
|
|
||||||
|
|
||||||
CGLM_EXPORT
|
|
||||||
void
|
|
||||||
glmc_vec_scale(vec3 v, float s, vec3 dest);
|
|
||||||
|
|
||||||
CGLM_EXPORT
|
|
||||||
void
|
|
||||||
glmc_vec_scale_as(vec3 v, float s, vec3 dest);
|
|
||||||
|
|
||||||
CGLM_EXPORT
|
|
||||||
void
|
|
||||||
glmc_vec_div(vec3 a, vec3 b, vec3 dest);
|
|
||||||
|
|
||||||
CGLM_EXPORT
|
|
||||||
void
|
|
||||||
glmc_vec_divs(vec3 a, float s, vec3 dest);
|
|
||||||
|
|
||||||
CGLM_EXPORT
|
|
||||||
void
|
|
||||||
glmc_vec_addadd(vec3 a, vec3 b, vec3 dest);
|
|
||||||
|
|
||||||
CGLM_EXPORT
|
|
||||||
void
|
|
||||||
glmc_vec_subadd(vec3 a, vec3 b, vec3 dest);
|
|
||||||
|
|
||||||
CGLM_EXPORT
|
|
||||||
void
|
|
||||||
glmc_vec_muladd(vec3 a, vec3 b, vec3 dest);
|
|
||||||
|
|
||||||
CGLM_EXPORT
|
|
||||||
void
|
|
||||||
glmc_vec_muladds(vec3 a, float s, vec3 dest);
|
|
||||||
|
|
||||||
CGLM_EXPORT
|
|
||||||
void
|
|
||||||
glmc_vec_flipsign(vec3 v);
|
|
||||||
|
|
||||||
CGLM_EXPORT
|
|
||||||
void
|
|
||||||
glmc_vec_flipsign_to(vec3 v, vec3 dest);
|
|
||||||
|
|
||||||
CGLM_EXPORT
|
|
||||||
void
|
|
||||||
glmc_vec_inv(vec3 v);
|
|
||||||
|
|
||||||
CGLM_EXPORT
|
|
||||||
void
|
|
||||||
glmc_vec_inv_to(vec3 v, vec3 dest);
|
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
float
|
float
|
||||||
glmc_vec_angle(vec3 v1, vec3 v2);
|
glmc_vec3_norm_one(vec3 v);
|
||||||
|
|
||||||
CGLM_EXPORT
|
|
||||||
void
|
|
||||||
glmc_vec_rotate(vec3 v, float angle, vec3 axis);
|
|
||||||
|
|
||||||
CGLM_EXPORT
|
|
||||||
void
|
|
||||||
glmc_vec_rotate_m4(mat4 m, vec3 v, vec3 dest);
|
|
||||||
|
|
||||||
CGLM_EXPORT
|
|
||||||
void
|
|
||||||
glmc_vec_proj(vec3 a, vec3 b, vec3 dest);
|
|
||||||
|
|
||||||
CGLM_EXPORT
|
|
||||||
void
|
|
||||||
glmc_vec_center(vec3 v1, vec3 v2, vec3 dest);
|
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
float
|
float
|
||||||
glmc_vec_distance(vec3 v1, vec3 v2);
|
glmc_vec3_norm_inf(vec3 v);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_maxv(vec3 v1, vec3 v2, vec3 dest);
|
glmc_vec3_normalize_to(vec3 v, vec3 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_minv(vec3 v1, vec3 v2, vec3 dest);
|
glmc_vec3_normalize(vec3 v);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_clamp(vec3 v, float minVal, float maxVal);
|
glmc_vec3_add(vec3 a, vec3 b, vec3 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_ortho(vec3 v, vec3 dest);
|
glmc_vec3_adds(vec3 v, float s, vec3 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_lerp(vec3 from, vec3 to, float t, vec3 dest);
|
glmc_vec3_sub(vec3 a, vec3 b, vec3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec3_subs(vec3 v, float s, vec3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec3_mul(vec3 a, vec3 b, vec3 d);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec3_scale(vec3 v, float s, vec3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec3_scale_as(vec3 v, float s, vec3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec3_div(vec3 a, vec3 b, vec3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec3_divs(vec3 a, float s, vec3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec3_addadd(vec3 a, vec3 b, vec3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec3_subadd(vec3 a, vec3 b, vec3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec3_muladd(vec3 a, vec3 b, vec3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec3_muladds(vec3 a, float s, vec3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec3_maxadd(vec3 a, vec3 b, vec3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec3_minadd(vec3 a, vec3 b, vec3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec3_negate(vec3 v);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec3_negate_to(vec3 v, vec3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_vec3_angle(vec3 a, vec3 b);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec3_rotate(vec3 v, float angle, vec3 axis);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec3_rotate_m4(mat4 m, vec3 v, vec3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec3_rotate_m3(mat3 m, vec3 v, vec3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec3_proj(vec3 a, vec3 b, vec3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec3_center(vec3 a, vec3 b, vec3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_vec3_distance2(vec3 a, vec3 b);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_vec3_distance(vec3 a, vec3 b);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec3_maxv(vec3 a, vec3 b, vec3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec3_minv(vec3 a, vec3 b, vec3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
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) {
|
||||||
|
glmc_vec3_lerp(from, to, t, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
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);
|
||||||
|
|
||||||
/* ext */
|
/* ext */
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_mulv(vec3 a, vec3 b, vec3 d);
|
glmc_vec3_mulv(vec3 a, vec3 b, vec3 d);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_broadcast(float val, vec3 d);
|
glmc_vec3_broadcast(float val, vec3 d);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec3_fill(vec3 v, float val);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
bool
|
bool
|
||||||
glmc_vec_eq(vec3 v, float val);
|
glmc_vec3_eq(vec3 v, float val);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
bool
|
bool
|
||||||
glmc_vec_eq_eps(vec3 v, float val);
|
glmc_vec3_eq_eps(vec3 v, float val);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
bool
|
bool
|
||||||
glmc_vec_eq_all(vec3 v);
|
glmc_vec3_eq_all(vec3 v);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
bool
|
bool
|
||||||
glmc_vec_eqv(vec3 v1, vec3 v2);
|
glmc_vec3_eqv(vec3 a, vec3 b);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
bool
|
bool
|
||||||
glmc_vec_eqv_eps(vec3 v1, vec3 v2);
|
glmc_vec3_eqv_eps(vec3 a, vec3 b);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
float
|
float
|
||||||
glmc_vec_max(vec3 v);
|
glmc_vec3_max(vec3 v);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
float
|
float
|
||||||
glmc_vec_min(vec3 v);
|
glmc_vec3_min(vec3 v);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
bool
|
bool
|
||||||
glmc_vec_isnan(vec3 v);
|
glmc_vec3_isnan(vec3 v);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
bool
|
bool
|
||||||
glmc_vec_isinf(vec3 v);
|
glmc_vec3_isinf(vec3 v);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
bool
|
bool
|
||||||
glmc_vec_isvalid(vec3 v);
|
glmc_vec3_isvalid(vec3 v);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_sign(vec3 v, vec3 dest);
|
glmc_vec3_sign(vec3 v, vec3 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_sqrt(vec3 v, vec3 dest);
|
glmc_vec3_abs(vec3 v, vec3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec3_fract(vec3 v, vec3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_vec3_hadd(vec3 v);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec3_sqrt(vec3 v, vec3 dest);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,8 +14,12 @@ extern "C" {
|
|||||||
#include "../cglm.h"
|
#include "../cglm.h"
|
||||||
|
|
||||||
/* DEPRECATED! use _copy, _ucopy versions */
|
/* DEPRECATED! use _copy, _ucopy versions */
|
||||||
#define glmc_vec4_dup3(v, dest) glmc_vec4_copy3(v, dest)
|
#define glmc_vec4_dup3(v, dest) glmc_vec4_copy3(v, dest)
|
||||||
#define glmc_vec4_dup(v, dest) glmc_vec4_copy(v, dest)
|
#define glmc_vec4_dup(v, dest) glmc_vec4_copy(v, dest)
|
||||||
|
#define glmc_vec4_flipsign(v) glmc_vec4_negate(v)
|
||||||
|
#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)
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
@@ -31,27 +35,39 @@ glmc_vec4_one(vec4 v);
|
|||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec4_copy3(vec4 a, vec3 dest);
|
glmc_vec4_copy3(vec4 v, vec3 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec4_copy(vec4 v, vec4 dest);
|
glmc_vec4_copy(vec4 v, vec4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec4_ucopy(vec4 v, vec4 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
float
|
float
|
||||||
glmc_vec4_dot(vec4 a, vec4 b);
|
glmc_vec4_dot(vec4 a, vec4 b);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
float
|
float
|
||||||
glmc_vec4_norm(vec4 vec);
|
glmc_vec4_norm(vec4 v);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
float
|
float
|
||||||
glmc_vec4_norm2(vec4 vec);
|
glmc_vec4_norm2(vec4 v);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_vec4_norm_one(vec4 v);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_vec4_norm_inf(vec4 v);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec4_normalize_to(vec4 vec, vec4 dest);
|
glmc_vec4_normalize_to(vec4 v, vec4 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
@@ -111,31 +127,35 @@ glmc_vec4_muladds(vec4 a, float s, vec4 dest);
|
|||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec4_flipsign(vec4 v);
|
glmc_vec4_maxadd(vec4 a, vec4 b, vec4 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec4_flipsign_to(vec4 v, vec4 dest);
|
glmc_vec4_minadd(vec4 a, vec4 b, vec4 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec4_inv(vec4 v);
|
glmc_vec4_negate(vec4 v);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec4_inv_to(vec4 v, vec4 dest);
|
glmc_vec4_negate_to(vec4 v, vec4 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
float
|
float
|
||||||
glmc_vec4_distance(vec4 v1, vec4 v2);
|
glmc_vec4_distance(vec4 a, vec4 b);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_vec4_distance2(vec4 a, vec4 b);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec4_maxv(vec4 v1, vec4 v2, vec4 dest);
|
glmc_vec4_maxv(vec4 a, vec4 b, vec4 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec4_minv(vec4 v1, vec4 v2, vec4 dest);
|
glmc_vec4_minv(vec4 a, vec4 b, vec4 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
@@ -145,6 +165,50 @@ CGLM_EXPORT
|
|||||||
void
|
void
|
||||||
glmc_vec4_lerp(vec4 from, vec4 to, float t, vec4 dest);
|
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) {
|
||||||
|
glmc_vec4_lerp(from, to, t, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
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);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec4_cubic(float s, vec4 dest);
|
||||||
|
|
||||||
/* ext */
|
/* ext */
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
@@ -155,6 +219,10 @@ CGLM_EXPORT
|
|||||||
void
|
void
|
||||||
glmc_vec4_broadcast(float val, vec4 d);
|
glmc_vec4_broadcast(float val, vec4 d);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec4_fill(vec4 v, float val);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
bool
|
bool
|
||||||
glmc_vec4_eq(vec4 v, float val);
|
glmc_vec4_eq(vec4 v, float val);
|
||||||
@@ -169,11 +237,11 @@ glmc_vec4_eq_all(vec4 v);
|
|||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
bool
|
bool
|
||||||
glmc_vec4_eqv(vec4 v1, vec4 v2);
|
glmc_vec4_eqv(vec4 a, vec4 b);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
bool
|
bool
|
||||||
glmc_vec4_eqv_eps(vec4 v1, vec4 v2);
|
glmc_vec4_eqv_eps(vec4 a, vec4 b);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
float
|
float
|
||||||
@@ -199,6 +267,18 @@ CGLM_EXPORT
|
|||||||
void
|
void
|
||||||
glmc_vec4_sign(vec4 v, vec4 dest);
|
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
|
||||||
|
float
|
||||||
|
glmc_vec4_hadd(vec4 v);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec4_sqrt(vec4 v, vec4 dest);
|
glmc_vec4_sqrt(vec4 v, vec4 dest);
|
||||||
|
|||||||
@@ -7,48 +7,37 @@
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
Functions:
|
Functions:
|
||||||
CGLM_INLINE void glm_frustum(float left,
|
CGLM_INLINE void glm_frustum(float left, float right,
|
||||||
float right,
|
float bottom, float top,
|
||||||
float bottom,
|
float nearVal, float farVal,
|
||||||
float top,
|
|
||||||
float nearVal,
|
|
||||||
float farVal,
|
|
||||||
mat4 dest)
|
mat4 dest)
|
||||||
CGLM_INLINE void glm_ortho(float left,
|
CGLM_INLINE void glm_ortho(float left, float right,
|
||||||
float right,
|
float bottom, float top,
|
||||||
float bottom,
|
float nearVal, float farVal,
|
||||||
float top,
|
|
||||||
float nearVal,
|
|
||||||
float farVal,
|
|
||||||
mat4 dest)
|
mat4 dest)
|
||||||
CGLM_INLINE void glm_ortho_aabb(vec3 box[2], mat4 dest)
|
CGLM_INLINE void glm_ortho_aabb(vec3 box[2], mat4 dest)
|
||||||
CGLM_INLINE void glm_ortho_aabb_p(vec3 box[2], float padding, mat4 dest)
|
CGLM_INLINE void glm_ortho_aabb_p(vec3 box[2], float padding, mat4 dest)
|
||||||
CGLM_INLINE void glm_ortho_aabb_pz(vec3 box[2], float padding, mat4 dest)
|
CGLM_INLINE void glm_ortho_aabb_pz(vec3 box[2], float padding, mat4 dest)
|
||||||
CGLM_INLINE void glm_ortho_default(float aspect, mat4 dest)
|
CGLM_INLINE void glm_ortho_default(float aspect, mat4 dest)
|
||||||
CGLM_INLINE void glm_ortho_default_s(float aspect, float size, mat4 dest)
|
CGLM_INLINE void glm_ortho_default_s(float aspect, float size, mat4 dest)
|
||||||
CGLM_INLINE void glm_perspective(float fovy,
|
CGLM_INLINE void glm_perspective(float fovy,
|
||||||
float aspect,
|
float aspect,
|
||||||
float nearVal,
|
float nearVal,
|
||||||
float farVal,
|
float farVal,
|
||||||
mat4 dest)
|
mat4 dest)
|
||||||
CGLM_INLINE void glm_perspective_default(float aspect, mat4 dest)
|
CGLM_INLINE void glm_perspective_default(float aspect, mat4 dest)
|
||||||
CGLM_INLINE void glm_perspective_resize(float aspect, mat4 proj)
|
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_lookat(vec3 eye, vec3 center, vec3 up, mat4 dest)
|
||||||
CGLM_INLINE void glm_look(vec3 eye, vec3 dir, vec3 up, mat4 dest)
|
CGLM_INLINE void glm_look(vec3 eye, vec3 dir, vec3 up, mat4 dest)
|
||||||
CGLM_INLINE void glm_look_anyup(vec3 eye, vec3 dir, mat4 dest)
|
CGLM_INLINE void glm_look_anyup(vec3 eye, vec3 dir, mat4 dest)
|
||||||
CGLM_INLINE void glm_persp_decomp(mat4 proj,
|
CGLM_INLINE void glm_persp_decomp(mat4 proj,
|
||||||
float *nearVal,
|
float *nearVal, float *farVal,
|
||||||
float *farVal,
|
float *top, float *bottom,
|
||||||
float *top,
|
float *left, float *right)
|
||||||
float *bottom,
|
|
||||||
float *left,
|
|
||||||
float *right)
|
|
||||||
CGLM_INLINE void glm_persp_decompv(mat4 proj, float dest[6])
|
CGLM_INLINE void glm_persp_decompv(mat4 proj, float dest[6])
|
||||||
CGLM_INLINE void glm_persp_decomp_x(mat4 proj, float *left, float *right)
|
CGLM_INLINE void glm_persp_decomp_x(mat4 proj, float *left, float *right)
|
||||||
CGLM_INLINE void glm_persp_decomp_y(mat4 proj, float *top, float *bottom)
|
CGLM_INLINE void glm_persp_decomp_y(mat4 proj, float *top, float *bottom)
|
||||||
CGLM_INLINE void glm_persp_decomp_z(mat4 proj,
|
CGLM_INLINE void glm_persp_decomp_z(mat4 proj, float *nearv, float *farv)
|
||||||
float *nearVal,
|
|
||||||
float *farVal)
|
|
||||||
CGLM_INLINE void glm_persp_decomp_far(mat4 proj, float *farVal)
|
CGLM_INLINE void glm_persp_decomp_far(mat4 proj, float *farVal)
|
||||||
CGLM_INLINE void glm_persp_decomp_near(mat4 proj, float *nearVal)
|
CGLM_INLINE void glm_persp_decomp_near(mat4 proj, float *nearVal)
|
||||||
CGLM_INLINE float glm_persp_fovy(mat4 proj)
|
CGLM_INLINE float glm_persp_fovy(mat4 proj)
|
||||||
@@ -75,16 +64,13 @@
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_frustum(float left,
|
glm_frustum(float left, float right,
|
||||||
float right,
|
float bottom, float top,
|
||||||
float bottom,
|
float nearVal, float farVal,
|
||||||
float top,
|
|
||||||
float nearVal,
|
|
||||||
float farVal,
|
|
||||||
mat4 dest) {
|
mat4 dest) {
|
||||||
float rl, tb, fn, nv;
|
float rl, tb, fn, nv;
|
||||||
|
|
||||||
glm__memzero(float, dest, sizeof(mat4));
|
glm_mat4_zero(dest);
|
||||||
|
|
||||||
rl = 1.0f / (right - left);
|
rl = 1.0f / (right - left);
|
||||||
tb = 1.0f / (top - bottom);
|
tb = 1.0f / (top - bottom);
|
||||||
@@ -113,16 +99,13 @@ glm_frustum(float left,
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_ortho(float left,
|
glm_ortho(float left, float right,
|
||||||
float right,
|
float bottom, float top,
|
||||||
float bottom,
|
float nearVal, float farVal,
|
||||||
float top,
|
|
||||||
float nearVal,
|
|
||||||
float farVal,
|
|
||||||
mat4 dest) {
|
mat4 dest) {
|
||||||
float rl, tb, fn;
|
float rl, tb, fn;
|
||||||
|
|
||||||
glm__memzero(float, dest, sizeof(mat4));
|
glm_mat4_zero(dest);
|
||||||
|
|
||||||
rl = 1.0f / (right - left);
|
rl = 1.0f / (right - left);
|
||||||
tb = 1.0f / (top - bottom);
|
tb = 1.0f / (top - bottom);
|
||||||
@@ -198,26 +181,15 @@ glm_ortho_aabb_pz(vec3 box[2], float padding, mat4 dest) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_ortho_default(float aspect,
|
glm_ortho_default(float aspect, mat4 dest) {
|
||||||
mat4 dest) {
|
|
||||||
if (aspect >= 1.0f) {
|
if (aspect >= 1.0f) {
|
||||||
glm_ortho(-1.0f * aspect,
|
glm_ortho(-aspect, aspect, -1.0f, 1.0f, -100.0f, 100.0f, dest);
|
||||||
1.0f * aspect,
|
return;
|
||||||
-1.0f,
|
|
||||||
1.0f,
|
|
||||||
-100.0f,
|
|
||||||
100.0f,
|
|
||||||
dest);
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
glm_ortho(-1.0f,
|
aspect = 1.0f / aspect;
|
||||||
1.0f,
|
|
||||||
-1.0f / aspect,
|
glm_ortho(-1.0f, 1.0f, -aspect, aspect, -100.0f, 100.0f, dest);
|
||||||
1.0f / aspect,
|
|
||||||
-100.0f,
|
|
||||||
100.0f,
|
|
||||||
dest);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -229,9 +201,7 @@ glm_ortho_default(float aspect,
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_ortho_default_s(float aspect,
|
glm_ortho_default_s(float aspect, float size, mat4 dest) {
|
||||||
float size,
|
|
||||||
mat4 dest) {
|
|
||||||
if (aspect >= 1.0f) {
|
if (aspect >= 1.0f) {
|
||||||
glm_ortho(-size * aspect,
|
glm_ortho(-size * aspect,
|
||||||
size * aspect,
|
size * aspect,
|
||||||
@@ -240,7 +210,7 @@ glm_ortho_default_s(float aspect,
|
|||||||
-size - 100.0f,
|
-size - 100.0f,
|
||||||
size + 100.0f,
|
size + 100.0f,
|
||||||
dest);
|
dest);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
glm_ortho(-size,
|
glm_ortho(-size,
|
||||||
@@ -270,7 +240,7 @@ glm_perspective(float fovy,
|
|||||||
mat4 dest) {
|
mat4 dest) {
|
||||||
float f, fn;
|
float f, fn;
|
||||||
|
|
||||||
glm__memzero(float, dest, sizeof(mat4));
|
glm_mat4_zero(dest);
|
||||||
|
|
||||||
f = 1.0f / tanf(fovy * 0.5f);
|
f = 1.0f / tanf(fovy * 0.5f);
|
||||||
fn = 1.0f / (nearVal - farVal);
|
fn = 1.0f / (nearVal - farVal);
|
||||||
@@ -282,6 +252,30 @@ glm_perspective(float fovy,
|
|||||||
dest[3][2] = 2.0f * nearVal * farVal * fn;
|
dest[3][2] = 2.0f * nearVal * farVal * fn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief extend perspective projection matrix's far distance
|
||||||
|
*
|
||||||
|
* this function does not guarantee far >= near, be aware of that!
|
||||||
|
*
|
||||||
|
* @param[in, out] proj projection matrix to extend
|
||||||
|
* @param[in] deltaFar distance from existing far (negative to shink)
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_persp_move_far(mat4 proj, float deltaFar) {
|
||||||
|
float fn, farVal, nearVal, p22, p32;
|
||||||
|
|
||||||
|
p22 = proj[2][2];
|
||||||
|
p32 = proj[3][2];
|
||||||
|
|
||||||
|
nearVal = p32 / (p22 - 1.0f);
|
||||||
|
farVal = p32 / (p22 + 1.0f) + deltaFar;
|
||||||
|
fn = 1.0f / (nearVal - farVal);
|
||||||
|
|
||||||
|
proj[2][2] = (nearVal + farVal) * fn;
|
||||||
|
proj[3][2] = 2.0f * nearVal * farVal * fn;
|
||||||
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief set up perspective projection matrix with default near/far
|
* @brief set up perspective projection matrix with default near/far
|
||||||
* and angle values
|
* and angle values
|
||||||
@@ -291,13 +285,8 @@ glm_perspective(float fovy,
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_perspective_default(float aspect,
|
glm_perspective_default(float aspect, mat4 dest) {
|
||||||
mat4 dest) {
|
glm_perspective(GLM_PI_4f, aspect, 0.01f, 100.0f, dest);
|
||||||
glm_perspective((float)CGLM_PI_4,
|
|
||||||
aspect,
|
|
||||||
0.01f,
|
|
||||||
100.0f,
|
|
||||||
dest);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -310,8 +299,7 @@ glm_perspective_default(float aspect,
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_perspective_resize(float aspect,
|
glm_perspective_resize(float aspect, mat4 proj) {
|
||||||
mat4 proj) {
|
|
||||||
if (proj[0][0] == 0.0f)
|
if (proj[0][0] == 0.0f)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -321,6 +309,9 @@ glm_perspective_resize(float aspect,
|
|||||||
/*!
|
/*!
|
||||||
* @brief set up view matrix
|
* @brief 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
|
||||||
|
*
|
||||||
* @param[in] eye eye vector
|
* @param[in] eye eye vector
|
||||||
* @param[in] center center vector
|
* @param[in] center center vector
|
||||||
* @param[in] up up vector
|
* @param[in] up up vector
|
||||||
@@ -328,19 +319,14 @@ glm_perspective_resize(float aspect,
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_lookat(vec3 eye,
|
glm_lookat(vec3 eye, vec3 center, vec3 up, mat4 dest) {
|
||||||
vec3 center,
|
CGLM_ALIGN(8) vec3 f, u, s;
|
||||||
vec3 up,
|
|
||||||
mat4 dest) {
|
|
||||||
vec3 f, u, s;
|
|
||||||
|
|
||||||
glm_vec_sub(center, eye, f);
|
glm_vec3_sub(center, eye, f);
|
||||||
glm_vec_normalize(f);
|
glm_vec3_normalize(f);
|
||||||
|
|
||||||
glm_vec_cross(f, up, s);
|
glm_vec3_crossn(f, up, s);
|
||||||
glm_vec_normalize(s);
|
glm_vec3_cross(s, f, u);
|
||||||
|
|
||||||
glm_vec_cross(s, f, u);
|
|
||||||
|
|
||||||
dest[0][0] = s[0];
|
dest[0][0] = s[0];
|
||||||
dest[0][1] = u[0];
|
dest[0][1] = u[0];
|
||||||
@@ -351,9 +337,9 @@ glm_lookat(vec3 eye,
|
|||||||
dest[2][0] = s[2];
|
dest[2][0] = s[2];
|
||||||
dest[2][1] = u[2];
|
dest[2][1] = u[2];
|
||||||
dest[2][2] =-f[2];
|
dest[2][2] =-f[2];
|
||||||
dest[3][0] =-glm_vec_dot(s, eye);
|
dest[3][0] =-glm_vec3_dot(s, eye);
|
||||||
dest[3][1] =-glm_vec_dot(u, eye);
|
dest[3][1] =-glm_vec3_dot(u, eye);
|
||||||
dest[3][2] = glm_vec_dot(f, eye);
|
dest[3][2] = glm_vec3_dot(f, eye);
|
||||||
dest[0][3] = dest[1][3] = dest[2][3] = 0.0f;
|
dest[0][3] = dest[1][3] = dest[2][3] = 0.0f;
|
||||||
dest[3][3] = 1.0f;
|
dest[3][3] = 1.0f;
|
||||||
}
|
}
|
||||||
@@ -364,6 +350,9 @@ glm_lookat(vec3 eye,
|
|||||||
* convenient wrapper for lookat: if you only have direction not target self
|
* convenient wrapper for lookat: if you only have direction not target self
|
||||||
* then this might be useful. Because you need to get target from direction.
|
* 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
|
||||||
|
*
|
||||||
* @param[in] eye eye vector
|
* @param[in] eye eye vector
|
||||||
* @param[in] dir direction vector
|
* @param[in] dir direction vector
|
||||||
* @param[in] up up vector
|
* @param[in] up up vector
|
||||||
@@ -372,8 +361,8 @@ glm_lookat(vec3 eye,
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_look(vec3 eye, vec3 dir, vec3 up, mat4 dest) {
|
glm_look(vec3 eye, vec3 dir, vec3 up, mat4 dest) {
|
||||||
vec3 target;
|
CGLM_ALIGN(8) vec3 target;
|
||||||
glm_vec_add(eye, dir, target);
|
glm_vec3_add(eye, dir, target);
|
||||||
glm_lookat(eye, target, up, dest);
|
glm_lookat(eye, target, up, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -390,8 +379,8 @@ glm_look(vec3 eye, vec3 dir, vec3 up, mat4 dest) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_look_anyup(vec3 eye, vec3 dir, mat4 dest) {
|
glm_look_anyup(vec3 eye, vec3 dir, mat4 dest) {
|
||||||
vec3 up;
|
CGLM_ALIGN(8) vec3 up;
|
||||||
glm_vec_ortho(dir, up);
|
glm_vec3_ortho(dir, up);
|
||||||
glm_look(eye, dir, up, dest);
|
glm_look(eye, dir, up, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -409,12 +398,9 @@ glm_look_anyup(vec3 eye, vec3 dir, mat4 dest) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_persp_decomp(mat4 proj,
|
glm_persp_decomp(mat4 proj,
|
||||||
float * __restrict nearVal,
|
float * __restrict nearVal, float * __restrict farVal,
|
||||||
float * __restrict farVal,
|
float * __restrict top, float * __restrict bottom,
|
||||||
float * __restrict top,
|
float * __restrict left, float * __restrict right) {
|
||||||
float * __restrict bottom,
|
|
||||||
float * __restrict left,
|
|
||||||
float * __restrict right) {
|
|
||||||
float m00, m11, m20, m21, m22, m32, n, f;
|
float m00, m11, m20, m21, m22, m32, n, f;
|
||||||
float n_m11, n_m00;
|
float n_m11, n_m00;
|
||||||
|
|
||||||
|
|||||||
@@ -9,10 +9,12 @@
|
|||||||
#define cglm_h
|
#define cglm_h
|
||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
#include "vec2.h"
|
||||||
#include "vec3.h"
|
#include "vec3.h"
|
||||||
#include "vec4.h"
|
#include "vec4.h"
|
||||||
#include "mat4.h"
|
#include "mat4.h"
|
||||||
#include "mat3.h"
|
#include "mat3.h"
|
||||||
|
#include "mat2.h"
|
||||||
#include "affine.h"
|
#include "affine.h"
|
||||||
#include "cam.h"
|
#include "cam.h"
|
||||||
#include "frustum.h"
|
#include "frustum.h"
|
||||||
@@ -24,5 +26,11 @@
|
|||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "io.h"
|
#include "io.h"
|
||||||
#include "project.h"
|
#include "project.h"
|
||||||
|
#include "sphere.h"
|
||||||
|
#include "ease.h"
|
||||||
|
#include "curve.h"
|
||||||
|
#include "bezier.h"
|
||||||
|
#include "ray.h"
|
||||||
|
#include "affine2d.h"
|
||||||
|
|
||||||
#endif /* cglm_h */
|
#endif /* cglm_h */
|
||||||
|
|||||||
@@ -8,14 +8,24 @@
|
|||||||
#ifndef cglm_common_h
|
#ifndef cglm_common_h
|
||||||
#define cglm_common_h
|
#define cglm_common_h
|
||||||
|
|
||||||
#define _USE_MATH_DEFINES /* for windows */
|
#ifndef _USE_MATH_DEFINES
|
||||||
|
# define _USE_MATH_DEFINES /* for windows */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef _CRT_SECURE_NO_WARNINGS
|
||||||
|
# define _CRT_SECURE_NO_WARNINGS /* for windows */
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <stddef.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <float.h>
|
#include <float.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
#if defined(_MSC_VER)
|
#if defined(_MSC_VER)
|
||||||
# ifdef CGLM_DLL
|
# ifdef CGLM_STATIC
|
||||||
|
# define CGLM_EXPORT
|
||||||
|
# elif defined(CGLM_EXPORTS)
|
||||||
# define CGLM_EXPORT __declspec(dllexport)
|
# define CGLM_EXPORT __declspec(dllexport)
|
||||||
# else
|
# else
|
||||||
# define CGLM_EXPORT __declspec(dllimport)
|
# define CGLM_EXPORT __declspec(dllimport)
|
||||||
@@ -26,35 +36,18 @@
|
|||||||
# define CGLM_INLINE static inline __attribute((always_inline))
|
# define CGLM_INLINE static inline __attribute((always_inline))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define glm__memcpy(type, dest, src, size) \
|
#define GLM_SHUFFLE4(z, y, x, w) (((z) << 6) | ((y) << 4) | ((x) << 2) | (w))
|
||||||
do { \
|
#define GLM_SHUFFLE3(z, y, x) (((z) << 4) | ((y) << 2) | (x))
|
||||||
type *srci; \
|
|
||||||
type *srci_end; \
|
|
||||||
type *desti; \
|
|
||||||
\
|
|
||||||
srci = (type *)src; \
|
|
||||||
srci_end = (type *)((char *)srci + size); \
|
|
||||||
desti = (type *)dest; \
|
|
||||||
\
|
|
||||||
while (srci != srci_end) \
|
|
||||||
*desti++ = *srci++; \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define glm__memset(type, dest, size, val) \
|
|
||||||
do { \
|
|
||||||
type *desti; \
|
|
||||||
type *desti_end; \
|
|
||||||
\
|
|
||||||
desti = (type *)dest; \
|
|
||||||
desti_end = (type *)((char *)desti + size); \
|
|
||||||
\
|
|
||||||
while (desti != desti_end) \
|
|
||||||
*desti++ = val; \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define glm__memzero(type, dest, size) glm__memset(type, dest, size, 0)
|
|
||||||
|
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
#include "simd/intrin.h"
|
#include "simd/intrin.h"
|
||||||
|
|
||||||
|
#ifndef CGLM_USE_DEFAULT_EPSILON
|
||||||
|
# ifndef GLM_FLT_EPSILON
|
||||||
|
# define GLM_FLT_EPSILON 1e-6
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
# define GLM_FLT_EPSILON FLT_EPSILON
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* cglm_common_h */
|
#endif /* cglm_common_h */
|
||||||
|
|||||||
40
include/cglm/curve.h
Normal file
40
include/cglm/curve.h
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglm_curve_h
|
||||||
|
#define cglm_curve_h
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "vec4.h"
|
||||||
|
#include "mat4.h"
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief helper function to calculate S*M*C multiplication for curves
|
||||||
|
*
|
||||||
|
* This function does not encourage you to use SMC,
|
||||||
|
* instead it is a helper if you use SMC.
|
||||||
|
*
|
||||||
|
* if you want to specify S as vector then use more generic glm_mat4_rmc() func.
|
||||||
|
*
|
||||||
|
* Example usage:
|
||||||
|
* B(s) = glm_smc(s, GLM_BEZIER_MAT, (vec4){p0, c0, c1, p1})
|
||||||
|
*
|
||||||
|
* @param[in] s parameter between 0 and 1 (this will be [s3, s2, s, 1])
|
||||||
|
* @param[in] m basis matrix
|
||||||
|
* @param[in] c position/control vector
|
||||||
|
*
|
||||||
|
* @return B(s)
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_smc(float s, mat4 m, vec4 c) {
|
||||||
|
vec4 vs;
|
||||||
|
glm_vec4_cubic(s, vs);
|
||||||
|
return glm_mat4_rmc(vs, m, c);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* cglm_curve_h */
|
||||||
317
include/cglm/ease.h
Normal file
317
include/cglm/ease.h
Normal file
@@ -0,0 +1,317 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglm_ease_h
|
||||||
|
#define cglm_ease_h
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_ease_linear(float t) {
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_ease_sine_in(float t) {
|
||||||
|
return sinf((t - 1.0f) * GLM_PI_2f) + 1.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_ease_sine_out(float t) {
|
||||||
|
return sinf(t * GLM_PI_2f);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_ease_sine_inout(float t) {
|
||||||
|
return 0.5f * (1.0f - cosf(t * GLM_PIf));
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_ease_quad_in(float t) {
|
||||||
|
return t * t;
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_ease_quad_out(float t) {
|
||||||
|
return -(t * (t - 2.0f));
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_ease_quad_inout(float t) {
|
||||||
|
float tt;
|
||||||
|
|
||||||
|
tt = t * t;
|
||||||
|
if (t < 0.5f)
|
||||||
|
return 2.0f * tt;
|
||||||
|
|
||||||
|
return (-2.0f * tt) + (4.0f * t) - 1.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_ease_cubic_in(float t) {
|
||||||
|
return t * t * t;
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_ease_cubic_out(float t) {
|
||||||
|
float f;
|
||||||
|
f = t - 1.0f;
|
||||||
|
return f * f * f + 1.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_ease_cubic_inout(float t) {
|
||||||
|
float f;
|
||||||
|
|
||||||
|
if (t < 0.5f)
|
||||||
|
return 4.0f * t * t * t;
|
||||||
|
|
||||||
|
f = 2.0f * t - 2.0f;
|
||||||
|
|
||||||
|
return 0.5f * f * f * f + 1.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_ease_quart_in(float t) {
|
||||||
|
float f;
|
||||||
|
f = t * t;
|
||||||
|
return f * f;
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_ease_quart_out(float t) {
|
||||||
|
float f;
|
||||||
|
|
||||||
|
f = t - 1.0f;
|
||||||
|
|
||||||
|
return f * f * f * (1.0f - t) + 1.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_ease_quart_inout(float t) {
|
||||||
|
float f, g;
|
||||||
|
|
||||||
|
if (t < 0.5f) {
|
||||||
|
f = t * t;
|
||||||
|
return 8.0f * f * f;
|
||||||
|
}
|
||||||
|
|
||||||
|
f = t - 1.0f;
|
||||||
|
g = f * f;
|
||||||
|
|
||||||
|
return -8.0f * g * g + 1.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_ease_quint_in(float t) {
|
||||||
|
float f;
|
||||||
|
f = t * t;
|
||||||
|
return f * f * t;
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_ease_quint_out(float t) {
|
||||||
|
float f, g;
|
||||||
|
|
||||||
|
f = t - 1.0f;
|
||||||
|
g = f * f;
|
||||||
|
|
||||||
|
return g * g * f + 1.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_ease_quint_inout(float t) {
|
||||||
|
float f, g;
|
||||||
|
|
||||||
|
if (t < 0.5f) {
|
||||||
|
f = t * t;
|
||||||
|
return 16.0f * f * f * t;
|
||||||
|
}
|
||||||
|
|
||||||
|
f = 2.0f * t - 2.0f;
|
||||||
|
g = f * f;
|
||||||
|
|
||||||
|
return 0.5f * g * g * f + 1.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_ease_exp_in(float t) {
|
||||||
|
if (t == 0.0f)
|
||||||
|
return t;
|
||||||
|
|
||||||
|
return powf(2.0f, 10.0f * (t - 1.0f));
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_ease_exp_out(float t) {
|
||||||
|
if (t == 1.0f)
|
||||||
|
return t;
|
||||||
|
|
||||||
|
return 1.0f - powf(2.0f, -10.0f * t);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_ease_exp_inout(float t) {
|
||||||
|
if (t == 0.0f || t == 1.0f)
|
||||||
|
return t;
|
||||||
|
|
||||||
|
if (t < 0.5f)
|
||||||
|
return 0.5f * powf(2.0f, (20.0f * t) - 10.0f);
|
||||||
|
|
||||||
|
return -0.5f * powf(2.0f, (-20.0f * t) + 10.0f) + 1.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_ease_circ_in(float t) {
|
||||||
|
return 1.0f - sqrtf(1.0f - (t * t));
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_ease_circ_out(float t) {
|
||||||
|
return sqrtf((2.0f - t) * t);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_ease_circ_inout(float t) {
|
||||||
|
if (t < 0.5f)
|
||||||
|
return 0.5f * (1.0f - sqrtf(1.0f - 4.0f * (t * t)));
|
||||||
|
|
||||||
|
return 0.5f * (sqrtf(-((2.0f * t) - 3.0f) * ((2.0f * t) - 1.0f)) + 1.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_ease_back_in(float t) {
|
||||||
|
float o, z;
|
||||||
|
|
||||||
|
o = 1.70158f;
|
||||||
|
z = ((o + 1.0f) * t) - o;
|
||||||
|
|
||||||
|
return t * t * z;
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_ease_back_out(float t) {
|
||||||
|
float o, z, n;
|
||||||
|
|
||||||
|
o = 1.70158f;
|
||||||
|
n = t - 1.0f;
|
||||||
|
z = (o + 1.0f) * n + o;
|
||||||
|
|
||||||
|
return n * n * z + 1.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_ease_back_inout(float t) {
|
||||||
|
float o, z, n, m, s, x;
|
||||||
|
|
||||||
|
o = 1.70158f;
|
||||||
|
s = o * 1.525f;
|
||||||
|
x = 0.5;
|
||||||
|
n = t / 0.5f;
|
||||||
|
|
||||||
|
if (n < 1.0f) {
|
||||||
|
z = (s + 1) * n - s;
|
||||||
|
m = n * n * z;
|
||||||
|
return x * m;
|
||||||
|
}
|
||||||
|
|
||||||
|
n -= 2.0f;
|
||||||
|
z = (s + 1.0f) * n + s;
|
||||||
|
m = (n * n * z) + 2;
|
||||||
|
|
||||||
|
return x * m;
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_ease_elast_in(float t) {
|
||||||
|
return sinf(13.0f * GLM_PI_2f * t) * powf(2.0f, 10.0f * (t - 1.0f));
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_ease_elast_out(float t) {
|
||||||
|
return sinf(-13.0f * GLM_PI_2f * (t + 1.0f)) * powf(2.0f, -10.0f * t) + 1.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_ease_elast_inout(float t) {
|
||||||
|
float a;
|
||||||
|
|
||||||
|
a = 2.0f * t;
|
||||||
|
|
||||||
|
if (t < 0.5f)
|
||||||
|
return 0.5f * sinf(13.0f * GLM_PI_2f * a)
|
||||||
|
* powf(2.0f, 10.0f * (a - 1.0f));
|
||||||
|
|
||||||
|
return 0.5f * (sinf(-13.0f * GLM_PI_2f * a)
|
||||||
|
* powf(2.0f, -10.0f * (a - 1.0f)) + 2.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_ease_bounce_out(float t) {
|
||||||
|
float tt;
|
||||||
|
|
||||||
|
tt = t * t;
|
||||||
|
|
||||||
|
if (t < (4.0f / 11.0f))
|
||||||
|
return (121.0f * tt) / 16.0f;
|
||||||
|
|
||||||
|
if (t < 8.0f / 11.0f)
|
||||||
|
return ((363.0f / 40.0f) * tt) - ((99.0f / 10.0f) * t) + (17.0f / 5.0f);
|
||||||
|
|
||||||
|
if (t < (9.0f / 10.0f))
|
||||||
|
return (4356.0f / 361.0f) * tt
|
||||||
|
- (35442.0f / 1805.0f) * t
|
||||||
|
+ (16061.0f / 1805.0f);
|
||||||
|
|
||||||
|
return ((54.0f / 5.0f) * tt) - ((513.0f / 25.0f) * t) + (268.0f / 25.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_ease_bounce_in(float t) {
|
||||||
|
return 1.0f - glm_ease_bounce_out(1.0f - t);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_ease_bounce_inout(float t) {
|
||||||
|
if (t < 0.5f)
|
||||||
|
return 0.5f * (1.0f - glm_ease_bounce_out(t * 2.0f));
|
||||||
|
|
||||||
|
return 0.5f * glm_ease_bounce_out(t * 2.0f - 1.0f) + 0.5f;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* cglm_ease_h */
|
||||||
@@ -15,10 +15,10 @@
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
Types:
|
Types:
|
||||||
enum glm_euler_sq
|
enum glm_euler_seq
|
||||||
|
|
||||||
Functions:
|
Functions:
|
||||||
CGLM_INLINE glm_euler_sq glm_euler_order(int newOrder[3]);
|
CGLM_INLINE glm_euler_seq glm_euler_order(int newOrder[3]);
|
||||||
CGLM_INLINE void glm_euler_angles(mat4 m, vec3 dest);
|
CGLM_INLINE void glm_euler_angles(mat4 m, vec3 dest);
|
||||||
CGLM_INLINE void glm_euler(vec3 angles, mat4 dest);
|
CGLM_INLINE void glm_euler(vec3 angles, mat4 dest);
|
||||||
CGLM_INLINE void glm_euler_xyz(vec3 angles, mat4 dest);
|
CGLM_INLINE void glm_euler_xyz(vec3 angles, mat4 dest);
|
||||||
@@ -28,7 +28,7 @@
|
|||||||
CGLM_INLINE void glm_euler_yzx(vec3 angles, mat4 dest);
|
CGLM_INLINE void glm_euler_yzx(vec3 angles, mat4 dest);
|
||||||
CGLM_INLINE void glm_euler_yxz(vec3 angles, mat4 dest);
|
CGLM_INLINE void glm_euler_yxz(vec3 angles, mat4 dest);
|
||||||
CGLM_INLINE void glm_euler_by_order(vec3 angles,
|
CGLM_INLINE void glm_euler_by_order(vec3 angles,
|
||||||
glm_euler_sq ord,
|
glm_euler_seq ord,
|
||||||
mat4 dest);
|
mat4 dest);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -41,24 +41,24 @@
|
|||||||
* if you have axis order like vec3 orderVec = [0, 1, 2] or [0, 2, 1]...
|
* if you have axis order like vec3 orderVec = [0, 1, 2] or [0, 2, 1]...
|
||||||
* vector then you can convert it to this enum by doing this:
|
* vector then you can convert it to this enum by doing this:
|
||||||
* @code
|
* @code
|
||||||
* glm_euler_sq order;
|
* glm_euler_seq order;
|
||||||
* order = orderVec[0] | orderVec[1] << 2 | orderVec[2] << 4;
|
* order = orderVec[0] | orderVec[1] << 2 | orderVec[2] << 4;
|
||||||
* @endcode
|
* @endcode
|
||||||
* you may need to explicit cast if required
|
* you may need to explicit cast if required
|
||||||
*/
|
*/
|
||||||
typedef enum glm_euler_sq {
|
typedef enum glm_euler_seq {
|
||||||
GLM_EULER_XYZ = 0 << 0 | 1 << 2 | 2 << 4,
|
GLM_EULER_XYZ = 0 << 0 | 1 << 2 | 2 << 4,
|
||||||
GLM_EULER_XZY = 0 << 0 | 2 << 2 | 1 << 4,
|
GLM_EULER_XZY = 0 << 0 | 2 << 2 | 1 << 4,
|
||||||
GLM_EULER_YZX = 1 << 0 | 2 << 2 | 0 << 4,
|
GLM_EULER_YZX = 1 << 0 | 2 << 2 | 0 << 4,
|
||||||
GLM_EULER_YXZ = 1 << 0 | 0 << 2 | 2 << 4,
|
GLM_EULER_YXZ = 1 << 0 | 0 << 2 | 2 << 4,
|
||||||
GLM_EULER_ZXY = 2 << 0 | 0 << 2 | 1 << 4,
|
GLM_EULER_ZXY = 2 << 0 | 0 << 2 | 1 << 4,
|
||||||
GLM_EULER_ZYX = 2 << 0 | 1 << 2 | 0 << 4
|
GLM_EULER_ZYX = 2 << 0 | 1 << 2 | 0 << 4
|
||||||
} glm_euler_sq;
|
} glm_euler_seq;
|
||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
glm_euler_sq
|
glm_euler_seq
|
||||||
glm_euler_order(int ord[3]) {
|
glm_euler_order(int ord[3]) {
|
||||||
return (glm_euler_sq)(ord[0] << 0 | ord[1] << 2 | ord[2] << 4);
|
return (glm_euler_seq)(ord[0] << 0 | ord[1] << 2 | ord[2] << 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -84,12 +84,12 @@ glm_euler_angles(mat4 m, vec3 dest) {
|
|||||||
thetaZ = atan2f(-m10, m00);
|
thetaZ = atan2f(-m10, m00);
|
||||||
} else { /* m20 == -1 */
|
} else { /* m20 == -1 */
|
||||||
/* Not a unique solution */
|
/* Not a unique solution */
|
||||||
thetaY = -CGLM_PI_2;
|
thetaY = -GLM_PI_2f;
|
||||||
thetaX = -atan2f(m01, m11);
|
thetaX = -atan2f(m01, m11);
|
||||||
thetaZ = 0.0f;
|
thetaZ = 0.0f;
|
||||||
}
|
}
|
||||||
} else { /* m20 == +1 */
|
} else { /* m20 == +1 */
|
||||||
thetaY = CGLM_PI_2;
|
thetaY = GLM_PI_2f;
|
||||||
thetaX = atan2f(m01, m11);
|
thetaX = atan2f(m01, m11);
|
||||||
thetaZ = 0.0f;
|
thetaZ = 0.0f;
|
||||||
}
|
}
|
||||||
@@ -352,7 +352,7 @@ glm_euler_zyx(vec3 angles, mat4 dest) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_euler_by_order(vec3 angles, glm_euler_sq ord, mat4 dest) {
|
glm_euler_by_order(vec3 angles, glm_euler_seq ord, mat4 dest) {
|
||||||
float cx, cy, cz,
|
float cx, cy, cz,
|
||||||
sx, sy, sz;
|
sx, sy, sz;
|
||||||
|
|
||||||
|
|||||||
@@ -65,7 +65,7 @@
|
|||||||
* Exracted planes order: [left, right, bottom, top, near, far]
|
* Exracted planes order: [left, right, bottom, top, near, far]
|
||||||
*
|
*
|
||||||
* @param[in] m matrix (see brief)
|
* @param[in] m matrix (see brief)
|
||||||
* @param[out] dest exracted view frustum planes (see brief)
|
* @param[out] dest extracted view frustum planes (see brief)
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
@@ -106,7 +106,7 @@ glm_frustum_planes(mat4 m, vec4 dest[6]) {
|
|||||||
*
|
*
|
||||||
* Find center coordinates:
|
* Find center coordinates:
|
||||||
* for (j = 0; j < 4; j++) {
|
* for (j = 0; j < 4; j++) {
|
||||||
* glm_vec_center(corners[i], corners[i + 4], centerCorners[i]);
|
* glm_vec3_center(corners[i], corners[i + 4], centerCorners[i]);
|
||||||
* }
|
* }
|
||||||
*
|
*
|
||||||
* @param[in] invMat matrix (see brief)
|
* @param[in] invMat matrix (see brief)
|
||||||
@@ -187,8 +187,8 @@ glm_frustum_box(vec4 corners[8], mat4 m, vec3 box[2]) {
|
|||||||
vec3 min, max;
|
vec3 min, max;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
glm_vec_broadcast(FLT_MAX, min);
|
glm_vec3_broadcast(FLT_MAX, min);
|
||||||
glm_vec_broadcast(-FLT_MAX, max);
|
glm_vec3_broadcast(-FLT_MAX, max);
|
||||||
|
|
||||||
for (i = 0; i < 8; i++) {
|
for (i = 0; i < 8; i++) {
|
||||||
glm_mat4_mulv(m, corners[i], v);
|
glm_mat4_mulv(m, corners[i], v);
|
||||||
@@ -202,8 +202,8 @@ glm_frustum_box(vec4 corners[8], mat4 m, vec3 box[2]) {
|
|||||||
max[2] = glm_max(max[2], v[2]);
|
max[2] = glm_max(max[2], v[2]);
|
||||||
}
|
}
|
||||||
|
|
||||||
glm_vec_copy(min, box[0]);
|
glm_vec3_copy(min, box[0]);
|
||||||
glm_vec_copy(max, box[1]);
|
glm_vec3_copy(max, box[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -228,7 +228,7 @@ glm_frustum_corners_at(vec4 corners[8],
|
|||||||
float dist, sc;
|
float dist, sc;
|
||||||
|
|
||||||
/* because distance and scale is same for all */
|
/* because distance and scale is same for all */
|
||||||
dist = glm_vec_distance(corners[GLM_RTF], corners[GLM_RTN]);
|
dist = glm_vec3_distance(corners[GLM_RTF], corners[GLM_RTN]);
|
||||||
sc = dist * (splitDist / farDist);
|
sc = dist * (splitDist / farDist);
|
||||||
|
|
||||||
/* left bottom */
|
/* left bottom */
|
||||||
|
|||||||
@@ -15,69 +15,130 @@
|
|||||||
CGLM_INLINE void glm_versor_print(versor vec, FILE *ostream);
|
CGLM_INLINE void glm_versor_print(versor vec, FILE *ostream);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
cglm tried to enable print functions in debug mode and disable them in
|
||||||
|
release/production mode to eliminate printing costs.
|
||||||
|
|
||||||
|
if you need to force enable then define CGLM_DEFINE_PRINTS macro not DEBUG one
|
||||||
|
|
||||||
|
Print functions are enabled if:
|
||||||
|
|
||||||
|
- DEBUG or _DEBUG macro is defined (mostly defined automatically in debugging)
|
||||||
|
- CGLM_DEFINE_PRINTS macro is defined including release/production
|
||||||
|
which makes enabled printing always
|
||||||
|
- glmc_ calls for io are always prints
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* DEPRECATED: CGLM_NO_PRINTS_NOOP (use CGLM_DEFINE_PRINTS) */
|
||||||
|
|
||||||
#ifndef cglm_io_h
|
#ifndef cglm_io_h
|
||||||
#define cglm_io_h
|
#define cglm_io_h
|
||||||
|
#if defined(DEBUG) || defined(_DEBUG) \
|
||||||
|
|| defined(CGLM_DEFINE_PRINTS) || defined(CGLM_LIB_SRC) \
|
||||||
|
|| defined(CGLM_NO_PRINTS_NOOP)
|
||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#ifndef CGLM_PRINT_PRECISION
|
||||||
|
# define CGLM_PRINT_PRECISION 5
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef CGLM_PRINT_MAX_TO_SHORT
|
||||||
|
# define CGLM_PRINT_MAX_TO_SHORT 1e5
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef CGLM_PRINT_COLOR
|
||||||
|
# define CGLM_PRINT_COLOR "\033[36m"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef CGLM_PRINT_COLOR_RESET
|
||||||
|
# define CGLM_PRINT_COLOR_RESET "\033[0m"
|
||||||
|
#endif
|
||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat4_print(mat4 matrix,
|
glm_mat4_print(mat4 matrix,
|
||||||
FILE * __restrict ostream) {
|
FILE * __restrict ostream) {
|
||||||
int i;
|
char buff[16];
|
||||||
int j;
|
int i, j, cw[4], cwi;
|
||||||
|
|
||||||
#define m 4
|
#define m 4
|
||||||
#define n 4
|
#define n 4
|
||||||
|
|
||||||
fprintf(ostream, "Matrix (float%dx%d):\n", m, n);
|
fprintf(ostream, "Matrix (float%dx%d): " CGLM_PRINT_COLOR "\n" , m, n);
|
||||||
|
|
||||||
|
cw[0] = cw[1] = cw[2] = cw[3] = 0;
|
||||||
|
|
||||||
for (i = 0; i < m; i++) {
|
for (i = 0; i < m; i++) {
|
||||||
fprintf(ostream, "\t|");
|
|
||||||
for (j = 0; j < n; j++) {
|
for (j = 0; j < n; j++) {
|
||||||
fprintf(ostream, "%0.4f", matrix[j][i]);;
|
if (matrix[i][j] < CGLM_PRINT_MAX_TO_SHORT)
|
||||||
|
cwi = sprintf(buff, "% .*f", CGLM_PRINT_PRECISION, matrix[i][j]);
|
||||||
if (j != n - 1)
|
else
|
||||||
fprintf(ostream, "\t");
|
cwi = sprintf(buff, "% g", matrix[i][j]);
|
||||||
|
cw[i] = GLM_MAX(cw[i], cwi);
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(ostream, "|\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(ostream, "\n");
|
for (i = 0; i < m; i++) {
|
||||||
|
fprintf(ostream, " |");
|
||||||
|
|
||||||
|
for (j = 0; j < n; j++)
|
||||||
|
if (matrix[i][j] < CGLM_PRINT_MAX_TO_SHORT)
|
||||||
|
fprintf(ostream, " % *.*f", cw[j], CGLM_PRINT_PRECISION, matrix[j][i]);
|
||||||
|
else
|
||||||
|
fprintf(ostream, " % *g", cw[j], matrix[j][i]);
|
||||||
|
|
||||||
|
fprintf(ostream, " |\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(ostream, CGLM_PRINT_COLOR_RESET "\n");
|
||||||
|
|
||||||
#undef m
|
#undef m
|
||||||
#undef n
|
#undef n
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat3_print(mat3 matrix,
|
glm_mat3_print(mat3 matrix,
|
||||||
FILE * __restrict ostream) {
|
FILE * __restrict ostream) {
|
||||||
int i;
|
char buff[16];
|
||||||
int j;
|
int i, j, cw[4], cwi;
|
||||||
|
|
||||||
#define m 3
|
#define m 3
|
||||||
#define n 3
|
#define n 3
|
||||||
|
|
||||||
fprintf(ostream, "Matrix (float%dx%d):\n", m, n);
|
fprintf(ostream, "Matrix (float%dx%d): " CGLM_PRINT_COLOR "\n", m, n);
|
||||||
|
|
||||||
|
cw[0] = cw[1] = cw[2] = 0;
|
||||||
|
|
||||||
for (i = 0; i < m; i++) {
|
for (i = 0; i < m; i++) {
|
||||||
fprintf(ostream, "\t|");
|
|
||||||
for (j = 0; j < n; j++) {
|
for (j = 0; j < n; j++) {
|
||||||
fprintf(ostream, "%0.4f", matrix[j][i]);;
|
if (matrix[i][j] < CGLM_PRINT_MAX_TO_SHORT)
|
||||||
|
cwi = sprintf(buff, "% .*f", CGLM_PRINT_PRECISION, matrix[i][j]);
|
||||||
if (j != n - 1)
|
else
|
||||||
fprintf(ostream, "\t");
|
cwi = sprintf(buff, "% g", matrix[i][j]);
|
||||||
|
cw[i] = GLM_MAX(cw[i], cwi);
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(ostream, "|\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(ostream, "\n");
|
for (i = 0; i < m; i++) {
|
||||||
|
fprintf(ostream, " |");
|
||||||
|
|
||||||
|
for (j = 0; j < n; j++)
|
||||||
|
if (matrix[i][j] < CGLM_PRINT_MAX_TO_SHORT)
|
||||||
|
fprintf(ostream, " % *.*f", cw[j], CGLM_PRINT_PRECISION, matrix[j][i]);
|
||||||
|
else
|
||||||
|
fprintf(ostream, " % *g", cw[j], matrix[j][i]);
|
||||||
|
|
||||||
|
fprintf(ostream, " |\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(ostream, CGLM_PRINT_COLOR_RESET "\n");
|
||||||
|
|
||||||
#undef m
|
#undef m
|
||||||
#undef n
|
#undef n
|
||||||
@@ -85,88 +146,149 @@ glm_mat3_print(mat3 matrix,
|
|||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec4_print(vec4 vec,
|
glm_mat2_print(mat2 matrix,
|
||||||
|
FILE * __restrict ostream) {
|
||||||
|
char buff[16];
|
||||||
|
int i, j, cw[4], cwi;
|
||||||
|
|
||||||
|
#define m 2
|
||||||
|
#define n 2
|
||||||
|
|
||||||
|
fprintf(ostream, "Matrix (float%dx%d): " CGLM_PRINT_COLOR "\n", m, n);
|
||||||
|
|
||||||
|
cw[0] = cw[1] = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < m; i++) {
|
||||||
|
for (j = 0; j < n; j++) {
|
||||||
|
if (matrix[i][j] < CGLM_PRINT_MAX_TO_SHORT)
|
||||||
|
cwi = sprintf(buff, "% .*f", CGLM_PRINT_PRECISION, matrix[i][j]);
|
||||||
|
else
|
||||||
|
cwi = sprintf(buff, "% g", matrix[i][j]);
|
||||||
|
cw[i] = GLM_MAX(cw[i], cwi);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < m; i++) {
|
||||||
|
fprintf(ostream, " |");
|
||||||
|
|
||||||
|
for (j = 0; j < n; j++)
|
||||||
|
if (matrix[i][j] < CGLM_PRINT_MAX_TO_SHORT)
|
||||||
|
fprintf(ostream, " % *.*f", cw[j], CGLM_PRINT_PRECISION, matrix[j][i]);
|
||||||
|
else
|
||||||
|
fprintf(ostream, " % *g", cw[j], matrix[j][i]);
|
||||||
|
|
||||||
|
fprintf(ostream, " |\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(ostream, CGLM_PRINT_COLOR_RESET "\n");
|
||||||
|
|
||||||
|
#undef m
|
||||||
|
#undef n
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec4_print(vec4 vec,
|
||||||
FILE * __restrict ostream) {
|
FILE * __restrict ostream) {
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
#define m 4
|
#define m 4
|
||||||
|
|
||||||
fprintf(ostream, "Vector (float%d):\n\t|", m);
|
fprintf(ostream, "Vector (float%d): " CGLM_PRINT_COLOR "\n (", m);
|
||||||
|
|
||||||
for (i = 0; i < m; i++) {
|
for (i = 0; i < m; i++) {
|
||||||
fprintf(ostream, "%0.4f", vec[i]);
|
if (vec[i] < CGLM_PRINT_MAX_TO_SHORT)
|
||||||
|
fprintf(ostream, " % .*f", CGLM_PRINT_PRECISION, vec[i]);
|
||||||
if (i != m - 1)
|
else
|
||||||
fprintf(ostream, "\t");
|
fprintf(ostream, " % g", vec[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(ostream, "|\n\n");
|
fprintf(ostream, " )" CGLM_PRINT_COLOR_RESET "\n\n");
|
||||||
|
|
||||||
#undef m
|
#undef m
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec3_print(vec3 vec,
|
glm_vec3_print(vec3 vec,
|
||||||
FILE * __restrict ostream) {
|
FILE * __restrict ostream) {
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
#define m 3
|
#define m 3
|
||||||
|
|
||||||
fprintf(ostream, "Vector (float%d):\n\t|", m);
|
fprintf(ostream, "Vector (float%d): " CGLM_PRINT_COLOR "\n (", m);
|
||||||
|
|
||||||
for (i = 0; i < m; i++) {
|
for (i = 0; i < m; i++) {
|
||||||
fprintf(ostream, "%0.4f", vec[i]);
|
if (vec[i] < CGLM_PRINT_MAX_TO_SHORT)
|
||||||
|
fprintf(ostream, " % .*f", CGLM_PRINT_PRECISION, vec[i]);
|
||||||
if (i != m - 1)
|
else
|
||||||
fprintf(ostream, "\t");
|
fprintf(ostream, " % g", vec[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(ostream, "|\n\n");
|
fprintf(ostream, " )" CGLM_PRINT_COLOR_RESET "\n\n");
|
||||||
|
|
||||||
#undef m
|
#undef m
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_ivec3_print(ivec3 vec,
|
glm_ivec3_print(ivec3 vec,
|
||||||
FILE * __restrict ostream) {
|
FILE * __restrict ostream) {
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
#define m 3
|
#define m 3
|
||||||
|
|
||||||
fprintf(ostream, "Vector (int%d):\n\t|", m);
|
fprintf(ostream, "Vector (int%d): " CGLM_PRINT_COLOR "\n (", m);
|
||||||
|
|
||||||
for (i = 0; i < m; i++) {
|
for (i = 0; i < m; i++)
|
||||||
fprintf(ostream, "%d", vec[i]);
|
fprintf(ostream, " % d", vec[i]);
|
||||||
|
|
||||||
if (i != m - 1)
|
fprintf(ostream, " )" CGLM_PRINT_COLOR_RESET "\n\n");
|
||||||
fprintf(ostream, "\t");
|
|
||||||
}
|
|
||||||
|
|
||||||
fprintf(ostream, "|\n\n");
|
|
||||||
|
|
||||||
#undef m
|
#undef m
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_versor_print(versor vec,
|
glm_vec2_print(vec2 vec,
|
||||||
|
FILE * __restrict ostream) {
|
||||||
|
int i;
|
||||||
|
|
||||||
|
#define m 2
|
||||||
|
|
||||||
|
fprintf(ostream, "Vector (float%d): " CGLM_PRINT_COLOR "\n (", m);
|
||||||
|
|
||||||
|
for (i = 0; i < m; i++) {
|
||||||
|
if (vec[i] < CGLM_PRINT_MAX_TO_SHORT)
|
||||||
|
fprintf(ostream, " % .*f", CGLM_PRINT_PRECISION, vec[i]);
|
||||||
|
else
|
||||||
|
fprintf(ostream, " % g", vec[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(ostream, " )" CGLM_PRINT_COLOR_RESET "\n\n");
|
||||||
|
|
||||||
|
#undef m
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_versor_print(versor vec,
|
||||||
FILE * __restrict ostream) {
|
FILE * __restrict ostream) {
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
#define m 4
|
#define m 4
|
||||||
|
|
||||||
fprintf(ostream, "Versor (float%d):\n\t|", m);
|
fprintf(ostream, "Quaternion (float%d): " CGLM_PRINT_COLOR "\n (", m);
|
||||||
|
|
||||||
for (i = 0; i < m; i++) {
|
for (i = 0; i < m; i++) {
|
||||||
fprintf(ostream, "%0.4f", vec[i]);
|
if (vec[i] < CGLM_PRINT_MAX_TO_SHORT)
|
||||||
|
fprintf(ostream, " % .*f", CGLM_PRINT_PRECISION, vec[i]);
|
||||||
if (i != m - 1)
|
else
|
||||||
fprintf(ostream, "\t");
|
fprintf(ostream, " % g", vec[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(ostream, "|\n\n");
|
|
||||||
|
fprintf(ostream, " )" CGLM_PRINT_COLOR_RESET "\n\n");
|
||||||
|
|
||||||
#undef m
|
#undef m
|
||||||
}
|
}
|
||||||
@@ -180,24 +302,43 @@ glm_aabb_print(vec3 bbox[2],
|
|||||||
|
|
||||||
#define m 3
|
#define m 3
|
||||||
|
|
||||||
fprintf(ostream, "AABB (%s):\n", tag ? tag: "float");
|
fprintf(ostream, "AABB (%s): " CGLM_PRINT_COLOR "\n", tag ? tag: "float");
|
||||||
|
|
||||||
for (i = 0; i < 2; i++) {
|
for (i = 0; i < 2; i++) {
|
||||||
fprintf(ostream, "\t|");
|
fprintf(ostream, " (");
|
||||||
|
|
||||||
for (j = 0; j < m; j++) {
|
for (j = 0; j < m; j++) {
|
||||||
fprintf(ostream, "%0.4f", bbox[i][j]);
|
if (bbox[i][j] < CGLM_PRINT_MAX_TO_SHORT)
|
||||||
|
fprintf(ostream, " % .*f", CGLM_PRINT_PRECISION, bbox[i][j]);
|
||||||
if (j != m - 1)
|
else
|
||||||
fprintf(ostream, "\t");
|
fprintf(ostream, " % g", bbox[i][j]);
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(ostream, "|\n");
|
fprintf(ostream, " )\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(ostream, "\n");
|
fprintf(ostream, CGLM_PRINT_COLOR_RESET "\n");
|
||||||
|
|
||||||
#undef m
|
#undef m
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
/* NOOP: Remove print from DEBUG */
|
||||||
|
#define glm_mat4_print(v, s) (void)v; (void)s;
|
||||||
|
#define glm_mat3_print(v, s) (void)v; (void)s;
|
||||||
|
#define glm_mat2_print(v, s) (void)v; (void)s;
|
||||||
|
#define glm_vec4_print(v, s) (void)v; (void)s;
|
||||||
|
#define glm_vec3_print(v, s) (void)v; (void)s;
|
||||||
|
#define glm_ivec3_print(v, s) (void)v; (void)s;
|
||||||
|
#define glm_vec2_print(v, s) (void)v; (void)s;
|
||||||
|
#define glm_versor_print(v, s) (void)v; (void)s;
|
||||||
|
#define glm_aabb_print(v, t, s) (void)v; (void)t; (void)s;
|
||||||
|
|
||||||
|
#endif
|
||||||
#endif /* cglm_io_h */
|
#endif /* cglm_io_h */
|
||||||
|
|||||||
331
include/cglm/mat2.h
Normal file
331
include/cglm/mat2.h
Normal file
@@ -0,0 +1,331 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Macros:
|
||||||
|
GLM_MAT2_IDENTITY_INIT
|
||||||
|
GLM_MAT2_ZERO_INIT
|
||||||
|
GLM_MAT2_IDENTITY
|
||||||
|
GLM_MAT2_ZERO
|
||||||
|
|
||||||
|
Functions:
|
||||||
|
CGLM_INLINE void glm_mat2_copy(mat2 mat, mat2 dest)
|
||||||
|
CGLM_INLINE void glm_mat2_identity(mat2 mat)
|
||||||
|
CGLM_INLINE void glm_mat2_identity_array(mat2 * restrict mat, size_t count)
|
||||||
|
CGLM_INLINE void glm_mat2_zero(mat2 mat)
|
||||||
|
CGLM_INLINE void glm_mat2_mul(mat2 m1, mat2 m2, mat2 dest)
|
||||||
|
CGLM_INLINE void glm_mat2_transpose_to(mat2 m, mat2 dest)
|
||||||
|
CGLM_INLINE void glm_mat2_transpose(mat2 m)
|
||||||
|
CGLM_INLINE void glm_mat2_mulv(mat2 m, vec2 v, vec2 dest)
|
||||||
|
CGLM_INLINE float glm_mat2_trace(mat2 m)
|
||||||
|
CGLM_INLINE void glm_mat2_scale(mat2 m, float s)
|
||||||
|
CGLM_INLINE float glm_mat2_det(mat2 mat)
|
||||||
|
CGLM_INLINE void glm_mat2_inv(mat2 mat, mat2 dest)
|
||||||
|
CGLM_INLINE void glm_mat2_swap_col(mat2 mat, int col1, int col2)
|
||||||
|
CGLM_INLINE void glm_mat2_swap_row(mat2 mat, int row1, int row2)
|
||||||
|
CGLM_INLINE float glm_mat2_rmc(vec2 r, mat2 m, vec2 c)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglm_mat2_h
|
||||||
|
#define cglm_mat2_h
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "vec2.h"
|
||||||
|
|
||||||
|
#ifdef CGLM_SSE_FP
|
||||||
|
# include "simd/sse2/mat2.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define GLM_MAT2_IDENTITY_INIT {{1.0f, 0.0f}, {0.0f, 1.0f}}
|
||||||
|
#define GLM_MAT2_ZERO_INIT {{0.0f, 0.0f}, {0.0f, 0.0f}}
|
||||||
|
|
||||||
|
/* for C only */
|
||||||
|
#define GLM_MAT2_IDENTITY ((mat2)GLM_MAT2_IDENTITY_INIT)
|
||||||
|
#define GLM_MAT2_ZERO ((mat2)GLM_MAT2_ZERO_INIT)
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief copy all members of [mat] to [dest]
|
||||||
|
*
|
||||||
|
* @param[in] mat source
|
||||||
|
* @param[out] dest destination
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat2_copy(mat2 mat, mat2 dest) {
|
||||||
|
glm_vec4_ucopy(mat[0], dest[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief make given matrix identity. It is identical with below,
|
||||||
|
* but it is more easy to do that with this func especially for members
|
||||||
|
* e.g. glm_mat2_identity(aStruct->aMatrix);
|
||||||
|
*
|
||||||
|
* @code
|
||||||
|
* glm_mat2_copy(GLM_MAT2_IDENTITY, mat); // C only
|
||||||
|
*
|
||||||
|
* // or
|
||||||
|
* mat2 mat = GLM_MAT2_IDENTITY_INIT;
|
||||||
|
* @endcode
|
||||||
|
*
|
||||||
|
* @param[in, out] mat destination
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat2_identity(mat2 mat) {
|
||||||
|
CGLM_ALIGN_MAT mat2 t = GLM_MAT2_IDENTITY_INIT;
|
||||||
|
glm_mat2_copy(t, mat);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief make given matrix array's each element identity matrix
|
||||||
|
*
|
||||||
|
* @param[in, out] mat matrix array (must be aligned (16)
|
||||||
|
* if alignment is not disabled)
|
||||||
|
*
|
||||||
|
* @param[in] count count of matrices
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat2_identity_array(mat2 * __restrict mat, size_t count) {
|
||||||
|
CGLM_ALIGN_MAT mat2 t = GLM_MAT2_IDENTITY_INIT;
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
for (i = 0; i < count; i++) {
|
||||||
|
glm_mat2_copy(t, mat[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief make given matrix zero.
|
||||||
|
*
|
||||||
|
* @param[in, out] mat matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat2_zero(mat2 mat) {
|
||||||
|
CGLM_ALIGN_MAT mat2 t = GLM_MAT2_ZERO_INIT;
|
||||||
|
glm_mat2_copy(t, mat);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief multiply m1 and m2 to dest
|
||||||
|
*
|
||||||
|
* m1, m2 and dest matrices can be same matrix, it is possible to write this:
|
||||||
|
*
|
||||||
|
* @code
|
||||||
|
* mat2 m = GLM_MAT2_IDENTITY_INIT;
|
||||||
|
* glm_mat2_mul(m, m, m);
|
||||||
|
* @endcode
|
||||||
|
*
|
||||||
|
* @param[in] m1 left matrix
|
||||||
|
* @param[in] m2 right matrix
|
||||||
|
* @param[out] dest destination matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat2_mul(mat2 m1, mat2 m2, mat2 dest) {
|
||||||
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
|
glm_mat2_mul_sse2(m1, m2, dest);
|
||||||
|
#else
|
||||||
|
float a00 = m1[0][0], a01 = m1[0][1],
|
||||||
|
a10 = m1[1][0], a11 = m1[1][1],
|
||||||
|
b00 = m2[0][0], b01 = m2[0][1],
|
||||||
|
b10 = m2[1][0], b11 = m2[1][1];
|
||||||
|
|
||||||
|
dest[0][0] = a00 * b00 + a10 * b01;
|
||||||
|
dest[0][1] = a01 * b00 + a11 * b01;
|
||||||
|
dest[1][0] = a00 * b10 + a10 * b11;
|
||||||
|
dest[1][1] = a01 * b10 + a11 * b11;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief transpose mat2 and store in dest
|
||||||
|
*
|
||||||
|
* source matrix will not be transposed unless dest is m
|
||||||
|
*
|
||||||
|
* @param[in] m matrix
|
||||||
|
* @param[out] dest result
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat2_transpose_to(mat2 m, mat2 dest) {
|
||||||
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
|
glm_mat2_transp_sse2(m, dest);
|
||||||
|
#else
|
||||||
|
dest[0][0] = m[0][0];
|
||||||
|
dest[0][1] = m[1][0];
|
||||||
|
dest[1][0] = m[0][1];
|
||||||
|
dest[1][1] = m[1][1];
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief tranpose mat2 and store result in same matrix
|
||||||
|
*
|
||||||
|
* @param[in, out] m source and dest
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat2_transpose(mat2 m) {
|
||||||
|
float tmp;
|
||||||
|
tmp = m[0][1];
|
||||||
|
m[0][1] = m[1][0];
|
||||||
|
m[1][0] = tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief multiply mat2 with vec2 (column vector) and store in dest vector
|
||||||
|
*
|
||||||
|
* @param[in] m mat2 (left)
|
||||||
|
* @param[in] v vec2 (right, column vector)
|
||||||
|
* @param[out] dest vec2 (result, column vector)
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat2_mulv(mat2 m, vec2 v, vec2 dest) {
|
||||||
|
dest[0] = m[0][0] * v[0] + m[1][0] * v[1];
|
||||||
|
dest[1] = m[0][1] * v[0] + m[1][1] * v[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief trace of matrix
|
||||||
|
*
|
||||||
|
* sum of the elements on the main diagonal from upper left to the lower right
|
||||||
|
*
|
||||||
|
* @param[in] m matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_mat2_trace(mat2 m) {
|
||||||
|
return m[0][0] + m[1][1];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief scale (multiply with scalar) matrix
|
||||||
|
*
|
||||||
|
* multiply matrix with scalar
|
||||||
|
*
|
||||||
|
* @param[in, out] m matrix
|
||||||
|
* @param[in] s scalar
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat2_scale(mat2 m, float s) {
|
||||||
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
|
glmm_store(m[0], _mm_mul_ps(_mm_loadu_ps(m[0]), _mm_set1_ps(s)));
|
||||||
|
#elif defined(CGLM_NEON_FP)
|
||||||
|
vst1q_f32(m[0], vmulq_f32(vld1q_f32(m[0]), vdupq_n_f32(s)));
|
||||||
|
#else
|
||||||
|
m[0][0] = m[0][0] * s;
|
||||||
|
m[0][1] = m[0][1] * s;
|
||||||
|
m[1][0] = m[1][0] * s;
|
||||||
|
m[1][1] = m[1][1] * s;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief mat2 determinant
|
||||||
|
*
|
||||||
|
* @param[in] mat matrix
|
||||||
|
*
|
||||||
|
* @return determinant
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_mat2_det(mat2 mat) {
|
||||||
|
return mat[0][0] * mat[1][1] - mat[1][0] * mat[0][1];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief inverse mat2 and store in dest
|
||||||
|
*
|
||||||
|
* @param[in] mat matrix
|
||||||
|
* @param[out] dest inverse matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat2_inv(mat2 mat, mat2 dest) {
|
||||||
|
float det;
|
||||||
|
float a = mat[0][0], b = mat[0][1],
|
||||||
|
c = mat[1][0], d = mat[1][1];
|
||||||
|
|
||||||
|
det = 1.0f / (a * d - b * c);
|
||||||
|
|
||||||
|
dest[0][0] = d * det;
|
||||||
|
dest[0][1] = -b * det;
|
||||||
|
dest[1][0] = -c * det;
|
||||||
|
dest[1][1] = a * det;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief swap two matrix columns
|
||||||
|
*
|
||||||
|
* @param[in,out] mat matrix
|
||||||
|
* @param[in] col1 col1
|
||||||
|
* @param[in] col2 col2
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat2_swap_col(mat2 mat, int col1, int col2) {
|
||||||
|
float a, b;
|
||||||
|
|
||||||
|
a = mat[col1][0];
|
||||||
|
b = mat[col1][1];
|
||||||
|
|
||||||
|
mat[col1][0] = mat[col2][0];
|
||||||
|
mat[col1][1] = mat[col2][1];
|
||||||
|
|
||||||
|
mat[col2][0] = a;
|
||||||
|
mat[col2][1] = b;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief swap two matrix rows
|
||||||
|
*
|
||||||
|
* @param[in,out] mat matrix
|
||||||
|
* @param[in] row1 row1
|
||||||
|
* @param[in] row2 row2
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat2_swap_row(mat2 mat, int row1, int row2) {
|
||||||
|
float a, b;
|
||||||
|
|
||||||
|
a = mat[0][row1];
|
||||||
|
b = mat[1][row1];
|
||||||
|
|
||||||
|
mat[0][row1] = mat[0][row2];
|
||||||
|
mat[1][row1] = mat[1][row2];
|
||||||
|
|
||||||
|
mat[0][row2] = a;
|
||||||
|
mat[1][row2] = b;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief helper for R (row vector) * M (matrix) * C (column vector)
|
||||||
|
*
|
||||||
|
* rmc stands for Row * Matrix * Column
|
||||||
|
*
|
||||||
|
* the result is scalar because R * M = Matrix1x2 (row vector),
|
||||||
|
* then Matrix1x2 * Vec2 (column vector) = Matrix1x1 (Scalar)
|
||||||
|
*
|
||||||
|
* @param[in] r row vector or matrix1x2
|
||||||
|
* @param[in] m matrix2x2
|
||||||
|
* @param[in] c column vector or matrix2x1
|
||||||
|
*
|
||||||
|
* @return scalar value e.g. Matrix1x1
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_mat2_rmc(vec2 r, mat2 m, vec2 c) {
|
||||||
|
vec2 tmp;
|
||||||
|
glm_mat2_mulv(m, c, tmp);
|
||||||
|
return glm_vec2_dot(r, tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* cglm_mat2_h */
|
||||||
@@ -16,15 +16,20 @@
|
|||||||
Functions:
|
Functions:
|
||||||
CGLM_INLINE void glm_mat3_copy(mat3 mat, mat3 dest);
|
CGLM_INLINE void glm_mat3_copy(mat3 mat, mat3 dest);
|
||||||
CGLM_INLINE void glm_mat3_identity(mat3 mat);
|
CGLM_INLINE void glm_mat3_identity(mat3 mat);
|
||||||
|
CGLM_INLINE void glm_mat3_identity_array(mat3 * restrict mat, size_t count);
|
||||||
|
CGLM_INLINE void glm_mat3_zero(mat3 mat);
|
||||||
CGLM_INLINE void glm_mat3_mul(mat3 m1, mat3 m2, mat3 dest);
|
CGLM_INLINE void glm_mat3_mul(mat3 m1, mat3 m2, mat3 dest);
|
||||||
CGLM_INLINE void glm_mat3_transpose_to(mat3 m, mat3 dest);
|
CGLM_INLINE void glm_mat3_transpose_to(mat3 m, mat3 dest);
|
||||||
CGLM_INLINE void glm_mat3_transpose(mat3 m);
|
CGLM_INLINE void glm_mat3_transpose(mat3 m);
|
||||||
CGLM_INLINE void glm_mat3_mulv(mat3 m, vec3 v, vec3 dest);
|
CGLM_INLINE void glm_mat3_mulv(mat3 m, vec3 v, vec3 dest);
|
||||||
|
CGLM_INLINE float glm_mat3_trace(mat3 m);
|
||||||
|
CGLM_INLINE void glm_mat3_quat(mat3 m, versor dest);
|
||||||
CGLM_INLINE void glm_mat3_scale(mat3 m, float s);
|
CGLM_INLINE void glm_mat3_scale(mat3 m, float s);
|
||||||
CGLM_INLINE float glm_mat3_det(mat3 mat);
|
CGLM_INLINE float glm_mat3_det(mat3 mat);
|
||||||
CGLM_INLINE void glm_mat3_inv(mat3 mat, mat3 dest);
|
CGLM_INLINE void glm_mat3_inv(mat3 mat, mat3 dest);
|
||||||
CGLM_INLINE void glm_mat3_swap_col(mat3 mat, int col1, int col2);
|
CGLM_INLINE void glm_mat3_swap_col(mat3 mat, int col1, int col2);
|
||||||
CGLM_INLINE void glm_mat3_swap_row(mat3 mat, int row1, int row2);
|
CGLM_INLINE void glm_mat3_swap_row(mat3 mat, int row1, int row2);
|
||||||
|
CGLM_INLINE float glm_mat3_rmc(vec3 r, mat3 m, vec3 c);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef cglm_mat3_h
|
#ifndef cglm_mat3_h
|
||||||
@@ -61,7 +66,17 @@
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat3_copy(mat3 mat, mat3 dest) {
|
glm_mat3_copy(mat3 mat, mat3 dest) {
|
||||||
glm__memcpy(float, dest, mat, sizeof(mat3));
|
dest[0][0] = mat[0][0];
|
||||||
|
dest[0][1] = mat[0][1];
|
||||||
|
dest[0][2] = mat[0][2];
|
||||||
|
|
||||||
|
dest[1][0] = mat[1][0];
|
||||||
|
dest[1][1] = mat[1][1];
|
||||||
|
dest[1][2] = mat[1][2];
|
||||||
|
|
||||||
|
dest[2][0] = mat[2][0];
|
||||||
|
dest[2][1] = mat[2][1];
|
||||||
|
dest[2][2] = mat[2][2];
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -81,7 +96,38 @@ glm_mat3_copy(mat3 mat, mat3 dest) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat3_identity(mat3 mat) {
|
glm_mat3_identity(mat3 mat) {
|
||||||
mat3 t = GLM_MAT3_IDENTITY_INIT;
|
CGLM_ALIGN_MAT mat3 t = GLM_MAT3_IDENTITY_INIT;
|
||||||
|
glm_mat3_copy(t, mat);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief make given matrix array's each element identity matrix
|
||||||
|
*
|
||||||
|
* @param[in, out] mat matrix array (must be aligned (16/32)
|
||||||
|
* if alignment is not disabled)
|
||||||
|
*
|
||||||
|
* @param[in] count count of matrices
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat3_identity_array(mat3 * __restrict mat, size_t count) {
|
||||||
|
CGLM_ALIGN_MAT mat3 t = GLM_MAT3_IDENTITY_INIT;
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
for (i = 0; i < count; i++) {
|
||||||
|
glm_mat3_copy(t, mat[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief make given matrix zero.
|
||||||
|
*
|
||||||
|
* @param[in, out] mat matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat3_zero(mat3 mat) {
|
||||||
|
CGLM_ALIGN_MAT mat3 t = GLM_MAT3_ZERO_INIT;
|
||||||
glm_mat3_copy(t, mat);
|
glm_mat3_copy(t, mat);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -155,7 +201,7 @@ glm_mat3_transpose_to(mat3 m, mat3 dest) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat3_transpose(mat3 m) {
|
glm_mat3_transpose(mat3 m) {
|
||||||
mat3 tmp;
|
CGLM_ALIGN_MAT mat3 tmp;
|
||||||
|
|
||||||
tmp[0][1] = m[1][0];
|
tmp[0][1] = m[1][0];
|
||||||
tmp[0][2] = m[2][0];
|
tmp[0][2] = m[2][0];
|
||||||
@@ -182,16 +228,30 @@ glm_mat3_transpose(mat3 m) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat3_mulv(mat3 m, vec3 v, vec3 dest) {
|
glm_mat3_mulv(mat3 m, vec3 v, vec3 dest) {
|
||||||
dest[0] = m[0][0] * v[0] + m[1][0] * v[1] + m[2][0] * v[2];
|
vec3 res;
|
||||||
dest[1] = m[0][1] * v[0] + m[1][1] * v[1] + m[2][1] * v[2];
|
res[0] = m[0][0] * v[0] + m[1][0] * v[1] + m[2][0] * v[2];
|
||||||
dest[2] = m[0][2] * v[0] + m[1][2] * v[1] + m[2][2] * v[2];
|
res[1] = m[0][1] * v[0] + m[1][1] * v[1] + m[2][1] * v[2];
|
||||||
|
res[2] = m[0][2] * v[0] + m[1][2] * v[1] + m[2][2] * v[2];
|
||||||
|
glm_vec3_copy(res, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief trace of matrix
|
||||||
|
*
|
||||||
|
* sum of the elements on the main diagonal from upper left to the lower right
|
||||||
|
*
|
||||||
|
* @param[in] m matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_mat3_trace(mat3 m) {
|
||||||
|
return m[0][0] + m[1][1] + m[2][2];
|
||||||
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief convert mat4's rotation part to quaternion
|
* @brief convert mat3 to quaternion
|
||||||
*
|
*
|
||||||
* @param[in] m left matrix
|
* @param[in] m rotation matrix
|
||||||
* @param[out] dest destination quaternion
|
* @param[out] dest destination quaternion
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
@@ -310,9 +370,9 @@ CGLM_INLINE
|
|||||||
void
|
void
|
||||||
glm_mat3_swap_col(mat3 mat, int col1, int col2) {
|
glm_mat3_swap_col(mat3 mat, int col1, int col2) {
|
||||||
vec3 tmp;
|
vec3 tmp;
|
||||||
glm_vec_copy(mat[col1], tmp);
|
glm_vec3_copy(mat[col1], tmp);
|
||||||
glm_vec_copy(mat[col2], mat[col1]);
|
glm_vec3_copy(mat[col2], mat[col1]);
|
||||||
glm_vec_copy(tmp, mat[col2]);
|
glm_vec3_copy(tmp, mat[col2]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -339,4 +399,26 @@ glm_mat3_swap_row(mat3 mat, int row1, int row2) {
|
|||||||
mat[2][row2] = tmp[2];
|
mat[2][row2] = tmp[2];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief helper for R (row vector) * M (matrix) * C (column vector)
|
||||||
|
*
|
||||||
|
* rmc stands for Row * Matrix * Column
|
||||||
|
*
|
||||||
|
* the result is scalar because R * M = Matrix1x3 (row vector),
|
||||||
|
* then Matrix1x3 * Vec3 (column vector) = Matrix1x1 (Scalar)
|
||||||
|
*
|
||||||
|
* @param[in] r row vector or matrix1x3
|
||||||
|
* @param[in] m matrix3x3
|
||||||
|
* @param[in] c column vector or matrix3x1
|
||||||
|
*
|
||||||
|
* @return scalar value e.g. Matrix1x1
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_mat3_rmc(vec3 r, mat3 m, vec3 c) {
|
||||||
|
vec3 tmp;
|
||||||
|
glm_mat3_mulv(m, c, tmp);
|
||||||
|
return glm_vec3_dot(r, tmp);
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* cglm_mat3_h */
|
#endif /* cglm_mat3_h */
|
||||||
|
|||||||
@@ -16,13 +16,13 @@
|
|||||||
GLM_MAT4_ZERO_INIT
|
GLM_MAT4_ZERO_INIT
|
||||||
GLM_MAT4_IDENTITY
|
GLM_MAT4_IDENTITY
|
||||||
GLM_MAT4_ZERO
|
GLM_MAT4_ZERO
|
||||||
glm_mat4_udup(mat, dest)
|
|
||||||
glm_mat4_dup(mat, dest)
|
|
||||||
|
|
||||||
Functions:
|
Functions:
|
||||||
CGLM_INLINE void glm_mat4_ucopy(mat4 mat, mat4 dest);
|
CGLM_INLINE void glm_mat4_ucopy(mat4 mat, mat4 dest);
|
||||||
CGLM_INLINE void glm_mat4_copy(mat4 mat, mat4 dest);
|
CGLM_INLINE void glm_mat4_copy(mat4 mat, mat4 dest);
|
||||||
CGLM_INLINE void glm_mat4_identity(mat4 mat);
|
CGLM_INLINE void glm_mat4_identity(mat4 mat);
|
||||||
|
CGLM_INLINE void glm_mat4_identity_array(mat4 * restrict mat, size_t count);
|
||||||
|
CGLM_INLINE void glm_mat4_zero(mat4 mat);
|
||||||
CGLM_INLINE void glm_mat4_pick3(mat4 mat, mat3 dest);
|
CGLM_INLINE void glm_mat4_pick3(mat4 mat, mat3 dest);
|
||||||
CGLM_INLINE void glm_mat4_pick3t(mat4 mat, mat3 dest);
|
CGLM_INLINE void glm_mat4_pick3t(mat4 mat, mat3 dest);
|
||||||
CGLM_INLINE void glm_mat4_ins3(mat3 mat, mat4 dest);
|
CGLM_INLINE void glm_mat4_ins3(mat3 mat, mat4 dest);
|
||||||
@@ -30,6 +30,9 @@
|
|||||||
CGLM_INLINE void glm_mat4_mulN(mat4 *matrices[], int len, mat4 dest);
|
CGLM_INLINE void glm_mat4_mulN(mat4 *matrices[], int len, mat4 dest);
|
||||||
CGLM_INLINE void glm_mat4_mulv(mat4 m, vec4 v, vec4 dest);
|
CGLM_INLINE void glm_mat4_mulv(mat4 m, vec4 v, vec4 dest);
|
||||||
CGLM_INLINE void glm_mat4_mulv3(mat4 m, vec3 v, vec3 dest);
|
CGLM_INLINE void glm_mat4_mulv3(mat4 m, vec3 v, vec3 dest);
|
||||||
|
CGLM_INLINE float glm_mat4_trace(mat4 m);
|
||||||
|
CGLM_INLINE float glm_mat4_trace3(mat4 m);
|
||||||
|
CGLM_INLINE void glm_mat4_quat(mat4 m, versor dest) ;
|
||||||
CGLM_INLINE void glm_mat4_transpose_to(mat4 m, mat4 dest);
|
CGLM_INLINE void glm_mat4_transpose_to(mat4 m, mat4 dest);
|
||||||
CGLM_INLINE void glm_mat4_transpose(mat4 m);
|
CGLM_INLINE void glm_mat4_transpose(mat4 m);
|
||||||
CGLM_INLINE void glm_mat4_scale_p(mat4 m, float s);
|
CGLM_INLINE void glm_mat4_scale_p(mat4 m, float s);
|
||||||
@@ -39,6 +42,7 @@
|
|||||||
CGLM_INLINE void glm_mat4_inv_fast(mat4 mat, mat4 dest);
|
CGLM_INLINE void glm_mat4_inv_fast(mat4 mat, mat4 dest);
|
||||||
CGLM_INLINE void glm_mat4_swap_col(mat4 mat, int col1, int col2);
|
CGLM_INLINE void glm_mat4_swap_col(mat4 mat, int col1, int col2);
|
||||||
CGLM_INLINE void glm_mat4_swap_row(mat4 mat, int row1, int row2);
|
CGLM_INLINE void glm_mat4_swap_row(mat4 mat, int row1, int row2);
|
||||||
|
CGLM_INLINE float glm_mat4_rmc(vec4 r, mat4 m, vec4 c);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef cglm_mat_h
|
#ifndef cglm_mat_h
|
||||||
@@ -97,7 +101,15 @@
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat4_ucopy(mat4 mat, mat4 dest) {
|
glm_mat4_ucopy(mat4 mat, mat4 dest) {
|
||||||
glm__memcpy(float, dest, mat, sizeof(mat4));
|
dest[0][0] = mat[0][0]; dest[1][0] = mat[1][0];
|
||||||
|
dest[0][1] = mat[0][1]; dest[1][1] = mat[1][1];
|
||||||
|
dest[0][2] = mat[0][2]; dest[1][2] = mat[1][2];
|
||||||
|
dest[0][3] = mat[0][3]; dest[1][3] = mat[1][3];
|
||||||
|
|
||||||
|
dest[2][0] = mat[2][0]; dest[3][0] = mat[3][0];
|
||||||
|
dest[2][1] = mat[2][1]; dest[3][1] = mat[3][1];
|
||||||
|
dest[2][2] = mat[2][2]; dest[3][2] = mat[3][2];
|
||||||
|
dest[2][3] = mat[2][3]; dest[3][3] = mat[3][3];
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -117,6 +129,11 @@ glm_mat4_copy(mat4 mat, mat4 dest) {
|
|||||||
glmm_store(dest[1], glmm_load(mat[1]));
|
glmm_store(dest[1], glmm_load(mat[1]));
|
||||||
glmm_store(dest[2], glmm_load(mat[2]));
|
glmm_store(dest[2], glmm_load(mat[2]));
|
||||||
glmm_store(dest[3], glmm_load(mat[3]));
|
glmm_store(dest[3], glmm_load(mat[3]));
|
||||||
|
#elif defined(CGLM_NEON_FP)
|
||||||
|
vst1q_f32(dest[0], vld1q_f32(mat[0]));
|
||||||
|
vst1q_f32(dest[1], vld1q_f32(mat[1]));
|
||||||
|
vst1q_f32(dest[2], vld1q_f32(mat[2]));
|
||||||
|
vst1q_f32(dest[3], vld1q_f32(mat[3]));
|
||||||
#else
|
#else
|
||||||
glm_mat4_ucopy(mat, dest);
|
glm_mat4_ucopy(mat, dest);
|
||||||
#endif
|
#endif
|
||||||
@@ -139,7 +156,38 @@ glm_mat4_copy(mat4 mat, mat4 dest) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat4_identity(mat4 mat) {
|
glm_mat4_identity(mat4 mat) {
|
||||||
mat4 t = GLM_MAT4_IDENTITY_INIT;
|
CGLM_ALIGN_MAT mat4 t = GLM_MAT4_IDENTITY_INIT;
|
||||||
|
glm_mat4_copy(t, mat);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief make given matrix array's each element identity matrix
|
||||||
|
*
|
||||||
|
* @param[in, out] mat matrix array (must be aligned (16/32)
|
||||||
|
* if alignment is not disabled)
|
||||||
|
*
|
||||||
|
* @param[in] count count of matrices
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat4_identity_array(mat4 * __restrict mat, size_t count) {
|
||||||
|
CGLM_ALIGN_MAT mat4 t = GLM_MAT4_IDENTITY_INIT;
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
for (i = 0; i < count; i++) {
|
||||||
|
glm_mat4_copy(t, mat[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief make given matrix zero.
|
||||||
|
*
|
||||||
|
* @param[in, out] mat matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat4_zero(mat4 mat) {
|
||||||
|
CGLM_ALIGN_MAT mat4 t = GLM_MAT4_ZERO_INIT;
|
||||||
glm_mat4_copy(t, mat);
|
glm_mat4_copy(t, mat);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -232,7 +280,7 @@ glm_mat4_mul(mat4 m1, mat4 m2, mat4 dest) {
|
|||||||
glm_mat4_mul_avx(m1, m2, dest);
|
glm_mat4_mul_avx(m1, m2, dest);
|
||||||
#elif defined( __SSE__ ) || defined( __SSE2__ )
|
#elif defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
glm_mat4_mul_sse2(m1, m2, dest);
|
glm_mat4_mul_sse2(m1, m2, dest);
|
||||||
#elif defined( __ARM_NEON_FP )
|
#elif defined(CGLM_NEON_FP)
|
||||||
glm_mat4_mul_neon(m1, m2, dest);
|
glm_mat4_mul_neon(m1, m2, dest);
|
||||||
#else
|
#else
|
||||||
float a00 = m1[0][0], a01 = m1[0][1], a02 = m1[0][2], a03 = m1[0][3],
|
float a00 = m1[0][0], a01 = m1[0][1], a02 = m1[0][2], a03 = m1[0][3],
|
||||||
@@ -310,6 +358,8 @@ void
|
|||||||
glm_mat4_mulv(mat4 m, vec4 v, vec4 dest) {
|
glm_mat4_mulv(mat4 m, vec4 v, vec4 dest) {
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
glm_mat4_mulv_sse2(m, v, dest);
|
glm_mat4_mulv_sse2(m, v, dest);
|
||||||
|
#elif defined(CGLM_NEON_FP)
|
||||||
|
glm_mat4_mulv_neon(m, v, dest);
|
||||||
#else
|
#else
|
||||||
vec4 res;
|
vec4 res;
|
||||||
res[0] = m[0][0] * v[0] + m[1][0] * v[1] + m[2][0] * v[2] + m[3][0] * v[3];
|
res[0] = m[0][0] * v[0] + m[1][0] * v[1] + m[2][0] * v[2] + m[3][0] * v[3];
|
||||||
@@ -320,10 +370,36 @@ glm_mat4_mulv(mat4 m, vec4 v, vec4 dest) {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief trace of matrix
|
||||||
|
*
|
||||||
|
* sum of the elements on the main diagonal from upper left to the lower right
|
||||||
|
*
|
||||||
|
* @param[in] m matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_mat4_trace(mat4 m) {
|
||||||
|
return m[0][0] + m[1][1] + m[2][2] + m[3][3];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief trace of matrix (rotation part)
|
||||||
|
*
|
||||||
|
* sum of the elements on the main diagonal from upper left to the lower right
|
||||||
|
*
|
||||||
|
* @param[in] m matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_mat4_trace3(mat4 m) {
|
||||||
|
return m[0][0] + m[1][1] + m[2][2];
|
||||||
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief convert mat4's rotation part to quaternion
|
* @brief convert mat4's rotation part to quaternion
|
||||||
*
|
*
|
||||||
* @param[in] m left matrix
|
* @param[in] m affine matrix
|
||||||
* @param[out] dest destination quaternion
|
* @param[out] dest destination quaternion
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
@@ -370,20 +446,23 @@ glm_mat4_quat(mat4 m, versor dest) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief multiply vector with mat4's mat3 part(rotation)
|
* @brief multiply vector with mat4
|
||||||
|
*
|
||||||
|
* actually the result is vec4, after multiplication the last component
|
||||||
|
* is trimmed. if you need it don't use this func.
|
||||||
*
|
*
|
||||||
* @param[in] m mat4(affine transform)
|
* @param[in] m mat4(affine transform)
|
||||||
* @param[in] v vec3
|
* @param[in] v vec3
|
||||||
* @param[out] dest vec3
|
* @param[in] last 4th item to make it vec4
|
||||||
|
* @param[out] dest result vector (vec3)
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat4_mulv3(mat4 m, vec3 v, vec3 dest) {
|
glm_mat4_mulv3(mat4 m, vec3 v, float last, vec3 dest) {
|
||||||
vec3 res;
|
vec4 res;
|
||||||
res[0] = m[0][0] * v[0] + m[1][0] * v[1] + m[2][0] * v[2];
|
glm_vec4(v, last, res);
|
||||||
res[1] = m[0][1] * v[0] + m[1][1] * v[1] + m[2][1] * v[2];
|
glm_mat4_mulv(m, res, res);
|
||||||
res[2] = m[0][2] * v[0] + m[1][2] * v[1] + m[2][2] * v[2];
|
glm_vec3(res, dest);
|
||||||
glm_vec_copy(res, dest);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -399,6 +478,8 @@ void
|
|||||||
glm_mat4_transpose_to(mat4 m, mat4 dest) {
|
glm_mat4_transpose_to(mat4 m, mat4 dest) {
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
glm_mat4_transp_sse2(m, dest);
|
glm_mat4_transp_sse2(m, dest);
|
||||||
|
#elif defined(CGLM_NEON_FP)
|
||||||
|
glm_mat4_transp_neon(m, dest);
|
||||||
#else
|
#else
|
||||||
dest[0][0] = m[0][0]; dest[1][0] = m[0][1];
|
dest[0][0] = m[0][0]; dest[1][0] = m[0][1];
|
||||||
dest[0][1] = m[1][0]; dest[1][1] = m[1][1];
|
dest[0][1] = m[1][0]; dest[1][1] = m[1][1];
|
||||||
@@ -421,12 +502,12 @@ void
|
|||||||
glm_mat4_transpose(mat4 m) {
|
glm_mat4_transpose(mat4 m) {
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
glm_mat4_transp_sse2(m, m);
|
glm_mat4_transp_sse2(m, m);
|
||||||
|
#elif defined(CGLM_NEON_FP)
|
||||||
|
glm_mat4_transp_neon(m, m);
|
||||||
#else
|
#else
|
||||||
mat4 d;
|
mat4 d;
|
||||||
|
|
||||||
glm_mat4_transpose_to(m, d);
|
glm_mat4_transpose_to(m, d);
|
||||||
|
glm_mat4_ucopy(d, m);
|
||||||
glm__memcpy(float, m, d, sizeof(mat4));
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -458,8 +539,12 @@ glm_mat4_scale_p(mat4 m, float s) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat4_scale(mat4 m, float s) {
|
glm_mat4_scale(mat4 m, float s) {
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#ifdef __AVX__
|
||||||
|
glm_mat4_scale_avx(m, s);
|
||||||
|
#elif defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
glm_mat4_scale_sse2(m, s);
|
glm_mat4_scale_sse2(m, s);
|
||||||
|
#elif defined(CGLM_NEON_FP)
|
||||||
|
glm_mat4_scale_neon(m, s);
|
||||||
#else
|
#else
|
||||||
glm_mat4_scale_p(m, s);
|
glm_mat4_scale_p(m, s);
|
||||||
#endif
|
#endif
|
||||||
@@ -586,7 +671,7 @@ glm_mat4_inv_fast(mat4 mat, mat4 dest) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat4_swap_col(mat4 mat, int col1, int col2) {
|
glm_mat4_swap_col(mat4 mat, int col1, int col2) {
|
||||||
vec4 tmp;
|
CGLM_ALIGN(16) vec4 tmp;
|
||||||
glm_vec4_copy(mat[col1], tmp);
|
glm_vec4_copy(mat[col1], tmp);
|
||||||
glm_vec4_copy(mat[col2], mat[col1]);
|
glm_vec4_copy(mat[col2], mat[col1]);
|
||||||
glm_vec4_copy(tmp, mat[col2]);
|
glm_vec4_copy(tmp, mat[col2]);
|
||||||
@@ -602,7 +687,7 @@ glm_mat4_swap_col(mat4 mat, int col1, int col2) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat4_swap_row(mat4 mat, int row1, int row2) {
|
glm_mat4_swap_row(mat4 mat, int row1, int row2) {
|
||||||
vec4 tmp;
|
CGLM_ALIGN(16) vec4 tmp;
|
||||||
tmp[0] = mat[0][row1];
|
tmp[0] = mat[0][row1];
|
||||||
tmp[1] = mat[1][row1];
|
tmp[1] = mat[1][row1];
|
||||||
tmp[2] = mat[2][row1];
|
tmp[2] = mat[2][row1];
|
||||||
@@ -619,4 +704,26 @@ glm_mat4_swap_row(mat4 mat, int row1, int row2) {
|
|||||||
mat[3][row2] = tmp[3];
|
mat[3][row2] = tmp[3];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief helper for R (row vector) * M (matrix) * C (column vector)
|
||||||
|
*
|
||||||
|
* rmc stands for Row * Matrix * Column
|
||||||
|
*
|
||||||
|
* the result is scalar because R * M = Matrix1x4 (row vector),
|
||||||
|
* then Matrix1x4 * Vec4 (column vector) = Matrix1x1 (Scalar)
|
||||||
|
*
|
||||||
|
* @param[in] r row vector or matrix1x4
|
||||||
|
* @param[in] m matrix4x4
|
||||||
|
* @param[in] c column vector or matrix4x1
|
||||||
|
*
|
||||||
|
* @return scalar value e.g. B(s)
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_mat4_rmc(vec4 r, mat4 m, vec4 c) {
|
||||||
|
vec4 tmp;
|
||||||
|
glm_mat4_mulv(m, c, tmp);
|
||||||
|
return glm_vec4_dot(r, tmp);
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* cglm_mat_h */
|
#endif /* cglm_mat_h */
|
||||||
|
|||||||
@@ -25,12 +25,19 @@
|
|||||||
/*!
|
/*!
|
||||||
* @brief normalizes a plane
|
* @brief normalizes a plane
|
||||||
*
|
*
|
||||||
* @param[in, out] plane pnale to normalize
|
* @param[in, out] plane plane to normalize
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_plane_normalize(vec4 plane) {
|
glm_plane_normalize(vec4 plane) {
|
||||||
glm_vec4_scale(plane, 1.0f / glm_vec_norm(plane), plane);
|
float norm;
|
||||||
|
|
||||||
|
if ((norm = glm_vec3_norm(plane)) == 0.0f) {
|
||||||
|
glm_vec4_zero(plane);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
glm_vec4_scale(plane, 1.0f / norm, plane);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* cglm_plane_h */
|
#endif /* cglm_plane_h */
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
#ifndef cglm_project_h
|
#ifndef cglm_project_h
|
||||||
#define cglm_project_h
|
#define cglm_project_h
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
#include "vec3.h"
|
#include "vec3.h"
|
||||||
#include "vec4.h"
|
#include "vec4.h"
|
||||||
#include "mat4.h"
|
#include "mat4.h"
|
||||||
@@ -100,7 +101,7 @@ glm_unproject(vec3 pos, mat4 m, vec4 vp, vec3 dest) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_project(vec3 pos, mat4 m, vec4 vp, vec3 dest) {
|
glm_project(vec3 pos, mat4 m, vec4 vp, vec3 dest) {
|
||||||
vec4 pos4, vone = GLM_VEC4_ONE_INIT;
|
CGLM_ALIGN(16) vec4 pos4, vone = GLM_VEC4_ONE_INIT;
|
||||||
|
|
||||||
glm_vec4(pos, 1.0f, pos4);
|
glm_vec4(pos, 1.0f, pos4);
|
||||||
|
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
CGLM_INLINE float glm_quat_norm(versor q);
|
CGLM_INLINE float glm_quat_norm(versor q);
|
||||||
CGLM_INLINE void glm_quat_normalize(versor q);
|
CGLM_INLINE void glm_quat_normalize(versor q);
|
||||||
CGLM_INLINE void glm_quat_normalize_to(versor q, versor dest);
|
CGLM_INLINE void glm_quat_normalize_to(versor q, versor dest);
|
||||||
CGLM_INLINE float glm_quat_dot(versor q1, versor q2);
|
CGLM_INLINE float glm_quat_dot(versor p, versor q);
|
||||||
CGLM_INLINE void glm_quat_conjugate(versor q, versor dest);
|
CGLM_INLINE void glm_quat_conjugate(versor q, versor dest);
|
||||||
CGLM_INLINE void glm_quat_inv(versor q, versor dest);
|
CGLM_INLINE void glm_quat_inv(versor q, versor dest);
|
||||||
CGLM_INLINE void glm_quat_add(versor p, versor q, versor dest);
|
CGLM_INLINE void glm_quat_add(versor p, versor q, versor dest);
|
||||||
@@ -29,13 +29,14 @@
|
|||||||
CGLM_INLINE void glm_quat_imagn(versor q, vec3 dest);
|
CGLM_INLINE void glm_quat_imagn(versor q, vec3 dest);
|
||||||
CGLM_INLINE float glm_quat_imaglen(versor q);
|
CGLM_INLINE float glm_quat_imaglen(versor q);
|
||||||
CGLM_INLINE float glm_quat_angle(versor q);
|
CGLM_INLINE float glm_quat_angle(versor q);
|
||||||
CGLM_INLINE void glm_quat_axis(versor q, versor dest);
|
CGLM_INLINE void glm_quat_axis(versor q, vec3 dest);
|
||||||
CGLM_INLINE void glm_quat_mul(versor p, versor q, versor dest);
|
CGLM_INLINE void glm_quat_mul(versor p, versor q, versor dest);
|
||||||
CGLM_INLINE void glm_quat_mat4(versor q, mat4 dest);
|
CGLM_INLINE void glm_quat_mat4(versor q, mat4 dest);
|
||||||
CGLM_INLINE void glm_quat_mat4t(versor q, mat4 dest);
|
CGLM_INLINE void glm_quat_mat4t(versor q, mat4 dest);
|
||||||
CGLM_INLINE void glm_quat_mat3(versor q, mat3 dest);
|
CGLM_INLINE void glm_quat_mat3(versor q, mat3 dest);
|
||||||
CGLM_INLINE void glm_quat_mat3t(versor q, mat3 dest);
|
CGLM_INLINE void glm_quat_mat3t(versor q, mat3 dest);
|
||||||
CGLM_INLINE void glm_quat_lerp(versor from, versor to, float t, versor dest);
|
CGLM_INLINE void glm_quat_lerp(versor from, versor to, float t, versor dest);
|
||||||
|
CGLM_INLINE void glm_quat_lerpc(versor from, versor to, float t, versor dest);
|
||||||
CGLM_INLINE void glm_quat_slerp(versor q, versor r, float t, versor dest);
|
CGLM_INLINE void glm_quat_slerp(versor q, versor r, float t, versor dest);
|
||||||
CGLM_INLINE void glm_quat_look(vec3 eye, versor ori, mat4 dest);
|
CGLM_INLINE void glm_quat_look(vec3 eye, versor ori, mat4 dest);
|
||||||
CGLM_INLINE void glm_quat_for(vec3 dir, vec3 fwd, vec3 up, versor dest);
|
CGLM_INLINE void glm_quat_for(vec3 dir, vec3 fwd, vec3 up, versor dest);
|
||||||
@@ -62,10 +63,6 @@
|
|||||||
# include "simd/sse2/quat.h"
|
# include "simd/sse2/quat.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_mat4_identity(mat4 mat);
|
|
||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat4_mulv(mat4 m, vec4 v, vec4 dest);
|
glm_mat4_mulv(mat4 m, vec4 v, vec4 dest);
|
||||||
@@ -99,10 +96,29 @@ glm_translate(mat4 m, vec3 v);
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_quat_identity(versor q) {
|
glm_quat_identity(versor q) {
|
||||||
versor v = GLM_QUAT_IDENTITY_INIT;
|
CGLM_ALIGN(16) versor v = GLM_QUAT_IDENTITY_INIT;
|
||||||
glm_vec4_copy(v, q);
|
glm_vec4_copy(v, q);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief make given quaternion array's each element identity quaternion
|
||||||
|
*
|
||||||
|
* @param[in, out] q quat array (must be aligned (16)
|
||||||
|
* if alignment is not disabled)
|
||||||
|
*
|
||||||
|
* @param[in] count count of quaternions
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_quat_identity_array(versor * __restrict q, size_t count) {
|
||||||
|
CGLM_ALIGN(16) versor v = GLM_QUAT_IDENTITY_INIT;
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
for (i = 0; i < count; i++) {
|
||||||
|
glm_vec4_copy(v, q[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief inits quaterion with raw values
|
* @brief inits quaterion with raw values
|
||||||
*
|
*
|
||||||
@@ -131,7 +147,7 @@ glm_quat_init(versor q, float x, float y, float z, float w) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_quatv(versor q, float angle, vec3 axis) {
|
glm_quatv(versor q, float angle, vec3 axis) {
|
||||||
vec3 k;
|
CGLM_ALIGN(8) vec3 k;
|
||||||
float a, c, s;
|
float a, c, s;
|
||||||
|
|
||||||
a = angle * 0.5f;
|
a = angle * 0.5f;
|
||||||
@@ -158,7 +174,7 @@ glm_quatv(versor q, float angle, vec3 axis) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_quat(versor q, float angle, float x, float y, float z) {
|
glm_quat(versor q, float angle, float x, float y, float z) {
|
||||||
vec3 axis = {x, y, z};
|
CGLM_ALIGN(8) vec3 axis = {x, y, z};
|
||||||
glm_quatv(q, angle, axis);
|
glm_quatv(q, angle, axis);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -199,7 +215,7 @@ glm_quat_normalize_to(versor q, versor dest) {
|
|||||||
float dot;
|
float dot;
|
||||||
|
|
||||||
x0 = glmm_load(q);
|
x0 = glmm_load(q);
|
||||||
xdot = glmm_dot(x0, x0);
|
xdot = glmm_vdot(x0, x0);
|
||||||
dot = _mm_cvtss_f32(xdot);
|
dot = _mm_cvtss_f32(xdot);
|
||||||
|
|
||||||
if (dot <= 0.0f) {
|
if (dot <= 0.0f) {
|
||||||
@@ -214,7 +230,7 @@ glm_quat_normalize_to(versor q, versor dest) {
|
|||||||
dot = glm_vec4_norm2(q);
|
dot = glm_vec4_norm2(q);
|
||||||
|
|
||||||
if (dot <= 0.0f) {
|
if (dot <= 0.0f) {
|
||||||
glm_quat_identity(q);
|
glm_quat_identity(dest);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -254,7 +270,7 @@ glm_quat_dot(versor p, versor q) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_quat_conjugate(versor q, versor dest) {
|
glm_quat_conjugate(versor q, versor dest) {
|
||||||
glm_vec4_flipsign_to(q, dest);
|
glm_vec4_negate_to(q, dest);
|
||||||
dest[3] = -dest[3];
|
dest[3] = -dest[3];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -267,7 +283,7 @@ glm_quat_conjugate(versor q, versor dest) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_quat_inv(versor q, versor dest) {
|
glm_quat_inv(versor q, versor dest) {
|
||||||
versor conj;
|
CGLM_ALIGN(16) versor conj;
|
||||||
glm_quat_conjugate(q, conj);
|
glm_quat_conjugate(q, conj);
|
||||||
glm_vec4_scale(conj, 1.0f / glm_vec4_norm2(q), dest);
|
glm_vec4_scale(conj, 1.0f / glm_vec4_norm2(q), dest);
|
||||||
}
|
}
|
||||||
@@ -342,7 +358,7 @@ glm_quat_imagn(versor q, vec3 dest) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
float
|
float
|
||||||
glm_quat_imaglen(versor q) {
|
glm_quat_imaglen(versor q) {
|
||||||
return glm_vec_norm(q);
|
return glm_vec3_norm(q);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -369,7 +385,7 @@ glm_quat_angle(versor q) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_quat_axis(versor q, versor dest) {
|
glm_quat_axis(versor q, vec3 dest) {
|
||||||
glm_quat_imagn(q, dest);
|
glm_quat_imagn(q, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -582,7 +598,7 @@ glm_quat_mat3t(versor q, mat3 dest) {
|
|||||||
*
|
*
|
||||||
* @param[in] from from
|
* @param[in] from from
|
||||||
* @param[in] to to
|
* @param[in] to to
|
||||||
* @param[in] t interpolant (amount) clamped between 0 and 1
|
* @param[in] t interpolant (amount)
|
||||||
* @param[out] dest result quaternion
|
* @param[out] dest result quaternion
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
@@ -591,6 +607,21 @@ glm_quat_lerp(versor from, versor to, float t, versor dest) {
|
|||||||
glm_vec4_lerp(from, to, t, dest);
|
glm_vec4_lerp(from, to, t, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief interpolates between two quaternions
|
||||||
|
* using linear interpolation (LERP)
|
||||||
|
*
|
||||||
|
* @param[in] from from
|
||||||
|
* @param[in] to to
|
||||||
|
* @param[in] t interpolant (amount) clamped between 0 and 1
|
||||||
|
* @param[out] dest result quaternion
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_quat_lerpc(versor from, versor to, float t, versor dest) {
|
||||||
|
glm_vec4_lerpc(from, to, t, dest);
|
||||||
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief interpolates between two quaternions
|
* @brief interpolates between two quaternions
|
||||||
* using spherical linear interpolation (SLERP)
|
* using spherical linear interpolation (SLERP)
|
||||||
@@ -603,7 +634,7 @@ glm_quat_lerp(versor from, versor to, float t, versor dest) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_quat_slerp(versor from, versor to, float t, versor dest) {
|
glm_quat_slerp(versor from, versor to, float t, versor dest) {
|
||||||
vec4 q1, q2;
|
CGLM_ALIGN(16) vec4 q1, q2;
|
||||||
float cosTheta, sinTheta, angle;
|
float cosTheta, sinTheta, angle;
|
||||||
|
|
||||||
cosTheta = glm_quat_dot(from, to);
|
cosTheta = glm_quat_dot(from, to);
|
||||||
@@ -615,7 +646,7 @@ glm_quat_slerp(versor from, versor to, float t, versor dest) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (cosTheta < 0.0f) {
|
if (cosTheta < 0.0f) {
|
||||||
glm_vec4_flipsign(q1);
|
glm_vec4_negate(q1);
|
||||||
cosTheta = -cosTheta;
|
cosTheta = -cosTheta;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -646,47 +677,35 @@ glm_quat_slerp(versor from, versor to, float t, versor dest) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_quat_look(vec3 eye, versor ori, mat4 dest) {
|
glm_quat_look(vec3 eye, versor ori, mat4 dest) {
|
||||||
vec4 t;
|
|
||||||
|
|
||||||
/* orientation */
|
/* orientation */
|
||||||
glm_quat_mat4t(ori, dest);
|
glm_quat_mat4t(ori, dest);
|
||||||
|
|
||||||
/* translate */
|
/* translate */
|
||||||
glm_vec4(eye, 1.0f, t);
|
glm_mat4_mulv3(dest, eye, 1.0f, dest[3]);
|
||||||
glm_mat4_mulv(dest, t, t);
|
glm_vec3_negate(dest[3]);
|
||||||
glm_vec_flipsign_to(t, dest[3]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief creates look rotation quaternion
|
* @brief creates look rotation quaternion
|
||||||
*
|
*
|
||||||
* @param[in] dir direction to look
|
* @param[in] dir direction to look
|
||||||
* @param[in] fwd forward vector
|
|
||||||
* @param[in] up up vector
|
* @param[in] up up vector
|
||||||
* @param[out] dest destination quaternion
|
* @param[out] dest destination quaternion
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_quat_for(vec3 dir, vec3 fwd, vec3 up, versor dest) {
|
glm_quat_for(vec3 dir, vec3 up, versor dest) {
|
||||||
vec3 axis;
|
CGLM_ALIGN_MAT mat3 m;
|
||||||
float dot, angle;
|
|
||||||
|
|
||||||
dot = glm_vec_dot(dir, fwd);
|
glm_vec3_normalize_to(dir, m[2]);
|
||||||
if (fabsf(dot + 1.0f) < 0.000001f) {
|
|
||||||
glm_quat_init(dest, up[0], up[1], up[2], CGLM_PI);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fabsf(dot - 1.0f) < 0.000001f) {
|
/* No need to negate in LH, but we use RH here */
|
||||||
glm_quat_identity(dest);
|
glm_vec3_negate(m[2]);
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
angle = acosf(dot);
|
glm_vec3_crossn(up, m[2], m[0]);
|
||||||
glm_cross(fwd, dir, axis);
|
glm_vec3_cross(m[2], m[0], m[1]);
|
||||||
glm_normalize(axis);
|
|
||||||
|
|
||||||
glm_quatv(dest, angle, axis);
|
glm_mat3_quat(m, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -695,16 +714,15 @@ glm_quat_for(vec3 dir, vec3 fwd, vec3 up, versor dest) {
|
|||||||
*
|
*
|
||||||
* @param[in] from source point
|
* @param[in] from source point
|
||||||
* @param[in] to destination point
|
* @param[in] to destination point
|
||||||
* @param[in] fwd forward vector
|
|
||||||
* @param[in] up up vector
|
* @param[in] up up vector
|
||||||
* @param[out] dest destination quaternion
|
* @param[out] dest destination quaternion
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_quat_forp(vec3 from, vec3 to, vec3 fwd, vec3 up, versor dest) {
|
glm_quat_forp(vec3 from, vec3 to, vec3 up, versor dest) {
|
||||||
vec3 dir;
|
CGLM_ALIGN(8) vec3 dir;
|
||||||
glm_vec_sub(to, from, dir);
|
glm_vec3_sub(to, from, dir);
|
||||||
glm_quat_for(dir, fwd, up, dest);
|
glm_quat_for(dir, up, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -717,22 +735,22 @@ glm_quat_forp(vec3 from, vec3 to, vec3 fwd, vec3 up, versor dest) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_quat_rotatev(versor q, vec3 v, vec3 dest) {
|
glm_quat_rotatev(versor q, vec3 v, vec3 dest) {
|
||||||
versor p;
|
CGLM_ALIGN(16) versor p;
|
||||||
vec3 u, v1, v2;
|
CGLM_ALIGN(8) vec3 u, v1, v2;
|
||||||
float s;
|
float s;
|
||||||
|
|
||||||
glm_quat_normalize_to(q, p);
|
glm_quat_normalize_to(q, p);
|
||||||
glm_quat_imag(p, u);
|
glm_quat_imag(p, u);
|
||||||
s = glm_quat_real(p);
|
s = glm_quat_real(p);
|
||||||
|
|
||||||
glm_vec_scale(u, 2.0f * glm_vec_dot(u, v), v1);
|
glm_vec3_scale(u, 2.0f * glm_vec3_dot(u, v), v1);
|
||||||
glm_vec_scale(v, s * s - glm_vec_dot(u, u), v2);
|
glm_vec3_scale(v, s * s - glm_vec3_dot(u, u), v2);
|
||||||
glm_vec_add(v1, v2, v1);
|
glm_vec3_add(v1, v2, v1);
|
||||||
|
|
||||||
glm_vec_cross(u, v, v2);
|
glm_vec3_cross(u, v, v2);
|
||||||
glm_vec_scale(v2, 2.0f * s, v2);
|
glm_vec3_scale(v2, 2.0f * s, v2);
|
||||||
|
|
||||||
glm_vec_add(v1, v2, dest);
|
glm_vec3_add(v1, v2, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -745,7 +763,7 @@ glm_quat_rotatev(versor q, vec3 v, vec3 dest) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_quat_rotate(mat4 m, versor q, mat4 dest) {
|
glm_quat_rotate(mat4 m, versor q, mat4 dest) {
|
||||||
mat4 rot;
|
CGLM_ALIGN_MAT mat4 rot;
|
||||||
glm_quat_mat4(q, rot);
|
glm_quat_mat4(q, rot);
|
||||||
glm_mul_rot(m, rot, dest);
|
glm_mul_rot(m, rot, dest);
|
||||||
}
|
}
|
||||||
@@ -760,9 +778,9 @@ glm_quat_rotate(mat4 m, versor q, mat4 dest) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_quat_rotate_at(mat4 m, versor q, vec3 pivot) {
|
glm_quat_rotate_at(mat4 m, versor q, vec3 pivot) {
|
||||||
vec3 pivotInv;
|
CGLM_ALIGN(8) vec3 pivotInv;
|
||||||
|
|
||||||
glm_vec_inv_to(pivot, pivotInv);
|
glm_vec3_negate_to(pivot, pivotInv);
|
||||||
|
|
||||||
glm_translate(m, pivot);
|
glm_translate(m, pivot);
|
||||||
glm_quat_rotate(m, q, m);
|
glm_quat_rotate(m, q, m);
|
||||||
@@ -784,12 +802,11 @@ glm_quat_rotate_at(mat4 m, versor q, vec3 pivot) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_quat_rotate_atm(mat4 m, versor q, vec3 pivot) {
|
glm_quat_rotate_atm(mat4 m, versor q, vec3 pivot) {
|
||||||
vec3 pivotInv;
|
CGLM_ALIGN(8) vec3 pivotInv;
|
||||||
|
|
||||||
glm_vec_inv_to(pivot, pivotInv);
|
glm_vec3_negate_to(pivot, pivotInv);
|
||||||
|
|
||||||
glm_mat4_identity(m);
|
glm_translate_make(m, pivot);
|
||||||
glm_vec_copy(pivot, m[3]);
|
|
||||||
glm_quat_rotate(m, q, m);
|
glm_quat_rotate(m, q, m);
|
||||||
glm_translate(m, pivotInv);
|
glm_translate(m, pivotInv);
|
||||||
}
|
}
|
||||||
|
|||||||
77
include/cglm/ray.h
Normal file
77
include/cglm/ray.h
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Functions:
|
||||||
|
CGLM_INLINE bool glm_line_triangle_intersect(vec3 origin,
|
||||||
|
vec3 direction,
|
||||||
|
vec3 v0,
|
||||||
|
vec3 v1,
|
||||||
|
vec3 v2,
|
||||||
|
float *d);
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglm_ray_h
|
||||||
|
#define cglm_ray_h
|
||||||
|
|
||||||
|
#include "vec3.h"
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Möller–Trumbore ray-triangle intersection algorithm
|
||||||
|
*
|
||||||
|
* @param[in] origin origin of ray
|
||||||
|
* @param[in] direction direction of ray
|
||||||
|
* @param[in] v0 first vertex of triangle
|
||||||
|
* @param[in] v1 second vertex of triangle
|
||||||
|
* @param[in] v2 third vertex of triangle
|
||||||
|
* @param[in, out] d distance to intersection
|
||||||
|
* @return whether there is intersection
|
||||||
|
*/
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
bool
|
||||||
|
glm_ray_triangle(vec3 origin,
|
||||||
|
vec3 direction,
|
||||||
|
vec3 v0,
|
||||||
|
vec3 v1,
|
||||||
|
vec3 v2,
|
||||||
|
float *d) {
|
||||||
|
vec3 edge1, edge2, p, t, q;
|
||||||
|
float det, inv_det, u, v, dist;
|
||||||
|
const float epsilon = 0.000001f;
|
||||||
|
|
||||||
|
glm_vec3_sub(v1, v0, edge1);
|
||||||
|
glm_vec3_sub(v2, v0, edge2);
|
||||||
|
glm_vec3_cross(direction, edge2, p);
|
||||||
|
|
||||||
|
det = glm_vec3_dot(edge1, p);
|
||||||
|
if (det > -epsilon && det < epsilon)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
inv_det = 1.0f / det;
|
||||||
|
|
||||||
|
glm_vec3_sub(origin, v0, t);
|
||||||
|
|
||||||
|
u = inv_det * glm_vec3_dot(t, p);
|
||||||
|
if (u < 0.0f || u > 1.0f)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
glm_vec3_cross(t, edge1, q);
|
||||||
|
|
||||||
|
v = inv_det * glm_vec3_dot(direction, q);
|
||||||
|
if (v < 0.0f || u + v > 1.0f)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
dist = inv_det * glm_vec3_dot(edge2, q);
|
||||||
|
|
||||||
|
if (d)
|
||||||
|
*d = dist;
|
||||||
|
|
||||||
|
return dist > epsilon;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
119
include/cglm/simd/arm.h
Normal file
119
include/cglm/simd/arm.h
Normal file
@@ -0,0 +1,119 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglm_simd_arm_h
|
||||||
|
#define cglm_simd_arm_h
|
||||||
|
#include "intrin.h"
|
||||||
|
#ifdef CGLM_SIMD_ARM
|
||||||
|
|
||||||
|
#define glmm_load(p) vld1q_f32(p)
|
||||||
|
#define glmm_store(p, a) vst1q_f32(p, a)
|
||||||
|
|
||||||
|
static inline
|
||||||
|
float32x4_t
|
||||||
|
glmm_abs(float32x4_t v) {
|
||||||
|
return vabsq_f32(v);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
float
|
||||||
|
glmm_hadd(float32x4_t v) {
|
||||||
|
#if defined(__aarch64__)
|
||||||
|
return vaddvq_f32(v);
|
||||||
|
#else
|
||||||
|
v = vaddq_f32(v, vrev64q_f32(v));
|
||||||
|
v = vaddq_f32(v, vcombine_f32(vget_high_f32(v), vget_low_f32(v)));
|
||||||
|
return vgetq_lane_f32(v, 0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
float
|
||||||
|
glmm_hmin(float32x4_t v) {
|
||||||
|
float32x2_t t;
|
||||||
|
t = vpmin_f32(vget_low_f32(v), vget_high_f32(v));
|
||||||
|
t = vpmin_f32(t, t);
|
||||||
|
return vget_lane_f32(t, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
float
|
||||||
|
glmm_hmax(float32x4_t v) {
|
||||||
|
float32x2_t t;
|
||||||
|
t = vpmax_f32(vget_low_f32(v), vget_high_f32(v));
|
||||||
|
t = vpmax_f32(t, t);
|
||||||
|
return vget_lane_f32(t, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
float
|
||||||
|
glmm_dot(float32x4_t a, float32x4_t b) {
|
||||||
|
return glmm_hadd(vmulq_f32(a, b));
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
float
|
||||||
|
glmm_norm(float32x4_t a) {
|
||||||
|
return sqrtf(glmm_dot(a, a));
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
float
|
||||||
|
glmm_norm2(float32x4_t a) {
|
||||||
|
return glmm_dot(a, a);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
float
|
||||||
|
glmm_norm_one(float32x4_t a) {
|
||||||
|
return glmm_hadd(glmm_abs(a));
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
float
|
||||||
|
glmm_norm_inf(float32x4_t a) {
|
||||||
|
return glmm_hmax(glmm_abs(a));
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
float32x4_t
|
||||||
|
glmm_fmadd(float32x4_t a, float32x4_t b, float32x4_t c) {
|
||||||
|
#if defined(__aarch64__)
|
||||||
|
return vfmaq_f32(c, a, b);
|
||||||
|
#else
|
||||||
|
return vmlaq_f32(c, a, b);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
float32x4_t
|
||||||
|
glmm_fnmadd(float32x4_t a, float32x4_t b, float32x4_t c) {
|
||||||
|
#if defined(__aarch64__)
|
||||||
|
return vfmsq_f32(c, a, b);
|
||||||
|
#else
|
||||||
|
return vmlsq_f32(c, a, b);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
float32x4_t
|
||||||
|
glmm_fmsub(float32x4_t a, float32x4_t b, float32x4_t c) {
|
||||||
|
#if defined(__aarch64__)
|
||||||
|
return vfmsq_f32(c, a, b);
|
||||||
|
#else
|
||||||
|
return vmlsq_f32(c, a, b);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
float32x4_t
|
||||||
|
glmm_fnmsub(float32x4_t a, float32x4_t b, float32x4_t c) {
|
||||||
|
return vsubq_f32(vdupq_n_f32(0.0f), glmm_fmadd(a, b, c));
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif /* cglm_simd_arm_h */
|
||||||
@@ -27,21 +27,24 @@ glm_mul_avx(mat4 m1, mat4 m2, mat4 dest) {
|
|||||||
y2 = glmm_load256(m1[0]); /* h g f e d c b a */
|
y2 = glmm_load256(m1[0]); /* h g f e d c b a */
|
||||||
y3 = glmm_load256(m1[2]); /* p o n m l k j i */
|
y3 = glmm_load256(m1[2]); /* p o n m l k j i */
|
||||||
|
|
||||||
y4 = _mm256_permute2f128_ps(y2, y2, 0b00000011); /* d c b a h g f e */
|
/* 0x03: 0b00000011 */
|
||||||
y5 = _mm256_permute2f128_ps(y3, y3, 0b00000000); /* l k j i l k j i */
|
y4 = _mm256_permute2f128_ps(y2, y2, 0x03); /* d c b a h g f e */
|
||||||
|
y5 = _mm256_permute2f128_ps(y3, y3, 0x03); /* l k j i p o n m */
|
||||||
|
|
||||||
/* f f f f a a a a */
|
/* f f f f a a a a */
|
||||||
/* g g g g c c c c */
|
/* h h h h c c c c */
|
||||||
/* e e e e b b b b */
|
/* e e e e b b b b */
|
||||||
y7 = _mm256_permute_ps(y0, 0b10101010);
|
/* g g g g d d d d */
|
||||||
y6 = _mm256_permutevar_ps(y0, _mm256_set_epi32(1, 1, 1, 1, 0, 0, 0, 0));
|
y6 = _mm256_permutevar_ps(y0, _mm256_set_epi32(1, 1, 1, 1, 0, 0, 0, 0));
|
||||||
|
y7 = _mm256_permutevar_ps(y0, _mm256_set_epi32(3, 3, 3, 3, 2, 2, 2, 2));
|
||||||
y8 = _mm256_permutevar_ps(y0, _mm256_set_epi32(0, 0, 0, 0, 1, 1, 1, 1));
|
y8 = _mm256_permutevar_ps(y0, _mm256_set_epi32(0, 0, 0, 0, 1, 1, 1, 1));
|
||||||
|
y9 = _mm256_permutevar_ps(y0, _mm256_set_epi32(2, 2, 2, 2, 3, 3, 3, 3));
|
||||||
|
|
||||||
glmm_store256(dest[0],
|
glmm_store256(dest[0],
|
||||||
_mm256_add_ps(_mm256_add_ps(_mm256_mul_ps(y2, y6),
|
_mm256_add_ps(_mm256_add_ps(_mm256_mul_ps(y2, y6),
|
||||||
_mm256_mul_ps(y4, y8)),
|
_mm256_mul_ps(y3, y7)),
|
||||||
_mm256_mul_ps(y5, y7)));
|
_mm256_add_ps(_mm256_mul_ps(y4, y8),
|
||||||
|
_mm256_mul_ps(y5, y9))));
|
||||||
|
|
||||||
/* n n n n i i i i */
|
/* n n n n i i i i */
|
||||||
/* p p p p k k k k */
|
/* p p p p k k k k */
|
||||||
|
|||||||
@@ -14,6 +14,16 @@
|
|||||||
|
|
||||||
#include <immintrin.h>
|
#include <immintrin.h>
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat4_scale_avx(mat4 m, float s) {
|
||||||
|
__m256 y0;
|
||||||
|
y0 = _mm256_set1_ps(s);
|
||||||
|
|
||||||
|
glmm_store256(m[0], _mm256_mul_ps(y0, glmm_load256(m[0])));
|
||||||
|
glmm_store256(m[2], _mm256_mul_ps(y0, glmm_load256(m[2])));
|
||||||
|
}
|
||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat4_mul_avx(mat4 m1, mat4 m2, mat4 dest) {
|
glm_mat4_mul_avx(mat4 m1, mat4 m2, mat4 dest) {
|
||||||
@@ -27,8 +37,9 @@ glm_mat4_mul_avx(mat4 m1, mat4 m2, mat4 dest) {
|
|||||||
y2 = glmm_load256(m1[0]); /* h g f e d c b a */
|
y2 = glmm_load256(m1[0]); /* h g f e d c b a */
|
||||||
y3 = glmm_load256(m1[2]); /* p o n m l k j i */
|
y3 = glmm_load256(m1[2]); /* p o n m l k j i */
|
||||||
|
|
||||||
y4 = _mm256_permute2f128_ps(y2, y2, 0b00000011); /* d c b a h g f e */
|
/* 0x03: 0b00000011 */
|
||||||
y5 = _mm256_permute2f128_ps(y3, y3, 0b00000011); /* l k j i p o n m */
|
y4 = _mm256_permute2f128_ps(y2, y2, 0x03); /* d c b a h g f e */
|
||||||
|
y5 = _mm256_permute2f128_ps(y3, y3, 0x03); /* l k j i p o n m */
|
||||||
|
|
||||||
/* f f f f a a a a */
|
/* f f f f a a a a */
|
||||||
/* h h h h c c c c */
|
/* h h h h c c c c */
|
||||||
|
|||||||
@@ -27,90 +27,64 @@
|
|||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
# include <xmmintrin.h>
|
# include <xmmintrin.h>
|
||||||
# include <emmintrin.h>
|
# include <emmintrin.h>
|
||||||
|
|
||||||
/* OPTIONAL: You may save some instructions but latency (not sure) */
|
|
||||||
#ifdef CGLM_USE_INT_DOMAIN
|
|
||||||
# define glmm_shuff1(xmm, z, y, x, w) \
|
|
||||||
_mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(xmm), \
|
|
||||||
_MM_SHUFFLE(z, y, x, w)))
|
|
||||||
#else
|
|
||||||
# define glmm_shuff1(xmm, z, y, x, w) \
|
|
||||||
_mm_shuffle_ps(xmm, xmm, _MM_SHUFFLE(z, y, x, w))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define glmm_shuff1x(xmm, x) glmm_shuff1(xmm, x, x, x, x)
|
|
||||||
#define glmm_shuff2(a, b, z0, y0, x0, w0, z1, y1, x1, w1) \
|
|
||||||
glmm_shuff1(_mm_shuffle_ps(a, b, _MM_SHUFFLE(z0, y0, x0, w0)), \
|
|
||||||
z1, y1, x1, w1)
|
|
||||||
|
|
||||||
static inline
|
|
||||||
__m128
|
|
||||||
glmm_dot(__m128 a, __m128 b) {
|
|
||||||
__m128 x0;
|
|
||||||
x0 = _mm_mul_ps(a, b);
|
|
||||||
x0 = _mm_add_ps(x0, glmm_shuff1(x0, 1, 0, 3, 2));
|
|
||||||
return _mm_add_ps(x0, glmm_shuff1(x0, 0, 1, 0, 1));
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline
|
|
||||||
__m128
|
|
||||||
glmm_norm(__m128 a) {
|
|
||||||
return _mm_sqrt_ps(glmm_dot(a, a));
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline
|
|
||||||
__m128
|
|
||||||
glmm_load3(float v[3]) {
|
|
||||||
__m128i xy;
|
|
||||||
__m128 z;
|
|
||||||
|
|
||||||
xy = _mm_loadl_epi64((const __m128i *)v);
|
|
||||||
z = _mm_load_ss(&v[2]);
|
|
||||||
|
|
||||||
return _mm_movelh_ps(_mm_castsi128_ps(xy), z);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline
|
|
||||||
void
|
|
||||||
glmm_store3(__m128 vx, float v[3]) {
|
|
||||||
_mm_storel_pi((__m64 *)&v[0], vx);
|
|
||||||
_mm_store_ss(&v[2], glmm_shuff1(vx, 2, 2, 2, 2));
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef CGLM_ALL_UNALIGNED
|
|
||||||
# define glmm_load(p) _mm_loadu_ps(p)
|
|
||||||
# define glmm_store(p, a) _mm_storeu_ps(p, a)
|
|
||||||
#else
|
|
||||||
# define glmm_load(p) _mm_load_ps(p)
|
|
||||||
# define glmm_store(p, a) _mm_store_ps(p, a)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* x86, x64 */
|
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
|
||||||
# define CGLM_SSE_FP 1
|
# define CGLM_SSE_FP 1
|
||||||
|
# ifndef CGLM_SIMD_x86
|
||||||
|
# define CGLM_SIMD_x86
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__SSE3__)
|
||||||
|
# include <x86intrin.h>
|
||||||
|
# ifndef CGLM_SIMD_x86
|
||||||
|
# define CGLM_SIMD_x86
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__SSE4_1__)
|
||||||
|
# include <smmintrin.h>
|
||||||
|
# ifndef CGLM_SIMD_x86
|
||||||
|
# define CGLM_SIMD_x86
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__SSE4_2__)
|
||||||
|
# include <nmmintrin.h>
|
||||||
|
# ifndef CGLM_SIMD_x86
|
||||||
|
# define CGLM_SIMD_x86
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __AVX__
|
#ifdef __AVX__
|
||||||
|
# include <immintrin.h>
|
||||||
# define CGLM_AVX_FP 1
|
# define CGLM_AVX_FP 1
|
||||||
|
# ifndef CGLM_SIMD_x86
|
||||||
#ifdef CGLM_ALL_UNALIGNED
|
# define CGLM_SIMD_x86
|
||||||
# define glmm_load256(p) _mm256_loadu_ps(p)
|
# endif
|
||||||
# define glmm_store256(p, a) _mm256_storeu_ps(p, a)
|
|
||||||
#else
|
|
||||||
# define glmm_load256(p) _mm256_load_ps(p)
|
|
||||||
# define glmm_store256(p, a) _mm256_store_ps(p, a)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* ARM Neon */
|
/* ARM Neon */
|
||||||
#if defined(__ARM_NEON) && defined(__ARM_NEON_FP)
|
#if defined(__ARM_NEON)
|
||||||
# include <arm_neon.h>
|
# include <arm_neon.h>
|
||||||
# define CGLM_NEON_FP 1
|
# if defined(__ARM_NEON_FP)
|
||||||
#else
|
# define CGLM_NEON_FP 1
|
||||||
# undef CGLM_NEON_FP
|
# ifndef CGLM_SIMD_ARM
|
||||||
|
# define CGLM_SIMD_ARM
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CGLM_SIMD_x86) || defined(CGLM_NEON_FP)
|
||||||
|
# ifndef CGLM_SIMD
|
||||||
|
# define CGLM_SIMD
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CGLM_SIMD_x86)
|
||||||
|
# include "x86.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CGLM_SIMD_ARM)
|
||||||
|
# include "arm.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* cglm_intrin_h */
|
#endif /* cglm_intrin_h */
|
||||||
|
|||||||
@@ -12,6 +12,32 @@
|
|||||||
#include "../../common.h"
|
#include "../../common.h"
|
||||||
#include "../intrin.h"
|
#include "../intrin.h"
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat4_scale_neon(mat4 m, float s) {
|
||||||
|
float32x4_t v0;
|
||||||
|
|
||||||
|
v0 = vdupq_n_f32(s);
|
||||||
|
|
||||||
|
vst1q_f32(m[0], vmulq_f32(vld1q_f32(m[0]), v0));
|
||||||
|
vst1q_f32(m[1], vmulq_f32(vld1q_f32(m[1]), v0));
|
||||||
|
vst1q_f32(m[2], vmulq_f32(vld1q_f32(m[2]), v0));
|
||||||
|
vst1q_f32(m[3], vmulq_f32(vld1q_f32(m[3]), v0));
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat4_transp_neon(mat4 m, mat4 dest) {
|
||||||
|
float32x4x4_t vmat;
|
||||||
|
|
||||||
|
vmat = vld4q_f32(m[0]);
|
||||||
|
|
||||||
|
vst1q_f32(dest[0], vmat.val[0]);
|
||||||
|
vst1q_f32(dest[1], vmat.val[1]);
|
||||||
|
vst1q_f32(dest[2], vmat.val[2]);
|
||||||
|
vst1q_f32(dest[3], vmat.val[3]);
|
||||||
|
}
|
||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat4_mul_neon(mat4 m1, mat4 m2, mat4 dest) {
|
glm_mat4_mul_neon(mat4 m1, mat4 m2, mat4 dest) {
|
||||||
@@ -53,5 +79,27 @@ glm_mat4_mul_neon(mat4 m1, mat4 m2, mat4 dest) {
|
|||||||
vst1q_f32(dest[3], d3);
|
vst1q_f32(dest[3], d3);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat4_mulv_neon(mat4 m, vec4 v, vec4 dest) {
|
||||||
|
float32x4_t l0, l1, l2, l3;
|
||||||
|
float32x2_t vlo, vhi;
|
||||||
|
|
||||||
|
l0 = vld1q_f32(m[0]);
|
||||||
|
l1 = vld1q_f32(m[1]);
|
||||||
|
l2 = vld1q_f32(m[2]);
|
||||||
|
l3 = vld1q_f32(m[3]);
|
||||||
|
|
||||||
|
vlo = vld1_f32(&v[0]);
|
||||||
|
vhi = vld1_f32(&v[2]);
|
||||||
|
|
||||||
|
l0 = vmulq_lane_f32(l0, vlo, 0);
|
||||||
|
l0 = vmlaq_lane_f32(l0, l1, vlo, 1);
|
||||||
|
l0 = vmlaq_lane_f32(l0, l2, vhi, 0);
|
||||||
|
l0 = vmlaq_lane_f32(l0, l3, vhi, 1);
|
||||||
|
|
||||||
|
vst1q_f32(dest, l0);
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
#endif /* cglm_mat4_neon_h */
|
#endif /* cglm_mat4_neon_h */
|
||||||
|
|||||||
@@ -25,28 +25,29 @@ glm_mul_sse2(mat4 m1, mat4 m2, mat4 dest) {
|
|||||||
|
|
||||||
r = glmm_load(m2[0]);
|
r = glmm_load(m2[0]);
|
||||||
glmm_store(dest[0],
|
glmm_store(dest[0],
|
||||||
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 0), l0),
|
glmm_fmadd(glmm_shuff1x(r, 0), l0,
|
||||||
_mm_mul_ps(glmm_shuff1x(r, 1), l1)),
|
glmm_fmadd(glmm_shuff1x(r, 1), l1,
|
||||||
_mm_mul_ps(glmm_shuff1x(r, 2), l2)));
|
_mm_mul_ps(glmm_shuff1x(r, 2), l2))));
|
||||||
|
|
||||||
r = glmm_load(m2[1]);
|
r = glmm_load(m2[1]);
|
||||||
glmm_store(dest[1],
|
glmm_store(dest[1],
|
||||||
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 0), l0),
|
glmm_fmadd(glmm_shuff1x(r, 0), l0,
|
||||||
_mm_mul_ps(glmm_shuff1x(r, 1), l1)),
|
glmm_fmadd(glmm_shuff1x(r, 1), l1,
|
||||||
_mm_mul_ps(glmm_shuff1x(r, 2), l2)));
|
_mm_mul_ps(glmm_shuff1x(r, 2), l2))));
|
||||||
|
|
||||||
r = glmm_load(m2[2]);
|
r = glmm_load(m2[2]);
|
||||||
glmm_store(dest[2],
|
glmm_store(dest[2],
|
||||||
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 0), l0),
|
glmm_fmadd(glmm_shuff1x(r, 0), l0,
|
||||||
_mm_mul_ps(glmm_shuff1x(r, 1), l1)),
|
glmm_fmadd(glmm_shuff1x(r, 1), l1,
|
||||||
_mm_mul_ps(glmm_shuff1x(r, 2), l2)));
|
_mm_mul_ps(glmm_shuff1x(r, 2), l2))));
|
||||||
|
|
||||||
r = glmm_load(m2[3]);
|
r = glmm_load(m2[3]);
|
||||||
glmm_store(dest[3],
|
glmm_store(dest[3],
|
||||||
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 0), l0),
|
glmm_fmadd(glmm_shuff1x(r, 0), l0,
|
||||||
_mm_mul_ps(glmm_shuff1x(r, 1), l1)),
|
glmm_fmadd(glmm_shuff1x(r, 1), l1,
|
||||||
_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 2), l2),
|
glmm_fmadd(glmm_shuff1x(r, 2), l2,
|
||||||
_mm_mul_ps(glmm_shuff1x(r, 3), l3))));
|
_mm_mul_ps(glmm_shuff1x(r, 3),
|
||||||
|
l3)))));
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
@@ -62,21 +63,22 @@ glm_mul_rot_sse2(mat4 m1, mat4 m2, mat4 dest) {
|
|||||||
|
|
||||||
r = glmm_load(m2[0]);
|
r = glmm_load(m2[0]);
|
||||||
glmm_store(dest[0],
|
glmm_store(dest[0],
|
||||||
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 0), l0),
|
glmm_fmadd(glmm_shuff1x(r, 0), l0,
|
||||||
_mm_mul_ps(glmm_shuff1x(r, 1), l1)),
|
glmm_fmadd(glmm_shuff1x(r, 1), l1,
|
||||||
_mm_mul_ps(glmm_shuff1x(r, 2), l2)));
|
_mm_mul_ps(glmm_shuff1x(r, 2), l2))));
|
||||||
|
|
||||||
r = glmm_load(m2[1]);
|
r = glmm_load(m2[1]);
|
||||||
glmm_store(dest[1],
|
glmm_store(dest[1],
|
||||||
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 0), l0),
|
glmm_fmadd(glmm_shuff1x(r, 0), l0,
|
||||||
_mm_mul_ps(glmm_shuff1x(r, 1), l1)),
|
glmm_fmadd(glmm_shuff1x(r, 1), l1,
|
||||||
_mm_mul_ps(glmm_shuff1x(r, 2), l2)));
|
_mm_mul_ps(glmm_shuff1x(r, 2), l2))));
|
||||||
|
|
||||||
|
|
||||||
r = glmm_load(m2[2]);
|
r = glmm_load(m2[2]);
|
||||||
glmm_store(dest[2],
|
glmm_store(dest[2],
|
||||||
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 0), l0),
|
glmm_fmadd(glmm_shuff1x(r, 0), l0,
|
||||||
_mm_mul_ps(glmm_shuff1x(r, 1), l1)),
|
glmm_fmadd(glmm_shuff1x(r, 1), l1,
|
||||||
_mm_mul_ps(glmm_shuff1x(r, 2), l2)));
|
_mm_mul_ps(glmm_shuff1x(r, 2), l2))));
|
||||||
|
|
||||||
glmm_store(dest[3], l3);
|
glmm_store(dest[3], l3);
|
||||||
}
|
}
|
||||||
@@ -94,9 +96,9 @@ glm_inv_tr_sse2(mat4 mat) {
|
|||||||
|
|
||||||
_MM_TRANSPOSE4_PS(r0, r1, r2, x1);
|
_MM_TRANSPOSE4_PS(r0, r1, r2, x1);
|
||||||
|
|
||||||
x0 = _mm_add_ps(_mm_mul_ps(r0, glmm_shuff1(r3, 0, 0, 0, 0)),
|
x0 = glmm_fmadd(r0, glmm_shuff1(r3, 0, 0, 0, 0),
|
||||||
_mm_mul_ps(r1, glmm_shuff1(r3, 1, 1, 1, 1)));
|
glmm_fmadd(r1, glmm_shuff1(r3, 1, 1, 1, 1),
|
||||||
x0 = _mm_add_ps(x0, _mm_mul_ps(r2, glmm_shuff1(r3, 2, 2, 2, 2)));
|
_mm_mul_ps(r2, glmm_shuff1(r3, 2, 2, 2, 2))));
|
||||||
x0 = _mm_xor_ps(x0, _mm_set1_ps(-0.f));
|
x0 = _mm_xor_ps(x0, _mm_set1_ps(-0.f));
|
||||||
|
|
||||||
x0 = _mm_add_ps(x0, x1);
|
x0 = _mm_add_ps(x0, x1);
|
||||||
|
|||||||
45
include/cglm/simd/sse2/mat2.h
Normal file
45
include/cglm/simd/sse2/mat2.h
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglm_mat2_sse_h
|
||||||
|
#define cglm_mat2_sse_h
|
||||||
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
|
|
||||||
|
#include "../../common.h"
|
||||||
|
#include "../intrin.h"
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat2_mul_sse2(mat2 m1, mat2 m2, mat2 dest) {
|
||||||
|
__m128 x0, x1, x2;
|
||||||
|
|
||||||
|
x1 = glmm_load(m1[0]); /* d c b a */
|
||||||
|
x2 = glmm_load(m2[0]); /* h g f e */
|
||||||
|
|
||||||
|
/*
|
||||||
|
dest[0][0] = a * e + c * f;
|
||||||
|
dest[0][1] = b * e + d * f;
|
||||||
|
dest[1][0] = a * g + c * h;
|
||||||
|
dest[1][1] = b * g + d * h;
|
||||||
|
*/
|
||||||
|
x0 = glmm_fmadd(_mm_movelh_ps(x1, x1), glmm_shuff1(x2, 2, 2, 0, 0),
|
||||||
|
_mm_mul_ps(_mm_movehl_ps(x1, x1),
|
||||||
|
glmm_shuff1(x2, 3, 3, 1, 1)));
|
||||||
|
|
||||||
|
glmm_store(dest[0], x0);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat2_transp_sse2(mat2 m, mat2 dest) {
|
||||||
|
/* d c b a */
|
||||||
|
/* d b c a */
|
||||||
|
glmm_store(dest[0], glmm_shuff1(glmm_load(m[0]), 3, 1, 2, 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif /* cglm_mat2_sse_h */
|
||||||
@@ -30,23 +30,16 @@ glm_mat3_mul_sse2(mat3 m1, mat3 m2, mat3 dest) {
|
|||||||
x1 = glmm_shuff2(l0, l1, 1, 0, 3, 3, 0, 3, 2, 0);
|
x1 = glmm_shuff2(l0, l1, 1, 0, 3, 3, 0, 3, 2, 0);
|
||||||
x2 = glmm_shuff2(l1, l2, 0, 0, 3, 2, 0, 2, 1, 0);
|
x2 = glmm_shuff2(l1, l2, 0, 0, 3, 2, 0, 2, 1, 0);
|
||||||
|
|
||||||
x0 = _mm_add_ps(_mm_mul_ps(glmm_shuff1(l0, 0, 2, 1, 0),
|
x0 = glmm_fmadd(glmm_shuff1(l0, 0, 2, 1, 0), glmm_shuff1(r0, 3, 0, 0, 0),
|
||||||
glmm_shuff1(r0, 3, 0, 0, 0)),
|
glmm_fmadd(x1, glmm_shuff2(r0, r1, 0, 0, 1, 1, 2, 0, 0, 0),
|
||||||
_mm_mul_ps(x1, glmm_shuff2(r0, r1, 0, 0, 1, 1, 2, 0, 0, 0)));
|
_mm_mul_ps(x2, glmm_shuff2(r0, r1, 1, 1, 2, 2, 2, 0, 0, 0))));
|
||||||
|
|
||||||
x0 = _mm_add_ps(x0,
|
|
||||||
_mm_mul_ps(x2, glmm_shuff2(r0, r1, 1, 1, 2, 2, 2, 0, 0, 0)));
|
|
||||||
|
|
||||||
_mm_storeu_ps(dest[0], x0);
|
_mm_storeu_ps(dest[0], x0);
|
||||||
|
|
||||||
x0 = _mm_add_ps(_mm_mul_ps(glmm_shuff1(l0, 1, 0, 2, 1),
|
x0 = glmm_fmadd(glmm_shuff1(l0, 1, 0, 2, 1), _mm_shuffle_ps(r0, r1, _MM_SHUFFLE(2, 2, 3, 3)),
|
||||||
_mm_shuffle_ps(r0, r1, _MM_SHUFFLE(2, 2, 3, 3))),
|
glmm_fmadd(glmm_shuff1(x1, 1, 0, 2, 1), glmm_shuff1(r1, 3, 3, 0, 0),
|
||||||
_mm_mul_ps(glmm_shuff1(x1, 1, 0, 2, 1),
|
_mm_mul_ps(glmm_shuff1(x2, 1, 0, 2, 1),
|
||||||
glmm_shuff1(r1, 3, 3, 0, 0)));
|
_mm_shuffle_ps(r1, r2, _MM_SHUFFLE(0, 0, 1, 1)))));
|
||||||
|
|
||||||
x0 = _mm_add_ps(x0,
|
|
||||||
_mm_mul_ps(glmm_shuff1(x2, 1, 0, 2, 1),
|
|
||||||
_mm_shuffle_ps(r1, r2, _MM_SHUFFLE(0, 0, 1, 1))));
|
|
||||||
|
|
||||||
_mm_storeu_ps(&dest[1][1], x0);
|
_mm_storeu_ps(&dest[1][1], x0);
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat4_scale_sse2(mat4 m, float s){
|
glm_mat4_scale_sse2(mat4 m, float s) {
|
||||||
__m128 x0;
|
__m128 x0;
|
||||||
x0 = _mm_set1_ps(s);
|
x0 = _mm_set1_ps(s);
|
||||||
|
|
||||||
@@ -28,7 +28,7 @@ glm_mat4_scale_sse2(mat4 m, float s){
|
|||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat4_transp_sse2(mat4 m, mat4 dest){
|
glm_mat4_transp_sse2(mat4 m, mat4 dest) {
|
||||||
__m128 r0, r1, r2, r3;
|
__m128 r0, r1, r2, r3;
|
||||||
|
|
||||||
r0 = glmm_load(m[0]);
|
r0 = glmm_load(m[0]);
|
||||||
@@ -56,46 +56,37 @@ glm_mat4_mul_sse2(mat4 m1, mat4 m2, mat4 dest) {
|
|||||||
l2 = glmm_load(m1[2]);
|
l2 = glmm_load(m1[2]);
|
||||||
l3 = glmm_load(m1[3]);
|
l3 = glmm_load(m1[3]);
|
||||||
|
|
||||||
r = glmm_load(m2[0]);
|
#define XX(C) \
|
||||||
glmm_store(dest[0],
|
\
|
||||||
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 0), l0),
|
r = glmm_load(m2[C]); \
|
||||||
_mm_mul_ps(glmm_shuff1x(r, 1), l1)),
|
glmm_store(dest[C], \
|
||||||
_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 2), l2),
|
glmm_fmadd(glmm_shuff1x(r, 0), l0, \
|
||||||
_mm_mul_ps(glmm_shuff1x(r, 3), l3))));
|
glmm_fmadd(glmm_shuff1x(r, 1), l1, \
|
||||||
r = glmm_load(m2[1]);
|
glmm_fmadd(glmm_shuff1x(r, 2), l2, \
|
||||||
glmm_store(dest[1],
|
_mm_mul_ps(glmm_shuff1x(r, 3), \
|
||||||
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 0), l0),
|
l3)))));
|
||||||
_mm_mul_ps(glmm_shuff1x(r, 1), l1)),
|
|
||||||
_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 2), l2),
|
|
||||||
_mm_mul_ps(glmm_shuff1x(r, 3), l3))));
|
|
||||||
r = glmm_load(m2[2]);
|
|
||||||
glmm_store(dest[2],
|
|
||||||
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 0), l0),
|
|
||||||
_mm_mul_ps(glmm_shuff1x(r, 1), l1)),
|
|
||||||
_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 2), l2),
|
|
||||||
_mm_mul_ps(glmm_shuff1x(r, 3), l3))));
|
|
||||||
|
|
||||||
r = glmm_load(m2[3]);
|
XX(0);
|
||||||
glmm_store(dest[3],
|
XX(1);
|
||||||
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 0), l0),
|
XX(2);
|
||||||
_mm_mul_ps(glmm_shuff1x(r, 1), l1)),
|
XX(3);
|
||||||
_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 2), l2),
|
|
||||||
_mm_mul_ps(glmm_shuff1x(r, 3), l3))));
|
#undef XX
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat4_mulv_sse2(mat4 m, vec4 v, vec4 dest) {
|
glm_mat4_mulv_sse2(mat4 m, vec4 v, vec4 dest) {
|
||||||
__m128 x0, x1, x2;
|
__m128 x0, x1;
|
||||||
|
|
||||||
x0 = glmm_load(v);
|
x0 = glmm_load(v);
|
||||||
x1 = _mm_add_ps(_mm_mul_ps(glmm_load(m[0]), glmm_shuff1x(x0, 0)),
|
x1 = glmm_fmadd(glmm_load(m[0]), glmm_shuff1x(x0, 0),
|
||||||
_mm_mul_ps(glmm_load(m[1]), glmm_shuff1x(x0, 1)));
|
glmm_fmadd(glmm_load(m[1]), glmm_shuff1x(x0, 1),
|
||||||
|
glmm_fmadd(glmm_load(m[2]), glmm_shuff1x(x0, 2),
|
||||||
|
_mm_mul_ps(glmm_load(m[3]),
|
||||||
|
glmm_shuff1x(x0, 3)))));
|
||||||
|
|
||||||
x2 = _mm_add_ps(_mm_mul_ps(glmm_load(m[2]), glmm_shuff1x(x0, 2)),
|
glmm_store(dest, x1);
|
||||||
_mm_mul_ps(glmm_load(m[3]), glmm_shuff1x(x0, 3)));
|
|
||||||
|
|
||||||
glmm_store(dest, _mm_add_ps(x1, x2));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
@@ -115,20 +106,18 @@ glm_mat4_det_sse2(mat4 mat) {
|
|||||||
t[3] = i * p - m * l;
|
t[3] = i * p - m * l;
|
||||||
t[4] = i * o - m * k;
|
t[4] = i * o - m * k;
|
||||||
*/
|
*/
|
||||||
x0 = _mm_sub_ps(_mm_mul_ps(glmm_shuff1(r2, 0, 0, 1, 1),
|
x0 = glmm_fnmadd(glmm_shuff1(r3, 0, 0, 1, 1), glmm_shuff1(r2, 2, 3, 2, 3),
|
||||||
glmm_shuff1(r3, 2, 3, 2, 3)),
|
_mm_mul_ps(glmm_shuff1(r2, 0, 0, 1, 1),
|
||||||
_mm_mul_ps(glmm_shuff1(r3, 0, 0, 1, 1),
|
glmm_shuff1(r3, 2, 3, 2, 3)));
|
||||||
glmm_shuff1(r2, 2, 3, 2, 3)));
|
|
||||||
/*
|
/*
|
||||||
t[0] = k * p - o * l;
|
t[0] = k * p - o * l;
|
||||||
t[0] = k * p - o * l;
|
t[0] = k * p - o * l;
|
||||||
t[5] = i * n - m * j;
|
t[5] = i * n - m * j;
|
||||||
t[5] = i * n - m * j;
|
t[5] = i * n - m * j;
|
||||||
*/
|
*/
|
||||||
x1 = _mm_sub_ps(_mm_mul_ps(glmm_shuff1(r2, 0, 0, 2, 2),
|
x1 = glmm_fnmadd(glmm_shuff1(r3, 0, 0, 2, 2), glmm_shuff1(r2, 1, 1, 3, 3),
|
||||||
glmm_shuff1(r3, 1, 1, 3, 3)),
|
_mm_mul_ps(glmm_shuff1(r2, 0, 0, 2, 2),
|
||||||
_mm_mul_ps(glmm_shuff1(r3, 0, 0, 2, 2),
|
glmm_shuff1(r3, 1, 1, 3, 3)));
|
||||||
glmm_shuff1(r2, 1, 1, 3, 3)));
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
a * (f * t[0] - g * t[1] + h * t[2])
|
a * (f * t[0] - g * t[1] + h * t[2])
|
||||||
@@ -136,21 +125,16 @@ glm_mat4_det_sse2(mat4 mat) {
|
|||||||
+ c * (e * t[1] - f * t[3] + h * t[5])
|
+ c * (e * t[1] - f * t[3] + h * t[5])
|
||||||
- d * (e * t[2] - f * t[4] + g * t[5])
|
- d * (e * t[2] - f * t[4] + g * t[5])
|
||||||
*/
|
*/
|
||||||
x2 = _mm_sub_ps(_mm_mul_ps(glmm_shuff1(r1, 0, 0, 0, 1),
|
x2 = glmm_fnmadd(glmm_shuff1(r1, 1, 1, 2, 2), glmm_shuff1(x0, 3, 2, 2, 0),
|
||||||
_mm_shuffle_ps(x1, x0, _MM_SHUFFLE(1, 0, 0, 0))),
|
_mm_mul_ps(glmm_shuff1(r1, 0, 0, 0, 1),
|
||||||
_mm_mul_ps(glmm_shuff1(r1, 1, 1, 2, 2),
|
_mm_shuffle_ps(x1, x0, _MM_SHUFFLE(1, 0, 0, 0))));
|
||||||
glmm_shuff1(x0, 3, 2, 2, 0)));
|
x2 = glmm_fmadd(glmm_shuff1(r1, 2, 3, 3, 3),
|
||||||
|
_mm_shuffle_ps(x0, x1, _MM_SHUFFLE(2, 2, 3, 1)),
|
||||||
|
x2);
|
||||||
|
|
||||||
x2 = _mm_add_ps(x2,
|
|
||||||
_mm_mul_ps(glmm_shuff1(r1, 2, 3, 3, 3),
|
|
||||||
_mm_shuffle_ps(x0, x1, _MM_SHUFFLE(2, 2, 3, 1))));
|
|
||||||
x2 = _mm_xor_ps(x2, _mm_set_ps(-0.f, 0.f, -0.f, 0.f));
|
x2 = _mm_xor_ps(x2, _mm_set_ps(-0.f, 0.f, -0.f, 0.f));
|
||||||
|
|
||||||
x0 = _mm_mul_ps(r0, x2);
|
return glmm_hadd(_mm_mul_ps(x2, r0));
|
||||||
x0 = _mm_add_ps(x0, glmm_shuff1(x0, 0, 1, 2, 3));
|
|
||||||
x0 = _mm_add_ps(x0, glmm_shuff1(x0, 1, 3, 3, 1));
|
|
||||||
|
|
||||||
return _mm_cvtss_f32(x0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
@@ -159,7 +143,10 @@ glm_mat4_inv_fast_sse2(mat4 mat, mat4 dest) {
|
|||||||
__m128 r0, r1, r2, r3,
|
__m128 r0, r1, r2, r3,
|
||||||
v0, v1, v2, v3,
|
v0, v1, v2, v3,
|
||||||
t0, t1, t2, t3, t4, t5,
|
t0, t1, t2, t3, t4, t5,
|
||||||
x0, x1, x2, x3, x4, x5, x6, x7;
|
x0, x1, x2, x3, x4, x5, x6, x7, x8, x9;
|
||||||
|
|
||||||
|
x8 = _mm_set_ps(-0.f, 0.f, -0.f, 0.f);
|
||||||
|
x9 = glmm_shuff1(x8, 2, 1, 2, 1);
|
||||||
|
|
||||||
/* 127 <- 0 */
|
/* 127 <- 0 */
|
||||||
r0 = glmm_load(mat[0]); /* d c b a */
|
r0 = glmm_load(mat[0]); /* d c b a */
|
||||||
@@ -177,7 +164,7 @@ glm_mat4_inv_fast_sse2(mat4 mat, mat4 dest) {
|
|||||||
t1[0] = k * p - o * l;
|
t1[0] = k * p - o * l;
|
||||||
t2[0] = g * p - o * h;
|
t2[0] = g * p - o * h;
|
||||||
t3[0] = g * l - k * h; */
|
t3[0] = g * l - k * h; */
|
||||||
t0 = _mm_sub_ps(_mm_mul_ps(x3, x1), _mm_mul_ps(x2, x0));
|
t0 = glmm_fnmadd(x2, x0, _mm_mul_ps(x3, x1));
|
||||||
|
|
||||||
x4 = _mm_shuffle_ps(r2, r3, _MM_SHUFFLE(2, 1, 2, 1)); /* o n k j */
|
x4 = _mm_shuffle_ps(r2, r3, _MM_SHUFFLE(2, 1, 2, 1)); /* o n k j */
|
||||||
x4 = glmm_shuff1(x4, 0, 2, 2, 2); /* j n n n */
|
x4 = glmm_shuff1(x4, 0, 2, 2, 2); /* j n n n */
|
||||||
@@ -187,13 +174,13 @@ glm_mat4_inv_fast_sse2(mat4 mat, mat4 dest) {
|
|||||||
t1[1] = j * p - n * l;
|
t1[1] = j * p - n * l;
|
||||||
t2[1] = f * p - n * h;
|
t2[1] = f * p - n * h;
|
||||||
t3[1] = f * l - j * h; */
|
t3[1] = f * l - j * h; */
|
||||||
t1 = _mm_sub_ps(_mm_mul_ps(x5, x1), _mm_mul_ps(x4, x0));
|
t1 = glmm_fnmadd(x4, x0, _mm_mul_ps(x5, x1));
|
||||||
|
|
||||||
/* t1[2] = j * o - n * k
|
/* t1[2] = j * o - n * k
|
||||||
t1[2] = j * o - n * k;
|
t1[2] = j * o - n * k;
|
||||||
t2[2] = f * o - n * g;
|
t2[2] = f * o - n * g;
|
||||||
t3[2] = f * k - j * g; */
|
t3[2] = f * k - j * g; */
|
||||||
t2 = _mm_sub_ps(_mm_mul_ps(x5, x2), _mm_mul_ps(x4, x3));
|
t2 = glmm_fnmadd(x4, x3, _mm_mul_ps(x5, x2));
|
||||||
|
|
||||||
x6 = _mm_shuffle_ps(r2, r1, _MM_SHUFFLE(0, 0, 0, 0)); /* e e i i */
|
x6 = _mm_shuffle_ps(r2, r1, _MM_SHUFFLE(0, 0, 0, 0)); /* e e i i */
|
||||||
x7 = glmm_shuff2(r3, r2, 0, 0, 0, 0, 2, 0, 0, 0); /* i m m m */
|
x7 = glmm_shuff2(r3, r2, 0, 0, 0, 0, 2, 0, 0, 0); /* i m m m */
|
||||||
@@ -202,19 +189,19 @@ glm_mat4_inv_fast_sse2(mat4 mat, mat4 dest) {
|
|||||||
t1[3] = i * p - m * l;
|
t1[3] = i * p - m * l;
|
||||||
t2[3] = e * p - m * h;
|
t2[3] = e * p - m * h;
|
||||||
t3[3] = e * l - i * h; */
|
t3[3] = e * l - i * h; */
|
||||||
t3 = _mm_sub_ps(_mm_mul_ps(x6, x1), _mm_mul_ps(x7, x0));
|
t3 = glmm_fnmadd(x7, x0, _mm_mul_ps(x6, x1));
|
||||||
|
|
||||||
/* t1[4] = i * o - m * k;
|
/* t1[4] = i * o - m * k;
|
||||||
t1[4] = i * o - m * k;
|
t1[4] = i * o - m * k;
|
||||||
t2[4] = e * o - m * g;
|
t2[4] = e * o - m * g;
|
||||||
t3[4] = e * k - i * g; */
|
t3[4] = e * k - i * g; */
|
||||||
t4 = _mm_sub_ps(_mm_mul_ps(x6, x2), _mm_mul_ps(x7, x3));
|
t4 = glmm_fnmadd(x7, x3, _mm_mul_ps(x6, x2));
|
||||||
|
|
||||||
/* t1[5] = i * n - m * j;
|
/* t1[5] = i * n - m * j;
|
||||||
t1[5] = i * n - m * j;
|
t1[5] = i * n - m * j;
|
||||||
t2[5] = e * n - m * f;
|
t2[5] = e * n - m * f;
|
||||||
t3[5] = e * j - i * f; */
|
t3[5] = e * j - i * f; */
|
||||||
t5 = _mm_sub_ps(_mm_mul_ps(x6, x4), _mm_mul_ps(x7, x5));
|
t5 = glmm_fnmadd(x7, x5, _mm_mul_ps(x6, x4));
|
||||||
|
|
||||||
x0 = glmm_shuff2(r1, r0, 0, 0, 0, 0, 2, 2, 2, 0); /* a a a e */
|
x0 = glmm_shuff2(r1, r0, 0, 0, 0, 0, 2, 2, 2, 0); /* a a a e */
|
||||||
x1 = glmm_shuff2(r1, r0, 1, 1, 1, 1, 2, 2, 2, 0); /* b b b f */
|
x1 = glmm_shuff2(r1, r0, 1, 1, 1, 1, 2, 2, 2, 0); /* b b b f */
|
||||||
@@ -226,50 +213,35 @@ glm_mat4_inv_fast_sse2(mat4 mat, mat4 dest) {
|
|||||||
dest[0][1] =-(b * t1[0] - c * t1[1] + d * t1[2]);
|
dest[0][1] =-(b * t1[0] - c * t1[1] + d * t1[2]);
|
||||||
dest[0][2] = b * t2[0] - c * t2[1] + d * t2[2];
|
dest[0][2] = b * t2[0] - c * t2[1] + d * t2[2];
|
||||||
dest[0][3] =-(b * t3[0] - c * t3[1] + d * t3[2]); */
|
dest[0][3] =-(b * t3[0] - c * t3[1] + d * t3[2]); */
|
||||||
v0 = _mm_add_ps(_mm_mul_ps(x3, t2),
|
v0 = _mm_xor_ps(glmm_fmadd(x3, t2, glmm_fnmadd(x2, t1, _mm_mul_ps(x1, t0))), x8);
|
||||||
_mm_sub_ps(_mm_mul_ps(x1, t0),
|
|
||||||
_mm_mul_ps(x2, t1)));
|
|
||||||
v0 = _mm_xor_ps(v0, _mm_set_ps(-0.f, 0.f, -0.f, 0.f));
|
|
||||||
|
|
||||||
/*
|
|
||||||
dest[1][0] =-(e * t1[0] - g * t1[3] + h * t1[4]);
|
|
||||||
dest[1][1] = a * t1[0] - c * t1[3] + d * t1[4];
|
|
||||||
dest[1][2] =-(a * t2[0] - c * t2[3] + d * t2[4]);
|
|
||||||
dest[1][3] = a * t3[0] - c * t3[3] + d * t3[4]; */
|
|
||||||
v1 = _mm_add_ps(_mm_mul_ps(x3, t4),
|
|
||||||
_mm_sub_ps(_mm_mul_ps(x0, t0),
|
|
||||||
_mm_mul_ps(x2, t3)));
|
|
||||||
v1 = _mm_xor_ps(v1, _mm_set_ps(0.f, -0.f, 0.f, -0.f));
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
dest[2][0] = e * t1[1] - f * t1[3] + h * t1[5];
|
dest[2][0] = e * t1[1] - f * t1[3] + h * t1[5];
|
||||||
dest[2][1] =-(a * t1[1] - b * t1[3] + d * t1[5]);
|
dest[2][1] =-(a * t1[1] - b * t1[3] + d * t1[5]);
|
||||||
dest[2][2] = a * t2[1] - b * t2[3] + d * t2[5];
|
dest[2][2] = a * t2[1] - b * t2[3] + d * t2[5];
|
||||||
dest[2][3] =-(a * t3[1] - b * t3[3] + d * t3[5]);*/
|
dest[2][3] =-(a * t3[1] - b * t3[3] + d * t3[5]);*/
|
||||||
v2 = _mm_add_ps(_mm_mul_ps(x3, t5),
|
v2 = _mm_xor_ps(glmm_fmadd(x3, t5, glmm_fnmadd(x1, t3, _mm_mul_ps(x0, t1))), x8);
|
||||||
_mm_sub_ps(_mm_mul_ps(x0, t1),
|
|
||||||
_mm_mul_ps(x1, t3)));
|
/*
|
||||||
v2 = _mm_xor_ps(v2, _mm_set_ps(-0.f, 0.f, -0.f, 0.f));
|
dest[1][0] =-(e * t1[0] - g * t1[3] + h * t1[4]);
|
||||||
|
dest[1][1] = a * t1[0] - c * t1[3] + d * t1[4];
|
||||||
|
dest[1][2] =-(a * t2[0] - c * t2[3] + d * t2[4]);
|
||||||
|
dest[1][3] = a * t3[0] - c * t3[3] + d * t3[4]; */
|
||||||
|
v1 = _mm_xor_ps(glmm_fmadd(x3, t4, glmm_fnmadd(x2, t3, _mm_mul_ps(x0, t0))), x9);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
dest[3][0] =-(e * t1[2] - f * t1[4] + g * t1[5]);
|
dest[3][0] =-(e * t1[2] - f * t1[4] + g * t1[5]);
|
||||||
dest[3][1] = a * t1[2] - b * t1[4] + c * t1[5];
|
dest[3][1] = a * t1[2] - b * t1[4] + c * t1[5];
|
||||||
dest[3][2] =-(a * t2[2] - b * t2[4] + c * t2[5]);
|
dest[3][2] =-(a * t2[2] - b * t2[4] + c * t2[5]);
|
||||||
dest[3][3] = a * t3[2] - b * t3[4] + c * t3[5]; */
|
dest[3][3] = a * t3[2] - b * t3[4] + c * t3[5]; */
|
||||||
v3 = _mm_add_ps(_mm_mul_ps(x2, t5),
|
v3 = _mm_xor_ps(glmm_fmadd(x2, t5, glmm_fnmadd(x1, t4, _mm_mul_ps(x0, t2))), x9);
|
||||||
_mm_sub_ps(_mm_mul_ps(x0, t2),
|
|
||||||
_mm_mul_ps(x1, t4)));
|
|
||||||
v3 = _mm_xor_ps(v3, _mm_set_ps(0.f, -0.f, 0.f, -0.f));
|
|
||||||
|
|
||||||
/* determinant */
|
/* determinant */
|
||||||
x0 = _mm_shuffle_ps(v0, v1, _MM_SHUFFLE(0, 0, 0, 0));
|
x0 = _mm_shuffle_ps(v0, v1, _MM_SHUFFLE(0, 0, 0, 0));
|
||||||
x1 = _mm_shuffle_ps(v2, v3, _MM_SHUFFLE(0, 0, 0, 0));
|
x1 = _mm_shuffle_ps(v2, v3, _MM_SHUFFLE(0, 0, 0, 0));
|
||||||
x0 = _mm_shuffle_ps(x0, x1, _MM_SHUFFLE(2, 0, 2, 0));
|
x0 = _mm_shuffle_ps(x0, x1, _MM_SHUFFLE(2, 0, 2, 0));
|
||||||
|
|
||||||
x0 = _mm_mul_ps(x0, r0);
|
x0 = _mm_rcp_ps(glmm_vhadd(_mm_mul_ps(x0, r0)));
|
||||||
x0 = _mm_add_ps(x0, glmm_shuff1(x0, 0, 1, 2, 3));
|
|
||||||
x0 = _mm_add_ps(x0, glmm_shuff1(x0, 1, 0, 0, 1));
|
|
||||||
x0 = _mm_rcp_ps(x0);
|
|
||||||
|
|
||||||
glmm_store(dest[0], _mm_mul_ps(v0, x0));
|
glmm_store(dest[0], _mm_mul_ps(v0, x0));
|
||||||
glmm_store(dest[1], _mm_mul_ps(v1, x0));
|
glmm_store(dest[1], _mm_mul_ps(v1, x0));
|
||||||
@@ -283,7 +255,10 @@ glm_mat4_inv_sse2(mat4 mat, mat4 dest) {
|
|||||||
__m128 r0, r1, r2, r3,
|
__m128 r0, r1, r2, r3,
|
||||||
v0, v1, v2, v3,
|
v0, v1, v2, v3,
|
||||||
t0, t1, t2, t3, t4, t5,
|
t0, t1, t2, t3, t4, t5,
|
||||||
x0, x1, x2, x3, x4, x5, x6, x7;
|
x0, x1, x2, x3, x4, x5, x6, x7, x8, x9;
|
||||||
|
|
||||||
|
x8 = _mm_set_ps(-0.f, 0.f, -0.f, 0.f);
|
||||||
|
x9 = glmm_shuff1(x8, 2, 1, 2, 1);
|
||||||
|
|
||||||
/* 127 <- 0 */
|
/* 127 <- 0 */
|
||||||
r0 = glmm_load(mat[0]); /* d c b a */
|
r0 = glmm_load(mat[0]); /* d c b a */
|
||||||
@@ -301,7 +276,7 @@ glm_mat4_inv_sse2(mat4 mat, mat4 dest) {
|
|||||||
t1[0] = k * p - o * l;
|
t1[0] = k * p - o * l;
|
||||||
t2[0] = g * p - o * h;
|
t2[0] = g * p - o * h;
|
||||||
t3[0] = g * l - k * h; */
|
t3[0] = g * l - k * h; */
|
||||||
t0 = _mm_sub_ps(_mm_mul_ps(x3, x1), _mm_mul_ps(x2, x0));
|
t0 = glmm_fnmadd(x2, x0, _mm_mul_ps(x3, x1));
|
||||||
|
|
||||||
x4 = _mm_shuffle_ps(r2, r3, _MM_SHUFFLE(2, 1, 2, 1)); /* o n k j */
|
x4 = _mm_shuffle_ps(r2, r3, _MM_SHUFFLE(2, 1, 2, 1)); /* o n k j */
|
||||||
x4 = glmm_shuff1(x4, 0, 2, 2, 2); /* j n n n */
|
x4 = glmm_shuff1(x4, 0, 2, 2, 2); /* j n n n */
|
||||||
@@ -311,13 +286,13 @@ glm_mat4_inv_sse2(mat4 mat, mat4 dest) {
|
|||||||
t1[1] = j * p - n * l;
|
t1[1] = j * p - n * l;
|
||||||
t2[1] = f * p - n * h;
|
t2[1] = f * p - n * h;
|
||||||
t3[1] = f * l - j * h; */
|
t3[1] = f * l - j * h; */
|
||||||
t1 = _mm_sub_ps(_mm_mul_ps(x5, x1), _mm_mul_ps(x4, x0));
|
t1 = glmm_fnmadd(x4, x0, _mm_mul_ps(x5, x1));
|
||||||
|
|
||||||
/* t1[2] = j * o - n * k
|
/* t1[2] = j * o - n * k
|
||||||
t1[2] = j * o - n * k;
|
t1[2] = j * o - n * k;
|
||||||
t2[2] = f * o - n * g;
|
t2[2] = f * o - n * g;
|
||||||
t3[2] = f * k - j * g; */
|
t3[2] = f * k - j * g; */
|
||||||
t2 = _mm_sub_ps(_mm_mul_ps(x5, x2), _mm_mul_ps(x4, x3));
|
t2 = glmm_fnmadd(x4, x3, _mm_mul_ps(x5, x2));
|
||||||
|
|
||||||
x6 = _mm_shuffle_ps(r2, r1, _MM_SHUFFLE(0, 0, 0, 0)); /* e e i i */
|
x6 = _mm_shuffle_ps(r2, r1, _MM_SHUFFLE(0, 0, 0, 0)); /* e e i i */
|
||||||
x7 = glmm_shuff2(r3, r2, 0, 0, 0, 0, 2, 0, 0, 0); /* i m m m */
|
x7 = glmm_shuff2(r3, r2, 0, 0, 0, 0, 2, 0, 0, 0); /* i m m m */
|
||||||
@@ -326,19 +301,19 @@ glm_mat4_inv_sse2(mat4 mat, mat4 dest) {
|
|||||||
t1[3] = i * p - m * l;
|
t1[3] = i * p - m * l;
|
||||||
t2[3] = e * p - m * h;
|
t2[3] = e * p - m * h;
|
||||||
t3[3] = e * l - i * h; */
|
t3[3] = e * l - i * h; */
|
||||||
t3 = _mm_sub_ps(_mm_mul_ps(x6, x1), _mm_mul_ps(x7, x0));
|
t3 = glmm_fnmadd(x7, x0, _mm_mul_ps(x6, x1));
|
||||||
|
|
||||||
/* t1[4] = i * o - m * k;
|
/* t1[4] = i * o - m * k;
|
||||||
t1[4] = i * o - m * k;
|
t1[4] = i * o - m * k;
|
||||||
t2[4] = e * o - m * g;
|
t2[4] = e * o - m * g;
|
||||||
t3[4] = e * k - i * g; */
|
t3[4] = e * k - i * g; */
|
||||||
t4 = _mm_sub_ps(_mm_mul_ps(x6, x2), _mm_mul_ps(x7, x3));
|
t4 = glmm_fnmadd(x7, x3, _mm_mul_ps(x6, x2));
|
||||||
|
|
||||||
/* t1[5] = i * n - m * j;
|
/* t1[5] = i * n - m * j;
|
||||||
t1[5] = i * n - m * j;
|
t1[5] = i * n - m * j;
|
||||||
t2[5] = e * n - m * f;
|
t2[5] = e * n - m * f;
|
||||||
t3[5] = e * j - i * f; */
|
t3[5] = e * j - i * f; */
|
||||||
t5 = _mm_sub_ps(_mm_mul_ps(x6, x4), _mm_mul_ps(x7, x5));
|
t5 = glmm_fnmadd(x7, x5, _mm_mul_ps(x6, x4));
|
||||||
|
|
||||||
x0 = glmm_shuff2(r1, r0, 0, 0, 0, 0, 2, 2, 2, 0); /* a a a e */
|
x0 = glmm_shuff2(r1, r0, 0, 0, 0, 0, 2, 2, 2, 0); /* a a a e */
|
||||||
x1 = glmm_shuff2(r1, r0, 1, 1, 1, 1, 2, 2, 2, 0); /* b b b f */
|
x1 = glmm_shuff2(r1, r0, 1, 1, 1, 1, 2, 2, 2, 0); /* b b b f */
|
||||||
@@ -350,50 +325,35 @@ glm_mat4_inv_sse2(mat4 mat, mat4 dest) {
|
|||||||
dest[0][1] =-(b * t1[0] - c * t1[1] + d * t1[2]);
|
dest[0][1] =-(b * t1[0] - c * t1[1] + d * t1[2]);
|
||||||
dest[0][2] = b * t2[0] - c * t2[1] + d * t2[2];
|
dest[0][2] = b * t2[0] - c * t2[1] + d * t2[2];
|
||||||
dest[0][3] =-(b * t3[0] - c * t3[1] + d * t3[2]); */
|
dest[0][3] =-(b * t3[0] - c * t3[1] + d * t3[2]); */
|
||||||
v0 = _mm_add_ps(_mm_mul_ps(x3, t2),
|
v0 = _mm_xor_ps(glmm_fmadd(x3, t2, glmm_fnmadd(x2, t1, _mm_mul_ps(x1, t0))), x8);
|
||||||
_mm_sub_ps(_mm_mul_ps(x1, t0),
|
|
||||||
_mm_mul_ps(x2, t1)));
|
|
||||||
v0 = _mm_xor_ps(v0, _mm_set_ps(-0.f, 0.f, -0.f, 0.f));
|
|
||||||
|
|
||||||
/*
|
|
||||||
dest[1][0] =-(e * t1[0] - g * t1[3] + h * t1[4]);
|
|
||||||
dest[1][1] = a * t1[0] - c * t1[3] + d * t1[4];
|
|
||||||
dest[1][2] =-(a * t2[0] - c * t2[3] + d * t2[4]);
|
|
||||||
dest[1][3] = a * t3[0] - c * t3[3] + d * t3[4]; */
|
|
||||||
v1 = _mm_add_ps(_mm_mul_ps(x3, t4),
|
|
||||||
_mm_sub_ps(_mm_mul_ps(x0, t0),
|
|
||||||
_mm_mul_ps(x2, t3)));
|
|
||||||
v1 = _mm_xor_ps(v1, _mm_set_ps(0.f, -0.f, 0.f, -0.f));
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
dest[2][0] = e * t1[1] - f * t1[3] + h * t1[5];
|
dest[2][0] = e * t1[1] - f * t1[3] + h * t1[5];
|
||||||
dest[2][1] =-(a * t1[1] - b * t1[3] + d * t1[5]);
|
dest[2][1] =-(a * t1[1] - b * t1[3] + d * t1[5]);
|
||||||
dest[2][2] = a * t2[1] - b * t2[3] + d * t2[5];
|
dest[2][2] = a * t2[1] - b * t2[3] + d * t2[5];
|
||||||
dest[2][3] =-(a * t3[1] - b * t3[3] + d * t3[5]);*/
|
dest[2][3] =-(a * t3[1] - b * t3[3] + d * t3[5]);*/
|
||||||
v2 = _mm_add_ps(_mm_mul_ps(x3, t5),
|
v2 = _mm_xor_ps(glmm_fmadd(x3, t5, glmm_fnmadd(x1, t3, _mm_mul_ps(x0, t1))), x8);
|
||||||
_mm_sub_ps(_mm_mul_ps(x0, t1),
|
|
||||||
_mm_mul_ps(x1, t3)));
|
/*
|
||||||
v2 = _mm_xor_ps(v2, _mm_set_ps(-0.f, 0.f, -0.f, 0.f));
|
dest[1][0] =-(e * t1[0] - g * t1[3] + h * t1[4]);
|
||||||
|
dest[1][1] = a * t1[0] - c * t1[3] + d * t1[4];
|
||||||
|
dest[1][2] =-(a * t2[0] - c * t2[3] + d * t2[4]);
|
||||||
|
dest[1][3] = a * t3[0] - c * t3[3] + d * t3[4]; */
|
||||||
|
v1 = _mm_xor_ps(glmm_fmadd(x3, t4, glmm_fnmadd(x2, t3, _mm_mul_ps(x0, t0))), x9);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
dest[3][0] =-(e * t1[2] - f * t1[4] + g * t1[5]);
|
dest[3][0] =-(e * t1[2] - f * t1[4] + g * t1[5]);
|
||||||
dest[3][1] = a * t1[2] - b * t1[4] + c * t1[5];
|
dest[3][1] = a * t1[2] - b * t1[4] + c * t1[5];
|
||||||
dest[3][2] =-(a * t2[2] - b * t2[4] + c * t2[5]);
|
dest[3][2] =-(a * t2[2] - b * t2[4] + c * t2[5]);
|
||||||
dest[3][3] = a * t3[2] - b * t3[4] + c * t3[5]; */
|
dest[3][3] = a * t3[2] - b * t3[4] + c * t3[5]; */
|
||||||
v3 = _mm_add_ps(_mm_mul_ps(x2, t5),
|
v3 = _mm_xor_ps(glmm_fmadd(x2, t5, glmm_fnmadd(x1, t4, _mm_mul_ps(x0, t2))), x9);
|
||||||
_mm_sub_ps(_mm_mul_ps(x0, t2),
|
|
||||||
_mm_mul_ps(x1, t4)));
|
|
||||||
v3 = _mm_xor_ps(v3, _mm_set_ps(0.f, -0.f, 0.f, -0.f));
|
|
||||||
|
|
||||||
/* determinant */
|
/* determinant */
|
||||||
x0 = _mm_shuffle_ps(v0, v1, _MM_SHUFFLE(0, 0, 0, 0));
|
x0 = _mm_shuffle_ps(v0, v1, _MM_SHUFFLE(0, 0, 0, 0));
|
||||||
x1 = _mm_shuffle_ps(v2, v3, _MM_SHUFFLE(0, 0, 0, 0));
|
x1 = _mm_shuffle_ps(v2, v3, _MM_SHUFFLE(0, 0, 0, 0));
|
||||||
x0 = _mm_shuffle_ps(x0, x1, _MM_SHUFFLE(2, 0, 2, 0));
|
x0 = _mm_shuffle_ps(x0, x1, _MM_SHUFFLE(2, 0, 2, 0));
|
||||||
|
|
||||||
x0 = _mm_mul_ps(x0, r0);
|
x0 = _mm_div_ps(_mm_set1_ps(1.0f), glmm_vhadd(_mm_mul_ps(x0, r0)));
|
||||||
x0 = _mm_add_ps(x0, glmm_shuff1(x0, 0, 1, 2, 3));
|
|
||||||
x0 = _mm_add_ps(x0, glmm_shuff1(x0, 1, 0, 0, 1));
|
|
||||||
x0 = _mm_div_ps(_mm_set1_ps(1.0f), x0);
|
|
||||||
|
|
||||||
glmm_store(dest[0], _mm_mul_ps(v0, x0));
|
glmm_store(dest[0], _mm_mul_ps(v0, x0));
|
||||||
glmm_store(dest[1], _mm_mul_ps(v1, x0));
|
glmm_store(dest[1], _mm_mul_ps(v1, x0));
|
||||||
|
|||||||
289
include/cglm/simd/x86.h
Normal file
289
include/cglm/simd/x86.h
Normal file
@@ -0,0 +1,289 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglm_simd_x86_h
|
||||||
|
#define cglm_simd_x86_h
|
||||||
|
#include "intrin.h"
|
||||||
|
#ifdef CGLM_SIMD_x86
|
||||||
|
|
||||||
|
#ifdef CGLM_ALL_UNALIGNED
|
||||||
|
# define glmm_load(p) _mm_loadu_ps(p)
|
||||||
|
# define glmm_store(p, a) _mm_storeu_ps(p, a)
|
||||||
|
#else
|
||||||
|
# define glmm_load(p) _mm_load_ps(p)
|
||||||
|
# define glmm_store(p, a) _mm_store_ps(p, a)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CGLM_USE_INT_DOMAIN
|
||||||
|
# define glmm_shuff1(xmm, z, y, x, w) \
|
||||||
|
_mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(xmm), \
|
||||||
|
_MM_SHUFFLE(z, y, x, w)))
|
||||||
|
#else
|
||||||
|
# define glmm_shuff1(xmm, z, y, x, w) \
|
||||||
|
_mm_shuffle_ps(xmm, xmm, _MM_SHUFFLE(z, y, x, w))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define glmm_shuff1x(xmm, x) glmm_shuff1(xmm, x, x, x, x)
|
||||||
|
#define glmm_shuff2(a, b, z0, y0, x0, w0, z1, y1, x1, w1) \
|
||||||
|
glmm_shuff1(_mm_shuffle_ps(a, b, _MM_SHUFFLE(z0, y0, x0, w0)), \
|
||||||
|
z1, y1, x1, w1)
|
||||||
|
|
||||||
|
#ifdef __AVX__
|
||||||
|
# ifdef CGLM_ALL_UNALIGNED
|
||||||
|
# define glmm_load256(p) _mm256_loadu_ps(p)
|
||||||
|
# define glmm_store256(p, a) _mm256_storeu_ps(p, a)
|
||||||
|
# else
|
||||||
|
# define glmm_load256(p) _mm256_load_ps(p)
|
||||||
|
# define glmm_store256(p, a) _mm256_store_ps(p, a)
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static inline
|
||||||
|
__m128
|
||||||
|
glmm_abs(__m128 x) {
|
||||||
|
return _mm_andnot_ps(_mm_set1_ps(-0.0f), x);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
__m128
|
||||||
|
glmm_vhadd(__m128 v) {
|
||||||
|
__m128 x0;
|
||||||
|
x0 = _mm_add_ps(v, glmm_shuff1(v, 0, 1, 2, 3));
|
||||||
|
x0 = _mm_add_ps(x0, glmm_shuff1(x0, 1, 0, 0, 1));
|
||||||
|
return x0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
__m128
|
||||||
|
glmm_vhadds(__m128 v) {
|
||||||
|
#if defined(__SSE3__)
|
||||||
|
__m128 shuf, sums;
|
||||||
|
shuf = _mm_movehdup_ps(v);
|
||||||
|
sums = _mm_add_ps(v, shuf);
|
||||||
|
shuf = _mm_movehl_ps(shuf, sums);
|
||||||
|
sums = _mm_add_ss(sums, shuf);
|
||||||
|
return sums;
|
||||||
|
#else
|
||||||
|
__m128 shuf, sums;
|
||||||
|
shuf = glmm_shuff1(v, 2, 3, 0, 1);
|
||||||
|
sums = _mm_add_ps(v, shuf);
|
||||||
|
shuf = _mm_movehl_ps(shuf, sums);
|
||||||
|
sums = _mm_add_ss(sums, shuf);
|
||||||
|
return sums;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
float
|
||||||
|
glmm_hadd(__m128 v) {
|
||||||
|
return _mm_cvtss_f32(glmm_vhadds(v));
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
__m128
|
||||||
|
glmm_vhmin(__m128 v) {
|
||||||
|
__m128 x0, x1, x2;
|
||||||
|
x0 = _mm_movehl_ps(v, v); /* [2, 3, 2, 3] */
|
||||||
|
x1 = _mm_min_ps(x0, v); /* [0|2, 1|3, 2|2, 3|3] */
|
||||||
|
x2 = glmm_shuff1x(x1, 1); /* [1|3, 1|3, 1|3, 1|3] */
|
||||||
|
return _mm_min_ss(x1, x2);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
float
|
||||||
|
glmm_hmin(__m128 v) {
|
||||||
|
return _mm_cvtss_f32(glmm_vhmin(v));
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
__m128
|
||||||
|
glmm_vhmax(__m128 v) {
|
||||||
|
__m128 x0, x1, x2;
|
||||||
|
x0 = _mm_movehl_ps(v, v); /* [2, 3, 2, 3] */
|
||||||
|
x1 = _mm_max_ps(x0, v); /* [0|2, 1|3, 2|2, 3|3] */
|
||||||
|
x2 = glmm_shuff1x(x1, 1); /* [1|3, 1|3, 1|3, 1|3] */
|
||||||
|
return _mm_max_ss(x1, x2);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
float
|
||||||
|
glmm_hmax(__m128 v) {
|
||||||
|
return _mm_cvtss_f32(glmm_vhmax(v));
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
__m128
|
||||||
|
glmm_vdots(__m128 a, __m128 b) {
|
||||||
|
#if (defined(__SSE4_1__) || defined(__SSE4_2__)) && defined(CGLM_SSE4_DOT)
|
||||||
|
return _mm_dp_ps(a, b, 0xFF);
|
||||||
|
#elif defined(__SSE3__) && defined(CGLM_SSE3_DOT)
|
||||||
|
__m128 x0, x1;
|
||||||
|
x0 = _mm_mul_ps(a, b);
|
||||||
|
x1 = _mm_hadd_ps(x0, x0);
|
||||||
|
return _mm_hadd_ps(x1, x1);
|
||||||
|
#else
|
||||||
|
return glmm_vhadds(_mm_mul_ps(a, b));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
__m128
|
||||||
|
glmm_vdot(__m128 a, __m128 b) {
|
||||||
|
#if (defined(__SSE4_1__) || defined(__SSE4_2__)) && defined(CGLM_SSE4_DOT)
|
||||||
|
return _mm_dp_ps(a, b, 0xFF);
|
||||||
|
#elif defined(__SSE3__) && defined(CGLM_SSE3_DOT)
|
||||||
|
__m128 x0, x1;
|
||||||
|
x0 = _mm_mul_ps(a, b);
|
||||||
|
x1 = _mm_hadd_ps(x0, x0);
|
||||||
|
return _mm_hadd_ps(x1, x1);
|
||||||
|
#else
|
||||||
|
__m128 x0;
|
||||||
|
x0 = _mm_mul_ps(a, b);
|
||||||
|
x0 = _mm_add_ps(x0, glmm_shuff1(x0, 1, 0, 3, 2));
|
||||||
|
return _mm_add_ps(x0, glmm_shuff1(x0, 0, 1, 0, 1));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
float
|
||||||
|
glmm_dot(__m128 a, __m128 b) {
|
||||||
|
return _mm_cvtss_f32(glmm_vdots(a, b));
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
float
|
||||||
|
glmm_norm(__m128 a) {
|
||||||
|
return _mm_cvtss_f32(_mm_sqrt_ss(glmm_vhadds(_mm_mul_ps(a, a))));
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
float
|
||||||
|
glmm_norm2(__m128 a) {
|
||||||
|
return _mm_cvtss_f32(glmm_vhadds(_mm_mul_ps(a, a)));
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
float
|
||||||
|
glmm_norm_one(__m128 a) {
|
||||||
|
return _mm_cvtss_f32(glmm_vhadds(glmm_abs(a)));
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
float
|
||||||
|
glmm_norm_inf(__m128 a) {
|
||||||
|
return _mm_cvtss_f32(glmm_vhmax(glmm_abs(a)));
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
__m128
|
||||||
|
glmm_load3(float v[3]) {
|
||||||
|
__m128i xy;
|
||||||
|
__m128 z;
|
||||||
|
|
||||||
|
xy = _mm_loadl_epi64(CGLM_CASTPTR_ASSUME_ALIGNED(v, const __m128i));
|
||||||
|
z = _mm_load_ss(&v[2]);
|
||||||
|
|
||||||
|
return _mm_movelh_ps(_mm_castsi128_ps(xy), z);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
void
|
||||||
|
glmm_store3(float v[3], __m128 vx) {
|
||||||
|
_mm_storel_pi(CGLM_CASTPTR_ASSUME_ALIGNED(v, __m64), vx);
|
||||||
|
_mm_store_ss(&v[2], glmm_shuff1(vx, 2, 2, 2, 2));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* enable FMA macro for MSVC? */
|
||||||
|
#if defined(_MSC_VER) && !defined(__FMA__) && defined(__AVX2__)
|
||||||
|
# define __FMA__ 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static inline
|
||||||
|
__m128
|
||||||
|
glmm_fmadd(__m128 a, __m128 b, __m128 c) {
|
||||||
|
#ifdef __FMA__
|
||||||
|
return _mm_fmadd_ps(a, b, c);
|
||||||
|
#else
|
||||||
|
return _mm_add_ps(c, _mm_mul_ps(a, b));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
__m128
|
||||||
|
glmm_fnmadd(__m128 a, __m128 b, __m128 c) {
|
||||||
|
#ifdef __FMA__
|
||||||
|
return _mm_fnmadd_ps(a, b, c);
|
||||||
|
#else
|
||||||
|
return _mm_sub_ps(c, _mm_mul_ps(a, b));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
__m128
|
||||||
|
glmm_fmsub(__m128 a, __m128 b, __m128 c) {
|
||||||
|
#ifdef __FMA__
|
||||||
|
return _mm_fmsub_ps(a, b, c);
|
||||||
|
#else
|
||||||
|
return _mm_sub_ps(_mm_mul_ps(a, b), c);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
__m128
|
||||||
|
glmm_fnmsub(__m128 a, __m128 b, __m128 c) {
|
||||||
|
#ifdef __FMA__
|
||||||
|
return _mm_fnmsub_ps(a, b, c);
|
||||||
|
#else
|
||||||
|
return _mm_xor_ps(_mm_add_ps(_mm_mul_ps(a, b), c), _mm_set1_ps(-0.0f));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(__AVX__)
|
||||||
|
static inline
|
||||||
|
__m256
|
||||||
|
glmm256_fmadd(__m256 a, __m256 b, __m256 c) {
|
||||||
|
#ifdef __FMA__
|
||||||
|
return _mm256_fmadd_ps(a, b, c);
|
||||||
|
#else
|
||||||
|
return _mm256_add_ps(c, _mm256_mul_ps(a, b));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
__m256
|
||||||
|
glmm256_fnmadd(__m256 a, __m256 b, __m256 c) {
|
||||||
|
#ifdef __FMA__
|
||||||
|
return _mm256_fnmadd_ps(a, b, c);
|
||||||
|
#else
|
||||||
|
return _mm256_sub_ps(c, _mm256_mul_ps(a, b));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
__m256
|
||||||
|
glmm256_fmsub(__m256 a, __m256 b, __m256 c) {
|
||||||
|
#ifdef __FMA__
|
||||||
|
return _mm256_fmsub_ps(a, b, c);
|
||||||
|
#else
|
||||||
|
return _mm256_sub_ps(_mm256_mul_ps(a, b), c);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
__m256
|
||||||
|
glmm256_fnmsub(__m256 a, __m256 b, __m256 c) {
|
||||||
|
#ifdef __FMA__
|
||||||
|
return _mm256_fmsub_ps(a, b, c);
|
||||||
|
#else
|
||||||
|
return _mm256_xor_ps(_mm256_sub_ps(_mm256_mul_ps(a, b), c),
|
||||||
|
_mm256_set1_ps(-0.0f));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif /* cglm_simd_x86_h */
|
||||||
99
include/cglm/sphere.h
Normal file
99
include/cglm/sphere.h
Normal file
@@ -0,0 +1,99 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglm_sphere_h
|
||||||
|
#define cglm_sphere_h
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "mat4.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
Sphere Representation in cglm: [center.x, center.y, center.z, radii]
|
||||||
|
|
||||||
|
You could use this representation or you can convert it to vec4 before call
|
||||||
|
any function
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief helper for getting sphere radius
|
||||||
|
*
|
||||||
|
* @param[in] s sphere
|
||||||
|
*
|
||||||
|
* @return returns radii
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_sphere_radii(vec4 s) {
|
||||||
|
return s[3];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief apply transform to sphere, it is just wrapper for glm_mat4_mulv3
|
||||||
|
*
|
||||||
|
* @param[in] s sphere
|
||||||
|
* @param[in] m transform matrix
|
||||||
|
* @param[out] dest transformed sphere
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_sphere_transform(vec4 s, mat4 m, vec4 dest) {
|
||||||
|
glm_mat4_mulv3(m, s, 1.0f, dest);
|
||||||
|
dest[3] = s[3];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief merges two spheres and creates a new one
|
||||||
|
*
|
||||||
|
* two sphere must be in same space, for instance if one in world space then
|
||||||
|
* the other must be in world space too, not in local space.
|
||||||
|
*
|
||||||
|
* @param[in] s1 sphere 1
|
||||||
|
* @param[in] s2 sphere 2
|
||||||
|
* @param[out] dest merged/extended sphere
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_sphere_merge(vec4 s1, vec4 s2, vec4 dest) {
|
||||||
|
float dist, radii;
|
||||||
|
|
||||||
|
dist = glm_vec3_distance(s1, s2);
|
||||||
|
radii = dist + s1[3] + s2[3];
|
||||||
|
|
||||||
|
radii = glm_max(radii, s1[3]);
|
||||||
|
radii = glm_max(radii, s2[3]);
|
||||||
|
|
||||||
|
glm_vec3_center(s1, s2, dest);
|
||||||
|
dest[3] = radii;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief check if two sphere intersects
|
||||||
|
*
|
||||||
|
* @param[in] s1 sphere
|
||||||
|
* @param[in] s2 other sphere
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
bool
|
||||||
|
glm_sphere_sphere(vec4 s1, vec4 s2) {
|
||||||
|
return glm_vec3_distance2(s1, s2) <= glm_pow2(s1[3] + s2[3]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief check if sphere intersects with point
|
||||||
|
*
|
||||||
|
* @param[in] s sphere
|
||||||
|
* @param[in] point point
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
bool
|
||||||
|
glm_sphere_point(vec4 s, vec3 point) {
|
||||||
|
float rr;
|
||||||
|
rr = s[3] * s[3];
|
||||||
|
return glm_vec3_distance2(point, s) <= rr;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* cglm_sphere_h */
|
||||||
39
include/cglm/struct.h
Normal file
39
include/cglm/struct.h
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglm_structs_h
|
||||||
|
#define cglm_structs_h
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "cglm.h"
|
||||||
|
#include "types-struct.h"
|
||||||
|
#include "struct/vec2.h"
|
||||||
|
#include "struct/vec3.h"
|
||||||
|
#include "struct/vec4.h"
|
||||||
|
#include "struct/mat2.h"
|
||||||
|
#include "struct/mat3.h"
|
||||||
|
#include "struct/mat4.h"
|
||||||
|
#include "struct/affine.h"
|
||||||
|
#include "struct/frustum.h"
|
||||||
|
#include "struct/plane.h"
|
||||||
|
#include "struct/box.h"
|
||||||
|
#include "struct/color.h"
|
||||||
|
#include "struct/io.h"
|
||||||
|
#include "struct/cam.h"
|
||||||
|
#include "struct/quat.h"
|
||||||
|
#include "struct/euler.h"
|
||||||
|
#include "struct/project.h"
|
||||||
|
#include "struct/sphere.h"
|
||||||
|
#include "struct/curve.h"
|
||||||
|
#include "struct/affine2d.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* cglm_structs_h */
|
||||||
333
include/cglm/struct/affine.h
Normal file
333
include/cglm/struct/affine.h
Normal file
@@ -0,0 +1,333 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Functions:
|
||||||
|
CGLM_INLINE mat4s glms_translate(mat4s m, vec3s v);
|
||||||
|
CGLM_INLINE mat4s glms_translate_x(mat4s m, float x);
|
||||||
|
CGLM_INLINE mat4s glms_translate_y(mat4s m, float y);
|
||||||
|
CGLM_INLINE mat4s glms_translate_z(mat4s m, float z);
|
||||||
|
CGLM_INLINE mat4s glms_translate_make(vec3s v);
|
||||||
|
CGLM_INLINE mat4s glms_scale_to(mat4s m, vec3s v);
|
||||||
|
CGLM_INLINE mat4s glms_scale_make(vec3s v);
|
||||||
|
CGLM_INLINE mat4s glms_scale(mat4s m, vec3s v);
|
||||||
|
CGLM_INLINE mat4s glms_scale_uni(mat4s m, float s);
|
||||||
|
CGLM_INLINE mat4s glms_rotate_x(mat4s m, float angle);
|
||||||
|
CGLM_INLINE mat4s glms_rotate_y(mat4s m, float angle);
|
||||||
|
CGLM_INLINE mat4s glms_rotate_z(mat4s m, float angle);
|
||||||
|
CGLM_INLINE mat4s glms_rotate_make(float angle, vec3s axis);
|
||||||
|
CGLM_INLINE mat4s glms_rotate(mat4s m, float angle, vec3s axis);
|
||||||
|
CGLM_INLINE mat4s glms_rotate_at(mat4s m, vec3s pivot, float angle, vec3s axis);
|
||||||
|
CGLM_INLINE mat4s glms_rotate_atm(mat4s m, vec3s pivot, float angle, vec3s axis);
|
||||||
|
CGLM_INLINE vec3s glms_decompose_scalev(mat4s m);
|
||||||
|
CGLM_INLINE bool glms_uniscaled(mat4s m);
|
||||||
|
CGLM_INLINE void glms_decompose_rs(mat4s m, mat4s * r, vec3s * s);
|
||||||
|
CGLM_INLINE void glms_decompose(mat4s m, vec4s t, mat4s * r, vec3s * s);
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglms_affines_h
|
||||||
|
#define cglms_affines_h
|
||||||
|
|
||||||
|
#include "../common.h"
|
||||||
|
#include "../types-struct.h"
|
||||||
|
#include "../affine.h"
|
||||||
|
#include "vec3.h"
|
||||||
|
#include "vec4.h"
|
||||||
|
#include "mat4.h"
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief translate existing transform matrix by v vector
|
||||||
|
* and stores result in same matrix
|
||||||
|
*
|
||||||
|
* @param[in] m affine transfrom
|
||||||
|
* @param[in] v translate vector [x, y, z]
|
||||||
|
* @returns affine transfrom
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
mat4s
|
||||||
|
glms_translate(mat4s m, vec3s v) {
|
||||||
|
glm_translate(m.raw, v.raw);
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief translate existing transform matrix by x factor
|
||||||
|
*
|
||||||
|
* @param[in] m affine transfrom
|
||||||
|
* @param[in] x x factor
|
||||||
|
* @returns affine transfrom
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
mat4s
|
||||||
|
glms_translate_x(mat4s m, float x) {
|
||||||
|
glm_translate_x(m.raw, x);
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief translate existing transform matrix by y factor
|
||||||
|
*
|
||||||
|
* @param[in] m affine transfrom
|
||||||
|
* @param[in] y y factor
|
||||||
|
* @returns affine transfrom
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
mat4s
|
||||||
|
glms_translate_y(mat4s m, float y) {
|
||||||
|
glm_translate_y(m.raw, y);
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief translate existing transform matrix by z factor
|
||||||
|
*
|
||||||
|
* @param[in] m affine transfrom
|
||||||
|
* @param[in] z z factor
|
||||||
|
* @returns affine transfrom
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
mat4s
|
||||||
|
glms_translate_z(mat4s m, float z) {
|
||||||
|
glm_translate_z(m.raw, z);
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief creates NEW translate transform matrix by v vector
|
||||||
|
*
|
||||||
|
* @param[in] v translate vector [x, y, z]
|
||||||
|
* @returns affine transfrom
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
mat4s
|
||||||
|
glms_translate_make(vec3s v) {
|
||||||
|
mat4s m;
|
||||||
|
glm_translate_make(m.raw, v.raw);
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief creates NEW scale matrix by v vector
|
||||||
|
*
|
||||||
|
* @param[in] v scale vector [x, y, z]
|
||||||
|
* @returns affine transfrom
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
mat4s
|
||||||
|
glms_scale_make(vec3s v) {
|
||||||
|
mat4s m;
|
||||||
|
glm_scale_make(m.raw, v.raw);
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief scales existing transform matrix by v vector
|
||||||
|
* and stores result in same matrix
|
||||||
|
*
|
||||||
|
* @param[in] m affine transfrom
|
||||||
|
* @param[in] v scale vector [x, y, z]
|
||||||
|
* @returns affine transfrom
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
mat4s
|
||||||
|
glms_scale(mat4s m, vec3s v) {
|
||||||
|
mat4s r;
|
||||||
|
glm_scale_to(m.raw, v.raw, r.raw);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief applies uniform scale to existing transform matrix v = [s, s, s]
|
||||||
|
* and stores result in same matrix
|
||||||
|
*
|
||||||
|
* @param[in] m affine transfrom
|
||||||
|
* @param[in] s scale factor
|
||||||
|
* @returns affine transfrom
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
mat4s
|
||||||
|
glms_scale_uni(mat4s m, float s) {
|
||||||
|
glm_scale_uni(m.raw, s);
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief rotate existing transform matrix around X axis by angle
|
||||||
|
* and store result in dest
|
||||||
|
*
|
||||||
|
* @param[in] m affine transfrom
|
||||||
|
* @param[in] angle angle (radians)
|
||||||
|
* @returns rotated matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
mat4s
|
||||||
|
glms_rotate_x(mat4s m, float angle) {
|
||||||
|
mat4s r;
|
||||||
|
glm_rotate_x(m.raw, angle, r.raw);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief rotate existing transform matrix around Y axis by angle
|
||||||
|
* and store result in dest
|
||||||
|
*
|
||||||
|
* @param[in] m affine transfrom
|
||||||
|
* @param[in] angle angle (radians)
|
||||||
|
* @returns rotated matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
mat4s
|
||||||
|
glms_rotate_y(mat4s m, float angle) {
|
||||||
|
mat4s r;
|
||||||
|
glm_rotate_y(m.raw, angle, r.raw);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief rotate existing transform matrix around Z axis by angle
|
||||||
|
* and store result in dest
|
||||||
|
*
|
||||||
|
* @param[in] m affine transfrom
|
||||||
|
* @param[in] angle angle (radians)
|
||||||
|
* @returns rotated matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
mat4s
|
||||||
|
glms_rotate_z(mat4s m, float angle) {
|
||||||
|
mat4s r;
|
||||||
|
glm_rotate_z(m.raw, angle, r.raw);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief creates NEW rotation matrix by angle and axis
|
||||||
|
*
|
||||||
|
* axis will be normalized so you don't need to normalize it
|
||||||
|
*
|
||||||
|
* @param[in] angle angle (radians)
|
||||||
|
* @param[in] axis axis
|
||||||
|
* @returns affine transfrom
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
mat4s
|
||||||
|
glms_rotate_make(float angle, vec3s axis) {
|
||||||
|
mat4s m;
|
||||||
|
glm_rotate_make(m.raw, angle, axis.raw);
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief rotate existing transform matrix around given axis by angle
|
||||||
|
*
|
||||||
|
* @param[in] m affine transfrom
|
||||||
|
* @param[in] angle angle (radians)
|
||||||
|
* @param[in] axis axis
|
||||||
|
* @returns affine transfrom
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
mat4s
|
||||||
|
glms_rotate(mat4s m, float angle, vec3s axis) {
|
||||||
|
glm_rotate(m.raw, angle, axis.raw);
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief rotate existing transform
|
||||||
|
* around given axis by angle at given pivot point (rotation center)
|
||||||
|
*
|
||||||
|
* @param[in] m affine transfrom
|
||||||
|
* @param[in] pivot rotation center
|
||||||
|
* @param[in] angle angle (radians)
|
||||||
|
* @param[in] axis axis
|
||||||
|
* @returns affine transfrom
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
mat4s
|
||||||
|
glms_rotate_at(mat4s m, vec3s pivot, float angle, vec3s axis) {
|
||||||
|
glm_rotate_at(m.raw, pivot.raw, angle, axis.raw);
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief 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.
|
||||||
|
*
|
||||||
|
* @param[in] m affine transfrom
|
||||||
|
* @param[in] pivot rotation center
|
||||||
|
* @param[in] angle angle (radians)
|
||||||
|
* @param[in] axis axis
|
||||||
|
* @returns affine transfrom
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
mat4s
|
||||||
|
glms_rotate_atm(mat4s m, vec3s pivot, float angle, vec3s axis) {
|
||||||
|
glm_rotate_atm(m.raw, pivot.raw, angle, axis.raw);
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief decompose scale vector
|
||||||
|
*
|
||||||
|
* @param[in] m affine transform
|
||||||
|
* @returns scale vector (Sx, Sy, Sz)
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
vec3s
|
||||||
|
glms_decompose_scalev(mat4s m) {
|
||||||
|
vec3s r;
|
||||||
|
glm_decompose_scalev(m.raw, r.raw);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief returns true if matrix is uniform scaled. This is helpful for
|
||||||
|
* creating normal matrix.
|
||||||
|
*
|
||||||
|
* @param[in] m m
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
bool
|
||||||
|
glms_uniscaled(mat4s m) {
|
||||||
|
return glm_uniscaled(m.raw);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief decompose rotation matrix (mat4) and scale vector [Sx, Sy, Sz]
|
||||||
|
* DON'T pass projected matrix here
|
||||||
|
*
|
||||||
|
* @param[in] m affine transform
|
||||||
|
* @param[out] r rotation matrix
|
||||||
|
* @param[out] s scale matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glms_decompose_rs(mat4s m, mat4s * __restrict r, vec3s * __restrict s) {
|
||||||
|
glm_decompose_rs(m.raw, r->raw, s->raw);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief decompose affine transform, TODO: extract shear factors.
|
||||||
|
* DON'T pass projected matrix here
|
||||||
|
*
|
||||||
|
* @param[in] m affine transfrom
|
||||||
|
* @param[out] t translation vector
|
||||||
|
* @param[out] r rotation matrix (mat4)
|
||||||
|
* @param[out] s scaling vector [X, Y, Z]
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glms_decompose(mat4s m, vec4s * __restrict t, mat4s * __restrict r, vec3s * __restrict s) {
|
||||||
|
glm_decompose(m.raw, t->raw, r->raw, s->raw);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* cglms_affines_h */
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user