Move CGLM to submodule and update it
This commit is contained in:
parent
cce82d13d5
commit
5f24e63523
141 changed files with 8 additions and 19159 deletions
4
.gitmodules
vendored
Normal file
4
.gitmodules
vendored
Normal file
|
@ -0,0 +1,4 @@
|
|||
[submodule "cglm"]
|
||||
path = external/cglm
|
||||
url = ../cglm.git
|
||||
branch = taisei
|
1
external/cglm
vendored
Submodule
1
external/cglm
vendored
Submodule
|
@ -0,0 +1 @@
|
|||
Subproject commit 4833cfe968c20808b240cbcd5d9edcf1698c4e04
|
71
external/cglm/.gitignore
vendored
71
external/cglm/.gitignore
vendored
|
@ -1,71 +0,0 @@
|
|||
*.xcodeproj
|
||||
*.xcworkspace
|
||||
*.sln
|
||||
*.vcxproj
|
||||
*.vcxproj.*
|
||||
*.suo
|
||||
*.sdf
|
||||
*.opensdf
|
||||
ipch/
|
||||
Debug/
|
||||
Release/
|
||||
.DS_Store
|
||||
.vs
|
||||
*.nupkg
|
||||
*.opendb
|
||||
packages.config
|
||||
/aclocal.m4
|
||||
/ar-lib
|
||||
/autom4te.cache/
|
||||
/compile
|
||||
/config.guess
|
||||
/config.log
|
||||
/config.status
|
||||
/config.sub
|
||||
/configure
|
||||
/depcomp
|
||||
/install-sh
|
||||
/ltmain.sh
|
||||
/missing
|
||||
/libtool
|
||||
/.libs/
|
||||
.deps/
|
||||
*.[oa]
|
||||
*.l[oa]
|
||||
Makefile
|
||||
Makefile.in
|
||||
m4/*.m4
|
||||
.buildstamp
|
||||
.dirstamp
|
||||
packages/
|
||||
.anjuta/*
|
||||
*.anjuta*
|
||||
config.h.*
|
||||
/config.h
|
||||
stamp*
|
||||
COPYING
|
||||
.idea/*
|
||||
*.VC.db
|
||||
cscope.*
|
||||
*-git-ignored-file.*
|
||||
test/*.trs
|
||||
test/test_*
|
||||
*.log
|
||||
test-*
|
||||
test/.libs/*
|
||||
test/tests
|
||||
cglm_arm/*
|
||||
cglm_test_ios/*
|
||||
cglm_test_iosTests/*
|
||||
docs/build/*
|
||||
win/cglm_test_*
|
||||
* copy.*
|
||||
*.o
|
||||
*.obj
|
||||
*codeanalysis.*.xml
|
||||
*codeanalysis.xml
|
||||
*.lib
|
||||
*.tlog
|
||||
win/x64
|
||||
win/x85
|
||||
win/Debug
|
3
external/cglm/.gitmodules
vendored
3
external/cglm/.gitmodules
vendored
|
@ -1,3 +0,0 @@
|
|||
[submodule "test/lib/cmocka"]
|
||||
path = test/lib/cmocka
|
||||
url = git://git.cryptomilk.org/projects/cmocka.git
|
11
external/cglm/.gitrepo
vendored
11
external/cglm/.gitrepo
vendored
|
@ -1,11 +0,0 @@
|
|||
; DO NOT EDIT (unless you know what you are doing)
|
||||
;
|
||||
; This subdirectory is a git "subrepo", and this file is maintained by the
|
||||
; git-subrepo command. See https://github.com/git-commands/git-subrepo#readme
|
||||
;
|
||||
[subrepo]
|
||||
remote = https://github.com/taisei-project/cglm
|
||||
branch = taisei
|
||||
commit = b51be76de1c2300b34b234cbb00dd7ba6def5565
|
||||
parent = f8e78ccf1e34a4771f2918b6c7fa571f4fbdff30
|
||||
cmdver = 0.3.1
|
59
external/cglm/.travis.yml
vendored
59
external/cglm/.travis.yml
vendored
|
@ -1,59 +0,0 @@
|
|||
language: c
|
||||
|
||||
os:
|
||||
- linux
|
||||
- osx
|
||||
|
||||
sudo: required
|
||||
dist: trusty
|
||||
|
||||
compiler:
|
||||
- clang
|
||||
- gcc
|
||||
|
||||
matrix:
|
||||
fast_finish: true
|
||||
exclude:
|
||||
# Skip GCC builds on macOS.
|
||||
- os: osx
|
||||
compiler: gcc
|
||||
include:
|
||||
# Additional GCC builds for code coverage.
|
||||
- os: linux
|
||||
compiler: gcc
|
||||
env: CODE_COVERAGE=ON
|
||||
|
||||
cache:
|
||||
apt: true
|
||||
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- clang-3.6
|
||||
- lcov
|
||||
|
||||
branches:
|
||||
only:
|
||||
- master
|
||||
|
||||
script:
|
||||
- sh ./build-deps.sh
|
||||
- sh ./autogen.sh
|
||||
- if [[ "$CC" == "gcc" && "$CODE_COVERAGE" == "ON" ]]; then
|
||||
./configure CFLAGS="-ftest-coverage -fprofile-arcs";
|
||||
else
|
||||
./configure;
|
||||
fi
|
||||
- make
|
||||
- make check
|
||||
|
||||
after_success:
|
||||
- if [[ "$CC" == "gcc" && "$CODE_COVERAGE" == "ON" ]]; then
|
||||
pip install --user cpp-coveralls &&
|
||||
coveralls
|
||||
--build-root .
|
||||
--exclude lib
|
||||
--exclude test
|
||||
--gcov-options '\-lp'
|
||||
--verbose;
|
||||
fi
|
53
external/cglm/CONTRIBUTING.md
vendored
53
external/cglm/CONTRIBUTING.md
vendored
|
@ -1,53 +0,0 @@
|
|||
# CONTRIBUTING
|
||||
|
||||
Any contributions (code, documentation, ...) are welcome. This project uses [cmocka](http://cmocka.org) for testing, you may need to check their documentation
|
||||
|
||||
# New Features
|
||||
- This library may not accept all new features, it is better to create an issue and get approval before coding
|
||||
- You must add test for every new feature
|
||||
- The feature must be compiled in both UNIX/POSIX systems (e.g. macos, linux...) and Windows
|
||||
|
||||
# Code Style
|
||||
This library is written with C99, don't try to add C++ files (yes it can compiled into lib),
|
||||
if you have enough reason to add C++ files than create an issue and get approval before coding,
|
||||
|
||||
- All functions must have `glm` prefix
|
||||
- Lines should be wrapped at 80 characters.
|
||||
- Don't invent new style for existing ones
|
||||
- Use C89 style comments (`/* comments */`) not C++ style comments (`// comments`)
|
||||
- Don't use TABs instead use 2 spaces for TABs
|
||||
- All indents must be 2 spaces, not 1 nor 4 space
|
||||
- All functions in `include` folder must be exported by `CGLM_EXPORT` and wrapped by `extern "C" {` for C++
|
||||
- Crate new line for return type, attribs:
|
||||
|
||||
```C
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mul(mat4 m1, mat4 m2, mat4 dest)
|
||||
```
|
||||
|
||||
not acceptable:
|
||||
|
||||
```C
|
||||
CGLM_INLINE void glm_mul(mat4 m1, mat4 m2, mat4 dest)
|
||||
```
|
||||
- Variables must be declared at the top of a scope before usage:
|
||||
```C
|
||||
int x;
|
||||
int y;
|
||||
|
||||
x = y = 0;
|
||||
```
|
||||
|
||||
not acceptable:
|
||||
|
||||
```C
|
||||
int x;
|
||||
|
||||
x = 0;
|
||||
int y = 0;
|
||||
```
|
||||
|
||||
- All files must retain same LICENSE statement
|
||||
- Code with warnings will not be accepted, please suppress them (not by disabling them)
|
||||
- Run code anaylysis before submitting pull requests, if you use Xcode you can enable Sanitizer in scheme, you can use valgrind in linux
|
54
external/cglm/CREDITS
vendored
54
external/cglm/CREDITS
vendored
|
@ -1,54 +0,0 @@
|
|||
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
|
21
external/cglm/LICENSE
vendored
21
external/cglm/LICENSE
vendored
|
@ -1,21 +0,0 @@
|
|||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2015 Recep Aslantas <info@recp.me>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
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.
|
286
external/cglm/README.md
vendored
286
external/cglm/README.md
vendored
|
@ -1,286 +0,0 @@
|
|||
# 🎥 OpenGL Mathematics (glm) for `C`
|
||||
[](https://travis-ci.org/recp/cglm)
|
||||
[](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: 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:
|
||||
https://github.com/g-truc/glm
|
||||
|
||||
#### Note for new comers (Important):
|
||||
- `vec4` and `mat4` variables must be aligned. (There will be unaligned versions later)
|
||||
- **in** and **[in, out]** parameters must be initialized (please). But **[out]** parameters not, initializing out param is also redundant
|
||||
- All functions are inline if you don't want to use pre-compiled versions with glmc_ prefix, you can ignore build process. Just incliude headers.
|
||||
- if your debugger takes you to cglm headers then make sure you are not trying to copy vec4 to vec3 or alig issues...
|
||||
- Welcome!
|
||||
|
||||
#### 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.
|
||||
|
||||
#### 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.
|
||||
|
||||
#### 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/>
|
||||
|
||||
<table>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
<div>Like some other graphics libraries (especially OpenGL) this library use Column-Major layout to keep matrices in the memory. </div>
|
||||
<div> </div>
|
||||
<div>In the future the library may support an option to use row-major layout, CURRENTLY if you need to row-major layout you will need to transpose it. </div>
|
||||
</td>
|
||||
<td>
|
||||
<img src="https://upload.wikimedia.org/wikipedia/commons/3/3f/Matrix_Columns.svg" width="300px" />
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
## Features
|
||||
- general purpose matrix operations (mat4, mat3)
|
||||
- chain matrix multiplication (square only)
|
||||
- general purpose vector operations (cross, dot, rotate, proj, angle...)
|
||||
- affine transforms
|
||||
- matrix decomposition (extract rotation, scaling factor)
|
||||
- optimized affine transform matrices (mul, rigid-body inverse)
|
||||
- camera (lookat)
|
||||
- projections (ortho, perspective)
|
||||
- quaternions
|
||||
- euler angles / yaw-pitch-roll to matrix
|
||||
- extract euler angles
|
||||
- inline or pre-compiled function call
|
||||
- frustum (extract view frustum planes, corners...)
|
||||
- bounding box (AABB in Frustum (culling), crop, merge...)
|
||||
- project, unproject
|
||||
|
||||
<hr />
|
||||
|
||||
You have two option to call a function/operation: inline or library call (link)
|
||||
Almost all functions are marked inline (always_inline) so compiler probably will inline.
|
||||
To call pre-compiled version, just use `glmc_` (c stands for 'call') instead of `glm_`.
|
||||
|
||||
```C
|
||||
#include <cglm/cglm.h> /* for inline */
|
||||
#include <cglm/call.h> /* for library call (this also includes cglm.h) */
|
||||
|
||||
mat4 rot, trans, rt;
|
||||
/* ... */
|
||||
glm_mul(trans, rot, rt); /* inline */
|
||||
glmc_mul(trans, rot, rt); /* call from library */
|
||||
```
|
||||
Most of math functions are optimized manualy with SSE2 if available, if not? Dont worry there are non-sse versions of all operations
|
||||
|
||||
You can pass matrices and vectors as array to functions rather than get address.
|
||||
|
||||
```C
|
||||
mat4 m = {
|
||||
1, 0, 0, 0,
|
||||
0, 1, 0, 0,
|
||||
0, 0, 1, 0,
|
||||
0, 0, 0, 1
|
||||
};
|
||||
|
||||
glm_translate(m, (vec3){1.0f, 0.0f, 0.0f});
|
||||
```
|
||||
|
||||
Library contains general purpose mat4 mul and inverse functions but also contains some special form (optimized) of these functions for affine transform matrices. If you want to multiply two affine transform matrices you can use glm_mul instead of glm_mat4_mul and glm_inv_tr (ROT + TR) instead glm_mat4_inv
|
||||
```C
|
||||
/* multiplication */
|
||||
mat4 modelMat;
|
||||
glm_mul(T, R, modelMat);
|
||||
|
||||
/* othonormal rot + tr matrix inverse (rigid-body) */
|
||||
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
|
||||
|
||||
## Build
|
||||
|
||||
### Unix (Autotools)
|
||||
|
||||
```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 check # [Optional] (if you run `sh ./build-deps.sh`)
|
||||
$ [sudo] make install
|
||||
```
|
||||
|
||||
### Windows (MSBuild)
|
||||
Windows related build files, project files are located in `win` folder,
|
||||
make sure you are inside `cglm/win` folder.
|
||||
Code Analysis are enabled, it may take awhile to build
|
||||
|
||||
```Powershell
|
||||
$ cd win
|
||||
$ .\build.bat
|
||||
```
|
||||
if `msbuild` won't work (because of multi version VS) then try to build with `devenv`:
|
||||
```Powershell
|
||||
$ devenv cglm.sln /Build Release
|
||||
```
|
||||
|
||||
### 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 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});
|
||||
```
|
||||
some functions are overloaded :) e.g you can normalize vector:
|
||||
```C
|
||||
glm_vec_normalize(vec);
|
||||
```
|
||||
this will normalize vec and store normalized vector into `vec` but if you will store normalized vector into another vector do this:
|
||||
```C
|
||||
glm_vec_normalize_to(vec, result);
|
||||
```
|
||||
like this function you may see `_to` postfix, this functions store results to another variables and save temp memory
|
||||
|
||||
|
||||
to call pre-compiled versions include header with `c` postfix, c means call. Pre-compiled versions are just wrappers.
|
||||
```C
|
||||
#include <cglm/call.h>
|
||||
```
|
||||
this header will include all headers with c postfix. You need to call functions with c posfix:
|
||||
```C
|
||||
glmc_vec_normalize(vec);
|
||||
```
|
||||
|
||||
Function usage and parameters are documented inside related headers. You may see same parameter passed twice in some examples like this:
|
||||
```C
|
||||
glm_mat4_mul(m1, m2, m1);
|
||||
|
||||
/* or */
|
||||
glm_mat4_mul(m1, m1, m1);
|
||||
```
|
||||
the first two parameter are **[in]** and the last one is **[out]** parameter. After 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:
|
||||
|
||||
Option 1: Send first column
|
||||
```C
|
||||
glUniformMatrix4fv(location, 1, GL_FALSE, matrix[0]);
|
||||
|
||||
/* array of matrices */
|
||||
glUniformMatrix4fv(location, 1, GL_FALSE, matrix[0][0]);
|
||||
```
|
||||
|
||||
Option 2: Cast matrix to pointer type (also valid for multiple dimensional arrays)
|
||||
```C
|
||||
glUniformMatrix4fv(location, 1, GL_FALSE, (float *)matrix);
|
||||
```
|
||||
|
||||
You can pass same way to another APIs e.g. Vulkan, DX...
|
||||
|
||||
## Notes
|
||||
|
||||
- This library uses float types only, does not support Integers, Double... yet
|
||||
- If headers are not working properly with your compiler, IDE please open an issue, because I'm using GCC and clang to test it maybe sometimes MSVC
|
||||
|
||||
**TODO:**
|
||||
- [ ] Unit tests (In Progress)
|
||||
- [ ] Unit tests for comparing cglm with glm results
|
||||
- [x] Add version info
|
||||
- [ ] Unaligned operations (e.g. `glm_umat4_mul`)
|
||||
- [x] Extra documentation
|
||||
- [ ] ARM Neon Arch (In Progress)
|
1
external/cglm/_config.yml
vendored
1
external/cglm/_config.yml
vendored
|
@ -1 +0,0 @@
|
|||
theme: jekyll-theme-minimal
|
7
external/cglm/appveyor.yml
vendored
7
external/cglm/appveyor.yml
vendored
|
@ -1,7 +0,0 @@
|
|||
image: Visual Studio 2017
|
||||
|
||||
build_script:
|
||||
- ps: >-
|
||||
cd win
|
||||
|
||||
.\build.bat
|
21
external/cglm/autogen.sh
vendored
21
external/cglm/autogen.sh
vendored
|
@ -1,21 +0,0 @@
|
|||
#! /bin/sh
|
||||
#
|
||||
# Copyright (c), Recep Aslantas.
|
||||
#
|
||||
# MIT License (MIT), http://opensource.org/licenses/MIT
|
||||
# Full license can be found in the LICENSE file
|
||||
#
|
||||
|
||||
cd $(dirname "$0")
|
||||
|
||||
autoheader
|
||||
|
||||
if [ "$(uname)" = "Darwin" ]; then
|
||||
glibtoolize
|
||||
else
|
||||
libtoolize
|
||||
fi
|
||||
|
||||
aclocal -I m4
|
||||
autoconf
|
||||
automake --add-missing --copy
|
23
external/cglm/build-deps.sh
vendored
23
external/cglm/build-deps.sh
vendored
|
@ -1,23 +0,0 @@
|
|||
#! /bin/sh
|
||||
#
|
||||
# Copyright (c), Recep Aslantas.
|
||||
#
|
||||
# MIT License (MIT), http://opensource.org/licenses/MIT
|
||||
# Full license can be found in the LICENSE file
|
||||
#
|
||||
|
||||
# check if deps are pulled
|
||||
git submodule update --init --recursive
|
||||
|
||||
cd $(dirname "$0")
|
||||
|
||||
# general deps: gcc make autoconf automake libtool cmake
|
||||
|
||||
# test - cmocka
|
||||
cd ./test/lib/cmocka
|
||||
rm -rf build
|
||||
mkdir -p build
|
||||
cd build
|
||||
cmake -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Debug ..
|
||||
make -j8
|
||||
cd ../../../../
|
28
external/cglm/cglm.podspec
vendored
28
external/cglm/cglm.podspec
vendored
|
@ -1,28 +0,0 @@
|
|||
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
|
57
external/cglm/configure.ac
vendored
57
external/cglm/configure.ac
vendored
|
@ -1,57 +0,0 @@
|
|||
#*****************************************************************************
|
||||
# Copyright (c), Recep Aslantas. *
|
||||
# *
|
||||
# MIT License (MIT), http://opensource.org/licenses/MIT *
|
||||
# Full license can be found in the LICENSE file *
|
||||
# *
|
||||
#*****************************************************************************
|
||||
|
||||
AC_PREREQ([2.69])
|
||||
AC_INIT([cglm], [0.4.8], [info@recp.me])
|
||||
AM_INIT_AUTOMAKE([-Wall -Werror foreign subdir-objects])
|
||||
|
||||
AC_CONFIG_MACRO_DIR([m4])
|
||||
AC_CONFIG_SRCDIR([src/])
|
||||
AC_CONFIG_HEADERS([config.h])
|
||||
|
||||
# Checks for programs.
|
||||
AC_PROG_CC
|
||||
AM_PROG_CC_C_O
|
||||
|
||||
AC_PROG_INSTALL
|
||||
AM_PROG_AR
|
||||
|
||||
AC_ENABLE_SHARED
|
||||
AC_ENABLE_STATIC
|
||||
|
||||
LT_INIT
|
||||
|
||||
# Checks for libraries.
|
||||
AC_CHECK_LIB([m], [floor])
|
||||
|
||||
AC_SYS_LARGEFILE
|
||||
|
||||
# Checks for header files.
|
||||
AC_CHECK_HEADERS([limits.h \
|
||||
stddef.h \
|
||||
stdint.h \
|
||||
stdlib.h \
|
||||
string.h ])
|
||||
|
||||
# Checks for typedefs, structures, and compiler characteristics.
|
||||
AC_CHECK_HEADER_STDBOOL
|
||||
AC_C_INLINE
|
||||
AC_TYPE_INT32_T
|
||||
AC_TYPE_INT64_T
|
||||
AC_TYPE_SIZE_T
|
||||
AC_TYPE_UINT16_T
|
||||
AC_TYPE_UINT32_T
|
||||
AC_TYPE_UINT64_T
|
||||
AC_TYPE_UINT8_T
|
||||
|
||||
# Checks for library functions.
|
||||
AC_FUNC_ERROR_AT_LINE
|
||||
|
||||
AC_CONFIG_FILES([makefile])
|
||||
|
||||
AC_OUTPUT
|
36
external/cglm/docs/make.bat
vendored
36
external/cglm/docs/make.bat
vendored
|
@ -1,36 +0,0 @@
|
|||
@ECHO OFF
|
||||
|
||||
pushd %~dp0
|
||||
|
||||
REM Command file for Sphinx documentation
|
||||
|
||||
if "%SPHINXBUILD%" == "" (
|
||||
set SPHINXBUILD=python -msphinx
|
||||
)
|
||||
set SOURCEDIR=source
|
||||
set BUILDDIR=build
|
||||
set SPHINXPROJ=cglm
|
||||
|
||||
if "%1" == "" goto help
|
||||
|
||||
%SPHINXBUILD% >NUL 2>NUL
|
||||
if errorlevel 9009 (
|
||||
echo.
|
||||
echo.The Sphinx module was not found. Make sure you have Sphinx installed,
|
||||
echo.then set the SPHINXBUILD environment variable to point to the full
|
||||
echo.path of the 'sphinx-build' executable. Alternatively you may add the
|
||||
echo.Sphinx directory to PATH.
|
||||
echo.
|
||||
echo.If you don't have Sphinx installed, grab it from
|
||||
echo.http://sphinx-doc.org/
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS%
|
||||
goto end
|
||||
|
||||
:help
|
||||
%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS%
|
||||
|
||||
:end
|
||||
popd
|
99
external/cglm/docs/source/affine-mat.rst
vendored
99
external/cglm/docs/source/affine-mat.rst
vendored
|
@ -1,99 +0,0 @@
|
|||
.. 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
343
external/cglm/docs/source/affine.rst
vendored
|
@ -1,343 +0,0 @@
|
|||
.. 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
48
external/cglm/docs/source/api.rst
vendored
|
@ -1,48 +0,0 @@
|
|||
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
181
external/cglm/docs/source/box.rst
vendored
|
@ -1,181 +0,0 @@
|
|||
.. 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
|
52
external/cglm/docs/source/build.rst
vendored
52
external/cglm/docs/source/build.rst
vendored
|
@ -1,52 +0,0 @@
|
|||
Building cglm
|
||||
================================
|
||||
|
||||
| **cglm** does not have external dependencies except for unit testing.
|
||||
| When you pulled cglm repo with submodules all dependencies will be pulled too.
|
||||
| `build-deps.sh` will pull all dependencies/submodules and build for you.
|
||||
|
||||
External dependencies:
|
||||
* cmocka - for unit testing
|
||||
|
||||
**NOTE:**
|
||||
If you only need to inline versions, you don't need to build **cglm**, you don't need to link it to your program.
|
||||
Just import cglm to your project as dependency / external lib by copy-paste then use it as usual
|
||||
|
||||
**Unix (Autotools):**
|
||||
|
||||
.. code-block:: bash
|
||||
:linenos:
|
||||
|
||||
$ sh ./build-deps.sh # run this only once (dependencies)
|
||||
|
||||
$ sh autogen.sh
|
||||
$ ./configure
|
||||
$ make
|
||||
$ make check # run tests (optional)
|
||||
$ [sudo] make install # install to system (optional)
|
||||
|
||||
**make** will build cglm to **.libs** sub folder in project folder.
|
||||
If you don't want to install cglm to your system's folder you can get static and dynamic libs in this folder.
|
||||
|
||||
**Build dependencies (windows):**
|
||||
|
||||
Windows related build files, project files are located in win folder,
|
||||
make sure you are inside in cglm/win folder.
|
||||
|
||||
Code Analysis are enabled, it may take awhile to build.
|
||||
|
||||
.. code-block:: bash
|
||||
:linenos:
|
||||
|
||||
$ cd win
|
||||
$ .\build.bat
|
||||
|
||||
if *msbuild* is not worked (because of multi versions of Visual Studio)
|
||||
then try to build with *devenv*:
|
||||
|
||||
.. code-block:: bash
|
||||
:linenos:
|
||||
|
||||
$ devenv cglm.sln /Build Release
|
||||
|
||||
Currently tests are not available on Windows.
|
19
external/cglm/docs/source/call.rst
vendored
19
external/cglm/docs/source/call.rst
vendored
|
@ -1,19 +0,0 @@
|
|||
.. 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
302
external/cglm/docs/source/cam.rst
vendored
|
@ -1,302 +0,0 @@
|
|||
.. 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
BIN
external/cglm/docs/source/cglm-intro.png
vendored
Binary file not shown.
Before Width: | Height: | Size: 72 KiB |
34
external/cglm/docs/source/color.rst
vendored
34
external/cglm/docs/source/color.rst
vendored
|
@ -1,34 +0,0 @@
|
|||
.. 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
|
199
external/cglm/docs/source/conf.py
vendored
199
external/cglm/docs/source/conf.py
vendored
|
@ -1,199 +0,0 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
# cglm documentation build configuration file, created by
|
||||
# sphinx-quickstart on Tue Jun 6 20:31:05 2017.
|
||||
#
|
||||
# This file is execfile()d with the current directory set to its
|
||||
# containing dir.
|
||||
#
|
||||
# Note that not all possible configuration values are present in this
|
||||
# autogenerated file.
|
||||
#
|
||||
# All configuration values have a default; values that are commented out
|
||||
# serve to show the default.
|
||||
|
||||
# If extensions (or modules to document with autodoc) are in another directory,
|
||||
# add these directories to sys.path here. If the directory is relative to the
|
||||
# documentation root, use os.path.abspath to make it absolute, like shown here.
|
||||
#
|
||||
# import os
|
||||
# import sys
|
||||
# sys.path.insert(0, os.path.abspath('.'))
|
||||
|
||||
|
||||
# -- General configuration ------------------------------------------------
|
||||
|
||||
# If your documentation needs a minimal Sphinx version, state it here.
|
||||
#
|
||||
# needs_sphinx = '1.0'
|
||||
|
||||
# Add any Sphinx extension module names here, as strings. They can be
|
||||
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
|
||||
# ones.
|
||||
extensions = [
|
||||
'sphinx.ext.doctest',
|
||||
'sphinx.ext.todo',
|
||||
'sphinx.ext.coverage',
|
||||
'sphinx.ext.mathjax',
|
||||
'sphinx.ext.ifconfig',
|
||||
'sphinx.ext.viewcode',
|
||||
'sphinx.ext.githubpages'
|
||||
]
|
||||
|
||||
# Add any paths that contain templates here, relative to this directory.
|
||||
templates_path = ['_templates']
|
||||
|
||||
# The suffix(es) of source filenames.
|
||||
# You can specify multiple suffix as a list of string:
|
||||
#
|
||||
# source_suffix = ['.rst', '.md']
|
||||
source_suffix = '.rst'
|
||||
|
||||
# The master toctree document.
|
||||
master_doc = 'index'
|
||||
|
||||
# General information about the project.
|
||||
project = u'cglm'
|
||||
copyright = u'2017, Recep Aslantas'
|
||||
author = u'Recep Aslantas'
|
||||
|
||||
# The version info for the project you're documenting, acts as replacement for
|
||||
# |version| and |release|, also used in various other places throughout the
|
||||
# built documents.
|
||||
#
|
||||
# The short X.Y version.
|
||||
version = u'0.4.8'
|
||||
# The full version, including alpha/beta/rc tags.
|
||||
release = u'0.4.8'
|
||||
|
||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||
# for a list of supported languages.
|
||||
#
|
||||
# This is also used if you do content translation via gettext catalogs.
|
||||
# Usually you set "language" from the command line for these cases.
|
||||
language = None
|
||||
|
||||
# List of patterns, relative to source directory, that match files and
|
||||
# directories to ignore when looking for source files.
|
||||
# This patterns also effect to html_static_path and html_extra_path
|
||||
exclude_patterns = []
|
||||
|
||||
# The name of the Pygments (syntax highlighting) style to use.
|
||||
pygments_style = 'sphinx'
|
||||
|
||||
# If true, `todo` and `todoList` produce output, else they produce nothing.
|
||||
todo_include_todos = False
|
||||
|
||||
|
||||
# -- Options for HTML output ----------------------------------------------
|
||||
|
||||
# The theme to use for HTML and HTML Help pages. See the documentation for
|
||||
# a list of builtin themes.
|
||||
#
|
||||
html_theme = 'alabaster'
|
||||
|
||||
# Theme options are theme-specific and customize the look and feel of a theme
|
||||
# further. For a list of options available for each theme, see the
|
||||
# documentation.
|
||||
#
|
||||
# html_theme_options = {}
|
||||
|
||||
html_theme_options = {
|
||||
'github_banner': 'true',
|
||||
'github_button': 'true',
|
||||
'github_user': 'recp',
|
||||
'github_repo': 'cglm',
|
||||
'travis_button': 'true',
|
||||
'show_related': 'true',
|
||||
'fixed_sidebar': 'true'
|
||||
}
|
||||
|
||||
# Add any paths that contain custom static files (such as style sheets) here,
|
||||
# relative to this directory. They are copied after the builtin static files,
|
||||
# so a file named "default.css" will overwrite the builtin "default.css".
|
||||
html_static_path = ['_static']
|
||||
|
||||
|
||||
# -- Options for HTMLHelp output ------------------------------------------
|
||||
|
||||
# Output file base name for HTML help builder.
|
||||
htmlhelp_basename = 'cglmdoc'
|
||||
|
||||
|
||||
# -- Options for LaTeX output ---------------------------------------------
|
||||
|
||||
latex_elements = {
|
||||
# The paper size ('letterpaper' or 'a4paper').
|
||||
#
|
||||
# 'papersize': 'letterpaper',
|
||||
|
||||
# The font size ('10pt', '11pt' or '12pt').
|
||||
#
|
||||
# 'pointsize': '10pt',
|
||||
|
||||
# Additional stuff for the LaTeX preamble.
|
||||
#
|
||||
# 'preamble': '',
|
||||
|
||||
# Latex figure (float) alignment
|
||||
#
|
||||
# 'figure_align': 'htbp',
|
||||
}
|
||||
|
||||
# Grouping the document tree into LaTeX files. List of tuples
|
||||
# (source start file, target name, title,
|
||||
# author, documentclass [howto, manual, or own class]).
|
||||
latex_documents = [
|
||||
(master_doc, 'cglm.tex', u'cglm Documentation',
|
||||
u'Recep Aslantas', 'manual'),
|
||||
]
|
||||
|
||||
|
||||
# -- Options for manual page output ---------------------------------------
|
||||
|
||||
# One entry per manual page. List of tuples
|
||||
# (source start file, name, description, authors, manual section).
|
||||
man_pages = [
|
||||
(master_doc, 'cglm', u'cglm Documentation',
|
||||
[author], 1)
|
||||
]
|
||||
|
||||
|
||||
# -- Options for Texinfo output -------------------------------------------
|
||||
|
||||
# Grouping the document tree into Texinfo files. List of tuples
|
||||
# (source start file, target name, title, author,
|
||||
# dir menu entry, description, category)
|
||||
texinfo_documents = [
|
||||
(master_doc, 'cglm', u'cglm Documentation',
|
||||
author, 'cglm', 'One line description of project.',
|
||||
'Miscellaneous'),
|
||||
]
|
||||
|
||||
# -- Options for Epub output -------------------------------------------------
|
||||
|
||||
# Bibliographic Dublin Core info.
|
||||
epub_title = project
|
||||
epub_author = author
|
||||
epub_publisher = author
|
||||
epub_copyright = copyright
|
||||
|
||||
# The unique identifier of the text. This can be a ISBN number
|
||||
# or the project homepage.
|
||||
#
|
||||
# epub_identifier = ''
|
||||
|
||||
# A unique identification for the text.
|
||||
#
|
||||
# epub_uid = ''
|
||||
|
||||
# A list of files that should not be packed into the epub file.
|
||||
epub_exclude_files = ['search.html']
|
||||
|
||||
|
||||
# -- Extension configuration -------------------------------------------------
|
||||
|
||||
# -- Options for todo extension ----------------------------------------------
|
||||
|
||||
# If true, `todo` and `todoList` produce output, else they produce nothing.
|
||||
todo_include_todos = True
|
182
external/cglm/docs/source/euler.rst
vendored
182
external/cglm/docs/source/euler.rst
vendored
|
@ -1,182 +0,0 @@
|
|||
.. 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
168
external/cglm/docs/source/frustum.rst
vendored
|
@ -1,168 +0,0 @@
|
|||
.. 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]
|
103
external/cglm/docs/source/getting_started.rst
vendored
103
external/cglm/docs/source/getting_started.rst
vendored
|
@ -1,103 +0,0 @@
|
|||
Getting Started
|
||||
================================
|
||||
|
||||
Types:
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
**cglm** uses **glm** prefix for all functions e.g. glm_lookat. You can see supported types in common header file:
|
||||
|
||||
.. code-block:: c
|
||||
:linenos:
|
||||
|
||||
typedef float vec3[3];
|
||||
typedef int ivec3[3];
|
||||
typedef CGLM_ALIGN(16) float vec4[4];
|
||||
|
||||
typedef vec3 mat3[3];
|
||||
typedef vec4 mat4[4];
|
||||
|
||||
typedef vec4 versor;
|
||||
|
||||
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*
|
||||
|
||||
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*
|
||||
* Pre-compiled - *glmc_, glmc_u*
|
||||
|
||||
For instance **glm_mat4_mul** is inline (all *glm_* functions are inline), to make it non-inline (pre-compiled),
|
||||
call it as **glmc_mat4_mul** from library, to use unaligned version use **glm_umat4_mul** (todo).
|
||||
|
||||
Most functions have **dest** parameter for output. For instance mat4_mul func looks like this:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat4_mul(mat4 m1, mat4 m2, mat4 dest)
|
||||
|
||||
The dest parameter is out parameter. Result will be stored in **dest**.
|
||||
Also in this case matrix multiplication order is dest = m1 * m2.
|
||||
|
||||
* Changing parameter order will change the multiplication order.
|
||||
* You can pass all parameter same (this is similar to m1 `*=` m1), you can pass **dest** as m1 or m2 (this is similar to m1 `*=` m2)
|
||||
|
||||
**v** postfix in function names
|
||||
-------------------------------
|
||||
|
||||
You may see **v** postfix in some function names, v stands for vector.
|
||||
For instance consider a function that accepts three parameters x, y, z.
|
||||
This function may be overloaded by **v** postfix to accept vector (vec3) instead of separate parameters.
|
||||
In some places the v means that it will be apply to a vector.
|
||||
|
||||
**_to** postfix in function names
|
||||
---------------------------------
|
||||
|
||||
*_to* version of function will store the result in specified parameter instead of in-out parameter.
|
||||
Some functions don't have _to prefix but they still behave like this e.g. glm_mat4_mul.
|
51
external/cglm/docs/source/index.rst
vendored
51
external/cglm/docs/source/index.rst
vendored
|
@ -1,51 +0,0 @@
|
|||
.. cglm documentation master file, created by
|
||||
sphinx-quickstart on Tue Jun 6 20:31:05 2017.
|
||||
You can adapt this file completely to your liking, but it should at least
|
||||
contain the root `toctree` directive.
|
||||
|
||||
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 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.
|
||||
|
||||
**Features**
|
||||
|
||||
* general purpose matrix operations (mat4, mat3)
|
||||
* chain matrix multiplication (square only)
|
||||
* general purpose vector operations (cross, dot, rotate, proj, angle...)
|
||||
* affine transforms
|
||||
* matrix decomposition (extract rotation, scaling factor)
|
||||
* optimized affine transform matrices (mul, rigid-body inverse)
|
||||
* camera (lookat)
|
||||
* projections (ortho, perspective)
|
||||
* quaternions
|
||||
* euler angles / yaw-pitch-roll to matrix
|
||||
* extract euler angles
|
||||
* inline or pre-compiled function call
|
||||
* frustum (extract view frustum planes, corners...)
|
||||
* bounding box (AABB in Frustum (culling), crop, merge...)
|
||||
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
:caption: Table Of Contents:
|
||||
|
||||
build
|
||||
getting_started
|
||||
opengl
|
||||
api
|
||||
opt
|
||||
troubleshooting
|
||||
|
||||
Indices and tables
|
||||
==================
|
||||
|
||||
* :ref:`genindex`
|
||||
* :ref:`modindex`
|
||||
* :ref:`search`
|
102
external/cglm/docs/source/io.rst
vendored
102
external/cglm/docs/source/io.rst
vendored
|
@ -1,102 +0,0 @@
|
|||
.. 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
143
external/cglm/docs/source/mat3.rst
vendored
|
@ -1,143 +0,0 @@
|
|||
.. 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
240
external/cglm/docs/source/mat4.rst
vendored
|
@ -1,240 +0,0 @@
|
|||
.. 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
61
external/cglm/docs/source/opengl.rst
vendored
|
@ -1,61 +0,0 @@
|
|||
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
42
external/cglm/docs/source/opt.rst
vendored
|
@ -1,42 +0,0 @@
|
|||
.. 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
33
external/cglm/docs/source/plane.rst
vendored
|
@ -1,33 +0,0 @@
|
|||
.. 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
102
external/cglm/docs/source/project.rst
vendored
|
@ -1,102 +0,0 @@
|
|||
.. 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
380
external/cglm/docs/source/quat.rst
vendored
|
@ -1,380 +0,0 @@
|
|||
.. 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
74
external/cglm/docs/source/sphere.rst
vendored
|
@ -1,74 +0,0 @@
|
|||
.. 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
79
external/cglm/docs/source/troubleshooting.rst
vendored
|
@ -1,79 +0,0 @@
|
|||
.. 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
173
external/cglm/docs/source/util.rst
vendored
|
@ -1,173 +0,0 @@
|
|||
.. 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
143
external/cglm/docs/source/vec3-ext.rst
vendored
|
@ -1,143 +0,0 @@
|
|||
.. 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
437
external/cglm/docs/source/vec3.rst
vendored
|
@ -1,437 +0,0 @@
|
|||
.. 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
138
external/cglm/docs/source/vec4-ext.rst
vendored
|
@ -1,138 +0,0 @@
|
|||
.. 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
345
external/cglm/docs/source/vec4.rst
vendored
|
@ -1,345 +0,0 @@
|
|||
.. 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
|
15
external/cglm/gen-glmcall-header.py
vendored
15
external/cglm/gen-glmcall-header.py
vendored
|
@ -1,15 +0,0 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import pathlib
|
||||
import re
|
||||
|
||||
api_regex = re.compile(r'^CGLM_EXPORT\s*.*?\s*glmc_([a-zA-Z_0-9]*)', re.DOTALL | re.MULTILINE)
|
||||
inc_path = pathlib.Path(__file__).parent / 'include' / 'cglm'
|
||||
|
||||
with (inc_path / 'glm2call.h').open('w') as out:
|
||||
print('\n// Auto-generated, do not modify.', file=out)
|
||||
|
||||
for path in (inc_path / 'call').glob('**/*.h'):
|
||||
print('\n// {0}'.format(path.relative_to(inc_path)), file=out)
|
||||
for name in api_regex.findall(path.read_text()):
|
||||
print('#undef glm_{0}\n#define glm_{0} glmc_{0}'.format(name), file=out)
|
168
external/cglm/include/cglm/affine-mat.h
vendored
168
external/cglm/include/cglm/affine-mat.h
vendored
|
@ -1,168 +0,0 @@
|
|||
/*
|
||||
* Copyright (c), Recep Aslantas.
|
||||
*
|
||||
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||
* Full license can be found in the LICENSE file
|
||||
*/
|
||||
|
||||
/*
|
||||
Functions:
|
||||
CGLM_INLINE void glm_mul(mat4 m1, mat4 m2, mat4 dest);
|
||||
CGLM_INLINE void glm_inv_tr(mat4 mat);
|
||||
*/
|
||||
|
||||
#ifndef cglm_affine_mat_h
|
||||
#define cglm_affine_mat_h
|
||||
|
||||
#include "common.h"
|
||||
#include "mat4.h"
|
||||
#include "mat3.h"
|
||||
|
||||
#ifdef CGLM_SSE_FP
|
||||
# include "simd/sse2/affine.h"
|
||||
#endif
|
||||
|
||||
#ifdef CGLM_AVX_FP
|
||||
# include "simd/avx/affine.h"
|
||||
#endif
|
||||
|
||||
/*!
|
||||
* @brief this is similar to glm_mat4_mul but specialized to affine transform
|
||||
*
|
||||
* Matrix format should be:
|
||||
* 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
|
||||
*
|
||||
* @param[in] m1 affine matrix 1
|
||||
* @param[in] m2 affine matrix 2
|
||||
* @param[out] dest result matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mul(mat4 m1, mat4 m2, mat4 dest) {
|
||||
#ifdef __AVX__
|
||||
glm_mul_avx(m1, m2, dest);
|
||||
#elif defined( __SSE__ ) || defined( __SSE2__ )
|
||||
glm_mul_sse2(m1, m2, dest);
|
||||
#else
|
||||
float a00 = m1[0][0], a01 = m1[0][1], a02 = m1[0][2], a03 = m1[0][3],
|
||||
a10 = m1[1][0], a11 = m1[1][1], a12 = m1[1][2], a13 = m1[1][3],
|
||||
a20 = m1[2][0], a21 = m1[2][1], a22 = m1[2][2], a23 = m1[2][3],
|
||||
a30 = m1[3][0], a31 = m1[3][1], a32 = m1[3][2], a33 = m1[3][3],
|
||||
|
||||
b00 = m2[0][0], b01 = m2[0][1], b02 = m2[0][2],
|
||||
b10 = m2[1][0], b11 = m2[1][1], b12 = m2[1][2],
|
||||
b20 = m2[2][0], b21 = m2[2][1], b22 = m2[2][2],
|
||||
b30 = m2[3][0], b31 = m2[3][1], b32 = m2[3][2], b33 = m2[3][3];
|
||||
|
||||
dest[0][0] = a00 * b00 + a10 * b01 + a20 * b02;
|
||||
dest[0][1] = a01 * b00 + a11 * b01 + a21 * b02;
|
||||
dest[0][2] = a02 * b00 + a12 * b01 + a22 * b02;
|
||||
dest[0][3] = a03 * b00 + a13 * b01 + a23 * b02;
|
||||
|
||||
dest[1][0] = a00 * b10 + a10 * b11 + a20 * b12;
|
||||
dest[1][1] = a01 * b10 + a11 * b11 + a21 * b12;
|
||||
dest[1][2] = a02 * b10 + a12 * b11 + a22 * b12;
|
||||
dest[1][3] = a03 * b10 + a13 * b11 + a23 * b12;
|
||||
|
||||
dest[2][0] = a00 * b20 + a10 * b21 + a20 * b22;
|
||||
dest[2][1] = a01 * b20 + a11 * b21 + a21 * b22;
|
||||
dest[2][2] = a02 * b20 + a12 * b21 + a22 * b22;
|
||||
dest[2][3] = a03 * b20 + a13 * b21 + a23 * b22;
|
||||
|
||||
dest[3][0] = a00 * b30 + a10 * b31 + a20 * b32 + a30 * b33;
|
||||
dest[3][1] = a01 * b30 + a11 * b31 + a21 * b32 + a31 * b33;
|
||||
dest[3][2] = a02 * b30 + a12 * b31 + a22 * b32 + a32 * b33;
|
||||
dest[3][3] = a03 * b30 + a13 * b31 + a23 * b32 + a33 * b33;
|
||||
#endif
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief 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)
|
||||
*
|
||||
* @code
|
||||
* X = | R T | X' = | R' -R'T |
|
||||
* | 0 1 | | 0 1 |
|
||||
* @endcode
|
||||
*
|
||||
* @param[in,out] mat matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_inv_tr(mat4 mat) {
|
||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||
glm_inv_tr_sse2(mat);
|
||||
#else
|
||||
CGLM_ALIGN(16) mat3 r;
|
||||
CGLM_ALIGN(16) vec3 t;
|
||||
|
||||
/* rotate */
|
||||
glm_mat4_pick3t(mat, r);
|
||||
glm_mat4_ins3(r, mat);
|
||||
|
||||
/* translate */
|
||||
glm_mat3_mulv(r, mat[3], t);
|
||||
glm_vec_flipsign(t);
|
||||
glm_vec_copy(t, mat[3]);
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif /* cglm_affine_mat_h */
|
490
external/cglm/include/cglm/affine.h
vendored
490
external/cglm/include/cglm/affine.h
vendored
|
@ -1,490 +0,0 @@
|
|||
/*
|
||||
* Copyright (c), Recep Aslantas.
|
||||
*
|
||||
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||
* Full license can be found in the LICENSE file
|
||||
*/
|
||||
|
||||
/*
|
||||
Functions:
|
||||
CGLM_INLINE void glm_translate_to(mat4 m, vec3 v, mat4 dest);
|
||||
CGLM_INLINE void glm_translate(mat4 m, vec3 v);
|
||||
CGLM_INLINE void glm_translate_x(mat4 m, float to);
|
||||
CGLM_INLINE void glm_translate_y(mat4 m, float to);
|
||||
CGLM_INLINE void glm_translate_z(mat4 m, float to);
|
||||
CGLM_INLINE void glm_translate_make(mat4 m, vec3 v);
|
||||
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_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_make(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);
|
||||
CGLM_INLINE void glm_decompose(mat4 m, vec4 t, mat4 r, vec3 s);
|
||||
*/
|
||||
|
||||
#ifndef cglm_affine_h
|
||||
#define cglm_affine_h
|
||||
|
||||
#include "common.h"
|
||||
#include "util.h"
|
||||
#include "vec3.h"
|
||||
#include "vec4.h"
|
||||
#include "mat4.h"
|
||||
#include "affine-mat.h"
|
||||
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat4_mul(mat4 m1, mat4 m2, mat4 dest);
|
||||
|
||||
/*!
|
||||
* @brief translate existing transform matrix by v vector
|
||||
* and stores result in same matrix
|
||||
*
|
||||
* @param[in, out] m affine transfrom
|
||||
* @param[in] v translate vector [x, y, z]
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_translate(mat4 m, vec3 v) {
|
||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||
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;
|
||||
|
||||
glm_vec4_scale(m[0], v[0], v1);
|
||||
glm_vec4_scale(m[1], v[1], v2);
|
||||
glm_vec4_scale(m[2], v[2], v3);
|
||||
|
||||
glm_vec4_add(v1, m[3], m[3]);
|
||||
glm_vec4_add(v2, m[3], m[3]);
|
||||
glm_vec4_add(v3, m[3], m[3]);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*!
|
||||
* @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
|
||||
*
|
||||
* @param[in, out] m affine transfrom
|
||||
* @param[in] x x factor
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_translate_x(mat4 m, float x) {
|
||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||
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;
|
||||
glm_vec4_scale(m[0], x, v1);
|
||||
glm_vec4_add(v1, m[3], m[3]);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief translate existing transform matrix by y factor
|
||||
*
|
||||
* @param[in, out] m affine transfrom
|
||||
* @param[in] y y factor
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_translate_y(mat4 m, float y) {
|
||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||
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;
|
||||
glm_vec4_scale(m[1], y, v1);
|
||||
glm_vec4_add(v1, m[3], m[3]);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief translate existing transform matrix by z factor
|
||||
*
|
||||
* @param[in, out] m affine transfrom
|
||||
* @param[in] z z factor
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_translate_z(mat4 m, float z) {
|
||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||
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;
|
||||
glm_vec4_scale(m[2], z, v1);
|
||||
glm_vec4_add(v1, m[3], m[3]);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief creates NEW translate transform matrix by v vector
|
||||
*
|
||||
* @param[out] m affine transfrom
|
||||
* @param[in] v translate vector [x, y, z]
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_translate_make(mat4 m, vec3 v) {
|
||||
glm_mat4_identity(m);
|
||||
glm_vec_copy(v, m[3]);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief scale existing transform matrix by v vector
|
||||
* and store result in dest
|
||||
*
|
||||
* @param[in] m affine transfrom
|
||||
* @param[in] v scale vector [x, y, z]
|
||||
* @param[out] dest scaled matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_scale_to(mat4 m, vec3 v, mat4 dest) {
|
||||
glm_vec4_scale(m[0], v[0], dest[0]);
|
||||
glm_vec4_scale(m[1], v[1], dest[1]);
|
||||
glm_vec4_scale(m[2], v[2], dest[2]);
|
||||
|
||||
glm_vec4_copy(m[3], dest[3]);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief creates NEW scale matrix by v vector
|
||||
*
|
||||
* @param[out] m affine transfrom
|
||||
* @param[in] v scale vector [x, y, z]
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_scale_make(mat4 m, vec3 v) {
|
||||
glm_mat4_identity(m);
|
||||
m[0][0] = v[0];
|
||||
m[1][1] = v[1];
|
||||
m[2][2] = v[2];
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief scales existing transform matrix by v vector
|
||||
* and stores result in same matrix
|
||||
*
|
||||
* @param[in, out] m affine transfrom
|
||||
* @param[in] v scale vector [x, y, z]
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_scale(mat4 m, vec3 v) {
|
||||
glm_scale_to(m, v, m);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief applies uniform scale to existing transform matrix v = [s, s, s]
|
||||
* and stores result in same matrix
|
||||
*
|
||||
* @param[in, out] m affine transfrom
|
||||
* @param[in] s scale factor
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_scale_uni(mat4 m, float s) {
|
||||
CGLM_ALIGN(8) vec3 v = { s, s, s };
|
||||
glm_scale_to(m, v, m);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief rotate existing transform matrix around X axis by angle
|
||||
* and store result in dest
|
||||
*
|
||||
* @param[in] m affine transfrom
|
||||
* @param[in] angle angle (radians)
|
||||
* @param[out] dest rotated matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_rotate_x(mat4 m, float angle, mat4 dest) {
|
||||
CGLM_ALIGN(16) mat4 t = GLM_MAT4_IDENTITY_INIT;
|
||||
float c, s;
|
||||
|
||||
c = cosf(angle);
|
||||
s = sinf(angle);
|
||||
|
||||
t[1][1] = c;
|
||||
t[1][2] = s;
|
||||
t[2][1] = -s;
|
||||
t[2][2] = c;
|
||||
|
||||
glm_mul_rot(m, t, dest);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief rotate existing transform matrix around Y axis by angle
|
||||
* and store result in dest
|
||||
*
|
||||
* @param[in] m affine transfrom
|
||||
* @param[in] angle angle (radians)
|
||||
* @param[out] dest rotated matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_rotate_y(mat4 m, float angle, mat4 dest) {
|
||||
CGLM_ALIGN(16) mat4 t = GLM_MAT4_IDENTITY_INIT;
|
||||
float c, s;
|
||||
|
||||
c = cosf(angle);
|
||||
s = sinf(angle);
|
||||
|
||||
t[0][0] = c;
|
||||
t[0][2] = -s;
|
||||
t[2][0] = s;
|
||||
t[2][2] = c;
|
||||
|
||||
glm_mul_rot(m, t, dest);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief rotate existing transform matrix around Z axis by angle
|
||||
* and store result in dest
|
||||
*
|
||||
* @param[in] m affine transfrom
|
||||
* @param[in] angle angle (radians)
|
||||
* @param[out] dest rotated matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_rotate_z(mat4 m, float angle, mat4 dest) {
|
||||
CGLM_ALIGN(16) mat4 t = GLM_MAT4_IDENTITY_INIT;
|
||||
float c, s;
|
||||
|
||||
c = cosf(angle);
|
||||
s = sinf(angle);
|
||||
|
||||
t[0][0] = c;
|
||||
t[0][1] = s;
|
||||
t[1][0] = -s;
|
||||
t[1][1] = c;
|
||||
|
||||
glm_mul_rot(m, t, dest);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief creates NEW rotation matrix by angle and axis
|
||||
*
|
||||
* axis will be normalized so you don't need to normalize it
|
||||
*
|
||||
* @param[out] m affine transfrom
|
||||
* @param[in] angle angle (radians)
|
||||
* @param[in] axis axis
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_rotate_make(mat4 m, float angle, vec3 axis) {
|
||||
CGLM_ALIGN(8) vec3 axisn, v, vs;
|
||||
float c;
|
||||
|
||||
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 given axis by angle
|
||||
*
|
||||
* @param[in, out] m affine transfrom
|
||||
* @param[in] angle angle (radians)
|
||||
* @param[in] axis axis
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_rotate(mat4 m, float angle, vec3 axis) {
|
||||
CGLM_ALIGN(16) mat4 rot;
|
||||
glm_rotate_make(rot, angle, axis);
|
||||
glm_mul_rot(m, rot, m);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @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);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief decompose scale vector
|
||||
*
|
||||
* @param[in] m affine transform
|
||||
* @param[out] s scale vector (Sx, Sy, Sz)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_decompose_scalev(mat4 m, vec3 s) {
|
||||
s[0] = glm_vec_norm(m[0]);
|
||||
s[1] = glm_vec_norm(m[1]);
|
||||
s[2] = glm_vec_norm(m[2]);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief returns true if matrix is uniform scaled. This is helpful for
|
||||
* creating normal matrix.
|
||||
*
|
||||
* @param[in] m m
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
CGLM_INLINE
|
||||
bool
|
||||
glm_uniscaled(mat4 m) {
|
||||
CGLM_ALIGN(8) vec3 s;
|
||||
glm_decompose_scalev(m, s);
|
||||
return glm_vec_eq_all(s);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief decompose rotation matrix (mat4) and scale vector [Sx, Sy, Sz]
|
||||
* DON'T pass projected matrix here
|
||||
*
|
||||
* @param[in] m affine transform
|
||||
* @param[out] r rotation matrix
|
||||
* @param[out] s scale matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_decompose_rs(mat4 m, mat4 r, vec3 s) {
|
||||
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]);
|
||||
glm_vec4_copy(m[2], r[2]);
|
||||
glm_vec4_copy(t, r[3]);
|
||||
|
||||
s[0] = glm_vec_norm(m[0]);
|
||||
s[1] = glm_vec_norm(m[1]);
|
||||
s[2] = glm_vec_norm(m[2]);
|
||||
|
||||
glm_vec4_scale(r[0], 1.0f/s[0], r[0]);
|
||||
glm_vec4_scale(r[1], 1.0f/s[1], r[1]);
|
||||
glm_vec4_scale(r[2], 1.0f/s[2], r[2]);
|
||||
|
||||
/* Note from Apple Open Source (asume that the matrix is orthonormal):
|
||||
check for a coordinate system flip. If the determinant
|
||||
is -1, then negate the matrix and the scaling factors. */
|
||||
glm_vec_cross(m[0], m[1], v);
|
||||
if (glm_vec_dot(v, m[2]) < 0.0f) {
|
||||
glm_vec4_flipsign(r[0]);
|
||||
glm_vec4_flipsign(r[1]);
|
||||
glm_vec4_flipsign(r[2]);
|
||||
glm_vec_flipsign(s);
|
||||
}
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief decompose affine transform, TODO: extract shear factors.
|
||||
* DON'T pass projected matrix here
|
||||
*
|
||||
* @param[in] m affine transfrom
|
||||
* @param[out] t translation vector
|
||||
* @param[out] r rotation matrix (mat4)
|
||||
* @param[out] s scaling vector [X, Y, Z]
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_decompose(mat4 m, vec4 t, mat4 r, vec3 s) {
|
||||
glm_vec4_copy(m[3], t);
|
||||
glm_decompose_rs(m, r, s);
|
||||
}
|
||||
|
||||
#endif /* cglm_affine_h */
|
283
external/cglm/include/cglm/box.h
vendored
283
external/cglm/include/cglm/box.h
vendored
|
@ -1,283 +0,0 @@
|
|||
/*
|
||||
* Copyright (c), Recep Aslantas.
|
||||
*
|
||||
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||
* Full license can be found in the LICENSE file
|
||||
*/
|
||||
|
||||
#ifndef cglm_box_h
|
||||
#define cglm_box_h
|
||||
|
||||
#include "common.h"
|
||||
#include "vec3.h"
|
||||
#include "vec4.h"
|
||||
#include "util.h"
|
||||
|
||||
/*!
|
||||
* @brief apply transform to Axis-Aligned Bounding Box
|
||||
*
|
||||
* @param[in] box bounding box
|
||||
* @param[in] m transform matrix
|
||||
* @param[out] dest transformed bounding box
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_aabb_transform(vec3 box[2], mat4 m, vec3 dest[2]) {
|
||||
vec3 v[2], xa, xb, ya, yb, za, zb, tmp;
|
||||
|
||||
glm_vec_scale(m[0], box[0][0], xa);
|
||||
glm_vec_scale(m[0], box[1][0], xb);
|
||||
|
||||
glm_vec_scale(m[1], box[0][1], ya);
|
||||
glm_vec_scale(m[1], box[1][1], yb);
|
||||
|
||||
glm_vec_scale(m[2], box[0][2], za);
|
||||
glm_vec_scale(m[2], box[1][2], zb);
|
||||
|
||||
/* min(xa, xb) + min(ya, yb) + min(za, zb) + translation */
|
||||
glm_vec_minv(xa, xb, v[0]);
|
||||
glm_vec_minv(ya, yb, tmp);
|
||||
glm_vec_add(v[0], tmp, v[0]);
|
||||
glm_vec_minv(za, zb, tmp);
|
||||
glm_vec_add(v[0], tmp, v[0]);
|
||||
glm_vec_add(v[0], m[3], v[0]);
|
||||
|
||||
/* max(xa, xb) + max(ya, yb) + max(za, zb) + translation */
|
||||
glm_vec_maxv(xa, xb, v[1]);
|
||||
glm_vec_maxv(ya, yb, tmp);
|
||||
glm_vec_add(v[1], tmp, v[1]);
|
||||
glm_vec_maxv(za, zb, tmp);
|
||||
glm_vec_add(v[1], tmp, v[1]);
|
||||
glm_vec_add(v[1], m[3], v[1]);
|
||||
|
||||
glm_vec_copy(v[0], dest[0]);
|
||||
glm_vec_copy(v[1], dest[1]);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief 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
|
||||
*
|
||||
* @param[in] box1 bounding box 1
|
||||
* @param[in] box2 bounding box 2
|
||||
* @param[out] dest merged bounding box
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_aabb_merge(vec3 box1[2], vec3 box2[2], vec3 dest[2]) {
|
||||
dest[0][0] = glm_min(box1[0][0], box2[0][0]);
|
||||
dest[0][1] = glm_min(box1[0][1], box2[0][1]);
|
||||
dest[0][2] = glm_min(box1[0][2], box2[0][2]);
|
||||
|
||||
dest[1][0] = glm_max(box1[1][0], box2[1][0]);
|
||||
dest[1][1] = glm_max(box1[1][1], box2[1][1]);
|
||||
dest[1][2] = glm_max(box1[1][2], box2[1][2]);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief 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
|
||||
*
|
||||
* @param[in] box bounding box 1
|
||||
* @param[in] cropBox crop box
|
||||
* @param[out] dest cropped bounding box
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_aabb_crop(vec3 box[2], vec3 cropBox[2], vec3 dest[2]) {
|
||||
dest[0][0] = glm_max(box[0][0], cropBox[0][0]);
|
||||
dest[0][1] = glm_max(box[0][1], cropBox[0][1]);
|
||||
dest[0][2] = glm_max(box[0][2], cropBox[0][2]);
|
||||
|
||||
dest[1][0] = glm_min(box[1][0], cropBox[1][0]);
|
||||
dest[1][1] = glm_min(box[1][1], cropBox[1][1]);
|
||||
dest[1][2] = glm_min(box[1][2], cropBox[1][2]);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief 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
|
||||
*
|
||||
* @param[in] box bounding box
|
||||
* @param[in] cropBox crop box
|
||||
* @param[in] clampBox miniumum box
|
||||
* @param[out] dest cropped bounding box
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_aabb_crop_until(vec3 box[2],
|
||||
vec3 cropBox[2],
|
||||
vec3 clampBox[2],
|
||||
vec3 dest[2]) {
|
||||
glm_aabb_crop(box, cropBox, dest);
|
||||
glm_aabb_merge(clampBox, dest, dest);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief 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!
|
||||
*
|
||||
* @param[in] box bounding box
|
||||
* @param[in] planes frustum planes
|
||||
*/
|
||||
CGLM_INLINE
|
||||
bool
|
||||
glm_aabb_frustum(vec3 box[2], vec4 planes[6]) {
|
||||
float *p, dp;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 6; i++) {
|
||||
p = planes[i];
|
||||
dp = p[0] * box[p[0] > 0.0f][0]
|
||||
+ p[1] * box[p[1] > 0.0f][1]
|
||||
+ p[2] * box[p[2] > 0.0f][2];
|
||||
|
||||
if (dp < -p[3])
|
||||
return false;
|
||||
}
|
||||
|
||||
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 */
|
39
external/cglm/include/cglm/call.h
vendored
39
external/cglm/include/cglm/call.h
vendored
|
@ -1,39 +0,0 @@
|
|||
/*
|
||||
* Copyright (c), Recep Aslantas.
|
||||
*
|
||||
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||
* Full license can be found in the LICENSE file
|
||||
*/
|
||||
|
||||
#ifndef cglm_call_h
|
||||
#define cglm_call_h
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "common.h"
|
||||
#include "call/vec3.h"
|
||||
#include "call/vec4.h"
|
||||
#include "call/mat4.h"
|
||||
#include "call/mat3.h"
|
||||
#include "call/affine.h"
|
||||
#include "call/cam.h"
|
||||
#include "call/quat.h"
|
||||
#include "call/euler.h"
|
||||
#include "call/plane.h"
|
||||
#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"
|
||||
// #include "vec3-ext.h"
|
||||
// #include "vec4-ext.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif /* cglm_call_h */
|
117
external/cglm/include/cglm/call/affine.h
vendored
117
external/cglm/include/cglm/call/affine.h
vendored
|
@ -1,117 +0,0 @@
|
|||
/*
|
||||
* Copyright (c), Recep Aslantas.
|
||||
*
|
||||
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||
* Full license can be found in the LICENSE file
|
||||
*/
|
||||
|
||||
#ifndef cglmc_affine_h
|
||||
#define cglmc_affine_h
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#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);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_translate(mat4 m, vec3 v);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_translate_x(mat4 m, float to);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_translate_y(mat4 m, float to);
|
||||
|
||||
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);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_scale(mat4 m, vec3 v);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_scale_uni(mat4 m, float s);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_rotate_x(mat4 m, float rad, mat4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_rotate_y(mat4 m, float rad, mat4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_rotate_z(mat4 m, float rad, mat4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_rotate_make(mat4 m, float angle, vec3 axis);
|
||||
|
||||
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);
|
||||
|
||||
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
|
||||
#endif /* cglmc_affine_h */
|
79
external/cglm/include/cglm/call/box.h
vendored
79
external/cglm/include/cglm/call/box.h
vendored
|
@ -1,79 +0,0 @@
|
|||
/*
|
||||
* Copyright (c), Recep Aslantas.
|
||||
*
|
||||
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||
* Full license can be found in the LICENSE file
|
||||
*/
|
||||
|
||||
#ifndef cglmc_box_h
|
||||
#define cglmc_box_h
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "../common.h"
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_aabb_transform(vec3 box[2], mat4 m, vec3 dest[2]);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_aabb_merge(vec3 box1[2], vec3 box2[2], vec3 dest[2]);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_aabb_crop(vec3 box[2], vec3 cropBox[2], vec3 dest[2]);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_aabb_crop_until(vec3 box[2],
|
||||
vec3 cropBox[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
|
||||
#endif /* cglmc_box_h */
|
||||
|
139
external/cglm/include/cglm/call/cam.h
vendored
139
external/cglm/include/cglm/call/cam.h
vendored
|
@ -1,139 +0,0 @@
|
|||
/*
|
||||
* Copyright (c), Recep Aslantas.
|
||||
*
|
||||
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||
* Full license can be found in the LICENSE file
|
||||
*/
|
||||
|
||||
#ifndef cglmc_cam_h
|
||||
#define cglmc_cam_h
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "../common.h"
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_frustum(float left,
|
||||
float right,
|
||||
float bottom,
|
||||
float top,
|
||||
float nearVal,
|
||||
float farVal,
|
||||
mat4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ortho(float left,
|
||||
float right,
|
||||
float bottom,
|
||||
float top,
|
||||
float nearVal,
|
||||
float farVal,
|
||||
mat4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_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,
|
||||
float aspect,
|
||||
float nearVal,
|
||||
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);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_look(vec3 eye, vec3 dir, vec3 up, mat4 dest);
|
||||
|
||||
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
|
||||
#endif /* cglmc_cam_h */
|
140
external/cglm/include/cglm/call/ease.h
vendored
140
external/cglm/include/cglm/call/ease.h
vendored
|
@ -1,140 +0,0 @@
|
|||
/*
|
||||
* Copyright (c), Recep Aslantas.
|
||||
*
|
||||
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||
* Full license can be found in the LICENSE file
|
||||
*/
|
||||
|
||||
#ifndef cglmc_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 */
|
55
external/cglm/include/cglm/call/euler.h
vendored
55
external/cglm/include/cglm/call/euler.h
vendored
|
@ -1,55 +0,0 @@
|
|||
/*
|
||||
* Copyright (c), Recep Aslantas.
|
||||
*
|
||||
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||
* Full license can be found in the LICENSE file
|
||||
*/
|
||||
|
||||
#ifndef cglmc_euler_h
|
||||
#define cglmc_euler_h
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "../common.h"
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_euler_angles(mat4 m, vec3 dest);
|
||||
|
||||
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);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_euler_zxy(vec3 angles, mat4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_euler_xzy(vec3 angles, mat4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_euler_yzx(vec3 angles, mat4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_euler_yxz(vec3 angles, mat4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_euler_by_order(vec3 angles, glm_euler_sq axis, mat4 dest);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif /* cglmc_euler_h */
|
41
external/cglm/include/cglm/call/frustum.h
vendored
41
external/cglm/include/cglm/call/frustum.h
vendored
|
@ -1,41 +0,0 @@
|
|||
/*
|
||||
* Copyright (c), Recep Aslantas.
|
||||
*
|
||||
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||
* Full license can be found in the LICENSE file
|
||||
*/
|
||||
|
||||
#ifndef cglmc_frustum_h
|
||||
#define cglmc_frustum_h
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "../common.h"
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_frustum_planes(mat4 m, vec4 dest[6]);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_frustum_corners(mat4 invMat, vec4 dest[8]);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_frustum_center(vec4 corners[8], vec4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_frustum_box(vec4 corners[8], mat4 m, vec3 box[2]);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_frustum_corners_at(vec4 corners[8],
|
||||
float splitDist,
|
||||
float farDist,
|
||||
vec4 planeCorners[4]);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif /* cglmc_frustum_h */
|
45
external/cglm/include/cglm/call/io.h
vendored
45
external/cglm/include/cglm/call/io.h
vendored
|
@ -1,45 +0,0 @@
|
|||
/*
|
||||
* Copyright (c), Recep Aslantas.
|
||||
*
|
||||
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||
* Full license can be found in the LICENSE file
|
||||
*/
|
||||
|
||||
#ifndef cglmc_io_h
|
||||
#define cglmc_io_h
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "../common.h"
|
||||
#include <stdio.h>
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat4_print(mat4 matrix,
|
||||
FILE * __restrict ostream);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat3_print(mat3 matrix,
|
||||
FILE * __restrict ostream);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_print(vec4 vec,
|
||||
FILE * __restrict ostream);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec3_print(vec3 vec,
|
||||
FILE * __restrict ostream);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_versor_print(versor vec,
|
||||
FILE * __restrict ostream);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif /* cglmc_io_h */
|
70
external/cglm/include/cglm/call/mat3.h
vendored
70
external/cglm/include/cglm/call/mat3.h
vendored
|
@ -1,70 +0,0 @@
|
|||
/*
|
||||
* Copyright (c), Recep Aslantas.
|
||||
*
|
||||
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||
* Full license can be found in the LICENSE file
|
||||
*/
|
||||
|
||||
#ifndef cglmc_mat3_h
|
||||
#define cglmc_mat3_h
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "../common.h"
|
||||
|
||||
/* DEPRECATED! use _copy, _ucopy versions */
|
||||
#define glmc_mat3_dup(mat, dest) glmc_mat3_copy(mat, dest)
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat3_copy(mat3 mat, mat3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat3_identity(mat3 mat);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat3_mul(mat3 m1, mat3 m2, mat3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat3_transpose_to(mat3 m, mat3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat3_transpose(mat3 m);
|
||||
|
||||
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);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_mat3_det(mat3 mat);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat3_inv(mat3 mat, mat3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat3_swap_col(mat3 mat, int col1, int col2);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat3_swap_row(mat3 mat, int row1, int row2);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif /* cglmc_mat3_h */
|
107
external/cglm/include/cglm/call/mat4.h
vendored
107
external/cglm/include/cglm/call/mat4.h
vendored
|
@ -1,107 +0,0 @@
|
|||
/*
|
||||
* Copyright (c), Recep Aslantas.
|
||||
*
|
||||
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||
* Full license can be found in the LICENSE file
|
||||
*/
|
||||
|
||||
#ifndef cglmc_mat_h
|
||||
#define cglmc_mat_h
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "../common.h"
|
||||
|
||||
/* DEPRECATED! use _copy, _ucopy versions */
|
||||
#define glmc_mat4_udup(mat, dest) glmc_mat4_ucopy(mat, dest)
|
||||
#define glmc_mat4_dup(mat, dest) glmc_mat4_copy(mat, dest)
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat4_ucopy(mat4 mat, mat4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat4_copy(mat4 mat, mat4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat4_identity(mat4 mat);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat4_pick3(mat4 mat, mat3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat4_pick3t(mat4 mat, mat3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat4_ins3(mat3 mat, mat4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat4_mul(mat4 m1, mat4 m2, mat4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
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);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat4_transpose(mat4 m);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat4_scale_p(mat4 m, float s);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat4_scale(mat4 m, float s);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_mat4_det(mat4 mat);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat4_inv(mat4 mat, mat4 dest);
|
||||
|
||||
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);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_mat4_swap_row(mat4 mat, int row1, int row2);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif /* cglmc_mat_h */
|
23
external/cglm/include/cglm/call/plane.h
vendored
23
external/cglm/include/cglm/call/plane.h
vendored
|
@ -1,23 +0,0 @@
|
|||
/*
|
||||
* Copyright (c), Recep Aslantas.
|
||||
*
|
||||
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||
* Full license can be found in the LICENSE file
|
||||
*/
|
||||
|
||||
#ifndef cglmc_plane_h
|
||||
#define cglmc_plane_h
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "../common.h"
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_plane_normalize(vec4 plane);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif /* cglmc_plane_h */
|
33
external/cglm/include/cglm/call/project.h
vendored
33
external/cglm/include/cglm/call/project.h
vendored
|
@ -1,33 +0,0 @@
|
|||
/*
|
||||
* Copyright (c), Recep Aslantas.
|
||||
*
|
||||
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||
* Full license can be found in the LICENSE file
|
||||
*/
|
||||
|
||||
#ifndef cglmc_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 */
|
||||
|
||||
|
151
external/cglm/include/cglm/call/quat.h
vendored
151
external/cglm/include/cglm/call/quat.h
vendored
|
@ -1,151 +0,0 @@
|
|||
/*
|
||||
* Copyright (c), Recep Aslantas.
|
||||
*
|
||||
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||
* Full license can be found in the LICENSE file
|
||||
*/
|
||||
|
||||
#ifndef cglmc_quat_h
|
||||
#define cglmc_quat_h
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "../common.h"
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_quat_identity(versor q);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_quat_init(versor q, float x, float y, float z, float w);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_quat(versor q, float angle, float x, float y, float z);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_quatv(versor q, float angle, vec3 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 p, versor q);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
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
|
||||
glmc_quat_mat4(versor q, mat4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
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
|
||||
}
|
||||
#endif
|
||||
#endif /* cglmc_quat_h */
|
36
external/cglm/include/cglm/call/sphere.h
vendored
36
external/cglm/include/cglm/call/sphere.h
vendored
|
@ -1,36 +0,0 @@
|
|||
/*
|
||||
* Copyright (c), Recep Aslantas.
|
||||
*
|
||||
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||
* Full license can be found in the LICENSE file
|
||||
*/
|
||||
|
||||
#ifndef 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 */
|
240
external/cglm/include/cglm/call/vec3.h
vendored
240
external/cglm/include/cglm/call/vec3.h
vendored
|
@ -1,240 +0,0 @@
|
|||
/*
|
||||
* Copyright (c), Recep Aslantas.
|
||||
*
|
||||
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||
* Full license can be found in the LICENSE file
|
||||
*/
|
||||
|
||||
#ifndef cglmc_vec3_h
|
||||
#define cglmc_vec3_h
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "../common.h"
|
||||
|
||||
/* 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);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec_cross(vec3 a, vec3 b, vec3 d);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_vec_norm(vec3 vec);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_vec_norm2(vec3 vec);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec_normalize_to(vec3 vec, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec_normalize(vec3 v);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec_add(vec3 v1, vec3 v2, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec_adds(vec3 v, float s, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec_sub(vec3 a, vec3 b, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec_subs(vec3 v, float s, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec_mul(vec3 a, vec3 b, vec3 d);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec_scale(vec3 v, float s, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec_scale_as(vec3 v, float s, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec_div(vec3 a, vec3 b, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec_divs(vec3 a, float s, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec_addadd(vec3 a, vec3 b, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec_subadd(vec3 a, vec3 b, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec_muladd(vec3 a, vec3 b, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec_muladds(vec3 a, float s, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec_flipsign(vec3 v);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec_flipsign_to(vec3 v, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec_inv(vec3 v);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec_inv_to(vec3 v, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_vec_angle(vec3 v1, vec3 v2);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec_rotate(vec3 v, float angle, vec3 axis);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec_rotate_m4(mat4 m, vec3 v, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec_rotate_m3(mat3 m, vec3 v, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec_proj(vec3 a, vec3 b, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec_center(vec3 v1, vec3 v2, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_vec_distance2(vec3 v1, vec3 v2);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_vec_distance(vec3 v1, vec3 v2);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec_maxv(vec3 v1, vec3 v2, vec3 dest);
|
||||
|
||||
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
|
||||
#endif /* cglmc_vec3_h */
|
210
external/cglm/include/cglm/call/vec4.h
vendored
210
external/cglm/include/cglm/call/vec4.h
vendored
|
@ -1,210 +0,0 @@
|
|||
/*
|
||||
* Copyright (c), Recep Aslantas.
|
||||
*
|
||||
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||
* Full license can be found in the LICENSE file
|
||||
*/
|
||||
|
||||
#ifndef cglmc_vec4_h
|
||||
#define cglmc_vec4_h
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "../common.h"
|
||||
|
||||
/* DEPRECATED! use _copy, _ucopy versions */
|
||||
#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);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_copy(vec4 v, vec4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_vec4_dot(vec4 a, vec4 b);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_vec4_norm(vec4 vec);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_vec4_norm2(vec4 vec);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_normalize_to(vec4 vec, vec4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_normalize(vec4 v);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_add(vec4 a, vec4 b, vec4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
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
|
||||
glmc_vec4_scale(vec4 v, float s, vec4 dest);
|
||||
|
||||
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);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_inv_to(vec4 v, vec4 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_vec4_distance(vec4 v1, vec4 v2);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec4_maxv(vec4 v1, vec4 v2, vec4 dest);
|
||||
|
||||
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
|
||||
#endif /* cglmc_vec4_h */
|
||||
|
602
external/cglm/include/cglm/cam.h
vendored
602
external/cglm/include/cglm/cam.h
vendored
|
@ -1,602 +0,0 @@
|
|||
/*
|
||||
* Copyright (c), Recep Aslantas.
|
||||
*
|
||||
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||
* Full license can be found in the LICENSE file
|
||||
*/
|
||||
|
||||
/*
|
||||
Functions:
|
||||
CGLM_INLINE void glm_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
|
||||
#define cglm_vcam_h
|
||||
|
||||
#include "common.h"
|
||||
#include "plane.h"
|
||||
|
||||
/*!
|
||||
* @brief set up perspective peprojection matrix
|
||||
*
|
||||
* @param[in] left viewport.left
|
||||
* @param[in] right viewport.right
|
||||
* @param[in] bottom viewport.bottom
|
||||
* @param[in] top viewport.top
|
||||
* @param[in] nearVal near clipping plane
|
||||
* @param[in] farVal far clipping plane
|
||||
* @param[out] dest result matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_frustum(float left,
|
||||
float right,
|
||||
float bottom,
|
||||
float top,
|
||||
float nearVal,
|
||||
float farVal,
|
||||
mat4 dest) {
|
||||
float rl, tb, fn, nv;
|
||||
|
||||
glm__memzero(float, dest, sizeof(mat4));
|
||||
|
||||
rl = 1.0f / (right - left);
|
||||
tb = 1.0f / (top - bottom);
|
||||
fn =-1.0f / (farVal - nearVal);
|
||||
nv = 2.0f * nearVal;
|
||||
|
||||
dest[0][0] = nv * rl;
|
||||
dest[1][1] = nv * tb;
|
||||
dest[2][0] = (right + left) * rl;
|
||||
dest[2][1] = (top + bottom) * tb;
|
||||
dest[2][2] = (farVal + nearVal) * fn;
|
||||
dest[2][3] =-1.0f;
|
||||
dest[3][2] = farVal * nv * fn;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief set up orthographic projection matrix
|
||||
*
|
||||
* @param[in] left viewport.left
|
||||
* @param[in] right viewport.right
|
||||
* @param[in] bottom viewport.bottom
|
||||
* @param[in] top viewport.top
|
||||
* @param[in] nearVal near clipping plane
|
||||
* @param[in] farVal far clipping plane
|
||||
* @param[out] dest result matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_ortho(float left,
|
||||
float right,
|
||||
float bottom,
|
||||
float top,
|
||||
float nearVal,
|
||||
float farVal,
|
||||
mat4 dest) {
|
||||
float rl, tb, fn;
|
||||
|
||||
glm__memzero(float, dest, sizeof(mat4));
|
||||
|
||||
rl = 1.0f / (right - left);
|
||||
tb = 1.0f / (top - bottom);
|
||||
fn =-1.0f / (farVal - nearVal);
|
||||
|
||||
dest[0][0] = 2.0f * rl;
|
||||
dest[1][1] = 2.0f * tb;
|
||||
dest[2][2] = 2.0f * fn;
|
||||
dest[3][0] =-(right + left) * rl;
|
||||
dest[3][1] =-(top + bottom) * tb;
|
||||
dest[3][2] = (farVal + nearVal) * fn;
|
||||
dest[3][3] = 1.0f;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief set up orthographic projection matrix using bounding box
|
||||
*
|
||||
* bounding box (AABB) must be in view space
|
||||
*
|
||||
* @param[in] box AABB
|
||||
* @param[out] dest result matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_ortho_aabb(vec3 box[2], mat4 dest) {
|
||||
glm_ortho(box[0][0], box[1][0],
|
||||
box[0][1], box[1][1],
|
||||
-box[1][2], -box[0][2],
|
||||
dest);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief set up orthographic projection matrix using bounding box
|
||||
*
|
||||
* bounding box (AABB) must be in view space
|
||||
*
|
||||
* @param[in] box AABB
|
||||
* @param[in] padding padding
|
||||
* @param[out] dest result matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_ortho_aabb_p(vec3 box[2], float padding, mat4 dest) {
|
||||
glm_ortho(box[0][0] - padding, box[1][0] + padding,
|
||||
box[0][1] - padding, box[1][1] + padding,
|
||||
-(box[1][2] + padding), -(box[0][2] - padding),
|
||||
dest);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief set up orthographic projection matrix using bounding box
|
||||
*
|
||||
* bounding box (AABB) must be in view space
|
||||
*
|
||||
* @param[in] box AABB
|
||||
* @param[in] padding padding for near and far
|
||||
* @param[out] dest result matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_ortho_aabb_pz(vec3 box[2], float padding, mat4 dest) {
|
||||
glm_ortho(box[0][0], box[1][0],
|
||||
box[0][1], box[1][1],
|
||||
-(box[1][2] + padding), -(box[0][2] - padding),
|
||||
dest);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief set up unit orthographic projection matrix
|
||||
*
|
||||
* @param[in] aspect aspect ration ( width / height )
|
||||
* @param[out] dest result matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_ortho_default(float aspect,
|
||||
mat4 dest) {
|
||||
if (aspect >= 1.0f) {
|
||||
glm_ortho(-1.0f * aspect,
|
||||
1.0f * aspect,
|
||||
-1.0f,
|
||||
1.0f,
|
||||
-100.0f,
|
||||
100.0f,
|
||||
dest);
|
||||
return;
|
||||
}
|
||||
|
||||
glm_ortho(-1.0f,
|
||||
1.0f,
|
||||
-1.0f / aspect,
|
||||
1.0f / aspect,
|
||||
-100.0f,
|
||||
100.0f,
|
||||
dest);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief set up orthographic projection matrix with given CUBE size
|
||||
*
|
||||
* @param[in] aspect aspect ratio ( width / height )
|
||||
* @param[in] size cube size
|
||||
* @param[out] dest result matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_ortho_default_s(float aspect,
|
||||
float size,
|
||||
mat4 dest) {
|
||||
if (aspect >= 1.0f) {
|
||||
glm_ortho(-size * aspect,
|
||||
size * aspect,
|
||||
-size,
|
||||
size,
|
||||
-size - 100.0f,
|
||||
size + 100.0f,
|
||||
dest);
|
||||
return;
|
||||
}
|
||||
|
||||
glm_ortho(-size,
|
||||
size,
|
||||
-size / aspect,
|
||||
size / aspect,
|
||||
-size - 100.0f,
|
||||
size + 100.0f,
|
||||
dest);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief set up perspective projection matrix
|
||||
*
|
||||
* @param[in] fovy field of view angle
|
||||
* @param[in] aspect aspect ratio ( width / height )
|
||||
* @param[in] nearVal near clipping plane
|
||||
* @param[in] farVal far clipping planes
|
||||
* @param[out] dest result matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_perspective(float fovy,
|
||||
float aspect,
|
||||
float nearVal,
|
||||
float farVal,
|
||||
mat4 dest) {
|
||||
float f, fn;
|
||||
|
||||
glm__memzero(float, dest, sizeof(mat4));
|
||||
|
||||
f = 1.0f / tanf(fovy * 0.5f);
|
||||
fn = 1.0f / (nearVal - farVal);
|
||||
|
||||
dest[0][0] = f / aspect;
|
||||
dest[1][1] = f;
|
||||
dest[2][2] = (nearVal + farVal) * fn;
|
||||
dest[2][3] =-1.0f;
|
||||
dest[3][2] = 2.0f * nearVal * farVal * fn;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief set up perspective projection matrix with default near/far
|
||||
* and angle values
|
||||
*
|
||||
* @param[in] aspect aspect ratio ( width / height )
|
||||
* @param[out] dest result matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_perspective_default(float aspect,
|
||||
mat4 dest) {
|
||||
glm_perspective((float)CGLM_PI_4,
|
||||
aspect,
|
||||
0.01f,
|
||||
100.0f,
|
||||
dest);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief resize perspective matrix by aspect ratio ( width / height )
|
||||
* this makes very easy to resize proj matrix when window /viewport
|
||||
* reized
|
||||
*
|
||||
* @param[in] aspect aspect ratio ( width / height )
|
||||
* @param[in, out] proj perspective projection matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_perspective_resize(float aspect,
|
||||
mat4 proj) {
|
||||
if (proj[0][0] == 0.0f)
|
||||
return;
|
||||
|
||||
proj[0][0] = proj[1][1] / 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
|
||||
* @param[out] dest result matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_lookat(vec3 eye,
|
||||
vec3 center,
|
||||
vec3 up,
|
||||
mat4 dest) {
|
||||
CGLM_ALIGN(8) vec3 f, u, s;
|
||||
|
||||
glm_vec_sub(center, eye, f);
|
||||
glm_vec_normalize(f);
|
||||
|
||||
glm_vec_cross(f, up, s);
|
||||
glm_vec_normalize(s);
|
||||
|
||||
glm_vec_cross(s, f, u);
|
||||
|
||||
dest[0][0] = s[0];
|
||||
dest[0][1] = u[0];
|
||||
dest[0][2] =-f[0];
|
||||
dest[1][0] = s[1];
|
||||
dest[1][1] = u[1];
|
||||
dest[1][2] =-f[1];
|
||||
dest[2][0] = s[2];
|
||||
dest[2][1] = u[2];
|
||||
dest[2][2] =-f[2];
|
||||
dest[3][0] =-glm_vec_dot(s, eye);
|
||||
dest[3][1] =-glm_vec_dot(u, eye);
|
||||
dest[3][2] = glm_vec_dot(f, eye);
|
||||
dest[0][3] = dest[1][3] = dest[2][3] = 0.0f;
|
||||
dest[3][3] = 1.0f;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief set up view matrix
|
||||
*
|
||||
* 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
|
||||
* @param[out] dest result matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_look(vec3 eye, vec3 dir, vec3 up, mat4 dest) {
|
||||
CGLM_ALIGN(8) vec3 target;
|
||||
glm_vec_add(eye, dir, target);
|
||||
glm_lookat(eye, target, up, dest);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief set up view matrix
|
||||
*
|
||||
* convenient wrapper for 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
|
||||
*
|
||||
* @param[in] eye eye vector
|
||||
* @param[in] dir direction vector
|
||||
* @param[out] dest result matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_look_anyup(vec3 eye, vec3 dir, mat4 dest) {
|
||||
CGLM_ALIGN(8) vec3 up;
|
||||
glm_vec_ortho(dir, up);
|
||||
glm_look(eye, dir, up, dest);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief decomposes frustum values of perspective projection.
|
||||
*
|
||||
* @param[in] proj perspective projection matrix
|
||||
* @param[out] nearVal near
|
||||
* @param[out] farVal far
|
||||
* @param[out] top top
|
||||
* @param[out] bottom bottom
|
||||
* @param[out] left left
|
||||
* @param[out] right right
|
||||
*/
|
||||
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) {
|
||||
float m00, m11, m20, m21, m22, m32, n, f;
|
||||
float n_m11, n_m00;
|
||||
|
||||
m00 = proj[0][0];
|
||||
m11 = proj[1][1];
|
||||
m20 = proj[2][0];
|
||||
m21 = proj[2][1];
|
||||
m22 = proj[2][2];
|
||||
m32 = proj[3][2];
|
||||
|
||||
n = m32 / (m22 - 1.0f);
|
||||
f = m32 / (m22 + 1.0f);
|
||||
|
||||
n_m11 = n / m11;
|
||||
n_m00 = n / m00;
|
||||
|
||||
*nearVal = n;
|
||||
*farVal = f;
|
||||
*bottom = n_m11 * (m21 - 1.0f);
|
||||
*top = n_m11 * (m21 + 1.0f);
|
||||
*left = n_m00 * (m20 - 1.0f);
|
||||
*right = n_m00 * (m20 + 1.0f);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief decomposes frustum values of perspective projection.
|
||||
* this makes easy to get all values at once
|
||||
*
|
||||
* @param[in] proj perspective projection matrix
|
||||
* @param[out] dest array
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_persp_decompv(mat4 proj, float dest[6]) {
|
||||
glm_persp_decomp(proj, &dest[0], &dest[1], &dest[2],
|
||||
&dest[3], &dest[4], &dest[5]);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief decomposes left and right values of perspective projection.
|
||||
* x stands for x axis (left / right axis)
|
||||
*
|
||||
* @param[in] proj perspective projection matrix
|
||||
* @param[out] left left
|
||||
* @param[out] right right
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_persp_decomp_x(mat4 proj,
|
||||
float * __restrict left,
|
||||
float * __restrict right) {
|
||||
float nearVal, m20, m00;
|
||||
|
||||
m00 = proj[0][0];
|
||||
m20 = proj[2][0];
|
||||
|
||||
nearVal = proj[3][2] / (proj[3][3] - 1.0f);
|
||||
*left = nearVal * (m20 - 1.0f) / m00;
|
||||
*right = nearVal * (m20 + 1.0f) / m00;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief decomposes top and bottom values of perspective projection.
|
||||
* y stands for y axis (top / botom axis)
|
||||
*
|
||||
* @param[in] proj perspective projection matrix
|
||||
* @param[out] top top
|
||||
* @param[out] bottom bottom
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_persp_decomp_y(mat4 proj,
|
||||
float * __restrict top,
|
||||
float * __restrict bottom) {
|
||||
float nearVal, m21, m11;
|
||||
|
||||
m21 = proj[2][1];
|
||||
m11 = proj[1][1];
|
||||
|
||||
nearVal = proj[3][2] / (proj[3][3] - 1.0f);
|
||||
*bottom = nearVal * (m21 - 1) / m11;
|
||||
*top = nearVal * (m21 + 1) / m11;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief decomposes near and far values of perspective projection.
|
||||
* z stands for z axis (near / far axis)
|
||||
*
|
||||
* @param[in] proj perspective projection matrix
|
||||
* @param[out] nearVal near
|
||||
* @param[out] farVal far
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_persp_decomp_z(mat4 proj,
|
||||
float * __restrict nearVal,
|
||||
float * __restrict farVal) {
|
||||
float m32, m22;
|
||||
|
||||
m32 = proj[3][2];
|
||||
m22 = proj[2][2];
|
||||
|
||||
*nearVal = m32 / (m22 - 1.0f);
|
||||
*farVal = m32 / (m22 + 1.0f);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief decomposes far value of perspective projection.
|
||||
*
|
||||
* @param[in] proj perspective projection matrix
|
||||
* @param[out] farVal far
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_persp_decomp_far(mat4 proj, float * __restrict farVal) {
|
||||
*farVal = proj[3][2] / (proj[2][2] + 1.0f);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief decomposes near value of perspective projection.
|
||||
*
|
||||
* @param[in] proj perspective projection matrix
|
||||
* @param[out] nearVal near
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_persp_decomp_near(mat4 proj, float * __restrict nearVal) {
|
||||
*nearVal = proj[3][2] / (proj[2][2] - 1.0f);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief 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))
|
||||
*
|
||||
* @param[in] proj perspective projection matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
float
|
||||
glm_persp_fovy(mat4 proj) {
|
||||
return 2.0f * atanf(1.0f / proj[1][1]);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief returns aspect ratio of perspective projection
|
||||
*
|
||||
* @param[in] proj perspective projection matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
float
|
||||
glm_persp_aspect(mat4 proj) {
|
||||
return proj[1][1] / proj[0][0];
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief returns sizes of near and far planes of perspective projection
|
||||
*
|
||||
* @param[in] proj perspective projection matrix
|
||||
* @param[in] fovy fovy (see brief)
|
||||
* @param[out] dest sizes order: [Wnear, Hnear, Wfar, Hfar]
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_persp_sizes(mat4 proj, float fovy, vec4 dest) {
|
||||
float t, a, nearVal, farVal;
|
||||
|
||||
t = 2.0f * tanf(fovy * 0.5f);
|
||||
a = glm_persp_aspect(proj);
|
||||
|
||||
glm_persp_decomp_z(proj, &nearVal, &farVal);
|
||||
|
||||
dest[1] = t * nearVal;
|
||||
dest[3] = t * farVal;
|
||||
dest[0] = a * dest[1];
|
||||
dest[2] = a * dest[3];
|
||||
}
|
||||
|
||||
#endif /* cglm_vcam_h */
|
30
external/cglm/include/cglm/cglm.h
vendored
30
external/cglm/include/cglm/cglm.h
vendored
|
@ -1,30 +0,0 @@
|
|||
/*
|
||||
* Copyright (c), Recep Aslantas.
|
||||
*
|
||||
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||
* Full license can be found in the LICENSE file
|
||||
*/
|
||||
|
||||
#ifndef cglm_h
|
||||
#define cglm_h
|
||||
|
||||
#include "common.h"
|
||||
#include "vec3.h"
|
||||
#include "vec4.h"
|
||||
#include "mat4.h"
|
||||
#include "mat3.h"
|
||||
#include "affine.h"
|
||||
#include "cam.h"
|
||||
#include "frustum.h"
|
||||
#include "quat.h"
|
||||
#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
26
external/cglm/include/cglm/color.h
vendored
|
@ -1,26 +0,0 @@
|
|||
/*
|
||||
* Copyright (c), Recep Aslantas.
|
||||
*
|
||||
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||
* Full license can be found in the LICENSE file
|
||||
*/
|
||||
|
||||
#ifndef cglm_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 */
|
60
external/cglm/include/cglm/common.h
vendored
60
external/cglm/include/cglm/common.h
vendored
|
@ -1,60 +0,0 @@
|
|||
/*
|
||||
* Copyright (c), Recep Aslantas.
|
||||
*
|
||||
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||
* Full license can be found in the LICENSE file
|
||||
*/
|
||||
|
||||
#ifndef cglm_common_h
|
||||
#define cglm_common_h
|
||||
|
||||
#define _USE_MATH_DEFINES /* for windows */
|
||||
|
||||
#include <stdint.h>
|
||||
#include <math.h>
|
||||
#include <float.h>
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
# ifdef CGLM_DLL
|
||||
# define CGLM_EXPORT __declspec(dllexport)
|
||||
# else
|
||||
# define CGLM_EXPORT __declspec(dllimport)
|
||||
# endif
|
||||
# define CGLM_INLINE __forceinline
|
||||
#else
|
||||
# define CGLM_EXPORT __attribute__((visibility("default")))
|
||||
# define CGLM_INLINE static inline __attribute__((always_inline))
|
||||
#endif
|
||||
|
||||
#define glm__memcpy(type, dest, src, size) \
|
||||
do { \
|
||||
type *srci; \
|
||||
type *srci_end; \
|
||||
type *desti; \
|
||||
\
|
||||
srci = (type *)src; \
|
||||
srci_end = (type *)((char *)srci + size); \
|
||||
desti = (type *)dest; \
|
||||