mirror of
https://github.com/recp/cglm.git
synced 2026-02-17 03:39:05 +00:00
Compare commits
1622 Commits
v0.2.0
...
83d5b2c973
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
83d5b2c973 | ||
|
|
7e1bdd0676 | ||
|
|
0dc17e5d47 | ||
|
|
d6c6b4c542 | ||
|
|
0356534c0c | ||
|
|
5ff0d80c85 | ||
|
|
1952042f2c | ||
|
|
3aad5823ca | ||
|
|
da957fa421 | ||
|
|
47e5d48749 | ||
|
|
a4602f2d5f | ||
|
|
6af4e0d565 | ||
|
|
a311dbfe4c | ||
|
|
a761088e15 | ||
|
|
a886d6e170 | ||
|
|
1a8b105ce6 | ||
|
|
ec5f8074c4 | ||
|
|
6f5fde8b52 | ||
|
|
9da4e78c2e | ||
|
|
27a3ddc928 | ||
|
|
5d530cd8e0 | ||
|
|
dde053a295 | ||
|
|
2128235d42 | ||
|
|
9fb418bcac | ||
|
|
5fde20d65c | ||
|
|
ebc65782f8 | ||
|
|
1bd04c819b | ||
|
|
8560da0e70 | ||
|
|
ed7a658637 | ||
|
|
bcc475e2b7 | ||
|
|
bdca98ba48 | ||
|
|
b33e29d50f | ||
|
|
4b3e9bb779 | ||
|
|
214842db27 | ||
|
|
60e4d6c188 | ||
|
|
5063d4b2b0 | ||
|
|
a16bc2ae4a | ||
|
|
b694c97204 | ||
|
|
4791fe3f24 | ||
|
|
b64067a94d | ||
|
|
43363e8c43 | ||
|
|
f3094cdc65 | ||
|
|
a7bd64952e | ||
|
|
4141298161 | ||
|
|
05979281ac | ||
|
|
4b3dcceb9d | ||
|
|
cfb8cd9447 | ||
|
|
8d01d1d135 | ||
|
|
c6caddc75e | ||
|
|
8b810c2280 | ||
|
|
fd3b21f5d7 | ||
|
|
c1ea9e7a69 | ||
|
|
44b5952ec3 | ||
|
|
6e2976d415 | ||
|
|
9a7f52202d | ||
|
|
e96b6a382d | ||
|
|
091c475422 | ||
|
|
144d1e7c29 | ||
|
|
643700c05e | ||
|
|
fb4eac2ee0 | ||
|
|
4d0a0a7025 | ||
|
|
a88d32c776 | ||
|
|
3bfd31af99 | ||
|
|
3ee809b9b3 | ||
|
|
8cdf496baf | ||
|
|
d42bff7773 | ||
|
|
365d43bef4 | ||
|
|
5770fdb336 | ||
|
|
042d84f058 | ||
|
|
70a1a946ee | ||
|
|
8ca1f19aa2 | ||
|
|
adb3ac18c0 | ||
|
|
441f2657ab | ||
|
|
9b660e8bd0 | ||
|
|
40a2aca7ec | ||
|
|
a48fa8be65 | ||
|
|
2f36faa70a | ||
|
|
36f59b7b6c | ||
|
|
f4993318d2 | ||
|
|
5672370e31 | ||
|
|
ae1b9a3982 | ||
|
|
a18d9c28e7 | ||
|
|
fc91f95bb2 | ||
|
|
39052494a2 | ||
|
|
488f782704 | ||
|
|
814c354337 | ||
|
|
1ad56f0e94 | ||
|
|
cc54ad3f92 | ||
|
|
3971ef8ef1 | ||
|
|
b4a3ed32d9 | ||
|
|
eb37a28ff5 | ||
|
|
925f9c1d1a | ||
|
|
9f74fd9597 | ||
|
|
99937807cf | ||
|
|
cc79b440e7 | ||
|
|
e161c4d0a7 | ||
|
|
e8c791e91e | ||
|
|
241b751d8c | ||
|
|
dfc9969f85 | ||
|
|
2b4aef2a29 | ||
|
|
fd0131734f | ||
|
|
9cfa40f423 | ||
|
|
b79347eb13 | ||
|
|
450d747867 | ||
|
|
26e174db46 | ||
|
|
e605c1d585 | ||
|
|
f815918a74 | ||
|
|
948642ff33 | ||
|
|
23c0f5f660 | ||
|
|
d3ad1645fc | ||
|
|
fa7bc07ae9 | ||
|
|
f32f18a373 | ||
|
|
082f1878dd | ||
|
|
4b0e7dadd6 | ||
|
|
b45bf1d571 | ||
|
|
8493a6c0d3 | ||
|
|
f50736aee7 | ||
|
|
6bc980f3d9 | ||
|
|
5cffcf74c4 | ||
|
|
fb469c779d | ||
|
|
8e69157052 | ||
|
|
6c0e3e9460 | ||
|
|
4ca0c536af | ||
|
|
9a1206f3f1 | ||
|
|
c2ebef3867 | ||
|
|
0e0eff71ce | ||
|
|
6620adcc16 | ||
|
|
a986a4d741 | ||
|
|
32e7d5cceb | ||
|
|
e14c730d5c | ||
|
|
fbf0014c82 | ||
|
|
0483362f5c | ||
|
|
35af0c04fe | ||
|
|
66d51e5771 | ||
|
|
5a3a16d9ad | ||
|
|
651ad8ca32 | ||
|
|
b1192c8638 | ||
|
|
eaf2d7314e | ||
|
|
200b0875ba | ||
|
|
9a25fab6f0 | ||
|
|
bfaf413a5d | ||
|
|
9594d0cc86 | ||
|
|
2890472a0b | ||
|
|
c48befca37 | ||
|
|
3c9eecd0be | ||
|
|
a9fee1b4d7 | ||
|
|
52753672bb | ||
|
|
68215526cf | ||
|
|
c27ef7e93b | ||
|
|
2ba561cc92 | ||
|
|
e66f2f3df4 | ||
|
|
967c9e0a09 | ||
|
|
1637d2cef1 | ||
|
|
2acdd1e4d0 | ||
|
|
606ecbceaa | ||
|
|
f1a72241b1 | ||
|
|
9085ed020a | ||
|
|
1377a94a17 | ||
|
|
a98c270eee | ||
|
|
83b67baa23 | ||
|
|
ae82a493f7 | ||
|
|
98ab6fcbe0 | ||
|
|
f0529646b2 | ||
|
|
585a999d79 | ||
|
|
5f241a2daf | ||
|
|
fbdc46b205 | ||
|
|
ae1bee7481 | ||
|
|
a0d8803f76 | ||
|
|
43c9f84c8c | ||
|
|
71a0dc6c35 | ||
|
|
5d34a04496 | ||
|
|
b54dff0124 | ||
|
|
fda5406ac0 | ||
|
|
f19dc13e39 | ||
|
|
f3f75a2727 | ||
|
|
c3e16a53f4 | ||
|
|
8a2fd9cda9 | ||
|
|
98f53c750d | ||
|
|
3e52d90ecb | ||
|
|
a4cd7e008d | ||
|
|
5861c37a93 | ||
|
|
aae82c1d4a | ||
|
|
7e51ed88e8 | ||
|
|
32a05a579b | ||
|
|
9b67866154 | ||
|
|
bab7d7bb12 | ||
|
|
5a207d84bb | ||
|
|
7783acae10 | ||
|
|
9d079d3cc3 | ||
|
|
054b2df004 | ||
|
|
93a2926a13 | ||
|
|
5484259328 | ||
|
|
e930737807 | ||
|
|
c12f318fab | ||
|
|
b0f35203f9 | ||
|
|
ad009d4e49 | ||
|
|
2f619cdd6f | ||
|
|
33e78ca2ad | ||
|
|
f82d570dec | ||
|
|
48839a38a1 | ||
|
|
d491108386 | ||
|
|
068f6951b3 | ||
|
|
ed731f991d | ||
|
|
07dc9520a4 | ||
|
|
be0defb7ac | ||
|
|
5b2c37f73b | ||
|
|
a93a9ef9a2 | ||
|
|
c5b2afc1c4 | ||
|
|
cd5ed1f4c4 | ||
|
|
eb3a51e591 | ||
|
|
44cd0ae4fd | ||
|
|
d75467f93f | ||
|
|
45c1beff51 | ||
|
|
14c567d9d9 | ||
|
|
480e1de048 | ||
|
|
de66f0a67f | ||
|
|
68bdec4510 | ||
|
|
62c0448e25 | ||
|
|
4f00ce0e52 | ||
|
|
a7845ffc44 | ||
|
|
bd941ed7fb | ||
|
|
87350f809b | ||
|
|
f50a7a7d00 | ||
|
|
b3308af146 | ||
|
|
a94f839d6d | ||
|
|
0ff0e8948f | ||
|
|
5b772d0eb4 | ||
|
|
c528ca1095 | ||
|
|
f0e09776d7 | ||
|
|
da4224ba32 | ||
|
|
1796cc5ce2 | ||
|
|
568634a79e | ||
|
|
c9c7941a72 | ||
|
|
4e929a81c2 | ||
|
|
1d09c41e18 | ||
|
|
d8e933b5b1 | ||
|
|
8b15fd51ba | ||
|
|
9ce0a3b625 | ||
|
|
00d2e8a4cf | ||
|
|
35a12ed033 | ||
|
|
9ad7dd3fbc | ||
|
|
28142b5912 | ||
|
|
f07d75c680 | ||
|
|
17d8b83a38 | ||
|
|
32a477ef07 | ||
|
|
e3ed9834a1 | ||
|
|
8396bbf0b3 | ||
|
|
013ac5dd07 | ||
|
|
a0e3d3766f | ||
|
|
fc7f0e13fd | ||
|
|
1340b5d512 | ||
|
|
85165dd3e3 | ||
|
|
3445f93fbc | ||
|
|
d2642eb206 | ||
|
|
929963c6eb | ||
|
|
25b33fab6b | ||
|
|
c9adbaabd7 | ||
|
|
b22e8230d0 | ||
|
|
bf4c5b4e26 | ||
|
|
54dfbc5a28 | ||
|
|
088c66029d | ||
|
|
2283c708c6 | ||
|
|
46864ba2f7 | ||
|
|
c5dcb93c92 | ||
|
|
050bc95264 | ||
|
|
f388df7f3e | ||
|
|
4c872238d9 | ||
|
|
8366e51b47 | ||
|
|
30b4ea80a9 | ||
|
|
edfb5e3984 | ||
|
|
4d43241a69 | ||
|
|
1337e9cdfb | ||
|
|
9df36ce005 | ||
|
|
55521ecd61 | ||
|
|
829b7dddce | ||
|
|
2fced7181a | ||
|
|
1de373a9bd | ||
|
|
6a7d03bafb | ||
|
|
aad5223da0 | ||
|
|
707bff021c | ||
|
|
e4c38ccc4c | ||
|
|
ceaa54aef8 | ||
|
|
da57558078 | ||
|
|
6ad0aca7e0 | ||
|
|
96e415daa4 | ||
|
|
3701305c9e | ||
|
|
2b78f9ab47 | ||
|
|
41d1a8b9eb | ||
|
|
8ea2fd1cd1 | ||
|
|
8c81443f24 | ||
|
|
608e7d9c2c | ||
|
|
73a4fc76d7 | ||
|
|
aa45d081fc | ||
|
|
f1d4aea69b | ||
|
|
0ef8ebe84e | ||
|
|
8b6eca29cf | ||
|
|
0fbad944c5 | ||
|
|
182c28faf8 | ||
|
|
995fb2e347 | ||
|
|
838c5078b7 | ||
|
|
772238f53f | ||
|
|
b9e62b6fe5 | ||
|
|
c9e2b81e99 | ||
|
|
ee18e58815 | ||
|
|
85ee366861 | ||
|
|
0e4201b816 | ||
|
|
b7e4c96738 | ||
|
|
0d92bfc722 | ||
|
|
237432969d | ||
|
|
131ac68ad3 | ||
|
|
7e6a463256 | ||
|
|
e312f282b4 | ||
|
|
78fb330850 | ||
|
|
4896b2ea8d | ||
|
|
366e0d44e2 | ||
|
|
47a27f9d07 | ||
|
|
7957179808 | ||
|
|
3e79c4d799 | ||
|
|
af5048595f | ||
|
|
270d2b9d05 | ||
|
|
eb9a200b6c | ||
|
|
fd661d1b43 | ||
|
|
db6f9641ab | ||
|
|
125002cfb3 | ||
|
|
bb9a35caaf | ||
|
|
b89315f2c5 | ||
|
|
e80d163d71 | ||
|
|
74c5e86d0c | ||
|
|
45134b1265 | ||
|
|
b63b2b90b3 | ||
|
|
e4419c4f18 | ||
|
|
17f3ea5fab | ||
|
|
a8685ed6ab | ||
|
|
029bead207 | ||
|
|
30845124b4 | ||
|
|
80d5064476 | ||
|
|
2bd97f6599 | ||
|
|
6d8dd42ac2 | ||
|
|
dab86796a4 | ||
|
|
4b93cb3e05 | ||
|
|
a682b9e6cf | ||
|
|
bca93a379d | ||
|
|
34f0d59f5a | ||
|
|
c878161518 | ||
|
|
3b1d4fc546 | ||
|
|
5be1c2f059 | ||
|
|
67ce1519c5 | ||
|
|
86743c98e5 | ||
|
|
015e859075 | ||
|
|
3a2a26e5a4 | ||
|
|
1ccd9af866 | ||
|
|
aa20b8ae7f | ||
|
|
fa6244c42b | ||
|
|
c998d0186a | ||
|
|
a94861dd5d | ||
|
|
040926999a | ||
|
|
40cfbe9717 | ||
|
|
d820410435 | ||
|
|
39c0c1e784 | ||
|
|
4c9b32324d | ||
|
|
921ab6640b | ||
|
|
7701a1a789 | ||
|
|
46aaf250fa | ||
|
|
42b5e834d1 | ||
|
|
732a403112 | ||
|
|
559a6588c8 | ||
|
|
8277473202 | ||
|
|
97575bdcd6 | ||
|
|
bc2a918ad0 | ||
|
|
8ebcc3aceb | ||
|
|
d341478342 | ||
|
|
7e4383cb3d | ||
|
|
b45657f673 | ||
|
|
e24675c6e0 | ||
|
|
2e6e4a9a44 | ||
|
|
4f88a027bc | ||
|
|
673263265b | ||
|
|
dd9235dfee | ||
|
|
4c4a69ddfe | ||
|
|
d6139559b6 | ||
|
|
2eb9a67a3a | ||
|
|
8a1d1cf35d | ||
|
|
fee2b7d344 | ||
|
|
865faad116 | ||
|
|
7ccf199066 | ||
|
|
047138321c | ||
|
|
75b99ef87d | ||
|
|
036fd4848b | ||
|
|
666d692dfb | ||
|
|
ec3796973e | ||
|
|
45f2fff22f | ||
|
|
4ee6aea037 | ||
|
|
2f7dbad6a8 | ||
|
|
5ae0cd4618 | ||
|
|
23d03ffe6c | ||
|
|
c5694c5c17 | ||
|
|
d67ac97323 | ||
|
|
05ea35ffec | ||
|
|
05d45872a3 | ||
|
|
c431bbf190 | ||
|
|
340292c0fb | ||
|
|
2106f9ebcb | ||
|
|
c1d78d835b | ||
|
|
de80b8325f | ||
|
|
7061df0066 | ||
|
|
eb73e4123b | ||
|
|
22140d8e1b | ||
|
|
39602ef4d7 | ||
|
|
abb71a8e32 | ||
|
|
f8b6573de8 | ||
|
|
15f29e05eb | ||
|
|
7696374f1e | ||
|
|
44d103fa00 | ||
|
|
c29f077bed | ||
|
|
2a975a7d0a | ||
|
|
049db64a0f | ||
|
|
e71694bb57 | ||
|
|
8754158fbe | ||
|
|
e1a0892097 | ||
|
|
9b26aff466 | ||
|
|
24e417107b | ||
|
|
009405adcd | ||
|
|
0b2006dd47 | ||
|
|
1fdc1c8675 | ||
|
|
6e1d6d505b | ||
|
|
45cf4710c4 | ||
|
|
056b28e4da | ||
|
|
c6e58bd44a | ||
|
|
a81c0f076a | ||
|
|
ab684b7c66 | ||
|
|
53bde05bd9 | ||
|
|
58a4b47830 | ||
|
|
1bfa53f44c | ||
|
|
d93b46bab7 | ||
|
|
9efc255451 | ||
|
|
9484155c98 | ||
|
|
509078817c | ||
|
|
126f809dae | ||
|
|
e0e7e380e5 | ||
|
|
d3169b12a7 | ||
|
|
9d0c9fdb87 | ||
|
|
f496146bce | ||
|
|
54632ecce5 | ||
|
|
61478d2563 | ||
|
|
cdd4d0e83e | ||
|
|
54dfc4b4f0 | ||
|
|
f6cb3ba31a | ||
|
|
da51741c50 | ||
|
|
a5d8e61c2b | ||
|
|
f0f7b67ef4 | ||
|
|
eece0b7bc9 | ||
|
|
37d20f7da8 | ||
|
|
006e4ffbdf | ||
|
|
aa37c1aa74 | ||
|
|
0fb9e73ec1 | ||
|
|
129287b809 | ||
|
|
2724620d83 | ||
|
|
4d5653b1f6 | ||
|
|
dbb85f24c8 | ||
|
|
6e9e91be05 | ||
|
|
1e077fd125 | ||
|
|
cb4a1b2677 | ||
|
|
924db3307e | ||
|
|
e9df003e56 | ||
|
|
3d292c3a2e | ||
|
|
4bb7e778c4 | ||
|
|
2df26c0ecf | ||
|
|
5193b50133 | ||
|
|
ef8954ccbc | ||
|
|
91b40eb7eb | ||
|
|
82892085b3 | ||
|
|
e09cf11f1c | ||
|
|
8966f296ac | ||
|
|
4e44e74d48 | ||
|
|
f817c4cbb0 | ||
|
|
dd6a0b3175 | ||
|
|
1401af4c34 | ||
|
|
fe7471e8f8 | ||
|
|
1ca261b118 | ||
|
|
6317ed90e7 | ||
|
|
3b683cf28c | ||
|
|
d6267e623b | ||
|
|
93cdc897a5 | ||
|
|
0962f7d2e7 | ||
|
|
487b18e326 | ||
|
|
8e2074c274 | ||
|
|
0ab1f21816 | ||
|
|
b8d565c6b6 | ||
|
|
c5c997ca13 | ||
|
|
924d92ae3f | ||
|
|
d673f3d765 | ||
|
|
5833d1bf44 | ||
|
|
aeeeac4c5a | ||
|
|
b3de85a14e | ||
|
|
5e798a94e3 | ||
|
|
49dd24eaf2 | ||
|
|
bfe5ea6ab7 | ||
|
|
6d39ef0026 | ||
|
|
87ae96b847 | ||
|
|
9cf4190c9b | ||
|
|
2bbaeb8db9 | ||
|
|
a7cda7f969 | ||
|
|
c4d4c48518 | ||
|
|
702bed8173 | ||
|
|
e9aa249a73 | ||
|
|
adec2ee8e6 | ||
|
|
5cd16194c8 | ||
|
|
02b9dc067a | ||
|
|
a447365bc5 | ||
|
|
6183b213e2 | ||
|
|
768d36f4b6 | ||
|
|
2c39193016 | ||
|
|
16fcaf7fc0 | ||
|
|
530ec2d0f8 | ||
|
|
56d9e41465 | ||
|
|
610788bed1 | ||
|
|
2d6538ecec | ||
|
|
0de379c632 | ||
|
|
31cbd41e3b | ||
|
|
c691bc5bc0 | ||
|
|
7346e91574 | ||
|
|
0566a040c0 | ||
|
|
e6681e78c8 | ||
|
|
e17f115f91 | ||
|
|
2631d3b5ea | ||
|
|
9772948831 | ||
|
|
988dd13d61 | ||
|
|
ed09fb5819 | ||
|
|
c4a348ac71 | ||
|
|
7e9d2aa6a4 | ||
|
|
091102e2c1 | ||
|
|
50b1c189b1 | ||
|
|
44268d24f9 | ||
|
|
65fd77d255 | ||
|
|
5883ed3495 | ||
|
|
e2e923554b | ||
|
|
6b2c91ecf7 | ||
|
|
a4b8778be9 | ||
|
|
5ce7dff812 | ||
|
|
13036036c4 | ||
|
|
c1ff76d3b1 | ||
|
|
17b3911e7c | ||
|
|
7307b1cbbe | ||
|
|
391d8670c2 | ||
|
|
8d441902c0 | ||
|
|
490d0bb9a1 | ||
|
|
4c6fb156ef | ||
|
|
81b7c90271 | ||
|
|
c221f8883a | ||
|
|
ea8ef4a3c9 | ||
|
|
765771227a | ||
|
|
1940f1d4bc | ||
|
|
061f096d8f | ||
|
|
884be84506 | ||
|
|
18ed15c53a | ||
|
|
2614a1805d | ||
|
|
d7c0edcbd9 | ||
|
|
0b3049dca0 | ||
|
|
a542d54fca | ||
|
|
1d51459a4f | ||
|
|
6e35d927eb | ||
|
|
07bc4be18b | ||
|
|
3a9e4df393 | ||
|
|
7ca9a64ecf | ||
|
|
51ce4db82e | ||
|
|
73adfe08c0 | ||
|
|
48d6ab79bd | ||
|
|
e40b477929 | ||
|
|
5e05eec6d6 | ||
|
|
3aca10ecda | ||
|
|
5c7cd42407 | ||
|
|
e27f80b0bb | ||
|
|
3845345f4c | ||
|
|
998d9626a2 | ||
|
|
84b482971d | ||
|
|
f24ec41a26 | ||
|
|
e62b782039 | ||
|
|
be76d96e8f | ||
|
|
03c7bee863 | ||
|
|
71c585b159 | ||
|
|
6b7a63953c | ||
|
|
fdef58bd1a | ||
|
|
a0dd85f3d1 | ||
|
|
84c521c203 | ||
|
|
5d60c17435 | ||
|
|
da5f18f10f | ||
|
|
2bc9573e1a | ||
|
|
576d1d141e | ||
|
|
92a8e38162 | ||
|
|
dd3c3ceae0 | ||
|
|
77b4c5cffb | ||
|
|
e276b5b405 | ||
|
|
13ed79a61a | ||
|
|
ba993b3ea9 | ||
|
|
4a6fc485fd | ||
|
|
9ed325018d | ||
|
|
a30baffafa | ||
|
|
8a117017ea | ||
|
|
799749fc6a | ||
|
|
f4c9ddf530 | ||
|
|
bc8dc72739 | ||
|
|
3eafc599ac | ||
|
|
7fba424f64 | ||
|
|
c51040cd41 | ||
|
|
9fc3a20d0f | ||
|
|
7f1c062696 | ||
|
|
e70571e9e0 | ||
|
|
007ee48b58 | ||
|
|
38771599c7 | ||
|
|
bfd87acfc4 | ||
|
|
a38622e1d6 | ||
|
|
9c7012bb39 | ||
|
|
71367b67cf | ||
|
|
3894ea32fb | ||
|
|
a430408ec4 | ||
|
|
3815e18fea | ||
|
|
8b5eaa5301 | ||
|
|
6037618942 | ||
|
|
c6d198d780 | ||
|
|
d001593f9c | ||
|
|
ac9461778c | ||
|
|
0b3d227568 | ||
|
|
78236d24a1 | ||
|
|
b41858f184 | ||
|
|
60bf21ba43 | ||
|
|
2386cdcc19 | ||
|
|
a0f01c5ed1 | ||
|
|
8cfc98d283 | ||
|
|
074189163f | ||
|
|
bfbd9ba1dc | ||
|
|
89cee7912a | ||
|
|
da5c66d735 | ||
|
|
c4b45a0917 | ||
|
|
8034073965 | ||
|
|
53009d69c0 | ||
|
|
7c62ad965b | ||
|
|
878e829767 | ||
|
|
7c7ac8b82e | ||
|
|
ba66459708 | ||
|
|
45e176680f | ||
|
|
c0bd65027a | ||
|
|
03d5699f32 | ||
|
|
199d1fa031 | ||
|
|
c7393f75c3 | ||
|
|
a3186a7f32 | ||
|
|
5a89faafff | ||
|
|
51853db559 | ||
|
|
8f8417a883 | ||
|
|
2238fd127c | ||
|
|
073a11a6b8 | ||
|
|
2d348ceba0 | ||
|
|
ce69ecaa5a | ||
|
|
5ad0f1c6f3 | ||
|
|
aea75bbe7c | ||
|
|
7dfe67cdde | ||
|
|
84f64a5b65 | ||
|
|
7df8ffa7fe | ||
|
|
dc5558d8f4 | ||
|
|
63990be905 | ||
|
|
cd0ae19459 | ||
|
|
838124af49 | ||
|
|
e3981b6d96 | ||
|
|
7bb765367e | ||
|
|
82982abaef | ||
|
|
dbe3b719c7 | ||
|
|
09155986fe | ||
|
|
1b3e2fdaec | ||
|
|
4aef2510e9 | ||
|
|
2432970f90 | ||
|
|
d1bdfde48d | ||
|
|
f27e26f632 | ||
|
|
a3265ebe84 | ||
|
|
57ec29bd31 | ||
|
|
1b217c3dd0 | ||
|
|
94a1e6f6e1 | ||
|
|
a1a2a046a4 | ||
|
|
bffaa13bd5 | ||
|
|
cd4d0a1efe | ||
|
|
8916c50a3d | ||
|
|
7a19b8f8a3 | ||
|
|
f587c00f26 | ||
|
|
65409bcda1 | ||
|
|
d2957e6275 | ||
|
|
04bd1bd633 | ||
|
|
db1a23d13c | ||
|
|
a85744430a | ||
|
|
d582146d9a | ||
|
|
ee09707c1c | ||
|
|
4c85b970a9 | ||
|
|
f7f0f66193 | ||
|
|
495b98a54d | ||
|
|
aee47ce545 | ||
|
|
52debe6a04 | ||
|
|
cf7f4231f0 | ||
|
|
7e5d1f435f | ||
|
|
851a58cedb | ||
|
|
6fa1cefcc2 | ||
|
|
7e211e1f49 | ||
|
|
7d47b7f1fd | ||
|
|
2a4748d452 | ||
|
|
f20bf0aaaf | ||
|
|
3a141b7cc8 | ||
|
|
5cd1a4ab44 | ||
|
|
897f2afd88 | ||
|
|
68e3a072e8 | ||
|
|
282ea84dc0 | ||
|
|
2d5506d15d | ||
|
|
87f561fb06 | ||
|
|
522b18bda9 | ||
|
|
b7178749ee | ||
|
|
98c708281f | ||
|
|
896ba0a0f9 | ||
|
|
4603816330 | ||
|
|
9f5cc3a745 | ||
|
|
bde653b607 | ||
|
|
ede72ca412 | ||
|
|
8e784e762f | ||
|
|
82d1050c63 | ||
|
|
0631598d08 | ||
|
|
34e5704fe8 | ||
|
|
672523e5af | ||
|
|
8427d02a9b | ||
|
|
a2bd00df32 | ||
|
|
4c8f7f310c | ||
|
|
9096fa6bab | ||
|
|
29c3837672 | ||
|
|
4530e0381b | ||
|
|
6cf1fb8992 | ||
|
|
9ed4e41afd | ||
|
|
28d24da6df | ||
|
|
ef22e2063f | ||
|
|
5a48aad1b0 | ||
|
|
07aee82125 | ||
|
|
abbeb274c5 | ||
|
|
814adf11de | ||
|
|
d0d1e46533 | ||
|
|
03b4594d9e | ||
|
|
01e2b74a29 | ||
|
|
ee5050f43c | ||
|
|
b5802b99b2 | ||
|
|
8b958e9600 | ||
|
|
aa071b2a6b | ||
|
|
479e7d4240 | ||
|
|
38c6188e12 | ||
|
|
c330b47ded | ||
|
|
2e8162b133 | ||
|
|
afdcae08dd | ||
|
|
32d1c96dc0 | ||
|
|
4d2ba464a0 | ||
|
|
398e47070b | ||
|
|
619ac4ce9a | ||
|
|
e83940f3b1 | ||
|
|
e5d88f22a0 | ||
|
|
8e10ab2b49 | ||
|
|
4ede0815d4 | ||
|
|
7d16e3583f | ||
|
|
6011baff06 | ||
|
|
af92df4e84 | ||
|
|
94381d3067 | ||
|
|
0e794f8f8f | ||
|
|
b895e424b0 | ||
|
|
a2b8858e36 | ||
|
|
9d08407897 | ||
|
|
8898c3b471 | ||
|
|
f0c2860179 | ||
|
|
f142e8e16e | ||
|
|
5ac916236c | ||
|
|
4327935b9f | ||
|
|
086b40bf6a | ||
|
|
af3b356762 | ||
|
|
9ac291c673 | ||
|
|
7f7e9f69da | ||
|
|
8ddb5d5740 | ||
|
|
56ec058c7d | ||
|
|
a5af9e5eac | ||
|
|
4d20f97275 | ||
|
|
89e8c352ec | ||
|
|
403097d56c | ||
|
|
eddaf464ff | ||
|
|
7065011bf3 | ||
|
|
db46ea110a | ||
|
|
c013bd462c | ||
|
|
b3a18b8a15 | ||
|
|
1bce62c371 | ||
|
|
a242d83805 | ||
|
|
7760c709da | ||
|
|
919e3bcf4a | ||
|
|
607182982d | ||
|
|
ad17f38934 | ||
|
|
8302f78484 | ||
|
|
9665be3138 | ||
|
|
5c22ca3abb | ||
|
|
7f9585ca72 | ||
|
|
d0ab3aaa2e | ||
|
|
83dbdcc4a9 | ||
|
|
8ce45b4303 | ||
|
|
f19ff5d064 | ||
|
|
d6b93f052e | ||
|
|
28705be5a3 | ||
|
|
e1b142bce7 | ||
|
|
0f96eaad20 | ||
|
|
d5d3178ae0 | ||
|
|
13269f4af8 | ||
|
|
faf6186c29 | ||
|
|
2be6ac949b | ||
|
|
5b7bc522ac | ||
|
|
376cf31ee7 | ||
|
|
d28b381dd6 | ||
|
|
3673622cc3 | ||
|
|
a90f706e12 | ||
|
|
c065d71a2f | ||
|
|
1b3b91fe0b | ||
|
|
17560a0687 | ||
|
|
ba634d6c83 | ||
|
|
f35badd436 | ||
|
|
04eaf9c535 | ||
|
|
bd6641bd0a | ||
|
|
4e4bff418d | ||
|
|
55ebbdbe40 | ||
|
|
e4c35e32fc | ||
|
|
ec467fef1f | ||
|
|
1e8865233b | ||
|
|
155eb109a8 | ||
|
|
2903813765 | ||
|
|
0ab50f7208 | ||
|
|
701e015bfd | ||
|
|
1fb941a41b | ||
|
|
92151c6328 | ||
|
|
afac887850 | ||
|
|
a111693b6b | ||
|
|
ce9e5f5575 | ||
|
|
d13842e7de | ||
|
|
059e5010e6 | ||
|
|
65292a94a6 | ||
|
|
f303984aad | ||
|
|
7d5c4da7cf | ||
|
|
63988a515c | ||
|
|
9725b60d46 | ||
|
|
50c93f3d30 | ||
|
|
f14ca0c3f2 | ||
|
|
0c165cba76 | ||
|
|
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 | ||
|
|
077e304fc5 | ||
|
|
599524dacf | ||
|
|
da5ad69863 | ||
|
|
9fc2ead8ef | ||
|
|
48d33c16cb | ||
|
|
464bd917d0 | ||
|
|
c6d07bb6eb | ||
|
|
94b286f1f9 | ||
|
|
f774925e8a | ||
|
|
0e49e95161 | ||
|
|
b277357800 | ||
|
|
835cec2ccb | ||
|
|
5dbbd0826d | ||
|
|
56f0bb0928 | ||
|
|
568001d26a | ||
|
|
252bf925fc | ||
|
|
0f339c5c03 | ||
|
|
a9d56f2dae | ||
|
|
dd60496ffc | ||
|
|
7c0e9e99c6 | ||
|
|
064209c917 | ||
|
|
94d6036c38 | ||
|
|
6c01eff056 | ||
|
|
ada69a7c43 | ||
|
|
cef97fca3e | ||
|
|
498a33fac5 | ||
|
|
3c7a729729 | ||
|
|
a6a37995e9 | ||
|
|
6202179c23 | ||
|
|
22b699174c | ||
|
|
016c0a71a6 | ||
|
|
e28cf1d3f6 | ||
|
|
63966ee5c0 | ||
|
|
a723ecdb7e | ||
|
|
065f93ab3c | ||
|
|
4dbcd28fdb | ||
|
|
be0e3fc9f2 | ||
|
|
d648f5772d | ||
|
|
f163fcd043 | ||
|
|
27ab6a7dd0 | ||
|
|
33e951fe2e | ||
|
|
c63c6c90ac | ||
|
|
a2792178db | ||
|
|
cefd5fb53d | ||
|
|
821c79572f | ||
|
|
f0a27d0ce2 | ||
|
|
007ae62e06 | ||
|
|
826ddf0f5b | ||
|
|
b09b5f260b | ||
|
|
59aacee968 | ||
|
|
429aff087f | ||
|
|
ca9f61dd74 | ||
|
|
d6395d4fb8 | ||
|
|
7f7007574b | ||
|
|
13345f06c1 | ||
|
|
725fac75d0 | ||
|
|
c05f58a169 | ||
|
|
d841f8809d | ||
|
|
af5a2627b4 | ||
|
|
25fc3d0284 | ||
|
|
c489955b00 | ||
|
|
79f8b1ebf8 | ||
|
|
0eb37da8bb | ||
|
|
44728c536b | ||
|
|
c8ed8acbed | ||
|
|
2d77123999 | ||
|
|
462067cfdc | ||
|
|
9ae8da3e0a | ||
|
|
0e63c245d4 | ||
|
|
de55850136 | ||
|
|
51278b26b4 | ||
|
|
fdea13507b | ||
|
|
80d255e6d9 | ||
|
|
d447876c70 | ||
|
|
b1fa7ff597 | ||
|
|
010dcc9837 | ||
|
|
5dec68823c | ||
|
|
4c79fee5d3 | ||
|
|
18ef0d7af1 | ||
|
|
9466182c10 | ||
|
|
f0a51b35ad | ||
|
|
290bcf134c | ||
|
|
416e2f4452 | ||
|
|
1fb82a1922 | ||
|
|
591c881376 | ||
|
|
6f69da361b | ||
|
|
93a08fce17 | ||
|
|
cc1d3b53ea | ||
|
|
b21df8fc37 | ||
|
|
76e9f74020 | ||
|
|
d79e58486d | ||
|
|
3dc93c56e8 | ||
|
|
7615f785ac | ||
|
|
f0daaca58b | ||
|
|
381b2fdcc0 | ||
|
|
e4e0fa623c | ||
|
|
932f638d5a | ||
|
|
81bda7439d | ||
|
|
b27603c268 | ||
|
|
12c5307447 | ||
|
|
257c57d41f | ||
|
|
f5140ea005 | ||
|
|
619ecdc5a4 | ||
|
|
9b8748acc4 | ||
|
|
ae06c51746 | ||
|
|
11430559b4 | ||
|
|
58f0043417 | ||
|
|
cfd3600107 | ||
|
|
967fb1afad | ||
|
|
7411ac36c1 | ||
|
|
238609f2c0 | ||
|
|
ea0a10ade9 | ||
|
|
429fdfd5c5 | ||
|
|
024412f00e | ||
|
|
e8615ea14c | ||
|
|
be81d73895 | ||
|
|
b16f0ded85 | ||
|
|
63acfd681e | ||
|
|
eb527e39b4 | ||
|
|
9f389ab8ec | ||
|
|
3399595dc2 | ||
|
|
2513d46102 | ||
|
|
c298f4a4d7 | ||
|
|
84cdbd5072 | ||
|
|
74f9865884 | ||
|
|
dbd1e334ea | ||
|
|
acda316c12 | ||
|
|
86efe64b8e | ||
|
|
b0991342a6 | ||
|
|
984916d520 | ||
|
|
54c44ff224 | ||
|
|
db4761b437 | ||
|
|
ca504f7058 | ||
|
|
5a7b9caf16 | ||
|
|
43b3df992d | ||
|
|
26110f83d1 | ||
|
|
d1f3feeb6e | ||
|
|
4298211795 | ||
|
|
c244b68e73 | ||
|
|
205d13aa93 | ||
|
|
45f13217c3 | ||
|
|
21ec45b2af | ||
|
|
71b48b530e | ||
|
|
48b7b30e42 | ||
|
|
86055097e1 | ||
|
|
08be94a89b | ||
|
|
91b2a989e2 | ||
|
|
780179ff0d | ||
|
|
c148eacdc2 | ||
|
|
fadde1e26a | ||
|
|
29996d0bdd | ||
|
|
cfab79e546 | ||
|
|
da2f3aaafd | ||
|
|
0e964a1a62 | ||
|
|
1fd0a74478 | ||
|
|
b3a39aa13c | ||
|
|
b737bb2dde | ||
|
|
a610626693 | ||
|
|
425bf87c1f | ||
|
|
23698b7e48 | ||
|
|
be3f117374 | ||
|
|
77e62163ea | ||
|
|
96f773417a | ||
|
|
02ab66a8b3 | ||
|
|
fc424631a4 | ||
|
|
6d5734fe7e | ||
|
|
d95bf60b02 | ||
|
|
891148cbe3 | ||
|
|
4ce2e86d9f | ||
|
|
8a16f358a3 | ||
|
|
43d0837303 | ||
|
|
c1c659489a | ||
|
|
681a74b39c | ||
|
|
5ccf80cd0e | ||
|
|
3882b72f7f | ||
|
|
090f940f50 | ||
|
|
55d1e240a2 | ||
|
|
e4727e6c88 | ||
|
|
9649a0285f | ||
|
|
0f9f4748d7 | ||
|
|
a832d58d9f | ||
|
|
8b2c74b0cc | ||
|
|
da8bbc6536 | ||
|
|
4a7cd2eb26 | ||
|
|
565ee2d6eb | ||
|
|
c58db651a6 | ||
|
|
ee78459340 | ||
|
|
37f6bb8725 | ||
|
|
703c74b6ca | ||
|
|
42d8f58960 | ||
|
|
74201aaef9 | ||
|
|
c6b0d96e71 | ||
|
|
8bcd6bd077 | ||
|
|
6dcd919130 | ||
|
|
944d285e14 | ||
|
|
a56da8cc4a | ||
|
|
40458be41b | ||
|
|
b6dc5029dd | ||
|
|
2349bbff31 | ||
|
|
b76f78948b | ||
|
|
2b7994778d | ||
|
|
4e6ab470c2 | ||
|
|
50c23ce1c0 | ||
|
|
61ac032751 | ||
|
|
9ee79a8b13 | ||
|
|
efe6729891 | ||
|
|
42743e3b82 | ||
|
|
b3c3e3a034 | ||
|
|
642cc8d603 | ||
|
|
d53f95314d | ||
|
|
797c4581ee | ||
|
|
6534f4a6c7 | ||
|
|
3e4f52b3af | ||
|
|
eaf45e489d | ||
|
|
2d0a3ad828 | ||
|
|
400fc6cbee | ||
|
|
634e1170a3 | ||
|
|
99669a21a4 | ||
|
|
d14627ac52 | ||
|
|
c98340d9d2 | ||
|
|
3f616ce6a3 | ||
|
|
35d078a1ed | ||
|
|
034371c689 | ||
|
|
b797863ba3 | ||
|
|
63eaee5049 | ||
|
|
ef0dd289bb | ||
|
|
4052943a0d | ||
|
|
33fefb9454 | ||
|
|
008de93d03 | ||
|
|
171668085d | ||
|
|
1907ba1046 | ||
|
|
39e1c35c79 | ||
|
|
be605e6100 | ||
|
|
b8897befa6 | ||
|
|
1b872375ab | ||
|
|
c998ec13d8 | ||
|
|
b9c135baf2 | ||
|
|
efb37ab0f7 | ||
|
|
b4cfc2a84a | ||
|
|
9fe48b34a7 | ||
|
|
8955a22059 | ||
|
|
02ec0a1948 | ||
|
|
48977a012b | ||
|
|
208c1d92f2 | ||
|
|
9d61668e04 | ||
|
|
3b159cdf02 | ||
|
|
46303a2fb1 | ||
|
|
a55b0ab5db | ||
|
|
71d731173a | ||
|
|
abbb8de0e3 | ||
|
|
56f84f0d49 | ||
|
|
f6959b99c6 | ||
|
|
991833ab77 | ||
|
|
95cedccbd0 | ||
|
|
50b8b18560 | ||
|
|
877f1d04bb | ||
|
|
237e91fcad | ||
|
|
30ef6d93aa | ||
|
|
cfdb86b5fc | ||
|
|
1e32edea65 | ||
|
|
3fbf590d39 | ||
|
|
3728102644 | ||
|
|
eafcd1d103 | ||
|
|
ed5ffc43cb | ||
|
|
e47cc22300 | ||
|
|
8aa80d3e9b | ||
|
|
f90d3f5faf |
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: [recp]
|
||||
patreon: recp
|
||||
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
|
||||
645
.github/workflows/ci.yml
vendored
Normal file
645
.github/workflows/ci.yml
vendored
Normal file
@@ -0,0 +1,645 @@
|
||||
name: CI
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ "master" ]
|
||||
pull_request:
|
||||
branches: [ "master" ]
|
||||
|
||||
jobs:
|
||||
build_autotools:
|
||||
name: Autotools / ${{ matrix.os }} / ${{ matrix.simd }}
|
||||
runs-on: ${{ matrix.os }}
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
include:
|
||||
# x86/x64 builds
|
||||
- { os: macos-13, simd: none }
|
||||
- { os: macos-13, simd: sse }
|
||||
- { os: macos-13, simd: sse2 }
|
||||
- { os: macos-13, simd: sse3 }
|
||||
- { os: macos-13, simd: sse4 }
|
||||
- { os: macos-13, simd: avx }
|
||||
- { os: macos-13, simd: avx2 }
|
||||
- { os: macos-14, simd: none }
|
||||
- { os: macos-14, simd: sse }
|
||||
- { os: macos-14, simd: sse2 }
|
||||
- { os: macos-14, simd: sse3 }
|
||||
- { os: macos-14, simd: sse4 }
|
||||
- { os: macos-14, simd: avx }
|
||||
- { os: macos-14, simd: avx2 }
|
||||
- { os: ubuntu-22.04, simd: none }
|
||||
- { os: ubuntu-22.04, simd: sse }
|
||||
- { os: ubuntu-22.04, simd: sse2 }
|
||||
- { os: ubuntu-22.04, simd: sse3 }
|
||||
- { os: ubuntu-22.04, simd: sse4 }
|
||||
- { os: ubuntu-22.04, simd: avx }
|
||||
- { os: ubuntu-22.04, simd: avx2 }
|
||||
- { os: ubuntu-24.04, simd: none }
|
||||
- { os: ubuntu-24.04, simd: sse }
|
||||
- { os: ubuntu-24.04, simd: sse2 }
|
||||
- { os: ubuntu-24.04, simd: sse3 }
|
||||
- { os: ubuntu-24.04, simd: sse4 }
|
||||
- { os: ubuntu-24.04, simd: avx }
|
||||
- { os: ubuntu-24.04, simd: avx2 }
|
||||
# ARM64 builds
|
||||
- { os: ubuntu-latest-arm64, simd: neon }
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Install Autotools on macOS
|
||||
if: runner.os == 'macOS'
|
||||
run: brew upgrade && brew install autoconf automake libtool
|
||||
|
||||
- name: Install Autotools on Ubuntu
|
||||
if: matrix.os == 'ubuntu-22.04' || matrix.os == 'ubuntu-24.04'
|
||||
run: sudo apt-get install -y autoconf automake libtool
|
||||
|
||||
- name: Set SIMD flags
|
||||
run: |
|
||||
if [ "${{ matrix.simd }}" == "none" ]; then
|
||||
export CFLAGS=""
|
||||
elif [ "${{ matrix.simd }}" == "sse" ]; then
|
||||
export CFLAGS="-msse"
|
||||
elif [ "${{ matrix.simd }}" == "sse2" ]; then
|
||||
export CFLAGS="-msse2"
|
||||
elif [ "${{ matrix.simd }}" == "sse3" ]; then
|
||||
export CFLAGS="-msse3"
|
||||
elif [ "${{ matrix.simd }}" == "sse4" ]; then
|
||||
export CFLAGS="-msse4"
|
||||
elif [ "${{ matrix.simd }}" == "avx" ]; then
|
||||
export CFLAGS="-mavx"
|
||||
elif [ "${{ matrix.simd }}" == "avx2" ]; then
|
||||
export CFLAGS="-mavx2"
|
||||
elif [ "${{ matrix.simd }}" == "neon" ]; then
|
||||
export CFLAGS="-mfpu=neon"
|
||||
fi
|
||||
|
||||
- name: Generate Autotools
|
||||
run: ./autogen.sh
|
||||
|
||||
- name: Configure Autotools
|
||||
run: ./configure CFLAGS="$CFLAGS"
|
||||
|
||||
- name: Build
|
||||
run: make
|
||||
|
||||
- name: Test
|
||||
run: make check
|
||||
|
||||
build_cmake_ios:
|
||||
name: CMake / iOS
|
||||
runs-on: macos-14
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Configure CMake
|
||||
run: |
|
||||
cmake \
|
||||
-B build \
|
||||
-GXcode \
|
||||
-DCMAKE_SYSTEM_NAME=iOS \
|
||||
-DCMAKE_BUILD_TYPE=Release \
|
||||
-DCMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_ALLOWED=NO \
|
||||
-DCGLM_STATIC=ON \
|
||||
-DCGLM_USE_TEST=ON
|
||||
|
||||
- name: Build
|
||||
run: cmake --build build
|
||||
|
||||
build_cmake_ubuntu:
|
||||
name: CMake / ${{ matrix.target.os }} / ${{ matrix.target.cc }} / ${{ matrix.target.arch }} / ${{ matrix.target.simd }}
|
||||
runs-on: ${{ matrix.target.arch == 'arm64' && 'ubuntu-latest-arm64' || matrix.target.os }}
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
target:
|
||||
# GCC 11 builds
|
||||
- { os: ubuntu-20.04, cc: gcc-11, arch: x64, simd: none }
|
||||
- { os: ubuntu-20.04, cc: gcc-11, arch: x64, simd: sse }
|
||||
- { os: ubuntu-20.04, cc: gcc-11, arch: x64, simd: sse2 }
|
||||
- { os: ubuntu-20.04, cc: gcc-11, arch: x64, simd: sse3 }
|
||||
- { os: ubuntu-20.04, cc: gcc-11, arch: x64, simd: sse4 }
|
||||
- { os: ubuntu-20.04, cc: gcc-11, arch: x64, simd: avx }
|
||||
- { os: ubuntu-20.04, cc: gcc-11, arch: x64, simd: avx2 }
|
||||
# GCC 12 builds
|
||||
- { os: ubuntu-22.04, cc: gcc-12, arch: x64, simd: none }
|
||||
- { os: ubuntu-22.04, cc: gcc-12, arch: x64, simd: sse }
|
||||
- { os: ubuntu-22.04, cc: gcc-12, arch: x64, simd: sse2 }
|
||||
- { os: ubuntu-22.04, cc: gcc-12, arch: x64, simd: sse3 }
|
||||
- { os: ubuntu-22.04, cc: gcc-12, arch: x64, simd: sse4 }
|
||||
- { os: ubuntu-22.04, cc: gcc-12, arch: x64, simd: avx }
|
||||
- { os: ubuntu-22.04, cc: gcc-12, arch: x64, simd: avx2 }
|
||||
# GCC 13 builds
|
||||
- { os: ubuntu-24.04, cc: gcc-13, arch: x64, simd: none }
|
||||
- { os: ubuntu-24.04, cc: gcc-13, arch: x64, simd: sse }
|
||||
- { os: ubuntu-24.04, cc: gcc-13, arch: x64, simd: sse2 }
|
||||
- { os: ubuntu-24.04, cc: gcc-13, arch: x64, simd: sse3 }
|
||||
- { os: ubuntu-24.04, cc: gcc-13, arch: x64, simd: sse4 }
|
||||
- { os: ubuntu-24.04, cc: gcc-13, arch: x64, simd: avx }
|
||||
- { os: ubuntu-24.04, cc: gcc-13, arch: x64, simd: avx2 }
|
||||
# Clang 12 builds
|
||||
- { os: ubuntu-20.04, cc: clang-12, arch: x64, simd: none }
|
||||
- { os: ubuntu-20.04, cc: clang-12, arch: x64, simd: sse }
|
||||
- { os: ubuntu-20.04, cc: clang-12, arch: x64, simd: sse2 }
|
||||
- { os: ubuntu-20.04, cc: clang-12, arch: x64, simd: sse3 }
|
||||
- { os: ubuntu-20.04, cc: clang-12, arch: x64, simd: sse4 }
|
||||
- { os: ubuntu-20.04, cc: clang-12, arch: x64, simd: avx }
|
||||
- { os: ubuntu-20.04, cc: clang-12, arch: x64, simd: avx2 }
|
||||
# Clang 15 builds
|
||||
- { os: ubuntu-22.04, cc: clang-15, arch: x64, simd: none }
|
||||
- { os: ubuntu-22.04, cc: clang-15, arch: x64, simd: sse }
|
||||
- { os: ubuntu-22.04, cc: clang-15, arch: x64, simd: sse2 }
|
||||
- { os: ubuntu-22.04, cc: clang-15, arch: x64, simd: sse3 }
|
||||
- { os: ubuntu-22.04, cc: clang-15, arch: x64, simd: sse4 }
|
||||
- { os: ubuntu-22.04, cc: clang-15, arch: x64, simd: avx }
|
||||
- { os: ubuntu-22.04, cc: clang-15, arch: x64, simd: avx2 }
|
||||
# ARM64 builds
|
||||
- { os: ubuntu-latest, cc: gcc-12, arch: arm64, simd: neon }
|
||||
- { os: ubuntu-latest, cc: gcc-13, arch: arm64, simd: neon }
|
||||
# ARMv7 builds
|
||||
- { os: ubuntu-latest-arm64, cc: gcc-12, arch: armv7, simd: neon }
|
||||
- { os: ubuntu-latest-arm64, cc: gcc-12, arch: armv7, simd: none }
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Add Ubuntu Toolchain PPA
|
||||
if: matrix.target.os == 'ubuntu-20.04'
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y software-properties-common
|
||||
sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test
|
||||
sudo apt-get update
|
||||
|
||||
- name: Install Compiler and Ninja
|
||||
run: |
|
||||
sudo apt-get install -y ${{ matrix.target.cc }} ninja-build
|
||||
|
||||
- name: Set SIMD flags
|
||||
run: |
|
||||
if [ "${{ matrix.simd }}" == "none" ]; then
|
||||
export CFLAGS=""
|
||||
elif [ "${{ matrix.simd }}" == "sse" ]; then
|
||||
export CFLAGS="-msse"
|
||||
elif [ "${{ matrix.simd }}" == "sse2" ]; then
|
||||
export CFLAGS="-msse2"
|
||||
elif [ "${{ matrix.simd }}" == "sse3" ]; then
|
||||
export CFLAGS="-msse3"
|
||||
elif [ "${{ matrix.simd }}" == "sse4" ]; then
|
||||
export CFLAGS="-msse4"
|
||||
elif [ "${{ matrix.simd }}" == "avx" ]; then
|
||||
export CFLAGS="-mavx"
|
||||
elif [ "${{ matrix.simd }}" == "avx2" ]; then
|
||||
export CFLAGS="-mavx2"
|
||||
elif [ "${{ matrix.simd }}" == "neon" ]; then
|
||||
export CFLAGS="-mfpu=neon"
|
||||
fi
|
||||
|
||||
- name: Configure CMake
|
||||
run: |
|
||||
if [ "${{ matrix.target.arch }}" == "armv7" ]; then
|
||||
# Build for ARMv7
|
||||
neon_flags=""
|
||||
if [ "${{ matrix.simd }}" == "neon" ]; then
|
||||
neon_flags="-mfpu=neon -mfloat-abi=hard"
|
||||
fi
|
||||
cmake -B build -GNinja -DCMAKE_BUILD_TYPE=Release \
|
||||
-DCMAKE_C_COMPILER=${{ matrix.target.cc }} \
|
||||
-DCMAKE_C_FLAGS="$CFLAGS -m32 -march=armv7-a ${neon_flags}" \
|
||||
-DCGLM_STATIC=ON -DCGLM_USE_TEST=ON
|
||||
elif [ "${{ matrix.target.arch }}" == "arm64" ]; then
|
||||
# Build for ARM64 (AArch64)
|
||||
neon_flags=""
|
||||
if [ "${{ matrix.simd }}" == "neon" ]; then
|
||||
neon_flags="+simd" # Enable SIMD/NEON features on ARM64
|
||||
else
|
||||
neon_flags="+nosimd" # Explicitly disable SIMD/NEON
|
||||
fi
|
||||
cmake -B build -GNinja -DCMAKE_BUILD_TYPE=Release \
|
||||
-DCMAKE_C_COMPILER=${{ matrix.target.cc }} \
|
||||
-DCMAKE_C_FLAGS="$CFLAGS -march=armv8-a${neon_flags}" \
|
||||
-DCGLM_STATIC=ON -DCGLM_USE_TEST=ON
|
||||
else
|
||||
# Normal build (x86/x64)
|
||||
cmake -B build -GNinja -DCMAKE_BUILD_TYPE=Release \
|
||||
-DCMAKE_C_COMPILER=${{ matrix.target.cc }} \
|
||||
-DCMAKE_C_FLAGS="$CFLAGS" \
|
||||
-DCGLM_STATIC=ON -DCGLM_USE_TEST=ON
|
||||
fi
|
||||
|
||||
- name: Build
|
||||
run: cmake --build build
|
||||
|
||||
- name: Test
|
||||
working-directory: build
|
||||
run: ./tests
|
||||
|
||||
build_cmake_macos:
|
||||
name: CMake / ${{ matrix.os }}
|
||||
runs-on: ${{ matrix.os }}
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os: [macos-13, macos-14]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Install Ninja
|
||||
if: runner.os == 'macOS'
|
||||
run: brew upgrade && brew install ninja
|
||||
|
||||
- name: Configure CMake
|
||||
run: |
|
||||
cmake \
|
||||
-B build \
|
||||
-GNinja \
|
||||
-DCMAKE_BUILD_TYPE=Release \
|
||||
-DCGLM_STATIC=ON \
|
||||
-DCGLM_USE_TEST=ON
|
||||
|
||||
- name: Build
|
||||
run: cmake --build build
|
||||
|
||||
- name: Test
|
||||
working-directory: build
|
||||
run: ./tests
|
||||
|
||||
build_cmake:
|
||||
name: CMake / ${{ matrix.os }} / ${{ matrix.simd }}
|
||||
runs-on: ${{ matrix.os }}
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
include:
|
||||
# x86/x64 builds
|
||||
- { os: macos-13, simd: none }
|
||||
- { os: macos-13, simd: sse }
|
||||
- { os: macos-13, simd: sse2 }
|
||||
- { os: macos-13, simd: sse3 }
|
||||
- { os: macos-13, simd: sse4 }
|
||||
- { os: macos-13, simd: avx }
|
||||
- { os: macos-13, simd: avx2 }
|
||||
- { os: macos-14, simd: none }
|
||||
- { os: macos-14, simd: sse }
|
||||
- { os: macos-14, simd: sse2 }
|
||||
- { os: macos-14, simd: sse3 }
|
||||
- { os: macos-14, simd: sse4 }
|
||||
- { os: macos-14, simd: avx }
|
||||
- { os: macos-14, simd: avx2 }
|
||||
- { os: windows-2022, simd: none }
|
||||
- { os: windows-2022, simd: sse }
|
||||
- { os: windows-2022, simd: sse2 }
|
||||
- { os: windows-2022, simd: sse3 }
|
||||
- { os: windows-2022, simd: sse4 }
|
||||
- { os: windows-2022, simd: avx }
|
||||
- { os: windows-2022, simd: avx2 }
|
||||
# ARM64 builds
|
||||
- { os: macos-14-arm64, simd: neon }
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Install Ninja on macOS
|
||||
if: runner.os == 'macOS'
|
||||
run: brew upgrade && brew install ninja
|
||||
|
||||
- name: Set SIMD flags (Windows)
|
||||
if: runner.os == 'Windows'
|
||||
shell: pwsh
|
||||
run: |
|
||||
$simd = "${{ matrix.simd }}"
|
||||
if ($simd -eq "none") {
|
||||
$env:CFLAGS = ""
|
||||
} elseif ($simd -eq "sse") {
|
||||
$env:CFLAGS = "-arch:SSE"
|
||||
} elseif ($simd -eq "sse2") {
|
||||
$env:CFLAGS = "-arch:SSE2"
|
||||
} elseif ($simd -eq "sse3") {
|
||||
$env:CFLAGS = "-arch:SSE3"
|
||||
} elseif ($simd -eq "sse4") {
|
||||
$env:CFLAGS = "-arch:SSE4"
|
||||
} elseif ($simd -eq "avx") {
|
||||
$env:CFLAGS = "-arch:AVX"
|
||||
} elseif ($simd -eq "avx2") {
|
||||
$env:CFLAGS = "-arch:AVX2"
|
||||
} elseif ($simd -eq "neon") {
|
||||
$env:CFLAGS = "-arch:NEON"
|
||||
}
|
||||
|
||||
- name: Set SIMD flags (Unix)
|
||||
if: runner.os != 'Windows'
|
||||
shell: bash
|
||||
run: |
|
||||
if [ "${{ matrix.simd }}" == "none" ]; then
|
||||
export CFLAGS=""
|
||||
elif [ "${{ matrix.simd }}" == "sse" ]; then
|
||||
export CFLAGS="-msse"
|
||||
elif [ "${{ matrix.simd }}" == "sse2" ]; then
|
||||
export CFLAGS="-msse2"
|
||||
elif [ "${{ matrix.simd }}" == "sse3" ]; then
|
||||
export CFLAGS="-msse3"
|
||||
elif [ "${{ matrix.simd }}" == "sse4" ]; then
|
||||
export CFLAGS="-msse4"
|
||||
elif [ "${{ matrix.simd }}" == "avx" ]; then
|
||||
export CFLAGS="-mavx"
|
||||
elif [ "${{ matrix.simd }}" == "avx2" ]; then
|
||||
export CFLAGS="-mavx2"
|
||||
elif [ "${{ matrix.simd }}" == "neon" ]; then
|
||||
export CFLAGS="-mfpu=neon"
|
||||
fi
|
||||
|
||||
- name: Configure CMake (Windows)
|
||||
if: runner.os == 'Windows'
|
||||
shell: pwsh
|
||||
run: cmake -B build -G "Visual Studio 17 2022" -A x64 -T host=x64 -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS="$env:CFLAGS" -DCGLM_STATIC=ON -DCGLM_USE_TEST=ON
|
||||
|
||||
- name: Configure CMake (Unix)
|
||||
if: runner.os != 'Windows'
|
||||
shell: bash
|
||||
run: cmake -B build -GNinja -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS="$CFLAGS" -DCGLM_STATIC=ON -DCGLM_USE_TEST=ON
|
||||
|
||||
- name: Build
|
||||
run: cmake --build build
|
||||
|
||||
- name: Test (Windows)
|
||||
if: runner.os == 'Windows'
|
||||
shell: pwsh
|
||||
working-directory: build
|
||||
run: .\Debug\tests.exe
|
||||
|
||||
- name: Test (Unix)
|
||||
if: runner.os != 'Windows'
|
||||
shell: bash
|
||||
working-directory: build
|
||||
run: ./tests
|
||||
|
||||
build_meson:
|
||||
name: Meson / ${{ matrix.os }} / ${{ matrix.simd }}
|
||||
runs-on: ${{ contains(matrix.os, 'arm64') && 'ubuntu-latest-arm64' || matrix.os }}
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
include:
|
||||
# x86/x64 builds
|
||||
- { os: macos-14, simd: none }
|
||||
- { os: macos-14, simd: sse }
|
||||
- { os: macos-14, simd: sse2 }
|
||||
- { os: macos-14, simd: sse3 }
|
||||
- { os: macos-14, simd: sse4 }
|
||||
- { os: macos-14, simd: avx }
|
||||
- { os: macos-14, simd: avx2 }
|
||||
- { os: ubuntu-22.04, simd: none }
|
||||
- { os: ubuntu-22.04, simd: sse }
|
||||
- { os: ubuntu-22.04, simd: sse2 }
|
||||
- { os: ubuntu-22.04, simd: sse3 }
|
||||
- { os: ubuntu-22.04, simd: sse4 }
|
||||
- { os: ubuntu-22.04, simd: avx }
|
||||
- { os: ubuntu-22.04, simd: avx2 }
|
||||
- { os: ubuntu-24.04, simd: none }
|
||||
- { os: ubuntu-24.04, simd: sse }
|
||||
- { os: ubuntu-24.04, simd: sse2 }
|
||||
- { os: ubuntu-24.04, simd: sse3 }
|
||||
- { os: ubuntu-24.04, simd: sse4 }
|
||||
- { os: ubuntu-24.04, simd: avx }
|
||||
- { os: ubuntu-24.04, simd: avx2 }
|
||||
- { os: windows-2022, simd: none }
|
||||
- { os: windows-2022, simd: sse }
|
||||
- { os: windows-2022, simd: sse2 }
|
||||
- { os: windows-2022, simd: sse3 }
|
||||
- { os: windows-2022, simd: sse4 }
|
||||
- { os: windows-2022, simd: avx }
|
||||
- { os: windows-2022, simd: avx2 }
|
||||
# ARM64 builds
|
||||
- { os: ubuntu-latest-arm64, simd: neon }
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: '3.12'
|
||||
cache: 'pip'
|
||||
|
||||
- name: Install meson
|
||||
run: python3 -m pip install meson ninja
|
||||
|
||||
- name: Set SIMD flags (Windows)
|
||||
if: runner.os == 'Windows'
|
||||
shell: pwsh
|
||||
run: |
|
||||
$simd = "${{ matrix.simd }}"
|
||||
if ($simd -eq "none") {
|
||||
$env:CFLAGS = ""
|
||||
} elseif ($simd -eq "sse") {
|
||||
$env:CFLAGS = "-arch:SSE"
|
||||
} elseif ($simd -eq "sse2") {
|
||||
$env:CFLAGS = "-arch:SSE2"
|
||||
} elseif ($simd -eq "sse3") {
|
||||
$env:CFLAGS = "-arch:SSE3"
|
||||
} elseif ($simd -eq "sse4") {
|
||||
$env:CFLAGS = "-arch:SSE4"
|
||||
} elseif ($simd -eq "avx") {
|
||||
$env:CFLAGS = "-arch:AVX"
|
||||
} elseif ($simd -eq "avx2") {
|
||||
$env:CFLAGS = "-arch:AVX2"
|
||||
} elseif ($simd -eq "neon") {
|
||||
$env:CFLAGS = "-arch:NEON"
|
||||
}
|
||||
|
||||
- name: Set SIMD flags (Unix)
|
||||
if: runner.os != 'Windows'
|
||||
shell: bash
|
||||
run: |
|
||||
if [ "${{ matrix.simd }}" == "none" ]; then
|
||||
export CFLAGS=""
|
||||
elif [ "${{ matrix.simd }}" == "sse" ]; then
|
||||
export CFLAGS="-msse"
|
||||
elif [ "${{ matrix.simd }}" == "sse2" ]; then
|
||||
export CFLAGS="-msse2"
|
||||
elif [ "${{ matrix.simd }}" == "sse3" ]; then
|
||||
export CFLAGS="-msse3"
|
||||
elif [ "${{ matrix.simd }}" == "sse4" ]; then
|
||||
export CFLAGS="-msse4"
|
||||
elif [ "${{ matrix.simd }}" == "avx" ]; then
|
||||
export CFLAGS="-mavx"
|
||||
elif [ "${{ matrix.simd }}" == "avx2" ]; then
|
||||
export CFLAGS="-mavx2"
|
||||
elif [ "${{ matrix.simd }}" == "neon" ]; then
|
||||
export CFLAGS="-mfpu=neon"
|
||||
fi
|
||||
|
||||
- name: Build with meson (Windows)
|
||||
if: runner.os == 'Windows'
|
||||
shell: pwsh
|
||||
run: |
|
||||
meson setup build -Dbuildtype=release --default-library=static -Dbuild_tests=true -Dc_args="$env:CFLAGS"
|
||||
meson test -C build
|
||||
|
||||
- name: Build with meson (Unix)
|
||||
if: runner.os != 'Windows'
|
||||
shell: bash
|
||||
run: |
|
||||
meson setup build -Dbuildtype=release --default-library=static -Dbuild_tests=true -Dc_args="$CFLAGS"
|
||||
meson test -C build
|
||||
|
||||
build_msbuild:
|
||||
name: MSBuild / Windows / ${{ matrix.simd }}
|
||||
runs-on: windows-2022
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
simd: [none, sse, sse2, sse3, sse4, avx, avx2, neon]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- uses: microsoft/setup-msbuild@v2
|
||||
|
||||
- name: Retarget solution
|
||||
run: |
|
||||
vswhere -latest -products * -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -property installationPath
|
||||
$vsInstallPath = vswhere -latest -products * -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -property installationPath
|
||||
& "$vsInstallPath\Common7\IDE\devenv.com" cglm.sln /Upgrade
|
||||
|
||||
- name: Set SIMD flags
|
||||
run: |
|
||||
if ($Env:SIMD -eq 'none') {
|
||||
$Env:CFLAGS=""
|
||||
} elseif ($Env:SIMD -eq 'sse') {
|
||||
$Env:CFLAGS="-arch:SSE"
|
||||
} elseif ($Env:SIMD -eq 'sse2') {
|
||||
$Env:CFLAGS="-arch:SSE2"
|
||||
} elseif ($Env:SIMD -eq 'sse3') {
|
||||
$Env:CFLAGS="-arch:SSE3"
|
||||
} elseif ($Env:SIMD -eq 'sse4') {
|
||||
$Env:CFLAGS="-arch:SSE4"
|
||||
} elseif ($Env:SIMD -eq 'avx') {
|
||||
$Env:CFLAGS="-arch:AVX"
|
||||
} elseif ($Env:SIMD -eq 'avx2') {
|
||||
$Env:CFLAGS="-arch:AVX2"
|
||||
} elseif ($Env:SIMD -eq 'neon') {
|
||||
$Env:CFLAGS="-arch:NEON"
|
||||
}
|
||||
|
||||
- name: Build (x86)
|
||||
working-directory: win
|
||||
run: msbuild cglm.vcxproj /p:Configuration=Release /p:Platform=x86 /p:PlatformToolset=v143 /p:BuildInParallel=true /p:AdditionalOptions="$Env:CFLAGS"
|
||||
|
||||
- name: Build (x64)
|
||||
working-directory: win
|
||||
run: msbuild cglm.vcxproj /p:Configuration=Release /p:Platform=x64 /p:PlatformToolset=v143 /p:BuildInParallel=true /p:AdditionalOptions="$Env:CFLAGS"
|
||||
|
||||
build_documentation:
|
||||
name: Documentation
|
||||
runs-on: ubuntu-22.04
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: '3.12'
|
||||
|
||||
- name: Install Dependencies
|
||||
working-directory: docs
|
||||
run: python3 -m pip install -r requirements.txt
|
||||
|
||||
- name: Build
|
||||
working-directory: docs
|
||||
run: sphinx-build -W --keep-going source build
|
||||
|
||||
build_swift:
|
||||
name: Swift ${{ matrix.swift }} / ${{ matrix.os }}
|
||||
runs-on: ${{ matrix.os }}
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os: [macos-13, macos-14, ubuntu-22.04]
|
||||
|
||||
# This has no test yet.
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Build
|
||||
run: swift build
|
||||
|
||||
build_cmake_arm:
|
||||
name: CMake / ARM / ${{ matrix.os }} / ${{ matrix.arch }} / ${{ matrix.simd }}
|
||||
runs-on: ${{ matrix.os }}
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
include:
|
||||
# Linux ARM builds
|
||||
- os: ubuntu-latest-arm64
|
||||
arch: arm64
|
||||
simd: neon
|
||||
- os: ubuntu-latest-arm64
|
||||
arch: armv7
|
||||
simd: neon
|
||||
- os: ubuntu-latest-arm64
|
||||
arch: armv7
|
||||
simd: none
|
||||
# Windows ARM builds
|
||||
- os: windows-latest-arm64
|
||||
arch: arm64
|
||||
simd: neon
|
||||
- os: windows-latest-arm64
|
||||
arch: arm
|
||||
simd: neon
|
||||
- os: windows-latest-arm64
|
||||
arch: arm
|
||||
simd: none
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Configure CMake (Windows)
|
||||
if: runner.os == 'Windows'
|
||||
shell: pwsh
|
||||
run: |
|
||||
$flags = ""
|
||||
if ("${{ matrix.arch }}" -eq "arm") {
|
||||
$flags = "-m32 -march=armv7-a"
|
||||
if ("${{ matrix.simd }}" -eq "neon") {
|
||||
$flags += " -mfpu=neon"
|
||||
}
|
||||
}
|
||||
elseif ("${{ matrix.simd }}" -eq "neon") {
|
||||
$flags = "-march=armv8-a+simd"
|
||||
}
|
||||
|
||||
cmake -B build -G "Visual Studio 17 2022" -A ${{ matrix.arch == 'arm64' && 'ARM64' || 'ARM' }} `
|
||||
-DCMAKE_BUILD_TYPE=Release `
|
||||
-DCMAKE_C_FLAGS="$flags" `
|
||||
-DCGLM_STATIC=ON -DCGLM_USE_TEST=ON
|
||||
|
||||
- name: Configure CMake (Unix)
|
||||
if: runner.os != 'Windows'
|
||||
shell: bash
|
||||
run: |
|
||||
flags=""
|
||||
if [ "${{ matrix.arch }}" = "armv7" ]; then
|
||||
flags="-m32 -march=armv7-a"
|
||||
if [ "${{ matrix.simd }}" = "neon" ]; then
|
||||
flags="$flags -mfpu=neon -mfloat-abi=hard"
|
||||
fi
|
||||
elif [ "${{ matrix.simd }}" = "neon" ]; then
|
||||
flags="-march=armv8-a+simd"
|
||||
fi
|
||||
|
||||
cmake -B build -GNinja -DCMAKE_BUILD_TYPE=Release \
|
||||
-DCMAKE_C_FLAGS="$flags" \
|
||||
-DCGLM_STATIC=ON -DCGLM_USE_TEST=ON
|
||||
|
||||
- name: Build
|
||||
run: cmake --build build
|
||||
|
||||
- name: Test
|
||||
working-directory: build
|
||||
run: ./tests
|
||||
107
.github/workflows/cmake-wasm.yml
vendored
Normal file
107
.github/workflows/cmake-wasm.yml
vendored
Normal file
@@ -0,0 +1,107 @@
|
||||
name: CMake WebAssembly
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ "master" ]
|
||||
pull_request:
|
||||
branches: [ "master" ]
|
||||
|
||||
env:
|
||||
wasmtime_version: v7.0.0
|
||||
wasmer_version: v3.1.1
|
||||
|
||||
jobs:
|
||||
build_wasi_sdk:
|
||||
strategy:
|
||||
matrix:
|
||||
BUILD_TYPE: [Release, Debug, RelWithDebInfo, MinSizeRel]
|
||||
C_FLAGS: ['', '-msimd128']
|
||||
wasi_sdk_version: [19, 20]
|
||||
# The CMake configure and build commands are platform agnostic and should work equally well on Windows or Mac.
|
||||
# You can convert this to a matrix build if you need cross-platform coverage.
|
||||
# See: https://docs.github.com/en/free-pro-team@latest/actions/learn-github-actions/managing-complex-workflows#using-a-build-matrix
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Downloading wasi-sdk
|
||||
run: |
|
||||
cd ${{github.workspace}}
|
||||
wget --no-verbose https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-${{matrix.wasi_sdk_version}}/wasi-sdk-${{matrix.wasi_sdk_version}}.0-linux.tar.gz
|
||||
tar xf wasi-sdk-${{matrix.wasi_sdk_version}}.0-linux.tar.gz
|
||||
|
||||
# Building a wasm library without needing to define a main():
|
||||
# https://github.com/WebAssembly/wasi-sdk/issues/332
|
||||
- name: Modify CMakeLists.txt for WASI
|
||||
run: |
|
||||
echo 'if (CMAKE_SYSTEM_NAME STREQUAL "WASI")' >> CMakeLists.txt
|
||||
echo ' target_link_options(${PROJECT_NAME} PRIVATE -mexec-model=reactor)' >> CMakeLists.txt
|
||||
echo 'endif()' >> CMakeLists.txt
|
||||
|
||||
- name: Configure CMake
|
||||
# Configure CMake in a 'build' subdirectory. `CMAKE_BUILD_TYPE` is only required if you are using a single-configuration generator such as make.
|
||||
# See https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html?highlight=cmake_build_type
|
||||
# Below suppress <<'clock' is deprecated: WASI lacks process-associated clocks; ...>> warns:
|
||||
# -D_WASI_EMULATED_PROCESS_CLOCKS" -DCMAKE_EXE_LINKER_FLAGS="-lwasi-emulated-process-clocks
|
||||
run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{matrix.BUILD_TYPE}} -DCMAKE_C_FLAGS="${{matrix.C_FLAGS}} -D_WASI_EMULATED_PROCESS_CLOCKS" -DCMAKE_EXE_LINKER_FLAGS="-lwasi-emulated-process-clocks" -DCMAKE_TOOLCHAIN_FILE=${{github.workspace}}/wasi-sdk-${{matrix.wasi_sdk_version}}.0/share/cmake/wasi-sdk.cmake -DWASI_SDK_PREFIX=${{github.workspace}}/wasi-sdk-${{matrix.wasi_sdk_version}}.0 -DCGLM_STATIC=ON -DCGLM_SHARED=OFF -DCGLM_USE_TEST=ON
|
||||
|
||||
- name: Build
|
||||
# Build your program with the given configuration
|
||||
run: cmake --build ${{github.workspace}}/build --config ${{matrix.BUILD_TYPE}}
|
||||
|
||||
- name: Test with wasmtime
|
||||
run: |
|
||||
cd ${{github.workspace}}
|
||||
ls -lh ${{github.workspace}}/build/
|
||||
wget --no-verbose https://github.com/bytecodealliance/wasmtime/releases/download/${{env.wasmtime_version}}/wasmtime-${{env.wasmtime_version}}-x86_64-linux.tar.xz
|
||||
tar xf wasmtime-${{env.wasmtime_version}}-x86_64-linux.tar.xz
|
||||
./wasmtime-${{env.wasmtime_version}}-x86_64-linux/wasmtime run --wasm-features simd ${{github.workspace}}/build/tests
|
||||
|
||||
- name: Test with wasmer
|
||||
run: |
|
||||
cd ${{github.workspace}}
|
||||
mkdir wasmer
|
||||
cd wasmer
|
||||
wget --no-verbose https://github.com/wasmerio/wasmer/releases/download/${{env.wasmer_version}}/wasmer-linux-amd64.tar.gz
|
||||
tar xf wasmer-linux-amd64.tar.gz
|
||||
./bin/wasmer run --enable-simd ${{github.workspace}}/build/tests
|
||||
|
||||
build_emsdk:
|
||||
strategy:
|
||||
matrix:
|
||||
BUILD_TYPE: [Release, Debug, RelWithDebInfo, MinSizeRel]
|
||||
C_FLAGS: ['', '-msimd128', '-msse -msse2 -msimd128', '-msse -msse2 -msse3 -msse4 -msimd128']
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Setup emsdk
|
||||
uses: mymindstorm/setup-emsdk@v12
|
||||
|
||||
- name: Verify emsdk
|
||||
run: emcc -v
|
||||
|
||||
- name: Configure CMake
|
||||
# Configure CMake in a 'build' subdirectory. `CMAKE_BUILD_TYPE` is only required if you are using a single-configuration generator such as make.
|
||||
# See https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html?highlight=cmake_build_type
|
||||
run: emcmake cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{matrix.BUILD_TYPE}} -DCMAKE_C_FLAGS="${{matrix.C_FLAGS}}" -DCMAKE_EXE_LINKER_FLAGS="-s STANDALONE_WASM" -DCGLM_STATIC=ON -DCGLM_USE_TEST=ON
|
||||
|
||||
- name: Build
|
||||
# Build your program with the given configuration
|
||||
run: cmake --build ${{github.workspace}}/build --config ${{matrix.BUILD_TYPE}}
|
||||
|
||||
- name: Test with wasmtime
|
||||
run: |
|
||||
cd ${{github.workspace}}
|
||||
ls -lh ${{github.workspace}}/build/
|
||||
wget --no-verbose https://github.com/bytecodealliance/wasmtime/releases/download/${{env.wasmtime_version}}/wasmtime-${{env.wasmtime_version}}-x86_64-linux.tar.xz
|
||||
tar xf wasmtime-${{env.wasmtime_version}}-x86_64-linux.tar.xz
|
||||
./wasmtime-${{env.wasmtime_version}}-x86_64-linux/wasmtime run --wasm-features simd ${{github.workspace}}/build/tests.wasm
|
||||
- name: Test with wasmer
|
||||
run: |
|
||||
cd ${{github.workspace}}
|
||||
mkdir wasmer
|
||||
cd wasmer
|
||||
wget --no-verbose https://github.com/wasmerio/wasmer/releases/download/${{env.wasmer_version}}/wasmer-linux-amd64.tar.gz
|
||||
tar xf wasmer-linux-amd64.tar.gz
|
||||
./bin/wasmer run --enable-simd ${{github.workspace}}/build/tests.wasm
|
||||
79
.github/workflows/meson-wasm.yml
vendored
Normal file
79
.github/workflows/meson-wasm.yml
vendored
Normal file
@@ -0,0 +1,79 @@
|
||||
name: Meson WebAssembly
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ "master" ]
|
||||
pull_request:
|
||||
branches: [ "master" ]
|
||||
|
||||
env:
|
||||
wasmtime_version: v7.0.0
|
||||
wasmer_version: v3.1.1
|
||||
|
||||
jobs:
|
||||
build_emsdk:
|
||||
strategy:
|
||||
matrix:
|
||||
BUILD_TYPE: [debug, debugoptimized, release, minsize]
|
||||
C_FLAGS: ['', '-msimd128', '-msse -msse2 -msimd128', '-msse -msse2 -msse3 -msse4 -msimd128']
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Setup emsdk
|
||||
uses: mymindstorm/setup-emsdk@v13
|
||||
|
||||
- name: Verify emsdk
|
||||
run: emcc -v
|
||||
|
||||
- name: Creating cross file
|
||||
run: |
|
||||
cat << EOF > ${{github.workspace}}/meson_cross_emsdk.txt
|
||||
[binaries]
|
||||
c = '`which emcc`'
|
||||
cpp = '`which em++`'
|
||||
ar = '`which emar`'
|
||||
|
||||
[built-in options]
|
||||
|
||||
c_args = ['-Wno-unused-parameter']
|
||||
c_link_args = ['-s', 'STANDALONE_WASM']
|
||||
cpp_args = ['-Wno-unused-parameter']
|
||||
cpp_link_args = ['-s', 'STANDALONE_WASM']
|
||||
|
||||
[host_machine]
|
||||
|
||||
system = 'emscripten'
|
||||
cpu_family = 'wasm32'
|
||||
cpu = 'wasm32'
|
||||
endian = 'little'
|
||||
|
||||
EOF
|
||||
cat ${{github.workspace}}/meson_cross_emsdk.txt
|
||||
|
||||
- uses: actions/setup-python@v4
|
||||
|
||||
- name: Install meson
|
||||
run: |
|
||||
sudo python3 -m pip install meson ninja
|
||||
|
||||
- name: Build with meson
|
||||
run: |
|
||||
meson setup build -Dbuildtype=${{matrix.BUILD_TYPE}} --cross-file ${{github.workspace}}/meson_cross_emsdk.txt --default-library=static -Dbuild_tests=true
|
||||
meson test -C build
|
||||
|
||||
- name: Test with wasmtime
|
||||
run: |
|
||||
cd ${{github.workspace}}
|
||||
ls -lh ${{github.workspace}}/build/
|
||||
wget --no-verbose https://github.com/bytecodealliance/wasmtime/releases/download/${{env.wasmtime_version}}/wasmtime-${{env.wasmtime_version}}-x86_64-linux.tar.xz
|
||||
tar xf wasmtime-${{env.wasmtime_version}}-x86_64-linux.tar.xz
|
||||
./wasmtime-${{env.wasmtime_version}}-x86_64-linux/wasmtime run --wasm-features simd ${{github.workspace}}/build/tests.wasm
|
||||
|
||||
- name: Test with wasmer
|
||||
run: |
|
||||
cd ${{github.workspace}}
|
||||
mkdir wasmer
|
||||
cd wasmer
|
||||
wget --no-verbose https://github.com/wasmerio/wasmer/releases/download/${{env.wasmer_version}}/wasmer-linux-amd64.tar.gz
|
||||
tar xf wasmer-linux-amd64.tar.gz
|
||||
./bin/wasmer run --enable-simd ${{github.workspace}}/build/tests.wasm
|
||||
33
.gitignore
vendored
33
.gitignore
vendored
@@ -51,4 +51,35 @@ cscope.*
|
||||
test/*.trs
|
||||
test/test_*
|
||||
*.log
|
||||
test-*
|
||||
test/.libs/*
|
||||
test/tests
|
||||
cglm_arm/*
|
||||
cglm_test_ios/*
|
||||
cglm_test_iosTests/*
|
||||
docs/build/*
|
||||
win/cglm_test_*
|
||||
* copy.*
|
||||
*.o
|
||||
*.obj
|
||||
*codeanalysis.*.xml
|
||||
*codeanalysis.xml
|
||||
*.lib
|
||||
*.tlog
|
||||
win/x64
|
||||
win/x85
|
||||
win/Debug
|
||||
cglm-test-ios*
|
||||
/cglm.pc
|
||||
test-driver
|
||||
Default-568h@2x.png
|
||||
build/
|
||||
conftest.dir/*
|
||||
confdefs.h
|
||||
*.xcuserdatad
|
||||
.idea
|
||||
cmake-build-debug
|
||||
*.o.tmp
|
||||
xcode/*
|
||||
.vscode
|
||||
.build
|
||||
*.swp
|
||||
|
||||
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
|
||||
39
.readthedocs.yaml
Normal file
39
.readthedocs.yaml
Normal file
@@ -0,0 +1,39 @@
|
||||
# Read the Docs configuration file for Sphinx projects
|
||||
# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
|
||||
|
||||
# Required
|
||||
version: 2
|
||||
|
||||
# Set the OS, Python version and other tools you might need
|
||||
build:
|
||||
os: ubuntu-22.04
|
||||
tools:
|
||||
python: "3.12"
|
||||
# You can also specify other tool versions:
|
||||
# nodejs: "20"
|
||||
# rust: "1.70"
|
||||
# golang: "1.20"
|
||||
|
||||
# Build documentation in the "docs/" directory with Sphinx
|
||||
sphinx:
|
||||
configuration: docs/source/conf.py
|
||||
# You can configure Sphinx to use a different builder, for instance use the dirhtml builder for simpler URLs
|
||||
# builder: "dirhtml"
|
||||
# Fail on all warnings to avoid broken references
|
||||
# fail_on_warning: true
|
||||
|
||||
# Optionally build your docs in additional formats such as PDF and ePub
|
||||
# formats:
|
||||
# - pdf
|
||||
# - epub
|
||||
|
||||
# Optional but recommended, declare the Python requirements required
|
||||
# to build your documentation
|
||||
# See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html
|
||||
# python:
|
||||
# install:
|
||||
# - requirements: docs/requirements.txt
|
||||
|
||||
python:
|
||||
install:
|
||||
- requirements: docs/requirements.txt
|
||||
19
.travis.yml
19
.travis.yml
@@ -4,6 +4,12 @@ os:
|
||||
- linux
|
||||
- osx
|
||||
|
||||
arch:
|
||||
- amd64
|
||||
- ppc64le
|
||||
- s390x
|
||||
- arm64
|
||||
|
||||
sudo: required
|
||||
dist: trusty
|
||||
|
||||
@@ -36,14 +42,10 @@ branches:
|
||||
only:
|
||||
- master
|
||||
|
||||
before_install:
|
||||
- pip install --user cpp-coveralls
|
||||
|
||||
script:
|
||||
- sh ./build-deps.sh
|
||||
- sh ./autogen.sh
|
||||
- if [[ "$CC" == "gcc" && "$CODE_COVERAGE" == "ON" ]]; then
|
||||
./configure CFLAGS="-ftest-coverage -fprofile-arcs";
|
||||
./configure CFLAGS="-ftest-coverage -fprofile-arcs -coverage";
|
||||
else
|
||||
./configure;
|
||||
fi
|
||||
@@ -52,10 +54,15 @@ script:
|
||||
|
||||
after_success:
|
||||
- if [[ "$CC" == "gcc" && "$CODE_COVERAGE" == "ON" ]]; then
|
||||
pip install --user cpp-coveralls &&
|
||||
coveralls
|
||||
--build-root .
|
||||
--exclude lib
|
||||
--exclude test
|
||||
--gcov-options '\-lp'
|
||||
--verbose;
|
||||
--verbose &&
|
||||
bash <(curl -s https://codecov.io/bash);
|
||||
fi
|
||||
|
||||
# after_failure:
|
||||
# - cat ./test-suite.log
|
||||
|
||||
199
BUILDING.md
Normal file
199
BUILDING.md
Normal file
@@ -0,0 +1,199 @@
|
||||
# Building the library
|
||||
|
||||
cglm can be built using one of the following build systems:
|
||||
|
||||
## CMake (All platforms)
|
||||
```bash
|
||||
$ mkdir build
|
||||
$ cd build
|
||||
$ cmake .. # [Optional] -DCGLM_SHARED=ON
|
||||
$ make
|
||||
$ sudo make install # [Optional]
|
||||
```
|
||||
|
||||
### Options with defaults
|
||||
|
||||
```CMake
|
||||
option(CGLM_SHARED "Shared build" ON)
|
||||
option(CGLM_STATIC "Static build" OFF)
|
||||
option(CGLM_USE_C99 "" OFF) # C11
|
||||
option(CGLM_USE_TEST "Enable Tests" OFF) # for make check - make test
|
||||
```
|
||||
|
||||
### Including in a CMake project
|
||||
|
||||
#### Header only
|
||||
|
||||
This requires no building or installation of cglm.
|
||||
|
||||
* Example:
|
||||
|
||||
``` cmake
|
||||
cmake_minimum_required(VERSION 3.8.2)
|
||||
|
||||
project(<Your Project Name>)
|
||||
|
||||
add_executable(${PROJECT_NAME} src/main.c)
|
||||
target_link_libraries(${LIBRARY_NAME} PRIVATE
|
||||
cglm_headers)
|
||||
|
||||
add_subdirectory(external/cglm/ EXCLUDE_FROM_ALL)
|
||||
```
|
||||
|
||||
#### Linked
|
||||
|
||||
* Example:
|
||||
```cmake
|
||||
cmake_minimum_required(VERSION 3.8.2)
|
||||
|
||||
project(<Your Project Name>)
|
||||
|
||||
add_executable(${PROJECT_NAME} src/main.c)
|
||||
target_link_libraries(${LIBRARY_NAME} PRIVATE
|
||||
cglm)
|
||||
|
||||
add_subdirectory(external/cglm/)
|
||||
|
||||
# or you can use find_package to configure cglm
|
||||
```
|
||||
|
||||
### Using CMake to build for WebAssembly
|
||||
|
||||
Since math functions like `sinf` are used, this can not be targeted at `wasm32-unknown-unknown`, one of [wasi-sdk](https://github.com/WebAssembly/wasi-sdk) or [emscripten](https://github.com/emscripten-core/emsdk) should be used.
|
||||
|
||||
Should note that shared build is not yet supported for WebAssembly.
|
||||
|
||||
For [simd128](https://github.com/WebAssembly/simd) support, add `-msimd128` to `CMAKE_C_FLAGS`, in command line `-DCMAKE_C_FLAGS="-msimd128"`.
|
||||
|
||||
For tests, the cmake option `CGLM_USE_TEST` would still work, you'll need a wasi runtime for running tests, see our [ci config file](.github/workflows/cmake-wasm.yml) for a detailed example.
|
||||
|
||||
#### WASI SDK
|
||||
|
||||
```bash
|
||||
$ cmake .. \
|
||||
-DCMAKE_TOOLCHAIN_FILE=/path/to/wasi-sdk-19.0/share/cmake/wasi-sdk.cmake \
|
||||
-DWASI_SDK_PREFIX=/path/to/wasi-sdk-19.0
|
||||
```
|
||||
|
||||
Where `/path/to/wasi-sdk-19.0/` is the path to extracted [wasi sdk](https://github.com/WebAssembly/wasi-sdk).
|
||||
|
||||
In this case it would by default make a static build.
|
||||
|
||||
#### Emscripten
|
||||
|
||||
```bash
|
||||
$ emcmake cmake .. \
|
||||
-DCMAKE_EXE_LINKER_FLAGS="-s STANDALONE_WASM" \
|
||||
-DCGLM_STATIC=ON
|
||||
```
|
||||
|
||||
The `emcmake` here is the cmake wrapper for Emscripten from installed [emsdk](https://github.com/emscripten-core/emsdk).
|
||||
|
||||
## Meson (All platforms)
|
||||
|
||||
```bash
|
||||
$ meson build # [Optional] --default-library=static
|
||||
$ cd build
|
||||
$ ninja
|
||||
$ sudo ninja install # [Optional]
|
||||
```
|
||||
|
||||
### Options with Defaults:
|
||||
|
||||
```meson
|
||||
c_std=c11
|
||||
buildtype=release
|
||||
default_library=shared
|
||||
build_tests=true # to run tests: ninja test
|
||||
```
|
||||
### Including in a Meson project
|
||||
* Example:
|
||||
```meson
|
||||
# Clone cglm or create a cglm.wrap under <source_root>/subprojects
|
||||
project('name', 'c')
|
||||
|
||||
cglm_dep = dependency('cglm', fallback : 'cglm', 'cglm_dep')
|
||||
|
||||
executable('exe', 'src/main.c', dependencies : cglm_dep)
|
||||
```
|
||||
|
||||
## Swift (Swift Package Manager)
|
||||
|
||||
Currently only default build options are supported. Add **cglm** dependency to your project:
|
||||
|
||||
```swift
|
||||
...
|
||||
Package(
|
||||
...
|
||||
dependencies: [
|
||||
...
|
||||
.package(url: "https://github.com/recp/cglm", .branch("master")),
|
||||
]
|
||||
...
|
||||
)
|
||||
```
|
||||
|
||||
Now add **cgml** as a dependency to your target. Product choices are:
|
||||
- **cglm** for inlined version of the library which can be linked only statically
|
||||
- **cglmc** for a compiled version of the library with no linking limitation
|
||||
|
||||
```swift
|
||||
...
|
||||
.target(
|
||||
...
|
||||
dependencies: [
|
||||
...
|
||||
.product(name: "cglm", package: "cglm"),
|
||||
]
|
||||
...
|
||||
)
|
||||
...
|
||||
```
|
||||
|
||||
## Unix (Autotools)
|
||||
|
||||
```bash
|
||||
$ sh autogen.sh
|
||||
$ ./configure
|
||||
$ make
|
||||
$ make check # [Optional]
|
||||
$ [sudo] make install # [Optional]
|
||||
```
|
||||
|
||||
This will also install pkg-config files so you can use
|
||||
`pkg-config --cflags cglm` and `pkg-config --libs cglm` to retrieve compiler
|
||||
and linker flags.
|
||||
|
||||
The files will be installed into the given prefix (usually `/usr/local` by
|
||||
default on Linux), but your pkg-config may not be configured to actually check
|
||||
there. You can figure out where it's looking by running `pkg-config --variable
|
||||
pc_path pkg-config` and change the path the files are installed to via
|
||||
`./configure --with-pkgconfigdir=/your/path`. Alternatively, you can add the
|
||||
prefix path to your `PKG_CONFIG_PATH` environment variable.
|
||||
|
||||
## Windows (MSBuild)
|
||||
Windows related build file and project files are located in `win` folder,
|
||||
make sure you are inside `cglm/win` folder.
|
||||
Code Analysis is enabled, so it may take awhile to build.
|
||||
|
||||
```Powershell
|
||||
$ cd win
|
||||
$ .\build.bat
|
||||
```
|
||||
if `msbuild` won't work (because of multi version VS) then try to build with `devenv`:
|
||||
```Powershell
|
||||
$ devenv cglm.sln /Build Release
|
||||
```
|
||||
|
||||
### Running Tests on Windows
|
||||
|
||||
You can see test project in same visual studio solution file. It is enough to run that project to run tests.
|
||||
|
||||
# Building the documentation
|
||||
First you need install Sphinx: http://www.sphinx-doc.org/en/master/usage/installation.html
|
||||
then:
|
||||
```bash
|
||||
$ cd docs
|
||||
$ sphinx-build source build
|
||||
```
|
||||
it will compile docs into build folder, you can run index.html inside that function.
|
||||
197
CMakeLists.txt
Normal file
197
CMakeLists.txt
Normal file
@@ -0,0 +1,197 @@
|
||||
cmake_minimum_required(VERSION 3.13)
|
||||
project(cglm
|
||||
VERSION 0.9.6
|
||||
HOMEPAGE_URL https://github.com/recp/cglm
|
||||
DESCRIPTION "OpenGL Mathematics (glm) for C"
|
||||
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(CMAKE_SYSTEM_NAME STREQUAL WASI)
|
||||
set(CGLM_STATIC ON CACHE BOOL "Static option" FORCE)
|
||||
set(CGLM_SHARED OFF CACHE BOOL "Shared option" FORCE)
|
||||
endif()
|
||||
|
||||
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(-D_WINDOWS -D_USRDLL)
|
||||
|
||||
if(NOT CMAKE_BUILD_TYPE MATCHES Debug)
|
||||
add_definitions(-DNDEBUG)
|
||||
add_compile_options(/W3 /Ox /Gy /Oi /TC)
|
||||
foreach(flag_var
|
||||
CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
|
||||
CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO)
|
||||
string(REGEX REPLACE "/RTC(su|[1su])" "" ${flag_var} "${${flag_var}}")
|
||||
endforeach(flag_var)
|
||||
endif()
|
||||
else()
|
||||
add_compile_options(-Wall -Wextra -Wpedantic -Wconversion)
|
||||
|
||||
if(NOT CMAKE_BUILD_TYPE MATCHES Debug)
|
||||
add_compile_options(-O3)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
get_directory_property(hasParent PARENT_DIRECTORY)
|
||||
|
||||
if(NOT hasParent AND 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})
|
||||
|
||||
if(NOT CPack_CMake_INCLUDED)
|
||||
include(CPack)
|
||||
endif()
|
||||
|
||||
# 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/ivec2.c
|
||||
src/vec3.c
|
||||
src/ivec3.c
|
||||
src/vec4.c
|
||||
src/ivec4.c
|
||||
src/mat2.c
|
||||
src/mat2x3.c
|
||||
src/mat2x4.c
|
||||
src/mat3.c
|
||||
src/mat3x2.c
|
||||
src/mat3x4.c
|
||||
src/mat4.c
|
||||
src/mat4x2.c
|
||||
src/mat4x3.c
|
||||
src/plane.c
|
||||
src/noise.c
|
||||
src/frustum.c
|
||||
src/box.c
|
||||
src/aabb2d.c
|
||||
src/project.c
|
||||
src/sphere.c
|
||||
src/ease.c
|
||||
src/curve.c
|
||||
src/bezier.c
|
||||
src/ray.c
|
||||
src/affine2d.c
|
||||
src/clipspace/ortho_lh_no.c
|
||||
src/clipspace/ortho_lh_zo.c
|
||||
src/clipspace/ortho_rh_no.c
|
||||
src/clipspace/ortho_rh_zo.c
|
||||
src/clipspace/persp_lh_no.c
|
||||
src/clipspace/persp_lh_zo.c
|
||||
src/clipspace/persp_rh_no.c
|
||||
src/clipspace/persp_rh_zo.c
|
||||
src/clipspace/view_lh_no.c
|
||||
src/clipspace/view_lh_zo.c
|
||||
src/clipspace/view_rh_no.c
|
||||
src/clipspace/view_rh_zo.c
|
||||
src/clipspace/project_no.c
|
||||
src/clipspace/project_zo.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})
|
||||
|
||||
if(WIN32)
|
||||
# Because SOVERSION has no effect to file naming on Windows
|
||||
set_target_properties(${PROJECT_NAME} PROPERTIES
|
||||
RUNTIME_OUTPUT_NAME ${PROJECT_NAME}-${PROJECT_VERSION_MAJOR})
|
||||
endif()
|
||||
|
||||
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_BINDIR})
|
||||
|
||||
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})
|
||||
|
||||
set(PACKAGE_NAME ${PROJECT_NAME})
|
||||
set(prefix ${CMAKE_INSTALL_PREFIX})
|
||||
set(exec_prefix ${CMAKE_INSTALL_PREFIX})
|
||||
if (IS_ABSOLUTE "${CMAKE_INSTALL_INCLUDEDIR}")
|
||||
set(includedir "${CMAKE_INSTALL_INCLUDEDIR}")
|
||||
else()
|
||||
set(includedir "\${prefix}/${CMAKE_INSTALL_INCLUDEDIR}")
|
||||
endif()
|
||||
if (IS_ABSOLUTE "${CMAKE_INSTALL_LIBDIR}")
|
||||
set(libdir "${CMAKE_INSTALL_LIBDIR}")
|
||||
else()
|
||||
set(libdir "\${exec_prefix}/${CMAKE_INSTALL_LIBDIR}")
|
||||
endif()
|
||||
set(PACKAGE_VERSION "${PROJECT_VERSION}")
|
||||
configure_file(cglm.pc.in cglm.pc @ONLY)
|
||||
|
||||
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/cglm.pc
|
||||
DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
|
||||
53
CONTRIBUTING.md
Normal file
53
CONTRIBUTING.md
Normal file
@@ -0,0 +1,53 @@
|
||||
# CONTRIBUTING
|
||||
|
||||
Any contributions (code, documentation, ...) are welcome.
|
||||
|
||||
# New Features
|
||||
- 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
|
||||
- The feature must be compiled on both UNIX/POSIX systems (e.g. macos, linux...) and Windows
|
||||
|
||||
# Code Style
|
||||
This library is written with C99, don't try to add C++ files (yes it can compiled into lib),
|
||||
if you have enough reason to add C++ files than create an issue and get approval before coding,
|
||||
|
||||
- All functions must have `glm` prefix
|
||||
- Lines should be wrapped at 80 characters.
|
||||
- Don't invent new style for existing ones
|
||||
- Use C89 style comments (`/* comments */`) not C++ style comments (`// comments`)
|
||||
- Don't use TABs instead use 2 spaces for TABs
|
||||
- All indents must be 2 spaces, not 1 nor 4 space
|
||||
- All functions in `include` folder must be exported by `CGLM_EXPORT` and wrapped by `extern "C" {` for C++
|
||||
- Crate new line for return type, attribs:
|
||||
|
||||
```C
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mul(mat4 m1, mat4 m2, mat4 dest)
|
||||
```
|
||||
|
||||
not acceptable:
|
||||
|
||||
```C
|
||||
CGLM_INLINE void glm_mul(mat4 m1, mat4 m2, mat4 dest)
|
||||
```
|
||||
- Variables must be declared at the top of a scope before usage:
|
||||
```C
|
||||
int x;
|
||||
int y;
|
||||
|
||||
x = y = 0;
|
||||
```
|
||||
|
||||
not acceptable:
|
||||
|
||||
```C
|
||||
int x;
|
||||
|
||||
x = 0;
|
||||
int y = 0;
|
||||
```
|
||||
|
||||
- All files must retain same LICENSE statement
|
||||
- Code with warnings will not be accepted, please suppress them (not by disabling them)
|
||||
- Run code anaylysis before submitting pull requests, if you use Xcode you can enable Sanitizer in scheme, you can use valgrind in linux
|
||||
98
CREDITS
Normal file
98
CREDITS
Normal file
@@ -0,0 +1,98 @@
|
||||
This library [initially] used some [piece of] implementations
|
||||
(may include codes) from these open source projects/resources:
|
||||
|
||||
1. Initial Affine Transforms
|
||||
The original glm repo (g-truc), url: https://github.com/g-truc/glm
|
||||
|
||||
LICENSE[S]:
|
||||
The Happy Bunny License (Modified MIT License)
|
||||
The MIT License
|
||||
Copyright (c) 2005 - 2016 G-Truc Creation
|
||||
|
||||
FULL LICENSE: https://github.com/g-truc/glm/blob/master/copying.txt
|
||||
|
||||
2. Initial Quaternions
|
||||
Anton's OpenGL 4 Tutorials book source code:
|
||||
|
||||
LICENSE:
|
||||
OpenGL 4 Example Code.
|
||||
Accompanies written series "Anton's OpenGL 4 Tutorials"
|
||||
Email: anton at antongerdelan dot net
|
||||
First version 27 Jan 2014
|
||||
Copyright Dr Anton Gerdelan, Trinity College Dublin, Ireland.
|
||||
|
||||
3. Euler Angles
|
||||
David Eberly
|
||||
Geometric Tools, LLC http://www.geometrictools.com/
|
||||
Copyright (c) 1998-2016. All Rights Reserved.
|
||||
|
||||
Computing Euler angles from a rotation matrix (euler.pdf)
|
||||
Gregory G. Slabaugh
|
||||
|
||||
4. Extracting Planes
|
||||
Fast Extraction of Viewing Frustum Planes from the World-View-Projection Matrix
|
||||
Authors:
|
||||
Gil Gribb (ggribb@ravensoft.com)
|
||||
Klaus Hartmann (k_hartmann@osnabrueck.netsurf.de)
|
||||
|
||||
5. Transform AABB
|
||||
Transform Axis Aligned Bounding Boxes:
|
||||
http://dev.theomader.com/transform-bounding-boxes/
|
||||
https://github.com/erich666/GraphicsGems/blob/master/gems/TransBox.c
|
||||
|
||||
6. Cull frustum
|
||||
http://www.txutxi.com/?p=584
|
||||
http://old.cescg.org/CESCG-2002/DSykoraJJelinek/
|
||||
|
||||
7. Quaternions
|
||||
Initial mat4_quat is borrowed from Apple's simd library
|
||||
|
||||
8. Vector Rotation using 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
|
||||
|
||||
16. ARM NEON Div
|
||||
|
||||
http://github.com/microsoft/DirectXMath
|
||||
|
||||
17. Pick Matrix
|
||||
|
||||
glu project -> project.c
|
||||
|
||||
18. Ray sphere intersection
|
||||
|
||||
RAY TRACING GEMS
|
||||
HIGH-QUALITY AND REAL-TIME RENDERING WITH DXR AND OTHER APIS
|
||||
|
||||
CHAPTER 7
|
||||
Precision Improvements for Ray/Sphere Intersection
|
||||
Eric Haines (1), Johannes Günther (2), and Tomas Akenine-Möller (1)
|
||||
(1) NVIDIA
|
||||
(2) Intel
|
||||
|
||||
Wyman, C., and Haines, E. Getting Started with RTX Ray Tracing.
|
||||
https://github.com/NVIDIAGameWorks/GettingStartedWithRTXRayTracing
|
||||
33
LICENSE
33
LICENSE
@@ -19,36 +19,3 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
|
||||
-
|
||||
|
||||
This library [initially] used some [piece of] implementations
|
||||
(may include codes) from these open source projects/resources:
|
||||
|
||||
1. Affine Transforms
|
||||
The original glm repo (g-truc), url: https://github.com/g-truc/glm
|
||||
|
||||
LICENSE[S]:
|
||||
The Happy Bunny License (Modified MIT License)
|
||||
The MIT License
|
||||
Copyright (c) 2005 - 2016 G-Truc Creation
|
||||
|
||||
FULL LICENSE: https://github.com/g-truc/glm/blob/master/copying.txt
|
||||
|
||||
2. Quaternions
|
||||
Anton's OpenGL 4 Tutorials book source code:
|
||||
|
||||
LICENSE:
|
||||
OpenGL 4 Example Code.
|
||||
Accompanies written series "Anton's OpenGL 4 Tutorials"
|
||||
Email: anton at antongerdelan dot net
|
||||
First version 27 Jan 2014
|
||||
Copyright Dr Anton Gerdelan, Trinity College Dublin, Ireland.
|
||||
|
||||
3. Euler Angles
|
||||
David Eberly
|
||||
Geometric Tools, LLC http://www.geometrictools.com/
|
||||
Copyright (c) 1998-2016. All Rights Reserved.
|
||||
|
||||
Computing Euler angles from a rotation matrix (euler.pdf)
|
||||
Gregory G. Slabaugh
|
||||
|
||||
312
Makefile.am
Normal file
312
Makefile.am
Normal file
@@ -0,0 +1,312 @@
|
||||
#******************************************************************************
|
||||
# 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
|
||||
|
||||
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$(srcdir)/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/mat4x2.h \
|
||||
include/cglm/mat4x3.h \
|
||||
include/cglm/mat3.h \
|
||||
include/cglm/mat3x2.h \
|
||||
include/cglm/mat3x4.h \
|
||||
include/cglm/mat2.h \
|
||||
include/cglm/mat2x3.h \
|
||||
include/cglm/mat2x4.h \
|
||||
include/cglm/affine-pre.h \
|
||||
include/cglm/affine-post.h \
|
||||
include/cglm/affine.h \
|
||||
include/cglm/affine-mat.h \
|
||||
include/cglm/vec2.h \
|
||||
include/cglm/vec2-ext.h \
|
||||
include/cglm/ivec2.h \
|
||||
include/cglm/vec3.h \
|
||||
include/cglm/vec3-ext.h \
|
||||
include/cglm/ivec3.h \
|
||||
include/cglm/vec4.h \
|
||||
include/cglm/vec4-ext.h \
|
||||
include/cglm/ivec4.h \
|
||||
include/cglm/euler.h \
|
||||
include/cglm/util.h \
|
||||
include/cglm/quat.h \
|
||||
include/cglm/plane.h \
|
||||
include/cglm/noise.h \
|
||||
include/cglm/frustum.h \
|
||||
include/cglm/box.h \
|
||||
include/cglm/aabb2d.h \
|
||||
include/cglm/color.h \
|
||||
include/cglm/project.h \
|
||||
include/cglm/sphere.h \
|
||||
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_clipspacedir=$(includedir)/cglm/clipspace
|
||||
cglm_clipspace_HEADERS = include/cglm/clipspace/persp.h \
|
||||
include/cglm/clipspace/persp_lh_no.h \
|
||||
include/cglm/clipspace/persp_lh_zo.h \
|
||||
include/cglm/clipspace/persp_rh_no.h \
|
||||
include/cglm/clipspace/persp_rh_zo.h \
|
||||
include/cglm/clipspace/ortho_lh_no.h \
|
||||
include/cglm/clipspace/ortho_lh_zo.h \
|
||||
include/cglm/clipspace/ortho_rh_no.h \
|
||||
include/cglm/clipspace/ortho_rh_zo.h \
|
||||
include/cglm/clipspace/view_lh.h \
|
||||
include/cglm/clipspace/view_rh.h \
|
||||
include/cglm/clipspace/view_lh_no.h \
|
||||
include/cglm/clipspace/view_lh_zo.h \
|
||||
include/cglm/clipspace/view_rh_no.h \
|
||||
include/cglm/clipspace/view_rh_zo.h \
|
||||
include/cglm/clipspace/project_no.h \
|
||||
include/cglm/clipspace/project_zo.h
|
||||
|
||||
cglm_calldir=$(includedir)/cglm/call
|
||||
cglm_call_HEADERS = include/cglm/call/mat4.h \
|
||||
include/cglm/call/mat4x2.h \
|
||||
include/cglm/call/mat4x3.h \
|
||||
include/cglm/call/mat3.h \
|
||||
include/cglm/call/mat3x2.h \
|
||||
include/cglm/call/mat3x4.h \
|
||||
include/cglm/call/mat2.h \
|
||||
include/cglm/call/mat2x3.h \
|
||||
include/cglm/call/mat2x4.h \
|
||||
include/cglm/call/vec2.h \
|
||||
include/cglm/call/vec3.h \
|
||||
include/cglm/call/vec4.h \
|
||||
include/cglm/call/ivec2.h \
|
||||
include/cglm/call/ivec3.h \
|
||||
include/cglm/call/ivec4.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/noise.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/affine.h \
|
||||
include/cglm/call/affine2d.h \
|
||||
include/cglm/call/aabb2d.h
|
||||
|
||||
cglm_call_clipspacedir=$(includedir)/cglm/call/clipspace
|
||||
cglm_call_clipspace_HEADERS = include/cglm/call/clipspace/persp_lh_no.h \
|
||||
include/cglm/call/clipspace/persp_lh_zo.h \
|
||||
include/cglm/call/clipspace/persp_rh_no.h \
|
||||
include/cglm/call/clipspace/persp_rh_zo.h \
|
||||
include/cglm/call/clipspace/ortho_lh_no.h \
|
||||
include/cglm/call/clipspace/ortho_lh_zo.h \
|
||||
include/cglm/call/clipspace/ortho_rh_no.h \
|
||||
include/cglm/call/clipspace/ortho_rh_zo.h \
|
||||
include/cglm/call/clipspace/view_lh_no.h \
|
||||
include/cglm/call/clipspace/view_lh_zo.h \
|
||||
include/cglm/call/clipspace/view_rh_no.h \
|
||||
include/cglm/call/clipspace/view_rh_zo.h \
|
||||
include/cglm/call/clipspace/project_no.h \
|
||||
include/cglm/call/clipspace/project_zo.h
|
||||
|
||||
cglm_simddir=$(includedir)/cglm/simd
|
||||
cglm_simd_HEADERS = include/cglm/simd/intrin.h \
|
||||
include/cglm/simd/x86.h \
|
||||
include/cglm/simd/arm.h \
|
||||
include/cglm/simd/wasm.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/affine.h \
|
||||
include/cglm/simd/neon/mat2.h \
|
||||
include/cglm/simd/neon/mat4.h \
|
||||
include/cglm/simd/neon/quat.h
|
||||
|
||||
cglm_simd_wasmdir=$(includedir)/cglm/simd/wasm
|
||||
cglm_simd_wasm_HEADERS = include/cglm/simd/wasm/affine.h \
|
||||
include/cglm/simd/wasm/mat2.h \
|
||||
include/cglm/simd/wasm/mat3.h \
|
||||
include/cglm/simd/wasm/mat4.h \
|
||||
include/cglm/simd/wasm/quat.h
|
||||
|
||||
cglm_handeddir=$(includedir)/cglm/handed
|
||||
cglm_handed_HEADERS = include/cglm/handed/euler_to_quat_lh.h \
|
||||
include/cglm/handed/euler_to_quat_rh.h
|
||||
|
||||
cglm_structdir=$(includedir)/cglm/struct
|
||||
cglm_struct_HEADERS = include/cglm/struct/mat4.h \
|
||||
include/cglm/struct/mat4x2.h \
|
||||
include/cglm/struct/mat4x3.h \
|
||||
include/cglm/struct/mat3.h \
|
||||
include/cglm/struct/mat3x2.h \
|
||||
include/cglm/struct/mat3x4.h \
|
||||
include/cglm/struct/mat2.h \
|
||||
include/cglm/struct/mat2x3.h \
|
||||
include/cglm/struct/mat2x4.h \
|
||||
include/cglm/struct/affine-pre.h \
|
||||
include/cglm/struct/affine-post.h \
|
||||
include/cglm/struct/affine-mat.h \
|
||||
include/cglm/struct/affine.h \
|
||||
include/cglm/struct/affine2d.h \
|
||||
include/cglm/struct/vec2.h \
|
||||
include/cglm/struct/vec2-ext.h \
|
||||
include/cglm/struct/ivec2.h \
|
||||
include/cglm/struct/vec3.h \
|
||||
include/cglm/struct/vec3-ext.h \
|
||||
include/cglm/struct/ivec3.h \
|
||||
include/cglm/struct/vec4.h \
|
||||
include/cglm/struct/vec4-ext.h \
|
||||
include/cglm/struct/ivec4.h \
|
||||
include/cglm/struct/io.h \
|
||||
include/cglm/struct/cam.h \
|
||||
include/cglm/struct/quat.h \
|
||||
include/cglm/struct/euler.h \
|
||||
include/cglm/struct/plane.h \
|
||||
include/cglm/struct/noise.h \
|
||||
include/cglm/struct/frustum.h \
|
||||
include/cglm/struct/box.h \
|
||||
include/cglm/struct/aabb2d.h \
|
||||
include/cglm/struct/project.h \
|
||||
include/cglm/struct/sphere.h \
|
||||
include/cglm/struct/color.h \
|
||||
include/cglm/struct/curve.h \
|
||||
include/cglm/struct/ray.h
|
||||
|
||||
cglm_struct_clipspacedir=$(includedir)/cglm/struct/clipspace
|
||||
cglm_struct_clipspace_HEADERS = include/cglm/struct/clipspace/persp_lh_no.h \
|
||||
include/cglm/struct/clipspace/persp_lh_zo.h \
|
||||
include/cglm/struct/clipspace/persp_rh_no.h \
|
||||
include/cglm/struct/clipspace/persp_rh_zo.h \
|
||||
include/cglm/struct/clipspace/ortho_lh_no.h \
|
||||
include/cglm/struct/clipspace/ortho_lh_zo.h \
|
||||
include/cglm/struct/clipspace/ortho_rh_no.h \
|
||||
include/cglm/struct/clipspace/ortho_rh_zo.h \
|
||||
include/cglm/struct/clipspace/view_lh_no.h \
|
||||
include/cglm/struct/clipspace/view_lh_zo.h \
|
||||
include/cglm/struct/clipspace/view_rh_no.h \
|
||||
include/cglm/struct/clipspace/view_rh_zo.h \
|
||||
include/cglm/struct/clipspace/project_no.h \
|
||||
include/cglm/struct/clipspace/project_zo.h
|
||||
|
||||
cglm_struct_handeddir=$(includedir)/cglm/struct/handed
|
||||
cglm_struct_handed_HEADERS = include/cglm/struct/handed/euler_to_quat_lh.h \
|
||||
include/cglm/struct/handed/euler_to_quat_rh.h
|
||||
|
||||
libcglm_la_SOURCES=\
|
||||
src/euler.c \
|
||||
src/affine.c \
|
||||
src/io.c \
|
||||
src/quat.c \
|
||||
src/cam.c \
|
||||
src/vec2.c \
|
||||
src/ivec2.c \
|
||||
src/vec3.c \
|
||||
src/ivec3.c \
|
||||
src/vec4.c \
|
||||
src/ivec4.c \
|
||||
src/mat2.c \
|
||||
src/mat2x3.c \
|
||||
src/mat2x4.c \
|
||||
src/mat3.c \
|
||||
src/mat3x2.c \
|
||||
src/mat3x4.c \
|
||||
src/mat4.c \
|
||||
src/mat4x2.c \
|
||||
src/mat4x3.c \
|
||||
src/plane.c \
|
||||
src/noise.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 \
|
||||
src/aabb2d.c \
|
||||
src/clipspace/ortho_lh_no.c \
|
||||
src/clipspace/ortho_lh_zo.c \
|
||||
src/clipspace/ortho_rh_no.c \
|
||||
src/clipspace/ortho_rh_zo.c \
|
||||
src/clipspace/persp_lh_no.c \
|
||||
src/clipspace/persp_lh_zo.c \
|
||||
src/clipspace/persp_rh_no.c \
|
||||
src/clipspace/persp_rh_zo.c \
|
||||
src/clipspace/view_lh_no.c \
|
||||
src/clipspace/view_lh_zo.c \
|
||||
src/clipspace/view_rh_no.c \
|
||||
src/clipspace/view_rh_zo.c \
|
||||
src/clipspace/project_no.c \
|
||||
src/clipspace/project_zo.c
|
||||
|
||||
test_tests_SOURCES=\
|
||||
test/runner.c \
|
||||
test/src/test_common.c \
|
||||
test/src/tests.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
|
||||
)
|
||||
300
README.md
300
README.md
@@ -1,29 +1,167 @@
|
||||
# 🎥 OpenGL Mathematics (glm) for `C`
|
||||
[](https://travis-ci.org/recp/cglm)
|
||||
[](https://ci.appveyor.com/project/recp/cglm/branch/master)
|
||||
[](https://coveralls.io/github/recp/cglm?branch=master)
|
||||
[](https://www.codacy.com/app/recp/cglm?utm_source=github.com&utm_medium=referral&utm_content=recp/cglm&utm_campaign=Badge_Grade)
|
||||
|
||||
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 `__register`
|
||||
<p align="center">
|
||||
<img alt="" src="cglm.png" width="550" />
|
||||
</p>
|
||||
<br>
|
||||
<p align="center">
|
||||
<a href="https://github.com/recp/cglm/actions/workflows/ci.yml">
|
||||
<img src="https://github.com/recp/cglm/actions/workflows/ci.yml/badge.svg"
|
||||
alt="Build Status">
|
||||
</a>
|
||||
<a href="http://cglm.readthedocs.io/en/latest/?badge=latest">
|
||||
<img src="https://readthedocs.org/projects/cglm/badge/?version=latest"
|
||||
alt="Documentation Status">
|
||||
</a>
|
||||
<a href="https://www.codacy.com/app/recp/cglm?utm_source=github.com&utm_medium=referral&utm_content=recp/cglm&utm_campaign=Badge_Grade">
|
||||
<img src="https://api.codacy.com/project/badge/Grade/6a62b37d5f214f178ebef269dc4a6bf1"
|
||||
alt="Codacy Badge"/>
|
||||
</a>
|
||||
<a href="https://coveralls.io/github/recp/cglm?branch=master">
|
||||
<img src="https://coveralls.io/repos/github/recp/cglm/badge.svg?branch=master"
|
||||
alt="Coverage Status"/>
|
||||
</a>
|
||||
<a href="https://codecov.io/gh/recp/cglm">
|
||||
<img src="https://codecov.io/gh/recp/cglm/branch/master/graph/badge.svg"
|
||||
alt="Coverage Status"/>
|
||||
</a>
|
||||
<br /><br />
|
||||
<a href="#sponsors">
|
||||
<img src="https://opencollective.com/cglm/sponsors/badge.svg"
|
||||
alt="Sponsors on Open Collective"/>
|
||||
</a>
|
||||
<a href="#backers">
|
||||
<img src="https://opencollective.com/cglm/backers/badge.svg"
|
||||
alt="Backers on Open Collective"/>
|
||||
</a>
|
||||
</p>
|
||||
|
||||
#### Note for previous versions:
|
||||
<br>
|
||||
|
||||
- _dup (duplicate) is changed to _copy. For instance `glm_vec_dup -> glm_vec_copy`
|
||||
- OpenGL related functions are dropped to make this lib platform/third-party independent
|
||||
- make sure you have latest version and feel free to report bugs, troubles
|
||||
<p align="center">
|
||||
A highly optimized 2D|3D math library. Also known as OpenGL Mathematics (glm) for C. <b>cglm</b> provides fast and ergonomic math functions to ease graphics programming. It is community friendly – feel free to report any bugs and issues you face. <br>
|
||||
<i>If you're using C++, you might want to check out <a href="https://github.com/g-truc/glm">GLM</a></i>
|
||||
</p>
|
||||
|
||||
#### Note for C++ developers:
|
||||
If you don't aware about original GLM library yet, you may also want to look at:
|
||||
https://github.com/g-truc/glm
|
||||
- Allocation-free
|
||||
- Header-only
|
||||
- SIMD-optimized
|
||||
- API-agnostic
|
||||
|
||||
---
|
||||
|
||||
### 📚 Documentation
|
||||
|
||||
All functions and their parameters are documented above their declaration inside their corresponding headers. <br />
|
||||
Alternatively, you can read the complete documentation [here](http://cglm.readthedocs.io).
|
||||
|
||||
### 🔨 Building
|
||||
|
||||
cglm can be used in it's entirety as a header-only library simply by including `cglm/cglm.h`. If you wish to link against it instead, it can be built using one of the supported build systems. Detailed information about building on individual platforms and build systems along with the instructions for building the documentation can be found in [BUILDING.md](./BUILDING.md).
|
||||
|
||||
### ✅ Usage
|
||||
|
||||
#### Header-only
|
||||
|
||||
Include the `cglm/cglm.h` header and use functions with the `glm_` prefix.
|
||||
```c
|
||||
#include "cglm/cglm.h"
|
||||
|
||||
// ...
|
||||
|
||||
vec2 vector;
|
||||
glm_vec2_zero(vector);
|
||||
```
|
||||
|
||||
#### Struct API
|
||||
|
||||
Include `cglm/struct.h` and use `glms_`.
|
||||
```c
|
||||
#include "cglm/struct.h"
|
||||
|
||||
// ...
|
||||
|
||||
vec2s vector = glms_vec2_zero();
|
||||
```
|
||||
|
||||
#### Linked
|
||||
|
||||
Include `cglm/call.h` and use `glmc_`.
|
||||
```c
|
||||
#include "cglm/call.h"
|
||||
|
||||
// ...
|
||||
|
||||
vec2 vector;
|
||||
glmc_vec2_zero(vector);
|
||||
```
|
||||
|
||||
### ❗ Alignment
|
||||
|
||||
While cglm by default aligns what's necessary, it is possible to disable this by defining `CGLM_ALL_UNALIGNED`. If you're targeting machines with any kind of SIMD support, make sure that all `vec4`, `mat4` and `mat2` arguments you pass to cglm functions are aligned to prevent unexpected crashes, alternatively use the unaligned versions if present.
|
||||
|
||||
### Struct API
|
||||
|
||||
The struct API works as follows (note the `s` suffix on types, `glms_` prefix on functions and `GLMS_` on constants):
|
||||
|
||||
```C
|
||||
#include <cglm/struct.h>
|
||||
|
||||
mat4s mat = GLMS_MAT4_IDENTITY_INIT;
|
||||
mat4s inv = glms_mat4_inv(mat);
|
||||
```
|
||||
|
||||
Struct functions generally take parameters *by copy* and *return* the results rather than taking pointers and writing to out parameters. That means your variables can usually be `const`, if you're into that.
|
||||
|
||||
The types used are actually unions that allow access to the same data in multiple ways. One of these involves anonymous structures available since C11. MSVC supports them in earlier versions out of the box and GCC/Clang as well if you enable `-fms-extensions`.
|
||||
To explicitly enable anonymous structures `#define CGLM_USE_ANONYMOUS_STRUCT 1`, or `0` to disable them.
|
||||
For backwards compatibility, you can also `#define CGLM_NO_ANONYMOUS_STRUCT` to disable them. If you don't specify explicitly, cglm will attempt a best guess based on your compiler and C version.
|
||||
|
||||
### 📌 Migration notes:
|
||||
|
||||
- `_dup` (duplicate) functions were renamed to `_copy`. For instance: `glm_vec_dup` -> `glm_vec3_copy`.
|
||||
- OpenGL related functions were dropped to make cglm API independent.
|
||||
- **[bugfix]** Euler angles had been previously implemented in reverse order (extrinsic). This was fixed to be intrinsic.
|
||||
- **[major change]** Starting with **v0.4.0**, quaternions are stored as [x, y, z, w]. Previously it was [w, x, y, z].
|
||||
- **[api rename]** Starting with **v0.4.5**, `glm_simd_` functions are renamed to `glmm_`.
|
||||
- **[new option]** Starting with **v0.4.5**, alignment requirements can be disabled. Read more in the documentation.
|
||||
- **[major change]** Starting with **v0.5.0**, vec3 functions occupy the **glm_vec3_** namespace. This used to be **glm_vec_** in earlier versions.
|
||||
- **[major change]** Starting with **v0.5.1**, `vec3` and `mat3` types are not aligned by default.
|
||||
- **[major change]** Starting with **v0.7.3**, inline print functions are disabled by default in release mode to eliminate printing costs (see the Options chapter of the docs). <br> Colored output can be disabled (see documentation).
|
||||
- **[major change]** Starting with **v0.8.3**, alternate clipspace configurations are supported. The `CGLM_FORCE_DEPTH_ZERO_TO_ONE` and `CGLM_FORCE_LEFT_HANDED` flags are provided to control clip depth and handedness. This makes it easier to incorporate cglm into projects using graphics APIs such as Vulkan or Metal. See https://cglm.readthedocs.io/en/latest/opt.html#clipspace-option-s
|
||||
|
||||
### 🚀 Features
|
||||
|
||||
- scalar and simd (sse, avx, neon...) optimizations
|
||||
- general purpose matrix operations (mat4, mat3)
|
||||
- chain matrix multiplication (square only)
|
||||
- general purpose vector operations (cross, dot, rotate, proj, angle...)
|
||||
- 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
|
||||
- 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...)
|
||||
- comversion helpers from cglm types to Apple's simd library to pass cglm types to Metal GL without packing them on both sides
|
||||
- ray intersection helpers
|
||||
---
|
||||
|
||||
<table>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
<div>Like some other graphics libraries (especially OpenGL) this library use Column-Major layout to keep matrices in the memory. </div>
|
||||
<div>Like other graphics libraries (especially OpenGL), cglm uses column-major layout to keep matrices in memory. </div>
|
||||
<div> </div>
|
||||
<div>In the future the library may support an option to use row-major layout, CURRENTLY if you need to row-major layout you will need to transpose it. </div>
|
||||
<div>While we might support row-major matrices in the future, currently if you need your matrices to be in row-major layout you have to transpose them. </div>
|
||||
</td>
|
||||
<td>
|
||||
<img src="https://upload.wikimedia.org/wikipedia/commons/3/3f/Matrix_Columns.svg" width="300px" />
|
||||
@@ -32,51 +170,9 @@ https://github.com/g-truc/glm
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
## 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
|
||||
---
|
||||
|
||||
<hr />
|
||||
|
||||
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.
|
||||
To call pre-compiled version, just use `glmc_` (c stands for 'call') instead of `glm_`.
|
||||
|
||||
```C
|
||||
#include <cglm.h> /* for inline */
|
||||
#include <cglm-call.h> /* for library call (this also includes cglm.h) */
|
||||
|
||||
mat4 rot, trans, rt;
|
||||
/* ... */
|
||||
glm_mul(trans, rot, rt); /* inline */
|
||||
glmc_mul(trans, rot, rt); /* call from library */
|
||||
```
|
||||
Most of math functions are optimized manualy with SSE2 if available, if not? Dont worry there are non-sse versions of all operations
|
||||
|
||||
You can pass matrices and vectors as array to functions rather than get address.
|
||||
|
||||
```C
|
||||
mat4 m = {
|
||||
1, 0, 0, 0,
|
||||
0, 1, 0, 0,
|
||||
0, 0, 1, 0,
|
||||
0, 0, 0, 1
|
||||
};
|
||||
|
||||
glm_translate(m, (vec3){1.0f, 0.0f, 0.0f});
|
||||
```
|
||||
|
||||
Library contains general purpose mat4 mul and inverse functions 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
|
||||
cglm contains general purpose mat4 product and inverse functions but also provides optimized versions for affine transformations. If you want to multiply two affine transformation matrices you can use glm_mul instead of glm_mat4_mul and glm_inv_tr (ROT + TR) instead glm_mat4_inv.
|
||||
```C
|
||||
/* multiplication */
|
||||
mat4 modelMat;
|
||||
@@ -86,76 +182,30 @@ glm_mul(T, R, modelMat);
|
||||
glm_inv_tr(modelMat);
|
||||
```
|
||||
|
||||
## License
|
||||
MIT. check the LICENSE file
|
||||
## Contributors
|
||||
|
||||
## Build
|
||||
|
||||
### Unix (Autotools)
|
||||
|
||||
```text
|
||||
$ sh ./build-deps.sh # run only once (dependencies)
|
||||
$
|
||||
$ sh autogen.sh
|
||||
$ ./configure
|
||||
$ make
|
||||
$ make install
|
||||
$ [sudo] make install
|
||||
```
|
||||
|
||||
### Windows (MSBuild)
|
||||
Windows related build files, project files are located in `win` folder,
|
||||
make sure you are inside `cglm/win` folder.
|
||||
Code Analysis are enabled, it may take awhile to build
|
||||
|
||||
```Powershell
|
||||
$ cd win
|
||||
$ .\build.bat
|
||||
```
|
||||
if `msbuild` won't work (because of multi version VS) then try to build with `devenv`:
|
||||
```Powershell
|
||||
$ devenv cglm.sln /Build Release
|
||||
```
|
||||
|
||||
## How to use
|
||||
If you want to use inline versions of funcstions then; include main header
|
||||
```C
|
||||
#include <cglm.h>
|
||||
```
|
||||
the haeder will include all headers. Then call func you want e.g. rotate vector by axis:
|
||||
```C
|
||||
glm_vec_rotate(v1, glm_rad(45), (vec3){1.0f, 0.0f, 0.0f});
|
||||
```
|
||||
some functions are overloaded :) e.g you can normalize vector:
|
||||
```C
|
||||
glm_vec_normalize(vec);
|
||||
```
|
||||
this will normalize vec and store normalized vector into `vec` but if you will store normalized vector into another vector do this:
|
||||
```C
|
||||
glm_vec_normalize_to(vec, result);
|
||||
```
|
||||
like this function you may see `_to` postfix, this functions store results to another variables and save temp memory
|
||||
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>
|
||||
|
||||
|
||||
to call pre-compiled versions include header with `c` postfix, c means call. Pre-compiled versions are just wrappers.
|
||||
```C
|
||||
#include <cglm-call.h>
|
||||
```
|
||||
this header will include all heaers with c postfix. You need to call functions with c posfix:
|
||||
```C
|
||||
glmc_vec_normalize(vec);
|
||||
```
|
||||
## Backers
|
||||
|
||||
Function usage and parameters are documented inside related headers.
|
||||
## Notes
|
||||
Thank you to all our backers! 🙏 [[Become a backer](https://opencollective.com/cglm#backer)]
|
||||
|
||||
- This library uses float types only, does not support Integers, Double... yet
|
||||
- If headers are not working properly with your compiler, IDE please open an issue, because I'm using GCC and clang to test it maybe sometimes MSVC
|
||||
<a href="https://opencollective.com/cglm#backers" target="_blank"><img src="https://opencollective.com/cglm/backers.svg?width=890"></a>
|
||||
|
||||
**TODO:**
|
||||
- [ ] Unit tests
|
||||
- [ ] Unit tests for comparing cglm with glm results
|
||||
- [x] Add version info
|
||||
- [ ] Unaligned operations (e.g. `glm_umat4_mul`)
|
||||
- [ ] Extra documentation
|
||||
- [ ] ARM Neon Arch
|
||||
|
||||
## 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>
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
image: Visual Studio 2017
|
||||
|
||||
build_script:
|
||||
- ps: >-
|
||||
cd win
|
||||
|
||||
.\build.bat
|
||||
16
autogen.sh
Normal file → Executable file
16
autogen.sh
Normal file → Executable file
@@ -6,16 +6,16 @@
|
||||
# Full license can be found in the LICENSE file
|
||||
#
|
||||
|
||||
cd `dirname "$0"`
|
||||
|
||||
if [ "`uname`" = "Darwin" ]; then
|
||||
libtoolBin=$(which glibtoolize)
|
||||
libtoolBinDir=$(dirname "${libtoolBin}")
|
||||
ln -s $libtoolBin "${libtoolBinDir}/libtoolize"
|
||||
fi
|
||||
cd $(dirname "$0")
|
||||
|
||||
autoheader
|
||||
libtoolize
|
||||
|
||||
if [ "$(uname)" = "Darwin" ]; then
|
||||
glibtoolize
|
||||
else
|
||||
libtoolize
|
||||
fi
|
||||
|
||||
aclocal -I m4
|
||||
autoconf
|
||||
automake --add-missing --copy
|
||||
|
||||
@@ -1,30 +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
|
||||
|
||||
# fix glibtoolize
|
||||
|
||||
cd $(dirname "$0")
|
||||
|
||||
if [ "$(uname)" = "Darwin" ]; then
|
||||
libtoolBin=$(which glibtoolize)
|
||||
libtoolBinDir=$(dirname "${libtoolBin}")
|
||||
ln -s $libtoolBin "${libtoolBinDir}/libtoolize"
|
||||
fi
|
||||
|
||||
# general deps: gcc make autoconf automake libtool cmake
|
||||
|
||||
# test - cmocka
|
||||
cd ./test/lib/cmocka
|
||||
mkdir 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@
|
||||
37
cglm.podspec
Normal file
37
cglm.podspec
Normal file
@@ -0,0 +1,37 @@
|
||||
Pod::Spec.new do |s|
|
||||
|
||||
# Description
|
||||
s.name = "cglm"
|
||||
s.version = "0.9.5"
|
||||
s.summary = "📽 Highly Optimized Graphics Math (glm) for C"
|
||||
s.description = <<-DESC
|
||||
cglm is math library for graphics programming for C. See the documentation or README for all features.
|
||||
DESC
|
||||
|
||||
s.documentation_url = "http://cglm.readthedocs.io"
|
||||
|
||||
# Home
|
||||
s.homepage = "https://github.com/recp/cglm"
|
||||
s.license = { :type => "MIT", :file => "LICENSE" }
|
||||
s.author = { "Recep Aslantas" => "recp@acm.org" }
|
||||
|
||||
# Sources
|
||||
s.source = { :git => "https://github.com/recp/cglm.git", :tag => "v#{s.version}" }
|
||||
s.source_files = "src", "include/cglm/**/*.h"
|
||||
s.public_header_files = "include", "include/cglm/**/*.h"
|
||||
s.exclude_files = "src/win/*", "src/dllmain.c", "src/**/*.h"
|
||||
s.preserve_paths = "include", "src"
|
||||
s.header_mappings_dir = "include"
|
||||
|
||||
# Linking
|
||||
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
|
||||
24
configure.ac
24
configure.ac
@@ -7,13 +7,30 @@
|
||||
#*****************************************************************************
|
||||
|
||||
AC_PREREQ([2.69])
|
||||
AC_INIT([cglm], [0.2.0], [info@recp.me])
|
||||
AM_INIT_AUTOMAKE([-Wall -Werror foreign subdir-objects])
|
||||
AC_INIT([cglm], [0.9.6], [info@recp.me])
|
||||
AM_INIT_AUTOMAKE([-Wall foreign subdir-objects serial-tests])
|
||||
|
||||
# Don't use the default cflags (-O2 -g), we set ours manually in Makefile.am.
|
||||
: ${CFLAGS=""}
|
||||
|
||||
AC_CONFIG_MACRO_DIR([m4])
|
||||
AC_CONFIG_SRCDIR([src/])
|
||||
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.
|
||||
AC_PROG_CC
|
||||
AM_PROG_CC_C_O
|
||||
@@ -29,6 +46,7 @@ LT_INIT
|
||||
# Checks for libraries.
|
||||
AC_CHECK_LIB([m], [floor])
|
||||
|
||||
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
|
||||
AC_SYS_LARGEFILE
|
||||
|
||||
# Checks for header files.
|
||||
@@ -52,6 +70,6 @@ AC_TYPE_UINT8_T
|
||||
# Checks for library functions.
|
||||
AC_FUNC_ERROR_AT_LINE
|
||||
|
||||
AC_CONFIG_FILES([makefile])
|
||||
AC_CONFIG_FILES([Makefile cglm.pc])
|
||||
|
||||
AC_OUTPUT
|
||||
|
||||
36
docs/make.bat
Executable file
36
docs/make.bat
Executable file
@@ -0,0 +1,36 @@
|
||||
@ECHO OFF
|
||||
|
||||
pushd %~dp0
|
||||
|
||||
REM Command file for Sphinx documentation
|
||||
|
||||
if "%SPHINXBUILD%" == "" (
|
||||
set SPHINXBUILD=python -msphinx
|
||||
)
|
||||
set SOURCEDIR=source
|
||||
set BUILDDIR=build
|
||||
set SPHINXPROJ=cglm
|
||||
|
||||
if "%1" == "" goto help
|
||||
|
||||
%SPHINXBUILD% >NUL 2>NUL
|
||||
if errorlevel 9009 (
|
||||
echo.
|
||||
echo.The Sphinx module was not found. Make sure you have Sphinx installed,
|
||||
echo.then set the SPHINXBUILD environment variable to point to the full
|
||||
echo.path of the 'sphinx-build' executable. Alternatively you may add the
|
||||
echo.Sphinx directory to PATH.
|
||||
echo.
|
||||
echo.If you don't have Sphinx installed, grab it from
|
||||
echo.http://sphinx-doc.org/
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS%
|
||||
goto end
|
||||
|
||||
:help
|
||||
%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS%
|
||||
|
||||
:end
|
||||
popd
|
||||
4
docs/requirements.txt
Normal file
4
docs/requirements.txt
Normal file
@@ -0,0 +1,4 @@
|
||||
# Defining the exact version will make sure things don't break
|
||||
sphinx==7.2.6
|
||||
sphinx_rtd_theme==2.0.0
|
||||
readthedocs-sphinx-search==0.3.2
|
||||
198
docs/source/aabb2d.rst
Normal file
198
docs/source/aabb2d.rst
Normal file
@@ -0,0 +1,198 @@
|
||||
.. default-domain:: C
|
||||
|
||||
2d axis aligned bounding box (AABB)
|
||||
================================================================================
|
||||
|
||||
Header: cglm/aabb2d.h
|
||||
|
||||
Some convenient functions provided for AABB.
|
||||
|
||||
**Definition of aabb:**
|
||||
|
||||
cglm defines an aabb as a two dimensional array of vec2's.
|
||||
The first element is the **min** point and the second one is the **max** point.
|
||||
If you have another type e.g. struct or even another representation then you must
|
||||
convert it before and after calling a cglm aabb2d function.
|
||||
|
||||
Table of contents (click to go):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Macros:
|
||||
|
||||
1. :c:func:`glm_aabb2d_size`
|
||||
|
||||
Functions:
|
||||
|
||||
1. :c:func:`glm_aabb2d_copy`
|
||||
#. :c:func:`glm_aabb2d_zero`
|
||||
#. :c:func:`glm_aabb2d_transform`
|
||||
#. :c:func:`glm_aabb2d_merge`
|
||||
#. :c:func:`glm_aabb2d_crop`
|
||||
#. :c:func:`glm_aabb2d_crop_until`
|
||||
#. :c:func:`glm_aabb2d_invalidate`
|
||||
#. :c:func:`glm_aabb2d_isvalid`
|
||||
#. :c:func:`glm_aabb2d_diag`
|
||||
#. :c:func:`glm_aabb2d_sizev`
|
||||
#. :c:func:`glm_aabb2d_radius`
|
||||
#. :c:func:`glm_aabb2d_center`
|
||||
#. :c:func:`glm_aabb2d_aabb`
|
||||
#. :c:func:`glm_aabb2d_circle`
|
||||
#. :c:func:`glm_aabb2d_point`
|
||||
#. :c:func:`glm_aabb2d_contains`
|
||||
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. c:function:: void glm_aabb2d_copy(vec2 aabb[2], vec2 dest[2])
|
||||
|
||||
| copy all members of [aabb] to [dest]
|
||||
|
||||
Parameters:
|
||||
| *[in]* **aabb** bounding box
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_aabb2d_zero(vec2 aabb[2])
|
||||
|
||||
| makes all members of [aabb] 0.0f (zero)
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **aabb** bounding box
|
||||
|
||||
.. c:function:: void glm_aabb2d_transform(vec2 aabb[2], mat3 m, vec2 dest[2])
|
||||
|
||||
| apply transform to Axis-Aligned Bounding Box
|
||||
|
||||
Parameters:
|
||||
| *[in]* **aabb** bounding box
|
||||
| *[in]* **m** transform matrix
|
||||
| *[out]* **dest** transformed bounding box
|
||||
|
||||
.. c:function:: void glm_aabb2d_merge(vec2 aabb1[2], vec2 aabb2[2], vec2 dest[2])
|
||||
|
||||
| merges two AABB bounding box and creates new one
|
||||
|
||||
two aabb must be in the same space
|
||||
|
||||
Parameters:
|
||||
| *[in]* **aabb1** bounding box 1
|
||||
| *[in]* **aabb2** bounding box 2
|
||||
| *[out]* **dest** merged bounding box
|
||||
|
||||
.. c:function:: void glm_aabb2d_crop(vec2 aabb[2], vec2 cropAabb[2], vec2 dest[2])
|
||||
|
||||
| crops a bounding box with another one.
|
||||
|
||||
this could be useful for getting a bbox which fits with view frustum and
|
||||
object bounding boxes. In this case you crop view frustum box with objects
|
||||
box
|
||||
|
||||
Parameters:
|
||||
| *[in]* **aabb** bounding box 1
|
||||
| *[in]* **cropAabb** crop box
|
||||
| *[out]* **dest** cropped bounding box
|
||||
|
||||
.. c:function:: void glm_aabb2d_crop_until(vec2 aabb[2], vec2 cropAabb[2], vec2 clampAabb[2], vec2 dest[2])
|
||||
|
||||
| crops a bounding box with another one.
|
||||
|
||||
this could be useful for getting a bbox which fits with view frustum and
|
||||
object bounding boxes. In this case you crop view frustum box with objects
|
||||
box
|
||||
|
||||
Parameters:
|
||||
| *[in]* **aabb** bounding box
|
||||
| *[in]* **cropAabb** crop box
|
||||
| *[in]* **clampAabb** minimum box
|
||||
| *[out]* **dest** cropped bounding box
|
||||
|
||||
.. c:function:: void glm_aabb2d_invalidate(vec2 aabb[2])
|
||||
|
||||
| invalidate AABB min and max values
|
||||
|
||||
| It fills *max* values with -FLT_MAX and *min* values with +FLT_MAX
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **aabb** bounding box
|
||||
|
||||
.. c:function:: bool glm_aabb2d_isvalid(vec2 aabb[2])
|
||||
|
||||
| check if AABB is valid or not
|
||||
|
||||
Parameters:
|
||||
| *[in]* **aabb** bounding box
|
||||
|
||||
Returns:
|
||||
returns true if aabb is valid otherwise false
|
||||
|
||||
.. c:function:: float glm_aabb2d_diag(vec2 aabb[2])
|
||||
|
||||
| distance between min and max
|
||||
|
||||
Parameters:
|
||||
| *[in]* **aabb** bounding box
|
||||
|
||||
Returns:
|
||||
distance between min - max
|
||||
|
||||
|
||||
.. c:function:: void glm_aabb2d_sizev(vec2 aabb[2], vec2 dest)
|
||||
|
||||
| size vector of aabb
|
||||
|
||||
Parameters:
|
||||
| *[in]* **aabb** bounding box
|
||||
| *[out]* **dest** size vector
|
||||
|
||||
Returns:
|
||||
size vector of aabb max - min
|
||||
|
||||
.. c:function:: float glm_aabb2d_radius(vec2 aabb[2])
|
||||
|
||||
| radius of sphere which surrounds AABB
|
||||
|
||||
Parameters:
|
||||
| *[in]* **aabb** bounding box
|
||||
|
||||
.. c:function:: void glm_aabb2d_center(vec2 aabb[2], vec2 dest)
|
||||
|
||||
| computes center point of AABB
|
||||
|
||||
Parameters:
|
||||
| *[in]* **aabb** bounding box
|
||||
| *[out]* **dest** center of bounding box
|
||||
|
||||
.. c:function:: bool glm_aabb2d_aabb(vec2 aabb[2], vec2 other[2])
|
||||
|
||||
| check if two AABB intersects
|
||||
|
||||
Parameters:
|
||||
| *[in]* **aabb** bounding box
|
||||
| *[out]* **other** other bounding box
|
||||
|
||||
.. c:function:: bool glm_aabb2d_circle(vec2 aabb[2], vec3 c)
|
||||
|
||||
| check if AABB intersects with sphere
|
||||
|
||||
| https://github.com/erich666/GraphicsGems/blob/master/gems/BoxSphere.c
|
||||
| Solid Box - Solid Sphere test.
|
||||
|
||||
Parameters:
|
||||
| *[in]* **aabb** solid bounding box
|
||||
| *[out]* **c** solid circle
|
||||
|
||||
.. c:function:: bool glm_aabb2d_point(vec2 aabb[2], vec2 point)
|
||||
|
||||
| check if point is inside of AABB
|
||||
|
||||
Parameters:
|
||||
| *[in]* **aabb** bounding box
|
||||
| *[out]* **point** point
|
||||
|
||||
.. c:function:: bool glm_aabb2d_contains(vec2 aabb[2], vec2 other[2])
|
||||
|
||||
| check if AABB contains other AABB
|
||||
|
||||
Parameters:
|
||||
| *[in]* **aabb** bounding box
|
||||
| *[out]* **other** other bounding box
|
||||
|
||||
129
docs/source/affine-common.rst
Normal file
129
docs/source/affine-common.rst
Normal file
@@ -0,0 +1,129 @@
|
||||
.. default-domain:: C
|
||||
|
||||
3D Affine Transforms (common)
|
||||
================================================================================
|
||||
|
||||
Common transform functions.
|
||||
|
||||
Table of contents (click to go):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Functions:
|
||||
|
||||
1. :c:func:`glm_translate_make`
|
||||
#. :c:func:`glm_scale_to`
|
||||
#. :c:func:`glm_scale_make`
|
||||
#. :c:func:`glm_scale`
|
||||
#. :c:func:`glm_scale_uni`
|
||||
#. :c:func:`glm_rotate_make`
|
||||
#. :c:func:`glm_rotate_atm`
|
||||
#. :c:func:`glm_decompose_scalev`
|
||||
#. :c:func:`glm_uniscaled`
|
||||
#. :c:func:`glm_decompose_rs`
|
||||
#. :c:func:`glm_decompose`
|
||||
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. c:function:: void glm_translate_make(mat4 m, vec3 v)
|
||||
|
||||
creates NEW translate transform matrix by *v* vector.
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** affine transform
|
||||
| *[in]* **v** translate vector [x, y, z]
|
||||
|
||||
.. c:function:: void glm_scale_to(mat4 m, vec3 v, mat4 dest)
|
||||
|
||||
scale existing transform matrix by *v* vector and store result in dest
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** affine transform
|
||||
| *[in]* **v** scale vector [x, y, z]
|
||||
| *[out]* **dest** scaled matrix
|
||||
|
||||
.. c:function:: void glm_scale_make(mat4 m, vec3 v)
|
||||
|
||||
creates NEW scale matrix by v vector
|
||||
|
||||
Parameters:
|
||||
| *[out]* **m** affine transform
|
||||
| *[in]* **v** scale vector [x, y, z]
|
||||
|
||||
.. c:function:: void glm_scale(mat4 m, vec3 v)
|
||||
|
||||
scales existing transform matrix by v vector
|
||||
and stores result in same matrix
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** affine transform
|
||||
| *[in]* **v** scale vector [x, y, z]
|
||||
|
||||
.. c:function:: void glm_scale_uni(mat4 m, float s)
|
||||
|
||||
applies uniform scale to existing transform matrix v = [s, s, s]
|
||||
and stores result in same matrix
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** affine transform
|
||||
| *[in]* **v** scale factor
|
||||
|
||||
.. c:function:: void glm_rotate_make(mat4 m, float angle, vec3 axis)
|
||||
|
||||
creates NEW rotation matrix by angle and axis,
|
||||
axis will be normalized so you don't need to normalize it
|
||||
|
||||
Parameters:
|
||||
| *[out]* **m** affine transform
|
||||
| *[in]* **axis** angle (radians)
|
||||
| *[in]* **axis** axis
|
||||
|
||||
.. c:function:: void glm_rotate_atm(mat4 m, vec3 pivot, float angle, vec3 axis)
|
||||
|
||||
| creates NEW rotation matrix by angle and axis at given point
|
||||
| this creates rotation matrix, it assumes you don't have a matrix
|
||||
|
||||
| this should work faster than glm_rotate_at because it reduces one glm_translate.
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** affine transform
|
||||
| *[in]* **pivot** pivot, anchor point, rotation center
|
||||
| *[in]* **angle** angle (radians)
|
||||
| *[in]* **axis** axis
|
||||
|
||||
.. c:function:: void glm_decompose_scalev(mat4 m, vec3 s)
|
||||
|
||||
decompose scale vector
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** affine transform
|
||||
| *[out]* **s** scale vector (Sx, Sy, Sz)
|
||||
|
||||
.. c:function:: bool glm_uniscaled(mat4 m)
|
||||
|
||||
returns true if matrix is uniform scaled.
|
||||
This is helpful for creating normal matrix.
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** matrix
|
||||
|
||||
.. c:function:: void glm_decompose_rs(mat4 m, mat4 r, vec3 s)
|
||||
|
||||
decompose rotation matrix (mat4) and scale vector [Sx, Sy, Sz]
|
||||
DON'T pass projected matrix here
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** affine transform
|
||||
| *[out]* **r** rotation matrix
|
||||
| *[out]* **s** scale matrix
|
||||
|
||||
.. c:function:: void glm_decompose(mat4 m, vec4 t, mat4 r, vec3 s)
|
||||
|
||||
decompose affine transform, TODO: extract shear factors.
|
||||
DON'T pass projected matrix here
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** affine transform
|
||||
| *[out]* **t** translation vector
|
||||
| *[out]* **r** rotation matrix (mat4)
|
||||
| *[out]* **s** scaling vector [X, Y, Z]
|
||||
99
docs/source/affine-mat.rst
Normal file
99
docs/source/affine-mat.rst
Normal file
@@ -0,0 +1,99 @@
|
||||
.. default-domain:: C
|
||||
|
||||
3D Affine Transform Matrix (specialized functions)
|
||||
================================================================================
|
||||
|
||||
Header: cglm/affine-mat.h
|
||||
|
||||
We mostly use glm_mat4_* for 4x4 general and transform matrices. **cglm**
|
||||
provides optimized version of some functions. Because affine transform matrix is
|
||||
a known format, for instance all last item of first three columns is zero.
|
||||
|
||||
You should be careful when using these functions. For instance :c:func:`glm_mul`
|
||||
assumes matrix will be this format:
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
R R R X
|
||||
R R R Y
|
||||
R R R Z
|
||||
0 0 0 W
|
||||
|
||||
if you override zero values here then use :c:func:`glm_mat4_mul` version.
|
||||
You cannot use :c:func:`glm_mul` anymore.
|
||||
|
||||
Same is also true for :c:func:`glm_inv_tr` if you only have rotation and
|
||||
translation then it will work as expected, otherwise you cannot use that.
|
||||
|
||||
In the future it may accept scale factors too but currently it does not.
|
||||
|
||||
Table of contents (click func go):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Functions:
|
||||
|
||||
1. :c:func:`glm_mul`
|
||||
#. :c:func:`glm_mul_rot`
|
||||
#. :c:func:`glm_inv_tr`
|
||||
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. c:function:: void glm_mul(mat4 m1, mat4 m2, mat4 dest)
|
||||
|
||||
| this is similar to glm_mat4_mul but specialized to affine transform
|
||||
|
||||
Matrix format should be:
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
R R R X
|
||||
R R R Y
|
||||
R R R Z
|
||||
0 0 0 W
|
||||
|
||||
this reduces some multiplications. It should be faster than mat4_mul.
|
||||
if you are not sure about matrix format then DON'T use this! use mat4_mul
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m1** affine matrix 1
|
||||
| *[in]* **m2** affine matrix 2
|
||||
| *[out]* **dest** result matrix
|
||||
|
||||
.. c:function:: void glm_mul_rot(mat4 m1, mat4 m2, mat4 dest)
|
||||
|
||||
| this is similar to glm_mat4_mul but specialized to rotation matrix
|
||||
|
||||
Right Matrix format should be (left is free):
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
R R R 0
|
||||
R R R 0
|
||||
R R R 0
|
||||
0 0 0 1
|
||||
|
||||
this reduces some multiplications. It should be faster than mat4_mul.
|
||||
if you are not sure about matrix format then DON'T use this! use mat4_mul
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m1** affine matrix 1
|
||||
| *[in]* **m2** affine matrix 2
|
||||
| *[out]* **dest** result matrix
|
||||
|
||||
.. c:function:: void glm_inv_tr(mat4 mat)
|
||||
|
||||
| inverse orthonormal rotation + translation matrix (ridig-body)
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
X = | R T | X' = | R' -R'T |
|
||||
| 0 1 | | 0 1 |
|
||||
|
||||
use this if you only have rotation + translation, this should work faster
|
||||
than :c:func:`glm_mat4_inv`
|
||||
|
||||
Don't use this if your matrix includes other things e.g. scale, shear...
|
||||
|
||||
Parameters:
|
||||
| *[in,out]* **mat** affine matrix
|
||||
127
docs/source/affine-post.rst
Normal file
127
docs/source/affine-post.rst
Normal file
@@ -0,0 +1,127 @@
|
||||
.. default-domain:: C
|
||||
|
||||
3D Affine Transforms (post)
|
||||
================================================================================
|
||||
|
||||
Post transform functions are similar to pre transform functions except order of application is reversed.
|
||||
Post transform functions are applied after the object is transformed with given (model matrix) transform.
|
||||
|
||||
Table of contents (click to go):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Functions:
|
||||
|
||||
1. :c:func:`glm_translated_to`
|
||||
#. :c:func:`glm_translated`
|
||||
#. :c:func:`glm_translated_x`
|
||||
#. :c:func:`glm_translated_y`
|
||||
#. :c:func:`glm_translated_z`
|
||||
#. :c:func:`glm_rotated_x`
|
||||
#. :c:func:`glm_rotated_y`
|
||||
#. :c:func:`glm_rotated_z`
|
||||
#. :c:func:`glm_rotated`
|
||||
#. :c:func:`glm_rotated_at`
|
||||
#. :c:func:`glm_spinned`
|
||||
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. c:function:: void glm_translated_to(mat4 m, vec3 v, mat4 dest)
|
||||
|
||||
translate existing transform matrix by *v* vector and store result in dest
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** affine transform
|
||||
| *[in]* **v** translate vector [x, y, z]
|
||||
| *[out]* **dest** translated matrix
|
||||
|
||||
.. c:function:: void glm_translated(mat4 m, vec3 v)
|
||||
|
||||
translate existing transform matrix by *v* vector
|
||||
and stores result in same matrix
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** affine transform
|
||||
| *[in]* **v** translate vector [x, y, z]
|
||||
|
||||
.. c:function:: void glm_translated_x(mat4 m, float x)
|
||||
|
||||
translate existing transform matrix by x factor
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** affine transform
|
||||
| *[in]* **v** x factor
|
||||
|
||||
.. c:function:: void glm_translated_y(mat4 m, float y)
|
||||
|
||||
translate existing transform matrix by *y* factor
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** affine transform
|
||||
| *[in]* **v** y factor
|
||||
|
||||
.. c:function:: void glm_translated_z(mat4 m, float z)
|
||||
|
||||
translate existing transform matrix by *z* factor
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** affine transform
|
||||
| *[in]* **v** z factor
|
||||
|
||||
.. c:function:: void glm_rotated_x(mat4 m, float angle, mat4 dest)
|
||||
|
||||
rotate existing transform matrix around X axis by angle
|
||||
and store result in dest
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** affine transform
|
||||
| *[in]* **angle** angle (radians)
|
||||
| *[out]* **dest** rotated matrix
|
||||
|
||||
.. c:function:: void glm_rotated_y(mat4 m, float angle, mat4 dest)
|
||||
|
||||
rotate existing transform matrix around Y axis by angle
|
||||
and store result in dest
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** affine transform
|
||||
| *[in]* **angle** angle (radians)
|
||||
| *[out]* **dest** rotated matrix
|
||||
|
||||
.. c:function:: void glm_rotated_z(mat4 m, float angle, mat4 dest)
|
||||
|
||||
rotate existing transform matrix around Z axis by angle
|
||||
and store result in dest
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** affine transform
|
||||
| *[in]* **angle** angle (radians)
|
||||
| *[out]* **dest** rotated matrix
|
||||
|
||||
.. c:function:: void glm_rotated(mat4 m, float angle, vec3 axis)
|
||||
|
||||
rotate existing transform matrix around Z axis by angle and axis
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** affine transform
|
||||
| *[in]* **angle** angle (radians)
|
||||
| *[in]* **axis** axis
|
||||
|
||||
.. c:function:: void glm_rotated_at(mat4 m, vec3 pivot, float angle, vec3 axis)
|
||||
|
||||
rotate existing transform around given axis by angle at given pivot point (rotation center)
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** affine transform
|
||||
| *[in]* **pivot** pivot, anchor point, rotation center
|
||||
| *[in]* **angle** angle (radians)
|
||||
| *[in]* **axis** axis
|
||||
|
||||
.. c:function:: void glm_spinned(mat4 m, float angle, vec3 axis)
|
||||
|
||||
| rotate existing transform matrix around given axis by angle around self (doesn't affected by position)
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** affine transform
|
||||
| *[in]* **angle** angle (radians)
|
||||
| *[in]* **axis** axis
|
||||
154
docs/source/affine-pre.rst
Normal file
154
docs/source/affine-pre.rst
Normal file
@@ -0,0 +1,154 @@
|
||||
.. default-domain:: C
|
||||
|
||||
3D Affine Transforms (pre)
|
||||
================================================================================
|
||||
|
||||
Pre transform functions which are regular transform functions.
|
||||
|
||||
Table of contents (click to go):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Functions:
|
||||
|
||||
1. :c:func:`glm_translate_to`
|
||||
#. :c:func:`glm_translate`
|
||||
#. :c:func:`glm_translate_x`
|
||||
#. :c:func:`glm_translate_y`
|
||||
#. :c:func:`glm_translate_z`
|
||||
#. :c:func:`glm_translate_make`
|
||||
#. :c:func:`glm_scale_to`
|
||||
#. :c:func:`glm_scale_make`
|
||||
#. :c:func:`glm_scale`
|
||||
#. :c:func:`glm_scale_uni`
|
||||
#. :c:func:`glm_rotate_x`
|
||||
#. :c:func:`glm_rotate_y`
|
||||
#. :c:func:`glm_rotate_z`
|
||||
#. :c:func:`glm_rotate_make`
|
||||
#. :c:func:`glm_rotate`
|
||||
#. :c:func:`glm_rotate_at`
|
||||
#. :c:func:`glm_rotate_atm`
|
||||
#. :c:func:`glm_decompose_scalev`
|
||||
#. :c:func:`glm_uniscaled`
|
||||
#. :c:func:`glm_decompose_rs`
|
||||
#. :c:func:`glm_decompose`
|
||||
#. :c:func:`glm_spin`
|
||||
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. c:function:: void glm_translate_to(mat4 m, vec3 v, mat4 dest)
|
||||
|
||||
translate existing transform matrix by *v* vector and store result in dest
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** affine transform
|
||||
| *[in]* **v** translate vector [x, y, z]
|
||||
| *[out]* **dest** translated matrix
|
||||
|
||||
.. c:function:: void glm_translate(mat4 m, vec3 v)
|
||||
|
||||
translate existing transform matrix by *v* vector
|
||||
and stores result in same matrix
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** affine transform
|
||||
| *[in]* **v** translate vector [x, y, z]
|
||||
|
||||
.. c:function:: void glm_translate_x(mat4 m, float x)
|
||||
|
||||
translate existing transform matrix by x factor
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** affine transform
|
||||
| *[in]* **v** x factor
|
||||
|
||||
.. c:function:: void glm_translate_y(mat4 m, float y)
|
||||
|
||||
translate existing transform matrix by *y* factor
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** affine transform
|
||||
| *[in]* **v** y factor
|
||||
|
||||
.. c:function:: void glm_translate_z(mat4 m, float z)
|
||||
|
||||
translate existing transform matrix by *z* factor
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** affine transform
|
||||
| *[in]* **v** z factor
|
||||
|
||||
.. c:function:: void glm_rotate_x(mat4 m, float angle, mat4 dest)
|
||||
|
||||
rotate existing transform matrix around X axis by angle
|
||||
and store result in dest
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** affine transform
|
||||
| *[in]* **angle** angle (radians)
|
||||
| *[out]* **dest** rotated matrix
|
||||
|
||||
.. c:function:: void glm_rotate_y(mat4 m, float angle, mat4 dest)
|
||||
|
||||
rotate existing transform matrix around Y axis by angle
|
||||
and store result in dest
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** affine transform
|
||||
| *[in]* **angle** angle (radians)
|
||||
| *[out]* **dest** rotated matrix
|
||||
|
||||
.. c:function:: void glm_rotate_z(mat4 m, float angle, mat4 dest)
|
||||
|
||||
rotate existing transform matrix around Z axis by angle
|
||||
and store result in dest
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** affine transform
|
||||
| *[in]* **angle** angle (radians)
|
||||
| *[out]* **dest** rotated matrix
|
||||
|
||||
.. c:function:: void glm_rotate(mat4 m, float angle, vec3 axis)
|
||||
|
||||
rotate existing transform matrix around given axis by angle at ORIGIN (0,0,0)
|
||||
|
||||
**❗️IMPORTANT ❗️**
|
||||
|
||||
If you need to rotate object around itself e.g. center of object or at
|
||||
some point [of object] then `glm_rotate_at()` would be better choice to do so.
|
||||
|
||||
Even if object's model transform is identity, rotation may not be around
|
||||
center of object if object does not lay out at ORIGIN perfectly.
|
||||
|
||||
Using `glm_rotate_at()` with center of bounding shape ( AABB, Sphere ... )
|
||||
would be an easy option to rotate around object if object is not at origin.
|
||||
|
||||
One another option to rotate around itself at any point is `glm_spin()`
|
||||
which is perfect if only rotating around model position is desired e.g. not
|
||||
specific point on model for instance center of geometry or center of mass,
|
||||
again if geometry is not perfectly centered at origin at identity transform,
|
||||
rotation may not be around geometry.
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** affine transform
|
||||
| *[in]* **angle** angle (radians)
|
||||
| *[in]* **axis** axis
|
||||
|
||||
.. c:function:: void glm_rotate_at(mat4 m, vec3 pivot, float angle, vec3 axis)
|
||||
|
||||
rotate existing transform around given axis by angle at given pivot point (rotation center)
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** affine transform
|
||||
| *[in]* **pivot** pivot, anchor point, rotation center
|
||||
| *[in]* **angle** angle (radians)
|
||||
| *[in]* **axis** axis
|
||||
|
||||
.. c:function:: void glm_spin(mat4 m, float angle, vec3 axis)
|
||||
|
||||
| rotate existing transform matrix around given axis by angle around self (doesn't affected by position)
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** affine transform
|
||||
| *[in]* **angle** angle (radians)
|
||||
| *[in]* **axis** axis
|
||||
196
docs/source/affine.rst
Normal file
196
docs/source/affine.rst
Normal file
@@ -0,0 +1,196 @@
|
||||
.. default-domain:: C
|
||||
|
||||
3D Affine Transforms
|
||||
================================================================================
|
||||
|
||||
Header: cglm/affine.h
|
||||
|
||||
Before starting, **cglm** provides two kind of transform functions; pre and post.
|
||||
|
||||
Pre functions (`T' = Tnew * T`) are like `glm_translate`, `glm_rotate` which means it will translate the vector first and then apply the model transformation.
|
||||
Post functions (`T' = T * Tnew`) are like `glm_translated`, `glm_rotated` which means it will apply the model transformation first and then translate the vector.
|
||||
|
||||
`glm_translate`, `glm_rotate` are pre functions and are similar to C++ **glm** which you are familiar with.
|
||||
|
||||
In new versions of **cglm** we added `glm_translated`, `glm_rotated`... which are post functions,
|
||||
they are useful in some cases, e.g. append transform to existing transform (apply/append transform as last transform T' = T * Tnew).
|
||||
|
||||
Post functions are named after pre functions with `ed` suffix, e.g. `glm_translate` -> `glm_translated`. So don't mix them up.
|
||||
|
||||
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 transform functions.
|
||||
|
||||
There are also functions to decompose transform matrix. These functions can't
|
||||
decompose matrix after projected.
|
||||
|
||||
Rotation Center
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Rotating functions uses origin as rotation center (pivot/anchor point),
|
||||
since scale factors are stored in rotation matrix, same may also true for scalling.
|
||||
cglm provides some functions for rotating around at given point e.g.
|
||||
**glm_rotate_at**, **glm_quat_rotate_at**. Use them or follow next section for algorithm ("Rotate or Scale around specific Point (Pivot Point / Anchor Point)").
|
||||
|
||||
Also **cglm** provides :c:func:`glm_spin` and :c:func:`glm_spinned` functions to rotate around itself. No need to give pivot.
|
||||
These functions are useful for rotating around center of object.
|
||||
|
||||
Rotate or Scale around specific Point (Anchor Point)
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
If you want to rotate model around arbitrary point follow these steps:
|
||||
|
||||
1. Move model from pivot point to origin: **translate(-pivot.x, -pivot.y, -pivot.z)**
|
||||
2. Apply rotation (or scaling maybe)
|
||||
3. Move model back from origin to pivot (reverse of step-1): **translate(pivot.x, pivot.y, pivot.z)**
|
||||
|
||||
**glm_rotate_at**, **glm_quat_rotate_at** and their helper functions works that way.
|
||||
So if you use them you don't need to do these steps manually which are done by **cglm**.
|
||||
|
||||
The implementation would be:
|
||||
|
||||
.. code-block:: c
|
||||
:linenos:
|
||||
|
||||
glm_translate(m, pivot);
|
||||
glm_rotate(m, angle, axis);
|
||||
glm_translate(m, pivotInv); /* pivotInv = -pivot */
|
||||
|
||||
or just:
|
||||
|
||||
.. code-block:: c
|
||||
:linenos:
|
||||
|
||||
glm_rotate_at(m, pivot, angle, axis);
|
||||
|
||||
.. _TransformsOrder:
|
||||
|
||||
Transforms Order
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
It is important to understand this part especially if you call transform
|
||||
functions multiple times
|
||||
|
||||
`glm_translate`, `glm_rotate`, `glm_scale` and `glm_quat_rotate` and their
|
||||
helpers functions works like this (cglm provides reverse order as `ed` suffix e.g `glm_translated`, `glm_rotated` see post transforms):
|
||||
|
||||
.. code-block:: c
|
||||
:linenos:
|
||||
|
||||
TransformMatrix = TransformMatrix * TranslateMatrix; // glm_translate()
|
||||
TransformMatrix = TransformMatrix * RotateMatrix; // glm_rotate(), glm_quat_rotate()
|
||||
TransformMatrix = TransformMatrix * ScaleMatrix; // glm_scale()
|
||||
|
||||
As you can see it is multiplied as right matrix. For instance what will happen if you call `glm_translate` twice?
|
||||
|
||||
.. code-block:: c
|
||||
:linenos:
|
||||
|
||||
glm_translate(transform, translate1); /* transform = transform * translate1 */
|
||||
glm_translate(transform, translate2); /* transform = transform * translate2 */
|
||||
glm_rotate(transform, angle, axis) /* transform = transform * rotation */
|
||||
|
||||
Now lets try to understand this:
|
||||
|
||||
1. You call translate using `translate1` and you expect it will be first transform
|
||||
because you call it first, do you?
|
||||
|
||||
Result will be **`transform = transform * translate1`**
|
||||
|
||||
2. Then you call translate using `translate2` and you expect it will be second transform?
|
||||
|
||||
Result will be **`transform = transform * translate2`**. Now lets expand transform,
|
||||
it was `transform * translate1` before second call.
|
||||
|
||||
Now it is **`transform = transform * translate1 * translate2`**, now do you understand what I say?
|
||||
|
||||
3. After last call transform will be:
|
||||
|
||||
**`transform = transform * translate1 * translate2 * rotation`**
|
||||
|
||||
The order will be; **rotation will be applied first**, then **translate2** then **translate1**
|
||||
|
||||
It is all about matrix multiplication order. It is similar to MVP matrix:
|
||||
`MVP = Projection * View * Model`, model will be applied first, then view then projection.
|
||||
|
||||
**Confused?**
|
||||
|
||||
In the end the last function call applied first in shaders.
|
||||
|
||||
As alternative way, you can create transform matrices individually then combine manually,
|
||||
but don't forget that `glm_translate`, `glm_rotate`, `glm_scale`... are optimized and should be faster (an smaller assembly output) than manual multiplication
|
||||
|
||||
.. code-block:: c
|
||||
:linenos:
|
||||
|
||||
mat4 transform1, transform2, transform3, finalTransform;
|
||||
|
||||
glm_translate_make(transform1, translate1);
|
||||
glm_translate_make(transform2, translate2);
|
||||
glm_rotate_make(transform3, angle, axis);
|
||||
|
||||
/* first apply transform1, then transform2, thentransform3 */
|
||||
glm_mat4_mulN((mat4 *[]){&transform3, &transform2, &transform1}, 3, finalTransform);
|
||||
|
||||
/* if you don't want to use mulN, same as above */
|
||||
glm_mat4_mul(transform3, transform2, finalTransform);
|
||||
glm_mat4_mul(finalTransform, transform1, finalTransform);
|
||||
|
||||
Now transform1 will be applied first, then transform2 then transform3
|
||||
|
||||
Table of contents (click to go):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Functions:
|
||||
|
||||
1. :c:func:`glm_translate_to`
|
||||
#. :c:func:`glm_translate`
|
||||
#. :c:func:`glm_translate_x`
|
||||
#. :c:func:`glm_translate_y`
|
||||
#. :c:func:`glm_translate_z`
|
||||
#. :c:func:`glm_translate_make`
|
||||
#. :c:func:`glm_scale_to`
|
||||
#. :c:func:`glm_scale_make`
|
||||
#. :c:func:`glm_scale`
|
||||
#. :c:func:`glm_scale_uni`
|
||||
#. :c:func:`glm_rotate_x`
|
||||
#. :c:func:`glm_rotate_y`
|
||||
#. :c:func:`glm_rotate_z`
|
||||
#. :c:func:`glm_rotate_make`
|
||||
#. :c:func:`glm_rotate`
|
||||
#. :c:func:`glm_rotate_at`
|
||||
#. :c:func:`glm_rotate_atm`
|
||||
#. :c:func:`glm_decompose_scalev`
|
||||
#. :c:func:`glm_uniscaled`
|
||||
#. :c:func:`glm_decompose_rs`
|
||||
#. :c:func:`glm_decompose`
|
||||
|
||||
Post functions (**NEW**):
|
||||
|
||||
1. :c:func:`glm_translated_to`
|
||||
#. :c:func:`glm_translated`
|
||||
#. :c:func:`glm_translated_x`
|
||||
#. :c:func:`glm_translated_y`
|
||||
#. :c:func:`glm_translated_z`
|
||||
#. :c:func:`glm_rotated_x`
|
||||
#. :c:func:`glm_rotated_y`
|
||||
#. :c:func:`glm_rotated_z`
|
||||
#. :c:func:`glm_rotated`
|
||||
#. :c:func:`glm_rotated_at`
|
||||
#. :c:func:`glm_spinned`
|
||||
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
:caption: Affine categories:
|
||||
|
||||
affine-common
|
||||
affine-pre
|
||||
affine-post
|
||||
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 transform 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 transform
|
||||
| *[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 transform
|
||||
| *[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 transform
|
||||
| *[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 transform
|
||||
| *[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 transform
|
||||
| *[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 transform
|
||||
| *[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 transform
|
||||
| *[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 transform
|
||||
| *[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 transform
|
||||
| *[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 transform
|
||||
| *[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 transform
|
||||
| *[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 transform
|
||||
| *[in]* **angle** angle (radians)
|
||||
| *[out]* **dest** rotated matrix
|
||||
28
docs/source/api.rst
Normal file
28
docs/source/api.rst
Normal file
@@ -0,0 +1,28 @@
|
||||
📚 API documentation
|
||||
================================
|
||||
|
||||
**cglm** provides a few APIs for similar functions.
|
||||
|
||||
* 📦 **Inline API**: All functions are inline. You can include **cglm/cglm.h** header
|
||||
to use this API. This is the default API. `glm_` is namespace/prefix for this API.
|
||||
* 📦 **Call API**: All functions are not inline. You need to build *cglm* and link it
|
||||
to your project. You can include **cglm/call.h** header to use this API. `glmc_` is namespace/prefix for this API.
|
||||
|
||||
And also there are also sub categories:
|
||||
|
||||
* 📦 **Array API**: Types are raw arrays and functions takes array as argument. You can include **cglm/cglm.h** header
|
||||
to use this API. This is the default API. `glm_` is namespace/prefix for this API.
|
||||
* 📦 **Struct API**: Types are union/struct and functions takes struct as argument and return structs if needed. You can include **cglm/struct.h** header
|
||||
to use this API. This also includes **cglm/cglm.h** header.`glms_` is namespace/prefix for this API but your can omit or change it, see struct api docs.
|
||||
* 📦 **SIMD API**: SIMD functions and helpers. `glmm_` is namespace/prefix for this API.
|
||||
|
||||
📌 Since struct api and call api are built top of inline array api, follow inline array api docs for individual functions.
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
:caption: API documentations:
|
||||
|
||||
api_inline_array
|
||||
api_struct
|
||||
api_call
|
||||
api_simd
|
||||
11
docs/source/api_call.rst
Normal file
11
docs/source/api_call.rst
Normal file
@@ -0,0 +1,11 @@
|
||||
Call API
|
||||
================================
|
||||
|
||||
Call API is pre-built API for making calls from library. It is built on top of the array api. **glmc_** is the namespace for the call api.
|
||||
**c** stands for call.
|
||||
|
||||
You need to built cglm to use call api. See build instructions (:doc:`build`) for more details.
|
||||
|
||||
The functions except namespace **glmc_** are same as inline api. See ( :doc:`api_inline_array` ) for more details.
|
||||
|
||||
📌 In the future we can define option to forward inline functions or struct api to call api.
|
||||
78
docs/source/api_inline_array.rst
Normal file
78
docs/source/api_inline_array.rst
Normal file
@@ -0,0 +1,78 @@
|
||||
Array API - Inline (Default)
|
||||
========================================
|
||||
|
||||
This is the default API of *cglm*. All functions are forced to be inlined
|
||||
and struct api, call api uses this inline api to share implementation.
|
||||
|
||||
📌 Call api is also array api but it is not inlined.
|
||||
In the future there may be option to forward struct api to call api instead of inline api to reduce binary size if needed.
|
||||
|
||||
📌 **USE this API docs for similar functions in struct and call api**
|
||||
|
||||
📌 In struct api you can omit namespace e.g :code:`glms_vec3_dot` can be called as :code:`vec3_dot` in struct api, see :doc:`api_struct` to configure struct api for more details.
|
||||
📌 In struct api functions can return struct/union
|
||||
📌 In struct api you can access items like **.x**, **.y**, **.z**, **.w**, **.r**, **.g**, **.b**, **.a**, **.m00**, **m01**...
|
||||
|
||||
Some functions may exist twice, once for their namespace and once for global namespace
|
||||
to make easier to write very common functions
|
||||
|
||||
For instance, in general we use :code:`glm_vec3_dot` to get dot product
|
||||
of two **vec3**. Now we can also do this with :code:`glm_dot`,
|
||||
same for *_cross* and so on...
|
||||
|
||||
The original function stays where it is, the function in global namespace
|
||||
of same name is just an alias, so there is no call version of those functions.
|
||||
e.g there is no func like :code:`glmc_dot` because *glm_dot* is just alias for
|
||||
:code:`glm_vec3_dot`
|
||||
|
||||
By including **cglm/cglm.h** header you will include all inline version
|
||||
of functions. Since functions in this header[s] are inline you don't need to
|
||||
build or link *cglm* against your project.
|
||||
|
||||
But by including **cglm/call.h** header you will include all *non-inline*
|
||||
version of functions. You need to build *cglm* and link it.
|
||||
Follow the :doc:`build` documentation for this
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
:caption: API categories:
|
||||
|
||||
affine
|
||||
affine-mat
|
||||
affine2d
|
||||
cam
|
||||
frustum
|
||||
box
|
||||
aabb2d
|
||||
quat
|
||||
euler
|
||||
mat2
|
||||
mat2x3
|
||||
mat2x4
|
||||
mat3
|
||||
mat3x2
|
||||
mat3x4
|
||||
mat4
|
||||
mat4x2
|
||||
mat4x3
|
||||
vec2
|
||||
vec2-ext
|
||||
vec3
|
||||
vec3-ext
|
||||
vec4
|
||||
vec4-ext
|
||||
ivec2
|
||||
ivec3
|
||||
ivec4
|
||||
color
|
||||
plane
|
||||
noise
|
||||
project
|
||||
util
|
||||
io
|
||||
call
|
||||
sphere
|
||||
curve
|
||||
bezier
|
||||
version
|
||||
ray
|
||||
12
docs/source/api_simd.rst
Normal file
12
docs/source/api_simd.rst
Normal file
@@ -0,0 +1,12 @@
|
||||
SIMD API
|
||||
================================
|
||||
|
||||
SIMD api is special api for SIMD operations. **glmm_** prefix is used for SIMD operations in cglm. It is used in many places in cglm.
|
||||
You can use it for your own SIMD operations too. In the future the api may be extended by time.
|
||||
|
||||
Supported SIMD architectures ( may vary by time )
|
||||
|
||||
* SSE / SSE2
|
||||
* AVX
|
||||
* NEON
|
||||
* WASM 128
|
||||
101
docs/source/api_struct.rst
Normal file
101
docs/source/api_struct.rst
Normal file
@@ -0,0 +1,101 @@
|
||||
Struct API
|
||||
================================
|
||||
|
||||
Struct API is alternative API to array api to use **cglm** with improved type safety and easy to use.
|
||||
Since struct api is built top of array api, every struct API is not documented here.
|
||||
See array api documentation for more information for individual functions.
|
||||
|
||||
By default struct api adds `s` suffix to every type name e.g. vec3s, mat4s, versors etc.
|
||||
Also struct api `s` suffix to namespace e.g. `glms_vec3_add`, `glms_mat4_mul` etc.
|
||||
|
||||
By starting v0.9.0, struct api namespace is configurable. We can omit **glms_** namespace or
|
||||
even change it with custom name to move existing api integrations to **cglm** more easily...
|
||||
We can also add **s** to function names if we want e.g. `glms_vec3_add()` -> `vec3_add()` or `vec3s_add()`.
|
||||
|
||||
By including **cglm/struct.h** header you will include all struct api. It will also include **cglm/cglm.h** too.
|
||||
Since struct apis are inline you don't need to build or link *cglm* against
|
||||
your project unless if you want to use pre-built call-api too.
|
||||
|
||||
Struct API is built top of array api. So you can mix them.
|
||||
Use **.raw** union member to access raw array data to use it with array api.
|
||||
|
||||
Unlike array api ([0], [1], [0][0] ...), it is also possible to use struct api
|
||||
with **.x**, **.y**, **.z**, **.w**, **.r**, **.g**, **.b**, **.a**, **.m00**, **m01**...
|
||||
accessors to access individual elements/properties of vectors and matrices.
|
||||
|
||||
Struct API usage:
|
||||
-----------------
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
#include <cglm/struct.h>
|
||||
|
||||
mat4s m1 = glms_mat4_identity(); /* init... */
|
||||
mat4s m2 = glms_mat4_identity(); /* init... */
|
||||
mat4s m3 = glms_mat4_mul(glms_mat4_mul(m1, m2), glms_mat4_mul(m3, m4));
|
||||
|
||||
vec3s v1 = { 1.0f, 0.0f, 0.0f };
|
||||
vec3s v2 = { 0.0f, 1.0f, 0.0f };
|
||||
vec4s v4 = { 0.0f, 1.0f, 0.0f, 0.0f };
|
||||
vec4 v5a = { 0.0f, 1.0f, 0.0f, 0.0f };
|
||||
|
||||
mat4s m4 = glms_rotate(m3, M_PI_2,
|
||||
glms_vec3_cross(glms_vec3_add(v1, v6)
|
||||
glms_vec3_add(v1, v7)));
|
||||
|
||||
v1.x = 1.0f; v1.y = 0.0f; v1.z = 0.0f;
|
||||
// or
|
||||
v1.raw[0] = 1.0f; v1.raw[1] = 0.0f; v1.raw[2] = 0.0f;
|
||||
|
||||
/* use struct api with array api (mix them). */
|
||||
/* use .raw to access array and use it with array api */
|
||||
|
||||
glm_vec4_add(m4.col[0].raw, v5a, m4.col[0].raw);
|
||||
glm_mat4_mulv(m4.raw, v4.raw, v5a);
|
||||
|
||||
or omit `glms_` namespace completely (see options below):
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
#define CGLM_OMIT_NS_FROM_STRUCT_API
|
||||
|
||||
#include <cglm/struct.h>
|
||||
|
||||
mat4s m1 = mat4_identity(); /* init... */
|
||||
mat4s m2 = mat4_identity(); /* init... */
|
||||
mat4s m3 = mat4_mul(mat4_mul(m1, m2), mat4_mul(m3, m4));
|
||||
|
||||
vec3s v1 = { 1.0f, 0.0f, 0.0f };
|
||||
vec3s v2 = { 0.0f, 1.0f, 0.0f };
|
||||
vec4s v4 = { 0.0f, 1.0f, 0.0f, 0.0f };
|
||||
vec4 v5a = { 0.0f, 1.0f, 0.0f, 0.0f };
|
||||
|
||||
mat4s m4 = glms_rotate(m3, M_PI_2,
|
||||
vec3_cross(vec3_add(v1, v6)
|
||||
vec3_add(v1, v7)));
|
||||
|
||||
v1.x = 1.0f; v1.y = 0.0f; v1.z = 0.0f;
|
||||
// or
|
||||
v1.raw[0] = 1.0f; v1.raw[1] = 0.0f; v1.raw[2] = 0.0f;
|
||||
|
||||
/* use struct api with array api (mix them) */
|
||||
glm_vec4_add(m4.col[0].raw, v5a, m4.col[0].raw);
|
||||
glm_mat4_mulv(m4.raw, v4.raw, v5a);
|
||||
|
||||
Configuring the Struct API:
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
To configure the Struct API namespace, you can define the following macros before including the cglm/struct.h header:
|
||||
|
||||
- **CGLM_OMIT_NS_FROM_STRUCT_API**: omits CGLM_STRUCT_API_NS (`glms_`) namespace completely if there is sub namespace e.g `mat4_`, `vec4_` ... DEFAULT is not defined
|
||||
- **CGLM_STRUCT_API_NS**: define name space for struct api, DEFAULT is **glms**
|
||||
- **CGLM_STRUCT_API_NAME_SUFFIX**: define name suffix, DEFAULT is **empty** e.g defining it as #define CGLM_STRUCT_API_NAME_SUFFIX s will add s suffix to mat4_mul -> mat4s_mul
|
||||
|
||||
❗️ IMPORTANT ❗️
|
||||
|
||||
It's a good idea to set up your config macros in build settings like CMake, Xcode, or Visual Studio. This is especially important if you're using features like Modules in Xcode, where adding macros directly before the **cglm** headers might not work.
|
||||
|
||||
Detailed documentation for Struct API:
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Since struct api if built top of array api, see array api functions for more information about individual functions.
|
||||
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
|
||||
181
docs/source/box.rst
Normal file
181
docs/source/box.rst
Normal file
@@ -0,0 +1,181 @@
|
||||
.. default-domain:: C
|
||||
|
||||
axis aligned bounding box (AABB)
|
||||
================================================================================
|
||||
|
||||
Header: cglm/box.h
|
||||
|
||||
Some convenient functions provided for AABB.
|
||||
|
||||
**Definition of box:**
|
||||
|
||||
cglm defines box as two dimensional array of vec3.
|
||||
The first element is **min** point and the second one is **max** point.
|
||||
If you have another type e.g. struct or even another representation then you must
|
||||
convert it before and after call cglm box function.
|
||||
|
||||
Table of contents (click to go):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Functions:
|
||||
|
||||
1. :c:func:`glm_aabb_transform`
|
||||
#. :c:func:`glm_aabb_merge`
|
||||
#. :c:func:`glm_aabb_crop`
|
||||
#. :c:func:`glm_aabb_crop_until`
|
||||
#. :c:func:`glm_aabb_frustum`
|
||||
#. :c:func:`glm_aabb_invalidate`
|
||||
#. :c:func:`glm_aabb_isvalid`
|
||||
#. :c:func:`glm_aabb_size`
|
||||
#. :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
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. c:function:: void glm_aabb_transform(vec3 box[2], mat4 m, vec3 dest[2])
|
||||
|
||||
| apply transform to Axis-Aligned Bounding Box
|
||||
|
||||
Parameters:
|
||||
| *[in]* **box** bounding box
|
||||
| *[in]* **m** transform matrix
|
||||
| *[out]* **dest** transformed bounding box
|
||||
|
||||
.. c:function:: void glm_aabb_merge(vec3 box1[2], vec3 box2[2], vec3 dest[2])
|
||||
|
||||
| merges two AABB bounding box and creates new one
|
||||
|
||||
two box must be in same space, if one of box is in different space then
|
||||
you should consider to convert it's space by glm_box_space
|
||||
|
||||
Parameters:
|
||||
| *[in]* **box1** bounding box 1
|
||||
| *[in]* **box2** bounding box 2
|
||||
| *[out]* **dest** merged bounding box
|
||||
|
||||
.. c:function:: void glm_aabb_crop(vec3 box[2], vec3 cropBox[2], vec3 dest[2])
|
||||
|
||||
| crops a bounding box with another one.
|
||||
|
||||
this could be useful for getting a bbox which fits with view frustum and
|
||||
object bounding boxes. In this case you crop view frustum box with objects
|
||||
box
|
||||
|
||||
Parameters:
|
||||
| *[in]* **box** bounding box 1
|
||||
| *[in]* **cropBox** crop box
|
||||
| *[out]* **dest** cropped bounding box
|
||||
|
||||
.. c:function:: void glm_aabb_crop_until(vec3 box[2], vec3 cropBox[2], vec3 clampBox[2], vec3 dest[2])
|
||||
|
||||
| crops a bounding box with another one.
|
||||
|
||||
this could be useful for getting a bbox which fits with view frustum and
|
||||
object bounding boxes. In this case you crop view frustum box with objects
|
||||
box
|
||||
|
||||
Parameters:
|
||||
| *[in]* **box** bounding box
|
||||
| *[in]* **cropBox** crop box
|
||||
| *[in]* **clampBox** minimum box
|
||||
| *[out]* **dest** cropped bounding box
|
||||
|
||||
.. c:function:: bool glm_aabb_frustum(vec3 box[2], vec4 planes[6])
|
||||
|
||||
| check if AABB intersects with frustum planes
|
||||
|
||||
this could be useful for frustum culling using AABB.
|
||||
|
||||
OPTIMIZATION HINT:
|
||||
if planes order is similar to LEFT, RIGHT, BOTTOM, TOP, NEAR, FAR
|
||||
then this method should run even faster because it would only use two
|
||||
planes if object is not inside the two planes
|
||||
fortunately cglm extracts planes as this order! just pass what you got!
|
||||
|
||||
Parameters:
|
||||
| *[in]* **box** bounding box
|
||||
| *[out]* **planes** frustum planes
|
||||
|
||||
.. c:function:: void glm_aabb_invalidate(vec3 box[2])
|
||||
|
||||
| invalidate AABB min and max values
|
||||
|
||||
| It fills *max* values with -FLT_MAX and *min* values with +FLT_MAX
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **box** bounding box
|
||||
|
||||
.. c:function:: bool glm_aabb_isvalid(vec3 box[2])
|
||||
|
||||
| check if AABB is valid or not
|
||||
|
||||
Parameters:
|
||||
| *[in]* **box** bounding box
|
||||
|
||||
Returns:
|
||||
returns true if aabb is valid otherwise false
|
||||
|
||||
.. c:function:: float glm_aabb_size(vec3 box[2])
|
||||
|
||||
| distance between of min and max
|
||||
|
||||
Parameters:
|
||||
| *[in]* **box** bounding box
|
||||
|
||||
Returns:
|
||||
distance between min - max
|
||||
|
||||
.. c:function:: float glm_aabb_radius(vec3 box[2])
|
||||
|
||||
| radius of sphere which surrounds AABB
|
||||
|
||||
Parameters:
|
||||
| *[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
|
||||
153
docs/source/build.rst
Normal file
153
docs/source/build.rst
Normal file
@@ -0,0 +1,153 @@
|
||||
Build cglm
|
||||
================================
|
||||
|
||||
| **cglm** does not have any external dependencies.
|
||||
|
||||
.. note::
|
||||
If you only need to inline versions, you don't need to build **cglm**, you don't need to link it to your program.
|
||||
Just import cglm to your project as dependency / external lib by copy-paste then use it as usual
|
||||
|
||||
CMake (All platforms):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. code-block:: bash
|
||||
:linenos:
|
||||
|
||||
$ 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
|
||||
$ ./configure
|
||||
$ make
|
||||
$ make check # run tests (optional)
|
||||
$ [sudo] make install # install to system (optional)
|
||||
|
||||
**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.
|
||||
|
||||
Windows (MSBuild):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Windows related build files, project files are located in `win` folder,
|
||||
make sure you are inside in cglm/win folder.
|
||||
|
||||
Code Analysis are enabled, it may take awhile to build.
|
||||
|
||||
.. code-block:: bash
|
||||
:linenos:
|
||||
|
||||
$ cd win
|
||||
$ .\build.bat
|
||||
|
||||
if *msbuild* is not worked (because of multi versions of Visual Studio)
|
||||
then try to build with *devenv*:
|
||||
|
||||
.. code-block:: bash
|
||||
:linenos:
|
||||
|
||||
$ devenv cglm.sln /Build Release
|
||||
|
||||
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
|
||||
19
docs/source/call.rst
Normal file
19
docs/source/call.rst
Normal file
@@ -0,0 +1,19 @@
|
||||
.. default-domain:: C
|
||||
|
||||
precompiled functions (call)
|
||||
================================================================================
|
||||
|
||||
All functions in **glm_** namespace are forced to **inline**.
|
||||
Most functions also have pre-compiled version.
|
||||
|
||||
Precompiled versions are in **glmc_** namespace. *c* in the namespace stands for
|
||||
"call".
|
||||
|
||||
Since precompiled functions are just wrapper for inline versions,
|
||||
these functions are not documented individually.
|
||||
It would be duplicate documentation also it
|
||||
would be hard to sync documentation between inline and call version for me.
|
||||
|
||||
By including **clgm/cglm.h** you include all inline versions. To get precompiled
|
||||
versions you need to include **cglm/call.h** header it also includes all
|
||||
call versions plus *clgm/cglm.h* (inline versions)
|
||||
344
docs/source/cam.rst
Normal file
344
docs/source/cam.rst
Normal file
@@ -0,0 +1,344 @@
|
||||
.. default-domain:: C
|
||||
|
||||
camera
|
||||
======
|
||||
|
||||
Header: cglm/cam.h
|
||||
|
||||
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
|
||||
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
|
||||
without providing UP axis. It uses :c:func:`glm_vec3_ortho` to get a UP axis and
|
||||
builds view matrix.
|
||||
|
||||
You can also *_default* versions of ortho and perspective to build projection
|
||||
fast if you don't care specific projection values.
|
||||
|
||||
*_decomp* means decompose; these function can help to decompose projection
|
||||
matrices.
|
||||
|
||||
.. note:: Be careful when working with high range (very small near, very large
|
||||
far) projection matrices. You may not get exact value you gave.
|
||||
**float** type cannot store very high precision so you will lose precision.
|
||||
Also your projection matrix will be inaccurate due to losing precision
|
||||
|
||||
Table of contents (click to go):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Functions:
|
||||
|
||||
1. :c:func:`glm_frustum`
|
||||
#. :c:func:`glm_ortho`
|
||||
#. :c:func:`glm_ortho_aabb`
|
||||
#. :c:func:`glm_ortho_aabb_p`
|
||||
#. :c:func:`glm_ortho_aabb_pz`
|
||||
#. :c:func:`glm_ortho_default`
|
||||
#. :c:func:`glm_ortho_default_s`
|
||||
#. :c:func:`glm_perspective`
|
||||
#. :c:func:`glm_perspective_infinite`
|
||||
#. :c:func:`glm_persp_move_far`
|
||||
#. :c:func:`glm_perspective_default`
|
||||
#. :c:func:`glm_perspective_default_infinite`
|
||||
#. :c:func:`glm_perspective_resize`
|
||||
#. :c:func:`glm_lookat`
|
||||
#. :c:func:`glm_look`
|
||||
#. :c:func:`glm_look_anyup`
|
||||
#. :c:func:`glm_persp_decomp`
|
||||
#. :c:func:`glm_persp_decompv`
|
||||
#. :c:func:`glm_persp_decomp_x`
|
||||
#. :c:func:`glm_persp_decomp_y`
|
||||
#. :c:func:`glm_persp_decomp_z`
|
||||
#. :c:func:`glm_persp_decomp_far`
|
||||
#. :c:func:`glm_persp_decomp_near`
|
||||
#. :c:func:`glm_persp_fovy`
|
||||
#. :c:func:`glm_persp_aspect`
|
||||
#. :c:func:`glm_persp_sizes`
|
||||
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. c:function:: void glm_frustum(float left, float right, float bottom, float top, float nearVal, float farVal, mat4 dest)
|
||||
|
||||
| set up perspective peprojection matrix
|
||||
|
||||
Parameters:
|
||||
| *[in]* **left** viewport.left
|
||||
| *[in]* **right** viewport.right
|
||||
| *[in]* **bottom** viewport.bottom
|
||||
| *[in]* **top** viewport.top
|
||||
| *[in]* **nearVal** near clipping plane
|
||||
| *[in]* **farVal** far clipping plane
|
||||
| *[out]* **dest** result matrix
|
||||
|
||||
.. c:function:: void glm_ortho(float left, float right, float bottom, float top, float nearVal, float farVal, mat4 dest)
|
||||
|
||||
| set up orthographic projection matrix
|
||||
|
||||
Parameters:
|
||||
| *[in]* **left** viewport.left
|
||||
| *[in]* **right** viewport.right
|
||||
| *[in]* **bottom** viewport.bottom
|
||||
| *[in]* **top** viewport.top
|
||||
| *[in]* **nearVal** near clipping plane
|
||||
| *[in]* **farVal** far clipping plane
|
||||
| *[out]* **dest** result matrix
|
||||
|
||||
.. c:function:: void glm_ortho_aabb(vec3 box[2], mat4 dest)
|
||||
|
||||
| set up orthographic projection matrix using bounding box
|
||||
| bounding box (AABB) must be in view space
|
||||
|
||||
Parameters:
|
||||
| *[in]* **box** AABB
|
||||
| *[in]* **dest** result matrix
|
||||
|
||||
.. c:function:: void glm_ortho_aabb_p(vec3 box[2], float padding, mat4 dest)
|
||||
|
||||
| set up orthographic projection matrix using bounding box
|
||||
| bounding box (AABB) must be in view space
|
||||
|
||||
this version adds padding to box
|
||||
|
||||
Parameters:
|
||||
| *[in]* **box** AABB
|
||||
| *[in]* **padding** padding
|
||||
| *[out]* **dest** result matrix
|
||||
|
||||
.. c:function:: void glm_ortho_aabb_pz(vec3 box[2], float padding, mat4 dest)
|
||||
|
||||
| set up orthographic projection matrix using bounding box
|
||||
| bounding box (AABB) must be in view space
|
||||
|
||||
this version adds Z padding to box
|
||||
|
||||
Parameters:
|
||||
| *[in]* **box** AABB
|
||||
| *[in]* **padding** padding for near and far
|
||||
| *[out]* **dest** result matrix
|
||||
|
||||
Returns:
|
||||
square of norm / magnitude
|
||||
|
||||
.. c:function:: void glm_ortho_default(float aspect, mat4 dest)
|
||||
|
||||
| set up unit orthographic projection matrix
|
||||
|
||||
Parameters:
|
||||
| *[in]* **aspect** aspect ration ( width / height )
|
||||
| *[out]* **dest** result matrix
|
||||
|
||||
.. c:function:: void glm_ortho_default_s(float aspect, float size, mat4 dest)
|
||||
|
||||
| set up orthographic projection matrix with given CUBE size
|
||||
|
||||
Parameters:
|
||||
| *[in]* **aspect** aspect ration ( width / height )
|
||||
| *[in]* **size** cube size
|
||||
| *[out]* **dest** result matrix
|
||||
|
||||
.. c:function:: void glm_perspective(float fovy, float aspect, float nearVal, float farVal, mat4 dest)
|
||||
|
||||
| set up perspective projection matrix
|
||||
|
||||
Parameters:
|
||||
| *[in]* **fovy** field of view angle (in radians)
|
||||
| *[in]* **aspect** aspect ratio ( width / height )
|
||||
| *[in]* **nearVal** near clipping plane
|
||||
| *[in]* **farVal** far clipping planes
|
||||
| *[out]* **dest** result matrix
|
||||
|
||||
.. c:function:: void glm_perspective_infinite(float fovy, float aspect, float nearZ, mat4 dest)
|
||||
|
||||
| set up perspective projection matrix with infinite far plane
|
||||
|
||||
The far clipping plane is pushed to infinity. This can improve depth
|
||||
precision for distant objects and is required by some rendering techniques
|
||||
such as shadow volumes. Dispatches to the appropriate clipspace variant
|
||||
based on compile-time configuration (LH/RH, NO/ZO).
|
||||
|
||||
Parameters:
|
||||
| *[in]* **fovy** field of view angle (in radians)
|
||||
| *[in]* **aspect** aspect ratio ( width / height )
|
||||
| *[in]* **nearZ** near clipping plane
|
||||
| *[out]* **dest** result matrix
|
||||
|
||||
.. c:function:: void glm_persp_move_far(mat4 proj, float deltaFar)
|
||||
|
||||
| extend perspective projection matrix's far distance
|
||||
|
||||
| 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)
|
||||
|
||||
| set up perspective projection matrix with default near/far
|
||||
and angle values
|
||||
|
||||
Parameters:
|
||||
| *[in]* **aspect** aspect aspect ratio ( width / height )
|
||||
| *[out]* **dest** result matrix
|
||||
|
||||
.. c:function:: void glm_perspective_default_infinite(float aspect, mat4 dest)
|
||||
|
||||
| set up infinite perspective projection matrix with default near
|
||||
and angle values
|
||||
|
||||
Equivalent to calling :c:func:`glm_perspective_infinite` with
|
||||
``fovy = GLM_PI_4`` (45°) and ``nearZ = 0.01``. Useful as a
|
||||
quick drop-in when you need an infinite projection without tuning
|
||||
the individual parameters.
|
||||
|
||||
Parameters:
|
||||
| *[in]* **aspect** aspect ratio ( width / height )
|
||||
| *[out]* **dest** result matrix
|
||||
|
||||
.. c:function:: void glm_perspective_resize(float aspect, mat4 proj)
|
||||
|
||||
| resize perspective matrix by aspect ratio ( width / height )
|
||||
this makes very easy to resize proj matrix when window / viewport reized
|
||||
|
||||
Parameters:
|
||||
| *[in]* **aspect** aspect ratio ( width / height )
|
||||
| *[in, out]* **proj** perspective projection matrix
|
||||
|
||||
.. c:function:: void glm_lookat(vec3 eye, vec3 center, vec3 up, mat4 dest)
|
||||
|
||||
| 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:
|
||||
| *[in]* **eye** eye vector
|
||||
| *[in]* **center** center vector
|
||||
| *[in]* **up** up vector
|
||||
| *[out]* **dest** result matrix
|
||||
|
||||
.. c:function:: void glm_look(vec3 eye, vec3 dir, vec3 up, mat4 dest)
|
||||
|
||||
| set up view matrix
|
||||
|
||||
convenient wrapper for :c:func:`glm_lookat`: if you only have direction not
|
||||
target self then this might be useful. Because you need to get target
|
||||
from direction.
|
||||
|
||||
.. note:: The UP vector must not be parallel to the line of sight from the eye point to the reference point.
|
||||
|
||||
Parameters:
|
||||
| *[in]* **eye** eye vector
|
||||
| *[in]* **dir** direction vector
|
||||
| *[in]* **up** up vector
|
||||
| *[out]* **dest** result matrix
|
||||
|
||||
.. c:function:: void glm_look_anyup(vec3 eye, vec3 dir, mat4 dest)
|
||||
|
||||
| set up view matrix
|
||||
|
||||
convenient wrapper for :c:func:`glm_look` if you only have direction
|
||||
and if you don't care what UP vector is then this might be useful
|
||||
to create view matrix
|
||||
|
||||
Parameters:
|
||||
| *[in]* **eye** eye vector
|
||||
| *[in]* **dir** direction vector
|
||||
| *[out]* **dest** result matrix
|
||||
|
||||
.. c:function:: void glm_persp_decomp(mat4 proj, float *nearVal, float *farVal, float *top, float *bottom, float *left, float *right)
|
||||
|
||||
| decomposes frustum values of perspective projection.
|
||||
|
||||
Parameters:
|
||||
| *[in]* **eye** perspective projection matrix
|
||||
| *[out]* **nearVal** near
|
||||
| *[out]* **farVal** far
|
||||
| *[out]* **top** top
|
||||
| *[out]* **bottom** bottom
|
||||
| *[out]* **left** left
|
||||
| *[out]* **right** right
|
||||
|
||||
.. c:function:: void glm_persp_decompv(mat4 proj, float dest[6])
|
||||
|
||||
| decomposes frustum values of perspective projection.
|
||||
| this makes easy to get all values at once
|
||||
|
||||
Parameters:
|
||||
| *[in]* **proj** perspective projection matrix
|
||||
| *[out]* **dest** array
|
||||
|
||||
.. c:function:: void glm_persp_decomp_x(mat4 proj, float *left, float *right)
|
||||
|
||||
| decomposes left and right values of perspective projection.
|
||||
| x stands for x axis (left / right axis)
|
||||
|
||||
Parameters:
|
||||
| *[in]* **proj** perspective projection matrix
|
||||
| *[out]* **left** left
|
||||
| *[out]* **right** right
|
||||
|
||||
.. c:function:: void glm_persp_decomp_y(mat4 proj, float *top, float *bottom)
|
||||
|
||||
| decomposes top and bottom values of perspective projection.
|
||||
| y stands for y axis (top / bottom axis)
|
||||
|
||||
Parameters:
|
||||
| *[in]* **proj** perspective projection matrix
|
||||
| *[out]* **top** top
|
||||
| *[out]* **bottom** bottom
|
||||
|
||||
.. c:function:: void glm_persp_decomp_z(mat4 proj, float *nearVal, float *farVal)
|
||||
|
||||
| decomposes near and far values of perspective projection.
|
||||
| z stands for z axis (near / far axis)
|
||||
|
||||
Parameters:
|
||||
| *[in]* **proj** perspective projection matrix
|
||||
| *[out]* **nearVal** near
|
||||
| *[out]* **farVal** far
|
||||
|
||||
.. c:function:: void glm_persp_decomp_far(mat4 proj, float * __restrict farVal)
|
||||
|
||||
| decomposes far value of perspective projection.
|
||||
|
||||
Parameters:
|
||||
| *[in]* **proj** perspective projection matrix
|
||||
| *[out]* **farVal** far
|
||||
|
||||
.. c:function:: void glm_persp_decomp_near(mat4 proj, float * __restrict nearVal)
|
||||
|
||||
| decomposes near value of perspective projection.
|
||||
|
||||
Parameters:
|
||||
| *[in]* **proj** perspective projection matrix
|
||||
| *[out]* **nearVal** near
|
||||
|
||||
.. c:function:: float glm_persp_fovy(mat4 proj)
|
||||
|
||||
| returns field of view angle along the Y-axis (in radians)
|
||||
|
||||
if you need to degrees, use glm_deg to convert it or use this:
|
||||
fovy_deg = glm_deg(glm_persp_fovy(projMatrix))
|
||||
|
||||
Parameters:
|
||||
| *[in]* **proj** perspective projection matrix
|
||||
|
||||
Returns:
|
||||
| fovy in radians
|
||||
|
||||
.. c:function:: float glm_persp_aspect(mat4 proj)
|
||||
|
||||
| returns aspect ratio of perspective projection
|
||||
|
||||
Parameters:
|
||||
| *[in]* **proj** perspective projection matrix
|
||||
|
||||
.. c:function:: void glm_persp_sizes(mat4 proj, float fovy, vec4 dest)
|
||||
|
||||
| returns sizes of near and far planes of perspective projection
|
||||
|
||||
Parameters:
|
||||
| *[in]* **proj** perspective projection matrix
|
||||
| *[in]* **fovy** fovy (see brief)
|
||||
| *[out]* **dest** sizes order: [Wnear, Hnear, Wfar, Hfar]
|
||||
BIN
docs/source/cglm-intro.png
Normal file
BIN
docs/source/cglm-intro.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 72 KiB |
34
docs/source/color.rst
Normal file
34
docs/source/color.rst
Normal file
@@ -0,0 +1,34 @@
|
||||
.. default-domain:: C
|
||||
|
||||
color
|
||||
================================================================================
|
||||
|
||||
Header: cglm/color.h
|
||||
|
||||
Table of contents (click to go):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Functions:
|
||||
|
||||
1. :c:func:`glm_luminance`
|
||||
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. c:function:: float glm_luminance(vec3 rgb)
|
||||
|
||||
| averages the color channels into one value
|
||||
|
||||
This function uses formula in COLLADA 1.5 spec which is
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
luminance = (color.r * 0.212671) +
|
||||
(color.g * 0.715160) +
|
||||
(color.b * 0.072169)
|
||||
|
||||
It is based on the ISO/CIE color standards (see ITU-R Recommendation BT.709-4),
|
||||
that averages the color channels into one value
|
||||
|
||||
Parameters:
|
||||
| *[in]* **rgb** RGB color
|
||||
207
docs/source/conf.py
Normal file
207
docs/source/conf.py
Normal file
@@ -0,0 +1,207 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
# cglm documentation build configuration file, created by
|
||||
# sphinx-quickstart on Tue Jun 6 20:31:05 2017.
|
||||
#
|
||||
# This file is execfile()d with the current directory set to its
|
||||
# containing dir.
|
||||
#
|
||||
# Note that not all possible configuration values are present in this
|
||||
# autogenerated file.
|
||||
#
|
||||
# All configuration values have a default; values that are commented out
|
||||
# serve to show the default.
|
||||
|
||||
# If extensions (or modules to document with autodoc) are in another directory,
|
||||
# add these directories to sys.path here. If the directory is relative to the
|
||||
# documentation root, use os.path.abspath to make it absolute, like shown here.
|
||||
#
|
||||
# import os
|
||||
# import sys
|
||||
# sys.path.insert(0, os.path.abspath('.'))
|
||||
|
||||
|
||||
# -- General configuration ------------------------------------------------
|
||||
|
||||
# If your documentation needs a minimal Sphinx version, state it here.
|
||||
#
|
||||
# needs_sphinx = '3.0'
|
||||
|
||||
# Add any Sphinx extension module names here, as strings. They can be
|
||||
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
|
||||
# ones.
|
||||
extensions = [
|
||||
'sphinx.ext.doctest',
|
||||
'sphinx.ext.todo',
|
||||
'sphinx.ext.coverage',
|
||||
'sphinx.ext.mathjax',
|
||||
'sphinx.ext.ifconfig',
|
||||
'sphinx.ext.viewcode',
|
||||
'sphinx.ext.githubpages'
|
||||
]
|
||||
|
||||
# Add any paths that contain templates here, relative to this directory.
|
||||
templates_path = ['_templates']
|
||||
|
||||
# The suffix(es) of source filenames.
|
||||
# You can specify multiple suffix as a list of string:
|
||||
#
|
||||
# source_suffix = ['.rst', '.md']
|
||||
source_suffix = '.rst'
|
||||
|
||||
# The master toctree document.
|
||||
master_doc = 'index'
|
||||
|
||||
# General information about the project.
|
||||
project = u'cglm'
|
||||
copyright = u'2017, Recep Aslantas'
|
||||
author = u'Recep Aslantas'
|
||||
|
||||
# The version info for the project you're documenting, acts as replacement for
|
||||
# |version| and |release|, also used in various other places throughout the
|
||||
# built documents.
|
||||
#
|
||||
# The short X.Y version.
|
||||
version = u'0.9.6'
|
||||
# The full version, including alpha/beta/rc tags.
|
||||
release = u'0.9.6'
|
||||
|
||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||
# for a list of supported languages.
|
||||
#
|
||||
# This is also used if you do content translation via gettext catalogs.
|
||||
# Usually you set "language" from the command line for these cases.
|
||||
language = 'en'
|
||||
|
||||
# List of patterns, relative to source directory, that match files and
|
||||
# directories to ignore when looking for source files.
|
||||
# This patterns also effect to html_static_path and html_extra_path
|
||||
exclude_patterns = []
|
||||
|
||||
# The name of the Pygments (syntax highlighting) style to use.
|
||||
pygments_style = 'sphinx'
|
||||
|
||||
# If true, `todo` and `todoList` produce output, else they produce nothing.
|
||||
todo_include_todos = False
|
||||
|
||||
|
||||
# -- Options for HTML output ----------------------------------------------
|
||||
|
||||
# The theme to use for HTML and HTML Help pages. See the documentation for
|
||||
# a list of builtin themes.
|
||||
#
|
||||
html_theme = 'sphinx_rtd_theme'
|
||||
pygments_style = 'monokai'
|
||||
|
||||
# Theme options are theme-specific and customize the look and feel of a theme
|
||||
# further. For a list of options available for each theme, see the
|
||||
# documentation.
|
||||
#
|
||||
# html_theme_options = {}
|
||||
|
||||
html_theme_options = {
|
||||
# 'github_banner': 'true',
|
||||
# 'github_button': 'true',
|
||||
# 'github_user': 'recp',
|
||||
# 'github_repo': 'cglm',
|
||||
# 'travis_button': 'true',
|
||||
# 'show_related': 'true',
|
||||
# 'fixed_sidebar': 'true'
|
||||
}
|
||||
|
||||
# Add any paths that contain custom static files (such as style sheets) here,
|
||||
# relative to this directory. They are copied after the builtin static files,
|
||||
# so a file named "default.css" will overwrite the builtin "default.css".
|
||||
html_static_path = ['sphinx-static']
|
||||
|
||||
# Add customm CSS and JS files
|
||||
html_css_files = ['theme_overrides.css']
|
||||
html_js_files = []
|
||||
|
||||
# -- Options for HTMLHelp output ------------------------------------------
|
||||
|
||||
# Output file base name for HTML help builder.
|
||||
htmlhelp_basename = 'cglmdoc'
|
||||
|
||||
|
||||
# -- Options for LaTeX output ---------------------------------------------
|
||||
|
||||
latex_elements = {
|
||||
# The paper size ('letterpaper' or 'a4paper').
|
||||
#
|
||||
# 'papersize': 'letterpaper',
|
||||
|
||||
# The font size ('10pt', '11pt' or '12pt').
|
||||
#
|
||||
# 'pointsize': '10pt',
|
||||
|
||||
# Additional stuff for the LaTeX preamble.
|
||||
#
|
||||
# 'preamble': '',
|
||||
|
||||
# Latex figure (float) alignment
|
||||
#
|
||||
# 'figure_align': 'htbp',
|
||||
}
|
||||
|
||||
# Grouping the document tree into LaTeX files. List of tuples
|
||||
# (source start file, target name, title,
|
||||
# author, documentclass [howto, manual, or own class]).
|
||||
latex_documents = [
|
||||
(master_doc, 'cglm.tex', u'cglm Documentation',
|
||||
u'Recep Aslantas', 'manual'),
|
||||
]
|
||||
|
||||
|
||||
# -- Options for manual page output ---------------------------------------
|
||||
|
||||
# One entry per manual page. List of tuples
|
||||
# (source start file, name, description, authors, manual section).
|
||||
man_pages = [
|
||||
(master_doc, 'cglm', u'cglm Documentation',
|
||||
[author], 1)
|
||||
]
|
||||
|
||||
|
||||
# -- Options for Texinfo output -------------------------------------------
|
||||
|
||||
# Grouping the document tree into Texinfo files. List of tuples
|
||||
# (source start file, target name, title, author,
|
||||
# dir menu entry, description, category)
|
||||
texinfo_documents = [
|
||||
(master_doc, 'cglm', u'cglm Documentation',
|
||||
author, 'cglm', 'One line description of project.',
|
||||
'Miscellaneous'),
|
||||
]
|
||||
|
||||
# -- Options for Epub output -------------------------------------------------
|
||||
|
||||
# Bibliographic Dublin Core info.
|
||||
epub_title = project
|
||||
epub_author = author
|
||||
epub_publisher = author
|
||||
epub_copyright = copyright
|
||||
|
||||
# The unique identifier of the text. This can be a ISBN number
|
||||
# or the project homepage.
|
||||
#
|
||||
# epub_identifier = ''
|
||||
|
||||
# A unique identification for the text.
|
||||
#
|
||||
# epub_uid = ''
|
||||
|
||||
# A list of files that should not be packed into the epub file.
|
||||
epub_exclude_files = ['search.html']
|
||||
|
||||
|
||||
# -- Extension configuration -------------------------------------------------
|
||||
|
||||
# -- Options for todo extension ----------------------------------------------
|
||||
|
||||
# If true, `todo` and `todoList` produce output, else they produce nothing.
|
||||
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
|
||||
182
docs/source/euler.rst
Normal file
182
docs/source/euler.rst
Normal file
@@ -0,0 +1,182 @@
|
||||
.. default-domain:: C
|
||||
|
||||
euler angles
|
||||
============
|
||||
|
||||
Header: cglm/euler.h
|
||||
|
||||
You may wonder what **glm_euler_sq** type ( **_sq** stands for sequence ) and
|
||||
:c:func:`glm_euler_by_order` do.
|
||||
I used them to convert euler angles in one coordinate system to another. For
|
||||
instance if you have **Z_UP** euler angles and if you want to convert it
|
||||
to **Y_UP** axis then :c:func:`glm_euler_by_order` is your friend. For more
|
||||
information check :c:func:`glm_euler_order` documentation
|
||||
|
||||
You must pass arrays as array, if you use C compiler then you can use something
|
||||
like this:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
float pitch, yaw, roll;
|
||||
mat4 rot;
|
||||
|
||||
/* pitch = ...; yaw = ...; roll = ... */
|
||||
glm_euler((vec3){pitch, yaw, roll}, rot);
|
||||
|
||||
Rotation Conveniention
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
Current *cglm*'s euler functions uses these convention:
|
||||
|
||||
* Tait–Bryan angles (x-y-z convention)
|
||||
* Intrinsic rotations (pitch, yaw and roll).
|
||||
This is reserve order of extrinsic (elevation, heading and bank) rotation
|
||||
* Right hand rule (actually all rotations in *cglm* use **RH**)
|
||||
* All angles used in *cglm* are **RADIANS** not degrees
|
||||
|
||||
|
||||
**NOTE**: The default :c:func:`glm_euler` function is the short name of
|
||||
:c:func:`glm_euler_xyz` this is why you can't see :c:func:`glm_euler_xyz`.
|
||||
When you see an euler function which doesn't have any X, Y, Z suffix then
|
||||
assume that uses **_xyz** (or instead it accept order as parameter).
|
||||
|
||||
If rotation doesn't work properly, your options:
|
||||
|
||||
1. If you use (or paste) degrees convert it to radians before calling an euler function
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
float pitch, yaw, roll;
|
||||
mat4 rot;
|
||||
|
||||
/* pitch = degrees; yaw = degrees; roll = degrees */
|
||||
glm_euler((vec3){glm_rad(pitch), glm_rad(yaw), glm_rad(roll)}, rot);
|
||||
|
||||
2. Convention mismatch. You may have extrinsic angles,
|
||||
if you do (if you must) then consider to use reverse order e.g if you have
|
||||
**xyz** extrinsic then use **zyx**
|
||||
|
||||
3. *cglm* may implemented it wrong, consider to create an issue to report it
|
||||
or pull request to fix it
|
||||
|
||||
Table of contents (click to go):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Types:
|
||||
|
||||
1. glm_euler_sq
|
||||
|
||||
Functions:
|
||||
|
||||
1. :c:func:`glm_euler_order`
|
||||
#. :c:func:`glm_euler_angles`
|
||||
#. :c:func:`glm_euler`
|
||||
#. :c:func:`glm_euler_xyz`
|
||||
#. :c:func:`glm_euler_zyx`
|
||||
#. :c:func:`glm_euler_zxy`
|
||||
#. :c:func:`glm_euler_xzy`
|
||||
#. :c:func:`glm_euler_yzx`
|
||||
#. :c:func:`glm_euler_yxz`
|
||||
#. :c:func:`glm_euler_by_order`
|
||||
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. c:function:: glm_euler_sq glm_euler_order(int ord[3])
|
||||
|
||||
| packs euler angles order to glm_euler_sq enum.
|
||||
|
||||
To use :c:func:`glm_euler_by_order` function you need *glm_euler_sq*. You
|
||||
can get it with this function.
|
||||
|
||||
You can build param like this:
|
||||
|
||||
| X = 0, Y = 1, Z = 2
|
||||
|
||||
if you have ZYX order then you pass this: [2, 1, 0] = ZYX.
|
||||
if you have YXZ order then you pass this: [1, 0, 2] = YXZ
|
||||
|
||||
As you can see first item specifies which axis will be first then the
|
||||
second one specifies which one will be next an so on.
|
||||
|
||||
Parameters:
|
||||
| *[in]* **ord** euler angles order [Angle1, Angle2, Angle2]
|
||||
|
||||
Returns:
|
||||
packed euler order
|
||||
|
||||
.. c:function:: void glm_euler_angles(mat4 m, vec3 dest)
|
||||
|
||||
| extract euler angles (in radians) using xyz order
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** affine transform
|
||||
| *[out]* **dest** angles vector [x, y, z]
|
||||
|
||||
.. c:function:: void glm_euler(vec3 angles, mat4 dest)
|
||||
|
||||
| build rotation matrix from euler angles
|
||||
|
||||
this is alias of glm_euler_xyz function
|
||||
|
||||
Parameters:
|
||||
| *[in]* **angles** angles as vector [Xangle, Yangle, Zangle]
|
||||
| *[in]* **dest** rotation matrix
|
||||
|
||||
.. c:function:: void glm_euler_xyz(vec3 angles, mat4 dest)
|
||||
|
||||
| build rotation matrix from euler angles
|
||||
|
||||
Parameters:
|
||||
| *[in]* **angles** angles as vector [Xangle, Yangle, Zangle]
|
||||
| *[in]* **dest** rotation matrix
|
||||
|
||||
.. c:function:: void glm_euler_zyx(vec3 angles, mat4 dest)
|
||||
|
||||
| build rotation matrix from euler angles
|
||||
|
||||
Parameters:
|
||||
| *[in]* **angles** angles as vector [Xangle, Yangle, Zangle]
|
||||
| *[in]* **dest** rotation matrix
|
||||
|
||||
.. c:function:: void glm_euler_zxy(vec3 angles, mat4 dest)
|
||||
|
||||
| build rotation matrix from euler angles
|
||||
|
||||
Parameters:
|
||||
| *[in]* **angles** angles as vector [Xangle, Yangle, Zangle]
|
||||
| *[in]* **dest** rotation matrix
|
||||
|
||||
.. c:function:: void glm_euler_xzy(vec3 angles, mat4 dest)
|
||||
|
||||
| build rotation matrix from euler angles
|
||||
|
||||
Parameters:
|
||||
| *[in]* **angles** angles as vector [Xangle, Yangle, Zangle]
|
||||
| *[in]* **dest** rotation matrix
|
||||
|
||||
.. c:function:: void glm_euler_yzx(vec3 angles, mat4 dest)
|
||||
|
||||
build rotation matrix from euler angles
|
||||
|
||||
Parameters:
|
||||
| *[in]* **angles** angles as vector [Xangle, Yangle, Zangle]
|
||||
| *[in]* **dest** rotation matrix
|
||||
|
||||
.. c:function:: void glm_euler_yxz(vec3 angles, mat4 dest)
|
||||
|
||||
| build rotation matrix from euler angles
|
||||
|
||||
Parameters:
|
||||
| *[in]* **angles** angles as vector [Xangle, Yangle, Zangle]
|
||||
| *[in]* **dest** rotation matrix
|
||||
|
||||
.. c:function:: void glm_euler_by_order(vec3 angles, glm_euler_sq ord, mat4 dest)
|
||||
|
||||
| build rotation matrix from euler angles with given euler order.
|
||||
|
||||
Use :c:func:`glm_euler_order` function to build *ord* parameter
|
||||
|
||||
Parameters:
|
||||
| *[in]* **angles** angles as vector [Xangle, Yangle, Zangle]
|
||||
| *[in]* **ord** euler order
|
||||
| *[in]* **dest** rotation matrix
|
||||
29
docs/source/features.rst
Normal file
29
docs/source/features.rst
Normal file
@@ -0,0 +1,29 @@
|
||||
Features
|
||||
================================================================================
|
||||
|
||||
* **scalar** and **simd** (sse, avx, neon, wasm...) optimizations
|
||||
* option to use different clipspaces e.g. Left Handed, Zero-to-One... (currently right handed negative-one is default)
|
||||
* array api and struct api, you can use arrays or structs.
|
||||
* general purpose matrix operations (mat4, mat3)
|
||||
* chain matrix multiplication (square only)
|
||||
* 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...)
|
||||
* 2d bounding box (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...
|
||||
168
docs/source/frustum.rst
Normal file
168
docs/source/frustum.rst
Normal file
@@ -0,0 +1,168 @@
|
||||
.. default-domain:: C
|
||||
|
||||
frustum
|
||||
=============
|
||||
|
||||
Header: cglm/frustum.h
|
||||
|
||||
cglm provides convenient functions to extract frustum planes, corners...
|
||||
All extracted corners are **vec4** so you must create array of **vec4**
|
||||
not **vec3**. If you want to store them to save space you msut convert them
|
||||
yourself.
|
||||
|
||||
**vec4** is used to speed up functions need to corners. This is why frustum
|
||||
functions use *vec4* instead of *vec3*
|
||||
|
||||
Currently related-functions use [-1, 1] clip space configuration to extract
|
||||
corners but you can override it by prodiving **GLM_CUSTOM_CLIPSPACE** macro.
|
||||
If you provide it then you have to all bottom macros as *vec4*
|
||||
|
||||
Current configuration:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
/* near */
|
||||
GLM_CSCOORD_LBN {-1.0f, -1.0f, -1.0f, 1.0f}
|
||||
GLM_CSCOORD_LTN {-1.0f, 1.0f, -1.0f, 1.0f}
|
||||
GLM_CSCOORD_RTN { 1.0f, 1.0f, -1.0f, 1.0f}
|
||||
GLM_CSCOORD_RBN { 1.0f, -1.0f, -1.0f, 1.0f}
|
||||
|
||||
/* far */
|
||||
GLM_CSCOORD_LBF {-1.0f, -1.0f, 1.0f, 1.0f}
|
||||
GLM_CSCOORD_LTF {-1.0f, 1.0f, 1.0f, 1.0f}
|
||||
GLM_CSCOORD_RTF { 1.0f, 1.0f, 1.0f, 1.0f}
|
||||
GLM_CSCOORD_RBF { 1.0f, -1.0f, 1.0f, 1.0f}
|
||||
|
||||
|
||||
Explain of short names:
|
||||
* **LBN**: left bottom near
|
||||
* **LTN**: left top near
|
||||
* **RTN**: right top near
|
||||
* **RBN**: right bottom near
|
||||
* **LBF**: left bottom far
|
||||
* **LTF**: left top far
|
||||
* **RTF**: right top far
|
||||
* **RBF**: right bottom far
|
||||
|
||||
Table of contents (click to go):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Macros:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
GLM_LBN 0 /* left bottom near */
|
||||
GLM_LTN 1 /* left top near */
|
||||
GLM_RTN 2 /* right top near */
|
||||
GLM_RBN 3 /* right bottom near */
|
||||
|
||||
GLM_LBF 4 /* left bottom far */
|
||||
GLM_LTF 5 /* left top far */
|
||||
GLM_RTF 6 /* right top far */
|
||||
GLM_RBF 7 /* right bottom far */
|
||||
|
||||
GLM_LEFT 0
|
||||
GLM_RIGHT 1
|
||||
GLM_BOTTOM 2
|
||||
GLM_TOP 3
|
||||
GLM_NEAR 4
|
||||
GLM_FAR 5
|
||||
|
||||
Functions:
|
||||
|
||||
1. :c:func:`glm_frustum_planes`
|
||||
#. :c:func:`glm_frustum_corners`
|
||||
#. :c:func:`glm_frustum_center`
|
||||
#. :c:func:`glm_frustum_box`
|
||||
#. :c:func:`glm_frustum_corners_at`
|
||||
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. c:function:: void glm_frustum_planes(mat4 m, vec4 dest[6])
|
||||
|
||||
| extracts view frustum planes
|
||||
|
||||
planes' space:
|
||||
- if m = proj: View Space
|
||||
- if m = viewProj: World Space
|
||||
- if m = MVP: Object Space
|
||||
|
||||
You probably want to extract planes in world space so use viewProj as m
|
||||
Computing viewProj:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
glm_mat4_mul(proj, view, viewProj);
|
||||
|
||||
Exracted planes order: [left, right, bottom, top, near, far]
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** matrix
|
||||
| *[out]* **dest** exracted view frustum planes
|
||||
|
||||
.. c:function:: void glm_frustum_corners(mat4 invMat, vec4 dest[8])
|
||||
|
||||
| extracts view frustum corners using clip-space coordinates
|
||||
|
||||
corners' space:
|
||||
- if m = invViewProj: World Space
|
||||
- if m = invMVP: Object Space
|
||||
|
||||
You probably want to extract corners in world space so use **invViewProj**
|
||||
Computing invViewProj:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
glm_mat4_mul(proj, view, viewProj);
|
||||
...
|
||||
glm_mat4_inv(viewProj, invViewProj);
|
||||
|
||||
if you have a near coord at **i** index,
|
||||
you can get it's far coord by i + 4;
|
||||
follow example below to understand that
|
||||
|
||||
For instance to find center coordinates between a near and its far coord:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
for (j = 0; j < 4; j++) {
|
||||
glm_vec3_center(corners[i], corners[i + 4], centerCorners[i]);
|
||||
}
|
||||
|
||||
corners[i + 4] is far of corners[i] point.
|
||||
|
||||
Parameters:
|
||||
| *[in]* **invMat** matrix
|
||||
| *[out]* **dest** exracted view frustum corners
|
||||
|
||||
.. c:function:: void glm_frustum_center(vec4 corners[8], vec4 dest)
|
||||
|
||||
| finds center of view frustum
|
||||
|
||||
Parameters:
|
||||
| *[in]* **corners** view frustum corners
|
||||
| *[out]* **dest** view frustum center
|
||||
|
||||
.. c:function:: void glm_frustum_box(vec4 corners[8], mat4 m, vec3 box[2])
|
||||
|
||||
| finds bounding box of frustum relative to given matrix e.g. view mat
|
||||
|
||||
Parameters:
|
||||
| *[in]* **corners** view frustum corners
|
||||
| *[in]* **m** matrix to convert existing conners
|
||||
| *[out]* **box** bounding box as array [min, max]
|
||||
|
||||
.. c:function:: void glm_frustum_corners_at(vec4 corners[8], float splitDist, float farDist, vec4 planeCorners[4])
|
||||
|
||||
| finds planes corners which is between near and far planes (parallel)
|
||||
|
||||
this will be helpful if you want to split a frustum e.g. CSM/PSSM. This will
|
||||
find planes' corners but you will need to one more plane.
|
||||
Actually you have it, it is near, far or created previously with this func ;)
|
||||
|
||||
Parameters:
|
||||
| *[in]* **corners** frustum corners
|
||||
| *[in]* **splitDist** split distance
|
||||
| *[in]* **farDist** far distance (zFar)
|
||||
| *[out]* **planeCorners** plane corners [LB, LT, RT, RB]
|
||||
105
docs/source/getting_started.rst
Normal file
105
docs/source/getting_started.rst
Normal file
@@ -0,0 +1,105 @@
|
||||
Getting Started
|
||||
================================
|
||||
|
||||
Types:
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
**cglm** uses **glm** prefix for all functions e.g. glm_lookat. You can see supported types in common header file:
|
||||
|
||||
.. code-block:: c
|
||||
:linenos:
|
||||
|
||||
typedef float vec2[2];
|
||||
typedef float vec3[3];
|
||||
typedef int ivec3[3];
|
||||
typedef CGLM_ALIGN_IF(16) float vec4[4];
|
||||
typedef vec4 versor;
|
||||
typedef vec3 mat3[3];
|
||||
|
||||
#ifdef __AVX__
|
||||
typedef CGLM_ALIGN_IF(32) vec4 mat4[4];
|
||||
#else
|
||||
typedef CGLM_ALIGN_IF(16) vec4 mat4[4];
|
||||
#endif
|
||||
|
||||
As you can see types don't store extra information in favor of space.
|
||||
You can send these values e.g. matrix to OpenGL directly without casting or calling a function like *value_ptr*
|
||||
|
||||
Alignment Is Required:
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
**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).
|
||||
|
||||
**UPDATE:**
|
||||
By starting v0.4.5 cglm provides an option to disable alignment requirement, it is enabled as default
|
||||
|
||||
| Check :doc:`opt` page for more details
|
||||
|
||||
Also alignment is disabled for older msvc versions as default. Now alignment is only required in Visual Studio 2017 version 15.6+ if CGLM_ALL_UNALIGNED macro is not defined.
|
||||
|
||||
Allocations:
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
*cglm* doesn't alloc any memory on heap. So it doesn't provide any allocator.
|
||||
You must allocate memory yourself. You should alloc memory for out parameters too if you pass pointer of memory location. When allocating memory, don't forget that **vec4** and **mat4** require alignment.
|
||||
|
||||
.. note:: Unaligned **vec4** and unaligned **mat4** operations will be supported in the future. Check todo list.
|
||||
Because you may want to multiply a CGLM matrix with external matrix.
|
||||
There is no guarantee that non-CGLM matrix is aligned. Unaligned types will have *u* prefix e.g. **umat4**
|
||||
|
||||
Array vs Struct:
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
*cglm* uses arrays for vector and matrix types. So you can't access individual
|
||||
elements like vec.x, vec.y, vec.z... You must use subscript to access vector elements
|
||||
e.g. vec[0], vec[1], vec[2].
|
||||
|
||||
Also I think it is more meaningful to access matrix elements with subscript
|
||||
e.g **matrix[2][3]** instead of **matrix._23**. Since matrix is array of vectors,
|
||||
vectors are also defined as array. This makes types homogeneous.
|
||||
|
||||
**Return arrays?**
|
||||
|
||||
Since C doesn't support return arrays, cglm also doesn't support this feature.
|
||||
|
||||
Function design:
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. image:: cglm-intro.png
|
||||
:width: 492px
|
||||
:height: 297px
|
||||
:align: center
|
||||
|
||||
cglm provides a few way to call a function to do same operation.
|
||||
|
||||
* Inline - *glm_, glm_u*
|
||||
* Pre-compiled - *glmc_, glmc_u*
|
||||
|
||||
For instance **glm_mat4_mul** is inline (all *glm_* functions are inline), to make it non-inline (pre-compiled),
|
||||
call it as **glmc_mat4_mul** from library, to use unaligned version use **glm_umat4_mul** (todo).
|
||||
|
||||
Most functions have **dest** parameter for output. For instance mat4_mul func looks like this:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat4_mul(mat4 m1, mat4 m2, mat4 dest)
|
||||
|
||||
The dest parameter is out parameter. Result will be stored in **dest**.
|
||||
Also in this case matrix multiplication order is dest = m1 * m2.
|
||||
|
||||
* Changing parameter order will change the multiplication order.
|
||||
* You can pass all parameter same (this is similar to m1 `*=` m1), you can pass **dest** as m1 or m2 (this is similar to m1 `*=` m2)
|
||||
|
||||
**v** postfix in function names
|
||||
-------------------------------
|
||||
|
||||
You may see **v** postfix in some function names, v stands for vector.
|
||||
For instance consider a function that accepts three parameters x, y, z.
|
||||
This function may be overloaded by **v** postfix to accept vector (vec3) instead of separate parameters.
|
||||
In some places the v means that it will be apply to a vector.
|
||||
|
||||
**_to** postfix in function names
|
||||
---------------------------------
|
||||
|
||||
*_to* version of function will store the result in specified parameter instead of in-out parameter.
|
||||
Some functions don't have _to prefix but they still behave like this e.g. glm_mat4_mul.
|
||||
53
docs/source/index.rst
Normal file
53
docs/source/index.rst
Normal file
@@ -0,0 +1,53 @@
|
||||
.. cglm documentation master file, created by
|
||||
sphinx-quickstart on Tue Jun 6 20:31:05 2017.
|
||||
You can adapt this file completely to your liking, but it should at least
|
||||
contain the root `toctree` directive.
|
||||
|
||||
cglm Documentation
|
||||
================================
|
||||
|
||||
**cglm** is an optimized 3D math library written in C99 (compatible with C89).
|
||||
It is similar to the original **glm** library, except **cglm** is mainly for
|
||||
**C**.
|
||||
|
||||
**cglm** stores matrices as column-major order but in the future row-major is
|
||||
considered to be supported as optional.
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
:caption: Getting Started:
|
||||
|
||||
features
|
||||
build
|
||||
getting_started
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
:caption: How To:
|
||||
|
||||
opengl
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 3
|
||||
:caption: API:
|
||||
|
||||
api
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
:caption: Options:
|
||||
|
||||
opt
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
:caption: Troubleshooting:
|
||||
|
||||
troubleshooting
|
||||
|
||||
Indices and Tables:
|
||||
===================
|
||||
|
||||
* :ref:`genindex`
|
||||
* :ref:`modindex`
|
||||
* :ref:`search`
|
||||
147
docs/source/io.rst
Normal file
147
docs/source/io.rst
Normal file
@@ -0,0 +1,147 @@
|
||||
.. default-domain:: C
|
||||
|
||||
io (input / output e.g. print)
|
||||
================================================================================
|
||||
|
||||
Header: cglm/io.h
|
||||
|
||||
There are some built-in print functions which may save your time,
|
||||
especially for debugging.
|
||||
|
||||
All functions accept **FILE** parameter which makes very flexible.
|
||||
You can even print it to file on disk.
|
||||
|
||||
In general you will want to print them to console to see results.
|
||||
You can use **stdout** and **stderr** to write results to console.
|
||||
Some programs may occupy **stdout** but you can still use **stderr**.
|
||||
Using **stderr** is suggested.
|
||||
|
||||
Example to print mat4 matrix:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
mat4 transform;
|
||||
/* ... */
|
||||
glm_mat4_print(transform, stderr);
|
||||
|
||||
.. note:: print functions use **%0.4f** precision if you need more
|
||||
(you probably will in some cases), you can change it temporary.
|
||||
cglm may provide precision parameter in the future.
|
||||
|
||||
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 widths 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):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Functions:
|
||||
|
||||
1. :c:func:`glm_mat4_print`
|
||||
#. :c:func:`glm_mat3_print`
|
||||
#. :c:func:`glm_vec4_print`
|
||||
#. :c:func:`glm_ivec4_print`
|
||||
#. :c:func:`glm_vec3_print`
|
||||
#. :c:func:`glm_ivec3_print`
|
||||
#. :c:func:`glm_vec2_print`
|
||||
#. :c:func:`glm_ivec2_print`
|
||||
#. :c:func:`glm_versor_print`
|
||||
#. :c:func:`glm_aabb_print`
|
||||
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. c:function:: void glm_mat4_print(mat4 matrix, FILE * __restrict ostream)
|
||||
|
||||
| print matrix to given stream
|
||||
|
||||
Parameters:
|
||||
| *[in]* **matrix** matrix
|
||||
| *[in]* **ostream** FILE to write
|
||||
|
||||
.. c:function:: void glm_mat3_print(mat3 matrix, FILE * __restrict ostream)
|
||||
|
||||
| print matrix to given stream
|
||||
|
||||
Parameters:
|
||||
| *[in]* **matrix** matrix
|
||||
| *[in]* **ostream** FILE to write
|
||||
|
||||
.. c:function:: void glm_vec4_print(vec4 vec, FILE * __restrict ostream)
|
||||
|
||||
| print vector to given stream
|
||||
|
||||
Parameters:
|
||||
| *[in]* **vec** vector
|
||||
| *[in]* **ostream** FILE to write
|
||||
|
||||
.. c:function:: void glm_ivec4_print(ivec4 vec, FILE * __restrict ostream)
|
||||
|
||||
| print vector to given stream
|
||||
|
||||
Parameters:
|
||||
| *[in]* **vec** vector
|
||||
| *[in]* **ostream** FILE to write
|
||||
|
||||
.. c:function:: void glm_vec3_print(vec3 vec, FILE * __restrict ostream)
|
||||
|
||||
| print vector to given stream
|
||||
|
||||
Parameters:
|
||||
| *[in]* **vec** vector
|
||||
| *[in]* **ostream** FILE to write
|
||||
|
||||
.. c:function:: void glm_ivec3_print(ivec3 vec, FILE * __restrict ostream)
|
||||
|
||||
| print vector to given stream
|
||||
|
||||
Parameters:
|
||||
| *[in]* **vec** vector
|
||||
| *[in]* **ostream** FILE to write
|
||||
|
||||
.. c:function:: void glm_vec2_print(vec2 vec, FILE * __restrict ostream)
|
||||
|
||||
| print vector to given stream
|
||||
|
||||
Parameters:
|
||||
| *[in]* **vec** vector
|
||||
| *[in]* **ostream** FILE to write
|
||||
|
||||
.. c:function:: void glm_ivec2_print(ivec2 vec, FILE * __restrict ostream)
|
||||
|
||||
| print vector to given stream
|
||||
|
||||
Parameters:
|
||||
| *[in]* **vec** vector
|
||||
| *[in]* **ostream** FILE to write
|
||||
|
||||
|
||||
.. c:function:: void glm_versor_print(versor vec, FILE * __restrict ostream)
|
||||
|
||||
| print quaternion to given stream
|
||||
|
||||
Parameters:
|
||||
| *[in]* **vec** quaternion
|
||||
| *[in]* **ostream** FILE to write
|
||||
|
||||
.. c:function:: void glm_aabb_print(versor vec, const char * __restrict tag, FILE * __restrict ostream)
|
||||
|
||||
| print aabb to given stream
|
||||
|
||||
Parameters:
|
||||
| *[in]* **vec** aabb (axis-aligned bounding box)
|
||||
| *[in]* **tag** tag to find it more easily in logs
|
||||
| *[in]* **ostream** FILE to write
|
||||
260
docs/source/ivec2.rst
Normal file
260
docs/source/ivec2.rst
Normal file
@@ -0,0 +1,260 @@
|
||||
.. default-domain:: C
|
||||
|
||||
ivec2
|
||||
=====
|
||||
|
||||
Header: cglm/ivec2.h
|
||||
|
||||
Table of contents (click to go):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Macros:
|
||||
|
||||
1. GLM_IVEC2_ONE_INIT
|
||||
#. GLM_IVEC2_ZERO_INIT
|
||||
#. GLM_IVEC2_ONE
|
||||
#. GLM_IVEC2_ZERO
|
||||
|
||||
Functions:
|
||||
|
||||
1. :c:func:`glm_ivec2`
|
||||
#. :c:func:`glm_ivec2_copy`
|
||||
#. :c:func:`glm_ivec2_zero`
|
||||
#. :c:func:`glm_ivec2_one`
|
||||
#. :c:func:`glm_ivec2_dot`
|
||||
#. :c:func:`glm_ivec2_cross`
|
||||
#. :c:func:`glm_ivec2_add`
|
||||
#. :c:func:`glm_ivec2_adds`
|
||||
#. :c:func:`glm_ivec2_sub`
|
||||
#. :c:func:`glm_ivec2_subs`
|
||||
#. :c:func:`glm_ivec2_mul`
|
||||
#. :c:func:`glm_ivec2_scale`
|
||||
#. :c:func:`glm_ivec2_div`
|
||||
#. :c:func:`glm_ivec2_divs`
|
||||
#. :c:func:`glm_ivec2_mod`
|
||||
#. :c:func:`glm_ivec2_distance2`
|
||||
#. :c:func:`glm_ivec2_distance`
|
||||
#. :c:func:`glm_ivec2_maxv`
|
||||
#. :c:func:`glm_ivec2_minv`
|
||||
#. :c:func:`glm_ivec2_clamp`
|
||||
#. :c:func:`glm_ivec2_abs`
|
||||
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. c:function:: void glm_ivec2(int * v, ivec2 dest)
|
||||
|
||||
init ivec2 using vec3 or vec4
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_ivec2_copy(ivec2 a, ivec2 dest)
|
||||
|
||||
copy all members of [a] to [dest]
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** source vector
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_ivec2_zero(ivec2 v)
|
||||
|
||||
set all members of [v] to zero
|
||||
|
||||
Parameters:
|
||||
| *[out]* **v** vector
|
||||
|
||||
.. c:function:: void glm_ivec2_one(ivec2 v)
|
||||
|
||||
set all members of [v] to one
|
||||
|
||||
Parameters:
|
||||
| *[out]* **v** vector
|
||||
|
||||
.. c:function:: int glm_ivec2_dot(ivec2 a, ivec2 b)
|
||||
|
||||
dot product of ivec2
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** vector1
|
||||
| *[in]* **b** vector2
|
||||
|
||||
Returns:
|
||||
dot product
|
||||
|
||||
.. c:function:: int glm_ivec2_cross(ivec2 a, ivec2 b)
|
||||
|
||||
cross product of two vector (RH)
|
||||
|
||||
| ref: http://allenchou.net/2013/07/cross-product-of-2d-vectors/
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** vector 1
|
||||
| *[in]* **b** vector 2
|
||||
|
||||
Returns:
|
||||
Z component of cross product
|
||||
|
||||
.. c:function:: void glm_ivec2_add(ivec2 a, ivec2 b, ivec2 dest)
|
||||
|
||||
add vector [a] to vector [b] and store result in [dest]
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** first vector
|
||||
| *[in]* **b** second vector
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_ivec2_adds(ivec2 v, int s, ivec2 dest)
|
||||
|
||||
add scalar s to vector [v] and store result in [dest]
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[in]* **s** scalar
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_ivec2_sub(ivec2 a, ivec2 b, ivec2 dest)
|
||||
|
||||
subtract vector [b] from vector [a] and store result in [dest]
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** first vector
|
||||
| *[in]* **b** second vector
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_ivec2_subs(ivec2 v, int s, ivec2 dest)
|
||||
|
||||
subtract scalar s from vector [v] and store result in [dest]
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[in]* **s** scalar
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_ivec2_mul(ivec2 a, ivec2 b, ivec2 dest)
|
||||
|
||||
multiply vector [a] with vector [b] and store result in [dest]
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** first vector
|
||||
| *[in]* **b** second vector
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_ivec2_scale(ivec2 v, int s, ivec2 dest)
|
||||
|
||||
multiply vector [a] with scalar s and store result in [dest]
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[in]* **s** scalar
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_ivec2_div(ivec2 a, ivec2 b, ivec2 dest)
|
||||
|
||||
div vector with another component-wise division: d = a / b
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** vector 1
|
||||
| *[in]* **b** vector 2
|
||||
| *[out]* **dest** result = (a[0] / b[0], a[1] / b[1], a[2] / b[2])
|
||||
|
||||
.. c:function:: void glm_ivec2_divs(ivec2 v, int s, ivec2 dest)
|
||||
|
||||
div vector with scalar: d = v / s
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[in]* **s** scalar
|
||||
| *[out]* **dest** result = (a[0] / s, a[1] / s, a[2] / s)
|
||||
|
||||
.. c:function:: void glm_ivec2_mod(ivec2 a, ivec2 b, ivec2 dest)
|
||||
|
||||
mod vector with another component-wise modulo: d = a % b
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** vector
|
||||
| *[in]* **b** scalar
|
||||
| *[out]* **dest** result = (a[0] % b[0], a[1] % b[1])
|
||||
|
||||
.. c:function:: int glm_ivec2_distance2(ivec2 a, ivec2 b)
|
||||
|
||||
squared distance between two vectors
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** first vector
|
||||
| *[in]* **b** second vector
|
||||
|
||||
Returns:
|
||||
squared distance (distance * distance)
|
||||
|
||||
.. c:function:: float glm_ivec2_distance(ivec2 a, ivec2 b)
|
||||
|
||||
distance between two vectors
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** first vector
|
||||
| *[in]* **b** second vector
|
||||
|
||||
Returns:
|
||||
distance
|
||||
|
||||
.. c:function:: void glm_ivec2_fill(ivec2 v, int val)
|
||||
|
||||
fill a vector with specified value
|
||||
|
||||
Parameters:
|
||||
| *[out]* **v** vector
|
||||
| *[in]* **val** value
|
||||
|
||||
.. c:function:: bool glm_ivec2_eq(ivec2 v, int val)
|
||||
|
||||
check if vector is equal to value
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[in]* **val** value
|
||||
|
||||
.. c:function:: bool glm_ivec2_eqv(ivec2 v1, ivec2 v2)
|
||||
|
||||
check if vector is equal to another vector
|
||||
|
||||
Parameters:
|
||||
| *[in]* **vec** vector 1
|
||||
| *[in]* **vec** vector 2
|
||||
|
||||
|
||||
.. c:function:: void glm_ivec2_maxv(ivec2 a, ivec2 b, ivec2 dest)
|
||||
|
||||
set each member of dest to greater of vector a and b
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** first vector
|
||||
| *[in]* **b** second vector
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_ivec2_minv(ivec2 a, ivec2 b, ivec2 dest)
|
||||
|
||||
set each member of dest to lesser of vector a and b
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** first vector
|
||||
| *[in]* **b** second vector
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_ivec2_clamp(ivec2 v, int minVal, int maxVal)
|
||||
|
||||
clamp each member of [v] between minVal and maxVal (inclusive)
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **v** vector
|
||||
| *[in]* **minVal** minimum value
|
||||
| *[in]* **maxVal** maximum value
|
||||
|
||||
.. c:function:: void glm_ivec2_abs(ivec2 v, ivec2 dest)
|
||||
|
||||
absolute value of each vector item
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[out]* **dest** destination vector
|
||||
272
docs/source/ivec3.rst
Normal file
272
docs/source/ivec3.rst
Normal file
@@ -0,0 +1,272 @@
|
||||
.. default-domain:: C
|
||||
|
||||
ivec3
|
||||
=====
|
||||
|
||||
Header: cglm/ivec3.h
|
||||
|
||||
Table of contents (click to go):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Macros:
|
||||
|
||||
1. GLM_IVEC3_ONE_INIT
|
||||
#. GLM_IVEC3_ZERO_INIT
|
||||
#. GLM_IVEC3_ONE
|
||||
#. GLM_IVEC3_ZERO
|
||||
|
||||
Functions:
|
||||
|
||||
1. :c:func:`glm_ivec3`
|
||||
#. :c:func:`glm_ivec3_copy`
|
||||
#. :c:func:`glm_ivec3_zero`
|
||||
#. :c:func:`glm_ivec3_one`
|
||||
#. :c:func:`glm_ivec3_dot`
|
||||
#. :c:func:`glm_ivec3_norm2`
|
||||
#. :c:func:`glm_ivec3_norm`
|
||||
#. :c:func:`glm_ivec3_add`
|
||||
#. :c:func:`glm_ivec3_adds`
|
||||
#. :c:func:`glm_ivec3_sub`
|
||||
#. :c:func:`glm_ivec3_subs`
|
||||
#. :c:func:`glm_ivec3_mul`
|
||||
#. :c:func:`glm_ivec3_scale`
|
||||
#. :c:func:`glm_ivec3_div`
|
||||
#. :c:func:`glm_ivec3_divs`
|
||||
#. :c:func:`glm_ivec3_mod`
|
||||
#. :c:func:`glm_ivec3_distance2`
|
||||
#. :c:func:`glm_ivec3_distance`
|
||||
#. :c:func:`glm_ivec3_fill`
|
||||
#. :c:func:`glm_ivec3_eq`
|
||||
#. :c:func:`glm_ivec3_eqv`
|
||||
#. :c:func:`glm_ivec3_maxv`
|
||||
#. :c:func:`glm_ivec3_minv`
|
||||
#. :c:func:`glm_ivec3_clamp`
|
||||
#. :c:func:`glm_ivec2_abs`
|
||||
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. c:function:: void glm_ivec3(ivec4 v4, ivec3 dest)
|
||||
|
||||
init ivec3 using ivec4
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_ivec3_copy(ivec3 a, ivec3 dest)
|
||||
|
||||
copy all members of [a] to [dest]
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** source vector
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_ivec3_zero(ivec3 v)
|
||||
|
||||
set all members of [v] to zero
|
||||
|
||||
Parameters:
|
||||
| *[out]* **v** vector
|
||||
|
||||
.. c:function:: void glm_ivec3_one(ivec3 v)
|
||||
|
||||
set all members of [v] to one
|
||||
|
||||
Parameters:
|
||||
| *[out]* **v** vector
|
||||
|
||||
.. c:function:: int glm_ivec3_dot(ivec3 a, ivec3 b)
|
||||
|
||||
dot product of ivec3
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** vector1
|
||||
| *[in]* **b** vector2
|
||||
|
||||
Returns:
|
||||
dot product
|
||||
|
||||
.. c:function:: int glm_ivec3_norm2(ivec3 v)
|
||||
|
||||
norm * norm (magnitude) of vector
|
||||
|
||||
we can use this func instead of calling norm * norm, because it would call
|
||||
sqrtf function twice but with this func we can avoid func call, maybe this is
|
||||
not good name for this func
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
|
||||
Returns:
|
||||
square of norm / magnitude, cast to an integer
|
||||
|
||||
.. c:function:: int glm_ivec3_norm(ivec3 vec)
|
||||
|
||||
| euclidean norm (magnitude), also called L2 norm
|
||||
| this will give magnitude of vector in euclidean space
|
||||
|
||||
Parameters:
|
||||
| *[in]* **vec** vector
|
||||
|
||||
.. c:function:: void glm_ivec3_add(ivec3 a, ivec3 b, ivec3 dest)
|
||||
|
||||
add vector [a] to vector [b] and store result in [dest]
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** first vector
|
||||
| *[in]* **b** second vector
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_ivec3_adds(ivec3 v, int s, ivec3 dest)
|
||||
|
||||
add scalar s to vector [v] and store result in [dest]
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[in]* **s** scalar
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_ivec3_sub(ivec3 a, ivec3 b, ivec3 dest)
|
||||
|
||||
subtract vector [b] from vector [a] and store result in [dest]
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** first vector
|
||||
| *[in]* **b** second vector
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_ivec3_subs(ivec3 v, int s, ivec3 dest)
|
||||
|
||||
subtract scalar s from vector [v] and store result in [dest]
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[in]* **s** scalar
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_ivec3_mul(ivec3 a, ivec3 b, ivec3 dest)
|
||||
|
||||
multiply vector [a] with vector [b] and store result in [dest]
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** first vector
|
||||
| *[in]* **b** second vector
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_ivec3_scale(ivec3 v, int s, ivec3 dest)
|
||||
|
||||
multiply vector [a] with scalar s and store result in [dest]
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[in]* **s** scalar
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_ivec3_div(ivec3 a, ivec3 b, ivec3 dest)
|
||||
|
||||
div vector with another component-wise division: d = a / b
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** vector 1
|
||||
| *[in]* **b** vector 2
|
||||
| *[out]* **dest** result = (a[0] / b[0], a[1] / b[1], a[2] / b[2])
|
||||
|
||||
.. c:function:: void glm_ivec3_divs(ivec3 v, int s, ivec3 dest)
|
||||
|
||||
div vector with scalar: d = v / s
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[in]* **s** scalar
|
||||
| *[out]* **dest** result = (a[0] / s, a[1] / s, a[2] / s)
|
||||
|
||||
.. c:function:: void glm_ivec3_mod(ivec3 a, ivec3 b, ivec3 dest)
|
||||
|
||||
mod vector with another component-wise modulo: d = a % b
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** vector
|
||||
| *[in]* **b** scalar
|
||||
| *[out]* **dest** result = (a[0] % b[0], a[1] % b[1], a[2] % b[2])
|
||||
|
||||
.. c:function:: int glm_ivec3_distance2(ivec3 a, ivec3 b)
|
||||
|
||||
squared distance between two vectors
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** first vector
|
||||
| *[in]* **b** second vector
|
||||
|
||||
Returns:
|
||||
squared distance (distance * distance)
|
||||
|
||||
.. c:function:: float glm_ivec3_distance(ivec3 a, ivec3 b)
|
||||
|
||||
distance between two vectors
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** first vector
|
||||
| *[in]* **b** second vector
|
||||
|
||||
Returns:
|
||||
distance
|
||||
|
||||
.. c:function:: void glm_ivec3_fill(ivec3 v, int val)
|
||||
|
||||
fill a vector with specified value
|
||||
|
||||
Parameters:
|
||||
| *[out]* **v** vector
|
||||
| *[in]* **val** value
|
||||
|
||||
.. c:function:: bool glm_ivec3_eq(ivec3 v, int val)
|
||||
|
||||
check if vector is equal to value
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[in]* **val** value
|
||||
|
||||
.. c:function:: bool glm_ivec3_eqv(ivec3 v1, ivec3 v2)
|
||||
|
||||
check if vector is equal to another vector
|
||||
|
||||
Parameters:
|
||||
| *[in]* **vec** vector 1
|
||||
| *[in]* **vec** vector 2
|
||||
|
||||
.. c:function:: void glm_ivec3_maxv(ivec3 a, ivec3 b, ivec3 dest)
|
||||
|
||||
set each member of dest to greater of vector a and b
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** first vector
|
||||
| *[in]* **b** second vector
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_ivec3_minv(ivec3 a, ivec3 b, ivec3 dest)
|
||||
|
||||
set each member of dest to lesser of vector a and b
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** first vector
|
||||
| *[in]* **b** second vector
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_ivec3_clamp(ivec3 v, int minVal, int maxVal)
|
||||
|
||||
clamp each member of [v] between minVal and maxVal (inclusive)
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **v** vector
|
||||
| *[in]* **minVal** minimum value
|
||||
| *[in]* **maxVal** maximum value
|
||||
|
||||
.. c:function:: void glm_ivec3_abs(ivec3 v, ivec3 dest)
|
||||
|
||||
absolute value of each vector item
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[out]* **dest** destination vector
|
||||
179
docs/source/ivec4.rst
Normal file
179
docs/source/ivec4.rst
Normal file
@@ -0,0 +1,179 @@
|
||||
.. default-domain:: C
|
||||
|
||||
ivec4
|
||||
=====
|
||||
|
||||
Header: cglm/ivec4.h
|
||||
|
||||
Table of contents (click to go):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Macros:
|
||||
|
||||
1. GLM_IVEC4_ONE_INIT
|
||||
#. GLM_IVEC4_ZERO_INIT
|
||||
#. GLM_IVEC4_ONE
|
||||
#. GLM_IVEC4_ZERO
|
||||
|
||||
Functions:
|
||||
|
||||
1. :c:func:`glm_ivec4`
|
||||
#. :c:func:`glm_ivec4_copy`
|
||||
#. :c:func:`glm_ivec4_zero`
|
||||
#. :c:func:`glm_ivec4_one`
|
||||
#. :c:func:`glm_ivec4_add`
|
||||
#. :c:func:`glm_ivec4_adds`
|
||||
#. :c:func:`glm_ivec4_sub`
|
||||
#. :c:func:`glm_ivec4_subs`
|
||||
#. :c:func:`glm_ivec4_mul`
|
||||
#. :c:func:`glm_ivec4_scale`
|
||||
#. :c:func:`glm_ivec4_distance2`
|
||||
#. :c:func:`glm_ivec4_distance`
|
||||
#. :c:func:`glm_ivec4_maxv`
|
||||
#. :c:func:`glm_ivec4_minv`
|
||||
#. :c:func:`glm_ivec4_clamp`
|
||||
#. :c:func:`glm_ivec4_abs`
|
||||
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. c:function:: void glm_ivec4(ivec3 v3, int last, ivec4 dest)
|
||||
|
||||
init ivec4 using ivec3
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_ivec4_copy(ivec4 a, ivec4 dest)
|
||||
|
||||
copy all members of [a] to [dest]
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** source vector
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_ivec4_zero(ivec4 v)
|
||||
|
||||
set all members of [v] to zero
|
||||
|
||||
Parameters:
|
||||
| *[out]* **v** vector
|
||||
|
||||
.. c:function:: void glm_ivec4_one(ivec4 v)
|
||||
|
||||
set all members of [v] to one
|
||||
|
||||
Parameters:
|
||||
| *[out]* **v** vector
|
||||
|
||||
.. c:function:: void glm_ivec4_add(ivec4 a, ivec4 b, ivec4 dest)
|
||||
|
||||
add vector [a] to vector [b] and store result in [dest]
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** first vector
|
||||
| *[in]* **b** second vector
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_ivec4_adds(ivec4 v, int s, ivec4 dest)
|
||||
|
||||
add scalar s to vector [v] and store result in [dest]
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[in]* **s** scalar
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_ivec4_sub(ivec4 a, ivec4 b, ivec4 dest)
|
||||
|
||||
subtract vector [b] from vector [a] and store result in [dest]
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** first vector
|
||||
| *[in]* **b** second vector
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_ivec4_subs(ivec4 v, int s, ivec4 dest)
|
||||
|
||||
subtract scalar s from vector [v] and store result in [dest]
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[in]* **s** scalar
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_ivec4_mul(ivec4 a, ivec4 b, ivec4 dest)
|
||||
|
||||
multiply vector [a] with vector [b] and store result in [dest]
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** first vector
|
||||
| *[in]* **b** second vector
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_ivec4_scale(ivec4 v, int s, ivec4 dest)
|
||||
|
||||
multiply vector [a] with scalar s and store result in [dest]
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[in]* **s** scalar
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: int glm_ivec4_distance2(ivec4 a, ivec4 b)
|
||||
|
||||
squared distance between two vectors
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** first vector
|
||||
| *[in]* **b** second vector
|
||||
|
||||
Returns:
|
||||
squared distance (distance * distance)
|
||||
|
||||
.. c:function:: float glm_ivec4_distance(ivec4 a, ivec4 b)
|
||||
|
||||
distance between two vectors
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** first vector
|
||||
| *[in]* **b** second vector
|
||||
|
||||
Returns:
|
||||
distance
|
||||
|
||||
.. c:function:: void glm_ivec4_maxv(ivec4 a, ivec4 b, ivec4 dest)
|
||||
|
||||
set each member of dest to greater of vector a and b
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** first vector
|
||||
| *[in]* **b** second vector
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_ivec4_minv(ivec4 a, ivec4 b, ivec4 dest)
|
||||
|
||||
set each member of dest to lesser of vector a and b
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** first vector
|
||||
| *[in]* **b** second vector
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_ivec4_clamp(ivec4 v, int minVal, int maxVal)
|
||||
|
||||
clamp each member of [v] between minVal and maxVal (inclusive)
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **v** vector
|
||||
| *[in]* **minVal** minimum value
|
||||
| *[in]* **maxVal** maximum value
|
||||
|
||||
.. c:function:: void glm_ivec4_abs(ivec4 v, ivec4 dest)
|
||||
|
||||
absolute value of each vector item
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[out]* **dest** destination vector
|
||||
871
docs/source/mat2.rst
Normal file
871
docs/source/mat2.rst
Normal file
@@ -0,0 +1,871 @@
|
||||
.. 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_make`
|
||||
#. :c:func:`glm_mat2_copy`
|
||||
#. :c:func:`glm_mat2_identity`
|
||||
#. :c:func:`glm_mat2_identity_array`
|
||||
#. :c:func:`glm_mat2_zero`
|
||||
#. :c:func:`glm_mat2_mul`
|
||||
#. :c:func:`glm_mat2_mulv`
|
||||
#. :c:func:`glm_mat2_transpose_to`
|
||||
#. :c:func:`glm_mat2_transpose`
|
||||
#. :c:func:`glm_mat2_scale`
|
||||
#. :c:func:`glm_mat2_inv`
|
||||
#. :c:func:`glm_mat2_swap_col`
|
||||
#. :c:func:`glm_mat2_swap_row`
|
||||
#. :c:func:`glm_mat2_det`
|
||||
#. :c:func:`glm_mat2_trace`
|
||||
#. :c:func:`glm_mat2_rmc`
|
||||
|
||||
Represented
|
||||
~~~~~~~~~~~
|
||||
|
||||
.. csv-table:: mat2x2
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "m00", "m10"
|
||||
"row 2", "m01", "m11"
|
||||
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. c:function:: void glm_mat2_make(const float * __restrict src, mat2 dest)
|
||||
|
||||
Create mat2 (dest) from pointer (src).
|
||||
|
||||
.. note:: **@src** must contain at least 4 elements.
|
||||
|
||||
Parameters:
|
||||
| *[in]* **src** pointer to an array of floats (left)
|
||||
| *[out]* **dest** destination (result, mat2)
|
||||
|
||||
.. note:: Mathematical explanation
|
||||
|
||||
.. csv-table:: float array (1x4) **(src)**
|
||||
:header: "", "column 1"
|
||||
|
||||
"row 1", "v0"
|
||||
"row 2", "v1"
|
||||
"row 3", "v2"
|
||||
"row 4", "v3"
|
||||
|
||||
.. csv-table:: mat2 **(dest)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "v0", "v2"
|
||||
"row 2", "v1", "v3"
|
||||
|
||||
.. note:: Example
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
mat2 dest = GLM_MAT2_ZERO_INIT;
|
||||
float src[4] = { 1.00, 5.00, 8.00, 11.00 };
|
||||
glm_mat2_make(src, dest);
|
||||
|
||||
.. csv-table:: float array (1x4) **(src)**
|
||||
:header: "", "column 1"
|
||||
|
||||
"row 1", "1.00"
|
||||
"row 2", "5.00"
|
||||
"row 3", "8.00"
|
||||
"row 4", "11.00"
|
||||
|
||||
.. csv-table:: mat2 **(dest)** Before
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "0.00", "0.00"
|
||||
"row 2", "0.00", "0.00"
|
||||
|
||||
.. csv-table:: mat2 **(dest)** After
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "1.00", "8.00"
|
||||
"row 2", "5.00", "11.00"
|
||||
|
||||
.. c:function:: void glm_mat2_copy(mat2 mat, mat2 dest)
|
||||
|
||||
Copy mat2 (mat) to mat2 (dest).
|
||||
|
||||
Parameters:
|
||||
| *[in]* **mat** mat2 (left,src)
|
||||
| *[out]* **dest** destination (result, mat2)
|
||||
|
||||
.. note:: Mathematical explanation
|
||||
|
||||
.. csv-table:: mat2 **(mat)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "m00", "m10"
|
||||
"row 2", "m01", "m11"
|
||||
|
||||
.. csv-table:: mat2 **(dest)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "m00", "m10"
|
||||
"row 2", "m01", "m11"
|
||||
|
||||
.. note:: Example
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
mat2 mat = {{3.00,4.00},{7.00,8.00}};
|
||||
mat2 dest = GLM_MAT2_ZERO_INIT;
|
||||
glm_mat2_copy(mat, dest);
|
||||
|
||||
.. csv-table:: mat2 **(mat)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "3.00", "7.00"
|
||||
"row 2", "4.00", "8.00"
|
||||
|
||||
.. csv-table:: mat2 **(dest)** Before
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "0.00", "0.00"
|
||||
"row 2", "0.00", "0.00"
|
||||
|
||||
.. csv-table:: mat2 **(dest)** After
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "3.00", "7.00"
|
||||
"row 2", "4.00", "8.00"
|
||||
|
||||
.. c:function:: void glm_mat2_identity(mat2 m)
|
||||
|
||||
| Copy a mat2 identity to mat2 **(m)**, or makes mat2 **(m)** an identity.
|
||||
|
|
||||
| The same thing may be achieved with either of bellow methods,
|
||||
| but it is more easy to do that with this func especially for members
|
||||
| e.g. ``glm_mat2_identity(aStruct->aMatrix);``.
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
glm_mat2_copy(GLM_MAT2_IDENTITY, m);
|
||||
|
||||
// or
|
||||
mat2 mat = GLM_MAT2_IDENTITY_INIT;
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** mat2 (src, dest)
|
||||
|
||||
.. note:: Mathematical explanation
|
||||
|
||||
.. csv-table:: mat2 **(m)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "m00", "m10"
|
||||
"row 2", "m01", "m11"
|
||||
|
||||
.. csv-table:: mat2 **(m)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "1.00", "0.00"
|
||||
"row 2", "0.00", "1.00"
|
||||
|
||||
.. note:: Example
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
mat2 m = {{3.00,4.00},{7.00,8.00}};
|
||||
glm_mat2_identity(m);
|
||||
|
||||
.. csv-table:: mat2 **(m)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "3.00", "7.00"
|
||||
"row 2", "4.00", "8.00"
|
||||
|
||||
.. csv-table:: mat2 **(m)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "1.00", "0.00"
|
||||
"row 2", "0.00", "1.00"
|
||||
|
||||
.. c:function:: void glm_mat2_identity_array(mat2 * __restrict mats, size_t count)
|
||||
|
||||
Given an array of mat2's **(mats)** make each matrix an identity matrix.
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **mats** Array of mat2's (must be aligned (16/32) if alignment is not disabled)
|
||||
| *[in]* **count** Array size of ``mats`` or number of matrices
|
||||
|
||||
.. note:: Mathematical explanation
|
||||
|
||||
.. csv-table:: mat2 **(mats[index])**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "m00", "m10"
|
||||
"row 2", "m01", "m11"
|
||||
|
||||
.. csv-table:: mat2 **(mats[index])**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "1.00", "0.00"
|
||||
"row 2", "0.00", "1.00"
|
||||
|
||||
.. note:: Example
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
size_t count = 3;
|
||||
|
||||
mat2 matrices[count] = {
|
||||
{{1.00,2.00},{5.00,6.00}},
|
||||
{{3.00,4.00},{7.00,8.00}},
|
||||
{{5.00,6.00},{9.00,10.00}},
|
||||
};
|
||||
|
||||
glm_mat2_identity_array(matrices, count);
|
||||
|
||||
.. csv-table:: mat2 **(mats[0])** Before
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "1.00", "5.00"
|
||||
"row 2", "2.00", "6.00"
|
||||
|
||||
.. csv-table:: mat2 **(mats[0])** After
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "1.00", "0.00"
|
||||
"row 2", "0.00", "1.00"
|
||||
|
||||
.. csv-table:: mat2 **(mats[1])** Before
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "3.00", "7.00"
|
||||
"row 2", "4.00", "8.00"
|
||||
|
||||
.. csv-table:: mat2 **(mats[1])** After
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "1.00", "0.00"
|
||||
"row 2", "0.00", "1.00"
|
||||
|
||||
.. csv-table:: mat2 **(mats[2])** Before
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "5.00", "9.00"
|
||||
"row 2", "6.00", "10.00"
|
||||
|
||||
.. csv-table:: mat2 **(mats[2])** After
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "1.00", "0.00"
|
||||
"row 2", "0.00", "1.00"
|
||||
|
||||
.. c:function:: void glm_mat2_zero(mat2 m)
|
||||
|
||||
Zero out the mat2 (m).
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** mat2 (src, dest)
|
||||
|
||||
.. note:: Mathematical explanation
|
||||
|
||||
.. csv-table:: mat2 **(m)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "m00", "m10"
|
||||
"row 2", "m01", "m11"
|
||||
|
||||
.. csv-table:: mat2 **(m)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "0.00", "0.00"
|
||||
"row 2", "0.00", "0.00"
|
||||
|
||||
.. note:: Example
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
mat2 m = {{19.00,5.00},{2.00,4.00}};
|
||||
glm_mat2_zero(m);
|
||||
|
||||
.. csv-table:: mat2 **(m)** Before
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "19.00", "2.00"
|
||||
"row 2", "5.00", "4.00"
|
||||
|
||||
.. csv-table:: mat2 **(m)** After
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "0.00", "0.00"
|
||||
"row 2", "0.00", "0.00"
|
||||
|
||||
.. c:function:: void glm_mat2_mul(mat2 m1, mat2 m2, mat2 dest)
|
||||
|
||||
| Multiply mat2 (m1) by mat2 (m2) and store in mat2 (dest).
|
||||
|
|
||||
| m1, m2 and dest matrices can be same matrix, it is possible to write this:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
mat2 m = GLM_MAT2_IDENTITY_INIT;
|
||||
glm_mat2_mul(m, m, m);
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m1** mat2 (left)
|
||||
| *[in]* **m2** mat2 (right)
|
||||
| *[out]* **dest** destination (result, mat2)
|
||||
|
||||
.. note:: Mathematical explanation
|
||||
|
||||
.. csv-table:: mat2 **(m1)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "a00", "a10"
|
||||
"row 2", "a01", "a11"
|
||||
|
||||
.. csv-table:: mat2 **(m2)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "b00", "b10"
|
||||
"row 2", "b01", "b11"
|
||||
|
||||
.. csv-table:: mat2 **(dest)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "a00 * b00 + a10 * b01", "a00 * b10 + a10 * b11"
|
||||
"row 2", "a01 * b00 + a11 * b01", "a01 * b10 + a11 * b11"
|
||||
|
||||
.. note:: Example
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
mat2 m = {{19.00,5.00},{2.00,4.00}};
|
||||
glm_mat2_mul(m, m, m);
|
||||
|
||||
.. csv-table:: mat2 **(m1)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "19.00", "2.00"
|
||||
"row 2", "5.00", "4.00"
|
||||
|
||||
.. csv-table:: mat2 **(m2)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "19.00", "2.00"
|
||||
"row 2", "5.00", "4.00"
|
||||
|
||||
.. csv-table:: mat2 **(dest)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "**371.00** = 19.00 * 19.00 + 2.00 * 5.00", "**46.00** = 19.00 * 2.00 + 2.00 * 4.00"
|
||||
"row 2", "**115.00** = 5.00 * 19.00 + 4.00 * 5.00", "**18.00** = 5.00 * 2.00 + 4.00 * 4.00"
|
||||
|
||||
.. c:function:: void glm_mat2_mulv(mat2 m, vec2 v, vec2 dest)
|
||||
|
||||
Multiply mat2 (m) by vec2 (v) and store in vec2 (dest).
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** mat2 (left)
|
||||
| *[in]* **v** vec2 (right, column vector)
|
||||
| *[out]* **dest** destination (result, column vector)
|
||||
|
||||
.. note:: Mathematical explanation
|
||||
|
||||
.. csv-table:: mat2 **(m)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "m00", "m10"
|
||||
"row 2", "m01", "m11"
|
||||
|
||||
.. csv-table:: column vec2 (1x2) **(v)**
|
||||
:header: "", "column 1"
|
||||
|
||||
"row 1", "v0"
|
||||
"row 2", "v1"
|
||||
|
||||
.. csv-table:: column vec2 (1x2) **(dest)**
|
||||
:header: "", "column 1"
|
||||
|
||||
"row 1", "m00 * v0 + m10 * v1"
|
||||
"row 2", "m01 * v0 + m11 * v1"
|
||||
|
||||
.. note:: Example
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
vec2 dest;
|
||||
vec2 v = {33.00,55.00};
|
||||
mat2 m = {{1.00,2.00},{3.00,4.00}};
|
||||
glm_mat2_mulv(m, v, dest);
|
||||
|
||||
.. csv-table:: mat2 **(m)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "1.00", "3.00"
|
||||
"row 2", "2.00", "4.00"
|
||||
|
||||
.. csv-table:: column vec2 **(v)**
|
||||
:header: "", "column 1"
|
||||
|
||||
"row 1", "33.00"
|
||||
"row 2", "55.00"
|
||||
|
||||
.. csv-table:: vec2 **(dest)** Result
|
||||
:header: "", "column 1"
|
||||
|
||||
"row 1", "**198.00** = 1.00 * 33.00 + 3.00 * 55.00"
|
||||
"row 2", "**286.00** = 2.00 * 33.00 + 4.00 * 55.00"
|
||||
|
||||
.. c:function:: void glm_mat2_transpose_to(mat2 mat, mat2 dest)
|
||||
|
||||
Transpose mat2 (mat) and store in mat2 (dest).
|
||||
|
||||
Parameters:
|
||||
| *[in]* **mat** mat2 (left,src)
|
||||
| *[out]* **dest** destination (result, mat2)
|
||||
|
||||
.. note:: Mathematical explanation
|
||||
|
||||
.. csv-table:: mat2 **(mat)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "m00", "m10"
|
||||
"row 2", "m01", "m11"
|
||||
|
||||
.. csv-table:: mat2 **(dest)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "m00", "m01"
|
||||
"row 2", "m10", "m11"
|
||||
|
||||
.. note:: Example
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
mat2 mat = {{1.00,2.00},{3.00,4.00}};
|
||||
mat2 dest = GLM_MAT2_ZERO_INIT;
|
||||
glm_mat2_transpose_to(mat, dest);
|
||||
|
||||
.. csv-table:: mat2 **(mat)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "1.00", "3.00"
|
||||
"row 2", "2.00", "4.00"
|
||||
|
||||
.. csv-table:: mat2 **(dest)** Before
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "0.00", "0.00"
|
||||
"row 2", "0.00", "0.00"
|
||||
|
||||
.. csv-table:: mat2 **(dest)** After
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "1.00", "2.00"
|
||||
"row 2", "3.00", "4.00"
|
||||
|
||||
.. c:function:: void glm_mat2_transpose(mat2 m)
|
||||
|
||||
Transpose mat2 (m) and store result in the same matrix.
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** mat2 (src, dest)
|
||||
|
||||
.. note:: Mathematical explanation
|
||||
|
||||
.. csv-table:: mat2 **(m)** src
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "m00", "m10"
|
||||
"row 2", "m01", "m11"
|
||||
|
||||
.. csv-table:: mat2 **(m)** dest
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "m00", "m01"
|
||||
"row 2", "m10", "m11"
|
||||
|
||||
.. note:: Example
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
mat2 m = {{1.00,2.00},{3.00,4.00}};
|
||||
glm_mat2_transpose(m);
|
||||
|
||||
.. csv-table:: mat2 **(m)** Before
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "1.00", "3.00"
|
||||
"row 2", "2.00", "4.00"
|
||||
|
||||
.. csv-table:: mat2 **(m)** After
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "1.00", "2.00"
|
||||
"row 2", "3.00", "4.00"
|
||||
|
||||
.. c:function:: void glm_mat2_scale(mat2 m, float s)
|
||||
|
||||
Multiply mat2 (m) by scalar constant (s).
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** mat2 (src, dest)
|
||||
| *[in]* **s** float (scalar)
|
||||
|
||||
.. note:: Mathematical explanation
|
||||
|
||||
.. csv-table:: mat2 **(m)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "m00 * s", "m10 * s"
|
||||
"row 2", "m01 * s", "m11 * s"
|
||||
|
||||
.. note:: Example
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
float s = 3.00f;
|
||||
mat2 m = {{1.00,2.00},{3.00,4.00}};
|
||||
glm_mat2_scale(m, s);
|
||||
|
||||
.. csv-table:: mat2 **(m)** Before
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "1.00", "3.00"
|
||||
"row 2", "2.00", "4.00"
|
||||
|
||||
.. csv-table:: mat2 **(m)** After
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "**3.00** = 1.00 * 3.00", "**9.00** = 3.00 * 3.00"
|
||||
"row 2", "**6.00** = 2.00 * 3.00", "**12.00** = 4.00 * 3.00"
|
||||
|
||||
.. c:function:: void glm_mat2_inv(mat2 mat, mat2 dest)
|
||||
|
||||
Inverse mat2 (mat) and store in mat2 (dest).
|
||||
|
||||
Parameters:
|
||||
| *[in]* **mat** mat2 (left,src)
|
||||
| *[out]* **dest** destination (result, inverse mat2)
|
||||
|
||||
.. note:: Mathematical explanation
|
||||
|
||||
.. csv-table:: mat2 **(mat)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "m00", "m10"
|
||||
"row 2", "m01", "m11"
|
||||
|
||||
.. list-table:: mat2 **(dest)**
|
||||
:header-rows: 1
|
||||
|
||||
* -
|
||||
- column 1
|
||||
- column 2
|
||||
* - row 1
|
||||
- m11 * (1.0f / (m00 * m11 - m01 * m10))
|
||||
- -m10 * (1.0f / (m00 * m11 - m01 * m10))
|
||||
* - row 2
|
||||
- -m01 * (1.0f / (m00 * m11 - m01 * m10))
|
||||
- m00 * (1.0f / (m00 * m11 - m01 * m10))
|
||||
|
||||
.. note:: Example
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
mat2 dest = GLM_MAT2_ZERO_INIT;
|
||||
mat2 mat = {{1.00,2.00},{3.00,4.00}};
|
||||
glm_mat2_inv(mat, dest);
|
||||
|
||||
.. csv-table:: mat2 **(mat)** Before
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "1.00", "3.00"
|
||||
"row 2", "2.00", "4.00"
|
||||
|
||||
.. list-table:: mat2 **(dest)** After
|
||||
:header-rows: 1
|
||||
|
||||
* -
|
||||
- column 1
|
||||
- column 2
|
||||
* - row 1
|
||||
- **-2.00** = 4.00 * (1.00 / (1.00 * 4.00 - 2.00 * 3.00))
|
||||
- **1.50** = -3.00 * (1.00 / (1.00 * 4.00 - 2.00 * 3.00))
|
||||
* - row 2
|
||||
- **1.00** = -2.00 * (1.00 / (1.00 * 4.00 - 2.00 * 3.00))
|
||||
- **-0.50** = 1.00 * (1.00 / (1.00 * 4.00 - 2.00 * 3.00))
|
||||
|
||||
.. c:function:: void glm_mat2_swap_col(mat2 mat, int col1, int col2)
|
||||
|
||||
Swap two columns in mat2 (mat) and store in same matrix.
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **mat** mat2 (src, dest)
|
||||
| *[in]* **col1** Column 1 array index
|
||||
| *[in]* **col2** Column 2 array index
|
||||
|
||||
.. note:: Mathematical explanation
|
||||
|
||||
.. csv-table:: mat2 **(mat)** Before
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "m00", "m10"
|
||||
"row 2", "m01", "m11"
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
glm_mat2_swap_col(mat, 0, 1);
|
||||
|
||||
.. csv-table:: mat2 **(mat)** After
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "m10", "m00"
|
||||
"row 2", "m11", "m01"
|
||||
|
||||
.. note:: Example
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
mat2 mat = {{76.00,5.00},{3.00,6.00}};
|
||||
glm_mat2_swap_col(mat, 0, 1);
|
||||
|
||||
.. csv-table:: mat2 **(mat)** Before
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "76.00", "3.00"
|
||||
"row 2", "5.00", "6.00"
|
||||
|
||||
.. csv-table:: mat2 **(mat)** After
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "3.00", "76.00"
|
||||
"row 2", "6.00", "5.00"
|
||||
|
||||
.. c:function:: void glm_mat2_swap_row(mat2 mat, int row1, int row2)
|
||||
|
||||
Swap two rows in mat2 (mat) and store in same matrix.
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **mat** mat2 (src, dest)
|
||||
| *[in]* **row1** Row 1 array index
|
||||
| *[in]* **row2** Row 2 array index
|
||||
|
||||
.. note:: Mathematical explanation
|
||||
|
||||
.. csv-table:: mat2 **(mat)** Before
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "m00", "m10"
|
||||
"row 2", "m01", "m11"
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
glm_mat2_swap_row(mat, 0, 1);
|
||||
|
||||
.. csv-table:: mat2 **(mat)** After
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "m01", "m11"
|
||||
"row 2", "m00", "m10"
|
||||
|
||||
.. note:: Example
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
mat2 mat = {{76.00,5.00},{3.00,6.00}};
|
||||
glm_mat2_swap_row(mat, 0, 1);
|
||||
|
||||
.. csv-table:: mat2 **(mat)** Before
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "76.00", "3.00"
|
||||
"row 2", "5.00", "6.00"
|
||||
|
||||
.. csv-table:: mat2 **(mat)** After
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "5.00", "6.00"
|
||||
"row 2", "76.00", "3.00"
|
||||
|
||||
.. c:function:: float glm_mat2_det(mat2 m)
|
||||
|
||||
Returns mat2 determinant.
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** mat2 (src)
|
||||
|
||||
Returns:
|
||||
| mat2 determinant (float)
|
||||
|
||||
.. note:: Mathematical explanation
|
||||
|
||||
.. csv-table:: mat2 **(m)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "m00", "m10"
|
||||
"row 2", "m01", "m11"
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
m00 * m11 - m10 * m01;
|
||||
|
||||
.. note:: Example
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
mat2 m = {{76.00,5.00},{3.00,6.00}};
|
||||
glm_mat2_det(m);
|
||||
|
||||
.. csv-table:: mat2 **(m)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "76.00", "3.00"
|
||||
"row 2", "5.00", "6.00"
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
441.00 = 76.00 * 6.00 - 3.00 * 5.00;
|
||||
|
||||
.. c:function:: void glm_mat2_trace(mat2 m)
|
||||
|
||||
| Returns trace of matrix. Which is:
|
||||
|
|
||||
| The sum of the elements on the main diagonal from
|
||||
| upper left corner to the bottom right corner.
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** mat2 (src)
|
||||
|
||||
Returns:
|
||||
| mat2 trace (float)
|
||||
|
||||
.. note:: Mathematical explanation
|
||||
|
||||
.. csv-table:: mat2 **(m)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "m00", "m10"
|
||||
"row 2", "m01", "m11"
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
m00 + m11;
|
||||
|
||||
.. note:: Example
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
mat2 m = {{76.00,5.00},{3.00,6.00}};
|
||||
glm_mat2_trace(m);
|
||||
|
||||
.. csv-table:: mat2 **(m)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "76.00", "3.00"
|
||||
"row 2", "5.00", "6.00"
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
82.00 = 76.00 + 6.00;
|
||||
|
||||
.. c:function:: float glm_mat2_rmc(vec2 r, mat2 m, vec2 c)
|
||||
|
||||
| Helper for R (row vector) * M (matrix) * C (column vector)
|
||||
|
||||
| **rmc** stands for **Row** * **Matrix** * **Column**
|
||||
|
||||
| the result is scalar because M * C = ResC (1x2, column vector),
|
||||
| then if you take the dot_product(R (2x1), ResC (1x2)) = scalar value.
|
||||
|
||||
Parameters:
|
||||
| *[in]* **r** vec2 (2x1, row vector)
|
||||
| *[in]* **m** mat2 (2x2, matrix)
|
||||
| *[in]* **c** vec2 (1x2, column vector)
|
||||
|
||||
Returns:
|
||||
| Scalar value (float, 1x1)
|
||||
|
||||
.. note:: Mathematical explanation
|
||||
|
||||
.. csv-table:: row vec2 (2x1) **(r)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "a00", "a10"
|
||||
|
||||
.. csv-table:: mat2 **(m)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "b00", "b10"
|
||||
"row 2", "b01", "b11"
|
||||
|
||||
.. csv-table:: column vec2 (1x2) **(c)**
|
||||
:header: "", "column 1"
|
||||
|
||||
"row 1", "c00"
|
||||
"row 2", "c01"
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
M * C = C (column vector)
|
||||
dot_product(R, C)
|
||||
|
||||
.. csv-table:: column vec2 (1x2) **(C)**
|
||||
:header: "", "column 1"
|
||||
|
||||
"row 1", "b00 * c00 + b10 * c01"
|
||||
"row 2", "b01 * c00 + b11 * c01"
|
||||
|
||||
.. csv-table:: float **(scalar)**
|
||||
:header: "", "column 1"
|
||||
|
||||
"row 1", "a00 * (b00 * c00 + b10 * c01) + a10 * (b01 * c00 + b11 * c01)"
|
||||
|
||||
.. note:: Example
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
vec2 r = {8.00,4.00};
|
||||
vec2 c = {7.00,2.00};
|
||||
mat2 m = {{5.00,9.00},{3.00,6.00}};
|
||||
glm_mat2_rmc(r, m, c);
|
||||
|
||||
.. csv-table:: row vec2 (2x1) **(r)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "8.00", "4.00"
|
||||
|
||||
.. csv-table:: mat2 **(m)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "5.00", "3.00"
|
||||
"row 2", "9.00", "6.00"
|
||||
|
||||
.. csv-table:: column vec2 (1x2) **(c)**
|
||||
:header: "", "column 1"
|
||||
|
||||
"row 1", "7.00"
|
||||
"row 2", "2.00"
|
||||
|
||||
.. csv-table:: column vec2 (1x2) **(C)**
|
||||
:header: "", "column 1"
|
||||
|
||||
"row 1", "**41.00** = 5.00 * 7.00 + 3.00 * 2.00"
|
||||
"row 2", "**75.00** = 9.00 * 7.00 + 6.00 * 2.00"
|
||||
|
||||
.. csv-table:: float (1x1) **(scalar)**
|
||||
:header: "", "column 1"
|
||||
|
||||
"row 1", "**628.00** = 8.00 * 41.00 + 4.00 * 75.00"
|
||||
205
docs/source/mat2x3.rst
Normal file
205
docs/source/mat2x3.rst
Normal file
@@ -0,0 +1,205 @@
|
||||
.. default-domain:: C
|
||||
|
||||
mat2x3
|
||||
======
|
||||
|
||||
Header: cglm/mat2x3.h
|
||||
|
||||
Table of contents (click to go):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Macros:
|
||||
|
||||
1. GLM_MAT2X3_ZERO_INIT
|
||||
#. GLM_MAT2X3_ZERO
|
||||
|
||||
Functions:
|
||||
|
||||
1. :c:func:`glm_mat2x3_copy`
|
||||
#. :c:func:`glm_mat2x3_zero`
|
||||
#. :c:func:`glm_mat2x3_make`
|
||||
#. :c:func:`glm_mat2x3_mul`
|
||||
#. :c:func:`glm_mat2x3_mulv`
|
||||
#. :c:func:`glm_mat2x3_transpose`
|
||||
#. :c:func:`glm_mat2x3_scale`
|
||||
|
||||
Represented
|
||||
~~~~~~~~~~~
|
||||
|
||||
.. csv-table:: mat2x3
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "m00", "m10"
|
||||
"row 2", "m01", "m11"
|
||||
"row 3", "m02", "m12"
|
||||
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. c:function:: void glm_mat2x3_copy(mat2x3 src, mat2x3 dest)
|
||||
|
||||
Copy mat2x3 (src) to mat2x3 (dest).
|
||||
|
||||
Parameters:
|
||||
| *[in]* **src** mat2x3 (left)
|
||||
| *[out]* **dest** destination (result, mat2x3)
|
||||
|
||||
.. csv-table:: mat2x3 **(src)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "a00", "a10"
|
||||
"row 2", "a01", "a11"
|
||||
"row 3", "a02", "a12"
|
||||
|
||||
.. csv-table:: mat2x3 **(dest)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "b00 = a00", "b10 = a10"
|
||||
"row 2", "b01 = a01", "b11 = a11"
|
||||
"row 3", "b02 = a02", "b12 = a12"
|
||||
|
||||
.. c:function:: void glm_mat2x3_zero(mat2x3 m)
|
||||
|
||||
Zero out the mat2x3 (m).
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** mat2x3 (src, dest)
|
||||
|
||||
.. csv-table:: mat2x3 **(m)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "0.00", "2.00"
|
||||
"row 2", "5.00", "4.00"
|
||||
"row 3", "7.00", "6.00"
|
||||
|
||||
.. csv-table:: mat2x3 **(m)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "0.00", "0.00"
|
||||
"row 2", "0.00", "0.00"
|
||||
"row 3", "0.00", "0.00"
|
||||
|
||||
.. c:function:: void glm_mat2x3_make(const float * __restrict src, mat2x3 dest)
|
||||
|
||||
Create mat2x3 (dest) from pointer (src).
|
||||
|
||||
.. note:: **@src** must contain at least 6 elements.
|
||||
|
||||
Parameters:
|
||||
| *[in]* **src** pointer to an array of floats (left)
|
||||
| *[out]* **dest** destination (result, mat2x3)
|
||||
|
||||
.. csv-table:: float array (1x6) **(src)**
|
||||
:header: "", "column 1"
|
||||
|
||||
"row 1", "v0"
|
||||
"row 2", "v1"
|
||||
"row 3", "v2"
|
||||
"row 4", "v3"
|
||||
"row 5", "v4"
|
||||
"row 6", "v5"
|
||||
|
||||
.. csv-table:: mat2x3 **(dest)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "v0", "v3"
|
||||
"row 2", "v1", "v4"
|
||||
"row 3", "v2", "v5"
|
||||
|
||||
.. c:function:: void glm_mat2x3_mul(mat2x3 m1, mat3x2 m2, mat3 dest)
|
||||
|
||||
Multiply mat2x3 (m1) by mat3x2 (m2) and store in mat3 (dest).
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
glm_mat2x3_mul(mat2x3, mat3x2, mat3);
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m1** mat2x3 (left)
|
||||
| *[in]* **m2** mat3x2 (right)
|
||||
| *[out]* **dest** destination (result, mat3)
|
||||
|
||||
.. csv-table:: mat2x3 **(m1)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "a00", "a10"
|
||||
"row 2", "a01", "a11"
|
||||
"row 3", "a02", "a12"
|
||||
|
||||
.. csv-table:: mat3x2 **(m2)**
|
||||
:header: "", "column 1", "column 2", "column 3"
|
||||
|
||||
"row 1", "b00", "b10", "b20"
|
||||
"row 2", "b01", "b11", "b21"
|
||||
|
||||
.. csv-table:: mat3 **(dest)**
|
||||
:header: "", "column 1", "column 2", "column 3"
|
||||
|
||||
"row 1", "a00 * b00 + a10 * b01", "a00 * b10 + a10 * b11", "a00 * b20 + a10 * b21"
|
||||
"row 2", "a01 * b00 + a11 * b01", "a01 * b10 + a11 * b11", "a01 * b20 + a11 * b21"
|
||||
"row 3", "a02 * b00 + a12 * b01", "a02 * b10 + a12 * b11", "a02 * b20 + a12 * b21"
|
||||
|
||||
.. c:function:: void glm_mat2x3_mulv(mat2x3 m, vec2 v, vec3 dest)
|
||||
|
||||
Multiply mat2x3 (m) by vec2 (v) and store in vec3 (dest).
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** mat2x3 (left)
|
||||
| *[in]* **v** vec2 (right, column vector)
|
||||
| *[out]* **dest** destination (result, column vector)
|
||||
|
||||
.. csv-table:: mat2x3 **(m)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "m00", "m10"
|
||||
"row 2", "m01", "m11"
|
||||
"row 3", "m02", "m12"
|
||||
|
||||
.. csv-table:: column vec2 (1x2) **(v)**
|
||||
:header: "", "column 1"
|
||||
|
||||
"row 1", "v0"
|
||||
"row 2", "v1"
|
||||
|
||||
.. csv-table:: column vec3 (1x3) **(dest)**
|
||||
:header: "", "column 1"
|
||||
|
||||
"row 1", "m00 * v0 + m10 * v1"
|
||||
"row 2", "m01 * v0 + m11 * v1"
|
||||
"row 3", "m02 * v0 + m12 * v1"
|
||||
|
||||
.. c:function:: void glm_mat2x3_transpose(mat2x3 src, mat3x2 dest)
|
||||
|
||||
Transpose mat2x3 (src) and store in mat3x2 (dest).
|
||||
|
||||
Parameters:
|
||||
| *[in]* **src** mat2x3 (left)
|
||||
| *[out]* **dest** destination (result, mat3x2)
|
||||
|
||||
.. csv-table:: mat2x3 **(src)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "a00", "a10"
|
||||
"row 2", "a01", "a11"
|
||||
"row 3", "a02", "a12"
|
||||
|
||||
.. csv-table:: mat3x2 **(dest)**
|
||||
:header: "", "column 1", "column 2", "column 3"
|
||||
|
||||
"row 1", "b00 = a00", "b10 = a01", "b20 = a02"
|
||||
"row 2", "b01 = a10", "b11 = a11", "b21 = a12"
|
||||
|
||||
.. c:function:: void glm_mat2x3_scale(mat2x3 m, float s)
|
||||
|
||||
Multiply mat2x3 (m) by scalar constant (s).
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** mat2x3 (src, dest)
|
||||
| *[in]* **s** float (scalar)
|
||||
|
||||
.. csv-table:: mat2x3 **(m)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "m00 = m00 * s", "m10 = m10 * s"
|
||||
"row 2", "m01 = m01 * s", "m11 = m11 * s"
|
||||
"row 3", "m02 = m02 * s", "m12 = m12 * s"
|
||||
219
docs/source/mat2x4.rst
Normal file
219
docs/source/mat2x4.rst
Normal file
@@ -0,0 +1,219 @@
|
||||
.. default-domain:: C
|
||||
|
||||
mat2x4
|
||||
======
|
||||
|
||||
Header: cglm/mat2x4.h
|
||||
|
||||
Table of contents (click to go):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Macros:
|
||||
|
||||
1. GLM_MAT2X4_ZERO_INIT
|
||||
#. GLM_MAT2X4_ZERO
|
||||
|
||||
Functions:
|
||||
|
||||
1. :c:func:`glm_mat2x4_copy`
|
||||
#. :c:func:`glm_mat2x4_zero`
|
||||
#. :c:func:`glm_mat2x4_make`
|
||||
#. :c:func:`glm_mat2x4_mul`
|
||||
#. :c:func:`glm_mat2x4_mulv`
|
||||
#. :c:func:`glm_mat2x4_transpose`
|
||||
#. :c:func:`glm_mat2x4_scale`
|
||||
|
||||
Represented
|
||||
~~~~~~~~~~~
|
||||
|
||||
.. csv-table:: mat2x4
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "m00", "m10"
|
||||
"row 2", "m01", "m11"
|
||||
"row 3", "m02", "m12"
|
||||
"row 4", "m03", "m13"
|
||||
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. c:function:: void glm_mat2x4_copy(mat2x4 src, mat2x4 dest)
|
||||
|
||||
Copy mat2x4 (src) to mat2x4 (dest).
|
||||
|
||||
Parameters:
|
||||
| *[in]* **src** mat2x4 (left)
|
||||
| *[out]* **dest** destination (result, mat2x4)
|
||||
|
||||
.. csv-table:: mat2x4 **(src)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "a00", "a10"
|
||||
"row 2", "a01", "a11"
|
||||
"row 3", "a02", "a12"
|
||||
"row 4", "a03", "a13"
|
||||
|
||||
.. csv-table:: mat2x4 **(dest)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "b00 = a00", "b10 = a10"
|
||||
"row 2", "b01 = a01", "b11 = a11"
|
||||
"row 3", "b02 = a02", "b12 = a12"
|
||||
"row 4", "b03 = a03", "b13 = a13"
|
||||
|
||||
.. c:function:: void glm_mat2x4_zero(mat2x4 m)
|
||||
|
||||
Zero out the mat2x4 (m).
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** mat2x4 (src, dest)
|
||||
|
||||
.. csv-table:: mat2x4 **(m)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "0.00", "2.00"
|
||||
"row 2", "5.00", "4.00"
|
||||
"row 3", "7.00", "6.00"
|
||||
"row 4", "23.00", "1.00"
|
||||
|
||||
.. csv-table:: mat2x4 **(m)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "0.00", "0.00"
|
||||
"row 2", "0.00", "0.00"
|
||||
"row 3", "0.00", "0.00"
|
||||
"row 4", "0.00", "0.00"
|
||||
|
||||
.. c:function:: void glm_mat2x4_make(const float * __restrict src, mat2x4 dest)
|
||||
|
||||
Create mat2x4 (dest) from pointer (src).
|
||||
|
||||
.. note:: **@src** must contain at least 8 elements.
|
||||
|
||||
Parameters:
|
||||
| *[in]* **src** pointer to an array of floats (left)
|
||||
| *[out]* **dest** destination (result, mat2x4)
|
||||
|
||||
.. csv-table:: float array (1x8) **(src)**
|
||||
:header: "", "column 1"
|
||||
|
||||
"row 1", "v0"
|
||||
"row 2", "v1"
|
||||
"row 3", "v2"
|
||||
"row 4", "v3"
|
||||
"row 5", "v4"
|
||||
"row 6", "v5"
|
||||
"row 7", "v6"
|
||||
"row 8", "v7"
|
||||
|
||||
.. csv-table:: mat2x4 **(dest)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "v0", "v4"
|
||||
"row 2", "v1", "v5"
|
||||
"row 3", "v2", "v6"
|
||||
"row 4", "v3", "v7"
|
||||
|
||||
.. c:function:: void glm_mat2x4_mul(mat2x4 m1, mat4x2 m2, mat4 dest)
|
||||
|
||||
Multiply mat2x4 (m1) by mat4x2 (m2) and store in mat4 (dest).
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
glm_mat2x4_mul(mat2x4, mat4x2, mat4);
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m1** mat2x4 (left)
|
||||
| *[in]* **m2** mat4x2 (right)
|
||||
| *[out]* **dest** destination (result, mat4)
|
||||
|
||||
.. csv-table:: mat2x4 **(m1)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "a00", "a10"
|
||||
"row 2", "a01", "a11"
|
||||
"row 3", "a02", "a12"
|
||||
"row 4", "a03", "a13"
|
||||
|
||||
.. csv-table:: mat4x2 **(m2)**
|
||||
:header: "", "column 1", "column 2", "column 3", "column 4"
|
||||
|
||||
"row 1", "b00", "b10", "b20", "b30"
|
||||
"row 2", "b01", "b11", "b21", "b31"
|
||||
|
||||
.. csv-table:: mat4x4 **(dest)**
|
||||
:header: "", "column 1", "column 2", "column 3", "column 4"
|
||||
|
||||
"row 1", "a00 * b00 + a10 * b01", "a00 * b10 + a10 * b11", "a00 * b20 + a10 * b21", "a00 * b30 + a10 * b31"
|
||||
"row 2", "a01 * b00 + a11 * b01", "a01 * b10 + a11 * b11", "a01 * b20 + a11 * b21", "a01 * b30 + a11 * b31"
|
||||
"row 3", "a02 * b00 + a12 * b01", "a02 * b10 + a12 * b11", "a02 * b20 + a12 * b21", "a02 * b30 + a12 * b31"
|
||||
"row 4", "a03 * b00 + a13 * b01", "a03 * b10 + a13 * b11", "a03 * b20 + a13 * b21", "a03 * b30 + a13 * b31"
|
||||
|
||||
.. c:function:: void glm_mat2x4_mulv(mat2x4 m, vec2 v, vec4 dest)
|
||||
|
||||
Multiply mat2x4 (m) by vec2 (v) and store in vec4 (dest).
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** mat2x4 (left)
|
||||
| *[in]* **v** vec2 (right, column vector)
|
||||
| *[out]* **dest** destination (result, column vector)
|
||||
|
||||
.. csv-table:: mat2x4 **(m)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "m00", "m10"
|
||||
"row 2", "m01", "m11"
|
||||
"row 3", "m02", "m12"
|
||||
"row 4", "m03", "m13"
|
||||
|
||||
.. csv-table:: column vec2 (1x2) **(v)**
|
||||
:header: "", "column 1"
|
||||
|
||||
"row 1", "v0"
|
||||
"row 2", "v1"
|
||||
|
||||
.. csv-table:: column vec4 (1x4) **(dest)**
|
||||
:header: "", "column 1"
|
||||
|
||||
"row 1", "m00 * v0 + m10 * v1"
|
||||
"row 2", "m01 * v0 + m11 * v1"
|
||||
"row 3", "m02 * v0 + m12 * v1"
|
||||
"row 4", "m03 * v0 + m13 * v1"
|
||||
|
||||
.. c:function:: void glm_mat2x4_transpose(mat2x4 src, mat4x2 dest)
|
||||
|
||||
Transpose mat2x4 (src) and store in mat4x2 (dest).
|
||||
|
||||
Parameters:
|
||||
| *[in]* **src** mat2x4 (left)
|
||||
| *[out]* **dest** destination (result, mat4x2)
|
||||
|
||||
.. csv-table:: mat2x4 **(src)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "a00", "a10"
|
||||
"row 2", "a01", "a11"
|
||||
"row 3", "a02", "a12"
|
||||
"row 4", "a03", "a13"
|
||||
|
||||
.. csv-table:: mat4x2 **(dest)**
|
||||
:header: "", "column 1", "column 2", "column 3", "column 4"
|
||||
|
||||
"row 1", "b00 = a00", "b10 = a01", "b20 = a02", "b30 = a03"
|
||||
"row 2", "b01 = a10", "b11 = a11", "b21 = a12", "b31 = a13"
|
||||
|
||||
.. c:function:: void glm_mat2x4_scale(mat2x4 m, float s)
|
||||
|
||||
Multiply mat2x4 (m) by scalar constant (s).
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** mat2x4 (src, dest)
|
||||
| *[in]* **s** float (scalar)
|
||||
|
||||
.. csv-table:: mat2x4 **(m)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "m00 = m00 * s", "m10 = m10 * s"
|
||||
"row 2", "m01 = m01 * s", "m11 = m11 * s"
|
||||
"row 3", "m02 = m02 * s", "m12 = m12 * s"
|
||||
"row 4", "m03 = m03 * s", "m13 = m13 * s"
|
||||
1185
docs/source/mat3.rst
Normal file
1185
docs/source/mat3.rst
Normal file
File diff suppressed because it is too large
Load Diff
196
docs/source/mat3x2.rst
Normal file
196
docs/source/mat3x2.rst
Normal file
@@ -0,0 +1,196 @@
|
||||
.. default-domain:: C
|
||||
|
||||
mat3x2
|
||||
======
|
||||
|
||||
Header: cglm/mat3x2.h
|
||||
|
||||
Table of contents (click to go):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Macros:
|
||||
|
||||
1. GLM_MAT3X2_ZERO_INIT
|
||||
#. GLM_MAT3X2_ZERO
|
||||
|
||||
Functions:
|
||||
|
||||
1. :c:func:`glm_mat3x2_copy`
|
||||
#. :c:func:`glm_mat3x2_zero`
|
||||
#. :c:func:`glm_mat3x2_make`
|
||||
#. :c:func:`glm_mat3x2_mul`
|
||||
#. :c:func:`glm_mat3x2_mulv`
|
||||
#. :c:func:`glm_mat3x2_transpose`
|
||||
#. :c:func:`glm_mat3x2_scale`
|
||||
|
||||
Represented
|
||||
~~~~~~~~~~~
|
||||
|
||||
.. csv-table:: mat3x2
|
||||
:header: "", "column 1", "column 2", "column 3"
|
||||
|
||||
"row 1", "m00", "m10", "m20"
|
||||
"row 2", "m01", "m11", "m21"
|
||||
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. c:function:: void glm_mat3x2_copy(mat3x2 src, mat3x2 dest)
|
||||
|
||||
Copy mat3x2 (src) to mat3x2 (dest).
|
||||
|
||||
Parameters:
|
||||
| *[in]* **src** mat3x2 (left)
|
||||
| *[out]* **dest** destination (result, mat3x2)
|
||||
|
||||
.. csv-table:: mat3x2 **(src)**
|
||||
:header: "", "column 1", "column 2", "column 3"
|
||||
|
||||
"row 1", "a00", "a10", "a20"
|
||||
"row 2", "a01", "a11", "a21"
|
||||
|
||||
.. csv-table:: mat3x2 **(dest)**
|
||||
:header: "", "column 1", "column 2", "column 3"
|
||||
|
||||
"row 1", "b00 = a00", "b10 = a10", "b20 = a20"
|
||||
"row 2", "b01 = a01", "b11 = a11", "b21 = a21"
|
||||
|
||||
.. c:function:: void glm_mat3x2_zero(mat3x2 m)
|
||||
|
||||
Zero out the mat3x2 (m).
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** mat3x2 (src, dest)
|
||||
|
||||
.. csv-table:: mat3x2 **(m)**
|
||||
:header: "", "column 1", "column 2", "column 3"
|
||||
|
||||
"row 1", "0.00", "2.00", "15.00"
|
||||
"row 2", "5.00", "4.00", "6.00"
|
||||
|
||||
.. csv-table:: mat3x2 **(m)**
|
||||
:header: "", "column 1", "column 2", "column 3"
|
||||
|
||||
"row 1", "0.00", "0.00", "0.00"
|
||||
"row 2", "0.00", "0.00", "0.00"
|
||||
|
||||
.. c:function:: void glm_mat3x2_make(const float * __restrict src, mat3x2 dest)
|
||||
|
||||
Create mat3x2 (dest) from pointer (src).
|
||||
|
||||
.. note:: **@src** must contain at least 6 elements.
|
||||
|
||||
Parameters:
|
||||
| *[in]* **src** pointer to an array of floats (left)
|
||||
| *[out]* **dest** destination (result, mat3x2)
|
||||
|
||||
.. csv-table:: float array (1x6) **(src)**
|
||||
:header: "", "column 1"
|
||||
|
||||
"row 1", "v0"
|
||||
"row 2", "v1"
|
||||
"row 3", "v2"
|
||||
"row 4", "v3"
|
||||
"row 5", "v4"
|
||||
"row 6", "v5"
|
||||
|
||||
.. csv-table:: mat3x2 **(dest)**
|
||||
:header: "", "column 1", "column 2", "column 3"
|
||||
|
||||
"row 1", "v0", "v2", "v4"
|
||||
"row 2", "v1", "v3", "v5"
|
||||
|
||||
.. c:function:: void glm_mat3x2_mul(mat3x2 m1, mat2x3 m2, mat2 dest)
|
||||
|
||||
Multiply mat3x2 (m1) by mat2x3 (m2) and store in mat2 (dest).
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
glm_mat3x2_mul(mat3x2, mat2x3, mat2);
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m1** mat3x2 (left)
|
||||
| *[in]* **m2** mat2x3 (right)
|
||||
| *[out]* **dest** destination (result, mat2)
|
||||
|
||||
.. csv-table:: mat3x2 **(m1)**
|
||||
:header: "", "column 1", "column 2", "column 3"
|
||||
|
||||
"row 1", "a00", "a10", "a20"
|
||||
"row 2", "a01", "a11", "a21"
|
||||
|
||||
.. csv-table:: mat2x3 **(m2)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "b00", "b10"
|
||||
"row 2", "b01", "b11"
|
||||
"row 3", "b02", "b12"
|
||||
|
||||
.. csv-table:: mat2x2 **(dest)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "a00 * b00 + a10 * b01 + a20 * b02", "a00 * b10 + a10 * b11 + a20 * b12"
|
||||
"row 2", "a01 * b00 + a11 * b01 + a21 * b02", "a01 * b10 + a11 * b11 + a21 * b12"
|
||||
|
||||
.. c:function:: void glm_mat3x2_mulv(mat3x2 m, vec3 v, vec2 dest)
|
||||
|
||||
Multiply mat3x2 (m) by vec3 (v) and store in vec2 (dest).
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** mat3x2 (left)
|
||||
| *[in]* **v** vec3 (right, column vector)
|
||||
| *[out]* **dest** destination (result, column vector)
|
||||
|
||||
.. csv-table:: mat3x2 **(m)**
|
||||
:header: "", "column 1", "column 2", "column 3"
|
||||
|
||||
"row 1", "m00", "m10", "m20"
|
||||
"row 2", "m01", "m11", "m21"
|
||||
|
||||
.. csv-table:: column vec3 (1x3) **(v)**
|
||||
:header: "", "column 1"
|
||||
|
||||
"row 1", "v0"
|
||||
"row 2", "v1"
|
||||
"row 3", "v2"
|
||||
|
||||
.. csv-table:: column vec2 (1x2) **(dest)**
|
||||
:header: "", "column 1"
|
||||
|
||||
"row 1", "m00 * v0 + m10 * v1 + m20 * v2"
|
||||
"row 2", "m01 * v0 + m11 * v1 + m21 * v2"
|
||||
|
||||
.. c:function:: void glm_mat3x2_transpose(mat3x2 src, mat2x3 dest)
|
||||
|
||||
Transpose mat3x2 (src) and store in mat2x3 (dest).
|
||||
|
||||
Parameters:
|
||||
| *[in]* **src** mat3x2 (left)
|
||||
| *[out]* **dest** destination (result, mat2x3)
|
||||
|
||||
.. csv-table:: mat3x2 **(src)**
|
||||
:header: "", "column 1", "column 2", "column 3"
|
||||
|
||||
"row 1", "a00", "a10", "a20"
|
||||
"row 2", "a01", "a11", "a21"
|
||||
|
||||
.. csv-table:: mat2x3 **(dest)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "b00 = a00", "b10 = a01"
|
||||
"row 2", "b01 = a10", "b11 = a11"
|
||||
"row 3", "b02 = a20", "b12 = a21"
|
||||
|
||||
.. c:function:: void glm_mat3x2_scale(mat3x2 m, float s)
|
||||
|
||||
Multiply mat3x2 (m) by scalar constant (s).
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** mat3x2 (src, dest)
|
||||
| *[in]* **s** float (scalar)
|
||||
|
||||
.. csv-table:: mat3x2 **(m)**
|
||||
:header: "", "column 1", "column 2", "column 3"
|
||||
|
||||
"row 1", "m00 = m00 * s", "m10 = m10 * s", "m20 = m20 * s"
|
||||
"row 2", "m01 = m01 * s", "m11 = m11 * s", "m21 = m21 * s"
|
||||
226
docs/source/mat3x4.rst
Normal file
226
docs/source/mat3x4.rst
Normal file
@@ -0,0 +1,226 @@
|
||||
.. default-domain:: C
|
||||
|
||||
mat3x4
|
||||
======
|
||||
|
||||
Header: cglm/mat3x4.h
|
||||
|
||||
Table of contents (click to go):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Macros:
|
||||
|
||||
1. GLM_MAT3X4_ZERO_INIT
|
||||
#. GLM_MAT3X4_ZERO
|
||||
|
||||
Functions:
|
||||
|
||||
1. :c:func:`glm_mat3x4_copy`
|
||||
#. :c:func:`glm_mat3x4_zero`
|
||||
#. :c:func:`glm_mat3x4_make`
|
||||
#. :c:func:`glm_mat3x4_mul`
|
||||
#. :c:func:`glm_mat3x4_mulv`
|
||||
#. :c:func:`glm_mat3x4_transpose`
|
||||
#. :c:func:`glm_mat3x4_scale`
|
||||
|
||||
Represented
|
||||
~~~~~~~~~~~
|
||||
|
||||
.. csv-table:: mat3x4
|
||||
:header: "", "column 1", "column 2", "column 3"
|
||||
|
||||
"row 1", "m00", "m10", "m20"
|
||||
"row 2", "m01", "m11", "m21"
|
||||
"row 3", "m02", "m12", "m22"
|
||||
"row 4", "m03", "m13", "m23"
|
||||
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. c:function:: void glm_mat3x4_copy(mat3x4 src, mat3x4 dest)
|
||||
|
||||
Copy mat3x4 (src) to mat3x4 (dest).
|
||||
|
||||
Parameters:
|
||||
| *[in]* **src** mat3x4 (left)
|
||||
| *[out]* **dest** destination (result, mat3x4)
|
||||
|
||||
.. csv-table:: mat3x4 **(src)**
|
||||
:header: "", "column 1", "column 2", "column 3"
|
||||
|
||||
"row 1", "a00", "a10", "a20"
|
||||
"row 2", "a01", "a11", "a21"
|
||||
"row 3", "a02", "a12", "a22"
|
||||
"row 4", "a03", "a13", "a23"
|
||||
|
||||
.. csv-table:: mat3x4 **(dest)**
|
||||
:header: "", "column 1", "column 2", "column 3"
|
||||
|
||||
"row 1", "b00 = a00", "b10 = a10", "b20 = a20"
|
||||
"row 2", "b01 = a01", "b11 = a11", "b21 = a21"
|
||||
"row 3", "b02 = a02", "b12 = a12", "b22 = a22"
|
||||
"row 4", "b03 = a03", "b13 = a13", "b23 = a23"
|
||||
|
||||
.. c:function:: void glm_mat3x4_zero(mat3x4 m)
|
||||
|
||||
Zero out the mat3x4 (m).
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** mat3x4 (src, dest)
|
||||
|
||||
.. csv-table:: mat3x4 **(m)**
|
||||
:header: "", "column 1", "column 2", "column 3"
|
||||
|
||||
"row 1", "0.00", "2.00", "78.00"
|
||||
"row 2", "5.00", "4.00", "12.00"
|
||||
"row 3", "7.00", "6.00", "32.00"
|
||||
"row 4", "23.00", "1.00", "9.00"
|
||||
|
||||
.. csv-table:: mat3x4 **(m)**
|
||||
:header: "", "column 1", "column 2", "column 3"
|
||||
|
||||
"row 1", "0.00", "0.00", "0.00"
|
||||
"row 2", "0.00", "0.00", "0.00"
|
||||
"row 3", "0.00", "0.00", "0.00"
|
||||
"row 4", "0.00", "0.00", "0.00"
|
||||
|
||||
.. c:function:: void glm_mat3x4_make(const float * __restrict src, mat3x4 dest)
|
||||
|
||||
Create mat3x4 (dest) from pointer (src).
|
||||
|
||||
.. note:: **@src** must contain at least 12 elements.
|
||||
|
||||
Parameters:
|
||||
| *[in]* **src** pointer to an array of floats (left)
|
||||
| *[out]* **dest** destination (result, mat3x4)
|
||||
|
||||
.. csv-table:: float array (1x12) **(src)**
|
||||
:header: "", "column 1"
|
||||
|
||||
"row 1", "v0"
|
||||
"row 2", "v1"
|
||||
"row 3", "v2"
|
||||
"row 4", "v3"
|
||||
"row 5", "v4"
|
||||
"row 6", "v5"
|
||||
"row 7", "v6"
|
||||
"row 8", "v7"
|
||||
"row 9", "v8"
|
||||
"row 10", "v9"
|
||||
"row 11", "v10"
|
||||
"row 12", "v11"
|
||||
|
||||
.. csv-table:: mat3x4 **(dest)**
|
||||
:header: "", "column 1", "column 2", "column 3"
|
||||
|
||||
"row 1", "v0", "v4", "v8"
|
||||
"row 2", "v1", "v5", "v9"
|
||||
"row 3", "v2", "v6", "v10"
|
||||
"row 4", "v3", "v7", "v11"
|
||||
|
||||
.. c:function:: void glm_mat3x4_mul(mat3x4 m1, mat4x3 m2, mat4 dest)
|
||||
|
||||
Multiply mat3x4 (m1) by mat4x3 (m2) and store in mat4 (dest).
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
glm_mat3x4_mul(mat3x4, mat4x3, mat4);
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m1** mat2x4 (left)
|
||||
| *[in]* **m2** mat4x2 (right)
|
||||
| *[out]* **dest** destination (result, mat4)
|
||||
|
||||
.. csv-table:: mat3x4 **(m1)**
|
||||
:header: "", "column 1", "column 2", "column 3"
|
||||
|
||||
"row 1", "a00", "a10", "a20"
|
||||
"row 2", "a01", "a11", "a21"
|
||||
"row 3", "a02", "a12", "a22"
|
||||
"row 4", "a03", "a13", "a23"
|
||||
|
||||
.. csv-table:: mat4x3 **(m2)**
|
||||
:header: "", "column 1", "column 2", "column 3", "column 4"
|
||||
|
||||
"row 1", "b00", "b10", "b20", "b30"
|
||||
"row 2", "b01", "b11", "b21", "b31"
|
||||
"row 3", "b02", "b12", "b22", "b32"
|
||||
|
||||
.. csv-table:: mat4x4 **(dest)**
|
||||
:header: "", "column 1", "column 2", "column 3", "column 4"
|
||||
|
||||
"row 1", "a00 * b00 + a10 * b01 + a20 * b02", "a00 * b10 + a10 * b11 + a20 * b12", "a00 * b20 + a10 * b21 + a20 * b22", "a00 * b30 + a10 * b31 + a20 * b32"
|
||||
"row 2", "a01 * b00 + a11 * b01 + a21 * b02", "a01 * b10 + a11 * b11 + a21 * b12", "a01 * b20 + a11 * b21 + a21 * b22", "a01 * b30 + a11 * b31 + a21 * b32"
|
||||
"row 3", "a02 * b00 + a12 * b01 + a22 * b02", "a02 * b10 + a12 * b11 + a22 * b12", "a02 * b20 + a12 * b21 + a22 * b22", "a02 * b30 + a12 * b31 + a22 * b32"
|
||||
"row 4", "a03 * b00 + a13 * b01 + a23 * b02", "a03 * b10 + a13 * b11 + a23 * b12", "a03 * b20 + a13 * b21 + a23 * b22", "a03 * b30 + a13 * b31 + a23 * b32"
|
||||
|
||||
.. c:function:: void glm_mat3x4_mulv(mat3x4 m, vec3 v, vec4 dest)
|
||||
|
||||
Multiply ma3x4 (m) by vec3 (v) and store in vec4 (dest).
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** mat3x4 (left)
|
||||
| *[in]* **v** vec3 (right, column vector)
|
||||
| *[out]* **dest** destination (result, column vector)
|
||||
|
||||
.. csv-table:: mat3x4 **(m)**
|
||||
:header: "", "column 1", "column 2", "column 3"
|
||||
|
||||
"row 1", "m00", "m10", "m20"
|
||||
"row 2", "m01", "m11", "m21"
|
||||
"row 3", "m02", "m12", "m22"
|
||||
"row 4", "m03", "m13", "m23"
|
||||
|
||||
.. csv-table:: column vec3 (1x3) **(v)**
|
||||
:header: "", "column 1"
|
||||
|
||||
"row 1", "v0"
|
||||
"row 2", "v1"
|
||||
"row 3", "v2"
|
||||
|
||||
.. csv-table:: column vec4 (1x4) **(dest)**
|
||||
:header: "", "column 1"
|
||||
|
||||
"row 1", "m00 * v0 + m10 * v1 + m20 * v2"
|
||||
"row 2", "m01 * v0 + m11 * v1 + m21 * v2"
|
||||
"row 3", "m02 * v0 + m12 * v1 + m22 * v2"
|
||||
"row 4", "m03 * v0 + m13 * v1 + m23 * v2"
|
||||
|
||||
.. c:function:: void glm_mat3x4_transpose(mat3x4 src, mat4x3 dest)
|
||||
|
||||
Transpose mat3x4 (src) and store in mat4x3 (dest).
|
||||
|
||||
Parameters:
|
||||
| *[in]* **src** mat3x4 (left)
|
||||
| *[out]* **dest** destination (result, mat4x3)
|
||||
|
||||
.. csv-table:: mat3x4 **(src)**
|
||||
:header: "", "column 1", "column 2", "column 3"
|
||||
|
||||
"row 1", "a00", "a10", "a20"
|
||||
"row 2", "a01", "a11", "a21"
|
||||
"row 3", "a02", "a12", "a22"
|
||||
"row 4", "a03", "a13", "a23"
|
||||
|
||||
.. csv-table:: mat4x3 **(dest)**
|
||||
:header: "", "column 1", "column 2", "column 3", "column 4"
|
||||
|
||||
"row 1", "b00 = a00", "b10 = a01", "b20 = a02", "b30 = a03"
|
||||
"row 2", "b01 = a10", "b11 = a11", "b21 = a12", "b31 = a13"
|
||||
"row 3", "b02 = a20", "b12 = a21", "b22 = a22", "b32 = a23"
|
||||
|
||||
.. c:function:: void glm_mat3x4_scale(mat3x4 m, float s)
|
||||
|
||||
Multiply mat3x4 (m) by scalar constant (s).
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** mat3x4 (src, dest)
|
||||
| *[in]* **s** float (scalar)
|
||||
|
||||
.. csv-table:: mat3x4 **(m)**
|
||||
:header: "", "column 1", "column 2", "column 3"
|
||||
|
||||
"row 1", "m00 = m00 * s", "m10 = m10 * s", "m20 = m20 * s"
|
||||
"row 2", "m01 = m01 * s", "m11 = m11 * s", "m21 = m21 * s"
|
||||
"row 3", "m02 = m02 * s", "m12 = m12 * s", "m22 = m22 * s"
|
||||
"row 4", "m03 = m03 * s", "m13 = m13 * s", "m23 = m23 * s"
|
||||
328
docs/source/mat4.rst
Normal file
328
docs/source/mat4.rst
Normal file
@@ -0,0 +1,328 @@
|
||||
.. default-domain:: C
|
||||
|
||||
mat4
|
||||
====
|
||||
|
||||
Header: cglm/mat4.h
|
||||
|
||||
Important: :c:func:`glm_mat4_scale` multiplies mat4 with scalar, if you need to
|
||||
apply scale transform use :c:func:`glm_scale` functions.
|
||||
|
||||
Table of contents (click to go):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Macros:
|
||||
|
||||
1. GLM_MAT4_IDENTITY_INIT
|
||||
#. GLM_MAT4_ZERO_INIT
|
||||
#. GLM_MAT4_IDENTITY
|
||||
#. GLM_MAT4_ZERO
|
||||
#. glm_mat4_udup(mat, dest)
|
||||
#. glm_mat4_dup(mat, dest)
|
||||
|
||||
Functions:
|
||||
|
||||
1. :c:func:`glm_mat4_ucopy`
|
||||
#. :c:func:`glm_mat4_copy`
|
||||
#. :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_pick3t`
|
||||
#. :c:func:`glm_mat4_ins3`
|
||||
#. :c:func:`glm_mat4_mul`
|
||||
#. :c:func:`glm_mat4_mulN`
|
||||
#. :c:func:`glm_mat4_mulv`
|
||||
#. :c:func:`glm_mat4_mulv3`
|
||||
#. :c:func:`glm_mat4_trace`
|
||||
#. :c:func:`glm_mat4_trace3`
|
||||
#. :c:func:`glm_mat4_quat`
|
||||
#. :c:func:`glm_mat4_transpose_to`
|
||||
#. :c:func:`glm_mat4_transpose`
|
||||
#. :c:func:`glm_mat4_scale_p`
|
||||
#. :c:func:`glm_mat4_scale`
|
||||
#. :c:func:`glm_mat4_det`
|
||||
#. :c:func:`glm_mat4_inv`
|
||||
#. :c:func:`glm_mat4_inv_fast`
|
||||
#. :c:func:`glm_mat4_swap_col`
|
||||
#. :c:func:`glm_mat4_swap_row`
|
||||
#. :c:func:`glm_mat4_rmc`
|
||||
#. :c:func:`glm_mat4_make`
|
||||
#. :c:func:`glm_mat4_textrans`
|
||||
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. c:function:: void glm_mat4_ucopy(mat4 mat, mat4 dest)
|
||||
|
||||
copy mat4 to another one (dest). u means align is not required for dest
|
||||
|
||||
Parameters:
|
||||
| *[in]* **mat** source
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_mat4_copy(mat4 mat, mat4 dest)
|
||||
|
||||
copy mat4 to another one (dest).
|
||||
|
||||
Parameters:
|
||||
| *[in]* **mat** source
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_mat4_identity(mat4 mat)
|
||||
|
||||
copy identity mat4 to mat, or makes mat to identity
|
||||
|
||||
Parameters:
|
||||
| *[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)
|
||||
|
||||
copy upper-left of mat4 to mat3
|
||||
|
||||
Parameters:
|
||||
| *[in]* **mat** source
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_mat4_pick3t(mat4 mat, mat4 dest)
|
||||
|
||||
copy upper-left of mat4 to mat3 (transposed)
|
||||
the postfix t stands for transpose
|
||||
|
||||
Parameters:
|
||||
| *[in]* **mat** source
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_mat4_ins3(mat3 mat, mat4 dest)
|
||||
|
||||
copy mat3 to mat4's upper-left. this function does not fill mat4's other
|
||||
elements. To do that use glm_mat4.
|
||||
|
||||
Parameters:
|
||||
| *[in]* **mat** source
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_mat4_mul(mat4 m1, mat4 m2, mat4 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
|
||||
|
||||
mat4 m = GLM_MAT4_IDENTITY_INIT;
|
||||
glm_mat4_mul(m, m, m);
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m1** left matrix
|
||||
| *[in]* **m2** right matrix
|
||||
| *[out]* **dest** destination matrix
|
||||
|
||||
.. c:function:: void glm_mat4_mulN(mat4 * __restrict matrices[], int len, mat4 dest)
|
||||
|
||||
mupliply N mat4 matrices and store result in dest
|
||||
| this function lets you multiply multiple (more than two or more...)
|
||||
| matrices
|
||||
|
||||
| multiplication will be done in loop, this may reduce instructions
|
||||
| size but if **len** is too small then compiler may unroll whole loop
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
mat4 m1, m2, m3, m4, res;
|
||||
glm_mat4_mulN((mat4 *[]){&m1, &m2, &m3, &m4}, 4, res);
|
||||
|
||||
Parameters:
|
||||
| *[in]* **matrices** array of mat4
|
||||
| *[in]* **len** matrices count
|
||||
| *[out]* **dest** destination matrix
|
||||
|
||||
.. c:function:: void glm_mat4_mulv(mat4 m, vec4 v, vec4 dest)
|
||||
|
||||
multiply mat4 with vec4 (column vector) and store in dest vector
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** mat4 (left)
|
||||
| *[in]* **v** vec4 (right, column vector)
|
||||
| *[out]* **dest** vec4 (result, column vector)
|
||||
|
||||
.. c:function:: void glm_mat4_mulv3(mat4 m, vec3 v, float last, vec3 dest)
|
||||
|
||||
| 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:
|
||||
| *[in]* **m** mat4(affine transform)
|
||||
| *[in]* **v** vec3
|
||||
| *[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)
|
||||
|
||||
transpose mat4 and store in dest
|
||||
source matrix will not be transposed unless dest is m
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** matrix
|
||||
| *[out]* **dest** destination matrix
|
||||
|
||||
.. c:function:: void glm_mat4_transpose(mat4 m)
|
||||
|
||||
transpose mat4 and store result in same matrix
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** source
|
||||
| *[out]* **dest** destination matrix
|
||||
|
||||
.. c:function:: void glm_mat4_scale_p(mat4 m, float s)
|
||||
|
||||
scale (multiply with scalar) matrix without simd optimization
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** matrix
|
||||
| *[in]* **s** scalar
|
||||
|
||||
.. c:function:: void glm_mat4_scale(mat4 m, float s)
|
||||
|
||||
scale (multiply with scalar) matrix
|
||||
THIS IS NOT SCALE TRANSFORM, use glm_scale for that.
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** matrix
|
||||
| *[in]* **s** scalar
|
||||
|
||||
.. c:function:: float glm_mat4_det(mat4 mat)
|
||||
|
||||
mat4 determinant
|
||||
|
||||
Parameters:
|
||||
| *[in]* **mat** matrix
|
||||
|
||||
Return:
|
||||
| determinant
|
||||
|
||||
.. c:function:: void glm_mat4_inv(mat4 mat, mat4 dest)
|
||||
|
||||
inverse mat4 and store in dest
|
||||
|
||||
Parameters:
|
||||
| *[in]* **mat** source
|
||||
| *[out]* **dest** destination matrix (inverse matrix)
|
||||
|
||||
.. c:function:: void glm_mat4_inv_fast(mat4 mat, mat4 dest)
|
||||
|
||||
inverse mat4 and store in dest
|
||||
|
||||
| this func uses reciprocal approximation without extra corrections
|
||||
| e.g Newton-Raphson. this should work faster than normal,
|
||||
| to get more precise use glm_mat4_inv version.
|
||||
|
||||
.. note:: You will lose precision, glm_mat4_inv is more accurate
|
||||
|
||||
Parameters:
|
||||
| *[in]* **mat** source
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_mat4_swap_col(mat4 mat, int col1, int col2)
|
||||
|
||||
swap two matrix columns
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **mat** matrix
|
||||
| *[in]* **col1** col1
|
||||
| *[in]* **col2** col2
|
||||
|
||||
.. c:function:: void glm_mat4_swap_row(mat4 mat, int row1, int row2)
|
||||
|
||||
swap two matrix rows
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **mat** matrix
|
||||
| *[in]* **row1** row1
|
||||
| *[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
|
||||
|
||||
.. c:function:: void glm_mat4_make(const float * __restrict src, mat4 dest)
|
||||
|
||||
Create mat4 matrix from pointer
|
||||
|
||||
.. note:: **@src** must contain at least 16 elements.
|
||||
|
||||
Parameters:
|
||||
| *[in]* **src** pointer to an array of floats
|
||||
| *[out]* **dest** destination matrix4x4
|
||||
|
||||
.. c:function:: void glm_mat4_textrans(float sx, float sy, float rot, float tx, float ty, mat4 dest)
|
||||
|
||||
Create texture transformation matrix, rotation is in radians CCW/RH
|
||||
|
||||
Parameters:
|
||||
| *[in]* **sx** scale x
|
||||
| *[in]* **sy** scale y
|
||||
| *[in]* **rot** rotation in radians CCW/RH
|
||||
| *[in]* **tx** translation x
|
||||
| *[in]* **ty** translation y
|
||||
| *[out]* **dest** destination matrix3x3
|
||||
201
docs/source/mat4x2.rst
Normal file
201
docs/source/mat4x2.rst
Normal file
@@ -0,0 +1,201 @@
|
||||
.. default-domain:: C
|
||||
|
||||
mat4x2
|
||||
======
|
||||
|
||||
Header: cglm/mat4x2.h
|
||||
|
||||
Table of contents (click to go):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Macros:
|
||||
|
||||
1. GLM_MAT4X2_ZERO_INIT
|
||||
#. GLM_MAT4X2_ZERO
|
||||
|
||||
Functions:
|
||||
|
||||
1. :c:func:`glm_mat4x2_copy`
|
||||
#. :c:func:`glm_mat4x2_zero`
|
||||
#. :c:func:`glm_mat4x2_make`
|
||||
#. :c:func:`glm_mat4x2_mul`
|
||||
#. :c:func:`glm_mat4x2_mulv`
|
||||
#. :c:func:`glm_mat4x2_transpose`
|
||||
#. :c:func:`glm_mat4x2_scale`
|
||||
|
||||
Represented
|
||||
~~~~~~~~~~~
|
||||
|
||||
.. csv-table:: mat4x2
|
||||
:header: "", "column 1", "column 2", "column 3", "column4"
|
||||
|
||||
"row 1", "m00", "m10", "m20", "m30"
|
||||
"row 2", "m01", "m11", "m21", "m31"
|
||||
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. c:function:: void glm_mat4x2_copy(mat4x2 src, mat4x2 dest)
|
||||
|
||||
Copy mat4x2 (src) to mat4x2 (dest).
|
||||
|
||||
Parameters:
|
||||
| *[in]* **src** mat4x2 (left)
|
||||
| *[out]* **dest** destination (result, mat4x2)
|
||||
|
||||
.. csv-table:: mat4x2 **(src)**
|
||||
:header: "", "column 1", "column 2", "column 3", "column 4"
|
||||
|
||||
"row 1", "a00", "a10", "a20", "a30"
|
||||
"row 2", "a01", "a11", "a21", "a31"
|
||||
|
||||
.. csv-table:: ma4x2 **(dest)**
|
||||
:header: "", "column 1", "column 2", "column 3", "column 4"
|
||||
|
||||
"row 1", "b00 = a00", "b10 = a10", "b20 = a20", "b30 = a30"
|
||||
"row 2", "b01 = a01", "b11 = a11", "b21 = a21", "b31 = a31"
|
||||
|
||||
.. c:function:: void glm_mat4x2_zero(mat4x2 m)
|
||||
|
||||
Zero out the mat4x2 (m).
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** mat4x2 (src, dest)
|
||||
|
||||
.. csv-table:: mat4x2 **(m)**
|
||||
:header: "", "column 1", "column 2", "column 3", "column 4"
|
||||
|
||||
"row 1", "0.00", "2.00", "15.00", "44.00"
|
||||
"row 2", "5.00", "4.00", "6.00", "12.00"
|
||||
|
||||
.. csv-table:: mat4x2 **(m)**
|
||||
:header: "", "column 1", "column 2", "column 3", "column 4"
|
||||
|
||||
"row 1", "0.00", "0.00", "0.00", "0.00"
|
||||
"row 2", "0.00", "0.00", "0.00", "0.00"
|
||||
|
||||
.. c:function:: void glm_mat4x2_make(const float * __restrict src, mat4x2 dest)
|
||||
|
||||
Create mat4x2 (dest) from pointer (src).
|
||||
|
||||
.. note:: **@src** must contain at least 8 elements.
|
||||
|
||||
Parameters:
|
||||
| *[in]* **src** pointer to an array of floats (left)
|
||||
| *[out]* **dest** destination (result, mat4x2)
|
||||
|
||||
.. csv-table:: float array (1x8) **(src)**
|
||||
:header: "", "column 1"
|
||||
|
||||
"row 1", "v0"
|
||||
"row 2", "v1"
|
||||
"row 3", "v2"
|
||||
"row 4", "v3"
|
||||
"row 5", "v4"
|
||||
"row 6", "v5"
|
||||
"row 7", "v6"
|
||||
"row 8", "v7"
|
||||
|
||||
.. csv-table:: mat4x2 **(dest)**
|
||||
:header: "", "column 1", "column 2", "column 3", "column 4"
|
||||
|
||||
"row 1", "v0", "v2", "v4", "v6"
|
||||
"row 2", "v1", "v3", "v5", "v7"
|
||||
|
||||
.. c:function:: void glm_mat4x2_mul(mat4x2 m1, mat2x4 m2, mat2 dest)
|
||||
|
||||
Multiply mat4x2 (m1) by mat2x4 (m2) and store in mat2 (dest).
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
glm_mat4x2_mul(mat4x2, mat2x4, mat2);
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m1** mat4x2 (left)
|
||||
| *[in]* **m2** mat2x4 (right)
|
||||
| *[out]* **dest** destination (result, mat2)
|
||||
|
||||
.. csv-table:: mat4x2 **(m1)**
|
||||
:header: "", "column 1", "column 2", "column 3", "column 4"
|
||||
|
||||
"row 1", "a00", "a10", "a20", "a30"
|
||||
"row 2", "a01", "a11", "a21", "a31"
|
||||
|
||||
.. csv-table:: mat2x4 **(m2)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "b00", "b10"
|
||||
"row 2", "b01", "b11"
|
||||
"row 3", "b02", "b12"
|
||||
"row 4", "b03", "b13"
|
||||
|
||||
.. csv-table:: mat2x2 **(dest)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "a00 * b00 + a10 * b01 + a20 * b02 + a30 * b03", "a00 * b10 + a10 * b11 + a20 * b12 + a30 * b13"
|
||||
"row 2", "a01 * b00 + a11 * b01 + a21 * b02 + a31 * b03", "a01 * b10 + a11 * b11 + a21 * b12 + a31 * b13"
|
||||
|
||||
.. c:function:: void glm_mat4x2_mulv(mat4x2 m, vec4 v, vec2 dest)
|
||||
|
||||
Multiply mat4x2 (m) by vec4 (v) and store in vec2 (dest).
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** mat4x2 (left)
|
||||
| *[in]* **v** vec4 (right, column vector)
|
||||
| *[out]* **dest** destination (result, column vector)
|
||||
|
||||
.. csv-table:: mat4x2 **(m)**
|
||||
:header: "", "column 1", "column 2", "column 3", "column 4"
|
||||
|
||||
"row 1", "m00", "m10", "m20", "m30"
|
||||
"row 2", "m01", "m11", "m21", "m31"
|
||||
|
||||
.. csv-table:: column vec4 (1x4) **(v)**
|
||||
:header: "", "column 1"
|
||||
|
||||
"row 1", "v0"
|
||||
"row 2", "v1"
|
||||
"row 3", "v2"
|
||||
"row 4", "v3"
|
||||
|
||||
.. csv-table:: column vec2 (1x2) **(dest)**
|
||||
:header: "", "column 1"
|
||||
|
||||
"row 1", "m00 * v0 + m10 * v1 + m20 * v2 + m30 * v3"
|
||||
"row 2", "m01 * v0 + m11 * v1 + m21 * v2 + m31 * v3"
|
||||
|
||||
.. c:function:: void glm_mat4x2_transpose(mat4x2 src, mat2x4 dest)
|
||||
|
||||
Transpose mat4x2 (src) and store in mat2x4 (dest).
|
||||
|
||||
Parameters:
|
||||
| *[in]* **src** mat4x2 (left)
|
||||
| *[out]* **dest** destination (result, mat2x4)
|
||||
|
||||
.. csv-table:: mat4x2 **(src)**
|
||||
:header: "", "column 1", "column 2", "column 3", "column 4"
|
||||
|
||||
"row 1", "a00", "a10", "a20", "a30"
|
||||
"row 2", "a01", "a11", "a21", "a31"
|
||||
|
||||
.. csv-table:: mat2x4 **(dest)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "b00 = a00", "b10 = a01"
|
||||
"row 2", "b01 = a10", "b11 = a11"
|
||||
"row 3", "b02 = a20", "b12 = a21"
|
||||
"row 4", "b03 = a30", "b13 = a31"
|
||||
|
||||
.. c:function:: void glm_mat4x2_scale(mat4x2 m, float s)
|
||||
|
||||
Multiply mat4x2 (m) by scalar constant (s).
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** mat4x2 (src, dest)
|
||||
| *[in]* **s** float (scalar)
|
||||
|
||||
.. csv-table:: mat4x2 **(m)**
|
||||
:header: "", "column 1", "column 2", "column 3", "column 4"
|
||||
|
||||
"row 1", "m00 = m00 * s", "m10 = m10 * s", "m20 = m20 * s", "m30 = m30 * s"
|
||||
"row 2", "m01 = m01 * s", "m11 = m11 * s", "m21 = m21 * s", "m31 = m31 * s"
|
||||
217
docs/source/mat4x3.rst
Normal file
217
docs/source/mat4x3.rst
Normal file
@@ -0,0 +1,217 @@
|
||||
.. default-domain:: C
|
||||
|
||||
mat4x3
|
||||
======
|
||||
|
||||
Header: cglm/mat4x3.h
|
||||
|
||||
Table of contents (click to go):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Macros:
|
||||
|
||||
1. GLM_MAT4X3_ZERO_INIT
|
||||
#. GLM_MAT4X3_ZERO
|
||||
|
||||
Functions:
|
||||
|
||||
1. :c:func:`glm_mat4x3_copy`
|
||||
#. :c:func:`glm_mat4x3_zero`
|
||||
#. :c:func:`glm_mat4x3_make`
|
||||
#. :c:func:`glm_mat4x3_mul`
|
||||
#. :c:func:`glm_mat4x3_mulv`
|
||||
#. :c:func:`glm_mat4x3_transpose`
|
||||
#. :c:func:`glm_mat4x3_scale`
|
||||
|
||||
Represented
|
||||
~~~~~~~~~~~
|
||||
|
||||
.. csv-table:: mat4x3
|
||||
:header: "", "column 1", "column 2", "column 3", "column 4"
|
||||
|
||||
"row 1", "m00", "m10", "m20", "m30"
|
||||
"row 2", "m01", "m11", "m21", "m31"
|
||||
"row 3", "m02", "m12", "m22", "m32"
|
||||
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. c:function:: void glm_mat4x3_copy(mat4x3 src, mat4x3 dest)
|
||||
|
||||
Copy mat4x3 (src) to mat4x3 (dest).
|
||||
|
||||
Parameters:
|
||||
| *[in]* **src** mat4x3 (left)
|
||||
| *[out]* **dest** destination (result, mat4x3)
|
||||
|
||||
.. csv-table:: mat4x3 **(src)**
|
||||
:header: "", "column 1", "column 2", "column 3", "column 4"
|
||||
|
||||
"row 1", "a00", "a10", "a20", "a30"
|
||||
"row 2", "a01", "a11", "a21", "a31"
|
||||
"row 3", "a02", "a12", "a22", "a32"
|
||||
|
||||
.. csv-table:: mat4x3 **(dest)**
|
||||
:header: "", "column 1", "column 2", "column 3", "column 4"
|
||||
|
||||
"row 1", "b00 = a00", "b10 = a10", "b20 = a20", "b30 = a30"
|
||||
"row 2", "b01 = a01", "b11 = a11", "b21 = a21", "b31 = a31"
|
||||
"row 3", "b02 = a02", "b12 = a12", "b22 = a22", "b32 = a32"
|
||||
|
||||
.. c:function:: void glm_mat4x3_zero(mat4x3 m)
|
||||
|
||||
Zero out the mat4x3 (m).
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** mat4x3 (src, dest)
|
||||
|
||||
.. csv-table:: mat4x3 **(m)**
|
||||
:header: "", "column 1", "column 2", "column 3", "column 4"
|
||||
|
||||
"row 1", "0.00", "2.00", "15.00", "44.00"
|
||||
"row 2", "5.00", "4.00", "6.00", "12.00"
|
||||
"row 3", "88.00", "8.00", "4.30", "15.00"
|
||||
|
||||
.. csv-table:: mat4x3 **(m)**
|
||||
:header: "", "column 1", "column 2", "column 3", "column 4"
|
||||
|
||||
"row 1", "0.00", "0.00", "0.00", "0.00"
|
||||
"row 2", "0.00", "0.00", "0.00", "0.00"
|
||||
"row3", "0.00", "0.00", "0.00", "0.00"
|
||||
|
||||
.. c:function:: void glm_mat4x3_make(const float * __restrict src, mat4x3 dest)
|
||||
|
||||
Create mat4x3 (dest) from pointer (src).
|
||||
|
||||
.. note:: **@src** must contain at least 12 elements.
|
||||
|
||||
Parameters:
|
||||
| *[in]* **src** pointer to an array of floats (left)
|
||||
| *[out]* **dest** destination (result, mat4x3)
|
||||
|
||||
.. csv-table:: float array (1x12) **(src)**
|
||||
:header: "", "column 1"
|
||||
|
||||
"row 1", "v0"
|
||||
"row 2", "v1"
|
||||
"row 3", "v2"
|
||||
"row 4", "v3"
|
||||
"row 5", "v4"
|
||||
"row 6", "v5"
|
||||
"row 7", "v6"
|
||||
"row 8", "v7"
|
||||
"row 9", "v8"
|
||||
"row 10", "v9"
|
||||
"row 11", "v10"
|
||||
"row 12", "v11"
|
||||
|
||||
.. csv-table:: mat4x3 **(dest)**
|
||||
:header: "", "column 1", "column 2", "column 3", "column 4"
|
||||
|
||||
"row 1", "v0", "v3", "v6", "v9"
|
||||
"row 2", "v1", "v4", "v7", "v10"
|
||||
"row 3", "v2", "v5", "v8", "v11"
|
||||
|
||||
.. c:function:: void glm_mat4x3_mul(mat4x3 m1, mat3x4 m2, mat3 dest)
|
||||
|
||||
Multiply mat4x3 (m1) by mat3x4 (m2) and store in mat3 (dest).
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
glm_mat4x3_mul(mat4x3, mat3x4, mat3);
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m1** mat4x3 (left)
|
||||
| *[in]* **m2** mat3x4 (right)
|
||||
| *[out]* **dest** destination (result, mat3)
|
||||
|
||||
.. csv-table:: mat4x3 **(m1)**
|
||||
:header: "", "column 1", "column 2", "column 3", "column 4"
|
||||
|
||||
"row 1", "a00", "a10", "a20", "a30"
|
||||
"row 2", "a01", "a11", "a21", "a31"
|
||||
"row 3", "a02", "a12", "a22", "a32"
|
||||
|
||||
.. csv-table:: mat3x4 **(m2)**
|
||||
:header: "", "column 1", "column 2", "column 3"
|
||||
|
||||
"row 1", "b00", "b10", "b20"
|
||||
"row 2", "b01", "b11", "b21"
|
||||
"row 3", "b02", "b12", "b22"
|
||||
"row 4", "b03", "b13", "b23"
|
||||
|
||||
.. csv-table:: mat3x3 **(dest)**
|
||||
:header: "", "column 1", "column 2", "column 3"
|
||||
|
||||
"row 1", "a00 * b00 + a10 * b01 + a20 * b02 + a30 * b03", "a00 * b10 + a10 * b11 + a20 * b12 + a30 * b13", "a00 * b20 + a10 * b21 + a20 * b22 + a30 * b23"
|
||||
"row 2", "a01 * b00 + a11 * b01 + a21 * b02 + a31 * b03", "a01 * b10 + a11 * b11 + a21 * b12 + a31 * b13", "a01 * b20 + a11 * b21 + a21 * b22 + a31 * b23"
|
||||
"row 3", "a02 * b00 + a12 * b01 + a22 * b02 + a32 * b03", "a02 * b10 + a12 * b11 + a22 * b12 + a32 * b13", "a02 * b20 + a12 * b21 + a22 * b22 + a32 * b23"
|
||||
|
||||
.. c:function:: void glm_mat4x3_mulv(mat4x3 m, vec4 v, vec3 dest)
|
||||
|
||||
Multiply mat4x3 (m) by vec4 (v) and store in vec3 (dest).
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** mat4x3 (left)
|
||||
| *[in]* **v** vec4 (right, column vector)
|
||||
| *[out]* **dest** destination (result, column vector)
|
||||
|
||||
.. csv-table:: mat4x3 **(m)**
|
||||
:header: "", "column 1", "column 2", "column 3", "column 4"
|
||||
|
||||
"row 1", "m00", "m10", "m20", "m30"
|
||||
"row 2", "m01", "m11", "m21", "m31"
|
||||
"row 3", "m02", "m12", "m22", "m32"
|
||||
|
||||
.. csv-table:: column vec4 (1x4) **(v)**
|
||||
:header: "", "column 1"
|
||||
|
||||
"row 1", "v0"
|
||||
"row 2", "v1"
|
||||
"row 3", "v2"
|
||||
"row 4", "v3"
|
||||
|
||||
.. csv-table:: column vec3 (1x3) **(dest)**
|
||||
:header: "", "column 1"
|
||||
|
||||
"row 1", "m00 * v0 + m10 * v1 + m20 * v2 + m30 * v3"
|
||||
"row 2", "m01 * v0 + m11 * v1 + m21 * v2 + m31 * v3"
|
||||
"row 3", "m02 * v0 + m12 * v1 + m22 * v2 + m32 * v3"
|
||||
|
||||
.. c:function:: void glm_mat4x3_transpose(mat4x3 src, mat3x4 dest)
|
||||
|
||||
Transpose mat4x3 (src) and store in mat3x4 (dest).
|
||||
|
||||
Parameters:
|
||||
| *[in]* **src** mat4x3 (left)
|
||||
| *[out]* **dest** destination (result, mat3x4)
|
||||
|
||||
.. csv-table:: mat4x3 **(src)**
|
||||
:header: "", "column 1", "column 2", "column 3", "column 4"
|
||||
|
||||
"row 1", "a00", "a10", "a20", "a30"
|
||||
"row 2", "a01", "a11", "a21", "a31"
|
||||
"row 3", "a02", "a12", "a22", "a32"
|
||||
|
||||
.. csv-table:: mat3x4 **(dest)**
|
||||
:header: "", "column 1", "column 2", "column 3"
|
||||
|
||||
"row 1", "b00 = a00", "b10 = a01", "b20 = a02"
|
||||
"row 2", "b01 = a10", "b11 = a11", "b21 = a12"
|
||||
"row 3", "b02 = a20", "b12 = a21", "b22 = a22"
|
||||
"row 4", "b03 = a30", "b13 = a31", "b23 = a32"
|
||||
|
||||
.. c:function:: void glm_mat4x3_scale(mat4x3 m, float s)
|
||||
|
||||
Multiply mat4x3 (m) by scalar constant (s).
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** mat4x3 (src, dest)
|
||||
| *[in]* **s** float (scalar)
|
||||
|
||||
.. csv-table:: mat4x3 **(m)**
|
||||
:header: "", "column 1", "column 2", "column 3", "column 4"
|
||||
|
||||
"row 1", "m00 = m00 * s", "m10 = m10 * s", "m20 = m20 * s", "m30 = m30 * s"
|
||||
"row 2", "m01 = m01 * s", "m11 = m11 * s", "m21 = m21 * s", "m31 = m31 * s"
|
||||
"row 3", "m02 = m02 * s", "m12 = m12 * s", "m22 = m22 * s", "m32 = m32 * s"
|
||||
60
docs/source/noise.rst
Normal file
60
docs/source/noise.rst
Normal file
@@ -0,0 +1,60 @@
|
||||
.. default-domain:: C
|
||||
|
||||
perlin
|
||||
================================================================================
|
||||
|
||||
Header: cglm/noise.h
|
||||
|
||||
Classic Perlin noise implementation.
|
||||
|
||||
Based on the work of Stefan Gustavson and Ashima Arts on "webgl-noise":
|
||||
https://github.com/stegu/webgl-noise
|
||||
Following Stefan Gustavson's paper "Simplex noise demystified":
|
||||
http://www.itn.liu.se/~stegu/simplexnoise/simplexnoise.pdf
|
||||
|
||||
Implementation based on glm::perlin function:
|
||||
https://github.com/g-truc/glm/blob/master/glm/gtc/noise.inl
|
||||
|
||||
Table of contents (click to go):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Functions:
|
||||
|
||||
1. :c:func:`glm_perlin_vec4`
|
||||
#. :c:func:`glm_perlin_vec3`
|
||||
#. :c:func:`glm_perlin_vec2`
|
||||
|
||||
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. c:function:: float glm_perlin_vec4(vec4 point)
|
||||
|
||||
| Classic Perlin noise
|
||||
|
||||
Parameters:
|
||||
| *[in]* **point** 4D point
|
||||
|
||||
Returns:
|
||||
| noise value
|
||||
|
||||
|
||||
.. c:function:: float glm_perlin_vec3(vec3 point)
|
||||
|
||||
| Classic Perlin noise
|
||||
|
||||
Parameters:
|
||||
| *[in]* **point** 3D point
|
||||
|
||||
Returns:
|
||||
| noise value
|
||||
|
||||
.. c:function:: float glm_perlin_vec2(vec2 point)
|
||||
|
||||
| Classic Perlin noise
|
||||
|
||||
Parameters:
|
||||
| *[in]* **point** 2D point
|
||||
|
||||
Returns:
|
||||
| noise value
|
||||
61
docs/source/opengl.rst
Normal file
61
docs/source/opengl.rst
Normal file
@@ -0,0 +1,61 @@
|
||||
How to send vector or matrix to OpenGL like API
|
||||
==================================================
|
||||
|
||||
*cglm*'s vector and matrix types are arrays. So you can send them directly to a
|
||||
function which accepts pointer. But you may got warnings for matrix because it is
|
||||
two dimensional array.
|
||||
|
||||
Passing / Uniforming Matrix to OpenGL:
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
**glUniformMatrix4fv** accepts float pointer, you can pass matrix to that parameter
|
||||
and it should work but with warnings. "You can pass" doesn't mean that you must pass like that.
|
||||
|
||||
**Correct options:**
|
||||
|
||||
Correct doesn't mean correct way to use OpenGL it is just shows correct way to pass cglm type to it.
|
||||
|
||||
1. Pass first column
|
||||
---------------------
|
||||
|
||||
The goal is that pass address of matrix, first element of matrix is also address of matrix,
|
||||
because it is array of vectors and vector is array of floats.
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
mat4 matrix;
|
||||
/* ... */
|
||||
glUniformMatrix4fv(location, 1, GL_FALSE, matrix[0]);
|
||||
|
||||
array of matrices:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
mat4 matrix;
|
||||
/* ... */
|
||||
glUniformMatrix4fv(location, count, GL_FALSE, matrix[0][0]);
|
||||
|
||||
2. Cast matrix to pointer
|
||||
--------------------------
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
mat4 matrix;
|
||||
/* ... */
|
||||
glUniformMatrix4fv(location, count, GL_FALSE, (float *)matrix);
|
||||
|
||||
in this way, passing array of matrices is same
|
||||
|
||||
Passing / Uniforming Vectors to OpenGL:
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
You don't need to do extra thing when passing cglm vectors to OpengL or other APIs.
|
||||
Because a function like **glUniform4fv** accepts vector as pointer. cglm's vectors
|
||||
are array of floats. So you can pass it directly to those functions:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
vec4 vec;
|
||||
/* ... */
|
||||
glUniform4fv(location, 1, vec);
|
||||
|
||||
this show how to pass **vec4** others are same.
|
||||
132
docs/source/opt.rst
Normal file
132
docs/source/opt.rst
Normal file
@@ -0,0 +1,132 @@
|
||||
.. default-domain:: C
|
||||
|
||||
🛠️ Options
|
||||
===============================================================================
|
||||
|
||||
A few options are provided via macros.
|
||||
|
||||
❗️ IMPORTANT ❗️
|
||||
|
||||
It's a good idea to set up your config macros in build settings like CMake, Xcode, or Visual Studio. This is especially important if you're using features like Modules in Xcode, where adding macros directly before the **cglm** headers might not work.
|
||||
|
||||
Alignment Option
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
By default, **cglm** requires types to be aligned with specific byte requirements:
|
||||
|
||||
- vec3: 8 bytes
|
||||
- vec4: 16 bytes
|
||||
- mat4: 16 bytes (32 on AVX)
|
||||
- versor: 16 bytes
|
||||
|
||||
Starting with **v0.4.5**, **cglm** offers an option to relax these alignment requirements. To use this option, define the **CGLM_ALL_UNALIGNED** macro before including any headers. This definition can be made within Xcode, Visual Studio, other IDEs, or directly in your build system. If using pre-compiled versions of **cglm**, you'll need to compile them with the **CGLM_ALL_UNALIGNED** macro.
|
||||
|
||||
**❗️NOTE:❗️** If you're using **cglm** across multiple interdependent projects:
|
||||
|
||||
- Always or never use the **CGLM_ALL_UNALIGNED** macro in all linked projects to avoid configuration conflicts. A **cglm** header from one project could require alignment, while a header from another might not, leading to **cglm** functions accessing invalid memory locations.
|
||||
|
||||
- **Key Point:** Maintain the same **cglm** configuration across all your projects. For example, if you activate **CGLM_ALL_UNALIGNED** in one project, ensure it's set in the others too.
|
||||
|
||||
**❗️NOTE:❗️**
|
||||
|
||||
While **CGLM_ALL_UNALIGNED** allows for flexibility in alignment, it doesn't override C's fundamental alignment rules. For example, an array like *vec4* decays to a pointer (float*) in functions, which must adhere to the alignment requirements of a float pointer (4 bytes). This adherence is crucial because **cglm** directly dereferences these pointers instead of copying data, and failing to meet alignment requirements can lead to unpredictable errors, such as crashes.
|
||||
|
||||
You can use `CGLM_ALIGN` and `CGLM_ALIGN_MAT` macros for aligning local variables or struct members. However, when dealing with dynamic memory allocation or custom memory locations, you'll need to ensure alignment requirements are met appropriately for those cases
|
||||
|
||||
Clipspace Option[s]
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
By starting **v0.8.3** cglm provides options to switch between clipspace configurations.
|
||||
|
||||
Clipspace related files are located at `include/cglm/[struct]/clipspace.h` but
|
||||
these are included in related files like `cam.h`. If you don't want to change your existing
|
||||
clipspace configuration and want to use different clipspace function like `glm_lookat_zo` or `glm_lookat_lh_zo`...
|
||||
then you can include individual headers or just define `CGLM_CLIPSPACE_INCLUDE_ALL` which will include all headers for you.
|
||||
|
||||
1. **CGLM_CLIPSPACE_INCLUDE_ALL**
|
||||
2. **CGLM_FORCE_DEPTH_ZERO_TO_ONE**
|
||||
3. **CGLM_FORCE_LEFT_HANDED**
|
||||
|
||||
|
||||
1. **CGLM_CLIPSPACE_INCLUDE_ALL**:
|
||||
|
||||
By defining this macro, **cglm** will include all clipspace functions for you by just using
|
||||
`#include cglm/cglm.h` or `#include cglm/struct.h` or `#include cglm/call.h`
|
||||
|
||||
Otherwise you need to include header you want manually e.g. `#include cglm/clipspace/view_rh_zo.h`
|
||||
|
||||
2. **CGLM_FORCE_DEPTH_ZERO_TO_ONE**
|
||||
|
||||
This is similar to **GLM**'s **GLM_FORCE_DEPTH_ZERO_TO_ONE** option.
|
||||
This will set clip space between 0 to 1 which makes **cglm** Vulkan, Metal friendly.
|
||||
|
||||
You can use functions like `glm_lookat_lh_zo()` individually. By setting **CGLM_FORCE_DEPTH_ZERO_TO_ONE**
|
||||
functions in cam.h for instance will use `_zo` versions.
|
||||
|
||||
3. **CGLM_FORCE_LEFT_HANDED**
|
||||
|
||||
Force **cglm** to use the left handed coordinate system by default, currently **cglm** uses right handed coordinate system as default,
|
||||
you can change this behavior with this option.
|
||||
|
||||
**VERY VERY IMPORTANT:**
|
||||
|
||||
Be careful if you include **cglm** in multiple projects.
|
||||
|
||||
SSE and SSE2 Shuffle Option
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
**_mm_shuffle_ps** generates **shufps** instruction even if registers are same.
|
||||
You can force it to generate **pshufd** instruction by defining
|
||||
**CGLM_NO_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.
|
||||
|
||||
Struct API Options
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
To configure the Struct API namespace, you can define the following macros before including the cglm/struct.h header:
|
||||
|
||||
- **CGLM_OMIT_NS_FROM_STRUCT_API**: omits CGLM_STRUCT_API_NS (`glms_`) namespace completely if there is sub namespace e.g `mat4_`, `vec4_` ... DEFAULT is not defined
|
||||
- **CGLM_STRUCT_API_NS**: define name space for struct api, DEFAULT is **glms**
|
||||
- **CGLM_STRUCT_API_NAME_SUFFIX**: define name suffix, DEFAULT is **empty** e.g defining it as #define CGLM_STRUCT_API_NAME_SUFFIX s will add s suffix to mat4_mul -> mat4s_mul
|
||||
|
||||
|
||||
Print Options
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
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.
|
||||
33
docs/source/plane.rst
Normal file
33
docs/source/plane.rst
Normal file
@@ -0,0 +1,33 @@
|
||||
.. default-domain:: C
|
||||
|
||||
plane
|
||||
================================================================================
|
||||
|
||||
Header: cglm/plane.h
|
||||
|
||||
Plane extract functions are in frustum header and documented
|
||||
in :doc:`frustum` page.
|
||||
|
||||
**Definition of plane:**
|
||||
|
||||
Plane equation: **Ax + By + Cz + D = 0**
|
||||
|
||||
Plan is stored in **vec4** as **[A, B, C, D]**. (A, B, C) is normal and D is distance
|
||||
|
||||
Table of contents (click to go):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Functions:
|
||||
|
||||
1. :c:func:`glm_plane_normalize`
|
||||
|
||||
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. c:function:: void glm_plane_normalize(vec4 plane)
|
||||
|
||||
| normalizes a plane
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **plane** pnale to normalize
|
||||
119
docs/source/project.rst
Normal file
119
docs/source/project.rst
Normal file
@@ -0,0 +1,119 @@
|
||||
.. default-domain:: C
|
||||
|
||||
Project / UnProject
|
||||
================================================================================
|
||||
|
||||
Header: cglm/project.h
|
||||
|
||||
Viewport is required as *vec4* **[X, Y, Width, Height]** but this doesn't mean
|
||||
that you should store it as **vec4**. You can convert your data representation
|
||||
to vec4 before passing it to related functions.
|
||||
|
||||
Table of contents (click to go):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Functions:
|
||||
|
||||
1. :c:func:`glm_unprojecti`
|
||||
#. :c:func:`glm_unproject`
|
||||
#. :c:func:`glm_project`
|
||||
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. c:function:: void glm_unprojecti(vec3 pos, mat4 invMat, vec4 vp, vec3 dest)
|
||||
|
||||
| maps the specified viewport coordinates into specified space [1]
|
||||
the matrix should contain projection matrix.
|
||||
|
||||
if you don't have ( and don't want to have ) an inverse matrix then use
|
||||
:c:func:`glm_unproject` version. You may use existing inverse of matrix in somewhere
|
||||
else, this is why **glm_unprojecti** exists to save inversion cost
|
||||
|
||||
[1] space:
|
||||
- if m = invProj: View Space
|
||||
- if m = invViewProj: World Space
|
||||
- if m = invMVP: Object Space
|
||||
|
||||
You probably want to map the coordinates into object space
|
||||
so use invMVP as m
|
||||
|
||||
Computing viewProj:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
glm_mat4_mul(proj, view, viewProj);
|
||||
glm_mat4_mul(viewProj, model, MVP);
|
||||
glm_mat4_inv(viewProj, invMVP);
|
||||
|
||||
Parameters:
|
||||
| *[in]* **pos** point/position in viewport coordinates
|
||||
| *[in]* **invMat** matrix (see brief)
|
||||
| *[in]* **vp** viewport as [x, y, width, height]
|
||||
| *[out]* **dest** unprojected coordinates
|
||||
|
||||
.. c:function:: void glm_unproject(vec3 pos, mat4 m, vec4 vp, vec3 dest)
|
||||
|
||||
| maps the specified viewport coordinates into specified space [1]
|
||||
the matrix should contain projection matrix.
|
||||
|
||||
this is same as :c:func:`glm_unprojecti` except this function get inverse matrix for
|
||||
you.
|
||||
|
||||
[1] space:
|
||||
- if m = proj: View Space
|
||||
- if m = viewProj: World Space
|
||||
- if m = MVP: Object Space
|
||||
|
||||
You probably want to map the coordinates into object space so use MVP as m
|
||||
|
||||
Computing viewProj and MVP:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
glm_mat4_mul(proj, view, viewProj);
|
||||
glm_mat4_mul(viewProj, model, MVP);
|
||||
|
||||
Parameters:
|
||||
| *[in]* **pos** point/position in viewport coordinates
|
||||
| *[in]* **m** matrix (see brief)
|
||||
| *[in]* **vp** viewport as [x, y, width, height]
|
||||
| *[out]* **dest** unprojected coordinates
|
||||
|
||||
.. c:function:: void glm_project(vec3 pos, mat4 m, vec4 vp, vec3 dest)
|
||||
|
||||
| map object coordinates to window coordinates
|
||||
|
||||
Computing MVP:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
glm_mat4_mul(proj, view, viewProj);
|
||||
glm_mat4_mul(viewProj, model, MVP);
|
||||
|
||||
Parameters:
|
||||
| *[in]* **pos** object coordinates
|
||||
| *[in]* **m** MVP matrix
|
||||
| *[in]* **vp** viewport as [x, y, width, height]
|
||||
| *[out]* **dest** projected coordinates
|
||||
|
||||
.. c:function:: float glm_project_z(vec3 pos, mat4 m)
|
||||
|
||||
| map object's z coordinate to window coordinates
|
||||
|
||||
this is same as :c:func:`glm_project` except this function projects only Z coordinate
|
||||
which reduces a few calculations and parameters.
|
||||
|
||||
Computing MVP:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
glm_mat4_mul(proj, view, viewProj);
|
||||
glm_mat4_mul(viewProj, model, MVP);
|
||||
|
||||
Parameters:
|
||||
| *[in]* **pos** object coordinates
|
||||
| *[in]* **m** MVP matrix
|
||||
|
||||
Returns:
|
||||
projected z coordinate
|
||||
445
docs/source/quat.rst
Normal file
445
docs/source/quat.rst
Normal file
@@ -0,0 +1,445 @@
|
||||
.. default-domain:: C
|
||||
|
||||
quaternions
|
||||
===========
|
||||
|
||||
Header: cglm/quat.h
|
||||
|
||||
**Important:** *cglm* stores quaternion as **[x, y, z, w]** in memory
|
||||
since **v0.4.0** it was **[w, x, y, z]**
|
||||
before v0.4.0 ( **v0.3.5 and earlier** ). w is real part.
|
||||
|
||||
What you can do with quaternions with existing functions is (Some of them):
|
||||
|
||||
- You can rotate transform matrix using quaternion
|
||||
- You can rotate vector using quaternion
|
||||
- You can create view matrix using quaternion
|
||||
- You can create a lookrotation (from source point to dest)
|
||||
|
||||
Table of contents (click to go):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Macros:
|
||||
|
||||
1. GLM_QUAT_IDENTITY_INIT
|
||||
#. GLM_QUAT_IDENTITY
|
||||
|
||||
Functions:
|
||||
|
||||
1. :c:func:`glm_quat_identity`
|
||||
#. :c:func:`glm_quat_identity_array`
|
||||
#. :c:func:`glm_quat_init`
|
||||
#. :c:func:`glm_quat`
|
||||
#. :c:func:`glm_quatv`
|
||||
#. :c:func:`glm_quat_copy`
|
||||
#. :c:func:`glm_quat_from_vecs`
|
||||
#. :c:func:`glm_quat_norm`
|
||||
#. :c:func:`glm_quat_normalize`
|
||||
#. :c:func:`glm_quat_normalize_to`
|
||||
#. :c:func:`glm_quat_dot`
|
||||
#. :c:func:`glm_quat_conjugate`
|
||||
#. :c:func:`glm_quat_inv`
|
||||
#. :c:func:`glm_quat_add`
|
||||
#. :c:func:`glm_quat_sub`
|
||||
#. :c:func:`glm_quat_real`
|
||||
#. :c:func:`glm_quat_imag`
|
||||
#. :c:func:`glm_quat_imagn`
|
||||
#. :c:func:`glm_quat_imaglen`
|
||||
#. :c:func:`glm_quat_angle`
|
||||
#. :c:func:`glm_quat_axis`
|
||||
#. :c:func:`glm_quat_mul`
|
||||
#. :c:func:`glm_quat_mat4`
|
||||
#. :c:func:`glm_quat_mat4t`
|
||||
#. :c:func:`glm_quat_mat3`
|
||||
#. :c:func:`glm_quat_mat3t`
|
||||
#. :c:func:`glm_quat_lerp`
|
||||
#. :c:func:`glm_quat_nlerp`
|
||||
#. :c:func:`glm_quat_slerp`
|
||||
#. :c:func:`glm_quat_slerp_longest`
|
||||
#. :c:func:`glm_quat_look`
|
||||
#. :c:func:`glm_quat_for`
|
||||
#. :c:func:`glm_quat_forp`
|
||||
#. :c:func:`glm_quat_rotatev`
|
||||
#. :c:func:`glm_quat_rotate`
|
||||
#. :c:func:`glm_quat_rotate_at`
|
||||
#. :c:func:`glm_quat_rotate_atm`
|
||||
#. :c:func:`glm_quat_make`
|
||||
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. c:function:: void glm_quat_identity(versor q)
|
||||
|
||||
| makes given quat to identity
|
||||
|
||||
Parameters:
|
||||
| *[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)
|
||||
|
||||
| inits quaternion with given values
|
||||
|
||||
Parameters:
|
||||
| *[out]* **q** quaternion
|
||||
| *[in]* **x** imag.x
|
||||
| *[in]* **y** imag.y
|
||||
| *[in]* **z** imag.z
|
||||
| *[in]* **w** w (real part)
|
||||
|
||||
.. c:function:: void glm_quat(versor q, float angle, float x, float y, float z)
|
||||
|
||||
| creates NEW quaternion with individual axis components
|
||||
|
||||
| given axis will be normalized
|
||||
|
||||
Parameters:
|
||||
| *[out]* **q** quaternion
|
||||
| *[in]* **angle** angle (radians)
|
||||
| *[in]* **x** axis.x
|
||||
| *[in]* **y** axis.y
|
||||
| *[in]* **z** axis.z
|
||||
|
||||
.. c:function:: void glm_quatv(versor q, float angle, vec3 axis)
|
||||
|
||||
| creates NEW quaternion with axis vector
|
||||
|
||||
| given axis will be normalized
|
||||
|
||||
Parameters:
|
||||
| *[out]* **q** quaternion
|
||||
| *[in]* **angle** angle (radians)
|
||||
| *[in]* **axis** axis (will be normalized)
|
||||
|
||||
.. c:function:: void glm_quat_copy(versor q, versor dest)
|
||||
|
||||
| copy quaternion to another one
|
||||
|
||||
Parameters:
|
||||
| *[in]* **q** source quaternion
|
||||
| *[out]* **dest** destination quaternion
|
||||
|
||||
.. c:function:: void glm_quat_from_vecs(vec3 a, vec3 b, versor dest)
|
||||
|
||||
| compute unit quaternion needed to rotate a into b
|
||||
|
||||
References:
|
||||
* `Finding quaternion representing the rotation from one vector to another <https://stackoverflow.com/a/11741520/183120>`_
|
||||
* `Quaternion from two vectors <http://lolengine.net/blog/2014/02/24/quaternion-from-two-vectors-final>`_
|
||||
* `Angle between vectors <http://www.euclideanspace.com/maths/algebra/vectors/angleBetween/minorlogic.htm>`_
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** unit vector
|
||||
| *[in]* **b** unit vector
|
||||
| *[in]* **dest** unit quaternion
|
||||
|
||||
.. c:function:: float glm_quat_norm(versor q)
|
||||
|
||||
| returns norm (magnitude) of quaternion
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** quaternion
|
||||
|
||||
Returns:
|
||||
norm (magnitude)
|
||||
|
||||
.. c:function:: void glm_quat_normalize_to(versor q, versor dest)
|
||||
|
||||
| normalize quaternion and store result in dest, original one will not be normalized
|
||||
|
||||
Parameters:
|
||||
| *[in]* **q** quaternion to normalize into
|
||||
| *[out]* **dest** destination quaternion
|
||||
|
||||
.. c:function:: void glm_quat_normalize(versor q)
|
||||
|
||||
| normalize quaternion
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **q** quaternion
|
||||
|
||||
.. c:function:: float glm_quat_dot(versor p, versor q)
|
||||
|
||||
dot product of two quaternion
|
||||
|
||||
Parameters:
|
||||
| *[in]* **p** quaternion 1
|
||||
| *[in]* **q** quaternion 2
|
||||
|
||||
Returns:
|
||||
dot product
|
||||
|
||||
.. c:function:: void glm_quat_conjugate(versor q, versor dest)
|
||||
|
||||
conjugate of quaternion
|
||||
|
||||
Parameters:
|
||||
| *[in]* **q** quaternion
|
||||
| *[in]* **dest** conjugate
|
||||
|
||||
.. c:function:: void glm_quat_inv(versor q, versor dest)
|
||||
|
||||
inverse of non-zero quaternion
|
||||
|
||||
Parameters:
|
||||
| *[in]* **q** quaternion
|
||||
| *[in]* **dest** inverse quaternion
|
||||
|
||||
.. c:function:: void glm_quat_add(versor p, versor q, versor dest)
|
||||
|
||||
add (componentwise) two quaternions and store result in dest
|
||||
|
||||
Parameters:
|
||||
| *[in]* **p** quaternion 1
|
||||
| *[in]* **q** quaternion 2
|
||||
| *[in]* **dest** result quaternion
|
||||
|
||||
.. c:function:: void glm_quat_sub(versor p, versor q, versor dest)
|
||||
|
||||
subtract (componentwise) two quaternions and store result in dest
|
||||
|
||||
Parameters:
|
||||
| *[in]* **p** quaternion 1
|
||||
| *[in]* **q** quaternion 2
|
||||
| *[in]* **dest** result quaternion
|
||||
|
||||
.. c:function:: float glm_quat_real(versor q)
|
||||
|
||||
returns real part of quaternion
|
||||
|
||||
Parameters:
|
||||
| *[in]* **q** quaternion
|
||||
|
||||
Returns:
|
||||
real part (quat.w)
|
||||
|
||||
.. c:function:: void glm_quat_imag(versor q, vec3 dest)
|
||||
|
||||
returns imaginary part of quaternion
|
||||
|
||||
Parameters:
|
||||
| *[in]* **q** quaternion
|
||||
| *[out]* **dest** imag
|
||||
|
||||
.. c:function:: void glm_quat_imagn(versor q, vec3 dest)
|
||||
|
||||
returns normalized imaginary part of quaternion
|
||||
|
||||
Parameters:
|
||||
| *[in]* **q** quaternion
|
||||
| *[out]* **dest** imag
|
||||
|
||||
.. c:function:: float glm_quat_imaglen(versor q)
|
||||
|
||||
returns length of imaginary part of quaternion
|
||||
|
||||
Parameters:
|
||||
| *[in]* **q** quaternion
|
||||
|
||||
Returns:
|
||||
norm of imaginary part
|
||||
|
||||
.. c:function:: float glm_quat_angle(versor q)
|
||||
|
||||
returns angle of quaternion
|
||||
|
||||
Parameters:
|
||||
| *[in]* **q** quaternion
|
||||
|
||||
Returns:
|
||||
angles of quat (radians)
|
||||
|
||||
.. c:function:: void glm_quat_axis(versor q, versor dest)
|
||||
|
||||
axis of quaternion
|
||||
|
||||
Parameters:
|
||||
| *[in]* **p** quaternion
|
||||
| *[out]* **dest** axis of quaternion
|
||||
|
||||
.. c:function:: void glm_quat_mul(versor p, versor q, versor dest)
|
||||
|
||||
| multiplies two quaternion and stores result in dest
|
||||
|
||||
| this is also called Hamilton Product
|
||||
|
||||
| According to WikiPedia:
|
||||
| The product of two rotation quaternions [clarification needed] will be
|
||||
equivalent to the rotation q followed by the rotation p
|
||||
|
||||
Parameters:
|
||||
| *[in]* **p** quaternion 1 (first rotation)
|
||||
| *[in]* **q** quaternion 2 (second rotation)
|
||||
| *[out]* **dest** result quaternion
|
||||
|
||||
.. c:function:: void glm_quat_mat4(versor q, mat4 dest)
|
||||
|
||||
| convert quaternion to mat4
|
||||
|
||||
Parameters:
|
||||
| *[in]* **q** quaternion
|
||||
| *[out]* **dest** result matrix
|
||||
|
||||
.. c:function:: void glm_quat_mat4t(versor q, mat4 dest)
|
||||
|
||||
| convert quaternion to mat4 (transposed). This is transposed version of glm_quat_mat4
|
||||
|
||||
Parameters:
|
||||
| *[in]* **q** quaternion
|
||||
| *[out]* **dest** result matrix
|
||||
|
||||
.. c:function:: void glm_quat_mat3(versor q, mat3 dest)
|
||||
|
||||
| convert quaternion to mat3
|
||||
|
||||
Parameters:
|
||||
| *[in]* **q** quaternion
|
||||
| *[out]* **dest** result matrix
|
||||
|
||||
.. c:function:: void glm_quat_mat3t(versor q, mat3 dest)
|
||||
|
||||
| convert quaternion to mat3 (transposed). This is transposed version of glm_quat_mat3
|
||||
|
||||
Parameters:
|
||||
| *[in]* **q** quaternion
|
||||
| *[out]* **dest** result matrix
|
||||
|
||||
.. c:function:: void glm_quat_lerp(versor from, versor to, float t, versor dest)
|
||||
|
||||
| interpolates between two quaternions
|
||||
| using spherical linear interpolation (LERP)
|
||||
|
||||
Parameters:
|
||||
| *[in]* **from** from
|
||||
| *[in]* **to** to
|
||||
| *[in]* **t** interpolant (amount) clamped between 0 and 1
|
||||
| *[out]* **dest** result quaternion
|
||||
|
||||
.. c:function:: void glm_quat_nlerp(versor q, versor r, float t, versor dest)
|
||||
|
||||
| interpolates between two quaternions
|
||||
| taking the shortest rotation path using
|
||||
| normalized linear interpolation (NLERP)
|
||||
|
||||
| This is a cheaper alternative to slerp; most games use nlerp
|
||||
| for animations as it visually makes little difference.
|
||||
|
||||
References:
|
||||
* `Understanding Slerp, Then Not Using it <http://number-none.com/product/Understanding%20Slerp,%20Then%20Not%20Using%20It>`_
|
||||
* `Lerp, Slerp and Nlerp <https://keithmaggio.wordpress.com/2011/02/15/math-magician-lerp-slerp-and-nlerp/>`_
|
||||
|
||||
Parameters:
|
||||
| *[in]* **from** from
|
||||
| *[in]* **to** to
|
||||
| *[in]* **t** interpolant (amount) clamped between 0 and 1
|
||||
| *[out]* **dest** result quaternion
|
||||
|
||||
.. c:function:: void glm_quat_slerp(versor q, versor r, float t, versor dest)
|
||||
|
||||
| interpolates between two quaternions
|
||||
| using spherical linear interpolation (SLERP)
|
||||
|
||||
Parameters:
|
||||
| *[in]* **from** from
|
||||
| *[in]* **to** to
|
||||
| *[in]* **t** interpolant (amount) clamped between 0 and 1
|
||||
| *[out]* **dest** result quaternion
|
||||
|
||||
.. c:function:: void glm_quat_slerp_longest(versor q, versor r, float t, versor dest)
|
||||
|
||||
| interpolates between two quaternions
|
||||
| using spherical linear interpolation (SLERP) and always takes the longest path
|
||||
|
||||
Parameters:
|
||||
| *[in]* **from** from
|
||||
| *[in]* **to** to
|
||||
| *[in]* **t** interpolant (amount) clamped between 0 and 1
|
||||
| *[out]* **dest** result quaternion
|
||||
|
||||
.. c:function:: void glm_quat_look(vec3 eye, versor ori, mat4 dest)
|
||||
|
||||
| creates view matrix using quaternion as camera orientation
|
||||
|
||||
Parameters:
|
||||
| *[in]* **eye** eye
|
||||
| *[in]* **ori** orientation in world space as quaternion
|
||||
| *[out]* **dest** result matrix
|
||||
|
||||
.. c:function:: void glm_quat_for(vec3 dir, vec3 up, versor dest)
|
||||
|
||||
| creates look rotation quaternion
|
||||
|
||||
Parameters:
|
||||
| *[in]* **dir** direction to look
|
||||
| *[in]* **up** up vector
|
||||
| *[out]* **dest** result matrix
|
||||
|
||||
.. 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
|
||||
|
||||
| this is similar to glm_quat_for except this computes direction for glm_quat_for for you.
|
||||
|
||||
Parameters:
|
||||
| *[in]* **from** source point
|
||||
| *[in]* **to** destination point
|
||||
| *[in]* **up** up vector
|
||||
| *[out]* **dest** result matrix
|
||||
|
||||
.. c:function:: void glm_quat_rotatev(versor q, vec3 v, vec3 dest)
|
||||
|
||||
| crotate vector using using quaternion
|
||||
|
||||
Parameters:
|
||||
| *[in]* **q** quaternion
|
||||
| *[in]* **v** vector to rotate
|
||||
| *[out]* **dest** rotated vector
|
||||
|
||||
.. c:function:: void glm_quat_rotate(mat4 m, versor q, mat4 dest)
|
||||
|
||||
| rotate existing transform matrix using quaternion
|
||||
|
||||
instead of passing identity matrix, consider to use quat_mat4 functions
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** existing transform matrix to rotate
|
||||
| *[in]* **q** quaternion
|
||||
| *[out]* **dest** rotated matrix/transform
|
||||
|
||||
.. c:function:: void glm_quat_rotate_at(mat4 m, versor q, vec3 pivot)
|
||||
|
||||
| rotate existing transform matrix using quaternion at pivot point
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** existing transform matrix to rotate
|
||||
| *[in]* **q** quaternion
|
||||
| *[in]* **pivot** pivot
|
||||
|
||||
.. c:function:: void glm_quat_rotate_atm(mat4 m, versor q, vec3 pivot)
|
||||
|
||||
| rotate NEW transform matrix using quaternion at pivot point
|
||||
| this creates rotation matrix, it assumes you don't have a matrix
|
||||
|
||||
| this should work faster than glm_quat_rotate_at because it reduces one glm_translate.
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** existing transform matrix to rotate
|
||||
| *[in]* **q** quaternion
|
||||
| *[in]* **pivot** pivot
|
||||
|
||||
.. c:function:: void glm_quat_make(const float * __restrict src, versor dest)
|
||||
|
||||
Create quaternion from pointer
|
||||
|
||||
.. note:: **@src** must contain at least 4 elements. cglm store quaternions as [x, y, z, w].
|
||||
|
||||
Parameters:
|
||||
| *[in]* **src** pointer to an array of floats
|
||||
| *[out]* **dest** destination quaternion
|
||||
69
docs/source/ray.rst
Normal file
69
docs/source/ray.rst
Normal file
@@ -0,0 +1,69 @@
|
||||
.. 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`
|
||||
#. :c:func:`glm_ray_sphere`
|
||||
#. :c:func:`glm_ray_at`
|
||||
|
||||
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
|
||||
|
||||
.. c:function:: bool glm_ray_sphere(vec3 origin, vec3 dir, vec4 s, float * __restrict t1, float * __restrict t2)
|
||||
|
||||
ray sphere intersection
|
||||
|
||||
returns false if there is no intersection if true:
|
||||
|
||||
- t1 > 0, t2 > 0: ray intersects the sphere at t1 and t2 both ahead of the origin
|
||||
- t1 < 0, t2 > 0: ray starts inside the sphere, exits at t2
|
||||
- t1 < 0, t2 < 0: no intersection ahead of the ray ( returns false )
|
||||
- the caller can check if the intersection points (t1 and t2) fall within a
|
||||
specific range (for example, tmin < t1, t2 < tmax) to determine if the
|
||||
intersections are within a desired segment of the ray
|
||||
|
||||
Parameters:
|
||||
| *[in]* **origin** ray origin
|
||||
| *[in]* **dir** normalized ray direction
|
||||
| *[in]* **s** sphere [center.x, center.y, center.z, radii]
|
||||
| *[out]* **t1** near point1 (closer to origin)
|
||||
| *[out]* **t2** far point2 (farther from origin)
|
||||
|
||||
Return:
|
||||
| whether there is intersection
|
||||
|
||||
.. c:function:: bool glm_ray_at(vec3 orig, vec3 dir, float t, vec3 point)
|
||||
|
||||
point using t by 𝐏(𝑡)=𝐀+𝑡𝐛
|
||||
|
||||
Parameters:
|
||||
| *[in]* **origin** ray origin
|
||||
| *[in]* **dir** ray direction
|
||||
| *[out]* **t** parameter
|
||||
| *[out]* **point** point at t
|
||||
|
||||
Return:
|
||||
| point at t
|
||||
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 passing 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
|
||||
12
docs/source/sphinx-static/theme_overrides.css
Normal file
12
docs/source/sphinx-static/theme_overrides.css
Normal file
@@ -0,0 +1,12 @@
|
||||
@media screen {
|
||||
/* content column
|
||||
*
|
||||
* RTD theme's default is 800px as max width for the content, but we have
|
||||
* tables with tons of columns, which need the full width of the view-port.
|
||||
*
|
||||
* Comment from yocto project theme_overrides.css
|
||||
*/
|
||||
|
||||
.wy-nav-content{ max-width: none; }
|
||||
|
||||
}
|
||||
99
docs/source/troubleshooting.rst
Normal file
99
docs/source/troubleshooting.rst
Normal file
@@ -0,0 +1,99 @@
|
||||
.. default-domain:: C
|
||||
|
||||
Troubleshooting
|
||||
================================================================================
|
||||
|
||||
It is possible that you may sometimes get crashes or wrong results.
|
||||
Follow these topics
|
||||
|
||||
Memory Allocation:
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Recall that **cglm** does not alloc any memory on the heap.
|
||||
cglm functions work like memcpy; they copy data from src,
|
||||
make calculations, then copy the result to dest.
|
||||
|
||||
You are responsible for allocation of **src** and **dest** parameters.
|
||||
|
||||
Alignment:
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
**vec4** and **mat4** types require 16 byte alignment.
|
||||
These types are marked with the align attribute to let the compiler know about this
|
||||
requirement.
|
||||
|
||||
Since MSVC (Windows) throws this error:
|
||||
|
||||
**"formal parameter with requested alignment of 16 won't be aligned"**
|
||||
|
||||
The alignment attribute has been commented out for MSVC
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
# define CGLM_ALIGN(X) /* __declspec(align(X)) */
|
||||
#else
|
||||
# define CGLM_ALIGN(X) __attribute((aligned(X)))
|
||||
#endif.
|
||||
|
||||
So MSVC may not know about alignment requirements when creating variables.
|
||||
The interesting thing is that, if I remember correctly, Visual Studio 2017
|
||||
doesn't throw the above error. So we may uncomment that line for Visual Studio 2017,
|
||||
you may do it yourself.
|
||||
|
||||
**This MSVC issue is still in TODOs.**
|
||||
|
||||
**UPDATE:** Starting with v0.4.5, cglm provides an option to disable the alignment requirement.
|
||||
Also, alignment is disabled for older msvc versions by default. Now alignment is only required in Visual Studio 2017 version 15.6+ if the CGLM_ALL_UNALIGNED macro is not defined.
|
||||
|
||||
Crashes, Invalid Memory Access:
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Most likely, you are trying to write to an invalid memory location.
|
||||
|
||||
You may have used a wrong function for what you want to do.
|
||||
|
||||
For example, you may have called a **glm_vec4_** function for a **vec3** data type.
|
||||
It will try to write 32 bytes, but since **vec3** is 24 bytes, it should throw
|
||||
a memory access error or exit the app without saying anything.
|
||||
|
||||
**UPDATE - IMPORTANT:**
|
||||
|
||||
| On MSVC or some other compilers, if alignment is enabled (default) then double check alignment requirements if you got a crash.
|
||||
|
||||
| If you send GLM_VEC4_ONE or similar macros directly to a function, it may crash.
|
||||
| Because the compiler may not apply alignment as defined on **typedef** to that macro while passing it (on stack) to a function.
|
||||
|
||||
Wrong Results:
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Again, you may have used a wrong function.
|
||||
|
||||
For instance if you use **glm_normalize()** or **glm_vec3_normalize()** for a **vec4**,
|
||||
it will assume that the passed param is a **vec3**, and will normalize it for **vec3**.
|
||||
Since you need a **vec4** to be normalized in your case, you will get wrong results.
|
||||
|
||||
Accessing a vec4 type with vec3 functions is valid, you will not get any error, exception or crash.
|
||||
You only get wrong results if you don't know what you are doing!
|
||||
|
||||
So be careful, when your IDE (Xcode, Visual Studio ...) tries to autocomplete function names, READ IT :)
|
||||
|
||||
**Also implementation may be wrong, please let us know by creating an issue on Github.**
|
||||
|
||||
BAD_ACCESS : Thread 1: EXC_BAD_ACCESS (code=EXC_I386_GPFLT) or Similar Errors/Crashes
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
This is a similar issue with alignment. For instance if you compiled **cglm** with
|
||||
AVX (**-mavx**, intentionally or not) and if you use **cglm** in an environment that doesn't
|
||||
support AVX (or if AVX is disabled intentionally) e.g. environment that max support SSE2/3/4,
|
||||
then you probably get **BAD ACCESS** or similar...
|
||||
|
||||
Because if you compile **cglm** with AVX it aligns **mat4** with 32 byte boundary,
|
||||
and your project aligns that as a 16 byte boundary...
|
||||
|
||||
Check alignment, supported vector extension, or simd in **cglm** and linked projects...
|
||||
|
||||
Other Issues?
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
**Please let us know by creating an issue on Github.**
|
||||
182
docs/source/util.rst
Normal file
182
docs/source/util.rst
Normal file
@@ -0,0 +1,182 @@
|
||||
.. default-domain:: C
|
||||
|
||||
utils / helpers
|
||||
================================================================================
|
||||
|
||||
Header: cglm/util.h
|
||||
|
||||
|
||||
|
||||
Table of contents (click to go):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Functions:
|
||||
|
||||
1. :c:func:`glm_sign`
|
||||
#. :c:func:`glm_signf`
|
||||
#. :c:func:`glm_rad`
|
||||
#. :c:func:`glm_deg`
|
||||
#. :c:func:`glm_make_rad`
|
||||
#. :c:func:`glm_make_deg`
|
||||
#. :c:func:`glm_pow2`
|
||||
#. :c:func:`glm_min`
|
||||
#. :c:func:`glm_max`
|
||||
#. :c:func:`glm_clamp`
|
||||
#. :c:func:`glm_lerp`
|
||||
#. :c:func:`glm_swapf`
|
||||
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. c:function:: int glm_sign(int val)
|
||||
|
||||
| returns sign of 32 bit integer as +1, -1, 0
|
||||
|
||||
| **Important**: It returns 0 for zero input
|
||||
|
||||
Parameters:
|
||||
| *[in]* **val** an integer
|
||||
|
||||
Returns:
|
||||
sign of given number
|
||||
|
||||
.. c:function:: float glm_signf(float val)
|
||||
|
||||
| returns sign of 32 bit integer as +1.0, -1.0, 0.0
|
||||
|
||||
| **Important**: It returns 0.0f for zero input
|
||||
|
||||
Parameters:
|
||||
| *[in]* **val** a float
|
||||
|
||||
Returns:
|
||||
sign of given number
|
||||
|
||||
.. c:function:: float glm_rad(float deg)
|
||||
|
||||
| convert degree to radians
|
||||
|
||||
Parameters:
|
||||
| *[in]* **deg** angle in degrees
|
||||
|
||||
.. c:function:: float glm_deg(float rad)
|
||||
|
||||
| convert radians to degree
|
||||
|
||||
Parameters:
|
||||
| *[in]* **rad** angle in radians
|
||||
|
||||
.. c:function:: void glm_make_rad(float *degm)
|
||||
|
||||
| convert existing degree to radians. this will override degrees value
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **deg** pointer to angle in degrees
|
||||
|
||||
.. c:function:: void glm_make_deg(float *rad)
|
||||
|
||||
| convert existing radians to degree. this will override radians value
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **rad** pointer to angle in radians
|
||||
|
||||
.. c:function:: float glm_pow2(float x)
|
||||
|
||||
| multiplies given parameter with itself = x * x or powf(x, 2)
|
||||
|
||||
Parameters:
|
||||
| *[in]* **x** value
|
||||
|
||||
Returns:
|
||||
square of a given number
|
||||
|
||||
.. c:function:: float glm_min(float a, float b)
|
||||
|
||||
| returns minimum of given two values
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** number 1
|
||||
| *[in]* **b** number 2
|
||||
|
||||
Returns:
|
||||
minimum value
|
||||
|
||||
.. c:function:: float glm_max(float a, float b)
|
||||
|
||||
| returns maximum of given two values
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** number 1
|
||||
| *[in]* **b** number 2
|
||||
|
||||
Returns:
|
||||
maximum value
|
||||
|
||||
.. c:function:: void glm_clamp(float val, float minVal, float maxVal)
|
||||
|
||||
constrain a value to lie between two further values
|
||||
|
||||
Parameters:
|
||||
| *[in]* **val** input value
|
||||
| *[in]* **minVal** minimum value
|
||||
| *[in]* **maxVal** maximum value
|
||||
|
||||
Returns:
|
||||
clamped value
|
||||
|
||||
.. c:function:: float glm_lerp(float from, float to, float t)
|
||||
|
||||
linear interpolation between two number
|
||||
|
||||
| formula: from + s * (to - from)
|
||||
|
||||
Parameters:
|
||||
| *[in]* **from** from value
|
||||
| *[in]* **to** to value
|
||||
| *[in]* **t** interpolant (amount) clamped between 0 and 1
|
||||
|
||||
Returns:
|
||||
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
|
||||
161
docs/source/vec2-ext.rst
Normal file
161
docs/source/vec2-ext.rst
Normal file
@@ -0,0 +1,161 @@
|
||||
.. 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_abs`
|
||||
#. :c:func:`glm_vec2_fract`
|
||||
#. :c:func:`glm_vec2_floor`
|
||||
#. :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_abs(vec2 v, vec2 dest)
|
||||
|
||||
absolute value of each vector item
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[out]* **dest** destination vector
|
||||
|
||||
.. c:function:: void glm_vec2_fract(vec2 v, vec2 dest)
|
||||
|
||||
get fractional part of each vector item
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[out]* **dest** destination vector
|
||||
|
||||
.. c:function:: void glm_vec2_floor(vec2 v, vec2 dest)
|
||||
|
||||
floor value of each vector item
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[out]* **dest** destination vector
|
||||
|
||||
.. c:function:: void glm_vec2_sqrt(vec2 v, vec2 dest)
|
||||
|
||||
square root of each vector item
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[out]* **dest** destination vector (sqrt(v))
|
||||
424
docs/source/vec2.rst
Normal file
424
docs/source/vec2.rst
Normal file
@@ -0,0 +1,424 @@
|
||||
.. 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_center`
|
||||
#. :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`
|
||||
#. :c:func:`glm_vec2_make`
|
||||
#. :c:func:`glm_vec2_reflect`
|
||||
#. :c:func:`glm_vec2_refract`
|
||||
|
||||
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 function twice but with this func we can avoid func call, maybe this is
|
||||
not good name for this func
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
|
||||
Returns:
|
||||
square of norm / magnitude
|
||||
|
||||
.. 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:: void glm_vec2_center(vec2 v1, vec2 v2, vec2 dest)
|
||||
|
||||
find center point of two vector
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v1** vector1
|
||||
| *[in]* **v2** vector2
|
||||
| *[out]* **dest** center point
|
||||
|
||||
.. c:function:: float glm_vec2_distance2(vec2 v1, vec2 v2)
|
||||
|
||||
squared distance between two vectors
|
||||
|
||||
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
|
||||
|
||||
.. c:function:: void glm_vec2_make(const float * __restrict src, vec2 dest)
|
||||
|
||||
Create two dimensional vector from pointer
|
||||
|
||||
.. note:: **@src** must contain at least 2 elements.
|
||||
|
||||
Parameters:
|
||||
| *[in]* **src** pointer to an array of floats
|
||||
| *[out]* **dest** destination vector
|
||||
|
||||
.. c:function:: void glm_vec2_reflect(vec2 v, vec2 n, vec2 dest)
|
||||
|
||||
Reflection vector using an incident ray and a surface normal
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** incident vector
|
||||
| *[in]* **n** *❗️ normalized ❗️* normal vector
|
||||
| *[out]* **dest** destination: reflection result
|
||||
|
||||
.. c:function:: bool glm_vec2_refract(vec2 v, vec2 n, float eta, vec2 dest)
|
||||
|
||||
Computes refraction vector for an incident vector and a surface normal.
|
||||
|
||||
Calculates the refraction vector based on Snell's law. If total internal reflection
|
||||
occurs (angle too great given eta), dest is set to zero and returns false.
|
||||
Otherwise, computes refraction vector, stores it in dest, and returns true.
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** *❗️ normalized ❗️* incident vector
|
||||
| *[in]* **n** *❗️ normalized ❗️* normal vector
|
||||
| *[in]* **eta** ratio of indices of refraction (incident/transmitted)
|
||||
| *[out]* **dest** refraction vector if refraction occurs; zero vector otherwise
|
||||
|
||||
Returns:
|
||||
returns true if refraction occurs; false if total internal reflection occurs.
|
||||
178
docs/source/vec3-ext.rst
Normal file
178
docs/source/vec3-ext.rst
Normal file
@@ -0,0 +1,178 @@
|
||||
.. default-domain:: C
|
||||
|
||||
vec3 extra
|
||||
==========
|
||||
|
||||
Header: cglm/vec3-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 vec3.h in the future some of
|
||||
these functions ma be moved to vec3 header.
|
||||
|
||||
Table of contents (click to go):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Functions:
|
||||
|
||||
1. :c:func:`glm_vec3_mulv`
|
||||
#. :c:func:`glm_vec3_broadcast`
|
||||
#. :c:func:`glm_vec3_eq`
|
||||
#. :c:func:`glm_vec3_eq_eps`
|
||||
#. :c:func:`glm_vec3_eq_all`
|
||||
#. :c:func:`glm_vec3_eqv`
|
||||
#. :c:func:`glm_vec3_eqv_eps`
|
||||
#. :c:func:`glm_vec3_max`
|
||||
#. :c:func:`glm_vec3_min`
|
||||
#. :c:func:`glm_vec3_isnan`
|
||||
#. :c:func:`glm_vec3_isinf`
|
||||
#. :c:func:`glm_vec3_isvalid`
|
||||
#. :c:func:`glm_vec3_sign`
|
||||
#. :c:func:`glm_vec3_abs`
|
||||
#. :c:func:`glm_vec3_fract`
|
||||
#. :c:func:`glm_vec3_floor`
|
||||
#. :c:func:`glm_vec3_sqrt`
|
||||
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. c:function:: void glm_vec3_mulv(vec3 a, vec3 b, vec3 d)
|
||||
|
||||
multiplies individual items
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** vec1
|
||||
| *[in]* **b** vec2
|
||||
| *[out]* **d** destination (v1[0] * v2[0], v1[1] * v2[1], v1[2] * v2[2])
|
||||
|
||||
.. c:function:: void glm_vec3_broadcast(float val, vec3 d)
|
||||
|
||||
fill a vector with specified value
|
||||
|
||||
Parameters:
|
||||
| *[in]* **val** value
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_vec3_fill(vec3 v, float val)
|
||||
|
||||
fill a vector with specified value
|
||||
|
||||
Parameters:
|
||||
| *[out]* **v** vector
|
||||
| *[in]* **val** value
|
||||
|
||||
.. c:function:: bool glm_vec3_eq(vec3 v, float val)
|
||||
|
||||
check if vector is equal to value (without epsilon)
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[in]* **val** value
|
||||
|
||||
.. c:function:: bool glm_vec3_eq_eps(vec3 v, float val)
|
||||
|
||||
check if vector is equal to value (with epsilon)
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[in]* **val** value
|
||||
|
||||
.. c:function:: bool glm_vec3_eq_all(vec3 v)
|
||||
|
||||
check if vectors members are equal (without epsilon)
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
|
||||
.. c:function:: bool glm_vec3_eqv(vec3 v1, vec3 v2)
|
||||
|
||||
check if vector is equal to another (without epsilon) vector
|
||||
|
||||
Parameters:
|
||||
| *[in]* **vec** vector 1
|
||||
| *[in]* **vec** vector 2
|
||||
|
||||
.. c:function:: bool glm_vec3_eqv_eps(vec3 v1, vec3 v2)
|
||||
|
||||
check if vector is equal to another (with epsilon)
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v1** vector1
|
||||
| *[in]* **v2** vector2
|
||||
|
||||
.. c:function:: float glm_vec3_max(vec3 v)
|
||||
|
||||
max value of vector
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
|
||||
.. c:function:: float glm_vec3_min(vec3 v)
|
||||
|
||||
min value of vector
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
|
||||
.. c:function:: bool glm_vec3_isnan(vec3 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_vec3_isinf(vec3 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_vec3_isvalid(vec3 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_vec3_sign(vec3 v, vec3 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_vec3_abs(vec3 v, vec3 dest)
|
||||
|
||||
absolute value of each vector item
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[out]* **dest** destination vector
|
||||
|
||||
.. c:function:: void glm_vec3_fract(vec3 v, vec3 dest)
|
||||
|
||||
fractional part of each vector item
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[out]* **dest** destination vector
|
||||
|
||||
.. c:function:: void glm_vec3_floor(vec3 v, vec3 dest)
|
||||
|
||||
floor of each vector item
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[out]* **dest** destination vector
|
||||
|
||||
.. c:function:: void glm_vec3_sqrt(vec3 v, vec3 dest)
|
||||
|
||||
square root of each vector item
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[out]* **dest** destination vector (sqrt(v))
|
||||
554
docs/source/vec3.rst
Normal file
554
docs/source/vec3.rst
Normal file
@@ -0,0 +1,554 @@
|
||||
.. default-domain:: C
|
||||
|
||||
vec3
|
||||
====
|
||||
|
||||
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
|
||||
and easy to read, some *vec3* functions are aliased in global namespace.
|
||||
For instance :c:func:`glm_dot` is alias of :c:func:`glm_vec3_dot`,
|
||||
alias means inline wrapper here. There is no call version of alias functions
|
||||
|
||||
There are also functions for rotating *vec3* vector. **_m4**, **_m3** prefixes
|
||||
rotate *vec3* with matrix.
|
||||
|
||||
Table of contents (click to go):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Macros:
|
||||
|
||||
1. glm_vec3_dup(v, dest)
|
||||
#. GLM_VEC3_ONE_INIT
|
||||
#. GLM_VEC3_ZERO_INIT
|
||||
#. GLM_VEC3_ONE
|
||||
#. GLM_VEC3_ZERO
|
||||
#. GLM_YUP
|
||||
#. GLM_ZUP
|
||||
#. GLM_XUP
|
||||
|
||||
Functions:
|
||||
|
||||
1. :c:func:`glm_vec3`
|
||||
#. :c:func:`glm_vec3_copy`
|
||||
#. :c:func:`glm_vec3_zero`
|
||||
#. :c:func:`glm_vec3_one`
|
||||
#. :c:func:`glm_vec3_dot`
|
||||
#. :c:func:`glm_vec3_norm2`
|
||||
#. :c:func:`glm_vec3_norm`
|
||||
#. :c:func:`glm_vec3_add`
|
||||
#. :c:func:`glm_vec3_adds`
|
||||
#. :c:func:`glm_vec3_sub`
|
||||
#. :c:func:`glm_vec3_subs`
|
||||
#. :c:func:`glm_vec3_mul`
|
||||
#. :c:func:`glm_vec3_scale`
|
||||
#. :c:func:`glm_vec3_scale_as`
|
||||
#. :c:func:`glm_vec3_div`
|
||||
#. :c:func:`glm_vec3_divs`
|
||||
#. :c:func:`glm_vec3_addadd`
|
||||
#. :c:func:`glm_vec3_subadd`
|
||||
#. :c:func:`glm_vec3_muladd`
|
||||
#. :c:func:`glm_vec3_muladds`
|
||||
#. :c:func:`glm_vec3_maxadd`
|
||||
#. :c:func:`glm_vec3_minadd`
|
||||
#. :c:func:`glm_vec3_flipsign`
|
||||
#. :c:func:`glm_vec3_flipsign_to`
|
||||
#. :c:func:`glm_vec3_inv`
|
||||
#. :c:func:`glm_vec3_inv_to`
|
||||
#. :c:func:`glm_vec3_negate`
|
||||
#. :c:func:`glm_vec3_negate_to`
|
||||
#. :c:func:`glm_vec3_normalize`
|
||||
#. :c:func:`glm_vec3_normalize_to`
|
||||
#. :c:func:`glm_vec3_cross`
|
||||
#. :c:func:`glm_vec3_crossn`
|
||||
#. :c:func:`glm_vec3_distance2`
|
||||
#. :c:func:`glm_vec3_distance`
|
||||
#. :c:func:`glm_vec3_angle`
|
||||
#. :c:func:`glm_vec3_rotate`
|
||||
#. :c:func:`glm_vec3_rotate_m4`
|
||||
#. :c:func:`glm_vec3_rotate_m3`
|
||||
#. :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`
|
||||
#. :c:func:`glm_vec3_make`
|
||||
#. :c:func:`glm_vec3_faceforward`
|
||||
#. :c:func:`glm_vec3_reflect`
|
||||
#. :c:func:`glm_vec3_refract`
|
||||
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. c:function:: void glm_vec3(vec4 v4, vec3 dest)
|
||||
|
||||
init vec3 using vec4
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v4** vector4
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_vec3_copy(vec3 a, vec3 dest)
|
||||
|
||||
copy all members of [a] to [dest]
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** source
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_vec3_zero(vec3 v)
|
||||
|
||||
makes all members 0.0f (zero)
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **v** vector
|
||||
|
||||
.. c:function:: void glm_vec3_one(vec3 v)
|
||||
|
||||
makes all members 1.0f (one)
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **v** vector
|
||||
|
||||
.. c:function:: float glm_vec3_dot(vec3 a, vec3 b)
|
||||
|
||||
dot product of vec3
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** vector1
|
||||
| *[in]* **b** vector2
|
||||
|
||||
Returns:
|
||||
dot product
|
||||
|
||||
.. c:function:: void glm_vec3_cross(vec3 a, vec3 b, vec3 d)
|
||||
|
||||
cross product of two vector (RH)
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** vector 1
|
||||
| *[in]* **b** vector 2
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. 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
|
||||
|
||||
we can use this func instead of calling norm * norm, because it would call
|
||||
sqrtf function twice but with this func we can avoid func call, maybe this is
|
||||
not good name for this func
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
|
||||
Returns:
|
||||
square of norm / magnitude
|
||||
|
||||
.. c:function:: float glm_vec3_norm(vec3 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_vec3_add(vec3 a, vec3 b, vec3 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_vec3_adds(vec3 a, float s, vec3 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_vec3_sub(vec3 v1, vec3 v2, vec3 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_vec3_subs(vec3 v, float s, vec3 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_vec3_mul(vec3 a, vec3 b, vec3 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_vec3_scale(vec3 v, float s, vec3 dest)
|
||||
|
||||
multiply/scale vec3 vector with scalar: result = v * s
|
||||
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[in]* **s** scalar
|
||||
| *[out]* **dest** destination vector
|
||||
|
||||
.. c:function:: void glm_vec3_scale_as(vec3 v, float s, vec3 dest)
|
||||
|
||||
make vec3 vector scale as specified: result = unit(v) * s
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[in]* **s** scalar
|
||||
| *[out]* **dest** destination vector
|
||||
|
||||
.. c:function:: void glm_vec3_div(vec3 a, vec3 b, vec3 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_vec3_divs(vec3 v, float s, vec3 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_vec3_addadd(vec3 a, vec3 b, vec3 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_vec3_subadd(vec3 a, vec3 b, vec3 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_vec3_muladd(vec3 a, vec3 b, vec3 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_vec3_muladds(vec3 a, float s, vec3 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_vec3_maxadd(vec3 a, vec3 b, vec3 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_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)
|
||||
|
||||
**DEPRECATED!**
|
||||
|
||||
use :c:func:`glm_vec3_negate`
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **v** vector
|
||||
|
||||
.. c:function:: void glm_vec3_flipsign_to(vec3 v, vec3 dest)
|
||||
|
||||
**DEPRECATED!**
|
||||
|
||||
use :c:func:`glm_vec3_negate_to`
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[out]* **dest** negated vector
|
||||
|
||||
.. c:function:: void glm_vec3_inv(vec3 v)
|
||||
|
||||
**DEPRECATED!**
|
||||
|
||||
use :c:func:`glm_vec3_negate`
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **v** vector
|
||||
|
||||
.. c:function:: void glm_vec3_inv_to(vec3 v, vec3 dest)
|
||||
|
||||
**DEPRECATED!**
|
||||
|
||||
use :c:func:`glm_vec3_negate_to`
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** source
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. 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
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **v** vector
|
||||
|
||||
.. c:function:: void glm_vec3_normalize_to(vec3 vec, vec3 dest)
|
||||
|
||||
normalize vec3 to dest
|
||||
|
||||
Parameters:
|
||||
| *[in]* **vec** source
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: float glm_vec3_angle(vec3 v1, vec3 v2)
|
||||
|
||||
angle between two vector
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v1** vector1
|
||||
| *[in]* **v2** vector2
|
||||
|
||||
Return:
|
||||
| angle as radians
|
||||
|
||||
.. c:function:: void glm_vec3_rotate(vec3 v, float angle, vec3 axis)
|
||||
|
||||
rotate vec3 around axis by angle using Rodrigues' rotation formula
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **v** vector
|
||||
| *[in]* **axis** axis vector (will be normalized)
|
||||
| *[in]* **angle** angle (radians)
|
||||
|
||||
.. c:function:: void glm_vec3_rotate_m4(mat4 m, vec3 v, vec3 dest)
|
||||
|
||||
apply rotation matrix to vector
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** affine matrix or rot matrix
|
||||
| *[in]* **v** vector
|
||||
| *[out]* **dest** rotated vector
|
||||
|
||||
.. c:function:: void glm_vec3_rotate_m3(mat3 m, vec3 v, vec3 dest)
|
||||
|
||||
apply rotation matrix to vector
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** affine matrix or rot matrix
|
||||
| *[in]* **v** vector
|
||||
| *[out]* **dest** rotated vector
|
||||
|
||||
.. c:function:: void glm_vec3_proj(vec3 a, vec3 b, vec3 dest)
|
||||
|
||||
project a vector onto b vector
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** vector1
|
||||
| *[in]* **b** vector2
|
||||
| *[out]* **dest** projected vector
|
||||
|
||||
.. c:function:: void glm_vec3_center(vec3 v1, vec3 v2, vec3 dest)
|
||||
|
||||
find center point of two vector
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v1** vector1
|
||||
| *[in]* **v2** vector2
|
||||
| *[out]* **dest** center point
|
||||
|
||||
.. 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
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v1** vector1
|
||||
| *[in]* **v2** vector2
|
||||
|
||||
Returns:
|
||||
| distance
|
||||
|
||||
.. c:function:: void glm_vec3_maxv(vec3 v1, vec3 v2, vec3 dest)
|
||||
|
||||
max values of vectors
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v1** vector1
|
||||
| *[in]* **v2** vector2
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_vec3_minv(vec3 v1, vec3 v2, vec3 dest)
|
||||
|
||||
min values of vectors
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v1** vector1
|
||||
| *[in]* **v2** vector2
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_vec3_ortho(vec3 v, vec3 dest)
|
||||
|
||||
possible orthogonal/perpendicular vector
|
||||
|
||||
References:
|
||||
* `On picking an orthogonal vector (and combing coconuts) <http://lolengine.net/blog/2013/09/21/picking-orthogonal-vector-combing-coconuts>`_
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[out]* **dest** orthogonal/perpendicular vector
|
||||
|
||||
.. c:function:: void glm_vec3_clamp(vec3 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_vec3_lerp(vec3 from, vec3 to, float t, vec3 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
|
||||
|
||||
.. c:function:: void glm_vec3_make(const float * __restrict src, vec3 dest)
|
||||
|
||||
Create three dimensional vector from pointer
|
||||
|
||||
.. note::: **@src** must contain at least 3 elements.
|
||||
|
||||
Parameters:
|
||||
| *[in]* **src** pointer to an array of floats
|
||||
| *[out]* **dest** destination vector
|
||||
|
||||
.. c:function:: void glm_vec3_faceforward(vec3 n, vec3 v, vec3 nref, vec3 dest)
|
||||
|
||||
A vector pointing in the same direction as another
|
||||
|
||||
Parameters:
|
||||
| *[in]* **n** vector to orient
|
||||
| *[in]* **v** incident vector
|
||||
| *[in]* **nref** reference vector
|
||||
| *[out]* **dest** destination: oriented vector, pointing away from the surface.
|
||||
|
||||
.. c:function:: void glm_vec3_reflect(vec3 v, vec3 n, vec3 dest)
|
||||
|
||||
Reflection vector using an incident ray and a surface normal
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** incident vector
|
||||
| *[in]* **n** *❗️ normalized ❗️* normal vector
|
||||
| *[out]* **dest** destination: reflection result
|
||||
|
||||
.. c:function:: bool glm_vec3_refract(vec3 v, vec3 n, float eta, vec3 dest)
|
||||
|
||||
|
||||
Computes refraction vector for an incident vector and a surface normal.
|
||||
|
||||
Calculates the refraction vector based on Snell's law. If total internal reflection
|
||||
occurs (angle too great given eta), dest is set to zero and returns false.
|
||||
Otherwise, computes refraction vector, stores it in dest, and returns true.
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** *❗️ normalized ❗️* incident vector
|
||||
| *[in]* **n** *❗️ normalized ❗️* normal vector
|
||||
| *[in]* **eta** ratio of indices of refraction (incident/transmitted)
|
||||
| *[out]* **dest** refraction vector if refraction occurs; zero vector otherwise
|
||||
|
||||
Returns:
|
||||
returns true if refraction occurs; false if total internal reflection occurs.
|
||||
171
docs/source/vec4-ext.rst
Normal file
171
docs/source/vec4-ext.rst
Normal file
@@ -0,0 +1,171 @@
|
||||
.. default-domain:: C
|
||||
|
||||
vec4 extra
|
||||
==========
|
||||
|
||||
Header: cglm/vec4-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 vec4.h in the future some of
|
||||
these functions ma be moved to vec4 header.
|
||||
|
||||
Table of contents (click to go):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Functions:
|
||||
|
||||
1. :c:func:`glm_vec4_mulv`
|
||||
#. :c:func:`glm_vec4_broadcast`
|
||||
#. :c:func:`glm_vec4_eq`
|
||||
#. :c:func:`glm_vec4_eq_eps`
|
||||
#. :c:func:`glm_vec4_eq_all`
|
||||
#. :c:func:`glm_vec4_eqv`
|
||||
#. :c:func:`glm_vec4_eqv_eps`
|
||||
#. :c:func:`glm_vec4_max`
|
||||
#. :c:func:`glm_vec4_min`
|
||||
#. :c:func:`glm_vec4_isnan`
|
||||
#. :c:func:`glm_vec4_isinf`
|
||||
#. :c:func:`glm_vec4_isvalid`
|
||||
#. :c:func:`glm_vec4_sign`
|
||||
#. :c:func:`glm_vec4_abs`
|
||||
#. :c:func:`glm_vec4_fract`
|
||||
#. :c:func:`glm_vec4_floor`
|
||||
#. :c:func:`glm_vec4_sqrt`
|
||||
|
||||
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. c:function:: void glm_vec4_mulv(vec4 a, vec4 b, vec4 d)
|
||||
|
||||
multiplies individual items
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** vec1
|
||||
| *[in]* **b** vec2
|
||||
| *[out]* **d** destination
|
||||
|
||||
.. c:function:: void glm_vec4_broadcast(float val, vec4 d)
|
||||
|
||||
fill a vector with specified value
|
||||
|
||||
Parameters:
|
||||
| *[in]* **val** value
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: bool glm_vec4_eq(vec4 v, float val)
|
||||
|
||||
check if vector is equal to value (without epsilon)
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[in]* **val** value
|
||||
|
||||
.. c:function:: bool glm_vec4_eq_eps(vec4 v, float val)
|
||||
|
||||
check if vector is equal to value (with epsilon)
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[in]* **val** value
|
||||
|
||||
.. c:function:: bool glm_vec4_eq_all(vec4 v)
|
||||
|
||||
check if vectors members are equal (without epsilon)
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
|
||||
.. c:function:: bool glm_vec4_eqv(vec4 v1, vec4 v2)
|
||||
|
||||
check if vector is equal to another (without epsilon) vector
|
||||
|
||||
Parameters:
|
||||
| *[in]* **vec** vector 1
|
||||
| *[in]* **vec** vector 2
|
||||
|
||||
.. c:function:: bool glm_vec4_eqv_eps(vec4 v1, vec4 v2)
|
||||
|
||||
check if vector is equal to another (with epsilon)
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v1** vector1
|
||||
| *[in]* **v2** vector2
|
||||
|
||||
.. c:function:: float glm_vec4_max(vec4 v)
|
||||
|
||||
max value of vector
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
|
||||
.. c:function:: float glm_vec4_min(vec4 v)
|
||||
|
||||
min value of vector
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
|
||||
.. c:function:: bool glm_vec4_isnan(vec4 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_vec4_isinf(vec4 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_vec4_isvalid(vec4 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_vec4_sign(vec4 v, vec4 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_vec4_abs(vec4 v, vec4 dest)
|
||||
|
||||
absolute value of each vector item
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[out]* **dest** destination vector (abs(v))
|
||||
|
||||
.. c:function:: void glm_vec4_fract(vec4 v, vec4 dest)
|
||||
|
||||
fractional part of each vector item
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[out]* **dest** destination vector (fract(v))
|
||||
|
||||
.. c:function:: void glm_vec4_floor(vec4 v, vec4 dest)
|
||||
|
||||
floor of each vector item
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[out]* **dest** destination vector (floor(v))
|
||||
|
||||
.. c:function:: void glm_vec4_sqrt(vec4 v, vec4 dest)
|
||||
|
||||
square root of each vector item
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[out]* **dest** destination vector (sqrt(v))
|
||||
458
docs/source/vec4.rst
Normal file
458
docs/source/vec4.rst
Normal file
@@ -0,0 +1,458 @@
|
||||
.. default-domain:: C
|
||||
|
||||
vec4
|
||||
====
|
||||
|
||||
Header: cglm/vec4.h
|
||||
|
||||
Table of contents (click to go):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Macros:
|
||||
|
||||
1. glm_vec4_dup3(v, dest)
|
||||
#. glm_vec4_dup(v, dest)
|
||||
#. GLM_VEC4_ONE_INIT
|
||||
#. GLM_VEC4_BLACK_INIT
|
||||
#. GLM_VEC4_ZERO_INIT
|
||||
#. GLM_VEC4_ONE
|
||||
#. GLM_VEC4_BLACK
|
||||
#. GLM_VEC4_ZERO
|
||||
|
||||
Functions:
|
||||
|
||||
1. :c:func:`glm_vec4`
|
||||
#. :c:func:`glm_vec4_copy3`
|
||||
#. :c:func:`glm_vec4_copy`
|
||||
#. :c:func:`glm_vec4_ucopy`
|
||||
#. :c:func:`glm_vec4_zero`
|
||||
#. :c:func:`glm_vec4_one`
|
||||
#. :c:func:`glm_vec4_dot`
|
||||
#. :c:func:`glm_vec4_norm2`
|
||||
#. :c:func:`glm_vec4_norm`
|
||||
#. :c:func:`glm_vec4_add`
|
||||
#. :c:func:`glm_vec4_adds`
|
||||
#. :c:func:`glm_vec4_sub`
|
||||
#. :c:func:`glm_vec4_subs`
|
||||
#. :c:func:`glm_vec4_mul`
|
||||
#. :c:func:`glm_vec4_scale`
|
||||
#. :c:func:`glm_vec4_scale_as`
|
||||
#. :c:func:`glm_vec4_div`
|
||||
#. :c:func:`glm_vec4_divs`
|
||||
#. :c:func:`glm_vec4_addadd`
|
||||
#. :c:func:`glm_vec4_subadd`
|
||||
#. :c:func:`glm_vec4_muladd`
|
||||
#. :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_to`
|
||||
#. :c:func:`glm_vec4_inv`
|
||||
#. :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_to`
|
||||
#. :c:func:`glm_vec4_distance`
|
||||
#. :c:func:`glm_vec4_maxv`
|
||||
#. :c:func:`glm_vec4_minv`
|
||||
#. :c:func:`glm_vec4_clamp`
|
||||
#. :c:func:`glm_vec4_lerp`
|
||||
#. :c:func:`glm_vec4_cubic`
|
||||
#. :c:func:`glm_vec4_make`
|
||||
#. :c:func:`glm_vec4_reflect`
|
||||
#. :c:func:`glm_vec4_refract`
|
||||
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. c:function:: void glm_vec4(vec3 v3, float last, vec4 dest)
|
||||
|
||||
init vec4 using vec3, since you are initializing vec4 with vec3
|
||||
you need to set last item. cglm could set it zero but making it parameter
|
||||
gives more control
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v3** vector4
|
||||
| *[in]* **last** last item of vec4
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_vec4_copy3(vec4 a, vec3 dest)
|
||||
|
||||
copy first 3 members of [a] to [dest]
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** source
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_vec4_copy(vec4 v, vec4 dest)
|
||||
|
||||
copy all members of [a] to [dest]
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** source
|
||||
| *[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)
|
||||
|
||||
makes all members zero
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **v** vector
|
||||
|
||||
.. c:function:: void glm_vec4_one(vec4 v)
|
||||
|
||||
makes all members one
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **v** vector
|
||||
|
||||
.. c:function:: float glm_vec4_dot(vec4 a, vec4 b)
|
||||
|
||||
dot product of vec4
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** vector1
|
||||
| *[in]* **b** vector2
|
||||
|
||||
Returns:
|
||||
dot product
|
||||
|
||||
.. c:function:: float glm_vec4_norm2(vec4 v)
|
||||
|
||||
norm * norm (magnitude) of vector
|
||||
|
||||
we can use this func instead of calling norm * norm, because it would call
|
||||
sqrtf function twice but with this func we can avoid func call, maybe this is
|
||||
not good name for this func
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
|
||||
Returns:
|
||||
square of norm / magnitude
|
||||
|
||||
.. c:function:: float glm_vec4_norm(vec4 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_vec4_add(vec4 a, vec4 b, vec4 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_vec4_adds(vec4 v, float s, vec4 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_vec4_sub(vec4 a, vec4 b, vec4 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_vec4_subs(vec4 v, float s, vec4 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_vec4_mul(vec4 a, vec4 b, vec4 d)
|
||||
|
||||
multiply two vector (component-wise multiplication)
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** vector1
|
||||
| *[in]* **b** vector2
|
||||
| *[out]* **dest** result = (a[0] * b[0], a[1] * b[1], a[2] * b[2], a[3] * b[3])
|
||||
|
||||
.. c:function:: void glm_vec4_scale(vec4 v, float s, vec4 dest)
|
||||
|
||||
multiply/scale vec4 vector with scalar: result = v * s
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[in]* **s** scalar
|
||||
| *[out]* **dest** destination vector
|
||||
|
||||
.. c:function:: void glm_vec4_scale_as(vec4 v, float s, vec4 dest)
|
||||
|
||||
make vec4 vector scale as specified: result = unit(v) * s
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[in]* **s** scalar
|
||||
| *[out]* **dest** destination vector
|
||||
|
||||
.. c:function:: void glm_vec4_div(vec4 a, vec4 b, vec4 dest)
|
||||
|
||||
div vector with another component-wise division: d = v1 / v2
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** vector1
|
||||
| *[in]* **b** vector2
|
||||
| *[out]* **dest** result = (a[0] / b[0], a[1] / b[1], a[2] / b[2], a[3] / b[3])
|
||||
|
||||
.. c:function:: void glm_vec4_divs(vec4 v, float s, vec4 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, a[3] / s)
|
||||
|
||||
.. c:function:: void glm_vec4_addadd(vec4 a, vec4 b, vec4 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_vec4_subadd(vec4 a, vec4 b, vec4 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_vec4_muladd(vec4 a, vec4 b, vec4 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_vec4_muladds(vec4 a, float s, vec4 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_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)
|
||||
|
||||
**DEPRECATED!**
|
||||
|
||||
use :c:func:`glm_vec4_negate`
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **v** vector
|
||||
|
||||
.. c:function:: void glm_vec4_flipsign_to(vec4 v, vec4 dest)
|
||||
|
||||
**DEPRECATED!**
|
||||
|
||||
use :c:func:`glm_vec4_negate_to`
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[out]* **dest** negated vector
|
||||
|
||||
.. c:function:: void glm_vec4_inv(vec4 v)
|
||||
|
||||
**DEPRECATED!**
|
||||
|
||||
use :c:func:`glm_vec4_negate`
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **v** vector
|
||||
|
||||
.. c:function:: void glm_vec4_inv_to(vec4 v, vec4 dest)
|
||||
|
||||
**DEPRECATED!**
|
||||
|
||||
use :c:func:`glm_vec4_negate_to`
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** source
|
||||
| *[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)
|
||||
|
||||
normalize vec4 and store result in same vec
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **v** vector
|
||||
|
||||
.. c:function:: void glm_vec4_normalize_to(vec4 vec, vec4 dest)
|
||||
|
||||
normalize vec4 to dest
|
||||
|
||||
Parameters:
|
||||
| *[in]* **vec** source
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: float glm_vec4_distance(vec4 v1, vec4 v2)
|
||||
|
||||
distance between two vectors
|
||||
|
||||
Parameters:
|
||||
| *[in]* **mat** vector1
|
||||
| *[in]* **row1** vector2
|
||||
|
||||
Returns:
|
||||
| distance
|
||||
|
||||
.. c:function:: void glm_vec4_maxv(vec4 v1, vec4 v2, vec4 dest)
|
||||
|
||||
max values of vectors
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v1** vector1
|
||||
| *[in]* **v2** vector2
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_vec4_minv(vec4 v1, vec4 v2, vec4 dest)
|
||||
|
||||
min values of vectors
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v1** vector1
|
||||
| *[in]* **v2** vector2
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_vec4_clamp(vec4 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_vec4_lerp(vec4 from, vec4 to, float t, vec4 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
|
||||
|
||||
.. 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
|
||||
|
||||
.. c:function:: void glm_vec4_make(const float * __restrict src, vec4 dest)
|
||||
|
||||
Create four dimensional vector from pointer
|
||||
|
||||
.. note:: **@src** must contain at least 4 elements.
|
||||
|
||||
Parameters:
|
||||
| *[in]* **src** pointer to an array of floats
|
||||
| *[out]* **dest** destination vector
|
||||
|
||||
.. c:function:: bool glm_vec4_reflect(vec4 v, vec4 n, vec4 dest)
|
||||
|
||||
Reflection vector using an incident ray and a surface normal
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** incident vector
|
||||
| *[in]* **n** *❗️ normalized ❗️* normal vector
|
||||
| *[out]* **dest** destination: reflection result
|
||||
|
||||
.. c:function:: bool glm_vec4_refract(vec4 v, vec4 n, float eta, vec4 dest)
|
||||
|
||||
computes refraction vector for an incident vector and a surface normal.
|
||||
|
||||
Calculates the refraction vector based on Snell's law. If total internal reflection
|
||||
occurs (angle too great given eta), dest is set to zero and returns false.
|
||||
Otherwise, computes refraction vector, stores it in dest, and returns true.
|
||||
|
||||
This implementation does not explicitly preserve the 'w' component of the
|
||||
incident vector 'I' in the output 'dest', users requiring the preservation of
|
||||
the 'w' component should manually adjust 'dest' after calling this function.
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** *❗️ normalized ❗️* incident vector
|
||||
| *[in]* **n** *❗️ normalized ❗️* normal vector
|
||||
| *[in]* **eta** ratio of indices of refraction (incident/transmitted)
|
||||
| *[out]* **dest** refraction vector if refraction occurs; zero vector otherwise
|
||||
|
||||
Returns:
|
||||
returns true if refraction occurs; false if total internal reflection occurs.
|
||||
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`
|
||||
@@ -1,63 +0,0 @@
|
||||
/*
|
||||
* Copyright (c), Recep Aslantas.
|
||||
*
|
||||
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||
* Full license can be found in the LICENSE file
|
||||
*/
|
||||
|
||||
#ifndef cglm_affine_mat_avx_h
|
||||
#define cglm_affine_mat_avx_h
|
||||
#ifdef __AVX__
|
||||
|
||||
#include "../../cglm-common.h"
|
||||
#include "cglm-intrin.h"
|
||||
|
||||
#include <immintrin.h>
|
||||
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mul_avx(mat4 m1, mat4 m2, mat4 dest) {
|
||||
/* D = R * L (Column-Major) */
|
||||
|
||||
__m256 y0, y1, y2, y3, y4, y5, y6, y7, y8, y9;
|
||||
|
||||
y0 = _mm256_load_ps(m2[0]); /* h g f e d c b a */
|
||||
y1 = _mm256_load_ps(m2[2]); /* p o n m l k j i */
|
||||
|
||||
y2 = _mm256_load_ps(m1[0]); /* h g f e d c b a */
|
||||
y3 = _mm256_load_ps(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 */
|
||||
y5 = _mm256_permute2f128_ps(y3, y3, 0b00000000); /* l k j i l k j i */
|
||||
|
||||
/* f f f f a a a a */
|
||||
/* g g g g c c c c */
|
||||
/* e e e e b b b b */
|
||||
y7 = _mm256_permute_ps(y0, 0b10101010);
|
||||
y6 = _mm256_permutevar_ps(y0, _mm256_set_epi32(1, 1, 1, 1, 0, 0, 0, 0));
|
||||
y8 = _mm256_permutevar_ps(y0, _mm256_set_epi32(0, 0, 0, 0, 1, 1, 1, 1));
|
||||
|
||||
_mm256_store_ps(dest[0],
|
||||
_mm256_add_ps(_mm256_add_ps(_mm256_mul_ps(y2, y6),
|
||||
_mm256_mul_ps(y4, y8)),
|
||||
_mm256_mul_ps(y5, y7)));
|
||||
|
||||
|
||||
/* n n n n i i i i */
|
||||
/* p p p p k k k k */
|
||||
/* m m m m j j j j */
|
||||
/* o o o o l l l l */
|
||||
y6 = _mm256_permutevar_ps(y1, _mm256_set_epi32(1, 1, 1, 1, 0, 0, 0, 0));
|
||||
y7 = _mm256_permutevar_ps(y1, _mm256_set_epi32(3, 3, 3, 3, 2, 2, 2, 2));
|
||||
y8 = _mm256_permutevar_ps(y1, _mm256_set_epi32(0, 0, 0, 0, 1, 1, 1, 1));
|
||||
y9 = _mm256_permutevar_ps(y1, _mm256_set_epi32(2, 2, 2, 2, 3, 3, 3, 3));
|
||||
|
||||
_mm256_store_ps(dest[2],
|
||||
_mm256_add_ps(_mm256_add_ps(_mm256_mul_ps(y2, y6),
|
||||
_mm256_mul_ps(y3, y7)),
|
||||
_mm256_add_ps(_mm256_mul_ps(y4, y8),
|
||||
_mm256_mul_ps(y5, y9))));
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif /* cglm_affine_mat_avx_h */
|
||||
@@ -1,79 +0,0 @@
|
||||
/*
|
||||
* Copyright (c), Recep Aslantas.
|
||||
*
|
||||
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||
* Full license can be found in the LICENSE file
|
||||
*/
|
||||
|
||||
#ifndef cglm_affine_mat_sse2_h
|
||||
#define cglm_affine_mat_sse2_h
|
||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||
|
||||
#include "../../cglm-common.h"
|
||||
#include "cglm-intrin.h"
|
||||
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mul_sse2(mat4 m1, mat4 m2, mat4 dest) {
|
||||
/* D = R * L (Column-Major) */
|
||||
__m128 l0, l1, l2, l3, r;
|
||||
|
||||
l0 = _mm_load_ps(m1[0]);
|
||||
l1 = _mm_load_ps(m1[1]);
|
||||
l2 = _mm_load_ps(m1[2]);
|
||||
l3 = _mm_load_ps(m1[3]);
|
||||
|
||||
r = _mm_load_ps(m2[0]);
|
||||
_mm_store_ps(dest[0],
|
||||
_mm_add_ps(_mm_add_ps(_mm_mul_ps(_mm_shuffle1_ps1(r, 0), l0),
|
||||
_mm_mul_ps(_mm_shuffle1_ps1(r, 1), l1)),
|
||||
_mm_mul_ps(_mm_shuffle1_ps1(r, 2), l2)));
|
||||
|
||||
r = _mm_load_ps(m2[1]);
|
||||
_mm_store_ps(dest[1],
|
||||
_mm_add_ps(_mm_add_ps(_mm_mul_ps(_mm_shuffle1_ps1(r, 0), l0),
|
||||
_mm_mul_ps(_mm_shuffle1_ps1(r, 1), l1)),
|
||||
_mm_mul_ps(_mm_shuffle1_ps1(r, 2), l2)));
|
||||
|
||||
r = _mm_load_ps(m2[2]);
|
||||
_mm_store_ps(dest[2],
|
||||
_mm_add_ps(_mm_add_ps(_mm_mul_ps(_mm_shuffle1_ps1(r, 0), l0),
|
||||
_mm_mul_ps(_mm_shuffle1_ps1(r, 1), l1)),
|
||||
_mm_mul_ps(_mm_shuffle1_ps1(r, 2), l2)));
|
||||
|
||||
r = _mm_load_ps(m2[3]);
|
||||
_mm_store_ps(dest[3],
|
||||
_mm_add_ps(_mm_add_ps(_mm_mul_ps(_mm_shuffle1_ps1(r, 0), l0),
|
||||
_mm_mul_ps(_mm_shuffle1_ps1(r, 1), l1)),
|
||||
_mm_add_ps(_mm_mul_ps(_mm_shuffle1_ps1(r, 2), l2),
|
||||
_mm_mul_ps(_mm_shuffle1_ps1(r, 3), l3))));
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_inv_tr_sse2(mat4 mat) {
|
||||
__m128 r0, r1, r2, r3, x0, x1;
|
||||
|
||||
r0 = _mm_load_ps(mat[0]);
|
||||
r1 = _mm_load_ps(mat[1]);
|
||||
r2 = _mm_load_ps(mat[2]);
|
||||
r3 = _mm_load_ps(mat[3]);
|
||||
x1 = _mm_set_ps(1.0f, 0.0f, 0.0f, 0.0f);
|
||||
|
||||
_MM_TRANSPOSE4_PS(r0, r1, r2, x1);
|
||||
|
||||
x0 = _mm_add_ps(_mm_mul_ps(r0, _mm_shuffle1_ps(r3, 0, 0, 0, 0)),
|
||||
_mm_mul_ps(r1, _mm_shuffle1_ps(r3, 1, 1, 1, 1)));
|
||||
x0 = _mm_add_ps(x0, _mm_mul_ps(r2, _mm_shuffle1_ps(r3, 2, 2, 2, 2)));
|
||||
x0 = _mm_xor_ps(x0, _mm_set1_ps(-0.f));
|
||||
|
||||
x0 = _mm_add_ps(x0, x1);
|
||||
|
||||
_mm_store_ps(mat[0], r0);
|
||||
_mm_store_ps(mat[1], r1);
|
||||
_mm_store_ps(mat[2], r2);
|
||||
_mm_store_ps(mat[3], x0);
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif /* cglm_affine_mat_sse2_h */
|
||||
@@ -1,36 +0,0 @@
|
||||
/*
|
||||
* Copyright (c), Recep Aslantas.
|
||||
*
|
||||
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||
* Full license can be found in the LICENSE file
|
||||
*/
|
||||
|
||||
#ifndef cglm_intrin_h
|
||||
#define cglm_intrin_h
|
||||
|
||||
#if defined( _WIN32 )
|
||||
# if (defined(_M_AMD64) || defined(_M_X64)) || _M_IX86_FP == 2
|
||||
# define __SSE2__
|
||||
# elif _M_IX86_FP == 1
|
||||
# define __SSE__
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||
|
||||
#include <xmmintrin.h>
|
||||
#include <emmintrin.h>
|
||||
|
||||
/* float */
|
||||
#define _mm_shuffle1_ps(a, z, y, x, w) \
|
||||
_mm_shuffle_ps(a, a, _MM_SHUFFLE(z, y, x, w))
|
||||
|
||||
#define _mm_shuffle1_ps1(a, x) \
|
||||
_mm_shuffle_ps(a, a, _MM_SHUFFLE(x, x, x, x))
|
||||
|
||||
#define _mm_shuffle2_ps(a, b, z0, y0, x0, w0, z1, y1, x1, w1) \
|
||||
_mm_shuffle1_ps(_mm_shuffle_ps(a, b, _MM_SHUFFLE(z0, y0, x0, w0)), \
|
||||
z1, y1, x1, w1)
|
||||
|
||||
#endif
|
||||
#endif /* cglm_intrin_h */
|
||||
@@ -1,65 +0,0 @@
|
||||
/*
|
||||
* Copyright (c), Recep Aslantas.
|
||||
*
|
||||
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||
* Full license can be found in the LICENSE file
|
||||
*/
|
||||
|
||||
#ifndef cglm_mat_simd_avx_h
|
||||
#define cglm_mat_simd_avx_h
|
||||
#ifdef __AVX__
|
||||
|
||||
#include "../../cglm-common.h"
|
||||
#include "cglm-intrin.h"
|
||||
|
||||
#include <immintrin.h>
|
||||
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat4_mul_avx(mat4 m1, mat4 m2, mat4 dest) {
|
||||
/* D = R * L (Column-Major) */
|
||||
|
||||
__m256 y0, y1, y2, y3, y4, y5, y6, y7, y8, y9;
|
||||
|
||||
y0 = _mm256_load_ps(m2[0]); /* h g f e d c b a */
|
||||
y1 = _mm256_load_ps(m2[2]); /* p o n m l k j i */
|
||||
|
||||
y2 = _mm256_load_ps(m1[0]); /* h g f e d c b a */
|
||||
y3 = _mm256_load_ps(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 */
|
||||
y5 = _mm256_permute2f128_ps(y3, y3, 0b00000011); /* l k j i p o n m */
|
||||
|
||||
/* f f f f a a a a */
|
||||
/* h h h h c c c c */
|
||||
/* e e e e b b b b */
|
||||
/* g g g g d d d d */
|
||||
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));
|
||||
y9 = _mm256_permutevar_ps(y0, _mm256_set_epi32(2, 2, 2, 2, 3, 3, 3, 3));
|
||||
|
||||
_mm256_store_ps(dest[0],
|
||||
_mm256_add_ps(_mm256_add_ps(_mm256_mul_ps(y2, y6),
|
||||
_mm256_mul_ps(y3, y7)),
|
||||
_mm256_add_ps(_mm256_mul_ps(y4, y8),
|
||||
_mm256_mul_ps(y5, y9))));
|
||||
|
||||
/* n n n n i i i i */
|
||||
/* p p p p k k k k */
|
||||
/* m m m m j j j j */
|
||||
/* o o o o l l l l */
|
||||
y6 = _mm256_permutevar_ps(y1, _mm256_set_epi32(1, 1, 1, 1, 0, 0, 0, 0));
|
||||
y7 = _mm256_permutevar_ps(y1, _mm256_set_epi32(3, 3, 3, 3, 2, 2, 2, 2));
|
||||
y8 = _mm256_permutevar_ps(y1, _mm256_set_epi32(0, 0, 0, 0, 1, 1, 1, 1));
|
||||
y9 = _mm256_permutevar_ps(y1, _mm256_set_epi32(2, 2, 2, 2, 3, 3, 3, 3));
|
||||
|
||||
_mm256_store_ps(dest[2],
|
||||
_mm256_add_ps(_mm256_add_ps(_mm256_mul_ps(y2, y6),
|
||||
_mm256_mul_ps(y3, y7)),
|
||||
_mm256_add_ps(_mm256_mul_ps(y4, y8),
|
||||
_mm256_mul_ps(y5, y9))));
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif /* cglm_mat_simd_avx_h */
|
||||
@@ -1,407 +0,0 @@
|
||||
/*
|
||||
* Copyright (c), Recep Aslantas.
|
||||
*
|
||||
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||
* Full license can be found in the LICENSE file
|
||||
*/
|
||||
|
||||
#ifndef cglm_mat_sse_h
|
||||
#define cglm_mat_sse_h
|
||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||
|
||||
#include "../../cglm-common.h"
|
||||
#include "cglm-intrin.h"
|
||||
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat4_scale_sse2(mat4 m, float s){
|
||||
__m128 x0;
|
||||
x0 = _mm_set1_ps(s);
|
||||
|
||||
_mm_store_ps(m[0], _mm_mul_ps(_mm_load_ps(m[0]), x0));
|
||||
_mm_store_ps(m[1], _mm_mul_ps(_mm_load_ps(m[1]), x0));
|
||||
_mm_store_ps(m[2], _mm_mul_ps(_mm_load_ps(m[2]), x0));
|
||||
_mm_store_ps(m[3], _mm_mul_ps(_mm_load_ps(m[3]), x0));
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat4_transp_sse2(mat4 m, mat4 dest){
|
||||
__m128 r0, r1, r2, r3;
|
||||
|
||||
r0 = _mm_load_ps(m[0]);
|
||||
r1 = _mm_load_ps(m[1]);
|
||||
r2 = _mm_load_ps(m[2]);
|
||||
r3 = _mm_load_ps(m[3]);
|
||||
|
||||
_MM_TRANSPOSE4_PS(r0, r1, r2, r3);
|
||||
|
||||
_mm_store_ps(dest[0], r0);
|
||||
_mm_store_ps(dest[1], r1);
|
||||
_mm_store_ps(dest[2], r2);
|
||||
_mm_store_ps(dest[3], r3);
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat4_mul_sse2(mat4 m1, mat4 m2, mat4 dest) {
|
||||
/* D = R * L (Column-Major) */
|
||||
|
||||
__m128 l0, l1, l2, l3, r;
|
||||
|
||||
l0 = _mm_load_ps(m1[0]);
|
||||
l1 = _mm_load_ps(m1[1]);
|
||||
l2 = _mm_load_ps(m1[2]);
|
||||
l3 = _mm_load_ps(m1[3]);
|
||||
|
||||
r = _mm_load_ps(m2[0]);
|
||||
_mm_store_ps(dest[0],
|
||||
_mm_add_ps(_mm_add_ps(_mm_mul_ps(_mm_shuffle1_ps1(r, 0), l0),
|
||||
_mm_mul_ps(_mm_shuffle1_ps1(r, 1), l1)),
|
||||
_mm_add_ps(_mm_mul_ps(_mm_shuffle1_ps1(r, 2), l2),
|
||||
_mm_mul_ps(_mm_shuffle1_ps1(r, 3), l3))));
|
||||
r = _mm_load_ps(m2[1]);
|
||||
_mm_store_ps(dest[1],
|
||||
_mm_add_ps(_mm_add_ps(_mm_mul_ps(_mm_shuffle1_ps1(r, 0), l0),
|
||||
_mm_mul_ps(_mm_shuffle1_ps1(r, 1), l1)),
|
||||
_mm_add_ps(_mm_mul_ps(_mm_shuffle1_ps1(r, 2), l2),
|
||||
_mm_mul_ps(_mm_shuffle1_ps1(r, 3), l3))));
|
||||
r = _mm_load_ps(m2[2]);
|
||||
_mm_store_ps(dest[2],
|
||||
_mm_add_ps(_mm_add_ps(_mm_mul_ps(_mm_shuffle1_ps1(r, 0), l0),
|
||||
_mm_mul_ps(_mm_shuffle1_ps1(r, 1), l1)),
|
||||
_mm_add_ps(_mm_mul_ps(_mm_shuffle1_ps1(r, 2), l2),
|
||||
_mm_mul_ps(_mm_shuffle1_ps1(r, 3), l3))));
|
||||
|
||||
r = _mm_load_ps(m2[3]);
|
||||
_mm_store_ps(dest[3],
|
||||
_mm_add_ps(_mm_add_ps(_mm_mul_ps(_mm_shuffle1_ps1(r, 0), l0),
|
||||
_mm_mul_ps(_mm_shuffle1_ps1(r, 1), l1)),
|
||||
_mm_add_ps(_mm_mul_ps(_mm_shuffle1_ps1(r, 2), l2),
|
||||
_mm_mul_ps(_mm_shuffle1_ps1(r, 3), l3))));
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat4_mulv_sse2(mat4 m, vec4 v, vec4 dest) {
|
||||
__m128 x0, x1, x2;
|
||||
|
||||
x0 = _mm_load_ps(v);
|
||||
x1 = _mm_add_ps(_mm_mul_ps(_mm_load_ps(m[0]),
|
||||
_mm_shuffle1_ps1(x0, 0)),
|
||||
_mm_mul_ps(_mm_load_ps(m[1]),
|
||||
_mm_shuffle1_ps1(x0, 1)));
|
||||
|
||||
x2 = _mm_add_ps(_mm_mul_ps(_mm_load_ps(m[2]),
|
||||
_mm_shuffle1_ps1(x0, 2)),
|
||||
_mm_mul_ps(_mm_load_ps(m[3]),
|
||||
_mm_shuffle1_ps1(x0, 3)));
|
||||
|
||||
_mm_store_ps(dest, _mm_add_ps(x1, x2));
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
float
|
||||
glm_mat4_det_sse2(mat4 mat) {
|
||||
__m128 r0, r1, r2, r3, x0, x1, x2;
|
||||
|
||||
/* 127 <- 0, [square] det(A) = det(At) */
|
||||
r0 = _mm_load_ps(mat[0]); /* d c b a */
|
||||
r1 = _mm_load_ps(mat[1]); /* h g f e */
|
||||
r2 = _mm_load_ps(mat[2]); /* l k j i */
|
||||
r3 = _mm_load_ps(mat[3]); /* p o n m */
|
||||
|
||||
/*
|
||||
t[1] = j * p - n * l;
|
||||
t[2] = j * o - n * k;
|
||||
t[3] = i * p - m * l;
|
||||
t[4] = i * o - m * k;
|
||||
*/
|
||||
x0 = _mm_sub_ps(_mm_mul_ps(_mm_shuffle1_ps(r2, 0, 0, 1, 1),
|
||||
_mm_shuffle1_ps(r3, 2, 3, 2, 3)),
|
||||
_mm_mul_ps(_mm_shuffle1_ps(r3, 0, 0, 1, 1),
|
||||
_mm_shuffle1_ps(r2, 2, 3, 2, 3)));
|
||||
/*
|
||||
t[0] = k * p - o * l;
|
||||
t[0] = k * p - o * l;
|
||||
t[5] = i * n - m * j;
|
||||
t[5] = i * n - m * j;
|
||||
*/
|
||||
x1 = _mm_sub_ps(_mm_mul_ps(_mm_shuffle1_ps(r2, 0, 0, 2, 2),
|
||||
_mm_shuffle1_ps(r3, 1, 1, 3, 3)),
|
||||
_mm_mul_ps(_mm_shuffle1_ps(r3, 0, 0, 2, 2),
|
||||
_mm_shuffle1_ps(r2, 1, 1, 3, 3)));
|
||||
|
||||
/*
|
||||
a * (f * t[0] - g * t[1] + h * t[2])
|
||||
- b * (e * t[0] - g * t[3] + h * t[4])
|
||||
+ c * (e * t[1] - f * t[3] + h * t[5])
|
||||
- d * (e * t[2] - f * t[4] + g * t[5])
|
||||
*/
|
||||
x2 = _mm_sub_ps(_mm_mul_ps(_mm_shuffle1_ps(r1, 0, 0, 0, 1),
|
||||
_mm_shuffle_ps(x1, x0, _MM_SHUFFLE(1, 0, 0, 0))),
|
||||
_mm_mul_ps(_mm_shuffle1_ps(r1, 1, 1, 2, 2),
|
||||
_mm_shuffle1_ps(x0, 3, 2, 2, 0)));
|
||||
|
||||
x2 = _mm_add_ps(x2,
|
||||
_mm_mul_ps(_mm_shuffle1_ps(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));
|
||||
|
||||
x0 = _mm_mul_ps(r0, x2);
|
||||
x0 = _mm_add_ps(x0, _mm_shuffle1_ps(x0, 0, 1, 2, 3));
|
||||
x0 = _mm_add_ps(x0, _mm_shuffle1_ps(x0, 1, 3, 3, 1));
|
||||
|
||||
return _mm_cvtss_f32(x0);
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat4_inv_sse2(mat4 mat, mat4 dest) {
|
||||
__m128 r0, r1, r2, r3,
|
||||
v0, v1, v2, v3,
|
||||
t0, t1, t2, t3, t4, t5,
|
||||
x0, x1, x2, x3, x4, x5, x6, x7;
|
||||
|
||||
/* 127 <- 0 */
|
||||
r0 = _mm_load_ps(mat[0]); /* d c b a */
|
||||
r1 = _mm_load_ps(mat[1]); /* h g f e */
|
||||
r2 = _mm_load_ps(mat[2]); /* l k j i */
|
||||
r3 = _mm_load_ps(mat[3]); /* p o n m */
|
||||
|
||||
x0 = _mm_shuffle_ps(r2, r3, _MM_SHUFFLE(3, 2, 3, 2)); /* p o l k */
|
||||
x1 = _mm_shuffle1_ps(x0, 1, 3, 3, 3); /* l p p p */
|
||||
x2 = _mm_shuffle1_ps(x0, 0, 2, 2, 2); /* k o o o */
|
||||
x0 = _mm_shuffle_ps(r2, r1, _MM_SHUFFLE(3, 3, 3, 3)); /* h h l l */
|
||||
x3 = _mm_shuffle_ps(r2, r1, _MM_SHUFFLE(2, 2, 2, 2)); /* g g k k */
|
||||
|
||||
/* t1[0] = k * p - o * l;
|
||||
t1[0] = k * p - o * l;
|
||||
t2[0] = g * p - o * h;
|
||||
t3[0] = g * l - k * h; */
|
||||
t0 = _mm_sub_ps(_mm_mul_ps(x3, x1), _mm_mul_ps(x2, x0));
|
||||
|
||||
x4 = _mm_shuffle_ps(r2, r3, _MM_SHUFFLE(2, 1, 2, 1)); /* o n k j */
|
||||
x4 = _mm_shuffle1_ps(x4, 0, 2, 2, 2); /* j n n n */
|
||||
x5 = _mm_shuffle_ps(r2, r1, _MM_SHUFFLE(1, 1, 1, 1)); /* f f j j */
|
||||
|
||||
/* t1[1] = j * p - n * l;
|
||||
t1[1] = j * p - n * l;
|
||||
t2[1] = f * p - n * h;
|
||||
t3[1] = f * l - j * h; */
|
||||
t1 = _mm_sub_ps(_mm_mul_ps(x5, x1), _mm_mul_ps(x4, x0));
|
||||
|
||||
/* t1[2] = j * o - n * k
|
||||
t1[2] = j * o - n * k;
|
||||
t2[2] = f * o - n * g;
|
||||
t3[2] = f * k - j * g; */
|
||||
t2 = _mm_sub_ps(_mm_mul_ps(x5, x2), _mm_mul_ps(x4, x3));
|
||||
|
||||
x6 = _mm_shuffle_ps(r2, r1, _MM_SHUFFLE(0, 0, 0, 0)); /* e e i i */
|
||||
x7 = _mm_shuffle2_ps(r3, r2, 0, 0, 0, 0, 2, 0, 0, 0); /* i m m m */
|
||||
|
||||
/* t1[3] = i * p - m * l;
|
||||
t1[3] = i * p - m * l;
|
||||
t2[3] = e * p - m * h;
|
||||
t3[3] = e * l - i * h; */
|
||||
t3 = _mm_sub_ps(_mm_mul_ps(x6, x1), _mm_mul_ps(x7, x0));
|
||||
|
||||
/* t1[4] = i * o - m * k;
|
||||
t1[4] = i * o - m * k;
|
||||
t2[4] = e * o - m * g;
|
||||
t3[4] = e * k - i * g; */
|
||||
t4 = _mm_sub_ps(_mm_mul_ps(x6, x2), _mm_mul_ps(x7, x3));
|
||||
|
||||
/* t1[5] = i * n - m * j;
|
||||
t1[5] = i * n - m * j;
|
||||
t2[5] = e * n - m * f;
|
||||
t3[5] = e * j - i * f; */
|
||||
t5 = _mm_sub_ps(_mm_mul_ps(x6, x4), _mm_mul_ps(x7, x5));
|
||||
|
||||
x0 = _mm_shuffle2_ps(r1, r0, 0, 0, 0, 0, 2, 2, 2, 0); /* a a a e */
|
||||
x1 = _mm_shuffle2_ps(r1, r0, 1, 1, 1, 1, 2, 2, 2, 0); /* b b b f */
|
||||
x2 = _mm_shuffle2_ps(r1, r0, 2, 2, 2, 2, 2, 2, 2, 0); /* c c c g */
|
||||
x3 = _mm_shuffle2_ps(r1, r0, 3, 3, 3, 3, 2, 2, 2, 0); /* d d d h */
|
||||
|
||||
/*
|
||||
dest[0][0] = f * t1[0] - g * t1[1] + h * 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][3] =-(b * t3[0] - c * t3[1] + d * t3[2]); */
|
||||
v0 = _mm_add_ps(_mm_mul_ps(x3, t2),
|
||||
_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][1] =-(a * t1[1] - b * t1[3] + d * t1[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]);*/
|
||||
v2 = _mm_add_ps(_mm_mul_ps(x3, t5),
|
||||
_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[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][2] =-(a * t2[2] - b * t2[4] + c * t2[5]);
|
||||
dest[3][3] = a * t3[2] - b * t3[4] + c * t3[5]; */
|
||||
v3 = _mm_add_ps(_mm_mul_ps(x2, t5),
|
||||
_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 */
|
||||
x0 = _mm_shuffle_ps(v0, v1, _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_mul_ps(x0, r0);
|
||||
x0 = _mm_add_ps(x0, _mm_shuffle1_ps(x0, 0, 1, 2, 3));
|
||||
x0 = _mm_add_ps(x0, _mm_shuffle1_ps(x0, 1, 0, 0, 1));
|
||||
x0 = _mm_rcp_ps(x0);
|
||||
|
||||
_mm_store_ps(dest[0], _mm_mul_ps(v0, x0));
|
||||
_mm_store_ps(dest[1], _mm_mul_ps(v1, x0));
|
||||
_mm_store_ps(dest[2], _mm_mul_ps(v2, x0));
|
||||
_mm_store_ps(dest[3], _mm_mul_ps(v3, x0));
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat4_inv_precise_sse2(mat4 mat, mat4 dest) {
|
||||
__m128 r0, r1, r2, r3,
|
||||
v0, v1, v2, v3,
|
||||
t0, t1, t2, t3, t4, t5,
|
||||
x0, x1, x2, x3, x4, x5, x6, x7;
|
||||
|
||||
/* 127 <- 0 */
|
||||
r0 = _mm_load_ps(mat[0]); /* d c b a */
|
||||
r1 = _mm_load_ps(mat[1]); /* h g f e */
|
||||
r2 = _mm_load_ps(mat[2]); /* l k j i */
|
||||
r3 = _mm_load_ps(mat[3]); /* p o n m */
|
||||
|
||||
x0 = _mm_shuffle_ps(r2, r3, _MM_SHUFFLE(3, 2, 3, 2)); /* p o l k */
|
||||
x1 = _mm_shuffle1_ps(x0, 1, 3, 3, 3); /* l p p p */
|
||||
x2 = _mm_shuffle1_ps(x0, 0, 2, 2, 2); /* k o o o */
|
||||
x0 = _mm_shuffle_ps(r2, r1, _MM_SHUFFLE(3, 3, 3, 3)); /* h h l l */
|
||||
x3 = _mm_shuffle_ps(r2, r1, _MM_SHUFFLE(2, 2, 2, 2)); /* g g k k */
|
||||
|
||||
/* t1[0] = k * p - o * l;
|
||||
t1[0] = k * p - o * l;
|
||||
t2[0] = g * p - o * h;
|
||||
t3[0] = g * l - k * h; */
|
||||
t0 = _mm_sub_ps(_mm_mul_ps(x3, x1), _mm_mul_ps(x2, x0));
|
||||
|
||||
x4 = _mm_shuffle_ps(r2, r3, _MM_SHUFFLE(2, 1, 2, 1)); /* o n k j */
|
||||
x4 = _mm_shuffle1_ps(x4, 0, 2, 2, 2); /* j n n n */
|
||||
x5 = _mm_shuffle_ps(r2, r1, _MM_SHUFFLE(1, 1, 1, 1)); /* f f j j */
|
||||
|
||||
/* t1[1] = j * p - n * l;
|
||||
t1[1] = j * p - n * l;
|
||||
t2[1] = f * p - n * h;
|
||||
t3[1] = f * l - j * h; */
|
||||
t1 = _mm_sub_ps(_mm_mul_ps(x5, x1), _mm_mul_ps(x4, x0));
|
||||
|
||||
/* t1[2] = j * o - n * k
|
||||
t1[2] = j * o - n * k;
|
||||
t2[2] = f * o - n * g;
|
||||
t3[2] = f * k - j * g; */
|
||||
t2 = _mm_sub_ps(_mm_mul_ps(x5, x2), _mm_mul_ps(x4, x3));
|
||||
|
||||
x6 = _mm_shuffle_ps(r2, r1, _MM_SHUFFLE(0, 0, 0, 0)); /* e e i i */
|
||||
x7 = _mm_shuffle2_ps(r3, r2, 0, 0, 0, 0, 2, 0, 0, 0); /* i m m m */
|
||||
|
||||
/* t1[3] = i * p - m * l;
|
||||
t1[3] = i * p - m * l;
|
||||
t2[3] = e * p - m * h;
|
||||
t3[3] = e * l - i * h; */
|
||||
t3 = _mm_sub_ps(_mm_mul_ps(x6, x1), _mm_mul_ps(x7, x0));
|
||||
|
||||
/* t1[4] = i * o - m * k;
|
||||
t1[4] = i * o - m * k;
|
||||
t2[4] = e * o - m * g;
|
||||
t3[4] = e * k - i * g; */
|
||||
t4 = _mm_sub_ps(_mm_mul_ps(x6, x2), _mm_mul_ps(x7, x3));
|
||||
|
||||
/* t1[5] = i * n - m * j;
|
||||
t1[5] = i * n - m * j;
|
||||
t2[5] = e * n - m * f;
|
||||
t3[5] = e * j - i * f; */
|
||||
t5 = _mm_sub_ps(_mm_mul_ps(x6, x4), _mm_mul_ps(x7, x5));
|
||||
|
||||
x0 = _mm_shuffle2_ps(r1, r0, 0, 0, 0, 0, 2, 2, 2, 0); /* a a a e */
|
||||
x1 = _mm_shuffle2_ps(r1, r0, 1, 1, 1, 1, 2, 2, 2, 0); /* b b b f */
|
||||
x2 = _mm_shuffle2_ps(r1, r0, 2, 2, 2, 2, 2, 2, 2, 0); /* c c c g */
|
||||
x3 = _mm_shuffle2_ps(r1, r0, 3, 3, 3, 3, 2, 2, 2, 0); /* d d d h */
|
||||
|
||||
/*
|
||||
dest[0][0] = f * t1[0] - g * t1[1] + h * 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][3] =-(b * t3[0] - c * t3[1] + d * t3[2]); */
|
||||
v0 = _mm_add_ps(_mm_mul_ps(x3, t2),
|
||||
_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][1] =-(a * t1[1] - b * t1[3] + d * t1[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]);*/
|
||||
v2 = _mm_add_ps(_mm_mul_ps(x3, t5),
|
||||
_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[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][2] =-(a * t2[2] - b * t2[4] + c * t2[5]);
|
||||
dest[3][3] = a * t3[2] - b * t3[4] + c * t3[5]; */
|
||||
v3 = _mm_add_ps(_mm_mul_ps(x2, t5),
|
||||
_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 */
|
||||
x0 = _mm_shuffle_ps(v0, v1, _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_mul_ps(x0, r0);
|
||||
x0 = _mm_add_ps(x0, _mm_shuffle1_ps(x0, 0, 1, 2, 3));
|
||||
x0 = _mm_add_ps(x0, _mm_shuffle1_ps(x0, 1, 0, 0, 1));
|
||||
x0 = _mm_div_ps(_mm_set1_ps(1.0f), x0);
|
||||
|
||||
_mm_store_ps(dest[0], _mm_mul_ps(v0, x0));
|
||||
_mm_store_ps(dest[1], _mm_mul_ps(v1, x0));
|
||||
_mm_store_ps(dest[2], _mm_mul_ps(v2, x0));
|
||||
_mm_store_ps(dest[3], _mm_mul_ps(v3, x0));
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif /* cglm_mat_sse_h */
|
||||
@@ -1,61 +0,0 @@
|
||||
/*
|
||||
* Copyright (c), Recep Aslantas.
|
||||
*
|
||||
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||
* Full license can be found in the LICENSE file
|
||||
*/
|
||||
|
||||
#ifndef cglm_mat3_sse_h
|
||||
#define cglm_mat3_sse_h
|
||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||
|
||||
#include "../../cglm-common.h"
|
||||
#include "cglm-intrin.h"
|
||||
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat3_mul_sse2(mat3 m1, mat3 m2, mat3 dest) {
|
||||
__m128 l0, l1, l2;
|
||||
__m128 r0, r1, r2;
|
||||
__m128 x0, x1, x2;
|
||||
|
||||
l0 = _mm_loadu_ps(m1[0]);
|
||||
l1 = _mm_loadu_ps(&m1[1][1]);
|
||||
l2 = _mm_set1_ps(m1[2][2]);
|
||||
|
||||
r0 = _mm_loadu_ps(m2[0]);
|
||||
r1 = _mm_loadu_ps(&m2[1][1]);
|
||||
r2 = _mm_set1_ps(m2[2][2]);
|
||||
|
||||
x1 = _mm_shuffle2_ps(l0, l1, 1, 0, 3, 3, 0, 3, 2, 0);
|
||||
x2 = _mm_shuffle2_ps(l1, l2, 0, 0, 3, 2, 0, 2, 1, 0);
|
||||
|
||||
x0 = _mm_add_ps(_mm_mul_ps(_mm_shuffle1_ps(l0, 0, 2, 1, 0),
|
||||
_mm_shuffle1_ps(r0, 3, 0, 0, 0)),
|
||||
_mm_mul_ps(x1,
|
||||
_mm_shuffle2_ps(r0, r1, 0, 0, 1, 1, 2, 0, 0, 0)));
|
||||
|
||||
x0 = _mm_add_ps(x0,
|
||||
_mm_mul_ps(x2,
|
||||
_mm_shuffle2_ps(r0, r1, 1, 1, 2, 2, 2, 0, 0, 0)));
|
||||
|
||||
_mm_storeu_ps(dest[0], x0);
|
||||
|
||||
x0 = _mm_add_ps(_mm_mul_ps(_mm_shuffle1_ps(l0, 1, 0, 2, 1),
|
||||
_mm_shuffle_ps(r0, r1, _MM_SHUFFLE(2, 2, 3, 3))),
|
||||
_mm_mul_ps(_mm_shuffle1_ps(x1, 1, 0, 2, 1),
|
||||
_mm_shuffle1_ps(r1, 3, 3, 0, 0)));
|
||||
|
||||
x0 = _mm_add_ps(x0,
|
||||
_mm_mul_ps(_mm_shuffle1_ps(x2, 1, 0, 2, 1),
|
||||
_mm_shuffle_ps(r1, r2, _MM_SHUFFLE(0, 0, 1, 1))));
|
||||
|
||||
_mm_storeu_ps(&dest[1][1], x0);
|
||||
|
||||
dest[2][2] = m1[0][2] * m2[2][0]
|
||||
+ m1[1][2] * m2[2][1]
|
||||
+ m1[2][2] * m2[2][2];
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif /* cglm_mat3_sse_h */
|
||||
@@ -1,67 +0,0 @@
|
||||
/*
|
||||
* Copyright (c), Recep Aslantas.
|
||||
*
|
||||
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||
* Full license can be found in the LICENSE file
|
||||
*/
|
||||
|
||||
#ifndef cglm_quat_simd_h
|
||||
#define cglm_quat_simd_h
|
||||
|
||||
#include "../../cglm-common.h"
|
||||
#include "cglm-intrin.h"
|
||||
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_quat_slerp_sse2(versor q,
|
||||
versor r,
|
||||
float t,
|
||||
versor dest) {
|
||||
/* https://en.wikipedia.org/wiki/Slerp */
|
||||
float cosTheta, sinTheta, angle, a, b, c;
|
||||
|
||||
__m128 xmm_q;
|
||||
|
||||
xmm_q = _mm_load_ps(q);
|
||||
|
||||
cosTheta = glm_vec4_dot(q, r);
|
||||
if (cosTheta < 0.0f) {
|
||||
_mm_store_ps(q,
|
||||
_mm_xor_ps(xmm_q,
|
||||
_mm_set1_ps(-0.f))) ;
|
||||
|
||||
cosTheta = -cosTheta;
|
||||
}
|
||||
|
||||
if (cosTheta >= 1.0f) {
|
||||
_mm_store_ps(dest, xmm_q);
|
||||
return;
|
||||
}
|
||||
|
||||
sinTheta = sqrtf(1.0f - cosTheta * cosTheta);
|
||||
|
||||
c = 1.0f - t;
|
||||
|
||||
/* LERP */
|
||||
if (sinTheta < 0.001f) {
|
||||
_mm_store_ps(dest, _mm_add_ps(_mm_mul_ps(_mm_set1_ps(c),
|
||||
xmm_q),
|
||||
_mm_mul_ps(_mm_set1_ps(t),
|
||||
_mm_load_ps(r))));
|
||||
return;
|
||||
}
|
||||
|
||||
/* SLERP */
|
||||
angle = acosf(cosTheta);
|
||||
a = sinf(c * angle);
|
||||
b = sinf(t * angle);
|
||||
|
||||
_mm_store_ps(dest,
|
||||
_mm_div_ps(_mm_add_ps(_mm_mul_ps(_mm_set1_ps(a),
|
||||
xmm_q),
|
||||
_mm_mul_ps(_mm_set1_ps(b),
|
||||
_mm_load_ps(r))),
|
||||
_mm_set1_ps(sinTheta)));
|
||||
}
|
||||
|
||||
#endif /* cglm_quat_simd_h */
|
||||
@@ -1,54 +0,0 @@
|
||||
/*
|
||||
* Copyright (c), Recep Aslantas.
|
||||
*
|
||||
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||
* Full license can be found in the LICENSE file
|
||||
*/
|
||||
|
||||
#ifndef cglmc_cam_h
|
||||
#define cglmc_cam_h
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "../cglm.h"
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_frustum(float left,
|
||||
float right,
|
||||
float bottom,
|
||||
float top,
|
||||
float nearVal,
|
||||
float farVal,
|
||||
mat4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ortho(float left,
|
||||
float right,
|
||||
float bottom,
|
||||
float top,
|
||||
float nearVal,
|
||||
float farVal,
|
||||
mat4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_perspective(float fovy,
|
||||
float aspect,
|
||||
float nearVal,
|
||||
float farVal,
|
||||
mat4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_lookat(vec3 eye,
|
||||
vec3 center,
|
||||
vec3 up,
|
||||
mat4 dest);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif /* cglmc_cam_h */
|
||||
@@ -1,64 +0,0 @@
|
||||
/*
|
||||
* Copyright (c), Recep Aslantas.
|
||||
*
|
||||
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||
* Full license can be found in the LICENSE file
|
||||
*/
|
||||
|
||||
#ifndef cglmc_quat_h
|
||||
#define cglmc_quat_h
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "../cglm.h"
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_quat_identity(versor q);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_quat(versor q,
|
||||
float angle,
|
||||
float x,
|
||||
float y,
|
||||
float z);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_quatv(versor q,
|
||||
float angle,
|
||||
vec3 v);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_quat_norm(versor q);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_quat_normalize(versor q);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_quat_dot(versor q, versor r);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_quat_mulv(versor q1, versor q2, versor dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_quat_mat4(versor q, mat4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_quat_slerp(versor q,
|
||||
versor r,
|
||||
float t,
|
||||
versor dest);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif /* cglmc_quat_h */
|
||||
@@ -1,135 +0,0 @@
|
||||
/*
|
||||
* Copyright (c), Recep Aslantas.
|
||||
*
|
||||
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||
* Full license can be found in the LICENSE file
|
||||
*/
|
||||
|
||||
#ifndef cglm_vec_h
|
||||
#define cglm_vec_h
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "../cglm.h"
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec_copy(vec3 a, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_copy3(vec4 a, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_copy(vec4 v, vec4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_vec_dot(vec3 a, vec3 b);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_vec4_dot(vec4 a, vec4 b);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec_cross(vec3 a, vec3 b, vec3 d);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_vec_norm(vec3 vec);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_vec4_norm(vec4 vec);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_vec_norm2(vec3 vec);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_vec4_norm2(vec4 vec);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec_normalize_to(vec3 vec, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_normalize_to(vec4 vec, vec4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec_normalize(vec3 v);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_normalize(vec4 v);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec_add(vec3 v1, vec3 v2, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_add(vec4 v1, vec4 v2, vec4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec_sub(vec3 v1, vec3 v2, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_sub(vec4 v1, vec4 v2, vec4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec_scale(vec3 v, float s, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec_flipsign(vec3 v);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_flipsign(vec4 v);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_scale(vec4 v, float s, vec4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_vec_angle(vec3 v1, vec3 v2)
|
||||
|
||||
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_INLINE
|
||||
void
|
||||
glmc_vec_center(vec3 v1, vec3 v2, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_vec_distance(vec3 v1, vec3 v2);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_vec4_distance(vec4 v1, vec4 v2);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif /* cglm_vec_h */
|
||||
@@ -1,94 +0,0 @@
|
||||
/*
|
||||
* Copyright (c), Recep Aslantas.
|
||||
*
|
||||
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||
* Full license can be found in the LICENSE file
|
||||
*/
|
||||
|
||||
#ifndef cglm_affine_mat_h
|
||||
#define cglm_affine_mat_h
|
||||
|
||||
#include "cglm-common.h"
|
||||
#include "cglm-mat.h"
|
||||
#include "cglm-mat3.h"
|
||||
#include "arch/simd/cglm-affine-mat-sse2.h"
|
||||
#include "arch/simd/cglm-affine-mat-avx.h"
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mul(mat4 m1, mat4 m2, mat4 dest) {
|
||||
#ifdef __AVX__
|
||||
glm_mul_avx(m1, m2, dest);
|
||||
#elif defined( __SSE__ ) || defined( __SSE2__ )
|
||||
glm_mul_sse2(m1, m2, dest);
|
||||
#else
|
||||
float a00, a01, a02, a03, b00, b01, b02,
|
||||
a10, a11, a12, a13, b10, b11, b12,
|
||||
a20, a21, a22, a23, b20, b21, b22,
|
||||
a30, a31, a32, a33, b30, b31, b32, b33;
|
||||
|
||||
a00 = m1[0][0], a01 = m1[0][1], a02 = m1[0][2], a03 = m1[0][3],
|
||||
a10 = m1[1][0], a11 = m1[1][1], a12 = m1[1][2], a13 = m1[1][3],
|
||||
a20 = m1[2][0], a21 = m1[2][1], a22 = m1[2][2], a23 = m1[2][3],
|
||||
a30 = m1[3][0], a31 = m1[3][1], a32 = m1[3][2], a33 = m1[3][3];
|
||||
|
||||
b00 = m2[0][0], b01 = m2[0][1], b02 = m2[0][2],
|
||||
b10 = m2[1][0], b11 = m2[1][1], b12 = m2[1][2],
|
||||
b20 = m2[2][0], b21 = m2[2][1], b22 = m2[2][2],
|
||||
b30 = m2[3][0], b31 = m2[3][1], b32 = m2[3][2], b33 = m2[3][3];
|
||||
|
||||
dest[0][0] = a00 * b00 + a10 * b01 + a20 * b02;
|
||||
dest[0][1] = a01 * b00 + a11 * b01 + a21 * b02;
|
||||
dest[0][2] = a02 * b00 + a12 * b01 + a22 * b02;
|
||||
dest[0][3] = a03 * b00 + a13 * b01 + a23 * b02;
|
||||
|
||||
dest[1][0] = a00 * b10 + a10 * b11 + a20 * b12;
|
||||
dest[1][1] = a01 * b10 + a11 * b11 + a21 * b12;
|
||||
dest[1][2] = a02 * b10 + a12 * b11 + a22 * b12;
|
||||
dest[1][3] = a03 * b10 + a13 * b11 + a23 * b12;
|
||||
|
||||
dest[2][0] = a00 * b20 + a10 * b21 + a20 * b22;
|
||||
dest[2][1] = a01 * b20 + a11 * b21 + a21 * b22;
|
||||
dest[2][2] = a02 * b20 + a12 * b21 + a22 * b22;
|
||||
dest[2][3] = a03 * b20 + a13 * b21 + a23 * b22;
|
||||
|
||||
dest[3][0] = a00 * b30 + a10 * b31 + a20 * b32 + a30 * b33;
|
||||
dest[3][1] = a01 * b30 + a11 * b31 + a21 * b32 + a31 * b33;
|
||||
dest[3][2] = a02 * b30 + a12 * b31 + a22 * b32 + a32 * b33;
|
||||
dest[3][3] = a03 * b30 + a13 * b31 + a23 * b32 + a33 * b33;
|
||||
#endif
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief inverse orthonormal rotation + translation matrix (ridig-body)
|
||||
*
|
||||
* @code
|
||||
* X = | R T | X' = | R' -R'T |
|
||||
* | 0 1 | | 0 1 |
|
||||
* @endcode
|
||||
*
|
||||
* @param[in,out] mat matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_inv_tr(mat4 mat) {
|
||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||
glm_inv_tr_sse2(mat);
|
||||
#else
|
||||
CGLM_ALIGN(16) mat3 r;
|
||||
CGLM_ALIGN(16) vec3 t;
|
||||
|
||||
/* rotate */
|
||||
glm_mat4_pick3t(mat, r);
|
||||
glm_mat4_ins3(r, mat);
|
||||
|
||||
/* translate */
|
||||
glm_mat3_mulv(r, mat[3], t);
|
||||
glm_vec_flipsign(t);
|
||||
glm_vec_copy(t, mat[3]);
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif /* cglm_affine_mat_h */
|
||||
@@ -1,380 +0,0 @@
|
||||
/*
|
||||
* Copyright (c), Recep Aslantas.
|
||||
*
|
||||
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||
* Full license can be found in the LICENSE file
|
||||
*/
|
||||
|
||||
#ifndef cglm_affine_h
|
||||
#define cglm_affine_h
|
||||
|
||||
#include "cglm-common.h"
|
||||
#include "cglm-vec.h"
|
||||
#include "cglm-affine-mat.h"
|
||||
#include "cglm-util.h"
|
||||
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_translate_to(mat4 m, vec3 v, mat4 dest) {
|
||||
mat4 t = GLM_MAT4_IDENTITY_INIT;
|
||||
|
||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||
_mm_store_ps(dest[3],
|
||||
_mm_add_ps(_mm_add_ps(_mm_mul_ps(_mm_load_ps(t[0]),
|
||||
_mm_set1_ps(v[0])),
|
||||
_mm_mul_ps(_mm_load_ps(t[1]),
|
||||
_mm_set1_ps(v[1]))),
|
||||
_mm_add_ps(_mm_mul_ps(_mm_load_ps(t[2]),
|
||||
_mm_set1_ps(v[2])),
|
||||
_mm_load_ps(t[3]))))
|
||||
;
|
||||
|
||||
_mm_store_ps(dest[0], _mm_load_ps(m[0]));
|
||||
_mm_store_ps(dest[1], _mm_load_ps(m[1]));
|
||||
_mm_store_ps(dest[2], _mm_load_ps(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
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_translate(mat4 m, vec3 v) {
|
||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||
_mm_store_ps(m[3],
|
||||
_mm_add_ps(_mm_add_ps(_mm_mul_ps(_mm_load_ps(m[0]),
|
||||
_mm_set1_ps(v[0])),
|
||||
_mm_mul_ps(_mm_load_ps(m[1]),
|
||||
_mm_set1_ps(v[1]))),
|
||||
_mm_add_ps(_mm_mul_ps(_mm_load_ps(m[2]),
|
||||
_mm_set1_ps(v[2])),
|
||||
_mm_load_ps(m[3]))))
|
||||
;
|
||||
#else
|
||||
vec4 v1, v2, v3;
|
||||
|
||||
glm_vec4_scale(m[0], v[0], v1);
|
||||
glm_vec4_scale(m[1], v[1], v2);
|
||||
glm_vec4_scale(m[2], v[2], v3);
|
||||
|
||||
glm_vec4_add(v1, m[3], m[3]);
|
||||
glm_vec4_add(v2, m[3], m[3]);
|
||||
glm_vec4_add(v3, m[3], m[3]);
|
||||
#endif
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_translate_x(mat4 m, float to) {
|
||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||
_mm_store_ps(m[3],
|
||||
_mm_add_ps(_mm_mul_ps(_mm_load_ps(m[0]),
|
||||
_mm_set1_ps(to)),
|
||||
_mm_load_ps(m[3])))
|
||||
;
|
||||
#else
|
||||
vec4 v1;
|
||||
glm_vec4_scale(m[0], to, v1);
|
||||
glm_vec4_add(v1, m[3], m[3]);
|
||||
#endif
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_translate_y(mat4 m, float to) {
|
||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||
_mm_store_ps(m[3],
|
||||
_mm_add_ps(_mm_mul_ps(_mm_load_ps(m[1]),
|
||||
_mm_set1_ps(to)),
|
||||
_mm_load_ps(m[3])))
|
||||
;
|
||||
#else
|
||||
vec4 v1;
|
||||
glm_vec4_scale(m[1], to, v1);
|
||||
glm_vec4_add(v1, m[3], m[3]);
|
||||
#endif
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_translate_z(mat4 m, float to) {
|
||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||
_mm_store_ps(m[3],
|
||||
_mm_add_ps(_mm_mul_ps(_mm_load_ps(m[2]),
|
||||
_mm_set1_ps(to)),
|
||||
_mm_load_ps(m[3])))
|
||||
;
|
||||
#else
|
||||
vec4 v1;
|
||||
glm_vec4_scale(m[2], to, v1);
|
||||
glm_vec4_add(v1, m[3], m[3]);
|
||||
#endif
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_translate_make(mat4 m, vec3 v) {
|
||||
mat4 t = GLM_MAT4_IDENTITY_INIT;
|
||||
glm_translate_to(t, v, m);
|
||||
}
|
||||
|
||||
/* scale */
|
||||
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_scale_to(mat4 m, vec3 v, mat4 dest) {
|
||||
glm_vec4_scale(m[0], v[0], dest[0]);
|
||||
glm_vec4_scale(m[1], v[1], dest[1]);
|
||||
glm_vec4_scale(m[2], v[2], dest[2]);
|
||||
|
||||
glm_vec4_copy(m[3], dest[3]);
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_scale_make(mat4 m, vec3 v) {
|
||||
mat4 t = GLM_MAT4_IDENTITY_INIT;
|
||||
glm_scale_to(t, v, m);
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_scale(mat4 m, vec3 v) {
|
||||
glm_scale_to(m, v, m);
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_scale1(mat4 m, float s) {
|
||||
vec3 v = { s, s, s };
|
||||
glm_scale_to(m, v, m);
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_rotate_x(mat4 m, float rad, mat4 dest) {
|
||||
float cosVal;
|
||||
float sinVal;
|
||||
mat4 t = GLM_MAT4_IDENTITY_INIT;
|
||||
|
||||
cosVal = cosf(rad);
|
||||
sinVal = sinf(rad);
|
||||
|
||||
t[1][1] = cosVal;
|
||||
t[1][2] = sinVal;
|
||||
t[2][1] = -sinVal;
|
||||
t[2][2] = cosVal;
|
||||
|
||||
glm_mat4_mul(m, t, dest);
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_rotate_y(mat4 m, float rad, mat4 dest) {
|
||||
float cosVal;
|
||||
float sinVal;
|
||||
mat4 t = GLM_MAT4_IDENTITY_INIT;
|
||||
|
||||
cosVal = cosf(rad);
|
||||
sinVal = sinf(rad);
|
||||
|
||||
t[0][0] = cosVal;
|
||||
t[0][2] = -sinVal;
|
||||
t[2][0] = sinVal;
|
||||
t[2][2] = cosVal;
|
||||
|
||||
glm_mat4_mul(m, t, dest);
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_rotate_z(mat4 m, float rad, mat4 dest) {
|
||||
float cosVal;
|
||||
float sinVal;
|
||||
mat4 t = GLM_MAT4_IDENTITY_INIT;
|
||||
|
||||
cosVal = cosf(rad);
|
||||
sinVal = sinf(rad);
|
||||
|
||||
t[0][0] = cosVal;
|
||||
t[0][1] = sinVal;
|
||||
t[1][0] = -sinVal;
|
||||
t[1][1] = cosVal;
|
||||
|
||||
glm_mat4_mul(m, t, dest);
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_rotate_ndc_make(mat4 m, float angle, vec3 axis_ndc) {
|
||||
/* https://www.opengl.org/sdk/docs/man2/xhtml/glRotate.xml */
|
||||
|
||||
vec3 v, vs;
|
||||
float c;
|
||||
|
||||
c = cosf(angle);
|
||||
|
||||
glm_vec_scale(axis_ndc, 1.0f - c, v);
|
||||
glm_vec_scale(axis_ndc, sinf(angle), vs);
|
||||
|
||||
glm_vec_scale(axis_ndc, v[0], m[0]);
|
||||
glm_vec_scale(axis_ndc, v[1], m[1]);
|
||||
glm_vec_scale(axis_ndc, v[2], m[2]);
|
||||
|
||||
m[0][0] += c;
|
||||
m[0][1] += vs[2];
|
||||
m[0][2] -= vs[1];
|
||||
|
||||
m[1][0] -= vs[2];
|
||||
m[1][1] += c;
|
||||
m[1][2] += vs[0];
|
||||
|
||||
m[2][0] += vs[1];
|
||||
m[2][1] -= vs[0];
|
||||
m[2][2] += c;
|
||||
|
||||
m[0][3] = m[1][3] = m[2][3] = m[3][0] = m[3][1] = m[3][2] = 0.0f;
|
||||
m[3][3] = 1.0f;
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_rotate_make(mat4 m, float angle, vec3 axis) {
|
||||
vec3 axis_ndc;
|
||||
|
||||
glm_vec_normalize_to(axis, axis_ndc);
|
||||
glm_rotate_ndc_make(m, angle, axis_ndc);
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_rotate_ndc(mat4 m, float angle, vec3 axis_ndc) {
|
||||
mat4 rot, tmp;
|
||||
|
||||
glm_rotate_ndc_make(rot, angle, axis_ndc);
|
||||
|
||||
glm_vec4_scale(m[0], rot[0][0], tmp[1]);
|
||||
glm_vec4_scale(m[1], rot[0][1], tmp[0]);
|
||||
glm_vec4_add(tmp[1], tmp[0], tmp[1]);
|
||||
glm_vec4_scale(m[2], rot[0][2], tmp[0]);
|
||||
glm_vec4_add(tmp[1], tmp[0], tmp[1]);
|
||||
|
||||
glm_vec4_scale(m[0], rot[1][0], tmp[2]);
|
||||
glm_vec4_scale(m[1], rot[1][1], tmp[0]);
|
||||
glm_vec4_add(tmp[2], tmp[0], tmp[2]);
|
||||
glm_vec4_scale(m[2], rot[1][2], tmp[0]);
|
||||
glm_vec4_add(tmp[2], tmp[0], tmp[2]);
|
||||
|
||||
glm_vec4_scale(m[0], rot[2][0], tmp[3]);
|
||||
glm_vec4_scale(m[1], rot[2][1], tmp[0]);
|
||||
glm_vec4_add(tmp[3], tmp[0], tmp[3]);
|
||||
glm_vec4_scale(m[2], rot[2][2], tmp[0]);
|
||||
glm_vec4_add(tmp[3], tmp[0], tmp[3]);
|
||||
|
||||
glm_vec4_copy(tmp[1], m[0]);
|
||||
glm_vec4_copy(tmp[2], m[1]);
|
||||
glm_vec4_copy(tmp[3], m[2]);
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_rotate(mat4 m, float angle, vec3 axis) {
|
||||
vec3 axis_ndc;
|
||||
|
||||
glm_vec_normalize_to(axis, axis_ndc);
|
||||
glm_rotate_ndc(m, angle, axis_ndc);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief decompose scale vector
|
||||
*
|
||||
* @param[in] m affine transform
|
||||
* @param[out] s scale vector (Sx, Sy, Sz)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_decompose_scalev(mat4 m, vec3 s) {
|
||||
s[0] = glm_vec_norm(m[0]);
|
||||
s[1] = glm_vec_norm(m[1]);
|
||||
s[2] = glm_vec_norm(m[2]);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief returns true if matrix is uniform scaled. This is helpful for
|
||||
* creating normal matrix.
|
||||
*
|
||||
* @param m[in] m
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
CGLM_INLINE
|
||||
bool
|
||||
glm_uniscaled(mat4 m) {
|
||||
vec3 s;
|
||||
glm_decompose_scalev(m, s);
|
||||
|
||||
return glm_vec_eq_all(s);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief decompose rotation matrix (mat4) and scale vector [Sx, Sy, Sz]
|
||||
*
|
||||
* @param[in] m affine transform
|
||||
* @param[out] r rotation matrix
|
||||
* @param[out] r scale matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_decompose_rs(mat4 m, mat4 r, vec3 s) {
|
||||
vec4 t = {0.0f, 0.0f, 0.0f, 1.0f};
|
||||
vec3 v;
|
||||
|
||||
glm_vec4_copy(m[0], r[0]);
|
||||
glm_vec4_copy(m[1], r[1]);
|
||||
glm_vec4_copy(m[2], r[2]);
|
||||
glm_vec4_copy(t, r[3]);
|
||||
|
||||
s[0] = glm_vec_norm(m[0]);
|
||||
s[1] = glm_vec_norm(m[1]);
|
||||
s[2] = glm_vec_norm(m[2]);
|
||||
|
||||
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[2], 1.0f/s[2], r[2]);
|
||||
|
||||
glm_vec_cross(m[0], m[1], v);
|
||||
if (glm_vec_dot(v, m[2]) < 0.0f) {
|
||||
glm_vec4_scale(r[0], -1.0f, r[0]);
|
||||
glm_vec4_scale(r[1], -1.0f, r[1]);
|
||||
glm_vec4_scale(r[2], -1.0f, r[2]);
|
||||
|
||||
glm_vec_scale(s, -1.0f, s);
|
||||
}
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief decompose affine transform
|
||||
*
|
||||
* @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
|
||||
glm_decompose(mat4 m, vec4 t, mat4 r, vec3 s) {
|
||||
glm_vec4_copy(m[3], t);
|
||||
glm_decompose_rs(m, r, s);
|
||||
}
|
||||
|
||||
#endif /* cglm_affine_h */
|
||||
@@ -1,27 +0,0 @@
|
||||
/*
|
||||
* Copyright (c), Recep Aslantas.
|
||||
*
|
||||
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||
* Full license can be found in the LICENSE file
|
||||
*/
|
||||
|
||||
#ifndef cglm_call_h
|
||||
#define cglm_call_h
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "cglm.h"
|
||||
#include "call/cglmc-vec.h"
|
||||
#include "call/cglmc-mat.h"
|
||||
#include "call/cglmc-mat3.h"
|
||||
#include "call/cglmc-affine.h"
|
||||
#include "call/cglmc-cam.h"
|
||||
#include "call/cglmc-quat.h"
|
||||
#include "call/cglmc-euler.h"
|
||||
#include "call/cglmc-io.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif /* cglm_call_h */
|
||||
@@ -1,255 +0,0 @@
|
||||
/*
|
||||
* Copyright (c), Recep Aslantas.
|
||||
*
|
||||
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||
* Full license can be found in the LICENSE file
|
||||
*/
|
||||
|
||||
#ifndef cglm_vcam_h
|
||||
#define cglm_vcam_h
|
||||
|
||||
#include "cglm-common.h"
|
||||
|
||||
/*!
|
||||
* @brief set up perspective peprojection matrix
|
||||
*
|
||||
* @param[in] left viewport.left
|
||||
* @param[in] right viewport.right
|
||||
* @param[in] bottom viewport.bottom
|
||||
* @param[in] top viewport.top
|
||||
* @param[in] nearVal near clipping plane
|
||||
* @param[in] farVal far clipping plane
|
||||
* @param[out] dest result matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_frustum(float left,
|
||||
float right,
|
||||
float bottom,
|
||||
float top,
|
||||
float nearVal,
|
||||
float farVal,
|
||||
mat4 dest) {
|
||||
float rl, tb, fn;
|
||||
|
||||
glm__memzero(float, dest, sizeof(mat4));
|
||||
|
||||
rl = 1.0f / (right - left);
|
||||
tb = 1.0f / (top - bottom);
|
||||
fn = 1.0f / (farVal - nearVal);
|
||||
|
||||
dest[0][0] = 2.0f * nearVal * rl;
|
||||
dest[1][1] = 2.0f * nearVal * tb;
|
||||
dest[2][0] = (right + left) * rl;
|
||||
dest[2][1] = (top + bottom) * tb;
|
||||
dest[2][2] = -(farVal + nearVal) * fn;
|
||||
dest[2][3] = -1.0f;
|
||||
dest[3][2] = -2.0f * farVal * nearVal * fn;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief set up orthographic projection matrix
|
||||
*
|
||||
* @param[in] left viewport.left
|
||||
* @param[in] right viewport.right
|
||||
* @param[in] bottom viewport.bottom
|
||||
* @param[in] top viewport.top
|
||||
* @param[in] nearVal near clipping plane
|
||||
* @param[in] farVal far clipping plane
|
||||
* @param[out] dest result matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_ortho(float left,
|
||||
float right,
|
||||
float bottom,
|
||||
float top,
|
||||
float nearVal,
|
||||
float farVal,
|
||||
mat4 dest) {
|
||||
float rl, tb, fn;
|
||||
|
||||
glm__memzero(float, dest, sizeof(mat4));
|
||||
|
||||
rl = 1.0f / (right - left);
|
||||
tb = 1.0f / (top - bottom);
|
||||
fn = 1.0f / (farVal - nearVal);
|
||||
|
||||
dest[0][0] = 2.0f * rl;
|
||||
dest[1][1] = 2.0f * tb;
|
||||
dest[2][2] =-2.0f * fn;
|
||||
dest[3][0] =-(right + left) * rl;
|
||||
dest[3][1] =-(top + bottom) * tb;
|
||||
dest[3][2] =-(farVal + nearVal) * fn;
|
||||
dest[3][3] = 1.0f;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief set up unit orthographic projection matrix
|
||||
*
|
||||
* @param[in] aspect aspect ration ( width / height )
|
||||
* @param[out] dest result matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_ortho_default(float aspect,
|
||||
mat4 dest) {
|
||||
if (aspect >= 1.0f) {
|
||||
glm_ortho(-1.0f * aspect,
|
||||
1.0f * aspect,
|
||||
-1.0f,
|
||||
1.0f,
|
||||
-100.0f,
|
||||
100.0f,
|
||||
dest);
|
||||
return;
|
||||
}
|
||||
|
||||
glm_ortho(-1.0f,
|
||||
1.0f,
|
||||
-1.0f / aspect,
|
||||
1.0f / aspect,
|
||||
-100.0f,
|
||||
100.0f,
|
||||
dest);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief set up orthographic projection matrix with given CUBE size
|
||||
*
|
||||
* @param[in] aspect aspect ratio ( width / height )
|
||||
* @param[in] size cube size
|
||||
* @param[out] dest result matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_ortho_default_s(float aspect,
|
||||
float size,
|
||||
mat4 dest) {
|
||||
if (aspect >= 1.0f) {
|
||||
glm_ortho(-size * aspect,
|
||||
size * aspect,
|
||||
-size,
|
||||
size,
|
||||
-size - 100.0f,
|
||||
size + 100.0f,
|
||||
dest);
|
||||
return;
|
||||
}
|
||||
|
||||
glm_ortho(-size,
|
||||
size,
|
||||
-size / aspect,
|
||||
size / aspect,
|
||||
-size - 100.0f,
|
||||
size + 100.0f,
|
||||
dest);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief set up perspective projection matrix
|
||||
*
|
||||
* @param[in] fovy field of view angle
|
||||
* @param[in] aspect aspect ratio ( width / height )
|
||||
* @param[in] nearVal near clipping plane
|
||||
* @param[in] farVal far clipping planes
|
||||
* @param[out] dest result matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_perspective(float fovy,
|
||||
float aspect,
|
||||
float nearVal,
|
||||
float farVal,
|
||||
mat4 dest) {
|
||||
float f, fn;
|
||||
|
||||
glm__memzero(float, dest, sizeof(mat4));
|
||||
|
||||
f = cosf(fovy * 0.5f) / sinf(fovy * 0.5f);
|
||||
fn = 1.0f / (nearVal - farVal);
|
||||
|
||||
dest[0][0] = f / aspect;
|
||||
dest[1][1] = f;
|
||||
dest[2][2] = (nearVal + farVal) * fn;
|
||||
dest[2][3] =-1.0f;
|
||||
dest[3][2] = 2 * nearVal * farVal * fn;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief set up perspective projection matrix with default near/far
|
||||
* and angle values
|
||||
*
|
||||
* @param[in] aspect aspect ratio ( width / height )
|
||||
* @param[out] dest result matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_perspective_default(float aspect,
|
||||
mat4 dest) {
|
||||
glm_perspective((float)CGLM_PI_4,
|
||||
aspect,
|
||||
0.01f,
|
||||
100.0f,
|
||||
dest);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief resize perspective matrix by aspect ratio ( width / height )
|
||||
* this very make easy to resize proj matrix when window, viewport
|
||||
* reized
|
||||
*
|
||||
* @param[in] aspect aspect ratio ( width / height )
|
||||
* @param[in, out] proj perspective projection matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_perspective_resize(float aspect,
|
||||
mat4 proj) {
|
||||
if (proj[0][0] == 0)
|
||||
return;
|
||||
|
||||
proj[0][0] = proj[1][1] / aspect;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief set up view matrix
|
||||
*
|
||||
* @param[in] eye eye vector
|
||||
* @param[in] center center vector
|
||||
* @param[in] up up vector
|
||||
* @param[out] dest result matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_lookat(vec3 eye,
|
||||
vec3 center,
|
||||
vec3 up,
|
||||
mat4 dest) {
|
||||
vec3 f, u, s;
|
||||
|
||||
glm_vec_sub(center, eye, f);
|
||||
glm_vec_normalize(f);
|
||||
|
||||
glm_vec_cross(f, up, s);
|
||||
glm_vec_normalize(s);
|
||||
|
||||
glm_vec_cross(s, f, u);
|
||||
|
||||
dest[0][0] = s[0];
|
||||
dest[0][1] = u[0];
|
||||
dest[0][2] =-f[0];
|
||||
dest[1][0] = s[1];
|
||||
dest[1][1] = u[1];
|
||||
dest[1][2] =-f[1];
|
||||
dest[2][0] = s[2];
|
||||
dest[2][1] = u[2];
|
||||
dest[2][2] =-f[2];
|
||||
dest[3][0] =-glm_vec_dot(s, eye);
|
||||
dest[3][1] =-glm_vec_dot(u, eye);
|
||||
dest[3][2] = glm_vec_dot(f, eye);
|
||||
dest[0][3] = dest[1][3] = dest[2][3] = 0.0f;
|
||||
dest[3][3] = 1.0f;
|
||||
}
|
||||
|
||||
#endif /* cglm_vcam_h */
|
||||
@@ -1,58 +0,0 @@
|
||||
/*
|
||||
* Copyright (c), Recep Aslantas.
|
||||
*
|
||||
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||
* Full license can be found in the LICENSE file
|
||||
*/
|
||||
|
||||
#ifndef cglm_common_h
|
||||
#define cglm_common_h
|
||||
|
||||
#define _USE_MATH_DEFINES /* for windows */
|
||||
|
||||
#include <stdint.h>
|
||||
#include <math.h>
|
||||
|
||||
#if defined(_WIN32)
|
||||
# ifdef CGLM_DLL
|
||||
# define CGLM_EXPORT __declspec(dllexport)
|
||||
# else
|
||||
# define CGLM_EXPORT __declspec(dllimport)
|
||||
# endif
|
||||
# define CGLM_INLINE __forceinline
|
||||
#else
|
||||
# define CGLM_EXPORT __attribute__((visibility("default")))
|
||||
# define CGLM_INLINE static inline __attribute((always_inline))
|
||||
#endif
|
||||
|
||||
#define glm__memcpy(type, dest, src, size) \
|
||||
do { \
|
||||
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 "cglm-types.h"
|
||||
|
||||
#endif /* cglm_common_h */
|
||||
@@ -1,360 +0,0 @@
|
||||
/*
|
||||
* Copyright (c), Recep Aslantas.
|
||||
*
|
||||
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||
* Full license can be found in the LICENSE file
|
||||
*/
|
||||
|
||||
#ifndef cglm_euler_h
|
||||
#define cglm_euler_h
|
||||
|
||||
#include "cglm-common.h"
|
||||
|
||||
/*!
|
||||
* 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:
|
||||
* @code
|
||||
* glm_euler_sq order;
|
||||
* order = orderVec[0] | orderVec[1] << 2 | orderVec[2] << 4;
|
||||
* @endcode
|
||||
* you may need to explicit cast if required
|
||||
*/
|
||||
typedef enum glm_euler_sq {
|
||||
GLM_EULER_XYZ = 0 << 0 | 1 << 2 | 2 << 4,
|
||||
GLM_EULER_XZY = 0 << 0 | 2 << 2 | 1 << 4,
|
||||
GLM_EULER_YZX = 1 << 0 | 2 << 2 | 0 << 4,
|
||||
GLM_EULER_YXZ = 1 << 0 | 0 << 2 | 2 << 4,
|
||||
GLM_EULER_ZXY = 2 << 0 | 0 << 2 | 1 << 4,
|
||||
GLM_EULER_ZYX = 2 << 0 | 1 << 2 | 0 << 4
|
||||
} glm_euler_sq;
|
||||
|
||||
CGLM_INLINE
|
||||
glm_euler_sq
|
||||
glm_euler_order(int newOrder[3]) {
|
||||
return (glm_euler_sq)(newOrder[0] | newOrder[1] << 2 | newOrder[2] << 4);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief euler angles (in radian) using xyz sequence
|
||||
*
|
||||
* @param[in] m affine transform
|
||||
* @param[out] v angles vector [x, y, z]
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_euler_angles(mat4 m, vec3 dest) {
|
||||
if (m[0][2] < 1.0f) {
|
||||
if (m[0][2] > -1.0f) {
|
||||
vec3 a[2];
|
||||
float cy1, cy2;
|
||||
int path;
|
||||
|
||||
a[0][1] = asinf(-m[0][2]);
|
||||
a[1][1] = CGLM_PI - a[0][1];
|
||||
|
||||
cy1 = cosf(a[0][1]);
|
||||
cy2 = cosf(a[1][1]);
|
||||
|
||||
a[0][0] = atan2f(m[1][2] / cy1, m[2][2] / cy1);
|
||||
a[1][0] = atan2f(m[1][2] / cy2, m[2][2] / cy2);
|
||||
|
||||
a[0][2] = atan2f(m[0][1] / cy1, m[0][0] / cy1);
|
||||
a[1][2] = atan2f(m[0][1] / cy2, m[0][0] / cy2);
|
||||
|
||||
path = (fabsf(a[0][0]) + fabsf(a[0][1]) + fabsf(a[0][2])) >=
|
||||
(fabsf(a[1][0]) + fabsf(a[1][1]) + fabsf(a[1][2]));
|
||||
|
||||
glm_vec_copy(a[path], dest);
|
||||
} else {
|
||||
dest[0] = atan2f(m[1][0], m[2][0]);
|
||||
dest[1] = CGLM_PI_2;
|
||||
dest[2] = 0.0f;
|
||||
}
|
||||
} else {
|
||||
dest[0] = atan2f(-m[1][0], -m[2][0]);
|
||||
dest[1] =-CGLM_PI_2;
|
||||
dest[2] = 0.0f;
|
||||
}
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief build rotation matrix from euler angles(ExEyEz/RzRyRx)
|
||||
*
|
||||
* @param[in] angles angles as vector [Ex, Ey, Ez]
|
||||
* @param[out] dest rotation matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_euler(vec3 angles, mat4 dest) {
|
||||
float cx, cy, cz,
|
||||
sx, sy, sz;
|
||||
|
||||
sx = sinf(angles[0]); cx = cosf(angles[0]);
|
||||
sy = sinf(angles[1]); cy = cosf(angles[1]);
|
||||
sz = sinf(angles[2]); cz = cosf(angles[2]);
|
||||
|
||||
dest[0][0] = cy * cz;
|
||||
dest[0][1] = cy * sz;
|
||||
dest[0][2] =-sy;
|
||||
dest[1][0] = cz * sx * sy - cx * sz;
|
||||
dest[1][1] = cx * cz + sx * sy * sz;
|
||||
dest[1][2] = cy * sx;
|
||||
dest[2][0] = cx * cz * sy + sx * sz;
|
||||
dest[2][1] =-cz * sx + cx * sy * sz;
|
||||
dest[2][2] = cx * cy;
|
||||
dest[0][3] = 0.0f;
|
||||
dest[1][3] = 0.0f;
|
||||
dest[2][3] = 0.0f;
|
||||
dest[3][0] = 0.0f;
|
||||
dest[3][1] = 0.0f;
|
||||
dest[3][2] = 0.0f;
|
||||
dest[3][3] = 1.0f;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief build rotation matrix from euler angles (EzEyEx/RxRyRz)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_euler_zyx(vec3 angles,
|
||||
mat4 dest) {
|
||||
float cx, cy, cz,
|
||||
sx, sy, sz;
|
||||
|
||||
sx = sinf(angles[0]); cx = cosf(angles[0]);
|
||||
sy = sinf(angles[1]); cy = cosf(angles[1]);
|
||||
sz = sinf(angles[2]); cz = cosf(angles[2]);
|
||||
|
||||
dest[0][0] = cy * cz;
|
||||
dest[0][1] = cz * sx * sy + cx * sz;
|
||||
dest[0][2] =-cx * cz * sy + sx * sz;
|
||||
dest[1][0] =-cy * sz;
|
||||
dest[1][1] = cx * cz - sx * sy * sz;
|
||||
dest[1][2] = cz * sx + cx * sy * sz;
|
||||
dest[2][0] = sy;
|
||||
dest[2][1] =-cy * sx;
|
||||
dest[2][2] = cx * cy;
|
||||
dest[0][3] = 0.0f;
|
||||
dest[1][3] = 0.0f;
|
||||
dest[2][3] = 0.0f;
|
||||
dest[3][0] = 0.0f;
|
||||
dest[3][1] = 0.0f;
|
||||
dest[3][2] = 0.0f;
|
||||
dest[3][3] = 1.0f;
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_euler_zxy(vec3 angles,
|
||||
mat4 dest) {
|
||||
float cx, cy, cz,
|
||||
sx, sy, sz;
|
||||
|
||||
sx = sinf(angles[0]); cx = cosf(angles[0]);
|
||||
sy = sinf(angles[1]); cy = cosf(angles[1]);
|
||||
sz = sinf(angles[2]); cz = cosf(angles[2]);
|
||||
|
||||
dest[0][0] = cy * cz + sx * sy * sz;
|
||||
dest[0][1] = cx * sz;
|
||||
dest[0][2] =-cz * sy + cy * sx * sz;
|
||||
dest[1][0] = cz * sx * sy - cy * sz;
|
||||
dest[1][1] = cx * cz;
|
||||
dest[1][2] = cy * cz * sx + sy * sz;
|
||||
dest[2][0] = cx * sy;
|
||||
dest[2][1] =-sx;
|
||||
dest[2][2] = cx * cy;
|
||||
dest[0][3] = 0.0f;
|
||||
dest[1][3] = 0.0f;
|
||||
dest[2][3] = 0.0f;
|
||||
dest[3][0] = 0.0f;
|
||||
dest[3][1] = 0.0f;
|
||||
dest[3][2] = 0.0f;
|
||||
dest[3][3] = 1.0f;
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_euler_xzy(vec3 angles,
|
||||
mat4 dest) {
|
||||
float cx, cy, cz,
|
||||
sx, sy, sz;
|
||||
|
||||
sx = sinf(angles[0]); cx = cosf(angles[0]);
|
||||
sy = sinf(angles[1]); cy = cosf(angles[1]);
|
||||
sz = sinf(angles[2]); cz = cosf(angles[2]);
|
||||
|
||||
dest[0][0] = cy * cz;
|
||||
dest[0][1] = sz;
|
||||
dest[0][2] =-cz * sy;
|
||||
dest[1][0] = sx * sy - cx * cy * sz;
|
||||
dest[1][1] = cx * cz;
|
||||
dest[1][2] = cy * sx + cx * sy * sz;
|
||||
dest[2][0] = cx * sy + cy * sx * sz;
|
||||
dest[2][1] =-cz * sx;
|
||||
dest[2][2] = cx * cy - sx * sy * sz;
|
||||
dest[0][3] = 0.0f;
|
||||
dest[1][3] = 0.0f;
|
||||
dest[2][3] = 0.0f;
|
||||
dest[3][0] = 0.0f;
|
||||
dest[3][1] = 0.0f;
|
||||
dest[3][2] = 0.0f;
|
||||
dest[3][3] = 1.0f;
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_euler_yzx(vec3 angles,
|
||||
mat4 dest) {
|
||||
float cx, cy, cz,
|
||||
sx, sy, sz;
|
||||
|
||||
sx = sinf(angles[0]); cx = cosf(angles[0]);
|
||||
sy = sinf(angles[1]); cy = cosf(angles[1]);
|
||||
sz = sinf(angles[2]); cz = cosf(angles[2]);
|
||||
|
||||
dest[0][0] = cy * cz;
|
||||
dest[0][1] = sx * sy + cx * cy * sz;
|
||||
dest[0][2] =-cx * sy + cy * sx * sz;
|
||||
dest[1][0] =-sz;
|
||||
dest[1][1] = cx * cz;
|
||||
dest[1][2] = cz * sx;
|
||||
dest[2][0] = cz * sy;
|
||||
dest[2][1] =-cy * sx + cx * sy * sz;
|
||||
dest[2][2] = cx * cy + sx * sy * sz;
|
||||
dest[0][3] = 0.0f;
|
||||
dest[1][3] = 0.0f;
|
||||
dest[2][3] = 0.0f;
|
||||
dest[3][0] = 0.0f;
|
||||
dest[3][1] = 0.0f;
|
||||
dest[3][2] = 0.0f;
|
||||
dest[3][3] = 1.0f;
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_euler_yxz(vec3 angles,
|
||||
mat4 dest) {
|
||||
float cx, cy, cz,
|
||||
sx, sy, sz;
|
||||
|
||||
sx = sinf(angles[0]); cx = cosf(angles[0]);
|
||||
sy = sinf(angles[1]); cy = cosf(angles[1]);
|
||||
sz = sinf(angles[2]); cz = cosf(angles[2]);
|
||||
|
||||
dest[0][0] = cy * cz - sx * sy * sz;
|
||||
dest[0][1] = cz * sx * sy + cy * sz;
|
||||
dest[0][2] =-cx * sy;
|
||||
dest[1][0] =-cx * sz;
|
||||
dest[1][1] = cx * cz;
|
||||
dest[1][2] = sx;
|
||||
dest[2][0] = cz * sy + cy * sx * sz;
|
||||
dest[2][1] =-cy * cz * sx + sy * sz;
|
||||
dest[2][2] = cx * cy;
|
||||
dest[0][3] = 0.0f;
|
||||
dest[1][3] = 0.0f;
|
||||
dest[2][3] = 0.0f;
|
||||
dest[3][0] = 0.0f;
|
||||
dest[3][1] = 0.0f;
|
||||
dest[3][2] = 0.0f;
|
||||
dest[3][3] = 1.0f;
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_euler_by_order(vec3 angles, glm_euler_sq axis, mat4 dest) {
|
||||
float cx, cy, cz,
|
||||
sx, sy, sz;
|
||||
|
||||
float cycz, cysz, cysx, cxcy,
|
||||
czsy, cxcz, czsx, cxsz,
|
||||
sysz;
|
||||
|
||||
sx = sinf(angles[0]); cx = cosf(angles[0]);
|
||||
sy = sinf(angles[1]); cy = cosf(angles[1]);
|
||||
sz = sinf(angles[2]); cz = cosf(angles[2]);
|
||||
|
||||
cycz = cy * cz; cysz = cy * sz;
|
||||
cysx = cy * sx; cxcy = cx * cy;
|
||||
czsy = cz * sy; cxcz = cx * cz;
|
||||
czsx = cz * sx; cxsz = cx * sz;
|
||||
sysz = sy * sz;
|
||||
|
||||
switch (axis) {
|
||||
case GLM_EULER_XYZ:
|
||||
dest[0][0] = cycz;
|
||||
dest[0][1] = cysz;
|
||||
dest[0][2] =-sy;
|
||||
dest[1][0] = czsx * sy - cxsz;
|
||||
dest[1][1] = cxcz + sx * sysz;
|
||||
dest[1][2] = cysx;
|
||||
dest[2][0] = cx * czsy + sx * sz;
|
||||
dest[2][1] =-czsx + cx * sysz;
|
||||
dest[2][2] = cxcy;
|
||||
break;
|
||||
case GLM_EULER_XZY:
|
||||
dest[0][0] = cycz;
|
||||
dest[0][1] = sz;
|
||||
dest[0][2] =-czsy;
|
||||
dest[1][0] = sx * sy - cx * cysz;
|
||||
dest[1][1] = cxcz;
|
||||
dest[1][2] = cysx + cx * sysz;
|
||||
dest[2][0] = cx * sy + cysx * sz;
|
||||
dest[2][1] =-czsx;
|
||||
dest[2][2] = cxcy - sx * sysz;
|
||||
break;
|
||||
case GLM_EULER_ZXY:
|
||||
dest[0][0] = cycz + sx * sysz;
|
||||
dest[0][1] = cxsz;
|
||||
dest[0][2] =-czsy + cysx * sz;
|
||||
dest[1][0] = czsx * sy - cysz;
|
||||
dest[1][1] = cxcz;
|
||||
dest[1][2] = cycz * sx + sysz;
|
||||
dest[2][0] = cx * sy;
|
||||
dest[2][1] =-sx;
|
||||
dest[2][2] = cxcy;
|
||||
break;
|
||||
case GLM_EULER_ZYX:
|
||||
dest[0][0] = cycz;
|
||||
dest[0][1] = czsx * sy + cxsz;
|
||||
dest[0][2] =-cx * czsy + sx * sz;
|
||||
dest[1][0] =-cysz;
|
||||
dest[1][1] = cxcz - sx * sysz;
|
||||
dest[1][2] = czsx + cx * sysz;
|
||||
dest[2][0] = sy;
|
||||
dest[2][1] =-cysx;
|
||||
dest[2][2] = cxcy;
|
||||
break;
|
||||
case GLM_EULER_YXZ:
|
||||
dest[0][0] = cycz - sx * sysz;
|
||||
dest[0][1] = czsx * sy + cysz;
|
||||
dest[0][2] =-cx * sy;
|
||||
dest[1][0] =-cxsz;
|
||||
dest[1][1] = cxcz;
|
||||
dest[1][2] = sx;
|
||||
dest[2][0] = czsy + cysx * sz;
|
||||
dest[2][1] =-cycz * sx + sysz;
|
||||
dest[2][2] = cxcy;
|
||||
break;
|
||||
case GLM_EULER_YZX:
|
||||
dest[0][0] = cycz;
|
||||
dest[0][1] = sx * sy + cx * cysz;
|
||||
dest[0][2] =-cx * sy + cysx * sz;
|
||||
dest[1][0] =-sz;
|
||||
dest[1][1] = cxcz;
|
||||
dest[1][2] = czsx;
|
||||
dest[2][0] = czsy;
|
||||
dest[2][1] =-cysx + cx * sysz;
|
||||
dest[2][2] = cxcy + sx * sysz;
|
||||
break;
|
||||
}
|
||||
|
||||
dest[0][3] = 0.0f;
|
||||
dest[1][3] = 0.0f;
|
||||
dest[2][3] = 0.0f;
|
||||
dest[3][0] = 0.0f;
|
||||
dest[3][1] = 0.0f;
|
||||
dest[3][2] = 0.0f;
|
||||
dest[3][3] = 1.0f;
|
||||
}
|
||||
|
||||
#endif /* cglm_euler_h */
|
||||
@@ -1,164 +0,0 @@
|
||||
/*
|
||||
* Copyright (c), Recep Aslantas.
|
||||
*
|
||||
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||
* Full license can be found in the LICENSE file
|
||||
*/
|
||||
|
||||
#ifndef cglm_io_h
|
||||
#define cglm_io_h
|
||||
|
||||
#include "cglm-common.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat4_print(mat4 matrix,
|
||||
FILE * __restrict ostream) {
|
||||
int i;
|
||||
int j;
|
||||
|
||||
#define m 4
|
||||
#define n 4
|
||||
|
||||
fprintf(ostream, "Matrix (float%dx%d):\n", m, n);
|
||||
|
||||
for (i = 0; i < m; i++) {
|
||||
fprintf(ostream, "\t|");
|
||||
for (j = 0; j < n; j++) {
|
||||
fprintf(ostream, "%0.4f", matrix[j][i]);;
|
||||
|
||||
if (j != n - 1)
|
||||
fprintf(ostream, "\t");
|
||||
}
|
||||
|
||||
fprintf(ostream, "|\n");
|
||||
}
|
||||
|
||||
fprintf(ostream, "\n");
|
||||
|
||||
#undef m
|
||||
#undef n
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat3_print(mat3 matrix,
|
||||
FILE * __restrict ostream) {
|
||||
int i;
|
||||
int j;
|
||||
|
||||
#define m 3
|
||||
#define n 3
|
||||
|
||||
fprintf(ostream, "Matrix (float%dx%d):\n", m, n);
|
||||
|
||||
for (i = 0; i < m; i++) {
|
||||
fprintf(ostream, "\t|");
|
||||
for (j = 0; j < n; j++) {
|
||||
fprintf(ostream, "%0.4f", matrix[j][i]);;
|
||||
|
||||
if (j != n - 1)
|
||||
fprintf(ostream, "\t");
|
||||
}
|
||||
|
||||
fprintf(ostream, "|\n");
|
||||
}
|
||||
|
||||
fprintf(ostream, "\n");
|
||||
|
||||
#undef m
|
||||
#undef n
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_vec4_print(vec4 vec,
|
||||
FILE * __restrict ostream) {
|
||||
int i;
|
||||
|
||||
#define m 4
|
||||
|
||||
fprintf(ostream, "Vector (float%d):\n\t|", m);
|
||||
|
||||
for (i = 0; i < m; i++) {
|
||||
fprintf(ostream, "%0.4f", vec[i]);
|
||||
|
||||
if (i != m - 1)
|
||||
fprintf(ostream, "\t");
|
||||
}
|
||||
|
||||
fprintf(ostream, "|\n\n");
|
||||
|
||||
#undef m
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_vec3_print(vec3 vec,
|
||||
FILE * __restrict ostream) {
|
||||
int i;
|
||||
|
||||
#define m 3
|
||||
|
||||
fprintf(ostream, "Vector (float%d):\n\t|", m);
|
||||
|
||||
for (i = 0; i < m; i++) {
|
||||
fprintf(ostream, "%0.4f", vec[i]);
|
||||
|
||||
if (i != m - 1)
|
||||
fprintf(ostream, "\t");
|
||||
}
|
||||
|
||||
fprintf(ostream, "|\n\n");
|
||||
|
||||
#undef m
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_ivec3_print(ivec3 vec,
|
||||
FILE * __restrict ostream) {
|
||||
int i;
|
||||
|
||||
#define m 3
|
||||
|
||||
fprintf(ostream, "Vector (int%d):\n\t|", m);
|
||||
|
||||
for (i = 0; i < m; i++) {
|
||||
fprintf(ostream, "%d", vec[i]);
|
||||
|
||||
if (i != m - 1)
|
||||
fprintf(ostream, "\t");
|
||||
}
|
||||
|
||||
fprintf(ostream, "|\n\n");
|
||||
|
||||
#undef m
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_versor_print(versor vec,
|
||||
FILE * __restrict ostream) {
|
||||
int i;
|
||||
|
||||
#define m 4
|
||||
|
||||
fprintf(ostream, "Versor (float%d):\n\t|", m);
|
||||
|
||||
for (i = 0; i < m; i++) {
|
||||
fprintf(ostream, "%0.4f", vec[i]);
|
||||
|
||||
if (i != m - 1)
|
||||
fprintf(ostream, "\t");
|
||||
}
|
||||
|
||||
fprintf(ostream, "|\n\n");
|
||||
|
||||
#undef m
|
||||
}
|
||||
|
||||
#endif /* cglm_io_h */
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user