Update CGLM to the latest version
git subrepo clone --branch=taisei https://github.com/taisei-project/cglm external/cglm subrepo: subdir: "external/cglm" merged: "b51be76d" upstream: origin: "https://github.com/taisei-project/cglm" branch: "taisei" commit: "b51be76d" git-subrepo: version: "0.3.1" origin: "https://github.com/ingydotnet/git-subrepo" commit: "a7ee886"
This commit is contained in:
parent
f6d23dc025
commit
5e711b2abb
112 changed files with 10634 additions and 1228 deletions
11
external/cglm/.gitignore
vendored
11
external/cglm/.gitignore
vendored
|
@ -59,4 +59,13 @@ cglm_test_ios/*
|
|||
cglm_test_iosTests/*
|
||||
docs/build/*
|
||||
win/cglm_test_*
|
||||
* copy.*
|
||||
* copy.*
|
||||
*.o
|
||||
*.obj
|
||||
*codeanalysis.*.xml
|
||||
*codeanalysis.xml
|
||||
*.lib
|
||||
*.tlog
|
||||
win/x64
|
||||
win/x85
|
||||
win/Debug
|
||||
|
|
4
external/cglm/.gitrepo
vendored
4
external/cglm/.gitrepo
vendored
|
@ -6,6 +6,6 @@
|
|||
[subrepo]
|
||||
remote = https://github.com/taisei-project/cglm
|
||||
branch = taisei
|
||||
commit = 5af24c6b834fd85bb41ae2520f7030c1b689152e
|
||||
parent = cc41f444380def4cb5338aeda1204698d14d49f2
|
||||
commit = b51be76de1c2300b34b234cbb00dd7ba6def5565
|
||||
parent = f8e78ccf1e34a4771f2918b6c7fa571f4fbdff30
|
||||
cmdver = 0.3.1
|
||||
|
|
2
external/cglm/.travis.yml
vendored
2
external/cglm/.travis.yml
vendored
|
@ -49,7 +49,7 @@ script:
|
|||
|
||||
after_success:
|
||||
- if [[ "$CC" == "gcc" && "$CODE_COVERAGE" == "ON" ]]; then
|
||||
pip install --user cpp-coveralls
|
||||
pip install --user cpp-coveralls &&
|
||||
coveralls
|
||||
--build-root .
|
||||
--exclude lib
|
||||
|
|
54
external/cglm/CREDITS
vendored
Normal file
54
external/cglm/CREDITS
vendored
Normal file
|
@ -0,0 +1,54 @@
|
|||
This library [initially] used some [piece of] implementations
|
||||
(may include codes) from these open source projects/resources:
|
||||
|
||||
1. Initial Affine Transforms
|
||||
The original glm repo (g-truc), url: https://github.com/g-truc/glm
|
||||
|
||||
LICENSE[S]:
|
||||
The Happy Bunny License (Modified MIT License)
|
||||
The MIT License
|
||||
Copyright (c) 2005 - 2016 G-Truc Creation
|
||||
|
||||
FULL LICENSE: https://github.com/g-truc/glm/blob/master/copying.txt
|
||||
|
||||
2. Initial Quaternions
|
||||
Anton's OpenGL 4 Tutorials book source code:
|
||||
|
||||
LICENSE:
|
||||
OpenGL 4 Example Code.
|
||||
Accompanies written series "Anton's OpenGL 4 Tutorials"
|
||||
Email: anton at antongerdelan dot net
|
||||
First version 27 Jan 2014
|
||||
Copyright Dr Anton Gerdelan, Trinity College Dublin, Ireland.
|
||||
|
||||
3. Euler Angles
|
||||
David Eberly
|
||||
Geometric Tools, LLC http://www.geometrictools.com/
|
||||
Copyright (c) 1998-2016. All Rights Reserved.
|
||||
|
||||
Computing Euler angles from a rotation matrix (euler.pdf)
|
||||
Gregory G. Slabaugh
|
||||
|
||||
4. Extracting Planes
|
||||
Fast Extraction of Viewing Frustum Planes from the World-View-Projection Matrix
|
||||
Authors:
|
||||
Gil Gribb (ggribb@ravensoft.com)
|
||||
Klaus Hartmann (k_hartmann@osnabrueck.netsurf.de)
|
||||
|
||||
5. Transform AABB
|
||||
Transform Axis Aligned Bounding Boxes:
|
||||
http://dev.theomader.com/transform-bounding-boxes/
|
||||
https://github.com/erich666/GraphicsGems/blob/master/gems/TransBox.c
|
||||
|
||||
6. Cull frustum
|
||||
http://www.txutxi.com/?p=584
|
||||
http://old.cescg.org/CESCG-2002/DSykoraJJelinek/
|
||||
|
||||
7. Quaternions
|
||||
Initial mat4_quat is borrowed from Apple's simd library
|
||||
|
||||
8. Vector Rotation using Quaternion
|
||||
https://gamedev.stackexchange.com/questions/28395/rotating-vector3-by-a-quaternion
|
||||
|
||||
9. Sphere AABB intersect
|
||||
https://github.com/erich666/GraphicsGems/blob/master/gems/BoxSphere.c
|
48
external/cglm/LICENSE
vendored
48
external/cglm/LICENSE
vendored
|
@ -19,51 +19,3 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
|
||||
-
|
||||
|
||||
This library [initially] used some [piece of] implementations
|
||||
(may include codes) from these open source projects/resources:
|
||||
|
||||
1. Affine Transforms
|
||||
The original glm repo (g-truc), url: https://github.com/g-truc/glm
|
||||
|
||||
LICENSE[S]:
|
||||
The Happy Bunny License (Modified MIT License)
|
||||
The MIT License
|
||||
Copyright (c) 2005 - 2016 G-Truc Creation
|
||||
|
||||
FULL LICENSE: https://github.com/g-truc/glm/blob/master/copying.txt
|
||||
|
||||
2. Quaternions
|
||||
Anton's OpenGL 4 Tutorials book source code:
|
||||
|
||||
LICENSE:
|
||||
OpenGL 4 Example Code.
|
||||
Accompanies written series "Anton's OpenGL 4 Tutorials"
|
||||
Email: anton at antongerdelan dot net
|
||||
First version 27 Jan 2014
|
||||
Copyright Dr Anton Gerdelan, Trinity College Dublin, Ireland.
|
||||
|
||||
3. Euler Angles
|
||||
David Eberly
|
||||
Geometric Tools, LLC http://www.geometrictools.com/
|
||||
Copyright (c) 1998-2016. All Rights Reserved.
|
||||
|
||||
Computing Euler angles from a rotation matrix (euler.pdf)
|
||||
Gregory G. Slabaugh
|
||||
|
||||
4. Extracting Planes
|
||||
Fast Extraction of Viewing Frustum Planes from the World-View-Projection Matrix
|
||||
Authors:
|
||||
Gil Gribb (ggribb@ravensoft.com)
|
||||
Klaus Hartmann (k_hartmann@osnabrueck.netsurf.de)
|
||||
|
||||
5. Transform AABB
|
||||
Transform Axis Aligned Bounding Boxes:
|
||||
http://dev.theomader.com/transform-bounding-boxes/
|
||||
https://github.com/erich666/GraphicsGems/blob/master/gems/TransBox.c
|
||||
|
||||
6. Cull frustum
|
||||
http://www.txutxi.com/?p=584
|
||||
http://old.cescg.org/CESCG-2002/DSykoraJJelinek/
|
||||
|
|
99
external/cglm/README.md
vendored
99
external/cglm/README.md
vendored
|
@ -1,21 +1,29 @@
|
|||
# 🎥 OpenGL Mathematics (glm) for `C`
|
||||
[](https://travis-ci.org/recp/cglm)
|
||||
[](https://ci.appveyor.com/project/recp/cglm/branch/master)
|
||||
[](https://ci.appveyor.com/project/recp/cglm/branch/master)
|
||||
[](http://cglm.readthedocs.io/en/latest/?badge=latest)
|
||||
[](https://coveralls.io/github/recp/cglm?branch=master)
|
||||
[](https://www.codacy.com/app/recp/cglm?utm_source=github.com&utm_medium=referral&utm_content=recp/cglm&utm_campaign=Badge_Grade)
|
||||
[](#backers)
|
||||
[](#sponsors)
|
||||
|
||||
The original glm library is for C++ only (templates, namespaces, classes...), this library targeted to C99 but currently you can use it for C89 safely by language extensions e.g `__restrict`
|
||||
|
||||
#### Documentation
|
||||
|
||||
Almost all functions (inline versions) and parameters are documented inside related headers. <br />
|
||||
Complete documentation is in progress: http://cglm.readthedocs.io
|
||||
Complete documentation: http://cglm.readthedocs.io
|
||||
|
||||
#### Note for previous versions:
|
||||
|
||||
- _dup (duplicate) is changed to _copy. For instance `glm_vec_dup -> glm_vec_copy`
|
||||
- OpenGL related functions are dropped to make this lib platform/third-party independent
|
||||
- make sure you have latest version and feel free to report bugs, troubles
|
||||
- **[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.
|
||||
|
||||
#### Note for C++ developers:
|
||||
If you don't aware about original GLM library yet, you may also want to look at:
|
||||
|
@ -29,15 +37,15 @@ https://github.com/g-truc/glm
|
|||
- Welcome!
|
||||
|
||||
#### 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.
|
||||
- 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.
|
||||
|
||||
#### 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.
|
||||
#### 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... ?
|
||||
Since almost all types are arrays and **C** doesn't allow returning arrays, so **cglm** doesn't support this feature. In the future *cglm* may use **struct** for some types for this purpose.
|
||||
Since almost all types are arrays and **C** doesn't allow returning arrays, so **cglm** doesn't support this feature. In the future *cglm* may use **struct** for some types for this purpose.
|
||||
|
||||
#### Other APIs like Vulkan, Metal, Dx?
|
||||
#### Other APIs like Vulkan, Metal, Dx?
|
||||
Currently *cglm* uses default clip space configuration (-1, 1) for camera functions (perspective, extract corners...), in the future other clip space configurations will be supported
|
||||
|
||||
<hr/>
|
||||
|
@ -72,6 +80,7 @@ Currently *cglm* uses default clip space configuration (-1, 1) for camera functi
|
|||
- inline or pre-compiled function call
|
||||
- frustum (extract view frustum planes, corners...)
|
||||
- bounding box (AABB in Frustum (culling), crop, merge...)
|
||||
- project, unproject
|
||||
|
||||
<hr />
|
||||
|
||||
|
@ -113,6 +122,36 @@ glm_mul(T, R, modelMat);
|
|||
glm_inv_tr(modelMat);
|
||||
```
|
||||
|
||||
## Contributors
|
||||
|
||||
This project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)].
|
||||
<a href="graphs/contributors"><img src="https://opencollective.com/cglm/contributors.svg?width=890&button=false" /></a>
|
||||
|
||||
|
||||
## Backers
|
||||
|
||||
Thank you to all our backers! 🙏 [[Become a backer](https://opencollective.com/cglm#backer)]
|
||||
|
||||
<a href="https://opencollective.com/cglm#backers" target="_blank"><img src="https://opencollective.com/cglm/backers.svg?width=890"></a>
|
||||
|
||||
|
||||
## Sponsors
|
||||
|
||||
Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [[Become a sponsor](https://opencollective.com/cglm#sponsor)]
|
||||
|
||||
<a href="https://opencollective.com/cglm/sponsor/0/website" target="_blank"><img src="https://opencollective.com/cglm/sponsor/0/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/cglm/sponsor/1/website" target="_blank"><img src="https://opencollective.com/cglm/sponsor/1/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/cglm/sponsor/2/website" target="_blank"><img src="https://opencollective.com/cglm/sponsor/2/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/cglm/sponsor/3/website" target="_blank"><img src="https://opencollective.com/cglm/sponsor/3/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/cglm/sponsor/4/website" target="_blank"><img src="https://opencollective.com/cglm/sponsor/4/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/cglm/sponsor/5/website" target="_blank"><img src="https://opencollective.com/cglm/sponsor/5/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/cglm/sponsor/6/website" target="_blank"><img src="https://opencollective.com/cglm/sponsor/6/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/cglm/sponsor/7/website" target="_blank"><img src="https://opencollective.com/cglm/sponsor/7/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/cglm/sponsor/8/website" target="_blank"><img src="https://opencollective.com/cglm/sponsor/8/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/cglm/sponsor/9/website" target="_blank"><img src="https://opencollective.com/cglm/sponsor/9/avatar.svg"></a>
|
||||
|
||||
|
||||
|
||||
## License
|
||||
MIT. check the LICENSE file
|
||||
|
||||
|
@ -120,13 +159,15 @@ MIT. check the LICENSE file
|
|||
|
||||
### Unix (Autotools)
|
||||
|
||||
```text
|
||||
$ sh ./build-deps.sh # run only once (dependencies)
|
||||
```bash
|
||||
$ sh ./build-deps.sh # run only once (dependencies) [Optional].
|
||||
$ # You can pass this step if you don't want to run `make check` for tests.
|
||||
$ # cglm uses cmocka for tests and it may reqiure cmake for building it
|
||||
$
|
||||
$ sh autogen.sh
|
||||
$ ./configure
|
||||
$ make
|
||||
$ make install
|
||||
$ make check # [Optional] (if you run `sh ./build-deps.sh`)
|
||||
$ [sudo] make install
|
||||
```
|
||||
|
||||
|
@ -144,12 +185,21 @@ if `msbuild` won't work (because of multi version VS) then try to build with `de
|
|||
$ devenv cglm.sln /Build Release
|
||||
```
|
||||
|
||||
### 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 inline versions of funcstions then; include main header
|
||||
```C
|
||||
#include <cglm/cglm.h>
|
||||
```
|
||||
the haeder will include all headers. Then call func you want e.g. rotate vector by axis:
|
||||
the header will include all headers. Then call func you want e.g. rotate vector by axis:
|
||||
```C
|
||||
glm_vec_rotate(v1, glm_rad(45), (vec3){1.0f, 0.0f, 0.0f});
|
||||
```
|
||||
|
@ -168,7 +218,7 @@ to call pre-compiled versions include header with `c` postfix, c means call. Pre
|
|||
```C
|
||||
#include <cglm/call.h>
|
||||
```
|
||||
this header will include all heaers with c postfix. You need to call functions with c posfix:
|
||||
this header will include all headers with c postfix. You need to call functions with c posfix:
|
||||
```C
|
||||
glmc_vec_normalize(vec);
|
||||
```
|
||||
|
@ -182,6 +232,27 @@ glm_mat4_mul(m1, m1, m1);
|
|||
```
|
||||
the first two parameter are **[in]** and the last one is **[out]** parameter. After multiplied *m1* and *m2* the result is stored in *m1*. This is why we send *m1* twice. You may store result in different matrix, this just an example.
|
||||
|
||||
### 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:
|
||||
|
@ -199,7 +270,7 @@ Option 2: Cast matrix to pointer type (also valid for multiple dimensional array
|
|||
glUniformMatrix4fv(location, 1, GL_FALSE, (float *)matrix);
|
||||
```
|
||||
|
||||
You can pass same way to another APIs e.g. Vulkan, DX...
|
||||
You can pass same way to another APIs e.g. Vulkan, DX...
|
||||
|
||||
## Notes
|
||||
|
||||
|
@ -211,5 +282,5 @@ You can pass same way to another APIs e.g. Vulkan, DX...
|
|||
- [ ] Unit tests for comparing cglm with glm results
|
||||
- [x] Add version info
|
||||
- [ ] Unaligned operations (e.g. `glm_umat4_mul`)
|
||||
- [ ] Extra documentation
|
||||
- [x] Extra documentation
|
||||
- [ ] ARM Neon Arch (In Progress)
|
||||
|
|
17
external/cglm/autogen.sh
vendored
17
external/cglm/autogen.sh
vendored
|
@ -8,17 +8,14 @@
|
|||
|
||||
cd $(dirname "$0")
|
||||
|
||||
if [ "$(uname)" = "Darwin" ]; then
|
||||
libtoolBin=$(which glibtoolize)
|
||||
libtoolBinDir=$(dirname "${libtoolBin}")
|
||||
|
||||
if [ ! -f "${libtoolBinDir}/libtoolize" ]; then
|
||||
ln -s $libtoolBin "${libtoolBinDir}/libtoolize"
|
||||
fi
|
||||
fi
|
||||
|
||||
autoheader
|
||||
libtoolize
|
||||
|
||||
if [ "$(uname)" = "Darwin" ]; then
|
||||
glibtoolize
|
||||
else
|
||||
libtoolize
|
||||
fi
|
||||
|
||||
aclocal -I m4
|
||||
autoconf
|
||||
automake --add-missing --copy
|
||||
|
|
11
external/cglm/build-deps.sh
vendored
11
external/cglm/build-deps.sh
vendored
|
@ -9,21 +9,14 @@
|
|||
# check if deps are pulled
|
||||
git submodule update --init --recursive
|
||||
|
||||
# fix glibtoolize
|
||||
|
||||
cd $(dirname "$0")
|
||||
|
||||
if [ "$(uname)" = "Darwin" ]; then
|
||||
libtoolBin=$(which glibtoolize)
|
||||
libtoolBinDir=$(dirname "${libtoolBin}")
|
||||
ln -s $libtoolBin "${libtoolBinDir}/libtoolize"
|
||||
fi
|
||||
|
||||
# general deps: gcc make autoconf automake libtool cmake
|
||||
|
||||
# test - cmocka
|
||||
cd ./test/lib/cmocka
|
||||
mkdir build
|
||||
rm -rf build
|
||||
mkdir -p build
|
||||
cd build
|
||||
cmake -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Debug ..
|
||||
make -j8
|
||||
|
|
28
external/cglm/cglm.podspec
vendored
Normal file
28
external/cglm/cglm.podspec
vendored
Normal file
|
@ -0,0 +1,28 @@
|
|||
Pod::Spec.new do |s|
|
||||
|
||||
# Description
|
||||
s.name = "cglm"
|
||||
s.version = "0.4.6"
|
||||
s.summary = "📽 Optimized OpenGL/Graphics Math (glm) for C"
|
||||
s.description = <<-DESC
|
||||
cglm is math library for graphics programming for C. It is similar to original glm but it is written for C instead of C++ (you can use here too). See the documentation or README for all features.
|
||||
DESC
|
||||
|
||||
s.documentation_url = "http://cglm.readthedocs.io"
|
||||
|
||||
# Home
|
||||
s.homepage = "https://github.com/recp/cglm"
|
||||
s.license = { :type => "MIT", :file => "LICENSE" }
|
||||
s.author = { "Recep Aslantas" => "recp@acm.org" }
|
||||
|
||||
# Sources
|
||||
s.source = { :git => "https://github.com/recp/cglm.git", :tag => "v#{s.version}" }
|
||||
s.source_files = "src", "include/cglm/**/*.h"
|
||||
s.public_header_files = "include", "include/cglm/**/*.h"
|
||||
s.exclude_files = "src/win/*", "src/dllmain.c", "src/**/*.h"
|
||||
s.preserve_paths = "include", "src"
|
||||
s.header_mappings_dir = "include"
|
||||
|
||||
# Linking
|
||||
s.library = "m"
|
||||
end
|
2
external/cglm/configure.ac
vendored
2
external/cglm/configure.ac
vendored
|
@ -7,7 +7,7 @@
|
|||
#*****************************************************************************
|
||||
|
||||
AC_PREREQ([2.69])
|
||||
AC_INIT([cglm], [0.2.1], [info@recp.me])
|
||||
AC_INIT([cglm], [0.4.8], [info@recp.me])
|
||||
AM_INIT_AUTOMAKE([-Wall -Werror foreign subdir-objects])
|
||||
|
||||
AC_CONFIG_MACRO_DIR([m4])
|
||||
|
|
99
external/cglm/docs/source/affine-mat.rst
vendored
Normal file
99
external/cglm/docs/source/affine-mat.rst
vendored
Normal file
|
@ -0,0 +1,99 @@
|
|||
.. default-domain:: C
|
||||
|
||||
affine transform matrix (specialized functions)
|
||||
================================================================================
|
||||
|
||||
Header: cglm/affine-mat.h
|
||||
|
||||
We mostly use glm_mat4_* for 4x4 general and transform matrices. **cglm**
|
||||
provides optimized version of some functions. Because affine transform matrix is
|
||||
a known format, for instance all last item of first three columns is zero.
|
||||
|
||||
You should be careful when using these functions. For instance :c:func:`glm_mul`
|
||||
assumes matrix will be this format:
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
R R R X
|
||||
R R R Y
|
||||
R R R Z
|
||||
0 0 0 W
|
||||
|
||||
if you override zero values here then use :c:func:`glm_mat4_mul` version.
|
||||
You cannot use :c:func:`glm_mul` anymore.
|
||||
|
||||
Same is also true for :c:func:`glm_inv_tr` if you only have rotation and
|
||||
translation then it will work as expected, otherwise you cannot use that.
|
||||
|
||||
In the future it may accept scale factors too but currectly it does not.
|
||||
|
||||
Table of contents (click func go):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Functions:
|
||||
|
||||
1. :c:func:`glm_mul`
|
||||
#. :c:func:`glm_mul_rot`
|
||||
#. :c:func:`glm_inv_tr`
|
||||
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. c:function:: void glm_mul(mat4 m1, mat4 m2, mat4 dest)
|
||||
|
||||
| this is similar to glm_mat4_mul but specialized to affine transform
|
||||
|
||||
Matrix format should be:
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
R R R X
|
||||
R R R Y
|
||||
R R R Z
|
||||
0 0 0 W
|
||||
|
||||
this reduces some multiplications. It should be faster than mat4_mul.
|
||||
if you are not sure about matrix format then DON'T use this! use mat4_mul
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m1** affine matrix 1
|
||||
| *[in]* **m2** affine matrix 2
|
||||
| *[out]* **dest** result matrix
|
||||
|
||||
.. c:function:: void glm_mul_rot(mat4 m1, mat4 m2, mat4 dest)
|
||||
|
||||
| this is similar to glm_mat4_mul but specialized to rotation matrix
|
||||
|
||||
Right Matrix format should be (left is free):
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
R R R 0
|
||||
R R R 0
|
||||
R R R 0
|
||||
0 0 0 1
|
||||
|
||||
this reduces some multiplications. It should be faster than mat4_mul.
|
||||
if you are not sure about matrix format then DON'T use this! use mat4_mul
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m1** affine matrix 1
|
||||
| *[in]* **m2** affine matrix 2
|
||||
| *[out]* **dest** result matrix
|
||||
|
||||
.. c:function:: void glm_inv_tr(mat4 mat)
|
||||
|
||||
| inverse orthonormal rotation + translation matrix (ridig-body)
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
X = | R T | X' = | R' -R'T |
|
||||
| 0 1 | | 0 1 |
|
||||
|
||||
use this if you only have rotation + translation, this should work faster
|
||||
than :c:func:`glm_mat4_inv`
|
||||
|
||||
Don't use this if your matrix includes other things e.g. scale, shear...
|
||||
|
||||
Parameters:
|
||||
| *[in,out]* **mat** affine matrix
|
343
external/cglm/docs/source/affine.rst
vendored
Normal file
343
external/cglm/docs/source/affine.rst
vendored
Normal file
|
@ -0,0 +1,343 @@
|
|||
.. default-domain:: C
|
||||
|
||||
affine transforms
|
||||
================================================================================
|
||||
|
||||
Header: cglm/affine.h
|
||||
|
||||
Initialize Transform Matrices
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
Functions with **_make** prefix expect you don't have a matrix and they create
|
||||
a matrix for you. You don't need to pass identity matrix.
|
||||
|
||||
But other functions expect you have a matrix and you want to transform them. If
|
||||
you didn't have any existing matrix you have to initialize matrix to identity
|
||||
before sending to transfrom functions.
|
||||
|
||||
There are also functions to decompose transform matrix. These functions can't
|
||||
decompose matrix after projected.
|
||||
|
||||
Rotation Center
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Rotating functions uses origin as rotation center (pivot/anchor point),
|
||||
since scale factors are stored in rotation matrix, same may also true for scalling.
|
||||
cglm provides some functions for rotating around at given point e.g.
|
||||
**glm_rotate_at**, **glm_quat_rotate_at**. Use them or follow next section for algorihm ("Rotate or Scale around specific Point (Pivot Point / Anchor Point)").
|
||||
|
||||
Rotate or Scale around specific Point (Anchor Point)
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
If you want to rotate model around arbibtrary point follow these steps:
|
||||
|
||||
1. Move model from pivot point to origin: **translate(-pivot.x, -pivot.y, -pivot.z)**
|
||||
2. Apply rotation (or scaling maybe)
|
||||
3. Move model back from origin to pivot (reverse of step-1): **translate(pivot.x, pivot.y, pivot.z)**
|
||||
|
||||
**glm_rotate_at**, **glm_quat_rotate_at** and their helper functions works that way.
|
||||
|
||||
The implementation would be:
|
||||
|
||||
.. code-block:: c
|
||||
:linenos:
|
||||
|
||||
glm_translate(m, pivot);
|
||||
glm_rotate(m, angle, axis);
|
||||
glm_translate(m, pivotInv); /* pivotInv = -pivot */
|
||||
|
||||
Transforms Order
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
It is important to understand this part especially if you call transform
|
||||
functions multiple times
|
||||
|
||||
`glm_translate`, `glm_rotate`, `glm_scale` and `glm_quat_rotate` and their
|
||||
helpers functions works like this (cglm may provide reverse order too as alternative in the future):
|
||||
|
||||
.. code-block:: c
|
||||
:linenos:
|
||||
|
||||
TransformMatrix = TransformMatrix * TraslateMatrix; // glm_translate()
|
||||
TransformMatrix = TransformMatrix * RotateMatrix; // glm_rotate(), glm_quat_rotate()
|
||||
TransformMatrix = TransformMatrix * ScaleMatrix; // glm_scale()
|
||||
|
||||
As you can see it is multipled as right matrix. For instance what will happen if you call `glm_translate` twice?
|
||||
|
||||
.. code-block:: c
|
||||
:linenos:
|
||||
|
||||
glm_translate(transform, translate1); /* transform = transform * translate1 */
|
||||
glm_translate(transform, translate2); /* transform = transform * translate2 */
|
||||
glm_rotate(transform, angle, axis) /* transform = transform * rotation */
|
||||
|
||||
Now lets try to understand this:
|
||||
|
||||
1. You call translate using `translate1` and you expect it will be first transform
|
||||
because you call it first, do you?
|
||||
|
||||
Result will be **`transform = transform * translate1`**
|
||||
|
||||
2. Then you call translate using `translate2` and you expect it will be second transform?
|
||||
|
||||
Result will be **`transform = transform * translate2`**. Now lets expand transform,
|
||||
it was `transform * translate1` before second call.
|
||||
|
||||
Now it is **`transform = transform * translate1 * translate2`**, now do you understand what I say?
|
||||
|
||||
3. After last call transform will be:
|
||||
|
||||
**`transform = transform * translate1 * translate2 * rotation`**
|
||||
|
||||
The order will be; **rotation will be applied first**, then **translate2** then **translate1**
|
||||
|
||||
It is all about matrix multiplication order. It is similar to MVP matrix:
|
||||
`MVP = Projection * View * Model`, model will be applied first, then view then projection.
|
||||
|
||||
**Confused?**
|
||||
|
||||
In the end the last function call applied first in shaders.
|
||||
|
||||
As alternative way, you can create transform matrices individually then combine manually,
|
||||
but don't forget that `glm_translate`, `glm_rotate`, `glm_scale`... are optimized and should be faster (an smaller assembly output) than manual multiplication
|
||||
|
||||
.. code-block:: c
|
||||
:linenos:
|
||||
|
||||
mat4 transform1, transform2, transform3, finalTransform;
|
||||
|
||||
glm_translate_make(transform1, translate1);
|
||||
glm_translate_make(transform2, translate2);
|
||||
glm_rotate_make(transform3, angle, axis);
|
||||
|
||||
/* first apply transform1, then transform2, thentransform3 */
|
||||
glm_mat4_mulN((mat4 *[]){&transform3, &transform2, &transform1}, 3, finalTransform);
|
||||
|
||||
/* if you don't want to use mulN, same as above */
|
||||
glm_mat4_mul(transform3, transform2, finalTransform);
|
||||
glm_mat4_mul(finalTransform, transform1, finalTransform);
|
||||
|
||||
Now transform1 will be applied first, then transform2 then transform3
|
||||
|
||||
Table of contents (click to go):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Functions:
|
||||
|
||||
1. :c:func:`glm_translate_to`
|
||||
#. :c:func:`glm_translate`
|
||||
#. :c:func:`glm_translate_x`
|
||||
#. :c:func:`glm_translate_y`
|
||||
#. :c:func:`glm_translate_z`
|
||||
#. :c:func:`glm_translate_make`
|
||||
#. :c:func:`glm_scale_to`
|
||||
#. :c:func:`glm_scale_make`
|
||||
#. :c:func:`glm_scale`
|
||||
#. :c:func:`glm_scale_uni`
|
||||
#. :c:func:`glm_rotate_x`
|
||||
#. :c:func:`glm_rotate_y`
|
||||
#. :c:func:`glm_rotate_z`
|
||||
#. :c:func:`glm_rotate_make`
|
||||
#. :c:func:`glm_rotate`
|
||||
#. :c:func:`glm_rotate_at`
|
||||
#. :c:func:`glm_rotate_atm`
|
||||
#. :c:func:`glm_decompose_scalev`
|
||||
#. :c:func:`glm_uniscaled`
|
||||
#. :c:func:`glm_decompose_rs`
|
||||
#. :c:func:`glm_decompose`
|
||||
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. c:function:: void glm_translate_to(mat4 m, vec3 v, mat4 dest)
|
||||
|
||||
translate existing transform matrix by *v* vector and store result in dest
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** affine transfrom
|
||||
| *[in]* **v** translate vector [x, y, z]
|
||||
| *[out]* **dest** translated matrix
|
||||
|
||||
.. c:function:: void glm_translate(mat4 m, vec3 v)
|
||||
|
||||
translate existing transform matrix by *v* vector
|
||||
and stores result in same matrix
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** affine transfrom
|
||||
| *[in]* **v** translate vector [x, y, z]
|
||||
|
||||
.. c:function:: void glm_translate_x(mat4 m, float x)
|
||||
|
||||
translate existing transform matrix by x factor
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** affine transfrom
|
||||
| *[in]* **v** x factor
|
||||
|
||||
.. c:function:: void glm_translate_y(mat4 m, float y)
|
||||
|
||||
translate existing transform matrix by *y* factor
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** affine transfrom
|
||||
| *[in]* **v** y factor
|
||||
|
||||
.. c:function:: void glm_translate_z(mat4 m, float z)
|
||||
|
||||
translate existing transform matrix by *z* factor
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** affine transfrom
|
||||
| *[in]* **v** z factor
|
||||
|
||||
.. c:function:: void glm_translate_make(mat4 m, vec3 v)
|
||||
|
||||
creates NEW translate transform matrix by *v* vector.
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** affine transfrom
|
||||
| *[in]* **v** translate vector [x, y, z]
|
||||
|
||||
.. c:function:: void glm_scale_to(mat4 m, vec3 v, mat4 dest)
|
||||
|
||||
scale existing transform matrix by *v* vector and store result in dest
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** affine transfrom
|
||||
| *[in]* **v** scale vector [x, y, z]
|
||||
| *[out]* **dest** scaled matrix
|
||||
|
||||
.. c:function:: void glm_scale_make(mat4 m, vec3 v)
|
||||
|
||||
creates NEW scale matrix by v vector
|
||||
|
||||
Parameters:
|
||||
| *[out]* **m** affine transfrom
|
||||
| *[in]* **v** scale vector [x, y, z]
|
||||
|
||||
.. c:function:: void glm_scale(mat4 m, vec3 v)
|
||||
|
||||
scales existing transform matrix by v vector
|
||||
and stores result in same matrix
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** affine transfrom
|
||||
| *[in]* **v** scale vector [x, y, z]
|
||||
|
||||
.. c:function:: void glm_scale_uni(mat4 m, float s)
|
||||
|
||||
applies uniform scale to existing transform matrix v = [s, s, s]
|
||||
and stores result in same matrix
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** affine transfrom
|
||||
| *[in]* **v** scale factor
|
||||
|
||||
.. c:function:: void glm_rotate_x(mat4 m, float angle, mat4 dest)
|
||||
|
||||
rotate existing transform matrix around X axis by angle
|
||||
and store result in dest
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** affine transfrom
|
||||
| *[in]* **angle** angle (radians)
|
||||
| *[out]* **dest** rotated matrix
|
||||
|
||||
.. c:function:: void glm_rotate_y(mat4 m, float angle, mat4 dest)
|
||||
|
||||
rotate existing transform matrix around Y axis by angle
|
||||
and store result in dest
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** affine transfrom
|
||||
| *[in]* **angle** angle (radians)
|
||||
| *[out]* **dest** rotated matrix
|
||||
|
||||
.. c:function:: void glm_rotate_z(mat4 m, float angle, mat4 dest)
|
||||
|
||||
rotate existing transform matrix around Z axis by angle
|
||||
and store result in dest
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** affine transfrom
|
||||
| *[in]* **angle** angle (radians)
|
||||
| *[out]* **dest** rotated matrix
|
||||
|
||||
.. c:function:: void glm_rotate_make(mat4 m, float angle, vec3 axis)
|
||||
|
||||
creates NEW rotation matrix by angle and axis,
|
||||
axis will be normalized so you don't need to normalize it
|
||||
|
||||
Parameters:
|
||||
| *[out]* **m** affine transfrom
|
||||
| *[in]* **axis** angle (radians)
|
||||
| *[in]* **axis** axis
|
||||
|
||||
.. c:function:: void glm_rotate(mat4 m, float angle, vec3 axis)
|
||||
|
||||
rotate existing transform matrix around Z axis by angle and axis
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** affine transfrom
|
||||
| *[in]* **angle** angle (radians)
|
||||
| *[in]* **axis** axis
|
||||
|
||||
.. c:function:: void glm_rotate_at(mat4 m, vec3 pivot, float angle, vec3 axis)
|
||||
|
||||
rotate existing transform around given axis by angle at given pivot point (rotation center)
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** affine transfrom
|
||||
| *[in]* **pivot** pivot, anchor point, rotation center
|
||||
| *[in]* **angle** angle (radians)
|
||||
| *[in]* **axis** axis
|
||||
|
||||
.. c:function:: void glm_rotate_atm(mat4 m, vec3 pivot, float angle, vec3 axis)
|
||||
|
||||
| creates NEW rotation matrix by angle and axis at given point
|
||||
| this creates rotation matrix, it assumes you don't have a matrix
|
||||
|
||||
| this should work faster than glm_rotate_at because it reduces one glm_translate.
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** affine transfrom
|
||||
| *[in]* **pivot** pivot, anchor point, rotation center
|
||||
| *[in]* **angle** angle (radians)
|
||||
| *[in]* **axis** axis
|
||||
|
||||
.. c:function:: void glm_decompose_scalev(mat4 m, vec3 s)
|
||||
|
||||
decompose scale vector
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** affine transform
|
||||
| *[out]* **s** scale vector (Sx, Sy, Sz)
|
||||
|
||||
.. c:function:: bool glm_uniscaled(mat4 m)
|
||||
|
||||
returns true if matrix is uniform scaled.
|
||||
This is helpful for creating normal matrix.
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** matrix
|
||||
|
||||
.. c:function:: void glm_decompose_rs(mat4 m, mat4 r, vec3 s)
|
||||
|
||||
decompose rotation matrix (mat4) and scale vector [Sx, Sy, Sz]
|
||||
DON'T pass projected matrix here
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** affine transform
|
||||
| *[out]* **r** rotation matrix
|
||||
| *[out]* **s** scale matrix
|
||||
|
||||
.. c:function:: void glm_decompose(mat4 m, vec4 t, mat4 r, vec3 s)
|
||||
|
||||
decompose affine transform, TODO: extract shear factors.
|
||||
DON'T pass projected matrix here
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** affine transfrom
|
||||
| *[out]* **t** translation vector
|
||||
| *[out]* **r** rotation matrix (mat4)
|
||||
| *[out]* **s** scaling vector [X, Y, Z]
|
48
external/cglm/docs/source/api.rst
vendored
Normal file
48
external/cglm/docs/source/api.rst
vendored
Normal file
|
@ -0,0 +1,48 @@
|
|||
API documentation
|
||||
================================
|
||||
|
||||
Some functions may exist twice,
|
||||
once for their namespace and once for global namespace
|
||||
to make easier to write very common functions
|
||||
|
||||
For instance, in general we use :code:`glm_vec_dot` to get dot product
|
||||
of two **vec3**. Now we can also do this with :code:`glm_dot`,
|
||||
same for *_cross* and so on...
|
||||
|
||||
The original function stays where it is, the function in global namespace
|
||||
of same name is just an alias, so there is no call version of those functions.
|
||||
e.g there is no func like :code:`glmc_dot` because *glm_dot* is just alias for
|
||||
:code:`glm_vec_dot`
|
||||
|
||||
By including **cglm/cglm.h** header you will include all inline version
|
||||
of functions. Since functions in this header[s] are inline you don't need to
|
||||
build or link *cglm* against your project.
|
||||
|
||||
But by including **cglm/call.h** header you will include all *non-inline*
|
||||
version of functions. You need to build *cglm* and link it.
|
||||
Follow the :doc:`build` documentation for this
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
:caption: API categories:
|
||||
|
||||
affine
|
||||
affine-mat
|
||||
cam
|
||||
frustum
|
||||
box
|
||||
quat
|
||||
euler
|
||||
mat4
|
||||
mat3
|
||||
vec3
|
||||
vec3-ext
|
||||
vec4
|
||||
vec4-ext
|
||||
color
|
||||
plane
|
||||
project
|
||||
util
|
||||
io
|
||||
call
|
||||
sphere
|
181
external/cglm/docs/source/box.rst
vendored
Normal file
181
external/cglm/docs/source/box.rst
vendored
Normal file
|
@ -0,0 +1,181 @@
|
|||
.. default-domain:: C
|
||||
|
||||
axis aligned bounding box (AABB)
|
||||
================================================================================
|
||||
|
||||
Header: cglm/box.h
|
||||
|
||||
Some convenient functions provided for AABB.
|
||||
|
||||
**Definition of box:**
|
||||
|
||||
cglm defines box as two dimensional array of vec3.
|
||||
The first element is **min** point and the second one is **max** point.
|
||||
If you have another type e.g. struct or even another representation then you must
|
||||
convert it before and after call cglm box function.
|
||||
|
||||
Table of contents (click to go):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Functions:
|
||||
|
||||
1. :c:func:`glm_aabb_transform`
|
||||
#. :c:func:`glm_aabb_merge`
|
||||
#. :c:func:`glm_aabb_crop`
|
||||
#. :c:func:`glm_aabb_crop_until`
|
||||
#. :c:func:`glm_aabb_frustum`
|
||||
#. :c:func:`glm_aabb_invalidate`
|
||||
#. :c:func:`glm_aabb_isvalid`
|
||||
#. :c:func:`glm_aabb_size`
|
||||
#. :c:func:`glm_aabb_radius`
|
||||
#. :c:func:`glm_aabb_center`
|
||||
#. :c:func:`glm_aabb_aabb`
|
||||
#. :c:func:`glm_aabb_sphere`
|
||||
#. :c:func:`glm_aabb_point`
|
||||
#. :c:func:`glm_aabb_contains`
|
||||
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. c:function:: void glm_aabb_transform(vec3 box[2], mat4 m, vec3 dest[2])
|
||||
|
||||
| apply transform to Axis-Aligned Bounding Box
|
||||
|
||||
Parameters:
|
||||
| *[in]* **box** bounding box
|
||||
| *[in]* **m** transform matrix
|
||||
| *[out]* **dest** transformed bounding box
|
||||
|
||||
.. c:function:: void glm_aabb_merge(vec3 box1[2], vec3 box2[2], vec3 dest[2])
|
||||
|
||||
| merges two AABB bounding box and creates new one
|
||||
|
||||
two box must be in same space, if one of box is in different space then
|
||||
you should consider to convert it's space by glm_box_space
|
||||
|
||||
Parameters:
|
||||
| *[in]* **box1** bounding box 1
|
||||
| *[in]* **box2** bounding box 2
|
||||
| *[out]* **dest** merged bounding box
|
||||
|
||||
.. c:function:: void glm_aabb_crop(vec3 box[2], vec3 cropBox[2], vec3 dest[2])
|
||||
|
||||
| crops a bounding box with another one.
|
||||
|
||||
this could be useful for gettng a bbox which fits with view frustum and
|
||||
object bounding boxes. In this case you crop view frustum box with objects
|
||||
box
|
||||
|
||||
Parameters:
|
||||
| *[in]* **box** bounding box 1
|
||||
| *[in]* **cropBox** crop box
|
||||
| *[out]* **dest** cropped bounding box
|
||||
|
||||
.. c:function:: void glm_aabb_crop_until(vec3 box[2], vec3 cropBox[2], vec3 clampBox[2], vec3 dest[2])
|
||||
|
||||
| crops a bounding box with another one.
|
||||
|
||||
this could be useful for gettng a bbox which fits with view frustum and
|
||||
object bounding boxes. In this case you crop view frustum box with objects
|
||||
box
|
||||
|
||||
Parameters:
|
||||
| *[in]* **box** bounding box
|
||||
| *[in]* **cropBox** crop box
|
||||
| *[in]* **clampBox** miniumum box
|
||||
| *[out]* **dest** cropped bounding box
|
||||
|
||||
.. c:function:: bool glm_aabb_frustum(vec3 box[2], vec4 planes[6])
|
||||
|
||||
| check if AABB intersects with frustum planes
|
||||
|
||||
this could be useful for frustum culling using AABB.
|
||||
|
||||
OPTIMIZATION HINT:
|
||||
if planes order is similar to LEFT, RIGHT, BOTTOM, TOP, NEAR, FAR
|
||||
then this method should run even faster because it would only use two
|
||||
planes if object is not inside the two planes
|
||||
fortunately cglm extracts planes as this order! just pass what you got!
|
||||
|
||||
Parameters:
|
||||
| *[in]* **box** bounding box
|
||||
| *[out]* **planes** frustum planes
|
||||
|
||||
.. c:function:: void glm_aabb_invalidate(vec3 box[2])
|
||||
|
||||
| invalidate AABB min and max values
|
||||
|
||||
| It fills *max* values with -FLT_MAX and *min* values with +FLT_MAX
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **box** bounding box
|
||||
|
||||
.. c:function:: bool glm_aabb_isvalid(vec3 box[2])
|
||||
|
||||
| check if AABB is valid or not
|
||||
|
||||
Parameters:
|
||||
| *[in]* **box** bounding box
|
||||
|
||||
Returns:
|
||||
returns true if aabb is valid otherwise false
|
||||
|
||||
.. c:function:: float glm_aabb_size(vec3 box[2])
|
||||
|
||||
| distance between of min and max
|
||||
|
||||
Parameters:
|
||||
| *[in]* **box** bounding box
|
||||
|
||||
Returns:
|
||||
distance between min - max
|
||||
|
||||
.. c:function:: float glm_aabb_radius(vec3 box[2])
|
||||
|
||||
| radius of sphere which surrounds AABB
|
||||
|
||||
Parameters:
|
||||
| *[in]* **box** bounding box
|
||||
|
||||
.. c:function:: void glm_aabb_center(vec3 box[2], vec3 dest)
|
||||
|
||||
| computes center point of AABB
|
||||
|
||||
Parameters:
|
||||
| *[in]* **box** bounding box
|
||||
| *[out]* **dest** center of bounding box
|
||||
|
||||
.. c:function:: bool glm_aabb_aabb(vec3 box[2], vec3 other[2])
|
||||
|
||||
| check if two AABB intersects
|
||||
|
||||
Parameters:
|
||||
| *[in]* **box** bounding box
|
||||
| *[out]* **other** other bounding box
|
||||
|
||||
.. c:function:: bool glm_aabb_sphere(vec3 box[2], vec4 s)
|
||||
|
||||
| check if AABB intersects with sphere
|
||||
|
||||
| https://github.com/erich666/GraphicsGems/blob/master/gems/BoxSphere.c
|
||||
| Solid Box - Solid Sphere test.
|
||||
|
||||
Parameters:
|
||||
| *[in]* **box** solid bounding box
|
||||
| *[out]* **s** solid sphere
|
||||
|
||||
.. c:function:: bool glm_aabb_point(vec3 box[2], vec3 point)
|
||||
|
||||
| check if point is inside of AABB
|
||||
|
||||
Parameters:
|
||||
| *[in]* **box** bounding box
|
||||
| *[out]* **point** point
|
||||
|
||||
.. c:function:: bool glm_aabb_contains(vec3 box[2], vec3 other[2])
|
||||
|
||||
| check if AABB contains other AABB
|
||||
|
||||
Parameters:
|
||||
| *[in]* **box** bounding box
|
||||
| *[out]* **other** other bounding box
|
19
external/cglm/docs/source/call.rst
vendored
Normal file
19
external/cglm/docs/source/call.rst
vendored
Normal file
|
@ -0,0 +1,19 @@
|
|||
.. default-domain:: C
|
||||
|
||||
precompiled functions (call)
|
||||
================================================================================
|
||||
|
||||
All funcitons in **glm_** namespace are forced to **inline**.
|
||||
Most functions also have pre-compiled version.
|
||||
|
||||
Precompiled versions are in **glmc_** namespace. *c* in the namespace stands for
|
||||
"call".
|
||||
|
||||
Since precompiled functions are just wrapper for inline verisons,
|
||||
these functions are not documented individually.
|
||||
It would be duplicate documentation also it
|
||||
would be hard to sync documentation between inline and call verison for me.
|
||||
|
||||
By including **clgm/cglm.h** you include all inline verisons. To get precompiled
|
||||
versions you need to include **cglm/call.h** header it also includes all
|
||||
call versions plus *clgm/cglm.h* (inline verisons)
|
302
external/cglm/docs/source/cam.rst
vendored
Normal file
302
external/cglm/docs/source/cam.rst
vendored
Normal file
|
@ -0,0 +1,302 @@
|
|||
.. default-domain:: C
|
||||
|
||||
camera
|
||||
======
|
||||
|
||||
Header: cglm/cam.h
|
||||
|
||||
There are many convenient functions for camera. For instance :c:func:`glm_look`
|
||||
is just wrapper for :c:func:`glm_lookat`. Sometimes you only have direction
|
||||
instead of target, so that makes easy to build view matrix using direction.
|
||||
There is also :c:func:`glm_look_anyup` function which can help build view matrix
|
||||
without providing UP axis. It uses :c:func:`glm_vec_ortho` to get a UP axis and
|
||||
builds view matrix.
|
||||
|
||||
You can also *_default* versions of ortho and perspective to build projection
|
||||
fast if you don't care specific projection values.
|
||||
|
||||
*_decomp* means decompose; these function can help to decompose projection
|
||||
matrices.
|
||||
|
||||
**NOTE**: Be careful when working with high range (very small near, very large
|
||||
far) projection matrices. You may not get exact value you gave.
|
||||
**float** type cannot store very high precision so you will lose precision.
|
||||
Also your projection matrix will be inaccurate due to losing precision
|
||||
|
||||
Table of contents (click to go):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Functions:
|
||||
|
||||
1. :c:func:`glm_frustum`
|
||||
#. :c:func:`glm_ortho`
|
||||
#. :c:func:`glm_ortho_aabb`
|
||||
#. :c:func:`glm_ortho_aabb_p`
|
||||
#. :c:func:`glm_ortho_aabb_pz`
|
||||
#. :c:func:`glm_ortho_default`
|
||||
#. :c:func:`glm_ortho_default_s`
|
||||
#. :c:func:`glm_perspective`
|
||||
#. :c:func:`glm_perspective_default`
|
||||
#. :c:func:`glm_perspective_resize`
|
||||
#. :c:func:`glm_lookat`
|
||||
#. :c:func:`glm_look`
|
||||
#. :c:func:`glm_look_anyup`
|
||||
#. :c:func:`glm_persp_decomp`
|
||||
#. :c:func:`glm_persp_decompv`
|
||||
#. :c:func:`glm_persp_decomp_x`
|
||||
#. :c:func:`glm_persp_decomp_y`
|
||||
#. :c:func:`glm_persp_decomp_z`
|
||||
#. :c:func:`glm_persp_decomp_far`
|
||||
#. :c:func:`glm_persp_decomp_near`
|
||||
#. :c:func:`glm_persp_fovy`
|
||||
#. :c:func:`glm_persp_aspect`
|
||||
#. :c:func:`glm_persp_sizes`
|
||||
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. c:function:: void glm_frustum(float left, float right, float bottom, float top, float nearVal, float farVal, mat4 dest)
|
||||
|
||||
| set up perspective peprojection matrix
|
||||
|
||||
Parameters:
|
||||
| *[in]* **left** viewport.left
|
||||
| *[in]* **right** viewport.right
|
||||
| *[in]* **bottom** viewport.bottom
|
||||
| *[in]* **top** viewport.top
|
||||
| *[in]* **nearVal** near clipping plane
|
||||
| *[in]* **farVal** far clipping plane
|
||||
| *[out]* **dest** result matrix
|
||||
|
||||
.. c:function:: void glm_ortho(float left, float right, float bottom, float top, float nearVal, float farVal, mat4 dest)
|
||||
|
||||
| set up orthographic projection matrix
|
||||
|
||||
Parameters:
|
||||
| *[in]* **left** viewport.left
|
||||
| *[in]* **right** viewport.right
|
||||
| *[in]* **bottom** viewport.bottom
|
||||
| *[in]* **top** viewport.top
|
||||
| *[in]* **nearVal** near clipping plane
|
||||
| *[in]* **farVal** far clipping plane
|
||||
| *[out]* **dest** result matrix
|
||||
|
||||
.. c:function:: void glm_ortho_aabb(vec3 box[2], mat4 dest)
|
||||
|
||||
| set up orthographic projection matrix using bounding box
|
||||
| bounding box (AABB) must be in view space
|
||||
|
||||
Parameters:
|
||||
| *[in]* **box** AABB
|
||||
| *[in]* **dest** result matrix
|
||||
|
||||
.. c:function:: void glm_ortho_aabb_p(vec3 box[2], float padding, mat4 dest)
|
||||
|
||||
| set up orthographic projection matrix using bounding box
|
||||
| bounding box (AABB) must be in view space
|
||||
|
||||
this version adds padding to box
|
||||
|
||||
Parameters:
|
||||
| *[in]* **box** AABB
|
||||
| *[in]* **padding** padding
|
||||
| *[out]* **d** result matrix
|
||||
|
||||
.. c:function:: void glm_ortho_aabb_pz(vec3 box[2], float padding, mat4 dest)
|
||||
|
||||
| set up orthographic projection matrix using bounding box
|
||||
| bounding box (AABB) must be in view space
|
||||
|
||||
this version adds Z padding to box
|
||||
|
||||
Parameters:
|
||||
| *[in]* **box** AABB
|
||||
| *[in]* **padding** padding for near and far
|
||||
| *[out]* **d** result matrix
|
||||
|
||||
Returns:
|
||||
square of norm / magnitude
|
||||
|
||||
.. c:function:: void glm_ortho_default(float aspect, mat4 dest)
|
||||
|
||||
| set up unit orthographic projection matrix
|
||||
|
||||
Parameters:
|
||||
| *[in]* **aspect** aspect ration ( width / height )
|
||||
| *[out]* **dest** result matrix
|
||||
|
||||
.. c:function:: void glm_ortho_default_s(float aspect, float size, mat4 dest)
|
||||
|
||||
| set up orthographic projection matrix with given CUBE size
|
||||
|
||||
Parameters:
|
||||
| *[in]* **aspect** aspect ration ( width / height )
|
||||
| *[in]* **size** cube size
|
||||
| *[out]* **dest** result matrix
|
||||
|
||||
.. c:function:: void glm_perspective(float fovy, float aspect, float nearVal, float farVal, mat4 dest)
|
||||
|
||||
| set up perspective projection matrix
|
||||
|
||||
Parameters:
|
||||
| *[in]* **fovy** field of view angle
|
||||
| *[in]* **aspect** aspect ratio ( width / height )
|
||||
| *[in]* **nearVal** near clipping plane
|
||||
| *[in]* **farVal** far clipping planes
|
||||
| *[out]* **dest** result matrix
|
||||
|
||||
.. c:function:: void glm_perspective_default(float aspect, mat4 dest)
|
||||
|
||||
| set up perspective projection matrix with default near/far
|
||||
and angle values
|
||||
|
||||
Parameters:
|
||||
| *[in]* **aspect** aspect aspect ratio ( width / height )
|
||||
| *[out]* **dest** result matrix
|
||||
|
||||
.. c:function:: void glm_perspective_resize(float aspect, mat4 proj)
|
||||
|
||||
| resize perspective matrix by aspect ratio ( width / height )
|
||||
this makes very easy to resize proj matrix when window / viewport reized
|
||||
|
||||
Parameters:
|
||||
| *[in]* **aspect** aspect ratio ( width / height )
|
||||
| *[in, out]* **proj** perspective projection matrix
|
||||
|
||||
.. c:function:: void glm_lookat(vec3 eye, vec3 center, vec3 up, mat4 dest)
|
||||
|
||||
| set up view matrix
|
||||
|
||||
**NOTE:** The UP vector must not be parallel to the line of sight from the eye point to the reference point.
|
||||
|
||||
Parameters:
|
||||
| *[in]* **eye** eye vector
|
||||
| *[in]* **center** center vector
|
||||
| *[in]* **up** up vector
|
||||
| *[out]* **dest** result matrix
|
||||
|
||||
.. c:function:: void glm_look(vec3 eye, vec3 dir, vec3 up, mat4 dest)
|
||||
|
||||
| set up view matrix
|
||||
|
||||
convenient wrapper for :c:func:`glm_lookat`: if you only have direction not
|
||||
target self then this might be useful. Because you need to get target
|
||||
from direction.
|
||||
|
||||
**NOTE:** The UP vector must not be parallel to the line of sight from the eye point to the reference point.
|
||||
|
||||
Parameters:
|
||||
| *[in]* **eye** eye vector
|
||||
| *[in]* **center** direction vector
|
||||
| *[in]* **up** up vector
|
||||
| *[out]* **dest** result matrix
|
||||
|
||||
.. c:function:: void glm_look_anyup(vec3 eye, vec3 dir, mat4 dest)
|
||||
|
||||
| set up view matrix
|
||||
|
||||
convenient wrapper for :c:func:`glm_look` if you only have direction
|
||||
and if you don't care what UP vector is then this might be useful
|
||||
to create view matrix
|
||||
|
||||
Parameters:
|
||||
| *[in]* **eye** eye vector
|
||||
| *[in]* **center** direction vector
|
||||
| *[out]* **dest** result matrix
|
||||
|
||||
.. c:function:: void glm_persp_decomp(mat4 proj, float *nearVal, float *farVal, float *top, float *bottom, float *left, float *right)
|
||||
|
||||
| decomposes frustum values of perspective projection.
|
||||
|
||||
Parameters:
|
||||
| *[in]* **eye** perspective projection matrix
|
||||
| *[out]* **nearVal** near
|
||||
| *[out]* **farVal** far
|
||||
| *[out]* **top** top
|
||||
| *[out]* **bottom** bottom
|
||||
| *[out]* **left** left
|
||||
| *[out]* **right** right
|
||||
|
||||
.. c:function:: void glm_persp_decompv(mat4 proj, float dest[6])
|
||||
|
||||
| decomposes frustum values of perspective projection.
|
||||
| this makes easy to get all values at once
|
||||
|
||||
Parameters:
|
||||
| *[in]* **proj** perspective projection matrix
|
||||
| *[out]* **dest** array
|
||||
|
||||
.. c:function:: void glm_persp_decomp_x(mat4 proj, float *left, float *right)
|
||||
|
||||
| decomposes left and right values of perspective projection.
|
||||
| x stands for x axis (left / right axis)
|
||||
|
||||
Parameters:
|
||||
| *[in]* **proj** perspective projection matrix
|
||||
| *[out]* **left** left
|
||||
| *[out]* **right** right
|
||||
|
||||
.. c:function:: void glm_persp_decomp_y(mat4 proj, float *top, float *bottom)
|
||||
|
||||
| decomposes top and bottom values of perspective projection.
|
||||
| y stands for y axis (top / botom axis)
|
||||
|
||||
Parameters:
|
||||
| *[in]* **proj** perspective projection matrix
|
||||
| *[out]* **top** top
|
||||
| *[out]* **bottom** bottom
|
||||
|
||||
.. c:function:: void glm_persp_decomp_z(mat4 proj, float *nearVal, float *farVal)
|
||||
|
||||
| decomposes near and far values of perspective projection.
|
||||
| z stands for z axis (near / far axis)
|
||||
|
||||
Parameters:
|
||||
| *[in]* **proj** perspective projection matrix
|
||||
| *[out]* **nearVal** near
|
||||
| *[out]* **farVal** far
|
||||
|
||||
.. c:function:: void glm_persp_decomp_far(mat4 proj, float * __restrict farVal)
|
||||
|
||||
| decomposes far value of perspective projection.
|
||||
|
||||
Parameters:
|
||||
| *[in]* **proj** perspective projection matrix
|
||||
| *[out]* **farVal** far
|
||||
|
||||
.. c:function:: void glm_persp_decomp_near(mat4 proj, float * __restrict nearVal)
|
||||
|
||||
| decomposes near value of perspective projection.
|
||||
|
||||
Parameters:
|
||||
| *[in]* **proj** perspective projection matrix
|
||||
| *[out]* **nearVal** near
|
||||
|
||||
.. c:function:: float glm_persp_fovy(mat4 proj)
|
||||
|
||||
| returns field of view angle along the Y-axis (in radians)
|
||||
|
||||
if you need to degrees, use glm_deg to convert it or use this:
|
||||
fovy_deg = glm_deg(glm_persp_fovy(projMatrix))
|
||||
|
||||
Parameters:
|
||||
| *[in]* **proj** perspective projection matrix
|
||||
|
||||
Returns:
|
||||
| fovy in radians
|
||||
|
||||
.. c:function:: float glm_persp_aspect(mat4 proj)
|
||||
|
||||
| returns aspect ratio of perspective projection
|
||||
|
||||
Parameters:
|
||||
| *[in]* **proj** perspective projection matrix
|
||||
|
||||
.. c:function:: void glm_persp_sizes(mat4 proj, float fovy, vec4 dest)
|
||||
|
||||
| returns sizes of near and far planes of perspective projection
|
||||
|
||||
Parameters:
|
||||
| *[in]* **proj** perspective projection matrix
|
||||
| *[in]* **fovy** fovy (see brief)
|
||||
| *[out]* **dest** sizes order: [Wnear, Hnear, Wfar, Hfar]
|
BIN
external/cglm/docs/source/cglm-intro.png
vendored
Normal file
BIN
external/cglm/docs/source/cglm-intro.png
vendored
Normal file
Binary file not shown.
After Width: | Height: | Size: 72 KiB |
34
external/cglm/docs/source/color.rst
vendored
Normal file
34
external/cglm/docs/source/color.rst
vendored
Normal file
|
@ -0,0 +1,34 @@
|
|||
.. default-domain:: C
|
||||
|
||||
color
|
||||
================================================================================
|
||||
|
||||
Header: cglm/color.h
|
||||
|
||||
Table of contents (click to go):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Functions:
|
||||
|
||||
1. :c:func:`glm_luminance`
|
||||
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. c:function:: float glm_luminance(vec3 rgb)
|
||||
|
||||
| averages the color channels into one value
|
||||
|
||||
This function uses formula in COLLADA 1.5 spec which is
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
luminance = (color.r * 0.212671) +
|
||||
(color.g * 0.715160) +
|
||||
(color.b * 0.072169)
|
||||
|
||||
It is based on the ISO/CIE color standards (see ITU-R Recommendation BT.709-4),
|
||||
that averages the color channels into one value
|
||||
|
||||
Parameters:
|
||||
| *[in]* **rgb** RGB color
|
42
external/cglm/docs/source/conf.py
vendored
42
external/cglm/docs/source/conf.py
vendored
|
@ -30,7 +30,15 @@
|
|||
# Add any Sphinx extension module names here, as strings. They can be
|
||||
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
|
||||
# ones.
|
||||
extensions = []
|
||||
extensions = [
|
||||
'sphinx.ext.doctest',
|
||||
'sphinx.ext.todo',
|
||||
'sphinx.ext.coverage',
|
||||
'sphinx.ext.mathjax',
|
||||
'sphinx.ext.ifconfig',
|
||||
'sphinx.ext.viewcode',
|
||||
'sphinx.ext.githubpages'
|
||||
]
|
||||
|
||||
# Add any paths that contain templates here, relative to this directory.
|
||||
templates_path = ['_templates']
|
||||
|
@ -54,9 +62,9 @@ author = u'Recep Aslantas'
|
|||
# built documents.
|
||||
#
|
||||
# The short X.Y version.
|
||||
version = u'0.2.1'
|
||||
version = u'0.4.8'
|
||||
# The full version, including alpha/beta/rc tags.
|
||||
release = u'0.2.1'
|
||||
release = u'0.4.8'
|
||||
|
||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||
# for a list of supported languages.
|
||||
|
@ -161,3 +169,31 @@ texinfo_documents = [
|
|||
author, 'cglm', 'One line description of project.',
|
||||
'Miscellaneous'),
|
||||
]
|
||||
|
||||
# -- Options for Epub output -------------------------------------------------
|
||||
|
||||
# Bibliographic Dublin Core info.
|
||||
epub_title = project
|
||||
epub_author = author
|
||||
epub_publisher = author
|
||||
epub_copyright = copyright
|
||||
|
||||
# The unique identifier of the text. This can be a ISBN number
|
||||
# or the project homepage.
|
||||
#
|
||||
# epub_identifier = ''
|
||||
|
||||
# A unique identification for the text.
|
||||
#
|
||||
# epub_uid = ''
|
||||
|
||||
# A list of files that should not be packed into the epub file.
|
||||
epub_exclude_files = ['search.html']
|
||||
|
||||
|
||||
# -- Extension configuration -------------------------------------------------
|
||||
|
||||
# -- Options for todo extension ----------------------------------------------
|
||||
|
||||
# If true, `todo` and `todoList` produce output, else they produce nothing.
|
||||
todo_include_todos = True
|
||||
|
|
182
external/cglm/docs/source/euler.rst
vendored
Normal file
182
external/cglm/docs/source/euler.rst
vendored
Normal file
|
@ -0,0 +1,182 @@
|
|||
.. default-domain:: C
|
||||
|
||||
euler angles
|
||||
============
|
||||
|
||||
Header: cglm/euler.h
|
||||
|
||||
You may wonder what **glm_euler_sq** type ( **_sq** stands for sequence ) and
|
||||
:c:func:`glm_euler_by_order` do.
|
||||
I used them to convert euler angles in one coordinate system to another. For
|
||||
instance if you have **Z_UP** euler angles and if you want to convert it
|
||||
to **Y_UP** axis then :c:func:`glm_euler_by_order` is your friend. For more
|
||||
information check :c:func:`glm_euler_order` documentation
|
||||
|
||||
You must pass arrays as array, if you use C compiler then you can use something
|
||||
like this:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
float pitch, yaw, roll;
|
||||
mat4 rot;
|
||||
|
||||
/* pitch = ...; yaw = ...; roll = ... */
|
||||
glm_euler((vec3){pitch, yaw, roll}, rot);
|
||||
|
||||
Rotation Conveniention
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
Current *cglm*'s euler functions uses these convention:
|
||||
|
||||
* Tait–Bryan angles (x-y-z convention)
|
||||
* Intrinsic rotations (pitch, yaw and roll).
|
||||
This is reserve order of extrinsic (elevation, heading and bank) rotation
|
||||
* Right hand rule (actually all rotations in *cglm* use **RH**)
|
||||
* All angles used in *cglm* are **RADIANS** not degrees
|
||||
|
||||
|
||||
**NOTE**: The default :c:func:`glm_euler` function is the short name of
|
||||
:c:func:`glm_euler_xyz` this is why you can't see :c:func:`glm_euler_xyz`.
|
||||
When you see an euler function which doesn't have any X, Y, Z suffix then
|
||||
assume that uses **_xyz** (or instead it accept order as parameter).
|
||||
|
||||
If rotation doesn't work properly, your options:
|
||||
|
||||
1. If you use (or paste) degrees convert it to radians before calling an euler function
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
float pitch, yaw, roll;
|
||||
mat4 rot;
|
||||
|
||||
/* pitch = degrees; yaw = degrees; roll = degrees */
|
||||
glm_euler((vec3){glm_rad(pitch), glm_rad(yaw), glm_rad(roll)}, rot);
|
||||
|
||||
2. Convention mismatch. You may have extrinsic angles,
|
||||
if you do (if you must) then consider to use reverse order e.g if you have
|
||||
**xyz** extrinsic then use **zyx**
|
||||
|
||||
3. *cglm* may implemented it wrong, consider to create an issue to report it
|
||||
or pull request to fix it
|
||||
|
||||
Table of contents (click to go):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Types:
|
||||
|
||||
1. glm_euler_sq
|
||||
|
||||
Functions:
|
||||
|
||||
1. :c:func:`glm_euler_order`
|
||||
#. :c:func:`glm_euler_angles`
|
||||
#. :c:func:`glm_euler`
|
||||
#. :c:func:`glm_euler_xyz`
|
||||
#. :c:func:`glm_euler_zyx`
|
||||
#. :c:func:`glm_euler_zxy`
|
||||
#. :c:func:`glm_euler_xzy`
|
||||
#. :c:func:`glm_euler_yzx`
|
||||
#. :c:func:`glm_euler_yxz`
|
||||
#. :c:func:`glm_euler_by_order`
|
||||
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. c:function:: glm_euler_sq glm_euler_order(int ord[3])
|
||||
|
||||
| packs euler angles order to glm_euler_sq enum.
|
||||
|
||||
To use :c:func:`glm_euler_by_order` function you need *glm_euler_sq*. You
|
||||
can get it with this function.
|
||||
|
||||
You can build param like this:
|
||||
|
||||
| X = 0, Y = 1, Z = 2
|
||||
|
||||
if you have ZYX order then you pass this: [2, 1, 0] = ZYX.
|
||||
if you have YXZ order then you pass this: [1, 0, 2] = YXZ
|
||||
|
||||
As you can see first item specifies which axis will be first then the
|
||||
second one specifies which one will be next an so on.
|
||||
|
||||
Parameters:
|
||||
| *[in]* **ord** euler angles order [Angle1, Angle2, Angle2]
|
||||
|
||||
Returns:
|
||||
packed euler order
|
||||
|
||||
.. c:function:: void glm_euler_angles(mat4 m, vec3 dest)
|
||||
|
||||
| extract euler angles (in radians) using xyz order
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** affine transform
|
||||
| *[out]* **dest** angles vector [x, y, z]
|
||||
|
||||
.. c:function:: void glm_euler(vec3 angles, mat4 dest)
|
||||
|
||||
| build rotation matrix from euler angles
|
||||
|
||||
this is alias of glm_euler_xyz function
|
||||
|
||||
Parameters:
|
||||
| *[in]* **angles** angles as vector [Xangle, Yangle, Zangle]
|
||||
| *[in]* **dest** rotation matrix
|
||||
|
||||
.. c:function:: void glm_euler_xyz(vec3 angles, mat4 dest)
|
||||
|
||||
| build rotation matrix from euler angles
|
||||
|
||||
Parameters:
|
||||
| *[in]* **angles** angles as vector [Xangle, Yangle, Zangle]
|
||||
| *[in]* **dest** rotation matrix
|
||||
|
||||
.. c:function:: void glm_euler_zyx(vec3 angles, mat4 dest)
|
||||
|
||||
| build rotation matrix from euler angles
|
||||
|
||||
Parameters:
|
||||
| *[in]* **angles** angles as vector [Xangle, Yangle, Zangle]
|
||||
| *[in]* **dest** rotation matrix
|
||||
|
||||
.. c:function:: void glm_euler_zxy(vec3 angles, mat4 dest)
|
||||
|
||||
| build rotation matrix from euler angles
|
||||
|
||||
Parameters:
|
||||
| *[in]* **angles** angles as vector [Xangle, Yangle, Zangle]
|
||||
| *[in]* **dest** rotation matrix
|
||||
|
||||
.. c:function:: void glm_euler_xzy(vec3 angles, mat4 dest)
|
||||
|
||||
| build rotation matrix from euler angles
|
||||
|
||||
Parameters:
|
||||
| *[in]* **angles** angles as vector [Xangle, Yangle, Zangle]
|
||||
| *[in]* **dest** rotation matrix
|
||||
|
||||
.. c:function:: void glm_euler_yzx(vec3 angles, mat4 dest)
|
||||
|
||||
build rotation matrix from euler angles
|
||||
|
||||
Parameters:
|
||||
| *[in]* **angles** angles as vector [Xangle, Yangle, Zangle]
|
||||
| *[in]* **dest** rotation matrix
|
||||
|
||||
.. c:function:: void glm_euler_yxz(vec3 angles, mat4 dest)
|
||||
|
||||
| build rotation matrix from euler angles
|
||||
|
||||
Parameters:
|
||||
| *[in]* **angles** angles as vector [Xangle, Yangle, Zangle]
|
||||
| *[in]* **dest** rotation matrix
|
||||
|
||||
.. c:function:: void glm_euler_by_order(vec3 angles, glm_euler_sq ord, mat4 dest)
|
||||
|
||||
| build rotation matrix from euler angles with given euler order.
|
||||
|
||||
Use :c:func:`glm_euler_order` function to build *ord* parameter
|
||||
|
||||
Parameters:
|
||||
| *[in]* **angles** angles as vector [Xangle, Yangle, Zangle]
|
||||
| *[in]* **ord** euler order
|
||||
| *[in]* **dest** rotation matrix
|
168
external/cglm/docs/source/frustum.rst
vendored
Normal file
168
external/cglm/docs/source/frustum.rst
vendored
Normal file
|
@ -0,0 +1,168 @@
|
|||
.. default-domain:: C
|
||||
|
||||
frustum
|
||||
=============
|
||||
|
||||
Header: cglm/frustum.h
|
||||
|
||||
cglm provides convenient functions to extract frustum planes, corners...
|
||||
All extracted corners are **vec4** so you must create array of **vec4**
|
||||
not **vec3**. If you want to store them to save space you msut convert them
|
||||
yourself.
|
||||
|
||||
**vec4** is used to speed up functions need to corners. This is why frustum
|
||||
fucntions use *vec4* instead of *vec3*
|
||||
|
||||
Currenty related-functions use [-1, 1] clip space configuration to extract
|
||||
corners but you can override it by prodiving **GLM_CUSTOM_CLIPSPACE** macro.
|
||||
If you provide it then you have to all bottom macros as *vec4*
|
||||
|
||||
Current configuration:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
/* near */
|
||||
GLM_CSCOORD_LBN {-1.0f, -1.0f, -1.0f, 1.0f}
|
||||
GLM_CSCOORD_LTN {-1.0f, 1.0f, -1.0f, 1.0f}
|
||||
GLM_CSCOORD_RTN { 1.0f, 1.0f, -1.0f, 1.0f}
|
||||
GLM_CSCOORD_RBN { 1.0f, -1.0f, -1.0f, 1.0f}
|
||||
|
||||
/* far */
|
||||
GLM_CSCOORD_LBF {-1.0f, -1.0f, 1.0f, 1.0f}
|
||||
GLM_CSCOORD_LTF {-1.0f, 1.0f, 1.0f, 1.0f}
|
||||
GLM_CSCOORD_RTF { 1.0f, 1.0f, 1.0f, 1.0f}
|
||||
GLM_CSCOORD_RBF { 1.0f, -1.0f, 1.0f, 1.0f}
|
||||
|
||||
|
||||
Explain of short names:
|
||||
* **LBN**: left bottom near
|
||||
* **LTN**: left top near
|
||||
* **RTN**: right top near
|
||||
* **RBN**: right bottom near
|
||||
* **LBF**: left bottom far
|
||||
* **LTF**: left top far
|
||||
* **RTF**: right top far
|
||||
* **RBF**: right bottom far
|
||||
|
||||
Table of contents (click to go):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Macros:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
GLM_LBN 0 /* left bottom near */
|
||||
GLM_LTN 1 /* left top near */
|
||||
GLM_RTN 2 /* right top near */
|
||||
GLM_RBN 3 /* right bottom near */
|
||||
|
||||
GLM_LBF 4 /* left bottom far */
|
||||
GLM_LTF 5 /* left top far */
|
||||
GLM_RTF 6 /* right top far */
|
||||
GLM_RBF 7 /* right bottom far */
|
||||
|
||||
GLM_LEFT 0
|
||||
GLM_RIGHT 1
|
||||
GLM_BOTTOM 2
|
||||
GLM_TOP 3
|
||||
GLM_NEAR 4
|
||||
GLM_FAR 5
|
||||
|
||||
Functions:
|
||||
|
||||
1. :c:func:`glm_frustum_planes`
|
||||
#. :c:func:`glm_frustum_corners`
|
||||
#. :c:func:`glm_frustum_center`
|
||||
#. :c:func:`glm_frustum_box`
|
||||
#. :c:func:`glm_frustum_corners_at`
|
||||
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. c:function:: void glm_frustum_planes(mat4 m, vec4 dest[6])
|
||||
|
||||
| extracts view frustum planes
|
||||
|
||||
planes' space:
|
||||
- if m = proj: View Space
|
||||
- if m = viewProj: World Space
|
||||
- if m = MVP: Object Space
|
||||
|
||||
You probably want to extract planes in world space so use viewProj as m
|
||||
Computing viewProj:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
glm_mat4_mul(proj, view, viewProj);
|
||||
|
||||
Exracted planes order: [left, right, bottom, top, near, far]
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** matrix
|
||||
| *[out]* **dest** exracted view frustum planes
|
||||
|
||||
.. c:function:: void glm_frustum_corners(mat4 invMat, vec4 dest[8])
|
||||
|
||||
| extracts view frustum corners using clip-space coordinates
|
||||
|
||||
corners' space:
|
||||
- if m = invViewProj: World Space
|
||||
- if m = invMVP: Object Space
|
||||
|
||||
You probably want to extract corners in world space so use **invViewProj**
|
||||
Computing invViewProj:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
glm_mat4_mul(proj, view, viewProj);
|
||||
...
|
||||
glm_mat4_inv(viewProj, invViewProj);
|
||||
|
||||
if you have a near coord at **i** index,
|
||||
you can get it's far coord by i + 4;
|
||||
follow example below to understand that
|
||||
|
||||
For instance to find center coordinates between a near and its far coord:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
for (j = 0; j < 4; j++) {
|
||||
glm_vec_center(corners[i], corners[i + 4], centerCorners[i]);
|
||||
}
|
||||
|
||||
corners[i + 4] is far of corners[i] point.
|
||||
|
||||
Parameters:
|
||||
| *[in]* **invMat** matrix
|
||||
| *[out]* **dest** exracted view frustum corners
|
||||
|
||||
.. c:function:: void glm_frustum_center(vec4 corners[8], vec4 dest)
|
||||
|
||||
| finds center of view frustum
|
||||
|
||||
Parameters:
|
||||
| *[in]* **corners** view frustum corners
|
||||
| *[out]* **dest** view frustum center
|
||||
|
||||
.. c:function:: void glm_frustum_box(vec4 corners[8], mat4 m, vec3 box[2])
|
||||
|
||||
| finds bounding box of frustum relative to given matrix e.g. view mat
|
||||
|
||||
Parameters:
|
||||
| *[in]* **corners** view frustum corners
|
||||
| *[in]* **m** matrix to convert existing conners
|
||||
| *[out]* **box** bounding box as array [min, max]
|
||||
|
||||
.. c:function:: void glm_frustum_corners_at(vec4 corners[8], float splitDist, float farDist, vec4 planeCorners[4])
|
||||
|
||||
| finds planes corners which is between near and far planes (parallel)
|
||||
|
||||
this will be helpful if you want to split a frustum e.g. CSM/PSSM. This will
|
||||
find planes' corners but you will need to one more plane.
|
||||
Actually you have it, it is near, far or created previously with this func ;)
|
||||
|
||||
Parameters:
|
||||
| *[in]* **corners** frustum corners
|
||||
| *[in]* **splitDist** split distance
|
||||
| *[in]* **farDist** far distance (zFar)
|
||||
| *[out]* **planeCorners** plane corners [LB, LT, RT, RB]
|
49
external/cglm/docs/source/getting_started.rst
vendored
49
external/cglm/docs/source/getting_started.rst
vendored
|
@ -1,6 +1,9 @@
|
|||
Getting Started
|
||||
================================
|
||||
|
||||
Types:
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
**cglm** uses **glm** prefix for all functions e.g. glm_lookat. You can see supported types in common header file:
|
||||
|
||||
.. code-block:: c
|
||||
|
@ -18,23 +21,57 @@ Getting Started
|
|||
As you can see types don't store extra informations in favor of space.
|
||||
You can send these values e.g. matrix to OpenGL directly without casting or calling a function like *value_ptr*
|
||||
|
||||
*vec4* and *mat4* requires 16 byte aligment because vec4 and mat4 operations are
|
||||
Alignment is Required:
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
**vec4** and **mat4** requires 16 byte alignment because vec4 and mat4 operations are
|
||||
vectorized by SIMD instructions (SSE/AVX).
|
||||
|
||||
**UPDATE:**
|
||||
By starting v0.4.5 cglm provides an option to disable alignment requirement, it is enabled as default
|
||||
|
||||
| Check :doc:`opt` page for more details
|
||||
|
||||
Also alignment is disabled for older msvc verisons as default. Now alignment is only required in Visual Studio 2017 version 15.6+ if CGLM_ALL_UNALIGNED macro is not defined.
|
||||
|
||||
Allocations:
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
*cglm* doesn't alloc any memory on heap. So it doesn't provide any allocator.
|
||||
You must allocate memory yourself. You should alloc memory for out parameters too if you pass pointer of memory location.
|
||||
When allocating memory don't forget that **vec4** and **mat4** requires alignment.
|
||||
|
||||
**NOTE:** Unaligned vec4 and unaligned mat4 operations will be supported in the future. Check todo list.
|
||||
Because you may want to multiply a CGLM matrix with external matrix.
|
||||
There is no guarantee that non-CGLM matrix is aligned. Unaligned types will have *u* prefix e.g. **umat4**
|
||||
|
||||
Array vs Struct:
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
*cglm* uses arrays for vector and matrix types. So you can't access individual
|
||||
elements like vec.x, vec.y, vec.z... You must use subscript to access vector elements
|
||||
e.g. vec[0], vec[1], vec[2].
|
||||
|
||||
Also I think it is more meaningful to access matrix elements with subscript
|
||||
e.g **matrix[2][3]** instead of **matrix._23**. Since matrix is array of vectors,
|
||||
vectors are also defined as array. This makes types homogeneous.
|
||||
|
||||
**Return arrays?**
|
||||
|
||||
Since C doesn't support return arrays, cglm also doesn't support this feature.
|
||||
|
||||
Function design:
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. image:: cglm-intro.png
|
||||
:width: 492px
|
||||
:height: 297px
|
||||
:align: center
|
||||
|
||||
cglm provides a few way to call a function to do same operation.
|
||||
|
||||
* Inline - *glm_, glm_u*
|
||||
* aligned
|
||||
* unaligned (todo)
|
||||
* Pre-compiled - *glmc_, glmc_u*
|
||||
* aligned
|
||||
* unaligned (todo)
|
||||
|
||||
For instance **glm_mat4_mul** is inline (all *glm_* functions are inline), to make it non-inline (pre-compiled)
|
||||
For instance **glm_mat4_mul** is inline (all *glm_* functions are inline), to make it non-inline (pre-compiled),
|
||||
call it as **glmc_mat4_mul** from library, to use unaligned version use **glm_umat4_mul** (todo).
|
||||
|
||||
Most functions have **dest** parameter for output. For instance mat4_mul func looks like this:
|
||||
|
|
12
external/cglm/docs/source/index.rst
vendored
12
external/cglm/docs/source/index.rst
vendored
|
@ -9,7 +9,7 @@ Welcome to cglm's documentation!
|
|||
**cglm** is optimized 3D math library written in C99 (compatible with C89).
|
||||
It is similar to original **glm** library except this is mainly for **C**
|
||||
|
||||
This library stores matrices as row-major order but in the future column-major
|
||||
This library stores matrices as column-major order but in the future row-major
|
||||
is considered to be supported as optional.
|
||||
|
||||
Also currently only **float** type is supported for most operations.
|
||||
|
@ -28,14 +28,20 @@ Also currently only **float** type is supported for most operations.
|
|||
* euler angles / yaw-pitch-roll to matrix
|
||||
* extract euler angles
|
||||
* inline or pre-compiled function call
|
||||
* more features (todo)
|
||||
* frustum (extract view frustum planes, corners...)
|
||||
* bounding box (AABB in Frustum (culling), crop, merge...)
|
||||
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
:maxdepth: 1
|
||||
:caption: Table Of Contents:
|
||||
|
||||
build
|
||||
getting_started
|
||||
opengl
|
||||
api
|
||||
opt
|
||||
troubleshooting
|
||||
|
||||
Indices and tables
|
||||
==================
|
||||
|
|
102
external/cglm/docs/source/io.rst
vendored
Normal file
102
external/cglm/docs/source/io.rst
vendored
Normal file
|
@ -0,0 +1,102 @@
|
|||
.. default-domain:: C
|
||||
|
||||
io (input / output e.g. print)
|
||||
================================================================================
|
||||
|
||||
Header: cglm/io.h
|
||||
|
||||
There are some built-in print functions which may save your time,
|
||||
especially for debugging.
|
||||
|
||||
All functions accept **FILE** parameter which makes very flexible.
|
||||
You can even print it to file on disk.
|
||||
|
||||
In general you will want to print them to console to see results.
|
||||
You can use **stdout** and **stderr** to write results to console.
|
||||
Some programs may occupy **stdout** but you can still use **stderr**.
|
||||
Using **stderr** is suggested.
|
||||
|
||||
Example to print mat4 matrix:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
mat4 transform;
|
||||
/* ... */
|
||||
glm_mat4_print(transform, stderr);
|
||||
|
||||
**NOTE:** print functions use **%0.4f** precision if you need more
|
||||
(you probably will in some cases), you can change it temporary.
|
||||
cglm may provide precision parameter in the future
|
||||
|
||||
Table of contents (click to go):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Functions:
|
||||
|
||||
1. :c:func:`glm_mat4_print`
|
||||
#. :c:func:`glm_mat3_print`
|
||||
#. :c:func:`glm_vec4_print`
|
||||
#. :c:func:`glm_vec3_print`
|
||||
#. :c:func:`glm_ivec3_print`
|
||||
#. :c:func:`glm_versor_print`
|
||||
#. :c:func:`glm_aabb_print`
|
||||
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. c:function:: void glm_mat4_print(mat4 matrix, FILE * __restrict ostream)
|
||||
|
||||
| print mat4 to given stream
|
||||
|
||||
Parameters:
|
||||
| *[in]* **matrix** matrix
|
||||
| *[in]* **ostream** FILE to write
|
||||
|
||||
.. c:function:: void glm_mat3_print(mat3 matrix, FILE * __restrict ostream)
|
||||
|
||||
| print mat3 to given stream
|
||||
|
||||
Parameters:
|
||||
| *[in]* **matrix** matrix
|
||||
| *[in]* **ostream** FILE to write
|
||||
|
||||
.. c:function:: void glm_vec4_print(vec4 vec, FILE * __restrict ostream)
|
||||
|
||||
| print vec4 to given stream
|
||||
|
||||
Parameters:
|
||||
| *[in]* **vec** vector
|
||||
| *[in]* **ostream** FILE to write
|
||||
|
||||
.. c:function:: void glm_vec3_print(vec3 vec, FILE * __restrict ostream)
|
||||
|
||||
| print vec3 to given stream
|
||||
|
||||
Parameters:
|
||||
| *[in]* **vec** vector
|
||||
| *[in]* **ostream** FILE to write
|
||||
|
||||
.. c:function:: void glm_ivec3_print(ivec3 vec, FILE * __restrict ostream)
|
||||
|
||||
| print ivec3 to given stream
|
||||
|
||||
Parameters:
|
||||
| *[in]* **vec** vector
|
||||
| *[in]* **ostream** FILE to write
|
||||
|
||||
.. c:function:: void glm_versor_print(versor vec, FILE * __restrict ostream)
|
||||
|
||||
| print quaternion to given stream
|
||||
|
||||
Parameters:
|
||||
| *[in]* **vec** quaternion
|
||||
| *[in]* **ostream** FILE to write
|
||||
|
||||
.. c:function:: void glm_aabb_print(versor vec, const char * __restrict tag, FILE * __restrict ostream)
|
||||
|
||||
| print aabb to given stream
|
||||
|
||||
Parameters:
|
||||
| *[in]* **vec** aabb (axis-aligned bounding box)
|
||||
| *[in]* **tag** tag to find it more easly in logs
|
||||
| *[in]* **ostream** FILE to write
|
143
external/cglm/docs/source/mat3.rst
vendored
Normal file
143
external/cglm/docs/source/mat3.rst
vendored
Normal file
|
@ -0,0 +1,143 @@
|
|||
.. default-domain:: C
|
||||
|
||||
mat3
|
||||
====
|
||||
|
||||
Header: cglm/mat3.h
|
||||
|
||||
Table of contents (click to go):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Macros:
|
||||
|
||||
1. GLM_MAT3_IDENTITY_INIT
|
||||
#. GLM_MAT3_ZERO_INIT
|
||||
#. GLM_MAT3_IDENTITY
|
||||
#. GLM_MAT3_ZERO
|
||||
#. glm_mat3_dup(mat, dest)
|
||||
|
||||
Functions:
|
||||
|
||||
1. :c:func:`glm_mat3_copy`
|
||||
#. :c:func:`glm_mat3_identity`
|
||||
#. :c:func:`glm_mat3_mul`
|
||||
#. :c:func:`glm_mat3_transpose_to`
|
||||
#. :c:func:`glm_mat3_transpose`
|
||||
#. :c:func:`glm_mat3_mulv`
|
||||
#. :c:func:`glm_mat3_quat`
|
||||
#. :c:func:`glm_mat3_scale`
|
||||
#. :c:func:`glm_mat3_det`
|
||||
#. :c:func:`glm_mat3_inv`
|
||||
#. :c:func:`glm_mat3_swap_col`
|
||||
#. :c:func:`glm_mat3_swap_row`
|
||||
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. c:function:: void glm_mat3_copy(mat3 mat, mat3 dest)
|
||||
|
||||
copy mat3 to another one (dest).
|
||||
|
||||
Parameters:
|
||||
| *[in]* **mat** source
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_mat3_identity(mat3 mat)
|
||||
|
||||
copy identity mat3 to mat, or makes mat to identiy
|
||||
|
||||
Parameters:
|
||||
| *[out]* **mat** matrix
|
||||
|
||||
.. c:function:: void glm_mat3_mul(mat3 m1, mat3 m2, mat3 dest)
|
||||
|
||||
multiply m1 and m2 to dest
|
||||
m1, m2 and dest matrices can be same matrix, it is possible to write this:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
mat3 m = GLM_MAT3_IDENTITY_INIT;
|
||||
glm_mat3_mul(m, m, m);
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m1** left matrix
|
||||
| *[in]* **m2** right matrix
|
||||
| *[out]* **dest** destination matrix
|
||||
|
||||
.. c:function:: void glm_mat3_transpose_to(mat3 m, mat3 dest)
|
||||
|
||||
transpose mat4 and store in dest
|
||||
source matrix will not be transposed unless dest is m
|
||||
|
||||
Parameters:
|
||||
| *[in]* **mat** source
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_mat3_transpose(mat3 m)
|
||||
|
||||
tranpose mat3 and store result in same matrix
|
||||
|
||||
Parameters:
|
||||
| *[in]* **mat** source
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_mat3_mulv(mat3 m, vec3 v, vec3 dest)
|
||||
|
||||
multiply mat4 with vec4 (column vector) and store in dest vector
|
||||
|
||||
Parameters:
|
||||
| *[in]* **mat** mat3 (left)
|
||||
| *[in]* **v** vec3 (right, column vector)
|
||||
| *[out]* **dest** destination (result, column vector)
|
||||
|
||||
.. c:function:: void glm_mat3_quat(mat3 m, versor dest)
|
||||
|
||||
convert mat3 to quaternion
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** rotation matrix
|
||||
| *[out]* **dest** destination quaternion
|
||||
|
||||
.. c:function:: void glm_mat3_scale(mat3 m, float s)
|
||||
|
||||
multiply matrix with scalar
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **mat** matrix
|
||||
| *[in]* **dest** scalar
|
||||
|
||||
.. c:function:: float glm_mat3_det(mat3 mat)
|
||||
|
||||
returns mat3 determinant
|
||||
|
||||
Parameters:
|
||||
| *[in]* **mat** matrix
|
||||
|
||||
Returns:
|
||||
mat3 determinant
|
||||
|
||||
.. c:function:: void glm_mat3_inv(mat3 mat, mat3 dest)
|
||||
|
||||
inverse mat3 and store in dest
|
||||
|
||||
Parameters:
|
||||
| *[in]* **mat** matrix
|
||||
| *[out]* **dest** destination (inverse matrix)
|
||||
|
||||
.. c:function:: void glm_mat3_swap_col(mat3 mat, int col1, int col2)
|
||||
|
||||
swap two matrix columns
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **mat** matrix
|
||||
| *[in]* **col1** col1
|
||||
| *[in]* **col2** col2
|
||||
|
||||
.. c:function:: void glm_mat3_swap_row(mat3 mat, int row1, int row2)
|
||||
|
||||
swap two matrix rows
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **mat** matrix
|
||||
| *[in]* **row1** row1
|
||||
| *[in]* **row2** row2
|
240
external/cglm/docs/source/mat4.rst
vendored
Normal file
240
external/cglm/docs/source/mat4.rst
vendored
Normal file
|
@ -0,0 +1,240 @@
|
|||
.. default-domain:: C
|
||||
|
||||
mat4
|
||||
====
|
||||
|
||||
Header: cglm/mat4.h
|
||||
|
||||
Important: :c:func:`glm_mat4_scale` multiplies mat4 with scalar, if you need to
|
||||
apply scale transform use :c:func:`glm_scale` functions.
|
||||
|
||||
Table of contents (click to go):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Macros:
|
||||
|
||||
1. GLM_MAT4_IDENTITY_INIT
|
||||
#. GLM_MAT4_ZERO_INIT
|
||||
#. GLM_MAT4_IDENTITY
|
||||
#. GLM_MAT4_ZERO
|
||||
#. glm_mat4_udup(mat, dest)
|
||||
#. glm_mat4_dup(mat, dest)
|
||||
|
||||
Functions:
|
||||
|
||||
1. :c:func:`glm_mat4_ucopy`
|
||||
#. :c:func:`glm_mat4_copy`
|
||||
#. :c:func:`glm_mat4_identity`
|
||||
#. :c:func:`glm_mat4_pick3`
|
||||
#. :c:func:`glm_mat4_pick3t`
|
||||
#. :c:func:`glm_mat4_ins3`
|
||||
#. :c:func:`glm_mat4_mul`
|
||||
#. :c:func:`glm_mat4_mulN`
|
||||
#. :c:func:`glm_mat4_mulv`
|
||||
#. :c:func:`glm_mat4_mulv3`
|
||||
#. :c:func:`glm_mat4_quat`
|
||||
#. :c:func:`glm_mat4_transpose_to`
|
||||
#. :c:func:`glm_mat4_transpose`
|
||||
#. :c:func:`glm_mat4_scale_p`
|
||||
#. :c:func:`glm_mat4_scale`
|
||||
#. :c:func:`glm_mat4_det`
|
||||
#. :c:func:`glm_mat4_inv`
|
||||
#. :c:func:`glm_mat4_inv_fast`
|
||||
#. :c:func:`glm_mat4_swap_col`
|
||||
#. :c:func:`glm_mat4_swap_row`
|
||||
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. c:function:: void glm_mat4_ucopy(mat4 mat, mat4 dest)
|
||||
|
||||
copy mat4 to another one (dest). u means align is not required for dest
|
||||
|
||||
Parameters:
|
||||
| *[in]* **mat** source
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_mat4_copy(mat4 mat, mat4 dest)
|
||||
|
||||
copy mat4 to another one (dest).
|
||||
|
||||
Parameters:
|
||||
| *[in]* **mat** source
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_mat4_identity(mat4 mat)
|
||||
|
||||
copy identity mat4 to mat, or makes mat to identiy
|
||||
|
||||
Parameters:
|
||||
| *[out]* **mat** matrix
|
||||
|
||||
.. c:function:: void glm_mat4_pick3(mat4 mat, mat3 dest)
|
||||
|
||||
copy upper-left of mat4 to mat3
|
||||
|
||||
Parameters:
|
||||
| *[in]* **mat** source
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_mat4_pick3t(mat4 mat, mat4 dest)
|
||||
|
||||
copy upper-left of mat4 to mat3 (transposed)
|
||||
the postfix t stands for transpose
|
||||
|
||||
Parameters:
|
||||
| *[in]* **mat** source
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_mat4_ins3(mat3 mat, mat4 dest)
|
||||
|
||||
copy mat3 to mat4's upper-left. this function does not fill mat4's other
|
||||
elements. To do that use glm_mat4.
|
||||
|
||||
Parameters:
|
||||
| *[in]* **mat** source
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_mat4_mul(mat4 m1, mat4 m2, mat4 dest)
|
||||
|
||||
multiply m1 and m2 to dest
|
||||
m1, m2 and dest matrices can be same matrix, it is possible to write this:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
mat4 m = GLM_MAT4_IDENTITY_INIT;
|
||||
glm_mat4_mul(m, m, m);
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m1** left matrix
|
||||
| *[in]* **m2** right matrix
|
||||
| *[out]* **dest** destination matrix
|
||||
|
||||
.. c:function:: void glm_mat4_mulN(mat4 * __restrict matrices[], int len, mat4 dest)
|
||||
|
||||
mupliply N mat4 matrices and store result in dest
|
||||
| this function lets you multiply multiple (more than two or more...)
|
||||
| matrices
|
||||
|
||||
| multiplication will be done in loop, this may reduce instructions
|
||||
| size but if **len** is too small then compiler may unroll whole loop
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
mat m1, m2, m3, m4, res;
|
||||
glm_mat4_mulN((mat4 *[]){&m1, &m2, &m3, &m4}, 4, res);
|
||||
|
||||
Parameters:
|
||||
| *[in]* **matrices** array of mat4
|
||||
| *[in]* **len** matrices count
|
||||
| *[out]* **dest** destination matrix
|
||||
|
||||
.. c:function:: void glm_mat4_mulv(mat4 m, vec4 v, vec4 dest)
|
||||
|
||||
multiply mat4 with vec4 (column vector) and store in dest vector
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** mat4 (left)
|
||||
| *[in]* **v** vec4 (right, column vector)
|
||||
| *[out]* **dest** vec4 (result, column vector)
|
||||
|
||||
.. c:function:: void glm_mat4_mulv3(mat4 m, vec3 v, vec3 dest)
|
||||
|
||||
multiply vector with mat4's mat3 part(rotation)
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** mat4 (left)
|
||||
| *[in]* **v** vec3 (right, column vector)
|
||||
| *[out]* **dest** vec3 (result, column vector)
|
||||
|
||||
.. c:function:: void glm_mat4_quat(mat4 m, versor dest)
|
||||
|
||||
convert mat4's rotation part to quaternion
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** affine matrix
|
||||
| *[out]* **dest** destination quaternion
|
||||
|
||||
.. c:function:: void glm_mat4_transpose_to(mat4 m, mat4 dest)
|
||||
|
||||
transpose mat4 and store in dest
|
||||
source matrix will not be transposed unless dest is m
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** matrix
|
||||
| *[out]* **dest** destination matrix
|
||||
|
||||
.. c:function:: void glm_mat4_transpose(mat4 m)
|
||||
|
||||
tranpose mat4 and store result in same matrix
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** source
|
||||
| *[out]* **dest** destination matrix
|
||||
|
||||
.. c:function:: void glm_mat4_scale_p(mat4 m, float s)
|
||||
|
||||
scale (multiply with scalar) matrix without simd optimization
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** matrix
|
||||
| *[in]* **s** scalar
|
||||
|
||||
.. c:function:: void glm_mat4_scale(mat4 m, float s)
|
||||
|
||||
scale (multiply with scalar) matrix
|
||||
THIS IS NOT SCALE TRANSFORM, use glm_scale for that.
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** matrix
|
||||
| *[in]* **s** scalar
|
||||
|
||||
.. c:function:: float glm_mat4_det(mat4 mat)
|
||||
|
||||
mat4 determinant
|
||||
|
||||
Parameters:
|
||||
| *[in]* **mat** matrix
|
||||
|
||||
Return:
|
||||
| determinant
|
||||
|
||||
.. c:function:: void glm_mat4_inv(mat4 mat, mat4 dest)
|
||||
|
||||
inverse mat4 and store in dest
|
||||
|
||||
Parameters:
|
||||
| *[in]* **mat** source
|
||||
| *[out]* **dest** destination matrix (inverse matrix)
|
||||
|
||||
.. c:function:: void glm_mat4_inv_fast(mat4 mat, mat4 dest)
|
||||
|
||||
inverse mat4 and store in dest
|
||||
|
||||
| this func uses reciprocal approximation without extra corrections
|
||||
| e.g Newton-Raphson. this should work faster than normal,
|
||||
| to get more precise use glm_mat4_inv version.
|
||||
|
||||
| NOTE: You will lose precision, glm_mat4_inv is more accurate
|
||||
|
||||
Parameters:
|
||||
| *[in]* **mat** source
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_mat4_swap_col(mat4 mat, int col1, int col2)
|
||||
|
||||
swap two matrix columns
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **mat** matrix
|
||||
| *[in]* **col1** col1
|
||||
| *[in]* **col2** col2
|
||||
|
||||
.. c:function:: void glm_mat4_swap_row(mat4 mat, int row1, int row2)
|
||||
|
||||
swap two matrix rows
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **mat** matrix
|
||||
| *[in]* **row1** row1
|
||||
| *[in]* **row2** row2
|
61
external/cglm/docs/source/opengl.rst
vendored
Normal file
61
external/cglm/docs/source/opengl.rst
vendored
Normal file
|
@ -0,0 +1,61 @@
|
|||
How to send vector or matrix to OpenGL like API
|
||||
==================================================
|
||||
|
||||
*cglm*'s vector and matrix types are arrays. So you can send them directly to a
|
||||
function which accecpts pointer. But you may got warnings for matrix because it is
|
||||
two dimensional array.
|
||||
|
||||
Passing / Uniforming Matrix to OpenGL:
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
**glUniformMatrix4fv** accepts float pointer, you can pass matrix to that parameter
|
||||
and it should work but with warnings. "You can pass" doesn't mean that you must pass like that.
|
||||
|
||||
**Correct options:**
|
||||
|
||||
Correct doesn't mean correct way to use OpenGL it is just shows correct way to pass cglm type to it.
|
||||
|
||||
1. Pass first column
|
||||
---------------------
|
||||
|
||||
The goal is that pass address of matrix, first element of matrix is also address of matrix,
|
||||
because it is array of vectors and vector is array of floats.
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
mat4 matrix;
|
||||
/* ... */
|
||||
glUniformMatrix4fv(location, 1, GL_FALSE, matrix[0]);
|
||||
|
||||
array of matrices:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
mat4 matrix;
|
||||
/* ... */
|
||||
glUniformMatrix4fv(location, count, GL_FALSE, matrix[0][0]);
|
||||
|
||||
1. Cast matrix to pointer
|
||||
--------------------------
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
mat4 matrix;
|
||||
/* ... */
|
||||
glUniformMatrix4fv(location, count, GL_FALSE, (float *)matrix);
|
||||
|
||||
in this way, passing aray of matrices is same
|
||||
|
||||
Passing / Uniforming Vectors to OpenGL:¶
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
You don't need to do extra thing when passing cglm vectors to OpengL or other APIs.
|
||||
Because a function like **glUniform4fv** accepts vector as pointer. cglm's vectors
|
||||
are array of floats. So you can pass it directly ot those functions:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
vec4 vec;
|
||||
/* ... */
|
||||
glUniform4fv(location, 1, vec);
|
||||
|
||||
this show how to pass **vec4** others are same.
|
42
external/cglm/docs/source/opt.rst
vendored
Normal file
42
external/cglm/docs/source/opt.rst
vendored
Normal file
|
@ -0,0 +1,42 @@
|
|||
.. default-domain:: C
|
||||
|
||||
Options
|
||||
===============================================================================
|
||||
|
||||
A few options are provided via macros.
|
||||
|
||||
Alignment Option
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
As default, cglm requires types to be aligned. Alignment requirements:
|
||||
|
||||
vec3: 8 byte
|
||||
vec4: 16 byte
|
||||
mat4: 16 byte
|
||||
versor: 16 byte
|
||||
|
||||
By starting **v0.4.5** cglm provides an option to disable alignment requirement.
|
||||
To enable this option define **CGLM_ALL_UNALIGNED** macro before all headers.
|
||||
You can define it in Xcode, Visual Studio (or other IDEs) or you can also prefer
|
||||
to define it in build system. If you use pre-compiled verisons then you
|
||||
have to compile cglm with **CGLM_ALL_UNALIGNED** macro.
|
||||
|
||||
**VERY VERY IMPORTANT:** If you use cglm in multiple projects and
|
||||
those projects are depends on each other, then
|
||||
|
||||
| *ALWAYS* or *NEVER USE* **CGLM_ALL_UNALIGNED** macro in linked projects
|
||||
|
||||
if you do not know what you are doing. Because a cglm header included
|
||||
via 'project A' may force types to be aligned and another cglm header
|
||||
included via 'project B' may not require alignment. In this case
|
||||
cglm functions will read from and write to **INVALID MEMORY LOCATIONs**.
|
||||
|
||||
ALWAYS USE SAME CONFIGURATION / OPTION for **cglm** if you have multiple projects.
|
||||
|
||||
For instance if you set CGLM_ALL_UNALIGNED in a project then set it in other projects too
|
||||
|
||||
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.
|
33
external/cglm/docs/source/plane.rst
vendored
Normal file
33
external/cglm/docs/source/plane.rst
vendored
Normal file
|
@ -0,0 +1,33 @@
|
|||
.. default-domain:: C
|
||||
|
||||
plane
|
||||
================================================================================
|
||||
|
||||
Header: cglm/plane.h
|
||||
|
||||
Plane extract functions are in frustum header and documented
|
||||
in :doc:`frustum` page.
|
||||
|
||||
**Definition of plane:**
|
||||
|
||||
Plane equation: **Ax + By + Cz + D = 0**
|
||||
|
||||
Plan is stored in **vec4** as **[A, B, C, D]**. (A, B, C) is normal and D is distance
|
||||
|
||||
Table of contents (click to go):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Functions:
|
||||
|
||||
1. :c:func:`glm_plane_normalize`
|
||||
|
||||
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. c:function:: void glm_plane_normalize(vec4 plane)
|
||||
|
||||
| normalizes a plane
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **plane** pnale to normalize
|
102
external/cglm/docs/source/project.rst
vendored
Normal file
102
external/cglm/docs/source/project.rst
vendored
Normal file
|
@ -0,0 +1,102 @@
|
|||
.. default-domain:: C
|
||||
|
||||
Project / UnProject
|
||||
================================================================================
|
||||
|
||||
Header: cglm/project.h
|
||||
|
||||
Viewport is required as *vec4* **[X, Y, Width, Height]** but this doesn't mean
|
||||
that you should store it as **vec4**. You can convert your data representation
|
||||
to vec4 before passing it to related functions.
|
||||
|
||||
Table of contents (click to go):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Functions:
|
||||
|
||||
1. :c:func:`glm_unprojecti`
|
||||
#. :c:func:`glm_unproject`
|
||||
#. :c:func:`glm_project`
|
||||
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. c:function:: void glm_unprojecti(vec3 pos, mat4 invMat, vec4 vp, vec3 dest)
|
||||
|
||||
| maps the specified viewport coordinates into specified space [1]
|
||||
the matrix should contain projection matrix.
|
||||
|
||||
if you don't have ( and don't want to have ) an inverse matrix then use
|
||||
glm_unproject version. You may use existing inverse of matrix in somewhere
|
||||
else, this is why glm_unprojecti exists to save save inversion cost
|
||||
|
||||
[1] space:
|
||||
- if m = invProj: View Space
|
||||
- if m = invViewProj: World Space
|
||||
- if m = invMVP: Object Space
|
||||
|
||||
You probably want to map the coordinates into object space
|
||||
so use invMVP as m
|
||||
|
||||
Computing viewProj:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
glm_mat4_mul(proj, view, viewProj);
|
||||
glm_mat4_mul(viewProj, model, MVP);
|
||||
glm_mat4_inv(viewProj, invMVP);
|
||||
|
||||
Parameters:
|
||||
| *[in]* **pos** point/position in viewport coordinates
|
||||
| *[in]* **invMat** matrix (see brief)
|
||||
| *[in]* **vp** viewport as [x, y, width, height]
|
||||
| *[out]* **dest** unprojected coordinates
|
||||
|
||||
.. c:function:: void glm_unproject(vec3 pos, mat4 m, vec4 vp, vec3 dest)
|
||||
|
||||
| maps the specified viewport coordinates into specified space [1]
|
||||
the matrix should contain projection matrix.
|
||||
|
||||
this is same as glm_unprojecti except this function get inverse matrix for
|
||||
you.
|
||||
|
||||
[1] space:
|
||||
- if m = proj: View Space
|
||||
- if m = viewProj: World Space
|
||||
- if m = MVP: Object Space
|
||||
|
||||
You probably want to map the coordinates into object space so use MVP as m
|
||||
|
||||
Computing viewProj and MVP:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
glm_mat4_mul(proj, view, viewProj);
|
||||
glm_mat4_mul(viewProj, model, MVP);
|
||||
|
||||
Parameters:
|
||||
| *[in]* **pos** point/position in viewport coordinates
|
||||
| *[in]* **m** matrix (see brief)
|
||||
| *[in]* **vp** viewport as [x, y, width, height]
|
||||
| *[out]* **dest** unprojected coordinates
|
||||
|
||||
.. c:function:: void glm_project(vec3 pos, mat4 m, vec4 vp, vec3 dest)
|
||||
|
||||
| map object coordinates to window coordinates
|
||||
|
||||
Computing MVP:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
glm_mat4_mul(proj, view, viewProj);
|
||||
glm_mat4_mul(viewProj, model, MVP);
|
||||
|
||||
this could be useful for gettng a bbox which fits with view frustum and
|
||||
object bounding boxes. In this case you crop view frustum box with objects
|
||||
box
|
||||
|
||||
Parameters:
|
||||
| *[in]* **pos** object coordinates
|
||||
| *[in]* **m** MVP matrix
|
||||
| *[in]* **vp** viewport as [x, y, width, height]
|
||||
| *[out]* **dest** projected coordinates
|
380
external/cglm/docs/source/quat.rst
vendored
Normal file
380
external/cglm/docs/source/quat.rst
vendored
Normal file
|
@ -0,0 +1,380 @@
|
|||
.. default-domain:: C
|
||||
|
||||
quaternions
|
||||
===========
|
||||
|
||||
Header: cglm/quat.h
|
||||
|
||||
**Important:** *cglm* stores quaternion as **[x, y, z, w]** in memory
|
||||
since **v0.4.0** it was **[w, x, y, z]**
|
||||
before v0.4.0 ( **v0.3.5 and earlier** ). w is real part.
|
||||
|
||||
What you can do with quaternions with existing functions is (Some of them):
|
||||
|
||||
- You can rotate transform matrix using quaterion
|
||||
- You can rotate vector using quaterion
|
||||
- You can create view matrix using quaterion
|
||||
- You can create a lookrotation (from source point to dest)
|
||||
|
||||
Table of contents (click to go):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Macros:
|
||||
|
||||
1. GLM_QUAT_IDENTITY_INIT
|
||||
#. GLM_QUAT_IDENTITY
|
||||
|
||||
Functions:
|
||||
|
||||
1. :c:func:`glm_quat_identity`
|
||||
#. :c:func:`glm_quat_init`
|
||||
#. :c:func:`glm_quat`
|
||||
#. :c:func:`glm_quatv`
|
||||
#. :c:func:`glm_quat_copy`
|
||||
#. :c:func:`glm_quat_norm`
|
||||
#. :c:func:`glm_quat_normalize`
|
||||
#. :c:func:`glm_quat_normalize_to`
|
||||
#. :c:func:`glm_quat_dot`
|
||||
#. :c:func:`glm_quat_conjugate`
|
||||
#. :c:func:`glm_quat_inv`
|
||||
#. :c:func:`glm_quat_add`
|
||||
#. :c:func:`glm_quat_sub`
|
||||
#. :c:func:`glm_quat_real`
|
||||
#. :c:func:`glm_quat_imag`
|
||||
#. :c:func:`glm_quat_imagn`
|
||||
#. :c:func:`glm_quat_imaglen`
|
||||
#. :c:func:`glm_quat_angle`
|
||||
#. :c:func:`glm_quat_axis`
|
||||
#. :c:func:`glm_quat_mul`
|
||||
#. :c:func:`glm_quat_mat4`
|
||||
#. :c:func:`glm_quat_mat4t`
|
||||
#. :c:func:`glm_quat_mat3`
|
||||
#. :c:func:`glm_quat_mat3t`
|
||||
#. :c:func:`glm_quat_lerp`
|
||||
#. :c:func:`glm_quat_slerp`
|
||||
#. :c:func:`glm_quat_look`
|
||||
#. :c:func:`glm_quat_for`
|
||||
#. :c:func:`glm_quat_forp`
|
||||
#. :c:func:`glm_quat_rotatev`
|
||||
#. :c:func:`glm_quat_rotate`
|
||||
#. :c:func:`glm_quat_rotate_at`
|
||||
#. :c:func:`glm_quat_rotate_atm`
|
||||
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. c:function:: void glm_quat_identity(versor q)
|
||||
|
||||
| makes given quat to identity
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **q** quaternion
|
||||
|
||||
.. c:function:: void glm_quat_init(versor q, float x, float y, float z, float w)
|
||||
|
||||
| inits quaternion with given values
|
||||
|
||||
Parameters:
|
||||
| *[out]* **q** quaternion
|
||||
| *[in]* **x** imag.x
|
||||
| *[in]* **y** imag.y
|
||||
| *[in]* **z** imag.z
|
||||
| *[in]* **w** w (real part)
|
||||
|
||||
.. c:function:: void glm_quat(versor q, float angle, float x, float y, float z)
|
||||
|
||||
| creates NEW quaternion with individual axis components
|
||||
|
||||
| given axis will be normalized
|
||||
|
||||
Parameters:
|
||||
| *[out]* **q** quaternion
|
||||
| *[in]* **angle** angle (radians)
|
||||
| *[in]* **x** axis.x
|
||||
| *[in]* **y** axis.y
|
||||
| *[in]* **z** axis.z
|
||||
|
||||
.. c:function:: void glm_quatv(versor q, float angle, vec3 axis)
|
||||
|
||||
| creates NEW quaternion with axis vector
|
||||
|
||||
| given axis will be normalized
|
||||
|
||||
Parameters:
|
||||
| *[out]* **q** quaternion
|
||||
| *[in]* **angle** angle (radians)
|
||||
| *[in]* **axis** axis (will be normalized)
|
||||
|
||||
.. c:function:: void glm_quat_copy(versor q, versor dest)
|
||||
|
||||
| copy quaternion to another one
|
||||
|
||||
Parameters:
|
||||
| *[in]* **q** source quaternion
|
||||
| *[out]* **dest** destination quaternion
|
||||
|
||||
.. c:function:: float glm_quat_norm(versor q)
|
||||
|
||||
| returns norm (magnitude) of quaternion
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** quaternion
|
||||
|
||||
Returns:
|
||||
norm (magnitude)
|
||||
|
||||
.. c:function:: void glm_quat_normalize_to(versor q, versor dest)
|
||||
|
||||
| normalize quaternion and store result in dest, original one will not be normalized
|
||||
|
||||
Parameters:
|
||||
| *[in]* **q** quaternion to normalize into
|
||||
| *[out]* **dest** destination quaternion
|
||||
|
||||
.. c:function:: void glm_quat_normalize(versor q)
|
||||
|
||||
| normalize quaternion
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **q** quaternion
|
||||
|
||||
.. c:function:: float glm_quat_dot(versor p, versor q)
|
||||
|
||||
dot product of two quaternion
|
||||
|
||||
Parameters:
|
||||
| *[in]* **p** quaternion 1
|
||||
| *[in]* **q** quaternion 2
|
||||
|
||||
Returns:
|
||||
dot product
|
||||
|
||||
.. c:function:: void glm_quat_conjugate(versor q, versor dest)
|
||||
|
||||
conjugate of quaternion
|
||||
|
||||
Parameters:
|
||||
| *[in]* **q** quaternion
|
||||
| *[in]* **dest** conjugate
|
||||
|
||||
.. c:function:: void glm_quat_inv(versor q, versor dest)
|
||||
|
||||
inverse of non-zero quaternion
|
||||
|
||||
Parameters:
|
||||
| *[in]* **q** quaternion
|
||||
| *[in]* **dest** inverse quaternion
|
||||
|
||||
.. c:function:: void glm_quat_add(versor p, versor q, versor dest)
|
||||
|
||||
add (componentwise) two quaternions and store result in dest
|
||||
|
||||
Parameters:
|
||||
| *[in]* **p** quaternion 1
|
||||
| *[in]* **q** quaternion 2
|
||||
| *[in]* **dest** result quaternion
|
||||
|
||||
.. c:function:: void glm_quat_sub(versor p, versor q, versor dest)
|
||||
|
||||
subtract (componentwise) two quaternions and store result in dest
|
||||
|
||||
Parameters:
|
||||
| *[in]* **p** quaternion 1
|
||||
| *[in]* **q** quaternion 2
|
||||
| *[in]* **dest** result quaternion
|
||||
|
||||
.. c:function:: float glm_quat_real(versor q)
|
||||
|
||||
returns real part of quaternion
|
||||
|
||||
Parameters:
|
||||
| *[in]* **q** quaternion
|
||||
|
||||
Returns:
|
||||
real part (quat.w)
|
||||
|
||||
.. c:function:: void glm_quat_imag(versor q, vec3 dest)
|
||||
|
||||
returns imaginary part of quaternion
|
||||
|
||||
Parameters:
|
||||
| *[in]* **q** quaternion
|
||||
| *[out]* **dest** imag
|
||||
|
||||
.. c:function:: void glm_quat_imagn(versor q, vec3 dest)
|
||||
|
||||
returns normalized imaginary part of quaternion
|
||||
|
||||
Parameters:
|
||||
| *[in]* **q** quaternion
|
||||
| *[out]* **dest** imag
|
||||
|
||||
.. c:function:: float glm_quat_imaglen(versor q)
|
||||
|
||||
returns length of imaginary part of quaternion
|
||||
|
||||
Parameters:
|
||||
| *[in]* **q** quaternion
|
||||
|
||||
Returns:
|
||||
norm of imaginary part
|
||||
|
||||
.. c:function:: float glm_quat_angle(versor q)
|
||||
|
||||
returns angle of quaternion
|
||||
|
||||
Parameters:
|
||||
| *[in]* **q** quaternion
|
||||
|
||||
Returns:
|
||||
angles of quat (radians)
|
||||
|
||||
.. c:function:: void glm_quat_axis(versor q, versor dest)
|
||||
|
||||
axis of quaternion
|
||||
|
||||
Parameters:
|
||||
| *[in]* **p** quaternion
|
||||
| *[out]* **dest** axis of quaternion
|
||||
|
||||
.. c:function:: void glm_quat_mul(versor p, versor q, versor dest)
|
||||
|
||||
| multiplies two quaternion and stores result in dest
|
||||
|
||||
| this is also called Hamilton Product
|
||||
|
||||
| According to WikiPedia:
|
||||
| The product of two rotation quaternions [clarification needed] will be
|
||||
equivalent to the rotation q followed by the rotation p
|
||||
|
||||
Parameters:
|
||||
| *[in]* **p** quaternion 1 (first rotation)
|
||||
| *[in]* **q** quaternion 2 (second rotation)
|
||||
| *[out]* **dest** result quaternion
|
||||
|
||||
.. c:function:: void glm_quat_mat4(versor q, mat4 dest)
|
||||
|
||||
| convert quaternion to mat4
|
||||
|
||||
Parameters:
|
||||
| *[in]* **q** quaternion
|
||||
| *[out]* **dest** result matrix
|
||||
|
||||
.. c:function:: void glm_quat_mat4t(versor q, mat4 dest)
|
||||
|
||||
| convert quaternion to mat4 (transposed). This is transposed version of glm_quat_mat4
|
||||
|
||||
Parameters:
|
||||
| *[in]* **q** quaternion
|
||||
| *[out]* **dest** result matrix
|
||||
|
||||
.. c:function:: void glm_quat_mat3(versor q, mat3 dest)
|
||||
|
||||
| convert quaternion to mat3
|
||||
|
||||
Parameters:
|
||||
| *[in]* **q** quaternion
|
||||
| *[out]* **dest** result matrix
|
||||
|
||||
.. c:function:: void glm_quat_mat3t(versor q, mat3 dest)
|
||||
|
||||
| convert quaternion to mat3 (transposed). This is transposed version of glm_quat_mat3
|
||||
|
||||
Parameters:
|
||||
| *[in]* **q** quaternion
|
||||
| *[out]* **dest** result matrix
|
||||
|
||||
.. c:function:: void glm_quat_lerp(versor from, versor to, float t, versor dest)
|
||||
|
||||
| interpolates between two quaternions
|
||||
| using spherical linear interpolation (LERP)
|
||||
|
||||
Parameters:
|
||||
| *[in]* **from** from
|
||||
| *[in]* **to** to
|
||||
| *[in]* **t** interpolant (amount) clamped between 0 and 1
|
||||
| *[out]* **dest** result quaternion
|
||||
|
||||
.. c:function:: void glm_quat_slerp(versor q, versor r, float t, versor dest)
|
||||
|
||||
| interpolates between two quaternions
|
||||
| using spherical linear interpolation (SLERP)
|
||||
|
||||
Parameters:
|
||||
| *[in]* **from** from
|
||||
| *[in]* **to** to
|
||||
| *[in]* **t** interpolant (amount) clamped between 0 and 1
|
||||
| *[out]* **dest** result quaternion
|
||||
|
||||
.. c:function:: void glm_quat_look(vec3 eye, versor ori, mat4 dest)
|
||||
|
||||
| creates view matrix using quaternion as camera orientation
|
||||
|
||||
Parameters:
|
||||
| *[in]* **eye** eye
|
||||
| *[in]* **ori** orientation in world space as quaternion
|
||||
| *[out]* **dest** result matrix
|
||||
|
||||
.. c:function:: void glm_quat_for(vec3 dir, vec3 fwd, vec3 up, versor dest)
|
||||
|
||||
| creates look rotation quaternion
|
||||
|
||||
Parameters:
|
||||
| *[in]* **dir** direction to look
|
||||
| *[in]* **fwd** forward vector
|
||||
| *[in]* **up** up vector
|
||||
| *[out]* **dest** result matrix
|
||||
|
||||
.. c:function:: void glm_quat_forp(vec3 from, vec3 to, vec3 fwd, vec3 up, versor dest)
|
||||
|
||||
| creates look rotation quaternion using source and destination positions p suffix stands for position
|
||||
|
||||
| this is similar to glm_quat_for except this computes direction for glm_quat_for for you.
|
||||
|
||||
Parameters:
|
||||
| *[in]* **from** source point
|
||||
| *[in]* **to** destination point
|
||||
| *[in]* **fwd** forward vector
|
||||
| *[in]* **up** up vector
|
||||
| *[out]* **dest** result matrix
|
||||
|
||||
.. c:function:: void glm_quat_rotatev(versor q, vec3 v, vec3 dest)
|
||||
|
||||
| crotate vector using using quaternion
|
||||
|
||||
Parameters:
|
||||
| *[in]* **q** quaternion
|
||||
| *[in]* **v** vector to rotate
|
||||
| *[out]* **dest** rotated vector
|
||||
|
||||
.. c:function:: void glm_quat_rotate(mat4 m, versor q, mat4 dest)
|
||||
|
||||
| rotate existing transform matrix using quaternion
|
||||
|
||||
instead of passing identity matrix, consider to use quat_mat4 functions
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** existing transform matrix to rotate
|
||||
| *[in]* **q** quaternion
|
||||
| *[out]* **dest** rotated matrix/transform
|
||||
|
||||
.. c:function:: void glm_quat_rotate_at(mat4 m, versor q, vec3 pivot)
|
||||
|
||||
| rotate existing transform matrix using quaternion at pivot point
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** existing transform matrix to rotate
|
||||
| *[in]* **q** quaternion
|
||||
| *[in]* **pivot** pivot
|
||||
|
||||
.. c:function:: void glm_quat_rotate(mat4 m, versor q, mat4 dest)
|
||||
|
||||
| rotate NEW transform matrix using quaternion at pivot point
|
||||
| this creates rotation matrix, it assumes you don't have a matrix
|
||||
|
||||
| this should work faster than glm_quat_rotate_at because it reduces one glm_translate.
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **m** existing transform matrix to rotate
|
||||
| *[in]* **q** quaternion
|
||||
| *[in]* **pivot** pivot
|
74
external/cglm/docs/source/sphere.rst
vendored
Normal file
74
external/cglm/docs/source/sphere.rst
vendored
Normal file
|
@ -0,0 +1,74 @@
|
|||
.. default-domain:: C
|
||||
|
||||
Sphere
|
||||
================================================================================
|
||||
|
||||
Header: cglm/sphere.h
|
||||
|
||||
**Definition of sphere:**
|
||||
|
||||
Sphere Representation in cglm is *vec4*: **[center.x, center.y, center.z, radii]**
|
||||
|
||||
You can call any vec3 function by pasing sphere. Because first three elements
|
||||
defines center of sphere.
|
||||
|
||||
Table of contents (click to go):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Functions:
|
||||
|
||||
1. :c:func:`glm_sphere_radii`
|
||||
#. :c:func:`glm_sphere_transform`
|
||||
#. :c:func:`glm_sphere_merge`
|
||||
#. :c:func:`glm_sphere_sphere`
|
||||
#. :c:func:`glm_sphere_point`
|
||||
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. c:function:: float glm_sphere_radii(vec4 s)
|
||||
|
||||
| helper for getting sphere radius
|
||||
|
||||
Parameters:
|
||||
| *[in]* **s** sphere
|
||||
|
||||
Returns:
|
||||
returns radii
|
||||
|
||||
.. c:function:: void glm_sphere_transform(vec4 s, mat4 m, vec4 dest)
|
||||
|
||||
| apply transform to sphere, it is just wrapper for glm_mat4_mulv3
|
||||
|
||||
Parameters:
|
||||
| *[in]* **s** sphere
|
||||
| *[in]* **m** transform matrix
|
||||
| *[out]* **dest** transformed sphere
|
||||
|
||||
.. c:function:: void glm_sphere_merge(vec4 s1, vec4 s2, vec4 dest)
|
||||
|
||||
| merges two spheres and creates a new one
|
||||
|
||||
two sphere must be in same space, for instance if one in world space then
|
||||
the other must be in world space too, not in local space.
|
||||
|
||||
Parameters:
|
||||
| *[in]* **s1** sphere 1
|
||||
| *[in]* **s2** sphere 2
|
||||
| *[out]* **dest** merged/extended sphere
|
||||
|
||||
.. c:function:: bool glm_sphere_sphere(vec4 s1, vec4 s2)
|
||||
|
||||
| check if two sphere intersects
|
||||
|
||||
Parameters:
|
||||
| *[in]* **s1** sphere
|
||||
| *[in]* **s2** other sphere
|
||||
|
||||
.. c:function:: bool glm_sphere_point(vec4 s, vec3 point)
|
||||
|
||||
| check if sphere intersects with point
|
||||
|
||||
Parameters:
|
||||
| *[in]* **s** sphere
|
||||
| *[in]* **point** point
|
79
external/cglm/docs/source/troubleshooting.rst
vendored
Normal file
79
external/cglm/docs/source/troubleshooting.rst
vendored
Normal file
|
@ -0,0 +1,79 @@
|
|||
.. default-domain:: C
|
||||
|
||||
Troubleshooting
|
||||
================================================================================
|
||||
|
||||
It is possible that sometimes you may get crashes or wrong results.
|
||||
Follow these topics
|
||||
|
||||
Memory Allocation:
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Again, **cglm** doesn't alloc any memory on heap.
|
||||
cglm functions works like memcpy; it copies data from src,
|
||||
makes calculations then copy the result to dest.
|
||||
|
||||
You are responsible for allocation of **src** and **dest** parameters.
|
||||
|
||||
Alignment:
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
**vec4** and **mat4** types requires 16 byte alignment.
|
||||
These types are marked with align attribute to let compiler know about this
|
||||
requirement.
|
||||
|
||||
But since MSVC (Windows) throws the error:
|
||||
|
||||
**"formal parameter with requested alignment of 16 won't be aligned"**
|
||||
|
||||
The alignment attribute has been commented for MSVC
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
# define CGLM_ALIGN(X) /* __declspec(align(X)) */
|
||||
#else
|
||||
# define CGLM_ALIGN(X) __attribute((aligned(X)))
|
||||
#endif.
|
||||
|
||||
So MSVC may not know about alignment requirements when creating variables.
|
||||
The interesting thing is that, if I remember correctly Visual Studio 2017
|
||||
doesn't throw the above error. So we may uncomment that line for Visual Studio 2017,
|
||||
you may do it yourself.
|
||||
|
||||
**This MSVC issue is still in TODOs.**
|
||||
|
||||
**UPDATE:** By starting v0.4.5 cglm provides an option to disable alignment requirement.
|
||||
Also alignment is disabled for older msvc verisons as default. Now alignment is only required in Visual Studio 2017 version 15.6+ if CGLM_ALL_UNALIGNED macro is not defined.
|
||||
|
||||
Crashes, Invalid Memory Access:
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Probably you are trying to write to invalid memory location.
|
||||
|
||||
You may used wrong function for what you want to do.
|
||||
|
||||
For instance you may called **glm_vec4_** functions for **vec3** data type.
|
||||
It will try to write 32 byte but since **vec3** is 24 byte it should throw
|
||||
memory access error or exit the app without saying anything.
|
||||
|
||||
Wrong Results:
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Again, you may used wrong function.
|
||||
|
||||
For instance if you use **glm_normalize()** or **glm_vec_normalize()** for **vec4**,
|
||||
it will assume that passed param is **vec3** and will normalize it for **vec3**.
|
||||
Since you need to **vec4** to be normalized in your case, you will get wrong results.
|
||||
|
||||
Accessing vec4 type with vec3 functions is valid, you will not get any error, exception or crash.
|
||||
You only get wrong results if you don't know what you are doing!
|
||||
|
||||
So be carefull, when your IDE (Xcode, Visual Studio ...) tried to autocomplete function names, READ IT :)
|
||||
|
||||
**Also implementation may be wrong please let us know by creating an issue on Github.**
|
||||
|
||||
Other Issues?
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
**Please let us know by creating an issue on Github.**
|
173
external/cglm/docs/source/util.rst
vendored
Normal file
173
external/cglm/docs/source/util.rst
vendored
Normal file
|
@ -0,0 +1,173 @@
|
|||
.. default-domain:: C
|
||||
|
||||
utils / helpers
|
||||
================================================================================
|
||||
|
||||
Header: cglm/util.h
|
||||
|
||||
|
||||
|
||||
Table of contents (click to go):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Functions:
|
||||
|
||||
1. :c:func:`glm_sign`
|
||||
#. :c:func:`glm_signf`
|
||||
#. :c:func:`glm_rad`
|
||||
#. :c:func:`glm_deg`
|
||||
#. :c:func:`glm_make_rad`
|
||||
#. :c:func:`glm_make_deg`
|
||||
#. :c:func:`glm_pow2`
|
||||
#. :c:func:`glm_min`
|
||||
#. :c:func:`glm_max`
|
||||
#. :c:func:`glm_clamp`
|
||||
#. :c:func:`glm_lerp`
|
||||
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. c:function:: int glm_sign(int val)
|
||||
|
||||
| returns sign of 32 bit integer as +1, -1, 0
|
||||
|
||||
| **Important**: It returns 0 for zero input
|
||||
|
||||
Parameters:
|
||||
| *[in]* **val** an integer
|
||||
|
||||
Returns:
|
||||
sign of given number
|
||||
|
||||
.. c:function:: float glm_signf(float val)
|
||||
|
||||
| returns sign of 32 bit integer as +1.0, -1.0, 0.0
|
||||
|
||||
| **Important**: It returns 0.0f for zero input
|
||||
|
||||
Parameters:
|
||||
| *[in]* **val** a float
|
||||
|
||||
Returns:
|
||||
sign of given number
|
||||
|
||||
.. c:function:: float glm_rad(float deg)
|
||||
|
||||
| convert degree to radians
|
||||
|
||||
Parameters:
|
||||
| *[in]* **deg** angle in degrees
|
||||
|
||||
.. c:function:: float glm_deg(float rad)
|
||||
|
||||
| convert radians to degree
|
||||
|
||||
Parameters:
|
||||
| *[in]* **rad** angle in radians
|
||||
|
||||
.. c:function:: void glm_make_rad(float *degm)
|
||||
|
||||
| convert exsisting degree to radians. this will override degrees value
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **deg** pointer to angle in degrees
|
||||
|
||||
.. c:function:: void glm_make_deg(float *rad)
|
||||
|
||||
| convert exsisting radians to degree. this will override radians value
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **rad** pointer to angle in radians
|
||||
|
||||
.. c:function:: float glm_pow2(float x)
|
||||
|
||||
| multiplies given parameter with itself = x * x or powf(x, 2)
|
||||
|
||||
Parameters:
|
||||
| *[in]* **x** value
|
||||
|
||||
Returns:
|
||||
square of a given number
|
||||
|
||||
.. c:function:: float glm_min(float a, float b)
|
||||
|
||||
| returns minimum of given two values
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** number 1
|
||||
| *[in]* **b** number 2
|
||||
|
||||
Returns:
|
||||
minimum value
|
||||
|
||||
.. c:function:: float glm_max(float a, float b)
|
||||
|
||||
| returns maximum of given two values
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** number 1
|
||||
| *[in]* **b** number 2
|
||||
|
||||
Returns:
|
||||
maximum value
|
||||
|
||||
.. c:function:: void glm_clamp(float val, float minVal, float maxVal)
|
||||
|
||||
constrain a value to lie between two further values
|
||||
|
||||
Parameters:
|
||||
| *[in]* **val** input value
|
||||
| *[in]* **minVal** minimum value
|
||||
| *[in]* **maxVal** maximum value
|
||||
|
||||
Returns:
|
||||
clamped value
|
||||
|
||||
.. c:function:: float glm_lerp(float from, float to, float t)
|
||||
|
||||
linear interpolation between two number
|
||||
|
||||
| formula: from + s * (to - from)
|
||||
|
||||
Parameters:
|
||||
| *[in]* **from** from value
|
||||
| *[in]* **to** to value
|
||||
| *[in]* **t** interpolant (amount) clamped between 0 and 1
|
||||
|
||||
Returns:
|
||||
interpolated value
|
||||
|
||||
.. c:function:: bool glm_eq(float a, float b)
|
||||
|
||||
check if two float equal with using EPSILON
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** a
|
||||
| *[in]* **b** b
|
||||
|
||||
Returns:
|
||||
true if a and b equals
|
||||
|
||||
.. c:function:: float glm_percent(float from, float to, float current)
|
||||
|
||||
percentage of current value between start and end value
|
||||
|
||||
Parameters:
|
||||
| *[in]* **from** from value
|
||||
| *[in]* **to** to value
|
||||
| *[in]* **current** value between from and to values
|
||||
|
||||
Returns:
|
||||
clamped normalized percent (0-100 in 0-1)
|
||||
|
||||
.. c:function:: float glm_percentc(float from, float to, float current)
|
||||
|
||||
clamped percentage of current value between start and end value
|
||||
|
||||
Parameters:
|
||||
| *[in]* **from** from value
|
||||
| *[in]* **to** to value
|
||||
| *[in]* **current** value between from and to values
|
||||
|
||||
Returns:
|
||||
clamped normalized percent (0-100 in 0-1)
|
143
external/cglm/docs/source/vec3-ext.rst
vendored
Normal file
143
external/cglm/docs/source/vec3-ext.rst
vendored
Normal file
|
@ -0,0 +1,143 @@
|
|||
.. default-domain:: C
|
||||
|
||||
vec3 extra
|
||||
==========
|
||||
|
||||
Header: cglm/vec3-ext.h
|
||||
|
||||
There are some functions are in called in extra header. These are called extra
|
||||
because they are not used like other functions in vec3.h in the future some of
|
||||
these functions ma be moved to vec3 header.
|
||||
|
||||
Table of contents (click to go):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Functions:
|
||||
|
||||
1. :c:func:`glm_vec_mulv`
|
||||
#. :c:func:`glm_vec_broadcast`
|
||||
#. :c:func:`glm_vec_eq`
|
||||
#. :c:func:`glm_vec_eq_eps`
|
||||
#. :c:func:`glm_vec_eq_all`
|
||||
#. :c:func:`glm_vec_eqv`
|
||||
#. :c:func:`glm_vec_eqv_eps`
|
||||
#. :c:func:`glm_vec_max`
|
||||
#. :c:func:`glm_vec_min`
|
||||
#. :c:func:`glm_vec_isnan`
|
||||
#. :c:func:`glm_vec_isinf`
|
||||
#. :c:func:`glm_vec_isvalid`
|
||||
#. :c:func:`glm_vec_sign`
|
||||
#. :c:func:`glm_vec_sqrt`
|
||||
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. c:function:: void glm_vec_mulv(vec3 a, vec3 b, vec3 d)
|
||||
|
||||
multiplies individual items
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** vec1
|
||||
| *[in]* **b** vec2
|
||||
| *[out]* **d** destination (v1[0] * v2[0], v1[1] * v2[1], v1[2] * v2[2])
|
||||
|
||||
.. c:function:: void glm_vec_broadcast(float val, vec3 d)
|
||||
|
||||
fill a vector with specified value
|
||||
|
||||
Parameters:
|
||||
| *[in]* **val** value
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: bool glm_vec_eq(vec3 v, float val)
|
||||
|
||||
check if vector is equal to value (without epsilon)
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[in]* **val** value
|
||||
|
||||
.. c:function:: bool glm_vec_eq_eps(vec3 v, float val)
|
||||
|
||||
check if vector is equal to value (with epsilon)
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[in]* **val** value
|
||||
|
||||
.. c:function:: bool glm_vec_eq_all(vec3 v)
|
||||
|
||||
check if vectors members are equal (without epsilon)
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
|
||||
.. c:function:: bool glm_vec_eqv(vec3 v1, vec3 v2)
|
||||
|
||||
check if vector is equal to another (without epsilon) vector
|
||||
|
||||
Parameters:
|
||||
| *[in]* **vec** vector 1
|
||||
| *[in]* **vec** vector 2
|
||||
|
||||
.. c:function:: bool glm_vec_eqv_eps(vec3 v1, vec3 v2)
|
||||
|
||||
check if vector is equal to another (with epsilon)
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v1** vector1
|
||||
| *[in]* **v2** vector2
|
||||
|
||||
.. c:function:: float glm_vec_max(vec3 v)
|
||||
|
||||
max value of vector
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
|
||||
.. c:function:: float glm_vec_min(vec3 v)
|
||||
|
||||
min value of vector
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
|
||||
.. c:function:: bool glm_vec_isnan(vec3 v)
|
||||
|
||||
| check if one of items is NaN (not a number)
|
||||
| you should only use this in DEBUG mode or very critical asserts
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
|
||||
.. c:function:: bool glm_vec_isinf(vec3 v)
|
||||
|
||||
| check if one of items is INFINITY
|
||||
| you should only use this in DEBUG mode or very critical asserts
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
|
||||
.. c:function:: bool glm_vec_isvalid(vec3 v)
|
||||
|
||||
| check if all items are valid number
|
||||
| you should only use this in DEBUG mode or very critical asserts
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
|
||||
.. c:function:: void glm_vec_sign(vec3 v, vec3 dest)
|
||||
|
||||
get sign of 32 bit float as +1, -1, 0
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[out]* **dest** sign vector (only keeps signs as -1, 0, -1)
|
||||
|
||||
.. c:function:: void glm_vec_sqrt(vec3 v, vec3 dest)
|
||||
|
||||
square root of each vector item
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[out]* **dest** destination vector (sqrt(v))
|
437
external/cglm/docs/source/vec3.rst
vendored
Normal file
437
external/cglm/docs/source/vec3.rst
vendored
Normal file
|
@ -0,0 +1,437 @@
|
|||
.. default-domain:: C
|
||||
|
||||
vec3
|
||||
====
|
||||
|
||||
Header: cglm/vec3.h
|
||||
|
||||
We mostly use vectors in graphics math, to make writing code faster
|
||||
and easy to read, some *vec3* functions are aliased in global namespace.
|
||||
For instance :c:func:`glm_dot` is alias of :c:func:`glm_vec_dot`,
|
||||
alias means inline wrapper here. There is no call verison of alias functions
|
||||
|
||||
There are also functions for rotating *vec3* vector. **_m4**, **_m3** prefixes
|
||||
rotate *vec3* with matrix.
|
||||
|
||||
Table of contents (click to go):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Macros:
|
||||
|
||||
1. glm_vec_dup(v, dest)
|
||||
#. GLM_VEC3_ONE_INIT
|
||||
#. GLM_VEC3_ZERO_INIT
|
||||
#. GLM_VEC3_ONE
|
||||
#. GLM_VEC3_ZERO
|
||||
#. GLM_YUP
|
||||
#. GLM_ZUP
|
||||
#. GLM_XUP
|
||||
|
||||
Functions:
|
||||
|
||||
1. :c:func:`glm_vec3`
|
||||
#. :c:func:`glm_vec_copy`
|
||||
#. :c:func:`glm_vec_zero`
|
||||
#. :c:func:`glm_vec_one`
|
||||
#. :c:func:`glm_vec_dot`
|
||||
#. :c:func:`glm_vec_cross`
|
||||
#. :c:func:`glm_vec_norm2`
|
||||
#. :c:func:`glm_vec_norm`
|
||||
#. :c:func:`glm_vec_add`
|
||||
#. :c:func:`glm_vec_adds`
|
||||
#. :c:func:`glm_vec_sub`
|
||||
#. :c:func:`glm_vec_subs`
|
||||
#. :c:func:`glm_vec_mul`
|
||||
#. :c:func:`glm_vec_scale`
|
||||
#. :c:func:`glm_vec_scale_as`
|
||||
#. :c:func:`glm_vec_div`
|
||||
#. :c:func:`glm_vec_divs`
|
||||
#. :c:func:`glm_vec_addadd`
|
||||
#. :c:func:`glm_vec_subadd`
|
||||
#. :c:func:`glm_vec_muladd`
|
||||
#. :c:func:`glm_vec_muladds`
|
||||
#. :c:func:`glm_vec_flipsign`
|
||||
#. :c:func:`glm_vec_flipsign_to`
|
||||
#. :c:func:`glm_vec_inv`
|
||||
#. :c:func:`glm_vec_inv_to`
|
||||
#. :c:func:`glm_vec_normalize`
|
||||
#. :c:func:`glm_vec_normalize_to`
|
||||
#. :c:func:`glm_vec_distance2`
|
||||
#. :c:func:`glm_vec_distance`
|
||||
#. :c:func:`glm_vec_angle`
|
||||
#. :c:func:`glm_vec_rotate`
|
||||
#. :c:func:`glm_vec_rotate_m4`
|
||||
#. :c:func:`glm_vec_rotate_m3`
|
||||
#. :c:func:`glm_vec_proj`
|
||||
#. :c:func:`glm_vec_center`
|
||||
#. :c:func:`glm_vec_maxv`
|
||||
#. :c:func:`glm_vec_minv`
|
||||
#. :c:func:`glm_vec_ortho`
|
||||
#. :c:func:`glm_vec_clamp`
|
||||
#. :c:func:`glm_vec_lerp`
|
||||
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. c:function:: void glm_vec3(vec4 v4, vec3 dest)
|
||||
|
||||
init vec3 using vec4
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v4** vector4
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_vec_copy(vec3 a, vec3 dest)
|
||||
|
||||
copy all members of [a] to [dest]
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** source
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_vec_zero(vec3 v)
|
||||
|
||||
makes all members 0.0f (zero)
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **v** vector
|
||||
|
||||
.. c:function:: void glm_vec_one(vec3 v)
|
||||
|
||||
makes all members 1.0f (one)
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **v** vector
|
||||
|
||||
.. c:function:: float glm_vec_dot(vec3 a, vec3 b)
|
||||
|
||||
dot product of vec3
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** vector1
|
||||
| *[in]* **b** vector2
|
||||
|
||||
Returns:
|
||||
dot product
|
||||
|
||||
.. c:function:: void glm_vec_cross(vec3 a, vec3 b, vec3 d)
|
||||
|
||||
cross product
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** source 1
|
||||
| *[in]* **b** source 2
|
||||
| *[out]* **d** destination
|
||||
|
||||
.. c:function:: float glm_vec_norm2(vec3 v)
|
||||
|
||||
norm * norm (magnitude) of vector
|
||||
|
||||
we can use this func instead of calling norm * norm, because it would call
|
||||
sqrtf fuction twice but with this func we can avoid func call, maybe this is
|
||||
not good name for this func
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
|
||||
Returns:
|
||||
square of norm / magnitude
|
||||
|
||||
.. c:function:: float glm_vec_norm(vec3 vec)
|
||||
|
||||
norm (magnitude) of vec3
|
||||
|
||||
Parameters:
|
||||
| *[in]* **vec** vector
|
||||
|
||||
.. c:function:: void glm_vec_add(vec3 a, vec3 b, vec3 dest)
|
||||
|
||||
add a vector to b vector store result in dest
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** vector1
|
||||
| *[in]* **b** vector2
|
||||
| *[out]* **dest** destination vector
|
||||
|
||||
.. c:function:: void glm_vec_adds(vec3 a, float s, vec3 dest)
|
||||
|
||||
add scalar to v vector store result in dest (d = v + vec(s))
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[in]* **s** scalar
|
||||
| *[out]* **dest** destination vector
|
||||
|
||||
.. c:function:: void glm_vec_sub(vec3 v1, vec3 v2, vec3 dest)
|
||||
|
||||
subtract b vector from a vector store result in dest (d = v1 - v2)
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** vector1
|
||||
| *[in]* **b** vector2
|
||||
| *[out]* **dest** destination vector
|
||||
|
||||
.. c:function:: void glm_vec_subs(vec3 v, float s, vec3 dest)
|
||||
|
||||
subtract scalar from v vector store result in dest (d = v - vec(s))
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[in]* **s** scalar
|
||||
| *[out]* **dest** destination vector
|
||||
|
||||
.. c:function:: void glm_vec_mul(vec3 a, vec3 b, vec3 d)
|
||||
|
||||
multiply two vector (component-wise multiplication)
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** vector
|
||||
| *[in]* **b** scalar
|
||||
| *[out]* **d** result = (a[0] * b[0], a[1] * b[1], a[2] * b[2])
|
||||
|
||||
.. c:function:: void glm_vec_scale(vec3 v, float s, vec3 dest)
|
||||
|
||||
multiply/scale vec3 vector with scalar: result = v * s
|
||||
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[in]* **s** scalar
|
||||
| *[out]* **dest** destination vector
|
||||
|
||||
.. c:function:: void glm_vec_scale_as(vec3 v, float s, vec3 dest)
|
||||
|
||||
make vec3 vector scale as specified: result = unit(v) * s
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[in]* **s** scalar
|
||||
| *[out]* **dest** destination vector
|
||||
|
||||
.. c:function:: void glm_vec_div(vec3 a, vec3 b, vec3 dest)
|
||||
|
||||
div vector with another component-wise division: d = a / b
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** vector 1
|
||||
| *[in]* **b** vector 2
|
||||
| *[out]* **dest** result = (a[0] / b[0], a[1] / b[1], a[2] / b[2])
|
||||
|
||||
.. c:function:: void glm_vec_divs(vec3 v, float s, vec3 dest)
|
||||
|
||||
div vector with scalar: d = v / s
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[in]* **s** scalar
|
||||
| *[out]* **dest** result = (a[0] / s, a[1] / s, a[2] / s])
|
||||
|
||||
.. c:function:: void glm_vec_addadd(vec3 a, vec3 b, vec3 dest)
|
||||
|
||||
| add two vectors and add result to sum
|
||||
| it applies += operator so dest must be initialized
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** vector 1
|
||||
| *[in]* **b** vector 2
|
||||
| *[out]* **dest** dest += (a + b)
|
||||
|
||||
.. c:function:: void glm_vec_subadd(vec3 a, vec3 b, vec3 dest)
|
||||
|
||||
| sub two vectors and add result to sum
|
||||
| it applies += operator so dest must be initialized
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** vector 1
|
||||
| *[in]* **b** vector 2
|
||||
| *[out]* **dest** dest += (a - b)
|
||||
|
||||
.. c:function:: void glm_vec_muladd(vec3 a, vec3 b, vec3 dest)
|
||||
|
||||
| mul two vectors and add result to sum
|
||||
| it applies += operator so dest must be initialized
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** vector 1
|
||||
| *[in]* **b** vector 2
|
||||
| *[out]* **dest** dest += (a * b)
|
||||
|
||||
.. c:function:: void glm_vec_muladds(vec3 a, float s, vec3 dest)
|
||||
|
||||
| mul vector with scalar and add result to sum
|
||||
| it applies += operator so dest must be initialized
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** vector
|
||||
| *[in]* **s** scalar
|
||||
| *[out]* **dest** dest += (a * b)
|
||||
|
||||
.. c:function:: void glm_vec_flipsign(vec3 v)
|
||||
|
||||
flip sign of all vec3 members
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **v** vector
|
||||
|
||||
.. c:function:: void glm_vec_flipsign_to(vec3 v, vec3 dest)
|
||||
|
||||
flip sign of all vec3 members and store result in dest
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[out]* **dest** negated vector
|
||||
|
||||
.. c:function:: void glm_vec_inv(vec3 v)
|
||||
|
||||
make vector as inverse/opposite of itself
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **v** vector
|
||||
|
||||
.. c:function:: void glm_vec_inv_to(vec3 v, vec3 dest)
|
||||
|
||||
inverse/opposite vector
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** source
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_vec_normalize(vec3 v)
|
||||
|
||||
normalize vec3 and store result in same vec
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **v** vector
|
||||
|
||||
.. c:function:: void glm_vec_normalize_to(vec3 vec, vec3 dest)
|
||||
|
||||
normalize vec3 to dest
|
||||
|
||||
Parameters:
|
||||
| *[in]* **vec** source
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: float glm_vec_angle(vec3 v1, vec3 v2)
|
||||
|
||||
angle betwen two vector
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v1** vector1
|
||||
| *[in]* **v2** vector2
|
||||
|
||||
Return:
|
||||
| angle as radians
|
||||
|
||||
.. c:function:: void glm_vec_rotate(vec3 v, float angle, vec3 axis)
|
||||
|
||||
rotate vec3 around axis by angle using Rodrigues' rotation formula
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **v** vector
|
||||
| *[in]* **axis** axis vector (will be normalized)
|
||||
| *[out]* **angle** angle (radians)
|
||||
|
||||
.. c:function:: void glm_vec_rotate_m4(mat4 m, vec3 v, vec3 dest)
|
||||
|
||||
apply rotation matrix to vector
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** affine matrix or rot matrix
|
||||
| *[in]* **v** vector
|
||||
| *[out]* **dest** rotated vector
|
||||
|
||||
.. c:function:: void glm_vec_rotate_m3(mat3 m, vec3 v, vec3 dest)
|
||||
|
||||
apply rotation matrix to vector
|
||||
|
||||
Parameters:
|
||||
| *[in]* **m** affine matrix or rot matrix
|
||||
| *[in]* **v** vector
|
||||
| *[out]* **dest** rotated vector
|
||||
|
||||
.. c:function:: void glm_vec_proj(vec3 a, vec3 b, vec3 dest)
|
||||
|
||||
project a vector onto b vector
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** vector1
|
||||
| *[in]* **b** vector2
|
||||
| *[out]* **dest** projected vector
|
||||
|
||||
.. c:function:: void glm_vec_center(vec3 v1, vec3 v2, vec3 dest)
|
||||
|
||||
find center point of two vector
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v1** vector1
|
||||
| *[in]* **v2** vector2
|
||||
| *[out]* **dest** center point
|
||||
|
||||
.. c:function:: float glm_vec_distance2(vec3 v1, vec3 v2)
|
||||
|
||||
squared distance between two vectors
|
||||
|
||||
Parameters:
|
||||
| *[in]* **mat** vector1
|
||||
| *[in]* **row1** vector2
|
||||
|
||||
Returns:
|
||||
| squared distance (distance * distance)
|
||||
|
||||
.. c:function:: float glm_vec_distance(vec3 v1, vec3 v2)
|
||||
|
||||
distance between two vectors
|
||||
|
||||
Parameters:
|
||||
| *[in]* **mat** vector1
|
||||
| *[in]* **row1** vector2
|
||||
|
||||
Returns:
|
||||
| distance
|
||||
|
||||
.. c:function:: void glm_vec_maxv(vec3 v1, vec3 v2, vec3 dest)
|
||||
|
||||
max values of vectors
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v1** vector1
|
||||
| *[in]* **v2** vector2
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_vec_minv(vec3 v1, vec3 v2, vec3 dest)
|
||||
|
||||
min values of vectors
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v1** vector1
|
||||
| *[in]* **v2** vector2
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_vec_ortho(vec3 v, vec3 dest)
|
||||
|
||||
possible orthogonal/perpendicular vector
|
||||
|
||||
Parameters:
|
||||
| *[in]* **mat** vector
|
||||
| *[out]* **dest** orthogonal/perpendicular vector
|
||||
|
||||
.. c:function:: void glm_vec_clamp(vec3 v, float minVal, float maxVal)
|
||||
|
||||
constrain a value to lie between two further values
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **v** vector
|
||||
| *[in]* **minVal** minimum value
|
||||
| *[in]* **maxVal** maximum value
|
||||
|
||||
.. c:function:: void glm_vec_lerp(vec3 from, vec3 to, float t, vec3 dest)
|
||||
|
||||
linear interpolation between two vector
|
||||
|
||||
| formula: from + s * (to - from)
|
||||
|
||||
Parameters:
|
||||
| *[in]* **from** from value
|
||||
| *[in]* **to** to value
|
||||
| *[in]* **t** interpolant (amount) clamped between 0 and 1
|
||||
| *[out]* **dest** destination
|
138
external/cglm/docs/source/vec4-ext.rst
vendored
Normal file
138
external/cglm/docs/source/vec4-ext.rst
vendored
Normal file
|
@ -0,0 +1,138 @@
|
|||
.. default-domain:: C
|
||||
|
||||
vec4 extra
|
||||
==========
|
||||
|
||||
Header: cglm/vec4-ext.h
|
||||
|
||||
There are some functions are in called in extra header. These are called extra
|
||||
because they are not used like other functions in vec4.h in the future some of
|
||||
these functions ma be moved to vec4 header.
|
||||
|
||||
Table of contents (click to go):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Functions:
|
||||
|
||||
1. :c:func:`glm_vec4_mulv`
|
||||
#. :c:func:`glm_vec4_broadcast`
|
||||
#. :c:func:`glm_vec4_eq`
|
||||
#. :c:func:`glm_vec4_eq_eps`
|
||||
#. :c:func:`glm_vec4_eq_all`
|
||||
#. :c:func:`glm_vec4_eqv`
|
||||
#. :c:func:`glm_vec4_eqv_eps`
|
||||
#. :c:func:`glm_vec4_max`
|
||||
#. :c:func:`glm_vec4_min`
|
||||
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. c:function:: void glm_vec4_mulv(vec4 a, vec4 b, vec4 d)
|
||||
|
||||
multiplies individual items
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** vec1
|
||||
| *[in]* **b** vec2
|
||||
| *[out]* **d** destination
|
||||
|
||||
.. c:function:: void glm_vec4_broadcast(float val, vec4 d)
|
||||
|
||||
fill a vector with specified value
|
||||
|
||||
Parameters:
|
||||
| *[in]* **val** value
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: bool glm_vec4_eq(vec4 v, float val)
|
||||
|
||||
check if vector is equal to value (without epsilon)
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[in]* **val** value
|
||||
|
||||
.. c:function:: bool glm_vec4_eq_eps(vec4 v, float val)
|
||||
|
||||
check if vector is equal to value (with epsilon)
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[in]* **val** value
|
||||
|
||||
.. c:function:: bool glm_vec4_eq_all(vec4 v)
|
||||
|
||||
check if vectors members are equal (without epsilon)
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
|
||||
.. c:function:: bool glm_vec4_eqv(vec4 v1, vec4 v2)
|
||||
|
||||
check if vector is equal to another (without epsilon) vector
|
||||
|
||||
Parameters:
|
||||
| *[in]* **vec** vector 1
|
||||
| *[in]* **vec** vector 2
|
||||
|
||||
.. c:function:: bool glm_vec4_eqv_eps(vec4 v1, vec4 v2)
|
||||
|
||||
check if vector is equal to another (with epsilon)
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v1** vector1
|
||||
| *[in]* **v2** vector2
|
||||
|
||||
.. c:function:: float glm_vec4_max(vec4 v)
|
||||
|
||||
max value of vector
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
|
||||
.. c:function:: float glm_vec4_min(vec4 v)
|
||||
|
||||
min value of vector
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
|
||||
.. c:function:: bool glm_vec4_isnan(vec4 v)
|
||||
|
||||
| check if one of items is NaN (not a number)
|
||||
| you should only use this in DEBUG mode or very critical asserts
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
|
||||
.. c:function:: bool glm_vec4_isinf(vec4 v)
|
||||
|
||||
| check if one of items is INFINITY
|
||||
| you should only use this in DEBUG mode or very critical asserts
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
|
||||
.. c:function:: bool glm_vec4_isvalid(vec4 v)
|
||||
|
||||
| check if all items are valid number
|
||||
| you should only use this in DEBUG mode or very critical asserts
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
|
||||
.. c:function:: void glm_vec4_sign(vec4 v, vec4 dest)
|
||||
|
||||
get sign of 32 bit float as +1, -1, 0
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[out]* **dest** sign vector (only keeps signs as -1, 0, -1)
|
||||
|
||||
.. c:function:: void glm_vec4_sqrt(vec4 v, vec4 dest)
|
||||
|
||||
square root of each vector item
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[out]* **dest** destination vector (sqrt(v))
|
345
external/cglm/docs/source/vec4.rst
vendored
Normal file
345
external/cglm/docs/source/vec4.rst
vendored
Normal file
|
@ -0,0 +1,345 @@
|
|||
.. default-domain:: C
|
||||
|
||||
vec4
|
||||
====
|
||||
|
||||
Header: cglm/vec4.h
|
||||
|
||||
Table of contents (click to go):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Macros:
|
||||
|
||||
1. glm_vec4_dup3(v, dest)
|
||||
#. glm_vec4_dup(v, dest)
|
||||
#. GLM_VEC4_ONE_INIT
|
||||
#. GLM_VEC4_BLACK_INIT
|
||||
#. GLM_VEC4_ZERO_INIT
|
||||
#. GLM_VEC4_ONE
|
||||
#. GLM_VEC4_BLACK
|
||||
#. GLM_VEC4_ZERO
|
||||
|
||||
Functions:
|
||||
|
||||
1. :c:func:`glm_vec4`
|
||||
#. :c:func:`glm_vec4_copy3`
|
||||
#. :c:func:`glm_vec4_copy`
|
||||
#. :c:func:`glm_vec4_zero`
|
||||
#. :c:func:`glm_vec4_one`
|
||||
#. :c:func:`glm_vec4_dot`
|
||||
#. :c:func:`glm_vec4_norm2`
|
||||
#. :c:func:`glm_vec4_norm`
|
||||
#. :c:func:`glm_vec4_add`
|
||||
#. :c:func:`glm_vec4_adds`
|
||||
#. :c:func:`glm_vec4_sub`
|
||||
#. :c:func:`glm_vec4_subs`
|
||||
#. :c:func:`glm_vec4_mul`
|
||||
#. :c:func:`glm_vec4_scale`
|
||||
#. :c:func:`glm_vec4_scale_as`
|
||||
#. :c:func:`glm_vec4_div`
|
||||
#. :c:func:`glm_vec4_divs`
|
||||
#. :c:func:`glm_vec4_addadd`
|
||||
#. :c:func:`glm_vec4_subadd`
|
||||
#. :c:func:`glm_vec4_muladd`
|
||||
#. :c:func:`glm_vec4_muladds`
|
||||
#. :c:func:`glm_vec4_flipsign`
|
||||
#. :c:func:`glm_vec_flipsign_to`
|
||||
#. :c:func:`glm_vec4_inv`
|
||||
#. :c:func:`glm_vec4_inv_to`
|
||||
#. :c:func:`glm_vec4_normalize`
|
||||
#. :c:func:`glm_vec4_normalize_to`
|
||||
#. :c:func:`glm_vec4_distance`
|
||||
#. :c:func:`glm_vec4_maxv`
|
||||
#. :c:func:`glm_vec4_minv`
|
||||
#. :c:func:`glm_vec4_clamp`
|
||||
#. :c:func:`glm_vec4_lerp`
|
||||
#. :c:func:`glm_vec4_isnan`
|
||||
#. :c:func:`glm_vec4_isinf`
|
||||
#. :c:func:`glm_vec4_isvalid`
|
||||
#. :c:func:`glm_vec4_sign`
|
||||
#. :c:func:`glm_vec4_sqrt`
|
||||
|
||||
Functions documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. c:function:: void glm_vec4(vec3 v3, float last, vec4 dest)
|
||||
|
||||
init vec4 using vec3, since you are initializing vec4 with vec3
|
||||
you need to set last item. cglm could set it zero but making it parameter
|
||||
gives more control
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v3** vector4
|
||||
| *[in]* **last** last item of vec4
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_vec4_copy3(vec4 a, vec3 dest)
|
||||
|
||||
copy first 3 members of [a] to [dest]
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** source
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_vec4_copy(vec4 v, vec4 dest)
|
||||
|
||||
copy all members of [a] to [dest]
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** source
|
||||
| *[in]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_vec4_zero(vec4 v)
|
||||
|
||||
makes all members zero
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **v** vector
|
||||
|
||||
.. c:function:: float glm_vec4_dot(vec4 a, vec4 b)
|
||||
|
||||
dot product of vec4
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** vector1
|
||||
| *[in]* **b** vector2
|
||||
|
||||
Returns:
|
||||
dot product
|
||||
|
||||
.. c:function:: float glm_vec4_norm2(vec4 v)
|
||||
|
||||
norm * norm (magnitude) of vector
|
||||
|
||||
we can use this func instead of calling norm * norm, because it would call
|
||||
sqrtf fuction twice but with this func we can avoid func call, maybe this is
|
||||
not good name for this func
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
|
||||
Returns:
|
||||
square of norm / magnitude
|
||||
|
||||
.. c:function:: float glm_vec4_norm(vec4 vec)
|
||||
|
||||
norm (magnitude) of vec4
|
||||
|
||||
Parameters:
|
||||
| *[in]* **vec** vector
|
||||
|
||||
.. c:function:: void glm_vec4_add(vec4 a, vec4 b, vec4 dest)
|
||||
|
||||
add a vector to b vector store result in dest
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** vector1
|
||||
| *[in]* **b** vector2
|
||||
| *[out]* **dest** destination vector
|
||||
|
||||
.. c:function:: void glm_vec4_adds(vec4 v, float s, vec4 dest)
|
||||
|
||||
add scalar to v vector store result in dest (d = v + vec(s))
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[in]* **s** scalar
|
||||
| *[out]* **dest** destination vector
|
||||
|
||||
.. c:function:: void glm_vec4_sub(vec4 a, vec4 b, vec4 dest)
|
||||
|
||||
subtract b vector from a vector store result in dest (d = v1 - v2)
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** vector1
|
||||
| *[in]* **b** vector2
|
||||
| *[out]* **dest** destination vector
|
||||
|
||||
.. c:function:: void glm_vec4_subs(vec4 v, float s, vec4 dest)
|
||||
|
||||
subtract scalar from v vector store result in dest (d = v - vec(s))
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[in]* **s** scalar
|
||||
| *[out]* **dest** destination vector
|
||||
|
||||
.. c:function:: void glm_vec4_mul(vec4 a, vec4 b, vec4 d)
|
||||
|
||||
multiply two vector (component-wise multiplication)
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** vector1
|
||||
| *[in]* **b** vector2
|
||||
| *[out]* **dest** result = (a[0] * b[0], a[1] * b[1], a[2] * b[2], a[3] * b[3])
|
||||
|
||||
.. c:function:: void glm_vec4_scale(vec4 v, float s, vec4 dest)
|
||||
|
||||
multiply/scale vec4 vector with scalar: result = v * s
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[in]* **s** scalar
|
||||
| *[out]* **dest** destination vector
|
||||
|
||||
.. c:function:: void glm_vec4_scale_as(vec4 v, float s, vec4 dest)
|
||||
|
||||
make vec4 vector scale as specified: result = unit(v) * s
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[in]* **s** scalar
|
||||
| *[out]* **dest** destination vector
|
||||
|
||||
.. c:function:: void glm_vec4_div(vec4 a, vec4 b, vec4 dest)
|
||||
|
||||
div vector with another component-wise division: d = v1 / v2
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** vector1
|
||||
| *[in]* **b** vector2
|
||||
| *[out]* **dest** result = (a[0] / b[0], a[1] / b[1], a[2] / b[2], a[3] / b[3])
|
||||
|
||||
.. c:function:: void glm_vec4_divs(vec4 v, float s, vec4 dest)
|
||||
|
||||
div vector with scalar: d = v / s
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[in]* **s** scalar
|
||||
| *[out]* **dest** result = (a[0] / s, a[1] / s, a[2] / s, a[3] / s)
|
||||
|
||||
.. c:function:: void glm_vec4_addadd(vec4 a, vec4 b, vec4 dest)
|
||||
|
||||
| add two vectors and add result to sum
|
||||
| it applies += operator so dest must be initialized
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** vector 1
|
||||
| *[in]* **b** vector 2
|
||||
| *[out]* **dest** dest += (a + b)
|
||||
|
||||
.. c:function:: void glm_vec4_subadd(vec4 a, vec4 b, vec4 dest)
|
||||
|
||||
| sub two vectors and add result to sum
|
||||
| it applies += operator so dest must be initialized
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** vector 1
|
||||
| *[in]* **b** vector 2
|
||||
| *[out]* **dest** dest += (a - b)
|
||||
|
||||
.. c:function:: void glm_vec4_muladd(vec4 a, vec4 b, vec4 dest)
|
||||
|
||||
| mul two vectors and add result to sum
|
||||
| it applies += operator so dest must be initialized
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** vector 1
|
||||
| *[in]* **b** vector 2
|
||||
| *[out]* **dest** dest += (a * b)
|
||||
|
||||
.. c:function:: void glm_vec4_muladds(vec4 a, float s, vec4 dest)
|
||||
|
||||
| mul vector with scalar and add result to sum
|
||||
| it applies += operator so dest must be initialized
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** vector
|
||||
| *[in]* **s** scalar
|
||||
| *[out]* **dest** dest += (a * b)
|
||||
|
||||
.. c:function:: void glm_vec4_flipsign(vec4 v)
|
||||
|
||||
flip sign of all vec4 members
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **v** vector
|
||||
|
||||
.. c:function:: void glm_vec4_flipsign_to(vec4 v, vec4 dest)
|
||||
|
||||
flip sign of all vec4 members and store result in dest
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[out]* **dest** negated vector
|
||||
|
||||
.. c:function:: void glm_vec4_inv(vec4 v)
|
||||
|
||||
make vector as inverse/opposite of itself
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **v** vector
|
||||
|
||||
.. c:function:: void glm_vec4_inv_to(vec4 v, vec4 dest)
|
||||
|
||||
inverse/opposite vector
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** source
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_vec4_normalize(vec4 v)
|
||||
|
||||
normalize vec4 and store result in same vec
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **v** vector
|
||||
|
||||
.. c:function:: void glm_vec4_normalize_to(vec4 vec, vec4 dest)
|
||||
|
||||
normalize vec4 to dest
|
||||
|
||||
Parameters:
|
||||
| *[in]* **vec** source
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: float glm_vec4_distance(vec4 v1, vec4 v2)
|
||||
|
||||
distance between two vectors
|
||||
|
||||
Parameters:
|
||||
| *[in]* **mat** vector1
|
||||
| *[in]* **row1** vector2
|
||||
|
||||
Returns:
|
||||
| distance
|
||||
|
||||
.. c:function:: void glm_vec4_maxv(vec4 v1, vec4 v2, vec4 dest)
|
||||
|
||||
max values of vectors
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v1** vector1
|
||||
| *[in]* **v2** vector2
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_vec4_minv(vec4 v1, vec4 v2, vec4 dest)
|
||||
|
||||
min values of vectors
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v1** vector1
|
||||
| *[in]* **v2** vector2
|
||||
| *[out]* **dest** destination
|
||||
|
||||
.. c:function:: void glm_vec4_clamp(vec4 v, float minVal, float maxVal)
|
||||
|
||||
constrain a value to lie between two further values
|
||||
|
||||
Parameters:
|
||||
| *[in, out]* **v** vector
|
||||
| *[in]* **minVal** minimum value
|
||||
| *[in]* **maxVal** maximum value
|
||||
|
||||
.. c:function:: void glm_vec4_lerp(vec4 from, vec4 to, float t, vec4 dest)
|
||||
|
||||
linear interpolation between two vector
|
||||
|
||||
| formula: from + s * (to - from)
|
||||
|
||||
Parameters:
|
||||
| *[in]* **from** from value
|
||||
| *[in]* **to** to value
|
||||
| *[in]* **t** interpolant (amount) clamped between 0 and 1
|
||||
| *[out]* **dest** destination
|
54
external/cglm/include/cglm/affine-mat.h
vendored
54
external/cglm/include/cglm/affine-mat.h
vendored
|
@ -16,6 +16,7 @@
|
|||
|
||||
#include "common.h"
|
||||
#include "mat4.h"
|
||||
#include "mat3.h"
|
||||
|
||||
#ifdef CGLM_SSE_FP
|
||||
# include "simd/sse2/affine.h"
|
||||
|
@ -81,6 +82,59 @@ glm_mul(mat4 m1, mat4 m2, mat4 dest) {
|
|||
#endif
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief this is similar to glm_mat4_mul but specialized to affine transform
|
||||
*
|
||||
* Right Matrix format should be:
|
||||
* R R R 0
|
||||
* R R R 0
|
||||
* R R R 0
|
||||
* 0 0 0 1
|
||||
*
|
||||
* this reduces some multiplications. It should be faster than mat4_mul.
|
||||
* if you are not sure about matrix format then DON'T use this! use mat4_mul
|
||||
*
|
||||
* @param[in] m1 affine matrix 1
|
||||
* @param[in] m2 affine matrix 2
|
||||
* @param[out] dest result matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mul_rot(mat4 m1, mat4 m2, mat4 dest) {
|
||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||
glm_mul_rot_sse2(m1, m2, dest);
|
||||
#else
|
||||
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],
|
||||
a30 = m1[3][0], a31 = m1[3][1], a32 = m1[3][2], a33 = m1[3][3],
|
||||
|
||||
b00 = m2[0][0], b01 = m2[0][1], b02 = m2[0][2],
|
||||
b10 = m2[1][0], b11 = m2[1][1], b12 = m2[1][2],
|
||||
b20 = m2[2][0], b21 = m2[2][1], b22 = m2[2][2];
|
||||
|
||||
dest[0][0] = a00 * b00 + a10 * b01 + a20 * b02;
|
||||
dest[0][1] = a01 * b00 + a11 * b01 + a21 * b02;
|
||||
dest[0][2] = a02 * b00 + a12 * b01 + a22 * b02;
|
||||
dest[0][3] = a03 * b00 + a13 * b01 + a23 * b02;
|
||||
|
||||
dest[1][0] = a00 * b10 + a10 * b11 + a20 * b12;
|
||||
dest[1][1] = a01 * b10 + a11 * b11 + a21 * b12;
|
||||
dest[1][2] = a02 * b10 + a12 * b11 + a22 * b12;
|
||||
dest[1][3] = a03 * b10 + a13 * b11 + a23 * b12;
|
||||
|
||||
dest[2][0] = a00 * b20 + a10 * b21 + a20 * b22;
|
||||
dest[2][1] = a01 * b20 + a11 * b21 + a21 * b22;
|
||||
dest[2][2] = a02 * b20 + a12 * b21 + a22 * b22;
|
||||
dest[2][3] = a03 * b20 + a13 * b21 + a23 * b22;
|
||||
|
||||
dest[3][0] = a30;
|
||||
dest[3][1] = a31;
|
||||
dest[3][2] = a32;
|
||||
dest[3][3] = a33;
|
||||
#endif
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief inverse orthonormal rotation + translation matrix (ridig-body)
|
||||
*
|
||||
|
|
351
external/cglm/include/cglm/affine.h
vendored
351
external/cglm/include/cglm/affine.h
vendored
|
@ -16,15 +16,14 @@
|
|||
CGLM_INLINE void glm_scale_to(mat4 m, vec3 v, mat4 dest);
|
||||
CGLM_INLINE void glm_scale_make(mat4 m, vec3 v);
|
||||
CGLM_INLINE void glm_scale(mat4 m, vec3 v);
|
||||
CGLM_INLINE void glm_scale1(mat4 m, float s);
|
||||
CGLM_INLINE void glm_scale_uni(mat4 m, float s);
|
||||
CGLM_INLINE void glm_rotate_x(mat4 m, float angle, mat4 dest);
|
||||
CGLM_INLINE void glm_rotate_y(mat4 m, float angle, mat4 dest);
|
||||
CGLM_INLINE void glm_rotate_z(mat4 m, float angle, mat4 dest);
|
||||
CGLM_INLINE void glm_rotate_ndc_make(mat4 m, float angle, vec3 axis_ndc);
|
||||
CGLM_INLINE void glm_rotate_make(mat4 m, float angle, vec3 axis);
|
||||
CGLM_INLINE void glm_rotate_ndc(mat4 m, float angle, vec3 axis);
|
||||
CGLM_INLINE void glm_rotate(mat4 m, float angle, vec3 axis);
|
||||
CGLM_INLINE void glm_rotate_at(mat4 m, vec3 pivot, float angle, vec3 axis);
|
||||
CGLM_INLINE void glm_rotate_atm(mat4 m, vec3 pivot, float angle, vec3 axis);
|
||||
CGLM_INLINE void glm_decompose_scalev(mat4 m, vec3 s);
|
||||
CGLM_INLINE bool glm_uniscaled(mat4 m);
|
||||
CGLM_INLINE void glm_decompose_rs(mat4 m, mat4 r, vec3 s);
|
||||
|
@ -35,51 +34,15 @@
|
|||
#define cglm_affine_h
|
||||
|
||||
#include "common.h"
|
||||
#include "vec4.h"
|
||||
#include "affine-mat.h"
|
||||
#include "util.h"
|
||||
#include "vec3.h"
|
||||
#include "vec4.h"
|
||||
#include "mat4.h"
|
||||
#include "affine-mat.h"
|
||||
|
||||
/*!
|
||||
* @brief translate existing transform matrix by v vector
|
||||
* and store result in dest
|
||||
*
|
||||
* @param[in] m affine transfrom
|
||||
* @param[in] v translate vector [x, y, z]
|
||||
* @param[out] dest translated matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_translate_to(mat4 m, vec3 v, mat4 dest) {
|
||||
mat4 t = GLM_MAT4_IDENTITY_INIT;
|
||||
|
||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||
_mm_store_ps(dest[3],
|
||||
_mm_add_ps(_mm_add_ps(_mm_mul_ps(_mm_load_ps(t[0]),
|
||||
_mm_set1_ps(v[0])),
|
||||
_mm_mul_ps(_mm_load_ps(t[1]),
|
||||
_mm_set1_ps(v[1]))),
|
||||
_mm_add_ps(_mm_mul_ps(_mm_load_ps(t[2]),
|
||||
_mm_set1_ps(v[2])),
|
||||
_mm_load_ps(t[3]))))
|
||||
;
|
||||
|
||||
_mm_store_ps(dest[0], _mm_load_ps(m[0]));
|
||||
_mm_store_ps(dest[1], _mm_load_ps(m[1]));
|
||||
_mm_store_ps(dest[2], _mm_load_ps(m[2]));
|
||||
#else
|
||||
vec4 v1, v2, v3;
|
||||
|
||||
glm_vec4_scale(t[0], v[0], v1);
|
||||
glm_vec4_scale(t[1], v[1], v2);
|
||||
glm_vec4_scale(t[2], v[2], v3);
|
||||
|
||||
glm_vec4_add(v1, t[3], t[3]);
|
||||
glm_vec4_add(v2, t[3], t[3]);
|
||||
glm_vec4_add(v3, t[3], t[3]);
|
||||
|
||||
glm__memcpy(float, dest, t, sizeof(mat4));
|
||||
#endif
|
||||
}
|
||||
glm_mat4_mul(mat4 m1, mat4 m2, mat4 dest);
|
||||
|
||||
/*!
|
||||
* @brief translate existing transform matrix by v vector
|
||||
|
@ -92,14 +55,14 @@ CGLM_INLINE
|
|||
void
|
||||
glm_translate(mat4 m, vec3 v) {
|
||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||
_mm_store_ps(m[3],
|
||||
_mm_add_ps(_mm_add_ps(_mm_mul_ps(_mm_load_ps(m[0]),
|
||||
_mm_set1_ps(v[0])),
|
||||
_mm_mul_ps(_mm_load_ps(m[1]),
|
||||
_mm_set1_ps(v[1]))),
|
||||
_mm_add_ps(_mm_mul_ps(_mm_load_ps(m[2]),
|
||||
_mm_set1_ps(v[2])),
|
||||
_mm_load_ps(m[3]))))
|
||||
glmm_store(m[3],
|
||||
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_load(m[0]),
|
||||
_mm_set1_ps(v[0])),
|
||||
_mm_mul_ps(glmm_load(m[1]),
|
||||
_mm_set1_ps(v[1]))),
|
||||
_mm_add_ps(_mm_mul_ps(glmm_load(m[2]),
|
||||
_mm_set1_ps(v[2])),
|
||||
glmm_load(m[3]))))
|
||||
;
|
||||
#else
|
||||
vec4 v1, v2, v3;
|
||||
|
@ -114,6 +77,23 @@ glm_translate(mat4 m, vec3 v) {
|
|||
#endif
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief translate existing transform matrix by v vector
|
||||
* and store result in dest
|
||||
*
|
||||
* source matrix will remain same
|
||||
*
|
||||
* @param[in] m affine transfrom
|
||||
* @param[in] v translate vector [x, y, z]
|
||||
* @param[out] dest translated matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_translate_to(mat4 m, vec3 v, mat4 dest) {
|
||||
glm_mat4_copy(m, dest);
|
||||
glm_translate(dest, v);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief translate existing transform matrix by x factor
|
||||
*
|
||||
|
@ -124,10 +104,10 @@ CGLM_INLINE
|
|||
void
|
||||
glm_translate_x(mat4 m, float x) {
|
||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||
_mm_store_ps(m[3],
|
||||
_mm_add_ps(_mm_mul_ps(_mm_load_ps(m[0]),
|
||||
_mm_set1_ps(x)),
|
||||
_mm_load_ps(m[3])))
|
||||
glmm_store(m[3],
|
||||
_mm_add_ps(_mm_mul_ps(glmm_load(m[0]),
|
||||
_mm_set1_ps(x)),
|
||||
glmm_load(m[3])))
|
||||
;
|
||||
#else
|
||||
vec4 v1;
|
||||
|
@ -146,10 +126,10 @@ CGLM_INLINE
|
|||
void
|
||||
glm_translate_y(mat4 m, float y) {
|
||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||
_mm_store_ps(m[3],
|
||||
_mm_add_ps(_mm_mul_ps(_mm_load_ps(m[1]),
|
||||
_mm_set1_ps(y)),
|
||||
_mm_load_ps(m[3])))
|
||||
glmm_store(m[3],
|
||||
_mm_add_ps(_mm_mul_ps(glmm_load(m[1]),
|
||||
_mm_set1_ps(y)),
|
||||
glmm_load(m[3])))
|
||||
;
|
||||
#else
|
||||
vec4 v1;
|
||||
|
@ -168,10 +148,10 @@ CGLM_INLINE
|
|||
void
|
||||
glm_translate_z(mat4 m, float z) {
|
||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||
_mm_store_ps(m[3],
|
||||
_mm_add_ps(_mm_mul_ps(_mm_load_ps(m[2]),
|
||||
_mm_set1_ps(z)),
|
||||
_mm_load_ps(m[3])))
|
||||
glmm_store(m[3],
|
||||
_mm_add_ps(_mm_mul_ps(glmm_load(m[2]),
|
||||
_mm_set1_ps(z)),
|
||||
glmm_load(m[3])))
|
||||
;
|
||||
#else
|
||||
vec4 v1;
|
||||
|
@ -189,8 +169,8 @@ glm_translate_z(mat4 m, float z) {
|
|||
CGLM_INLINE
|
||||
void
|
||||
glm_translate_make(mat4 m, vec3 v) {
|
||||
mat4 t = GLM_MAT4_IDENTITY_INIT;
|
||||
glm_translate_to(t, v, m);
|
||||
glm_mat4_identity(m);
|
||||
glm_vec_copy(v, m[3]);
|
||||
}
|
||||
|
||||
/*!
|
||||
|
@ -220,8 +200,10 @@ glm_scale_to(mat4 m, vec3 v, mat4 dest) {
|
|||
CGLM_INLINE
|
||||
void
|
||||
glm_scale_make(mat4 m, vec3 v) {
|
||||
mat4 t = GLM_MAT4_IDENTITY_INIT;
|
||||
glm_scale_to(t, v, m);
|
||||
glm_mat4_identity(m);
|
||||
m[0][0] = v[0];
|
||||
m[1][1] = v[1];
|
||||
m[2][2] = v[2];
|
||||
}
|
||||
|
||||
/*!
|
||||
|
@ -237,16 +219,6 @@ glm_scale(mat4 m, vec3 v) {
|
|||
glm_scale_to(m, v, m);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief DEPRECATED! Use glm_scale_uni
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_scale1(mat4 m, float s) {
|
||||
vec3 v = { s, s, s };
|
||||
glm_scale_to(m, v, m);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief applies uniform scale to existing transform matrix v = [s, s, s]
|
||||
* and stores result in same matrix
|
||||
|
@ -257,7 +229,7 @@ glm_scale1(mat4 m, float s) {
|
|||
CGLM_INLINE
|
||||
void
|
||||
glm_scale_uni(mat4 m, float s) {
|
||||
vec3 v = { s, s, s };
|
||||
CGLM_ALIGN(8) vec3 v = { s, s, s };
|
||||
glm_scale_to(m, v, m);
|
||||
}
|
||||
|
||||
|
@ -272,19 +244,18 @@ glm_scale_uni(mat4 m, float s) {
|
|||
CGLM_INLINE
|
||||
void
|
||||
glm_rotate_x(mat4 m, float angle, mat4 dest) {
|
||||
float cosVal;
|
||||
float sinVal;
|
||||
mat4 t = GLM_MAT4_IDENTITY_INIT;
|
||||
CGLM_ALIGN(16) mat4 t = GLM_MAT4_IDENTITY_INIT;
|
||||
float c, s;
|
||||
|
||||
cosVal = cosf(angle);
|
||||
sinVal = sinf(angle);
|
||||
c = cosf(angle);
|
||||
s = sinf(angle);
|
||||
|
||||
t[1][1] = cosVal;
|
||||
t[1][2] = sinVal;
|
||||
t[2][1] = -sinVal;
|
||||
t[2][2] = cosVal;
|
||||
t[1][1] = c;
|
||||
t[1][2] = s;
|
||||
t[2][1] = -s;
|
||||
t[2][2] = c;
|
||||
|
||||
glm_mat4_mul(m, t, dest);
|
||||
glm_mul_rot(m, t, dest);
|
||||
}
|
||||
|
||||
/*!
|
||||
|
@ -298,19 +269,18 @@ glm_rotate_x(mat4 m, float angle, mat4 dest) {
|
|||
CGLM_INLINE
|
||||
void
|
||||
glm_rotate_y(mat4 m, float angle, mat4 dest) {
|
||||
float cosVal;
|
||||
float sinVal;
|
||||
mat4 t = GLM_MAT4_IDENTITY_INIT;
|
||||
CGLM_ALIGN(16) mat4 t = GLM_MAT4_IDENTITY_INIT;
|
||||
float c, s;
|
||||
|
||||
cosVal = cosf(angle);
|
||||
sinVal = sinf(angle);
|
||||
c = cosf(angle);
|
||||
s = sinf(angle);
|
||||
|
||||
t[0][0] = cosVal;
|
||||
t[0][2] = -sinVal;
|
||||
t[2][0] = sinVal;
|
||||
t[2][2] = cosVal;
|
||||
t[0][0] = c;
|
||||
t[0][2] = -s;
|
||||
t[2][0] = s;
|
||||
t[2][2] = c;
|
||||
|
||||
glm_mat4_mul(m, t, dest);
|
||||
glm_mul_rot(m, t, dest);
|
||||
}
|
||||
|
||||
/*!
|
||||
|
@ -324,67 +294,24 @@ glm_rotate_y(mat4 m, float angle, mat4 dest) {
|
|||
CGLM_INLINE
|
||||
void
|
||||
glm_rotate_z(mat4 m, float angle, mat4 dest) {
|
||||
float cosVal;
|
||||
float sinVal;
|
||||
mat4 t = GLM_MAT4_IDENTITY_INIT;
|
||||
|
||||
cosVal = cosf(angle);
|
||||
sinVal = sinf(angle);
|
||||
|
||||
t[0][0] = cosVal;
|
||||
t[0][1] = sinVal;
|
||||
t[1][0] = -sinVal;
|
||||
t[1][1] = cosVal;
|
||||
|
||||
glm_mat4_mul(m, t, dest);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief creates NEW rotation matrix by angle and axis
|
||||
*
|
||||
* this name may change in the future. axis must be is normalized
|
||||
*
|
||||
* @param[out] m affine transfrom
|
||||
* @param[in] angle angle (radians)
|
||||
* @param[in] axis_ndc normalized axis
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_rotate_ndc_make(mat4 m, float angle, vec3 axis_ndc) {
|
||||
/* https://www.opengl.org/sdk/docs/man2/xhtml/glRotate.xml */
|
||||
|
||||
vec3 v, vs;
|
||||
float c;
|
||||
CGLM_ALIGN(16) mat4 t = GLM_MAT4_IDENTITY_INIT;
|
||||
float c, s;
|
||||
|
||||
c = cosf(angle);
|
||||
s = sinf(angle);
|
||||
|
||||
glm_vec_scale(axis_ndc, 1.0f - c, v);
|
||||
glm_vec_scale(axis_ndc, sinf(angle), vs);
|
||||
t[0][0] = c;
|
||||
t[0][1] = s;
|
||||
t[1][0] = -s;
|
||||
t[1][1] = c;
|
||||
|
||||
glm_vec_scale(axis_ndc, v[0], m[0]);
|
||||
glm_vec_scale(axis_ndc, v[1], m[1]);
|
||||
glm_vec_scale(axis_ndc, v[2], m[2]);
|
||||
|
||||
m[0][0] += c;
|
||||
m[0][1] += vs[2];
|
||||
m[0][2] -= vs[1];
|
||||
|
||||
m[1][0] -= vs[2];
|
||||
m[1][1] += c;
|
||||
m[1][2] += vs[0];
|
||||
|
||||
m[2][0] += vs[1];
|
||||
m[2][1] -= vs[0];
|
||||
m[2][2] += c;
|
||||
|
||||
m[0][3] = m[1][3] = m[2][3] = m[3][0] = m[3][1] = m[3][2] = 0.0f;
|
||||
m[3][3] = 1.0f;
|
||||
glm_mul_rot(m, t, dest);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief creates NEW rotation matrix by angle and axis
|
||||
*
|
||||
* this name may change in the future. axis must be is normalized
|
||||
* axis will be normalized so you don't need to normalize it
|
||||
*
|
||||
* @param[out] m affine transfrom
|
||||
* @param[in] angle angle (radians)
|
||||
|
@ -393,53 +320,29 @@ glm_rotate_ndc_make(mat4 m, float angle, vec3 axis_ndc) {
|
|||
CGLM_INLINE
|
||||
void
|
||||
glm_rotate_make(mat4 m, float angle, vec3 axis) {
|
||||
vec3 axis_ndc;
|
||||
CGLM_ALIGN(8) vec3 axisn, v, vs;
|
||||
float c;
|
||||
|
||||
glm_vec_normalize_to(axis, axis_ndc);
|
||||
glm_rotate_ndc_make(m, angle, axis_ndc);
|
||||
c = cosf(angle);
|
||||
|
||||
glm_vec_normalize_to(axis, axisn);
|
||||
glm_vec_scale(axisn, 1.0f - c, v);
|
||||
glm_vec_scale(axisn, sinf(angle), vs);
|
||||
|
||||
glm_vec_scale(axisn, v[0], m[0]);
|
||||
glm_vec_scale(axisn, v[1], m[1]);
|
||||
glm_vec_scale(axisn, v[2], m[2]);
|
||||
|
||||
m[0][0] += c; m[1][0] -= vs[2]; m[2][0] += vs[1];
|
||||
m[0][1] += vs[2]; m[1][1] += c; m[2][1] -= vs[0];
|
||||
m[0][2] -= vs[1]; m[1][2] += vs[0]; m[2][2] += c;
|
||||
|
||||
m[0][3] = m[1][3] = m[2][3] = m[3][0] = m[3][1] = m[3][2] = 0.0f;
|
||||
m[3][3] = 1.0f;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief rotate existing transform matrix around Z axis by angle and axis
|
||||
*
|
||||
* this name may change in the future, axis must be normalized.
|
||||
*
|
||||
* @param[in, out] m affine transfrom
|
||||
* @param[in] angle angle (radians)
|
||||
* @param[in] axis_ndc normalized axis
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_rotate_ndc(mat4 m, float angle, vec3 axis_ndc) {
|
||||
mat4 rot, tmp;
|
||||
|
||||
glm_rotate_ndc_make(rot, angle, axis_ndc);
|
||||
|
||||
glm_vec4_scale(m[0], rot[0][0], tmp[1]);
|
||||
glm_vec4_scale(m[1], rot[0][1], tmp[0]);
|
||||
glm_vec4_add(tmp[1], tmp[0], tmp[1]);
|
||||
glm_vec4_scale(m[2], rot[0][2], tmp[0]);
|
||||
glm_vec4_add(tmp[1], tmp[0], tmp[1]);
|
||||
|
||||
glm_vec4_scale(m[0], rot[1][0], tmp[2]);
|
||||
glm_vec4_scale(m[1], rot[1][1], tmp[0]);
|
||||
glm_vec4_add(tmp[2], tmp[0], tmp[2]);
|
||||
glm_vec4_scale(m[2], rot[1][2], tmp[0]);
|
||||
glm_vec4_add(tmp[2], tmp[0], tmp[2]);
|
||||
|
||||
glm_vec4_scale(m[0], rot[2][0], tmp[3]);
|
||||
glm_vec4_scale(m[1], rot[2][1], tmp[0]);
|
||||
glm_vec4_add(tmp[3], tmp[0], tmp[3]);
|
||||
glm_vec4_scale(m[2], rot[2][2], tmp[0]);
|
||||
glm_vec4_add(tmp[3], tmp[0], tmp[3]);
|
||||
|
||||
glm_vec4_copy(tmp[1], m[0]);
|
||||
glm_vec4_copy(tmp[2], m[1]);
|
||||
glm_vec4_copy(tmp[3], m[2]);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief rotate existing transform matrix around Z axis by angle and axis
|
||||
* @brief rotate existing transform matrix around given axis by angle
|
||||
*
|
||||
* @param[in, out] m affine transfrom
|
||||
* @param[in] angle angle (radians)
|
||||
|
@ -448,10 +351,55 @@ glm_rotate_ndc(mat4 m, float angle, vec3 axis_ndc) {
|
|||
CGLM_INLINE
|
||||
void
|
||||
glm_rotate(mat4 m, float angle, vec3 axis) {
|
||||
vec3 axis_ndc;
|
||||
CGLM_ALIGN(16) mat4 rot;
|
||||
glm_rotate_make(rot, angle, axis);
|
||||
glm_mul_rot(m, rot, m);
|
||||
}
|
||||
|
||||
glm_vec_normalize_to(axis, axis_ndc);
|
||||
glm_rotate_ndc(m, angle, axis_ndc);
|
||||
/*!
|
||||
* @brief rotate existing transform
|
||||
* around given axis by angle at given pivot point (rotation center)
|
||||
*
|
||||
* @param[in, out] m affine transfrom
|
||||
* @param[in] pivot rotation center
|
||||
* @param[in] angle angle (radians)
|
||||
* @param[in] axis axis
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_rotate_at(mat4 m, vec3 pivot, float angle, vec3 axis) {
|
||||
CGLM_ALIGN(8) vec3 pivotInv;
|
||||
|
||||
glm_vec_inv_to(pivot, pivotInv);
|
||||
|
||||
glm_translate(m, pivot);
|
||||
glm_rotate(m, angle, axis);
|
||||
glm_translate(m, pivotInv);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief creates NEW rotation matrix by angle and axis at given point
|
||||
*
|
||||
* this creates rotation matrix, it assumes you don't have a matrix
|
||||
*
|
||||
* this should work faster than glm_rotate_at because it reduces
|
||||
* one glm_translate.
|
||||
*
|
||||
* @param[out] m affine transfrom
|
||||
* @param[in] pivot rotation center
|
||||
* @param[in] angle angle (radians)
|
||||
* @param[in] axis axis
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_rotate_atm(mat4 m, vec3 pivot, float angle, vec3 axis) {
|
||||
CGLM_ALIGN(8) vec3 pivotInv;
|
||||
|
||||
glm_vec_inv_to(pivot, pivotInv);
|
||||
|
||||
glm_translate_make(m, pivot);
|
||||
glm_rotate(m, angle, axis);
|
||||
glm_translate(m, pivotInv);
|
||||
}
|
||||
|
||||
/*!
|
||||
|
@ -469,7 +417,7 @@ glm_decompose_scalev(mat4 m, vec3 s) {
|
|||
}
|
||||
|
||||
/*!
|
||||
* @brief returns true if matrix is uniform scaled. This is helpful for
|
||||
* @brief returns true if matrix is uniform scaled. This is helpful for
|
||||
* creating normal matrix.
|
||||
*
|
||||
* @param[in] m m
|
||||
|
@ -479,9 +427,8 @@ glm_decompose_scalev(mat4 m, vec3 s) {
|
|||
CGLM_INLINE
|
||||
bool
|
||||
glm_uniscaled(mat4 m) {
|
||||
vec3 s;
|
||||
CGLM_ALIGN(8) vec3 s;
|
||||
glm_decompose_scalev(m, s);
|
||||
|
||||
return glm_vec_eq_all(s);
|
||||
}
|
||||
|
||||
|
@ -496,8 +443,8 @@ glm_uniscaled(mat4 m) {
|
|||
CGLM_INLINE
|
||||
void
|
||||
glm_decompose_rs(mat4 m, mat4 r, vec3 s) {
|
||||
vec4 t = {0.0f, 0.0f, 0.0f, 1.0f};
|
||||
vec3 v;
|
||||
CGLM_ALIGN(16) vec4 t = {0.0f, 0.0f, 0.0f, 1.0f};
|
||||
CGLM_ALIGN(8) vec3 v;
|
||||
|
||||
glm_vec4_copy(m[0], r[0]);
|
||||
glm_vec4_copy(m[1], r[1]);
|
||||
|
|
127
external/cglm/include/cglm/box.h
vendored
127
external/cglm/include/cglm/box.h
vendored
|
@ -11,6 +11,7 @@
|
|||
#include "common.h"
|
||||
#include "vec3.h"
|
||||
#include "vec4.h"
|
||||
#include "util.h"
|
||||
|
||||
/*!
|
||||
* @brief apply transform to Axis-Aligned Bounding Box
|
||||
|
@ -153,4 +154,130 @@ glm_aabb_frustum(vec3 box[2], vec4 planes[6]) {
|
|||
return true;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief invalidate AABB min and max values
|
||||
*
|
||||
* @param[in, out] box bounding box
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_aabb_invalidate(vec3 box[2]) {
|
||||
glm_vec_broadcast(FLT_MAX, box[0]);
|
||||
glm_vec_broadcast(-FLT_MAX, box[1]);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief check if AABB is valid or not
|
||||
*
|
||||
* @param[in] box bounding box
|
||||
*/
|
||||
CGLM_INLINE
|
||||
bool
|
||||
glm_aabb_isvalid(vec3 box[2]) {
|
||||
return glm_vec_max(box[0]) != FLT_MAX
|
||||
&& glm_vec_min(box[1]) != -FLT_MAX;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief distance between of min and max
|
||||
*
|
||||
* @param[in] box bounding box
|
||||
*/
|
||||
CGLM_INLINE
|
||||
float
|
||||
glm_aabb_size(vec3 box[2]) {
|
||||
return glm_vec_distance(box[0], box[1]);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief radius of sphere which surrounds AABB
|
||||
*
|
||||
* @param[in] box bounding box
|
||||
*/
|
||||
CGLM_INLINE
|
||||
float
|
||||
glm_aabb_radius(vec3 box[2]) {
|
||||
return glm_aabb_size(box) * 0.5f;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief computes center point of AABB
|
||||
*
|
||||
* @param[in] box bounding box
|
||||
* @param[out] dest center of bounding box
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_aabb_center(vec3 box[2], vec3 dest) {
|
||||
glm_vec_center(box[0], box[1], dest);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief check if two AABB intersects
|
||||
*
|
||||
* @param[in] box bounding box
|
||||
* @param[in] other other bounding box
|
||||
*/
|
||||
CGLM_INLINE
|
||||
bool
|
||||
glm_aabb_aabb(vec3 box[2], vec3 other[2]) {
|
||||
return (box[0][0] <= other[1][0] && box[1][0] >= other[0][0])
|
||||
&& (box[0][1] <= other[1][1] && box[1][1] >= other[0][1])
|
||||
&& (box[0][2] <= other[1][2] && box[1][2] >= other[0][2]);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief check if AABB intersects with sphere
|
||||
*
|
||||
* https://github.com/erich666/GraphicsGems/blob/master/gems/BoxSphere.c
|
||||
* Solid Box - Solid Sphere test.
|
||||
*
|
||||
* @param[in] box solid bounding box
|
||||
* @param[in] s solid sphere
|
||||
*/
|
||||
CGLM_INLINE
|
||||
bool
|
||||
glm_aabb_sphere(vec3 box[2], vec4 s) {
|
||||
float dmin;
|
||||
int a, b, c;
|
||||
|
||||
a = s[0] >= box[0][0];
|
||||
b = s[1] >= box[0][1];
|
||||
c = s[2] >= box[0][2];
|
||||
|
||||
dmin = glm_pow2(s[0] - box[a][0])
|
||||
+ glm_pow2(s[1] - box[b][1])
|
||||
+ glm_pow2(s[2] - box[c][2]);
|
||||
|
||||
return dmin <= glm_pow2(s[3]);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief check if point is inside of AABB
|
||||
*
|
||||
* @param[in] box bounding box
|
||||
* @param[in] point point
|
||||
*/
|
||||
CGLM_INLINE
|
||||
bool
|
||||
glm_aabb_point(vec3 box[2], vec3 point) {
|
||||
return (point[0] >= box[0][0] && point[0] <= box[1][0])
|
||||
&& (point[1] >= box[0][1] && point[1] <= box[1][1])
|
||||
&& (point[2] >= box[0][2] && point[2] <= box[1][2]);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief check if AABB contains other AABB
|
||||
*
|
||||
* @param[in] box bounding box
|
||||
* @param[in] other other bounding box
|
||||
*/
|
||||
CGLM_INLINE
|
||||
bool
|
||||
glm_aabb_contains(vec3 box[2], vec3 other[2]) {
|
||||
return (box[0][0] <= other[0][0] && box[1][0] >= other[1][0])
|
||||
&& (box[0][1] <= other[0][1] && box[1][1] >= other[1][1])
|
||||
&& (box[0][2] <= other[0][2] && box[1][2] >= other[1][2]);
|
||||
}
|
||||
|
||||
#endif /* cglm_box_h */
|
||||
|
|
3
external/cglm/include/cglm/call.h
vendored
3
external/cglm/include/cglm/call.h
vendored
|
@ -24,6 +24,9 @@ extern "C" {
|
|||
#include "call/frustum.h"
|
||||
#include "call/box.h"
|
||||
#include "call/io.h"
|
||||
#include "call/project.h"
|
||||
#include "call/sphere.h"
|
||||
#include "call/ease.h"
|
||||
|
||||
// TODO: call versions of these?
|
||||
#include "util.h"
|
||||
|
|
44
external/cglm/include/cglm/call/affine.h
vendored
44
external/cglm/include/cglm/call/affine.h
vendored
|
@ -13,6 +13,10 @@ extern "C" {
|
|||
|
||||
#include "../common.h"
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_translate_make(mat4 m, vec3 v);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_translate_to(mat4 m, vec3 v, mat4 dest);
|
||||
|
@ -33,6 +37,10 @@ CGLM_EXPORT
|
|||
void
|
||||
glmc_translate_z(mat4 m, float to);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_scale_make(mat4 m, vec3 v);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_scale_to(mat4 m, vec3 v, mat4 dest);
|
||||
|
@ -43,7 +51,7 @@ glmc_scale(mat4 m, vec3 v);
|
|||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_scale1(mat4 m, float s);
|
||||
glmc_scale_uni(mat4 m, float s);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
|
@ -57,26 +65,30 @@ CGLM_EXPORT
|
|||
void
|
||||
glmc_rotate_z(mat4 m, float rad, mat4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_rotate_ndc_make(mat4 m, float angle, vec3 axis_ndc);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_rotate_make(mat4 m, float angle, vec3 axis);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_rotate_ndc(mat4 m, float angle, vec3 axis_ndc);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_rotate(mat4 m, float angle, vec3 axis);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_rotate_at(mat4 m, vec3 pivot, float angle, vec3 axis);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_rotate_atm(mat4 m, vec3 pivot, float angle, vec3 axis);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_decompose_scalev(mat4 m, vec3 s);
|
||||
|
||||
CGLM_EXPORT
|
||||
bool
|
||||
glmc_uniscaled(mat4 m);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_decompose_rs(mat4 m, mat4 r, vec3 s);
|
||||
|
@ -85,6 +97,20 @@ CGLM_EXPORT
|
|||
void
|
||||
glmc_decompose(mat4 m, vec4 t, mat4 r, vec3 s);
|
||||
|
||||
/* affine-mat */
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mul(mat4 m1, mat4 m2, mat4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mul_rot(mat4 m1, mat4 m2, mat4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_inv_tr(mat4 mat);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
40
external/cglm/include/cglm/call/box.h
vendored
40
external/cglm/include/cglm/call/box.h
vendored
|
@ -32,6 +32,46 @@ glmc_aabb_crop_until(vec3 box[2],
|
|||
vec3 clampBox[2],
|
||||
vec3 dest[2]);
|
||||
|
||||
CGLM_EXPORT
|
||||
bool
|
||||
glmc_aabb_frustum(vec3 box[2], vec4 planes[6]);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_aabb_invalidate(vec3 box[2]);
|
||||
|
||||
CGLM_EXPORT
|
||||
bool
|
||||
glmc_aabb_isvalid(vec3 box[2]);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_aabb_size(vec3 box[2]);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_aabb_radius(vec3 box[2]);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_aabb_center(vec3 box[2], vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
bool
|
||||
glmc_aabb_aabb(vec3 box[2], vec3 other[2]);
|
||||
|
||||
CGLM_EXPORT
|
||||
bool
|
||||
glmc_aabb_point(vec3 box[2], vec3 point);
|
||||
|
||||
CGLM_EXPORT
|
||||
bool
|
||||
glmc_aabb_contains(vec3 box[2], vec3 other[2]);
|
||||
|
||||
CGLM_EXPORT
|
||||
bool
|
||||
glmc_aabb_sphere(vec3 box[2], vec4 s);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
80
external/cglm/include/cglm/call/cam.h
vendored
80
external/cglm/include/cglm/call/cam.h
vendored
|
@ -33,6 +33,26 @@ glmc_ortho(float left,
|
|||
float farVal,
|
||||
mat4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ortho_aabb(vec3 box[2], mat4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ortho_aabb_p(vec3 box[2], float padding, mat4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ortho_aabb_pz(vec3 box[2], float padding, mat4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ortho_default(float aspect, mat4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ortho_default_s(float aspect, float size, mat4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_perspective(float fovy,
|
||||
|
@ -41,6 +61,14 @@ glmc_perspective(float fovy,
|
|||
float farVal,
|
||||
mat4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_perspective_default(float aspect, mat4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_perspective_resize(float aspect, mat4 proj);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_lookat(vec3 eye, vec3 center, vec3 up, mat4 dest);
|
||||
|
@ -53,6 +81,58 @@ CGLM_EXPORT
|
|||
void
|
||||
glmc_look_anyup(vec3 eye, vec3 dir, mat4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_persp_decomp(mat4 proj,
|
||||
float * __restrict nearVal,
|
||||
float * __restrict farVal,
|
||||
float * __restrict top,
|
||||
float * __restrict bottom,
|
||||
float * __restrict left,
|
||||
float * __restrict right);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_persp_decompv(mat4 proj, float dest[6]);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_persp_decomp_x(mat4 proj,
|
||||
float * __restrict left,
|
||||
float * __restrict right);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_persp_decomp_y(mat4 proj,
|
||||
float * __restrict top,
|
||||
float * __restrict bottom);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_persp_decomp_z(mat4 proj,
|
||||
float * __restrict nearVal,
|
||||
float * __restrict farVal);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_persp_decomp_far(mat4 proj, float * __restrict farVal);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_persp_decomp_near(mat4 proj, float * __restrict nearVal);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_persp_fovy(mat4 proj);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_persp_aspect(mat4 proj);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_persp_sizes(mat4 proj, float fovy, vec4 dest);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
140
external/cglm/include/cglm/call/ease.h
vendored
Normal file
140
external/cglm/include/cglm/call/ease.h
vendored
Normal file
|
@ -0,0 +1,140 @@
|
|||
/*
|
||||
* Copyright (c), Recep Aslantas.
|
||||
*
|
||||
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||
* Full license can be found in the LICENSE file
|
||||
*/
|
||||
|
||||
#ifndef cglmc_ease_h
|
||||
#define cglmc_ease_h
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "../common.h"
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_ease_linear(float t);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_ease_sine_in(float t);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_ease_sine_out(float t);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_ease_sine_inout(float t);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_ease_quad_in(float t);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_ease_quad_out(float t);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_ease_quad_inout(float t);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_ease_cubic_in(float t);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_ease_cubic_out(float t);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_ease_cubic_inout(float t);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_ease_quart_in(float t);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_ease_quart_out(float t);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_ease_quart_inout(float t);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_ease_quint_in(float t);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_ease_quint_out(float t);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_ease_quint_inout(float t);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_ease_exp_in(float t);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_ease_exp_out(float t);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_ease_exp_inout(float t);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_ease_circ_in(float t);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_ease_circ_out(float t);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_ease_circ_inout(float t);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_ease_back_in(float t);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_ease_back_out(float t);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_ease_back_inout(float t);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_ease_elast_in(float t);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_ease_elast_out(float t);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_ease_elast_inout(float t);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_ease_bounce_out(float t);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_ease_bounce_in(float t);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_ease_bounce_inout(float t);
|
||||
|
||||
#endif /* cglmc_ease_h */
|
4
external/cglm/include/cglm/call/euler.h
vendored
4
external/cglm/include/cglm/call/euler.h
vendored
|
@ -21,6 +21,10 @@ CGLM_EXPORT
|
|||
void
|
||||
glmc_euler(vec3 angles, mat4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_euler_xyz(vec3 angles, mat4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_euler_zyx(vec3 angles, mat4 dest);
|
||||
|
|
4
external/cglm/include/cglm/call/mat3.h
vendored
4
external/cglm/include/cglm/call/mat3.h
vendored
|
@ -40,6 +40,10 @@ CGLM_EXPORT
|
|||
void
|
||||
glmc_mat3_mulv(mat3 m, vec3 v, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat3_quat(mat3 m, versor dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat3_scale(mat3 m, float s);
|
||||
|
|
14
external/cglm/include/cglm/call/mat4.h
vendored
14
external/cglm/include/cglm/call/mat4.h
vendored
|
@ -47,12 +47,20 @@ glmc_mat4_mul(mat4 m1, mat4 m2, mat4 dest);
|
|||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat4_mulN(mat4 * __restrict matrices[], int len, mat4 dest);
|
||||
glmc_mat4_mulN(mat4 * __restrict matrices[], uint32_t len, mat4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat4_mulv(mat4 m, vec4 v, vec4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat4_mulv3(mat4 m, vec3 v, float last, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat4_quat(mat4 m, versor dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat4_transpose_to(mat4 m, mat4 dest);
|
||||
|
@ -81,6 +89,10 @@ CGLM_EXPORT
|
|||
void
|
||||
glmc_mat4_inv_precise(mat4 mat, mat4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat4_inv_fast(mat4 mat, mat4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat4_swap_col(mat4 mat, int col1, int col2);
|
||||
|
|
33
external/cglm/include/cglm/call/project.h
vendored
Normal file
33
external/cglm/include/cglm/call/project.h
vendored
Normal file
|
@ -0,0 +1,33 @@
|
|||
/*
|
||||
* Copyright (c), Recep Aslantas.
|
||||
*
|
||||
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||
* Full license can be found in the LICENSE file
|
||||
*/
|
||||
|
||||
#ifndef cglmc_project_h
|
||||
#define cglmc_project_h
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "../common.h"
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_unprojecti(vec3 pos, mat4 invMat, vec4 vp, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_unproject(vec3 pos, mat4 m, vec4 vp, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_project(vec3 pos, mat4 m, vec4 vp, vec3 dest);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif /* cglmc_project_h */
|
||||
|
||||
|
115
external/cglm/include/cglm/call/quat.h
vendored
115
external/cglm/include/cglm/call/quat.h
vendored
|
@ -19,33 +19,79 @@ glmc_quat_identity(versor q);
|
|||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_quat(versor q,
|
||||
float angle,
|
||||
float x,
|
||||
float y,
|
||||
float z);
|
||||
glmc_quat_init(versor q, float x, float y, float z, float w);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_quatv(versor q,
|
||||
float angle,
|
||||
vec3 v);
|
||||
glmc_quat(versor q, float angle, float x, float y, float z);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_quatv(versor q, float angle, vec3 axis);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_quat_copy(versor q, versor dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_quat_norm(versor q);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_quat_normalize_to(versor q, versor dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_quat_normalize(versor q);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_quat_dot(versor q, versor r);
|
||||
glmc_quat_dot(versor p, versor q);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_quat_mulv(versor q1, versor q2, versor dest);
|
||||
glmc_quat_conjugate(versor q, versor dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_quat_inv(versor q, versor dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_quat_add(versor p, versor q, versor dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_quat_sub(versor p, versor q, versor dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_quat_real(versor q);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_quat_imag(versor q, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_quat_imagn(versor q, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_quat_imaglen(versor q);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_quat_angle(versor q);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_quat_axis(versor q, versor dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_quat_mul(versor p, versor q, versor dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
|
@ -53,10 +99,51 @@ glmc_quat_mat4(versor q, mat4 dest);
|
|||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_quat_slerp(versor q,
|
||||
versor r,
|
||||
float t,
|
||||
versor dest);
|
||||
glmc_quat_mat4t(versor q, mat4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_quat_mat3(versor q, mat3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_quat_mat3t(versor q, mat3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_quat_lerp(versor from, versor to, float t, versor dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_quat_slerp(versor q, versor r, float t, versor dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_quat_look(vec3 eye, versor ori, mat4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_quat_for(vec3 dir, vec3 fwd, vec3 up, versor dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_quat_forp(vec3 from, vec3 to, vec3 fwd, vec3 up, versor dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_quat_rotatev(versor from, vec3 to, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_quat_rotate(mat4 m, versor q, mat4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_quat_rotate_at(mat4 model, versor q, vec3 pivot);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_quat_rotate_atm(mat4 m, versor q, vec3 pivot);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
36
external/cglm/include/cglm/call/sphere.h
vendored
Normal file
36
external/cglm/include/cglm/call/sphere.h
vendored
Normal file
|
@ -0,0 +1,36 @@
|
|||
/*
|
||||
* Copyright (c), Recep Aslantas.
|
||||
*
|
||||
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||
* Full license can be found in the LICENSE file
|
||||
*/
|
||||
|
||||
#ifndef cglmc_sphere_h
|
||||
#define cglmc_sphere_h
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "../common.h"
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_sphere_radii(vec4 s);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_sphere_transform(vec4 s, mat4 m, vec4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_sphere_merge(vec4 s1, vec4 s2, vec4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
bool
|
||||
glmc_sphere_sphere(vec4 s1, vec4 s2);
|
||||
|
||||
CGLM_EXPORT
|
||||
bool
|
||||
glmc_sphere_point(vec4 s, vec3 point);
|
||||
|
||||
#endif /* cglmc_sphere_h */
|
132
external/cglm/include/cglm/call/vec3.h
vendored
132
external/cglm/include/cglm/call/vec3.h
vendored
|
@ -16,10 +16,22 @@ extern "C" {
|
|||
/* DEPRECATED! use _copy, _ucopy versions */
|
||||
#define glmc_vec_dup(v, dest) glmc_vec_copy(v, dest)
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec3(vec4 v4, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec_copy(vec3 a, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec_zero(vec3 v);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec_one(vec3 v);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_vec_dot(vec3 a, vec3 b);
|
||||
|
@ -50,7 +62,19 @@ glmc_vec_add(vec3 v1, vec3 v2, vec3 dest);
|
|||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec_sub(vec3 v1, vec3 v2, vec3 dest);
|
||||
glmc_vec_adds(vec3 v, float s, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec_sub(vec3 a, vec3 b, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec_subs(vec3 v, float s, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec_mul(vec3 a, vec3 b, vec3 d);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
|
@ -60,10 +84,38 @@ CGLM_EXPORT
|
|||
void
|
||||
glmc_vec_scale_as(vec3 v, float s, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec_div(vec3 a, vec3 b, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec_divs(vec3 a, float s, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec_addadd(vec3 a, vec3 b, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec_subadd(vec3 a, vec3 b, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec_muladd(vec3 a, vec3 b, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec_muladds(vec3 a, float s, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec_flipsign(vec3 v);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec_flipsign_to(vec3 v, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec_inv(vec3 v);
|
||||
|
@ -84,6 +136,10 @@ CGLM_EXPORT
|
|||
void
|
||||
glmc_vec_rotate_m4(mat4 m, vec3 v, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec_rotate_m3(mat3 m, vec3 v, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec_proj(vec3 a, vec3 b, vec3 dest);
|
||||
|
@ -92,6 +148,10 @@ CGLM_EXPORT
|
|||
void
|
||||
glmc_vec_center(vec3 v1, vec3 v2, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_vec_distance2(vec3 v1, vec3 v2);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_vec_distance(vec3 v1, vec3 v2);
|
||||
|
@ -104,6 +164,76 @@ CGLM_EXPORT
|
|||
void
|
||||
glmc_vec_minv(vec3 v1, vec3 v2, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec_clamp(vec3 v, float minVal, float maxVal);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec_ortho(vec3 v, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec_lerp(vec3 from, vec3 to, float t, vec3 dest);
|
||||
|
||||
/* ext */
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec_mulv(vec3 a, vec3 b, vec3 d);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec_broadcast(float val, vec3 d);
|
||||
|
||||
CGLM_EXPORT
|
||||
bool
|
||||
glmc_vec_eq(vec3 v, float val);
|
||||
|
||||
CGLM_EXPORT
|
||||
bool
|
||||
glmc_vec_eq_eps(vec3 v, float val);
|
||||
|
||||
CGLM_EXPORT
|
||||
bool
|
||||
glmc_vec_eq_all(vec3 v);
|
||||
|
||||
CGLM_EXPORT
|
||||
bool
|
||||
glmc_vec_eqv(vec3 v1, vec3 v2);
|
||||
|
||||
CGLM_EXPORT
|
||||
bool
|
||||
glmc_vec_eqv_eps(vec3 v1, vec3 v2);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_vec_max(vec3 v);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_vec_min(vec3 v);
|
||||
|
||||
CGLM_EXPORT
|
||||
bool
|
||||
glmc_vec_isnan(vec3 v);
|
||||
|
||||
CGLM_EXPORT
|
||||
bool
|
||||
glmc_vec_isinf(vec3 v);
|
||||
|
||||
CGLM_EXPORT
|
||||
bool
|
||||
glmc_vec_isvalid(vec3 v);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec_sign(vec3 v, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec_sqrt(vec3 v, vec3 dest);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
122
external/cglm/include/cglm/call/vec4.h
vendored
122
external/cglm/include/cglm/call/vec4.h
vendored
|
@ -17,6 +17,18 @@ extern "C" {
|
|||
#define glmc_vec4_dup3(v, dest) glmc_vec4_copy3(v, dest)
|
||||
#define glmc_vec4_dup(v, dest) glmc_vec4_copy(v, dest)
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4(vec3 v3, float last, vec4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_zero(vec4 v);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_one(vec4 v);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_copy3(vec4 a, vec3 dest);
|
||||
|
@ -47,11 +59,23 @@ glmc_vec4_normalize(vec4 v);
|
|||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_add(vec4 v1, vec4 v2, vec4 dest);
|
||||
glmc_vec4_add(vec4 a, vec4 b, vec4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_sub(vec4 v1, vec4 v2, vec4 dest);
|
||||
glmc_vec4_adds(vec4 v, float s, vec4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_sub(vec4 a, vec4 b, vec4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_subs(vec4 v, float s, vec4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_mul(vec4 a, vec4 b, vec4 d);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
|
@ -61,10 +85,38 @@ CGLM_EXPORT
|
|||
void
|
||||
glmc_vec4_scale_as(vec3 v, float s, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_div(vec4 a, vec4 b, vec4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_divs(vec4 v, float s, vec4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_addadd(vec4 a, vec4 b, vec4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_subadd(vec4 a, vec4 b, vec4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_muladd(vec4 a, vec4 b, vec4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_muladds(vec4 a, float s, vec4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_flipsign(vec4 v);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_flipsign_to(vec4 v, vec4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_inv(vec4 v);
|
||||
|
@ -85,6 +137,72 @@ CGLM_EXPORT
|
|||
void
|
||||
glmc_vec4_minv(vec4 v1, vec4 v2, 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);
|
||||
|
||||
/* ext */
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_mulv(vec4 a, vec4 b, vec4 d);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_broadcast(float val, vec4 d);
|
||||
|
||||
CGLM_EXPORT
|
||||
bool
|
||||
glmc_vec4_eq(vec4 v, float val);
|
||||
|
||||
CGLM_EXPORT
|
||||
bool
|
||||
glmc_vec4_eq_eps(vec4 v, float val);
|
||||
|
||||
CGLM_EXPORT
|
||||
bool
|
||||
glmc_vec4_eq_all(vec4 v);
|
||||
|
||||
CGLM_EXPORT
|
||||
bool
|
||||
glmc_vec4_eqv(vec4 v1, vec4 v2);
|
||||
|
||||
CGLM_EXPORT
|
||||
bool
|
||||
glmc_vec4_eqv_eps(vec4 v1, vec4 v2);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_vec4_max(vec4 v);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_vec4_min(vec4 v);
|
||||
|
||||
CGLM_EXPORT
|
||||
bool
|
||||
glmc_vec4_isnan(vec4 v);
|
||||
|
||||
CGLM_EXPORT
|
||||
bool
|
||||
glmc_vec4_isinf(vec4 v);
|
||||
|
||||
CGLM_EXPORT
|
||||
bool
|
||||
glmc_vec4_isvalid(vec4 v);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_sign(vec4 v, vec4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_sqrt(vec4 v, vec4 dest);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
116
external/cglm/include/cglm/cam.h
vendored
116
external/cglm/include/cglm/cam.h
vendored
|
@ -7,54 +7,53 @@
|
|||
|
||||
/*
|
||||
Functions:
|
||||
CGLM_INLINE void glm_frustum(float left,
|
||||
float right,
|
||||
float bottom,
|
||||
float top,
|
||||
float nearVal,
|
||||
float farVal,
|
||||
mat4 dest);
|
||||
CGLM_INLINE void glm_ortho(float left,
|
||||
float right,
|
||||
float bottom,
|
||||
float top,
|
||||
float nearVal,
|
||||
float farVal,
|
||||
mat4 dest);
|
||||
CGLM_INLINE void glm_ortho_default(float aspect, mat4 dest);
|
||||
CGLM_INLINE void glm_ortho_default_s(float aspect, float size, mat4 dest);
|
||||
CGLM_INLINE void glm_perspective(float fovy,
|
||||
float aspect,
|
||||
float nearVal,
|
||||
float farVal,
|
||||
mat4 dest);
|
||||
CGLM_INLINE void glm_perspective_default(float aspect, mat4 dest);
|
||||
CGLM_INLINE void glm_perspective_resize(float aspect, mat4 proj);
|
||||
CGLM_INLINE void glm_lookat(vec3 eye, vec3 center, vec3 up, mat4 dest);
|
||||
CGLM_INLINE void glm_persp_decomp(mat4 proj,
|
||||
float * __restrict nearVal,
|
||||
float * __restrict farVal,
|
||||
float * __restrict top,
|
||||
float * __restrict bottom,
|
||||
float * __restrict left,
|
||||
float * __restrict right);
|
||||
CGLM_INLINE void glm_persp_decompv(mat4 proj, float dest[6]);
|
||||
CGLM_INLINE void glm_persp_decomp_x(mat4 proj,
|
||||
float * __restrict left,
|
||||
float * __restrict right);
|
||||
CGLM_INLINE void glm_persp_decomp_y(mat4 proj,
|
||||
float * __restrict top,
|
||||
float * __restrict bottom);
|
||||
CGLM_INLINE void glm_persp_decomp_z(mat4 proj,
|
||||
float * __restrict nearVal,
|
||||
float * __restrict farVal);
|
||||
CGLM_INLINE void glm_persp_decomp_far(mat4 proj, float * __restrict farVal);
|
||||
CGLM_INLINE void glm_persp_decomp_near(mat4 proj, float *__restrict nearVal);
|
||||
CGLM_INLINE void glm_frustum_planes(mat4 m, vec4 dest[6]);
|
||||
CGLM_INLINE void glm_frustum_corners(mat4 invMat, vec4 dest[8]);
|
||||
CGLM_INLINE glm_ortho_box(vec3 box[2], mat4 dest);
|
||||
CGLM_INLINE void glm_ortho_boxp(vec3 box[2], float padding, mat4 dest);
|
||||
CGLM_INLINE void glm_ortho_boxp(vec3 box[2], float padding, mat4 dest);
|
||||
CGLM_INLINE void glm_frustum(float left,
|
||||
float right,
|
||||
float bottom,
|
||||
float top,
|
||||
float nearVal,
|
||||
float farVal,
|
||||
mat4 dest)
|
||||
CGLM_INLINE void glm_ortho(float left,
|
||||
float right,
|
||||
float bottom,
|
||||
float top,
|
||||
float nearVal,
|
||||
float farVal,
|
||||
mat4 dest)
|
||||
CGLM_INLINE void glm_ortho_aabb(vec3 box[2], mat4 dest)
|
||||
CGLM_INLINE void glm_ortho_aabb_p(vec3 box[2], float padding, mat4 dest)
|
||||
CGLM_INLINE void glm_ortho_aabb_pz(vec3 box[2], float padding, mat4 dest)
|
||||
CGLM_INLINE void glm_ortho_default(float aspect, mat4 dest)
|
||||
CGLM_INLINE void glm_ortho_default_s(float aspect, float size, mat4 dest)
|
||||
CGLM_INLINE void glm_perspective(float fovy,
|
||||
float aspect,
|
||||
float nearVal,
|
||||
float farVal,
|
||||
mat4 dest)
|
||||
CGLM_INLINE void glm_perspective_default(float aspect, mat4 dest)
|
||||
CGLM_INLINE void glm_perspective_resize(float aspect, mat4 proj)
|
||||
CGLM_INLINE void glm_lookat(vec3 eye, vec3 center, vec3 up, mat4 dest)
|
||||
CGLM_INLINE void glm_look(vec3 eye, vec3 dir, vec3 up, mat4 dest)
|
||||
CGLM_INLINE void glm_look_anyup(vec3 eye, vec3 dir, mat4 dest)
|
||||
CGLM_INLINE void glm_persp_decomp(mat4 proj,
|
||||
float *nearVal,
|
||||
float *farVal,
|
||||
float *top,
|
||||
float *bottom,
|
||||
float *left,
|
||||
float *right)
|
||||
CGLM_INLINE void glm_persp_decompv(mat4 proj, float dest[6])
|
||||
CGLM_INLINE void glm_persp_decomp_x(mat4 proj, float *left, float *right)
|
||||
CGLM_INLINE void glm_persp_decomp_y(mat4 proj, float *top, float *bottom)
|
||||
CGLM_INLINE void glm_persp_decomp_z(mat4 proj,
|
||||
float *nearVal,
|
||||
float *farVal)
|
||||
CGLM_INLINE void glm_persp_decomp_far(mat4 proj, float *farVal)
|
||||
CGLM_INLINE void glm_persp_decomp_near(mat4 proj, float *nearVal)
|
||||
CGLM_INLINE float glm_persp_fovy(mat4 proj)
|
||||
CGLM_INLINE float glm_persp_aspect(mat4 proj)
|
||||
CGLM_INLINE void glm_persp_sizes(mat4 proj, float fovy, vec4 dest)
|
||||
*/
|
||||
|
||||
#ifndef cglm_vcam_h
|
||||
|
@ -303,7 +302,7 @@ glm_perspective_default(float aspect,
|
|||
|
||||
/*!
|
||||
* @brief resize perspective matrix by aspect ratio ( width / height )
|
||||
* this very make easy to resize proj matrix when window, viewport
|
||||
* this makes very easy to resize proj matrix when window /viewport
|
||||
* reized
|
||||
*
|
||||
* @param[in] aspect aspect ratio ( width / height )
|
||||
|
@ -322,6 +321,9 @@ glm_perspective_resize(float aspect,
|
|||
/*!
|
||||
* @brief set up view matrix
|
||||
*
|
||||
* NOTE: The UP vector must not be parallel to the line of sight from
|
||||
* the eye point to the reference point
|
||||
*
|
||||
* @param[in] eye eye vector
|
||||
* @param[in] center center vector
|
||||
* @param[in] up up vector
|
||||
|
@ -333,7 +335,7 @@ glm_lookat(vec3 eye,
|
|||
vec3 center,
|
||||
vec3 up,
|
||||
mat4 dest) {
|
||||
vec3 f, u, s;
|
||||
CGLM_ALIGN(8) vec3 f, u, s;
|
||||
|
||||
glm_vec_sub(center, eye, f);
|
||||
glm_vec_normalize(f);
|
||||
|
@ -365,6 +367,9 @@ glm_lookat(vec3 eye,
|
|||
* convenient wrapper for lookat: if you only have direction not target self
|
||||
* then this might be useful. Because you need to get target from direction.
|
||||
*
|
||||
* NOTE: The UP vector must not be parallel to the line of sight from
|
||||
* the eye point to the reference point
|
||||
*
|
||||
* @param[in] eye eye vector
|
||||
* @param[in] dir direction vector
|
||||
* @param[in] up up vector
|
||||
|
@ -373,7 +378,7 @@ glm_lookat(vec3 eye,
|
|||
CGLM_INLINE
|
||||
void
|
||||
glm_look(vec3 eye, vec3 dir, vec3 up, mat4 dest) {
|
||||
vec3 target;
|
||||
CGLM_ALIGN(8) vec3 target;
|
||||
glm_vec_add(eye, dir, target);
|
||||
glm_lookat(eye, target, up, dest);
|
||||
}
|
||||
|
@ -391,7 +396,7 @@ glm_look(vec3 eye, vec3 dir, vec3 up, mat4 dest) {
|
|||
CGLM_INLINE
|
||||
void
|
||||
glm_look_anyup(vec3 eye, vec3 dir, mat4 dest) {
|
||||
vec3 up;
|
||||
CGLM_ALIGN(8) vec3 up;
|
||||
glm_vec_ortho(dir, up);
|
||||
glm_look(eye, dir, up, dest);
|
||||
}
|
||||
|
@ -458,7 +463,7 @@ glm_persp_decompv(mat4 proj, float dest[6]) {
|
|||
* @brief decomposes left and right values of perspective projection.
|
||||
* x stands for x axis (left / right axis)
|
||||
*
|
||||
* @param[in] proj perspective projection matrix
|
||||
* @param[in] proj perspective projection matrix
|
||||
* @param[out] left left
|
||||
* @param[out] right right
|
||||
*/
|
||||
|
@ -572,10 +577,7 @@ glm_persp_aspect(mat4 proj) {
|
|||
}
|
||||
|
||||
/*!
|
||||
* @brief returns aspect ratio of perspective projection
|
||||
*
|
||||
* if you don't have fovy then use glm_persp_fovy(proj) to get it
|
||||
* or pass directly: glm_persp_sizes(proj, glm_persp_fovy(proj), sizes);
|
||||
* @brief returns sizes of near and far planes of perspective projection
|
||||
*
|
||||
* @param[in] proj perspective projection matrix
|
||||
* @param[in] fovy fovy (see brief)
|
||||
|
|
4
external/cglm/include/cglm/cglm.h
vendored
4
external/cglm/include/cglm/cglm.h
vendored
|
@ -20,7 +20,11 @@
|
|||
#include "euler.h"
|
||||
#include "plane.h"
|
||||
#include "box.h"
|
||||
#include "color.h"
|
||||
#include "util.h"
|
||||
#include "io.h"
|
||||
#include "project.h"
|
||||
#include "sphere.h"
|
||||
#include "ease.h"
|
||||
|
||||
#endif /* cglm_h */
|
||||
|
|
26
external/cglm/include/cglm/color.h
vendored
Normal file
26
external/cglm/include/cglm/color.h
vendored
Normal file
|
@ -0,0 +1,26 @@
|
|||
/*
|
||||
* Copyright (c), Recep Aslantas.
|
||||
*
|
||||
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||
* Full license can be found in the LICENSE file
|
||||
*/
|
||||
|
||||
#ifndef cglm_color_h
|
||||
#define cglm_color_h
|
||||
|
||||
#include "common.h"
|
||||
#include "vec3.h"
|
||||
|
||||
/*!
|
||||
* @brief averages the color channels into one value
|
||||
*
|
||||
* @param[in] rgb RGB color
|
||||
*/
|
||||
CGLM_INLINE
|
||||
float
|
||||
glm_luminance(vec3 rgb) {
|
||||
vec3 l = {0.212671f, 0.715160f, 0.072169f};
|
||||
return glm_dot(rgb, l);
|
||||
}
|
||||
|
||||
#endif /* cglm_color_h */
|
2
external/cglm/include/cglm/common.h
vendored
2
external/cglm/include/cglm/common.h
vendored
|
@ -14,7 +14,7 @@
|
|||
#include <math.h>
|
||||
#include <float.h>
|
||||
|
||||
#if defined(_WIN32) && defined(_MSC_VER)
|
||||
#if defined(_MSC_VER)
|
||||
# ifdef CGLM_DLL
|
||||
# define CGLM_EXPORT __declspec(dllexport)
|
||||
# else
|
||||
|
|
317
external/cglm/include/cglm/ease.h
vendored
Normal file
317
external/cglm/include/cglm/ease.h
vendored
Normal file
|
@ -0,0 +1,317 @@
|
|||
/*
|
||||
* Copyright (c), Recep Aslantas.
|
||||
*
|
||||
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||
* Full license can be found in the LICENSE file
|
||||
*/
|
||||
|
||||
#ifndef cglm_ease_h
|
||||
#define cglm_ease_h
|
||||
|
||||
#include "common.h"
|
||||
|
||||
CGLM_INLINE
|
||||
float
|
||||
glm_ease_linear(float t) {
|
||||
return t;
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
float
|
||||
glm_ease_sine_in(float t) {
|
||||
return sinf((t - 1.0f) * CGLM_PI_2) + 1.0f;
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
float
|
||||
glm_ease_sine_out(float t) {
|
||||
return sinf(t * CGLM_PI_2);
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
float
|
||||
glm_ease_sine_inout(float t) {
|
||||
return 0.5f * (1.0f - cosf(t * CGLM_PI));
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
float
|
||||
glm_ease_quad_in(float t) {
|
||||
return t * t;
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
float
|
||||
glm_ease_quad_out(float t) {
|
||||
return -(t * (t - 2.0f));
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
float
|
||||
glm_ease_quad_inout(float t) {
|
||||
float tt;
|
||||
|
||||
tt = t * t;
|
||||
if (t < 0.5f)
|
||||
return 2.0f * tt;
|
||||
|
||||
return (-2.0f * tt) + (4.0f * t) - 1.0f;
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
float
|
||||
glm_ease_cubic_in(float t) {
|
||||
return t * t * t;
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
float
|
||||
glm_ease_cubic_out(float t) {
|
||||
float f;
|
||||
f = t - 1.0f;
|
||||
return f * f * f + 1.0f;
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
float
|
||||
glm_ease_cubic_inout(float t) {
|
||||
float f;
|
||||
|
||||
if (t < 0.5f)
|
||||
return 4.0f * t * t * t;
|
||||
|
||||
f = 2.0f * t - 2.0f;
|
||||
|
||||
return 0.5f * f * f * f + 1.0f;
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
float
|
||||
glm_ease_quart_in(float t) {
|
||||
float f;
|
||||
f = t * t;
|
||||
return f * f;
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
float
|
||||
glm_ease_quart_out(float t) {
|
||||
float f;
|
||||
|
||||
f = t - 1.0f;
|
||||
|
||||
return f * f * f * (1.0f - t) + 1.0f;
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
float
|
||||
glm_ease_quart_inout(float t) {
|
||||
float f, g;
|
||||
|
||||
if (t < 0.5f) {
|
||||
f = t * t;
|
||||
return 8.0f * f * f;
|
||||
}
|
||||
|
||||
f = t - 1.0f;
|
||||
g = f * f;
|
||||
|
||||
return -8.0f * g * g + 1.0f;
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
float
|
||||
glm_ease_quint_in(float t) {
|
||||
float f;
|
||||
f = t * t;
|
||||
return f * f * t;
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
float
|
||||
glm_ease_quint_out(float t) {
|
||||
float f, g;
|
||||
|
||||
f = t - 1.0f;
|
||||
g = f * f;
|
||||
|
||||
return g * g * f + 1.0f;
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
float
|
||||
glm_ease_quint_inout(float t) {
|
||||
float f, g;
|
||||
|
||||
if (t < 0.5f) {
|
||||
f = t * t;
|
||||
return 16.0f * f * f * t;
|
||||
}
|
||||
|
||||
f = 2.0f * t - 2.0f;
|
||||
g = f * f;
|
||||
|
||||
return 0.5f * g * g * f + 1.0f;
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
float
|
||||
glm_ease_exp_in(float t) {
|
||||
if (t == 0.0f)
|
||||
return t;
|
||||
|
||||
return powf(2.0f, 10.0f * (t - 1.0f));
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
float
|
||||
glm_ease_exp_out(float t) {
|
||||
if (t == 1.0f)
|
||||
return t;
|
||||
|
||||
return 1.0f - powf(2.0f, -10.0f * t);
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
float
|
||||
glm_ease_exp_inout(float t) {
|
||||
if (t == 0.0f || t == 1.0f)
|
||||
return t;
|
||||
|
||||
if (t < 0.5f)
|
||||
return 0.5f * powf(2.0f, (20.0f * t) - 10.0f);
|
||||
|
||||
return -0.5f * powf(2.0f, (-20.0f * t) + 10.0f) + 1.0f;
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
float
|
||||
glm_ease_circ_in(float t) {
|
||||
return 1.0f - sqrtf(1.0f - (t * t));
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
float
|
||||
glm_ease_circ_out(float t) {
|
||||
return sqrtf((2.0f - t) * t);
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
float
|
||||
glm_ease_circ_inout(float t) {
|
||||
if (t < 0.5f)
|
||||
return 0.5f * (1.0f - sqrtf(1.0f - 4.0f * (t * t)));
|
||||
|
||||
return 0.5f * (sqrtf(-((2.0f * t) - 3.0f) * ((2.0f * t) - 1.0f)) + 1.0f);
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
float
|
||||
glm_ease_back_in(float t) {
|
||||
float o, z;
|
||||
|
||||
o = 1.70158f;
|
||||
z = ((o + 1.0f) * t) - o;
|
||||
|
||||
return t * t * z;
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
float
|
||||
glm_ease_back_out(float t) {
|
||||
float o, z, n;
|
||||
|
||||
o = 1.70158f;
|
||||
n = t - 1.0f;
|
||||
z = (o + 1.0f) * n + o;
|
||||
|
||||
return n * n * z + 1.0f;
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
float
|
||||
glm_ease_back_inout(float t) {
|
||||
float o, z, n, m, s, x;
|
||||
|
||||
o = 1.70158f;
|
||||
s = o * 1.525f;
|
||||
x = 0.5;
|
||||
n = t / 0.5f;
|
||||
|
||||
if (n < 1.0f) {
|
||||
z = (s + 1) * n - s;
|
||||
m = n * n * z;
|
||||
return x * m;
|
||||
}
|
||||
|
||||
n -= 2.0f;
|
||||
z = (s + 1.0f) * n + s;
|
||||
m = (n * n * z) + 2;
|
||||
|
||||
return x * m;
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
float
|
||||
glm_ease_elast_in(float t) {
|
||||
return sinf(13.0f * CGLM_PI_2 * t) * powf(2.0f, 10.0f * (t - 1.0f));
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
float
|
||||
glm_ease_elast_out(float t) {
|
||||
return sinf(-13.0f * CGLM_PI_2 * (t + 1.0f)) * powf(2.0f, -10.0f * t) + 1.0f;
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
float
|
||||
glm_ease_elast_inout(float t) {
|
||||
float a;
|
||||
|
||||
a = 2.0f * t;
|
||||
|
||||
if (t < 0.5f)
|
||||
return 0.5f * sinf(13.0f * CGLM_PI_2 * a)
|
||||
* powf(2.0f, 10.0f * (a - 1.0f));
|
||||
|
||||
return 0.5f * (sinf(-13.0f * CGLM_PI_2 * a)
|
||||
* powf(2.0f, -10.0f * (a - 1.0f)) + 2.0f);
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
float
|
||||
glm_ease_bounce_out(float t) {
|
||||
float tt;
|
||||
|
||||
tt = t * t;
|
||||
|
||||
if (t < (4.0f / 11.0f))
|
||||
return (121.0f * tt) / 16.0f;
|
||||
|
||||
if (t < 8.0f / 11.0f)
|
||||
return ((363.0f / 40.0f) * tt) - ((99.0f / 10.0f) * t) + (17.0f / 5.0f);
|
||||
|
||||
if (t < (9.0f / 10.0f))
|
||||
return (4356.0f / 361.0f) * tt
|
||||
- (35442.0f / 1805.0f) * t
|
||||
+ (16061.0f / 1805.0f);
|
||||
|
||||
return ((54.0f / 5.0f) * tt) - ((513.0f / 25.0f) * t) + (268.0f / 25.0f);
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
float
|
||||
glm_ease_bounce_in(float t) {
|
||||
return 1.0f - glm_ease_bounce_out(1.0f - t);
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
float
|
||||
glm_ease_bounce_inout(float t) {
|
||||
if (t < 0.5f)
|
||||
return 0.5f * (1.0f - glm_ease_bounce_out(t * 2.0f));
|
||||
|
||||
return 0.5f * glm_ease_bounce_out(t * 2.0f - 1.0f) + 0.5f;
|
||||
}
|
||||
|
||||
#endif /* cglm_ease_h */
|
531
external/cglm/include/cglm/euler.h
vendored
531
external/cglm/include/cglm/euler.h
vendored
|
@ -5,6 +5,14 @@
|
|||
* Full license can be found in the LICENSE file
|
||||
*/
|
||||
|
||||
/*
|
||||
NOTE:
|
||||
angles must be passed as [X-Angle, Y-Angle, Z-angle] order
|
||||
For instance you don't pass angles as [Z-Angle, X-Angle, Y-angle] to
|
||||
glm_euler_zxy funciton, All RELATED functions accept angles same order
|
||||
which is [X, Y, Z].
|
||||
*/
|
||||
|
||||
/*
|
||||
Types:
|
||||
enum glm_euler_sq
|
||||
|
@ -13,13 +21,14 @@
|
|||
CGLM_INLINE glm_euler_sq glm_euler_order(int newOrder[3]);
|
||||
CGLM_INLINE void glm_euler_angles(mat4 m, vec3 dest);
|
||||
CGLM_INLINE void glm_euler(vec3 angles, mat4 dest);
|
||||
CGLM_INLINE void glm_euler_xyz(vec3 angles, mat4 dest);
|
||||
CGLM_INLINE void glm_euler_zyx(vec3 angles, mat4 dest);
|
||||
CGLM_INLINE void glm_euler_zxy(vec3 angles, mat4 dest);
|
||||
CGLM_INLINE void glm_euler_xzy(vec3 angles, mat4 dest);
|
||||
CGLM_INLINE void glm_euler_yzx(vec3 angles, mat4 dest);
|
||||
CGLM_INLINE void glm_euler_yxz(vec3 angles, mat4 dest);
|
||||
CGLM_INLINE void glm_euler_by_order(vec3 angles,
|
||||
glm_euler_sq axis,
|
||||
glm_euler_sq ord,
|
||||
mat4 dest);
|
||||
*/
|
||||
|
||||
|
@ -30,12 +39,12 @@
|
|||
|
||||
CGLM_INLINE
|
||||
glm_euler_sq
|
||||
glm_euler_order(int newOrder[3]) {
|
||||
return (glm_euler_sq)(newOrder[0] | newOrder[1] << 2 | newOrder[2] << 4);
|
||||
glm_euler_order(int ord[3]) {
|
||||
return (glm_euler_sq)(ord[0] << 0 | ord[1] << 2 | ord[2] << 4);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief euler angles (in radian) using xyz sequence
|
||||
* @brief extract euler angles (in radians) using xyz order
|
||||
*
|
||||
* @param[in] m affine transform
|
||||
* @param[out] dest angles vector [x, y, z]
|
||||
|
@ -43,225 +52,289 @@ glm_euler_order(int newOrder[3]) {
|
|||
CGLM_INLINE
|
||||
void
|
||||
glm_euler_angles(mat4 m, vec3 dest) {
|
||||
if (m[0][2] < 1.0f) {
|
||||
if (m[0][2] > -1.0f) {
|
||||
vec3 a[2];
|
||||
float cy1, cy2;
|
||||
int path;
|
||||
float m00, m01, m10, m11, m20, m21, m22;
|
||||
float thetaX, thetaY, thetaZ;
|
||||
|
||||
a[0][1] = asinf(-m[0][2]);
|
||||
a[1][1] = CGLM_PI - a[0][1];
|
||||
m00 = m[0][0]; m10 = m[1][0]; m20 = m[2][0];
|
||||
m01 = m[0][1]; m11 = m[1][1]; m21 = m[2][1];
|
||||
m22 = m[2][2];
|
||||
|
||||
cy1 = cosf(a[0][1]);
|
||||
cy2 = cosf(a[1][1]);
|
||||
|
||||
a[0][0] = atan2f(m[1][2] / cy1, m[2][2] / cy1);
|
||||
a[1][0] = atan2f(m[1][2] / cy2, m[2][2] / cy2);
|
||||
|
||||
a[0][2] = atan2f(m[0][1] / cy1, m[0][0] / cy1);
|
||||
a[1][2] = atan2f(m[0][1] / cy2, m[0][0] / cy2);
|
||||
|
||||
path = (fabsf(a[0][0]) + fabsf(a[0][1]) + fabsf(a[0][2])) >=
|
||||
(fabsf(a[1][0]) + fabsf(a[1][1]) + fabsf(a[1][2]));
|
||||
|
||||
glm_vec_copy(a[path], dest);
|
||||
} else {
|
||||
dest[0] = atan2f(m[1][0], m[2][0]);
|
||||
dest[1] = CGLM_PI_2;
|
||||
dest[2] = 0.0f;
|
||||
if (m20 < 1.0f) {
|
||||
if (m20 > -1.0f) {
|
||||
thetaY = asinf(m20);
|
||||
thetaX = atan2f(-m21, m22);
|
||||
thetaZ = atan2f(-m10, m00);
|
||||
} else { /* m20 == -1 */
|
||||
/* Not a unique solution */
|
||||
thetaY = -CGLM_PI_2;
|
||||
thetaX = -atan2f(m01, m11);
|
||||
thetaZ = 0.0f;
|
||||
}
|
||||
} else {
|
||||
dest[0] = atan2f(-m[1][0], -m[2][0]);
|
||||
dest[1] =-CGLM_PI_2;
|
||||
dest[2] = 0.0f;
|
||||
} else { /* m20 == +1 */
|
||||
thetaY = CGLM_PI_2;
|
||||
thetaX = atan2f(m01, m11);
|
||||
thetaZ = 0.0f;
|
||||
}
|
||||
|
||||
dest[0] = thetaX;
|
||||
dest[1] = thetaY;
|
||||
dest[2] = thetaZ;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief build rotation matrix from euler angles(ExEyEz/RzRyRx)
|
||||
* @brief build rotation matrix from euler angles
|
||||
*
|
||||
* @param[in] angles angles as vector [Ex, Ey, Ez]
|
||||
* @param[in] angles angles as vector [Xangle, Yangle, Zangle]
|
||||
* @param[out] dest rotation matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_euler_xyz(vec3 angles, mat4 dest) {
|
||||
float cx, cy, cz,
|
||||
sx, sy, sz, czsx, cxcz, sysz;
|
||||
|
||||
sx = sinf(angles[0]); cx = cosf(angles[0]);
|
||||
sy = sinf(angles[1]); cy = cosf(angles[1]);
|
||||
sz = sinf(angles[2]); cz = cosf(angles[2]);
|
||||
|
||||
czsx = cz * sx;
|
||||
cxcz = cx * cz;
|
||||
sysz = sy * sz;
|
||||
|
||||
dest[0][0] = cy * cz;
|
||||
dest[0][1] = czsx * sy + cx * sz;
|
||||
dest[0][2] = -cxcz * sy + sx * sz;
|
||||
dest[1][0] = -cy * sz;
|
||||
dest[1][1] = cxcz - sx * sysz;
|
||||
dest[1][2] = czsx + cx * sysz;
|
||||
dest[2][0] = sy;
|
||||
dest[2][1] = -cy * sx;
|
||||
dest[2][2] = cx * cy;
|
||||
dest[0][3] = 0.0f;
|
||||
dest[1][3] = 0.0f;
|
||||
dest[2][3] = 0.0f;
|
||||
dest[3][0] = 0.0f;
|
||||
dest[3][1] = 0.0f;
|
||||
dest[3][2] = 0.0f;
|
||||
dest[3][3] = 1.0f;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief build rotation matrix from euler angles
|
||||
*
|
||||
* @param[in] angles angles as vector [Xangle, Yangle, Zangle]
|
||||
* @param[out] dest rotation matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_euler(vec3 angles, mat4 dest) {
|
||||
float cx, cy, cz,
|
||||
sx, sy, sz;
|
||||
|
||||
sx = sinf(angles[0]); cx = cosf(angles[0]);
|
||||
sy = sinf(angles[1]); cy = cosf(angles[1]);
|
||||
sz = sinf(angles[2]); cz = cosf(angles[2]);
|
||||
|
||||
dest[0][0] = cy * cz;
|
||||
dest[0][1] = cy * sz;
|
||||
dest[0][2] =-sy;
|
||||
dest[1][0] = cz * sx * sy - cx * sz;
|
||||
dest[1][1] = cx * cz + sx * sy * sz;
|
||||
dest[1][2] = cy * sx;
|
||||
dest[2][0] = cx * cz * sy + sx * sz;
|
||||
dest[2][1] =-cz * sx + cx * sy * sz;
|
||||
dest[2][2] = cx * cy;
|
||||
dest[0][3] = 0.0f;
|
||||
dest[1][3] = 0.0f;
|
||||
dest[2][3] = 0.0f;
|
||||
dest[3][0] = 0.0f;
|
||||
dest[3][1] = 0.0f;
|
||||
dest[3][2] = 0.0f;
|
||||
dest[3][3] = 1.0f;
|
||||
glm_euler_xyz(angles, dest);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief build rotation matrix from euler angles (EzEyEx/RxRyRz)
|
||||
* @brief build rotation matrix from euler angles
|
||||
*
|
||||
* @param[in] angles angles as vector [Xangle, Yangle, Zangle]
|
||||
* @param[out] dest rotation matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_euler_zyx(vec3 angles,
|
||||
mat4 dest) {
|
||||
glm_euler_xzy(vec3 angles, mat4 dest) {
|
||||
float cx, cy, cz,
|
||||
sx, sy, sz;
|
||||
sx, sy, sz, sxsy, cysx, cxsy, cxcy;
|
||||
|
||||
sx = sinf(angles[0]); cx = cosf(angles[0]);
|
||||
sy = sinf(angles[1]); cy = cosf(angles[1]);
|
||||
sz = sinf(angles[2]); cz = cosf(angles[2]);
|
||||
sx = sinf(angles[0]); cx = cosf(angles[0]);
|
||||
sy = sinf(angles[1]); cy = cosf(angles[1]);
|
||||
sz = sinf(angles[2]); cz = cosf(angles[2]);
|
||||
|
||||
dest[0][0] = cy * cz;
|
||||
dest[0][1] = cz * sx * sy + cx * sz;
|
||||
dest[0][2] =-cx * cz * sy + sx * sz;
|
||||
dest[1][0] =-cy * sz;
|
||||
dest[1][1] = cx * cz - sx * sy * sz;
|
||||
dest[1][2] = cz * sx + cx * sy * sz;
|
||||
dest[2][0] = sy;
|
||||
dest[2][1] =-cy * sx;
|
||||
dest[2][2] = cx * cy;
|
||||
dest[0][3] = 0.0f;
|
||||
dest[1][3] = 0.0f;
|
||||
dest[2][3] = 0.0f;
|
||||
dest[3][0] = 0.0f;
|
||||
dest[3][1] = 0.0f;
|
||||
dest[3][2] = 0.0f;
|
||||
dest[3][3] = 1.0f;
|
||||
sxsy = sx * sy;
|
||||
cysx = cy * sx;
|
||||
cxsy = cx * sy;
|
||||
cxcy = cx * cy;
|
||||
|
||||
dest[0][0] = cy * cz;
|
||||
dest[0][1] = sxsy + cxcy * sz;
|
||||
dest[0][2] = -cxsy + cysx * sz;
|
||||
dest[1][0] = -sz;
|
||||
dest[1][1] = cx * cz;
|
||||
dest[1][2] = cz * sx;
|
||||
dest[2][0] = cz * sy;
|
||||
dest[2][1] = -cysx + cxsy * sz;
|
||||
dest[2][2] = cxcy + sxsy * sz;
|
||||
dest[0][3] = 0.0f;
|
||||
dest[1][3] = 0.0f;
|
||||
dest[2][3] = 0.0f;
|
||||
dest[3][0] = 0.0f;
|
||||
dest[3][1] = 0.0f;
|
||||
dest[3][2] = 0.0f;
|
||||
dest[3][3] = 1.0f;
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* @brief build rotation matrix from euler angles
|
||||
*
|
||||
* @param[in] angles angles as vector [Xangle, Yangle, Zangle]
|
||||
* @param[out] dest rotation matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_euler_zxy(vec3 angles,
|
||||
mat4 dest) {
|
||||
glm_euler_yxz(vec3 angles, mat4 dest) {
|
||||
float cx, cy, cz,
|
||||
sx, sy, sz;
|
||||
sx, sy, sz, cycz, sysz, czsy, cysz;
|
||||
|
||||
sx = sinf(angles[0]); cx = cosf(angles[0]);
|
||||
sy = sinf(angles[1]); cy = cosf(angles[1]);
|
||||
sz = sinf(angles[2]); cz = cosf(angles[2]);
|
||||
sx = sinf(angles[0]); cx = cosf(angles[0]);
|
||||
sy = sinf(angles[1]); cy = cosf(angles[1]);
|
||||
sz = sinf(angles[2]); cz = cosf(angles[2]);
|
||||
|
||||
dest[0][0] = cy * cz + sx * sy * sz;
|
||||
dest[0][1] = cx * sz;
|
||||
dest[0][2] =-cz * sy + cy * sx * sz;
|
||||
dest[1][0] = cz * sx * sy - cy * sz;
|
||||
dest[1][1] = cx * cz;
|
||||
dest[1][2] = cy * cz * sx + sy * sz;
|
||||
dest[2][0] = cx * sy;
|
||||
dest[2][1] =-sx;
|
||||
dest[2][2] = cx * cy;
|
||||
dest[0][3] = 0.0f;
|
||||
dest[1][3] = 0.0f;
|
||||
dest[2][3] = 0.0f;
|
||||
dest[3][0] = 0.0f;
|
||||
dest[3][1] = 0.0f;
|
||||
dest[3][2] = 0.0f;
|
||||
dest[3][3] = 1.0f;
|
||||
cycz = cy * cz;
|
||||
sysz = sy * sz;
|
||||
czsy = cz * sy;
|
||||
cysz = cy * sz;
|
||||
|
||||
dest[0][0] = cycz + sx * sysz;
|
||||
dest[0][1] = cx * sz;
|
||||
dest[0][2] = -czsy + cysz * sx;
|
||||
dest[1][0] = -cysz + czsy * sx;
|
||||
dest[1][1] = cx * cz;
|
||||
dest[1][2] = cycz * sx + sysz;
|
||||
dest[2][0] = cx * sy;
|
||||
dest[2][1] = -sx;
|
||||
dest[2][2] = cx * cy;
|
||||
dest[0][3] = 0.0f;
|
||||
dest[1][3] = 0.0f;
|
||||
dest[2][3] = 0.0f;
|
||||
dest[3][0] = 0.0f;
|
||||
dest[3][1] = 0.0f;
|
||||
dest[3][2] = 0.0f;
|
||||
dest[3][3] = 1.0f;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief build rotation matrix from euler angles
|
||||
*
|
||||
* @param[in] angles angles as vector [Xangle, Yangle, Zangle]
|
||||
* @param[out] dest rotation matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_euler_xzy(vec3 angles,
|
||||
mat4 dest) {
|
||||
glm_euler_yzx(vec3 angles, mat4 dest) {
|
||||
float cx, cy, cz,
|
||||
sx, sy, sz;
|
||||
sx, sy, sz, sxsy, cxcy, cysx, cxsy;
|
||||
|
||||
sx = sinf(angles[0]); cx = cosf(angles[0]);
|
||||
sy = sinf(angles[1]); cy = cosf(angles[1]);
|
||||
sz = sinf(angles[2]); cz = cosf(angles[2]);
|
||||
sx = sinf(angles[0]); cx = cosf(angles[0]);
|
||||
sy = sinf(angles[1]); cy = cosf(angles[1]);
|
||||
sz = sinf(angles[2]); cz = cosf(angles[2]);
|
||||
|
||||
dest[0][0] = cy * cz;
|
||||
dest[0][1] = sz;
|
||||
dest[0][2] =-cz * sy;
|
||||
dest[1][0] = sx * sy - cx * cy * sz;
|
||||
dest[1][1] = cx * cz;
|
||||
dest[1][2] = cy * sx + cx * sy * sz;
|
||||
dest[2][0] = cx * sy + cy * sx * sz;
|
||||
dest[2][1] =-cz * sx;
|
||||
dest[2][2] = cx * cy - sx * sy * sz;
|
||||
dest[0][3] = 0.0f;
|
||||
dest[1][3] = 0.0f;
|
||||
dest[2][3] = 0.0f;
|
||||
dest[3][0] = 0.0f;
|
||||
dest[3][1] = 0.0f;
|
||||
dest[3][2] = 0.0f;
|
||||
dest[3][3] = 1.0f;
|
||||
sxsy = sx * sy;
|
||||
cxcy = cx * cy;
|
||||
cysx = cy * sx;
|
||||
cxsy = cx * sy;
|
||||
|
||||
dest[0][0] = cy * cz;
|
||||
dest[0][1] = sz;
|
||||
dest[0][2] = -cz * sy;
|
||||
dest[1][0] = sxsy - cxcy * sz;
|
||||
dest[1][1] = cx * cz;
|
||||
dest[1][2] = cysx + cxsy * sz;
|
||||
dest[2][0] = cxsy + cysx * sz;
|
||||
dest[2][1] = -cz * sx;
|
||||
dest[2][2] = cxcy - sxsy * sz;
|
||||
dest[0][3] = 0.0f;
|
||||
dest[1][3] = 0.0f;
|
||||
dest[2][3] = 0.0f;
|
||||
dest[3][0] = 0.0f;
|
||||
dest[3][1] = 0.0f;
|
||||
dest[3][2] = 0.0f;
|
||||
dest[3][3] = 1.0f;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief build rotation matrix from euler angles
|
||||
*
|
||||
* @param[in] angles angles as vector [Xangle, Yangle, Zangle]
|
||||
* @param[out] dest rotation matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_euler_yzx(vec3 angles,
|
||||
mat4 dest) {
|
||||
glm_euler_zxy(vec3 angles, mat4 dest) {
|
||||
float cx, cy, cz,
|
||||
sx, sy, sz;
|
||||
sx, sy, sz, cycz, sxsy, cysz;
|
||||
|
||||
sx = sinf(angles[0]); cx = cosf(angles[0]);
|
||||
sy = sinf(angles[1]); cy = cosf(angles[1]);
|
||||
sz = sinf(angles[2]); cz = cosf(angles[2]);
|
||||
sx = sinf(angles[0]); cx = cosf(angles[0]);
|
||||
sy = sinf(angles[1]); cy = cosf(angles[1]);
|
||||
sz = sinf(angles[2]); cz = cosf(angles[2]);
|
||||
|
||||
dest[0][0] = cy * cz;
|
||||
dest[0][1] = sx * sy + cx * cy * sz;
|
||||
dest[0][2] =-cx * sy + cy * sx * sz;
|
||||
dest[1][0] =-sz;
|
||||
dest[1][1] = cx * cz;
|
||||
dest[1][2] = cz * sx;
|
||||
dest[2][0] = cz * sy;
|
||||
dest[2][1] =-cy * sx + cx * sy * sz;
|
||||
dest[2][2] = cx * cy + sx * sy * sz;
|
||||
dest[0][3] = 0.0f;
|
||||
dest[1][3] = 0.0f;
|
||||
dest[2][3] = 0.0f;
|
||||
dest[3][0] = 0.0f;
|
||||
dest[3][1] = 0.0f;
|
||||
dest[3][2] = 0.0f;
|
||||
dest[3][3] = 1.0f;
|
||||
cycz = cy * cz;
|
||||
sxsy = sx * sy;
|
||||
cysz = cy * sz;
|
||||
|
||||
dest[0][0] = cycz - sxsy * sz;
|
||||
dest[0][1] = cz * sxsy + cysz;
|
||||
dest[0][2] = -cx * sy;
|
||||
dest[1][0] = -cx * sz;
|
||||
dest[1][1] = cx * cz;
|
||||
dest[1][2] = sx;
|
||||
dest[2][0] = cz * sy + cysz * sx;
|
||||
dest[2][1] = -cycz * sx + sy * sz;
|
||||
dest[2][2] = cx * cy;
|
||||
dest[0][3] = 0.0f;
|
||||
dest[1][3] = 0.0f;
|
||||
dest[2][3] = 0.0f;
|
||||
dest[3][0] = 0.0f;
|
||||
dest[3][1] = 0.0f;
|
||||
dest[3][2] = 0.0f;
|
||||
dest[3][3] = 1.0f;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief build rotation matrix from euler angles
|
||||
*
|
||||
* @param[in] angles angles as vector [Xangle, Yangle, Zangle]
|
||||
* @param[out] dest rotation matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_euler_yxz(vec3 angles,
|
||||
mat4 dest) {
|
||||
glm_euler_zyx(vec3 angles, mat4 dest) {
|
||||
float cx, cy, cz,
|
||||
sx, sy, sz;
|
||||
sx, sy, sz, czsx, cxcz, sysz;
|
||||
|
||||
sx = sinf(angles[0]); cx = cosf(angles[0]);
|
||||
sy = sinf(angles[1]); cy = cosf(angles[1]);
|
||||
sz = sinf(angles[2]); cz = cosf(angles[2]);
|
||||
sx = sinf(angles[0]); cx = cosf(angles[0]);
|
||||
sy = sinf(angles[1]); cy = cosf(angles[1]);
|
||||
sz = sinf(angles[2]); cz = cosf(angles[2]);
|
||||
|
||||
dest[0][0] = cy * cz - sx * sy * sz;
|
||||
dest[0][1] = cz * sx * sy + cy * sz;
|
||||
dest[0][2] =-cx * sy;
|
||||
dest[1][0] =-cx * sz;
|
||||
dest[1][1] = cx * cz;
|
||||
dest[1][2] = sx;
|
||||
dest[2][0] = cz * sy + cy * sx * sz;
|
||||
dest[2][1] =-cy * cz * sx + sy * sz;
|
||||
dest[2][2] = cx * cy;
|
||||
dest[0][3] = 0.0f;
|
||||
dest[1][3] = 0.0f;
|
||||
dest[2][3] = 0.0f;
|
||||
dest[3][0] = 0.0f;
|
||||
dest[3][1] = 0.0f;
|
||||
dest[3][2] = 0.0f;
|
||||
dest[3][3] = 1.0f;
|
||||
czsx = cz * sx;
|
||||
cxcz = cx * cz;
|
||||
sysz = sy * sz;
|
||||
|
||||
dest[0][0] = cy * cz;
|
||||
dest[0][1] = cy * sz;
|
||||
dest[0][2] = -sy;
|
||||
dest[1][0] = czsx * sy - cx * sz;
|
||||
dest[1][1] = cxcz + sx * sysz;
|
||||
dest[1][2] = cy * sx;
|
||||
dest[2][0] = cxcz * sy + sx * sz;
|
||||
dest[2][1] = -czsx + cx * sysz;
|
||||
dest[2][2] = cx * cy;
|
||||
dest[0][3] = 0.0f;
|
||||
dest[1][3] = 0.0f;
|
||||
dest[2][3] = 0.0f;
|
||||
dest[3][0] = 0.0f;
|
||||
dest[3][1] = 0.0f;
|
||||
dest[3][2] = 0.0f;
|
||||
dest[3][3] = 1.0f;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief build rotation matrix from euler angles
|
||||
*
|
||||
* @param[in] angles angles as vector [Xangle, Yangle, Zangle]
|
||||
* @param[in] ord euler order
|
||||
* @param[out] dest rotation matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_euler_by_order(vec3 angles, glm_euler_sq axis, mat4 dest) {
|
||||
glm_euler_by_order(vec3 angles, glm_euler_sq ord, mat4 dest) {
|
||||
float cx, cy, cz,
|
||||
sx, sy, sz;
|
||||
|
||||
|
@ -279,72 +352,72 @@ glm_euler_by_order(vec3 angles, glm_euler_sq axis, mat4 dest) {
|
|||
czsx = cz * sx; cxsz = cx * sz;
|
||||
sysz = sy * sz;
|
||||
|
||||
switch (axis) {
|
||||
case GLM_EULER_XYZ:
|
||||
dest[0][0] = cycz;
|
||||
dest[0][1] = cysz;
|
||||
dest[0][2] =-sy;
|
||||
dest[1][0] = czsx * sy - cxsz;
|
||||
dest[1][1] = cxcz + sx * sysz;
|
||||
dest[1][2] = cysx;
|
||||
dest[2][0] = cx * czsy + sx * sz;
|
||||
dest[2][1] =-czsx + cx * sysz;
|
||||
dest[2][2] = cxcy;
|
||||
break;
|
||||
switch (ord) {
|
||||
case GLM_EULER_XZY:
|
||||
dest[0][0] = cycz;
|
||||
dest[0][1] = sz;
|
||||
dest[0][2] =-czsy;
|
||||
dest[1][0] = sx * sy - cx * cysz;
|
||||
dest[1][1] = cxcz;
|
||||
dest[1][2] = cysx + cx * sysz;
|
||||
dest[2][0] = cx * sy + cysx * sz;
|
||||
dest[2][1] =-czsx;
|
||||
dest[2][2] = cxcy - sx * sysz;
|
||||
dest[0][0] = cycz;
|
||||
dest[0][1] = sx * sy + cx * cysz;
|
||||
dest[0][2] = -cx * sy + cysx * sz;
|
||||
dest[1][0] = -sz;
|
||||
dest[1][1] = cxcz;
|
||||
dest[1][2] = czsx;
|
||||
dest[2][0] = czsy;
|
||||
dest[2][1] = -cysx + cx * sysz;
|
||||
dest[2][2] = cxcy + sx * sysz;
|
||||
break;
|
||||
case GLM_EULER_ZXY:
|
||||
dest[0][0] = cycz + sx * sysz;
|
||||
dest[0][1] = cxsz;
|
||||
dest[0][2] =-czsy + cysx * sz;
|
||||
dest[1][0] = czsx * sy - cysz;
|
||||
dest[1][1] = cxcz;
|
||||
dest[1][2] = cycz * sx + sysz;
|
||||
dest[2][0] = cx * sy;
|
||||
dest[2][1] =-sx;
|
||||
dest[2][2] = cxcy;
|
||||
break;
|
||||
case GLM_EULER_ZYX:
|
||||
dest[0][0] = cycz;
|
||||
dest[0][1] = czsx * sy + cxsz;
|
||||
dest[0][2] =-cx * czsy + sx * sz;
|
||||
dest[1][0] =-cysz;
|
||||
dest[1][1] = cxcz - sx * sysz;
|
||||
dest[1][2] = czsx + cx * sysz;
|
||||
dest[2][0] = sy;
|
||||
dest[2][1] =-cysx;
|
||||
dest[2][2] = cxcy;
|
||||
case GLM_EULER_XYZ:
|
||||
dest[0][0] = cycz;
|
||||
dest[0][1] = czsx * sy + cxsz;
|
||||
dest[0][2] = -cx * czsy + sx * sz;
|
||||
dest[1][0] = -cysz;
|
||||
dest[1][1] = cxcz - sx * sysz;
|
||||
dest[1][2] = czsx + cx * sysz;
|
||||
dest[2][0] = sy;
|
||||
dest[2][1] = -cysx;
|
||||
dest[2][2] = cxcy;
|
||||
break;
|
||||
case GLM_EULER_YXZ:
|
||||
dest[0][0] = cycz - sx * sysz;
|
||||
dest[0][1] = czsx * sy + cysz;
|
||||
dest[0][2] =-cx * sy;
|
||||
dest[1][0] =-cxsz;
|
||||
dest[1][1] = cxcz;
|
||||
dest[1][2] = sx;
|
||||
dest[2][0] = czsy + cysx * sz;
|
||||
dest[2][1] =-cycz * sx + sysz;
|
||||
dest[2][2] = cxcy;
|
||||
dest[0][0] = cycz + sx * sysz;
|
||||
dest[0][1] = cxsz;
|
||||
dest[0][2] = -czsy + cysx * sz;
|
||||
dest[1][0] = czsx * sy - cysz;
|
||||
dest[1][1] = cxcz;
|
||||
dest[1][2] = cycz * sx + sysz;
|
||||
dest[2][0] = cx * sy;
|
||||
dest[2][1] = -sx;
|
||||
dest[2][2] = cxcy;
|
||||
break;
|
||||
case GLM_EULER_YZX:
|
||||
dest[0][0] = cycz;
|
||||
dest[0][1] = sx * sy + cx * cysz;
|
||||
dest[0][2] =-cx * sy + cysx * sz;
|
||||
dest[1][0] =-sz;
|
||||
dest[1][1] = cxcz;
|
||||
dest[1][2] = czsx;
|
||||
dest[2][0] = czsy;
|
||||
dest[2][1] =-cysx + cx * sysz;
|
||||
dest[2][2] = cxcy + sx * sysz;
|
||||
dest[0][0] = cycz;
|
||||
dest[0][1] = sz;
|
||||
dest[0][2] = -czsy;
|
||||
dest[1][0] = sx * sy - cx * cysz;
|
||||
dest[1][1] = cxcz;
|
||||
dest[1][2] = cysx + cx * sysz;
|
||||
dest[2][0] = cx * sy + cysx * sz;
|
||||
dest[2][1] = -czsx;
|
||||
dest[2][2] = cxcy - sx * sysz;
|
||||
break;
|
||||
case GLM_EULER_ZXY:
|
||||
dest[0][0] = cycz - sx * sysz;
|
||||
dest[0][1] = czsx * sy + cysz;
|
||||
dest[0][2] = -cx * sy;
|
||||
dest[1][0] = -cxsz;
|
||||
dest[1][1] = cxcz;
|
||||
dest[1][2] = sx;
|
||||
dest[2][0] = czsy + cysx * sz;
|
||||
dest[2][1] = -cycz * sx + sysz;
|
||||
dest[2][2] = cxcy;
|
||||
break;
|
||||
case GLM_EULER_ZYX:
|
||||
dest[0][0] = cycz;
|
||||
dest[0][1] = cysz;
|
||||
dest[0][2] = -sy;
|
||||
dest[1][0] = czsx * sy - cxsz;
|
||||
dest[1][1] = cxcz + sx * sysz;
|
||||
dest[1][2] = cysx;
|
||||
dest[2][0] = cx * czsy + sx * sz;
|
||||
dest[2][1] = -czsx + cx * sysz;
|
||||
dest[2][2] = cxcy;
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
3
external/cglm/include/cglm/frustum.h
vendored
3
external/cglm/include/cglm/frustum.h
vendored
|
@ -10,6 +10,9 @@
|
|||
|
||||
#include "common.h"
|
||||
#include "plane.h"
|
||||
#include "vec3.h"
|
||||
#include "vec4.h"
|
||||
#include "mat4.h"
|
||||
|
||||
#define GLM_LBN 0 /* left bottom near */
|
||||
#define GLM_LTN 1 /* left top near */
|
||||
|
|
346
external/cglm/include/cglm/glm2call.h
vendored
346
external/cglm/include/cglm/glm2call.h
vendored
|
@ -1,6 +1,70 @@
|
|||
|
||||
// Auto-generated, do not modify.
|
||||
|
||||
// call/ease.h
|
||||
#undef glm_ease_linear
|
||||
#define glm_ease_linear glmc_ease_linear
|
||||
#undef glm_ease_sine_in
|
||||
#define glm_ease_sine_in glmc_ease_sine_in
|
||||
#undef glm_ease_sine_out
|
||||
#define glm_ease_sine_out glmc_ease_sine_out
|
||||
#undef glm_ease_sine_inout
|
||||
#define glm_ease_sine_inout glmc_ease_sine_inout
|
||||
#undef glm_ease_quad_in
|
||||
#define glm_ease_quad_in glmc_ease_quad_in
|
||||
#undef glm_ease_quad_out
|
||||
#define glm_ease_quad_out glmc_ease_quad_out
|
||||
#undef glm_ease_quad_inout
|
||||
#define glm_ease_quad_inout glmc_ease_quad_inout
|
||||
#undef glm_ease_cubic_in
|
||||
#define glm_ease_cubic_in glmc_ease_cubic_in
|
||||
#undef glm_ease_cubic_out
|
||||
#define glm_ease_cubic_out glmc_ease_cubic_out
|
||||
#undef glm_ease_cubic_inout
|
||||
#define glm_ease_cubic_inout glmc_ease_cubic_inout
|
||||
#undef glm_ease_quart_in
|
||||
#define glm_ease_quart_in glmc_ease_quart_in
|
||||
#undef glm_ease_quart_out
|
||||
#define glm_ease_quart_out glmc_ease_quart_out
|
||||
#undef glm_ease_quart_inout
|
||||
#define glm_ease_quart_inout glmc_ease_quart_inout
|
||||
#undef glm_ease_quint_in
|
||||
#define glm_ease_quint_in glmc_ease_quint_in
|
||||
#undef glm_ease_quint_out
|
||||
#define glm_ease_quint_out glmc_ease_quint_out
|
||||
#undef glm_ease_quint_inout
|
||||
#define glm_ease_quint_inout glmc_ease_quint_inout
|
||||
#undef glm_ease_exp_in
|
||||
#define glm_ease_exp_in glmc_ease_exp_in
|
||||
#undef glm_ease_exp_out
|
||||
#define glm_ease_exp_out glmc_ease_exp_out
|
||||
#undef glm_ease_exp_inout
|
||||
#define glm_ease_exp_inout glmc_ease_exp_inout
|
||||
#undef glm_ease_circ_in
|
||||
#define glm_ease_circ_in glmc_ease_circ_in
|
||||
#undef glm_ease_circ_out
|
||||
#define glm_ease_circ_out glmc_ease_circ_out
|
||||
#undef glm_ease_circ_inout
|
||||
#define glm_ease_circ_inout glmc_ease_circ_inout
|
||||
#undef glm_ease_back_in
|
||||
#define glm_ease_back_in glmc_ease_back_in
|
||||
#undef glm_ease_back_out
|
||||
#define glm_ease_back_out glmc_ease_back_out
|
||||
#undef glm_ease_back_inout
|
||||
#define glm_ease_back_inout glmc_ease_back_inout
|
||||
#undef glm_ease_elast_in
|
||||
#define glm_ease_elast_in glmc_ease_elast_in
|
||||
#undef glm_ease_elast_out
|
||||
#define glm_ease_elast_out glmc_ease_elast_out
|
||||
#undef glm_ease_elast_inout
|
||||
#define glm_ease_elast_inout glmc_ease_elast_inout
|
||||
#undef glm_ease_bounce_out
|
||||
#define glm_ease_bounce_out glmc_ease_bounce_out
|
||||
#undef glm_ease_bounce_in
|
||||
#define glm_ease_bounce_in glmc_ease_bounce_in
|
||||
#undef glm_ease_bounce_inout
|
||||
#define glm_ease_bounce_inout glmc_ease_bounce_inout
|
||||
|
||||
// call/frustum.h
|
||||
#undef glm_frustum_planes
|
||||
#define glm_frustum_planes glmc_frustum_planes
|
||||
|
@ -13,7 +77,21 @@
|
|||
#undef glm_frustum_corners_at
|
||||
#define glm_frustum_corners_at glmc_frustum_corners_at
|
||||
|
||||
// call/project.h
|
||||
#undef glm_unprojecti
|
||||
#define glm_unprojecti glmc_unprojecti
|
||||
#undef glm_unproject
|
||||
#define glm_unproject glmc_unproject
|
||||
#undef glm_project
|
||||
#define glm_project glmc_project
|
||||
|
||||
// call/vec4.h
|
||||
#undef glm_vec4
|
||||
#define glm_vec4 glmc_vec4
|
||||
#undef glm_vec4_zero
|
||||
#define glm_vec4_zero glmc_vec4_zero
|
||||
#undef glm_vec4_one
|
||||
#define glm_vec4_one glmc_vec4_one
|
||||
#undef glm_vec4_copy3
|
||||
#define glm_vec4_copy3 glmc_vec4_copy3
|
||||
#undef glm_vec4_copy
|
||||
|
@ -30,14 +108,34 @@
|
|||
#define glm_vec4_normalize glmc_vec4_normalize
|
||||
#undef glm_vec4_add
|
||||
#define glm_vec4_add glmc_vec4_add
|
||||
#undef glm_vec4_adds
|
||||
#define glm_vec4_adds glmc_vec4_adds
|
||||
#undef glm_vec4_sub
|
||||
#define glm_vec4_sub glmc_vec4_sub
|
||||
#undef glm_vec4_subs
|
||||
#define glm_vec4_subs glmc_vec4_subs
|
||||
#undef glm_vec4_mul
|
||||
#define glm_vec4_mul glmc_vec4_mul
|
||||
#undef glm_vec4_scale
|
||||
#define glm_vec4_scale glmc_vec4_scale
|
||||
#undef glm_vec4_scale_as
|
||||
#define glm_vec4_scale_as glmc_vec4_scale_as
|
||||
#undef glm_vec4_div
|
||||
#define glm_vec4_div glmc_vec4_div
|
||||
#undef glm_vec4_divs
|
||||
#define glm_vec4_divs glmc_vec4_divs
|
||||
#undef glm_vec4_addadd
|
||||
#define glm_vec4_addadd glmc_vec4_addadd
|
||||
#undef glm_vec4_subadd
|
||||
#define glm_vec4_subadd glmc_vec4_subadd
|
||||
#undef glm_vec4_muladd
|
||||
#define glm_vec4_muladd glmc_vec4_muladd
|
||||
#undef glm_vec4_muladds
|
||||
#define glm_vec4_muladds glmc_vec4_muladds
|
||||
#undef glm_vec4_flipsign
|
||||
#define glm_vec4_flipsign glmc_vec4_flipsign
|
||||
#undef glm_vec4_flipsign_to
|
||||
#define glm_vec4_flipsign_to glmc_vec4_flipsign_to
|
||||
#undef glm_vec4_inv
|
||||
#define glm_vec4_inv glmc_vec4_inv
|
||||
#undef glm_vec4_inv_to
|
||||
|
@ -48,6 +146,38 @@
|
|||
#define glm_vec4_maxv glmc_vec4_maxv
|
||||
#undef glm_vec4_minv
|
||||
#define glm_vec4_minv glmc_vec4_minv
|
||||
#undef glm_vec4_clamp
|
||||
#define glm_vec4_clamp glmc_vec4_clamp
|
||||
#undef glm_vec4_lerp
|
||||
#define glm_vec4_lerp glmc_vec4_lerp
|
||||
#undef glm_vec4_mulv
|
||||
#define glm_vec4_mulv glmc_vec4_mulv
|
||||
#undef glm_vec4_broadcast
|
||||
#define glm_vec4_broadcast glmc_vec4_broadcast
|
||||
#undef glm_vec4_eq
|
||||
#define glm_vec4_eq glmc_vec4_eq
|
||||
#undef glm_vec4_eq_eps
|
||||
#define glm_vec4_eq_eps glmc_vec4_eq_eps
|
||||
#undef glm_vec4_eq_all
|
||||
#define glm_vec4_eq_all glmc_vec4_eq_all
|
||||
#undef glm_vec4_eqv
|
||||
#define glm_vec4_eqv glmc_vec4_eqv
|
||||
#undef glm_vec4_eqv_eps
|
||||
#define glm_vec4_eqv_eps glmc_vec4_eqv_eps
|
||||
#undef glm_vec4_max
|
||||
#define glm_vec4_max glmc_vec4_max
|
||||
#undef glm_vec4_min
|
||||
#define glm_vec4_min glmc_vec4_min
|
||||
#undef glm_vec4_isnan
|
||||
#define glm_vec4_isnan glmc_vec4_isnan
|
||||
#undef glm_vec4_isinf
|
||||
#define glm_vec4_isinf glmc_vec4_isinf
|
||||
#undef glm_vec4_isvalid
|
||||
#define glm_vec4_isvalid glmc_vec4_isvalid
|
||||
#undef glm_vec4_sign
|
||||
#define glm_vec4_sign glmc_vec4_sign
|
||||
#undef glm_vec4_sqrt
|
||||
#define glm_vec4_sqrt glmc_vec4_sqrt
|
||||
|
||||
// call/mat3.h
|
||||
#undef glm_mat3_copy
|
||||
|
@ -62,6 +192,8 @@
|
|||
#define glm_mat3_transpose glmc_mat3_transpose
|
||||
#undef glm_mat3_mulv
|
||||
#define glm_mat3_mulv glmc_mat3_mulv
|
||||
#undef glm_mat3_quat
|
||||
#define glm_mat3_quat glmc_mat3_quat
|
||||
#undef glm_mat3_scale
|
||||
#define glm_mat3_scale glmc_mat3_scale
|
||||
#undef glm_mat3_det
|
||||
|
@ -86,6 +218,26 @@
|
|||
#define glm_aabb_crop glmc_aabb_crop
|
||||
#undef glm_aabb_crop_until
|
||||
#define glm_aabb_crop_until glmc_aabb_crop_until
|
||||
#undef glm_aabb_frustum
|
||||
#define glm_aabb_frustum glmc_aabb_frustum
|
||||
#undef glm_aabb_invalidate
|
||||
#define glm_aabb_invalidate glmc_aabb_invalidate
|
||||
#undef glm_aabb_isvalid
|
||||
#define glm_aabb_isvalid glmc_aabb_isvalid
|
||||
#undef glm_aabb_size
|
||||
#define glm_aabb_size glmc_aabb_size
|
||||
#undef glm_aabb_radius
|
||||
#define glm_aabb_radius glmc_aabb_radius
|
||||
#undef glm_aabb_center
|
||||
#define glm_aabb_center glmc_aabb_center
|
||||
#undef glm_aabb_aabb
|
||||
#define glm_aabb_aabb glmc_aabb_aabb
|
||||
#undef glm_aabb_point
|
||||
#define glm_aabb_point glmc_aabb_point
|
||||
#undef glm_aabb_contains
|
||||
#define glm_aabb_contains glmc_aabb_contains
|
||||
#undef glm_aabb_sphere
|
||||
#define glm_aabb_sphere glmc_aabb_sphere
|
||||
|
||||
// call/mat4.h
|
||||
#undef glm_mat4_ucopy
|
||||
|
@ -106,6 +258,10 @@
|
|||
#define glm_mat4_mulN glmc_mat4_mulN
|
||||
#undef glm_mat4_mulv
|
||||
#define glm_mat4_mulv glmc_mat4_mulv
|
||||
#undef glm_mat4_mulv3
|
||||
#define glm_mat4_mulv3 glmc_mat4_mulv3
|
||||
#undef glm_mat4_quat
|
||||
#define glm_mat4_quat glmc_mat4_quat
|
||||
#undef glm_mat4_transpose_to
|
||||
#define glm_mat4_transpose_to glmc_mat4_transpose_to
|
||||
#undef glm_mat4_transpose
|
||||
|
@ -120,6 +276,8 @@
|
|||
#define glm_mat4_inv glmc_mat4_inv
|
||||
#undef glm_mat4_inv_precise
|
||||
#define glm_mat4_inv_precise glmc_mat4_inv_precise
|
||||
#undef glm_mat4_inv_fast
|
||||
#define glm_mat4_inv_fast glmc_mat4_inv_fast
|
||||
#undef glm_mat4_swap_col
|
||||
#define glm_mat4_swap_col glmc_mat4_swap_col
|
||||
#undef glm_mat4_swap_row
|
||||
|
@ -138,6 +296,8 @@
|
|||
#define glm_versor_print glmc_versor_print
|
||||
|
||||
// call/affine.h
|
||||
#undef glm_translate_make
|
||||
#define glm_translate_make glmc_translate_make
|
||||
#undef glm_translate_to
|
||||
#define glm_translate_to glmc_translate_to
|
||||
#undef glm_translate
|
||||
|
@ -148,50 +308,112 @@
|
|||
#define glm_translate_y glmc_translate_y
|
||||
#undef glm_translate_z
|
||||
#define glm_translate_z glmc_translate_z
|
||||
#undef glm_scale_make
|
||||
#define glm_scale_make glmc_scale_make
|
||||
#undef glm_scale_to
|
||||
#define glm_scale_to glmc_scale_to
|
||||
#undef glm_scale
|
||||
#define glm_scale glmc_scale
|
||||
#undef glm_scale1
|
||||
#define glm_scale1 glmc_scale1
|
||||
#undef glm_scale_uni
|
||||
#define glm_scale_uni glmc_scale_uni
|
||||
#undef glm_rotate_x
|
||||
#define glm_rotate_x glmc_rotate_x
|
||||
#undef glm_rotate_y
|
||||
#define glm_rotate_y glmc_rotate_y
|
||||
#undef glm_rotate_z
|
||||
#define glm_rotate_z glmc_rotate_z
|
||||
#undef glm_rotate_ndc_make
|
||||
#define glm_rotate_ndc_make glmc_rotate_ndc_make
|
||||
#undef glm_rotate_make
|
||||
#define glm_rotate_make glmc_rotate_make
|
||||
#undef glm_rotate_ndc
|
||||
#define glm_rotate_ndc glmc_rotate_ndc
|
||||
#undef glm_rotate
|
||||
#define glm_rotate glmc_rotate
|
||||
#undef glm_rotate_at
|
||||
#define glm_rotate_at glmc_rotate_at
|
||||
#undef glm_rotate_atm
|
||||
#define glm_rotate_atm glmc_rotate_atm
|
||||
#undef glm_decompose_scalev
|
||||
#define glm_decompose_scalev glmc_decompose_scalev
|
||||
#undef glm_uniscaled
|
||||
#define glm_uniscaled glmc_uniscaled
|
||||
#undef glm_decompose_rs
|
||||
#define glm_decompose_rs glmc_decompose_rs
|
||||
#undef glm_decompose
|
||||
#define glm_decompose glmc_decompose
|
||||
#undef glm_mul
|
||||
#define glm_mul glmc_mul
|
||||
#undef glm_mul_rot
|
||||
#define glm_mul_rot glmc_mul_rot
|
||||
#undef glm_inv_tr
|
||||
#define glm_inv_tr glmc_inv_tr
|
||||
|
||||
// call/cam.h
|
||||
#undef glm_frustum
|
||||
#define glm_frustum glmc_frustum
|
||||
#undef glm_ortho
|
||||
#define glm_ortho glmc_ortho
|
||||
#undef glm_ortho_aabb
|
||||
#define glm_ortho_aabb glmc_ortho_aabb
|
||||
#undef glm_ortho_aabb_p
|
||||
#define glm_ortho_aabb_p glmc_ortho_aabb_p
|
||||
#undef glm_ortho_aabb_pz
|
||||
#define glm_ortho_aabb_pz glmc_ortho_aabb_pz
|
||||
#undef glm_ortho_default
|
||||
#define glm_ortho_default glmc_ortho_default
|
||||
#undef glm_ortho_default_s
|
||||
#define glm_ortho_default_s glmc_ortho_default_s
|
||||
#undef glm_perspective
|
||||
#define glm_perspective glmc_perspective
|
||||
#undef glm_perspective_default
|
||||
#define glm_perspective_default glmc_perspective_default
|
||||
#undef glm_perspective_resize
|
||||
#define glm_perspective_resize glmc_perspective_resize
|
||||
#undef glm_lookat
|
||||
#define glm_lookat glmc_lookat
|
||||
#undef glm_look
|
||||
#define glm_look glmc_look
|
||||
#undef glm_look_anyup
|
||||
#define glm_look_anyup glmc_look_anyup
|
||||
#undef glm_persp_decomp
|
||||
#define glm_persp_decomp glmc_persp_decomp
|
||||
#undef glm_persp_decompv
|
||||
#define glm_persp_decompv glmc_persp_decompv
|
||||
#undef glm_persp_decomp_x
|
||||
#define glm_persp_decomp_x glmc_persp_decomp_x
|
||||
#undef glm_persp_decomp_y
|
||||
#define glm_persp_decomp_y glmc_persp_decomp_y
|
||||
#undef glm_persp_decomp_z
|
||||
#define glm_persp_decomp_z glmc_persp_decomp_z
|
||||
#undef glm_persp_decomp_far
|
||||
#define glm_persp_decomp_far glmc_persp_decomp_far
|
||||
#undef glm_persp_decomp_near
|
||||
#define glm_persp_decomp_near glmc_persp_decomp_near
|
||||
#undef glm_persp_fovy
|
||||
#define glm_persp_fovy glmc_persp_fovy
|
||||
#undef glm_persp_aspect
|
||||
#define glm_persp_aspect glmc_persp_aspect
|
||||
#undef glm_persp_sizes
|
||||
#define glm_persp_sizes glmc_persp_sizes
|
||||
|
||||
// call/sphere.h
|
||||
#undef glm_sphere_radii
|
||||
#define glm_sphere_radii glmc_sphere_radii
|
||||
#undef glm_sphere_transform
|
||||
#define glm_sphere_transform glmc_sphere_transform
|
||||
#undef glm_sphere_merge
|
||||
#define glm_sphere_merge glmc_sphere_merge
|
||||
#undef glm_sphere_sphere
|
||||
#define glm_sphere_sphere glmc_sphere_sphere
|
||||
#undef glm_sphere_point
|
||||
#define glm_sphere_point glmc_sphere_point
|
||||
|
||||
// call/vec3.h
|
||||
#undef glm_vec3
|
||||
#define glm_vec3 glmc_vec3
|
||||
#undef glm_vec_copy
|
||||
#define glm_vec_copy glmc_vec_copy
|
||||
#undef glm_vec_zero
|
||||
#define glm_vec_zero glmc_vec_zero
|
||||
#undef glm_vec_one
|
||||
#define glm_vec_one glmc_vec_one
|
||||
#undef glm_vec_dot
|
||||
#define glm_vec_dot glmc_vec_dot
|
||||
#undef glm_vec_cross
|
||||
|
@ -206,14 +428,34 @@
|
|||
#define glm_vec_normalize glmc_vec_normalize
|
||||
#undef glm_vec_add
|
||||
#define glm_vec_add glmc_vec_add
|
||||
#undef glm_vec_adds
|
||||
#define glm_vec_adds glmc_vec_adds
|
||||
#undef glm_vec_sub
|
||||
#define glm_vec_sub glmc_vec_sub
|
||||
#undef glm_vec_subs
|
||||
#define glm_vec_subs glmc_vec_subs
|
||||
#undef glm_vec_mul
|
||||
#define glm_vec_mul glmc_vec_mul
|
||||
#undef glm_vec_scale
|
||||
#define glm_vec_scale glmc_vec_scale
|
||||
#undef glm_vec_scale_as
|
||||
#define glm_vec_scale_as glmc_vec_scale_as
|
||||
#undef glm_vec_div
|
||||
#define glm_vec_div glmc_vec_div
|
||||
#undef glm_vec_divs
|
||||
#define glm_vec_divs glmc_vec_divs
|
||||
#undef glm_vec_addadd
|
||||
#define glm_vec_addadd glmc_vec_addadd
|
||||
#undef glm_vec_subadd
|
||||
#define glm_vec_subadd glmc_vec_subadd
|
||||
#undef glm_vec_muladd
|
||||
#define glm_vec_muladd glmc_vec_muladd
|
||||
#undef glm_vec_muladds
|
||||
#define glm_vec_muladds glmc_vec_muladds
|
||||
#undef glm_vec_flipsign
|
||||
#define glm_vec_flipsign glmc_vec_flipsign
|
||||
#undef glm_vec_flipsign_to
|
||||
#define glm_vec_flipsign_to glmc_vec_flipsign_to
|
||||
#undef glm_vec_inv
|
||||
#define glm_vec_inv glmc_vec_inv
|
||||
#undef glm_vec_inv_to
|
||||
|
@ -224,42 +466,130 @@
|
|||
#define glm_vec_rotate glmc_vec_rotate
|
||||
#undef glm_vec_rotate_m4
|
||||
#define glm_vec_rotate_m4 glmc_vec_rotate_m4
|
||||
#undef glm_vec_rotate_m3
|
||||
#define glm_vec_rotate_m3 glmc_vec_rotate_m3
|
||||
#undef glm_vec_proj
|
||||
#define glm_vec_proj glmc_vec_proj
|
||||
#undef glm_vec_center
|
||||
#define glm_vec_center glmc_vec_center
|
||||
#undef glm_vec_distance2
|
||||
#define glm_vec_distance2 glmc_vec_distance2
|
||||
#undef glm_vec_distance
|
||||
#define glm_vec_distance glmc_vec_distance
|
||||
#undef glm_vec_maxv
|
||||
#define glm_vec_maxv glmc_vec_maxv
|
||||
#undef glm_vec_minv
|
||||
#define glm_vec_minv glmc_vec_minv
|
||||
#undef glm_vec_clamp
|
||||
#define glm_vec_clamp glmc_vec_clamp
|
||||
#undef glm_vec_ortho
|
||||
#define glm_vec_ortho glmc_vec_ortho
|
||||
#undef glm_vec_lerp
|
||||
#define glm_vec_lerp glmc_vec_lerp
|
||||
#undef glm_vec_mulv
|
||||
#define glm_vec_mulv glmc_vec_mulv
|
||||
#undef glm_vec_broadcast
|
||||
#define glm_vec_broadcast glmc_vec_broadcast
|
||||
#undef glm_vec_eq
|
||||
#define glm_vec_eq glmc_vec_eq
|
||||
#undef glm_vec_eq_eps
|
||||
#define glm_vec_eq_eps glmc_vec_eq_eps
|
||||
#undef glm_vec_eq_all
|
||||
#define glm_vec_eq_all glmc_vec_eq_all
|
||||
#undef glm_vec_eqv
|
||||
#define glm_vec_eqv glmc_vec_eqv
|
||||
#undef glm_vec_eqv_eps
|
||||
#define glm_vec_eqv_eps glmc_vec_eqv_eps
|
||||
#undef glm_vec_max
|
||||
#define glm_vec_max glmc_vec_max
|
||||
#undef glm_vec_min
|
||||
#define glm_vec_min glmc_vec_min
|
||||
#undef glm_vec_isnan
|
||||
#define glm_vec_isnan glmc_vec_isnan
|
||||
#undef glm_vec_isinf
|
||||
#define glm_vec_isinf glmc_vec_isinf
|
||||
#undef glm_vec_isvalid
|
||||
#define glm_vec_isvalid glmc_vec_isvalid
|
||||
#undef glm_vec_sign
|
||||
#define glm_vec_sign glmc_vec_sign
|
||||
#undef glm_vec_sqrt
|
||||
#define glm_vec_sqrt glmc_vec_sqrt
|
||||
|
||||
// call/quat.h
|
||||
#undef glm_quat_identity
|
||||
#define glm_quat_identity glmc_quat_identity
|
||||
#undef glm_quat_init
|
||||
#define glm_quat_init glmc_quat_init
|
||||
#undef glm_quat
|
||||
#define glm_quat glmc_quat
|
||||
#undef glm_quatv
|
||||
#define glm_quatv glmc_quatv
|
||||
#undef glm_quat_copy
|
||||
#define glm_quat_copy glmc_quat_copy
|
||||
#undef glm_quat_norm
|
||||
#define glm_quat_norm glmc_quat_norm
|
||||
#undef glm_quat_normalize_to
|
||||
#define glm_quat_normalize_to glmc_quat_normalize_to
|
||||
#undef glm_quat_normalize
|
||||
#define glm_quat_normalize glmc_quat_normalize
|
||||
#undef glm_quat_dot
|
||||
#define glm_quat_dot glmc_quat_dot
|
||||
#undef glm_quat_mulv
|
||||
#define glm_quat_mulv glmc_quat_mulv
|
||||
#undef glm_quat_conjugate
|
||||
#define glm_quat_conjugate glmc_quat_conjugate
|
||||
#undef glm_quat_inv
|
||||
#define glm_quat_inv glmc_quat_inv
|
||||
#undef glm_quat_add
|
||||
#define glm_quat_add glmc_quat_add
|
||||
#undef glm_quat_sub
|
||||
#define glm_quat_sub glmc_quat_sub
|
||||
#undef glm_quat_real
|
||||
#define glm_quat_real glmc_quat_real
|
||||
#undef glm_quat_imag
|
||||
#define glm_quat_imag glmc_quat_imag
|
||||
#undef glm_quat_imagn
|
||||
#define glm_quat_imagn glmc_quat_imagn
|
||||
#undef glm_quat_imaglen
|
||||
#define glm_quat_imaglen glmc_quat_imaglen
|
||||
#undef glm_quat_angle
|
||||
#define glm_quat_angle glmc_quat_angle
|
||||
#undef glm_quat_axis
|
||||
#define glm_quat_axis glmc_quat_axis
|
||||
#undef glm_quat_mul
|
||||
#define glm_quat_mul glmc_quat_mul
|
||||
#undef glm_quat_mat4
|
||||
#define glm_quat_mat4 glmc_quat_mat4
|
||||
#undef glm_quat_mat4t
|
||||
#define glm_quat_mat4t glmc_quat_mat4t
|
||||
#undef glm_quat_mat3
|
||||
#define glm_quat_mat3 glmc_quat_mat3
|
||||
#undef glm_quat_mat3t
|
||||
#define glm_quat_mat3t glmc_quat_mat3t
|
||||
#undef glm_quat_lerp
|
||||
#define glm_quat_lerp glmc_quat_lerp
|
||||
#undef glm_quat_slerp
|
||||
#define glm_quat_slerp glmc_quat_slerp
|
||||
#undef glm_quat_look
|
||||
#define glm_quat_look glmc_quat_look
|
||||
#undef glm_quat_for
|
||||
#define glm_quat_for glmc_quat_for
|
||||
#undef glm_quat_forp
|
||||
#define glm_quat_forp glmc_quat_forp
|
||||
#undef glm_quat_rotatev
|
||||
#define glm_quat_rotatev glmc_quat_rotatev
|
||||
#undef glm_quat_rotate
|
||||
#define glm_quat_rotate glmc_quat_rotate
|
||||
#undef glm_quat_rotate_at
|
||||
#define glm_quat_rotate_at glmc_quat_rotate_at
|
||||
#undef glm_quat_rotate_atm
|
||||
#define glm_quat_rotate_atm glmc_quat_rotate_atm
|
||||
|
||||
// call/euler.h
|
||||
#undef glm_euler_angles
|
||||
#define glm_euler_angles glmc_euler_angles
|
||||
#undef glm_euler
|
||||
#define glm_euler glmc_euler
|
||||
#undef glm_euler_xyz
|
||||
#define glm_euler_xyz glmc_euler_xyz
|
||||
#undef glm_euler_zyx
|
||||
#define glm_euler_zyx glmc_euler_zyx
|
||||
#undef glm_euler_zxy
|
||||
|
|
29
external/cglm/include/cglm/io.h
vendored
29
external/cglm/include/cglm/io.h
vendored
|
@ -171,4 +171,33 @@ glm_versor_print(versor vec,
|
|||
#undef m
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_aabb_print(vec3 bbox[2],
|
||||
const char * __restrict tag,
|
||||
FILE * __restrict ostream) {
|
||||
int i, j;
|
||||
|
||||
#define m 3
|
||||
|
||||
fprintf(ostream, "AABB (%s):\n", tag ? tag: "float");
|
||||
|
||||
for (i = 0; i < 2; i++) {
|
||||
fprintf(ostream, "\t|");
|
||||
|
||||
for (j = 0; j < m; j++) {
|
||||
fprintf(ostream, "%0.4f", bbox[i][j]);
|
||||
|
||||
if (j != m - 1)
|
||||
fprintf(ostream, "\t");
|
||||
}
|
||||
|
||||
fprintf(ostream, "|\n");
|
||||
}
|
||||
|
||||
fprintf(ostream, "\n");
|
||||
|
||||
#undef m
|
||||
}
|
||||
|
||||
#endif /* cglm_io_h */
|
||||
|
|
59
external/cglm/include/cglm/mat3.h
vendored
59
external/cglm/include/cglm/mat3.h
vendored
|
@ -31,6 +31,7 @@
|
|||
#define cglm_mat3_h
|
||||
|
||||
#include "common.h"
|
||||
#include "vec3.h"
|
||||
|
||||
#ifdef CGLM_SSE_FP
|
||||
# include "simd/sse2/mat3.h"
|
||||
|
@ -45,8 +46,8 @@
|
|||
|
||||
|
||||
/* for C only */
|
||||
#define GLM_MAT3_IDENTITY (mat3)GLM_MAT3_IDENTITY_INIT
|
||||
#define GLM_MAT3_ZERO (mat3)GLM_MAT3_ZERO_INIT
|
||||
#define GLM_MAT3_IDENTITY ((mat3)GLM_MAT3_IDENTITY_INIT)
|
||||
#define GLM_MAT3_ZERO ((mat3)GLM_MAT3_ZERO_INIT)
|
||||
|
||||
/* DEPRECATED! use _copy, _ucopy versions */
|
||||
#define glm_mat3_dup(mat, dest) glm_mat3_copy(mat, dest)
|
||||
|
@ -80,7 +81,7 @@ glm_mat3_copy(mat3 mat, mat3 dest) {
|
|||
CGLM_INLINE
|
||||
void
|
||||
glm_mat3_identity(mat3 mat) {
|
||||