mirror of
https://github.com/recp/cglm.git
synced 2026-02-17 03:39:05 +00:00
Compare commits
445 Commits
non-square
...
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 |
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
|
||||
16
.github/workflows/cmake-wasm.yml
vendored
16
.github/workflows/cmake-wasm.yml
vendored
@@ -23,7 +23,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Downloading wasi-sdk
|
||||
run: |
|
||||
@@ -31,10 +31,20 @@ jobs:
|
||||
wget --no-verbose https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-${{matrix.wasi_sdk_version}}/wasi-sdk-${{matrix.wasi_sdk_version}}.0-linux.tar.gz
|
||||
tar xf wasi-sdk-${{matrix.wasi_sdk_version}}.0-linux.tar.gz
|
||||
|
||||
# Building a wasm library without needing to define a main():
|
||||
# https://github.com/WebAssembly/wasi-sdk/issues/332
|
||||
- name: Modify CMakeLists.txt for WASI
|
||||
run: |
|
||||
echo 'if (CMAKE_SYSTEM_NAME STREQUAL "WASI")' >> CMakeLists.txt
|
||||
echo ' target_link_options(${PROJECT_NAME} PRIVATE -mexec-model=reactor)' >> CMakeLists.txt
|
||||
echo 'endif()' >> CMakeLists.txt
|
||||
|
||||
- name: Configure CMake
|
||||
# Configure CMake in a 'build' subdirectory. `CMAKE_BUILD_TYPE` is only required if you are using a single-configuration generator such as make.
|
||||
# See https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html?highlight=cmake_build_type
|
||||
run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{matrix.BUILD_TYPE}} -DCMAKE_C_FLAGS="${{matrix.C_FLAGS}}" -DCMAKE_TOOLCHAIN_FILE=${{github.workspace}}/wasi-sdk-${{matrix.wasi_sdk_version}}.0/share/cmake/wasi-sdk.cmake -DWASI_SDK_PREFIX=${{github.workspace}}/wasi-sdk-${{matrix.wasi_sdk_version}}.0 -DCGLM_USE_TEST=ON
|
||||
# Below suppress <<'clock' is deprecated: WASI lacks process-associated clocks; ...>> warns:
|
||||
# -D_WASI_EMULATED_PROCESS_CLOCKS" -DCMAKE_EXE_LINKER_FLAGS="-lwasi-emulated-process-clocks
|
||||
run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{matrix.BUILD_TYPE}} -DCMAKE_C_FLAGS="${{matrix.C_FLAGS}} -D_WASI_EMULATED_PROCESS_CLOCKS" -DCMAKE_EXE_LINKER_FLAGS="-lwasi-emulated-process-clocks" -DCMAKE_TOOLCHAIN_FILE=${{github.workspace}}/wasi-sdk-${{matrix.wasi_sdk_version}}.0/share/cmake/wasi-sdk.cmake -DWASI_SDK_PREFIX=${{github.workspace}}/wasi-sdk-${{matrix.wasi_sdk_version}}.0 -DCGLM_STATIC=ON -DCGLM_SHARED=OFF -DCGLM_USE_TEST=ON
|
||||
|
||||
- name: Build
|
||||
# Build your program with the given configuration
|
||||
@@ -64,7 +74,7 @@ jobs:
|
||||
C_FLAGS: ['', '-msimd128', '-msse -msse2 -msimd128', '-msse -msse2 -msse3 -msse4 -msimd128']
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
- name: Setup emsdk
|
||||
uses: mymindstorm/setup-emsdk@v12
|
||||
|
||||
|
||||
79
.github/workflows/meson-wasm.yml
vendored
Normal file
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
|
||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -80,3 +80,6 @@ confdefs.h
|
||||
cmake-build-debug
|
||||
*.o.tmp
|
||||
xcode/*
|
||||
.vscode
|
||||
.build
|
||||
*.swp
|
||||
|
||||
0
.gitmodules
vendored
0
.gitmodules
vendored
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
|
||||
20
.vscode/c_cpp_properties.json
vendored
20
.vscode/c_cpp_properties.json
vendored
@@ -1,20 +0,0 @@
|
||||
{
|
||||
"configurations": [
|
||||
{
|
||||
"name": "Mac",
|
||||
"includePath": [
|
||||
"${workspaceFolder}/**"
|
||||
],
|
||||
"defines": [],
|
||||
"macFrameworkPath": [
|
||||
"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks"
|
||||
],
|
||||
"compilerPath": "/usr/bin/clang",
|
||||
"cStandard": "c23",
|
||||
"cppStandard": "c++23",
|
||||
"intelliSenseMode": "macos-clang-arm64",
|
||||
"configurationProvider": "vector-of-bool.cmake-tools"
|
||||
}
|
||||
],
|
||||
"version": 4
|
||||
}
|
||||
31
.vscode/settings.json
vendored
31
.vscode/settings.json
vendored
@@ -1,31 +0,0 @@
|
||||
{
|
||||
"C_Cpp.default.configurationProvider": "vector-of-bool.cmake-tools",
|
||||
"restructuredtext.confPath": "${workspaceFolder}/docs/source",
|
||||
"workbench.colorTheme": "Default Light+ Experimental",
|
||||
"editor.fontSize": 14,
|
||||
"workbench.colorCustomizations": {
|
||||
"[Default Light*]": {
|
||||
"editor.background": "#fefefe",
|
||||
"sideBar.background": "#fefefe",
|
||||
"sideBar.foreground": "#343436",
|
||||
"sideBarTitle.foreground": "#343436",
|
||||
"sideBar.border": "#e2e2e4",
|
||||
"statusBar.background": "#fefefe",
|
||||
"titleBar.activeBackground": "#fefefe",
|
||||
"tab.activeBackground": "#f4fff4aa",
|
||||
"tab.inactiveBackground": "#fefefe",
|
||||
"activityBar.background": "#fefefe",
|
||||
"editorGroupHeader.tabsBackground": "#fefefe"
|
||||
},
|
||||
"[Default Dark*]": {
|
||||
"editor.background": "#1D1D25",
|
||||
"sideBar.background": "#1D1D25",
|
||||
"statusBar.background": "#1D1D25",
|
||||
"titleBar.activeBackground": "#1D1D25",
|
||||
"tab.activeBackground": "#2C2C3A",
|
||||
"tab.inactiveBackground": "#1D1D25",
|
||||
"activityBar.background": "#1D1D25",
|
||||
"editorGroupHeader.tabsBackground": "#1D1D25"
|
||||
}
|
||||
},
|
||||
}
|
||||
199
BUILDING.md
Normal file
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.
|
||||
@@ -1,6 +1,6 @@
|
||||
cmake_minimum_required(VERSION 3.8.2)
|
||||
cmake_minimum_required(VERSION 3.13)
|
||||
project(cglm
|
||||
VERSION 0.9.1
|
||||
VERSION 0.9.6
|
||||
HOMEPAGE_URL https://github.com/recp/cglm
|
||||
DESCRIPTION "OpenGL Mathematics (glm) for C"
|
||||
LANGUAGES C
|
||||
@@ -32,18 +32,23 @@ if(CGLM_USE_C99)
|
||||
endif()
|
||||
|
||||
if(MSVC)
|
||||
add_definitions(-DNDEBUG -D_WINDOWS -D_USRDLL)
|
||||
add_compile_options(/W3 /Ox /Gy /Oi /TC)
|
||||
|
||||
# Ref: https://skia.googlesource.com/third_party/sdl/+/refs/heads/master/CMakeLists.txt#225
|
||||
# Make sure /RTC1 is disabled, otherwise it will use functions from the CRT
|
||||
foreach(flag_var
|
||||
CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
|
||||
CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO)
|
||||
string(REGEX REPLACE "/RTC(su|[1su])" "" ${flag_var} "${${flag_var}}")
|
||||
endforeach(flag_var)
|
||||
add_definitions(-D_WINDOWS -D_USRDLL)
|
||||
|
||||
if(NOT CMAKE_BUILD_TYPE MATCHES Debug)
|
||||
add_definitions(-DNDEBUG)
|
||||
add_compile_options(/W3 /Ox /Gy /Oi /TC)
|
||||
foreach(flag_var
|
||||
CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
|
||||
CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO)
|
||||
string(REGEX REPLACE "/RTC(su|[1su])" "" ${flag_var} "${${flag_var}}")
|
||||
endforeach(flag_var)
|
||||
endif()
|
||||
else()
|
||||
add_compile_options(-Wall -O3)
|
||||
add_compile_options(-Wall -Wextra -Wpedantic -Wconversion)
|
||||
|
||||
if(NOT CMAKE_BUILD_TYPE MATCHES Debug)
|
||||
add_compile_options(-O3)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
get_directory_property(hasParent PARENT_DIRECTORY)
|
||||
@@ -88,8 +93,10 @@ add_library(${PROJECT_NAME}
|
||||
src/mat4x2.c
|
||||
src/mat4x3.c
|
||||
src/plane.c
|
||||
src/noise.c
|
||||
src/frustum.c
|
||||
src/box.c
|
||||
src/aabb2d.c
|
||||
src/project.c
|
||||
src/sphere.c
|
||||
src/ease.c
|
||||
|
||||
14
CREDITS
14
CREDITS
@@ -82,3 +82,17 @@ http://github.com/microsoft/DirectXMath
|
||||
17. Pick Matrix
|
||||
|
||||
glu project -> project.c
|
||||
|
||||
18. Ray sphere intersection
|
||||
|
||||
RAY TRACING GEMS
|
||||
HIGH-QUALITY AND REAL-TIME RENDERING WITH DXR AND OTHER APIS
|
||||
|
||||
CHAPTER 7
|
||||
Precision Improvements for Ray/Sphere Intersection
|
||||
Eric Haines (1), Johannes Günther (2), and Tomas Akenine-Möller (1)
|
||||
(1) NVIDIA
|
||||
(2) Intel
|
||||
|
||||
Wyman, C., and Haines, E. Getting Started with RTX Ray Tracing.
|
||||
https://github.com/NVIDIAGameWorks/GettingStartedWithRTXRayTracing
|
||||
|
||||
36
Makefile.am
36
Makefile.am
@@ -23,7 +23,7 @@ checkCFLAGS = $(AM_CFLAGS) \
|
||||
-std=gnu11 \
|
||||
-O3 \
|
||||
-DCGLM_DEFINE_PRINTS \
|
||||
-I./include
|
||||
-I$(srcdir)/include
|
||||
|
||||
check_PROGRAMS = test/tests
|
||||
TESTS = $(check_PROGRAMS)
|
||||
@@ -67,8 +67,10 @@ cglm_HEADERS = include/cglm/version.h \
|
||||
include/cglm/util.h \
|
||||
include/cglm/quat.h \
|
||||
include/cglm/plane.h \
|
||||
include/cglm/noise.h \
|
||||
include/cglm/frustum.h \
|
||||
include/cglm/box.h \
|
||||
include/cglm/aabb2d.h \
|
||||
include/cglm/color.h \
|
||||
include/cglm/project.h \
|
||||
include/cglm/sphere.h \
|
||||
@@ -119,6 +121,7 @@ cglm_call_HEADERS = include/cglm/call/mat4.h \
|
||||
include/cglm/call/quat.h \
|
||||
include/cglm/call/euler.h \
|
||||
include/cglm/call/plane.h \
|
||||
include/cglm/call/noise.h \
|
||||
include/cglm/call/frustum.h \
|
||||
include/cglm/call/box.h \
|
||||
include/cglm/call/project.h \
|
||||
@@ -128,7 +131,8 @@ cglm_call_HEADERS = include/cglm/call/mat4.h \
|
||||
include/cglm/call/bezier.h \
|
||||
include/cglm/call/ray.h \
|
||||
include/cglm/call/affine.h \
|
||||
include/cglm/call/affine2d.h
|
||||
include/cglm/call/affine2d.h \
|
||||
include/cglm/call/aabb2d.h
|
||||
|
||||
cglm_call_clipspacedir=$(includedir)/cglm/call/clipspace
|
||||
cglm_call_clipspace_HEADERS = include/cglm/call/clipspace/persp_lh_no.h \
|
||||
@@ -149,7 +153,8 @@ cglm_call_clipspace_HEADERS = include/cglm/call/clipspace/persp_lh_no.h \
|
||||
cglm_simddir=$(includedir)/cglm/simd
|
||||
cglm_simd_HEADERS = include/cglm/simd/intrin.h \
|
||||
include/cglm/simd/x86.h \
|
||||
include/cglm/simd/arm.h
|
||||
include/cglm/simd/arm.h \
|
||||
include/cglm/simd/wasm.h
|
||||
|
||||
cglm_simd_sse2dir=$(includedir)/cglm/simd/sse2
|
||||
cglm_simd_sse2_HEADERS = include/cglm/simd/sse2/affine.h \
|
||||
@@ -168,6 +173,17 @@ cglm_simd_neon_HEADERS = include/cglm/simd/neon/affine.h \
|
||||
include/cglm/simd/neon/mat4.h \
|
||||
include/cglm/simd/neon/quat.h
|
||||
|
||||
cglm_simd_wasmdir=$(includedir)/cglm/simd/wasm
|
||||
cglm_simd_wasm_HEADERS = include/cglm/simd/wasm/affine.h \
|
||||
include/cglm/simd/wasm/mat2.h \
|
||||
include/cglm/simd/wasm/mat3.h \
|
||||
include/cglm/simd/wasm/mat4.h \
|
||||
include/cglm/simd/wasm/quat.h
|
||||
|
||||
cglm_handeddir=$(includedir)/cglm/handed
|
||||
cglm_handed_HEADERS = include/cglm/handed/euler_to_quat_lh.h \
|
||||
include/cglm/handed/euler_to_quat_rh.h
|
||||
|
||||
cglm_structdir=$(includedir)/cglm/struct
|
||||
cglm_struct_HEADERS = include/cglm/struct/mat4.h \
|
||||
include/cglm/struct/mat4x2.h \
|
||||
@@ -185,21 +201,27 @@ cglm_struct_HEADERS = include/cglm/struct/mat4.h \
|
||||
include/cglm/struct/affine2d.h \
|
||||
include/cglm/struct/vec2.h \
|
||||
include/cglm/struct/vec2-ext.h \
|
||||
include/cglm/struct/ivec2.h \
|
||||
include/cglm/struct/vec3.h \
|
||||
include/cglm/struct/vec3-ext.h \
|
||||
include/cglm/struct/ivec3.h \
|
||||
include/cglm/struct/vec4.h \
|
||||
include/cglm/struct/vec4-ext.h \
|
||||
include/cglm/struct/ivec4.h \
|
||||
include/cglm/struct/io.h \
|
||||
include/cglm/struct/cam.h \
|
||||
include/cglm/struct/quat.h \
|
||||
include/cglm/struct/euler.h \
|
||||
include/cglm/struct/plane.h \
|
||||
include/cglm/struct/noise.h \
|
||||
include/cglm/struct/frustum.h \
|
||||
include/cglm/struct/box.h \
|
||||
include/cglm/struct/aabb2d.h \
|
||||
include/cglm/struct/project.h \
|
||||
include/cglm/struct/sphere.h \
|
||||
include/cglm/struct/color.h \
|
||||
include/cglm/struct/curve.h
|
||||
include/cglm/struct/curve.h \
|
||||
include/cglm/struct/ray.h
|
||||
|
||||
cglm_struct_clipspacedir=$(includedir)/cglm/struct/clipspace
|
||||
cglm_struct_clipspace_HEADERS = include/cglm/struct/clipspace/persp_lh_no.h \
|
||||
@@ -217,6 +239,10 @@ cglm_struct_clipspace_HEADERS = include/cglm/struct/clipspace/persp_lh_no.h \
|
||||
include/cglm/struct/clipspace/project_no.h \
|
||||
include/cglm/struct/clipspace/project_zo.h
|
||||
|
||||
cglm_struct_handeddir=$(includedir)/cglm/struct/handed
|
||||
cglm_struct_handed_HEADERS = include/cglm/struct/handed/euler_to_quat_lh.h \
|
||||
include/cglm/struct/handed/euler_to_quat_rh.h
|
||||
|
||||
libcglm_la_SOURCES=\
|
||||
src/euler.c \
|
||||
src/affine.c \
|
||||
@@ -239,6 +265,7 @@ libcglm_la_SOURCES=\
|
||||
src/mat4x2.c \
|
||||
src/mat4x3.c \
|
||||
src/plane.c \
|
||||
src/noise.c \
|
||||
src/frustum.c \
|
||||
src/box.c \
|
||||
src/project.c \
|
||||
@@ -248,6 +275,7 @@ libcglm_la_SOURCES=\
|
||||
src/bezier.c \
|
||||
src/ray.c \
|
||||
src/affine2d.c \
|
||||
src/aabb2d.c \
|
||||
src/clipspace/ortho_lh_no.c \
|
||||
src/clipspace/ortho_lh_zo.c \
|
||||
src/clipspace/ortho_rh_no.c \
|
||||
|
||||
496
README.md
496
README.md
@@ -5,14 +5,10 @@
|
||||
</p>
|
||||
<br>
|
||||
<p align="center">
|
||||
<a href="https://travis-ci.com/recp/cglm">
|
||||
<img src="https://travis-ci.com/recp/cglm.svg?branch=master"
|
||||
<a href="https://github.com/recp/cglm/actions/workflows/ci.yml">
|
||||
<img src="https://github.com/recp/cglm/actions/workflows/ci.yml/badge.svg"
|
||||
alt="Build Status">
|
||||
</a>
|
||||
<a href="https://ci.appveyor.com/project/recp/cglm/branch/master">
|
||||
<img src="https://ci.appveyor.com/api/projects/status/av7l3gc0yhfex8y4/branch/master?svg=true"
|
||||
alt="Windows Build Status">
|
||||
</a>
|
||||
<a href="http://cglm.readthedocs.io/en/latest/?badge=latest">
|
||||
<img src="https://readthedocs.org/projects/cglm/badge/?version=latest"
|
||||
alt="Documentation Status">
|
||||
@@ -43,73 +39,100 @@
|
||||
<br>
|
||||
|
||||
<p align="center">
|
||||
Highly optimized 2D|3D math library, also known as <b>OpenGL Mathematics (glm) for `C`</b>. <b>cglm</b> provides lot of utils to help math operations to be fast and quick to write. It is community friendly, feel free to bring any issues, bugs you faced.
|
||||
A highly optimized 2D|3D math library. Also known as OpenGL Mathematics (glm) for C. <b>cglm</b> provides fast and ergonomic math functions to ease graphics programming. It is community friendly – feel free to report any bugs and issues you face. <br>
|
||||
<i>If you're using C++, you might want to check out <a href="https://github.com/g-truc/glm">GLM</a></i>
|
||||
</p>
|
||||
|
||||
- Allocation-free
|
||||
- Header-only
|
||||
- SIMD-optimized
|
||||
- API-agnostic
|
||||
|
||||
---
|
||||
|
||||
#### 📚 Documentation
|
||||
### 📚 Documentation
|
||||
|
||||
Almost all functions (inline versions) and parameters are documented inside the corresponding headers. <br />
|
||||
Complete documentation: http://cglm.readthedocs.io
|
||||
All functions and their parameters are documented above their declaration inside their corresponding headers. <br />
|
||||
Alternatively, you can read the complete documentation [here](http://cglm.readthedocs.io).
|
||||
|
||||
#### 📌 Note for previous versions:
|
||||
### 🔨 Building
|
||||
|
||||
- _dup (duplicate) is changed to _copy. For instance `glm_vec_dup -> glm_vec3_copy`
|
||||
- OpenGL related functions are dropped to make this lib platform/third-party independent
|
||||
- make sure you have latest version and feel free to report bugs, troubles
|
||||
- **[bugfix]** euler angles was implemented in reverse order (extrinsic) it was fixed, now they are intrinsic. Make sure that
|
||||
you have the latest version
|
||||
- **[major change]** by starting v0.4.0, quaternions are stored as [x, y, z, w], it was [w, x, y, z] in v0.3.5 and earlier versions
|
||||
- **[api rename]** by starting v0.4.5, **glm_simd** functions are renamed to **glmm_**
|
||||
- **[new option]** by starting v0.4.5, you can disable alignment requirement, check options in docs.
|
||||
- **[major change]** by starting v0.5.0, vec3 functions use **glm_vec3_** namespace, it was **glm_vec_** until v0.5.0
|
||||
- **[major change]** by starting v0.5.1, built-in alignment is removed from **vec3** and **mat3** types
|
||||
- **[major change]** by starting v0.7.3, inline print functions are disabled in release/production mode to eliminate print costs (see options in documentation). Print output also improved. You can disable colors if you need (see documentation)
|
||||
- **[major change]** by starting v0.8.3, **cglm** supports alternative clipspace configuations e.g. Left Handed, Zero-to-One (_zo)... `CGLM_FORCE_DEPTH_ZERO_TO_ONE` and `CGLM_FORCE_LEFT_HANDED` is provided to control clipspace. You should be able to use **cglm** with Vulkan, DirectX and Metal now... see https://cglm.readthedocs.io/en/latest/opt.html#clipspace-option-s
|
||||
cglm can be used in it's entirety as a header-only library simply by including `cglm/cglm.h`. If you wish to link against it instead, it can be built using one of the supported build systems. Detailed information about building on individual platforms and build systems along with the instructions for building the documentation can be found in [BUILDING.md](./BUILDING.md).
|
||||
|
||||
#### 📌 Note for C++ developers:
|
||||
If you are not aware of the original GLM library yet, you may also want to look at:
|
||||
https://github.com/g-truc/glm
|
||||
### ✅ Usage
|
||||
|
||||
#### 📌 Note for new comers (Important):
|
||||
- `vec4` and `mat4` variables must be aligned. (There will be unaligned versions later)
|
||||
- **in** and **[in, out]** parameters must be initialized (please). But **[out]** parameters not, initializing out param is also redundant
|
||||
- All functions are inline if you don't want to use pre-compiled versions with glmc_ prefix, you can ignore build process. Just include headers.
|
||||
- if your debugger takes you to cglm headers then make sure you are not trying to copy vec4 to vec3 or alig issues...
|
||||
- Welcome!
|
||||
#### Header-only
|
||||
|
||||
#### 📌 Note for experienced developers:
|
||||
- Since I'm testing this library in my projects, sometimes bugs occurs; finding that bug[s] and making improvements would be more easy with multiple developer/contributor and their projects or knowledge. Consider to make some tests if you suspect something is wrong and any feedbacks, contributions and bug reports are always welcome.
|
||||
Include the `cglm/cglm.h` header and use functions with the `glm_` prefix.
|
||||
```c
|
||||
#include "cglm/cglm.h"
|
||||
|
||||
#### 📌 Allocations?
|
||||
`cglm` doesn't alloc any memory on heap. So it doesn't provide any allocator. You should alloc memory for **out** parameters too if you pass pointer of memory location. Don't forget that **vec4** (also quat/**versor**) and **mat4** must be aligned (16-bytes), because *cglm* uses SIMD instructions to optimize most operations if available.
|
||||
// ...
|
||||
|
||||
#### 📌 Returning vector or matrix... ?
|
||||
vec2 vector;
|
||||
glm_vec2_zero(vector);
|
||||
```
|
||||
|
||||
**cglm** supports both *ARRAY API* and *STRUCT API*, so you can return structs if you utilize struct api (`glms_`).
|
||||
#### Struct API
|
||||
|
||||
<hr/>
|
||||
Include `cglm/struct.h` and use `glms_`.
|
||||
```c
|
||||
#include "cglm/struct.h"
|
||||
|
||||
<table>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
<div>Like some other graphics libraries (especially OpenGL) this library use Column-Major layout to keep matrices in the memory. </div>
|
||||
<div> </div>
|
||||
<div>In the future the library may support an option to use row-major layout, CURRENTLY if you need to row-major layout you will need to transpose it. </div>
|
||||
</td>
|
||||
<td>
|
||||
<img src="https://upload.wikimedia.org/wikipedia/commons/3/3f/Matrix_Columns.svg" width="300px" />
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
// ...
|
||||
|
||||
## 🚀 Features
|
||||
- **scalar** and **simd** (sse, avx, neon...) optimizations
|
||||
- option to use different clipspaces e.g. Left Handed, Zero-to-One... (currrently right handed negative-one is default)
|
||||
- array api and struct api, you can use arrays or structs.
|
||||
vec2s vector = glms_vec2_zero();
|
||||
```
|
||||
|
||||
#### Linked
|
||||
|
||||
Include `cglm/call.h` and use `glmc_`.
|
||||
```c
|
||||
#include "cglm/call.h"
|
||||
|
||||
// ...
|
||||
|
||||
vec2 vector;
|
||||
glmc_vec2_zero(vector);
|
||||
```
|
||||
|
||||
### ❗ Alignment
|
||||
|
||||
While cglm by default aligns what's necessary, it is possible to disable this by defining `CGLM_ALL_UNALIGNED`. If you're targeting machines with any kind of SIMD support, make sure that all `vec4`, `mat4` and `mat2` arguments you pass to cglm functions are aligned to prevent unexpected crashes, alternatively use the unaligned versions if present.
|
||||
|
||||
### Struct API
|
||||
|
||||
The struct API works as follows (note the `s` suffix on types, `glms_` prefix on functions and `GLMS_` on constants):
|
||||
|
||||
```C
|
||||
#include <cglm/struct.h>
|
||||
|
||||
mat4s mat = GLMS_MAT4_IDENTITY_INIT;
|
||||
mat4s inv = glms_mat4_inv(mat);
|
||||
```
|
||||
|
||||
Struct functions generally take parameters *by copy* and *return* the results rather than taking pointers and writing to out parameters. That means your variables can usually be `const`, if you're into that.
|
||||
|
||||
The types used are actually unions that allow access to the same data in multiple ways. One of these involves anonymous structures available since C11. MSVC supports them in earlier versions out of the box and GCC/Clang as well if you enable `-fms-extensions`.
|
||||
To explicitly enable anonymous structures `#define CGLM_USE_ANONYMOUS_STRUCT 1`, or `0` to disable them.
|
||||
For backwards compatibility, you can also `#define CGLM_NO_ANONYMOUS_STRUCT` to disable them. If you don't specify explicitly, cglm will attempt a best guess based on your compiler and C version.
|
||||
|
||||
### 📌 Migration notes:
|
||||
|
||||
- `_dup` (duplicate) functions were renamed to `_copy`. For instance: `glm_vec_dup` -> `glm_vec3_copy`.
|
||||
- OpenGL related functions were dropped to make cglm API independent.
|
||||
- **[bugfix]** Euler angles had been previously implemented in reverse order (extrinsic). This was fixed to be intrinsic.
|
||||
- **[major change]** Starting with **v0.4.0**, quaternions are stored as [x, y, z, w]. Previously it was [w, x, y, z].
|
||||
- **[api rename]** Starting with **v0.4.5**, `glm_simd_` functions are renamed to `glmm_`.
|
||||
- **[new option]** Starting with **v0.4.5**, alignment requirements can be disabled. Read more in the documentation.
|
||||
- **[major change]** Starting with **v0.5.0**, vec3 functions occupy the **glm_vec3_** namespace. This used to be **glm_vec_** in earlier versions.
|
||||
- **[major change]** Starting with **v0.5.1**, `vec3` and `mat3` types are not aligned by default.
|
||||
- **[major change]** Starting with **v0.7.3**, inline print functions are disabled by default in release mode to eliminate printing costs (see the Options chapter of the docs). <br> Colored output can be disabled (see documentation).
|
||||
- **[major change]** Starting with **v0.8.3**, alternate clipspace configurations are supported. The `CGLM_FORCE_DEPTH_ZERO_TO_ONE` and `CGLM_FORCE_LEFT_HANDED` flags are provided to control clip depth and handedness. This makes it easier to incorporate cglm into projects using graphics APIs such as Vulkan or Metal. See https://cglm.readthedocs.io/en/latest/opt.html#clipspace-option-s
|
||||
|
||||
### 🚀 Features
|
||||
|
||||
- scalar and simd (sse, avx, neon...) optimizations
|
||||
- general purpose matrix operations (mat4, mat3)
|
||||
- chain matrix multiplication (square only)
|
||||
- general purpose vector operations (cross, dot, rotate, proj, angle...)
|
||||
@@ -121,49 +144,35 @@ https://github.com/g-truc/glm
|
||||
- quaternions
|
||||
- euler angles / yaw-pitch-roll to matrix
|
||||
- extract euler angles
|
||||
- inline or pre-compiled function call
|
||||
- frustum (extract view frustum planes, corners...)
|
||||
- bounding box (AABB in Frustum (culling), crop, merge...)
|
||||
- bounding sphere
|
||||
- project, unproject
|
||||
- easing functions
|
||||
- curves
|
||||
- curve interpolation helpers (S*M*C, deCasteljau...)
|
||||
- helpers to convert cglm types to Apple's simd library to pass cglm types to Metal GL without packing them on both sides
|
||||
- curve interpolation helpers (SMC, deCasteljau...)
|
||||
- comversion helpers from cglm types to Apple's simd library to pass cglm types to Metal GL without packing them on both sides
|
||||
- ray intersection helpers
|
||||
- and others...
|
||||
---
|
||||
|
||||
<hr />
|
||||
<table>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
<div>Like other graphics libraries (especially OpenGL), cglm uses column-major layout to keep matrices in memory. </div>
|
||||
<div> </div>
|
||||
<div>While we might support row-major matrices in the future, currently if you need your matrices to be in row-major layout you have to transpose them. </div>
|
||||
</td>
|
||||
<td>
|
||||
<img src="https://upload.wikimedia.org/wikipedia/commons/3/3f/Matrix_Columns.svg" width="300px" />
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
You have two options to call a function/operation: inline or library call (link)
|
||||
Almost all functions are marked inline (always_inline) so compiler will probably inline.
|
||||
To call pre-compiled versions, just use `glmc_` (c stands for 'call') instead of `glm_`.
|
||||
---
|
||||
|
||||
```C
|
||||
#include <cglm/cglm.h> /* for inline */
|
||||
#include <cglm/call.h> /* for library call (this also includes cglm.h) */
|
||||
|
||||
mat4 rot, trans, rt;
|
||||
/* ... */
|
||||
glm_mul(trans, rot, rt); /* inline */
|
||||
glmc_mul(trans, rot, rt); /* call from library */
|
||||
```
|
||||
Most of math functions are optimized manualy with SSE2 if available, if not? Dont worry there are non-sse versions of all operations
|
||||
|
||||
You can pass matrices and vectors as array to functions rather than get address.
|
||||
|
||||
```C
|
||||
mat4 m = {
|
||||
1, 0, 0, 0,
|
||||
0, 1, 0, 0,
|
||||
0, 0, 1, 0,
|
||||
0, 0, 0, 1
|
||||
};
|
||||
|
||||
glm_translate(m, (vec3){1.0f, 0.0f, 0.0f});
|
||||
```
|
||||
|
||||
Library contains general purpose mat4 mul and inverse functions, and also contains some special forms (optimized) of these functions for affine transformations' matrices. If you want to multiply two affine transformation matrices you can use glm_mul instead of glm_mat4_mul and glm_inv_tr (ROT + TR) instead glm_mat4_inv
|
||||
cglm contains general purpose mat4 product and inverse functions but also provides optimized versions for affine transformations. If you want to multiply two affine transformation matrices you can use glm_mul instead of glm_mat4_mul and glm_inv_tr (ROT + TR) instead glm_mat4_inv.
|
||||
```C
|
||||
/* multiplication */
|
||||
mat4 modelMat;
|
||||
@@ -173,311 +182,9 @@ glm_mul(T, R, modelMat);
|
||||
glm_inv_tr(modelMat);
|
||||
```
|
||||
|
||||
### Struct API
|
||||
|
||||
The struct API works as follows, note the `s` suffix on types, the `glms_` prefix on functions and the `GLMS_` prefix on constants:
|
||||
|
||||
```C
|
||||
#include <cglm/struct.h>
|
||||
|
||||
mat4s mat = GLMS_MAT4_IDENTITY_INIT;
|
||||
mat4s inv = glms_mat4_inv(mat);
|
||||
```
|
||||
|
||||
Struct functions generally take their parameters as *values* and *return* their results, rather than taking pointers and writing to out parameters. That means your parameters can usually be `const`, if you're into that.
|
||||
|
||||
The types used are actually unions that allow access to the same data multiple ways. One of those ways involves anonymous structures, available since C11. MSVC also supports it for earlier C versions out of the box and GCC/Clang do if you enable `-fms-extensions`. To explicitly enable these anonymous structures, `#define CGLM_USE_ANONYMOUS_STRUCT` to `1`, to disable them, to `0`. For backward compatibility, you can also `#define CGLM_NO_ANONYMOUS_STRUCT` (value is irrelevant) to disable them. If you don't specify explicitly, cglm will do a best guess based on your compiler and the C version you're using.
|
||||
|
||||
## 🔨 Build
|
||||
|
||||
### CMake (All platforms)
|
||||
```bash
|
||||
$ mkdir build
|
||||
$ cd build
|
||||
$ cmake .. # [Optional] -DCGLM_SHARED=ON
|
||||
$ make
|
||||
$ sudo make install # [Optional]
|
||||
```
|
||||
|
||||
##### Cmake options with Defaults:
|
||||
|
||||
```CMake
|
||||
option(CGLM_SHARED "Shared build" ON)
|
||||
option(CGLM_STATIC "Static build" OFF)
|
||||
option(CGLM_USE_C99 "" OFF) # C11
|
||||
option(CGLM_USE_TEST "Enable Tests" OFF) # for make check - make test
|
||||
```
|
||||
|
||||
#### Use as header-only library with your CMake project
|
||||
|
||||
This requires no building or installation of cglm.
|
||||
|
||||
* Example:
|
||||
|
||||
``` cmake
|
||||
cmake_minimum_required(VERSION 3.8.2)
|
||||
|
||||
project(<Your Project Name>)
|
||||
|
||||
add_executable(${PROJECT_NAME} src/main.c)
|
||||
target_link_libraries(${LIBRARY_NAME} PRIVATE
|
||||
cglm_headers)
|
||||
|
||||
add_subdirectory(external/cglm/ EXCLUDE_FROM_ALL)
|
||||
```
|
||||
|
||||
#### Use with your CMake project
|
||||
* Example:
|
||||
```cmake
|
||||
cmake_minimum_required(VERSION 3.8.2)
|
||||
|
||||
project(<Your Project Name>)
|
||||
|
||||
add_executable(${PROJECT_NAME} src/main.c)
|
||||
target_link_libraries(${LIBRARY_NAME} PRIVATE
|
||||
cglm)
|
||||
|
||||
add_subdirectory(external/cglm/)
|
||||
|
||||
# or you can use find_package to configure cglm
|
||||
```
|
||||
|
||||
#### Use CMake to build for WebAssembly
|
||||
|
||||
Since math functions like `sinf` is used, this can not be targeted at `wasm32-unknown-unknown`, one of [wasi-sdk](https://github.com/WebAssembly/wasi-sdk) or [emscripten](https://github.com/emscripten-core/emsdk) should be used.
|
||||
|
||||
Should note that shared build is not yet supported for WebAssembly.
|
||||
|
||||
For [simd128](https://github.com/WebAssembly/simd) support, add `-msimd128` to `CMAKE_C_FLAGS`, in command line `-DCMAKE_C_FLAGS="-msimd128"`.
|
||||
|
||||
For tests, the cmake option `CGLM_USE_TEST` would still work, you'll need a wasi runtime for running tests, see our [ci config file](.github/workflows/cmake-wasm.yml) for a detailed example.
|
||||
|
||||
##### Use CMake and WASI SDK to build for WebAssembly
|
||||
|
||||
```bash
|
||||
$ cmake .. \
|
||||
-DCMAKE_TOOLCHAIN_FILE=/path/to/wasi-sdk-19.0/share/cmake/wasi-sdk.cmake \
|
||||
-DWASI_SDK_PREFIX=/path/to/wasi-sdk-19.0
|
||||
```
|
||||
|
||||
Where `/path/to/wasi-sdk-19.0/` is the path to extracted [wasi sdk](https://github.com/WebAssembly/wasi-sdk).
|
||||
|
||||
In this case it would by default make a static build.
|
||||
|
||||
##### Use CMake and Emscripten SDK to build for WebAssembly
|
||||
|
||||
```bash
|
||||
$ emcmake cmake .. \
|
||||
-DCMAKE_EXE_LINKER_FLAGS="-s STANDALONE_WASM" \
|
||||
-DCGLM_STATIC=ON
|
||||
```
|
||||
|
||||
The `emcmake` here is the cmake wrapper for Emscripten from installed [emsdk](https://github.com/emscripten-core/emsdk).
|
||||
|
||||
### Meson (All platforms)
|
||||
|
||||
```bash
|
||||
$ meson build # [Optional] --default-library=static
|
||||
$ cd build
|
||||
$ ninja
|
||||
$ sudo ninja install # [Optional]
|
||||
```
|
||||
|
||||
##### Meson options with Defaults:
|
||||
|
||||
```meson
|
||||
c_std=c11
|
||||
buildtype=release
|
||||
default_library=shared
|
||||
build_tests=true # to run tests: ninja test
|
||||
```
|
||||
#### Use with your Meson project
|
||||
* Example:
|
||||
```meson
|
||||
# Clone cglm or create a cglm.wrap under <source_root>/subprojects
|
||||
project('name', 'c')
|
||||
|
||||
cglm_dep = dependency('cglm', fallback : 'cglm', 'cglm_dep')
|
||||
|
||||
executable('exe', 'src/main.c', dependencies : cglm_dep)
|
||||
```
|
||||
|
||||
### Swift (Swift Package Manager)
|
||||
|
||||
Currently only default build options are supported. Add **cglm** dependency to your project:
|
||||
|
||||
```swift
|
||||
...
|
||||
Package(
|
||||
...
|
||||
dependencies: [
|
||||
...
|
||||
.package(url: "https://github.com/recp/cglm", .branch("master")),
|
||||
]
|
||||
...
|
||||
)
|
||||
```
|
||||
|
||||
Now add **cgml** as a dependency to your target. Product choices are:
|
||||
- **cglm** for inlined version of the library which can be linked only statically
|
||||
- **cglmc** for a compiled version of the library with no linking limitation
|
||||
|
||||
```swift
|
||||
...
|
||||
.target(
|
||||
...
|
||||
dependencies: [
|
||||
...
|
||||
.product(name: "cglm", package: "cglm"),
|
||||
]
|
||||
...
|
||||
)
|
||||
...
|
||||
```
|
||||
|
||||
### Unix (Autotools)
|
||||
|
||||
```bash
|
||||
$ sh autogen.sh
|
||||
$ ./configure
|
||||
$ make
|
||||
$ make check # [Optional]
|
||||
$ [sudo] make install # [Optional]
|
||||
```
|
||||
|
||||
This will also install pkg-config files so you can use
|
||||
`pkg-config --cflags cglm` and `pkg-config --libs cglm` to retrieve compiler
|
||||
and linker flags.
|
||||
|
||||
The files will be installed into the given prefix (usually `/usr/local` by
|
||||
default on Linux), but your pkg-config may not be configured to actually check
|
||||
there. You can figure out where it's looking by running `pkg-config --variable
|
||||
pc_path pkg-config` and change the path the files are installed to via
|
||||
`./configure --with-pkgconfigdir=/your/path`. Alternatively, you can add the
|
||||
prefix path to your `PKG_CONFIG_PATH` environment variable.
|
||||
|
||||
### Windows (MSBuild)
|
||||
Windows related build file and project files are located in `win` folder,
|
||||
make sure you are inside `cglm/win` folder.
|
||||
Code Analysis is enabled, so it may take awhile to build.
|
||||
|
||||
```Powershell
|
||||
$ cd win
|
||||
$ .\build.bat
|
||||
```
|
||||
if `msbuild` won't work (because of multi version VS) then try to build with `devenv`:
|
||||
```Powershell
|
||||
$ devenv cglm.sln /Build Release
|
||||
```
|
||||
|
||||
#### Running Tests on Windows
|
||||
|
||||
You can see test project in same visual studio solution file. It is enough to run that project to run tests.
|
||||
|
||||
### Building Docs
|
||||
First you need install Sphinx: http://www.sphinx-doc.org/en/master/usage/installation.html
|
||||
then:
|
||||
```bash
|
||||
$ cd docs
|
||||
$ sphinx-build source build
|
||||
```
|
||||
it will compile docs into build folder, you can run index.html inside that function.
|
||||
|
||||
## How to use
|
||||
If you want to use the inline versions of functions, then include the main header
|
||||
```C
|
||||
#include <cglm/cglm.h>
|
||||
```
|
||||
the header will include all headers. Then call the func you want e.g. rotate vector by axis:
|
||||
```C
|
||||
glm_vec3_rotate(v1, glm_rad(45), (vec3){1.0f, 0.0f, 0.0f});
|
||||
```
|
||||
some functions are overloaded :) e.g you can normalize vector:
|
||||
```C
|
||||
glm_vec3_normalize(vec);
|
||||
```
|
||||
this will normalize vec and store normalized vector into `vec` but if you will store normalized vector into another vector do this:
|
||||
```C
|
||||
glm_vec3_normalize_to(vec, result);
|
||||
```
|
||||
like this function you may see `_to` postfix, this functions store results to another variables and save temp memory
|
||||
|
||||
|
||||
to call pre-compiled versions include header with `c` postfix, c means call. Pre-compiled versions are just wrappers.
|
||||
```C
|
||||
#include <cglm/call.h>
|
||||
```
|
||||
this header will include all headers with c postfix. You need to call functions with c posfix:
|
||||
```C
|
||||
glmc_vec3_normalize(vec);
|
||||
```
|
||||
|
||||
Function usage and parameters are documented inside related headers. You may see same parameter passed twice in some examples like this:
|
||||
```C
|
||||
glm_mat4_mul(m1, m2, m1);
|
||||
|
||||
/* or */
|
||||
glm_mat4_mul(m1, m1, m1);
|
||||
```
|
||||
the first two parameter are **[in]** and the last one is **[out]** parameter. After multiplying *m1* and *m2*, the result is stored in *m1*. This is why we send *m1* twice. You may store the result in a different matrix, this is just an example.
|
||||
|
||||
### Example: Computing MVP matrix
|
||||
|
||||
#### Option 1
|
||||
```C
|
||||
mat4 proj, view, model, mvp;
|
||||
|
||||
/* init proj, view and model ... */
|
||||
|
||||
glm_mat4_mul(proj, view, viewProj);
|
||||
glm_mat4_mul(viewProj, model, mvp);
|
||||
```
|
||||
|
||||
#### Option 2
|
||||
```C
|
||||
mat4 proj, view, model, mvp;
|
||||
|
||||
/* init proj, view and model ... */
|
||||
|
||||
glm_mat4_mulN((mat4 *[]){&proj, &view, &model}, 3, mvp);
|
||||
```
|
||||
|
||||
## How to send matrix to OpenGL
|
||||
|
||||
mat4 is array of vec4 and vec4 is array of floats. `glUniformMatrix4fv` functions accecpts `float*` as `value` (last param), so you can cast mat4 to float* or you can pass first column of matrix as beginning of memory of matrix:
|
||||
|
||||
Option 1: Send first column
|
||||
```C
|
||||
glUniformMatrix4fv(location, 1, GL_FALSE, matrix[0]);
|
||||
|
||||
/* array of matrices */
|
||||
glUniformMatrix4fv(location, 1, GL_FALSE, matrix[0][0]);
|
||||
```
|
||||
|
||||
Option 2: Cast matrix to pointer type (also valid for multiple dimensional arrays)
|
||||
```C
|
||||
glUniformMatrix4fv(location, 1, GL_FALSE, (float *)matrix);
|
||||
```
|
||||
|
||||
You can pass matrices the same way to other APIs e.g. Vulkan, DX...
|
||||
|
||||
## Notes
|
||||
|
||||
- This library does not support double type... yet
|
||||
- If headers are not working properly with your compiler, IDE please open an issue, because I'm using GCC and clang to test it maybe sometimes MSVC
|
||||
|
||||
**TODO:**
|
||||
- [ ] Unit tests (In Progress)
|
||||
- [ ] Unit tests for comparing cglm with glm results
|
||||
- [x] Add version info
|
||||
- [ ] Unaligned operations (e.g. `glm_umat4_mul`)
|
||||
- [x] Extra documentation
|
||||
- [x] ARM Neon Arch
|
||||
|
||||
|
||||
## Contributors
|
||||
|
||||
This project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)].
|
||||
This project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)]
|
||||
<a href="https://github.com/recp/cglm/graphs/contributors"><img src="https://opencollective.com/cglm/contributors.svg?width=890&button=false" /></a>
|
||||
|
||||
|
||||
@@ -502,6 +209,3 @@ Support this project by becoming a sponsor. Your logo will show up here with a l
|
||||
<a href="https://opencollective.com/cglm/sponsor/7/website" target="_blank"><img src="https://opencollective.com/cglm/sponsor/7/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/cglm/sponsor/8/website" target="_blank"><img src="https://opencollective.com/cglm/sponsor/8/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/cglm/sponsor/9/website" target="_blank"><img src="https://opencollective.com/cglm/sponsor/9/avatar.svg"></a>
|
||||
|
||||
## License
|
||||
MIT. check the LICENSE file
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
image: Visual Studio 2017
|
||||
|
||||
build_script:
|
||||
- ps: >-
|
||||
cd win
|
||||
|
||||
.\build.bat
|
||||
0
autogen.sh
Normal file → Executable file
0
autogen.sh
Normal file → Executable file
@@ -2,7 +2,7 @@ Pod::Spec.new do |s|
|
||||
|
||||
# Description
|
||||
s.name = "cglm"
|
||||
s.version = "0.9.0"
|
||||
s.version = "0.9.5"
|
||||
s.summary = "📽 Highly Optimized Graphics Math (glm) for C"
|
||||
s.description = <<-DESC
|
||||
cglm is math library for graphics programming for C. See the documentation or README for all features.
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
#*****************************************************************************
|
||||
|
||||
AC_PREREQ([2.69])
|
||||
AC_INIT([cglm], [0.9.1], [info@recp.me])
|
||||
AC_INIT([cglm], [0.9.6], [info@recp.me])
|
||||
AM_INIT_AUTOMAKE([-Wall foreign subdir-objects serial-tests])
|
||||
|
||||
# Don't use the default cflags (-O2 -g), we set ours manually in Makefile.am.
|
||||
|
||||
0
docs/make.bat
Normal file → Executable file
0
docs/make.bat
Normal file → Executable file
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
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
3D Affine Transforms (common)
|
||||
================================================================================
|
||||
|
||||
Common transfrom functions.
|
||||
Common transform functions.
|
||||
|
||||
Table of contents (click to go):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
@@ -30,7 +30,7 @@ Functions documentation
|
||||
creates NEW translate transform matrix by *v* vector.
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** affine transfrom
|
||||
| *[in, out]* **m** affine transform
|
||||
| *[in]* **v** translate vector [x, y, z]
|
||||
|
||||
.. c:function:: void glm_scale_to(mat4 m, vec3 v, mat4 dest)
|
||||
@@ -38,7 +38,7 @@ Functions documentation
|
||||
scale existing transform matrix by *v* vector and store result in dest
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** affine transfrom
|
||||
| *[in]* **m** affine transform
|
||||
| *[in]* **v** scale vector [x, y, z]
|
||||
| *[out]* **dest** scaled matrix
|
||||
|
||||
@@ -47,7 +47,7 @@ Functions documentation
|
||||
creates NEW scale matrix by v vector
|
||||
|
||||
Parameters:
|
||||
| *[out]* **m** affine transfrom
|
||||
| *[out]* **m** affine transform
|
||||
| *[in]* **v** scale vector [x, y, z]
|
||||
|
||||
.. c:function:: void glm_scale(mat4 m, vec3 v)
|
||||
@@ -56,7 +56,7 @@ Functions documentation
|
||||
and stores result in same matrix
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** affine transfrom
|
||||
| *[in, out]* **m** affine transform
|
||||
| *[in]* **v** scale vector [x, y, z]
|
||||
|
||||
.. c:function:: void glm_scale_uni(mat4 m, float s)
|
||||
@@ -65,7 +65,7 @@ Functions documentation
|
||||
and stores result in same matrix
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** affine transfrom
|
||||
| *[in, out]* **m** affine transform
|
||||
| *[in]* **v** scale factor
|
||||
|
||||
.. c:function:: void glm_rotate_make(mat4 m, float angle, vec3 axis)
|
||||
@@ -74,7 +74,7 @@ Functions documentation
|
||||
axis will be normalized so you don't need to normalize it
|
||||
|
||||
Parameters:
|
||||
| *[out]* **m** affine transfrom
|
||||
| *[out]* **m** affine transform
|
||||
| *[in]* **axis** angle (radians)
|
||||
| *[in]* **axis** axis
|
||||
|
||||
@@ -86,7 +86,7 @@ Functions documentation
|
||||
| this should work faster than glm_rotate_at because it reduces one glm_translate.
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** affine transfrom
|
||||
| *[in, out]* **m** affine transform
|
||||
| *[in]* **pivot** pivot, anchor point, rotation center
|
||||
| *[in]* **angle** angle (radians)
|
||||
| *[in]* **axis** axis
|
||||
@@ -123,7 +123,7 @@ Functions documentation
|
||||
DON'T pass projected matrix here
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** affine transfrom
|
||||
| *[in]* **m** affine transform
|
||||
| *[out]* **t** translation vector
|
||||
| *[out]* **r** rotation matrix (mat4)
|
||||
| *[out]* **s** scaling vector [X, Y, Z]
|
||||
|
||||
@@ -25,7 +25,7 @@ You cannot use :c:func:`glm_mul` anymore.
|
||||
Same is also true for :c:func:`glm_inv_tr` if you only have rotation and
|
||||
translation then it will work as expected, otherwise you cannot use that.
|
||||
|
||||
In the future it may accept scale factors too but currectly it does not.
|
||||
In the future it may accept scale factors too but currently it does not.
|
||||
|
||||
Table of contents (click func go):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
@@ -3,10 +3,8 @@
|
||||
3D Affine Transforms (post)
|
||||
================================================================================
|
||||
|
||||
Post transfrom functions are similar to pre transform functions except order of application is reversed.
|
||||
Post transform functions are applied after the object is transformed with given (model matrix) transfrom.
|
||||
|
||||
Ther are named af
|
||||
Post transform functions are similar to pre transform functions except order of application is reversed.
|
||||
Post transform functions are applied after the object is transformed with given (model matrix) transform.
|
||||
|
||||
Table of contents (click to go):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
@@ -33,7 +31,7 @@ Functions documentation
|
||||
translate existing transform matrix by *v* vector and store result in dest
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** affine transfrom
|
||||
| *[in]* **m** affine transform
|
||||
| *[in]* **v** translate vector [x, y, z]
|
||||
| *[out]* **dest** translated matrix
|
||||
|
||||
@@ -43,7 +41,7 @@ Functions documentation
|
||||
and stores result in same matrix
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** affine transfrom
|
||||
| *[in, out]* **m** affine transform
|
||||
| *[in]* **v** translate vector [x, y, z]
|
||||
|
||||
.. c:function:: void glm_translated_x(mat4 m, float x)
|
||||
@@ -51,7 +49,7 @@ Functions documentation
|
||||
translate existing transform matrix by x factor
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** affine transfrom
|
||||
| *[in, out]* **m** affine transform
|
||||
| *[in]* **v** x factor
|
||||
|
||||
.. c:function:: void glm_translated_y(mat4 m, float y)
|
||||
@@ -59,7 +57,7 @@ Functions documentation
|
||||
translate existing transform matrix by *y* factor
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** affine transfrom
|
||||
| *[in, out]* **m** affine transform
|
||||
| *[in]* **v** y factor
|
||||
|
||||
.. c:function:: void glm_translated_z(mat4 m, float z)
|
||||
@@ -67,7 +65,7 @@ Functions documentation
|
||||
translate existing transform matrix by *z* factor
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** affine transfrom
|
||||
| *[in, out]* **m** affine transform
|
||||
| *[in]* **v** z factor
|
||||
|
||||
.. c:function:: void glm_rotated_x(mat4 m, float angle, mat4 dest)
|
||||
@@ -76,7 +74,7 @@ Functions documentation
|
||||
and store result in dest
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** affine transfrom
|
||||
| *[in]* **m** affine transform
|
||||
| *[in]* **angle** angle (radians)
|
||||
| *[out]* **dest** rotated matrix
|
||||
|
||||
@@ -86,7 +84,7 @@ Functions documentation
|
||||
and store result in dest
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** affine transfrom
|
||||
| *[in]* **m** affine transform
|
||||
| *[in]* **angle** angle (radians)
|
||||
| *[out]* **dest** rotated matrix
|
||||
|
||||
@@ -96,7 +94,7 @@ Functions documentation
|
||||
and store result in dest
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** affine transfrom
|
||||
| *[in]* **m** affine transform
|
||||
| *[in]* **angle** angle (radians)
|
||||
| *[out]* **dest** rotated matrix
|
||||
|
||||
@@ -105,7 +103,7 @@ Functions documentation
|
||||
rotate existing transform matrix around Z axis by angle and axis
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** affine transfrom
|
||||
| *[in, out]* **m** affine transform
|
||||
| *[in]* **angle** angle (radians)
|
||||
| *[in]* **axis** axis
|
||||
|
||||
@@ -114,7 +112,7 @@ Functions documentation
|
||||
rotate existing transform around given axis by angle at given pivot point (rotation center)
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** affine transfrom
|
||||
| *[in, out]* **m** affine transform
|
||||
| *[in]* **pivot** pivot, anchor point, rotation center
|
||||
| *[in]* **angle** angle (radians)
|
||||
| *[in]* **axis** axis
|
||||
@@ -124,6 +122,6 @@ Functions documentation
|
||||
| rotate existing transform matrix around given axis by angle around self (doesn't affected by position)
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** affine transfrom
|
||||
| *[in, out]* **m** affine transform
|
||||
| *[in]* **angle** angle (radians)
|
||||
| *[in]* **axis** axis
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
3D Affine Transforms (pre)
|
||||
================================================================================
|
||||
|
||||
Pre transfrom functions which are regular transfrom functions.
|
||||
Pre transform functions which are regular transform functions.
|
||||
|
||||
Table of contents (click to go):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
@@ -41,7 +41,7 @@ Functions documentation
|
||||
translate existing transform matrix by *v* vector and store result in dest
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** affine transfrom
|
||||
| *[in]* **m** affine transform
|
||||
| *[in]* **v** translate vector [x, y, z]
|
||||
| *[out]* **dest** translated matrix
|
||||
|
||||
@@ -51,7 +51,7 @@ Functions documentation
|
||||
and stores result in same matrix
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** affine transfrom
|
||||
| *[in, out]* **m** affine transform
|
||||
| *[in]* **v** translate vector [x, y, z]
|
||||
|
||||
.. c:function:: void glm_translate_x(mat4 m, float x)
|
||||
@@ -59,7 +59,7 @@ Functions documentation
|
||||
translate existing transform matrix by x factor
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** affine transfrom
|
||||
| *[in, out]* **m** affine transform
|
||||
| *[in]* **v** x factor
|
||||
|
||||
.. c:function:: void glm_translate_y(mat4 m, float y)
|
||||
@@ -67,7 +67,7 @@ Functions documentation
|
||||
translate existing transform matrix by *y* factor
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** affine transfrom
|
||||
| *[in, out]* **m** affine transform
|
||||
| *[in]* **v** y factor
|
||||
|
||||
.. c:function:: void glm_translate_z(mat4 m, float z)
|
||||
@@ -75,59 +75,16 @@ Functions documentation
|
||||
translate existing transform matrix by *z* factor
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** affine transfrom
|
||||
| *[in, out]* **m** affine transform
|
||||
| *[in]* **v** z factor
|
||||
|
||||
.. c:function:: void glm_translate_make(mat4 m, vec3 v)
|
||||
|
||||
creates NEW translate transform matrix by *v* vector.
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** affine transfrom
|
||||
| *[in]* **v** translate vector [x, y, z]
|
||||
|
||||
.. c:function:: void glm_scale_to(mat4 m, vec3 v, mat4 dest)
|
||||
|
||||
scale existing transform matrix by *v* vector and store result in dest
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** affine transfrom
|
||||
| *[in]* **v** scale vector [x, y, z]
|
||||
| *[out]* **dest** scaled matrix
|
||||
|
||||
.. c:function:: void glm_scale_make(mat4 m, vec3 v)
|
||||
|
||||
creates NEW scale matrix by v vector
|
||||
|
||||
Parameters:
|
||||
| *[out]* **m** affine transfrom
|
||||
| *[in]* **v** scale vector [x, y, z]
|
||||
|
||||
.. c:function:: void glm_scale(mat4 m, vec3 v)
|
||||
|
||||
scales existing transform matrix by v vector
|
||||
and stores result in same matrix
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** affine transfrom
|
||||
| *[in]* **v** scale vector [x, y, z]
|
||||
|
||||
.. c:function:: void glm_scale_uni(mat4 m, float s)
|
||||
|
||||
applies uniform scale to existing transform matrix v = [s, s, s]
|
||||
and stores result in same matrix
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** affine transfrom
|
||||
| *[in]* **v** scale factor
|
||||
|
||||
.. c:function:: void glm_rotate_x(mat4 m, float angle, mat4 dest)
|
||||
|
||||
rotate existing transform matrix around X axis by angle
|
||||
and store result in dest
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** affine transfrom
|
||||
| *[in]* **m** affine transform
|
||||
| *[in]* **angle** angle (radians)
|
||||
| *[out]* **dest** rotated matrix
|
||||
|
||||
@@ -137,7 +94,7 @@ Functions documentation
|
||||
and store result in dest
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** affine transfrom
|
||||
| *[in]* **m** affine transform
|
||||
| *[in]* **angle** angle (radians)
|
||||
| *[out]* **dest** rotated matrix
|
||||
|
||||
@@ -147,26 +104,33 @@ Functions documentation
|
||||
and store result in dest
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** affine transfrom
|
||||
| *[in]* **m** affine transform
|
||||
| *[in]* **angle** angle (radians)
|
||||
| *[out]* **dest** rotated matrix
|
||||
|
||||
.. c:function:: void glm_rotate_make(mat4 m, float angle, vec3 axis)
|
||||
|
||||
creates NEW rotation matrix by angle and axis,
|
||||
axis will be normalized so you don't need to normalize it
|
||||
|
||||
Parameters:
|
||||
| *[out]* **m** affine transfrom
|
||||
| *[in]* **axis** angle (radians)
|
||||
| *[in]* **axis** axis
|
||||
|
||||
.. c:function:: void glm_rotate(mat4 m, float angle, vec3 axis)
|
||||
|
||||
rotate existing transform matrix around Z axis by angle and axis
|
||||
rotate existing transform matrix around given axis by angle at ORIGIN (0,0,0)
|
||||
|
||||
**❗️IMPORTANT ❗️**
|
||||
|
||||
If you need to rotate object around itself e.g. center of object or at
|
||||
some point [of object] then `glm_rotate_at()` would be better choice to do so.
|
||||
|
||||
Even if object's model transform is identity, rotation may not be around
|
||||
center of object if object does not lay out at ORIGIN perfectly.
|
||||
|
||||
Using `glm_rotate_at()` with center of bounding shape ( AABB, Sphere ... )
|
||||
would be an easy option to rotate around object if object is not at origin.
|
||||
|
||||
One another option to rotate around itself at any point is `glm_spin()`
|
||||
which is perfect if only rotating around model position is desired e.g. not
|
||||
specific point on model for instance center of geometry or center of mass,
|
||||
again if geometry is not perfectly centered at origin at identity transform,
|
||||
rotation may not be around geometry.
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** affine transfrom
|
||||
| *[in, out]* **m** affine transform
|
||||
| *[in]* **angle** angle (radians)
|
||||
| *[in]* **axis** axis
|
||||
|
||||
@@ -175,66 +139,16 @@ Functions documentation
|
||||
rotate existing transform around given axis by angle at given pivot point (rotation center)
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** affine transfrom
|
||||
| *[in, out]* **m** affine transform
|
||||
| *[in]* **pivot** pivot, anchor point, rotation center
|
||||
| *[in]* **angle** angle (radians)
|
||||
| *[in]* **axis** axis
|
||||
|
||||
.. c:function:: void glm_rotate_atm(mat4 m, vec3 pivot, float angle, vec3 axis)
|
||||
|
||||
| creates NEW rotation matrix by angle and axis at given point
|
||||
| this creates rotation matrix, it assumes you don't have a matrix
|
||||
|
||||
| this should work faster than glm_rotate_at because it reduces one glm_translate.
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** affine transfrom
|
||||
| *[in]* **pivot** pivot, anchor point, rotation center
|
||||
| *[in]* **angle** angle (radians)
|
||||
| *[in]* **axis** axis
|
||||
|
||||
.. c:function:: void glm_decompose_scalev(mat4 m, vec3 s)
|
||||
|
||||
decompose scale vector
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** affine transform
|
||||
| *[out]* **s** scale vector (Sx, Sy, Sz)
|
||||
|
||||
.. c:function:: bool glm_uniscaled(mat4 m)
|
||||
|
||||
returns true if matrix is uniform scaled.
|
||||
This is helpful for creating normal matrix.
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** matrix
|
||||
|
||||
.. c:function:: void glm_decompose_rs(mat4 m, mat4 r, vec3 s)
|
||||
|
||||
decompose rotation matrix (mat4) and scale vector [Sx, Sy, Sz]
|
||||
DON'T pass projected matrix here
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** affine transform
|
||||
| *[out]* **r** rotation matrix
|
||||
| *[out]* **s** scale matrix
|
||||
|
||||
.. c:function:: void glm_decompose(mat4 m, vec4 t, mat4 r, vec3 s)
|
||||
|
||||
decompose affine transform, TODO: extract shear factors.
|
||||
DON'T pass projected matrix here
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** affine transfrom
|
||||
| *[out]* **t** translation vector
|
||||
| *[out]* **r** rotation matrix (mat4)
|
||||
| *[out]* **s** scaling vector [X, Y, Z]
|
||||
|
||||
.. c:function:: void glm_spin(mat4 m, float angle, vec3 axis)
|
||||
|
||||
| rotate existing transform matrix around given axis by angle around self (doesn't affected by position)
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** affine transfrom
|
||||
| *[in, out]* **m** affine transform
|
||||
| *[in]* **angle** angle (radians)
|
||||
| *[in]* **axis** axis
|
||||
|
||||
@@ -13,7 +13,7 @@ Post functions (`T' = T * Tnew`) are like `glm_translated`, `glm_rotated` which
|
||||
`glm_translate`, `glm_rotate` are pre functions and are similar to C++ **glm** which you are familiar with.
|
||||
|
||||
In new versions of **cglm** we added `glm_translated`, `glm_rotated`... which are post functions,
|
||||
they are useful in some cases, e.g. append transform to existing transform (apply/append transform as last transfrom T' = T * Tnew).
|
||||
they are useful in some cases, e.g. append transform to existing transform (apply/append transform as last transform T' = T * Tnew).
|
||||
|
||||
Post functions are named after pre functions with `ed` suffix, e.g. `glm_translate` -> `glm_translated`. So don't mix them up.
|
||||
|
||||
@@ -24,7 +24,7 @@ a matrix for you. You don't need to pass identity matrix.
|
||||
|
||||
But other functions expect you have a matrix and you want to transform them. If
|
||||
you didn't have any existing matrix you have to initialize matrix to identity
|
||||
before sending to transfrom functions.
|
||||
before sending to transform functions.
|
||||
|
||||
There are also functions to decompose transform matrix. These functions can't
|
||||
decompose matrix after projected.
|
||||
@@ -35,7 +35,7 @@ Rotation Center
|
||||
Rotating functions uses origin as rotation center (pivot/anchor point),
|
||||
since scale factors are stored in rotation matrix, same may also true for scalling.
|
||||
cglm provides some functions for rotating around at given point e.g.
|
||||
**glm_rotate_at**, **glm_quat_rotate_at**. Use them or follow next section for algorihm ("Rotate or Scale around specific Point (Pivot Point / Anchor Point)").
|
||||
**glm_rotate_at**, **glm_quat_rotate_at**. Use them or follow next section for algorithm ("Rotate or Scale around specific Point (Pivot Point / Anchor Point)").
|
||||
|
||||
Also **cglm** provides :c:func:`glm_spin` and :c:func:`glm_spinned` functions to rotate around itself. No need to give pivot.
|
||||
These functions are useful for rotating around center of object.
|
||||
@@ -43,7 +43,7 @@ These functions are useful for rotating around center of object.
|
||||
Rotate or Scale around specific Point (Anchor Point)
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
If you want to rotate model around arbibtrary point follow these steps:
|
||||
If you want to rotate model around arbitrary point follow these steps:
|
||||
|
||||
1. Move model from pivot point to origin: **translate(-pivot.x, -pivot.y, -pivot.z)**
|
||||
2. Apply rotation (or scaling maybe)
|
||||
@@ -82,11 +82,11 @@ helpers functions works like this (cglm provides reverse order as `ed` suffix e.
|
||||
.. code-block:: c
|
||||
:linenos:
|
||||
|
||||
TransformMatrix = TransformMatrix * TraslateMatrix; // glm_translate()
|
||||
TransformMatrix = TransformMatrix * TranslateMatrix; // glm_translate()
|
||||
TransformMatrix = TransformMatrix * RotateMatrix; // glm_rotate(), glm_quat_rotate()
|
||||
TransformMatrix = TransformMatrix * ScaleMatrix; // glm_scale()
|
||||
|
||||
As you can see it is multipled as right matrix. For instance what will happen if you call `glm_translate` twice?
|
||||
As you can see it is multiplied as right matrix. For instance what will happen if you call `glm_translate` twice?
|
||||
|
||||
.. code-block:: c
|
||||
:linenos:
|
||||
|
||||
@@ -14,7 +14,7 @@ a matrix for you. You don't need to pass identity matrix.
|
||||
|
||||
But other functions expect you have a matrix and you want to transform them. If
|
||||
you didn't have any existing matrix you have to initialize matrix to identity
|
||||
before sending to transfrom functions.
|
||||
before sending to transform functions.
|
||||
|
||||
Transforms Order
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
@@ -45,7 +45,7 @@ Functions:
|
||||
translate existing 2d transform matrix by *v* vector and stores result in same matrix
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** 2d affine transfrom
|
||||
| *[in, out]* **m** 2d affine transform
|
||||
| *[in]* **v** translate vector [x, y]
|
||||
|
||||
.. c:function:: void glm_translate2d_to(mat3 m, vec2 v, mat3 dest)
|
||||
@@ -53,7 +53,7 @@ Functions:
|
||||
translate existing 2d transform matrix by *v* vector and store result in dest
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** 2d affine transfrom
|
||||
| *[in]* **m** 2d affine transform
|
||||
| *[in]* **v** translate vector [x, y]
|
||||
| *[out]* **dest** translated matrix
|
||||
|
||||
@@ -62,7 +62,7 @@ Functions:
|
||||
translate existing 2d transform matrix by x factor
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** 2d affine transfrom
|
||||
| *[in, out]* **m** 2d affine transform
|
||||
| *[in]* **x** x factor
|
||||
|
||||
.. c:function:: void glm_translate2d_y(mat3 m, float y)
|
||||
@@ -70,7 +70,7 @@ Functions:
|
||||
translate existing 2d transform matrix by y factor
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** 2d affine transfrom
|
||||
| *[in, out]* **m** 2d affine transform
|
||||
| *[in]* **y** y factor
|
||||
|
||||
.. c:function:: void glm_translate2d_make(mat3 m, vec2 v)
|
||||
@@ -78,7 +78,7 @@ Functions:
|
||||
creates NEW translate 2d transform matrix by *v* vector
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** affine transfrom
|
||||
| *[in, out]* **m** affine transform
|
||||
| *[in]* **v** translate vector [x, y]
|
||||
|
||||
.. c:function:: void glm_scale2d_to(mat3 m, vec2 v, mat3 dest)
|
||||
@@ -86,7 +86,7 @@ Functions:
|
||||
scale existing 2d transform matrix by *v* vector and store result in dest
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** affine transfrom
|
||||
| *[in]* **m** affine transform
|
||||
| *[in]* **v** scale vector [x, y]
|
||||
| *[out]* **dest** scaled matrix
|
||||
|
||||
@@ -95,7 +95,7 @@ Functions:
|
||||
creates NEW 2d scale matrix by *v* vector
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** affine transfrom
|
||||
| *[in, out]* **m** affine transform
|
||||
| *[in]* **v** scale vector [x, y]
|
||||
|
||||
.. c:function:: void glm_scale2d(mat3 m, vec2 v)
|
||||
@@ -103,7 +103,7 @@ Functions:
|
||||
scales existing 2d transform matrix by *v* vector and stores result in same matrix
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** affine transfrom
|
||||
| *[in, out]* **m** affine transform
|
||||
| *[in]* **v** translate vector [x, y]
|
||||
|
||||
.. c:function:: void glm_scale2d_uni(mat3 m, float s)
|
||||
@@ -111,7 +111,7 @@ Functions:
|
||||
applies uniform scale to existing 2d transform matrix v = [s, s] and stores result in same matrix
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** affine transfrom
|
||||
| *[in, out]* **m** affine transform
|
||||
| *[in]* **s** scale factor
|
||||
|
||||
.. c:function:: void glm_rotate2d_make(mat3 m, float angle)
|
||||
@@ -119,7 +119,7 @@ Functions:
|
||||
creates NEW rotation matrix by angle around *Z* axis
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** affine transfrom
|
||||
| *[in, out]* **m** affine transform
|
||||
| *[in]* **angle** angle (radians)
|
||||
|
||||
.. c:function:: void glm_rotate2d(mat3 m, float angle)
|
||||
@@ -127,7 +127,7 @@ Functions:
|
||||
rotate existing 2d transform matrix around *Z* axis by angle and store result in same matrix
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** affine transfrom
|
||||
| *[in, out]* **m** affine transform
|
||||
| *[in]* **angle** angle (radians)
|
||||
|
||||
.. c:function:: void glm_rotate2d_to(mat3 m, float angle, mat3 dest)
|
||||
@@ -135,6 +135,6 @@ Functions:
|
||||
rotate existing 2d transform matrix around *Z* axis by angle and store result in dest
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** affine transfrom
|
||||
| *[in]* **m** affine transform
|
||||
| *[in]* **angle** angle (radians)
|
||||
| *[out]* **dest** rotated matrix
|
||||
@@ -9,7 +9,7 @@ In the future there may be option to forward struct api to call api instead of i
|
||||
|
||||
📌 **USE this API docs for similar functions in struct and call api**
|
||||
|
||||
📌 In struct api you can omit namespace e.g :code:`glms_vec3_dot` can be called as :code:`vec3_dot` in struct api, see :doc:`struct-api` to configure struct api for more details.
|
||||
📌 In struct api you can omit namespace e.g :code:`glms_vec3_dot` can be called as :code:`vec3_dot` in struct api, see :doc:`api_struct` to configure struct api for more details.
|
||||
📌 In struct api functions can return struct/union
|
||||
📌 In struct api you can access items like **.x**, **.y**, **.z**, **.w**, **.r**, **.g**, **.b**, **.a**, **.m00**, **m01**...
|
||||
|
||||
@@ -43,6 +43,7 @@ Follow the :doc:`build` documentation for this
|
||||
cam
|
||||
frustum
|
||||
box
|
||||
aabb2d
|
||||
quat
|
||||
euler
|
||||
mat2
|
||||
@@ -65,6 +66,7 @@ Follow the :doc:`build` documentation for this
|
||||
ivec4
|
||||
color
|
||||
plane
|
||||
noise
|
||||
project
|
||||
util
|
||||
io
|
||||
|
||||
@@ -9,8 +9,8 @@ By default struct api adds `s` suffix to every type name e.g. vec3s, mat4s, vers
|
||||
Also struct api `s` suffix to namespace e.g. `glms_vec3_add`, `glms_mat4_mul` etc.
|
||||
|
||||
By starting v0.9.0, struct api namespace is configurable. We can omit **glms_** namespace or
|
||||
even change it with custom name to move existing api integrations to **cglm** more easliy...
|
||||
We can also add **s** to functin names if we want e.g. `glms_vec3_add()` -> `vec3_add()` or `vec3s_add()`.
|
||||
even change it with custom name to move existing api integrations to **cglm** more easily...
|
||||
We can also add **s** to function names if we want e.g. `glms_vec3_add()` -> `vec3_add()` or `vec3s_add()`.
|
||||
|
||||
By including **cglm/struct.h** header you will include all struct api. It will also include **cglm/cglm.h** too.
|
||||
Since struct apis are inline you don't need to build or link *cglm* against
|
||||
@@ -91,6 +91,9 @@ To configure the Struct API namespace, you can define the following macros befor
|
||||
- **CGLM_STRUCT_API_NS**: define name space for struct api, DEFAULT is **glms**
|
||||
- **CGLM_STRUCT_API_NAME_SUFFIX**: define name suffix, DEFAULT is **empty** e.g defining it as #define CGLM_STRUCT_API_NAME_SUFFIX s will add s suffix to mat4_mul -> mat4s_mul
|
||||
|
||||
❗️ IMPORTANT ❗️
|
||||
|
||||
It's a good idea to set up your config macros in build settings like CMake, Xcode, or Visual Studio. This is especially important if you're using features like Modules in Xcode, where adding macros directly before the **cglm** headers might not work.
|
||||
|
||||
Detailed documentation for Struct API:
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
@@ -62,7 +62,7 @@ Functions documentation
|
||||
|
||||
| crops a bounding box with another one.
|
||||
|
||||
this could be useful for gettng a bbox which fits with view frustum and
|
||||
this could be useful for getting a bbox which fits with view frustum and
|
||||
object bounding boxes. In this case you crop view frustum box with objects
|
||||
box
|
||||
|
||||
@@ -75,14 +75,14 @@ Functions documentation
|
||||
|
||||
| crops a bounding box with another one.
|
||||
|
||||
this could be useful for gettng a bbox which fits with view frustum and
|
||||
this could be useful for getting a bbox which fits with view frustum and
|
||||
object bounding boxes. In this case you crop view frustum box with objects
|
||||
box
|
||||
|
||||
Parameters:
|
||||
| *[in]* **box** bounding box
|
||||
| *[in]* **cropBox** crop box
|
||||
| *[in]* **clampBox** miniumum box
|
||||
| *[in]* **clampBox** minimum box
|
||||
| *[out]* **dest** cropped bounding box
|
||||
|
||||
.. c:function:: bool glm_aabb_frustum(vec3 box[2], vec4 planes[6])
|
||||
|
||||
@@ -3,9 +3,9 @@ Build cglm
|
||||
|
||||
| **cglm** does not have any external dependencies.
|
||||
|
||||
**NOTE:**
|
||||
If you only need to inline versions, you don't need to build **cglm**, you don't need to link it to your program.
|
||||
Just import cglm to your project as dependency / external lib by copy-paste then use it as usual
|
||||
.. note::
|
||||
If you only need to inline versions, you don't need to build **cglm**, you don't need to link it to your program.
|
||||
Just import cglm to your project as dependency / external lib by copy-paste then use it as usual
|
||||
|
||||
CMake (All platforms):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
@@ -3,17 +3,17 @@
|
||||
precompiled functions (call)
|
||||
================================================================================
|
||||
|
||||
All funcitons in **glm_** namespace are forced to **inline**.
|
||||
All functions in **glm_** namespace are forced to **inline**.
|
||||
Most functions also have pre-compiled version.
|
||||
|
||||
Precompiled versions are in **glmc_** namespace. *c* in the namespace stands for
|
||||
"call".
|
||||
|
||||
Since precompiled functions are just wrapper for inline verisons,
|
||||
Since precompiled functions are just wrapper for inline versions,
|
||||
these functions are not documented individually.
|
||||
It would be duplicate documentation also it
|
||||
would be hard to sync documentation between inline and call verison for me.
|
||||
would be hard to sync documentation between inline and call version for me.
|
||||
|
||||
By including **clgm/cglm.h** you include all inline verisons. To get precompiled
|
||||
By including **clgm/cglm.h** you include all inline versions. To get precompiled
|
||||
versions you need to include **cglm/call.h** header it also includes all
|
||||
call versions plus *clgm/cglm.h* (inline verisons)
|
||||
call versions plus *clgm/cglm.h* (inline versions)
|
||||
|
||||
@@ -18,10 +18,10 @@ fast if you don't care specific projection values.
|
||||
*_decomp* means decompose; these function can help to decompose projection
|
||||
matrices.
|
||||
|
||||
**NOTE**: Be careful when working with high range (very small near, very large
|
||||
far) projection matrices. You may not get exact value you gave.
|
||||
**float** type cannot store very high precision so you will lose precision.
|
||||
Also your projection matrix will be inaccurate due to losing precision
|
||||
.. note:: Be careful when working with high range (very small near, very large
|
||||
far) projection matrices. You may not get exact value you gave.
|
||||
**float** type cannot store very high precision so you will lose precision.
|
||||
Also your projection matrix will be inaccurate due to losing precision
|
||||
|
||||
Table of contents (click to go):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
@@ -36,8 +36,10 @@ Functions:
|
||||
#. :c:func:`glm_ortho_default`
|
||||
#. :c:func:`glm_ortho_default_s`
|
||||
#. :c:func:`glm_perspective`
|
||||
#. :c:func:`glm_perspective_infinite`
|
||||
#. :c:func:`glm_persp_move_far`
|
||||
#. :c:func:`glm_perspective_default`
|
||||
#. :c:func:`glm_perspective_default_infinite`
|
||||
#. :c:func:`glm_perspective_resize`
|
||||
#. :c:func:`glm_lookat`
|
||||
#. :c:func:`glm_look`
|
||||
@@ -146,6 +148,21 @@ Functions documentation
|
||||
| *[in]* **farVal** far clipping planes
|
||||
| *[out]* **dest** result matrix
|
||||
|
||||
.. c:function:: void glm_perspective_infinite(float fovy, float aspect, float nearZ, mat4 dest)
|
||||
|
||||
| set up perspective projection matrix with infinite far plane
|
||||
|
||||
The far clipping plane is pushed to infinity. This can improve depth
|
||||
precision for distant objects and is required by some rendering techniques
|
||||
such as shadow volumes. Dispatches to the appropriate clipspace variant
|
||||
based on compile-time configuration (LH/RH, NO/ZO).
|
||||
|
||||
Parameters:
|
||||
| *[in]* **fovy** field of view angle (in radians)
|
||||
| *[in]* **aspect** aspect ratio ( width / height )
|
||||
| *[in]* **nearZ** near clipping plane
|
||||
| *[out]* **dest** result matrix
|
||||
|
||||
.. c:function:: void glm_persp_move_far(mat4 proj, float deltaFar)
|
||||
|
||||
| extend perspective projection matrix's far distance
|
||||
@@ -165,6 +182,20 @@ Functions documentation
|
||||
| *[in]* **aspect** aspect aspect ratio ( width / height )
|
||||
| *[out]* **dest** result matrix
|
||||
|
||||
.. c:function:: void glm_perspective_default_infinite(float aspect, mat4 dest)
|
||||
|
||||
| set up infinite perspective projection matrix with default near
|
||||
and angle values
|
||||
|
||||
Equivalent to calling :c:func:`glm_perspective_infinite` with
|
||||
``fovy = GLM_PI_4`` (45°) and ``nearZ = 0.01``. Useful as a
|
||||
quick drop-in when you need an infinite projection without tuning
|
||||
the individual parameters.
|
||||
|
||||
Parameters:
|
||||
| *[in]* **aspect** aspect ratio ( width / height )
|
||||
| *[out]* **dest** result matrix
|
||||
|
||||
.. c:function:: void glm_perspective_resize(float aspect, mat4 proj)
|
||||
|
||||
| resize perspective matrix by aspect ratio ( width / height )
|
||||
@@ -178,7 +209,7 @@ Functions documentation
|
||||
|
||||
| set up view matrix
|
||||
|
||||
**NOTE:** The UP vector must not be parallel to the line of sight from the eye point to the reference point.
|
||||
.. note:: The UP vector must not be parallel to the line of sight from the eye point to the reference point.
|
||||
|
||||
Parameters:
|
||||
| *[in]* **eye** eye vector
|
||||
@@ -194,7 +225,7 @@ Functions documentation
|
||||
target self then this might be useful. Because you need to get target
|
||||
from direction.
|
||||
|
||||
**NOTE:** The UP vector must not be parallel to the line of sight from the eye point to the reference point.
|
||||
.. note:: The UP vector must not be parallel to the line of sight from the eye point to the reference point.
|
||||
|
||||
Parameters:
|
||||
| *[in]* **eye** eye vector
|
||||
@@ -250,7 +281,7 @@ Functions documentation
|
||||
.. c:function:: void glm_persp_decomp_y(mat4 proj, float *top, float *bottom)
|
||||
|
||||
| decomposes top and bottom values of perspective projection.
|
||||
| y stands for y axis (top / botom axis)
|
||||
| y stands for y axis (top / bottom axis)
|
||||
|
||||
Parameters:
|
||||
| *[in]* **proj** perspective projection matrix
|
||||
|
||||
@@ -62,9 +62,9 @@ author = u'Recep Aslantas'
|
||||
# built documents.
|
||||
#
|
||||
# The short X.Y version.
|
||||
version = u'0.9.1'
|
||||
version = u'0.9.6'
|
||||
# The full version, including alpha/beta/rc tags.
|
||||
release = u'0.9.1'
|
||||
release = u'0.9.6'
|
||||
|
||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||
# for a list of supported languages.
|
||||
@@ -91,6 +91,7 @@ todo_include_todos = False
|
||||
# a list of builtin themes.
|
||||
#
|
||||
html_theme = 'sphinx_rtd_theme'
|
||||
pygments_style = 'monokai'
|
||||
|
||||
# Theme options are theme-specific and customize the look and feel of a theme
|
||||
# further. For a list of options available for each theme, see the
|
||||
@@ -111,8 +112,11 @@ html_theme_options = {
|
||||
# Add any paths that contain custom static files (such as style sheets) here,
|
||||
# relative to this directory. They are copied after the builtin static files,
|
||||
# so a file named "default.css" will overwrite the builtin "default.css".
|
||||
# html_static_path = ['_static']
|
||||
html_static_path = ['sphinx-static']
|
||||
|
||||
# Add customm CSS and JS files
|
||||
html_css_files = ['theme_overrides.css']
|
||||
html_js_files = []
|
||||
|
||||
# -- Options for HTMLHelp output ------------------------------------------
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ Features
|
||||
================================================================================
|
||||
|
||||
* **scalar** and **simd** (sse, avx, neon, wasm...) optimizations
|
||||
* option to use different clipspaces e.g. Left Handed, Zero-to-One... (currrently right handed negative-one is default)
|
||||
* option to use different clipspaces e.g. Left Handed, Zero-to-One... (currently right handed negative-one is default)
|
||||
* array api and struct api, you can use arrays or structs.
|
||||
* general purpose matrix operations (mat4, mat3)
|
||||
* chain matrix multiplication (square only)
|
||||
@@ -18,6 +18,7 @@ Features
|
||||
* inline or pre-compiled function call
|
||||
* frustum (extract view frustum planes, corners...)
|
||||
* bounding box (AABB in Frustum (culling), crop, merge...)
|
||||
* 2d bounding box (crop, merge...)
|
||||
* bounding sphere
|
||||
* project, unproject
|
||||
* easing functions
|
||||
|
||||
@@ -11,9 +11,9 @@ not **vec3**. If you want to store them to save space you msut convert them
|
||||
yourself.
|
||||
|
||||
**vec4** is used to speed up functions need to corners. This is why frustum
|
||||
fucntions use *vec4* instead of *vec3*
|
||||
functions use *vec4* instead of *vec3*
|
||||
|
||||
Currenty related-functions use [-1, 1] clip space configuration to extract
|
||||
Currently related-functions use [-1, 1] clip space configuration to extract
|
||||
corners but you can override it by prodiving **GLM_CUSTOM_CLIPSPACE** macro.
|
||||
If you provide it then you have to all bottom macros as *vec4*
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@ Types:
|
||||
typedef CGLM_ALIGN_IF(16) vec4 mat4[4];
|
||||
#endif
|
||||
|
||||
As you can see types don't store extra informations in favor of space.
|
||||
As you can see types don't store extra information in favor of space.
|
||||
You can send these values e.g. matrix to OpenGL directly without casting or calling a function like *value_ptr*
|
||||
|
||||
Alignment Is Required:
|
||||
@@ -35,16 +35,16 @@ Alignment Is Required:
|
||||
|
||||
| Check :doc:`opt` page for more details
|
||||
|
||||
Also alignment is disabled for older msvc verisons as default. Now alignment is only required in Visual Studio 2017 version 15.6+ if CGLM_ALL_UNALIGNED macro is not defined.
|
||||
Also alignment is disabled for older msvc versions as default. Now alignment is only required in Visual Studio 2017 version 15.6+ if CGLM_ALL_UNALIGNED macro is not defined.
|
||||
|
||||
Allocations:
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
*cglm* doesn't alloc any memory on heap. So it doesn't provide any allocator.
|
||||
You must allocate memory yourself. You should alloc memory for out parameters too if you pass pointer of memory location. When allocating memory, don't forget that **vec4** and **mat4** require alignment.
|
||||
|
||||
**NOTE:** Unaligned **vec4** and unaligned **mat4** operations will be supported in the future. Check todo list.
|
||||
Because you may want to multiply a CGLM matrix with external matrix.
|
||||
There is no guarantee that non-CGLM matrix is aligned. Unaligned types will have *u* prefix e.g. **umat4**
|
||||
.. note:: Unaligned **vec4** and unaligned **mat4** operations will be supported in the future. Check todo list.
|
||||
Because you may want to multiply a CGLM matrix with external matrix.
|
||||
There is no guarantee that non-CGLM matrix is aligned. Unaligned types will have *u* prefix e.g. **umat4**
|
||||
|
||||
Array vs Struct:
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
@@ -24,12 +24,12 @@ Example to print mat4 matrix:
|
||||
/* ... */
|
||||
glm_mat4_print(transform, stderr);
|
||||
|
||||
**NOTE:** print functions use **%0.4f** precision if you need more
|
||||
(you probably will in some cases), you can change it temporary.
|
||||
cglm may provide precision parameter in the future
|
||||
.. note:: print functions use **%0.4f** precision if you need more
|
||||
(you probably will in some cases), you can change it temporary.
|
||||
cglm may provide precision parameter in the future.
|
||||
|
||||
Changes since **v0.7.3**:
|
||||
* Now mis-alignment of columns are fixed: larger numbers are printed via %g and others are printed via %f. Column withs are calculated before print.
|
||||
* Now mis-alignment of columns are fixed: larger numbers are printed via %g and others are printed via %f. Column widths are calculated before print.
|
||||
* Now values are colorful ;)
|
||||
* Some print improvements
|
||||
* New options with default values:
|
||||
@@ -53,8 +53,11 @@ Functions:
|
||||
1. :c:func:`glm_mat4_print`
|
||||
#. :c:func:`glm_mat3_print`
|
||||
#. :c:func:`glm_vec4_print`
|
||||
#. :c:func:`glm_ivec4_print`
|
||||
#. :c:func:`glm_vec3_print`
|
||||
#. :c:func:`glm_ivec3_print`
|
||||
#. :c:func:`glm_vec2_print`
|
||||
#. :c:func:`glm_ivec2_print`
|
||||
#. :c:func:`glm_versor_print`
|
||||
#. :c:func:`glm_aabb_print`
|
||||
|
||||
@@ -63,7 +66,7 @@ Functions documentation
|
||||
|
||||
.. c:function:: void glm_mat4_print(mat4 matrix, FILE * __restrict ostream)
|
||||
|
||||
| print mat4 to given stream
|
||||
| print matrix to given stream
|
||||
|
||||
Parameters:
|
||||
| *[in]* **matrix** matrix
|
||||
@@ -71,7 +74,7 @@ Functions documentation
|
||||
|
||||
.. c:function:: void glm_mat3_print(mat3 matrix, FILE * __restrict ostream)
|
||||
|
||||
| print mat3 to given stream
|
||||
| print matrix to given stream
|
||||
|
||||
Parameters:
|
||||
| *[in]* **matrix** matrix
|
||||
@@ -79,7 +82,15 @@ Functions documentation
|
||||
|
||||
.. c:function:: void glm_vec4_print(vec4 vec, FILE * __restrict ostream)
|
||||
|
||||
| print vec4 to given stream
|
||||
| print vector to given stream
|
||||
|
||||
Parameters:
|
||||
| *[in]* **vec** vector
|
||||
| *[in]* **ostream** FILE to write
|
||||
|
||||
.. c:function:: void glm_ivec4_print(ivec4 vec, FILE * __restrict ostream)
|
||||
|
||||
| print vector to given stream
|
||||
|
||||
Parameters:
|
||||
| *[in]* **vec** vector
|
||||
@@ -87,7 +98,7 @@ Functions documentation
|
||||
|
||||
.. c:function:: void glm_vec3_print(vec3 vec, FILE * __restrict ostream)
|
||||
|
||||
| print vec3 to given stream
|
||||
| print vector to given stream
|
||||
|
||||
Parameters:
|
||||
| *[in]* **vec** vector
|
||||
@@ -95,12 +106,29 @@ Functions documentation
|
||||
|
||||
.. c:function:: void glm_ivec3_print(ivec3 vec, FILE * __restrict ostream)
|
||||
|
||||
| print ivec3 to given stream
|
||||
| print vector to given stream
|
||||
|
||||
Parameters:
|
||||
| *[in]* **vec** vector
|
||||
| *[in]* **ostream** FILE to write
|
||||
|
||||
.. c:function:: void glm_vec2_print(vec2 vec, FILE * __restrict ostream)
|
||||
|
||||
| print vector to given stream
|
||||
|
||||
Parameters:
|
||||
| *[in]* **vec** vector
|
||||
| *[in]* **ostream** FILE to write
|
||||
|
||||
.. c:function:: void glm_ivec2_print(ivec2 vec, FILE * __restrict ostream)
|
||||
|
||||
| print vector to given stream
|
||||
|
||||
Parameters:
|
||||
| *[in]* **vec** vector
|
||||
| *[in]* **ostream** FILE to write
|
||||
|
||||
|
||||
.. c:function:: void glm_versor_print(versor vec, FILE * __restrict ostream)
|
||||
|
||||
| print quaternion to given stream
|
||||
@@ -115,5 +143,5 @@ Functions documentation
|
||||
|
||||
Parameters:
|
||||
| *[in]* **vec** aabb (axis-aligned bounding box)
|
||||
| *[in]* **tag** tag to find it more easly in logs
|
||||
| *[in]* **tag** tag to find it more easily in logs
|
||||
| *[in]* **ostream** FILE to write
|
||||
|
||||
@@ -21,12 +21,17 @@ Functions:
|
||||
#. :c:func:`glm_ivec2_copy`
|
||||
#. :c:func:`glm_ivec2_zero`
|
||||
#. :c:func:`glm_ivec2_one`
|
||||
#. :c:func:`glm_ivec2_dot`
|
||||
#. :c:func:`glm_ivec2_cross`
|
||||
#. :c:func:`glm_ivec2_add`
|
||||
#. :c:func:`glm_ivec2_adds`
|
||||
#. :c:func:`glm_ivec2_sub`
|
||||
#. :c:func:`glm_ivec2_subs`
|
||||
#. :c:func:`glm_ivec2_mul`
|
||||
#. :c:func:`glm_ivec2_scale`
|
||||
#. :c:func:`glm_ivec2_div`
|
||||
#. :c:func:`glm_ivec2_divs`
|
||||
#. :c:func:`glm_ivec2_mod`
|
||||
#. :c:func:`glm_ivec2_distance2`
|
||||
#. :c:func:`glm_ivec2_distance`
|
||||
#. :c:func:`glm_ivec2_maxv`
|
||||
@@ -67,6 +72,30 @@ Functions documentation
|
||||
Parameters:
|
||||
| *[out]* **v** vector
|
||||
|
||||
.. c:function:: int glm_ivec2_dot(ivec2 a, ivec2 b)
|
||||
|
||||
dot product of ivec2
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** vector1
|
||||
| *[in]* **b** vector2
|
||||
|
||||
Returns:
|
||||
dot product
|
||||
|
||||
.. c:function:: int glm_ivec2_cross(ivec2 a, ivec2 b)
|
||||
|
||||
cross product of two vector (RH)
|
||||
|
||||
| ref: http://allenchou.net/2013/07/cross-product-of-2d-vectors/
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** vector 1
|
||||
| *[in]* **b** vector 2
|
||||
|
||||
Returns:
|
||||
Z component of cross product
|
||||
|
||||
.. c:function:: void glm_ivec2_add(ivec2 a, ivec2 b, ivec2 dest)
|
||||
|
||||
add vector [a] to vector [b] and store result in [dest]
|
||||
@@ -121,6 +150,33 @@ Functions documentation
|
||||
| *[in]* **s** scalar
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_ivec2_div(ivec2 a, ivec2 b, ivec2 dest)
|
||||
|
||||
div vector with another component-wise division: d = a / b
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** vector 1
|
||||
| *[in]* **b** vector 2
|
||||
| *[out]* **dest** result = (a[0] / b[0], a[1] / b[1], a[2] / b[2])
|
||||
|
||||
.. c:function:: void glm_ivec2_divs(ivec2 v, int s, ivec2 dest)
|
||||
|
||||
div vector with scalar: d = v / s
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[in]* **s** scalar
|
||||
| *[out]* **dest** result = (a[0] / s, a[1] / s, a[2] / s)
|
||||
|
||||
.. c:function:: void glm_ivec2_mod(ivec2 a, ivec2 b, ivec2 dest)
|
||||
|
||||
mod vector with another component-wise modulo: d = a % b
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** vector
|
||||
| *[in]* **b** scalar
|
||||
| *[out]* **dest** result = (a[0] % b[0], a[1] % b[1])
|
||||
|
||||
.. c:function:: int glm_ivec2_distance2(ivec2 a, ivec2 b)
|
||||
|
||||
squared distance between two vectors
|
||||
@@ -143,6 +199,31 @@ Functions documentation
|
||||
Returns:
|
||||
distance
|
||||
|
||||
.. c:function:: void glm_ivec2_fill(ivec2 v, int val)
|
||||
|
||||
fill a vector with specified value
|
||||
|
||||
Parameters:
|
||||
| *[out]* **v** vector
|
||||
| *[in]* **val** value
|
||||
|
||||
.. c:function:: bool glm_ivec2_eq(ivec2 v, int val)
|
||||
|
||||
check if vector is equal to value
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[in]* **val** value
|
||||
|
||||
.. c:function:: bool glm_ivec2_eqv(ivec2 v1, ivec2 v2)
|
||||
|
||||
check if vector is equal to another vector
|
||||
|
||||
Parameters:
|
||||
| *[in]* **vec** vector 1
|
||||
| *[in]* **vec** vector 2
|
||||
|
||||
|
||||
.. c:function:: void glm_ivec2_maxv(ivec2 a, ivec2 b, ivec2 dest)
|
||||
|
||||
set each member of dest to greater of vector a and b
|
||||
|
||||
@@ -21,14 +21,23 @@ Functions:
|
||||
#. :c:func:`glm_ivec3_copy`
|
||||
#. :c:func:`glm_ivec3_zero`
|
||||
#. :c:func:`glm_ivec3_one`
|
||||
#. :c:func:`glm_ivec3_dot`
|
||||
#. :c:func:`glm_ivec3_norm2`
|
||||
#. :c:func:`glm_ivec3_norm`
|
||||
#. :c:func:`glm_ivec3_add`
|
||||
#. :c:func:`glm_ivec3_adds`
|
||||
#. :c:func:`glm_ivec3_sub`
|
||||
#. :c:func:`glm_ivec3_subs`
|
||||
#. :c:func:`glm_ivec3_mul`
|
||||
#. :c:func:`glm_ivec3_scale`
|
||||
#. :c:func:`glm_ivec3_div`
|
||||
#. :c:func:`glm_ivec3_divs`
|
||||
#. :c:func:`glm_ivec3_mod`
|
||||
#. :c:func:`glm_ivec3_distance2`
|
||||
#. :c:func:`glm_ivec3_distance`
|
||||
#. :c:func:`glm_ivec3_fill`
|
||||
#. :c:func:`glm_ivec3_eq`
|
||||
#. :c:func:`glm_ivec3_eqv`
|
||||
#. :c:func:`glm_ivec3_maxv`
|
||||
#. :c:func:`glm_ivec3_minv`
|
||||
#. :c:func:`glm_ivec3_clamp`
|
||||
@@ -67,6 +76,39 @@ Functions documentation
|
||||
Parameters:
|
||||
| *[out]* **v** vector
|
||||
|
||||
.. c:function:: int glm_ivec3_dot(ivec3 a, ivec3 b)
|
||||
|
||||
dot product of ivec3
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** vector1
|
||||
| *[in]* **b** vector2
|
||||
|
||||
Returns:
|
||||
dot product
|
||||
|
||||
.. c:function:: int glm_ivec3_norm2(ivec3 v)
|
||||
|
||||
norm * norm (magnitude) of vector
|
||||
|
||||
we can use this func instead of calling norm * norm, because it would call
|
||||
sqrtf function twice but with this func we can avoid func call, maybe this is
|
||||
not good name for this func
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
|
||||
Returns:
|
||||
square of norm / magnitude, cast to an integer
|
||||
|
||||
.. c:function:: int glm_ivec3_norm(ivec3 vec)
|
||||
|
||||
| euclidean norm (magnitude), also called L2 norm
|
||||
| this will give magnitude of vector in euclidean space
|
||||
|
||||
Parameters:
|
||||
| *[in]* **vec** vector
|
||||
|
||||
.. c:function:: void glm_ivec3_add(ivec3 a, ivec3 b, ivec3 dest)
|
||||
|
||||
add vector [a] to vector [b] and store result in [dest]
|
||||
@@ -121,6 +163,33 @@ Functions documentation
|
||||
| *[in]* **s** scalar
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_ivec3_div(ivec3 a, ivec3 b, ivec3 dest)
|
||||
|
||||
div vector with another component-wise division: d = a / b
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** vector 1
|
||||
| *[in]* **b** vector 2
|
||||
| *[out]* **dest** result = (a[0] / b[0], a[1] / b[1], a[2] / b[2])
|
||||
|
||||
.. c:function:: void glm_ivec3_divs(ivec3 v, int s, ivec3 dest)
|
||||
|
||||
div vector with scalar: d = v / s
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[in]* **s** scalar
|
||||
| *[out]* **dest** result = (a[0] / s, a[1] / s, a[2] / s)
|
||||
|
||||
.. c:function:: void glm_ivec3_mod(ivec3 a, ivec3 b, ivec3 dest)
|
||||
|
||||
mod vector with another component-wise modulo: d = a % b
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** vector
|
||||
| *[in]* **b** scalar
|
||||
| *[out]* **dest** result = (a[0] % b[0], a[1] % b[1], a[2] % b[2])
|
||||
|
||||
.. c:function:: int glm_ivec3_distance2(ivec3 a, ivec3 b)
|
||||
|
||||
squared distance between two vectors
|
||||
@@ -143,6 +212,30 @@ Functions documentation
|
||||
Returns:
|
||||
distance
|
||||
|
||||
.. c:function:: void glm_ivec3_fill(ivec3 v, int val)
|
||||
|
||||
fill a vector with specified value
|
||||
|
||||
Parameters:
|
||||
| *[out]* **v** vector
|
||||
| *[in]* **val** value
|
||||
|
||||
.. c:function:: bool glm_ivec3_eq(ivec3 v, int val)
|
||||
|
||||
check if vector is equal to value
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[in]* **val** value
|
||||
|
||||
.. c:function:: bool glm_ivec3_eqv(ivec3 v1, ivec3 v2)
|
||||
|
||||
check if vector is equal to another vector
|
||||
|
||||
Parameters:
|
||||
| *[in]* **vec** vector 1
|
||||
| *[in]* **vec** vector 2
|
||||
|
||||
.. c:function:: void glm_ivec3_maxv(ivec3 a, ivec3 b, ivec3 dest)
|
||||
|
||||
set each member of dest to greater of vector a and b
|
||||
|
||||
@@ -10,182 +10,862 @@ Table of contents (click to go):
|
||||
|
||||
Macros:
|
||||
|
||||
1. GLM_mat2_IDENTITY_INIT
|
||||
#. GLM_mat2_ZERO_INIT
|
||||
#. GLM_mat2_IDENTITY
|
||||
#. GLM_mat2_ZERO
|
||||
1. GLM_MAT2_IDENTITY_INIT
|
||||
#. GLM_MAT2_ZERO_INIT
|
||||
#. GLM_MAT2_IDENTITY
|
||||
#. GLM_MAT2_ZERO
|
||||
|
||||
Functions:
|
||||
|
||||
1. :c:func:`glm_mat2_copy`
|
||||
1. :c:func:`glm_mat2_make`
|
||||
#. :c:func:`glm_mat2_copy`
|
||||
#. :c:func:`glm_mat2_identity`
|
||||
#. :c:func:`glm_mat2_identity_array`
|
||||
#. :c:func:`glm_mat2_zero`
|
||||
#. :c:func:`glm_mat2_mul`
|
||||
#. :c:func:`glm_mat2_mulv`
|
||||
#. :c:func:`glm_mat2_transpose_to`
|
||||
#. :c:func:`glm_mat2_transpose`
|
||||
#. :c:func:`glm_mat2_mulv`
|
||||
#. :c:func:`glm_mat2_scale`
|
||||
#. :c:func:`glm_mat2_det`
|
||||
#. :c:func:`glm_mat2_inv`
|
||||
#. :c:func:`glm_mat2_trace`
|
||||
#. :c:func:`glm_mat2_swap_col`
|
||||
#. :c:func:`glm_mat2_swap_row`
|
||||
#. :c:func:`glm_mat2_det`
|
||||
#. :c:func:`glm_mat2_trace`
|
||||
#. :c:func:`glm_mat2_rmc`
|
||||
#. :c:func:`glm_mat2_make`
|
||||
|
||||
Represented
|
||||
~~~~~~~~~~~
|
||||
|
||||
.. csv-table:: mat2x2
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "m00", "m10"
|
||||
"row 2", "m01", "m11"
|
||||
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. c:function:: void glm_mat2_copy(mat2 mat, mat2 dest)
|
||||
.. c:function:: void glm_mat2_make(const float * __restrict src, mat2 dest)
|
||||
|
||||
copy mat2 to another one (dest).
|
||||
Create mat2 (dest) from pointer (src).
|
||||
|
||||
.. note:: **@src** must contain at least 4 elements.
|
||||
|
||||
Parameters:
|
||||
| *[in]* **mat** source
|
||||
| *[out]* **dest** destination
|
||||
| *[in]* **src** pointer to an array of floats (left)
|
||||
| *[out]* **dest** destination (result, mat2)
|
||||
|
||||
.. c:function:: void glm_mat2_identity(mat2 mat)
|
||||
.. note:: Mathematical explanation
|
||||
|
||||
copy identity mat2 to mat, or makes mat to identiy
|
||||
.. csv-table:: float array (1x4) **(src)**
|
||||
:header: "", "column 1"
|
||||
|
||||
Parameters:
|
||||
| *[out]* **mat** matrix
|
||||
"row 1", "v0"
|
||||
"row 2", "v1"
|
||||
"row 3", "v2"
|
||||
"row 4", "v3"
|
||||
|
||||
.. c:function:: void glm_mat2_identity_array(mat2 * __restrict mat, size_t count)
|
||||
.. csv-table:: mat2 **(dest)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
make given matrix array's each element identity matrix
|
||||
"row 1", "v0", "v2"
|
||||
"row 2", "v1", "v3"
|
||||
|
||||
Parameters:
|
||||
| *[in,out]* **mat** matrix array (must be aligned (16/32) if alignment is not disabled)
|
||||
| *[in]* **count** count of matrices
|
||||
|
||||
.. c:function:: void glm_mat2_zero(mat2 mat)
|
||||
|
||||
make given matrix zero
|
||||
|
||||
Parameters:
|
||||
| *[in,out]* **mat** matrix
|
||||
|
||||
.. c:function:: void glm_mat2_mul(mat2 m1, mat2 m2, mat2 dest)
|
||||
|
||||
multiply m1 and m2 to dest
|
||||
|
||||
m1, m2 and dest matrices can be same matrix, it is possible to write this:
|
||||
.. note:: Example
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
mat2 m = GLM_mat2_IDENTITY_INIT;
|
||||
mat2 dest = GLM_MAT2_ZERO_INIT;
|
||||
float src[4] = { 1.00, 5.00, 8.00, 11.00 };
|
||||
glm_mat2_make(src, dest);
|
||||
|
||||
.. csv-table:: float array (1x4) **(src)**
|
||||
:header: "", "column 1"
|
||||
|
||||
"row 1", "1.00"
|
||||
"row 2", "5.00"
|
||||
"row 3", "8.00"
|
||||
"row 4", "11.00"
|
||||
|
||||
.. csv-table:: mat2 **(dest)** Before
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "0.00", "0.00"
|
||||
"row 2", "0.00", "0.00"
|
||||
|
||||
.. csv-table:: mat2 **(dest)** After
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "1.00", "8.00"
|
||||
"row 2", "5.00", "11.00"
|
||||
|
||||
.. c:function:: void glm_mat2_copy(mat2 mat, mat2 dest)
|
||||
|
||||
Copy mat2 (mat) to mat2 (dest).
|
||||
|
||||
Parameters:
|
||||
| *[in]* **mat** mat2 (left,src)
|
||||
| *[out]* **dest** destination (result, mat2)
|
||||
|
||||
.. note:: Mathematical explanation
|
||||
|
||||
.. csv-table:: mat2 **(mat)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "m00", "m10"
|
||||
"row 2", "m01", "m11"
|
||||
|
||||
.. csv-table:: mat2 **(dest)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "m00", "m10"
|
||||
"row 2", "m01", "m11"
|
||||
|
||||
.. note:: Example
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
mat2 mat = {{3.00,4.00},{7.00,8.00}};
|
||||
mat2 dest = GLM_MAT2_ZERO_INIT;
|
||||
glm_mat2_copy(mat, dest);
|
||||
|
||||
.. csv-table:: mat2 **(mat)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "3.00", "7.00"
|
||||
"row 2", "4.00", "8.00"
|
||||
|
||||
.. csv-table:: mat2 **(dest)** Before
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "0.00", "0.00"
|
||||
"row 2", "0.00", "0.00"
|
||||
|
||||
.. csv-table:: mat2 **(dest)** After
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "3.00", "7.00"
|
||||
"row 2", "4.00", "8.00"
|
||||
|
||||
.. c:function:: void glm_mat2_identity(mat2 m)
|
||||
|
||||
| Copy a mat2 identity to mat2 **(m)**, or makes mat2 **(m)** an identity.
|
||||
|
|
||||
| The same thing may be achieved with either of bellow methods,
|
||||
| but it is more easy to do that with this func especially for members
|
||||
| e.g. ``glm_mat2_identity(aStruct->aMatrix);``.
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
glm_mat2_copy(GLM_MAT2_IDENTITY, m);
|
||||
|
||||
// or
|
||||
mat2 mat = GLM_MAT2_IDENTITY_INIT;
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** mat2 (src, dest)
|
||||
|
||||
.. note:: Mathematical explanation
|
||||
|
||||
.. csv-table:: mat2 **(m)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "m00", "m10"
|
||||
"row 2", "m01", "m11"
|
||||
|
||||
.. csv-table:: mat2 **(m)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "1.00", "0.00"
|
||||
"row 2", "0.00", "1.00"
|
||||
|
||||
.. note:: Example
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
mat2 m = {{3.00,4.00},{7.00,8.00}};
|
||||
glm_mat2_identity(m);
|
||||
|
||||
.. csv-table:: mat2 **(m)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "3.00", "7.00"
|
||||
"row 2", "4.00", "8.00"
|
||||
|
||||
.. csv-table:: mat2 **(m)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "1.00", "0.00"
|
||||
"row 2", "0.00", "1.00"
|
||||
|
||||
.. c:function:: void glm_mat2_identity_array(mat2 * __restrict mats, size_t count)
|
||||
|
||||
Given an array of mat2's **(mats)** make each matrix an identity matrix.
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **mats** Array of mat2's (must be aligned (16/32) if alignment is not disabled)
|
||||
| *[in]* **count** Array size of ``mats`` or number of matrices
|
||||
|
||||
.. note:: Mathematical explanation
|
||||
|
||||
.. csv-table:: mat2 **(mats[index])**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "m00", "m10"
|
||||
"row 2", "m01", "m11"
|
||||
|
||||
.. csv-table:: mat2 **(mats[index])**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "1.00", "0.00"
|
||||
"row 2", "0.00", "1.00"
|
||||
|
||||
.. note:: Example
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
size_t count = 3;
|
||||
|
||||
mat2 matrices[count] = {
|
||||
{{1.00,2.00},{5.00,6.00}},
|
||||
{{3.00,4.00},{7.00,8.00}},
|
||||
{{5.00,6.00},{9.00,10.00}},
|
||||
};
|
||||
|
||||
glm_mat2_identity_array(matrices, count);
|
||||
|
||||
.. csv-table:: mat2 **(mats[0])** Before
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "1.00", "5.00"
|
||||
"row 2", "2.00", "6.00"
|
||||
|
||||
.. csv-table:: mat2 **(mats[0])** After
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "1.00", "0.00"
|
||||
"row 2", "0.00", "1.00"
|
||||
|
||||
.. csv-table:: mat2 **(mats[1])** Before
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "3.00", "7.00"
|
||||
"row 2", "4.00", "8.00"
|
||||
|
||||
.. csv-table:: mat2 **(mats[1])** After
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "1.00", "0.00"
|
||||
"row 2", "0.00", "1.00"
|
||||
|
||||
.. csv-table:: mat2 **(mats[2])** Before
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "5.00", "9.00"
|
||||
"row 2", "6.00", "10.00"
|
||||
|
||||
.. csv-table:: mat2 **(mats[2])** After
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "1.00", "0.00"
|
||||
"row 2", "0.00", "1.00"
|
||||
|
||||
.. c:function:: void glm_mat2_zero(mat2 m)
|
||||
|
||||
Zero out the mat2 (m).
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** mat2 (src, dest)
|
||||
|
||||
.. note:: Mathematical explanation
|
||||
|
||||
.. csv-table:: mat2 **(m)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "m00", "m10"
|
||||
"row 2", "m01", "m11"
|
||||
|
||||
.. csv-table:: mat2 **(m)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "0.00", "0.00"
|
||||
"row 2", "0.00", "0.00"
|
||||
|
||||
.. note:: Example
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
mat2 m = {{19.00,5.00},{2.00,4.00}};
|
||||
glm_mat2_zero(m);
|
||||
|
||||
.. csv-table:: mat2 **(m)** Before
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "19.00", "2.00"
|
||||
"row 2", "5.00", "4.00"
|
||||
|
||||
.. csv-table:: mat2 **(m)** After
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "0.00", "0.00"
|
||||
"row 2", "0.00", "0.00"
|
||||
|
||||
.. c:function:: void glm_mat2_mul(mat2 m1, mat2 m2, mat2 dest)
|
||||
|
||||
| Multiply mat2 (m1) by mat2 (m2) and store in mat2 (dest).
|
||||
|
|
||||
| m1, m2 and dest matrices can be same matrix, it is possible to write this:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
mat2 m = GLM_MAT2_IDENTITY_INIT;
|
||||
glm_mat2_mul(m, m, m);
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m1** left matrix
|
||||
| *[in]* **m2** right matrix
|
||||
| *[out]* **dest** destination matrix
|
||||
| *[in]* **m1** mat2 (left)
|
||||
| *[in]* **m2** mat2 (right)
|
||||
| *[out]* **dest** destination (result, mat2)
|
||||
|
||||
.. c:function:: void glm_mat2_transpose_to(mat2 m, mat2 dest)
|
||||
.. note:: Mathematical explanation
|
||||
|
||||
transpose mat4 and store in dest
|
||||
source matrix will not be transposed unless dest is m
|
||||
.. csv-table:: mat2 **(m1)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
Parameters:
|
||||
| *[in]* **mat** source
|
||||
| *[out]* **dest** destination
|
||||
"row 1", "a00", "a10"
|
||||
"row 2", "a01", "a11"
|
||||
|
||||
.. c:function:: void glm_mat2_transpose(mat2 m)
|
||||
.. csv-table:: mat2 **(m2)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
tranpose mat2 and store result in same matrix
|
||||
"row 1", "b00", "b10"
|
||||
"row 2", "b01", "b11"
|
||||
|
||||
Parameters:
|
||||
| *[in]* **mat** source
|
||||
| *[out]* **dest** destination
|
||||
.. csv-table:: mat2 **(dest)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "a00 * b00 + a10 * b01", "a00 * b10 + a10 * b11"
|
||||
"row 2", "a01 * b00 + a11 * b01", "a01 * b10 + a11 * b11"
|
||||
|
||||
.. note:: Example
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
mat2 m = {{19.00,5.00},{2.00,4.00}};
|
||||
glm_mat2_mul(m, m, m);
|
||||
|
||||
.. csv-table:: mat2 **(m1)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "19.00", "2.00"
|
||||
"row 2", "5.00", "4.00"
|
||||
|
||||
.. csv-table:: mat2 **(m2)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "19.00", "2.00"
|
||||
"row 2", "5.00", "4.00"
|
||||
|
||||
.. csv-table:: mat2 **(dest)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "**371.00** = 19.00 * 19.00 + 2.00 * 5.00", "**46.00** = 19.00 * 2.00 + 2.00 * 4.00"
|
||||
"row 2", "**115.00** = 5.00 * 19.00 + 4.00 * 5.00", "**18.00** = 5.00 * 2.00 + 4.00 * 4.00"
|
||||
|
||||
.. c:function:: void glm_mat2_mulv(mat2 m, vec2 v, vec2 dest)
|
||||
|
||||
multiply mat2 with vec2 (column vector) and store in dest vector
|
||||
Multiply mat2 (m) by vec2 (v) and store in vec2 (dest).
|
||||
|
||||
Parameters:
|
||||
| *[in]* **mat** mat2 (left)
|
||||
| *[in]* **v** vec2 (right, column vector)
|
||||
| *[out]* **dest** destination (result, column vector)
|
||||
| *[in]* **m** mat2 (left)
|
||||
| *[in]* **v** vec2 (right, column vector)
|
||||
| *[out]* **dest** destination (result, column vector)
|
||||
|
||||
.. c:function:: void glm_mat2_scale(mat2 m, float s)
|
||||
.. note:: Mathematical explanation
|
||||
|
||||
multiply matrix with scalar
|
||||
.. csv-table:: mat2 **(m)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "m00", "m10"
|
||||
"row 2", "m01", "m11"
|
||||
|
||||
.. csv-table:: column vec2 (1x2) **(v)**
|
||||
:header: "", "column 1"
|
||||
|
||||
"row 1", "v0"
|
||||
"row 2", "v1"
|
||||
|
||||
.. csv-table:: column vec2 (1x2) **(dest)**
|
||||
:header: "", "column 1"
|
||||
|
||||
"row 1", "m00 * v0 + m10 * v1"
|
||||
"row 2", "m01 * v0 + m11 * v1"
|
||||
|
||||
.. note:: Example
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
vec2 dest;
|
||||
vec2 v = {33.00,55.00};
|
||||
mat2 m = {{1.00,2.00},{3.00,4.00}};
|
||||
glm_mat2_mulv(m, v, dest);
|
||||
|
||||
.. csv-table:: mat2 **(m)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "1.00", "3.00"
|
||||
"row 2", "2.00", "4.00"
|
||||
|
||||
.. csv-table:: column vec2 **(v)**
|
||||
:header: "", "column 1"
|
||||
|
||||
"row 1", "33.00"
|
||||
"row 2", "55.00"
|
||||
|
||||
.. csv-table:: vec2 **(dest)** Result
|
||||
:header: "", "column 1"
|
||||
|
||||
"row 1", "**198.00** = 1.00 * 33.00 + 3.00 * 55.00"
|
||||
"row 2", "**286.00** = 2.00 * 33.00 + 4.00 * 55.00"
|
||||
|
||||
.. c:function:: void glm_mat2_transpose_to(mat2 mat, mat2 dest)
|
||||
|
||||
Transpose mat2 (mat) and store in mat2 (dest).
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** matrix
|
||||
| *[in]* **s** scalar
|
||||
| *[in]* **mat** mat2 (left,src)
|
||||
| *[out]* **dest** destination (result, mat2)
|
||||
|
||||
.. c:function:: float glm_mat2_det(mat2 mat)
|
||||
.. note:: Mathematical explanation
|
||||
|
||||
returns mat2 determinant
|
||||
.. csv-table:: mat2 **(mat)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "m00", "m10"
|
||||
"row 2", "m01", "m11"
|
||||
|
||||
.. csv-table:: mat2 **(dest)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "m00", "m01"
|
||||
"row 2", "m10", "m11"
|
||||
|
||||
.. note:: Example
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
mat2 mat = {{1.00,2.00},{3.00,4.00}};
|
||||
mat2 dest = GLM_MAT2_ZERO_INIT;
|
||||
glm_mat2_transpose_to(mat, dest);
|
||||
|
||||
.. csv-table:: mat2 **(mat)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "1.00", "3.00"
|
||||
"row 2", "2.00", "4.00"
|
||||
|
||||
.. csv-table:: mat2 **(dest)** Before
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "0.00", "0.00"
|
||||
"row 2", "0.00", "0.00"
|
||||
|
||||
.. csv-table:: mat2 **(dest)** After
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "1.00", "2.00"
|
||||
"row 2", "3.00", "4.00"
|
||||
|
||||
.. c:function:: void glm_mat2_transpose(mat2 m)
|
||||
|
||||
Transpose mat2 (m) and store result in the same matrix.
|
||||
|
||||
Parameters:
|
||||
| *[in]* **mat** matrix
|
||||
| *[in, out]* **m** mat2 (src, dest)
|
||||
|
||||
Returns:
|
||||
mat2 determinant
|
||||
.. note:: Mathematical explanation
|
||||
|
||||
.. csv-table:: mat2 **(m)** src
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "m00", "m10"
|
||||
"row 2", "m01", "m11"
|
||||
|
||||
.. csv-table:: mat2 **(m)** dest
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "m00", "m01"
|
||||
"row 2", "m10", "m11"
|
||||
|
||||
.. note:: Example
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
mat2 m = {{1.00,2.00},{3.00,4.00}};
|
||||
glm_mat2_transpose(m);
|
||||
|
||||
.. csv-table:: mat2 **(m)** Before
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "1.00", "3.00"
|
||||
"row 2", "2.00", "4.00"
|
||||
|
||||
.. csv-table:: mat2 **(m)** After
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "1.00", "2.00"
|
||||
"row 2", "3.00", "4.00"
|
||||
|
||||
.. c:function:: void glm_mat2_scale(mat2 m, float s)
|
||||
|
||||
Multiply mat2 (m) by scalar constant (s).
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** mat2 (src, dest)
|
||||
| *[in]* **s** float (scalar)
|
||||
|
||||
.. note:: Mathematical explanation
|
||||
|
||||
.. csv-table:: mat2 **(m)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "m00 * s", "m10 * s"
|
||||
"row 2", "m01 * s", "m11 * s"
|
||||
|
||||
.. note:: Example
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
float s = 3.00f;
|
||||
mat2 m = {{1.00,2.00},{3.00,4.00}};
|
||||
glm_mat2_scale(m, s);
|
||||
|
||||
.. csv-table:: mat2 **(m)** Before
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "1.00", "3.00"
|
||||
"row 2", "2.00", "4.00"
|
||||
|
||||
.. csv-table:: mat2 **(m)** After
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "**3.00** = 1.00 * 3.00", "**9.00** = 3.00 * 3.00"
|
||||
"row 2", "**6.00** = 2.00 * 3.00", "**12.00** = 4.00 * 3.00"
|
||||
|
||||
.. c:function:: void glm_mat2_inv(mat2 mat, mat2 dest)
|
||||
|
||||
inverse mat2 and store in dest
|
||||
Inverse mat2 (mat) and store in mat2 (dest).
|
||||
|
||||
Parameters:
|
||||
| *[in]* **mat** matrix
|
||||
| *[out]* **dest** destination (inverse matrix)
|
||||
| *[in]* **mat** mat2 (left,src)
|
||||
| *[out]* **dest** destination (result, inverse mat2)
|
||||
|
||||
.. c:function:: void glm_mat2_trace(mat2 m)
|
||||
.. note:: Mathematical explanation
|
||||
|
||||
| sum of the elements on the main diagonal from upper left to the lower right
|
||||
.. csv-table:: mat2 **(mat)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** matrix
|
||||
"row 1", "m00", "m10"
|
||||
"row 2", "m01", "m11"
|
||||
|
||||
Returns:
|
||||
trace of matrix
|
||||
.. list-table:: mat2 **(dest)**
|
||||
:header-rows: 1
|
||||
|
||||
* -
|
||||
- column 1
|
||||
- column 2
|
||||
* - row 1
|
||||
- m11 * (1.0f / (m00 * m11 - m01 * m10))
|
||||
- -m10 * (1.0f / (m00 * m11 - m01 * m10))
|
||||
* - row 2
|
||||
- -m01 * (1.0f / (m00 * m11 - m01 * m10))
|
||||
- m00 * (1.0f / (m00 * m11 - m01 * m10))
|
||||
|
||||
.. note:: Example
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
mat2 dest = GLM_MAT2_ZERO_INIT;
|
||||
mat2 mat = {{1.00,2.00},{3.00,4.00}};
|
||||
glm_mat2_inv(mat, dest);
|
||||
|
||||
.. csv-table:: mat2 **(mat)** Before
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "1.00", "3.00"
|
||||
"row 2", "2.00", "4.00"
|
||||
|
||||
.. list-table:: mat2 **(dest)** After
|
||||
:header-rows: 1
|
||||
|
||||
* -
|
||||
- column 1
|
||||
- column 2
|
||||
* - row 1
|
||||
- **-2.00** = 4.00 * (1.00 / (1.00 * 4.00 - 2.00 * 3.00))
|
||||
- **1.50** = -3.00 * (1.00 / (1.00 * 4.00 - 2.00 * 3.00))
|
||||
* - row 2
|
||||
- **1.00** = -2.00 * (1.00 / (1.00 * 4.00 - 2.00 * 3.00))
|
||||
- **-0.50** = 1.00 * (1.00 / (1.00 * 4.00 - 2.00 * 3.00))
|
||||
|
||||
.. c:function:: void glm_mat2_swap_col(mat2 mat, int col1, int col2)
|
||||
|
||||
swap two matrix columns
|
||||
Swap two columns in mat2 (mat) and store in same matrix.
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **mat** matrix
|
||||
| *[in]* **col1** col1
|
||||
| *[in]* **col2** col2
|
||||
| *[in, out]* **mat** mat2 (src, dest)
|
||||
| *[in]* **col1** Column 1 array index
|
||||
| *[in]* **col2** Column 2 array index
|
||||
|
||||
.. note:: Mathematical explanation
|
||||
|
||||
.. csv-table:: mat2 **(mat)** Before
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "m00", "m10"
|
||||
"row 2", "m01", "m11"
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
glm_mat2_swap_col(mat, 0, 1);
|
||||
|
||||
.. csv-table:: mat2 **(mat)** After
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "m10", "m00"
|
||||
"row 2", "m11", "m01"
|
||||
|
||||
.. note:: Example
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
mat2 mat = {{76.00,5.00},{3.00,6.00}};
|
||||
glm_mat2_swap_col(mat, 0, 1);
|
||||
|
||||
.. csv-table:: mat2 **(mat)** Before
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "76.00", "3.00"
|
||||
"row 2", "5.00", "6.00"
|
||||
|
||||
.. csv-table:: mat2 **(mat)** After
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "3.00", "76.00"
|
||||
"row 2", "6.00", "5.00"
|
||||
|
||||
.. c:function:: void glm_mat2_swap_row(mat2 mat, int row1, int row2)
|
||||
|
||||
swap two matrix rows
|
||||
Swap two rows in mat2 (mat) and store in same matrix.
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **mat** matrix
|
||||
| *[in]* **row1** row1
|
||||
| *[in]* **row2** row2
|
||||
| *[in, out]* **mat** mat2 (src, dest)
|
||||
| *[in]* **row1** Row 1 array index
|
||||
| *[in]* **row2** Row 2 array index
|
||||
|
||||
.. note:: Mathematical explanation
|
||||
|
||||
.. csv-table:: mat2 **(mat)** Before
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "m00", "m10"
|
||||
"row 2", "m01", "m11"
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
glm_mat2_swap_row(mat, 0, 1);
|
||||
|
||||
.. csv-table:: mat2 **(mat)** After
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "m01", "m11"
|
||||
"row 2", "m00", "m10"
|
||||
|
||||
.. note:: Example
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
mat2 mat = {{76.00,5.00},{3.00,6.00}};
|
||||
glm_mat2_swap_row(mat, 0, 1);
|
||||
|
||||
.. csv-table:: mat2 **(mat)** Before
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "76.00", "3.00"
|
||||
"row 2", "5.00", "6.00"
|
||||
|
||||
.. csv-table:: mat2 **(mat)** After
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "5.00", "6.00"
|
||||
"row 2", "76.00", "3.00"
|
||||
|
||||
.. c:function:: float glm_mat2_det(mat2 m)
|
||||
|
||||
Returns mat2 determinant.
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** mat2 (src)
|
||||
|
||||
Returns:
|
||||
| mat2 determinant (float)
|
||||
|
||||
.. note:: Mathematical explanation
|
||||
|
||||
.. csv-table:: mat2 **(m)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "m00", "m10"
|
||||
"row 2", "m01", "m11"
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
m00 * m11 - m10 * m01;
|
||||
|
||||
.. note:: Example
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
mat2 m = {{76.00,5.00},{3.00,6.00}};
|
||||
glm_mat2_det(m);
|
||||
|
||||
.. csv-table:: mat2 **(m)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "76.00", "3.00"
|
||||
"row 2", "5.00", "6.00"
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
441.00 = 76.00 * 6.00 - 3.00 * 5.00;
|
||||
|
||||
.. c:function:: void glm_mat2_trace(mat2 m)
|
||||
|
||||
| Returns trace of matrix. Which is:
|
||||
|
|
||||
| The sum of the elements on the main diagonal from
|
||||
| upper left corner to the bottom right corner.
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** mat2 (src)
|
||||
|
||||
Returns:
|
||||
| mat2 trace (float)
|
||||
|
||||
.. note:: Mathematical explanation
|
||||
|
||||
.. csv-table:: mat2 **(m)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "m00", "m10"
|
||||
"row 2", "m01", "m11"
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
m00 + m11;
|
||||
|
||||
.. note:: Example
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
mat2 m = {{76.00,5.00},{3.00,6.00}};
|
||||
glm_mat2_trace(m);
|
||||
|
||||
.. csv-table:: mat2 **(m)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "76.00", "3.00"
|
||||
"row 2", "5.00", "6.00"
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
82.00 = 76.00 + 6.00;
|
||||
|
||||
.. c:function:: float glm_mat2_rmc(vec2 r, mat2 m, vec2 c)
|
||||
|
||||
| Helper for R (row vector) * M (matrix) * C (column vector)
|
||||
|
||||
| **rmc** stands for **Row** * **Matrix** * **Column**
|
||||
|
||||
| helper for R (row vector) * M (matrix) * C (column vector)
|
||||
|
||||
| the result is scalar because R * M = Matrix1x2 (row vector),
|
||||
| then Matrix1x2 * Vec2 (column vector) = Matrix1x1 (Scalar)
|
||||
| the result is scalar because M * C = ResC (1x2, column vector),
|
||||
| then if you take the dot_product(R (2x1), ResC (1x2)) = scalar value.
|
||||
|
||||
Parameters:
|
||||
| *[in]* **r** row vector or matrix1x2
|
||||
| *[in]* **m** matrix2x2
|
||||
| *[in]* **c** column vector or matrix2x1
|
||||
| *[in]* **r** vec2 (2x1, row vector)
|
||||
| *[in]* **m** mat2 (2x2, matrix)
|
||||
| *[in]* **c** vec2 (1x2, column vector)
|
||||
|
||||
Returns:
|
||||
scalar value e.g. Matrix1x1
|
||||
| Scalar value (float, 1x1)
|
||||
|
||||
.. c:function:: void glm_mat2_make(float * __restrict src, mat2 dest)
|
||||
.. note:: Mathematical explanation
|
||||
|
||||
Create mat2 matrix from pointer
|
||||
.. csv-table:: row vec2 (2x1) **(r)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
| NOTE: **@src** must contain at least 4 elements.
|
||||
"row 1", "a00", "a10"
|
||||
|
||||
Parameters:
|
||||
| *[in]* **src** pointer to an array of floats
|
||||
| *[out]* **dest** destination matrix2x2
|
||||
.. csv-table:: mat2 **(m)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "b00", "b10"
|
||||
"row 2", "b01", "b11"
|
||||
|
||||
.. csv-table:: column vec2 (1x2) **(c)**
|
||||
:header: "", "column 1"
|
||||
|
||||
"row 1", "c00"
|
||||
"row 2", "c01"
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
M * C = C (column vector)
|
||||
dot_product(R, C)
|
||||
|
||||
.. csv-table:: column vec2 (1x2) **(C)**
|
||||
:header: "", "column 1"
|
||||
|
||||
"row 1", "b00 * c00 + b10 * c01"
|
||||
"row 2", "b01 * c00 + b11 * c01"
|
||||
|
||||
.. csv-table:: float **(scalar)**
|
||||
:header: "", "column 1"
|
||||
|
||||
"row 1", "a00 * (b00 * c00 + b10 * c01) + a10 * (b01 * c00 + b11 * c01)"
|
||||
|
||||
.. note:: Example
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
vec2 r = {8.00,4.00};
|
||||
vec2 c = {7.00,2.00};
|
||||
mat2 m = {{5.00,9.00},{3.00,6.00}};
|
||||
glm_mat2_rmc(r, m, c);
|
||||
|
||||
.. csv-table:: row vec2 (2x1) **(r)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "8.00", "4.00"
|
||||
|
||||
.. csv-table:: mat2 **(m)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "5.00", "3.00"
|
||||
"row 2", "9.00", "6.00"
|
||||
|
||||
.. csv-table:: column vec2 (1x2) **(c)**
|
||||
:header: "", "column 1"
|
||||
|
||||
"row 1", "7.00"
|
||||
"row 2", "2.00"
|
||||
|
||||
.. csv-table:: column vec2 (1x2) **(C)**
|
||||
:header: "", "column 1"
|
||||
|
||||
"row 1", "**41.00** = 5.00 * 7.00 + 3.00 * 2.00"
|
||||
"row 2", "**75.00** = 9.00 * 7.00 + 6.00 * 2.00"
|
||||
|
||||
.. csv-table:: float (1x1) **(scalar)**
|
||||
:header: "", "column 1"
|
||||
|
||||
"row 1", "**628.00** = 8.00 * 41.00 + 4.00 * 75.00"
|
||||
|
||||
@@ -23,70 +23,183 @@ Functions:
|
||||
#. :c:func:`glm_mat2x3_transpose`
|
||||
#. :c:func:`glm_mat2x3_scale`
|
||||
|
||||
Represented
|
||||
~~~~~~~~~~~
|
||||
|
||||
.. csv-table:: mat2x3
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "m00", "m10"
|
||||
"row 2", "m01", "m11"
|
||||
"row 3", "m02", "m12"
|
||||
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. c:function:: void glm_mat2x3_copy(mat2x3 mat, mat2x3 dest)
|
||||
.. c:function:: void glm_mat2x3_copy(mat2x3 src, mat2x3 dest)
|
||||
|
||||
copy mat2x3 to another one (dest).
|
||||
Copy mat2x3 (src) to mat2x3 (dest).
|
||||
|
||||
Parameters:
|
||||
| *[in]* **mat** source
|
||||
| *[out]* **dest** destination
|
||||
| *[in]* **src** mat2x3 (left)
|
||||
| *[out]* **dest** destination (result, mat2x3)
|
||||
|
||||
.. c:function:: void glm_mat2x3_zero(mat2x3 mat)
|
||||
.. csv-table:: mat2x3 **(src)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
make given matrix zero
|
||||
"row 1", "a00", "a10"
|
||||
"row 2", "a01", "a11"
|
||||
"row 3", "a02", "a12"
|
||||
|
||||
.. csv-table:: mat2x3 **(dest)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "b00 = a00", "b10 = a10"
|
||||
"row 2", "b01 = a01", "b11 = a11"
|
||||
"row 3", "b02 = a02", "b12 = a12"
|
||||
|
||||
.. c:function:: void glm_mat2x3_zero(mat2x3 m)
|
||||
|
||||
Zero out the mat2x3 (m).
|
||||
|
||||
Parameters:
|
||||
| *[in,out]* **mat** matrix
|
||||
| *[in, out]* **m** mat2x3 (src, dest)
|
||||
|
||||
.. c:function:: void glm_mat2x3_make(float * __restrict src, mat2x3 dest)
|
||||
.. csv-table:: mat2x3 **(m)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
Create mat2x3 matrix from pointer
|
||||
"row 1", "0.00", "2.00"
|
||||
"row 2", "5.00", "4.00"
|
||||
"row 3", "7.00", "6.00"
|
||||
|
||||
| NOTE: **@src** must contain at least 6 elements.
|
||||
.. csv-table:: mat2x3 **(m)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "0.00", "0.00"
|
||||
"row 2", "0.00", "0.00"
|
||||
"row 3", "0.00", "0.00"
|
||||
|
||||
.. c:function:: void glm_mat2x3_make(const float * __restrict src, mat2x3 dest)
|
||||
|
||||
Create mat2x3 (dest) from pointer (src).
|
||||
|
||||
.. note:: **@src** must contain at least 6 elements.
|
||||
|
||||
Parameters:
|
||||
| *[in]* **src** pointer to an array of floats
|
||||
| *[out]* **dest** destination matrix2x3
|
||||
| *[in]* **src** pointer to an array of floats (left)
|
||||
| *[out]* **dest** destination (result, mat2x3)
|
||||
|
||||
.. c:function:: void glm_mat2x3_mul(mat2x3 m1, mat3x2 m2, mat2 dest)
|
||||
.. csv-table:: float array (1x6) **(src)**
|
||||
:header: "", "column 1"
|
||||
|
||||
multiply m1 and m2 to dest
|
||||
"row 1", "v0"
|
||||
"row 2", "v1"
|
||||
"row 3", "v2"
|
||||
"row 4", "v3"
|
||||
"row 5", "v4"
|
||||
"row 6", "v5"
|
||||
|
||||
m1, m2 and dest matrices can be same matrix, it is possible to write this:
|
||||
.. csv-table:: mat2x3 **(dest)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "v0", "v3"
|
||||
"row 2", "v1", "v4"
|
||||
"row 3", "v2", "v5"
|
||||
|
||||
.. c:function:: void glm_mat2x3_mul(mat2x3 m1, mat3x2 m2, mat3 dest)
|
||||
|
||||
Multiply mat2x3 (m1) by mat3x2 (m2) and store in mat3 (dest).
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
glm_mat2x3_mul(m, m, m);
|
||||
glm_mat2x3_mul(mat2x3, mat3x2, mat3);
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m1** left matrix
|
||||
| *[in]* **m2** right matrix
|
||||
| *[out]* **dest** destination matrix
|
||||
| *[in]* **m1** mat2x3 (left)
|
||||
| *[in]* **m2** mat3x2 (right)
|
||||
| *[out]* **dest** destination (result, mat3)
|
||||
|
||||
.. c:function:: void glm_mat2x3_mulv(mat2x3 m, vec3 v, vec2 dest)
|
||||
.. csv-table:: mat2x3 **(m1)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
multiply mat2x3 with vec3 (column vector) and store in dest vector
|
||||
"row 1", "a00", "a10"
|
||||
"row 2", "a01", "a11"
|
||||
"row 3", "a02", "a12"
|
||||
|
||||
.. csv-table:: mat3x2 **(m2)**
|
||||
:header: "", "column 1", "column 2", "column 3"
|
||||
|
||||
"row 1", "b00", "b10", "b20"
|
||||
"row 2", "b01", "b11", "b21"
|
||||
|
||||
.. csv-table:: mat3 **(dest)**
|
||||
:header: "", "column 1", "column 2", "column 3"
|
||||
|
||||
"row 1", "a00 * b00 + a10 * b01", "a00 * b10 + a10 * b11", "a00 * b20 + a10 * b21"
|
||||
"row 2", "a01 * b00 + a11 * b01", "a01 * b10 + a11 * b11", "a01 * b20 + a11 * b21"
|
||||
"row 3", "a02 * b00 + a12 * b01", "a02 * b10 + a12 * b11", "a02 * b20 + a12 * b21"
|
||||
|
||||
.. c:function:: void glm_mat2x3_mulv(mat2x3 m, vec2 v, vec3 dest)
|
||||
|
||||
Multiply mat2x3 (m) by vec2 (v) and store in vec3 (dest).
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** mat2x3 (left)
|
||||
| *[in]* **v** vec3 (right, column vector)
|
||||
| *[out]* **dest** destination (result, column vector)
|
||||
| *[in]* **m** mat2x3 (left)
|
||||
| *[in]* **v** vec2 (right, column vector)
|
||||
| *[out]* **dest** destination (result, column vector)
|
||||
|
||||
.. c:function:: void glm_mat2x3_transpose(mat2x3 m, mat3x2 dest)
|
||||
.. csv-table:: mat2x3 **(m)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
transpose matrix and store in dest
|
||||
"row 1", "m00", "m10"
|
||||
"row 2", "m01", "m11"
|
||||
"row 3", "m02", "m12"
|
||||
|
||||
.. csv-table:: column vec2 (1x2) **(v)**
|
||||
:header: "", "column 1"
|
||||
|
||||
"row 1", "v0"
|
||||
"row 2", "v1"
|
||||
|
||||
.. csv-table:: column vec3 (1x3) **(dest)**
|
||||
:header: "", "column 1"
|
||||
|
||||
"row 1", "m00 * v0 + m10 * v1"
|
||||
"row 2", "m01 * v0 + m11 * v1"
|
||||
"row 3", "m02 * v0 + m12 * v1"
|
||||
|
||||
.. c:function:: void glm_mat2x3_transpose(mat2x3 src, mat3x2 dest)
|
||||
|
||||
Transpose mat2x3 (src) and store in mat3x2 (dest).
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** matrix
|
||||
| *[out]* **dest** destination
|
||||
| *[in]* **src** mat2x3 (left)
|
||||
| *[out]* **dest** destination (result, mat3x2)
|
||||
|
||||
.. c:function:: void glm_mat2x3_scale(mat2x3 m, float s)
|
||||
.. csv-table:: mat2x3 **(src)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
multiply matrix with scalar
|
||||
"row 1", "a00", "a10"
|
||||
"row 2", "a01", "a11"
|
||||
"row 3", "a02", "a12"
|
||||
|
||||
.. csv-table:: mat3x2 **(dest)**
|
||||
:header: "", "column 1", "column 2", "column 3"
|
||||
|
||||
"row 1", "b00 = a00", "b10 = a01", "b20 = a02"
|
||||
"row 2", "b01 = a10", "b11 = a11", "b21 = a12"
|
||||
|
||||
.. c:function:: void glm_mat2x3_scale(mat2x3 m, float s)
|
||||
|
||||
Multiply mat2x3 (m) by scalar constant (s).
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** matrix
|
||||
| *[in]* **s** scalar
|
||||
| *[in, out]* **m** mat2x3 (src, dest)
|
||||
| *[in]* **s** float (scalar)
|
||||
|
||||
.. csv-table:: mat2x3 **(m)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "m00 = m00 * s", "m10 = m10 * s"
|
||||
"row 2", "m01 = m01 * s", "m11 = m11 * s"
|
||||
"row 3", "m02 = m02 * s", "m12 = m12 * s"
|
||||
|
||||
@@ -23,70 +23,197 @@ Functions:
|
||||
#. :c:func:`glm_mat2x4_transpose`
|
||||
#. :c:func:`glm_mat2x4_scale`
|
||||
|
||||
Represented
|
||||
~~~~~~~~~~~
|
||||
|
||||
.. csv-table:: mat2x4
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "m00", "m10"
|
||||
"row 2", "m01", "m11"
|
||||
"row 3", "m02", "m12"
|
||||
"row 4", "m03", "m13"
|
||||
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. c:function:: void glm_mat2x4_copy(mat2x4 mat, mat2x4 dest)
|
||||
.. c:function:: void glm_mat2x4_copy(mat2x4 src, mat2x4 dest)
|
||||
|
||||
copy mat2x4 to another one (dest).
|
||||
Copy mat2x4 (src) to mat2x4 (dest).
|
||||
|
||||
Parameters:
|
||||
| *[in]* **mat** source
|
||||
| *[out]* **dest** destination
|
||||
| *[in]* **src** mat2x4 (left)
|
||||
| *[out]* **dest** destination (result, mat2x4)
|
||||
|
||||
.. c:function:: void glm_mat2x4_zero(mat2x4 mat)
|
||||
.. csv-table:: mat2x4 **(src)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
make given matrix zero
|
||||
"row 1", "a00", "a10"
|
||||
"row 2", "a01", "a11"
|
||||
"row 3", "a02", "a12"
|
||||
"row 4", "a03", "a13"
|
||||
|
||||
.. csv-table:: mat2x4 **(dest)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "b00 = a00", "b10 = a10"
|
||||
"row 2", "b01 = a01", "b11 = a11"
|
||||
"row 3", "b02 = a02", "b12 = a12"
|
||||
"row 4", "b03 = a03", "b13 = a13"
|
||||
|
||||
.. c:function:: void glm_mat2x4_zero(mat2x4 m)
|
||||
|
||||
Zero out the mat2x4 (m).
|
||||
|
||||
Parameters:
|
||||
| *[in,out]* **mat** matrix
|
||||
| *[in, out]* **m** mat2x4 (src, dest)
|
||||
|
||||
.. c:function:: void glm_mat2x4_make(float * __restrict src, mat2x4 dest)
|
||||
.. csv-table:: mat2x4 **(m)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
Create mat2x4 matrix from pointer
|
||||
"row 1", "0.00", "2.00"
|
||||
"row 2", "5.00", "4.00"
|
||||
"row 3", "7.00", "6.00"
|
||||
"row 4", "23.00", "1.00"
|
||||
|
||||
| NOTE: **@src** must contain at least 8 elements.
|
||||
.. csv-table:: mat2x4 **(m)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "0.00", "0.00"
|
||||
"row 2", "0.00", "0.00"
|
||||
"row 3", "0.00", "0.00"
|
||||
"row 4", "0.00", "0.00"
|
||||
|
||||
.. c:function:: void glm_mat2x4_make(const float * __restrict src, mat2x4 dest)
|
||||
|
||||
Create mat2x4 (dest) from pointer (src).
|
||||
|
||||
.. note:: **@src** must contain at least 8 elements.
|
||||
|
||||
Parameters:
|
||||
| *[in]* **src** pointer to an array of floats
|
||||
| *[out]* **dest** destination matrix2x4
|
||||
| *[in]* **src** pointer to an array of floats (left)
|
||||
| *[out]* **dest** destination (result, mat2x4)
|
||||
|
||||
.. c:function:: void glm_mat2x4_mul(mat2x4 m1, mat4x2 m2, mat2 dest)
|
||||
.. csv-table:: float array (1x8) **(src)**
|
||||
:header: "", "column 1"
|
||||
|
||||
multiply m1 and m2 to dest
|
||||
"row 1", "v0"
|
||||
"row 2", "v1"
|
||||
"row 3", "v2"
|
||||
"row 4", "v3"
|
||||
"row 5", "v4"
|
||||
"row 6", "v5"
|
||||
"row 7", "v6"
|
||||
"row 8", "v7"
|
||||
|
||||
m1, m2 and dest matrices can be same matrix, it is possible to write this:
|
||||
.. csv-table:: mat2x4 **(dest)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "v0", "v4"
|
||||
"row 2", "v1", "v5"
|
||||
"row 3", "v2", "v6"
|
||||
"row 4", "v3", "v7"
|
||||
|
||||
.. c:function:: void glm_mat2x4_mul(mat2x4 m1, mat4x2 m2, mat4 dest)
|
||||
|
||||
Multiply mat2x4 (m1) by mat4x2 (m2) and store in mat4 (dest).
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
glm_mat2x4_mul(m, m, m);
|
||||
glm_mat2x4_mul(mat2x4, mat4x2, mat4);
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m1** left matrix
|
||||
| *[in]* **m2** right matrix
|
||||
| *[out]* **dest** destination matrix
|
||||
| *[in]* **m1** mat2x4 (left)
|
||||
| *[in]* **m2** mat4x2 (right)
|
||||
| *[out]* **dest** destination (result, mat4)
|
||||
|
||||
.. c:function:: void glm_mat2x4_mulv(mat2x4 m, vec4 v, vec2 dest)
|
||||
.. csv-table:: mat2x4 **(m1)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
multiply mat2x4 with vec4 (column vector) and store in dest vector
|
||||
"row 1", "a00", "a10"
|
||||
"row 2", "a01", "a11"
|
||||
"row 3", "a02", "a12"
|
||||
"row 4", "a03", "a13"
|
||||
|
||||
.. csv-table:: mat4x2 **(m2)**
|
||||
:header: "", "column 1", "column 2", "column 3", "column 4"
|
||||
|
||||
"row 1", "b00", "b10", "b20", "b30"
|
||||
"row 2", "b01", "b11", "b21", "b31"
|
||||
|
||||
.. csv-table:: mat4x4 **(dest)**
|
||||
:header: "", "column 1", "column 2", "column 3", "column 4"
|
||||
|
||||
"row 1", "a00 * b00 + a10 * b01", "a00 * b10 + a10 * b11", "a00 * b20 + a10 * b21", "a00 * b30 + a10 * b31"
|
||||
"row 2", "a01 * b00 + a11 * b01", "a01 * b10 + a11 * b11", "a01 * b20 + a11 * b21", "a01 * b30 + a11 * b31"
|
||||
"row 3", "a02 * b00 + a12 * b01", "a02 * b10 + a12 * b11", "a02 * b20 + a12 * b21", "a02 * b30 + a12 * b31"
|
||||
"row 4", "a03 * b00 + a13 * b01", "a03 * b10 + a13 * b11", "a03 * b20 + a13 * b21", "a03 * b30 + a13 * b31"
|
||||
|
||||
.. c:function:: void glm_mat2x4_mulv(mat2x4 m, vec2 v, vec4 dest)
|
||||
|
||||
Multiply mat2x4 (m) by vec2 (v) and store in vec4 (dest).
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** mat2x4 (left)
|
||||
| *[in]* **v** vec4 (right, column vector)
|
||||
| *[out]* **dest** destination (result, column vector)
|
||||
| *[in]* **m** mat2x4 (left)
|
||||
| *[in]* **v** vec2 (right, column vector)
|
||||
| *[out]* **dest** destination (result, column vector)
|
||||
|
||||
.. c:function:: void glm_mat2x4_transpose(mat2x4 m, mat4x2 dest)
|
||||
.. csv-table:: mat2x4 **(m)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
transpose matrix and store in dest
|
||||
"row 1", "m00", "m10"
|
||||
"row 2", "m01", "m11"
|
||||
"row 3", "m02", "m12"
|
||||
"row 4", "m03", "m13"
|
||||
|
||||
.. csv-table:: column vec2 (1x2) **(v)**
|
||||
:header: "", "column 1"
|
||||
|
||||
"row 1", "v0"
|
||||
"row 2", "v1"
|
||||
|
||||
.. csv-table:: column vec4 (1x4) **(dest)**
|
||||
:header: "", "column 1"
|
||||
|
||||
"row 1", "m00 * v0 + m10 * v1"
|
||||
"row 2", "m01 * v0 + m11 * v1"
|
||||
"row 3", "m02 * v0 + m12 * v1"
|
||||
"row 4", "m03 * v0 + m13 * v1"
|
||||
|
||||
.. c:function:: void glm_mat2x4_transpose(mat2x4 src, mat4x2 dest)
|
||||
|
||||
Transpose mat2x4 (src) and store in mat4x2 (dest).
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** matrix
|
||||
| *[out]* **dest** destination
|
||||
| *[in]* **src** mat2x4 (left)
|
||||
| *[out]* **dest** destination (result, mat4x2)
|
||||
|
||||
.. csv-table:: mat2x4 **(src)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "a00", "a10"
|
||||
"row 2", "a01", "a11"
|
||||
"row 3", "a02", "a12"
|
||||
"row 4", "a03", "a13"
|
||||
|
||||
.. csv-table:: mat4x2 **(dest)**
|
||||
:header: "", "column 1", "column 2", "column 3", "column 4"
|
||||
|
||||
"row 1", "b00 = a00", "b10 = a01", "b20 = a02", "b30 = a03"
|
||||
"row 2", "b01 = a10", "b11 = a11", "b21 = a12", "b31 = a13"
|
||||
|
||||
.. c:function:: void glm_mat2x4_scale(mat2x4 m, float s)
|
||||
|
||||
multiply matrix with scalar
|
||||
Multiply mat2x4 (m) by scalar constant (s).
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** matrix
|
||||
| *[in]* **s** scalar
|
||||
| *[in, out]* **m** mat2x4 (src, dest)
|
||||
| *[in]* **s** float (scalar)
|
||||
|
||||
.. csv-table:: mat2x4 **(m)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "m00 = m00 * s", "m10 = m10 * s"
|
||||
"row 2", "m01 = m01 * s", "m11 = m11 * s"
|
||||
"row 3", "m02 = m02 * s", "m12 = m12 * s"
|
||||
"row 4", "m03 = m03 * s", "m13 = m13 * s"
|
||||
|
||||
1154
docs/source/mat3.rst
1154
docs/source/mat3.rst
File diff suppressed because it is too large
Load Diff
@@ -23,69 +23,174 @@ Functions:
|
||||
#. :c:func:`glm_mat3x2_transpose`
|
||||
#. :c:func:`glm_mat3x2_scale`
|
||||
|
||||
Represented
|
||||
~~~~~~~~~~~
|
||||
|
||||
.. csv-table:: mat3x2
|
||||
:header: "", "column 1", "column 2", "column 3"
|
||||
|
||||
"row 1", "m00", "m10", "m20"
|
||||
"row 2", "m01", "m11", "m21"
|
||||
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. c:function:: void glm_mat3x2_copy(mat3x2 mat, mat3x2 dest)
|
||||
.. c:function:: void glm_mat3x2_copy(mat3x2 src, mat3x2 dest)
|
||||
|
||||
copy mat3x2 to another one (dest).
|
||||
Copy mat3x2 (src) to mat3x2 (dest).
|
||||
|
||||
Parameters:
|
||||
| *[in]* **mat** source
|
||||
| *[out]* **dest** destination
|
||||
| *[in]* **src** mat3x2 (left)
|
||||
| *[out]* **dest** destination (result, mat3x2)
|
||||
|
||||
.. c:function:: void glm_mat3x2_zero(mat3x2 mat)
|
||||
.. csv-table:: mat3x2 **(src)**
|
||||
:header: "", "column 1", "column 2", "column 3"
|
||||
|
||||
make given matrix zero
|
||||
"row 1", "a00", "a10", "a20"
|
||||
"row 2", "a01", "a11", "a21"
|
||||
|
||||
.. csv-table:: mat3x2 **(dest)**
|
||||
:header: "", "column 1", "column 2", "column 3"
|
||||
|
||||
"row 1", "b00 = a00", "b10 = a10", "b20 = a20"
|
||||
"row 2", "b01 = a01", "b11 = a11", "b21 = a21"
|
||||
|
||||
.. c:function:: void glm_mat3x2_zero(mat3x2 m)
|
||||
|
||||
Zero out the mat3x2 (m).
|
||||
|
||||
Parameters:
|
||||
| *[in,out]* **mat** matrix
|
||||
| *[in, out]* **m** mat3x2 (src, dest)
|
||||
|
||||
.. c:function:: void glm_mat3x2_make(float * __restrict src, mat3x2 dest)
|
||||
.. csv-table:: mat3x2 **(m)**
|
||||
:header: "", "column 1", "column 2", "column 3"
|
||||
|
||||
Create mat3x2 matrix from pointer
|
||||
"row 1", "0.00", "2.00", "15.00"
|
||||
"row 2", "5.00", "4.00", "6.00"
|
||||
|
||||
.. csv-table:: mat3x2 **(m)**
|
||||
:header: "", "column 1", "column 2", "column 3"
|
||||
|
||||
"row 1", "0.00", "0.00", "0.00"
|
||||
"row 2", "0.00", "0.00", "0.00"
|
||||
|
||||
.. c:function:: void glm_mat3x2_make(const float * __restrict src, mat3x2 dest)
|
||||
|
||||
Create mat3x2 (dest) from pointer (src).
|
||||
|
||||
.. note:: **@src** must contain at least 6 elements.
|
||||
|
||||
| NOTE: **@src** must contain at least 6 elements.
|
||||
Parameters:
|
||||
| *[in]* **src** pointer to an array of floats
|
||||
| *[out]* **dest** destination matrix3x2
|
||||
| *[in]* **src** pointer to an array of floats (left)
|
||||
| *[out]* **dest** destination (result, mat3x2)
|
||||
|
||||
.. c:function:: void glm_mat3x2_mul(mat3x2 m1, mat2x3 m2, mat3 dest)
|
||||
.. csv-table:: float array (1x6) **(src)**
|
||||
:header: "", "column 1"
|
||||
|
||||
multiply m1 and m2 to dest
|
||||
"row 1", "v0"
|
||||
"row 2", "v1"
|
||||
"row 3", "v2"
|
||||
"row 4", "v3"
|
||||
"row 5", "v4"
|
||||
"row 6", "v5"
|
||||
|
||||
m1, m2 and dest matrices can be same matrix, it is possible to write this:
|
||||
.. csv-table:: mat3x2 **(dest)**
|
||||
:header: "", "column 1", "column 2", "column 3"
|
||||
|
||||
"row 1", "v0", "v2", "v4"
|
||||
"row 2", "v1", "v3", "v5"
|
||||
|
||||
.. c:function:: void glm_mat3x2_mul(mat3x2 m1, mat2x3 m2, mat2 dest)
|
||||
|
||||
Multiply mat3x2 (m1) by mat2x3 (m2) and store in mat2 (dest).
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
glm_mat3x2_mul(m, m, m);
|
||||
glm_mat3x2_mul(mat3x2, mat2x3, mat2);
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m1** left matrix
|
||||
| *[in]* **m2** right matrix
|
||||
| *[out]* **dest** destination matrix
|
||||
| *[in]* **m1** mat3x2 (left)
|
||||
| *[in]* **m2** mat2x3 (right)
|
||||
| *[out]* **dest** destination (result, mat2)
|
||||
|
||||
.. c:function:: void glm_mat3x2_mulv(mat3x2 m, vec2 v, vec3 dest)
|
||||
.. csv-table:: mat3x2 **(m1)**
|
||||
:header: "", "column 1", "column 2", "column 3"
|
||||
|
||||
multiply mat3x2 with vec2 (column vector) and store in dest vector
|
||||
"row 1", "a00", "a10", "a20"
|
||||
"row 2", "a01", "a11", "a21"
|
||||
|
||||
.. csv-table:: mat2x3 **(m2)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "b00", "b10"
|
||||
"row 2", "b01", "b11"
|
||||
"row 3", "b02", "b12"
|
||||
|
||||
.. csv-table:: mat2x2 **(dest)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "a00 * b00 + a10 * b01 + a20 * b02", "a00 * b10 + a10 * b11 + a20 * b12"
|
||||
"row 2", "a01 * b00 + a11 * b01 + a21 * b02", "a01 * b10 + a11 * b11 + a21 * b12"
|
||||
|
||||
.. c:function:: void glm_mat3x2_mulv(mat3x2 m, vec3 v, vec2 dest)
|
||||
|
||||
Multiply mat3x2 (m) by vec3 (v) and store in vec2 (dest).
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** mat3x2 (left)
|
||||
| *[in]* **v** vec3 (right, column vector)
|
||||
| *[out]* **dest** destination (result, column vector)
|
||||
| *[in]* **m** mat3x2 (left)
|
||||
| *[in]* **v** vec3 (right, column vector)
|
||||
| *[out]* **dest** destination (result, column vector)
|
||||
|
||||
.. c:function:: void glm_mat3x2_transpose(mat3x2 m, mat2x3 dest)
|
||||
.. csv-table:: mat3x2 **(m)**
|
||||
:header: "", "column 1", "column 2", "column 3"
|
||||
|
||||
transpose matrix and store in dest
|
||||
"row 1", "m00", "m10", "m20"
|
||||
"row 2", "m01", "m11", "m21"
|
||||
|
||||
.. csv-table:: column vec3 (1x3) **(v)**
|
||||
:header: "", "column 1"
|
||||
|
||||
"row 1", "v0"
|
||||
"row 2", "v1"
|
||||
"row 3", "v2"
|
||||
|
||||
.. csv-table:: column vec2 (1x2) **(dest)**
|
||||
:header: "", "column 1"
|
||||
|
||||
"row 1", "m00 * v0 + m10 * v1 + m20 * v2"
|
||||
"row 2", "m01 * v0 + m11 * v1 + m21 * v2"
|
||||
|
||||
.. c:function:: void glm_mat3x2_transpose(mat3x2 src, mat2x3 dest)
|
||||
|
||||
Transpose mat3x2 (src) and store in mat2x3 (dest).
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** matrix
|
||||
| *[out]* **dest** destination
|
||||
| *[in]* **src** mat3x2 (left)
|
||||
| *[out]* **dest** destination (result, mat2x3)
|
||||
|
||||
.. c:function:: void glm_mat3x2_scale(mat3x2 m, float s)
|
||||
.. csv-table:: mat3x2 **(src)**
|
||||
:header: "", "column 1", "column 2", "column 3"
|
||||
|
||||
multiply matrix with scalar
|
||||
"row 1", "a00", "a10", "a20"
|
||||
"row 2", "a01", "a11", "a21"
|
||||
|
||||
.. csv-table:: mat2x3 **(dest)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "b00 = a00", "b10 = a01"
|
||||
"row 2", "b01 = a10", "b11 = a11"
|
||||
"row 3", "b02 = a20", "b12 = a21"
|
||||
|
||||
.. c:function:: void glm_mat3x2_scale(mat3x2 m, float s)
|
||||
|
||||
Multiply mat3x2 (m) by scalar constant (s).
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** matrix
|
||||
| *[in]* **s** scalar
|
||||
| *[in, out]* **m** mat3x2 (src, dest)
|
||||
| *[in]* **s** float (scalar)
|
||||
|
||||
.. csv-table:: mat3x2 **(m)**
|
||||
:header: "", "column 1", "column 2", "column 3"
|
||||
|
||||
"row 1", "m00 = m00 * s", "m10 = m10 * s", "m20 = m20 * s"
|
||||
"row 2", "m01 = m01 * s", "m11 = m11 * s", "m21 = m21 * s"
|
||||
|
||||
@@ -23,69 +23,204 @@ Functions:
|
||||
#. :c:func:`glm_mat3x4_transpose`
|
||||
#. :c:func:`glm_mat3x4_scale`
|
||||
|
||||
Represented
|
||||
~~~~~~~~~~~
|
||||
|
||||
.. csv-table:: mat3x4
|
||||
:header: "", "column 1", "column 2", "column 3"
|
||||
|
||||
"row 1", "m00", "m10", "m20"
|
||||
"row 2", "m01", "m11", "m21"
|
||||
"row 3", "m02", "m12", "m22"
|
||||
"row 4", "m03", "m13", "m23"
|
||||
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. c:function:: void glm_mat3x4_copy(mat3x4 mat, mat3x4 dest)
|
||||
.. c:function:: void glm_mat3x4_copy(mat3x4 src, mat3x4 dest)
|
||||
|
||||
copy mat3x4 to another one (dest).
|
||||
Copy mat3x4 (src) to mat3x4 (dest).
|
||||
|
||||
Parameters:
|
||||
| *[in]* **mat** source
|
||||
| *[out]* **dest** destination
|
||||
| *[in]* **src** mat3x4 (left)
|
||||
| *[out]* **dest** destination (result, mat3x4)
|
||||
|
||||
.. c:function:: void glm_mat3x4_zero(mat3x4 mat)
|
||||
.. csv-table:: mat3x4 **(src)**
|
||||
:header: "", "column 1", "column 2", "column 3"
|
||||
|
||||
make given matrix zero
|
||||
"row 1", "a00", "a10", "a20"
|
||||
"row 2", "a01", "a11", "a21"
|
||||
"row 3", "a02", "a12", "a22"
|
||||
"row 4", "a03", "a13", "a23"
|
||||
|
||||
.. csv-table:: mat3x4 **(dest)**
|
||||
:header: "", "column 1", "column 2", "column 3"
|
||||
|
||||
"row 1", "b00 = a00", "b10 = a10", "b20 = a20"
|
||||
"row 2", "b01 = a01", "b11 = a11", "b21 = a21"
|
||||
"row 3", "b02 = a02", "b12 = a12", "b22 = a22"
|
||||
"row 4", "b03 = a03", "b13 = a13", "b23 = a23"
|
||||
|
||||
.. c:function:: void glm_mat3x4_zero(mat3x4 m)
|
||||
|
||||
Zero out the mat3x4 (m).
|
||||
|
||||
Parameters:
|
||||
| *[in,out]* **mat** matrix
|
||||
| *[in, out]* **m** mat3x4 (src, dest)
|
||||
|
||||
.. c:function:: void glm_mat3x4_make(float * __restrict src, mat3x4 dest)
|
||||
.. csv-table:: mat3x4 **(m)**
|
||||
:header: "", "column 1", "column 2", "column 3"
|
||||
|
||||
Create mat3x4 matrix from pointer
|
||||
"row 1", "0.00", "2.00", "78.00"
|
||||
"row 2", "5.00", "4.00", "12.00"
|
||||
"row 3", "7.00", "6.00", "32.00"
|
||||
"row 4", "23.00", "1.00", "9.00"
|
||||
|
||||
.. csv-table:: mat3x4 **(m)**
|
||||
:header: "", "column 1", "column 2", "column 3"
|
||||
|
||||
"row 1", "0.00", "0.00", "0.00"
|
||||
"row 2", "0.00", "0.00", "0.00"
|
||||
"row 3", "0.00", "0.00", "0.00"
|
||||
"row 4", "0.00", "0.00", "0.00"
|
||||
|
||||
.. c:function:: void glm_mat3x4_make(const float * __restrict src, mat3x4 dest)
|
||||
|
||||
Create mat3x4 (dest) from pointer (src).
|
||||
|
||||
.. note:: **@src** must contain at least 12 elements.
|
||||
|
||||
| NOTE: **@src** must contain at least 12 elements.
|
||||
Parameters:
|
||||
| *[in]* **src** pointer to an array of floats
|
||||
| *[out]* **dest** destination matrix3x4
|
||||
| *[in]* **src** pointer to an array of floats (left)
|
||||
| *[out]* **dest** destination (result, mat3x4)
|
||||
|
||||
.. c:function:: void glm_mat3x4_mul(mat3x4 m1, mat4x3 m2, mat3 dest)
|
||||
.. csv-table:: float array (1x12) **(src)**
|
||||
:header: "", "column 1"
|
||||
|
||||
multiply m1 and m2 to dest
|
||||
"row 1", "v0"
|
||||
"row 2", "v1"
|
||||
"row 3", "v2"
|
||||
"row 4", "v3"
|
||||
"row 5", "v4"
|
||||
"row 6", "v5"
|
||||
"row 7", "v6"
|
||||
"row 8", "v7"
|
||||
"row 9", "v8"
|
||||
"row 10", "v9"
|
||||
"row 11", "v10"
|
||||
"row 12", "v11"
|
||||
|
||||
m1, m2 and dest matrices can be same matrix, it is possible to write this:
|
||||
.. csv-table:: mat3x4 **(dest)**
|
||||
:header: "", "column 1", "column 2", "column 3"
|
||||
|
||||
"row 1", "v0", "v4", "v8"
|
||||
"row 2", "v1", "v5", "v9"
|
||||
"row 3", "v2", "v6", "v10"
|
||||
"row 4", "v3", "v7", "v11"
|
||||
|
||||
.. c:function:: void glm_mat3x4_mul(mat3x4 m1, mat4x3 m2, mat4 dest)
|
||||
|
||||
Multiply mat3x4 (m1) by mat4x3 (m2) and store in mat4 (dest).
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
glm_mat3x4_mul(m, m, m);
|
||||
glm_mat3x4_mul(mat3x4, mat4x3, mat4);
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m1** left matrix
|
||||
| *[in]* **m2** right matrix
|
||||
| *[out]* **dest** destination matrix
|
||||
| *[in]* **m1** mat2x4 (left)
|
||||
| *[in]* **m2** mat4x2 (right)
|
||||
| *[out]* **dest** destination (result, mat4)
|
||||
|
||||
.. c:function:: void glm_mat3x4_mulv(mat3x4 m, vec4 v, vec3 dest)
|
||||
.. csv-table:: mat3x4 **(m1)**
|
||||
:header: "", "column 1", "column 2", "column 3"
|
||||
|
||||
multiply mat3x4 with vec4 (column vector) and store in dest vector
|
||||
"row 1", "a00", "a10", "a20"
|
||||
"row 2", "a01", "a11", "a21"
|
||||
"row 3", "a02", "a12", "a22"
|
||||
"row 4", "a03", "a13", "a23"
|
||||
|
||||
.. csv-table:: mat4x3 **(m2)**
|
||||
:header: "", "column 1", "column 2", "column 3", "column 4"
|
||||
|
||||
"row 1", "b00", "b10", "b20", "b30"
|
||||
"row 2", "b01", "b11", "b21", "b31"
|
||||
"row 3", "b02", "b12", "b22", "b32"
|
||||
|
||||
.. csv-table:: mat4x4 **(dest)**
|
||||
:header: "", "column 1", "column 2", "column 3", "column 4"
|
||||
|
||||
"row 1", "a00 * b00 + a10 * b01 + a20 * b02", "a00 * b10 + a10 * b11 + a20 * b12", "a00 * b20 + a10 * b21 + a20 * b22", "a00 * b30 + a10 * b31 + a20 * b32"
|
||||
"row 2", "a01 * b00 + a11 * b01 + a21 * b02", "a01 * b10 + a11 * b11 + a21 * b12", "a01 * b20 + a11 * b21 + a21 * b22", "a01 * b30 + a11 * b31 + a21 * b32"
|
||||
"row 3", "a02 * b00 + a12 * b01 + a22 * b02", "a02 * b10 + a12 * b11 + a22 * b12", "a02 * b20 + a12 * b21 + a22 * b22", "a02 * b30 + a12 * b31 + a22 * b32"
|
||||
"row 4", "a03 * b00 + a13 * b01 + a23 * b02", "a03 * b10 + a13 * b11 + a23 * b12", "a03 * b20 + a13 * b21 + a23 * b22", "a03 * b30 + a13 * b31 + a23 * b32"
|
||||
|
||||
.. c:function:: void glm_mat3x4_mulv(mat3x4 m, vec3 v, vec4 dest)
|
||||
|
||||
Multiply ma3x4 (m) by vec3 (v) and store in vec4 (dest).
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** mat3x4 (left)
|
||||
| *[in]* **v** vec4 (right, column vector)
|
||||
| *[out]* **dest** destination (result, column vector)
|
||||
| *[in]* **m** mat3x4 (left)
|
||||
| *[in]* **v** vec3 (right, column vector)
|
||||
| *[out]* **dest** destination (result, column vector)
|
||||
|
||||
.. c:function:: void glm_mat3x4_transpose(mat3x4 m, mat4x3 dest)
|
||||
.. csv-table:: mat3x4 **(m)**
|
||||
:header: "", "column 1", "column 2", "column 3"
|
||||
|
||||
transpose matrix and store in dest
|
||||
"row 1", "m00", "m10", "m20"
|
||||
"row 2", "m01", "m11", "m21"
|
||||
"row 3", "m02", "m12", "m22"
|
||||
"row 4", "m03", "m13", "m23"
|
||||
|
||||
.. csv-table:: column vec3 (1x3) **(v)**
|
||||
:header: "", "column 1"
|
||||
|
||||
"row 1", "v0"
|
||||
"row 2", "v1"
|
||||
"row 3", "v2"
|
||||
|
||||
.. csv-table:: column vec4 (1x4) **(dest)**
|
||||
:header: "", "column 1"
|
||||
|
||||
"row 1", "m00 * v0 + m10 * v1 + m20 * v2"
|
||||
"row 2", "m01 * v0 + m11 * v1 + m21 * v2"
|
||||
"row 3", "m02 * v0 + m12 * v1 + m22 * v2"
|
||||
"row 4", "m03 * v0 + m13 * v1 + m23 * v2"
|
||||
|
||||
.. c:function:: void glm_mat3x4_transpose(mat3x4 src, mat4x3 dest)
|
||||
|
||||
Transpose mat3x4 (src) and store in mat4x3 (dest).
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** matrix
|
||||
| *[out]* **dest** destination
|
||||
| *[in]* **src** mat3x4 (left)
|
||||
| *[out]* **dest** destination (result, mat4x3)
|
||||
|
||||
.. csv-table:: mat3x4 **(src)**
|
||||
:header: "", "column 1", "column 2", "column 3"
|
||||
|
||||
"row 1", "a00", "a10", "a20"
|
||||
"row 2", "a01", "a11", "a21"
|
||||
"row 3", "a02", "a12", "a22"
|
||||
"row 4", "a03", "a13", "a23"
|
||||
|
||||
.. csv-table:: mat4x3 **(dest)**
|
||||
:header: "", "column 1", "column 2", "column 3", "column 4"
|
||||
|
||||
"row 1", "b00 = a00", "b10 = a01", "b20 = a02", "b30 = a03"
|
||||
"row 2", "b01 = a10", "b11 = a11", "b21 = a12", "b31 = a13"
|
||||
"row 3", "b02 = a20", "b12 = a21", "b22 = a22", "b32 = a23"
|
||||
|
||||
.. c:function:: void glm_mat3x4_scale(mat3x4 m, float s)
|
||||
|
||||
multiply matrix with scalar
|
||||
Multiply mat3x4 (m) by scalar constant (s).
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** matrix
|
||||
| *[in]* **s** scalar
|
||||
| *[in, out]* **m** mat3x4 (src, dest)
|
||||
| *[in]* **s** float (scalar)
|
||||
|
||||
.. csv-table:: mat3x4 **(m)**
|
||||
:header: "", "column 1", "column 2", "column 3"
|
||||
|
||||
"row 1", "m00 = m00 * s", "m10 = m10 * s", "m20 = m20 * s"
|
||||
"row 2", "m01 = m01 * s", "m11 = m11 * s", "m21 = m21 * s"
|
||||
"row 3", "m02 = m02 * s", "m12 = m12 * s", "m22 = m22 * s"
|
||||
"row 4", "m03 = m03 * s", "m13 = m13 * s", "m23 = m23 * s"
|
||||
|
||||
@@ -34,8 +34,8 @@ Functions:
|
||||
#. :c:func:`glm_mat4_mulN`
|
||||
#. :c:func:`glm_mat4_mulv`
|
||||
#. :c:func:`glm_mat4_mulv3`
|
||||
#. :c:func:`glm_mat3_trace`
|
||||
#. :c:func:`glm_mat3_trace3`
|
||||
#. :c:func:`glm_mat4_trace`
|
||||
#. :c:func:`glm_mat4_trace3`
|
||||
#. :c:func:`glm_mat4_quat`
|
||||
#. :c:func:`glm_mat4_transpose_to`
|
||||
#. :c:func:`glm_mat4_transpose`
|
||||
@@ -48,6 +48,7 @@ Functions:
|
||||
#. :c:func:`glm_mat4_swap_row`
|
||||
#. :c:func:`glm_mat4_rmc`
|
||||
#. :c:func:`glm_mat4_make`
|
||||
#. :c:func:`glm_mat4_textrans`
|
||||
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
@@ -70,7 +71,7 @@ Functions documentation
|
||||
|
||||
.. c:function:: void glm_mat4_identity(mat4 mat)
|
||||
|
||||
copy identity mat4 to mat, or makes mat to identiy
|
||||
copy identity mat4 to mat, or makes mat to identity
|
||||
|
||||
Parameters:
|
||||
| *[out]* **mat** matrix
|
||||
@@ -143,7 +144,7 @@ Functions documentation
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
mat m1, m2, m3, m4, res;
|
||||
mat4 m1, m2, m3, m4, res;
|
||||
glm_mat4_mulN((mat4 *[]){&m1, &m2, &m3, &m4}, 4, res);
|
||||
|
||||
Parameters:
|
||||
@@ -214,7 +215,7 @@ Functions documentation
|
||||
|
||||
.. c:function:: void glm_mat4_transpose(mat4 m)
|
||||
|
||||
tranpose mat4 and store result in same matrix
|
||||
transpose mat4 and store result in same matrix
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** source
|
||||
@@ -263,7 +264,7 @@ Functions documentation
|
||||
| e.g Newton-Raphson. this should work faster than normal,
|
||||
| to get more precise use glm_mat4_inv version.
|
||||
|
||||
| NOTE: You will lose precision, glm_mat4_inv is more accurate
|
||||
.. note:: You will lose precision, glm_mat4_inv is more accurate
|
||||
|
||||
Parameters:
|
||||
| *[in]* **mat** source
|
||||
@@ -304,12 +305,24 @@ Functions documentation
|
||||
Returns:
|
||||
scalar value e.g. Matrix1x1
|
||||
|
||||
.. c:function:: void glm_mat4_make(float * __restrict src, mat4 dest)
|
||||
.. c:function:: void glm_mat4_make(const float * __restrict src, mat4 dest)
|
||||
|
||||
Create mat4 matrix from pointer
|
||||
|
||||
| NOTE: **@src** must contain at least 16 elements.
|
||||
.. note:: **@src** must contain at least 16 elements.
|
||||
|
||||
Parameters:
|
||||
| *[in]* **src** pointer to an array of floats
|
||||
| *[out]* **dest** destination matrix4x4
|
||||
|
||||
.. c:function:: void glm_mat4_textrans(float sx, float sy, float rot, float tx, float ty, mat4 dest)
|
||||
|
||||
Create texture transformation matrix, rotation is in radians CCW/RH
|
||||
|
||||
Parameters:
|
||||
| *[in]* **sx** scale x
|
||||
| *[in]* **sy** scale y
|
||||
| *[in]* **rot** rotation in radians CCW/RH
|
||||
| *[in]* **tx** translation x
|
||||
| *[in]* **ty** translation y
|
||||
| *[out]* **dest** destination matrix3x3
|
||||
|
||||
@@ -23,69 +23,179 @@ Functions:
|
||||
#. :c:func:`glm_mat4x2_transpose`
|
||||
#. :c:func:`glm_mat4x2_scale`
|
||||
|
||||
Represented
|
||||
~~~~~~~~~~~
|
||||
|
||||
.. csv-table:: mat4x2
|
||||
:header: "", "column 1", "column 2", "column 3", "column4"
|
||||
|
||||
"row 1", "m00", "m10", "m20", "m30"
|
||||
"row 2", "m01", "m11", "m21", "m31"
|
||||
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. c:function:: void glm_mat4x2_copy(mat4x2 mat, mat4x2 dest)
|
||||
.. c:function:: void glm_mat4x2_copy(mat4x2 src, mat4x2 dest)
|
||||
|
||||
copy mat4x2 to another one (dest).
|
||||
Copy mat4x2 (src) to mat4x2 (dest).
|
||||
|
||||
Parameters:
|
||||
| *[in]* **mat** source
|
||||
| *[out]* **dest** destination
|
||||
| *[in]* **src** mat4x2 (left)
|
||||
| *[out]* **dest** destination (result, mat4x2)
|
||||
|
||||
.. c:function:: void glm_mat4x2_zero(mat4x2 mat)
|
||||
.. csv-table:: mat4x2 **(src)**
|
||||
:header: "", "column 1", "column 2", "column 3", "column 4"
|
||||
|
||||
make given matrix zero
|
||||
"row 1", "a00", "a10", "a20", "a30"
|
||||
"row 2", "a01", "a11", "a21", "a31"
|
||||
|
||||
.. csv-table:: ma4x2 **(dest)**
|
||||
:header: "", "column 1", "column 2", "column 3", "column 4"
|
||||
|
||||
"row 1", "b00 = a00", "b10 = a10", "b20 = a20", "b30 = a30"
|
||||
"row 2", "b01 = a01", "b11 = a11", "b21 = a21", "b31 = a31"
|
||||
|
||||
.. c:function:: void glm_mat4x2_zero(mat4x2 m)
|
||||
|
||||
Zero out the mat4x2 (m).
|
||||
|
||||
Parameters:
|
||||
| *[in,out]* **mat** matrix
|
||||
| *[in, out]* **m** mat4x2 (src, dest)
|
||||
|
||||
.. c:function:: void glm_mat4x2_make(float * __restrict src, mat4x2 dest)
|
||||
.. csv-table:: mat4x2 **(m)**
|
||||
:header: "", "column 1", "column 2", "column 3", "column 4"
|
||||
|
||||
Create mat4x2 matrix from pointer
|
||||
"row 1", "0.00", "2.00", "15.00", "44.00"
|
||||
"row 2", "5.00", "4.00", "6.00", "12.00"
|
||||
|
||||
.. csv-table:: mat4x2 **(m)**
|
||||
:header: "", "column 1", "column 2", "column 3", "column 4"
|
||||
|
||||
"row 1", "0.00", "0.00", "0.00", "0.00"
|
||||
"row 2", "0.00", "0.00", "0.00", "0.00"
|
||||
|
||||
.. c:function:: void glm_mat4x2_make(const float * __restrict src, mat4x2 dest)
|
||||
|
||||
Create mat4x2 (dest) from pointer (src).
|
||||
|
||||
.. note:: **@src** must contain at least 8 elements.
|
||||
|
||||
| NOTE: **@src** must contain at least 8 elements.
|
||||
Parameters:
|
||||
| *[in]* **src** pointer to an array of floats
|
||||
| *[out]* **dest** destination matrix4x2
|
||||
| *[in]* **src** pointer to an array of floats (left)
|
||||
| *[out]* **dest** destination (result, mat4x2)
|
||||
|
||||
.. c:function:: void glm_mat4x2_mul(mat4x2 m1, mat2x4 m2, mat4 dest)
|
||||
.. csv-table:: float array (1x8) **(src)**
|
||||
:header: "", "column 1"
|
||||
|
||||
multiply m1 and m2 to dest
|
||||
"row 1", "v0"
|
||||
"row 2", "v1"
|
||||
"row 3", "v2"
|
||||
"row 4", "v3"
|
||||
"row 5", "v4"
|
||||
"row 6", "v5"
|
||||
"row 7", "v6"
|
||||
"row 8", "v7"
|
||||
|
||||
m1, m2 and dest matrices can be same matrix, it is possible to write this:
|
||||
.. csv-table:: mat4x2 **(dest)**
|
||||
:header: "", "column 1", "column 2", "column 3", "column 4"
|
||||
|
||||
"row 1", "v0", "v2", "v4", "v6"
|
||||
"row 2", "v1", "v3", "v5", "v7"
|
||||
|
||||
.. c:function:: void glm_mat4x2_mul(mat4x2 m1, mat2x4 m2, mat2 dest)
|
||||
|
||||
Multiply mat4x2 (m1) by mat2x4 (m2) and store in mat2 (dest).
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
glm_mat4x2_mul(m, m, m);
|
||||
glm_mat4x2_mul(mat4x2, mat2x4, mat2);
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m1** left matrix
|
||||
| *[in]* **m2** right matrix
|
||||
| *[out]* **dest** destination matrix
|
||||
| *[in]* **m1** mat4x2 (left)
|
||||
| *[in]* **m2** mat2x4 (right)
|
||||
| *[out]* **dest** destination (result, mat2)
|
||||
|
||||
.. c:function:: void glm_mat4x2_mulv(mat4x2 m, vec2 v, vec4 dest)
|
||||
.. csv-table:: mat4x2 **(m1)**
|
||||
:header: "", "column 1", "column 2", "column 3", "column 4"
|
||||
|
||||
multiply mat4x2 with vec2 (column vector) and store in dest vector
|
||||
"row 1", "a00", "a10", "a20", "a30"
|
||||
"row 2", "a01", "a11", "a21", "a31"
|
||||
|
||||
.. csv-table:: mat2x4 **(m2)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "b00", "b10"
|
||||
"row 2", "b01", "b11"
|
||||
"row 3", "b02", "b12"
|
||||
"row 4", "b03", "b13"
|
||||
|
||||
.. csv-table:: mat2x2 **(dest)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "a00 * b00 + a10 * b01 + a20 * b02 + a30 * b03", "a00 * b10 + a10 * b11 + a20 * b12 + a30 * b13"
|
||||
"row 2", "a01 * b00 + a11 * b01 + a21 * b02 + a31 * b03", "a01 * b10 + a11 * b11 + a21 * b12 + a31 * b13"
|
||||
|
||||
.. c:function:: void glm_mat4x2_mulv(mat4x2 m, vec4 v, vec2 dest)
|
||||
|
||||
Multiply mat4x2 (m) by vec4 (v) and store in vec2 (dest).
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** mat4x2 (left)
|
||||
| *[in]* **v** vec2 (right, column vector)
|
||||
| *[out]* **dest** destination (result, column vector)
|
||||
| *[in]* **m** mat4x2 (left)
|
||||
| *[in]* **v** vec4 (right, column vector)
|
||||
| *[out]* **dest** destination (result, column vector)
|
||||
|
||||
.. c:function:: void glm_mat4x2_transpose(mat4x2 m, mat2x4 dest)
|
||||
.. csv-table:: mat4x2 **(m)**
|
||||
:header: "", "column 1", "column 2", "column 3", "column 4"
|
||||
|
||||
transpose matrix and store in dest
|
||||
"row 1", "m00", "m10", "m20", "m30"
|
||||
"row 2", "m01", "m11", "m21", "m31"
|
||||
|
||||
.. csv-table:: column vec4 (1x4) **(v)**
|
||||
:header: "", "column 1"
|
||||
|
||||
"row 1", "v0"
|
||||
"row 2", "v1"
|
||||
"row 3", "v2"
|
||||
"row 4", "v3"
|
||||
|
||||
.. csv-table:: column vec2 (1x2) **(dest)**
|
||||
:header: "", "column 1"
|
||||
|
||||
"row 1", "m00 * v0 + m10 * v1 + m20 * v2 + m30 * v3"
|
||||
"row 2", "m01 * v0 + m11 * v1 + m21 * v2 + m31 * v3"
|
||||
|
||||
.. c:function:: void glm_mat4x2_transpose(mat4x2 src, mat2x4 dest)
|
||||
|
||||
Transpose mat4x2 (src) and store in mat2x4 (dest).
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** matrix
|
||||
| *[out]* **dest** destination
|
||||
| *[in]* **src** mat4x2 (left)
|
||||
| *[out]* **dest** destination (result, mat2x4)
|
||||
|
||||
.. csv-table:: mat4x2 **(src)**
|
||||
:header: "", "column 1", "column 2", "column 3", "column 4"
|
||||
|
||||
"row 1", "a00", "a10", "a20", "a30"
|
||||
"row 2", "a01", "a11", "a21", "a31"
|
||||
|
||||
.. csv-table:: mat2x4 **(dest)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "b00 = a00", "b10 = a01"
|
||||
"row 2", "b01 = a10", "b11 = a11"
|
||||
"row 3", "b02 = a20", "b12 = a21"
|
||||
"row 4", "b03 = a30", "b13 = a31"
|
||||
|
||||
.. c:function:: void glm_mat4x2_scale(mat4x2 m, float s)
|
||||
|
||||
multiply matrix with scalar
|
||||
Multiply mat4x2 (m) by scalar constant (s).
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** matrix
|
||||
| *[in]* **s** scalar
|
||||
| *[in, out]* **m** mat4x2 (src, dest)
|
||||
| *[in]* **s** float (scalar)
|
||||
|
||||
.. csv-table:: mat4x2 **(m)**
|
||||
:header: "", "column 1", "column 2", "column 3", "column 4"
|
||||
|
||||
"row 1", "m00 = m00 * s", "m10 = m10 * s", "m20 = m20 * s", "m30 = m30 * s"
|
||||
"row 2", "m01 = m01 * s", "m11 = m11 * s", "m21 = m21 * s", "m31 = m31 * s"
|
||||
|
||||
@@ -23,69 +23,195 @@ Functions:
|
||||
#. :c:func:`glm_mat4x3_transpose`
|
||||
#. :c:func:`glm_mat4x3_scale`
|
||||
|
||||
Represented
|
||||
~~~~~~~~~~~
|
||||
|
||||
.. csv-table:: mat4x3
|
||||
:header: "", "column 1", "column 2", "column 3", "column 4"
|
||||
|
||||
"row 1", "m00", "m10", "m20", "m30"
|
||||
"row 2", "m01", "m11", "m21", "m31"
|
||||
"row 3", "m02", "m12", "m22", "m32"
|
||||
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. c:function:: void glm_mat4x3_copy(mat4x3 mat, mat4x3 dest)
|
||||
.. c:function:: void glm_mat4x3_copy(mat4x3 src, mat4x3 dest)
|
||||
|
||||
copy mat4x3 to another one (dest).
|
||||
Copy mat4x3 (src) to mat4x3 (dest).
|
||||
|
||||
Parameters:
|
||||
| *[in]* **mat** source
|
||||
| *[out]* **dest** destination
|
||||
| *[in]* **src** mat4x3 (left)
|
||||
| *[out]* **dest** destination (result, mat4x3)
|
||||
|
||||
.. c:function:: void glm_mat4x3_zero(mat4x3 mat)
|
||||
.. csv-table:: mat4x3 **(src)**
|
||||
:header: "", "column 1", "column 2", "column 3", "column 4"
|
||||
|
||||
make given matrix zero
|
||||
"row 1", "a00", "a10", "a20", "a30"
|
||||
"row 2", "a01", "a11", "a21", "a31"
|
||||
"row 3", "a02", "a12", "a22", "a32"
|
||||
|
||||
.. csv-table:: mat4x3 **(dest)**
|
||||
:header: "", "column 1", "column 2", "column 3", "column 4"
|
||||
|
||||
"row 1", "b00 = a00", "b10 = a10", "b20 = a20", "b30 = a30"
|
||||
"row 2", "b01 = a01", "b11 = a11", "b21 = a21", "b31 = a31"
|
||||
"row 3", "b02 = a02", "b12 = a12", "b22 = a22", "b32 = a32"
|
||||
|
||||
.. c:function:: void glm_mat4x3_zero(mat4x3 m)
|
||||
|
||||
Zero out the mat4x3 (m).
|
||||
|
||||
Parameters:
|
||||
| *[in,out]* **mat** matrix
|
||||
| *[in, out]* **m** mat4x3 (src, dest)
|
||||
|
||||
.. c:function:: void glm_mat4x3_make(float * __restrict src, mat4x3 dest)
|
||||
.. csv-table:: mat4x3 **(m)**
|
||||
:header: "", "column 1", "column 2", "column 3", "column 4"
|
||||
|
||||
Create mat4x3 matrix from pointer
|
||||
"row 1", "0.00", "2.00", "15.00", "44.00"
|
||||
"row 2", "5.00", "4.00", "6.00", "12.00"
|
||||
"row 3", "88.00", "8.00", "4.30", "15.00"
|
||||
|
||||
.. csv-table:: mat4x3 **(m)**
|
||||
:header: "", "column 1", "column 2", "column 3", "column 4"
|
||||
|
||||
"row 1", "0.00", "0.00", "0.00", "0.00"
|
||||
"row 2", "0.00", "0.00", "0.00", "0.00"
|
||||
"row3", "0.00", "0.00", "0.00", "0.00"
|
||||
|
||||
.. c:function:: void glm_mat4x3_make(const float * __restrict src, mat4x3 dest)
|
||||
|
||||
Create mat4x3 (dest) from pointer (src).
|
||||
|
||||
.. note:: **@src** must contain at least 12 elements.
|
||||
|
||||
| NOTE: **@src** must contain at least 12 elements.
|
||||
Parameters:
|
||||
| *[in]* **src** pointer to an array of floats
|
||||
| *[out]* **dest** destination matrix4x3
|
||||
| *[in]* **src** pointer to an array of floats (left)
|
||||
| *[out]* **dest** destination (result, mat4x3)
|
||||
|
||||
.. c:function:: void glm_mat4x3_mul(mat4x3 m1, mat3x4 m2, mat4 dest)
|
||||
.. csv-table:: float array (1x12) **(src)**
|
||||
:header: "", "column 1"
|
||||
|
||||
multiply m1 and m2 to dest
|
||||
"row 1", "v0"
|
||||
"row 2", "v1"
|
||||
"row 3", "v2"
|
||||
"row 4", "v3"
|
||||
"row 5", "v4"
|
||||
"row 6", "v5"
|
||||
"row 7", "v6"
|
||||
"row 8", "v7"
|
||||
"row 9", "v8"
|
||||
"row 10", "v9"
|
||||
"row 11", "v10"
|
||||
"row 12", "v11"
|
||||
|
||||
m1, m2 and dest matrices can be same matrix, it is possible to write this:
|
||||
.. csv-table:: mat4x3 **(dest)**
|
||||
:header: "", "column 1", "column 2", "column 3", "column 4"
|
||||
|
||||
"row 1", "v0", "v3", "v6", "v9"
|
||||
"row 2", "v1", "v4", "v7", "v10"
|
||||
"row 3", "v2", "v5", "v8", "v11"
|
||||
|
||||
.. c:function:: void glm_mat4x3_mul(mat4x3 m1, mat3x4 m2, mat3 dest)
|
||||
|
||||
Multiply mat4x3 (m1) by mat3x4 (m2) and store in mat3 (dest).
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
glm_mat4x3_mul(m, m, m);
|
||||
glm_mat4x3_mul(mat4x3, mat3x4, mat3);
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m1** left matrix
|
||||
| *[in]* **m2** right matrix
|
||||
| *[out]* **dest** destination matrix
|
||||
| *[in]* **m1** mat4x3 (left)
|
||||
| *[in]* **m2** mat3x4 (right)
|
||||
| *[out]* **dest** destination (result, mat3)
|
||||
|
||||
.. c:function:: void glm_mat4x3_mulv(mat4x3 m, vec3 v, vec4 dest)
|
||||
.. csv-table:: mat4x3 **(m1)**
|
||||
:header: "", "column 1", "column 2", "column 3", "column 4"
|
||||
|
||||
multiply mat4x3 with vec3 (column vector) and store in dest vector
|
||||
"row 1", "a00", "a10", "a20", "a30"
|
||||
"row 2", "a01", "a11", "a21", "a31"
|
||||
"row 3", "a02", "a12", "a22", "a32"
|
||||
|
||||
.. csv-table:: mat3x4 **(m2)**
|
||||
:header: "", "column 1", "column 2", "column 3"
|
||||
|
||||
"row 1", "b00", "b10", "b20"
|
||||
"row 2", "b01", "b11", "b21"
|
||||
"row 3", "b02", "b12", "b22"
|
||||
"row 4", "b03", "b13", "b23"
|
||||
|
||||
.. csv-table:: mat3x3 **(dest)**
|
||||
:header: "", "column 1", "column 2", "column 3"
|
||||
|
||||
"row 1", "a00 * b00 + a10 * b01 + a20 * b02 + a30 * b03", "a00 * b10 + a10 * b11 + a20 * b12 + a30 * b13", "a00 * b20 + a10 * b21 + a20 * b22 + a30 * b23"
|
||||
"row 2", "a01 * b00 + a11 * b01 + a21 * b02 + a31 * b03", "a01 * b10 + a11 * b11 + a21 * b12 + a31 * b13", "a01 * b20 + a11 * b21 + a21 * b22 + a31 * b23"
|
||||
"row 3", "a02 * b00 + a12 * b01 + a22 * b02 + a32 * b03", "a02 * b10 + a12 * b11 + a22 * b12 + a32 * b13", "a02 * b20 + a12 * b21 + a22 * b22 + a32 * b23"
|
||||
|
||||
.. c:function:: void glm_mat4x3_mulv(mat4x3 m, vec4 v, vec3 dest)
|
||||
|
||||
Multiply mat4x3 (m) by vec4 (v) and store in vec3 (dest).
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** mat4x3 (left)
|
||||
| *[in]* **v** vec3 (right, column vector)
|
||||
| *[out]* **dest** destination (result, column vector)
|
||||
| *[in]* **m** mat4x3 (left)
|
||||
| *[in]* **v** vec4 (right, column vector)
|
||||
| *[out]* **dest** destination (result, column vector)
|
||||
|
||||
.. c:function:: void glm_mat4x3_transpose(mat4x3 m, mat3x4 dest)
|
||||
.. csv-table:: mat4x3 **(m)**
|
||||
:header: "", "column 1", "column 2", "column 3", "column 4"
|
||||
|
||||
transpose matrix and store in dest
|
||||
"row 1", "m00", "m10", "m20", "m30"
|
||||
"row 2", "m01", "m11", "m21", "m31"
|
||||
"row 3", "m02", "m12", "m22", "m32"
|
||||
|
||||
.. csv-table:: column vec4 (1x4) **(v)**
|
||||
:header: "", "column 1"
|
||||
|
||||
"row 1", "v0"
|
||||
"row 2", "v1"
|
||||
"row 3", "v2"
|
||||
"row 4", "v3"
|
||||
|
||||
.. csv-table:: column vec3 (1x3) **(dest)**
|
||||
:header: "", "column 1"
|
||||
|
||||
"row 1", "m00 * v0 + m10 * v1 + m20 * v2 + m30 * v3"
|
||||
"row 2", "m01 * v0 + m11 * v1 + m21 * v2 + m31 * v3"
|
||||
"row 3", "m02 * v0 + m12 * v1 + m22 * v2 + m32 * v3"
|
||||
|
||||
.. c:function:: void glm_mat4x3_transpose(mat4x3 src, mat3x4 dest)
|
||||
|
||||
Transpose mat4x3 (src) and store in mat3x4 (dest).
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** matrix
|
||||
| *[out]* **dest** destination
|
||||
| *[in]* **src** mat4x3 (left)
|
||||
| *[out]* **dest** destination (result, mat3x4)
|
||||
|
||||
.. c:function:: void glm_mat4x3_scale(mat4x3 m, float s)
|
||||
.. csv-table:: mat4x3 **(src)**
|
||||
:header: "", "column 1", "column 2", "column 3", "column 4"
|
||||
|
||||
multiply matrix with scalar
|
||||
"row 1", "a00", "a10", "a20", "a30"
|
||||
"row 2", "a01", "a11", "a21", "a31"
|
||||
"row 3", "a02", "a12", "a22", "a32"
|
||||
|
||||
.. csv-table:: mat3x4 **(dest)**
|
||||
:header: "", "column 1", "column 2", "column 3"
|
||||
|
||||
"row 1", "b00 = a00", "b10 = a01", "b20 = a02"
|
||||
"row 2", "b01 = a10", "b11 = a11", "b21 = a12"
|
||||
"row 3", "b02 = a20", "b12 = a21", "b22 = a22"
|
||||
"row 4", "b03 = a30", "b13 = a31", "b23 = a32"
|
||||
|
||||
.. c:function:: void glm_mat4x3_scale(mat4x3 m, float s)
|
||||
|
||||
Multiply mat4x3 (m) by scalar constant (s).
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** matrix
|
||||
| *[in]* **s** scalar
|
||||
| *[in, out]* **m** mat4x3 (src, dest)
|
||||
| *[in]* **s** float (scalar)
|
||||
|
||||
.. csv-table:: mat4x3 **(m)**
|
||||
:header: "", "column 1", "column 2", "column 3", "column 4"
|
||||
|
||||
"row 1", "m00 = m00 * s", "m10 = m10 * s", "m20 = m20 * s", "m30 = m30 * s"
|
||||
"row 2", "m01 = m01 * s", "m11 = m11 * s", "m21 = m21 * s", "m31 = m31 * s"
|
||||
"row 3", "m02 = m02 * s", "m12 = m12 * s", "m22 = m22 * s", "m32 = m32 * s"
|
||||
|
||||
60
docs/source/noise.rst
Normal file
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
|
||||
@@ -34,7 +34,7 @@ array of matrices:
|
||||
/* ... */
|
||||
glUniformMatrix4fv(location, count, GL_FALSE, matrix[0][0]);
|
||||
|
||||
1. Cast matrix to pointer
|
||||
2. Cast matrix to pointer
|
||||
--------------------------
|
||||
|
||||
.. code-block:: c
|
||||
@@ -43,14 +43,14 @@ array of matrices:
|
||||
/* ... */
|
||||
glUniformMatrix4fv(location, count, GL_FALSE, (float *)matrix);
|
||||
|
||||
in this way, passing aray of matrices is same
|
||||
in this way, passing array of matrices is same
|
||||
|
||||
Passing / Uniforming Vectors to OpenGL:
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
You don't need to do extra thing when passing cglm vectors to OpengL or other APIs.
|
||||
Because a function like **glUniform4fv** accepts vector as pointer. cglm's vectors
|
||||
are array of floats. So you can pass it directly ot those functions:
|
||||
are array of floats. So you can pass it directly to those functions:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
|
||||
@@ -5,35 +5,33 @@
|
||||
|
||||
A few options are provided via macros.
|
||||
|
||||
❗️ IMPORTANT ❗️
|
||||
|
||||
It's a good idea to set up your config macros in build settings like CMake, Xcode, or Visual Studio. This is especially important if you're using features like Modules in Xcode, where adding macros directly before the **cglm** headers might not work.
|
||||
|
||||
Alignment Option
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
As default, cglm requires types to be aligned. Alignment requirements:
|
||||
By default, **cglm** requires types to be aligned with specific byte requirements:
|
||||
|
||||
vec3: 8 byte
|
||||
vec4: 16 byte
|
||||
mat4: 16 byte
|
||||
versor: 16 byte
|
||||
- vec3: 8 bytes
|
||||
- vec4: 16 bytes
|
||||
- mat4: 16 bytes (32 on AVX)
|
||||
- versor: 16 bytes
|
||||
|
||||
By starting **v0.4.5** cglm provides an option to disable alignment requirement.
|
||||
To enable this option define **CGLM_ALL_UNALIGNED** macro before all headers.
|
||||
You can define it in Xcode, Visual Studio (or other IDEs) or you can also prefer
|
||||
to define it in build system. If you use pre-compiled versions then you
|
||||
have to compile cglm with **CGLM_ALL_UNALIGNED** macro.
|
||||
Starting with **v0.4.5**, **cglm** offers an option to relax these alignment requirements. To use this option, define the **CGLM_ALL_UNALIGNED** macro before including any headers. This definition can be made within Xcode, Visual Studio, other IDEs, or directly in your build system. If using pre-compiled versions of **cglm**, you'll need to compile them with the **CGLM_ALL_UNALIGNED** macro.
|
||||
|
||||
**VERY VERY IMPORTANT:** If you use cglm in multiple projects and
|
||||
those projects are depends on each other, then
|
||||
**❗️NOTE:❗️** If you're using **cglm** across multiple interdependent projects:
|
||||
|
||||
| *ALWAYS* or *NEVER USE* **CGLM_ALL_UNALIGNED** macro in linked projects
|
||||
- Always or never use the **CGLM_ALL_UNALIGNED** macro in all linked projects to avoid configuration conflicts. A **cglm** header from one project could require alignment, while a header from another might not, leading to **cglm** functions accessing invalid memory locations.
|
||||
|
||||
if you do not know what you are doing. Because a cglm header included
|
||||
via 'project A' may force types to be aligned and another cglm header
|
||||
included via 'project B' may not require alignment. In this case
|
||||
cglm functions will read from and write to **INVALID MEMORY LOCATIONs**.
|
||||
- **Key Point:** Maintain the same **cglm** configuration across all your projects. For example, if you activate **CGLM_ALL_UNALIGNED** in one project, ensure it's set in the others too.
|
||||
|
||||
ALWAYS USE SAME CONFIGURATION / OPTION for **cglm** if you have multiple projects.
|
||||
**❗️NOTE:❗️**
|
||||
|
||||
For instance if you set CGLM_ALL_UNALIGNED in a project then set it in other projects too
|
||||
While **CGLM_ALL_UNALIGNED** allows for flexibility in alignment, it doesn't override C's fundamental alignment rules. For example, an array like *vec4* decays to a pointer (float*) in functions, which must adhere to the alignment requirements of a float pointer (4 bytes). This adherence is crucial because **cglm** directly dereferences these pointers instead of copying data, and failing to meet alignment requirements can lead to unpredictable errors, such as crashes.
|
||||
|
||||
You can use `CGLM_ALIGN` and `CGLM_ALIGN_MAT` macros for aligning local variables or struct members. However, when dealing with dynamic memory allocation or custom memory locations, you'll need to ensure alignment requirements are met appropriately for those cases
|
||||
|
||||
Clipspace Option[s]
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
@@ -43,7 +41,7 @@ By starting **v0.8.3** cglm provides options to switch between clipspace configu
|
||||
Clipspace related files are located at `include/cglm/[struct]/clipspace.h` but
|
||||
these are included in related files like `cam.h`. If you don't want to change your existing
|
||||
clipspace configuration and want to use different clipspace function like `glm_lookat_zo` or `glm_lookat_lh_zo`...
|
||||
then you can include individual headers or just define `CGLM_CLIPSPACE_INCLUDE_ALL` which will iclude all headers for you.
|
||||
then you can include individual headers or just define `CGLM_CLIPSPACE_INCLUDE_ALL` which will include all headers for you.
|
||||
|
||||
1. **CGLM_CLIPSPACE_INCLUDE_ALL**
|
||||
2. **CGLM_FORCE_DEPTH_ZERO_TO_ONE**
|
||||
@@ -78,7 +76,7 @@ SSE and SSE2 Shuffle Option
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
**_mm_shuffle_ps** generates **shufps** instruction even if registers are same.
|
||||
You can force it to generate **pshufd** instruction by defining
|
||||
**CGLM_USE_INT_DOMAIN** macro. As default it is not defined.
|
||||
**CGLM_NO_INT_DOMAIN** macro. As default it is not defined.
|
||||
|
||||
SSE3 and SSE4 Dot Product Options
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
@@ -11,9 +11,9 @@ Header: cglm/quat.h
|
||||
|
||||
What you can do with quaternions with existing functions is (Some of them):
|
||||
|
||||
- You can rotate transform matrix using quaterion
|
||||
- You can rotate vector using quaterion
|
||||
- You can create view matrix using quaterion
|
||||
- You can rotate transform matrix using quaternion
|
||||
- You can rotate vector using quaternion
|
||||
- You can create view matrix using quaternion
|
||||
- You can create a lookrotation (from source point to dest)
|
||||
|
||||
Table of contents (click to go):
|
||||
@@ -55,6 +55,7 @@ Functions:
|
||||
#. :c:func:`glm_quat_lerp`
|
||||
#. :c:func:`glm_quat_nlerp`
|
||||
#. :c:func:`glm_quat_slerp`
|
||||
#. :c:func:`glm_quat_slerp_longest`
|
||||
#. :c:func:`glm_quat_look`
|
||||
#. :c:func:`glm_quat_for`
|
||||
#. :c:func:`glm_quat_forp`
|
||||
@@ -351,6 +352,17 @@ Functions documentation
|
||||
| *[in]* **t** interpolant (amount) clamped between 0 and 1
|
||||
| *[out]* **dest** result quaternion
|
||||
|
||||
.. c:function:: void glm_quat_slerp_longest(versor q, versor r, float t, versor dest)
|
||||
|
||||
| interpolates between two quaternions
|
||||
| using spherical linear interpolation (SLERP) and always takes the longest path
|
||||
|
||||
Parameters:
|
||||
| *[in]* **from** from
|
||||
| *[in]* **to** to
|
||||
| *[in]* **t** interpolant (amount) clamped between 0 and 1
|
||||
| *[out]* **dest** result quaternion
|
||||
|
||||
.. c:function:: void glm_quat_look(vec3 eye, versor ori, mat4 dest)
|
||||
|
||||
| creates view matrix using quaternion as camera orientation
|
||||
@@ -422,11 +434,11 @@ Functions documentation
|
||||
| *[in]* **q** quaternion
|
||||
| *[in]* **pivot** pivot
|
||||
|
||||
.. c:function:: void glm_quat_make(float * __restrict src, versor dest)
|
||||
.. c:function:: void glm_quat_make(const float * __restrict src, versor dest)
|
||||
|
||||
Create quaternion from pointer
|
||||
|
||||
| NOTE: **@src** must contain at least 4 elements. cglm store quaternions as [x, y, z, w].
|
||||
.. note:: **@src** must contain at least 4 elements. cglm store quaternions as [x, y, z, w].
|
||||
|
||||
Parameters:
|
||||
| *[in]* **src** pointer to an array of floats
|
||||
|
||||
@@ -13,6 +13,8 @@ Table of contents (click to go):
|
||||
Functions:
|
||||
|
||||
1. :c:func:`glm_ray_triangle`
|
||||
#. :c:func:`glm_ray_sphere`
|
||||
#. :c:func:`glm_ray_at`
|
||||
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
@@ -29,3 +31,39 @@ Functions documentation
|
||||
| *[in]* **v2** third vertex of triangle
|
||||
| *[in, out]* **d** float pointer to save distance to intersection
|
||||
| *[out]* **intersection** whether there is intersection
|
||||
|
||||
.. c:function:: bool glm_ray_sphere(vec3 origin, vec3 dir, vec4 s, float * __restrict t1, float * __restrict t2)
|
||||
|
||||
ray sphere intersection
|
||||
|
||||
returns false if there is no intersection if true:
|
||||
|
||||
- t1 > 0, t2 > 0: ray intersects the sphere at t1 and t2 both ahead of the origin
|
||||
- t1 < 0, t2 > 0: ray starts inside the sphere, exits at t2
|
||||
- t1 < 0, t2 < 0: no intersection ahead of the ray ( returns false )
|
||||
- the caller can check if the intersection points (t1 and t2) fall within a
|
||||
specific range (for example, tmin < t1, t2 < tmax) to determine if the
|
||||
intersections are within a desired segment of the ray
|
||||
|
||||
Parameters:
|
||||
| *[in]* **origin** ray origin
|
||||
| *[in]* **dir** normalized ray direction
|
||||
| *[in]* **s** sphere [center.x, center.y, center.z, radii]
|
||||
| *[out]* **t1** near point1 (closer to origin)
|
||||
| *[out]* **t2** far point2 (farther from origin)
|
||||
|
||||
Return:
|
||||
| whether there is intersection
|
||||
|
||||
.. c:function:: bool glm_ray_at(vec3 orig, vec3 dir, float t, vec3 point)
|
||||
|
||||
point using t by 𝐏(𝑡)=𝐀+𝑡𝐛
|
||||
|
||||
Parameters:
|
||||
| *[in]* **origin** ray origin
|
||||
| *[in]* **dir** ray direction
|
||||
| *[out]* **t** parameter
|
||||
| *[out]* **point** point at t
|
||||
|
||||
Return:
|
||||
| point at t
|
||||
|
||||
@@ -9,7 +9,7 @@ Header: cglm/sphere.h
|
||||
|
||||
Sphere Representation in cglm is *vec4*: **[center.x, center.y, center.z, radii]**
|
||||
|
||||
You can call any vec3 function by pasing sphere. Because first three elements
|
||||
You can call any vec3 function by passing sphere. Because first three elements
|
||||
defines center of sphere.
|
||||
|
||||
Table of contents (click to go):
|
||||
|
||||
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; }
|
||||
|
||||
}
|
||||
@@ -3,30 +3,30 @@
|
||||
Troubleshooting
|
||||
================================================================================
|
||||
|
||||
It is possible that sometimes you may get crashes or wrong results.
|
||||
It is possible that you may sometimes get crashes or wrong results.
|
||||
Follow these topics
|
||||
|
||||
Memory Allocation:
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Again, **cglm** doesn't alloc any memory on heap.
|
||||
cglm functions works like memcpy; it copies data from src,
|
||||
makes calculations then copy the result to dest.
|
||||
Recall that **cglm** does not alloc any memory on the heap.
|
||||
cglm functions work like memcpy; they copy data from src,
|
||||
make calculations, then copy the result to dest.
|
||||
|
||||
You are responsible for allocation of **src** and **dest** parameters.
|
||||
|
||||
Alignment:
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
**vec4** and **mat4** types requires 16 byte alignment.
|
||||
These types are marked with align attribute to let compiler know about this
|
||||
**vec4** and **mat4** types require 16 byte alignment.
|
||||
These types are marked with the align attribute to let the compiler know about this
|
||||
requirement.
|
||||
|
||||
But since MSVC (Windows) throws the error:
|
||||
Since MSVC (Windows) throws this error:
|
||||
|
||||
**"formal parameter with requested alignment of 16 won't be aligned"**
|
||||
|
||||
The alignment attribute has been commented for MSVC
|
||||
The alignment attribute has been commented out for MSVC
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
@@ -37,61 +37,61 @@ The alignment attribute has been commented for MSVC
|
||||
#endif.
|
||||
|
||||
So MSVC may not know about alignment requirements when creating variables.
|
||||
The interesting thing is that, if I remember correctly Visual Studio 2017
|
||||
The interesting thing is that, if I remember correctly, Visual Studio 2017
|
||||
doesn't throw the above error. So we may uncomment that line for Visual Studio 2017,
|
||||
you may do it yourself.
|
||||
|
||||
**This MSVC issue is still in TODOs.**
|
||||
|
||||
**UPDATE:** By starting v0.4.5 cglm provides an option to disable alignment requirement.
|
||||
Also alignment is disabled for older msvc verisons as default. Now alignment is only required in Visual Studio 2017 version 15.6+ if CGLM_ALL_UNALIGNED macro is not defined.
|
||||
**UPDATE:** Starting with v0.4.5, cglm provides an option to disable the alignment requirement.
|
||||
Also, alignment is disabled for older msvc versions by default. Now alignment is only required in Visual Studio 2017 version 15.6+ if the CGLM_ALL_UNALIGNED macro is not defined.
|
||||
|
||||
Crashes, Invalid Memory Access:
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Probably you are trying to write to invalid memory location.
|
||||
Most likely, you are trying to write to an invalid memory location.
|
||||
|
||||
You may used wrong function for what you want to do.
|
||||
You may have used a wrong function for what you want to do.
|
||||
|
||||
For instance you may called **glm_vec4_** functions for **vec3** data type.
|
||||
It will try to write 32 byte but since **vec3** is 24 byte it should throw
|
||||
memory access error or exit the app without saying anything.
|
||||
For example, you may have called a **glm_vec4_** function for a **vec3** data type.
|
||||
It will try to write 32 bytes, but since **vec3** is 24 bytes, it should throw
|
||||
a memory access error or exit the app without saying anything.
|
||||
|
||||
**UPDATE - IMPORTANT:**
|
||||
|
||||
| On MSVC or some other compilers, if alignment is enabled (default) then double check alignment requirements if you got a crash.
|
||||
|
||||
| If you send GLM_VEC4_ONE or similar macros directly to a function, it may be crashed.
|
||||
| Because compiler may not apply alignment as defined on **typedef** to that macro while passing it (on stack) to a function.
|
||||
| If you send GLM_VEC4_ONE or similar macros directly to a function, it may crash.
|
||||
| Because the compiler may not apply alignment as defined on **typedef** to that macro while passing it (on stack) to a function.
|
||||
|
||||
Wrong Results:
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Again, you may used wrong function.
|
||||
Again, you may have used a wrong function.
|
||||
|
||||
For instance if you use **glm_normalize()** or **glm_vec3_normalize()** for **vec4**,
|
||||
it will assume that passed param is **vec3** and will normalize it for **vec3**.
|
||||
Since you need to **vec4** to be normalized in your case, you will get wrong results.
|
||||
For instance if you use **glm_normalize()** or **glm_vec3_normalize()** for a **vec4**,
|
||||
it will assume that the passed param is a **vec3**, and will normalize it for **vec3**.
|
||||
Since you need a **vec4** to be normalized in your case, you will get wrong results.
|
||||
|
||||
Accessing vec4 type with vec3 functions is valid, you will not get any error, exception or crash.
|
||||
Accessing a vec4 type with vec3 functions is valid, you will not get any error, exception or crash.
|
||||
You only get wrong results if you don't know what you are doing!
|
||||
|
||||
So be carefull, when your IDE (Xcode, Visual Studio ...) tried to autocomplete function names, READ IT :)
|
||||
So be careful, when your IDE (Xcode, Visual Studio ...) tries to autocomplete function names, READ IT :)
|
||||
|
||||
**Also implementation may be wrong please let us know by creating an issue on Github.**
|
||||
**Also implementation may be wrong, please let us know by creating an issue on Github.**
|
||||
|
||||
BAD_ACCESS : Thread 1: EXC_BAD_ACCESS (code=EXC_I386_GPFLT) or Similar Errors/Crashes
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
This is similar issue with alignment. For instance if you compiled **cglm** with
|
||||
This is a similar issue with alignment. For instance if you compiled **cglm** with
|
||||
AVX (**-mavx**, intentionally or not) and if you use **cglm** in an environment that doesn't
|
||||
support AVX (or if AVX is disabled intentionally) e.g. environment that max support SSE2/3/4,
|
||||
then you probably get **BAD ACCESS** or similar...
|
||||
|
||||
Because if you compile **cglm** with AVX it aligns **mat4** with 32 byte boundary,
|
||||
and your project aligns that as 16 byte boundary...
|
||||
and your project aligns that as a 16 byte boundary...
|
||||
|
||||
Check alignment, supported vector extension or simd in **cglm** and linked projects...
|
||||
Check alignment, supported vector extension, or simd in **cglm** and linked projects...
|
||||
|
||||
Other Issues?
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
@@ -68,14 +68,14 @@ Functions documentation
|
||||
|
||||
.. c:function:: void glm_make_rad(float *degm)
|
||||
|
||||
| convert exsisting degree to radians. this will override degrees value
|
||||
| convert existing degree to radians. this will override degrees value
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **deg** pointer to angle in degrees
|
||||
|
||||
.. c:function:: void glm_make_deg(float *rad)
|
||||
|
||||
| convert exsisting radians to degree. this will override radians value
|
||||
| convert existing radians to degree. this will override radians value
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **rad** pointer to angle in radians
|
||||
|
||||
@@ -27,6 +27,8 @@ Functions:
|
||||
#. :c:func:`glm_vec2_isvalid`
|
||||
#. :c:func:`glm_vec2_sign`
|
||||
#. :c:func:`glm_vec2_abs`
|
||||
#. :c:func:`glm_vec2_fract`
|
||||
#. :c:func:`glm_vec2_floor`
|
||||
#. :c:func:`glm_vec2_sqrt`
|
||||
|
||||
Functions documentation
|
||||
@@ -134,6 +136,22 @@ Functions documentation
|
||||
| *[in]* **v** vector
|
||||
| *[out]* **dest** destination vector
|
||||
|
||||
.. c:function:: void glm_vec2_fract(vec2 v, vec2 dest)
|
||||
|
||||
get fractional part of each vector item
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[out]* **dest** destination vector
|
||||
|
||||
.. c:function:: void glm_vec2_floor(vec2 v, vec2 dest)
|
||||
|
||||
floor value of each vector item
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[out]* **dest** destination vector
|
||||
|
||||
.. c:function:: void glm_vec2_sqrt(vec2 v, vec2 dest)
|
||||
|
||||
square root of each vector item
|
||||
|
||||
@@ -45,6 +45,7 @@ Functions:
|
||||
#. :c:func:`glm_vec2_normalize`
|
||||
#. :c:func:`glm_vec2_normalize_to`
|
||||
#. :c:func:`glm_vec2_rotate`
|
||||
#. :c:func:`glm_vec2_center`
|
||||
#. :c:func:`glm_vec2_distance2`
|
||||
#. :c:func:`glm_vec2_distance`
|
||||
#. :c:func:`glm_vec2_maxv`
|
||||
@@ -52,6 +53,8 @@ Functions:
|
||||
#. :c:func:`glm_vec2_clamp`
|
||||
#. :c:func:`glm_vec2_lerp`
|
||||
#. :c:func:`glm_vec2_make`
|
||||
#. :c:func:`glm_vec2_reflect`
|
||||
#. :c:func:`glm_vec2_refract`
|
||||
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
@@ -116,7 +119,7 @@ Functions documentation
|
||||
norm * norm (magnitude) of vector
|
||||
|
||||
we can use this func instead of calling norm * norm, because it would call
|
||||
sqrtf fuction twice but with this func we can avoid func call, maybe this is
|
||||
sqrtf function twice but with this func we can avoid func call, maybe this is
|
||||
not good name for this func
|
||||
|
||||
Parameters:
|
||||
@@ -314,6 +317,15 @@ Functions documentation
|
||||
| *[in]* **axis** axis vector
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_vec2_center(vec2 v1, vec2 v2, vec2 dest)
|
||||
|
||||
find center point of two vector
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v1** vector1
|
||||
| *[in]* **v2** vector2
|
||||
| *[out]* **dest** center point
|
||||
|
||||
.. c:function:: float glm_vec2_distance2(vec2 v1, vec2 v2)
|
||||
|
||||
squared distance between two vectors
|
||||
@@ -375,11 +387,38 @@ Functions documentation
|
||||
| *[in]* **t** interpolant (amount) clamped between 0 and 1
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_vec2_make(float * __restrict src, vec2 dest)
|
||||
.. c:function:: void glm_vec2_make(const float * __restrict src, vec2 dest)
|
||||
|
||||
Create two dimensional vector from pointer
|
||||
|
||||
| NOTE: **@src** must contain at least 2 elements.
|
||||
.. note:: **@src** must contain at least 2 elements.
|
||||
|
||||
Parameters:
|
||||
| *[in]* **src** pointer to an array of floats
|
||||
| *[out]* **dest** destination vector
|
||||
|
||||
.. c:function:: void glm_vec2_reflect(vec2 v, vec2 n, vec2 dest)
|
||||
|
||||
Reflection vector using an incident ray and a surface normal
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** incident vector
|
||||
| *[in]* **n** *❗️ normalized ❗️* normal vector
|
||||
| *[out]* **dest** destination: reflection result
|
||||
|
||||
.. c:function:: bool glm_vec2_refract(vec2 v, vec2 n, float eta, vec2 dest)
|
||||
|
||||
Computes refraction vector for an incident vector and a surface normal.
|
||||
|
||||
Calculates the refraction vector based on Snell's law. If total internal reflection
|
||||
occurs (angle too great given eta), dest is set to zero and returns false.
|
||||
Otherwise, computes refraction vector, stores it in dest, and returns true.
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** *❗️ normalized ❗️* incident vector
|
||||
| *[in]* **n** *❗️ normalized ❗️* normal vector
|
||||
| *[in]* **eta** ratio of indices of refraction (incident/transmitted)
|
||||
| *[out]* **dest** refraction vector if refraction occurs; zero vector otherwise
|
||||
|
||||
Returns:
|
||||
returns true if refraction occurs; false if total internal reflection occurs.
|
||||
|
||||
@@ -28,6 +28,8 @@ Functions:
|
||||
#. :c:func:`glm_vec3_isvalid`
|
||||
#. :c:func:`glm_vec3_sign`
|
||||
#. :c:func:`glm_vec3_abs`
|
||||
#. :c:func:`glm_vec3_fract`
|
||||
#. :c:func:`glm_vec3_floor`
|
||||
#. :c:func:`glm_vec3_sqrt`
|
||||
|
||||
Functions documentation
|
||||
@@ -50,6 +52,14 @@ Functions documentation
|
||||
| *[in]* **val** value
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_vec3_fill(vec3 v, float val)
|
||||
|
||||
fill a vector with specified value
|
||||
|
||||
Parameters:
|
||||
| *[out]* **v** vector
|
||||
| *[in]* **val** value
|
||||
|
||||
.. c:function:: bool glm_vec3_eq(vec3 v, float val)
|
||||
|
||||
check if vector is equal to value (without epsilon)
|
||||
@@ -143,6 +153,22 @@ Functions documentation
|
||||
| *[in]* **v** vector
|
||||
| *[out]* **dest** destination vector
|
||||
|
||||
.. c:function:: void glm_vec3_fract(vec3 v, vec3 dest)
|
||||
|
||||
fractional part of each vector item
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[out]* **dest** destination vector
|
||||
|
||||
.. c:function:: void glm_vec3_floor(vec3 v, vec3 dest)
|
||||
|
||||
floor of each vector item
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[out]* **dest** destination vector
|
||||
|
||||
.. c:function:: void glm_vec3_sqrt(vec3 v, vec3 dest)
|
||||
|
||||
square root of each vector item
|
||||
|
||||
@@ -13,7 +13,7 @@ Header: cglm/vec3.h
|
||||
We mostly use vectors in graphics math, to make writing code faster
|
||||
and easy to read, some *vec3* functions are aliased in global namespace.
|
||||
For instance :c:func:`glm_dot` is alias of :c:func:`glm_vec3_dot`,
|
||||
alias means inline wrapper here. There is no call verison of alias functions
|
||||
alias means inline wrapper here. There is no call version of alias functions
|
||||
|
||||
There are also functions for rotating *vec3* vector. **_m4**, **_m3** prefixes
|
||||
rotate *vec3* with matrix.
|
||||
@@ -80,6 +80,9 @@ Functions:
|
||||
#. :c:func:`glm_vec3_clamp`
|
||||
#. :c:func:`glm_vec3_lerp`
|
||||
#. :c:func:`glm_vec3_make`
|
||||
#. :c:func:`glm_vec3_faceforward`
|
||||
#. :c:func:`glm_vec3_reflect`
|
||||
#. :c:func:`glm_vec3_refract`
|
||||
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
@@ -148,7 +151,7 @@ Functions documentation
|
||||
norm * norm (magnitude) of vector
|
||||
|
||||
we can use this func instead of calling norm * norm, because it would call
|
||||
sqrtf fuction twice but with this func we can avoid func call, maybe this is
|
||||
sqrtf function twice but with this func we can avoid func call, maybe this is
|
||||
not good name for this func
|
||||
|
||||
Parameters:
|
||||
@@ -309,7 +312,7 @@ Functions documentation
|
||||
|
||||
.. c:function:: void glm_vec3_flipsign(vec3 v)
|
||||
|
||||
**DEPRACATED!**
|
||||
**DEPRECATED!**
|
||||
|
||||
use :c:func:`glm_vec3_negate`
|
||||
|
||||
@@ -318,7 +321,7 @@ Functions documentation
|
||||
|
||||
.. c:function:: void glm_vec3_flipsign_to(vec3 v, vec3 dest)
|
||||
|
||||
**DEPRACATED!**
|
||||
**DEPRECATED!**
|
||||
|
||||
use :c:func:`glm_vec3_negate_to`
|
||||
|
||||
@@ -328,7 +331,7 @@ Functions documentation
|
||||
|
||||
.. c:function:: void glm_vec3_inv(vec3 v)
|
||||
|
||||
**DEPRACATED!**
|
||||
**DEPRECATED!**
|
||||
|
||||
use :c:func:`glm_vec3_negate`
|
||||
|
||||
@@ -337,7 +340,7 @@ Functions documentation
|
||||
|
||||
.. c:function:: void glm_vec3_inv_to(vec3 v, vec3 dest)
|
||||
|
||||
**DEPRACATED!**
|
||||
**DEPRECATED!**
|
||||
|
||||
use :c:func:`glm_vec3_negate_to`
|
||||
|
||||
@@ -377,7 +380,7 @@ Functions documentation
|
||||
|
||||
.. c:function:: float glm_vec3_angle(vec3 v1, vec3 v2)
|
||||
|
||||
angle betwen two vector
|
||||
angle between two vector
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v1** vector1
|
||||
@@ -503,12 +506,49 @@ Functions documentation
|
||||
| *[in]* **t** interpolant (amount) clamped between 0 and 1
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_vec3_make(float * __restrict src, vec3 dest)
|
||||
.. c:function:: void glm_vec3_make(const float * __restrict src, vec3 dest)
|
||||
|
||||
Create three dimensional vector from pointer
|
||||
|
||||
| NOTE: **@src** must contain at least 3 elements.
|
||||
.. note::: **@src** must contain at least 3 elements.
|
||||
|
||||
Parameters:
|
||||
| *[in]* **src** pointer to an array of floats
|
||||
| *[out]* **dest** destination vector
|
||||
|
||||
.. c:function:: void glm_vec3_faceforward(vec3 n, vec3 v, vec3 nref, vec3 dest)
|
||||
|
||||
A vector pointing in the same direction as another
|
||||
|
||||
Parameters:
|
||||
| *[in]* **n** vector to orient
|
||||
| *[in]* **v** incident vector
|
||||
| *[in]* **nref** reference vector
|
||||
| *[out]* **dest** destination: oriented vector, pointing away from the surface.
|
||||
|
||||
.. c:function:: void glm_vec3_reflect(vec3 v, vec3 n, vec3 dest)
|
||||
|
||||
Reflection vector using an incident ray and a surface normal
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** incident vector
|
||||
| *[in]* **n** *❗️ normalized ❗️* normal vector
|
||||
| *[out]* **dest** destination: reflection result
|
||||
|
||||
.. c:function:: bool glm_vec3_refract(vec3 v, vec3 n, float eta, vec3 dest)
|
||||
|
||||
|
||||
Computes refraction vector for an incident vector and a surface normal.
|
||||
|
||||
Calculates the refraction vector based on Snell's law. If total internal reflection
|
||||
occurs (angle too great given eta), dest is set to zero and returns false.
|
||||
Otherwise, computes refraction vector, stores it in dest, and returns true.
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** *❗️ normalized ❗️* incident vector
|
||||
| *[in]* **n** *❗️ normalized ❗️* normal vector
|
||||
| *[in]* **eta** ratio of indices of refraction (incident/transmitted)
|
||||
| *[out]* **dest** refraction vector if refraction occurs; zero vector otherwise
|
||||
|
||||
Returns:
|
||||
returns true if refraction occurs; false if total internal reflection occurs.
|
||||
|
||||
@@ -23,6 +23,15 @@ Functions:
|
||||
#. :c:func:`glm_vec4_eqv_eps`
|
||||
#. :c:func:`glm_vec4_max`
|
||||
#. :c:func:`glm_vec4_min`
|
||||
#. :c:func:`glm_vec4_isnan`
|
||||
#. :c:func:`glm_vec4_isinf`
|
||||
#. :c:func:`glm_vec4_isvalid`
|
||||
#. :c:func:`glm_vec4_sign`
|
||||
#. :c:func:`glm_vec4_abs`
|
||||
#. :c:func:`glm_vec4_fract`
|
||||
#. :c:func:`glm_vec4_floor`
|
||||
#. :c:func:`glm_vec4_sqrt`
|
||||
|
||||
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
@@ -129,6 +138,30 @@ Functions documentation
|
||||
| *[in]* **v** vector
|
||||
| *[out]* **dest** sign vector (only keeps signs as -1, 0, -1)
|
||||
|
||||
.. c:function:: void glm_vec4_abs(vec4 v, vec4 dest)
|
||||
|
||||
absolute value of each vector item
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[out]* **dest** destination vector (abs(v))
|
||||
|
||||
.. c:function:: void glm_vec4_fract(vec4 v, vec4 dest)
|
||||
|
||||
fractional part of each vector item
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[out]* **dest** destination vector (fract(v))
|
||||
|
||||
.. c:function:: void glm_vec4_floor(vec4 v, vec4 dest)
|
||||
|
||||
floor of each vector item
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[out]* **dest** destination vector (floor(v))
|
||||
|
||||
.. c:function:: void glm_vec4_sqrt(vec4 v, vec4 dest)
|
||||
|
||||
square root of each vector item
|
||||
|
||||
@@ -60,6 +60,8 @@ Functions:
|
||||
#. :c:func:`glm_vec4_lerp`
|
||||
#. :c:func:`glm_vec4_cubic`
|
||||
#. :c:func:`glm_vec4_make`
|
||||
#. :c:func:`glm_vec4_reflect`
|
||||
#. :c:func:`glm_vec4_refract`
|
||||
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
@@ -108,6 +110,13 @@ Functions documentation
|
||||
Parameters:
|
||||
| *[in, out]* **v** vector
|
||||
|
||||
.. c:function:: void glm_vec4_one(vec4 v)
|
||||
|
||||
makes all members one
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **v** vector
|
||||
|
||||
.. c:function:: float glm_vec4_dot(vec4 a, vec4 b)
|
||||
|
||||
dot product of vec4
|
||||
@@ -124,7 +133,7 @@ Functions documentation
|
||||
norm * norm (magnitude) of vector
|
||||
|
||||
we can use this func instead of calling norm * norm, because it would call
|
||||
sqrtf fuction twice but with this func we can avoid func call, maybe this is
|
||||
sqrtf function twice but with this func we can avoid func call, maybe this is
|
||||
not good name for this func
|
||||
|
||||
Parameters:
|
||||
@@ -284,7 +293,7 @@ Functions documentation
|
||||
|
||||
.. c:function:: void glm_vec4_flipsign(vec4 v)
|
||||
|
||||
**DEPRACATED!**
|
||||
**DEPRECATED!**
|
||||
|
||||
use :c:func:`glm_vec4_negate`
|
||||
|
||||
@@ -293,7 +302,7 @@ Functions documentation
|
||||
|
||||
.. c:function:: void glm_vec4_flipsign_to(vec4 v, vec4 dest)
|
||||
|
||||
**DEPRACATED!**
|
||||
**DEPRECATED!**
|
||||
|
||||
use :c:func:`glm_vec4_negate_to`
|
||||
|
||||
@@ -303,7 +312,7 @@ Functions documentation
|
||||
|
||||
.. c:function:: void glm_vec4_inv(vec4 v)
|
||||
|
||||
**DEPRACATED!**
|
||||
**DEPRECATED!**
|
||||
|
||||
use :c:func:`glm_vec4_negate`
|
||||
|
||||
@@ -312,7 +321,7 @@ Functions documentation
|
||||
|
||||
.. c:function:: void glm_vec4_inv_to(vec4 v, vec4 dest)
|
||||
|
||||
**DEPRACATED!**
|
||||
**DEPRECATED!**
|
||||
|
||||
use :c:func:`glm_vec4_negate_to`
|
||||
|
||||
@@ -408,11 +417,42 @@ Functions documentation
|
||||
| *[in]* **s** parameter
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_vec4_make(float * __restrict src, vec4 dest)
|
||||
.. c:function:: void glm_vec4_make(const float * __restrict src, vec4 dest)
|
||||
|
||||
Create four dimensional vector from pointer
|
||||
|
||||
| NOTE: **@src** must contain at least 4 elements.
|
||||
.. note:: **@src** must contain at least 4 elements.
|
||||
|
||||
Parameters:
|
||||
| *[in]* **src** pointer to an array of floats
|
||||
| *[out]* **dest** destination vector
|
||||
|
||||
.. c:function:: bool glm_vec4_reflect(vec4 v, vec4 n, vec4 dest)
|
||||
|
||||
Reflection vector using an incident ray and a surface normal
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** incident vector
|
||||
| *[in]* **n** *❗️ normalized ❗️* normal vector
|
||||
| *[out]* **dest** destination: reflection result
|
||||
|
||||
.. c:function:: bool glm_vec4_refract(vec4 v, vec4 n, float eta, vec4 dest)
|
||||
|
||||
computes refraction vector for an incident vector and a surface normal.
|
||||
|
||||
Calculates the refraction vector based on Snell's law. If total internal reflection
|
||||
occurs (angle too great given eta), dest is set to zero and returns false.
|
||||
Otherwise, computes refraction vector, stores it in dest, and returns true.
|
||||
|
||||
This implementation does not explicitly preserve the 'w' component of the
|
||||
incident vector 'I' in the output 'dest', users requiring the preservation of
|
||||
the 'w' component should manually adjust 'dest' after calling this function.
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** *❗️ normalized ❗️* incident vector
|
||||
| *[in]* **n** *❗️ normalized ❗️* normal vector
|
||||
| *[in]* **eta** ratio of indices of refraction (incident/transmitted)
|
||||
| *[out]* **dest** refraction vector if refraction occurs; zero vector otherwise
|
||||
|
||||
Returns:
|
||||
returns true if refraction occurs; false if total internal reflection occurs.
|
||||
|
||||
270
include/cglm/aabb2d.h
Normal file
270
include/cglm/aabb2d.h
Normal file
@@ -0,0 +1,270 @@
|
||||
/*
|
||||
* Copyright (c), Recep Aslantas.
|
||||
*
|
||||
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||
* Full license can be found in the LICENSE file
|
||||
*/
|
||||
|
||||
#ifndef cglm_aabb2d_h
|
||||
#define cglm_aabb2d_h
|
||||
|
||||
#include "common.h"
|
||||
#include "vec2.h"
|
||||
#include "util.h"
|
||||
|
||||
/* DEPRECATED! use _diag */
|
||||
#define glm_aabb2d_size(aabb) glm_aabb2d_diag(aabb)
|
||||
|
||||
/*!
|
||||
* @brief make [aabb] zero
|
||||
*
|
||||
* @param[in, out] aabb aabb
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_aabb2d_zero(vec2 aabb[2]) {
|
||||
glm_vec2_zero(aabb[0]);
|
||||
glm_vec2_zero(aabb[1]);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief copy all members of [aabb] to [dest]
|
||||
*
|
||||
* @param[in] aabb source
|
||||
* @param[out] dest destination
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_aabb2d_copy(vec2 aabb[2], vec2 dest[2]) {
|
||||
glm_vec2_copy(aabb[0], dest[0]);
|
||||
glm_vec2_copy(aabb[1], dest[1]);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief apply transform to Axis-Aligned Bounding aabb
|
||||
*
|
||||
* @param[in] aabb bounding aabb
|
||||
* @param[in] m transform matrix
|
||||
* @param[out] dest transformed bounding aabb
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_aabb2d_transform(vec2 aabb[2], mat3 m, vec2 dest[2]) {
|
||||
vec2 v[2], xa, xb, ya, yb;
|
||||
|
||||
glm_vec2_scale(m[0], aabb[0][0], xa);
|
||||
glm_vec2_scale(m[0], aabb[1][0], xb);
|
||||
|
||||
glm_vec2_scale(m[1], aabb[0][1], ya);
|
||||
glm_vec2_scale(m[1], aabb[1][1], yb);
|
||||
|
||||
/* translation + min(xa, xb) + min(ya, yb) */
|
||||
glm_vec2(m[2], v[0]);
|
||||
glm_vec2_minadd(xa, xb, v[0]);
|
||||
glm_vec2_minadd(ya, yb, v[0]);
|
||||
|
||||
/* translation + max(xa, xb) + max(ya, yb) */
|
||||
glm_vec2(m[2], v[1]);
|
||||
glm_vec2_maxadd(xa, xb, v[1]);
|
||||
glm_vec2_maxadd(ya, yb, v[1]);
|
||||
|
||||
glm_vec2_copy(v[0], dest[0]);
|
||||
glm_vec2_copy(v[1], dest[1]);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief merges two AABB bounding aabb and creates new one
|
||||
*
|
||||
* two aabb must be in same space, if one of aabb is in different space then
|
||||
* you should consider to convert it's space by glm_aabb_space
|
||||
*
|
||||
* @param[in] aabb1 bounding aabb 1
|
||||
* @param[in] aabb2 bounding aabb 2
|
||||
* @param[out] dest merged bounding aabb
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_aabb2d_merge(vec2 aabb1[2], vec2 aabb2[2], vec2 dest[2]) {
|
||||
dest[0][0] = glm_min(aabb1[0][0], aabb2[0][0]);
|
||||
dest[0][1] = glm_min(aabb1[0][1], aabb2[0][1]);
|
||||
|
||||
dest[1][0] = glm_max(aabb1[1][0], aabb2[1][0]);
|
||||
dest[1][1] = glm_max(aabb1[1][1], aabb2[1][1]);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief crops a bounding aabb with another one.
|
||||
*
|
||||
* this could be useful for getting a baabb which fits with view frustum and
|
||||
* object bounding aabbes. In this case you crop view frustum aabb with objects
|
||||
* aabb
|
||||
*
|
||||
* @param[in] aabb bounding aabb 1
|
||||
* @param[in] cropAabb crop aabb
|
||||
* @param[out] dest cropped bounding aabb
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_aabb2d_crop(vec2 aabb[2], vec2 cropAabb[2], vec2 dest[2]) {
|
||||
dest[0][0] = glm_max(aabb[0][0], cropAabb[0][0]);
|
||||
dest[0][1] = glm_max(aabb[0][1], cropAabb[0][1]);
|
||||
|
||||
dest[1][0] = glm_min(aabb[1][0], cropAabb[1][0]);
|
||||
dest[1][1] = glm_min(aabb[1][1], cropAabb[1][1]);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief crops a bounding aabb with another one.
|
||||
*
|
||||
* this could be useful for getting a baabb which fits with view frustum and
|
||||
* object bounding aabbes. In this case you crop view frustum aabb with objects
|
||||
* aabb
|
||||
*
|
||||
* @param[in] aabb bounding aabb
|
||||
* @param[in] cropAabb crop aabb
|
||||
* @param[in] clampAabb minimum aabb
|
||||
* @param[out] dest cropped bounding aabb
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_aabb2d_crop_until(vec2 aabb[2],
|
||||
vec2 cropAabb[2],
|
||||
vec2 clampAabb[2],
|
||||
vec2 dest[2]) {
|
||||
glm_aabb2d_crop(aabb, cropAabb, dest);
|
||||
glm_aabb2d_merge(clampAabb, dest, dest);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief invalidate AABB min and max values
|
||||
*
|
||||
* @param[in, out] aabb bounding aabb
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_aabb2d_invalidate(vec2 aabb[2]) {
|
||||
glm_vec2_fill(aabb[0], FLT_MAX);
|
||||
glm_vec2_fill(aabb[1], -FLT_MAX);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief check if AABB is valid or not
|
||||
*
|
||||
* @param[in] aabb bounding aabb
|
||||
*/
|
||||
CGLM_INLINE
|
||||
bool
|
||||
glm_aabb2d_isvalid(vec2 aabb[2]) {
|
||||
return glm_vec2_max(aabb[0]) != FLT_MAX
|
||||
&& glm_vec2_min(aabb[1]) != -FLT_MAX;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief distance between of min and max
|
||||
*
|
||||
* @param[in] aabb bounding aabb
|
||||
*/
|
||||
CGLM_INLINE
|
||||
float
|
||||
glm_aabb2d_diag(vec2 aabb[2]) {
|
||||
return glm_vec2_distance(aabb[0], aabb[1]);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief size of aabb
|
||||
*
|
||||
* @param[in] aabb bounding aabb
|
||||
* @param[out] dest size
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_aabb2d_sizev(vec2 aabb[2], vec2 dest) {
|
||||
glm_vec2_sub(aabb[1], aabb[0], dest);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief radius of sphere which surrounds AABB
|
||||
*
|
||||
* @param[in] aabb bounding aabb
|
||||
*/
|
||||
CGLM_INLINE
|
||||
float
|
||||
glm_aabb2d_radius(vec2 aabb[2]) {
|
||||
return glm_aabb2d_diag(aabb) * 0.5f;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief computes center point of AABB
|
||||
*
|
||||
* @param[in] aabb bounding aabb
|
||||
* @param[out] dest center of bounding aabb
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_aabb2d_center(vec2 aabb[2], vec2 dest) {
|
||||
glm_vec2_center(aabb[0], aabb[1], dest);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief check if two AABB intersects
|
||||
*
|
||||
* @param[in] aabb bounding aabb
|
||||
* @param[in] other other bounding aabb
|
||||
*/
|
||||
CGLM_INLINE
|
||||
bool
|
||||
glm_aabb2d_aabb(vec2 aabb[2], vec2 other[2]) {
|
||||
return (aabb[0][0] <= other[1][0] && aabb[1][0] >= other[0][0])
|
||||
&& (aabb[0][1] <= other[1][1] && aabb[1][1] >= other[0][1]);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief check if AABB intersects with a circle
|
||||
*
|
||||
* Circle Representation in cglm: [center.x, center.y, radii]
|
||||
*
|
||||
* @param[in] aabb solid bounding aabb
|
||||
* @param[in] c solid circle
|
||||
*/
|
||||
CGLM_INLINE
|
||||
bool
|
||||
glm_aabb2d_circle(vec2 aabb[2], vec3 c) {
|
||||
float dmin;
|
||||
int a, b;
|
||||
|
||||
a = (c[0] < aabb[0][0]) + (c[0] > aabb[1][0]);
|
||||
b = (c[1] < aabb[0][1]) + (c[1] > aabb[1][1]);
|
||||
|
||||
dmin = glm_pow2((c[0] - aabb[!(a - 1)][0]) * (a != 0))
|
||||
+ glm_pow2((c[1] - aabb[!(b - 1)][1]) * (b != 0));
|
||||
|
||||
return dmin <= glm_pow2(c[2]);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief check if point is inside of AABB
|
||||
*
|
||||
* @param[in] aabb bounding aabb
|
||||
* @param[in] point point
|
||||
*/
|
||||
CGLM_INLINE
|
||||
bool
|
||||
glm_aabb2d_point(vec2 aabb[2], vec2 point) {
|
||||
return (point[0] >= aabb[0][0] && point[0] <= aabb[1][0])
|
||||
&& (point[1] >= aabb[0][1] && point[1] <= aabb[1][1]);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief check if AABB contains other AABB
|
||||
*
|
||||
* @param[in] aabb bounding aabb
|
||||
* @param[in] other other bounding aabb
|
||||
*/
|
||||
CGLM_INLINE
|
||||
bool
|
||||
glm_aabb2d_contains(vec2 aabb[2], vec2 other[2]) {
|
||||
return (aabb[0][0] <= other[0][0] && aabb[1][0] >= other[1][0])
|
||||
&& (aabb[0][1] <= other[0][1] && aabb[1][1] >= other[1][1]);
|
||||
}
|
||||
|
||||
#endif /* cglm_aabb2d_h */
|
||||
@@ -34,9 +34,9 @@
|
||||
* @brief translate existing transform matrix by v vector
|
||||
* and stores result in same matrix
|
||||
*
|
||||
* this is POST transform, applies to existing transform as last transfrom
|
||||
* this is POST transform, applies to existing transform as last transform
|
||||
*
|
||||
* @param[in, out] m affine transfrom
|
||||
* @param[in, out] m affine transform
|
||||
* @param[in] v translate vector [x, y, z]
|
||||
*/
|
||||
CGLM_INLINE
|
||||
@@ -51,9 +51,9 @@ glm_translated(mat4 m, vec3 v) {
|
||||
*
|
||||
* source matrix will remain same
|
||||
*
|
||||
* this is POST transform, applies to existing transform as last transfrom
|
||||
* this is POST transform, applies to existing transform as last transform
|
||||
*
|
||||
* @param[in] m affine transfrom
|
||||
* @param[in] m affine transform
|
||||
* @param[in] v translate vector [x, y, z]
|
||||
* @param[out] dest translated matrix
|
||||
*/
|
||||
@@ -67,9 +67,9 @@ glm_translated_to(mat4 m, vec3 v, mat4 dest) {
|
||||
/*!
|
||||
* @brief translate existing transform matrix by x factor
|
||||
*
|
||||
* this is POST transform, applies to existing transform as last transfrom
|
||||
* this is POST transform, applies to existing transform as last transform
|
||||
*
|
||||
* @param[in, out] m affine transfrom
|
||||
* @param[in, out] m affine transform
|
||||
* @param[in] x x factor
|
||||
*/
|
||||
CGLM_INLINE
|
||||
@@ -81,9 +81,9 @@ glm_translated_x(mat4 m, float x) {
|
||||
/*!
|
||||
* @brief translate existing transform matrix by y factor
|
||||
*
|
||||
* this is POST transform, applies to existing transform as last transfrom
|
||||
* this is POST transform, applies to existing transform as last transform
|
||||
*
|
||||
* @param[in, out] m affine transfrom
|
||||
* @param[in, out] m affine transform
|
||||
* @param[in] y y factor
|
||||
*/
|
||||
CGLM_INLINE
|
||||
@@ -95,9 +95,9 @@ glm_translated_y(mat4 m, float y) {
|
||||
/*!
|
||||
* @brief translate existing transform matrix by z factor
|
||||
*
|
||||
* this is POST transform, applies to existing transform as last transfrom
|
||||
* this is POST transform, applies to existing transform as last transform
|
||||
*
|
||||
* @param[in, out] m affine transfrom
|
||||
* @param[in, out] m affine transform
|
||||
* @param[in] z z factor
|
||||
*/
|
||||
CGLM_INLINE
|
||||
@@ -110,9 +110,9 @@ glm_translated_z(mat4 m, float z) {
|
||||
* @brief rotate existing transform matrix around X axis by angle
|
||||
* and store result in dest
|
||||
*
|
||||
* this is POST transform, applies to existing transform as last transfrom
|
||||
* this is POST transform, applies to existing transform as last transform
|
||||
*
|
||||
* @param[in] m affine transfrom
|
||||
* @param[in] m affine transform
|
||||
* @param[in] angle angle (radians)
|
||||
* @param[out] dest rotated matrix
|
||||
*/
|
||||
@@ -137,9 +137,9 @@ glm_rotated_x(mat4 m, float angle, mat4 dest) {
|
||||
* @brief rotate existing transform matrix around Y axis by angle
|
||||
* and store result in dest
|
||||
*
|
||||
* this is POST transform, applies to existing transform as last transfrom
|
||||
* this is POST transform, applies to existing transform as last transform
|
||||
*
|
||||
* @param[in] m affine transfrom
|
||||
* @param[in] m affine transform
|
||||
* @param[in] angle angle (radians)
|
||||
* @param[out] dest rotated matrix
|
||||
*/
|
||||
@@ -164,9 +164,9 @@ glm_rotated_y(mat4 m, float angle, mat4 dest) {
|
||||
* @brief rotate existing transform matrix around Z axis by angle
|
||||
* and store result in dest
|
||||
*
|
||||
* this is POST transform, applies to existing transform as last transfrom
|
||||
* this is POST transform, applies to existing transform as last transform
|
||||
*
|
||||
* @param[in] m affine transfrom
|
||||
* @param[in] m affine transform
|
||||
* @param[in] angle angle (radians)
|
||||
* @param[out] dest rotated matrix
|
||||
*/
|
||||
@@ -190,9 +190,9 @@ glm_rotated_z(mat4 m, float angle, mat4 dest) {
|
||||
/*!
|
||||
* @brief rotate existing transform matrix around given axis by angle
|
||||
*
|
||||
* this is POST transform, applies to existing transform as last transfrom
|
||||
* this is POST transform, applies to existing transform as last transform
|
||||
*
|
||||
* @param[in, out] m affine transfrom
|
||||
* @param[in, out] m affine transform
|
||||
* @param[in] angle angle (radians)
|
||||
* @param[in] axis axis
|
||||
*/
|
||||
@@ -208,9 +208,9 @@ glm_rotated(mat4 m, float angle, vec3 axis) {
|
||||
* @brief rotate existing transform
|
||||
* around given axis by angle at given pivot point (rotation center)
|
||||
*
|
||||
* this is POST transform, applies to existing transform as last transfrom
|
||||
* this is POST transform, applies to existing transform as last transform
|
||||
*
|
||||
* @param[in, out] m affine transfrom
|
||||
* @param[in, out] m affine transform
|
||||
* @param[in] pivot rotation center
|
||||
* @param[in] angle angle (radians)
|
||||
* @param[in] axis axis
|
||||
@@ -230,9 +230,9 @@ glm_rotated_at(mat4 m, vec3 pivot, float angle, vec3 axis) {
|
||||
/*!
|
||||
* @brief rotate existing transform matrix around given axis by angle around self (doesn't affected by position)
|
||||
*
|
||||
* this is POST transform, applies to existing transform as last transfrom
|
||||
* this is POST transform, applies to existing transform as last transform
|
||||
*
|
||||
* @param[in, out] m affine transfrom
|
||||
* @param[in, out] m affine transform
|
||||
* @param[in] angle angle (radians)
|
||||
* @param[in] axis axis
|
||||
*/
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
* @brief translate existing transform matrix by v vector
|
||||
* and stores result in same matrix
|
||||
*
|
||||
* @param[in, out] m affine transfrom
|
||||
* @param[in, out] m affine transform
|
||||
* @param[in] v translate vector [x, y, z]
|
||||
*/
|
||||
CGLM_INLINE
|
||||
@@ -66,7 +66,7 @@ glm_translate(mat4 m, vec3 v) {
|
||||
*
|
||||
* source matrix will remain same
|
||||
*
|
||||
* @param[in] m affine transfrom
|
||||
* @param[in] m affine transform
|
||||
* @param[in] v translate vector [x, y, z]
|
||||
* @param[out] dest translated matrix
|
||||
*/
|
||||
@@ -80,7 +80,7 @@ glm_translate_to(mat4 m, vec3 v, mat4 dest) {
|
||||
/*!
|
||||
* @brief translate existing transform matrix by x factor
|
||||
*
|
||||
* @param[in, out] m affine transfrom
|
||||
* @param[in, out] m affine transform
|
||||
* @param[in] x x factor
|
||||
*/
|
||||
CGLM_INLINE
|
||||
@@ -98,7 +98,7 @@ glm_translate_x(mat4 m, float x) {
|
||||
/*!
|
||||
* @brief translate existing transform matrix by y factor
|
||||
*
|
||||
* @param[in, out] m affine transfrom
|
||||
* @param[in, out] m affine transform
|
||||
* @param[in] y y factor
|
||||
*/
|
||||
CGLM_INLINE
|
||||
@@ -116,7 +116,7 @@ glm_translate_y(mat4 m, float y) {
|
||||
/*!
|
||||
* @brief translate existing transform matrix by z factor
|
||||
*
|
||||
* @param[in, out] m affine transfrom
|
||||
* @param[in, out] m affine transform
|
||||
* @param[in] z z factor
|
||||
*/
|
||||
CGLM_INLINE
|
||||
@@ -135,7 +135,7 @@ glm_translate_z(mat4 m, float z) {
|
||||
* @brief rotate existing transform matrix around X axis by angle
|
||||
* and store result in dest
|
||||
*
|
||||
* @param[in] m affine transfrom
|
||||
* @param[in] m affine transform
|
||||
* @param[in] angle angle (radians)
|
||||
* @param[out] dest rotated matrix
|
||||
*/
|
||||
@@ -160,7 +160,7 @@ glm_rotate_x(mat4 m, float angle, mat4 dest) {
|
||||
* @brief rotate existing transform matrix around Y axis by angle
|
||||
* and store result in dest
|
||||
*
|
||||
* @param[in] m affine transfrom
|
||||
* @param[in] m affine transform
|
||||
* @param[in] angle angle (radians)
|
||||
* @param[out] dest rotated matrix
|
||||
*/
|
||||
@@ -185,7 +185,7 @@ glm_rotate_y(mat4 m, float angle, mat4 dest) {
|
||||
* @brief rotate existing transform matrix around Z axis by angle
|
||||
* and store result in dest
|
||||
*
|
||||
* @param[in] m affine transfrom
|
||||
* @param[in] m affine transform
|
||||
* @param[in] angle angle (radians)
|
||||
* @param[out] dest rotated matrix
|
||||
*/
|
||||
@@ -207,9 +207,27 @@ glm_rotate_z(mat4 m, float angle, mat4 dest) {
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief rotate existing transform matrix around given axis by angle
|
||||
* @brief rotate existing transform matrix
|
||||
* around given axis by angle at ORIGIN (0,0,0)
|
||||
*
|
||||
* @param[in, out] m affine transfrom
|
||||
* **❗️IMPORTANT ❗️**
|
||||
*
|
||||
* If you need to rotate object around itself e.g. center of object or at
|
||||
* some point [of object] then `glm_rotate_at()` would be better choice to do so.
|
||||
*
|
||||
* Even if object's model transform is identity, rotation may not be around
|
||||
* center of object if object does not lay out at ORIGIN perfectly.
|
||||
*
|
||||
* Using `glm_rotate_at()` with center of bounding shape ( AABB, Sphere ... )
|
||||
* would be an easy option to rotate around object if object is not at origin.
|
||||
*
|
||||
* One another option to rotate around itself at any point is `glm_spin()`
|
||||
* which is perfect if only rotating around model position is desired e.g. not
|
||||
* specific point on model for instance center of geometry or center of mass,
|
||||
* again if geometry is not perfectly centered at origin at identity transform,
|
||||
* rotation may not be around geometry.
|
||||
*
|
||||
* @param[in, out] m affine transform
|
||||
* @param[in] angle angle (radians)
|
||||
* @param[in] axis axis
|
||||
*/
|
||||
@@ -225,7 +243,7 @@ glm_rotate(mat4 m, float angle, vec3 axis) {
|
||||
* @brief rotate existing transform
|
||||
* around given axis by angle at given pivot point (rotation center)
|
||||
*
|
||||
* @param[in, out] m affine transfrom
|
||||
* @param[in, out] m affine transform
|
||||
* @param[in] pivot rotation center
|
||||
* @param[in] angle angle (radians)
|
||||
* @param[in] axis axis
|
||||
@@ -250,7 +268,7 @@ glm_rotate_at(mat4 m, vec3 pivot, float angle, vec3 axis) {
|
||||
* this should work faster than glm_rotate_at because it reduces
|
||||
* one glm_translate.
|
||||
*
|
||||
* @param[out] m affine transfrom
|
||||
* @param[out] m affine transform
|
||||
* @param[in] pivot rotation center
|
||||
* @param[in] angle angle (radians)
|
||||
* @param[in] axis axis
|
||||
@@ -268,9 +286,10 @@ glm_rotate_atm(mat4 m, vec3 pivot, float angle, vec3 axis) {
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief rotate existing transform matrix around given axis by angle around self (doesn't affected by position)
|
||||
* @brief rotate existing transform matrix
|
||||
* around given axis by angle around self (doesn't affected by position)
|
||||
*
|
||||
* @param[in, out] m affine transfrom
|
||||
* @param[in, out] m affine transform
|
||||
* @param[in] angle angle (radians)
|
||||
* @param[in] axis axis
|
||||
*/
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
/*!
|
||||
* @brief creates NEW translate transform matrix by v vector
|
||||
*
|
||||
* @param[out] m affine transfrom
|
||||
* @param[out] m affine transform
|
||||
* @param[in] v translate vector [x, y, z]
|
||||
*/
|
||||
CGLM_INLINE
|
||||
@@ -58,7 +58,7 @@ glm_translate_make(mat4 m, vec3 v) {
|
||||
* @brief scale existing transform matrix by v vector
|
||||
* and store result in dest
|
||||
*
|
||||
* @param[in] m affine transfrom
|
||||
* @param[in] m affine transform
|
||||
* @param[in] v scale vector [x, y, z]
|
||||
* @param[out] dest scaled matrix
|
||||
*/
|
||||
@@ -75,7 +75,7 @@ glm_scale_to(mat4 m, vec3 v, mat4 dest) {
|
||||
/*!
|
||||
* @brief creates NEW scale matrix by v vector
|
||||
*
|
||||
* @param[out] m affine transfrom
|
||||
* @param[out] m affine transform
|
||||
* @param[in] v scale vector [x, y, z]
|
||||
*/
|
||||
CGLM_INLINE
|
||||
@@ -91,7 +91,7 @@ glm_scale_make(mat4 m, vec3 v) {
|
||||
* @brief scales existing transform matrix by v vector
|
||||
* and stores result in same matrix
|
||||
*
|
||||
* @param[in, out] m affine transfrom
|
||||
* @param[in, out] m affine transform
|
||||
* @param[in] v scale vector [x, y, z]
|
||||
*/
|
||||
CGLM_INLINE
|
||||
@@ -104,7 +104,7 @@ glm_scale(mat4 m, vec3 v) {
|
||||
* @brief applies uniform scale to existing transform matrix v = [s, s, s]
|
||||
* and stores result in same matrix
|
||||
*
|
||||
* @param[in, out] m affine transfrom
|
||||
* @param[in, out] m affine transform
|
||||
* @param[in] s scale factor
|
||||
*/
|
||||
CGLM_INLINE
|
||||
@@ -119,7 +119,7 @@ glm_scale_uni(mat4 m, float s) {
|
||||
*
|
||||
* axis will be normalized so you don't need to normalize it
|
||||
*
|
||||
* @param[out] m affine transfrom
|
||||
* @param[out] m affine transform
|
||||
* @param[in] angle angle (radians)
|
||||
* @param[in] axis axis
|
||||
*/
|
||||
@@ -220,7 +220,7 @@ glm_decompose_rs(mat4 m, mat4 r, vec3 s) {
|
||||
* @brief decompose affine transform, TODO: extract shear factors.
|
||||
* DON'T pass projected matrix here
|
||||
*
|
||||
* @param[in] m affine transfrom
|
||||
* @param[in] m affine transform
|
||||
* @param[out] t translation vector
|
||||
* @param[out] r rotation matrix (mat4)
|
||||
* @param[out] s scaling vector [X, Y, Z]
|
||||
|
||||
132
include/cglm/affine2d-post.h
Normal file
132
include/cglm/affine2d-post.h
Normal file
@@ -0,0 +1,132 @@
|
||||
/*
|
||||
* Copyright (c), Recep Aslantas.
|
||||
*
|
||||
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||
* Full license can be found in the LICENSE file
|
||||
*/
|
||||
|
||||
#ifndef cglm_affine2d_post_h
|
||||
#define cglm_affine2d_post_h
|
||||
|
||||
/*
|
||||
Functions:
|
||||
CGLM_INLINE void glm_translated2d(mat3 m, vec2 v);
|
||||
CGLM_INLINE void glm_translated2d_x(mat3 m, float to);
|
||||
CGLM_INLINE void glm_translated2d_y(mat3 m, float to);
|
||||
CGLM_INLINE void glm_rotated2d(mat3 m, float angle);
|
||||
CGLM_INLINE void glm_scaled2d(mat3 m, vec2 v);
|
||||
CGLM_INLINE void glm_scaled2d_uni(mat3 m, float s);
|
||||
*/
|
||||
|
||||
#include "vec2.h"
|
||||
|
||||
/*!
|
||||
* @brief translate existing transform matrix by v vector
|
||||
* and store result in same matrix
|
||||
*
|
||||
* this is POST transform, applies to existing transform as last transform
|
||||
*
|
||||
* @param[in, out] m affine transform
|
||||
* @param[in] v translate vector [x, y]
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_translated2d(mat3 m, vec2 v) {
|
||||
glm_vec2_add(m[2], v, m[2]);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief translate existing transform matrix by x factor
|
||||
*
|
||||
* this is POST transform, applies to existing transform as last transform
|
||||
*
|
||||
* @param[in, out] m affine transform
|
||||
* @param[in] x x factor
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_translated2d_x(mat3 m, float x) {
|
||||
m[2][0] += x;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief translate existing transform matrix by y factor
|
||||
*
|
||||
* this is POST transform, applies to existing transform as last transform
|
||||
*
|
||||
* @param[in, out] m affine transform
|
||||
* @param[in] y y factor
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_translated2d_y(mat3 m, float y) {
|
||||
m[2][1] += y;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief rotate existing transform matrix by angle
|
||||
*
|
||||
* this is POST transform, applies to existing transform as last transform
|
||||
*
|
||||
* @param[in, out] m affine transform
|
||||
* @param[in] angle angle (radians)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_rotated2d(mat3 m, float angle) {
|
||||
float c = cosf(angle),
|
||||
s = sinf(angle),
|
||||
|
||||
m00 = m[0][0], m10 = m[1][0], m20 = m[2][0],
|
||||
m01 = m[0][1], m11 = m[1][1], m21 = m[2][1];
|
||||
|
||||
m[0][0] = c * m00 - s * m01;
|
||||
m[1][0] = c * m10 - s * m11;
|
||||
m[2][0] = c * m20 - s * m21;
|
||||
|
||||
m[0][1] = s * m00 + c * m01;
|
||||
m[1][1] = s * m10 + c * m11;
|
||||
m[2][1] = s * m20 + c * m21;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief scale existing 2d transform matrix by v vector
|
||||
*
|
||||
* this is POST transform, applies to existing transform as last transform
|
||||
*
|
||||
* @param[in, out] m affine transform
|
||||
* @param[in] v scale vector [x, y]
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_scaled2d(mat3 m, vec2 v) {
|
||||
m[0][0] *= v[0];
|
||||
m[1][0] *= v[0];
|
||||
m[2][0] *= v[0];
|
||||
|
||||
m[0][1] *= v[1];
|
||||
m[1][1] *= v[1];
|
||||
m[2][1] *= v[1];
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief applies uniform scale to existing 2d transform matrix v = [s, s]
|
||||
*
|
||||
* this is POST transform, applies to existing transform as last transform
|
||||
*
|
||||
* @param[in, out] m affine transform
|
||||
* @param[in] s scale factor
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_scaled2d_uni(mat3 m, float s) {
|
||||
m[0][0] *= s;
|
||||
m[1][0] *= s;
|
||||
m[2][0] *= s;
|
||||
|
||||
m[0][1] *= s;
|
||||
m[1][1] *= s;
|
||||
m[2][1] *= s;
|
||||
}
|
||||
|
||||
#endif /* cglm_affine2d_post_h */
|
||||
@@ -33,7 +33,7 @@
|
||||
* @brief translate existing 2d transform matrix by v vector
|
||||
* and stores result in same matrix
|
||||
*
|
||||
* @param[in, out] m affine transfrom
|
||||
* @param[in, out] m affine transform
|
||||
* @param[in] v translate vector [x, y]
|
||||
*/
|
||||
CGLM_INLINE
|
||||
@@ -50,7 +50,7 @@ glm_translate2d(mat3 m, vec2 v) {
|
||||
*
|
||||
* source matrix will remain same
|
||||
*
|
||||
* @param[in] m affine transfrom
|
||||
* @param[in] m affine transform
|
||||
* @param[in] v translate vector [x, y]
|
||||
* @param[out] dest translated matrix
|
||||
*/
|
||||
@@ -64,7 +64,7 @@ glm_translate2d_to(mat3 m, vec2 v, mat3 dest) {
|
||||
/*!
|
||||
* @brief translate existing 2d transform matrix by x factor
|
||||
*
|
||||
* @param[in, out] m affine transfrom
|
||||
* @param[in, out] m affine transform
|
||||
* @param[in] x x factor
|
||||
*/
|
||||
CGLM_INLINE
|
||||
@@ -78,7 +78,7 @@ glm_translate2d_x(mat3 m, float x) {
|
||||
/*!
|
||||
* @brief translate existing 2d transform matrix by y factor
|
||||
*
|
||||
* @param[in, out] m affine transfrom
|
||||
* @param[in, out] m affine transform
|
||||
* @param[in] y y factor
|
||||
*/
|
||||
CGLM_INLINE
|
||||
@@ -92,7 +92,7 @@ glm_translate2d_y(mat3 m, float y) {
|
||||
/*!
|
||||
* @brief creates NEW translate 2d transform matrix by v vector
|
||||
*
|
||||
* @param[out] m affine transfrom
|
||||
* @param[out] m affine transform
|
||||
* @param[in] v translate vector [x, y]
|
||||
*/
|
||||
CGLM_INLINE
|
||||
@@ -107,7 +107,7 @@ glm_translate2d_make(mat3 m, vec2 v) {
|
||||
* @brief scale existing 2d transform matrix by v vector
|
||||
* and store result in dest
|
||||
*
|
||||
* @param[in] m affine transfrom
|
||||
* @param[in] m affine transform
|
||||
* @param[in] v scale vector [x, y]
|
||||
* @param[out] dest scaled matrix
|
||||
*/
|
||||
@@ -130,7 +130,7 @@ glm_scale2d_to(mat3 m, vec2 v, mat3 dest) {
|
||||
/*!
|
||||
* @brief creates NEW 2d scale matrix by v vector
|
||||
*
|
||||
* @param[out] m affine transfrom
|
||||
* @param[out] m affine transform
|
||||
* @param[in] v scale vector [x, y]
|
||||
*/
|
||||
CGLM_INLINE
|
||||
@@ -145,7 +145,7 @@ glm_scale2d_make(mat3 m, vec2 v) {
|
||||
* @brief scales existing 2d transform matrix by v vector
|
||||
* and stores result in same matrix
|
||||
*
|
||||
* @param[in, out] m affine transfrom
|
||||
* @param[in, out] m affine transform
|
||||
* @param[in] v scale vector [x, y]
|
||||
*/
|
||||
CGLM_INLINE
|
||||
@@ -164,7 +164,7 @@ glm_scale2d(mat3 m, vec2 v) {
|
||||
* @brief applies uniform scale to existing 2d transform matrix v = [s, s]
|
||||
* and stores result in same matrix
|
||||
*
|
||||
* @param[in, out] m affine transfrom
|
||||
* @param[in, out] m affine transform
|
||||
* @param[in] s scale factor
|
||||
*/
|
||||
CGLM_INLINE
|
||||
@@ -182,7 +182,7 @@ glm_scale2d_uni(mat3 m, float s) {
|
||||
/*!
|
||||
* @brief creates NEW rotation matrix by angle around Z axis
|
||||
*
|
||||
* @param[out] m affine transfrom
|
||||
* @param[out] m affine transform
|
||||
* @param[in] angle angle (radians)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
@@ -210,7 +210,7 @@ glm_rotate2d_make(mat3 m, float angle) {
|
||||
* @brief rotate existing 2d transform matrix around Z axis by angle
|
||||
* and store result in same matrix
|
||||
*
|
||||
* @param[in, out] m affine transfrom
|
||||
* @param[in, out] m affine transform
|
||||
* @param[in] angle angle (radians)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
@@ -237,7 +237,7 @@ glm_rotate2d(mat3 m, float angle) {
|
||||
* @brief rotate existing 2d transform matrix around Z axis by angle
|
||||
* and store result in dest
|
||||
*
|
||||
* @param[in] m affine transfrom
|
||||
* @param[in] m affine transform
|
||||
* @param[in] angle angle (radians)
|
||||
* @param[out] dest destination
|
||||
*/
|
||||
|
||||
@@ -14,16 +14,17 @@
|
||||
&& defined(SIMD_VECTOR_TYPES)
|
||||
|
||||
#include "common.h"
|
||||
#include "struct.h"
|
||||
|
||||
/*!
|
||||
* @brief converts mat4 to Apple's simd type simd_float4x4
|
||||
* @return simd_float4x4
|
||||
*/
|
||||
* @brief converts mat4 to Apple's simd type simd_float4x4
|
||||
* @return simd_float4x4
|
||||
*/
|
||||
CGLM_INLINE
|
||||
simd_float4x4
|
||||
glm_mat4_applesimd(mat4 m) {
|
||||
simd_float4x4 t;
|
||||
|
||||
|
||||
t.columns[0][0] = m[0][0];
|
||||
t.columns[0][1] = m[0][1];
|
||||
t.columns[0][2] = m[0][2];
|
||||
@@ -55,7 +56,7 @@ CGLM_INLINE
|
||||
simd_float3x3
|
||||
glm_mat3_applesimd(mat3 m) {
|
||||
simd_float3x3 t;
|
||||
|
||||
|
||||
t.columns[0][0] = m[0][0];
|
||||
t.columns[0][1] = m[0][1];
|
||||
t.columns[0][2] = m[0][2];
|
||||
@@ -83,7 +84,7 @@ glm_vec4_applesimd(vec4 v) {
|
||||
|
||||
/*!
|
||||
* @brief converts vec3 to Apple's simd type simd_float3
|
||||
* @return v
|
||||
* @return simd_float3
|
||||
*/
|
||||
CGLM_INLINE
|
||||
simd_float3
|
||||
@@ -91,5 +92,45 @@ glm_vec3_applesimd(vec3 v) {
|
||||
return (simd_float3){v[0], v[1], v[2]};
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief generic function to convert cglm types to Apple's simd types
|
||||
*
|
||||
* Example usage:
|
||||
* simd_float4x4 m = applesimd(mat4_value);
|
||||
* simd_float3 v = applesimd(vec3_value);
|
||||
*
|
||||
* @param x cglm type (mat4, mat3, vec4, vec3)
|
||||
* @return corresponding Apple simd type
|
||||
*/
|
||||
#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)
|
||||
# define applesimd(x) _Generic((x), \
|
||||
mat4: glm_mat4_applesimd, \
|
||||
mat3: glm_mat3_applesimd, \
|
||||
vec4: glm_vec4_applesimd, \
|
||||
vec3: glm_vec3_applesimd \
|
||||
)((x))
|
||||
#endif
|
||||
|
||||
#ifdef cglm_types_struct_h
|
||||
CGLM_INLINE simd_float4x4 glms_mat4_(applesimd)(mat4s m) { return glm_mat4_applesimd(m.raw); }
|
||||
CGLM_INLINE simd_float3x3 glms_mat3_(applesimd)(mat3s m) { return glm_mat3_applesimd(m.raw); }
|
||||
CGLM_INLINE simd_float4 glms_vec4_(applesimd)(vec4s v) { return glm_vec4_applesimd(v.raw); }
|
||||
CGLM_INLINE simd_float3 glms_vec3_(applesimd)(vec3s v) { return glm_vec3_applesimd(v.raw); }
|
||||
|
||||
#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)
|
||||
# undef applesimd
|
||||
# define applesimd(x) _Generic((x), \
|
||||
mat4: glm_mat4_applesimd, \
|
||||
mat3: glm_mat3_applesimd, \
|
||||
vec4: glm_vec4_applesimd, \
|
||||
vec3: glm_vec3_applesimd, \
|
||||
mat4s: glms_mat4_(applesimd), \
|
||||
mat3s: glms_mat3_(applesimd), \
|
||||
vec4s: glms_vec4_(applesimd), \
|
||||
vec3s: glms_vec3_(applesimd) \
|
||||
)((x))
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#endif
|
||||
#endif /* cglm_applesimd_h */
|
||||
|
||||
@@ -75,7 +75,7 @@ glm_aabb_merge(vec3 box1[2], vec3 box2[2], vec3 dest[2]) {
|
||||
/*!
|
||||
* @brief crops a bounding box with another one.
|
||||
*
|
||||
* this could be useful for gettng a bbox which fits with view frustum and
|
||||
* this could be useful for getting a bbox which fits with view frustum and
|
||||
* object bounding boxes. In this case you crop view frustum box with objects
|
||||
* box
|
||||
*
|
||||
@@ -98,13 +98,13 @@ glm_aabb_crop(vec3 box[2], vec3 cropBox[2], vec3 dest[2]) {
|
||||
/*!
|
||||
* @brief crops a bounding box with another one.
|
||||
*
|
||||
* this could be useful for gettng a bbox which fits with view frustum and
|
||||
* this could be useful for getting a bbox which fits with view frustum and
|
||||
* object bounding boxes. In this case you crop view frustum box with objects
|
||||
* box
|
||||
*
|
||||
* @param[in] box bounding box
|
||||
* @param[in] cropBox crop box
|
||||
* @param[in] clampBox miniumum box
|
||||
* @param[in] clampBox minimum box
|
||||
* @param[out] dest cropped bounding box
|
||||
*/
|
||||
CGLM_INLINE
|
||||
|
||||
@@ -32,7 +32,9 @@ extern "C" {
|
||||
#include "call/quat.h"
|
||||
#include "call/euler.h"
|
||||
#include "call/plane.h"
|
||||
#include "call/noise.h"
|
||||
#include "call/frustum.h"
|
||||
#include "call/aabb2d.h"
|
||||
#include "call/box.h"
|
||||
#include "call/io.h"
|
||||
#include "call/project.h"
|
||||
|
||||
89
include/cglm/call/aabb2d.h
Normal file
89
include/cglm/call/aabb2d.h
Normal file
@@ -0,0 +1,89 @@
|
||||
/*
|
||||
* Copyright (c), Recep Aslantas.
|
||||
*
|
||||
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||
* Full license can be found in the LICENSE file
|
||||
*/
|
||||
|
||||
#ifndef cglmc_aabb2d_h
|
||||
#define cglmc_aabb2d_h
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "../cglm.h"
|
||||
|
||||
/* DEPRECATED! use _diag */
|
||||
#define glmc_aabb2d_size(aabb) glmc_aabb2d_diag(aabb)
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_aabb2d_zero(vec2 aabb[2]);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_aabb2d_copy(vec2 aabb[2], vec2 dest[2]);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_aabb2d_transform(vec2 aabb[2], mat3 m, vec2 dest[2]);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_aabb2d_merge(vec2 aabb1[2], vec2 aabb2[2], vec2 dest[2]);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_aabb2d_crop(vec2 aabb[2], vec2 cropAabb[2], vec2 dest[2]);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_aabb2d_crop_until(vec2 aabb[2],
|
||||
vec2 cropAabb[2],
|
||||
vec2 clampAabb[2],
|
||||
vec2 dest[2]);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_aabb2d_invalidate(vec2 aabb[2]);
|
||||
|
||||
CGLM_EXPORT
|
||||
bool
|
||||
glmc_aabb2d_isvalid(vec2 aabb[2]);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_aabb2d_diag(vec2 aabb[2]);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_aabb2d_sizev(vec2 aabb[2], vec2 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_aabb2d_radius(vec2 aabb[2]);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_aabb2d_center(vec2 aabb[2], vec2 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
bool
|
||||
glmc_aabb2d_aabb(vec2 aabb[2], vec2 other[2]);
|
||||
|
||||
CGLM_EXPORT
|
||||
bool
|
||||
glmc_aabb2d_point(vec2 aabb[2], vec2 point);
|
||||
|
||||
CGLM_EXPORT
|
||||
bool
|
||||
glmc_aabb2d_contains(vec2 aabb[2], vec2 other[2]);
|
||||
|
||||
CGLM_EXPORT
|
||||
bool
|
||||
glmc_aabb2d_circle(vec2 aabb[2], vec3 s);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif /* cglmc_aabb2d_h */
|
||||
@@ -76,4 +76,3 @@ glmc_aabb_sphere(vec3 box[2], vec4 s);
|
||||
}
|
||||
#endif
|
||||
#endif /* cglmc_box_h */
|
||||
|
||||
|
||||
@@ -51,6 +51,10 @@ CGLM_EXPORT
|
||||
void
|
||||
glmc_perspective(float fovy, float aspect, float nearZ, float farZ, mat4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_perspective_infinite(float fovy, float aspect, float nearZ, mat4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_persp_move_far(mat4 proj, float deltaFar);
|
||||
@@ -59,6 +63,10 @@ CGLM_EXPORT
|
||||
void
|
||||
glmc_perspective_default(float aspect, mat4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_perspective_default_infinite(float aspect, mat4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_perspective_resize(float aspect, mat4 proj);
|
||||
|
||||
@@ -27,6 +27,10 @@ glmc_perspective_lh_no(float fovy,
|
||||
float nearVal,
|
||||
float farVal,
|
||||
mat4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_perspective_resize_lh_no(float aspect, mat4 proj);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
|
||||
@@ -27,6 +27,10 @@ glmc_perspective_lh_zo(float fovy,
|
||||
float nearVal,
|
||||
float farVal,
|
||||
mat4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_perspective_resize_lh_zo(float aspect, mat4 proj);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
|
||||
@@ -27,6 +27,10 @@ glmc_perspective_rh_no(float fovy,
|
||||
float nearVal,
|
||||
float farVal,
|
||||
mat4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_perspective_resize_rh_no(float aspect, mat4 proj);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
|
||||
@@ -27,6 +27,10 @@ glmc_perspective_rh_zo(float fovy,
|
||||
float nearVal,
|
||||
float farVal,
|
||||
mat4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_perspective_resize_rh_zo(float aspect, mat4 proj);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
|
||||
@@ -49,6 +49,31 @@ CGLM_EXPORT
|
||||
void
|
||||
glmc_euler_by_order(vec3 angles, glm_euler_seq axis, mat4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_euler_xyz_quat(vec3 angles, versor dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_euler_xzy_quat(vec3 angles, versor dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_euler_yxz_quat(vec3 angles, versor dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_euler_yzx_quat(vec3 angles, versor dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_euler_zxy_quat(vec3 angles, versor dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_euler_zyx_quat(vec3 angles, versor dest);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -29,6 +29,14 @@ CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec2_one(ivec2 v);
|
||||
|
||||
CGLM_EXPORT
|
||||
int
|
||||
glmc_ivec2_dot(ivec2 a, ivec2 b);
|
||||
|
||||
CGLM_EXPORT
|
||||
int
|
||||
glmc_ivec2_cross(ivec2 a, ivec2 b);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec2_add(ivec2 a, ivec2 b, ivec2 dest);
|
||||
@@ -53,6 +61,82 @@ CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec2_scale(ivec2 v, int s, ivec2 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec2_div(ivec2 a, ivec2 b, ivec2 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec2_divs(ivec2 v, int s, ivec2 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec2_mod(ivec2 a, ivec2 b, ivec2 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec2_addadd(ivec2 a, ivec2 b, ivec2 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec2_addadds(ivec2 a, int s, ivec2 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec2_subadd(ivec2 a, ivec2 b, ivec2 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec2_subadds(ivec2 a, int s, ivec2 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec2_muladd(ivec2 a, ivec2 b, ivec2 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec2_muladds(ivec2 a, int s, ivec2 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec2_maxadd(ivec2 a, ivec2 b, ivec2 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec2_minadd(ivec2 a, ivec2 b, ivec2 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec2_subsub(ivec2 a, ivec2 b, ivec2 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec2_subsubs(ivec2 a, int s, ivec2 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec2_addsub(ivec2 a, ivec2 b, ivec2 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec2_addsubs(ivec2 a, int s, ivec2 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec2_mulsub(ivec2 a, ivec2 b, ivec2 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec2_mulsubs(ivec2 a, int s, ivec2 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec2_maxsub(ivec2 a, ivec2 b, ivec2 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec2_minsub(ivec2 a, ivec2 b, ivec2 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
int
|
||||
glmc_ivec2_distance2(ivec2 a, ivec2 b);
|
||||
@@ -61,6 +145,18 @@ CGLM_EXPORT
|
||||
float
|
||||
glmc_ivec2_distance(ivec2 a, ivec2 b);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec2_fill(ivec2 v, int val);
|
||||
|
||||
CGLM_EXPORT
|
||||
bool
|
||||
glmc_ivec2_eq(ivec2 v, int val);
|
||||
|
||||
CGLM_EXPORT
|
||||
bool
|
||||
glmc_ivec2_eqv(ivec2 a, ivec2 b);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec2_maxv(ivec2 a, ivec2 b, ivec2 dest);
|
||||
|
||||
@@ -29,6 +29,18 @@ CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec3_one(ivec3 v);
|
||||
|
||||
CGLM_EXPORT
|
||||
int
|
||||
glmc_ivec3_dot(ivec3 a, ivec3 b);
|
||||
|
||||
CGLM_EXPORT
|
||||
int
|
||||
glmc_ivec3_norm2(ivec3 v);
|
||||
|
||||
CGLM_EXPORT
|
||||
int
|
||||
glmc_ivec3_norm(ivec3 v);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec3_add(ivec3 a, ivec3 b, ivec3 dest);
|
||||
@@ -53,6 +65,82 @@ CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec3_scale(ivec3 v, int s, ivec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec3_div(ivec3 a, ivec3 b, ivec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec3_divs(ivec3 v, int s, ivec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec3_mod(ivec3 a, ivec3 b, ivec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec3_addadd(ivec3 a, ivec3 b, ivec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec3_addadds(ivec3 a, int s, ivec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec3_subadd(ivec3 a, ivec3 b, ivec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec3_subadds(ivec3 a, int s, ivec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec3_muladd(ivec3 a, ivec3 b, ivec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec3_muladds(ivec3 a, int s, ivec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec3_maxadd(ivec3 a, ivec3 b, ivec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec3_minadd(ivec3 a, ivec3 b, ivec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec3_subsub(ivec3 a, ivec3 b, ivec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec3_subsubs(ivec3 a, int s, ivec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec3_addsub(ivec3 a, ivec3 b, ivec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec3_addsubs(ivec3 a, int s, ivec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec3_mulsub(ivec3 a, ivec3 b, ivec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec3_mulsubs(ivec3 a, int s, ivec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec3_maxsub(ivec3 a, ivec3 b, ivec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec3_minsub(ivec3 a, ivec3 b, ivec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
int
|
||||
glmc_ivec3_distance2(ivec3 a, ivec3 b);
|
||||
@@ -61,6 +149,18 @@ CGLM_EXPORT
|
||||
float
|
||||
glmc_ivec3_distance(ivec3 a, ivec3 b);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec3_fill(ivec3 v, int val);
|
||||
|
||||
CGLM_EXPORT
|
||||
bool
|
||||
glmc_ivec3_eq(ivec3 v, int val);
|
||||
|
||||
CGLM_EXPORT
|
||||
bool
|
||||
glmc_ivec3_eqv(ivec3 a, ivec3 b);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec3_maxv(ivec3 a, ivec3 b, ivec3 dest);
|
||||
|
||||
@@ -53,6 +53,70 @@ CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec4_scale(ivec4 v, int s, ivec4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec4_addadd(ivec4 a, ivec4 b, ivec4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec4_addadds(ivec4 a, int s, ivec4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec4_subadd(ivec4 a, ivec4 b, ivec4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec4_subadds(ivec4 a, int s, ivec4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec4_muladd(ivec4 a, ivec4 b, ivec4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec4_muladds(ivec4 a, int s, ivec4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec4_maxadd(ivec4 a, ivec4 b, ivec4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec4_minadd(ivec4 a, ivec4 b, ivec4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec4_subsub(ivec4 a, ivec4 b, ivec4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec4_subsubs(ivec4 a, int s, ivec4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec4_addsub(ivec4 a, ivec4 b, ivec4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec4_addsubs(ivec4 a, int s, ivec4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec4_mulsub(ivec4 a, ivec4 b, ivec4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec4_mulsubs(ivec4 a, int s, ivec4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec4_maxsub(ivec4 a, ivec4 b, ivec4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec4_minsub(ivec4 a, ivec4 b, ivec4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
int
|
||||
glmc_ivec4_distance2(ivec4 a, ivec4 b);
|
||||
|
||||
@@ -13,21 +13,25 @@ extern "C" {
|
||||
|
||||
#include "../cglm.h"
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat2_make(const float * __restrict src, mat2 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat2_copy(mat2 mat, mat2 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat2_identity(mat2 mat);
|
||||
glmc_mat2_identity(mat2 m);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat2_identity_array(mat2 * __restrict mat, size_t count);
|
||||
glmc_mat2_identity_array(mat2 * __restrict mats, size_t count);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat2_zero(mat2 mat);
|
||||
glmc_mat2_zero(mat2 m);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
@@ -35,28 +39,20 @@ glmc_mat2_mul(mat2 m1, mat2 m2, mat2 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat2_transpose_to(mat2 m, mat2 dest);
|
||||
glmc_mat2_mulv(mat2 m, vec2 v, vec2 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat2_transpose_to(mat2 mat, mat2 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat2_transpose(mat2 m);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat2_mulv(mat2 m, vec2 v, vec2 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_mat2_trace(mat2 m);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat2_scale(mat2 m, float s);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_mat2_det(mat2 mat);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat2_inv(mat2 mat, mat2 dest);
|
||||
@@ -71,11 +67,15 @@ glmc_mat2_swap_row(mat2 mat, int row1, int row2);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_mat2_rmc(vec2 r, mat2 m, vec2 c);
|
||||
glmc_mat2_trace(mat2 m);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat2_make(float * __restrict src, mat2 dest);
|
||||
float
|
||||
glmc_mat2_det(mat2 m);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_mat2_rmc(vec2 r, mat2 m, vec2 c);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
@@ -15,27 +15,27 @@ extern "C" {
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat2x3_copy(mat2x3 mat, mat2x3 dest);
|
||||
glmc_mat2x3_copy(mat2x3 src, mat2x3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat2x3_zero(mat2x3 mat);
|
||||
glmc_mat2x3_zero(mat2x3 m);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat2x3_make(float * __restrict src, mat2x3 dest);
|
||||
glmc_mat2x3_make(const float * __restrict src, mat2x3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat2x3_mul(mat2x3 m1, mat3x2 m2, mat2 dest);
|
||||
glmc_mat2x3_mul(mat2x3 m1, mat3x2 m2, mat3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat2x3_mulv(mat2x3 m, vec3 v, vec2 dest);
|
||||
glmc_mat2x3_mulv(mat2x3 m, vec2 v, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat2x3_transpose(mat2x3 m, mat3x2 dest);
|
||||
glmc_mat2x3_transpose(mat2x3 src, mat3x2 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
|
||||
@@ -15,27 +15,27 @@ extern "C" {
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat2x4_copy(mat2x4 mat, mat2x4 dest);
|
||||
glmc_mat2x4_copy(mat2x4 src, mat2x4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat2x4_zero(mat2x4 mat);
|
||||
glmc_mat2x4_zero(mat2x4 m);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat2x4_make(float * __restrict src, mat2x4 dest);
|
||||
glmc_mat2x4_make(const float * __restrict src, mat2x4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat2x4_mul(mat2x4 m1, mat4x2 m2, mat2 dest);
|
||||
glmc_mat2x4_mul(mat2x4 m1, mat4x2 m2, mat4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat2x4_mulv(mat2x4 m, vec4 v, vec2 dest);
|
||||
glmc_mat2x4_mulv(mat2x4 m, vec2 v, vec4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat2x4_transpose(mat2x4 m, mat4x2 dest);
|
||||
glmc_mat2x4_transpose(mat2x4 src, mat4x2 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
|
||||
@@ -82,7 +82,11 @@ glmc_mat3_rmc(vec3 r, mat3 m, vec3 c);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat3_make(float * __restrict src, mat3 dest);
|
||||
glmc_mat3_make(const float * __restrict src, mat3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat3_textrans(float sx, float sy, float rot, float tx, float ty, mat3 dest);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
@@ -15,27 +15,27 @@ extern "C" {
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat3x2_copy(mat3x2 mat, mat3x2 dest);
|
||||
glmc_mat3x2_copy(mat3x2 src, mat3x2 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat3x2_zero(mat3x2 mat);
|
||||
glmc_mat3x2_zero(mat3x2 m);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat3x2_make(float * __restrict src, mat3x2 dest);
|
||||
glmc_mat3x2_make(const float * __restrict src, mat3x2 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat3x2_mul(mat3x2 m1, mat2x3 m2, mat3 dest);
|
||||
glmc_mat3x2_mul(mat3x2 m1, mat2x3 m2, mat2 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat3x2_mulv(mat3x2 m, vec2 v, vec3 dest);
|
||||
glmc_mat3x2_mulv(mat3x2 m, vec3 v, vec2 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat3x2_transpose(mat3x2 m, mat2x3 dest);
|
||||
glmc_mat3x2_transpose(mat3x2 src, mat2x3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
|
||||
@@ -15,27 +15,27 @@ extern "C" {
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat3x4_copy(mat3x4 mat, mat3x4 dest);
|
||||
glmc_mat3x4_copy(mat3x4 src, mat3x4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat3x4_zero(mat3x4 mat);
|
||||
glmc_mat3x4_zero(mat3x4 m);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat3x4_make(float * __restrict src, mat3x4 dest);
|
||||
glmc_mat3x4_make(const float * __restrict src, mat3x4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat3x4_mul(mat3x4 m1, mat4x3 m2, mat3 dest);
|
||||
glmc_mat3x4_mul(mat3x4 m1, mat4x3 m2, mat4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat3x4_mulv(mat3x4 m, vec4 v, vec3 dest);
|
||||
glmc_mat3x4_mulv(mat3x4 m, vec3 v, vec4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat3x4_transpose(mat3x4 m, mat4x3 dest);
|
||||
glmc_mat3x4_transpose(mat3x4 src, mat4x3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
|
||||
@@ -123,7 +123,11 @@ glmc_mat4_rmc(vec4 r, mat4 m, vec4 c);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat4_make(float * __restrict src, mat4 dest);
|
||||
glmc_mat4_make(const float * __restrict src, mat4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat4_textrans(float sx, float sy, float rot, float tx, float ty, mat4 dest);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
@@ -15,27 +15,27 @@ extern "C" {
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat4x2_copy(mat4x2 mat, mat4x2 dest);
|
||||
glmc_mat4x2_copy(mat4x2 src, mat4x2 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat4x2_zero(mat4x2 mat);
|
||||
glmc_mat4x2_zero(mat4x2 m);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat4x2_make(float * __restrict src, mat4x2 dest);
|
||||
glmc_mat4x2_make(const float * __restrict src, mat4x2 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat4x2_mul(mat4x2 m1, mat2x4 m2, mat4 dest);
|
||||
glmc_mat4x2_mul(mat4x2 m1, mat2x4 m2, mat2 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat4x2_mulv(mat4x2 m, vec2 v, vec4 dest);
|
||||
glmc_mat4x2_mulv(mat4x2 m, vec4 v, vec2 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat4x2_transpose(mat4x2 m, mat2x4 dest);
|
||||
glmc_mat4x2_transpose(mat4x2 src, mat2x4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
|
||||
@@ -15,27 +15,27 @@ extern "C" {
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat4x3_copy(mat4x3 mat, mat4x3 dest);
|
||||
glmc_mat4x3_copy(mat4x3 src, mat4x3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat4x3_zero(mat4x3 mat);
|
||||
glmc_mat4x3_zero(mat4x3 m);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat4x3_make(float * __restrict src, mat4x3 dest);
|
||||
glmc_mat4x3_make(const float * __restrict src, mat4x3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat4x3_mul(mat4x3 m1, mat3x4 m2, mat4 dest);
|
||||
glmc_mat4x3_mul(mat4x3 m1, mat3x4 m2, mat3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat4x3_mulv(mat4x3 m, vec3 v, vec4 dest);
|
||||
glmc_mat4x3_mulv(mat4x3 m, vec4 v, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat4x3_transpose(mat4x3 m, mat3x4 dest);
|
||||
glmc_mat4x3_transpose(mat4x3 src, mat3x4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
|
||||
31
include/cglm/call/noise.h
Normal file
31
include/cglm/call/noise.h
Normal file
@@ -0,0 +1,31 @@
|
||||
/*
|
||||
* Copyright (c), Recep Aslantas.
|
||||
*
|
||||
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||
* Full license can be found in the LICENSE file
|
||||
*/
|
||||
|
||||
#ifndef cglmc_noise_h
|
||||
#define cglmc_noise_h
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "../cglm.h"
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_perlin_vec4(vec4 point);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_perlin_vec3(vec3 point);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_perlin_vec2(vec2 point);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif /* cglmc_noise_h */
|
||||
@@ -37,5 +37,3 @@ glmc_pickmatrix(vec2 center, vec2 size, vec4 vp, mat4 dest);
|
||||
}
|
||||
#endif
|
||||
#endif /* cglmc_project_h */
|
||||
|
||||
|
||||
|
||||
@@ -133,6 +133,10 @@ CGLM_EXPORT
|
||||
void
|
||||
glmc_quat_slerp(versor q, versor r, float t, versor dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_quat_slerp_longest(versor q, versor r, float t, versor dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_quat_look(vec3 eye, versor ori, mat4 dest);
|
||||
@@ -163,7 +167,7 @@ glmc_quat_rotate_atm(mat4 m, versor q, vec3 pivot);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_quat_make(float * __restrict src, versor dest);
|
||||
glmc_quat_make(const float * __restrict src, versor dest);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
@@ -20,7 +20,19 @@ glmc_ray_triangle(vec3 origin,
|
||||
vec3 v1,
|
||||
vec3 v2,
|
||||
float *d);
|
||||
|
||||
|
||||
CGLM_EXPORT
|
||||
bool
|
||||
glmc_ray_sphere(vec3 origin,
|
||||
vec3 dir,
|
||||
vec4 s,
|
||||
float * __restrict t1,
|
||||
float * __restrict t2);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ray_at(vec3 orig, vec3 dir, float t, vec3 point);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -17,6 +17,18 @@ CGLM_EXPORT
|
||||
void
|
||||
glmc_vec2(float * __restrict v, vec2 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec2_fill(vec2 v, float val);
|
||||
|
||||
CGLM_EXPORT
|
||||
bool
|
||||
glmc_vec2_eq(vec2 v, float val);
|
||||
|
||||
CGLM_EXPORT
|
||||
bool
|
||||
glmc_vec2_eqv(vec2 a, vec2 b);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec2_copy(vec2 a, vec2 dest);
|
||||
@@ -105,6 +117,30 @@ CGLM_EXPORT
|
||||
void
|
||||
glmc_vec2_minadd(vec2 a, vec2 b, vec2 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec2_subsub(vec2 a, vec2 b, vec2 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec2_addsub(vec2 a, vec2 b, vec2 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec2_mulsub(vec2 a, vec2 b, vec2 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec2_mulsubs(vec2 a, float s, vec2 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec2_maxsub(vec2 a, vec2 b, vec2 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec2_minsub(vec2 a, vec2 b, vec2 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec2_negate_to(vec2 v, vec2 dest);
|
||||
@@ -125,6 +161,10 @@ CGLM_EXPORT
|
||||
void
|
||||
glmc_vec2_rotate(vec2 v, float angle, vec2 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec2_center(vec2 a, vec2 b, vec2 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_vec2_distance2(vec2 a, vec2 b);
|
||||
@@ -149,10 +189,38 @@ CGLM_EXPORT
|
||||
void
|
||||
glmc_vec2_abs(vec2 v, vec2 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec2_fract(vec2 v, vec2 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec2_floor(vec2 v, vec2 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec2_mods(vec2 v, float s, vec2 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec2_swizzle(vec2 v, int mask, vec2 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec2_lerp(vec2 from, vec2 to, float t, vec2 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec2_step(vec2 edge, vec2 x, vec2 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec2_steps(float edge, vec2 x, vec2 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec2_stepr(vec2 edge, float x, vec2 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec2_complex_mul(vec2 a, vec2 b, vec2 dest);
|
||||
@@ -167,7 +235,19 @@ glmc_vec2_complex_conjugate(vec2 a, vec2 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec2_make(float * __restrict src, vec2 dest);
|
||||
glmc_vec2_make(const float * __restrict src, vec2 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec2_reflect(vec2 v, vec2 n, vec2 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
bool
|
||||
glmc_vec2_refract(vec2 v, vec2 n, float eta, vec2 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec2_swap(vec2 a, vec2 b);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
@@ -19,6 +19,7 @@ extern "C" {
|
||||
#define glmc_vec3_flipsign_to(v, dest) glmc_vec3_negate_to(v, dest)
|
||||
#define glmc_vec3_inv(v) glmc_vec3_negate(v)
|
||||
#define glmc_vec3_inv_to(v, dest) glmc_vec3_negate_to(v, dest)
|
||||
#define glmc_vec3_step_uni(edge, x, dest) glmc_vec3_steps(edge, x, dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
@@ -55,7 +56,7 @@ glmc_vec3_norm(vec3 v);
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_vec3_norm2(vec3 v);
|
||||
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_vec3_norm_one(vec3 v);
|
||||
@@ -132,6 +133,30 @@ CGLM_EXPORT
|
||||
void
|
||||
glmc_vec3_minadd(vec3 a, vec3 b, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec3_subsub(vec3 a, vec3 b, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec3_addsub(vec3 a, vec3 b, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec3_mulsub(vec3 a, vec3 b, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec3_mulsubs(vec3 a, float s, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec3_maxsub(vec3 a, vec3 b, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec3_minsub(vec3 a, vec3 b, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec3_negate(vec3 v);
|
||||
@@ -187,15 +212,15 @@ glmc_vec3_clamp(vec3 v, float minVal, float maxVal);
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec3_ortho(vec3 v, vec3 dest);
|
||||
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec3_lerp(vec3 from, vec3 to, float t, vec3 dest);
|
||||
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec3_lerpc(vec3 from, vec3 to, float t, vec3 dest);
|
||||
|
||||
|
||||
CGLM_INLINE
|
||||
void
|
||||
glmc_vec3_mix(vec3 from, vec3 to, float t, vec3 dest) {
|
||||
@@ -207,31 +232,31 @@ void
|
||||
glmc_vec3_mixc(vec3 from, vec3 to, float t, vec3 dest) {
|
||||
glmc_vec3_lerpc(from, to, t, dest);
|
||||
}
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec3_step_uni(float edge, vec3 x, vec3 dest);
|
||||
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec3_step(vec3 edge, vec3 x, vec3 dest);
|
||||
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec3_smoothstep_uni(float edge0, float edge1, vec3 x, vec3 dest);
|
||||
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec3_smoothstep(vec3 edge0, vec3 edge1, vec3 x, vec3 dest);
|
||||
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec3_smoothinterp(vec3 from, vec3 to, float t, vec3 dest);
|
||||
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec3_smoothinterpc(vec3 from, vec3 to, float t, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec3_swizzle(vec3 v, int mask, vec3 dest);
|
||||
|
||||
/* ext */
|
||||
|
||||
CGLM_EXPORT
|
||||
@@ -241,7 +266,7 @@ glmc_vec3_mulv(vec3 a, vec3 b, vec3 d);
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec3_broadcast(float val, vec3 d);
|
||||
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec3_fill(vec3 v, float val);
|
||||
@@ -289,15 +314,31 @@ glmc_vec3_isvalid(vec3 v);
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec3_sign(vec3 v, vec3 dest);
|
||||
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec3_abs(vec3 v, vec3 dest);
|
||||
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec3_fract(vec3 v, vec3 dest);
|
||||
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec3_floor(vec3 v, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec3_mods(vec3 v, float s, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec3_steps(float edge, vec3 x, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec3_stepr(vec3 edge, float x, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_vec3_hadd(vec3 v);
|
||||
@@ -308,7 +349,23 @@ glmc_vec3_sqrt(vec3 v, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec3_make(float * __restrict src, vec3 dest);
|
||||
glmc_vec3_make(const float * __restrict src, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec3_faceforward(vec3 n, vec3 v, vec3 nref, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec3_reflect(vec3 v, vec3 n, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
bool
|
||||
glmc_vec3_refract(vec3 v, vec3 n, float eta, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec3_swap(vec3 a, vec3 b);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
@@ -20,6 +20,7 @@ extern "C" {
|
||||
#define glmc_vec4_flipsign_to(v, dest) glmc_vec4_negate_to(v, dest)
|
||||
#define glmc_vec4_inv(v) glmc_vec4_negate(v)
|
||||
#define glmc_vec4_inv_to(v, dest) glmc_vec4_negate_to(v, dest)
|
||||
#define glmc_vec4_step_uni(edge, x, dest) glmc_vec4_steps(edge, x, dest)
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
@@ -56,7 +57,7 @@ glmc_vec4_norm(vec4 v);
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_vec4_norm2(vec4 v);
|
||||
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_vec4_norm_one(vec4 v);
|
||||
@@ -133,6 +134,30 @@ CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_minadd(vec4 a, vec4 b, vec4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_subsub(vec4 a, vec4 b, vec4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_addsub(vec4 a, vec4 b, vec4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_mulsub(vec4 a, vec4 b, vec4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_mulsubs(vec4 a, float s, vec4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_maxsub(vec4 a, vec4 b, vec4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_minsub(vec4 a, vec4 b, vec4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_negate(vec4 v);
|
||||
@@ -140,11 +165,11 @@ glmc_vec4_negate(vec4 v);
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_negate_to(vec4 v, vec4 dest);
|
||||
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_vec4_distance(vec4 a, vec4 b);
|
||||
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_vec4_distance2(vec4 a, vec4 b);
|
||||
@@ -160,15 +185,15 @@ glmc_vec4_minv(vec4 a, vec4 b, vec4 dest);
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_clamp(vec4 v, float minVal, float maxVal);
|
||||
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_lerp(vec4 from, vec4 to, float t, vec4 dest);
|
||||
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_lerpc(vec4 from, vec4 to, float t, vec4 dest);
|
||||
|
||||
|
||||
CGLM_INLINE
|
||||
void
|
||||
glmc_vec4_mix(vec4 from, vec4 to, float t, vec4 dest) {
|
||||
@@ -180,27 +205,23 @@ void
|
||||
glmc_vec4_mixc(vec4 from, vec4 to, float t, vec4 dest) {
|
||||
glmc_vec4_lerpc(from, to, t, dest);
|
||||
}
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_step_uni(float edge, vec4 x, vec4 dest);
|
||||
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_step(vec4 edge, vec4 x, vec4 dest);
|
||||
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_smoothstep_uni(float edge0, float edge1, vec4 x, vec4 dest);
|
||||
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_smoothstep(vec4 edge0, vec4 edge1, vec4 x, vec4 dest);
|
||||
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_smoothinterp(vec4 from, vec4 to, float t, vec4 dest);
|
||||
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_smoothinterpc(vec4 from, vec4 to, float t, vec4 dest);
|
||||
@@ -209,6 +230,10 @@ CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_cubic(float s, vec4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_swizzle(vec4 v, int mask, vec4 dest);
|
||||
|
||||
/* ext */
|
||||
|
||||
CGLM_EXPORT
|
||||
@@ -218,7 +243,7 @@ glmc_vec4_mulv(vec4 a, vec4 b, vec4 d);
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_broadcast(float val, vec4 d);
|
||||
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_fill(vec4 v, float val);
|
||||
@@ -266,15 +291,31 @@ glmc_vec4_isvalid(vec4 v);
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_sign(vec4 v, vec4 dest);
|
||||
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_abs(vec4 v, vec4 dest);
|
||||
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_fract(vec4 v, vec4 dest);
|
||||
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_floor(vec4 v, vec4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_mods(vec4 v, float s, vec4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_steps(float edge, vec4 x, vec4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_stepr(vec4 edge, float x, vec4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_vec4_hadd(vec4 v);
|
||||
@@ -285,10 +326,21 @@ glmc_vec4_sqrt(vec4 v, vec4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_make(float * __restrict src, vec4 dest);
|
||||
glmc_vec4_make(const float * __restrict src, vec4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_reflect(vec4 v, vec4 n, vec4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
bool
|
||||
glmc_vec4_refract(vec4 v, vec4 n, float eta, vec4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_swap(vec4 a, vec4 b);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif /* cglmc_vec4_h */
|
||||
|
||||
|
||||
@@ -25,7 +25,12 @@
|
||||
float nearZ,
|
||||
float farZ,
|
||||
mat4 dest)
|
||||
CGLM_INLINE void glm_perspective_infinite(float fovy,
|
||||
float aspect,
|
||||
float nearZ,
|
||||
mat4 dest)
|
||||
CGLM_INLINE void glm_perspective_default(float aspect, mat4 dest)
|
||||
CGLM_INLINE void glm_perspective_default_infinite(float aspect, mat4 dest)
|
||||
CGLM_INLINE void glm_perspective_resize(float aspect, mat4 proj)
|
||||
CGLM_INLINE void glm_lookat(vec3 eye, vec3 center, vec3 up, mat4 dest)
|
||||
CGLM_INLINE void glm_look(vec3 eye, vec3 dir, vec3 up, mat4 dest)
|
||||
@@ -87,7 +92,7 @@
|
||||
#endif
|
||||
|
||||
/*!
|
||||
* @brief set up perspective peprojection matrix
|
||||
* @brief set up perspective projection matrix
|
||||
*
|
||||
* @param[in] left viewport.left
|
||||
* @param[in] right viewport.right
|
||||
@@ -274,6 +279,28 @@ glm_perspective(float fovy, float aspect, float nearZ, float farZ, mat4 dest) {
|
||||
#endif
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief set up perspective projection matrix with infinite far plane
|
||||
*
|
||||
* @param[in] fovy field of view angle
|
||||
* @param[in] aspect aspect ratio ( width / height )
|
||||
* @param[in] nearZ near clipping plane
|
||||
* @param[out] dest result matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_perspective_infinite(float fovy, float aspect, float nearZ, mat4 dest) {
|
||||
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
|
||||
glm_perspective_infinite_lh_zo(fovy, aspect, nearZ, dest);
|
||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
|
||||
glm_perspective_infinite_lh_no(fovy, aspect, nearZ, dest);
|
||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
|
||||
glm_perspective_infinite_rh_zo(fovy, aspect, nearZ, dest);
|
||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
|
||||
glm_perspective_infinite_rh_no(fovy, aspect, nearZ, dest);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief extend perspective projection matrix's far distance
|
||||
*
|
||||
@@ -317,6 +344,27 @@ glm_perspective_default(float aspect, mat4 dest) {
|
||||
#endif
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief set up infinite perspective projection matrix with default near
|
||||
* and angle values
|
||||
*
|
||||
* @param[in] aspect aspect ratio ( width / height )
|
||||
* @param[out] dest result matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_perspective_default_infinite(float aspect, mat4 dest) {
|
||||
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
|
||||
glm_perspective_default_infinite_lh_zo(aspect, dest);
|
||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
|
||||
glm_perspective_default_infinite_lh_no(aspect, dest);
|
||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
|
||||
glm_perspective_default_infinite_rh_zo(aspect, dest);
|
||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
|
||||
glm_perspective_default_infinite_rh_no(aspect, dest);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief resize perspective matrix by aspect ratio ( width / height )
|
||||
* this makes very easy to resize proj matrix when window /viewport
|
||||
@@ -474,7 +522,7 @@ glm_persp_decomp_x(mat4 proj,
|
||||
|
||||
/*!
|
||||
* @brief decomposes top and bottom values of perspective projection.
|
||||
* y stands for y axis (top / botom axis)
|
||||
* y stands for y axis (top / bottom axis)
|
||||
*
|
||||
* @param[in] proj perspective projection matrix
|
||||
* @param[out] top top
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user