mirror of
https://github.com/recp/cglm.git
synced 2026-02-17 03:39:05 +00:00
Compare commits
244 Commits
sse_only
...
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 | ||
|
|
9ad7dd3fbc | ||
|
|
28142b5912 | ||
|
|
f07d75c680 | ||
|
|
17d8b83a38 | ||
|
|
013ac5dd07 | ||
|
|
a0e3d3766f | ||
|
|
fc7f0e13fd | ||
|
|
1340b5d512 | ||
|
|
85165dd3e3 | ||
|
|
3445f93fbc | ||
|
|
d2642eb206 | ||
|
|
8366e51b47 | ||
|
|
30b4ea80a9 |
601
.github/workflows/ci.yml
vendored
601
.github/workflows/ci.yml
vendored
@@ -8,25 +8,80 @@ on:
|
||||
|
||||
jobs:
|
||||
build_autotools:
|
||||
name: Autotools / ${{ matrix.os }}
|
||||
name: Autotools / ${{ matrix.os }} / ${{ matrix.simd }}
|
||||
runs-on: ${{ matrix.os }}
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os: [macos-12, macos-14, ubuntu-22.04]
|
||||
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
|
||||
- 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
|
||||
run: ./configure CFLAGS="$CFLAGS"
|
||||
|
||||
- name: Build
|
||||
run: make
|
||||
@@ -55,13 +110,141 @@ jobs:
|
||||
- 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-12, macos-14]
|
||||
os: [macos-13, macos-14]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
@@ -86,76 +269,270 @@ jobs:
|
||||
working-directory: build
|
||||
run: ./tests
|
||||
|
||||
build_cmake_ubuntu:
|
||||
name: CMake / ${{ matrix.target.os }} / ${{ matrix.target.cc }}
|
||||
runs-on: ${{ matrix.target.os }}
|
||||
build_cmake:
|
||||
name: CMake / ${{ matrix.os }} / ${{ matrix.simd }}
|
||||
runs-on: ${{ matrix.os }}
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
target:
|
||||
- { os: ubuntu-20.04, cc: gcc-11 }
|
||||
- { os: ubuntu-22.04, cc: gcc-12 }
|
||||
- { os: ubuntu-22.04, cc: gcc-13 }
|
||||
- { os: ubuntu-20.04, cc: clang-12 }
|
||||
- { os: ubuntu-22.04, cc: clang-15 }
|
||||
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 Compiler and Ninja
|
||||
run: |
|
||||
sudo apt-get update -y
|
||||
sudo apt-get install -y ${{ matrix.target.cc }} ninja-build
|
||||
- name: Install Ninja on macOS
|
||||
if: runner.os == 'macOS'
|
||||
run: brew upgrade && brew install ninja
|
||||
|
||||
- name: Configure CMake
|
||||
- name: Set SIMD flags (Windows)
|
||||
if: runner.os == 'Windows'
|
||||
shell: pwsh
|
||||
run: |
|
||||
cmake \
|
||||
-B build \
|
||||
-GNinja \
|
||||
-DCMAKE_C_COMPILER=${{ matrix.target.cc }} \
|
||||
-DCMAKE_BUILD_TYPE=Release \
|
||||
-DCGLM_STATIC=ON \
|
||||
-DCGLM_USE_TEST=ON
|
||||
$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
|
||||
- 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_cmake_windows:
|
||||
name: CMake / ${{ matrix.platform.name }}
|
||||
runs-on: windows-2022
|
||||
build_meson:
|
||||
name: Meson / ${{ matrix.os }} / ${{ matrix.simd }}
|
||||
runs-on: ${{ contains(matrix.os, 'arm64') && 'ubuntu-latest-arm64' || matrix.os }}
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
platform:
|
||||
- { name: Windows (x64), flags: -A x64 }
|
||||
- { name: Windows (x86), flags: -A Win32 }
|
||||
- { name: Windows (clang-cl x64), flags: -T ClangCL -A x64 }
|
||||
- { name: Windows (clang-cl x86), flags: -T ClangCL -A Win32 }
|
||||
- { name: Windows (ARM), flags: -A ARM, skip_tests: true, skip_build: true } # This fails to build.
|
||||
- { name: Windows (ARM64), flags: -A ARM64, skip_tests: true }
|
||||
- { name: UWP (ARM64), flags: -A ARM64, -DCMAKE_SYSTEM_NAME=WindowsStore -DCMAKE_SYSTEM_VERSION="10.0", skip_tests: true }
|
||||
- { name: UWP (x64), flags: -A x64 -DCMAKE_SYSTEM_NAME=WindowsStore -DCMAKE_SYSTEM_VERSION="10.0", skip_tests: true }
|
||||
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
|
||||
|
||||
- name: Configure CMake
|
||||
run: cmake -B build `
|
||||
-DCGLM_STATIC=ON `
|
||||
-DCGLM_USE_TEST=ON `
|
||||
${{ matrix.platform.flags }}
|
||||
- uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: '3.12'
|
||||
cache: 'pip'
|
||||
|
||||
- name: Build
|
||||
if: ${{ !matrix.platform.skip_build }}
|
||||
run: cmake --build build --config Release --parallel
|
||||
- name: Install meson
|
||||
run: python3 -m pip install meson ninja
|
||||
|
||||
- name: Test
|
||||
if: ${{ !matrix.platform.skip_tests }}
|
||||
working-directory: build
|
||||
run: .\Release\tests.exe
|
||||
- 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
|
||||
@@ -176,57 +553,13 @@ jobs:
|
||||
working-directory: docs
|
||||
run: sphinx-build -W --keep-going source build
|
||||
|
||||
build_meson:
|
||||
name: Meson / ${{ matrix.os }}
|
||||
runs-on: ${{ matrix.os }}
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os: [macos-14, ubuntu-22.04]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: '3.12'
|
||||
cache: 'pip'
|
||||
|
||||
- name: Install meson
|
||||
run: python3 -m pip install meson ninja
|
||||
|
||||
- name: Build
|
||||
run: meson setup build -Dbuildtype=release --default-library=static -Dbuild_tests=true
|
||||
|
||||
- name: Test
|
||||
run: meson test -C build
|
||||
|
||||
build_msbuild:
|
||||
name: MSBuild / Windows
|
||||
runs-on: windows-2022
|
||||
|
||||
# This has no test yet.
|
||||
# It could also try building for ARM, ARM64, ARM64EC, but those fail currently.
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- uses: microsoft/setup-msbuild@v2
|
||||
|
||||
- name: Build (x86)
|
||||
working-directory: win
|
||||
run: msbuild cglm.vcxproj /p:Configuration=Release /p:Platform=x86 /p:BuildInParallel=true
|
||||
|
||||
- name: Build (x64)
|
||||
working-directory: win
|
||||
run: msbuild cglm.vcxproj /p:Configuration=Release /p:Platform=x64 /p:BuildInParallel=true
|
||||
|
||||
build_swift:
|
||||
name: Swift ${{ matrix.swift }} / ${{ matrix.os }}
|
||||
runs-on: ${{ matrix.os }}
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os: [macos-12, macos-14, ubuntu-22.04]
|
||||
os: [macos-13, macos-14, ubuntu-22.04]
|
||||
|
||||
# This has no test yet.
|
||||
steps:
|
||||
@@ -234,3 +567,79 @@ jobs:
|
||||
|
||||
- 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
|
||||
|
||||
12
.github/workflows/cmake-wasm.yml
vendored
12
.github/workflows/cmake-wasm.yml
vendored
@@ -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
|
||||
|
||||
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
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.4
|
||||
VERSION 0.9.6
|
||||
HOMEPAGE_URL https://github.com/recp/cglm
|
||||
DESCRIPTION "OpenGL Mathematics (glm) for C"
|
||||
LANGUAGES C
|
||||
@@ -44,7 +44,7 @@ if(MSVC)
|
||||
endforeach(flag_var)
|
||||
endif()
|
||||
else()
|
||||
add_compile_options(-Wall)
|
||||
add_compile_options(-Wall -Wextra -Wpedantic -Wconversion)
|
||||
|
||||
if(NOT CMAKE_BUILD_TYPE MATCHES Debug)
|
||||
add_compile_options(-O3)
|
||||
@@ -93,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
|
||||
|
||||
10
Makefile.am
10
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,6 +67,7 @@ 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 \
|
||||
@@ -120,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 \
|
||||
@@ -129,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 \
|
||||
@@ -210,6 +213,7 @@ cglm_struct_HEADERS = include/cglm/struct/mat4.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 \
|
||||
@@ -261,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 \
|
||||
@@ -270,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 \
|
||||
|
||||
488
README.md
488
README.md
@@ -39,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 configurations e.g. Left Handed, Zero-to-One (_zo)... `CGLM_FORCE_DEPTH_ZERO_TO_ONE` and `CGLM_FORCE_LEFT_HANDED` is provided to control clipspace. You should be able to use **cglm** with Vulkan, DirectX and Metal now... see https://cglm.readthedocs.io/en/latest/opt.html#clipspace-option-s
|
||||
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... (currently 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...)
|
||||
@@ -117,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 manually with SSE2 if available, if not? Dont worry there are non-sse versions of all operations
|
||||
|
||||
You can pass matrices and vectors as array to functions rather than get address.
|
||||
|
||||
```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;
|
||||
@@ -169,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>
|
||||
|
||||
|
||||
@@ -498,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
|
||||
|
||||
@@ -2,7 +2,7 @@ Pod::Spec.new do |s|
|
||||
|
||||
# Description
|
||||
s.name = "cglm"
|
||||
s.version = "0.9.3"
|
||||
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.4], [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.
|
||||
|
||||
@@ -82,7 +82,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
|
||||
|
||||
@@ -95,7 +95,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
|
||||
|
||||
|
||||
@@ -117,7 +117,7 @@ Functions documentation
|
||||
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 identiy, rotation may not be around
|
||||
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 ... )
|
||||
|
||||
@@ -66,6 +66,7 @@ Follow the :doc:`build` documentation for this
|
||||
ivec4
|
||||
color
|
||||
plane
|
||||
noise
|
||||
project
|
||||
util
|
||||
io
|
||||
|
||||
@@ -9,7 +9,7 @@ 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...
|
||||
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.
|
||||
|
||||
@@ -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,7 +75,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
|
||||
|
||||
|
||||
@@ -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 )
|
||||
|
||||
@@ -62,9 +62,9 @@ author = u'Recep Aslantas'
|
||||
# built documents.
|
||||
#
|
||||
# The short X.Y version.
|
||||
version = u'0.9.4'
|
||||
version = u'0.9.6'
|
||||
# The full version, including alpha/beta/rc tags.
|
||||
release = u'0.9.4'
|
||||
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 ------------------------------------------
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -36,58 +36,103 @@ Represented
|
||||
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)
|
||||
|
||||
make given matrix zero
|
||||
|
||||
Parameters:
|
||||
| *[in,out]* **mat** matrix
|
||||
|
||||
.. c:function:: void glm_mat2x3_make(const float * __restrict src, mat2x3 dest)
|
||||
|
||||
Create mat2x3 matrix from pointer
|
||||
|
||||
.. note:: **@src** must contain at least 6 elements.
|
||||
|
||||
Parameters:
|
||||
| *[in]* **src** pointer to an array of floats
|
||||
| *[out]* **dest** destination matrix2x3
|
||||
|
||||
.. c:function:: void glm_mat2x3_mul(mat2x3 m1, mat3x2 m2, mat3 dest)
|
||||
|
||||
multiply m1 and m2 to dest
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
glm_mat2x3_mul(mat2x3, mat3x2, mat3);
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m1** left matrix (mat2x3)
|
||||
| *[in]* **m2** right matrix (mat3x2)
|
||||
| *[out]* **dest** destination matrix (mat3)
|
||||
|
||||
.. csv-table:: mat2x3
|
||||
.. csv-table:: mat2x3 **(src)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "a00", "a10"
|
||||
"row 2", "a01", "a11"
|
||||
"row 3", "a02", "a12"
|
||||
|
||||
.. csv-table:: mat3x2
|
||||
.. csv-table:: mat2x3 **(dest)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "b00 = a00", "b10 = a10"
|
||||
"row 2", "b01 = a01", "b11 = a11"
|
||||
"row 3", "b02 = a02", "b12 = a12"
|
||||
|
||||
.. c:function:: void glm_mat2x3_zero(mat2x3 m)
|
||||
|
||||
Zero out the mat2x3 (m).
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** mat2x3 (src, dest)
|
||||
|
||||
.. csv-table:: mat2x3 **(m)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "0.00", "2.00"
|
||||
"row 2", "5.00", "4.00"
|
||||
"row 3", "7.00", "6.00"
|
||||
|
||||
.. csv-table:: mat2x3 **(m)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "0.00", "0.00"
|
||||
"row 2", "0.00", "0.00"
|
||||
"row 3", "0.00", "0.00"
|
||||
|
||||
.. c:function:: void glm_mat2x3_make(const float * __restrict src, mat2x3 dest)
|
||||
|
||||
Create mat2x3 (dest) from pointer (src).
|
||||
|
||||
.. note:: **@src** must contain at least 6 elements.
|
||||
|
||||
Parameters:
|
||||
| *[in]* **src** pointer to an array of floats (left)
|
||||
| *[out]* **dest** destination (result, mat2x3)
|
||||
|
||||
.. csv-table:: float array (1x6) **(src)**
|
||||
:header: "", "column 1"
|
||||
|
||||
"row 1", "v0"
|
||||
"row 2", "v1"
|
||||
"row 3", "v2"
|
||||
"row 4", "v3"
|
||||
"row 5", "v4"
|
||||
"row 6", "v5"
|
||||
|
||||
.. csv-table:: mat2x3 **(dest)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "v0", "v3"
|
||||
"row 2", "v1", "v4"
|
||||
"row 3", "v2", "v5"
|
||||
|
||||
.. c:function:: void glm_mat2x3_mul(mat2x3 m1, mat3x2 m2, mat3 dest)
|
||||
|
||||
Multiply mat2x3 (m1) by mat3x2 (m2) and store in mat3 (dest).
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
glm_mat2x3_mul(mat2x3, mat3x2, mat3);
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m1** mat2x3 (left)
|
||||
| *[in]* **m2** mat3x2 (right)
|
||||
| *[out]* **dest** destination (result, mat3)
|
||||
|
||||
.. csv-table:: mat2x3 **(m1)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "a00", "a10"
|
||||
"row 2", "a01", "a11"
|
||||
"row 3", "a02", "a12"
|
||||
|
||||
.. csv-table:: mat3x2 **(m2)**
|
||||
:header: "", "column 1", "column 2", "column 3"
|
||||
|
||||
"row 1", "b00", "b10", "b20"
|
||||
"row 2", "b01", "b11", "b21"
|
||||
|
||||
.. csv-table:: mat3x3
|
||||
.. 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"
|
||||
@@ -96,45 +141,65 @@ Functions documentation
|
||||
|
||||
.. c:function:: void glm_mat2x3_mulv(mat2x3 m, vec2 v, vec3 dest)
|
||||
|
||||
multiply mat2x3 with vec2 (column vector) and store in dest column vector
|
||||
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)
|
||||
|
||||
.. csv-table:: mat2x3
|
||||
.. csv-table:: mat2x3 **(m)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "m00", "m10"
|
||||
"row 2", "m01", "m11"
|
||||
"row 3", "m02", "m12"
|
||||
|
||||
.. csv-table:: column vec2 (1x2)
|
||||
.. csv-table:: column vec2 (1x2) **(v)**
|
||||
:header: "", "column 1"
|
||||
|
||||
"row 1", "v0"
|
||||
"row 2", "v1"
|
||||
|
||||
.. csv-table:: column vec3 (1x3)
|
||||
.. 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 m, mat3x2 dest)
|
||||
.. c:function:: void glm_mat2x3_transpose(mat2x3 src, mat3x2 dest)
|
||||
|
||||
transpose matrix and store in 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"
|
||||
|
||||
@@ -37,45 +37,15 @@ Represented
|
||||
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)
|
||||
|
||||
make given matrix zero
|
||||
|
||||
Parameters:
|
||||
| *[in,out]* **mat** matrix
|
||||
|
||||
.. c:function:: void glm_mat2x4_make(const float * __restrict src, mat2x4 dest)
|
||||
|
||||
Create mat2x4 matrix from pointer
|
||||
|
||||
.. note:: **@src** must contain at least 8 elements.
|
||||
|
||||
Parameters:
|
||||
| *[in]* **src** pointer to an array of floats
|
||||
| *[out]* **dest** destination matrix2x4
|
||||
|
||||
.. c:function:: void glm_mat2x4_mul(mat2x4 m1, mat4x2 m2, mat4 dest)
|
||||
|
||||
multiply m1 and m2 to dest
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
glm_mat2x4_mul(mat2x4, mat4x2, mat4);
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m1** left matrix (mat2x4)
|
||||
| *[in]* **m2** right matrix (mat4x2)
|
||||
| *[out]* **dest** destination matrix (mat4)
|
||||
|
||||
.. csv-table:: mat2x4
|
||||
.. csv-table:: mat2x4 **(src)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "a00", "a10"
|
||||
@@ -83,13 +53,95 @@ Functions documentation
|
||||
"row 3", "a02", "a12"
|
||||
"row 4", "a03", "a13"
|
||||
|
||||
.. csv-table:: mat4x2
|
||||
.. csv-table:: mat2x4 **(dest)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "b00 = a00", "b10 = a10"
|
||||
"row 2", "b01 = a01", "b11 = a11"
|
||||
"row 3", "b02 = a02", "b12 = a12"
|
||||
"row 4", "b03 = a03", "b13 = a13"
|
||||
|
||||
.. c:function:: void glm_mat2x4_zero(mat2x4 m)
|
||||
|
||||
Zero out the mat2x4 (m).
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** mat2x4 (src, dest)
|
||||
|
||||
.. csv-table:: mat2x4 **(m)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "0.00", "2.00"
|
||||
"row 2", "5.00", "4.00"
|
||||
"row 3", "7.00", "6.00"
|
||||
"row 4", "23.00", "1.00"
|
||||
|
||||
.. csv-table:: mat2x4 **(m)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "0.00", "0.00"
|
||||
"row 2", "0.00", "0.00"
|
||||
"row 3", "0.00", "0.00"
|
||||
"row 4", "0.00", "0.00"
|
||||
|
||||
.. c:function:: void glm_mat2x4_make(const float * __restrict src, mat2x4 dest)
|
||||
|
||||
Create mat2x4 (dest) from pointer (src).
|
||||
|
||||
.. note:: **@src** must contain at least 8 elements.
|
||||
|
||||
Parameters:
|
||||
| *[in]* **src** pointer to an array of floats (left)
|
||||
| *[out]* **dest** destination (result, mat2x4)
|
||||
|
||||
.. csv-table:: float array (1x8) **(src)**
|
||||
:header: "", "column 1"
|
||||
|
||||
"row 1", "v0"
|
||||
"row 2", "v1"
|
||||
"row 3", "v2"
|
||||
"row 4", "v3"
|
||||
"row 5", "v4"
|
||||
"row 6", "v5"
|
||||
"row 7", "v6"
|
||||
"row 8", "v7"
|
||||
|
||||
.. csv-table:: mat2x4 **(dest)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "v0", "v4"
|
||||
"row 2", "v1", "v5"
|
||||
"row 3", "v2", "v6"
|
||||
"row 4", "v3", "v7"
|
||||
|
||||
.. c:function:: void glm_mat2x4_mul(mat2x4 m1, mat4x2 m2, mat4 dest)
|
||||
|
||||
Multiply mat2x4 (m1) by mat4x2 (m2) and store in mat4 (dest).
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
glm_mat2x4_mul(mat2x4, mat4x2, mat4);
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m1** mat2x4 (left)
|
||||
| *[in]* **m2** mat4x2 (right)
|
||||
| *[out]* **dest** destination (result, mat4)
|
||||
|
||||
.. csv-table:: mat2x4 **(m1)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "a00", "a10"
|
||||
"row 2", "a01", "a11"
|
||||
"row 3", "a02", "a12"
|
||||
"row 4", "a03", "a13"
|
||||
|
||||
.. csv-table:: mat4x2 **(m2)**
|
||||
:header: "", "column 1", "column 2", "column 3", "column 4"
|
||||
|
||||
"row 1", "b00", "b10", "b20", "b30"
|
||||
"row 2", "b01", "b11", "b21", "b31"
|
||||
|
||||
.. csv-table:: mat4x4
|
||||
.. 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"
|
||||
@@ -99,14 +151,14 @@ Functions documentation
|
||||
|
||||
.. c:function:: void glm_mat2x4_mulv(mat2x4 m, vec2 v, vec4 dest)
|
||||
|
||||
multiply mat2x4 with vec2 (column vector) and store in dest column vector
|
||||
Multiply mat2x4 (m) by vec2 (v) and store in vec4 (dest).
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** mat2x4 (left)
|
||||
| *[in]* **v** vec2 (right, column vector)
|
||||
| *[out]* **dest** destination (result, column vector)
|
||||
| *[in]* **m** mat2x4 (left)
|
||||
| *[in]* **v** vec2 (right, column vector)
|
||||
| *[out]* **dest** destination (result, column vector)
|
||||
|
||||
.. csv-table:: mat2x4
|
||||
.. csv-table:: mat2x4 **(m)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "m00", "m10"
|
||||
@@ -114,13 +166,13 @@ Functions documentation
|
||||
"row 3", "m02", "m12"
|
||||
"row 4", "m03", "m13"
|
||||
|
||||
.. csv-table:: column vec2 (1x2)
|
||||
.. csv-table:: column vec2 (1x2) **(v)**
|
||||
:header: "", "column 1"
|
||||
|
||||
"row 1", "v0"
|
||||
"row 2", "v1"
|
||||
|
||||
.. csv-table:: column vec4 (1x4)
|
||||
.. csv-table:: column vec4 (1x4) **(dest)**
|
||||
:header: "", "column 1"
|
||||
|
||||
"row 1", "m00 * v0 + m10 * v1"
|
||||
@@ -128,18 +180,40 @@ Functions documentation
|
||||
"row 3", "m02 * v0 + m12 * v1"
|
||||
"row 4", "m03 * v0 + m13 * v1"
|
||||
|
||||
.. c:function:: void glm_mat2x4_transpose(mat2x4 m, mat4x2 dest)
|
||||
.. c:function:: void glm_mat2x4_transpose(mat2x4 src, mat4x2 dest)
|
||||
|
||||
transpose matrix and store in 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
@@ -35,58 +35,98 @@ Represented
|
||||
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)
|
||||
|
||||
.. csv-table:: mat3x2 **(m)**
|
||||
:header: "", "column 1", "column 2", "column 3"
|
||||
|
||||
"row 1", "0.00", "2.00", "15.00"
|
||||
"row 2", "5.00", "4.00", "6.00"
|
||||
|
||||
.. csv-table:: mat3x2 **(m)**
|
||||
:header: "", "column 1", "column 2", "column 3"
|
||||
|
||||
"row 1", "0.00", "0.00", "0.00"
|
||||
"row 2", "0.00", "0.00", "0.00"
|
||||
|
||||
.. c:function:: void glm_mat3x2_make(const float * __restrict src, mat3x2 dest)
|
||||
|
||||
Create mat3x2 matrix from pointer
|
||||
Create mat3x2 (dest) from pointer (src).
|
||||
|
||||
.. 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)
|
||||
|
||||
.. csv-table:: float array (1x6) **(src)**
|
||||
:header: "", "column 1"
|
||||
|
||||
"row 1", "v0"
|
||||
"row 2", "v1"
|
||||
"row 3", "v2"
|
||||
"row 4", "v3"
|
||||
"row 5", "v4"
|
||||
"row 6", "v5"
|
||||
|
||||
.. csv-table:: mat3x2 **(dest)**
|
||||
:header: "", "column 1", "column 2", "column 3"
|
||||
|
||||
"row 1", "v0", "v2", "v4"
|
||||
"row 2", "v1", "v3", "v5"
|
||||
|
||||
.. c:function:: void glm_mat3x2_mul(mat3x2 m1, mat2x3 m2, mat2 dest)
|
||||
|
||||
multiply m1 and m2 to dest
|
||||
Multiply mat3x2 (m1) by mat2x3 (m2) and store in mat2 (dest).
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
glm_mat3x2_mul(mat3x2, mat2x3, mat2);
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m1** left matrix (mat3x2)
|
||||
| *[in]* **m2** right matrix (mat2x3)
|
||||
| *[out]* **dest** destination matrix (mat2)
|
||||
| *[in]* **m1** mat3x2 (left)
|
||||
| *[in]* **m2** mat2x3 (right)
|
||||
| *[out]* **dest** destination (result, mat2)
|
||||
|
||||
.. csv-table:: mat3x2
|
||||
.. csv-table:: mat3x2 **(m1)**
|
||||
:header: "", "column 1", "column 2", "column 3"
|
||||
|
||||
"row 1", "a00", "a10", "a20"
|
||||
"row 2", "a01", "a11", "a21"
|
||||
|
||||
.. csv-table:: mat2x3
|
||||
.. csv-table:: mat2x3 **(m2)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "b00", "b10"
|
||||
"row 2", "b01", "b11"
|
||||
"row 3", "b02", "b12"
|
||||
|
||||
.. csv-table:: mat2x2
|
||||
.. csv-table:: mat2x2 **(dest)**
|
||||
:header: "", "column 1", "column 2"
|
||||
|
||||
"row 1", "a00 * b00 + a10 * b01 + a20 * b02", "a00 * b10 + a10 * b11 + a20 * b12"
|
||||
@@ -94,44 +134,63 @@ Functions documentation
|
||||
|
||||
.. c:function:: void glm_mat3x2_mulv(mat3x2 m, vec3 v, vec2 dest)
|
||||
|
||||
multiply mat3x2 with vec3 (column vector) and store in dest vector
|
||||
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)
|
||||
|
||||
.. csv-table:: mat3x2
|
||||
.. csv-table:: mat3x2 **(m)**
|
||||
:header: "", "column 1", "column 2", "column 3"
|
||||
|
||||
"row 1", "m00", "m10", "m20"
|
||||
"row 2", "m01", "m11", "m21"
|
||||
|
||||
.. csv-table:: column vec3 (1x3)
|
||||
.. csv-table:: column vec3 (1x3) **(v)**
|
||||
:header: "", "column 1"
|
||||
|
||||
"row 1", "v0"
|
||||
"row 2", "v1"
|
||||
"row 3", "v2"
|
||||
|
||||
.. csv-table:: column vec2 (1x2)
|
||||
.. 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 m, mat2x3 dest)
|
||||
.. c:function:: void glm_mat3x2_transpose(mat3x2 src, mat2x3 dest)
|
||||
|
||||
transpose matrix and store in 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,68 +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)
|
||||
|
||||
.. csv-table:: mat3x4 **(m)**
|
||||
:header: "", "column 1", "column 2", "column 3"
|
||||
|
||||
"row 1", "0.00", "2.00", "78.00"
|
||||
"row 2", "5.00", "4.00", "12.00"
|
||||
"row 3", "7.00", "6.00", "32.00"
|
||||
"row 4", "23.00", "1.00", "9.00"
|
||||
|
||||
.. csv-table:: mat3x4 **(m)**
|
||||
:header: "", "column 1", "column 2", "column 3"
|
||||
|
||||
"row 1", "0.00", "0.00", "0.00"
|
||||
"row 2", "0.00", "0.00", "0.00"
|
||||
"row 3", "0.00", "0.00", "0.00"
|
||||
"row 4", "0.00", "0.00", "0.00"
|
||||
|
||||
.. c:function:: void glm_mat3x4_make(const float * __restrict src, mat3x4 dest)
|
||||
|
||||
Create mat3x4 matrix from pointer
|
||||
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"
|
||||
|
||||
.. csv-table:: mat3x4 **(dest)**
|
||||
:header: "", "column 1", "column 2", "column 3"
|
||||
|
||||
"row 1", "v0", "v4", "v8"
|
||||
"row 2", "v1", "v5", "v9"
|
||||
"row 3", "v2", "v6", "v10"
|
||||
"row 4", "v3", "v7", "v11"
|
||||
|
||||
.. c:function:: void glm_mat3x4_mul(mat3x4 m1, mat4x3 m2, mat4 dest)
|
||||
|
||||
Multiply mat3x4 (m1) by mat4x3 (m2) and store in mat4 (dest).
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
glm_mat3x4_mul(mat3x4, mat4x3, mat3);
|
||||
glm_mat3x4_mul(mat3x4, mat4x3, mat4);
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m1** left matrix (mat3x4)
|
||||
| *[in]* **m2** right matrix (mat4x3)
|
||||
| *[out]* **dest** destination matrix (mat3)
|
||||
| *[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"
|
||||
|
||||
@@ -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
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
@@ -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:
|
||||
@@ -313,3 +314,15 @@ Functions documentation
|
||||
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,68 +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)
|
||||
|
||||
.. csv-table:: mat4x2 **(m)**
|
||||
:header: "", "column 1", "column 2", "column 3", "column 4"
|
||||
|
||||
"row 1", "0.00", "2.00", "15.00", "44.00"
|
||||
"row 2", "5.00", "4.00", "6.00", "12.00"
|
||||
|
||||
.. csv-table:: mat4x2 **(m)**
|
||||
:header: "", "column 1", "column 2", "column 3", "column 4"
|
||||
|
||||
"row 1", "0.00", "0.00", "0.00", "0.00"
|
||||
"row 2", "0.00", "0.00", "0.00", "0.00"
|
||||
|
||||
.. c:function:: void glm_mat4x2_make(const float * __restrict src, mat4x2 dest)
|
||||
|
||||
Create mat4x2 matrix from pointer
|
||||
Create mat4x2 (dest) from pointer (src).
|
||||
|
||||
.. 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"
|
||||
|
||||
.. csv-table:: mat4x2 **(dest)**
|
||||
:header: "", "column 1", "column 2", "column 3", "column 4"
|
||||
|
||||
"row 1", "v0", "v2", "v4", "v6"
|
||||
"row 2", "v1", "v3", "v5", "v7"
|
||||
|
||||
.. c:function:: void glm_mat4x2_mul(mat4x2 m1, mat2x4 m2, mat2 dest)
|
||||
|
||||
Multiply mat4x2 (m1) by mat2x4 (m2) and store in mat2 (dest).
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
glm_mat4x2_mul(mat4x2, mat2x4, mat4);
|
||||
glm_mat4x2_mul(mat4x2, mat2x4, mat2);
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m1** left matrix (mat4x2)
|
||||
| *[in]* **m2** right matrix (mat2x4)
|
||||
| *[out]* **dest** destination matrix (mat4)
|
||||
| *[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,68 +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)
|
||||
|
||||
.. csv-table:: mat4x3 **(m)**
|
||||
:header: "", "column 1", "column 2", "column 3", "column 4"
|
||||
|
||||
"row 1", "0.00", "2.00", "15.00", "44.00"
|
||||
"row 2", "5.00", "4.00", "6.00", "12.00"
|
||||
"row 3", "88.00", "8.00", "4.30", "15.00"
|
||||
|
||||
.. csv-table:: mat4x3 **(m)**
|
||||
:header: "", "column 1", "column 2", "column 3", "column 4"
|
||||
|
||||
"row 1", "0.00", "0.00", "0.00", "0.00"
|
||||
"row 2", "0.00", "0.00", "0.00", "0.00"
|
||||
"row3", "0.00", "0.00", "0.00", "0.00"
|
||||
|
||||
.. c:function:: void glm_mat4x3_make(const float * __restrict src, mat4x3 dest)
|
||||
|
||||
Create mat4x3 matrix from pointer
|
||||
Create mat4x3 (dest) from pointer (src).
|
||||
|
||||
.. 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"
|
||||
|
||||
.. csv-table:: mat4x3 **(dest)**
|
||||
:header: "", "column 1", "column 2", "column 3", "column 4"
|
||||
|
||||
"row 1", "v0", "v3", "v6", "v9"
|
||||
"row 2", "v1", "v4", "v7", "v10"
|
||||
"row 3", "v2", "v5", "v8", "v11"
|
||||
|
||||
.. c:function:: void glm_mat4x3_mul(mat4x3 m1, mat3x4 m2, mat3 dest)
|
||||
|
||||
Multiply mat4x3 (m1) by mat3x4 (m2) and store in mat3 (dest).
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
glm_mat4x3_mul(mat4x3, mat3x4, mat4);
|
||||
glm_mat4x3_mul(mat4x3, mat3x4, mat3);
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m1** left matrix (mat4x3)
|
||||
| *[in]* **m2** right matrix (mat3x4)
|
||||
| *[out]* **dest** destination matrix (mat4)
|
||||
| *[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
|
||||
|
||||
@@ -76,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
|
||||
|
||||
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; }
|
||||
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -151,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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -95,7 +95,7 @@ glm_aabb2d_merge(vec2 aabb1[2], vec2 aabb2[2], vec2 dest[2]) {
|
||||
/*!
|
||||
* @brief crops a bounding aabb with another one.
|
||||
*
|
||||
* this could be useful for gettng a baabb which fits with view frustum and
|
||||
* 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
|
||||
*
|
||||
@@ -116,7 +116,7 @@ glm_aabb2d_crop(vec2 aabb[2], vec2 cropAabb[2], vec2 dest[2]) {
|
||||
/*!
|
||||
* @brief crops a bounding aabb with another one.
|
||||
*
|
||||
* this could be useful for gettng a baabb which fits with view frustum and
|
||||
* 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
|
||||
*
|
||||
@@ -268,4 +268,3 @@ glm_aabb2d_contains(vec2 aabb[2], vec2 other[2]) {
|
||||
}
|
||||
|
||||
#endif /* cglm_aabb2d_h */
|
||||
|
||||
|
||||
@@ -215,7 +215,7 @@ glm_rotate_z(mat4 m, float angle, mat4 dest) {
|
||||
* 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 identiy, rotation may not be around
|
||||
* 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 ... )
|
||||
|
||||
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 */
|
||||
@@ -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,7 +98,7 @@ 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
|
||||
*
|
||||
|
||||
@@ -32,6 +32,7 @@ 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"
|
||||
|
||||
@@ -87,5 +87,3 @@ glmc_aabb2d_circle(vec2 aabb[2], vec3 s);
|
||||
}
|
||||
#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
|
||||
|
||||
@@ -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(const 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,11 +15,11 @@ 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
|
||||
@@ -35,7 +35,7 @@ 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,11 +15,11 @@ 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
|
||||
@@ -35,7 +35,7 @@ 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
|
||||
|
||||
@@ -84,6 +84,10 @@ CGLM_EXPORT
|
||||
void
|
||||
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
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -15,11 +15,11 @@ 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
|
||||
@@ -35,7 +35,7 @@ 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,11 +15,11 @@ 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
|
||||
@@ -27,15 +27,15 @@ 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
|
||||
|
||||
@@ -125,6 +125,10 @@ CGLM_EXPORT
|
||||
void
|
||||
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
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -15,11 +15,11 @@ 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
|
||||
@@ -27,15 +27,15 @@ 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,11 +15,11 @@ 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
|
||||
@@ -27,15 +27,15 @@ 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);
|
||||
|
||||
@@ -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);
|
||||
@@ -177,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);
|
||||
@@ -205,6 +245,10 @@ 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
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -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);
|
||||
@@ -211,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) {
|
||||
@@ -231,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
|
||||
@@ -265,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);
|
||||
@@ -313,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);
|
||||
@@ -346,6 +363,10 @@ 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
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -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);
|
||||
@@ -164,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);
|
||||
@@ -184,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) {
|
||||
@@ -204,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);
|
||||
@@ -233,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
|
||||
@@ -242,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);
|
||||
@@ -290,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);
|
||||
@@ -319,8 +336,11 @@ 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
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
#include "quat.h"
|
||||
#include "euler.h"
|
||||
#include "plane.h"
|
||||
#include "noise.h"
|
||||
#include "aabb2d.h"
|
||||
#include "box.h"
|
||||
#include "color.h"
|
||||
@@ -42,5 +43,6 @@
|
||||
#include "bezier.h"
|
||||
#include "ray.h"
|
||||
#include "affine2d.h"
|
||||
#include "affine2d-post.h"
|
||||
|
||||
#endif /* cglm_h */
|
||||
|
||||
@@ -16,7 +16,12 @@
|
||||
float nearZ,
|
||||
float farZ,
|
||||
mat4 dest)
|
||||
CGLM_INLINE void glm_perspective_infinite_lh_no(float fovy,
|
||||
float aspect,
|
||||
float nearZ,
|
||||
mat4 dest)
|
||||
CGLM_INLINE void glm_perspective_default_lh_no(float aspect, mat4 dest)
|
||||
CGLM_INLINE void glm_perspective_default_infinite_lh_no(float aspect, mat4 dest)
|
||||
CGLM_INLINE void glm_perspective_resize_lh_no(float aspect, mat4 proj)
|
||||
CGLM_INLINE void glm_persp_move_far_lh_no(mat4 proj,
|
||||
float deltaFar)
|
||||
@@ -116,7 +121,35 @@ glm_perspective_lh_no(float fovy,
|
||||
dest[2][2] =-(nearZ + farZ) * fn;
|
||||
dest[2][3] = 1.0f;
|
||||
dest[3][2] = 2.0f * nearZ * farZ * fn;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief set up infinite perspective projection matrix
|
||||
* with a left-hand coordinate system and a
|
||||
* clip-space of [-1, 1].
|
||||
*
|
||||
* @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_lh_no(float fovy,
|
||||
float aspect,
|
||||
float nearZ,
|
||||
mat4 dest) {
|
||||
float f;
|
||||
|
||||
glm_mat4_zero(dest);
|
||||
|
||||
f = 1.0f / tanf(fovy * 0.5f);
|
||||
|
||||
dest[0][0] = f / aspect;
|
||||
dest[1][1] = f;
|
||||
dest[2][2] = 1.0f;
|
||||
dest[2][3] = 1.0f;
|
||||
dest[3][2] =-2.0f * nearZ;
|
||||
}
|
||||
|
||||
/*!
|
||||
@@ -133,6 +166,20 @@ glm_perspective_default_lh_no(float aspect, mat4 dest) {
|
||||
glm_perspective_lh_no(GLM_PI_4f, aspect, 0.01f, 100.0f, dest);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief set up infinite perspective projection matrix with default near
|
||||
* and angle values with a left-hand coordinate system and a
|
||||
* clip-space of [-1, 1].
|
||||
*
|
||||
* @param[in] aspect aspect ratio ( width / height )
|
||||
* @param[out] dest result matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_perspective_default_infinite_lh_no(float aspect, mat4 dest) {
|
||||
glm_perspective_infinite_lh_no(GLM_PI_4f, aspect, 0.01f, dest);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief resize perspective matrix by aspect ratio ( width / height )
|
||||
* this makes very easy to resize proj matrix when window /viewport
|
||||
|
||||
@@ -16,7 +16,12 @@
|
||||
float nearZ,
|
||||
float farZ,
|
||||
mat4 dest)
|
||||
CGLM_INLINE void glm_perspective_infinite_lh_zo(float fovy,
|
||||
float aspect,
|
||||
float nearZ,
|
||||
mat4 dest)
|
||||
CGLM_INLINE void glm_perspective_default_lh_zo(float aspect, mat4 dest)
|
||||
CGLM_INLINE void glm_perspective_default_infinite_lh_zo(float aspect, mat4 dest)
|
||||
CGLM_INLINE void glm_perspective_resize_lh_zo(float aspect, mat4 proj)
|
||||
CGLM_INLINE void glm_persp_move_far_lh_zo(mat4 proj,
|
||||
float deltaFar)
|
||||
@@ -116,6 +121,35 @@ glm_perspective_lh_zo(float fovy,
|
||||
dest[3][2] = nearZ * farZ * fn;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief set up infinite perspective projection matrix
|
||||
* with a left-hand coordinate system and a
|
||||
* clip-space of [0, 1].
|
||||
*
|
||||
* @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_lh_zo(float fovy,
|
||||
float aspect,
|
||||
float nearZ,
|
||||
mat4 dest) {
|
||||
float f;
|
||||
|
||||
glm_mat4_zero(dest);
|
||||
|
||||
f = 1.0f / tanf(fovy * 0.5f);
|
||||
|
||||
dest[0][0] = f / aspect;
|
||||
dest[1][1] = f;
|
||||
dest[2][2] = 1.0f;
|
||||
dest[2][3] = 1.0f;
|
||||
dest[3][2] =-nearZ;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief extend perspective projection matrix's far distance with a
|
||||
* left-hand coordinate system and a clip-space with depth values
|
||||
@@ -144,7 +178,7 @@ glm_persp_move_far_lh_zo(mat4 proj, float deltaFar) {
|
||||
|
||||
/*!
|
||||
* @brief set up perspective projection matrix with default near/far
|
||||
* and angle values with a left-hand coordinate system and a
|
||||
* and angle values with a left-hand coordinate system and a
|
||||
* clip-space of [0, 1].
|
||||
*
|
||||
* @param[in] aspect aspect ratio ( width / height )
|
||||
@@ -156,6 +190,20 @@ glm_perspective_default_lh_zo(float aspect, mat4 dest) {
|
||||
glm_perspective_lh_zo(GLM_PI_4f, aspect, 0.01f, 100.0f, dest);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief set up infinite perspective projection matrix with default near
|
||||
* and angle values with a left-hand coordinate system and a
|
||||
* clip-space of [0, 1].
|
||||
*
|
||||
* @param[in] aspect aspect ratio ( width / height )
|
||||
* @param[out] dest result matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_perspective_default_infinite_lh_zo(float aspect, mat4 dest) {
|
||||
glm_perspective_infinite_lh_zo(GLM_PI_4f, aspect, 0.01f, dest);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief resize perspective matrix by aspect ratio ( width / height )
|
||||
* this makes very easy to resize proj matrix when window /viewport
|
||||
|
||||
@@ -16,7 +16,12 @@
|
||||
float nearZ,
|
||||
float farZ,
|
||||
mat4 dest)
|
||||
CGLM_INLINE void glm_perspective_infinite_rh_no(float fovy,
|
||||
float aspect,
|
||||
float nearZ,
|
||||
mat4 dest)
|
||||
CGLM_INLINE void glm_perspective_default_rh_no(float aspect, mat4 dest)
|
||||
CGLM_INLINE void glm_perspective_default_infinite_rh_no(float aspect, mat4 dest)
|
||||
CGLM_INLINE void glm_perspective_resize_rh_no(float aspect, mat4 proj)
|
||||
CGLM_INLINE void glm_persp_move_far_rh_no(mat4 proj,
|
||||
float deltaFar)
|
||||
@@ -116,7 +121,35 @@ glm_perspective_rh_no(float fovy,
|
||||
dest[2][2] = (nearZ + farZ) * fn;
|
||||
dest[2][3] =-1.0f;
|
||||
dest[3][2] = 2.0f * nearZ * farZ * fn;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief set up infinite perspective projection matrix
|
||||
* with a right-hand coordinate system and a
|
||||
* clip-space of [-1, 1].
|
||||
*
|
||||
* @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_rh_no(float fovy,
|
||||
float aspect,
|
||||
float nearZ,
|
||||
mat4 dest) {
|
||||
float f;
|
||||
|
||||
glm_mat4_zero(dest);
|
||||
|
||||
f = 1.0f / tanf(fovy * 0.5f);
|
||||
|
||||
dest[0][0] = f / aspect;
|
||||
dest[1][1] = f;
|
||||
dest[2][2] =-1.0f;
|
||||
dest[2][3] =-1.0f;
|
||||
dest[3][2] =-2.0f * nearZ;
|
||||
}
|
||||
|
||||
/*!
|
||||
@@ -133,6 +166,20 @@ glm_perspective_default_rh_no(float aspect, mat4 dest) {
|
||||
glm_perspective_rh_no(GLM_PI_4f, aspect, 0.01f, 100.0f, dest);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief set up infinite perspective projection matrix with default near
|
||||
* and angle values with a right-hand coordinate system and a
|
||||
* clip-space of [-1, 1].
|
||||
*
|
||||
* @param[in] aspect aspect ratio ( width / height )
|
||||
* @param[out] dest result matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_perspective_default_infinite_rh_no(float aspect, mat4 dest) {
|
||||
glm_perspective_infinite_rh_no(GLM_PI_4f, aspect, 0.01f, dest);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief resize perspective matrix by aspect ratio ( width / height )
|
||||
* this makes very easy to resize proj matrix when window /viewport
|
||||
|
||||
@@ -16,7 +16,12 @@
|
||||
float nearZ,
|
||||
float farZ,
|
||||
mat4 dest)
|
||||
CGLM_INLINE void glm_perspective_infinite_rh_zo(float fovy,
|
||||
float aspect,
|
||||
float nearZ,
|
||||
mat4 dest)
|
||||
CGLM_INLINE void glm_perspective_default_rh_zo(float aspect, mat4 dest)
|
||||
CGLM_INLINE void glm_perspective_default_infinite_rh_zo(float aspect, mat4 dest)
|
||||
CGLM_INLINE void glm_perspective_resize_rh_zo(float aspect, mat4 proj)
|
||||
CGLM_INLINE void glm_persp_move_far_rh_zo(mat4 proj,
|
||||
float deltaFar)
|
||||
@@ -116,6 +121,35 @@ glm_perspective_rh_zo(float fovy,
|
||||
dest[3][2] = nearZ * farZ * fn;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief set up infinite perspective projection matrix
|
||||
* with a right-hand coordinate system and a
|
||||
* clip-space of [0, 1].
|
||||
*
|
||||
* @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_rh_zo(float fovy,
|
||||
float aspect,
|
||||
float nearZ,
|
||||
mat4 dest) {
|
||||
float f;
|
||||
|
||||
glm_mat4_zero(dest);
|
||||
|
||||
f = 1.0f / tanf(fovy * 0.5f);
|
||||
|
||||
dest[0][0] = f / aspect;
|
||||
dest[1][1] = f;
|
||||
dest[2][2] =-1.0f;
|
||||
dest[2][3] =-1.0f;
|
||||
dest[3][2] =-nearZ;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief set up perspective projection matrix with default near/far
|
||||
* and angle values with a right-hand coordinate system and a
|
||||
@@ -130,6 +164,20 @@ glm_perspective_default_rh_zo(float aspect, mat4 dest) {
|
||||
glm_perspective_rh_zo(GLM_PI_4f, aspect, 0.01f, 100.0f, dest);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief set up infinite perspective projection matrix with default near
|
||||
* and angle values with a right-hand coordinate system and a
|
||||
* clip-space of [0, 1].
|
||||
*
|
||||
* @param[in] aspect aspect ratio ( width / height )
|
||||
* @param[out] dest result matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_perspective_default_infinite_rh_zo(float aspect, mat4 dest) {
|
||||
glm_perspective_infinite_rh_zo(GLM_PI_4f, aspect, 0.01f, dest);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief resize perspective matrix by aspect ratio ( width / height )
|
||||
* this makes very easy to resize proj matrix when window /viewport
|
||||
|
||||
@@ -8,6 +8,8 @@
|
||||
#ifndef cglm_common_h
|
||||
#define cglm_common_h
|
||||
|
||||
#define __cglm__ 1
|
||||
|
||||
#ifndef _USE_MATH_DEFINES
|
||||
# define _USE_MATH_DEFINES /* for windows */
|
||||
#endif
|
||||
@@ -51,6 +53,7 @@
|
||||
|
||||
#define GLM_SHUFFLE4(z, y, x, w) (((z) << 6) | ((y) << 4) | ((x) << 2) | (w))
|
||||
#define GLM_SHUFFLE3(z, y, x) (((z) << 4) | ((y) << 2) | (x))
|
||||
#define GLM_SHUFFLE2(y, x) (((y) << 2) | (x))
|
||||
|
||||
#include "types.h"
|
||||
#include "simd/intrin.h"
|
||||
|
||||
@@ -164,4 +164,4 @@ glm_euler_zyx_quat_lh(vec3 angles, versor dest) {
|
||||
dest[3] = zc * yc * xc + zs * ys * xs;
|
||||
}
|
||||
|
||||
#endif /*cglm_euler_to_quat_lh_h*/
|
||||
#endif /*cglm_euler_to_quat_lh_h*/
|
||||
|
||||
@@ -132,9 +132,9 @@ glm_mat4_print(mat4 matrix,
|
||||
for (i = 0; i < m; i++) {
|
||||
for (j = 0; j < n; j++) {
|
||||
if (matrix[i][j] < CGLM_PRINT_MAX_TO_SHORT)
|
||||
cwi = sprintf(buff, "% .*f", CGLM_PRINT_PRECISION, (double)matrix[i][j]);
|
||||
cwi = snprintf(buff, sizeof(buff), "% .*f", CGLM_PRINT_PRECISION, (double)matrix[i][j]);
|
||||
else
|
||||
cwi = sprintf(buff, "% g", (double)matrix[i][j]);
|
||||
cwi = snprintf(buff, sizeof(buff), "% g", (double)matrix[i][j]);
|
||||
cw[i] = GLM_MAX(cw[i], cwi);
|
||||
}
|
||||
}
|
||||
@@ -175,9 +175,9 @@ glm_mat3_print(mat3 matrix,
|
||||
for (i = 0; i < m; i++) {
|
||||
for (j = 0; j < n; j++) {
|
||||
if (matrix[i][j] < CGLM_PRINT_MAX_TO_SHORT)
|
||||
cwi = sprintf(buff, "% .*f", CGLM_PRINT_PRECISION, (double)matrix[i][j]);
|
||||
cwi = snprintf(buff, sizeof(buff), "% .*f", CGLM_PRINT_PRECISION, (double)matrix[i][j]);
|
||||
else
|
||||
cwi = sprintf(buff, "% g", (double)matrix[i][j]);
|
||||
cwi = snprintf(buff, sizeof(buff), "% g", (double)matrix[i][j]);
|
||||
cw[i] = GLM_MAX(cw[i], cwi);
|
||||
}
|
||||
}
|
||||
@@ -217,9 +217,9 @@ glm_mat2_print(mat2 matrix,
|
||||
for (i = 0; i < m; i++) {
|
||||
for (j = 0; j < n; j++) {
|
||||
if (matrix[i][j] < CGLM_PRINT_MAX_TO_SHORT)
|
||||
cwi = sprintf(buff, "% .*f", CGLM_PRINT_PRECISION, (double)matrix[i][j]);
|
||||
cwi = snprintf(buff, sizeof(buff), "% .*f", CGLM_PRINT_PRECISION, (double)matrix[i][j]);
|
||||
else
|
||||
cwi = sprintf(buff, "% g", (double)matrix[i][j]);
|
||||
cwi = snprintf(buff, sizeof(buff), "% g", (double)matrix[i][j]);
|
||||
cw[i] = GLM_MAX(cw[i], cwi);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,22 +13,22 @@
|
||||
GLM_MAT2_ZERO
|
||||
|
||||
Functions:
|
||||
CGLM_INLINE void glm_mat2_make(float * restrict src, mat2 dest)
|
||||
CGLM_INLINE void glm_mat2_copy(mat2 mat, mat2 dest)
|
||||
CGLM_INLINE void glm_mat2_identity(mat2 mat)
|
||||
CGLM_INLINE void glm_mat2_identity_array(mat2 * restrict mat, size_t count)
|
||||
CGLM_INLINE void glm_mat2_zero(mat2 mat)
|
||||
CGLM_INLINE void glm_mat2_identity(mat2 m)
|
||||
CGLM_INLINE void glm_mat2_identity_array(mat2 * restrict mats, size_t count)
|
||||
CGLM_INLINE void glm_mat2_zero(mat2 m)
|
||||
CGLM_INLINE void glm_mat2_mul(mat2 m1, mat2 m2, mat2 dest)
|
||||
CGLM_INLINE void glm_mat2_transpose_to(mat2 m, mat2 dest)
|
||||
CGLM_INLINE void glm_mat2_transpose(mat2 m)
|
||||
CGLM_INLINE void glm_mat2_mulv(mat2 m, vec2 v, vec2 dest)
|
||||
CGLM_INLINE float glm_mat2_trace(mat2 m)
|
||||
CGLM_INLINE void glm_mat2_transpose_to(mat2 mat, mat2 dest)
|
||||
CGLM_INLINE void glm_mat2_transpose(mat2 m)
|
||||
CGLM_INLINE void glm_mat2_scale(mat2 m, float s)
|
||||
CGLM_INLINE float glm_mat2_det(mat2 mat)
|
||||
CGLM_INLINE void glm_mat2_inv(mat2 mat, mat2 dest)
|
||||
CGLM_INLINE void glm_mat2_swap_col(mat2 mat, int col1, int col2)
|
||||
CGLM_INLINE void glm_mat2_swap_row(mat2 mat, int row1, int row2)
|
||||
CGLM_INLINE float glm_mat2_det(mat2 m)
|
||||
CGLM_INLINE float glm_mat2_trace(mat2 m)
|
||||
CGLM_INLINE float glm_mat2_rmc(vec2 r, mat2 m, vec2 c)
|
||||
CGLM_INLINE void glm_mat2_make(float * restrict src, mat2 dest)
|
||||
*/
|
||||
|
||||
#ifndef cglm_mat2_h
|
||||
@@ -57,10 +57,25 @@
|
||||
#define GLM_MAT2_ZERO ((mat2)GLM_MAT2_ZERO_INIT)
|
||||
|
||||
/*!
|
||||
* @brief copy all members of [mat] to [dest]
|
||||
* @brief Create mat2 (dest) from pointer (src).
|
||||
*
|
||||
* @param[in] mat source
|
||||
* @param[out] dest destination
|
||||
* @param[in] src pointer to an array of floats (left)
|
||||
* @param[out] dest destination (result, mat2)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat2_make(const float * __restrict src, mat2 dest) {
|
||||
dest[0][0] = src[0];
|
||||
dest[0][1] = src[1];
|
||||
dest[1][0] = src[2];
|
||||
dest[1][1] = src[3];
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Copy mat2 (mat) to mat2 (dest).
|
||||
*
|
||||
* @param[in] mat mat2 (left, src)
|
||||
* @param[out] dest destination (result, mat2)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
@@ -69,7 +84,9 @@ glm_mat2_copy(mat2 mat, mat2 dest) {
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief make given matrix identity. It is identical with below,
|
||||
* @brief 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);
|
||||
*
|
||||
@@ -80,59 +97,57 @@ glm_mat2_copy(mat2 mat, mat2 dest) {
|
||||
* mat2 mat = GLM_MAT2_IDENTITY_INIT;
|
||||
* @endcode
|
||||
*
|
||||
* @param[in, out] mat destination
|
||||
* @param[in, out] m mat2 (src, dest)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat2_identity(mat2 mat) {
|
||||
glm_mat2_identity(mat2 m) {
|
||||
CGLM_ALIGN_MAT mat2 t = GLM_MAT2_IDENTITY_INIT;
|
||||
glm_mat2_copy(t, mat);
|
||||
glm_mat2_copy(t, m);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief make given matrix array's each element identity matrix
|
||||
* @brief Given an array of mat2’s (mats) make each matrix an identity matrix.
|
||||
*
|
||||
* @param[in, out] mat matrix array (must be aligned (16)
|
||||
* if alignment is not disabled)
|
||||
*
|
||||
* @param[in] count count of matrices
|
||||
* @param[in, out] mats Array of mat2’s (must be aligned (16/32) if alignment is not disabled)
|
||||
* @param[in] count Array size of mats or number of matrices
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat2_identity_array(mat2 * __restrict mat, size_t count) {
|
||||
glm_mat2_identity_array(mat2 * __restrict mats, size_t count) {
|
||||
CGLM_ALIGN_MAT mat2 t = GLM_MAT2_IDENTITY_INIT;
|
||||
size_t i;
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
glm_mat2_copy(t, mat[i]);
|
||||
glm_mat2_copy(t, mats[i]);
|
||||
}
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief make given matrix zero.
|
||||
* @brief Zero out the mat2 (m).
|
||||
*
|
||||
* @param[in, out] mat matrix
|
||||
* @param[in, out] m mat2 (src, dest)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat2_zero(mat2 mat) {
|
||||
glm_mat2_zero(mat2 m) {
|
||||
CGLM_ALIGN_MAT mat2 t = GLM_MAT2_ZERO_INIT;
|
||||
glm_mat2_copy(t, mat);
|
||||
glm_mat2_copy(t, m);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief multiply m1 and m2 to dest
|
||||
* @brief 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:
|
||||
* m1, m2 and dest matrices can be same matrix, it is possible to write this:
|
||||
*
|
||||
* @code
|
||||
* mat2 m = GLM_MAT2_IDENTITY_INIT;
|
||||
* glm_mat2_mul(m, m, m);
|
||||
* @endcode
|
||||
*
|
||||
* @param[in] m1 left matrix
|
||||
* @param[in] m2 right matrix
|
||||
* @param[out] dest destination matrix
|
||||
* @param[in] m1 mat2 (left)
|
||||
* @param[in] m2 mat2 (right)
|
||||
* @param[out] dest destination (result, mat2)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
@@ -157,32 +172,44 @@ glm_mat2_mul(mat2 m1, mat2 m2, mat2 dest) {
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief transpose mat2 and store in dest
|
||||
* @brief Multiply mat2 (m) by vec2 (v) and store in vec2 (dest).
|
||||
*
|
||||
* source matrix will not be transposed unless dest is m
|
||||
*
|
||||
* @param[in] m matrix
|
||||
* @param[out] dest result
|
||||
* @param[in] m mat2 (left)
|
||||
* @param[in] v vec2 (right, column vector)
|
||||
* @param[out] dest destination (result, column vector)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat2_transpose_to(mat2 m, mat2 dest) {
|
||||
glm_mat2_mulv(mat2 m, vec2 v, vec2 dest) {
|
||||
dest[0] = m[0][0] * v[0] + m[1][0] * v[1];
|
||||
dest[1] = m[0][1] * v[0] + m[1][1] * v[1];
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Transpose mat2 (mat) and store in mat2 (dest).
|
||||
*
|
||||
* @param[in] mat mat2 (left, src)
|
||||
* @param[out] dest destination (result, mat2)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat2_transpose_to(mat2 mat, mat2 dest) {
|
||||
#if defined(__wasm__) && defined(__wasm_simd128__)
|
||||
glm_mat2_transp_wasm(m, dest);
|
||||
glm_mat2_transp_wasm(mat, dest);
|
||||
#elif defined( __SSE__ ) || defined( __SSE2__ )
|
||||
glm_mat2_transp_sse2(m, dest);
|
||||
glm_mat2_transp_sse2(mat, dest);
|
||||
#else
|
||||
dest[0][0] = m[0][0];
|
||||
dest[0][1] = m[1][0];
|
||||
dest[1][0] = m[0][1];
|
||||
dest[1][1] = m[1][1];
|
||||
dest[0][0] = mat[0][0];
|
||||
dest[0][1] = mat[1][0];
|
||||
dest[1][0] = mat[0][1];
|
||||
dest[1][1] = mat[1][1];
|
||||
#endif
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief transpose mat2 and store result in same matrix
|
||||
* @brief Transpose mat2 (m) and store result in the same matrix.
|
||||
*
|
||||
* @param[in, out] m source and dest
|
||||
* @param[in, out] m mat2 (src, dest)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
@@ -194,39 +221,10 @@ glm_mat2_transpose(mat2 m) {
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief multiply mat2 with vec2 (column vector) and store in dest vector
|
||||
* @brief Multiply mat2 (m) by scalar constant (s).
|
||||
*
|
||||
* @param[in] m mat2 (left)
|
||||
* @param[in] v vec2 (right, column vector)
|
||||
* @param[out] dest vec2 (result, column vector)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat2_mulv(mat2 m, vec2 v, vec2 dest) {
|
||||
dest[0] = m[0][0] * v[0] + m[1][0] * v[1];
|
||||
dest[1] = m[0][1] * v[0] + m[1][1] * v[1];
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief trace of matrix
|
||||
*
|
||||
* sum of the elements on the main diagonal from upper left to the lower right
|
||||
*
|
||||
* @param[in] m matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
float
|
||||
glm_mat2_trace(mat2 m) {
|
||||
return m[0][0] + m[1][1];
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief scale (multiply with scalar) matrix
|
||||
*
|
||||
* multiply matrix with scalar
|
||||
*
|
||||
* @param[in, out] m matrix
|
||||
* @param[in] s scalar
|
||||
* @param[in, out] m mat2 (src, dest)
|
||||
* @param[in] s float (scalar)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
@@ -235,7 +233,7 @@ glm_mat2_scale(mat2 m, float s) {
|
||||
glmm_store(m[0], wasm_f32x4_mul(wasm_v128_load(m[0]),
|
||||
wasm_f32x4_splat(s)));
|
||||
#elif defined( __SSE__ ) || defined( __SSE2__ )
|
||||
glmm_store(m[0], _mm_mul_ps(_mm_loadu_ps(m[0]), _mm_set1_ps(s)));
|
||||
glmm_store(m[0], _mm_mul_ps(_mm_loadu_ps(m[0]), glmm_set1(s)));
|
||||
#elif defined(CGLM_NEON_FP)
|
||||
vst1q_f32(m[0], vmulq_f32(vld1q_f32(m[0]), vdupq_n_f32(s)));
|
||||
#else
|
||||
@@ -247,23 +245,10 @@ glm_mat2_scale(mat2 m, float s) {
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief mat2 determinant
|
||||
* @brief Inverse mat2 (mat) and store in mat2 (dest).
|
||||
*
|
||||
* @param[in] mat matrix
|
||||
*
|
||||
* @return determinant
|
||||
*/
|
||||
CGLM_INLINE
|
||||
float
|
||||
glm_mat2_det(mat2 mat) {
|
||||
return mat[0][0] * mat[1][1] - mat[1][0] * mat[0][1];
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief inverse mat2 and store in dest
|
||||
*
|
||||
* @param[in] mat matrix
|
||||
* @param[out] dest inverse matrix
|
||||
* @param[in] mat mat2 (left, src)
|
||||
* @param[out] dest destination (result, inverse mat2)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
@@ -281,11 +266,11 @@ glm_mat2_inv(mat2 mat, mat2 dest) {
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief swap two matrix columns
|
||||
* @brief Swap two columns in mat2 (mat) and store in same matrix.
|
||||
*
|
||||
* @param[in,out] mat matrix
|
||||
* @param[in] col1 col1
|
||||
* @param[in] col2 col2
|
||||
* @param[in, out] mat mat2 (src, dest)
|
||||
* @param[in] col1 Column 1 array index
|
||||
* @param[in] col2 Column 2 array index
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
@@ -303,11 +288,11 @@ glm_mat2_swap_col(mat2 mat, int col1, int col2) {
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief swap two matrix rows
|
||||
* @brief Swap two rows in mat2 (mat) and store in same matrix.
|
||||
*
|
||||
* @param[in,out] mat matrix
|
||||
* @param[in] row1 row1
|
||||
* @param[in] row2 row2
|
||||
* @param[in, out] mat mat2 (src, dest)
|
||||
* @param[in] row1 Row 1 array index
|
||||
* @param[in] row2 Row 2 array index
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
@@ -325,18 +310,47 @@ glm_mat2_swap_row(mat2 mat, int row1, int row2) {
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief helper for R (row vector) * M (matrix) * C (column vector)
|
||||
* @brief Returns mat2 determinant.
|
||||
*
|
||||
* rmc stands for Row * Matrix * Column
|
||||
* @param[in] m mat2 (src)
|
||||
*
|
||||
* the result is scalar because R * M = Matrix1x2 (row vector),
|
||||
* then Matrix1x2 * Vec2 (column vector) = Matrix1x1 (Scalar)
|
||||
* @return[out] mat2 determinant (float)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
float
|
||||
glm_mat2_det(mat2 m) {
|
||||
return m[0][0] * m[1][1] - m[1][0] * m[0][1];
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Returns trace of matrix. Which is:
|
||||
*
|
||||
* @param[in] r row vector or matrix1x2
|
||||
* @param[in] m matrix2x2
|
||||
* @param[in] c column vector or matrix2x1
|
||||
* The sum of the elements on the main diagonal from
|
||||
* upper left corner to the bottom right corner.
|
||||
*
|
||||
* @return scalar value e.g. Matrix1x1
|
||||
* @param[in] m mat2 (src)
|
||||
*
|
||||
* @return[out] mat2 trace (float)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
float
|
||||
glm_mat2_trace(mat2 m) {
|
||||
return m[0][0] + m[1][1];
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Helper for R (row vector) * M (matrix) * C (column vector)
|
||||
*
|
||||
* rmc stands for Row * Matrix * Column
|
||||
*
|
||||
* the result is scalar because M * C = ResC (1x2, column vector),
|
||||
* then if you take the dot_product(R (2x1), ResC (1x2)) = scalar value.
|
||||
*
|
||||
* @param[in] r vec2 (2x1, row vector)
|
||||
* @param[in] m mat2 (2x2, matrix)
|
||||
* @param[in] c vec2 (1x2, column vector)
|
||||
*
|
||||
* @return[out] Scalar value (float, 1x1)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
float
|
||||
@@ -346,19 +360,4 @@ glm_mat2_rmc(vec2 r, mat2 m, vec2 c) {
|
||||
return glm_vec2_dot(r, tmp);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Create mat2 matrix from pointer
|
||||
*
|
||||
* @param[in] src pointer to an array of floats
|
||||
* @param[out] dest matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat2_make(const float * __restrict src, mat2 dest) {
|
||||
dest[0][0] = src[0];
|
||||
dest[0][1] = src[1];
|
||||
dest[1][0] = src[2];
|
||||
dest[1][1] = src[3];
|
||||
}
|
||||
|
||||
#endif /* cglm_mat2_h */
|
||||
|
||||
@@ -11,12 +11,12 @@
|
||||
GLM_MAT2X3_ZERO
|
||||
|
||||
Functions:
|
||||
CGLM_INLINE void glm_mat2x3_copy(mat2x3 mat, mat2x3 dest);
|
||||
CGLM_INLINE void glm_mat2x3_zero(mat2x3 mat);
|
||||
CGLM_INLINE void glm_mat2x3_copy(mat2x3 src, mat2x3 dest);
|
||||
CGLM_INLINE void glm_mat2x3_zero(mat2x3 m);
|
||||
CGLM_INLINE void glm_mat2x3_make(const float * __restrict src, mat2x3 dest);
|
||||
CGLM_INLINE void glm_mat2x3_mul(mat2x3 m1, mat3x2 m2, mat3 dest);
|
||||
CGLM_INLINE void glm_mat2x3_mulv(mat2x3 m, vec2 v, vec3 dest);
|
||||
CGLM_INLINE void glm_mat2x3_transpose(mat2x3 m, mat3x2 dest);
|
||||
CGLM_INLINE void glm_mat2x3_transpose(mat2x3 src, mat3x2 dest);
|
||||
CGLM_INLINE void glm_mat2x3_scale(mat2x3 m, float s);
|
||||
*/
|
||||
|
||||
@@ -31,40 +31,35 @@
|
||||
#define GLM_MAT2X3_ZERO GLM_MAT2X3_ZERO_INIT
|
||||
|
||||
/*!
|
||||
* @brief copy all members of [mat] to [dest]
|
||||
* @brief Copy mat2x3 (src) to mat2x3 (dest).
|
||||
*
|
||||
* @param[in] mat source
|
||||
* @param[out] dest destination
|
||||
* @param[in] src mat2x3 (left)
|
||||
* @param[out] dest destination (result, mat2x3)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat2x3_copy(mat2x3 mat, mat2x3 dest) {
|
||||
dest[0][0] = mat[0][0];
|
||||
dest[0][1] = mat[0][1];
|
||||
dest[0][2] = mat[0][2];
|
||||
|
||||
dest[1][0] = mat[1][0];
|
||||
dest[1][1] = mat[1][1];
|
||||
dest[1][2] = mat[1][2];
|
||||
glm_mat2x3_copy(mat2x3 src, mat2x3 dest) {
|
||||
glm_vec3_copy(src[0], dest[0]);
|
||||
glm_vec3_copy(src[1], dest[1]);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief make given matrix zero.
|
||||
* @brief Zero out the mat2x3 (m).
|
||||
*
|
||||
* @param[in, out] mat matrix
|
||||
* @param[in, out] mat2x3 (src, dest)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat2x3_zero(mat2x3 mat) {
|
||||
glm_mat2x3_zero(mat2x3 m) {
|
||||
CGLM_ALIGN_MAT mat2x3 t = GLM_MAT2X3_ZERO_INIT;
|
||||
glm_mat2x3_copy(t, mat);
|
||||
glm_mat2x3_copy(t, m);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Create mat2x3 matrix from pointer
|
||||
* @brief Create mat2x3 (dest) from pointer (src).
|
||||
*
|
||||
* @param[in] src pointer to an array of floats
|
||||
* @param[out] dest matrix
|
||||
* @param[in] src pointer to an array of floats (left)
|
||||
* @param[out] dest destination (result, mat2x3)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
@@ -79,15 +74,15 @@ glm_mat2x3_make(const float * __restrict src, mat2x3 dest) {
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief multiply m1 and m2 to dest
|
||||
* @brief Multiply mat2x3 (m1) by mat3x2 (m2) and store in mat3 (dest).
|
||||
*
|
||||
* @code
|
||||
* glm_mat2x3_mul(mat2x3, mat3x2, mat3);
|
||||
* @endcode
|
||||
*
|
||||
* @param[in] m1 left matrix (mat2x3)
|
||||
* @param[in] m2 right matrix (mat3x2)
|
||||
* @param[out] dest destination matrix (mat2)
|
||||
* @param[in] m1 mat2x3 (left)
|
||||
* @param[in] m2 mat3x2 (right)
|
||||
* @param[out] dest destination (result, mat3)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
@@ -113,11 +108,11 @@ glm_mat2x3_mul(mat2x3 m1, mat3x2 m2, mat3 dest) {
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief multiply matrix with column vector and store in dest vector
|
||||
* @brief Multiply mat2x3 (m) by vec2 (v) and store in vec3 (dest).
|
||||
*
|
||||
* @param[in] m matrix (left)
|
||||
* @param[in] v vector (right, column vector)
|
||||
* @param[out] dest result vector
|
||||
* @param[in] m mat2x3 (left)
|
||||
* @param[in] v vec2 (right, column vector)
|
||||
* @param[out] dest destination (result, column vector)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
@@ -130,26 +125,24 @@ glm_mat2x3_mulv(mat2x3 m, vec2 v, vec3 dest) {
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief transpose matrix and store in dest
|
||||
* @brief Transpose mat2x3 (src) and store in mat3x2 (dest).
|
||||
*
|
||||
* @param[in] m matrix
|
||||
* @param[out] dest result
|
||||
* @param[in] src mat2x3 (left)
|
||||
* @param[out] dest destination (result, mat3x2)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat2x3_transpose(mat2x3 m, mat3x2 dest) {
|
||||
dest[0][0] = m[0][0]; dest[0][1] = m[1][0];
|
||||
dest[1][0] = m[0][1]; dest[1][1] = m[1][1];
|
||||
dest[2][0] = m[0][2]; dest[2][1] = m[1][2];
|
||||
glm_mat2x3_transpose(mat2x3 src, mat3x2 dest) {
|
||||
dest[0][0] = src[0][0]; dest[0][1] = src[1][0];
|
||||
dest[1][0] = src[0][1]; dest[1][1] = src[1][1];
|
||||
dest[2][0] = src[0][2]; dest[2][1] = src[1][2];
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief scale (multiply with scalar) matrix
|
||||
* @brief Multiply mat2x3 (m) by scalar constant (s).
|
||||
*
|
||||
* multiply matrix with scalar
|
||||
*
|
||||
* @param[in, out] m matrix
|
||||
* @param[in] s scalar
|
||||
* @param[in, out] m (src, dest)
|
||||
* @param[in] float (scalar)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
|
||||
@@ -11,12 +11,12 @@
|
||||
GLM_MAT2X4_ZERO
|
||||
|
||||
Functions:
|
||||
CGLM_INLINE void glm_mat2x4_copy(mat2x4 mat, mat2x4 dest);
|
||||
CGLM_INLINE void glm_mat2x4_zero(mat2x4 mat);
|
||||
CGLM_INLINE void glm_mat2x4_copy(mat2x4 src, mat2x4 dest);
|
||||
CGLM_INLINE void glm_mat2x4_zero(mat2x4 m);
|
||||
CGLM_INLINE void glm_mat2x4_make(const float * __restrict src, mat2x4 dest);
|
||||
CGLM_INLINE void glm_mat2x4_mul(mat2x4 m1, mat4x2 m2, mat4 dest);
|
||||
CGLM_INLINE void glm_mat2x4_mulv(mat2x4 m, vec2 v, vec4 dest);
|
||||
CGLM_INLINE void glm_mat2x4_transpose(mat2x4 m, mat4x2 dest);
|
||||
CGLM_INLINE void glm_mat2x4_transpose(mat2x4 src, mat4x2 dest);
|
||||
CGLM_INLINE void glm_mat2x4_scale(mat2x4 m, float s);
|
||||
*/
|
||||
|
||||
@@ -32,35 +32,35 @@
|
||||
#define GLM_MAT2X4_ZERO GLM_MAT2X4_ZERO_INIT
|
||||
|
||||
/*!
|
||||
* @brief copy all members of [mat] to [dest]
|
||||
* @brief Copy mat2x4 (src) to mat2x4 (dest).
|
||||
*
|
||||
* @param[in] mat source
|
||||
* @param[out] dest destination
|
||||
* @param[in] src mat2x4 (left)
|
||||
* @param[out] dest destination (result, mat2x4)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat2x4_copy(mat2x4 mat, mat2x4 dest) {
|
||||
glm_vec4_ucopy(mat[0], dest[0]);
|
||||
glm_vec4_ucopy(mat[1], dest[1]);
|
||||
glm_mat2x4_copy(mat2x4 src, mat2x4 dest) {
|
||||
glm_vec4_ucopy(src[0], dest[0]);
|
||||
glm_vec4_ucopy(src[1], dest[1]);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief make given matrix zero.
|
||||
* @brief Zero out the mat2x4 (m).
|
||||
*
|
||||
* @param[in, out] mat matrix
|
||||
* @param[in, out] mat2x4 (src, dest)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat2x4_zero(mat2x4 mat) {
|
||||
glm_mat2x4_zero(mat2x4 m) {
|
||||
CGLM_ALIGN_MAT mat2x4 t = GLM_MAT2X4_ZERO_INIT;
|
||||
glm_mat2x4_copy(t, mat);
|
||||
glm_mat2x4_copy(t, m);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Create mat2x4 matrix from pointer
|
||||
* @brief Create mat2x4 (dest) from pointer (src).
|
||||
*
|
||||
* @param[in] src pointer to an array of floats
|
||||
* @param[out] dest matrix
|
||||
* @param[in] src pointer to an array of floats (left)
|
||||
* @param[out] dest destination (result, mat2x4)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
@@ -77,15 +77,15 @@ glm_mat2x4_make(const float * __restrict src, mat2x4 dest) {
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief multiply m1 and m2 to dest
|
||||
* @brief Multiply mat2x4 (m1) by mat4x2 (m2) and store in mat4 (dest).
|
||||
*
|
||||
* @code
|
||||
* glm_mat2x4_mul(mat2x4, mat4x2, mat4);
|
||||
* @endcode
|
||||
*
|
||||
* @param[in] m1 left matrix (mat2x4)
|
||||
* @param[in] m2 right matrix (mat4x2)
|
||||
* @param[out] dest destination matrix (mat4)
|
||||
* @param[in] m1 mat2x4 (left)
|
||||
* @param[in] m2 mat4x2 (right)
|
||||
* @param[out] dest destination (result, mat4)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
@@ -120,11 +120,11 @@ glm_mat2x4_mul(mat2x4 m1, mat4x2 m2, mat4 dest) {
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief multiply matrix with column vector and store in dest column vector
|
||||
* @brief Multiply mat2x4 (m) by vec2 (v) and store in vec4 (dest).
|
||||
*
|
||||
* @param[in] m matrix (left)
|
||||
* @param[in] v vector (right, column vector)
|
||||
* @param[out] dest result vector
|
||||
* @param[in] m mat2x4 (left)
|
||||
* @param[in] v vec2 (right, column vector)
|
||||
* @param[out] dest destination (result, column vector)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
@@ -138,27 +138,25 @@ glm_mat2x4_mulv(mat2x4 m, vec2 v, vec4 dest) {
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief transpose matrix and store in dest
|
||||
* @brief Transpose mat2x4 (src) and store in mat4x2 (dest).
|
||||
*
|
||||
* @param[in] m matrix
|
||||
* @param[out] dest result
|
||||
* @param[in] src mat2x4 (left)
|
||||
* @param[out] dest destination (result, mat4x2)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat2x4_transpose(mat2x4 m, mat4x2 dest) {
|
||||
dest[0][0] = m[0][0]; dest[0][1] = m[1][0];
|
||||
dest[1][0] = m[0][1]; dest[1][1] = m[1][1];
|
||||
dest[2][0] = m[0][2]; dest[2][1] = m[1][2];
|
||||
dest[3][0] = m[0][3]; dest[3][1] = m[1][3];
|
||||
glm_mat2x4_transpose(mat2x4 src, mat4x2 dest) {
|
||||
dest[0][0] = src[0][0]; dest[0][1] = src[1][0];
|
||||
dest[1][0] = src[0][1]; dest[1][1] = src[1][1];
|
||||
dest[2][0] = src[0][2]; dest[2][1] = src[1][2];
|
||||
dest[3][0] = src[0][3]; dest[3][1] = src[1][3];
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief scale (multiply with scalar) matrix
|
||||
* @brief Multiply mat2x4 (m) by scalar constant (s).
|
||||
*
|
||||
* multiply matrix with scalar
|
||||
*
|
||||
* @param[in, out] m matrix
|
||||
* @param[in] s scalar
|
||||
* @param[in, out] m (src, dest)
|
||||
* @param[in] s float (scalar)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
CGLM_INLINE void glm_mat3_swap_row(mat3 mat, int row1, int row2);
|
||||
CGLM_INLINE float glm_mat3_rmc(vec3 r, mat3 m, vec3 c);
|
||||
CGLM_INLINE void glm_mat3_make(float * restrict src, mat3 dest);
|
||||
CGLM_INLINE void glm_mat3_textrans(float sx, float sy, float rot, float tx, float ty, mat3 dest);
|
||||
*/
|
||||
|
||||
#ifndef cglm_mat3_h
|
||||
@@ -334,7 +335,7 @@ glm_mat3_det(mat3 mat) {
|
||||
d = mat[1][0], e = mat[1][1], f = mat[1][2],
|
||||
g = mat[2][0], h = mat[2][1], i = mat[2][2];
|
||||
|
||||
return a * (e * i - h * f) - d * (b * i - c * h) + g * (b * f - c * e);
|
||||
return a * (e * i - h * f) - d * (b * i - h * c) + g * (b * f - e * c);
|
||||
}
|
||||
|
||||
/*!
|
||||
@@ -346,24 +347,22 @@ glm_mat3_det(mat3 mat) {
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat3_inv(mat3 mat, mat3 dest) {
|
||||
float det;
|
||||
float a = mat[0][0], b = mat[0][1], c = mat[0][2],
|
||||
d = mat[1][0], e = mat[1][1], f = mat[1][2],
|
||||
g = mat[2][0], h = mat[2][1], i = mat[2][2];
|
||||
g = mat[2][0], h = mat[2][1], i = mat[2][2],
|
||||
|
||||
dest[0][0] = e * i - f * h;
|
||||
dest[0][1] = -(b * i - h * c);
|
||||
dest[0][2] = b * f - e * c;
|
||||
dest[1][0] = -(d * i - g * f);
|
||||
dest[1][1] = a * i - c * g;
|
||||
dest[1][2] = -(a * f - d * c);
|
||||
dest[2][0] = d * h - g * e;
|
||||
dest[2][1] = -(a * h - g * b);
|
||||
dest[2][2] = a * e - b * d;
|
||||
c1 = e * i - f * h, c2 = d * i - g * f, c3 = d * h - g * e,
|
||||
idt = 1.0f / (a * c1 - b * c2 + c * c3), ndt = -idt;
|
||||
|
||||
det = 1.0f / (a * dest[0][0] + b * dest[1][0] + c * dest[2][0]);
|
||||
|
||||
glm_mat3_scale(dest, det);
|
||||
dest[0][0] = idt * c1;
|
||||
dest[0][1] = ndt * (b * i - h * c);
|
||||
dest[0][2] = idt * (b * f - e * c);
|
||||
dest[1][0] = ndt * c2;
|
||||
dest[1][1] = idt * (a * i - g * c);
|
||||
dest[1][2] = ndt * (a * f - d * c);
|
||||
dest[2][0] = idt * c3;
|
||||
dest[2][1] = ndt * (a * h - g * b);
|
||||
dest[2][2] = idt * (a * e - d * b);
|
||||
}
|
||||
|
||||
/*!
|
||||
@@ -450,4 +449,32 @@ glm_mat3_make(const float * __restrict src, mat3 dest) {
|
||||
dest[2][2] = src[8];
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Create mat3 matrix from texture transform parameters
|
||||
*
|
||||
* @param[in] sx scale x
|
||||
* @param[in] sy scale y
|
||||
* @param[in] rot rotation in radians CCW/RH
|
||||
* @param[in] tx translate x
|
||||
* @param[in] ty translate y
|
||||
* @param[out] dest texture transform matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat3_textrans(float sx, float sy, float rot, float tx, float ty, mat3 dest) {
|
||||
float c, s;
|
||||
|
||||
c = cosf(rot);
|
||||
s = sinf(rot);
|
||||
|
||||
glm_mat3_identity(dest);
|
||||
|
||||
dest[0][0] = c * sx;
|
||||
dest[0][1] = -s * sy;
|
||||
dest[1][0] = s * sx;
|
||||
dest[1][1] = c * sy;
|
||||
dest[2][0] = tx;
|
||||
dest[2][1] = ty;
|
||||
}
|
||||
|
||||
#endif /* cglm_mat3_h */
|
||||
|
||||
@@ -11,12 +11,12 @@
|
||||
GLM_MAT3X2_ZERO
|
||||
|
||||
Functions:
|
||||
CGLM_INLINE void glm_mat3x2_copy(mat3x2 mat, mat3x2 dest);
|
||||
CGLM_INLINE void glm_mat3x2_zero(mat3x2 mat);
|
||||
CGLM_INLINE void glm_mat3x2_copy(mat3x2 src, mat3x2 dest);
|
||||
CGLM_INLINE void glm_mat3x2_zero(mat3x2 m);
|
||||
CGLM_INLINE void glm_mat3x2_make(const float * __restrict src, mat3x2 dest);
|
||||
CGLM_INLINE void glm_mat3x2_mul(mat3x2 m1, mat2x3 m2, mat2 dest);
|
||||
CGLM_INLINE void glm_mat3x2_mulv(mat3x2 m, vec3 v, vec2 dest);
|
||||
CGLM_INLINE void glm_mat3x2_transpose(mat3x2 m, mat2x3 dest);
|
||||
CGLM_INLINE void glm_mat3x2_transpose(mat3x2 src, mat2x3 dest);
|
||||
CGLM_INLINE void glm_mat3x2_scale(mat3x2 m, float s);
|
||||
*/
|
||||
|
||||
@@ -31,41 +31,36 @@
|
||||
#define GLM_MAT3X2_ZERO GLM_MAT3X2_ZERO_INIT
|
||||
|
||||
/*!
|
||||
* @brief copy all members of [mat] to [dest]
|
||||
* @brief Copy mat3x2 (src) to mat3x2 (dest).
|
||||
*
|
||||
* @param[in] mat source
|
||||
* @param[out] dest destination
|
||||
* @param[in] src mat3x2 (left)
|
||||
* @param[out] dest destination (result, mat3x2)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat3x2_copy(mat3x2 mat, mat3x2 dest) {
|
||||
dest[0][0] = mat[0][0];
|
||||
dest[0][1] = mat[0][1];
|
||||
|
||||
dest[1][0] = mat[1][0];
|
||||
dest[1][1] = mat[1][1];
|
||||
|
||||
dest[2][0] = mat[2][0];
|
||||
dest[2][1] = mat[2][1];
|
||||
glm_mat3x2_copy(mat3x2 src, mat3x2 dest) {
|
||||
glm_vec2_copy(src[0], dest[0]);
|
||||
glm_vec2_copy(src[1], dest[1]);
|
||||
glm_vec2_copy(src[2], dest[2]);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief make given matrix zero.
|
||||
* @brief Zero out the mat3x2 (m).
|
||||
*
|
||||
* @param[in, out] mat matrix
|
||||
* @param[in, out] mat3x2 (src, dest)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat3x2_zero(mat3x2 mat) {
|
||||
glm_mat3x2_zero(mat3x2 m) {
|
||||
CGLM_ALIGN_MAT mat3x2 t = GLM_MAT3X2_ZERO_INIT;
|
||||
glm_mat3x2_copy(t, mat);
|
||||
glm_mat3x2_copy(t, m);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Create mat3x2 matrix from pointer
|
||||
* @brief Create mat3x2 (dest) from pointer (src).
|
||||
*
|
||||
* @param[in] src pointer to an array of floats
|
||||
* @param[out] dest matrix
|
||||
* @param[in] src pointer to an array of floats (left)
|
||||
* @param[out] dest destination (result, mat3x2)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
@@ -81,15 +76,15 @@ glm_mat3x2_make(const float * __restrict src, mat3x2 dest) {
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief multiply m1 and m2 to dest
|
||||
* @brief Multiply mat3x2 (m1) by mat2x3 (m2) and store in mat2 (dest).
|
||||
*
|
||||
* @code
|
||||
* glm_mat3x2_mul(mat3x2, mat2x3, mat2);
|
||||
* @endcode
|
||||
*
|
||||
* @param[in] m1 left matrix (mat3x2)
|
||||
* @param[in] m2 right matrix (mat2x3)
|
||||
* @param[out] dest destination matrix (mat2)
|
||||
* @param[in] m1 mat3x2 (left)
|
||||
* @param[in] m2 mat2x3 (right)
|
||||
* @param[out] dest destination (result, mat2)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
@@ -109,11 +104,11 @@ glm_mat3x2_mul(mat3x2 m1, mat2x3 m2, mat2 dest) {
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief multiply matrix with column vector and store in dest column vector
|
||||
* @brief Multiply mat3x2 (m) by vec3 (v) and store in vec2 (dest).
|
||||
*
|
||||
* @param[in] m matrix (left)
|
||||
* @param[in] v vector (right, column vector)
|
||||
* @param[out] dest result vector
|
||||
* @param[in] m mat3x2 (left)
|
||||
* @param[in] v vec3 (right, column vector)
|
||||
* @param[out] dest destination (result, column vector)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
@@ -125,25 +120,23 @@ glm_mat3x2_mulv(mat3x2 m, vec3 v, vec2 dest) {
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief transpose matrix and store in dest
|
||||
* @brief Transpose mat3x2 (src) and store in mat2x3 (dest).
|
||||
*
|
||||
* @param[in] m matrix
|
||||
* @param[out] dest result
|
||||
* @param[in] src mat3x2 (left)
|
||||
* @param[out] dest destination (result, mat2x3)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat3x2_transpose(mat3x2 m, mat2x3 dest) {
|
||||
dest[0][0] = m[0][0]; dest[0][1] = m[1][0]; dest[0][2] = m[2][0];
|
||||
dest[1][0] = m[0][1]; dest[1][1] = m[1][1]; dest[1][2] = m[2][1];
|
||||
glm_mat3x2_transpose(mat3x2 src, mat2x3 dest) {
|
||||
dest[0][0] = src[0][0]; dest[0][1] = src[1][0]; dest[0][2] = src[2][0];
|
||||
dest[1][0] = src[0][1]; dest[1][1] = src[1][1]; dest[1][2] = src[2][1];
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief scale (multiply with scalar) matrix
|
||||
* @brief Multiply mat3x2 (m) by scalar constant (s).
|
||||
*
|
||||
* multiply matrix with scalar
|
||||
*
|
||||
* @param[in, out] m matrix
|
||||
* @param[in] s scalar
|
||||
* @param[in, out] m (src, dest)
|
||||
* @param[in] s float (scalar)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
|
||||
@@ -11,12 +11,12 @@
|
||||
GLM_MAT3X4_ZERO
|
||||
|
||||
Functions:
|
||||
CGLM_INLINE void glm_mat3x4_copy(mat3x4 mat, mat3x4 dest);
|
||||
CGLM_INLINE void glm_mat3x4_zero(mat3x4 mat);
|
||||
CGLM_INLINE void glm_mat3x4_copy(mat3x4 src, mat3x4 dest);
|
||||
CGLM_INLINE void glm_mat3x4_zero(mat3x4 m);
|
||||
CGLM_INLINE void glm_mat3x4_make(const float * __restrict src, mat3x4 dest);
|
||||
CGLM_INLINE void glm_mat3x4_mul(mat3x4 m1, mat4x3 m2, mat3 dest);
|
||||
CGLM_INLINE void glm_mat3x4_mulv(mat3x4 m, vec4 v, vec3 dest);
|
||||
CGLM_INLINE void glm_mat3x4_transpose(mat3x4 m, mat4x3 dest);
|
||||
CGLM_INLINE void glm_mat3x4_mul(mat3x4 m1, mat4x3 m2, mat4 dest);
|
||||
CGLM_INLINE void glm_mat3x4_mulv(mat3x4 m, vec3 v, vec4 dest);
|
||||
CGLM_INLINE void glm_mat3x4_transpose(mat3x4 src, mat4x3 dest);
|
||||
CGLM_INLINE void glm_mat3x4_scale(mat3x4 m, float s);
|
||||
*/
|
||||
|
||||
@@ -33,36 +33,36 @@
|
||||
#define GLM_MAT3X4_ZERO GLM_MAT3X4_ZERO_INIT
|
||||
|
||||
/*!
|
||||
* @brief copy all members of [mat] to [dest]
|
||||
* @brief Copy mat3x4 (src) to mat3x4 (dest).
|
||||
*
|
||||
* @param[in] mat source
|
||||
* @param[out] dest destination
|
||||
* @param[in] src mat3x4 (left)
|
||||
* @param[out] dest destination (result, mat3x4)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat3x4_copy(mat3x4 mat, mat3x4 dest) {
|
||||
glm_vec4_ucopy(mat[0], dest[0]);
|
||||
glm_vec4_ucopy(mat[1], dest[1]);
|
||||
glm_vec4_ucopy(mat[2], dest[2]);
|
||||
glm_mat3x4_copy(mat3x4 src, mat3x4 dest) {
|
||||
glm_vec4_ucopy(src[0], dest[0]);
|
||||
glm_vec4_ucopy(src[1], dest[1]);
|
||||
glm_vec4_ucopy(src[2], dest[2]);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief make given matrix zero.
|
||||
* @brief Zero out the mat3x4 (m).
|
||||
*
|
||||
* @param[in, out] mat matrix
|
||||
* @param[in, out] mat3x4 (src, dest)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat3x4_zero(mat3x4 mat) {
|
||||
glm_mat3x4_zero(mat3x4 m) {
|
||||
CGLM_ALIGN_MAT mat3x4 t = GLM_MAT3X4_ZERO_INIT;
|
||||
glm_mat3x4_copy(t, mat);
|
||||
glm_mat3x4_copy(t, m);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Create mat3x4 matrix from pointer
|
||||
* @brief Create mat3x4 (dest) from pointer (src).
|
||||
*
|
||||
* @param[in] src pointer to an array of floats
|
||||
* @param[out] dest matrix
|
||||
* @param[in] src pointer to an array of floats (left)
|
||||
* @param[out] dest destination (result, mat3x4)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
@@ -84,19 +84,19 @@ glm_mat3x4_make(const float * __restrict src, mat3x4 dest) {
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief multiply m1 and m2 to dest
|
||||
* @brief Multiply mat3x4 (m1) by mat4x3 (m2) and store in mat4 (dest).
|
||||
*
|
||||
* @code
|
||||
* glm_mat3x4_mul(mat3x4, mat4x3, mat3);
|
||||
* glm_mat3x4_mul(mat3x4, mat4x3, mat4);
|
||||
* @endcode
|
||||
*
|
||||
* @param[in] m1 left matrix (mat3x4)
|
||||
* @param[in] m2 right matrix (mat4x3)
|
||||
* @param[out] dest destination matrix (mat3)
|
||||
* @param[in] m1 mat3x4 (left)
|
||||
* @param[in] m2 mat4x3 (right)
|
||||
* @param[out] dest destination (result, mat4)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat3x4_mul(mat3x4 m1, mat4x3 m2, mat3 dest) {
|
||||
glm_mat3x4_mul(mat3x4 m1, mat4x3 m2, mat4 dest) {
|
||||
float a00 = m1[0][0], a01 = m1[0][1], a02 = m1[0][2], a03 = m1[0][3],
|
||||
a10 = m1[1][0], a11 = m1[1][1], a12 = m1[1][2], a13 = m1[1][3],
|
||||
a20 = m1[2][0], a21 = m1[2][1], a22 = m1[2][2], a23 = m1[2][3],
|
||||
@@ -106,66 +106,72 @@ glm_mat3x4_mul(mat3x4 m1, mat4x3 m2, mat3 dest) {
|
||||
b20 = m2[2][0], b21 = m2[2][1], b22 = m2[2][2],
|
||||
b30 = m2[3][0], b31 = m2[3][1], b32 = m2[3][2];
|
||||
|
||||
dest[0][0] = a00 * b00 + a01 * b10 + a02 * b20 + a03 * b30;
|
||||
dest[0][1] = a00 * b01 + a01 * b11 + a02 * b21 + a03 * b31;
|
||||
dest[0][2] = a00 * b02 + a01 * b12 + a02 * b22 + a03 * b32;
|
||||
dest[0][0] = a00 * b00 + a10 * b01 + a20 * b02;
|
||||
dest[0][1] = a01 * b00 + a11 * b01 + a21 * b02;
|
||||
dest[0][2] = a02 * b00 + a12 * b01 + a22 * b02;
|
||||
dest[0][3] = a03 * b00 + a13 * b01 + a23 * b02;
|
||||
|
||||
dest[1][0] = a10 * b00 + a11 * b10 + a12 * b20 + a13 * b30;
|
||||
dest[1][1] = a10 * b01 + a11 * b11 + a12 * b21 + a13 * b31;
|
||||
dest[1][2] = a10 * b02 + a11 * b12 + a12 * b22 + a13 * b32;
|
||||
dest[1][0] = a00 * b10 + a10 * b11 + a20 * b12;
|
||||
dest[1][1] = a01 * b10 + a11 * b11 + a21 * b12;
|
||||
dest[1][2] = a02 * b10 + a12 * b11 + a22 * b12;
|
||||
dest[1][3] = a03 * b10 + a13 * b11 + a23 * b12;
|
||||
|
||||
dest[2][0] = a20 * b00 + a21 * b10 + a22 * b20 + a23 * b30;
|
||||
dest[2][1] = a20 * b01 + a21 * b11 + a22 * b21 + a23 * b31;
|
||||
dest[2][2] = a20 * b02 + a21 * b12 + a22 * b22 + a23 * b32;
|
||||
dest[2][0] = a00 * b20 + a10 * b21 + a20 * b22;
|
||||
dest[2][1] = a01 * b20 + a11 * b21 + a21 * b22;
|
||||
dest[2][2] = a02 * b20 + a12 * b21 + a22 * b22;
|
||||
dest[2][3] = a03 * b20 + a13 * b21 + a23 * b22;
|
||||
|
||||
dest[3][0] = a00 * b30 + a10 * b31 + a20 * b32;
|
||||
dest[3][1] = a01 * b30 + a11 * b31 + a21 * b32;
|
||||
dest[3][2] = a02 * b30 + a12 * b31 + a22 * b32;
|
||||
dest[3][3] = a03 * b30 + a13 * b31 + a23 * b32;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief multiply matrix with column vector and store in dest vector
|
||||
* @brief Multiply mat3x4 (m) by vec3 (v) and store in vec4 (dest).
|
||||
*
|
||||
* @param[in] m matrix (left)
|
||||
* @param[in] v vector (right, column vector)
|
||||
* @param[out] dest result vector
|
||||
* @param[in] m mat3x4 (left)
|
||||
* @param[in] v vec3 (right, column vector)
|
||||
* @param[out] dest destination (result, column vector)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat3x4_mulv(mat3x4 m, vec4 v, vec3 dest) {
|
||||
float v0 = v[0], v1 = v[1], v2 = v[2], v3 = v[3];
|
||||
glm_mat3x4_mulv(mat3x4 m, vec3 v, vec4 dest) {
|
||||
float v0 = v[0], v1 = v[1], v2 = v[2];
|
||||
|
||||
dest[0] = m[0][0] * v0 + m[0][1] * v1 + m[0][2] * v2 + m[0][3] * v3;
|
||||
dest[1] = m[1][0] * v0 + m[1][1] * v1 + m[1][2] * v2 + m[1][3] * v3;
|
||||
dest[2] = m[2][0] * v0 + m[2][1] * v1 + m[2][2] * v2 + m[2][3] * v3;
|
||||
dest[0] = m[0][0] * v0 + m[1][0] * v1 + m[2][0] * v2;
|
||||
dest[1] = m[0][1] * v0 + m[1][1] * v1 + m[2][1] * v2;
|
||||
dest[2] = m[0][2] * v0 + m[1][2] * v1 + m[2][2] * v2;
|
||||
dest[3] = m[0][3] * v0 + m[1][3] * v1 + m[2][3] * v2;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief transpose matrix and store in dest
|
||||
* @brief Transpose mat3x4 (src) and store in mat4x3 (dest).
|
||||
*
|
||||
* @param[in] m matrix
|
||||
* @param[out] dest result
|
||||
* @param[in] src mat3x4 (left)
|
||||
* @param[out] dest destination (result, mat4x3)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat3x4_transpose(mat3x4 m, mat4x3 dest) {
|
||||
dest[0][0] = m[0][0]; dest[0][1] = m[1][0]; dest[0][2] = m[2][0];
|
||||
dest[1][0] = m[0][1]; dest[1][1] = m[1][1]; dest[1][2] = m[2][1];
|
||||
dest[2][0] = m[0][2]; dest[2][1] = m[1][2]; dest[2][2] = m[2][2];
|
||||
dest[3][0] = m[0][3]; dest[3][1] = m[1][3]; dest[3][2] = m[2][3];
|
||||
glm_mat3x4_transpose(mat3x4 src, mat4x3 dest) {
|
||||
dest[0][0] = src[0][0]; dest[0][1] = src[1][0]; dest[0][2] = src[2][0];
|
||||
dest[1][0] = src[0][1]; dest[1][1] = src[1][1]; dest[1][2] = src[2][1];
|
||||
dest[2][0] = src[0][2]; dest[2][1] = src[1][2]; dest[2][2] = src[2][2];
|
||||
dest[3][0] = src[0][3]; dest[3][1] = src[1][3]; dest[3][2] = src[2][3];
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief scale (multiply with scalar) matrix
|
||||
* @brief Multiply mat3x4 (m) by scalar constant (s).
|
||||
*
|
||||
* multiply matrix with scalar
|
||||
*
|
||||
* @param[in, out] m matrix
|
||||
* @param[in] s scalar
|
||||
* @param[in, out] m (src, dest)
|
||||
* @param[in] s float (scalar)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat3x4_scale(mat3x4 m, float s) {
|
||||
m[0][0] *= s; m[1][0] *= s; m[2][0] *= s;
|
||||
m[0][1] *= s; m[1][1] *= s; m[2][1] *= s;
|
||||
m[0][2] *= s; m[1][2] *= s; m[2][2] *= s;
|
||||
m[0][3] *= s; m[1][3] *= s; m[2][3] *= s;
|
||||
m[0][0] *= s; m[0][1] *= s; m[0][2] *= s; m[0][3] *= s;
|
||||
m[1][0] *= s; m[1][1] *= s; m[1][2] *= s; m[1][3] *= s;
|
||||
m[2][0] *= s; m[2][1] *= s; m[2][2] *= s; m[2][3] *= s;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
@@ -44,6 +44,7 @@
|
||||
CGLM_INLINE void glm_mat4_swap_row(mat4 mat, int row1, int row2);
|
||||
CGLM_INLINE float glm_mat4_rmc(vec4 r, mat4 m, vec4 c);
|
||||
CGLM_INLINE void glm_mat4_make(float * restrict src, mat4 dest);
|
||||
CGLM_INLINE void glm_mat4_textrans(float sx, float sy, float rot, float tx, float ty, mat4 dest);
|
||||
*/
|
||||
|
||||
#ifndef cglm_mat_h
|
||||
@@ -360,7 +361,7 @@ glm_mat4_mul(mat4 m1, mat4 m2, mat4 dest) {
|
||||
* size but if <b>len</b> is too small then compiler may unroll whole loop,
|
||||
* usage:
|
||||
* @code
|
||||
* mat m1, m2, m3, m4, res;
|
||||
* mat4 m1, m2, m3, m4, res;
|
||||
*
|
||||
* glm_mat4_mulN((mat4 *[]){&m1, &m2, &m3, &m4}, 4, res);
|
||||
* @endcode
|
||||
@@ -520,6 +521,8 @@ void
|
||||
glm_mat4_transpose_to(mat4 m, mat4 dest) {
|
||||
#if defined(__wasm__) && defined(__wasm_simd128__)
|
||||
glm_mat4_transp_wasm(m, dest);
|
||||
#elif defined(__AVX__)
|
||||
glm_mat4_transp_avx(m, dest);
|
||||
#elif defined( __SSE__ ) || defined( __SSE2__ )
|
||||
glm_mat4_transp_sse2(m, dest);
|
||||
#elif defined(CGLM_NEON_FP)
|
||||
@@ -546,6 +549,8 @@ void
|
||||
glm_mat4_transpose(mat4 m) {
|
||||
#if defined(__wasm__) && defined(__wasm_simd128__)
|
||||
glm_mat4_transp_wasm(m, m);
|
||||
#elif defined(__AVX__)
|
||||
glm_mat4_transp_avx(m, m);
|
||||
#elif defined( __SSE__ ) || defined( __SSE2__ )
|
||||
glm_mat4_transp_sse2(m, m);
|
||||
#elif defined(CGLM_NEON_FP)
|
||||
@@ -645,51 +650,44 @@ glm_mat4_det(mat4 mat) {
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat4_inv(mat4 mat, mat4 dest) {
|
||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||
#if defined(__wasm__) && defined(__wasm_simd128__)
|
||||
glm_mat4_inv_wasm(mat, dest);
|
||||
#elif defined( __SSE__ ) || defined( __SSE2__ )
|
||||
glm_mat4_inv_sse2(mat, dest);
|
||||
#elif defined(CGLM_NEON_FP)
|
||||
glm_mat4_inv_neon(mat, dest);
|
||||
#else
|
||||
float t[6];
|
||||
float det;
|
||||
float a = mat[0][0], b = mat[0][1], c = mat[0][2], d = mat[0][3],
|
||||
e = mat[1][0], f = mat[1][1], g = mat[1][2], h = mat[1][3],
|
||||
i = mat[2][0], j = mat[2][1], k = mat[2][2], l = mat[2][3],
|
||||
m = mat[3][0], n = mat[3][1], o = mat[3][2], p = mat[3][3];
|
||||
m = mat[3][0], n = mat[3][1], o = mat[3][2], p = mat[3][3],
|
||||
|
||||
t[0] = k * p - o * l; t[1] = j * p - n * l; t[2] = j * o - n * k;
|
||||
t[3] = i * p - m * l; t[4] = i * o - m * k; t[5] = i * n - m * j;
|
||||
c1 = k * p - l * o, c2 = c * h - d * g, c3 = i * p - l * m,
|
||||
c4 = a * h - d * e, c5 = j * p - l * n, c6 = b * h - d * f,
|
||||
c7 = i * n - j * m, c8 = a * f - b * e, c9 = j * o - k * n,
|
||||
c10 = b * g - c * f, c11 = i * o - k * m, c12 = a * g - c * e,
|
||||
|
||||
dest[0][0] = f * t[0] - g * t[1] + h * t[2];
|
||||
dest[1][0] =-(e * t[0] - g * t[3] + h * t[4]);
|
||||
dest[2][0] = e * t[1] - f * t[3] + h * t[5];
|
||||
dest[3][0] =-(e * t[2] - f * t[4] + g * t[5]);
|
||||
idt = 1.0f/(c8*c1+c4*c9+c10*c3+c2*c7-c12*c5-c6*c11), ndt = -idt;
|
||||
|
||||
dest[0][1] =-(b * t[0] - c * t[1] + d * t[2]);
|
||||
dest[1][1] = a * t[0] - c * t[3] + d * t[4];
|
||||
dest[2][1] =-(a * t[1] - b * t[3] + d * t[5]);
|
||||
dest[3][1] = a * t[2] - b * t[4] + c * t[5];
|
||||
dest[0][0] = (f * c1 - g * c5 + h * c9) * idt;
|
||||
dest[0][1] = (b * c1 - c * c5 + d * c9) * ndt;
|
||||
dest[0][2] = (n * c2 - o * c6 + p * c10) * idt;
|
||||
dest[0][3] = (j * c2 - k * c6 + l * c10) * ndt;
|
||||
|
||||
t[0] = g * p - o * h; t[1] = f * p - n * h; t[2] = f * o - n * g;
|
||||
t[3] = e * p - m * h; t[4] = e * o - m * g; t[5] = e * n - m * f;
|
||||
dest[1][0] = (e * c1 - g * c3 + h * c11) * ndt;
|
||||
dest[1][1] = (a * c1 - c * c3 + d * c11) * idt;
|
||||
dest[1][2] = (m * c2 - o * c4 + p * c12) * ndt;
|
||||
dest[1][3] = (i * c2 - k * c4 + l * c12) * idt;
|
||||
|
||||
dest[0][2] = b * t[0] - c * t[1] + d * t[2];
|
||||
dest[1][2] =-(a * t[0] - c * t[3] + d * t[4]);
|
||||
dest[2][2] = a * t[1] - b * t[3] + d * t[5];
|
||||
dest[3][2] =-(a * t[2] - b * t[4] + c * t[5]);
|
||||
dest[2][0] = (e * c5 - f * c3 + h * c7) * idt;
|
||||
dest[2][1] = (a * c5 - b * c3 + d * c7) * ndt;
|
||||
dest[2][2] = (m * c6 - n * c4 + p * c8) * idt;
|
||||
dest[2][3] = (i * c6 - j * c4 + l * c8) * ndt;
|
||||
|
||||
t[0] = g * l - k * h; t[1] = f * l - j * h; t[2] = f * k - j * g;
|
||||
t[3] = e * l - i * h; t[4] = e * k - i * g; t[5] = e * j - i * f;
|
||||
|
||||
dest[0][3] =-(b * t[0] - c * t[1] + d * t[2]);
|
||||
dest[1][3] = a * t[0] - c * t[3] + d * t[4];
|
||||
dest[2][3] =-(a * t[1] - b * t[3] + d * t[5]);
|
||||
dest[3][3] = a * t[2] - b * t[4] + c * t[5];
|
||||
|
||||
det = 1.0f / (a * dest[0][0] + b * dest[1][0]
|
||||
+ c * dest[2][0] + d * dest[3][0]);
|
||||
|
||||
glm_mat4_scale_p(dest, det);
|
||||
dest[3][0] = (e * c9 - f * c11 + g * c7) * ndt;
|
||||
dest[3][1] = (a * c9 - b * c11 + c * c7) * idt;
|
||||
dest[3][2] = (m * c10 - n * c12 + o * c8) * ndt;
|
||||
dest[3][3] = (i * c10 - j * c12 + k * c8) * idt;
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -802,4 +800,32 @@ glm_mat4_make(const float * __restrict src, mat4 dest) {
|
||||
dest[2][3] = src[11]; dest[3][3] = src[15];
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Create mat4 matrix from texture transform parameters
|
||||
*
|
||||
* @param[in] sx scale x
|
||||
* @param[in] sy scale y
|
||||
* @param[in] rot rotation in radians CCW/RH
|
||||
* @param[in] tx translate x
|
||||
* @param[in] ty translate y
|
||||
* @param[out] dest texture transform matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat4_textrans(float sx, float sy, float rot, float tx, float ty, mat4 dest) {
|
||||
float c, s;
|
||||
|
||||
c = cosf(rot);
|
||||
s = sinf(rot);
|
||||
|
||||
glm_mat4_identity(dest);
|
||||
|
||||
dest[0][0] = c * sx;
|
||||
dest[0][1] = -s * sy;
|
||||
dest[1][0] = s * sx;
|
||||
dest[1][1] = c * sy;
|
||||
dest[3][0] = tx;
|
||||
dest[3][1] = ty;
|
||||
}
|
||||
|
||||
#endif /* cglm_mat_h */
|
||||
|
||||
@@ -11,12 +11,12 @@
|
||||
GLM_MAT4X2_ZERO
|
||||
|
||||
Functions:
|
||||
CGLM_INLINE void glm_mat4x2_copy(mat4x2 mat, mat4x2 dest);
|
||||
CGLM_INLINE void glm_mat4x2_zero(mat4x2 mat);
|
||||
CGLM_INLINE void glm_mat4x2_copy(mat4x2 src, mat4x2 dest);
|
||||
CGLM_INLINE void glm_mat4x2_zero(mat4x2 m);
|
||||
CGLM_INLINE void glm_mat4x2_make(const float * __restrict src, mat4x2 dest);
|
||||
CGLM_INLINE void glm_mat4x2_mul(mat4x2 m1, mat2x4 m2, mat4 dest);
|
||||
CGLM_INLINE void glm_mat4x2_mulv(mat4x2 m, vec2 v, vec4 dest);
|
||||
CGLM_INLINE void glm_mat4x2_transpose(mat4x2 m, mat2x4 dest);
|
||||
CGLM_INLINE void glm_mat4x2_mul(mat4x2 m1, mat2x4 m2, mat2 dest);
|
||||
CGLM_INLINE void glm_mat4x2_mulv(mat4x2 m, vec4 v, vec2 dest);
|
||||
CGLM_INLINE void glm_mat4x2_transpose(mat4x2 src, mat2x4 dest);
|
||||
CGLM_INLINE void glm_mat4x2_scale(mat4x2 m, float s);
|
||||
*/
|
||||
|
||||
@@ -31,44 +31,37 @@
|
||||
#define GLM_MAT4X2_ZERO GLM_MAT4X2_ZERO_INIT
|
||||
|
||||
/*!
|
||||
* @brief copy all members of [mat] to [dest]
|
||||
* @brief Copy mat4x2 (src) to mat4x2 (dest).
|
||||
*
|
||||
* @param[in] mat source
|
||||
* @param[out] dest destination
|
||||
* @param[in] src mat4x2 (left)
|
||||
* @param[out] dest destination (result, mat4x2)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat4x2_copy(mat4x2 mat, mat4x2 dest) {
|
||||
dest[0][0] = mat[0][0];
|
||||
dest[0][1] = mat[0][1];
|
||||
|
||||
dest[1][0] = mat[1][0];
|
||||
dest[1][1] = mat[1][1];
|
||||
|
||||
dest[2][0] = mat[2][0];
|
||||
dest[2][1] = mat[2][1];
|
||||
|
||||
dest[3][0] = mat[3][0];
|
||||
dest[3][1] = mat[3][1];
|
||||
glm_mat4x2_copy(mat4x2 src, mat4x2 dest) {
|
||||
glm_vec2_copy(src[0], dest[0]);
|
||||
glm_vec2_copy(src[1], dest[1]);
|
||||
glm_vec2_copy(src[2], dest[2]);
|
||||
glm_vec2_copy(src[3], dest[3]);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief make given matrix zero.
|
||||
* @brief Zero out the mat4x2 (m).
|
||||
*
|
||||
* @param[in, out] mat matrix
|
||||
* @param[in, out] mat4x2 (src, dest)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat4x2_zero(mat4x2 mat) {
|
||||
glm_mat4x2_zero(mat4x2 m) {
|
||||
CGLM_ALIGN_MAT mat4x2 t = GLM_MAT4X2_ZERO_INIT;
|
||||
glm_mat4x2_copy(t, mat);
|
||||
glm_mat4x2_copy(t, m);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Create mat4x2 matrix from pointer
|
||||
* @brief Create mat4x2 (dest) from pointer (src).
|
||||
*
|
||||
* @param[in] src pointer to an array of floats
|
||||
* @param[out] dest matrix
|
||||
* @param[in] src pointer to an array of floats (left)
|
||||
* @param[out] dest destination (result, mat4x2)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
@@ -87,19 +80,19 @@ glm_mat4x2_make(const float * __restrict src, mat4x2 dest) {
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief multiply m1 and m2 to dest
|
||||
* @brief Multiply mat4x2 (m1) by mat2x4 (m2) and store in mat2 (dest).
|
||||
*
|
||||
* @code
|
||||
* glm_mat4x2_mul(mat4x2, mat2x4, mat4);
|
||||
* glm_mat4x2_mul(mat4x2, mat2x4, mat2);
|
||||
* @endcode
|
||||
*
|
||||
* @param[in] m1 left matrix (mat4x2)
|
||||
* @param[in] m2 right matrix (mat2x4)
|
||||
* @param[out] dest destination matrix (mat4)
|
||||
* @param[in] m1 mat4x2 (left)
|
||||
* @param[in] m2 mat2x4 (right)
|
||||
* @param[out] dest destination (result, mat2)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat4x2_mul(mat4x2 m1, mat2x4 m2, mat4 dest) {
|
||||
glm_mat4x2_mul(mat4x2 m1, mat2x4 m2, mat2 dest) {
|
||||
float a00 = m1[0][0], a01 = m1[0][1],
|
||||
a10 = m1[1][0], a11 = m1[1][1],
|
||||
a20 = m1[2][0], a21 = m1[2][1],
|
||||
@@ -108,71 +101,47 @@ glm_mat4x2_mul(mat4x2 m1, mat2x4 m2, mat4 dest) {
|
||||
b00 = m2[0][0], b01 = m2[0][1], b02 = m2[0][2], b03 = m2[0][3],
|
||||
b10 = m2[1][0], b11 = m2[1][1], b12 = m2[1][2], b13 = m2[1][3];
|
||||
|
||||
dest[0][0] = a00 * b00 + a01 * b10;
|
||||
dest[0][1] = a00 * b01 + a01 * b11;
|
||||
dest[0][2] = a00 * b02 + a01 * b12;
|
||||
dest[0][3] = a00 * b03 + a01 * b13;
|
||||
dest[0][0] = a00 * b00 + a10 * b01 + a20 * b02 + a30 * b03;
|
||||
dest[0][1] = a01 * b00 + a11 * b01 + a21 * b02 + a31 * b03;
|
||||
|
||||
dest[1][0] = a10 * b00 + a11 * b10;
|
||||
dest[1][1] = a10 * b01 + a11 * b11;
|
||||
dest[1][2] = a10 * b02 + a11 * b12;
|
||||
dest[1][3] = a10 * b03 + a11 * b13;
|
||||
|
||||
dest[2][0] = a20 * b00 + a21 * b10;
|
||||
dest[2][1] = a20 * b01 + a21 * b11;
|
||||
dest[2][2] = a20 * b02 + a21 * b12;
|
||||
dest[2][3] = a20 * b03 + a21 * b13;
|
||||
|
||||
dest[3][0] = a30 * b00 + a31 * b10;
|
||||
dest[3][1] = a30 * b01 + a31 * b11;
|
||||
dest[3][2] = a30 * b02 + a31 * b12;
|
||||
dest[3][3] = a30 * b03 + a31 * b13;
|
||||
dest[1][0] = a00 * b10 + a10 * b11 + a20 * b12 + a30 * b13;
|
||||
dest[1][1] = a01 * b10 + a11 * b11 + a21 * b12 + a31 * b13;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief multiply matrix with column vector and store in dest vector
|
||||
* @brief Multiply mat4x2 (m) by vec4 (v) and store in vec2 (dest).
|
||||
*
|
||||
* @param[in] m matrix (left)
|
||||
* @param[in] v vector (right, column vector)
|
||||
* @param[out] dest result vector
|
||||
* @param[in] m mat4x2 (left)
|
||||
* @param[in] v vec4 (right, column vector)
|
||||
* @param[out] dest destination (result, column vector)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat4x2_mulv(mat4x2 m, vec2 v, vec4 dest) {
|
||||
float v0 = v[0], v1 = v[1];
|
||||
glm_mat4x2_mulv(mat4x2 m, vec4 v, vec2 dest) {
|
||||
float v0 = v[0], v1 = v[1], v2 = v[2], v3 = v[3];
|
||||
|
||||
dest[0] = m[0][0] * v0 + m[0][1] * v1;
|
||||
dest[1] = m[1][0] * v0 + m[1][1] * v1;
|
||||
dest[2] = m[2][0] * v0 + m[2][1] * v1;
|
||||
dest[3] = m[3][0] * v0 + m[3][1] * v1;
|
||||
dest[0] = m[0][0] * v0 + m[1][0] * v1 + m[2][0] * v2 + m[3][0] * v3;
|
||||
dest[1] = m[0][1] * v0 + m[1][1] * v1 + m[2][1] * v2 + m[3][1] * v3;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief transpose matrix and store in dest
|
||||
* @brief Transpose mat4x2 (src) and store in mat2x4 (dest).
|
||||
*
|
||||
* @param[in] m matrix
|
||||
* @param[out] dest result
|
||||
* @param[in] src mat4x2 (left)
|
||||
* @param[out] dest destination (result, mat2x4)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat4x2_transpose(mat4x2 m, mat2x4 dest) {
|
||||
dest[0][0] = m[0][0];
|
||||
dest[0][1] = m[1][0];
|
||||
dest[0][2] = m[2][0];
|
||||
dest[0][3] = m[3][0];
|
||||
dest[1][0] = m[0][1];
|
||||
dest[1][1] = m[1][1];
|
||||
dest[1][2] = m[2][1];
|
||||
dest[1][3] = m[3][1];
|
||||
dest[0][0] = m[0][0]; dest[0][1] = m[1][0]; dest[0][2] = m[2][0]; dest[0][3] = m[3][0];
|
||||
dest[1][0] = m[0][1]; dest[1][1] = m[1][1]; dest[1][2] = m[2][1]; dest[1][3] = m[3][1];
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief scale (multiply with scalar) matrix
|
||||
* @brief Multiply mat4x2 (m) by scalar constant (s).
|
||||
*
|
||||
* multiply matrix with scalar
|
||||
*
|
||||
* @param[in, out] m matrix
|
||||
* @param[in] s scalar
|
||||
* @param[in, out] m (src, dest)
|
||||
* @param[in] s float (scalar)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
|
||||
@@ -11,12 +11,12 @@
|
||||
GLM_MAT4X3_ZERO
|
||||
|
||||
Functions:
|
||||
CGLM_INLINE void glm_mat4x3_copy(mat4x3 mat, mat4x3 dest);
|
||||
CGLM_INLINE void glm_mat4x3_zero(mat4x3 mat);
|
||||
CGLM_INLINE void glm_mat4x3_copy(mat4x3 src, mat4x3 dest);
|
||||
CGLM_INLINE void glm_mat4x3_zero(mat4x3 m);
|
||||
CGLM_INLINE void glm_mat4x3_make(const float * __restrict src, mat4x3 dest);
|
||||
CGLM_INLINE void glm_mat4x3_mul(mat4x3 m1, mat3x4 m2, mat4 dest);
|
||||
CGLM_INLINE void glm_mat4x3_mulv(mat4x3 m, vec3 v, vec4 dest);
|
||||
CGLM_INLINE void glm_mat4x3_transpose(mat4x3 m, mat3x4 dest);
|
||||
CGLM_INLINE void glm_mat4x3_mul(mat4x3 m1, mat3x4 m2, mat3 dest);
|
||||
CGLM_INLINE void glm_mat4x3_mulv(mat4x3 m, vec4 v, vec3 dest);
|
||||
CGLM_INLINE void glm_mat4x3_transpose(mat4x3 src, mat3x4 dest);
|
||||
CGLM_INLINE void glm_mat4x3_scale(mat4x3 m, float s);
|
||||
*/
|
||||
|
||||
@@ -32,48 +32,37 @@
|
||||
#define GLM_MAT4X3_ZERO GLM_MAT4X3_ZERO_INIT
|
||||
|
||||
/*!
|
||||
* @brief copy all members of [mat] to [dest]
|
||||
* @brief Copy mat4x3 (src) to mat4x3 (dest).
|
||||
*
|
||||
* @param[in] mat source
|
||||
* @param[out] dest destination
|
||||
* @param[in] src mat4x3 (left)
|
||||
* @param[out] dest destination (result, mat4x3)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat4x3_copy(mat4x3 mat, mat4x3 dest) {
|
||||
dest[0][0] = mat[0][0];
|
||||
dest[0][1] = mat[0][1];
|
||||
dest[0][2] = mat[0][2];
|
||||
|
||||
dest[1][0] = mat[1][0];
|
||||
dest[1][1] = mat[1][1];
|
||||
dest[1][2] = mat[1][2];
|
||||
|
||||
dest[2][0] = mat[2][0];
|
||||
dest[2][1] = mat[2][1];
|
||||
dest[2][2] = mat[2][2];
|
||||
|
||||
dest[3][0] = mat[3][0];
|
||||
dest[3][1] = mat[3][1];
|
||||
dest[3][2] = mat[3][2];
|
||||
glm_mat4x3_copy(mat4x3 src, mat4x3 dest) {
|
||||
glm_vec3_copy(src[0], dest[0]);
|
||||
glm_vec3_copy(src[1], dest[1]);
|
||||
glm_vec3_copy(src[2], dest[2]);
|
||||
glm_vec3_copy(src[3], dest[3]);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief make given matrix zero.
|
||||
* @brief Zero out the mat4x3 (m).
|
||||
*
|
||||
* @param[in, out] mat matrix
|
||||
* @param[in, out] mat4x3 (src, dest)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat4x3_zero(mat4x3 mat) {
|
||||
glm_mat4x3_zero(mat4x3 m) {
|
||||
CGLM_ALIGN_MAT mat4x3 t = GLM_MAT4X3_ZERO_INIT;
|
||||
glm_mat4x3_copy(t, mat);
|
||||
glm_mat4x3_copy(t, m);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Create mat4x3 matrix from pointer
|
||||
* @brief Create mat4x3 (dest) from pointer (src).
|
||||
*
|
||||
* @param[in] src pointer to an array of floats
|
||||
* @param[out] dest matrix
|
||||
* @param[in] src pointer to an array of floats (left)
|
||||
* @param[out] dest destination (result, mat4x3)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
@@ -96,19 +85,19 @@ glm_mat4x3_make(const float * __restrict src, mat4x3 dest) {
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief multiply m1 and m2 to dest
|
||||
* @brief Multiply mat4x3 (m1) by mat3x4 (m2) and store in mat3 (dest).
|
||||
*
|
||||
* @code
|
||||
* glm_mat4x3_mul(mat4x3, mat3x4, mat4);
|
||||
* glm_mat4x3_mul(mat4x3, mat3x4, mat3);
|
||||
* @endcode
|
||||
*
|
||||
* @param[in] m1 left matrix (mat4x3)
|
||||
* @param[in] m2 right matrix (mat3x4)
|
||||
* @param[out] dest destination matrix (mat4)
|
||||
* @param[in] m1 mat4x3 (left)
|
||||
* @param[in] m2 mat3x4 (right)
|
||||
* @param[out] dest destination (result, mat3)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat4x3_mul(mat4x3 m1, mat3x4 m2, mat4 dest) {
|
||||
glm_mat4x3_mul(mat4x3 m1, mat3x4 m2, mat3 dest) {
|
||||
float a00 = m1[0][0], a01 = m1[0][1], a02 = m1[0][2],
|
||||
a10 = m1[1][0], a11 = m1[1][1], a12 = m1[1][2],
|
||||
a20 = m1[2][0], a21 = m1[2][1], a22 = m1[2][2],
|
||||
@@ -118,77 +107,55 @@ glm_mat4x3_mul(mat4x3 m1, mat3x4 m2, mat4 dest) {
|
||||
b10 = m2[1][0], b11 = m2[1][1], b12 = m2[1][2], b13 = m2[1][3],
|
||||
b20 = m2[2][0], b21 = m2[2][1], b22 = m2[2][2], b23 = m2[2][3];
|
||||
|
||||
dest[0][0] = a00 * b00 + a01 * b10 + a02 * b20;
|
||||
dest[0][1] = a00 * b01 + a01 * b11 + a02 * b21;
|
||||
dest[0][2] = a00 * b02 + a01 * b12 + a02 * b22;
|
||||
dest[0][3] = a00 * b03 + a01 * b13 + a02 * b23;
|
||||
dest[0][0] = a00 * b00 + a10 * b01 + a20 * b02 + a30 * b03;
|
||||
dest[0][1] = a01 * b00 + a11 * b01 + a21 * b02 + a31 * b03;
|
||||
dest[0][2] = a02 * b00 + a12 * b01 + a22 * b02 + a32 * b03;
|
||||
|
||||
dest[1][0] = a10 * b00 + a11 * b10 + a12 * b20;
|
||||
dest[1][1] = a10 * b01 + a11 * b11 + a12 * b21;
|
||||
dest[1][2] = a10 * b02 + a11 * b12 + a12 * b22;
|
||||
dest[1][3] = a10 * b03 + a11 * b13 + a12 * b23;
|
||||
dest[1][0] = a00 * b10 + a10 * b11 + a20 * b12 + a30 * b13;
|
||||
dest[1][1] = a01 * b10 + a11 * b11 + a21 * b12 + a31 * b13;
|
||||
dest[1][2] = a02 * b10 + a12 * b11 + a22 * b12 + a32 * b13;
|
||||
|
||||
dest[2][0] = a20 * b00 + a21 * b10 + a22 * b20;
|
||||
dest[2][1] = a20 * b01 + a21 * b11 + a22 * b21;
|
||||
dest[2][2] = a20 * b02 + a21 * b12 + a22 * b22;
|
||||
dest[2][3] = a20 * b03 + a21 * b13 + a22 * b23;
|
||||
|
||||
dest[3][0] = a30 * b00 + a31 * b10 + a32 * b20;
|
||||
dest[3][1] = a30 * b01 + a31 * b11 + a32 * b21;
|
||||
dest[3][2] = a30 * b02 + a31 * b12 + a32 * b22;
|
||||
dest[3][3] = a30 * b03 + a31 * b13 + a32 * b23;
|
||||
dest[2][0] = a00 * b20 + a10 * b21 + a20 * b22 + a30 * b23;
|
||||
dest[2][1] = a01 * b20 + a11 * b21 + a21 * b22 + a31 * b23;
|
||||
dest[2][2] = a02 * b20 + a12 * b21 + a22 * b22 + a32 * b23;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief multiply matrix with column vector and store in dest vector
|
||||
* @brief Multiply mat4x3 (m) by vec4 (v) and store in vec3 (dest).
|
||||
*
|
||||
* @param[in] m matrix (left)
|
||||
* @param[in] v vector (right, column vector)
|
||||
* @param[out] dest result vector
|
||||
* @param[in] m mat4x3 (left)
|
||||
* @param[in] v vec3 (right, column vector)
|
||||
* @param[out] dest destination (result, column vector)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat4x3_mulv(mat4x3 m, vec3 v, vec4 dest) {
|
||||
float v0 = v[0], v1 = v[1], v2 = v[2];
|
||||
glm_mat4x3_mulv(mat4x3 m, vec4 v, vec3 dest) {
|
||||
float v0 = v[0], v1 = v[1], v2 = v[2], v3 = v[3];
|
||||
|
||||
dest[0] = m[0][0] * v0 + m[0][1] * v1 + m[0][2] * v2;
|
||||
dest[1] = m[1][0] * v0 + m[1][1] * v1 + m[1][2] * v2;
|
||||
dest[2] = m[2][0] * v0 + m[2][1] * v1 + m[2][2] * v2;
|
||||
dest[3] = m[3][0] * v0 + m[3][1] * v1 + m[3][2] * v2;
|
||||
dest[0] = m[0][0] * v0 + m[1][0] * v1 + m[2][0] * v2 + m[3][0] * v3;
|
||||
dest[1] = m[0][1] * v0 + m[1][1] * v1 + m[2][1] * v2 + m[3][1] * v3;
|
||||
dest[2] = m[0][2] * v0 + m[1][2] * v1 + m[2][2] * v2 + m[3][2] * v3;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief transpose matrix and store in dest
|
||||
* @brief Transpose mat4x3 (src) and store in mat3x4 (dest).
|
||||
*
|
||||
* @param[in] m matrix
|
||||
* @param[out] dest result
|
||||
* @param[in] src mat4x3 (left)
|
||||
* @param[out] dest destination (result, mat3x4)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat4x3_transpose(mat4x3 m, mat3x4 dest) {
|
||||
dest[0][0] = m[0][0];
|
||||
dest[0][1] = m[1][0];
|
||||
dest[0][2] = m[2][0];
|
||||
dest[0][3] = m[3][0];
|
||||
|
||||
dest[1][0] = m[0][1];
|
||||
dest[1][1] = m[1][1];
|
||||
dest[1][2] = m[2][1];
|
||||
dest[1][3] = m[3][1];
|
||||
|
||||
dest[2][0] = m[0][2];
|
||||
dest[2][1] = m[1][2];
|
||||
dest[2][2] = m[2][2];
|
||||
dest[2][3] = m[3][2];
|
||||
glm_mat4x3_transpose(mat4x3 src, mat3x4 dest) {
|
||||
dest[0][0] = src[0][0]; dest[0][1] = src[1][0]; dest[0][2] = src[2][0]; dest[0][3] = src[3][0];
|
||||
dest[1][0] = src[0][1]; dest[1][1] = src[1][1]; dest[1][2] = src[2][1]; dest[1][3] = src[3][1];
|
||||
dest[2][0] = src[0][2]; dest[2][1] = src[1][2]; dest[2][2] = src[2][2]; dest[2][3] = src[3][2];
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief scale (multiply with scalar) matrix
|
||||
* @brief Multiply mat4x3 (m) by scalar constant (s).
|
||||
*
|
||||
* multiply matrix with scalar
|
||||
*
|
||||
* @param[in, out] m matrix
|
||||
* @param[in] s scalar
|
||||
* @param[in, out] m (src, dest)
|
||||
* @param[in] s float (scalar)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
@@ -198,4 +165,4 @@ glm_mat4x3_scale(mat4x3 m, float s) {
|
||||
m[2][2] *= s; m[3][0] *= s; m[3][1] *= s; m[3][2] *= s;
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif /* cglm_mat4x3_h */
|
||||
|
||||
734
include/cglm/noise.h
Normal file
734
include/cglm/noise.h
Normal file
@@ -0,0 +1,734 @@
|
||||
/*
|
||||
* Copyright (c), Recep Aslantas.
|
||||
*
|
||||
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||
* Full license can be found in the LICENSE file
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
#ifndef cglm_noise_h
|
||||
#define cglm_noise_h
|
||||
|
||||
#include "vec4.h"
|
||||
#include "vec4-ext.h"
|
||||
|
||||
#include "vec3.h"
|
||||
#include "vec3-ext.h"
|
||||
|
||||
#include "vec2.h"
|
||||
#include "vec2-ext.h"
|
||||
|
||||
#define glm__noiseDetail_mod289(x) (x - floorf(x * (1.0f / 289.0f)) * 289.0f)
|
||||
|
||||
/* glm__noiseDetail_permute(vec4 x, vec4 dest) */
|
||||
#define glm__noiseDetail_permute(x, dest) { \
|
||||
dest[0] = glm__noiseDetail_mod289((x[0] * 34.0f + 1.0f) * x[0]); \
|
||||
dest[1] = glm__noiseDetail_mod289((x[1] * 34.0f + 1.0f) * x[1]); \
|
||||
dest[2] = glm__noiseDetail_mod289((x[2] * 34.0f + 1.0f) * x[2]); \
|
||||
dest[3] = glm__noiseDetail_mod289((x[3] * 34.0f + 1.0f) * x[3]); \
|
||||
}
|
||||
|
||||
/* glm__noiseDetail_fade_vec4(vec4 t, vec4 dest) */
|
||||
#define glm__noiseDetail_fade_vec4(t, dest) { \
|
||||
/* dest = (t * t * t) * (t * (t * 6.0f - 15.0f) + 10.0f) */ \
|
||||
vec4 temp; \
|
||||
glm_vec4_mul(t, t, temp); \
|
||||
glm_vec4_mul(temp, t, temp); \
|
||||
/* dest = (t * (t * 6.0f - 15.0f) + 10.0f) */ \
|
||||
glm_vec4_scale(t, 6.0f, dest); \
|
||||
glm_vec4_subs(dest, 15.0f, dest); \
|
||||
glm_vec4_mul(t, dest, dest); \
|
||||
glm_vec4_adds(dest, 10.0f, dest); \
|
||||
/* dest = temp * dest */ \
|
||||
glm_vec4_mul(temp, dest, dest); \
|
||||
}
|
||||
|
||||
/* glm__noiseDetail_fade_vec3(vec3 t, vec3 dest) */
|
||||
#define glm__noiseDetail_fade_vec3(t, dest) { \
|
||||
/* dest = (t * t * t) * (t * (t * 6.0f - 15.0f) + 10.0f) */ \
|
||||
/* temp = t * t * t */ \
|
||||
vec3 temp; \
|
||||
glm_vec3_mul(t, t, temp); \
|
||||
glm_vec3_mul(temp, t, temp); \
|
||||
/* dest = (t * (t * 6.0f - 15.0f) + 10.0f) */ \
|
||||
glm_vec3_scale(t, 6.0f, dest); \
|
||||
glm_vec3_subs(dest, 15.0f, dest); \
|
||||
glm_vec3_mul(t, dest, dest); \
|
||||
glm_vec3_adds(dest, 10.0f, dest); \
|
||||
/* dest = temp * dest */ \
|
||||
glm_vec3_mul(temp, dest, dest); \
|
||||
}
|
||||
|
||||
/* glm__noiseDetail_fade_vec2(vec2 t, vec2 dest) */
|
||||
#define glm__noiseDetail_fade_vec2(t, dest) { \
|
||||
/* dest = (t * t * t) * (t * (t * 6.0f - 15.0f) + 10.0f) */ \
|
||||
/* temp = t * t * t */ \
|
||||
vec2 temp; \
|
||||
glm_vec2_mul(t, t, temp); \
|
||||
glm_vec2_mul(temp, t, temp); \
|
||||
/* dest = (t * (t * 6.0f - 15.0f) + 10.0f) */ \
|
||||
glm_vec2_scale(t, 6.0f, dest); \
|
||||
glm_vec2_subs(dest, 15.0f, dest); \
|
||||
glm_vec2_mul(t, dest, dest); \
|
||||
glm_vec2_adds(dest, 10.0f, dest); \
|
||||
/* dest = temp * dest */ \
|
||||
glm_vec2_mul(temp, dest, dest); \
|
||||
}
|
||||
|
||||
/* glm__noiseDetail_taylorInvSqrt(vec4 x, vec4 dest) */
|
||||
#define glm__noiseDetail_taylorInvSqrt(x, dest) { \
|
||||
/* dest = 1.79284291400159f - 0.85373472095314f * x */ \
|
||||
vec4 temp; \
|
||||
glm_vec4_scale(x, 0.85373472095314f, temp); /* temp = 0.853...f * x */ \
|
||||
glm_vec4_fill(dest, 1.79284291400159f); /* dest = 1.792...f */ \
|
||||
glm_vec4_sub(dest, temp, dest); /* dest = 1.79284291400159f - temp */ \
|
||||
}
|
||||
|
||||
/* norm = taylorInvSqrt(vec4(
|
||||
* dot(g00__, g00__),
|
||||
* dot(g01__, g01__),
|
||||
* dot(g10__, g10__),
|
||||
* dot(g11__, g11__)
|
||||
* ));
|
||||
*/
|
||||
|
||||
/* glm__noiseDetail_gradNorm_vec4(vec4 g00__, vec4 g01__, vec4 g10__, vec4 g11__) */
|
||||
#define glm__noiseDetail_gradNorm_vec4(g00__, g01__, g10__, g11__) { \
|
||||
vec4 norm; \
|
||||
norm[0] = glm_vec4_dot(g00__, g00__); /* norm.x = dot(g00__, g00__) */ \
|
||||
norm[1] = glm_vec4_dot(g01__, g01__); /* norm.y = dot(g01__, g01__) */ \
|
||||
norm[2] = glm_vec4_dot(g10__, g10__); /* norm.z = dot(g10__, g10__) */ \
|
||||
norm[3] = glm_vec4_dot(g11__, g11__); /* norm.w = dot(g11__, g11__) */ \
|
||||
glm__noiseDetail_taylorInvSqrt(norm, norm); /* norm = taylorInvSqrt(norm) */ \
|
||||
\
|
||||
glm_vec4_scale(g00__, norm[0], g00__); /* g00__ *= norm.x */ \
|
||||
glm_vec4_scale(g01__, norm[1], g01__); /* g01__ *= norm.y */ \
|
||||
glm_vec4_scale(g10__, norm[2], g10__); /* g10__ *= norm.z */ \
|
||||
glm_vec4_scale(g11__, norm[3], g11__); /* g11__ *= norm.w */ \
|
||||
}
|
||||
|
||||
/* glm__noiseDetail_gradNorm_vec3(vec3 g00_, vec3 g01_, vec3 g10_, vec3 g11_) */
|
||||
#define glm__noiseDetail_gradNorm_vec3(g00_, g01_, g10_, g11_) { \
|
||||
vec4 norm; \
|
||||
norm[0] = glm_vec3_dot(g00_, g00_); /* norm.x = dot(g00_, g00_) */ \
|
||||
norm[1] = glm_vec3_dot(g01_, g01_); /* norm.y = dot(g01_, g01_) */ \
|
||||
norm[2] = glm_vec3_dot(g10_, g10_); /* norm.z = dot(g10_, g10_) */ \
|
||||
norm[3] = glm_vec3_dot(g11_, g11_); /* norm.w = dot(g11_, g11_) */ \
|
||||
glm__noiseDetail_taylorInvSqrt(norm, norm); /* norm = taylorInvSqrt(norm) */ \
|
||||
\
|
||||
glm_vec3_scale(g00_, norm[0], g00_); /* g00_ *= norm.x */ \
|
||||
glm_vec3_scale(g01_, norm[1], g01_); /* g01_ *= norm.y */ \
|
||||
glm_vec3_scale(g10_, norm[2], g10_); /* g10_ *= norm.z */ \
|
||||
glm_vec3_scale(g11_, norm[3], g11_); /* g11_ *= norm.w */ \
|
||||
}
|
||||
|
||||
/* glm__noiseDetail_gradNorm_vec2(vec2 g00, vec2 g01, vec2 g10, vec2 g11) */
|
||||
#define glm__noiseDetail_gradNorm_vec2(g00, g01, g10, g11) { \
|
||||
vec4 norm; \
|
||||
norm[0] = glm_vec2_dot(g00, g00); /* norm.x = dot(g00, g00) */ \
|
||||
norm[1] = glm_vec2_dot(g01, g01); /* norm.y = dot(g01, g01) */ \
|
||||
norm[2] = glm_vec2_dot(g10, g10); /* norm.z = dot(g10, g10) */ \
|
||||
norm[3] = glm_vec2_dot(g11, g11); /* norm.w = dot(g11, g11) */ \
|
||||
glm__noiseDetail_taylorInvSqrt(norm, norm); /* norm = taylorInvSqrt(norm) */ \
|
||||
\
|
||||
glm_vec2_scale(g00, norm[0], g00); /* g00 *= norm.x */ \
|
||||
glm_vec2_scale(g01, norm[1], g01); /* g01 *= norm.y */ \
|
||||
glm_vec2_scale(g10, norm[2], g10); /* g10 *= norm.z */ \
|
||||
glm_vec2_scale(g11, norm[3], g11); /* g11 *= norm.w */ \
|
||||
}
|
||||
|
||||
/* glm__noiseDetail_i2gxyzw(vec4 ixy, vec4 gx, vec4 gy, vec4 gz, vec4 gw) */
|
||||
#define glm__noiseDetail_i2gxyzw(ixy, gx, gy, gz, gw) { \
|
||||
/* gx = ixy / 7.0 */ \
|
||||
glm_vec4_divs(ixy, 7.0f, gx); /* gx = ixy / 7.0 */ \
|
||||
\
|
||||
/* gy = fract(gx) / 7.0 */ \
|
||||
glm_vec4_floor(gx, gy); /* gy = floor(gx) */ \
|
||||
glm_vec4_divs(gy, 7.0f, gy); /* gy /= 7.0 */ \
|
||||
\
|
||||
/* gz = floor(gy) / 6.0 */ \
|
||||
glm_vec4_floor(gy, gz); /* gz = floor(gy) */ \
|
||||
glm_vec4_divs(gz, 6.0f, gz); /* gz /= 6.0 */ \
|
||||
\
|
||||
/* gx = fract(gx) - 0.5f */ \
|
||||
glm_vec4_fract(gx, gx); /* gx = fract(gx) */ \
|
||||
glm_vec4_subs(gx, 0.5f, gx); /* gx -= 0.5f */ \
|
||||
\
|
||||
/* gy = fract(gy) - 0.5f */ \
|
||||
glm_vec4_fract(gy, gy); /* gy = fract(gy) */ \
|
||||
glm_vec4_subs(gy, 0.5f, gy); /* gy -= 0.5f */ \
|
||||
\
|
||||
/* gz = fract(gz) - 0.5f */ \
|
||||
glm_vec4_fract(gz, gz); /* gz = fract(gz) */ \
|
||||
glm_vec4_subs(gz, 0.5f, gz); /* gz -= 0.5f */ \
|
||||
\
|
||||
/* abs(gx), abs(gy), abs(gz) */ \
|
||||
vec4 gxa, gya, gza; \
|
||||
glm_vec4_abs(gx, gxa); /* gxa = abs(gx) */ \
|
||||
glm_vec4_abs(gy, gya); /* gya = abs(gy) */ \
|
||||
glm_vec4_abs(gz, gza); /* gza = abs(gz) */ \
|
||||
\
|
||||
/* gw = 0.75 - abs(gx) - abs(gy) - abs(gz) */ \
|
||||
glm_vec4_fill(gw, 0.75f); /* gw = 0.75 */ \
|
||||
glm_vec4_sub(gw, gxa, gw); /* gw -= gxa */ \
|
||||
glm_vec4_sub(gw, gza, gw); /* gw -= gza */ \
|
||||
glm_vec4_sub(gw, gya, gw); /* gw -= gya */ \
|
||||
\
|
||||
/* sw = step(gw, 0.0); */ \
|
||||
vec4 sw; \
|
||||
glm_vec4_stepr(gw, 0.0f, sw); /* sw = step(gw, 0.0) */ \
|
||||
\
|
||||
/* gx -= sw * (step(vec4(0), gx) - T(0.5)); */ \
|
||||
vec4 temp = {0.0f}; /* temp = 0.0 */ \
|
||||
glm_vec4_step(temp, gx, temp); /* temp = step(temp, gx) */ \
|
||||
glm_vec4_subs(temp, 0.5f, temp); /* temp -= 0.5 */ \
|
||||
glm_vec4_mul(sw, temp, temp); /* temp *= sw */ \
|
||||
glm_vec4_sub(gx, temp, gx); /* gx -= temp */ \
|
||||
\
|
||||
/* gy -= sw * (step(vec4(0), gy) - T(0.5)); */ \
|
||||
glm_vec4_zero(temp); /* reset temp */ \
|
||||
glm_vec4_step(temp, gy, temp); /* temp = step(temp, gy) */ \
|
||||
glm_vec4_subs(temp, 0.5f, temp); /* temp -= 0.5 */ \
|
||||
glm_vec4_mul(sw, temp, temp); /* temp *= sw */ \
|
||||
glm_vec4_sub(gy, temp, gy); /* gy -= temp */ \
|
||||
}
|
||||
|
||||
/* NOTE: This function is not *quite* analogous to glm__noiseDetail_i2gxyzw
|
||||
* to try to match the output of glm::perlin. I think it might be a bug in
|
||||
* in the original implementation, but for now I'm keeping it consistent. -MK
|
||||
*
|
||||
* Follow up: The original implementation (glm v 1.0.1) does:
|
||||
*
|
||||
* vec<4, T, Q> gx0 = ixy0 * T(1.0 / 7.0);
|
||||
*
|
||||
* as opposed to:
|
||||
*
|
||||
* vec<4, T, Q> gx0 = ixy0 / T(7);
|
||||
*
|
||||
* This ends up mapping to different simd instructions, at least on AMD.
|
||||
* The delta is tiny but it gets amplified by the rest of the noise function.
|
||||
* Hence we too need to do `glm_vec4_scale` as opposed to `glm_vec4_divs`, to
|
||||
* match it. -MK
|
||||
*/
|
||||
|
||||
/* glm__noiseDetail_i2gxyz(vec4 i, vec4 gx, vec4 gy, vec4 gz) */
|
||||
#define glm__noiseDetail_i2gxyz(ixy, gx, gy, gz) { \
|
||||
/* gx = ixy / 7.0 */ \
|
||||
glm_vec4_scale(ixy, 1.0f / 7.0f, gx); /* gx = ixy * (1/7.0) */\
|
||||
\
|
||||
/* gy = fract(floor(gx0) / 7.0)) - 0.5; */ \
|
||||
glm_vec4_floor(gx, gy); /* gy = floor(gx) */ \
|
||||
glm_vec4_scale(gy, 1.0f / 7.0f, gy); /* gy *= 1 / 7.0 */ \
|
||||
glm_vec4_fract(gy, gy); /* gy = fract(gy) */ \
|
||||
glm_vec4_subs(gy, 0.5f, gy); /* gy -= 0.5f */ \
|
||||
\
|
||||
/* gx = fract(gx); */ \
|
||||
glm_vec4_fract(gx, gx); /* gx = fract(gx) */ \
|
||||
\
|
||||
/* abs(gx), abs(gy) */ \
|
||||
vec4 gxa, gya; \
|
||||
glm_vec4_abs(gx, gxa); /* gxa = abs(gx) */ \
|
||||
glm_vec4_abs(gy, gya); /* gya = abs(gy) */ \
|
||||
\
|
||||
/* gz = vec4(0.5) - abs(gx0) - abs(gy0); */ \
|
||||
glm_vec4_fill(gz, 0.5f); /* gz = 0.5 */ \
|
||||
glm_vec4_sub(gz, gxa, gz); /* gz -= gxa */ \
|
||||
glm_vec4_sub(gz, gya, gz); /* gz -= gya */ \
|
||||
\
|
||||
/* sz = step(gw, 0.0); */ \
|
||||
vec4 sz; \
|
||||
glm_vec4_stepr(gz, 0.0f, sz); /* sz = step(gz, 0.0) */ \
|
||||
\
|
||||
/* gx0 -= sz0 * (step(0.0, gx0) - T(0.5)); */ \
|
||||
vec4 temp = {0.0f}; /* temp = 0.0 */ \
|
||||
glm_vec4_step(temp, gx, temp); /* temp = step(temp, gx) */ \
|
||||
glm_vec4_subs(temp, 0.5f, temp); /* temp -= 0.5 */ \
|
||||
glm_vec4_mul(sz, temp, temp); /* temp *= sz */ \
|
||||
glm_vec4_sub(gx, temp, gx); /* gx -= temp */ \
|
||||
\
|
||||
/* gy0 -= sz0 * (step(0.0, gy0) - T(0.5)); */ \
|
||||
glm_vec4_zero(temp); /* reset temp */ \
|
||||
glm_vec4_step(temp, gy, temp); /* temp = step(temp, gy) */ \
|
||||
glm_vec4_subs(temp, 0.5f, temp); /* temp -= 0.5 */ \
|
||||
glm_vec4_mul(sz, temp, temp); /* temp *= sz */ \
|
||||
glm_vec4_sub(gy, temp, gy); /* gy -= temp */ \
|
||||
}
|
||||
|
||||
/* glm__noiseDetail_i2gxy(vec4 i, vec4 gx, vec4 gy) */
|
||||
#define glm__noiseDetail_i2gxy(i, gx, gy) { \
|
||||
/* gx = 2.0 * fract(i / 41.0) - 1.0; */ \
|
||||
glm_vec4_divs(i, 41.0f, gx); /* gx = i / 41.0 */ \
|
||||
glm_vec4_fract(gx, gx); /* gx = fract(gx) */ \
|
||||
glm_vec4_scale(gx, 2.0f, gx); /* gx *= 2.0 */ \
|
||||
glm_vec4_subs(gx, 1.0f, gx); /* gx -= 1.0 */ \
|
||||
\
|
||||
/* gy = abs(gx) - 0.5; */ \
|
||||
glm_vec4_abs(gx, gy); /* gy = abs(gx) */ \
|
||||
glm_vec4_subs(gy, 0.5f, gy); /* gy -= 0.5 */ \
|
||||
\
|
||||
/* tx = floor(gx + 0.5); */ \
|
||||
vec4 tx; \
|
||||
glm_vec4_adds(gx, 0.5f, tx); /* tx = gx + 0.5 */ \
|
||||
glm_vec4_floor(tx, tx); /* tx = floor(tx) */ \
|
||||
\
|
||||
/* gx = gx - tx; */ \
|
||||
glm_vec4_sub(gx, tx, gx); /* gx -= tx */ \
|
||||
}
|
||||
|
||||
/* ============================================================================
|
||||
* Classic perlin noise
|
||||
* ============================================================================
|
||||
*/
|
||||
|
||||
/*!
|
||||
* @brief Classic perlin noise
|
||||
*
|
||||
* @param[in] point 4D vector
|
||||
* @returns perlin noise value
|
||||
*/
|
||||
CGLM_INLINE
|
||||
float
|
||||
glm_perlin_vec4(vec4 point) {
|
||||
/* Integer part of p for indexing */
|
||||
vec4 Pi0;
|
||||
glm_vec4_floor(point, Pi0); /* Pi0 = floor(point); */
|
||||
|
||||
/* Integer part + 1 */
|
||||
vec4 Pi1;
|
||||
glm_vec4_adds(Pi0, 1.0f, Pi1); /* Pi1 = Pi0 + 1.0f; */
|
||||
|
||||
glm_vec4_mods(Pi0, 289.0f, Pi0); /* Pi0 = mod(Pi0, 289.0f); */
|
||||
glm_vec4_mods(Pi1, 289.0f, Pi1); /* Pi1 = mod(Pi1, 289.0f); */
|
||||
|
||||
/* Fractional part of p for interpolation */
|
||||
vec4 Pf0;
|
||||
glm_vec4_fract(point, Pf0);
|
||||
|
||||
/* Fractional part - 1.0 */
|
||||
vec4 Pf1;
|
||||
glm_vec4_subs(Pf0, 1.0f, Pf1);
|
||||
|
||||
vec4 ix = {Pi0[0], Pi1[0], Pi0[0], Pi1[0]};
|
||||
vec4 iy = {Pi0[1], Pi0[1], Pi1[1], Pi1[1]};
|
||||
vec4 iz0 = {Pi0[2], Pi0[2], Pi0[2], Pi0[2]}; /* iz0 = vec4(Pi0.z); */
|
||||
vec4 iz1 = {Pi1[2], Pi1[2], Pi1[2], Pi1[2]}; /* iz1 = vec4(Pi1.z); */
|
||||
vec4 iw0 = {Pi0[3], Pi0[3], Pi0[3], Pi0[3]}; /* iw0 = vec4(Pi0.w); */
|
||||
vec4 iw1 = {Pi1[3], Pi1[3], Pi1[3], Pi1[3]}; /* iw1 = vec4(Pi1.w); */
|
||||
|
||||
/* ------------ */
|
||||
|
||||
/* ixy = permute(permute(ix) + iy) */
|
||||
vec4 ixy;
|
||||
glm__noiseDetail_permute(ix, ixy); /* ixy = permute(ix) */
|
||||
glm_vec4_add(ixy, iy, ixy); /* ixy += iy; */
|
||||
glm__noiseDetail_permute(ixy, ixy); /* ixy = permute(ixy) */
|
||||
|
||||
/* ixy0 = permute(ixy + iz0) */
|
||||
vec4 ixy0;
|
||||
glm_vec4_add(ixy, iz0, ixy0); /* ixy0 = ixy + iz0 */
|
||||
glm__noiseDetail_permute(ixy0, ixy0); /* ixy0 = permute(ixy0) */
|
||||
|
||||
/* ixy1 = permute(ixy + iz1) */
|
||||
vec4 ixy1;
|
||||
glm_vec4_add(ixy, iz1, ixy1); /* ixy1 = ixy, iz1 */
|
||||
glm__noiseDetail_permute(ixy1, ixy1); /* ixy1 = permute(ixy1) */
|
||||
|
||||
/* ixy00 = permute(ixy0 + iw0) */
|
||||
vec4 ixy00;
|
||||
glm_vec4_add(ixy0, iw0, ixy00); /* ixy00 = ixy0 + iw0 */
|
||||
glm__noiseDetail_permute(ixy00, ixy00); /* ixy00 = permute(ixy00) */
|
||||
|
||||
/* ixy01 = permute(ixy0 + iw1) */
|
||||
vec4 ixy01;
|
||||
glm_vec4_add(ixy0, iw1, ixy01); /* ixy01 = ixy0 + iw1 */
|
||||
glm__noiseDetail_permute(ixy01, ixy01); /* ixy01 = permute(ixy01) */
|
||||
|
||||
/* ixy10 = permute(ixy1 + iw0) */
|
||||
vec4 ixy10;
|
||||
glm_vec4_add(ixy1, iw0, ixy10); /* ixy10 = ixy1 + iw0 */
|
||||
glm__noiseDetail_permute(ixy10, ixy10); /* ixy10 = permute(ixy10) */
|
||||
|
||||
/* ixy11 = permute(ixy1 + iw1) */
|
||||
vec4 ixy11;
|
||||
glm_vec4_add(ixy1, iw1, ixy11); /* ixy11 = ixy1 + iw1 */
|
||||
glm__noiseDetail_permute(ixy11, ixy11); /* ixy11 = permute(ixy11) */
|
||||
|
||||
/* ------------ */
|
||||
|
||||
vec4 gx00, gy00, gz00, gw00;
|
||||
glm__noiseDetail_i2gxyzw(ixy00, gx00, gy00, gz00, gw00);
|
||||
|
||||
vec4 gx01, gy01, gz01, gw01;
|
||||
glm__noiseDetail_i2gxyzw(ixy01, gx01, gy01, gz01, gw01);
|
||||
|
||||
vec4 gx10, gy10, gz10, gw10;
|
||||
glm__noiseDetail_i2gxyzw(ixy10, gx10, gy10, gz10, gw10);
|
||||
|
||||
vec4 gx11, gy11, gz11, gw11;
|
||||
glm__noiseDetail_i2gxyzw(ixy11, gx11, gy11, gz11, gw11);
|
||||
|
||||
/* ------------ */
|
||||
|
||||
vec4 g0000 = {gx00[0], gy00[0], gz00[0], gw00[0]}; /* g0000 = vec4(gx00.x, gy00.x, gz00.x, gw00.x); */
|
||||
vec4 g0100 = {gx00[2], gy00[2], gz00[2], gw00[2]}; /* g0100 = vec4(gx00.z, gy00.z, gz00.z, gw00.z); */
|
||||
vec4 g1000 = {gx00[1], gy00[1], gz00[1], gw00[1]}; /* g1000 = vec4(gx00.y, gy00.y, gz00.y, gw00.y); */
|
||||
vec4 g1100 = {gx00[3], gy00[3], gz00[3], gw00[3]}; /* g1100 = vec4(gx00.w, gy00.w, gz00.w, gw00.w); */
|
||||
|
||||
vec4 g0001 = {gx01[0], gy01[0], gz01[0], gw01[0]}; /* g0001 = vec4(gx01.x, gy01.x, gz01.x, gw01.x); */
|
||||
vec4 g0101 = {gx01[2], gy01[2], gz01[2], gw01[2]}; /* g0101 = vec4(gx01.z, gy01.z, gz01.z, gw01.z); */
|
||||
vec4 g1001 = {gx01[1], gy01[1], gz01[1], gw01[1]}; /* g1001 = vec4(gx01.y, gy01.y, gz01.y, gw01.y); */
|
||||
vec4 g1101 = {gx01[3], gy01[3], gz01[3], gw01[3]}; /* g1101 = vec4(gx01.w, gy01.w, gz01.w, gw01.w); */
|
||||
|
||||
vec4 g0010 = {gx10[0], gy10[0], gz10[0], gw10[0]}; /* g0010 = vec4(gx10.x, gy10.x, gz10.x, gw10.x); */
|
||||
vec4 g0110 = {gx10[2], gy10[2], gz10[2], gw10[2]}; /* g0110 = vec4(gx10.z, gy10.z, gz10.z, gw10.z); */
|
||||
vec4 g1010 = {gx10[1], gy10[1], gz10[1], gw10[1]}; /* g1010 = vec4(gx10.y, gy10.y, gz10.y, gw10.y); */
|
||||
vec4 g1110 = {gx10[3], gy10[3], gz10[3], gw10[3]}; /* g1110 = vec4(gx10.w, gy10.w, gz10.w, gw10.w); */
|
||||
|
||||
vec4 g0011 = {gx11[0], gy11[0], gz11[0], gw11[0]}; /* g0011 = vec4(gx11.x, gy11.x, gz11.x, gw11.x); */
|
||||
vec4 g0111 = {gx11[2], gy11[2], gz11[2], gw11[2]}; /* g0111 = vec4(gx11.z, gy11.z, gz11.z, gw11.z); */
|
||||
vec4 g1011 = {gx11[1], gy11[1], gz11[1], gw11[1]}; /* g1011 = vec4(gx11.y, gy11.y, gz11.y, gw11.y); */
|
||||
vec4 g1111 = {gx11[3], gy11[3], gz11[3], gw11[3]}; /* g1111 = vec4(gx11.w, gy11.w, gz11.w, gw11.w); */
|
||||
|
||||
glm__noiseDetail_gradNorm_vec4(g0000, g0100, g1000, g1100);
|
||||
glm__noiseDetail_gradNorm_vec4(g0001, g0101, g1001, g1101);
|
||||
glm__noiseDetail_gradNorm_vec4(g0010, g0110, g1010, g1110);
|
||||
glm__noiseDetail_gradNorm_vec4(g0011, g0111, g1011, g1111);
|
||||
|
||||
/* ------------ */
|
||||
|
||||
float n0000 = glm_vec4_dot(g0000, Pf0); /* n0000 = dot(g0000, Pf0) */
|
||||
|
||||
/* n1000 = dot(g1000, vec4(Pf1.x, Pf0.y, Pf0.z, Pf0.w)) */
|
||||
vec4 n1000d = {Pf1[0], Pf0[1], Pf0[2], Pf0[3]};
|
||||
float n1000 = glm_vec4_dot(g1000, n1000d);
|
||||
|
||||
/* n0100 = dot(g0100, vec4(Pf0.x, Pf1.y, Pf0.z, Pf0.w)) */
|
||||
vec4 n0100d = {Pf0[0], Pf1[1], Pf0[2], Pf0[3]};
|
||||
float n0100 = glm_vec4_dot(g0100, n0100d);
|
||||
|
||||
/* n1100 = dot(g1100, vec4(Pf1.x, Pf1.y, Pf0.z, Pf0.w)) */
|
||||
vec4 n1100d = {Pf1[0], Pf1[1], Pf0[2], Pf0[3]};
|
||||
float n1100 = glm_vec4_dot(g1100, n1100d);
|
||||
|
||||
/* n0010 = dot(g0010, vec4(Pf0.x, Pf0.y, Pf1.z, Pf0.w)) */
|
||||
vec4 n0010d = {Pf0[0], Pf0[1], Pf1[2], Pf0[3]};
|
||||
float n0010 = glm_vec4_dot(g0010, n0010d);
|
||||
|
||||
/* n1010 = dot(g1010, vec4(Pf1.x, Pf0.y, Pf1.z, Pf0.w)) */
|
||||
vec4 n1010d = {Pf1[0], Pf0[1], Pf1[2], Pf0[3]};
|
||||
float n1010 = glm_vec4_dot(g1010, n1010d);
|
||||
|
||||
/* n0110 = dot(g0110, vec4(Pf0.x, Pf1.y, Pf1.z, Pf0.w)) */
|
||||
vec4 n0110d = {Pf0[0], Pf1[1], Pf1[2], Pf0[3]};
|
||||
float n0110 = glm_vec4_dot(g0110, n0110d);
|
||||
|
||||
/* n1110 = dot(g1110, vec4(Pf1.x, Pf1.y, Pf1.z, Pf0.w)) */
|
||||
vec4 n1110d = {Pf1[0], Pf1[1], Pf1[2], Pf0[3]};
|
||||
float n1110 = glm_vec4_dot(g1110, n1110d);
|
||||
|
||||
/* n0001 = dot(g0001, vec4(Pf0.x, Pf0.y, Pf0.z, Pf1.w)) */
|
||||
vec4 n0001d = {Pf0[0], Pf0[1], Pf0[2], Pf1[3]};
|
||||
float n0001 = glm_vec4_dot(g0001, n0001d);
|
||||
|
||||
/* n1001 = dot(g1001, vec4(Pf1.x, Pf0.y, Pf0.z, Pf1.w)) */
|
||||
vec4 n1001d = {Pf1[0], Pf0[1], Pf0[2], Pf1[3]};
|
||||
float n1001 = glm_vec4_dot(g1001, n1001d);
|
||||
|
||||
/* n0101 = dot(g0101, vec4(Pf0.x, Pf1.y, Pf0.z, Pf1.w)) */
|
||||
vec4 n0101d = {Pf0[0], Pf1[1], Pf0[2], Pf1[3]};
|
||||
float n0101 = glm_vec4_dot(g0101, n0101d);
|
||||
|
||||
/* n1101 = dot(g1101, vec4(Pf1.x, Pf1.y, Pf0.z, Pf1.w)) */
|
||||
vec4 n1101d = {Pf1[0], Pf1[1], Pf0[2], Pf1[3]};
|
||||
float n1101 = glm_vec4_dot(g1101, n1101d);
|
||||
|
||||
/* n0011 = dot(g0011, vec4(Pf0.x, Pf0.y, Pf1.z, Pf1.w)) */
|
||||
vec4 n0011d = {Pf0[0], Pf0[1], Pf1[2], Pf1[3]};
|
||||
float n0011 = glm_vec4_dot(g0011, n0011d);
|
||||
|
||||
/* n1011 = dot(g1011, vec4(Pf1.x, Pf0.y, Pf1.z, Pf1.w)) */
|
||||
vec4 n1011d = {Pf1[0], Pf0[1], Pf1[2], Pf1[3]};
|
||||
float n1011 = glm_vec4_dot(g1011, n1011d);
|
||||
|
||||
/* n0111 = dot(g0111, vec4(Pf0.x, Pf1.y, Pf1.z, Pf1.w)) */
|
||||
vec4 n0111d = {Pf0[0], Pf1[1], Pf1[2], Pf1[3]};
|
||||
float n0111 = glm_vec4_dot(g0111, n0111d);
|
||||
|
||||
float n1111 = glm_vec4_dot(g1111, Pf1); /* n1111 = dot(g1111, Pf1) */
|
||||
|
||||
/* ------------ */
|
||||
|
||||
vec4 fade_xyzw;
|
||||
glm__noiseDetail_fade_vec4(Pf0, fade_xyzw); /* fade_xyzw = fade(Pf0) */
|
||||
|
||||
/* n_0w = lerp(vec4(n0000, n1000, n0100, n1100), vec4(n0001, n1001, n0101, n1101), fade_xyzw.w) */
|
||||
vec4 n_0w1 = {n0000, n1000, n0100, n1100};
|
||||
vec4 n_0w2 = {n0001, n1001, n0101, n1101};
|
||||
vec4 n_0w;
|
||||
glm_vec4_lerp(n_0w1, n_0w2, fade_xyzw[3], n_0w);
|
||||
|
||||
/* n_1w = lerp(vec4(n0010, n1010, n0110, n1110), vec4(n0011, n1011, n0111, n1111), fade_xyzw.w) */
|
||||
vec4 n_1w1 = {n0010, n1010, n0110, n1110};
|
||||
vec4 n_1w2 = {n0011, n1011, n0111, n1111};
|
||||
vec4 n_1w;
|
||||
glm_vec4_lerp(n_1w1, n_1w2, fade_xyzw[3], n_1w);
|
||||
|
||||
/* n_zw = lerp(n_0w, n_1w, fade_xyzw.z) */
|
||||
vec4 n_zw;
|
||||
glm_vec4_lerp(n_0w, n_1w, fade_xyzw[2], n_zw);
|
||||
|
||||
/* n_yzw = lerp(vec2(n_zw.x, n_zw.y), vec2(n_zw.z, n_zw.w), fade_xyzw.y) */
|
||||
vec2 n_yzw;
|
||||
vec2 n_yzw1 = {n_zw[0], n_zw[1]};
|
||||
vec2 n_yzw2 = {n_zw[2], n_zw[3]};
|
||||
glm_vec2_lerp(n_yzw1, n_yzw2, fade_xyzw[1], n_yzw);
|
||||
|
||||
/* n_xyzw = lerp(n_yzw.x, n_yzw.y, fade_xyzw.x) */
|
||||
float n_xyzw = glm_lerp(n_yzw[0], n_yzw[1], fade_xyzw[0]);
|
||||
|
||||
return n_xyzw * 2.2f;
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* @brief Classic perlin noise
|
||||
*
|
||||
* @param[in] point 3D vector
|
||||
* @returns perlin noise value
|
||||
*/
|
||||
CGLM_INLINE
|
||||
float
|
||||
glm_perlin_vec3(vec3 point) {
|
||||
/* Integer part of p for indexing */
|
||||
vec3 Pi0;
|
||||
glm_vec3_floor(point, Pi0); /* Pi0 = floor(point); */
|
||||
|
||||
/* Integer part + 1 */
|
||||
vec3 Pi1;
|
||||
glm_vec3_adds(Pi0, 1.0f, Pi1); /* Pi1 = Pi0 + 1.0f; */
|
||||
|
||||
glm_vec3_mods(Pi0, 289.0f, Pi0); /* Pi0 = mod(Pi0, 289.0f); */
|
||||
glm_vec3_mods(Pi1, 289.0f, Pi1); /* Pi1 = mod(Pi1, 289.0f); */
|
||||
|
||||
/* Fractional part of p for interpolation */
|
||||
vec3 Pf0;
|
||||
glm_vec3_fract(point, Pf0);
|
||||
|
||||
/* Fractional part - 1.0 */
|
||||
vec3 Pf1;
|
||||
glm_vec3_subs(Pf0, 1.0f, Pf1);
|
||||
|
||||
vec4 ix = {Pi0[0], Pi1[0], Pi0[0], Pi1[0]};
|
||||
vec4 iy = {Pi0[1], Pi0[1], Pi1[1], Pi1[1]};
|
||||
vec4 iz0 = {Pi0[2], Pi0[2], Pi0[2], Pi0[2]}; /* iz0 = vec4(Pi0.z); */
|
||||
vec4 iz1 = {Pi1[2], Pi1[2], Pi1[2], Pi1[2]}; /* iz1 = vec4(Pi1.z); */
|
||||
|
||||
/* ------------ */
|
||||
|
||||
/* ixy = permute(permute(ix) + iy) */
|
||||
vec4 ixy;
|
||||
glm__noiseDetail_permute(ix, ixy); /* ixy = permute(ix) */
|
||||
glm_vec4_add(ixy, iy, ixy); /* ixy += iy; */
|
||||
glm__noiseDetail_permute(ixy, ixy); /* ixy = permute(ixy) */
|
||||
|
||||
/* ixy0 = permute(ixy + iz0) */
|
||||
vec4 ixy0;
|
||||
glm_vec4_add(ixy, iz0, ixy0); /* ixy0 = ixy + iz0 */
|
||||
glm__noiseDetail_permute(ixy0, ixy0); /* ixy0 = permute(ixy0) */
|
||||
|
||||
/* ixy1 = permute(ixy + iz1) */
|
||||
vec4 ixy1;
|
||||
glm_vec4_add(ixy, iz1, ixy1); /* ixy1 = ixy, iz1 */
|
||||
glm__noiseDetail_permute(ixy1, ixy1); /* ixy1 = permute(ixy1) */
|
||||
|
||||
/* ------------ */
|
||||
|
||||
vec4 gx0, gy0, gz0;
|
||||
glm__noiseDetail_i2gxyz(ixy0, gx0, gy0, gz0);
|
||||
|
||||
vec4 gx1, gy1, gz1;
|
||||
glm__noiseDetail_i2gxyz(ixy1, gx1, gy1, gz1);
|
||||
|
||||
/* ------------ */
|
||||
|
||||
vec3 g000 = {gx0[0], gy0[0], gz0[0]}; /* g000 = vec3(gx0.x, gy0.x, gz0.x); */
|
||||
vec3 g100 = {gx0[1], gy0[1], gz0[1]}; /* g100 = vec3(gx0.y, gy0.y, gz0.y); */
|
||||
vec3 g010 = {gx0[2], gy0[2], gz0[2]}; /* g010 = vec3(gx0.z, gy0.z, gz0.z); */
|
||||
vec3 g110 = {gx0[3], gy0[3], gz0[3]}; /* g110 = vec3(gx0.w, gy0.w, gz0.w); */
|
||||
|
||||
vec3 g001 = {gx1[0], gy1[0], gz1[0]}; /* g001 = vec3(gx1.x, gy1.x, gz1.x); */
|
||||
vec3 g101 = {gx1[1], gy1[1], gz1[1]}; /* g101 = vec3(gx1.y, gy1.y, gz1.y); */
|
||||
vec3 g011 = {gx1[2], gy1[2], gz1[2]}; /* g011 = vec3(gx1.z, gy1.z, gz1.z); */
|
||||
vec3 g111 = {gx1[3], gy1[3], gz1[3]}; /* g111 = vec3(gx1.w, gy1.w, gz1.w); */
|
||||
|
||||
glm__noiseDetail_gradNorm_vec3(g000, g010, g100, g110);
|
||||
glm__noiseDetail_gradNorm_vec3(g001, g011, g101, g111);
|
||||
|
||||
/* ------------ */
|
||||
|
||||
float n000 = glm_vec3_dot(g000, Pf0); /* n000 = dot(g000, Pf0) */
|
||||
|
||||
/* n100 = dot(g100, vec3(Pf1.x, Pf0.y, Pf0.z)) */
|
||||
vec3 n100d = {Pf1[0], Pf0[1], Pf0[2]};
|
||||
float n100 = glm_vec3_dot(g100, n100d);
|
||||
|
||||
/* n010 = dot(g010, vec3(Pf0.x, Pf1.y, Pf0.z)) */
|
||||
vec3 n010d = {Pf0[0], Pf1[1], Pf0[2]};
|
||||
float n010 = glm_vec3_dot(g010, n010d);
|
||||
|
||||
/* n110 = dot(g110, vec3(Pf1.x, Pf1.y, Pf0.z)) */
|
||||
vec3 n110d = {Pf1[0], Pf1[1], Pf0[2]};
|
||||
float n110 = glm_vec3_dot(g110, n110d);
|
||||
|
||||
/* n001 = dot(g001, vec3(Pf0.x, Pf0.y, Pf1.z)) */
|
||||
vec3 n001d = {Pf0[0], Pf0[1], Pf1[2]};
|
||||
float n001 = glm_vec3_dot(g001, n001d);
|
||||
|
||||
/* n101 = dot(g101, vec3(Pf1.x, Pf0.y, Pf1.z)) */
|
||||
vec3 n101d = {Pf1[0], Pf0[1], Pf1[2]};
|
||||
float n101 = glm_vec3_dot(g101, n101d);
|
||||
|
||||
/* n011 = dot(g011, vec3(Pf0.x, Pf1.y, Pf1.z)) */
|
||||
vec3 n011d = {Pf0[0], Pf1[1], Pf1[2]};
|
||||
float n011 = glm_vec3_dot(g011, n011d);
|
||||
|
||||
float n111 = glm_vec3_dot(g111, Pf1); /* n111 = dot(g111, Pf1) */
|
||||
|
||||
/* ------------ */
|
||||
|
||||
vec3 fade_xyz;
|
||||
glm__noiseDetail_fade_vec3(Pf0, fade_xyz); /* fade_xyz = fade(Pf0) */
|
||||
|
||||
/* n_z = lerp(vec4(n000, n100, n010, n110), vec4(n001, n101, n011, n111), fade_xyz.z); */
|
||||
vec4 n_z;
|
||||
vec4 n_z1 = {n000, n100, n010, n110};
|
||||
vec4 n_z2 = {n001, n101, n011, n111};
|
||||
glm_vec4_lerp(n_z1, n_z2, fade_xyz[2], n_z);
|
||||
|
||||
/* vec2 n_yz = lerp(vec2(n_z.x, n_z.y), vec2(n_z.z, n_z.w), fade_xyz.y); */
|
||||
vec2 n_yz;
|
||||
vec2 n_yz1 = {n_z[0], n_z[1]};
|
||||
vec2 n_yz2 = {n_z[2], n_z[3]};
|
||||
glm_vec2_lerp(n_yz1, n_yz2, fade_xyz[1], n_yz);
|
||||
|
||||
/* n_xyz = lerp(n_yz.x, n_yz.y, fade_xyz.x); */
|
||||
float n_xyz = glm_lerp(n_yz[0], n_yz[1], fade_xyz[0]);
|
||||
|
||||
return n_xyz * 2.2f;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Classic perlin noise
|
||||
*
|
||||
* @param[in] point 2D vector
|
||||
* @returns perlin noise value
|
||||
*/
|
||||
CGLM_INLINE
|
||||
float
|
||||
glm_perlin_vec2(vec2 point) {
|
||||
|
||||
/* Integer part of p for indexing */
|
||||
/* Pi = floor(vec4(point.x, point.y, point.x, point.y)) + vec4(0.0, 0.0, 1.0, 1.0); */
|
||||
vec4 Pi = {point[0], point[1], point[0], point[1]}; /* Pi = vec4(point.x, point.y, point.x, point.y) */
|
||||
glm_vec4_floor(Pi, Pi); /* Pi = floor(Pi) */
|
||||
Pi[2] += 1.0f; /* Pi.z += 1.0 */
|
||||
Pi[3] += 1.0f; /* Pi.w += 1.0 */
|
||||
|
||||
/* Fractional part of p for interpolation */
|
||||
/* vec<4, T, Q> Pf = glm::fract(vec<4, T, Q>(Position.x, Position.y, Position.x, Position.y)) - vec<4, T, Q>(0.0, 0.0, 1.0, 1.0); */
|
||||
vec4 Pf = {point[0], point[1], point[0], point[1]}; /* Pf = vec4(point.x, point.y, point.x, point.y) */
|
||||
glm_vec4_fract(Pf, Pf); /* Pf = fract(Pf) */
|
||||
Pf[2] -= 1.0f; /* Pf.z -= 1.0 */
|
||||
Pf[3] -= 1.0f; /* Pf.w -= 1.0 */
|
||||
|
||||
/* Mod to avoid truncation effects in permutation */
|
||||
glm_vec4_mods(Pi, 289.0f, Pi); /* Pi = mod(Pi, 289.0f); */
|
||||
|
||||
vec4 ix = {Pi[0], Pi[2], Pi[0], Pi[2]}; /* ix = vec4(Pi.x, Pi.z, Pi.x, Pi.z) */
|
||||
vec4 iy = {Pi[1], Pi[1], Pi[3], Pi[3]}; /* iy = vec4(Pi.y, Pi.y, Pi.w, Pi.w) */
|
||||
vec4 fx = {Pf[0], Pf[2], Pf[0], Pf[2]}; /* fx = vec4(Pf.x, Pf.z, Pf.x, Pf.z) */
|
||||
vec4 fy = {Pf[1], Pf[1], Pf[3], Pf[3]}; /* fy = vec4(Pf.y, Pf.y, Pf.w, Pf.w) */
|
||||
|
||||
/* ------------ */
|
||||
|
||||
/* i = permute(permute(ix) + iy); */
|
||||
vec4 i;
|
||||
glm__noiseDetail_permute(ix, i); /* i = permute(ix) */
|
||||
glm_vec4_add(i, iy, i); /* i += iy; */
|
||||
glm__noiseDetail_permute(i, i); /* i = permute(i) */
|
||||
|
||||
/* ------------ */
|
||||
|
||||
vec4 gx, gy;
|
||||
glm__noiseDetail_i2gxy(i, gx, gy);
|
||||
|
||||
/* ------------ */
|
||||
|
||||
vec2 g00 = {gx[0], gy[0]}; /* g00 = vec2(gx.x, gy.x) */
|
||||
vec2 g10 = {gx[1], gy[1]}; /* g10 = vec2(gx.y, gy.y) */
|
||||
vec2 g01 = {gx[2], gy[2]}; /* g01 = vec2(gx.z, gy.z) */
|
||||
vec2 g11 = {gx[3], gy[3]}; /* g11 = vec2(gx.w, gy.w) */
|
||||
|
||||
glm__noiseDetail_gradNorm_vec2(g00, g01, g10, g11);
|
||||
|
||||
/* ------------ */
|
||||
|
||||
/* n00 = dot(g00, vec2(fx.x, fy.x)) */
|
||||
vec2 n00d = {fx[0], fy[0]}; /* n00d = vec2(fx.x, fy.x) */
|
||||
float n00 = glm_vec2_dot(g00, n00d); /* n00 = dot(g00, n00d) */
|
||||
|
||||
/* n10 = dot(g10, vec2(fx.y, fy.y)) */
|
||||
vec2 n10d = {fx[1], fy[1]}; /* n10d = vec2(fx.y, fy.y) */
|
||||
float n10 = glm_vec2_dot(g10, n10d); /* n10 = dot(g10, n10d) */
|
||||
|
||||
/* n01 = dot(g01, vec2(fx.z, fy.z)) */
|
||||
vec2 n01d = {fx[2], fy[2]}; /* n01d = vec2(fx.z, fy.z) */
|
||||
float n01 = glm_vec2_dot(g01, n01d); /* n01 = dot(g01, n01d) */
|
||||
|
||||
/* n11 = dot(g11, vec2(fx.w, fy.w)) */
|
||||
vec2 n11d = {fx[3], fy[3]}; /* n11d = vec2(fx.w, fy.w) */
|
||||
float n11 = glm_vec2_dot(g11, n11d); /* n11 = dot(g11, n11d) */
|
||||
|
||||
/* ------------ */
|
||||
|
||||
/* fade_xyz = fade(vec2(Pf.x, Pf.y)) */
|
||||
vec2 fade_xy;
|
||||
vec2 temp2 = {Pf[0], Pf[1]}; /* temp = vec2(Pf.x, Pf.y) */
|
||||
glm__noiseDetail_fade_vec2(temp2, fade_xy); /* fade_xy = fade(temp) */
|
||||
|
||||
/* n_x = lerp(vec2(n00, n01), vec2(n10, n11), fade_xy.x); */
|
||||
vec2 n_x;
|
||||
vec2 n_x1 = {n00, n01}; /* n_x1 = vec2(n00, n01) */
|
||||
vec2 n_x2 = {n10, n11}; /* n_x2 = vec2(n10, n11) */
|
||||
glm_vec2_lerp(n_x1, n_x2, fade_xy[0], n_x); /* n_x = lerp(n_x1, n_x2, fade_xy.x) */
|
||||
|
||||
/* T n_xy = mix(n_x.x, n_x.y, fade_xy.y); */
|
||||
/* n_xy = lerp(n_x.x, n_x.y, fade_xy.y); */
|
||||
float n_xy = glm_lerp(n_x[0], n_x[1], fade_xy[1]);
|
||||
|
||||
return n_xy * 2.3f;
|
||||
}
|
||||
|
||||
/* Undefine all helper macros */
|
||||
|
||||
#undef glm__noiseDetail_mod289
|
||||
#undef glm__noiseDetail_permute
|
||||
#undef glm__noiseDetail_fade_vec4
|
||||
#undef glm__noiseDetail_fade_vec3
|
||||
#undef glm__noiseDetail_fade_vec2
|
||||
#undef glm__noiseDetail_taylorInvSqrt
|
||||
#undef glm__noiseDetail_gradNorm_vec4
|
||||
#undef glm__noiseDetail_gradNorm_vec3
|
||||
#undef glm__noiseDetail_gradNorm_vec2
|
||||
#undef glm__noiseDetail_i2gxyzw
|
||||
#undef glm__noiseDetail_i2gxyz
|
||||
#undef glm__noiseDetail_i2gxy
|
||||
|
||||
#endif /* cglm_noise_h */
|
||||
@@ -39,6 +39,7 @@
|
||||
CGLM_INLINE void glm_quat_lerp(versor from, versor to, float t, versor dest);
|
||||
CGLM_INLINE void glm_quat_lerpc(versor from, versor to, float t, versor dest);
|
||||
CGLM_INLINE void glm_quat_slerp(versor q, versor r, float t, versor dest);
|
||||
CGLM_INLINE void glm_quat_slerp_longest(versor q, versor r, float t, versor dest);
|
||||
CGLM_INLINE void glm_quat_nlerp(versor q, versor r, float t, versor dest);
|
||||
CGLM_INLINE void glm_quat_look(vec3 eye, versor ori, mat4 dest);
|
||||
CGLM_INLINE void glm_quat_for(vec3 dir, vec3 fwd, vec3 up, versor dest);
|
||||
@@ -122,7 +123,7 @@ glm_quat_identity_array(versor * __restrict q, size_t count) {
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief inits quaterion with raw values
|
||||
* @brief inits quaternion with raw values
|
||||
*
|
||||
* @param[out] q quaternion
|
||||
* @param[in] x x
|
||||
@@ -742,6 +743,52 @@ glm_quat_slerp(versor from, versor to, float t, versor dest) {
|
||||
glm_vec4_scale(q1, 1.0f / sinTheta, dest);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief interpolates between two quaternions
|
||||
* using spherical linear interpolation (SLERP) and always takes the long path
|
||||
*
|
||||
* @param[in] from from
|
||||
* @param[in] to to
|
||||
* @param[in] t amount
|
||||
* @param[out] dest result quaternion
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_quat_slerp_longest(versor from, versor to, float t, versor dest) {
|
||||
CGLM_ALIGN(16) vec4 q1, q2;
|
||||
float cosTheta, sinTheta, angle;
|
||||
|
||||
cosTheta = glm_quat_dot(from, to);
|
||||
glm_quat_copy(from, q1);
|
||||
|
||||
if (fabsf(cosTheta) >= 1.0f) {
|
||||
glm_quat_copy(q1, dest);
|
||||
return;
|
||||
}
|
||||
|
||||
/* longest path */
|
||||
if (!(cosTheta < 0.0f)) {
|
||||
glm_vec4_negate(q1);
|
||||
cosTheta = -cosTheta;
|
||||
}
|
||||
|
||||
sinTheta = sqrtf(1.0f - cosTheta * cosTheta);
|
||||
|
||||
/* LERP to avoid zero division */
|
||||
if (fabsf(sinTheta) < 0.001f) {
|
||||
glm_quat_lerp(from, to, t, dest);
|
||||
return;
|
||||
}
|
||||
|
||||
/* SLERP */
|
||||
angle = acosf(cosTheta);
|
||||
glm_vec4_scale(q1, sinf((1.0f - t) * angle), q1);
|
||||
glm_vec4_scale(to, sinf(t * angle), q2);
|
||||
|
||||
glm_vec4_add(q1, q2, q1);
|
||||
glm_vec4_scale(q1, 1.0f / sinTheta, dest);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief creates view matrix using quaternion as camera orientation
|
||||
*
|
||||
|
||||
@@ -19,8 +19,10 @@
|
||||
#define glmm_load(p) vld1q_f32(p)
|
||||
#define glmm_store(p, a) vst1q_f32(p, a)
|
||||
|
||||
#define glmm_set1(x) vdupq_n_f32(x)
|
||||
#define glmm_128 float32x4_t
|
||||
#define glmm_set1(x) vdupq_n_f32(x)
|
||||
#define glmm_set1_ptr(x) vdupq_n_f32(*x)
|
||||
#define glmm_set1_rval(x) vdupq_n_f32(x)
|
||||
#define glmm_128 float32x4_t
|
||||
|
||||
#define glmm_splat_x(x) vdupq_lane_f32(vget_low_f32(x), 0)
|
||||
#define glmm_splat_y(x) vdupq_lane_f32(vget_low_f32(x), 1)
|
||||
@@ -63,8 +65,21 @@ static inline float32x4_t glmm_max(float32x4_t a, float32x4_t b) { return vmaxq_
|
||||
static inline
|
||||
float32x4_t
|
||||
glmm_vhadd(float32x4_t v) {
|
||||
#if CGLM_ARM64
|
||||
float32x4_t p;
|
||||
p = vpaddq_f32(v, v); /* [a+b, c+d, a+b, c+d] */
|
||||
return vpaddq_f32(p, p); /* [t, t, t, t] */;
|
||||
#else
|
||||
return vaddq_f32(vaddq_f32(glmm_splat_x(v), glmm_splat_y(v)),
|
||||
vaddq_f32(glmm_splat_z(v), glmm_splat_w(v)));
|
||||
#endif
|
||||
/* TODO: measure speed of this compare to above */
|
||||
/* return vdupq_n_f32(vaddvq_f32(v)); */
|
||||
|
||||
/*
|
||||
return vaddq_f32(vaddq_f32(glmm_splat_x(v), glmm_splat_y(v)),
|
||||
vaddq_f32(glmm_splat_z(v), glmm_splat_w(v)));
|
||||
*/
|
||||
/*
|
||||
this seems slower:
|
||||
v = vaddq_f32(v, vrev64q_f32(v));
|
||||
@@ -108,6 +123,12 @@ glmm_dot(float32x4_t a, float32x4_t b) {
|
||||
return glmm_hadd(vmulq_f32(a, b));
|
||||
}
|
||||
|
||||
static inline
|
||||
float32x4_t
|
||||
glmm_vdot(float32x4_t a, float32x4_t b) {
|
||||
return glmm_vhadd(vmulq_f32(a, b));
|
||||
}
|
||||
|
||||
static inline
|
||||
float
|
||||
glmm_norm(float32x4_t a) {
|
||||
|
||||
@@ -12,16 +12,46 @@
|
||||
#include "../../common.h"
|
||||
#include "../intrin.h"
|
||||
|
||||
#include <immintrin.h>
|
||||
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat4_scale_avx(mat4 m, float s) {
|
||||
__m256 y0;
|
||||
y0 = _mm256_set1_ps(s);
|
||||
__m256 y0, y1, y2, y3, y4;
|
||||
|
||||
y0 = glmm_load256(m[0]); /* h g f e d c b a */
|
||||
y1 = glmm_load256(m[2]); /* p o n m l k j i */
|
||||
|
||||
y2 = _mm256_broadcast_ss(&s);
|
||||
|
||||
y3 = _mm256_mul_ps(y0, y2);
|
||||
y4 = _mm256_mul_ps(y1, y2);
|
||||
|
||||
glmm_store256(m[0], y3);
|
||||
glmm_store256(m[2], y4);
|
||||
}
|
||||
|
||||
/* TODO: this must be tested and compared to SSE version, may be slower!!! */
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat4_transp_avx(mat4 m, mat4 dest) {
|
||||
__m256 y0, y1, y2, y3;
|
||||
|
||||
y0 = glmm_load256(m[0]); /* h g f e d c b a */
|
||||
y1 = glmm_load256(m[2]); /* p o n m l k j i */
|
||||
|
||||
y2 = _mm256_unpacklo_ps(y0, y1); /* n f m e j b i a */
|
||||
y3 = _mm256_unpackhi_ps(y0, y1); /* p h o g l d k c */
|
||||
|
||||
glmm_store256(m[0], _mm256_mul_ps(y0, glmm_load256(m[0])));
|
||||
glmm_store256(m[2], _mm256_mul_ps(y0, glmm_load256(m[2])));
|
||||
y0 = _mm256_permute2f128_ps(y2, y3, 0x20); /* l d k c j b i a */
|
||||
y1 = _mm256_permute2f128_ps(y2, y3, 0x31); /* p h o g n f m e */
|
||||
|
||||
y2 = _mm256_unpacklo_ps(y0, y1); /* o k g c m i e a */
|
||||
y3 = _mm256_unpackhi_ps(y0, y1); /* p l h d n j f b */
|
||||
|
||||
y0 = _mm256_permute2f128_ps(y2, y3, 0x20); /* n j f b m i e a */
|
||||
y1 = _mm256_permute2f128_ps(y2, y3, 0x31); /* p l h d o k g c */
|
||||
|
||||
glmm_store256(dest[0], y0);
|
||||
glmm_store256(dest[2], y1);
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
@@ -29,7 +59,8 @@ void
|
||||
glm_mat4_mul_avx(mat4 m1, mat4 m2, mat4 dest) {
|
||||
/* D = R * L (Column-Major) */
|
||||
|
||||
__m256 y0, y1, y2, y3, y4, y5, y6, y7, y8, y9;
|
||||
__m256 y0, y1, y2, y3, y4, y5, y6, y7, y8, y9, y10, y11, y12, y13;
|
||||
__m256i yi0, yi1, yi2, yi3;
|
||||
|
||||
y0 = glmm_load256(m2[0]); /* h g f e d c b a */
|
||||
y1 = glmm_load256(m2[2]); /* p o n m l k j i */
|
||||
@@ -41,35 +72,43 @@ glm_mat4_mul_avx(mat4 m1, mat4 m2, mat4 dest) {
|
||||
y4 = _mm256_permute2f128_ps(y2, y2, 0x03); /* d c b a h g f e */
|
||||
y5 = _mm256_permute2f128_ps(y3, y3, 0x03); /* l k j i p o n m */
|
||||
|
||||
yi0 = _mm256_set_epi32(1, 1, 1, 1, 0, 0, 0, 0);
|
||||
yi1 = _mm256_set_epi32(3, 3, 3, 3, 2, 2, 2, 2);
|
||||
yi2 = _mm256_set_epi32(0, 0, 0, 0, 1, 1, 1, 1);
|
||||
yi3 = _mm256_set_epi32(2, 2, 2, 2, 3, 3, 3, 3);
|
||||
|
||||
/* f f f f a a a a */
|
||||
/* h h h h c c c c */
|
||||
/* e e e e b b b b */
|
||||
/* g g g g d d d d */
|
||||
y6 = _mm256_permutevar_ps(y0, _mm256_set_epi32(1, 1, 1, 1, 0, 0, 0, 0));
|
||||
y7 = _mm256_permutevar_ps(y0, _mm256_set_epi32(3, 3, 3, 3, 2, 2, 2, 2));
|
||||
y8 = _mm256_permutevar_ps(y0, _mm256_set_epi32(0, 0, 0, 0, 1, 1, 1, 1));
|
||||
y9 = _mm256_permutevar_ps(y0, _mm256_set_epi32(2, 2, 2, 2, 3, 3, 3, 3));
|
||||
|
||||
glmm_store256(dest[0],
|
||||
_mm256_add_ps(_mm256_add_ps(_mm256_mul_ps(y2, y6),
|
||||
_mm256_mul_ps(y3, y7)),
|
||||
_mm256_add_ps(_mm256_mul_ps(y4, y8),
|
||||
_mm256_mul_ps(y5, y9))));
|
||||
y6 = _mm256_permutevar_ps(y0, yi0);
|
||||
y7 = _mm256_permutevar_ps(y0, yi1);
|
||||
y8 = _mm256_permutevar_ps(y0, yi2);
|
||||
y9 = _mm256_permutevar_ps(y0, yi3);
|
||||
|
||||
/* n n n n i i i i */
|
||||
/* p p p p k k k k */
|
||||
/* m m m m j j j j */
|
||||
/* o o o o l l l l */
|
||||
y6 = _mm256_permutevar_ps(y1, _mm256_set_epi32(1, 1, 1, 1, 0, 0, 0, 0));
|
||||
y7 = _mm256_permutevar_ps(y1, _mm256_set_epi32(3, 3, 3, 3, 2, 2, 2, 2));
|
||||
y8 = _mm256_permutevar_ps(y1, _mm256_set_epi32(0, 0, 0, 0, 1, 1, 1, 1));
|
||||
y9 = _mm256_permutevar_ps(y1, _mm256_set_epi32(2, 2, 2, 2, 3, 3, 3, 3));
|
||||
y10 = _mm256_permutevar_ps(y1, yi0);
|
||||
y11 = _mm256_permutevar_ps(y1, yi1);
|
||||
y12 = _mm256_permutevar_ps(y1, yi2);
|
||||
y13 = _mm256_permutevar_ps(y1, yi3);
|
||||
|
||||
glmm_store256(dest[2],
|
||||
_mm256_add_ps(_mm256_add_ps(_mm256_mul_ps(y2, y6),
|
||||
_mm256_mul_ps(y3, y7)),
|
||||
_mm256_add_ps(_mm256_mul_ps(y4, y8),
|
||||
_mm256_mul_ps(y5, y9))));
|
||||
y0 = _mm256_mul_ps(y2, y6);
|
||||
y1 = _mm256_mul_ps(y2, y10);
|
||||
|
||||
y0 = glmm256_fmadd(y3, y7, y0);
|
||||
y1 = glmm256_fmadd(y3, y11, y1);
|
||||
|
||||
y0 = glmm256_fmadd(y4, y8, y0);
|
||||
y1 = glmm256_fmadd(y4, y12, y1);
|
||||
|
||||
y0 = glmm256_fmadd(y5, y9, y0);
|
||||
y1 = glmm256_fmadd(y5, y13, y1);
|
||||
|
||||
glmm_store256(dest[0], y0);
|
||||
glmm_store256(dest[2], y1);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
#ifndef cglm_intrin_h
|
||||
#define cglm_intrin_h
|
||||
|
||||
#if defined( _MSC_VER )
|
||||
#if defined(_MSC_VER) && !defined(_M_ARM64EC)
|
||||
# if (defined(_M_AMD64) || defined(_M_X64)) || _M_IX86_FP == 2
|
||||
# ifndef __SSE__
|
||||
# define __SSE__
|
||||
@@ -20,13 +20,37 @@
|
||||
# ifndef __SSE__
|
||||
# define __SSE__
|
||||
# endif
|
||||
#endif
|
||||
# endif
|
||||
/* do not use alignment for older visual studio versions */
|
||||
# if _MSC_VER < 1913 /* Visual Studio 2017 version 15.6 */
|
||||
/* also ARM32 also causes similar error, disable it for now on ARM32 too */
|
||||
# if _MSC_VER < 1913 || _M_ARM /* Visual Studio 2017 version 15.6 */
|
||||
# define CGLM_ALL_UNALIGNED
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef __AVX__
|
||||
# include <immintrin.h>
|
||||
# define CGLM_AVX_FP 1
|
||||
# ifndef __SSE2__
|
||||
# define __SSE2__
|
||||
# endif
|
||||
# ifndef __SSE3__
|
||||
# define __SSE3__
|
||||
# endif
|
||||
# ifndef __SSE4__
|
||||
# define __SSE4__
|
||||
# endif
|
||||
# ifndef __SSE4_1__
|
||||
# define __SSE4_1__
|
||||
# endif
|
||||
# ifndef __SSE4_2__
|
||||
# define __SSE4_2__
|
||||
# endif
|
||||
# ifndef CGLM_SIMD_x86
|
||||
# define CGLM_SIMD_x86
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if defined(__SSE__)
|
||||
# include <xmmintrin.h>
|
||||
# define CGLM_SSE_FP 1
|
||||
@@ -64,14 +88,6 @@
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef __AVX__
|
||||
# include <immintrin.h>
|
||||
# define CGLM_AVX_FP 1
|
||||
# ifndef CGLM_SIMD_x86
|
||||
# define CGLM_SIMD_x86
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* ARM Neon */
|
||||
#if defined(_WIN32) && defined(_MSC_VER)
|
||||
/* TODO: non-ARM stuff already inported, will this be better option */
|
||||
@@ -100,7 +116,7 @@
|
||||
#else /* non-windows */
|
||||
# if defined(__ARM_NEON) || defined(__ARM_NEON__)
|
||||
# include <arm_neon.h>
|
||||
# if defined(__ARM_NEON_FP)
|
||||
# if defined(__ARM_NEON_FP) || defined(__ARM_FP)
|
||||
# define CGLM_NEON_FP 1
|
||||
# endif
|
||||
# ifndef CGLM_SIMD_ARM
|
||||
|
||||
@@ -172,6 +172,8 @@ glm_mat4_det_neon(mat4 mat) {
|
||||
return glmm_hadd(vmulq_f32(x2, r0));
|
||||
}
|
||||
|
||||
/* old one */
|
||||
#if 0
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat4_inv_neon(mat4 mat, mat4 dest) {
|
||||
@@ -297,7 +299,7 @@ glm_mat4_inv_neon(mat4 mat, mat4 dest) {
|
||||
vget_low_f32(vzipq_f32(v2, v3).val[0]));
|
||||
|
||||
/*
|
||||
x0 = glmm_div(glmm_set1(1.0f), glmm_vhadd(vmulq_f32(x0, r0)));
|
||||
x0 = glmm_div(glmm_set1_rval(1.0f), glmm_vhadd(vmulq_f32(x0, r0)));
|
||||
|
||||
glmm_store(dest[0], vmulq_f32(v0, x0));
|
||||
glmm_store(dest[1], vmulq_f32(v1, x0));
|
||||
@@ -312,6 +314,155 @@ glm_mat4_inv_neon(mat4 mat, mat4 dest) {
|
||||
glmm_store(dest[2], glmm_div(v2, x0));
|
||||
glmm_store(dest[3], glmm_div(v3, x0));
|
||||
}
|
||||
#endif
|
||||
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat4_inv_neon(mat4 mat, mat4 dest) {
|
||||
float32x4_t r0, r1, r2, r3,
|
||||
v0, v1, v2, v3, v4, v5,
|
||||
t0, t1, t2;
|
||||
float32x4x2_t a0, a1, a2, a3, a4;
|
||||
float32x4_t s1 = glmm_float32x4_SIGNMASK_PNPN, s2;
|
||||
|
||||
#if !CGLM_ARM64
|
||||
float32x2_t l0, l1;
|
||||
#endif
|
||||
|
||||
s2 = vrev64q_f32(s1);
|
||||
|
||||
/* 127 <- 0 */
|
||||
r0 = glmm_load(mat[0]); /* d c b a */
|
||||
r1 = glmm_load(mat[1]); /* h g f e */
|
||||
r2 = glmm_load(mat[2]); /* l k j i */
|
||||
r3 = glmm_load(mat[3]); /* p o n m */
|
||||
|
||||
a1 = vzipq_f32(r0, r2); /* l d k c, j b i a */
|
||||
a2 = vzipq_f32(r1, r3); /* p h o g, n f m e */
|
||||
a3 = vzipq_f32(a2.val[0], a1.val[0]); /* j n b f, i m a e */
|
||||
a4 = vzipq_f32(a2.val[1], a1.val[1]); /* l p d h, k o c g */
|
||||
|
||||
v0 = vextq_f32(a1.val[0], a1.val[1], 2); /* k c j b */
|
||||
v1 = vextq_f32(a2.val[0], a2.val[1], 2); /* o g n f */
|
||||
v2 = vextq_f32(a1.val[1], a2.val[0], 2); /* m e l d */
|
||||
v3 = vextq_f32(a2.val[1], a1.val[0], 2); /* i a p h */
|
||||
v4 = vextq_f32(v1, v2, 2); /* l d o g */
|
||||
v5 = vextq_f32(v0, v3, 2); /* p h k c */
|
||||
|
||||
/* c2 = c * h - g * d c12 = a * g - c * e c8 = a * f - b * e
|
||||
c1 = k * p - o * l c11 = i * o - k * m c7 = i * n - j * m
|
||||
c4 = h * a - d * e c6 = b * h - d * f c10 = b * g - c * f
|
||||
c3 = p * i - l * m c5 = j * p - l * n c9 = j * o - k * n */
|
||||
t0 = vmulq_f32(v5, v3);
|
||||
t1 = vmulq_f32(a1.val[0], a2.val[1]);
|
||||
t2 = vmulq_f32(a1.val[0], v1);
|
||||
|
||||
t0 = glmm_fnmadd(v4, v2, t0);
|
||||
t1 = glmm_fnmadd(a1.val[1], a2.val[0], t1);
|
||||
t2 = glmm_fnmadd(v0, a2.val[0], t2);
|
||||
|
||||
t0 = vrev64q_f32(t0);
|
||||
t1 = vrev64q_f32(t1);
|
||||
t2 = vrev64q_f32(t2);
|
||||
|
||||
/* det */
|
||||
v0 = vrev64q_f32(t2);
|
||||
v1 = vextq_f32(t1, t1, 2);
|
||||
v0 = vmulq_f32(t0, v0);
|
||||
v1 = vrev64q_f32(v1);
|
||||
v1 = vmulq_f32(v1, t1);
|
||||
|
||||
/* c3 * c10 + c4 * c9 + c1 * c8 + c2 * c7 */
|
||||
#if CGLM_ARM64
|
||||
v0 = vpaddq_f32(v0, v0);
|
||||
v0 = vpaddq_f32(v0, v0);
|
||||
#else
|
||||
l0 = vget_low_f32(v0);
|
||||
l1 = vget_high_f32(v0);
|
||||
|
||||
l0 = vpadd_f32(l0, l0); /* [a+b, a+b] */
|
||||
l1 = vpadd_f32(l1, l1); /* [c+d, c+d] */
|
||||
l0 = vadd_f32(l0, l1); /* [sum, sum] */
|
||||
|
||||
v0 = vcombine_f32(l0, l0);
|
||||
#endif
|
||||
|
||||
/* c5 * c12 + c6 * c11 */
|
||||
#if CGLM_ARM64
|
||||
v1 = vpaddq_f32(v1, v1);
|
||||
#else
|
||||
l0 = vget_low_f32(v1);
|
||||
l1 = vget_high_f32(v1);
|
||||
|
||||
l0 = vpadd_f32(l0, l0); /* [a+b, a+b] */
|
||||
l1 = vpadd_f32(l1, l1); /* [c+d, c+d] */
|
||||
|
||||
v1 = vcombine_f32(l0, l1);
|
||||
#endif
|
||||
|
||||
v0 = vsubq_f32(v0, v1); /* det */
|
||||
|
||||
/* inv div */
|
||||
v1 = vdupq_n_f32(1.0f);
|
||||
v0 = glmm_div(v1, v0); /* inv div */
|
||||
|
||||
/* multiply t0,t1,t2 by idt to reduce 1mul below: 2eor+4mul vs 3mul+4eor */
|
||||
t0 = vmulq_f32(t0, v0);
|
||||
t1 = vmulq_f32(t1, v0);
|
||||
t2 = vmulq_f32(t2, v0);
|
||||
|
||||
a0 = vzipq_f32(t0, t0); /* c4 c4 c3 c3, c2 c2 c1 c1 */
|
||||
a1 = vzipq_f32(t1, t1); /* c6 c6 c5 c5, c12 c12 c11 c11 */
|
||||
a2 = vzipq_f32(t2, t2); /* c10 c10 c9 c9, c8 c8 c7 c7 */
|
||||
|
||||
/* result */
|
||||
|
||||
/* dest[0][0] = (f * c1 - g * c5 + h * c9) * idt;
|
||||
dest[0][1] = (b * c1 - c * c5 + d * c9) * ndt;
|
||||
dest[0][2] = (n * c2 - o * c6 + p * c10) * idt;
|
||||
dest[0][3] = (j * c2 - k * c6 + l * c10) * ndt;
|
||||
|
||||
dest[1][0] = (e * c1 - g * c3 + h * c11) * ndt;
|
||||
dest[1][1] = (a * c1 - c * c3 + d * c11) * idt;
|
||||
dest[1][2] = (m * c2 - o * c4 + p * c12) * ndt;
|
||||
dest[1][3] = (i * c2 - k * c4 + l * c12) * idt;
|
||||
|
||||
dest[2][0] = (e * c5 - f * c3 + h * c7) * idt;
|
||||
dest[2][1] = (a * c5 - b * c3 + d * c7) * ndt;
|
||||
dest[2][2] = (m * c6 - n * c4 + p * c8) * idt;
|
||||
dest[2][3] = (i * c6 - j * c4 + l * c8) * ndt;
|
||||
|
||||
dest[3][0] = (e * c9 - f * c11 + g * c7) * ndt;
|
||||
dest[3][1] = (a * c9 - b * c11 + c * c7) * idt;
|
||||
dest[3][2] = (m * c10 - n * c12 + o * c8) * ndt;
|
||||
dest[3][3] = (i * c10 - j * c12 + k * c8) * idt; */
|
||||
|
||||
r0 = vmulq_f32(a3.val[1], a0.val[0]);
|
||||
r1 = vmulq_f32(a3.val[0], a0.val[0]);
|
||||
r2 = vmulq_f32(a3.val[0], a1.val[1]);
|
||||
r3 = vmulq_f32(a3.val[0], a2.val[1]);
|
||||
|
||||
r0 = glmm_fnmadd(a4.val[0], a1.val[1], r0);
|
||||
r1 = glmm_fnmadd(a4.val[0], a0.val[1], r1);
|
||||
r2 = glmm_fnmadd(a3.val[1], a0.val[1], r2);
|
||||
r3 = glmm_fnmadd(a3.val[1], a1.val[0], r3);
|
||||
|
||||
r0 = glmm_fmadd(a4.val[1], a2.val[1], r0);
|
||||
r1 = glmm_fmadd(a4.val[1], a1.val[0], r1);
|
||||
r2 = glmm_fmadd(a4.val[1], a2.val[0], r2);
|
||||
r3 = glmm_fmadd(a4.val[0], a2.val[0], r3);
|
||||
|
||||
/* 4xor may be fastart then 4mul, see above */
|
||||
r0 = glmm_xor(r0, s1);
|
||||
r1 = glmm_xor(r1, s2);
|
||||
r2 = glmm_xor(r2, s1);
|
||||
r3 = glmm_xor(r3, s2);
|
||||
|
||||
glmm_store(dest[0], r0);
|
||||
glmm_store(dest[1], r1);
|
||||
glmm_store(dest[2], r2);
|
||||
glmm_store(dest[3], r3);
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif /* cglm_mat4_neon_h */
|
||||
|
||||
@@ -18,7 +18,7 @@ CGLM_INLINE
|
||||
void
|
||||
glm_mat4_scale_sse2(mat4 m, float s) {
|
||||
__m128 x0;
|
||||
x0 = _mm_set1_ps(s);
|
||||
x0 = glmm_set1(s);
|
||||
|
||||
glmm_store(m[0], _mm_mul_ps(glmm_load(m[0]), x0));
|
||||
glmm_store(m[1], _mm_mul_ps(glmm_load(m[1]), x0));
|
||||
@@ -295,6 +295,8 @@ glm_mat4_inv_fast_sse2(mat4 mat, mat4 dest) {
|
||||
glmm_store(dest[3], _mm_mul_ps(v3, x0));
|
||||
}
|
||||
|
||||
/* old one */
|
||||
#if 0
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat4_inv_sse2(mat4 mat, mat4 dest) {
|
||||
@@ -424,13 +426,148 @@ glm_mat4_inv_sse2(mat4 mat, mat4 dest) {
|
||||
x1 = _mm_shuffle_ps(v2, v3, _MM_SHUFFLE(0, 0, 0, 0));
|
||||
x0 = _mm_shuffle_ps(x0, x1, _MM_SHUFFLE(2, 0, 2, 0));
|
||||
|
||||
x0 = _mm_div_ps(_mm_set1_ps(1.0f), glmm_vhadd(_mm_mul_ps(x0, r0)));
|
||||
x0 = _mm_div_ps(glmm_set1(1.0f), glmm_vhadd(_mm_mul_ps(x0, r0)));
|
||||
|
||||
glmm_store(dest[0], _mm_mul_ps(v0, x0));
|
||||
glmm_store(dest[1], _mm_mul_ps(v1, x0));
|
||||
glmm_store(dest[2], _mm_mul_ps(v2, x0));
|
||||
glmm_store(dest[3], _mm_mul_ps(v3, x0));
|
||||
}
|
||||
#endif
|
||||
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat4_inv_sse2(mat4 mat, mat4 dest) {
|
||||
__m128 r0, r1, r2, r3, s1, s2,
|
||||
v0, v1, v2, v3, v4, v5,
|
||||
t0, t1, t2,
|
||||
x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13;
|
||||
|
||||
/* s1 = _mm_set_ps(-0.f, 0.f, -0.f, 0.f); */
|
||||
s1 = glmm_float32x4_SIGNMASK_NPNP;
|
||||
s2 = glmm_shuff1(s1, 2, 1, 2, 1);
|
||||
|
||||
/* 127 <- 0 */
|
||||
r1 = glmm_load(mat[1]); /* h g f e */
|
||||
r0 = glmm_load(mat[0]); /* d c b a */
|
||||
r3 = glmm_load(mat[3]); /* p o n m */
|
||||
r2 = glmm_load(mat[2]); /* l k j i */
|
||||
|
||||
x4 = _mm_unpackhi_ps(r0, r2); /* l d k c */
|
||||
x5 = _mm_unpacklo_ps(r0, r2); /* j b i a */
|
||||
x6 = _mm_unpackhi_ps(r1, r3); /* p h o g */
|
||||
x7 = _mm_unpacklo_ps(r1, r3); /* n f m e */
|
||||
|
||||
x0 = _mm_unpackhi_ps(x7, x5); /* j n b f */
|
||||
x1 = _mm_unpacklo_ps(x7, x5); /* i m a e */
|
||||
x2 = _mm_unpackhi_ps(x6, x4); /* l p d h */
|
||||
x3 = _mm_unpacklo_ps(x6, x4); /* k o c g */
|
||||
|
||||
/* c2 = c * h - d * g c12 = a * g - c * e c8 = a * f - b * e
|
||||
c1 = k * p - l * o c11 = i * o - k * m c7 = i * n - j * m
|
||||
c4 = a * h - d * e c6 = b * h - d * f c10 = b * g - c * f
|
||||
c3 = i * p - l * m c5 = j * p - l * n c9 = j * o - k * n */
|
||||
|
||||
x8 = _mm_shuffle_ps(x0, x3, _MM_SHUFFLE(3, 1, 3, 1)); /* k c j b */
|
||||
x9 = _mm_shuffle_ps(x0, x3, _MM_SHUFFLE(2, 0, 2, 0)); /* o g n f */
|
||||
|
||||
x10 = glmm_shuff1(x2, 2, 0, 2, 0); /* p h p h */
|
||||
x11 = glmm_shuff1(x2, 3, 1, 3, 1); /* l d l d */
|
||||
|
||||
#if 0 /* TODO measure both */
|
||||
x12 = _mm_shuffle_ps(x4, x5, _MM_SHUFFLE(1, 0, 1, 0)); /* i a k c */
|
||||
x13 = _mm_shuffle_ps(x6, x7, _MM_SHUFFLE(1, 0, 1, 0)); /* m e o g */
|
||||
#else
|
||||
x12 = _mm_movelh_ps(x4, x5); /* i a k c */
|
||||
x13 = _mm_movelh_ps(x6, x7); /* m e o g */
|
||||
#endif
|
||||
|
||||
t0 = _mm_mul_ps(x12, x10);
|
||||
t1 = _mm_mul_ps(x5, x6);
|
||||
t2 = _mm_mul_ps(x5, x9);
|
||||
|
||||
t0 = glmm_fnmadd(x11, x13, t0);
|
||||
t1 = glmm_fnmadd(x4, x7, t1);
|
||||
t2 = glmm_fnmadd(x8, x7, t2);
|
||||
|
||||
/* det */
|
||||
/* v0: c3 * c10 + c4 * c9 + c1 * c8 + c2 * c7 */
|
||||
/* v1: c5 * c12 + c6 * c11 */
|
||||
|
||||
v5 = glmm_set1_rval(1.0f);
|
||||
v0 = glmm_shuff1(t2, 2, 3, 0, 1);
|
||||
v1 = glmm_shuff1(t1, 0, 1, 2, 3);
|
||||
v0 = _mm_mul_ps(t0, v0);
|
||||
v1 = _mm_mul_ps(t1, v1);
|
||||
v2 = glmm_shuff1(v1, 1, 0, 0, 1);
|
||||
v3 = glmm_shuff1(v0, 0, 1, 2, 3);
|
||||
v1 = _mm_add_ps(v1, v2);
|
||||
v0 = _mm_add_ps(v0, v3);
|
||||
v2 = glmm_shuff1(v0, 1, 0, 0, 1);
|
||||
v0 = _mm_add_ps(v0, v2);
|
||||
|
||||
v0 = _mm_sub_ps(v0, v1); /* det */
|
||||
v0 = _mm_div_ps(v5, v0); /* idt */
|
||||
|
||||
/* multiply t0,t1,t2 by idt to reduce 1mul below: 2eor+4mul vs 3mul+4eor */
|
||||
t0 = _mm_mul_ps(t0, v0);
|
||||
t1 = _mm_mul_ps(t1, v0);
|
||||
t2 = _mm_mul_ps(t2, v0);
|
||||
|
||||
v0 = glmm_shuff1(t0, 0, 0, 1, 1); /* c2 c2 c1 c1 */
|
||||
v1 = glmm_shuff1(t0, 2, 2, 3, 3); /* c4 c4 c3 c3 */
|
||||
v2 = glmm_shuff1(t1, 0, 0, 1, 1); /* c12 c12 c11 c11 */
|
||||
v3 = glmm_shuff1(t1, 2, 2, 3, 3); /* c6 c6 c5 c5 */
|
||||
v4 = glmm_shuff1(t2, 0, 0, 1, 1); /* c8 c8 c7 c7 */
|
||||
v5 = glmm_shuff1(t2, 2, 2, 3, 3); /* c10 c10 c9 c9 */
|
||||
|
||||
/* result */
|
||||
|
||||
/* dest[0][0] = (f * c1 - g * c5 + h * c9) * idt;
|
||||
dest[0][1] = (b * c1 - c * c5 + d * c9) * ndt;
|
||||
dest[0][2] = (n * c2 - o * c6 + p * c10) * idt;
|
||||
dest[0][3] = (j * c2 - k * c6 + l * c10) * ndt;
|
||||
|
||||
dest[1][0] = (e * c1 - g * c3 + h * c11) * ndt;
|
||||
dest[1][1] = (a * c1 - c * c3 + d * c11) * idt;
|
||||
dest[1][2] = (m * c2 - o * c4 + p * c12) * ndt;
|
||||
dest[1][3] = (i * c2 - k * c4 + l * c12) * idt;
|
||||
|
||||
dest[2][0] = (e * c5 - f * c3 + h * c7) * idt;
|
||||
dest[2][1] = (a * c5 - b * c3 + d * c7) * ndt;
|
||||
dest[2][2] = (m * c6 - n * c4 + p * c8) * idt;
|
||||
dest[2][3] = (i * c6 - j * c4 + l * c8) * ndt;
|
||||
|
||||
dest[3][0] = (e * c9 - f * c11 + g * c7) * ndt;
|
||||
dest[3][1] = (a * c9 - b * c11 + c * c7) * idt;
|
||||
dest[3][2] = (m * c10 - n * c12 + o * c8) * ndt;
|
||||
dest[3][3] = (i * c10 - j * c12 + k * c8) * idt; */
|
||||
|
||||
r0 = _mm_mul_ps(x0, v0);
|
||||
r1 = _mm_mul_ps(x1, v0);
|
||||
r2 = _mm_mul_ps(x1, v3);
|
||||
r3 = _mm_mul_ps(x1, v5);
|
||||
|
||||
r0 = glmm_fnmadd(x3, v3, r0);
|
||||
r1 = glmm_fnmadd(x3, v1, r1);
|
||||
r2 = glmm_fnmadd(x0, v1, r2);
|
||||
r3 = glmm_fnmadd(x0, v2, r3);
|
||||
|
||||
r0 = glmm_fmadd(x2, v5, r0);
|
||||
r1 = glmm_fmadd(x2, v2, r1);
|
||||
r2 = glmm_fmadd(x2, v4, r2);
|
||||
r3 = glmm_fmadd(x3, v4, r3);
|
||||
|
||||
/* 4xor may be fastart then 4mul, see above */
|
||||
r0 = _mm_xor_ps(r0, s1);
|
||||
r1 = _mm_xor_ps(r1, s2);
|
||||
r2 = _mm_xor_ps(r2, s1);
|
||||
r3 = _mm_xor_ps(r3, s2);
|
||||
|
||||
glmm_store(dest[0], r0);
|
||||
glmm_store(dest[1], r1);
|
||||
glmm_store(dest[2], r2);
|
||||
glmm_store(dest[3], r3);
|
||||
}
|
||||
#endif
|
||||
#endif /* cglm_mat_sse_h */
|
||||
|
||||
@@ -14,8 +14,10 @@
|
||||
#define glmm_load(p) wasm_v128_load(p)
|
||||
#define glmm_store(p, a) wasm_v128_store(p, (a))
|
||||
|
||||
#define glmm_set1(x) wasm_f32x4_splat(x)
|
||||
#define glmm_128 v128_t
|
||||
#define glmm_set1(x) wasm_f32x4_splat(x)
|
||||
#define glmm_set1_ptr(x) wasm_f32x4_splat(*x)
|
||||
#define glmm_set1_rval(x) wasm_f32x4_splat(x)
|
||||
#define glmm_128 v128_t
|
||||
|
||||
#define glmm_shuff1(xmm, z, y, x, w) wasm_i32x4_shuffle(xmm, xmm, w, x, y, z)
|
||||
|
||||
|
||||
@@ -18,31 +18,46 @@
|
||||
# define glmm_store(p, a) _mm_store_ps(p, a)
|
||||
#endif
|
||||
|
||||
#define glmm_set1(x) _mm_set1_ps(x)
|
||||
#define glmm_128 __m128
|
||||
|
||||
#if defined(CGLM_USE_INT_DOMAIN) && defined(__SSE2__)
|
||||
#ifdef __AVX__
|
||||
# define glmm_shuff1(xmm, z, y, x, w) \
|
||||
_mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(xmm), \
|
||||
_MM_SHUFFLE(z, y, x, w)))
|
||||
_mm_permute_ps((xmm), _MM_SHUFFLE(z, y, x, w))
|
||||
#else
|
||||
# define glmm_shuff1(xmm, z, y, x, w) \
|
||||
# if !defined(CGLM_NO_INT_DOMAIN) && defined(__SSE2__)
|
||||
# define glmm_shuff1(xmm, z, y, x, w) \
|
||||
_mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(xmm), \
|
||||
_MM_SHUFFLE(z, y, x, w)))
|
||||
# else
|
||||
# define glmm_shuff1(xmm, z, y, x, w) \
|
||||
_mm_shuffle_ps(xmm, xmm, _MM_SHUFFLE(z, y, x, w))
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#define glmm_splat(x, lane) glmm_shuff1(x, lane, lane, lane, lane)
|
||||
|
||||
#define glmm_splat_x(x) glmm_splat(x, 0)
|
||||
#define glmm_splat_y(x) glmm_splat(x, 1)
|
||||
#define glmm_splat_z(x) glmm_splat(x, 2)
|
||||
#define glmm_splat_w(x) glmm_splat(x, 3)
|
||||
#ifdef __AVX__
|
||||
# define glmm_set1(x) _mm_broadcast_ss(&x)
|
||||
# define glmm_set1_ptr(x) _mm_broadcast_ss(x)
|
||||
# define glmm_set1_rval(x) _mm_set1_ps(x)
|
||||
# ifdef __AVX2__
|
||||
# define glmm_splat_x(x) _mm_broadcastss_ps(x)
|
||||
# else
|
||||
# define glmm_splat_x(x) _mm_permute_ps(x, _MM_SHUFFLE(0, 0, 0, 0))
|
||||
# endif
|
||||
# define glmm_splat_y(x) _mm_permute_ps(x, _MM_SHUFFLE(1, 1, 1, 1))
|
||||
# define glmm_splat_z(x) _mm_permute_ps(x, _MM_SHUFFLE(2, 2, 2, 2))
|
||||
# define glmm_splat_w(x) _mm_permute_ps(x, _MM_SHUFFLE(3, 3, 3, 3))
|
||||
#else
|
||||
# define glmm_set1(x) _mm_set1_ps(x)
|
||||
# define glmm_set1_ptr(x) _mm_set1_ps(*x)
|
||||
# define glmm_set1_rval(x) _mm_set1_ps(x)
|
||||
|
||||
/* glmm_shuff1x() is DEPRECATED!, use glmm_splat() */
|
||||
#define glmm_shuff1x(xmm, x) glmm_shuff1(xmm, x, x, x, x)
|
||||
|
||||
#define glmm_shuff2(a, b, z0, y0, x0, w0, z1, y1, x1, w1) \
|
||||
glmm_shuff1(_mm_shuffle_ps(a, b, _MM_SHUFFLE(z0, y0, x0, w0)), \
|
||||
z1, y1, x1, w1)
|
||||
# define glmm_splat_x(x) glmm_splat(x, 0)
|
||||
# define glmm_splat_y(x) glmm_splat(x, 1)
|
||||
# define glmm_splat_z(x) glmm_splat(x, 2)
|
||||
# define glmm_splat_w(x) glmm_splat(x, 3)
|
||||
#endif
|
||||
|
||||
#ifdef __AVX__
|
||||
# ifdef CGLM_ALL_UNALIGNED
|
||||
@@ -86,7 +101,7 @@
|
||||
#if defined(__SSE2__)
|
||||
# define glmm_float32x4_SIGNMASK_NEG _mm_castsi128_ps(_mm_set1_epi32(GLMM_NEGZEROf)) /* _mm_set1_ps(-0.0f) */
|
||||
#else
|
||||
# define glmm_float32x4_SIGNMASK_NEG _mm_set1_ps(GLMM_NEGZEROf)
|
||||
# define glmm_float32x4_SIGNMASK_NEG glmm_set1(GLMM_NEGZEROf)
|
||||
#endif
|
||||
|
||||
#define glmm_float32x8_SIGNMASK_NEG _mm256_castsi256_ps(_mm256_set1_epi32(GLMM_NEGZEROf))
|
||||
|
||||
@@ -31,6 +31,7 @@ extern "C" {
|
||||
#include "struct/affine.h"
|
||||
#include "struct/frustum.h"
|
||||
#include "struct/plane.h"
|
||||
#include "struct/noise.h"
|
||||
#include "struct/box.h"
|
||||
#include "struct/color.h"
|
||||
#include "struct/io.h"
|
||||
|
||||
@@ -62,7 +62,7 @@ glms_aabb2d_(merge)(vec2s aabb1[2], vec2s aabb2[2], vec2s 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
|
||||
*
|
||||
@@ -86,7 +86,7 @@ glms_aabb2d_(crop)(vec2s aabb[2], vec2s cropAabb[2], vec2s 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
|
||||
*
|
||||
@@ -137,8 +137,27 @@ glms_aabb2d_(isvalid)(vec2s aabb[2]) {
|
||||
*/
|
||||
CGLM_INLINE
|
||||
float
|
||||
glms_aabb2d_(size)(vec2s aabb[2]) {
|
||||
return glm_vec2_distance(aabb[0].raw, aabb[1].raw);
|
||||
glms_aabb2d_(diag)(vec2s aabb[2]) {
|
||||
vec2 rawAabb[2];
|
||||
glms_vec2_(unpack)(rawAabb, aabb, 2);
|
||||
return glm_aabb2d_diag(rawAabb);
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* @brief size of aabb
|
||||
*
|
||||
* @param[in] aabb bounding aabb
|
||||
* @param[out] dest size
|
||||
*/
|
||||
CGLM_INLINE
|
||||
vec2s
|
||||
glms_aabb2d_(sizev)(vec2s aabb[2]) {
|
||||
vec2s size;
|
||||
vec2 rawAabb[2];
|
||||
glms_vec2_(unpack)(rawAabb, aabb, 2);
|
||||
glm_aabb2d_sizev(rawAabb, size.raw);
|
||||
return size;
|
||||
}
|
||||
|
||||
/*!
|
||||
@@ -232,4 +251,3 @@ glms_aabb2d_(contains)(vec2s aabb[2], vec2s other[2]) {
|
||||
}
|
||||
|
||||
#endif /* cglms_aabb2ds_h */
|
||||
|
||||
|
||||
@@ -62,7 +62,7 @@ glms_aabb_(merge)(vec3s box1[2], vec3s box2[2], vec3s 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
|
||||
*
|
||||
@@ -86,7 +86,7 @@ glms_aabb_(crop)(vec3s box[2], vec3s cropBox[2], vec3s 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
|
||||
*
|
||||
|
||||
@@ -238,7 +238,7 @@ glms_ivec2_(subs)(ivec2s v, int s) {
|
||||
/*!
|
||||
* @brief multiply vector [a] with vector [b] and store result in [dest]
|
||||
*
|
||||
* @param[in] a frist vector
|
||||
* @param[in] a first vector
|
||||
* @param[in] b second vector
|
||||
* @returns destination
|
||||
*/
|
||||
|
||||
@@ -163,7 +163,7 @@ glms_ivec3_(dot)(ivec3s a, ivec3s b) {
|
||||
* @brief norm * norm (magnitude) of vec
|
||||
*
|
||||
* 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
|
||||
*
|
||||
* @param[in] v vector
|
||||
@@ -253,7 +253,7 @@ glms_ivec3_(subs)(ivec3s v, int s) {
|
||||
/*!
|
||||
* @brief multiply vector [a] with vector [b] and store result in [dest]
|
||||
*
|
||||
* @param[in] a frist vector
|
||||
* @param[in] a first vector
|
||||
* @param[in] b second vector
|
||||
* @returns destination
|
||||
*/
|
||||
|
||||
@@ -201,7 +201,7 @@ glms_ivec4_(subs)(ivec4s v, int s) {
|
||||
/*!
|
||||
* @brief multiply vector [a] with vector [b] and store result in [dest]
|
||||
*
|
||||
* @param[in] a frist vector
|
||||
* @param[in] a first vector
|
||||
* @param[in] b second vector
|
||||
* @returns destination
|
||||
*/
|
||||
|
||||
@@ -13,21 +13,20 @@
|
||||
GLM_MAT2_ZERO
|
||||
|
||||
Functions:
|
||||
CGLM_INLINE void glms_mat2_identity(mat2 mat)
|
||||
CGLM_INLINE void glms_mat2_identity_array(mat2 * restrict mat, size_t count)
|
||||
CGLM_INLINE void glms_mat2_zero(mat2 mat)
|
||||
CGLM_INLINE void glms_mat2_mul(mat2 m1, mat2 m2, mat2 dest)
|
||||
CGLM_INLINE void glms_mat2_transpose_to(mat2 m, mat2 dest)
|
||||
CGLM_INLINE void glms_mat2_transpose(mat2 m)
|
||||
CGLM_INLINE void glms_mat2_mulv(mat2 m, vec2 v, vec2 dest)
|
||||
CGLM_INLINE float glms_mat2_trace(mat2 m)
|
||||
CGLM_INLINE void glms_mat2_scale(mat2 m, float s)
|
||||
CGLM_INLINE float glms_mat2_det(mat2 mat)
|
||||
CGLM_INLINE void glms_mat2_inv(mat2 mat, mat2 dest)
|
||||
CGLM_INLINE void glms_mat2_swap_col(mat2 mat, int col1, int col2)
|
||||
CGLM_INLINE void glms_mat2_swap_row(mat2 mat, int row1, int row2)
|
||||
CGLM_INLINE float glms_mat2_rmc(vec2 r, mat2 m, vec2 c)
|
||||
CGLM_INLINE mat2s glms_mat2_make(const float * __restrict src);
|
||||
CGLM_INLINE mat2s glms_mat2_identity(void)
|
||||
CGLM_INLINE void glms_mat2_identity_array(mat2 * restrict mats, size_t count)
|
||||
CGLM_INLINE mat2s glms_mat2_zero(void)
|
||||
CGLM_INLINE mat2s glms_mat2_mul(mat2 m1, mat2 m2)
|
||||
CGLM_INLINE vec2s glms_mat2_mulv(mat2 m, vec2 v)
|
||||
CGLM_INLINE mat2s glms_mat2_transpose(mat2 m)
|
||||
CGLM_INLINE mat2s glms_mat2_scale(mat2 m, float s)
|
||||
CGLM_INLINE mat2s glms_mat2_inv(mat2 m)
|
||||
CGLM_INLINE mat2s glms_mat2_swap_col(mat2 mat, int col1, int col2)
|
||||
CGLM_INLINE mat2s glms_mat2_swap_row(mat2 mat, int row1, int row2)
|
||||
CGLM_INLINE float glms_mat2_det(mat2 m)
|
||||
CGLM_INLINE float glms_mat2_trace(mat2 m)
|
||||
CGLM_INLINE float glms_mat2_rmc(vec2 r, mat2 m, vec2 c)
|
||||
*/
|
||||
|
||||
#ifndef cglms_mat2_h
|
||||
@@ -48,7 +47,23 @@
|
||||
#define GLMS_MAT2_ZERO ((mat2s)GLMS_MAT2_ZERO_INIT)
|
||||
|
||||
/*!
|
||||
* @brief make given matrix identity. It is identical with below,
|
||||
* @brief Returns mat2s (r) from pointer (src).
|
||||
*
|
||||
* @param[in] src pointer to an array of floats
|
||||
* @return[out] r constructed mat2s from raw pointer
|
||||
*/
|
||||
CGLM_INLINE
|
||||
mat2s
|
||||
glms_mat2_(make)(const float * __restrict src) {
|
||||
mat2s r;
|
||||
glm_mat2_make(src, r.raw);
|
||||
return r;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Return a identity mat2s (r).
|
||||
*
|
||||
* 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);
|
||||
*
|
||||
@@ -59,7 +74,7 @@
|
||||
* mat2 mat = GLM_MAT2_IDENTITY_INIT;
|
||||
* @endcode
|
||||
*
|
||||
* @returns identity matrix
|
||||
* @return[out] r constructed mat2s from raw pointer
|
||||
*/
|
||||
CGLM_INLINE
|
||||
mat2s
|
||||
@@ -70,28 +85,26 @@ glms_mat2_(identity)(void) {
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief make given matrix array's each element identity matrix
|
||||
* @brief Given an array of mat2s’s (mats) make each matrix an identity matrix.
|
||||
*
|
||||
* @param[in, out] mat matrix array (must be aligned (16)
|
||||
* if alignment is not disabled)
|
||||
*
|
||||
* @param[in] count count of matrices
|
||||
* @param[in, out] mats Array of mat2s’s (must be aligned (16/32) if alignment is not disabled)
|
||||
* @param[in] count Array size of mats or number of matrices
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glms_mat2_(identity_array)(mat2s * __restrict mat, size_t count) {
|
||||
glms_mat2_(identity_array)(mat2s * __restrict mats, size_t count) {
|
||||
CGLM_ALIGN_MAT mat2s t = GLMS_MAT2_IDENTITY_INIT;
|
||||
size_t i;
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
glm_mat2_copy(t.raw, mat[i].raw);
|
||||
glm_mat2_copy(t.raw, mats[i].raw);
|
||||
}
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief make given matrix zero.
|
||||
* @brief Return zero'd out mat2 (r).
|
||||
*
|
||||
* @returns matrix
|
||||
* @return[out] r constructed mat2s from raw pointer
|
||||
*/
|
||||
CGLM_INLINE
|
||||
mat2s
|
||||
@@ -102,19 +115,18 @@ glms_mat2_(zero)(void) {
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief multiply m1 and m2 to dest
|
||||
* @brief Multiply mat2 (m1) by mat2 (m2) and return in mat2s (r)
|
||||
*
|
||||
* m1, m2 and dest matrices can be same matrix, it is possible to write this:
|
||||
* m1 and m2 matrices can be the same matrix, it is possible to write this:
|
||||
*
|
||||
* @code
|
||||
* mat2 m = GLM_MAT2_IDENTITY_INIT;
|
||||
* r = glms_mat2_mul(m, m);
|
||||
* mat2s r = glms_mat2_mul(m, m);
|
||||
* @endcode
|
||||
*
|
||||
* @param[in] m1 left matrix
|
||||
* @param[in] m2 right matrix
|
||||
*
|
||||
* @returns destination matrix
|
||||
* @param[in] m1 mat2s (left)
|
||||
* @param[in] m2 mat2s (right)
|
||||
* @return[out] r constructed mat2s from raw pointers
|
||||
*/
|
||||
CGLM_INLINE
|
||||
mat2s
|
||||
@@ -124,26 +136,12 @@ glms_mat2_(mul)(mat2s m1, mat2s m2) {
|
||||
return r;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief transpose mat2
|
||||
/*
|
||||
* @brief Multiply mat2s (m) by vec2s (v) and return in vec2s (r).
|
||||
*
|
||||
* @param[in] m matrix to transpose
|
||||
*
|
||||
* @returns transposed matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
mat2s
|
||||
glms_mat2_(transpose)(mat2s m) {
|
||||
glm_mat2_transpose(m.raw);
|
||||
return m;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief multiply mat2 with vec2 (column vector) and store in dest vector
|
||||
*
|
||||
* @param[in] m mat2 (left)
|
||||
* @param[in] v vec2 (right, column vector)
|
||||
* @returns vec2 (result, column vector)
|
||||
* @param[in] m mat2s (left)
|
||||
* @param[in] v vec2s (right, column vector)
|
||||
* @return[out] r constructed vec2s from raw pointers
|
||||
*/
|
||||
CGLM_INLINE
|
||||
vec2s
|
||||
@@ -154,26 +152,24 @@ glms_mat2_(mulv)(mat2s m, vec2s v) {
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief trace of matrix
|
||||
* @brief Transpose mat2s (m) and store result in the same matrix.
|
||||
*
|
||||
* sum of the elements on the main diagonal from upper left to the lower right
|
||||
*
|
||||
* @param[in] m matrix
|
||||
* @param[in] m mat2s (src)
|
||||
* @return[out] m constructed mat2s from raw pointers
|
||||
*/
|
||||
CGLM_INLINE
|
||||
float
|
||||
glms_mat2_(trace)(mat2s m) {
|
||||
return glm_mat2_trace(m.raw);
|
||||
mat2s
|
||||
glms_mat2_(transpose)(mat2s m) {
|
||||
glm_mat2_transpose(m.raw);
|
||||
return m;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief scale (multiply with scalar) matrix
|
||||
* @brief Multiply mat2s (m) by scalar constant (s)
|
||||
*
|
||||
* multiply matrix with scalar
|
||||
*
|
||||
* @param[in, out] m matrix
|
||||
* @param[in] s scalar
|
||||
* @returns matrix
|
||||
* @param[in] m mat2s (src)
|
||||
* @param[in] s scalar value
|
||||
* @return[out] m constructed mat2s from raw pointers
|
||||
*/
|
||||
CGLM_INLINE
|
||||
mat2s
|
||||
@@ -183,39 +179,26 @@ glms_mat2_(scale)(mat2s m, float s) {
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief mat2 determinant
|
||||
* @brief Inverse mat2s (m) and return in mat2s (r).
|
||||
*
|
||||
* @param[in] mat matrix
|
||||
*
|
||||
* @return determinant
|
||||
*/
|
||||
CGLM_INLINE
|
||||
float
|
||||
glms_mat2_(det)(mat2s mat) {
|
||||
return glm_mat2_det(mat.raw);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief inverse mat2 and store in dest
|
||||
*
|
||||
* @param[in] mat matrix
|
||||
* @returns matrix
|
||||
* @param[in] m mat2s (left, src)
|
||||
* @return[out] r constructed mat2s from raw pointers
|
||||
*/
|
||||
CGLM_INLINE
|
||||
mat2s
|
||||
glms_mat2_(inv)(mat2s mat) {
|
||||
glms_mat2_(inv)(mat2s m) {
|
||||
mat2s r;
|
||||
glm_mat2_inv(mat.raw, r.raw);
|
||||
glm_mat2_inv(m.raw, r.raw);
|
||||
return r;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief swap two matrix columns
|
||||
* @brief Swap two columns in mat2s (mat) and store in same matrix.
|
||||
*
|
||||
* @param[in] mat matrix
|
||||
* @param[in] col1 col1
|
||||
* @param[in] col2 col2
|
||||
* @returns matrix
|
||||
* @param[in] mat mat2s
|
||||
* @param[in] col1 column 1 array index
|
||||
* @param[in] col2 column 2 array index
|
||||
* @return[out] mat constructed mat2s from raw pointers columns swapped
|
||||
*/
|
||||
CGLM_INLINE
|
||||
mat2s
|
||||
@@ -225,12 +208,12 @@ glms_mat2_(swap_col)(mat2s mat, int col1, int col2) {
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief swap two matrix rows
|
||||
* @brief Swap two rows in mat2s (mat) and store in same matrix.
|
||||
*
|
||||
* @param[in] mat matrix
|
||||
* @param[in] row1 row1
|
||||
* @param[in] row2 row2
|
||||
* @returns matrix
|
||||
* @param[in] mat mat2s
|
||||
* @param[in] row1 row 1 array index
|
||||
* @param[in] row2 row 2 array index
|
||||
* @return[out] mat constructed mat2s from raw pointers rows swapped
|
||||
*/
|
||||
CGLM_INLINE
|
||||
mat2s
|
||||
@@ -240,18 +223,47 @@ glms_mat2_(swap_row)(mat2s mat, int row1, int row2) {
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief helper for R (row vector) * M (matrix) * C (column vector)
|
||||
* @brief Returns mat2 determinant.
|
||||
*
|
||||
* rmc stands for Row * Matrix * Column
|
||||
* @param[in] m mat2 (src)
|
||||
*
|
||||
* the result is scalar because R * M = Matrix1x2 (row vector),
|
||||
* then Matrix1x2 * Vec2 (column vector) = Matrix1x1 (Scalar)
|
||||
* @return[out] mat2s raw pointers determinant (float)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
float
|
||||
glms_mat2_(det)(mat2s m) {
|
||||
return glm_mat2_det(m.raw);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Returns trace of matrix. Which is:
|
||||
*
|
||||
* @param[in] r row vector or matrix1x2
|
||||
* @param[in] m matrix2x2
|
||||
* @param[in] c column vector or matrix2x1
|
||||
* The sum of the elements on the main diagonal from
|
||||
* upper left corner to the bottom right corner.
|
||||
*
|
||||
* @return scalar value e.g. Matrix1x1
|
||||
* @param[in] m mat2 (m)
|
||||
*
|
||||
* @return[out] mat2s raw pointers trace (float)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
float
|
||||
glms_mat2_(trace)(mat2s m) {
|
||||
return glm_mat2_trace(m.raw);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Helper for R (row vector) * M (matrix) * C (column vector)
|
||||
*
|
||||
* rmc stands for Row * Matrix * Column
|
||||
*
|
||||
* the result is scalar because M * C = ResC (1x2, column vector),
|
||||
* then if you take the dot_product(R (2x1), ResC (1x2)) = scalar value.
|
||||
*
|
||||
* @param[in] r vec2s (2x1, row vector)
|
||||
* @param[in] m mat2s (2x2, matrix)
|
||||
* @param[in] c vec2s (1x2, column vector)
|
||||
*
|
||||
* @return[out] Scalar value (float, 1x1)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
float
|
||||
@@ -259,18 +271,4 @@ glms_mat2_(rmc)(vec2s r, mat2s m, vec2s c) {
|
||||
return glm_mat2_rmc(r.raw, m.raw, c.raw);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Create mat2 matrix from pointer
|
||||
*
|
||||
* @param[in] src pointer to an array of floats
|
||||
* @return constructed matrix from raw pointer
|
||||
*/
|
||||
CGLM_INLINE
|
||||
mat2s
|
||||
glms_mat2_(make)(const float * __restrict src) {
|
||||
mat2s r;
|
||||
glm_mat2_make(src, r.raw);
|
||||
return r;
|
||||
}
|
||||
|
||||
#endif /* cglms_mat2_h */
|
||||
|
||||
@@ -35,87 +35,85 @@
|
||||
#define GLMS_MAT2X3_ZERO ((mat2x3s)GLMS_MAT2X3_ZERO_INIT)
|
||||
|
||||
/*!
|
||||
* @brief make given matrix zero.
|
||||
* @brief Zero out the mat2x3s (dest).
|
||||
*
|
||||
* @param[in, out] mat matrix
|
||||
* @return[out] dest constructed mat2x3s from raw pointer
|
||||
*/
|
||||
CGLM_INLINE
|
||||
mat2x3s
|
||||
glms_mat2x3_(zero)(void) {
|
||||
mat2x3s r;
|
||||
glm_mat2x3_zero(r.raw);
|
||||
return r;
|
||||
mat2x3s dest;
|
||||
glm_mat2x3_zero(dest.raw);
|
||||
return dest;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Create mat2x3 matrix from pointer
|
||||
* @brief Create mat2x3s (dest) from pointer (src).
|
||||
*
|
||||
* @param[in] src pointer to an array of floats
|
||||
* @return constructed matrix from raw pointer
|
||||
* @param[in] src pointer to an array of floats
|
||||
* @return[out] dest constructed mat2x3s from raw pointer
|
||||
*/
|
||||
CGLM_INLINE
|
||||
mat2x3s
|
||||
glms_mat2x3_(make)(const float * __restrict src) {
|
||||
mat2x3s r;
|
||||
glm_mat2x3_make(src, r.raw);
|
||||
return r;
|
||||
mat2x3s dest;
|
||||
glm_mat2x3_make(src, dest.raw);
|
||||
return dest;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief multiply m1 and m2 to dest
|
||||
* @brief Multiply mat2x3s (m1) by mat3x2s (m2) and store in mat3s (dest).
|
||||
*
|
||||
* @code
|
||||
* r = glms_mat2x3_mul(mat2x3s, mat3x2s);
|
||||
* @endcode
|
||||
*
|
||||
* @param[in] m1 left matrix (mat2x3s)
|
||||
* @param[in] m2 right matrix (mat3x2s)
|
||||
* @returns destination matrix (mat2s)
|
||||
* @param[in] m1 mat2x3s (left)
|
||||
* @param[in] m2 mat3x2s (right)
|
||||
* @return[out] dest constructed mat3s from raw pointers
|
||||
*/
|
||||
CGLM_INLINE
|
||||
mat3s
|
||||
glms_mat2x3_(mul)(mat2x3s m1, mat3x2s m2) {
|
||||
mat3s r;
|
||||
glm_mat2x3_mul(m1.raw, m2.raw, r.raw);
|
||||
return r;
|
||||
mat3s dest;
|
||||
glm_mat2x3_mul(m1.raw, m2.raw, dest.raw);
|
||||
return dest;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief multiply matrix with column vector and store in dest vector
|
||||
* @brief Multiply mat2x3s (m) by vec2s (v) and store in vec3s (dest).
|
||||
*
|
||||
* @param[in] m matrix (left)
|
||||
* @param[in] v vector (right, column vector)
|
||||
* @returns destination vector (vec3s)
|
||||
* @param[in] m mat2x3s (left)
|
||||
* @param[in] v vec2s (right, column vector)
|
||||
* @return[out] dest constructed vec3s from raw pointers
|
||||
*/
|
||||
CGLM_INLINE
|
||||
vec3s
|
||||
glms_mat2x3_(mulv)(mat2x3s m, vec2s v) {
|
||||
vec3s r;
|
||||
glm_mat2x3_mulv(m.raw, v.raw, r.raw);
|
||||
return r;
|
||||
vec3s dest;
|
||||
glm_mat2x3_mulv(m.raw, v.raw, dest.raw);
|
||||
return dest;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief transpose matrix and store in dest
|
||||
* @brief Transpose mat2x3s (m) and store in mat3x2s (dest).
|
||||
*
|
||||
* @param[in] m matrix
|
||||
* @param[out] dest result
|
||||
* @param[in] m mat2x3s (left)
|
||||
* @return[out] dest constructed mat3x2s from raw pointers
|
||||
*/
|
||||
CGLM_INLINE
|
||||
mat3x2s
|
||||
glms_mat2x3_(transpose)(mat2x3s m) {
|
||||
mat3x2s r;
|
||||
glm_mat2x3_transpose(m.raw, r.raw);
|
||||
return r;
|
||||
mat3x2s dest;
|
||||
glm_mat2x3_transpose(m.raw, dest.raw);
|
||||
return dest;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief scale (multiply with scalar) matrix
|
||||
* @brief Multiply mat2x3s (m) by scalar constant (s).
|
||||
*
|
||||
* multiply matrix with scalar
|
||||
*
|
||||
* @param[in, out] m matrix
|
||||
* @param[in] s scalar
|
||||
* @param[in, out] m mat2x3 (src, dest)
|
||||
* @param[in] s float (scalar)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
mat2x3s
|
||||
|
||||
@@ -35,87 +35,85 @@
|
||||
#define GLMS_MAT2X4_ZERO ((mat2x4s)GLMS_MAT2X4_ZERO_INIT)
|
||||
|
||||
/*!
|
||||
* @brief make given matrix zero.
|
||||
* @brief Zero out the mat2x4s (dest).
|
||||
*
|
||||
* @param[in, out] mat matrix
|
||||
* @return[out] dest constructed mat2x4s from raw pointer
|
||||
*/
|
||||
CGLM_INLINE
|
||||
mat2x4s
|
||||
glms_mat2x4_(zero)(void) {
|
||||
mat2x4s r;
|
||||
glm_mat2x4_zero(r.raw);
|
||||
return r;
|
||||
mat2x4s dest;
|
||||
glm_mat2x4_zero(dest.raw);
|
||||
return dest;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Create mat2x4 matrix from pointer
|
||||
* @brief Create mat2x4s (dest) from pointer (src).
|
||||
*
|
||||
* @param[in] src pointer to an array of floats
|
||||
* @return constructed matrix from raw pointer
|
||||
* @param[in] src pointer to an array of floats
|
||||
* @return[out] dest constructed mat2x4s from raw pointer
|
||||
*/
|
||||
CGLM_INLINE
|
||||
mat2x4s
|
||||
glms_mat2x4_(make)(const float * __restrict src) {
|
||||
mat2x4s r;
|
||||
glm_mat2x4_make(src, r.raw);
|
||||
return r;
|
||||
mat2x4s dest;
|
||||
glm_mat2x4_make(src, dest.raw);
|
||||
return dest;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief multiply m1 and m2 to dest
|
||||
* @brief Multiply mat2x4s (m1) by mat4x2s (m2) and store in mat4s (dest).
|
||||
*
|
||||
* @code
|
||||
* r = glms_mat2x4_mul(mat2x4s, mat4x2s);
|
||||
* @endcode
|
||||
*
|
||||
* @param[in] m1 left matrix (mat2x4s)
|
||||
* @param[in] m2 right matrix (mat4x2s)
|
||||
* @returns destination matrix (mat2s)
|
||||
* @param[in] m1 mat2x4s (left)
|
||||
* @param[in] m2 mat4x2s (right)
|
||||
* @return[out] dest constructed mat4s from raw pointers
|
||||
*/
|
||||
CGLM_INLINE
|
||||
mat4s
|
||||
glms_mat2x4_(mul)(mat2x4s m1, mat4x2s m2) {
|
||||
mat4s r;
|
||||
glm_mat2x4_mul(m1.raw, m2.raw, r.raw);
|
||||
return r;
|
||||
mat4s dest;
|
||||
glm_mat2x4_mul(m1.raw, m2.raw, dest.raw);
|
||||
return dest;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief multiply matrix with column vector and store in dest column vector
|
||||
* @brief Multiply mat2x4s (m) by vec2s (v) and store in vec4s (dest).
|
||||
*
|
||||
* @param[in] m matrix (left)
|
||||
* @param[in] v vector (right, column vector)
|
||||
* @param[out] dest result vector
|
||||
* @param[in] m mat2x4s (left)
|
||||
* @param[in] v vec2s (right, column vector)
|
||||
* @return[out] dest constructed vec4s from raw pointers
|
||||
*/
|
||||
CGLM_INLINE
|
||||
vec4s
|
||||
glms_mat2x4_(mulv)(mat2x4s m, vec2s v) {
|
||||
vec4s r;
|
||||
glm_mat2x4_mulv(m.raw, v.raw, r.raw);
|
||||
return r;
|
||||
vec4s dest;
|
||||
glm_mat2x4_mulv(m.raw, v.raw, dest.raw);
|
||||
return dest;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief transpose matrix and store in dest
|
||||
* @brief Transpose mat2x4s (m) and store in mat4x2s (dest).
|
||||
*
|
||||
* @param[in] m matrix
|
||||
* @param[out] dest result
|
||||
* @param[in] m mat2x4s (left)
|
||||
* @return[out] dest constructed mat4x2s from raw pointers
|
||||
*/
|
||||
CGLM_INLINE
|
||||
mat4x2s
|
||||
glms_mat2x4_(transpose)(mat2x4s m) {
|
||||
mat4x2s r;
|
||||
glm_mat2x4_transpose(m.raw, r.raw);
|
||||
return r;
|
||||
mat4x2s dest;
|
||||
glm_mat2x4_transpose(m.raw, dest.raw);
|
||||
return dest;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief scale (multiply with scalar) matrix
|
||||
* @brief Multiply mat2x4s (m) by scalar constant (s).
|
||||
*
|
||||
* multiply matrix with scalar
|
||||
*
|
||||
* @param[in, out] m matrix
|
||||
* @param[in] s scalar
|
||||
* @param[in, out] m mat2x4s (src, dest)
|
||||
* @param[in] s float (scalar)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
mat2x4s
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user