mirror of
https://github.com/recp/cglm.git
synced 2026-02-17 03:39:05 +00:00
Compare commits
274 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
14f06a262f | ||
|
|
392565f920 | ||
|
|
120ae9ae99 | ||
|
|
a5f1ed32af | ||
|
|
010e887946 | ||
|
|
6e501ef1f6 | ||
|
|
6ed275734b | ||
|
|
85ca81ce79 | ||
|
|
e909c8268d | ||
|
|
73e6b65da0 | ||
|
|
ecbe36df6b | ||
|
|
d85b5234a9 | ||
|
|
5b80e0e3c2 | ||
|
|
461a4009ba | ||
|
|
8f2f2c5572 | ||
|
|
81a74ba225 | ||
|
|
6c0c5167b0 | ||
|
|
4c5451994f | ||
|
|
73226bd2fd | ||
|
|
8fa21a1837 | ||
|
|
ee1937f28d | ||
|
|
b4efcefe7f | ||
|
|
0d2e5a996a | ||
|
|
2b1eece9ac | ||
|
|
c8b8f4f6f0 | ||
|
|
1a34ffcf4b | ||
|
|
af088a1059 | ||
|
|
18f06743ed | ||
|
|
60cfc87009 | ||
|
|
4e5879497e | ||
|
|
7848dda1dd | ||
|
|
1e121a4855 | ||
|
|
0f223db7d3 | ||
|
|
a4e2c39c1d | ||
|
|
c22231f296 | ||
|
|
730cb1e9f7 | ||
|
|
b0e48a56ca | ||
|
|
11a6e4471e | ||
|
|
60cb4beb0a | ||
|
|
32ddf49756 | ||
|
|
807d5589b4 | ||
|
|
59b9e54879 | ||
|
|
fc7f958167 | ||
|
|
31bb303c55 | ||
|
|
be6aa9a89a | ||
|
|
f65f1d491b | ||
|
|
f0c2a2984e | ||
|
|
b117f3bf80 | ||
|
|
07e60bd098 | ||
|
|
e3d3cd8ab8 | ||
|
|
d17c99215d | ||
|
|
dc6eb492c1 | ||
|
|
7219b02d23 | ||
|
|
21834b4ffb | ||
|
|
2ef9c23a6c | ||
|
|
92605f845a | ||
|
|
b23d65bef5 | ||
|
|
2f632c6311 | ||
|
|
b47d148b81 | ||
|
|
a5bc2f710e | ||
|
|
6d6954b208 | ||
|
|
4e08b7e335 | ||
|
|
aee381d869 | ||
|
|
b4bf8f3537 | ||
|
|
0b8c63a90e | ||
|
|
ef6134263e | ||
|
|
9af61d2101 | ||
|
|
463099350a | ||
|
|
89f64f0794 | ||
|
|
d794f17e51 | ||
|
|
a7cdbcec2b | ||
|
|
20a2312351 | ||
|
|
08479f38ce | ||
|
|
dadae4b773 | ||
|
|
20360f2296 | ||
|
|
aa2b0f2631 | ||
|
|
280ac72fd8 | ||
|
|
7405d5e1d0 | ||
|
|
eefafefbae | ||
|
|
b9021978cb | ||
|
|
3fd12032e6 | ||
|
|
59ee8c1fd2 | ||
|
|
b00f2b9ccc | ||
|
|
d3c50147cb | ||
|
|
98da3daf82 | ||
|
|
2e1790ccf9 | ||
|
|
cc5f533fc9 | ||
|
|
2d63d7e0cd | ||
|
|
3738499927 | ||
|
|
1d527dc2f0 | ||
|
|
43c4d05d4a | ||
|
|
c5f5032fcc | ||
|
|
5d605ce372 | ||
|
|
c216c0cb7e | ||
|
|
eb8e0df6df | ||
|
|
1775bf7458 | ||
|
|
3adeac06f8 | ||
|
|
669777eb37 | ||
|
|
02f6c67393 | ||
|
|
564324f5d2 | ||
|
|
93e6c3c102 | ||
|
|
857265b892 | ||
|
|
fc14cedf89 | ||
|
|
7a80178357 | ||
|
|
720b617ee0 | ||
|
|
3dc9070909 | ||
|
|
6b2b4b4f12 | ||
|
|
c8fc460ba1 | ||
|
|
5b3aabc103 | ||
|
|
af812e86eb | ||
|
|
059bdfdd4b | ||
|
|
ef0653640f | ||
|
|
e5d61b3433 | ||
|
|
73c073cf32 | ||
|
|
1362bef50f | ||
|
|
7d783eeace | ||
|
|
e12e79b1a5 | ||
|
|
6cd3d52dc5 | ||
|
|
fb2cac9816 | ||
|
|
4e63325f55 | ||
|
|
96c3e604ff | ||
|
|
077e304fc5 | ||
|
|
599524dacf | ||
|
|
da5ad69863 | ||
|
|
9fc2ead8ef | ||
|
|
48d33c16cb | ||
|
|
464bd917d0 | ||
|
|
c6d07bb6eb | ||
|
|
94b286f1f9 | ||
|
|
f774925e8a | ||
|
|
0e49e95161 | ||
|
|
b277357800 | ||
|
|
835cec2ccb | ||
|
|
5dbbd0826d | ||
|
|
56f0bb0928 | ||
|
|
568001d26a | ||
|
|
252bf925fc | ||
|
|
0f339c5c03 | ||
|
|
a9d56f2dae | ||
|
|
dd60496ffc | ||
|
|
7c0e9e99c6 | ||
|
|
064209c917 | ||
|
|
94d6036c38 | ||
|
|
6c01eff056 | ||
|
|
ada69a7c43 | ||
|
|
cef97fca3e | ||
|
|
498a33fac5 | ||
|
|
3c7a729729 | ||
|
|
a6a37995e9 | ||
|
|
6202179c23 | ||
|
|
22b699174c | ||
|
|
016c0a71a6 | ||
|
|
e28cf1d3f6 | ||
|
|
63966ee5c0 | ||
|
|
a723ecdb7e | ||
|
|
065f93ab3c | ||
|
|
4dbcd28fdb | ||
|
|
be0e3fc9f2 | ||
|
|
d648f5772d | ||
|
|
f163fcd043 | ||
|
|
27ab6a7dd0 | ||
|
|
33e951fe2e | ||
|
|
c63c6c90ac | ||
|
|
a2792178db | ||
|
|
cefd5fb53d | ||
|
|
821c79572f | ||
|
|
f0a27d0ce2 | ||
|
|
007ae62e06 | ||
|
|
826ddf0f5b | ||
|
|
b09b5f260b | ||
|
|
59aacee968 | ||
|
|
429aff087f | ||
|
|
ca9f61dd74 | ||
|
|
d6395d4fb8 | ||
|
|
7f7007574b | ||
|
|
13345f06c1 | ||
|
|
725fac75d0 | ||
|
|
c05f58a169 | ||
|
|
d841f8809d | ||
|
|
af5a2627b4 | ||
|
|
25fc3d0284 | ||
|
|
c489955b00 | ||
|
|
79f8b1ebf8 | ||
|
|
0eb37da8bb | ||
|
|
44728c536b | ||
|
|
c8ed8acbed | ||
|
|
2d77123999 | ||
|
|
462067cfdc | ||
|
|
9ae8da3e0a | ||
|
|
0e63c245d4 | ||
|
|
de55850136 | ||
|
|
51278b26b4 | ||
|
|
fdea13507b | ||
|
|
80d255e6d9 | ||
|
|
d447876c70 | ||
|
|
b1fa7ff597 | ||
|
|
010dcc9837 | ||
|
|
5dec68823c | ||
|
|
4c79fee5d3 | ||
|
|
18ef0d7af1 | ||
|
|
9466182c10 | ||
|
|
f0a51b35ad | ||
|
|
290bcf134c | ||
|
|
416e2f4452 | ||
|
|
1fb82a1922 | ||
|
|
591c881376 | ||
|
|
6f69da361b | ||
|
|
93a08fce17 | ||
|
|
cc1d3b53ea | ||
|
|
b21df8fc37 | ||
|
|
76e9f74020 | ||
|
|
d79e58486d | ||
|
|
3dc93c56e8 | ||
|
|
7615f785ac | ||
|
|
f0daaca58b | ||
|
|
381b2fdcc0 | ||
|
|
e4e0fa623c | ||
|
|
932f638d5a | ||
|
|
81bda7439d | ||
|
|
b27603c268 | ||
|
|
12c5307447 | ||
|
|
257c57d41f | ||
|
|
f5140ea005 | ||
|
|
619ecdc5a4 | ||
|
|
9b8748acc4 | ||
|
|
ae06c51746 | ||
|
|
11430559b4 | ||
|
|
58f0043417 | ||
|
|
cfd3600107 | ||
|
|
967fb1afad | ||
|
|
7411ac36c1 | ||
|
|
238609f2c0 | ||
|
|
ea0a10ade9 | ||
|
|
429fdfd5c5 | ||
|
|
024412f00e | ||
|
|
e8615ea14c | ||
|
|
be81d73895 | ||
|
|
b16f0ded85 | ||
|
|
63acfd681e | ||
|
|
eb527e39b4 | ||
|
|
9f389ab8ec | ||
|
|
3399595dc2 | ||
|
|
2513d46102 | ||
|
|
c298f4a4d7 | ||
|
|
84cdbd5072 | ||
|
|
74f9865884 | ||
|
|
dbd1e334ea | ||
|
|
acda316c12 | ||
|
|
86efe64b8e | ||
|
|
b0991342a6 | ||
|
|
984916d520 | ||
|
|
54c44ff224 | ||
|
|
db4761b437 | ||
|
|
ca504f7058 | ||
|
|
5a7b9caf16 | ||
|
|
43b3df992d | ||
|
|
26110f83d1 | ||
|
|
d1f3feeb6e | ||
|
|
4298211795 | ||
|
|
c244b68e73 | ||
|
|
205d13aa93 | ||
|
|
45f13217c3 | ||
|
|
21ec45b2af | ||
|
|
71b48b530e | ||
|
|
48b7b30e42 | ||
|
|
86055097e1 | ||
|
|
08be94a89b | ||
|
|
91b2a989e2 | ||
|
|
780179ff0d | ||
|
|
c148eacdc2 | ||
|
|
fadde1e26a | ||
|
|
29996d0bdd | ||
|
|
cfab79e546 | ||
|
|
da2f3aaafd |
12
.gitignore
vendored
12
.gitignore
vendored
@@ -59,4 +59,14 @@ cglm_test_ios/*
|
|||||||
cglm_test_iosTests/*
|
cglm_test_iosTests/*
|
||||||
docs/build/*
|
docs/build/*
|
||||||
win/cglm_test_*
|
win/cglm_test_*
|
||||||
* copy.*
|
* copy.*
|
||||||
|
*.o
|
||||||
|
*.obj
|
||||||
|
*codeanalysis.*.xml
|
||||||
|
*codeanalysis.xml
|
||||||
|
*.lib
|
||||||
|
*.tlog
|
||||||
|
win/x64
|
||||||
|
win/x85
|
||||||
|
win/Debug
|
||||||
|
cglm-test-ios*
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ script:
|
|||||||
|
|
||||||
after_success:
|
after_success:
|
||||||
- if [[ "$CC" == "gcc" && "$CODE_COVERAGE" == "ON" ]]; then
|
- if [[ "$CC" == "gcc" && "$CODE_COVERAGE" == "ON" ]]; then
|
||||||
pip install --user cpp-coveralls
|
pip install --user cpp-coveralls &&
|
||||||
coveralls
|
coveralls
|
||||||
--build-root .
|
--build-root .
|
||||||
--exclude lib
|
--exclude lib
|
||||||
@@ -57,3 +57,6 @@ after_success:
|
|||||||
--gcov-options '\-lp'
|
--gcov-options '\-lp'
|
||||||
--verbose;
|
--verbose;
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
after_failure:
|
||||||
|
- cat ./test-suite.log
|
||||||
|
|||||||
22
CREDITS
22
CREDITS
@@ -1,7 +1,7 @@
|
|||||||
This library [initially] used some [piece of] implementations
|
This library [initially] used some [piece of] implementations
|
||||||
(may include codes) from these open source projects/resources:
|
(may include codes) from these open source projects/resources:
|
||||||
|
|
||||||
1. Affine Transforms
|
1. Initial Affine Transforms
|
||||||
The original glm repo (g-truc), url: https://github.com/g-truc/glm
|
The original glm repo (g-truc), url: https://github.com/g-truc/glm
|
||||||
|
|
||||||
LICENSE[S]:
|
LICENSE[S]:
|
||||||
@@ -11,7 +11,7 @@ LICENSE[S]:
|
|||||||
|
|
||||||
FULL LICENSE: https://github.com/g-truc/glm/blob/master/copying.txt
|
FULL LICENSE: https://github.com/g-truc/glm/blob/master/copying.txt
|
||||||
|
|
||||||
2. Quaternions
|
2. Initial Quaternions
|
||||||
Anton's OpenGL 4 Tutorials book source code:
|
Anton's OpenGL 4 Tutorials book source code:
|
||||||
|
|
||||||
LICENSE:
|
LICENSE:
|
||||||
@@ -43,3 +43,21 @@ https://github.com/erich666/GraphicsGems/blob/master/gems/TransBox.c
|
|||||||
6. Cull frustum
|
6. Cull frustum
|
||||||
http://www.txutxi.com/?p=584
|
http://www.txutxi.com/?p=584
|
||||||
http://old.cescg.org/CESCG-2002/DSykoraJJelinek/
|
http://old.cescg.org/CESCG-2002/DSykoraJJelinek/
|
||||||
|
|
||||||
|
7. Quaternions
|
||||||
|
Initial mat4_quat is borrowed from Apple's simd library
|
||||||
|
|
||||||
|
8. Vector Rotation using Quaternion
|
||||||
|
https://gamedev.stackexchange.com/questions/28395/rotating-vector3-by-a-quaternion
|
||||||
|
|
||||||
|
9. Sphere AABB intersect
|
||||||
|
https://github.com/erich666/GraphicsGems/blob/master/gems/BoxSphere.c
|
||||||
|
|
||||||
|
10. Horizontal add
|
||||||
|
https://stackoverflow.com/questions/6996764/fastest-way-to-do-horizontal-float-vector-sum-on-x86
|
||||||
|
|
||||||
|
11. de casteljau implementation and comments
|
||||||
|
https://forums.khronos.org/showthread.php/10264-Animations-in-1-4-1-release-notes-revision-A/page2?highlight=bezier
|
||||||
|
https://forums.khronos.org/showthread.php/10644-Animation-Bezier-interpolation
|
||||||
|
https://forums.khronos.org/showthread.php/10387-2D-Tangents-in-Bezier-Splines?p=34164&viewfull=1#post34164
|
||||||
|
https://forums.khronos.org/showthread.php/10651-Animation-TCB-Spline-Interpolation-in-COLLADA?highlight=bezier
|
||||||
|
|||||||
87
README.md
87
README.md
@@ -1,9 +1,11 @@
|
|||||||
# 🎥 OpenGL Mathematics (glm) for `C`
|
# 🎥 OpenGL Mathematics (glm) for `C`
|
||||||
[](https://travis-ci.org/recp/cglm)
|
[](https://travis-ci.org/recp/cglm)
|
||||||
[](https://ci.appveyor.com/project/recp/cglm/branch/master)
|
[](https://ci.appveyor.com/project/recp/cglm/branch/master)
|
||||||
[](http://cglm.readthedocs.io/en/latest/?badge=latest)
|
[](http://cglm.readthedocs.io/en/latest/?badge=latest)
|
||||||
[](https://coveralls.io/github/recp/cglm?branch=master)
|
[](https://coveralls.io/github/recp/cglm?branch=master)
|
||||||
[](https://www.codacy.com/app/recp/cglm?utm_source=github.com&utm_medium=referral&utm_content=recp/cglm&utm_campaign=Badge_Grade)
|
[](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`
|
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`
|
||||||
|
|
||||||
@@ -14,9 +16,16 @@ Complete documentation: http://cglm.readthedocs.io
|
|||||||
|
|
||||||
#### Note for previous versions:
|
#### Note for previous versions:
|
||||||
|
|
||||||
- _dup (duplicate) is changed to _copy. For instance `glm_vec_dup -> glm_vec_copy`
|
- _dup (duplicate) is changed to _copy. For instance `glm_vec_dup -> glm_vec3_copy`
|
||||||
- OpenGL related functions are dropped to make this lib platform/third-party independent
|
- 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
|
- make sure you have latest version and feel free to report bugs, troubles
|
||||||
|
- **[bugfix]** euler angles was implemented in reverse order (extrinsic) it was fixed, now they are intrinsic. Make sure that
|
||||||
|
you have the latest version
|
||||||
|
- **[major change]** by starting v0.4.0, quaternions are stored as [x, y, z, w], it was [w, x, y, z] in v0.3.5 and earlier versions
|
||||||
|
- **[api rename]** by starting v0.4.5, **glm_simd** functions are renamed to **glmm_**
|
||||||
|
- **[new option]** by starting v0.4.5, you can disable alignment requirement, check options in docs.
|
||||||
|
- **[major change]** by starting v0.5.0, vec3 functions use **glm_vec3_** namespace, it was **glm_vec_** until v0.5.0
|
||||||
|
- **[major change]** by starting v0.5.1, built-in alignment is removed from **vec3** and **mat3** types
|
||||||
|
|
||||||
#### Note for C++ developers:
|
#### Note for C++ developers:
|
||||||
If you don't aware about original GLM library yet, you may also want to look at:
|
If you don't aware about original GLM library yet, you may also want to look at:
|
||||||
@@ -73,6 +82,12 @@ Currently *cglm* uses default clip space configuration (-1, 1) for camera functi
|
|||||||
- inline or pre-compiled function call
|
- inline or pre-compiled function call
|
||||||
- frustum (extract view frustum planes, corners...)
|
- frustum (extract view frustum planes, corners...)
|
||||||
- bounding box (AABB in Frustum (culling), crop, merge...)
|
- bounding box (AABB in Frustum (culling), crop, merge...)
|
||||||
|
- bounding sphere
|
||||||
|
- project, unproject
|
||||||
|
- easing functions
|
||||||
|
- curves
|
||||||
|
- curve interpolation helpers (S*M*C, deCasteljau...)
|
||||||
|
- and other...
|
||||||
|
|
||||||
<hr />
|
<hr />
|
||||||
|
|
||||||
@@ -114,9 +129,6 @@ glm_mul(T, R, modelMat);
|
|||||||
glm_inv_tr(modelMat);
|
glm_inv_tr(modelMat);
|
||||||
```
|
```
|
||||||
|
|
||||||
## License
|
|
||||||
MIT. check the LICENSE file
|
|
||||||
|
|
||||||
## Build
|
## Build
|
||||||
|
|
||||||
### Unix (Autotools)
|
### Unix (Autotools)
|
||||||
@@ -161,17 +173,17 @@ If you want to use inline versions of funcstions then; include main header
|
|||||||
```C
|
```C
|
||||||
#include <cglm/cglm.h>
|
#include <cglm/cglm.h>
|
||||||
```
|
```
|
||||||
the haeder will include all headers. Then call func you want e.g. rotate vector by axis:
|
the header will include all headers. Then call func you want e.g. rotate vector by axis:
|
||||||
```C
|
```C
|
||||||
glm_vec_rotate(v1, glm_rad(45), (vec3){1.0f, 0.0f, 0.0f});
|
glm_vec3_rotate(v1, glm_rad(45), (vec3){1.0f, 0.0f, 0.0f});
|
||||||
```
|
```
|
||||||
some functions are overloaded :) e.g you can normalize vector:
|
some functions are overloaded :) e.g you can normalize vector:
|
||||||
```C
|
```C
|
||||||
glm_vec_normalize(vec);
|
glm_vec3_normalize(vec);
|
||||||
```
|
```
|
||||||
this will normalize vec and store normalized vector into `vec` but if you will store normalized vector into another vector do this:
|
this will normalize vec and store normalized vector into `vec` but if you will store normalized vector into another vector do this:
|
||||||
```C
|
```C
|
||||||
glm_vec_normalize_to(vec, result);
|
glm_vec3_normalize_to(vec, result);
|
||||||
```
|
```
|
||||||
like this function you may see `_to` postfix, this functions store results to another variables and save temp memory
|
like this function you may see `_to` postfix, this functions store results to another variables and save temp memory
|
||||||
|
|
||||||
@@ -180,9 +192,9 @@ to call pre-compiled versions include header with `c` postfix, c means call. Pre
|
|||||||
```C
|
```C
|
||||||
#include <cglm/call.h>
|
#include <cglm/call.h>
|
||||||
```
|
```
|
||||||
this header will include all heaers with c postfix. You need to call functions with c posfix:
|
this header will include all headers with c postfix. You need to call functions with c posfix:
|
||||||
```C
|
```C
|
||||||
glmc_vec_normalize(vec);
|
glmc_vec3_normalize(vec);
|
||||||
```
|
```
|
||||||
|
|
||||||
Function usage and parameters are documented inside related headers. You may see same parameter passed twice in some examples like this:
|
Function usage and parameters are documented inside related headers. You may see same parameter passed twice in some examples like this:
|
||||||
@@ -194,6 +206,27 @@ glm_mat4_mul(m1, m1, m1);
|
|||||||
```
|
```
|
||||||
the first two parameter are **[in]** and the last one is **[out]** parameter. After multiplied *m1* and *m2* the result is stored in *m1*. This is why we send *m1* twice. You may store result in different matrix, this just an example.
|
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
|
## 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:
|
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:
|
||||||
@@ -225,3 +258,35 @@ You can pass same way to another APIs e.g. Vulkan, DX...
|
|||||||
- [ ] Unaligned operations (e.g. `glm_umat4_mul`)
|
- [ ] Unaligned operations (e.g. `glm_umat4_mul`)
|
||||||
- [x] Extra documentation
|
- [x] Extra documentation
|
||||||
- [ ] ARM Neon Arch (In Progress)
|
- [ ] ARM Neon Arch (In Progress)
|
||||||
|
|
||||||
|
|
||||||
|
## 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
|
||||||
|
|||||||
17
autogen.sh
17
autogen.sh
@@ -8,17 +8,14 @@
|
|||||||
|
|
||||||
cd $(dirname "$0")
|
cd $(dirname "$0")
|
||||||
|
|
||||||
if [ "$(uname)" = "Darwin" ]; then
|
|
||||||
libtoolBin=$(which glibtoolize)
|
|
||||||
libtoolBinDir=$(dirname "${libtoolBin}")
|
|
||||||
|
|
||||||
if [ ! -f "${libtoolBinDir}/libtoolize" ]; then
|
|
||||||
ln -s $libtoolBin "${libtoolBinDir}/libtoolize"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
autoheader
|
autoheader
|
||||||
libtoolize
|
|
||||||
|
if [ "$(uname)" = "Darwin" ]; then
|
||||||
|
glibtoolize
|
||||||
|
else
|
||||||
|
libtoolize
|
||||||
|
fi
|
||||||
|
|
||||||
aclocal -I m4
|
aclocal -I m4
|
||||||
autoconf
|
autoconf
|
||||||
automake --add-missing --copy
|
automake --add-missing --copy
|
||||||
|
|||||||
@@ -9,21 +9,14 @@
|
|||||||
# check if deps are pulled
|
# check if deps are pulled
|
||||||
git submodule update --init --recursive
|
git submodule update --init --recursive
|
||||||
|
|
||||||
# fix glibtoolize
|
|
||||||
|
|
||||||
cd $(dirname "$0")
|
cd $(dirname "$0")
|
||||||
|
|
||||||
if [ "$(uname)" = "Darwin" ]; then
|
|
||||||
libtoolBin=$(which glibtoolize)
|
|
||||||
libtoolBinDir=$(dirname "${libtoolBin}")
|
|
||||||
ln -s $libtoolBin "${libtoolBinDir}/libtoolize"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# general deps: gcc make autoconf automake libtool cmake
|
# general deps: gcc make autoconf automake libtool cmake
|
||||||
|
|
||||||
# test - cmocka
|
# test - cmocka
|
||||||
cd ./test/lib/cmocka
|
cd ./test/lib/cmocka
|
||||||
mkdir build
|
rm -rf build
|
||||||
|
mkdir -p build
|
||||||
cd build
|
cd build
|
||||||
cmake -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Debug ..
|
cmake -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Debug ..
|
||||||
make -j8
|
make -j8
|
||||||
|
|||||||
28
cglm.podspec
Normal file
28
cglm.podspec
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
Pod::Spec.new do |s|
|
||||||
|
|
||||||
|
# Description
|
||||||
|
s.name = "cglm"
|
||||||
|
s.version = "0.5.1"
|
||||||
|
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
|
||||||
@@ -7,7 +7,7 @@
|
|||||||
#*****************************************************************************
|
#*****************************************************************************
|
||||||
|
|
||||||
AC_PREREQ([2.69])
|
AC_PREREQ([2.69])
|
||||||
AC_INIT([cglm], [0.3.4], [info@recp.me])
|
AC_INIT([cglm], [0.5.4], [info@recp.me])
|
||||||
AM_INIT_AUTOMAKE([-Wall -Werror foreign subdir-objects])
|
AM_INIT_AUTOMAKE([-Wall -Werror foreign subdir-objects])
|
||||||
|
|
||||||
AC_CONFIG_MACRO_DIR([m4])
|
AC_CONFIG_MACRO_DIR([m4])
|
||||||
@@ -29,6 +29,7 @@ LT_INIT
|
|||||||
# Checks for libraries.
|
# Checks for libraries.
|
||||||
AC_CHECK_LIB([m], [floor])
|
AC_CHECK_LIB([m], [floor])
|
||||||
|
|
||||||
|
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
|
||||||
AC_SYS_LARGEFILE
|
AC_SYS_LARGEFILE
|
||||||
|
|
||||||
# Checks for header files.
|
# Checks for header files.
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ Table of contents (click func go):
|
|||||||
Functions:
|
Functions:
|
||||||
|
|
||||||
1. :c:func:`glm_mul`
|
1. :c:func:`glm_mul`
|
||||||
|
#. :c:func:`glm_mul_rot`
|
||||||
#. :c:func:`glm_inv_tr`
|
#. :c:func:`glm_inv_tr`
|
||||||
|
|
||||||
Functions documentation
|
Functions documentation
|
||||||
@@ -59,6 +60,27 @@ Functions documentation
|
|||||||
| *[in]* **m2** affine matrix 2
|
| *[in]* **m2** affine matrix 2
|
||||||
| *[out]* **dest** result matrix
|
| *[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)
|
.. c:function:: void glm_inv_tr(mat4 mat)
|
||||||
|
|
||||||
| inverse orthonormal rotation + translation matrix (ridig-body)
|
| inverse orthonormal rotation + translation matrix (ridig-body)
|
||||||
|
|||||||
@@ -5,6 +5,8 @@ affine transforms
|
|||||||
|
|
||||||
Header: cglm/affine.h
|
Header: cglm/affine.h
|
||||||
|
|
||||||
|
Initialize Transform Matrices
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
Functions with **_make** prefix expect you don't have a matrix and they create
|
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.
|
a matrix for you. You don't need to pass identity matrix.
|
||||||
|
|
||||||
@@ -15,6 +17,107 @@ before sending to transfrom functions.
|
|||||||
There are also functions to decompose transform matrix. These functions can't
|
There are also functions to decompose transform matrix. These functions can't
|
||||||
decompose matrix after projected.
|
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):
|
Table of contents (click to go):
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
@@ -29,15 +132,14 @@ Functions:
|
|||||||
#. :c:func:`glm_scale_to`
|
#. :c:func:`glm_scale_to`
|
||||||
#. :c:func:`glm_scale_make`
|
#. :c:func:`glm_scale_make`
|
||||||
#. :c:func:`glm_scale`
|
#. :c:func:`glm_scale`
|
||||||
#. :c:func:`glm_scale1`
|
|
||||||
#. :c:func:`glm_scale_uni`
|
#. :c:func:`glm_scale_uni`
|
||||||
#. :c:func:`glm_rotate_x`
|
#. :c:func:`glm_rotate_x`
|
||||||
#. :c:func:`glm_rotate_y`
|
#. :c:func:`glm_rotate_y`
|
||||||
#. :c:func:`glm_rotate_z`
|
#. :c:func:`glm_rotate_z`
|
||||||
#. :c:func:`glm_rotate_ndc_make`
|
|
||||||
#. :c:func:`glm_rotate_make`
|
#. :c:func:`glm_rotate_make`
|
||||||
#. :c:func:`glm_rotate_ndc`
|
|
||||||
#. :c:func:`glm_rotate`
|
#. :c:func:`glm_rotate`
|
||||||
|
#. :c:func:`glm_rotate_at`
|
||||||
|
#. :c:func:`glm_rotate_atm`
|
||||||
#. :c:func:`glm_decompose_scalev`
|
#. :c:func:`glm_decompose_scalev`
|
||||||
#. :c:func:`glm_uniscaled`
|
#. :c:func:`glm_uniscaled`
|
||||||
#. :c:func:`glm_decompose_rs`
|
#. :c:func:`glm_decompose_rs`
|
||||||
@@ -122,10 +224,6 @@ Functions documentation
|
|||||||
| *[in, out]* **m** affine transfrom
|
| *[in, out]* **m** affine transfrom
|
||||||
| *[in]* **v** scale vector [x, y, z]
|
| *[in]* **v** scale vector [x, y, z]
|
||||||
|
|
||||||
.. c:function:: void glm_scale1(mat4 m, float s)
|
|
||||||
|
|
||||||
DEPRECATED! Use glm_scale_uni
|
|
||||||
|
|
||||||
.. c:function:: void glm_scale_uni(mat4 m, float s)
|
.. c:function:: void glm_scale_uni(mat4 m, float s)
|
||||||
|
|
||||||
applies uniform scale to existing transform matrix v = [s, s, s]
|
applies uniform scale to existing transform matrix v = [s, s, s]
|
||||||
@@ -165,16 +263,6 @@ Functions documentation
|
|||||||
| *[in]* **angle** angle (radians)
|
| *[in]* **angle** angle (radians)
|
||||||
| *[out]* **dest** rotated matrix
|
| *[out]* **dest** rotated matrix
|
||||||
|
|
||||||
.. c:function:: void glm_rotate_ndc_make(mat4 m, float angle, vec3 axis_ndc)
|
|
||||||
|
|
||||||
creates NEW rotation matrix by angle and axis
|
|
||||||
this name may change in the future. axis must be is normalized
|
|
||||||
|
|
||||||
Parameters:
|
|
||||||
| *[out]* **m** affine transfrom
|
|
||||||
| *[in]* **angle** angle (radians)
|
|
||||||
| *[in]* **axis_ndc** normalized axis
|
|
||||||
|
|
||||||
.. c:function:: void glm_rotate_make(mat4 m, float angle, vec3 axis)
|
.. c:function:: void glm_rotate_make(mat4 m, float angle, vec3 axis)
|
||||||
|
|
||||||
creates NEW rotation matrix by angle and axis,
|
creates NEW rotation matrix by angle and axis,
|
||||||
@@ -185,16 +273,6 @@ Functions documentation
|
|||||||
| *[in]* **axis** angle (radians)
|
| *[in]* **axis** angle (radians)
|
||||||
| *[in]* **axis** axis
|
| *[in]* **axis** axis
|
||||||
|
|
||||||
.. c:function:: void glm_rotate_ndc(mat4 m, float angle, vec3 axis_ndc)
|
|
||||||
|
|
||||||
rotate existing transform matrix around Z axis by angle and axis
|
|
||||||
this name may change in the future, axis must be normalized.
|
|
||||||
|
|
||||||
Parameters:
|
|
||||||
| *[out]* **m** affine transfrom
|
|
||||||
| *[in]* **angle** angle (radians)
|
|
||||||
| *[in]* **axis_ndc** normalized axis
|
|
||||||
|
|
||||||
.. c:function:: void glm_rotate(mat4 m, float angle, vec3 axis)
|
.. c:function:: void glm_rotate(mat4 m, float angle, vec3 axis)
|
||||||
|
|
||||||
rotate existing transform matrix around Z axis by angle and axis
|
rotate existing transform matrix around Z axis by angle and axis
|
||||||
@@ -204,6 +282,29 @@ Functions documentation
|
|||||||
| *[in]* **angle** angle (radians)
|
| *[in]* **angle** angle (radians)
|
||||||
| *[in]* **axis** axis
|
| *[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)
|
.. c:function:: void glm_decompose_scalev(mat4 m, vec3 s)
|
||||||
|
|
||||||
decompose scale vector
|
decompose scale vector
|
||||||
|
|||||||
@@ -5,14 +5,14 @@ Some functions may exist twice,
|
|||||||
once for their namespace and once for global namespace
|
once for their namespace and once for global namespace
|
||||||
to make easier to write very common functions
|
to make easier to write very common functions
|
||||||
|
|
||||||
For instance, in general we use :code:`glm_vec_dot` to get dot product
|
For instance, in general we use :code:`glm_vec3_dot` to get dot product
|
||||||
of two **vec3**. Now we can also do this with :code:`glm_dot`,
|
of two **vec3**. Now we can also do this with :code:`glm_dot`,
|
||||||
same for *_cross* and so on...
|
same for *_cross* and so on...
|
||||||
|
|
||||||
The original function stays where it is, the function in global namespace
|
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.
|
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
|
e.g there is no func like :code:`glmc_dot` because *glm_dot* is just alias for
|
||||||
:code:`glm_vec_dot`
|
:code:`glm_vec3_dot`
|
||||||
|
|
||||||
By including **cglm/cglm.h** header you will include all inline version
|
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
|
of functions. Since functions in this header[s] are inline you don't need to
|
||||||
@@ -41,6 +41,10 @@ Follow the :doc:`build` documentation for this
|
|||||||
vec4-ext
|
vec4-ext
|
||||||
color
|
color
|
||||||
plane
|
plane
|
||||||
|
project
|
||||||
util
|
util
|
||||||
io
|
io
|
||||||
call
|
call
|
||||||
|
sphere
|
||||||
|
curve
|
||||||
|
bezier
|
||||||
|
|||||||
89
docs/source/bezier.rst
Normal file
89
docs/source/bezier.rst
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
.. default-domain:: C
|
||||||
|
|
||||||
|
Bezier
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
Header: cglm/bezier.h
|
||||||
|
|
||||||
|
Common helpers for cubic bezier and similar curves.
|
||||||
|
|
||||||
|
Table of contents (click to go):
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Functions:
|
||||||
|
|
||||||
|
1. :c:func:`glm_bezier`
|
||||||
|
2. :c:func:`glm_hermite`
|
||||||
|
3. :c:func:`glm_decasteljau`
|
||||||
|
|
||||||
|
Functions documentation
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
.. c:function:: float glm_bezier(float s, float p0, float c0, float c1, float p1)
|
||||||
|
|
||||||
|
| cubic bezier interpolation
|
||||||
|
| formula:
|
||||||
|
|
||||||
|
.. code-block:: text
|
||||||
|
|
||||||
|
B(s) = P0*(1-s)^3 + 3*C0*s*(1-s)^2 + 3*C1*s^2*(1-s) + P1*s^3
|
||||||
|
|
||||||
|
| similar result using matrix:
|
||||||
|
|
||||||
|
.. code-block:: text
|
||||||
|
|
||||||
|
B(s) = glm_smc(t, GLM_BEZIER_MAT, (vec4){p0, c0, c1, p1})
|
||||||
|
|
||||||
|
| glm_eq(glm_smc(...), glm_bezier(...)) should return TRUE
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **s** parameter between 0 and 1
|
||||||
|
| *[in]* **p0** begin point
|
||||||
|
| *[in]* **c0** control point 1
|
||||||
|
| *[in]* **c1** control point 2
|
||||||
|
| *[in]* **p1** end point
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
B(s)
|
||||||
|
|
||||||
|
.. c:function:: float glm_hermite(float s, float p0, float t0, float t1, float p1)
|
||||||
|
|
||||||
|
| cubic hermite interpolation
|
||||||
|
| formula:
|
||||||
|
|
||||||
|
.. code-block:: text
|
||||||
|
|
||||||
|
H(s) = P0*(2*s^3 - 3*s^2 + 1) + T0*(s^3 - 2*s^2 + s) + P1*(-2*s^3 + 3*s^2) + T1*(s^3 - s^2)
|
||||||
|
|
||||||
|
| similar result using matrix:
|
||||||
|
|
||||||
|
.. code-block:: text
|
||||||
|
|
||||||
|
H(s) = glm_smc(t, GLM_HERMITE_MAT, (vec4){p0, p1, c0, c1})
|
||||||
|
|
||||||
|
| glm_eq(glm_smc(...), glm_hermite(...)) should return TRUE
|
||||||
|
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **s** parameter between 0 and 1
|
||||||
|
| *[in]* **p0** begin point
|
||||||
|
| *[in]* **t0** tangent 1
|
||||||
|
| *[in]* **t1** tangent 2
|
||||||
|
| *[in]* **p1** end point
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
B(s)
|
||||||
|
|
||||||
|
.. c:function:: float glm_decasteljau(float prm, float p0, float c0, float c1, float p1)
|
||||||
|
|
||||||
|
| iterative way to solve cubic equation
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **prm** parameter between 0 and 1
|
||||||
|
| *[in]* **p0** begin point
|
||||||
|
| *[in]* **c0** control point 1
|
||||||
|
| *[in]* **c1** control point 2
|
||||||
|
| *[in]* **p1** end point
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
parameter to use in cubic equation
|
||||||
@@ -23,6 +23,16 @@ Functions:
|
|||||||
#. :c:func:`glm_aabb_merge`
|
#. :c:func:`glm_aabb_merge`
|
||||||
#. :c:func:`glm_aabb_crop`
|
#. :c:func:`glm_aabb_crop`
|
||||||
#. :c:func:`glm_aabb_crop_until`
|
#. :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
|
Functions documentation
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
@@ -61,7 +71,7 @@ Functions documentation
|
|||||||
| *[in]* **cropBox** crop box
|
| *[in]* **cropBox** crop box
|
||||||
| *[out]* **dest** cropped bounding box
|
| *[out]* **dest** cropped bounding box
|
||||||
|
|
||||||
.. c:function:: void glm_frustum_box(vec4 corners[8], mat4 m, vec3 box[2])
|
.. 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.
|
| crops a bounding box with another one.
|
||||||
|
|
||||||
@@ -90,3 +100,82 @@ Functions documentation
|
|||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **box** bounding box
|
| *[in]* **box** bounding box
|
||||||
| *[out]* **planes** frustum planes
|
| *[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
|
||||||
|
|||||||
@@ -1,9 +1,7 @@
|
|||||||
Building cglm
|
Build cglm
|
||||||
================================
|
================================
|
||||||
|
|
||||||
| **cglm** does not have external dependencies except for unit testing.
|
| **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.
|
||||||
| 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:
|
External dependencies:
|
||||||
* cmocka - for unit testing
|
* cmocka - for unit testing
|
||||||
@@ -12,7 +10,8 @@ External dependencies:
|
|||||||
If you only need to inline versions, you don't need to build **cglm**, you don't need to link it to your program.
|
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
|
Just import cglm to your project as dependency / external lib by copy-paste then use it as usual
|
||||||
|
|
||||||
**Unix (Autotools):**
|
Unix (Autotools):
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
.. code-block:: bash
|
.. code-block:: bash
|
||||||
:linenos:
|
:linenos:
|
||||||
@@ -26,11 +25,12 @@ Just import cglm to your project as dependency / external lib by copy-paste then
|
|||||||
$ [sudo] make install # install to system (optional)
|
$ [sudo] make install # install to system (optional)
|
||||||
|
|
||||||
**make** will build cglm to **.libs** sub folder in project folder.
|
**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.
|
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 (MSBuild):
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
Windows related build files, project files are located in win folder,
|
Windows related build files, project files are located in `win` folder,
|
||||||
make sure you are inside in cglm/win folder.
|
make sure you are inside in cglm/win folder.
|
||||||
|
|
||||||
Code Analysis are enabled, it may take awhile to build.
|
Code Analysis are enabled, it may take awhile to build.
|
||||||
@@ -50,3 +50,19 @@ then try to build with *devenv*:
|
|||||||
$ devenv cglm.sln /Build Release
|
$ devenv cglm.sln /Build Release
|
||||||
|
|
||||||
Currently tests are not available on Windows.
|
Currently tests are not available on Windows.
|
||||||
|
|
||||||
|
Documentation (Sphinx):
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
**cglm** uses sphinx framework for documentation, it allows lot of formats for documentation. To see all options see sphinx build page:
|
||||||
|
|
||||||
|
https://www.sphinx-doc.org/en/master/man/sphinx-build.html
|
||||||
|
|
||||||
|
Example build:
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
:linenos:
|
||||||
|
|
||||||
|
$ cd cglm/docs
|
||||||
|
$ sphinx-build source build
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ 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
|
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.
|
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
|
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
|
without providing UP axis. It uses :c:func:`glm_vec3_ortho` to get a UP axis and
|
||||||
builds view matrix.
|
builds view matrix.
|
||||||
|
|
||||||
You can also *_default* versions of ortho and perspective to build projection
|
You can also *_default* versions of ortho and perspective to build projection
|
||||||
@@ -36,6 +36,7 @@ Functions:
|
|||||||
#. :c:func:`glm_ortho_default`
|
#. :c:func:`glm_ortho_default`
|
||||||
#. :c:func:`glm_ortho_default_s`
|
#. :c:func:`glm_ortho_default_s`
|
||||||
#. :c:func:`glm_perspective`
|
#. :c:func:`glm_perspective`
|
||||||
|
#. :c:func:`glm_persp_move_far`
|
||||||
#. :c:func:`glm_perspective_default`
|
#. :c:func:`glm_perspective_default`
|
||||||
#. :c:func:`glm_perspective_resize`
|
#. :c:func:`glm_perspective_resize`
|
||||||
#. :c:func:`glm_lookat`
|
#. :c:func:`glm_lookat`
|
||||||
@@ -145,6 +146,16 @@ Functions documentation
|
|||||||
| *[in]* **farVal** far clipping planes
|
| *[in]* **farVal** far clipping planes
|
||||||
| *[out]* **dest** result matrix
|
| *[out]* **dest** result matrix
|
||||||
|
|
||||||
|
.. c:function:: void glm_persp_move_far(mat4 proj, float deltaFar)
|
||||||
|
|
||||||
|
| extend perspective projection matrix's far distance
|
||||||
|
|
||||||
|
| this function does not guarantee far >= near, be aware of that!
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in, out]* **proj** projection matrix to extend
|
||||||
|
| *[in]* **deltaFar** distance from existing far (negative to shink)
|
||||||
|
|
||||||
.. c:function:: void glm_perspective_default(float aspect, mat4 dest)
|
.. c:function:: void glm_perspective_default(float aspect, mat4 dest)
|
||||||
|
|
||||||
| set up perspective projection matrix with default near/far
|
| set up perspective projection matrix with default near/far
|
||||||
@@ -167,11 +178,13 @@ Functions documentation
|
|||||||
|
|
||||||
| set up view matrix
|
| 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:
|
Parameters:
|
||||||
| *[in]* **eye** eye vector
|
| *[in]* **eye** eye vector
|
||||||
| *[in]* **center** center vector
|
| *[in]* **center** center vector
|
||||||
| *[in]* **up** up vector
|
| *[in]* **up** up vector
|
||||||
| *[out]* **dest** result matrix
|
| *[out]* **dest** result matrix
|
||||||
|
|
||||||
.. c:function:: void glm_look(vec3 eye, vec3 dir, vec3 up, mat4 dest)
|
.. c:function:: void glm_look(vec3 eye, vec3 dir, vec3 up, mat4 dest)
|
||||||
|
|
||||||
@@ -181,6 +194,8 @@ Functions documentation
|
|||||||
target self then this might be useful. Because you need to get target
|
target self then this might be useful. Because you need to get target
|
||||||
from direction.
|
from direction.
|
||||||
|
|
||||||
|
**NOTE:** The UP vector must not be parallel to the line of sight from the eye point to the reference point.
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **eye** eye vector
|
| *[in]* **eye** eye vector
|
||||||
| *[in]* **center** direction vector
|
| *[in]* **center** direction vector
|
||||||
|
|||||||
@@ -62,9 +62,9 @@ author = u'Recep Aslantas'
|
|||||||
# built documents.
|
# built documents.
|
||||||
#
|
#
|
||||||
# The short X.Y version.
|
# The short X.Y version.
|
||||||
version = u'0.3.4'
|
version = u'0.5.4'
|
||||||
# The full version, including alpha/beta/rc tags.
|
# The full version, including alpha/beta/rc tags.
|
||||||
release = u'0.3.4'
|
release = u'0.5.4'
|
||||||
|
|
||||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||||
# for a list of supported languages.
|
# for a list of supported languages.
|
||||||
@@ -90,7 +90,7 @@ todo_include_todos = False
|
|||||||
# The theme to use for HTML and HTML Help pages. See the documentation for
|
# The theme to use for HTML and HTML Help pages. See the documentation for
|
||||||
# a list of builtin themes.
|
# a list of builtin themes.
|
||||||
#
|
#
|
||||||
html_theme = 'alabaster'
|
html_theme = 'sphinx_rtd_theme'
|
||||||
|
|
||||||
# Theme options are theme-specific and customize the look and feel of a theme
|
# 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
|
# further. For a list of options available for each theme, see the
|
||||||
@@ -99,13 +99,13 @@ html_theme = 'alabaster'
|
|||||||
# html_theme_options = {}
|
# html_theme_options = {}
|
||||||
|
|
||||||
html_theme_options = {
|
html_theme_options = {
|
||||||
'github_banner': 'true',
|
# 'github_banner': 'true',
|
||||||
'github_button': 'true',
|
# 'github_button': 'true',
|
||||||
'github_user': 'recp',
|
# 'github_user': 'recp',
|
||||||
'github_repo': 'cglm',
|
# 'github_repo': 'cglm',
|
||||||
'travis_button': 'true',
|
# 'travis_button': 'true',
|
||||||
'show_related': 'true',
|
# 'show_related': 'true',
|
||||||
'fixed_sidebar': 'true'
|
# 'fixed_sidebar': 'true'
|
||||||
}
|
}
|
||||||
|
|
||||||
# Add any paths that contain custom static files (such as style sheets) here,
|
# Add any paths that contain custom static files (such as style sheets) here,
|
||||||
|
|||||||
41
docs/source/curve.rst
Normal file
41
docs/source/curve.rst
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
.. default-domain:: C
|
||||||
|
|
||||||
|
Curve
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
Header: cglm/curve.h
|
||||||
|
|
||||||
|
Common helpers for common curves. For specific curve see its header/doc
|
||||||
|
e.g bezier
|
||||||
|
|
||||||
|
Table of contents (click to go):
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Functions:
|
||||||
|
|
||||||
|
1. :c:func:`glm_smc`
|
||||||
|
|
||||||
|
Functions documentation
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
.. c:function:: float glm_smc(float s, mat4 m, vec4 c)
|
||||||
|
|
||||||
|
| helper function to calculate **S** * **M** * **C** multiplication for curves
|
||||||
|
|
||||||
|
| this function does not encourage you to use SMC, instead it is a helper if you use SMC.
|
||||||
|
|
||||||
|
| if you want to specify S as vector then use more generic glm_mat4_rmc() func.
|
||||||
|
|
||||||
|
| Example usage:
|
||||||
|
|
||||||
|
.. code-block:: c
|
||||||
|
|
||||||
|
Bs = glm_smc(s, GLM_BEZIER_MAT, (vec4){p0, c0, c1, p1})
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **s** parameter between 0 and 1 (this will be [s3, s2, s, 1])
|
||||||
|
| *[in]* **m** basis matrix
|
||||||
|
| *[out]* **c** position/control vector
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
scalar value e.g. Bs
|
||||||
@@ -70,6 +70,7 @@ Functions:
|
|||||||
1. :c:func:`glm_euler_order`
|
1. :c:func:`glm_euler_order`
|
||||||
#. :c:func:`glm_euler_angles`
|
#. :c:func:`glm_euler_angles`
|
||||||
#. :c:func:`glm_euler`
|
#. :c:func:`glm_euler`
|
||||||
|
#. :c:func:`glm_euler_xyz`
|
||||||
#. :c:func:`glm_euler_zyx`
|
#. :c:func:`glm_euler_zyx`
|
||||||
#. :c:func:`glm_euler_zxy`
|
#. :c:func:`glm_euler_zxy`
|
||||||
#. :c:func:`glm_euler_xzy`
|
#. :c:func:`glm_euler_xzy`
|
||||||
@@ -115,8 +116,18 @@ Functions documentation
|
|||||||
|
|
||||||
| build rotation matrix from euler angles
|
| build rotation matrix from euler angles
|
||||||
|
|
||||||
|
this is alias of glm_euler_xyz function
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **angles** angles as vector [Ex, Ey, Ez]
|
| *[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
|
| *[in]* **dest** rotation matrix
|
||||||
|
|
||||||
.. c:function:: void glm_euler_zyx(vec3 angles, mat4 dest)
|
.. c:function:: void glm_euler_zyx(vec3 angles, mat4 dest)
|
||||||
@@ -124,7 +135,7 @@ Functions documentation
|
|||||||
| build rotation matrix from euler angles
|
| build rotation matrix from euler angles
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **angles** angles as vector [Ez, Ey, Ex]
|
| *[in]* **angles** angles as vector [Xangle, Yangle, Zangle]
|
||||||
| *[in]* **dest** rotation matrix
|
| *[in]* **dest** rotation matrix
|
||||||
|
|
||||||
.. c:function:: void glm_euler_zxy(vec3 angles, mat4 dest)
|
.. c:function:: void glm_euler_zxy(vec3 angles, mat4 dest)
|
||||||
@@ -132,7 +143,7 @@ Functions documentation
|
|||||||
| build rotation matrix from euler angles
|
| build rotation matrix from euler angles
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **angles** angles as vector [Ez, Ex, Ey]
|
| *[in]* **angles** angles as vector [Xangle, Yangle, Zangle]
|
||||||
| *[in]* **dest** rotation matrix
|
| *[in]* **dest** rotation matrix
|
||||||
|
|
||||||
.. c:function:: void glm_euler_xzy(vec3 angles, mat4 dest)
|
.. c:function:: void glm_euler_xzy(vec3 angles, mat4 dest)
|
||||||
@@ -140,7 +151,7 @@ Functions documentation
|
|||||||
| build rotation matrix from euler angles
|
| build rotation matrix from euler angles
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **angles** angles as vector [Ex, Ez, Ey]
|
| *[in]* **angles** angles as vector [Xangle, Yangle, Zangle]
|
||||||
| *[in]* **dest** rotation matrix
|
| *[in]* **dest** rotation matrix
|
||||||
|
|
||||||
.. c:function:: void glm_euler_yzx(vec3 angles, mat4 dest)
|
.. c:function:: void glm_euler_yzx(vec3 angles, mat4 dest)
|
||||||
@@ -148,7 +159,7 @@ Functions documentation
|
|||||||
build rotation matrix from euler angles
|
build rotation matrix from euler angles
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **angles** angles as vector [Ey, Ez, Ex]
|
| *[in]* **angles** angles as vector [Xangle, Yangle, Zangle]
|
||||||
| *[in]* **dest** rotation matrix
|
| *[in]* **dest** rotation matrix
|
||||||
|
|
||||||
.. c:function:: void glm_euler_yxz(vec3 angles, mat4 dest)
|
.. c:function:: void glm_euler_yxz(vec3 angles, mat4 dest)
|
||||||
@@ -156,7 +167,7 @@ Functions documentation
|
|||||||
| build rotation matrix from euler angles
|
| build rotation matrix from euler angles
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **angles** angles as vector [Ey, Ex, Ez]
|
| *[in]* **angles** angles as vector [Xangle, Yangle, Zangle]
|
||||||
| *[in]* **dest** rotation matrix
|
| *[in]* **dest** rotation matrix
|
||||||
|
|
||||||
.. c:function:: void glm_euler_by_order(vec3 angles, glm_euler_sq ord, mat4 dest)
|
.. c:function:: void glm_euler_by_order(vec3 angles, glm_euler_sq ord, mat4 dest)
|
||||||
@@ -166,6 +177,6 @@ Functions documentation
|
|||||||
Use :c:func:`glm_euler_order` function to build *ord* parameter
|
Use :c:func:`glm_euler_order` function to build *ord* parameter
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **angles** angles as vector (ord parameter spceifies angles order)
|
| *[in]* **angles** angles as vector [Xangle, Yangle, Zangle]
|
||||||
| *[in]* **ord** euler order
|
| *[in]* **ord** euler order
|
||||||
| *[in]* **dest** rotation matrix
|
| *[in]* **dest** rotation matrix
|
||||||
|
|||||||
23
docs/source/features.rst
Normal file
23
docs/source/features.rst
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
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...)
|
||||||
|
* bounding sphere
|
||||||
|
* project, unproject
|
||||||
|
* easing functions
|
||||||
|
* curves
|
||||||
|
* curve interpolation helpers (SMC, deCasteljau...)
|
||||||
|
* and other...
|
||||||
@@ -127,7 +127,7 @@ Functions documentation
|
|||||||
.. code-block:: c
|
.. code-block:: c
|
||||||
|
|
||||||
for (j = 0; j < 4; j++) {
|
for (j = 0; j < 4; j++) {
|
||||||
glm_vec_center(corners[i], corners[i + 4], centerCorners[i]);
|
glm_vec3_center(corners[i], corners[i + 4], centerCorners[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
corners[i + 4] is far of corners[i] point.
|
corners[i + 4] is far of corners[i] point.
|
||||||
|
|||||||
@@ -9,31 +9,40 @@ Types:
|
|||||||
.. code-block:: c
|
.. code-block:: c
|
||||||
:linenos:
|
:linenos:
|
||||||
|
|
||||||
typedef float vec3[3];
|
typedef float vec2[2];
|
||||||
typedef int ivec3[3];
|
typedef float vec3[3];
|
||||||
typedef CGLM_ALIGN(16) float vec4[4];
|
typedef int ivec3[3];
|
||||||
|
typedef CGLM_ALIGN_IF(16) float vec4[4];
|
||||||
|
typedef vec4 versor;
|
||||||
|
typedef vec3 mat3[3];
|
||||||
|
|
||||||
typedef vec3 mat3[3];
|
#ifdef __AVX__
|
||||||
typedef vec4 mat4[4];
|
typedef CGLM_ALIGN_IF(32) vec4 mat4[4];
|
||||||
|
#else
|
||||||
typedef vec4 versor;
|
typedef CGLM_ALIGN_IF(16) vec4 mat4[4];
|
||||||
|
#endif
|
||||||
|
|
||||||
As you can see types don't store extra informations in favor of space.
|
As you can see types don't store extra 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*
|
You can send these values e.g. matrix to OpenGL directly without casting or calling a function like *value_ptr*
|
||||||
|
|
||||||
Aligment is Required:
|
Alignment Is Required:
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
**vec4** and **mat4** requires 16 byte aligment because vec4 and mat4 operations are
|
**vec4** and **mat4** requires 16 (32 for **mat4** if AVX is enabled) byte alignment because **vec4** and **mat4** operations are vectorized by SIMD instructions (SSE/AVX/NEON).
|
||||||
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:
|
Allocations:
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
*cglm* doesn't alloc any memory on heap. So it doesn't provide any allocator.
|
*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.
|
You must allocate memory yourself. You should alloc memory for out parameters too if you pass pointer of memory location. When allocating memory, don't forget that **vec4** and **mat4** require alignment.
|
||||||
When allocating memory don't forget that **vec4** and **mat4** requires aligment.
|
|
||||||
|
|
||||||
**NOTE:** Unaligned vec4 and unaligned mat4 operations will be supported in the future. Check todo list.
|
**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.
|
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**
|
There is no guarantee that non-CGLM matrix is aligned. Unaligned types will have *u* prefix e.g. **umat4**
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
You can adapt this file completely to your liking, but it should at least
|
You can adapt this file completely to your liking, but it should at least
|
||||||
contain the root `toctree` directive.
|
contain the root `toctree` directive.
|
||||||
|
|
||||||
Welcome to cglm's documentation!
|
cglm Documentation
|
||||||
================================
|
================================
|
||||||
|
|
||||||
**cglm** is optimized 3D math library written in C99 (compatible with C89).
|
**cglm** is optimized 3D math library written in C99 (compatible with C89).
|
||||||
@@ -14,33 +14,38 @@ is considered to be supported as optional.
|
|||||||
|
|
||||||
Also currently only **float** type is supported for most operations.
|
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::
|
.. toctree::
|
||||||
:maxdepth: 1
|
:maxdepth: 2
|
||||||
:caption: Table Of Contents:
|
:caption: Getting Started:
|
||||||
|
|
||||||
|
features
|
||||||
build
|
build
|
||||||
getting_started
|
getting_started
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 2
|
||||||
|
:caption: How To:
|
||||||
|
|
||||||
opengl
|
opengl
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 2
|
||||||
|
:caption: API:
|
||||||
|
|
||||||
api
|
api
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 2
|
||||||
|
:caption: Options:
|
||||||
|
|
||||||
|
opt
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 2
|
||||||
|
:caption: Troubleshooting:
|
||||||
|
|
||||||
|
troubleshooting
|
||||||
|
|
||||||
Indices and tables
|
Indices and tables
|
||||||
==================
|
==================
|
||||||
|
|
||||||
|
|||||||
@@ -39,6 +39,7 @@ Functions:
|
|||||||
#. :c:func:`glm_vec3_print`
|
#. :c:func:`glm_vec3_print`
|
||||||
#. :c:func:`glm_ivec3_print`
|
#. :c:func:`glm_ivec3_print`
|
||||||
#. :c:func:`glm_versor_print`
|
#. :c:func:`glm_versor_print`
|
||||||
|
#. :c:func:`glm_aabb_print`
|
||||||
|
|
||||||
Functions documentation
|
Functions documentation
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
@@ -90,3 +91,12 @@ Functions documentation
|
|||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **vec** quaternion
|
| *[in]* **vec** quaternion
|
||||||
| *[in]* **ostream** FILE to write
|
| *[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
|
||||||
|
|||||||
@@ -20,15 +20,20 @@ Functions:
|
|||||||
|
|
||||||
1. :c:func:`glm_mat3_copy`
|
1. :c:func:`glm_mat3_copy`
|
||||||
#. :c:func:`glm_mat3_identity`
|
#. :c:func:`glm_mat3_identity`
|
||||||
|
#. :c:func:`glm_mat3_identity_array`
|
||||||
|
#. :c:func:`glm_mat3_zero`
|
||||||
#. :c:func:`glm_mat3_mul`
|
#. :c:func:`glm_mat3_mul`
|
||||||
#. :c:func:`glm_mat3_transpose_to`
|
#. :c:func:`glm_mat3_transpose_to`
|
||||||
#. :c:func:`glm_mat3_transpose`
|
#. :c:func:`glm_mat3_transpose`
|
||||||
#. :c:func:`glm_mat3_mulv`
|
#. :c:func:`glm_mat3_mulv`
|
||||||
|
#. :c:func:`glm_mat3_quat`
|
||||||
#. :c:func:`glm_mat3_scale`
|
#. :c:func:`glm_mat3_scale`
|
||||||
#. :c:func:`glm_mat3_det`
|
#. :c:func:`glm_mat3_det`
|
||||||
#. :c:func:`glm_mat3_inv`
|
#. :c:func:`glm_mat3_inv`
|
||||||
|
#. :c:func:`glm_mat3_trace`
|
||||||
#. :c:func:`glm_mat3_swap_col`
|
#. :c:func:`glm_mat3_swap_col`
|
||||||
#. :c:func:`glm_mat3_swap_row`
|
#. :c:func:`glm_mat3_swap_row`
|
||||||
|
#. :c:func:`glm_mat3_rmc`
|
||||||
|
|
||||||
Functions documentation
|
Functions documentation
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
@@ -48,6 +53,21 @@ Functions documentation
|
|||||||
Parameters:
|
Parameters:
|
||||||
| *[out]* **mat** matrix
|
| *[out]* **mat** matrix
|
||||||
|
|
||||||
|
.. c:function:: void glm_mat3_identity_array(mat3 * __restrict mat, size_t count)
|
||||||
|
|
||||||
|
make given matrix array's each element identity matrix
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in,out]* **mat** matrix array (must be aligned (16/32) if alignment is not disabled)
|
||||||
|
| *[in]* **count** count of matrices
|
||||||
|
|
||||||
|
.. c:function:: void glm_mat3_zero(mat3 mat)
|
||||||
|
|
||||||
|
make given matrix zero
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in,out]* **mat** matrix to
|
||||||
|
|
||||||
.. c:function:: void glm_mat3_mul(mat3 m1, mat3 m2, mat3 dest)
|
.. c:function:: void glm_mat3_mul(mat3 m1, mat3 m2, mat3 dest)
|
||||||
|
|
||||||
multiply m1 and m2 to dest
|
multiply m1 and m2 to dest
|
||||||
@@ -89,6 +109,14 @@ Functions documentation
|
|||||||
| *[in]* **v** vec3 (right, column vector)
|
| *[in]* **v** vec3 (right, column vector)
|
||||||
| *[out]* **dest** destination (result, 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)
|
.. c:function:: void glm_mat3_scale(mat3 m, float s)
|
||||||
|
|
||||||
multiply matrix with scalar
|
multiply matrix with scalar
|
||||||
@@ -115,6 +143,16 @@ Functions documentation
|
|||||||
| *[in]* **mat** matrix
|
| *[in]* **mat** matrix
|
||||||
| *[out]* **dest** destination (inverse matrix)
|
| *[out]* **dest** destination (inverse matrix)
|
||||||
|
|
||||||
|
.. c:function:: void glm_mat3_trace(mat3 m)
|
||||||
|
|
||||||
|
| sum of the elements on the main diagonal from upper left to the lower right
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **m** matrix
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
trace of matrix
|
||||||
|
|
||||||
.. c:function:: void glm_mat3_swap_col(mat3 mat, int col1, int col2)
|
.. c:function:: void glm_mat3_swap_col(mat3 mat, int col1, int col2)
|
||||||
|
|
||||||
swap two matrix columns
|
swap two matrix columns
|
||||||
@@ -132,3 +170,20 @@ Functions documentation
|
|||||||
| *[in, out]* **mat** matrix
|
| *[in, out]* **mat** matrix
|
||||||
| *[in]* **row1** row1
|
| *[in]* **row1** row1
|
||||||
| *[in]* **row2** row2
|
| *[in]* **row2** row2
|
||||||
|
|
||||||
|
.. c:function:: float glm_mat3_rmc(vec3 r, mat3 m, vec3 c)
|
||||||
|
|
||||||
|
| **rmc** stands for **Row** * **Matrix** * **Column**
|
||||||
|
|
||||||
|
| helper for R (row vector) * M (matrix) * C (column vector)
|
||||||
|
|
||||||
|
| the result is scalar because R * M = Matrix1x3 (row vector),
|
||||||
|
| then Matrix1x3 * Vec3 (column vector) = Matrix1x1 (Scalar)
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **r** row vector or matrix1x3
|
||||||
|
| *[in]* **m** matrix3x3
|
||||||
|
| *[in]* **c** column vector or matrix3x1
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
scalar value e.g. Matrix1x1
|
||||||
|
|||||||
@@ -25,6 +25,8 @@ Functions:
|
|||||||
1. :c:func:`glm_mat4_ucopy`
|
1. :c:func:`glm_mat4_ucopy`
|
||||||
#. :c:func:`glm_mat4_copy`
|
#. :c:func:`glm_mat4_copy`
|
||||||
#. :c:func:`glm_mat4_identity`
|
#. :c:func:`glm_mat4_identity`
|
||||||
|
#. :c:func:`glm_mat4_identity_array`
|
||||||
|
#. :c:func:`glm_mat4_zero`
|
||||||
#. :c:func:`glm_mat4_pick3`
|
#. :c:func:`glm_mat4_pick3`
|
||||||
#. :c:func:`glm_mat4_pick3t`
|
#. :c:func:`glm_mat4_pick3t`
|
||||||
#. :c:func:`glm_mat4_ins3`
|
#. :c:func:`glm_mat4_ins3`
|
||||||
@@ -32,6 +34,9 @@ Functions:
|
|||||||
#. :c:func:`glm_mat4_mulN`
|
#. :c:func:`glm_mat4_mulN`
|
||||||
#. :c:func:`glm_mat4_mulv`
|
#. :c:func:`glm_mat4_mulv`
|
||||||
#. :c:func:`glm_mat4_mulv3`
|
#. :c:func:`glm_mat4_mulv3`
|
||||||
|
#. :c:func:`glm_mat3_trace`
|
||||||
|
#. :c:func:`glm_mat3_trace3`
|
||||||
|
#. :c:func:`glm_mat4_quat`
|
||||||
#. :c:func:`glm_mat4_transpose_to`
|
#. :c:func:`glm_mat4_transpose_to`
|
||||||
#. :c:func:`glm_mat4_transpose`
|
#. :c:func:`glm_mat4_transpose`
|
||||||
#. :c:func:`glm_mat4_scale_p`
|
#. :c:func:`glm_mat4_scale_p`
|
||||||
@@ -41,6 +46,7 @@ Functions:
|
|||||||
#. :c:func:`glm_mat4_inv_fast`
|
#. :c:func:`glm_mat4_inv_fast`
|
||||||
#. :c:func:`glm_mat4_swap_col`
|
#. :c:func:`glm_mat4_swap_col`
|
||||||
#. :c:func:`glm_mat4_swap_row`
|
#. :c:func:`glm_mat4_swap_row`
|
||||||
|
#. :c:func:`glm_mat4_rmc`
|
||||||
|
|
||||||
Functions documentation
|
Functions documentation
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
@@ -68,6 +74,21 @@ Functions documentation
|
|||||||
Parameters:
|
Parameters:
|
||||||
| *[out]* **mat** matrix
|
| *[out]* **mat** matrix
|
||||||
|
|
||||||
|
.. c:function:: void glm_mat4_identity_array(mat4 * __restrict mat, size_t count)
|
||||||
|
|
||||||
|
make given matrix array's each element identity matrix
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in,out]* **mat** matrix array (must be aligned (16/32) if alignment is not disabled)
|
||||||
|
| *[in]* **count** count of matrices
|
||||||
|
|
||||||
|
.. c:function:: void glm_mat4_zero(mat4 mat)
|
||||||
|
|
||||||
|
make given matrix zero
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in,out]* **mat** matrix to
|
||||||
|
|
||||||
.. c:function:: void glm_mat4_pick3(mat4 mat, mat3 dest)
|
.. c:function:: void glm_mat4_pick3(mat4 mat, mat3 dest)
|
||||||
|
|
||||||
copy upper-left of mat4 to mat3
|
copy upper-left of mat4 to mat3
|
||||||
@@ -146,6 +167,35 @@ Functions documentation
|
|||||||
| *[in]* **v** vec3 (right, column vector)
|
| *[in]* **v** vec3 (right, column vector)
|
||||||
| *[out]* **dest** vec3 (result, column vector)
|
| *[out]* **dest** vec3 (result, column vector)
|
||||||
|
|
||||||
|
.. c:function:: void glm_mat4_trace(mat4 m)
|
||||||
|
|
||||||
|
| sum of the elements on the main diagonal from upper left to the lower right
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **m** matrix
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
trace of matrix
|
||||||
|
|
||||||
|
.. c:function:: void glm_mat4_trace3(mat4 m)
|
||||||
|
|
||||||
|
| trace of matrix (rotation part)
|
||||||
|
| sum of the elements on the main diagonal from upper left to the lower right
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **m** matrix
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
trace of matrix
|
||||||
|
|
||||||
|
.. c:function:: void glm_mat4_quat(mat4 m, versor dest)
|
||||||
|
|
||||||
|
convert mat4's rotation part to quaternion
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **m** affine matrix
|
||||||
|
| *[out]* **dest** destination quaternion
|
||||||
|
|
||||||
.. c:function:: void glm_mat4_transpose_to(mat4 m, mat4 dest)
|
.. c:function:: void glm_mat4_transpose_to(mat4 m, mat4 dest)
|
||||||
|
|
||||||
transpose mat4 and store in dest
|
transpose mat4 and store in dest
|
||||||
@@ -229,3 +279,20 @@ Functions documentation
|
|||||||
| *[in, out]* **mat** matrix
|
| *[in, out]* **mat** matrix
|
||||||
| *[in]* **row1** row1
|
| *[in]* **row1** row1
|
||||||
| *[in]* **row2** row2
|
| *[in]* **row2** row2
|
||||||
|
|
||||||
|
.. c:function:: float glm_mat4_rmc(vec4 r, mat4 m, vec4 c)
|
||||||
|
|
||||||
|
| **rmc** stands for **Row** * **Matrix** * **Column**
|
||||||
|
|
||||||
|
| helper for R (row vector) * M (matrix) * C (column vector)
|
||||||
|
|
||||||
|
| the result is scalar because R * M = Matrix1x4 (row vector),
|
||||||
|
| then Matrix1x4 * Vec4 (column vector) = Matrix1x1 (Scalar)
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **r** row vector or matrix1x4
|
||||||
|
| *[in]* **m** matrix4x4
|
||||||
|
| *[in]* **c** column vector or matrix4x1
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
scalar value e.g. Matrix1x1
|
||||||
|
|||||||
@@ -43,9 +43,9 @@ array of matrices:
|
|||||||
/* ... */
|
/* ... */
|
||||||
glUniformMatrix4fv(location, count, GL_FALSE, (float *)matrix);
|
glUniformMatrix4fv(location, count, GL_FALSE, (float *)matrix);
|
||||||
|
|
||||||
in this way, passing aray of matrices is same
|
in this way, passing aray of matrices is same
|
||||||
|
|
||||||
Passing / Uniforming Vectors to OpenGL:¶
|
Passing / Uniforming Vectors to OpenGL:
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
You don't need to do extra thing when passing cglm vectors to OpengL or other APIs.
|
You don't need to do extra thing when passing cglm vectors to OpengL or other APIs.
|
||||||
|
|||||||
52
docs/source/opt.rst
Normal file
52
docs/source/opt.rst
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
.. 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.
|
||||||
|
|
||||||
|
SSE3 and SSE4 Dot Product Options
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
You have to extra options for dot product: **CGLM_SSE4_DOT** and **CGLM_SSE3_DOT**.
|
||||||
|
|
||||||
|
- If **SSE4** is enabled then you can define **CGLM_SSE4_DOT** to force cglm to use **_mm_dp_ps** instruction.
|
||||||
|
- If **SSE3** is enabled then you can define **CGLM_SSE3_DOT** to force cglm to use **_mm_hadd_ps** instructions.
|
||||||
|
|
||||||
|
otherwise cglm will use custom cglm's hadd functions which are optimized too.
|
||||||
102
docs/source/project.rst
Normal file
102
docs/source/project.rst
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
.. default-domain:: C
|
||||||
|
|
||||||
|
Project / UnProject
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
Header: cglm/project.h
|
||||||
|
|
||||||
|
Viewport is required as *vec4* **[X, Y, Width, Height]** but this doesn't mean
|
||||||
|
that you should store it as **vec4**. You can convert your data representation
|
||||||
|
to vec4 before passing it to related functions.
|
||||||
|
|
||||||
|
Table of contents (click to go):
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Functions:
|
||||||
|
|
||||||
|
1. :c:func:`glm_unprojecti`
|
||||||
|
#. :c:func:`glm_unproject`
|
||||||
|
#. :c:func:`glm_project`
|
||||||
|
|
||||||
|
Functions documentation
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
.. c:function:: void glm_unprojecti(vec3 pos, mat4 invMat, vec4 vp, vec3 dest)
|
||||||
|
|
||||||
|
| maps the specified viewport coordinates into specified space [1]
|
||||||
|
the matrix should contain projection matrix.
|
||||||
|
|
||||||
|
if you don't have ( and don't want to have ) an inverse matrix then use
|
||||||
|
glm_unproject version. You may use existing inverse of matrix in somewhere
|
||||||
|
else, this is why glm_unprojecti exists to save save inversion cost
|
||||||
|
|
||||||
|
[1] space:
|
||||||
|
- if m = invProj: View Space
|
||||||
|
- if m = invViewProj: World Space
|
||||||
|
- if m = invMVP: Object Space
|
||||||
|
|
||||||
|
You probably want to map the coordinates into object space
|
||||||
|
so use invMVP as m
|
||||||
|
|
||||||
|
Computing viewProj:
|
||||||
|
|
||||||
|
.. code-block:: c
|
||||||
|
|
||||||
|
glm_mat4_mul(proj, view, viewProj);
|
||||||
|
glm_mat4_mul(viewProj, model, MVP);
|
||||||
|
glm_mat4_inv(viewProj, invMVP);
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **pos** point/position in viewport coordinates
|
||||||
|
| *[in]* **invMat** matrix (see brief)
|
||||||
|
| *[in]* **vp** viewport as [x, y, width, height]
|
||||||
|
| *[out]* **dest** unprojected coordinates
|
||||||
|
|
||||||
|
.. c:function:: void glm_unproject(vec3 pos, mat4 m, vec4 vp, vec3 dest)
|
||||||
|
|
||||||
|
| maps the specified viewport coordinates into specified space [1]
|
||||||
|
the matrix should contain projection matrix.
|
||||||
|
|
||||||
|
this is same as glm_unprojecti except this function get inverse matrix for
|
||||||
|
you.
|
||||||
|
|
||||||
|
[1] space:
|
||||||
|
- if m = proj: View Space
|
||||||
|
- if m = viewProj: World Space
|
||||||
|
- if m = MVP: Object Space
|
||||||
|
|
||||||
|
You probably want to map the coordinates into object space so use MVP as m
|
||||||
|
|
||||||
|
Computing viewProj and MVP:
|
||||||
|
|
||||||
|
.. code-block:: c
|
||||||
|
|
||||||
|
glm_mat4_mul(proj, view, viewProj);
|
||||||
|
glm_mat4_mul(viewProj, model, MVP);
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **pos** point/position in viewport coordinates
|
||||||
|
| *[in]* **m** matrix (see brief)
|
||||||
|
| *[in]* **vp** viewport as [x, y, width, height]
|
||||||
|
| *[out]* **dest** unprojected coordinates
|
||||||
|
|
||||||
|
.. c:function:: void glm_project(vec3 pos, mat4 m, vec4 vp, vec3 dest)
|
||||||
|
|
||||||
|
| map object coordinates to window coordinates
|
||||||
|
|
||||||
|
Computing MVP:
|
||||||
|
|
||||||
|
.. code-block:: c
|
||||||
|
|
||||||
|
glm_mat4_mul(proj, view, viewProj);
|
||||||
|
glm_mat4_mul(viewProj, model, MVP);
|
||||||
|
|
||||||
|
this could be useful for gettng a bbox which fits with view frustum and
|
||||||
|
object bounding boxes. In this case you crop view frustum box with objects
|
||||||
|
box
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **pos** object coordinates
|
||||||
|
| *[in]* **m** MVP matrix
|
||||||
|
| *[in]* **vp** viewport as [x, y, width, height]
|
||||||
|
| *[out]* **dest** projected coordinates
|
||||||
@@ -5,17 +5,16 @@ quaternions
|
|||||||
|
|
||||||
Header: cglm/quat.h
|
Header: cglm/quat.h
|
||||||
|
|
||||||
**Important:** *cglm* stores quaternion as [w, x, y, z] in memory, don't
|
**Important:** *cglm* stores quaternion as **[x, y, z, w]** in memory
|
||||||
forget that when changing quaternion items manually. For instance *quat[3]*
|
since **v0.4.0** it was **[w, x, y, z]**
|
||||||
is *quat.z* and *quat[0*] is *quat.w*. This may change in the future if *cglm*
|
before v0.4.0 ( **v0.3.5 and earlier** ). w is real part.
|
||||||
will got enough request to do that. Probably it will not be changed in near
|
|
||||||
future
|
|
||||||
|
|
||||||
There are some TODOs for quaternions check TODO list to see them.
|
What you can do with quaternions with existing functions is (Some of them):
|
||||||
|
|
||||||
Also **versor** is identity quaternion so the type may change to **vec4** or
|
- You can rotate transform matrix using quaterion
|
||||||
something else. This will not affect existing functions for your engine because
|
- You can rotate vector using quaterion
|
||||||
*versor* is alias of *vec4*
|
- You can create view matrix using quaterion
|
||||||
|
- You can create a lookrotation (from source point to dest)
|
||||||
|
|
||||||
Table of contents (click to go):
|
Table of contents (click to go):
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
@@ -28,14 +27,39 @@ Macros:
|
|||||||
Functions:
|
Functions:
|
||||||
|
|
||||||
1. :c:func:`glm_quat_identity`
|
1. :c:func:`glm_quat_identity`
|
||||||
|
#. :c:func:`glm_quat_identity_array`
|
||||||
|
#. :c:func:`glm_quat_init`
|
||||||
#. :c:func:`glm_quat`
|
#. :c:func:`glm_quat`
|
||||||
#. :c:func:`glm_quatv`
|
#. :c:func:`glm_quatv`
|
||||||
|
#. :c:func:`glm_quat_copy`
|
||||||
#. :c:func:`glm_quat_norm`
|
#. :c:func:`glm_quat_norm`
|
||||||
#. :c:func:`glm_quat_normalize`
|
#. :c:func:`glm_quat_normalize`
|
||||||
|
#. :c:func:`glm_quat_normalize_to`
|
||||||
#. :c:func:`glm_quat_dot`
|
#. :c:func:`glm_quat_dot`
|
||||||
#. :c:func:`glm_quat_mulv`
|
#. :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_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_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
|
Functions documentation
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
@@ -47,10 +71,31 @@ Functions documentation
|
|||||||
Parameters:
|
Parameters:
|
||||||
| *[in, out]* **q** quaternion
|
| *[in, out]* **q** quaternion
|
||||||
|
|
||||||
|
.. c:function:: void glm_quat_identity_array(versor * __restrict q, size_t count)
|
||||||
|
|
||||||
|
| make given quaternion array's each element identity quaternion
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in, out]* **q** quat array (must be aligned (16) if alignment is not disabled)
|
||||||
|
| *[in]* **count** count of quaternions
|
||||||
|
|
||||||
|
.. c:function:: void glm_quat_init(versor q, float x, float y, float z, float w)
|
||||||
|
|
||||||
|
| inits quaternion with given values
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[out]* **q** quaternion
|
||||||
|
| *[in]* **x** imag.x
|
||||||
|
| *[in]* **y** imag.y
|
||||||
|
| *[in]* **z** imag.z
|
||||||
|
| *[in]* **w** w (real part)
|
||||||
|
|
||||||
.. c:function:: void glm_quat(versor q, float angle, float x, float y, float z)
|
.. c:function:: void glm_quat(versor q, float angle, float x, float y, float z)
|
||||||
|
|
||||||
| creates NEW quaternion with individual axis components
|
| creates NEW quaternion with individual axis components
|
||||||
|
|
||||||
|
| given axis will be normalized
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[out]* **q** quaternion
|
| *[out]* **q** quaternion
|
||||||
| *[in]* **angle** angle (radians)
|
| *[in]* **angle** angle (radians)
|
||||||
@@ -58,14 +103,24 @@ Functions documentation
|
|||||||
| *[in]* **y** axis.y
|
| *[in]* **y** axis.y
|
||||||
| *[in]* **z** axis.z
|
| *[in]* **z** axis.z
|
||||||
|
|
||||||
.. c:function:: void glm_quatv(versor q, float angle, vec3 v)
|
.. c:function:: void glm_quatv(versor q, float angle, vec3 axis)
|
||||||
|
|
||||||
| creates NEW quaternion with axis vector
|
| creates NEW quaternion with axis vector
|
||||||
|
|
||||||
|
| given axis will be normalized
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[out]* **q** quaternion
|
| *[out]* **q** quaternion
|
||||||
| *[in]* **angle** angle (radians)
|
| *[in]* **angle** angle (radians)
|
||||||
| *[in]* **v** axis
|
| *[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)
|
.. c:function:: float glm_quat_norm(versor q)
|
||||||
|
|
||||||
@@ -77,6 +132,14 @@ Functions documentation
|
|||||||
Returns:
|
Returns:
|
||||||
norm (magnitude)
|
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)
|
.. c:function:: void glm_quat_normalize(versor q)
|
||||||
|
|
||||||
| normalize quaternion
|
| normalize quaternion
|
||||||
@@ -84,24 +147,118 @@ Functions documentation
|
|||||||
Parameters:
|
Parameters:
|
||||||
| *[in, out]* **q** quaternion
|
| *[in, out]* **q** quaternion
|
||||||
|
|
||||||
.. c:function:: float glm_quat_dot(versor q, versor r)
|
.. c:function:: float glm_quat_dot(versor p, versor q)
|
||||||
|
|
||||||
dot product of two quaternion
|
dot product of two quaternion
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **q1** quaternion 1
|
| *[in]* **p** quaternion 1
|
||||||
| *[in]* **q2** quaternion 2
|
| *[in]* **q** quaternion 2
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
dot product
|
dot product
|
||||||
|
|
||||||
.. c:function:: void glm_quat_mulv(versor q1, versor q2, versor dest)
|
.. 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
|
| 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:
|
Parameters:
|
||||||
| *[in]* **q1** quaternion 1
|
| *[in]* **p** quaternion 1 (first rotation)
|
||||||
| *[in]* **q2** quaternion 2
|
| *[in]* **q** quaternion 2 (second rotation)
|
||||||
| *[out]* **dest** result quaternion
|
| *[out]* **dest** result quaternion
|
||||||
|
|
||||||
.. c:function:: void glm_quat_mat4(versor q, mat4 dest)
|
.. c:function:: void glm_quat_mat4(versor q, mat4 dest)
|
||||||
@@ -112,13 +269,121 @@ Functions documentation
|
|||||||
| *[in]* **q** quaternion
|
| *[in]* **q** quaternion
|
||||||
| *[out]* **dest** result matrix
|
| *[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)
|
.. c:function:: void glm_quat_slerp(versor q, versor r, float t, versor dest)
|
||||||
|
|
||||||
| interpolates between two quaternions
|
| interpolates between two quaternions
|
||||||
| using spherical linear interpolation (SLERP)
|
| using spherical linear interpolation (SLERP)
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **q** from
|
| *[in]* **from** from
|
||||||
| *[in]* **r** to
|
| *[in]* **to** to
|
||||||
| *[in]* **t** amout
|
| *[in]* **t** interpolant (amount) clamped between 0 and 1
|
||||||
| *[out]* **dest** result quaternion
|
| *[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
docs/source/sphere.rst
Normal file
74
docs/source/sphere.rst
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
.. default-domain:: C
|
||||||
|
|
||||||
|
Sphere
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
Header: cglm/sphere.h
|
||||||
|
|
||||||
|
**Definition of sphere:**
|
||||||
|
|
||||||
|
Sphere Representation in cglm is *vec4*: **[center.x, center.y, center.z, radii]**
|
||||||
|
|
||||||
|
You can call any vec3 function by 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
docs/source/troubleshooting.rst
Normal file
79
docs/source/troubleshooting.rst
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
.. default-domain:: C
|
||||||
|
|
||||||
|
Troubleshooting
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
It is possible that sometimes you may get crashes or wrong results.
|
||||||
|
Follow these topics
|
||||||
|
|
||||||
|
Memory Allocation:
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Again, **cglm** doesn't alloc any memory on heap.
|
||||||
|
cglm functions works like memcpy; it copies data from src,
|
||||||
|
makes calculations then copy the result to dest.
|
||||||
|
|
||||||
|
You are responsible for allocation of **src** and **dest** parameters.
|
||||||
|
|
||||||
|
Alignment:
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
**vec4** and **mat4** types requires 16 byte alignment.
|
||||||
|
These types are marked with align attribute to let compiler know about this
|
||||||
|
requirement.
|
||||||
|
|
||||||
|
But since MSVC (Windows) throws the error:
|
||||||
|
|
||||||
|
**"formal parameter with requested alignment of 16 won't be aligned"**
|
||||||
|
|
||||||
|
The alignment attribute has been commented for MSVC
|
||||||
|
|
||||||
|
.. code-block:: c
|
||||||
|
|
||||||
|
#if defined(_MSC_VER)
|
||||||
|
# define CGLM_ALIGN(X) /* __declspec(align(X)) */
|
||||||
|
#else
|
||||||
|
# define CGLM_ALIGN(X) __attribute((aligned(X)))
|
||||||
|
#endif.
|
||||||
|
|
||||||
|
So MSVC may not know about alignment requirements when creating variables.
|
||||||
|
The interesting thing is that, if I remember correctly Visual Studio 2017
|
||||||
|
doesn't throw the above error. So we may uncomment that line for Visual Studio 2017,
|
||||||
|
you may do it yourself.
|
||||||
|
|
||||||
|
**This MSVC issue is still in TODOs.**
|
||||||
|
|
||||||
|
**UPDATE:** By starting v0.4.5 cglm provides an option to disable alignment requirement.
|
||||||
|
Also alignment is disabled for older msvc verisons as default. Now alignment is only required in Visual Studio 2017 version 15.6+ if CGLM_ALL_UNALIGNED macro is not defined.
|
||||||
|
|
||||||
|
Crashes, Invalid Memory Access:
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Probably you are trying to write to invalid memory location.
|
||||||
|
|
||||||
|
You may used wrong function for what you want to do.
|
||||||
|
|
||||||
|
For instance you may called **glm_vec4_** functions for **vec3** data type.
|
||||||
|
It will try to write 32 byte but since **vec3** is 24 byte it should throw
|
||||||
|
memory access error or exit the app without saying anything.
|
||||||
|
|
||||||
|
Wrong Results:
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Again, you may used wrong function.
|
||||||
|
|
||||||
|
For instance if you use **glm_normalize()** or **glm_vec3_normalize()** for **vec4**,
|
||||||
|
it will assume that passed param is **vec3** and will normalize it for **vec3**.
|
||||||
|
Since you need to **vec4** to be normalized in your case, you will get wrong results.
|
||||||
|
|
||||||
|
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.**
|
||||||
@@ -13,18 +13,25 @@ Table of contents (click to go):
|
|||||||
Functions:
|
Functions:
|
||||||
|
|
||||||
1. :c:func:`glm_sign`
|
1. :c:func:`glm_sign`
|
||||||
|
#. :c:func:`glm_signf`
|
||||||
#. :c:func:`glm_rad`
|
#. :c:func:`glm_rad`
|
||||||
#. :c:func:`glm_deg`
|
#. :c:func:`glm_deg`
|
||||||
#. :c:func:`glm_make_rad`
|
#. :c:func:`glm_make_rad`
|
||||||
#. :c:func:`glm_make_deg`
|
#. :c:func:`glm_make_deg`
|
||||||
#. :c:func:`glm_pow2`
|
#. :c:func:`glm_pow2`
|
||||||
|
#. :c:func:`glm_min`
|
||||||
|
#. :c:func:`glm_max`
|
||||||
|
#. :c:func:`glm_clamp`
|
||||||
|
#. :c:func:`glm_lerp`
|
||||||
|
|
||||||
Functions documentation
|
Functions documentation
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
.. c:function:: int glm_sign(int val)
|
.. c:function:: int glm_sign(int val)
|
||||||
|
|
||||||
| returns sign of 32 bit integer as +1 or -1
|
| returns sign of 32 bit integer as +1, -1, 0
|
||||||
|
|
||||||
|
| **Important**: It returns 0 for zero input
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **val** an integer
|
| *[in]* **val** an integer
|
||||||
@@ -32,6 +39,18 @@ Functions documentation
|
|||||||
Returns:
|
Returns:
|
||||||
sign of given number
|
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)
|
.. c:function:: float glm_rad(float deg)
|
||||||
|
|
||||||
| convert degree to radians
|
| convert degree to radians
|
||||||
@@ -91,3 +110,64 @@ Functions documentation
|
|||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
maximum value
|
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)
|
||||||
|
|||||||
@@ -14,20 +14,25 @@ Table of contents (click to go):
|
|||||||
|
|
||||||
Functions:
|
Functions:
|
||||||
|
|
||||||
1. :c:func:`glm_vec_mulv`
|
1. :c:func:`glm_vec3_mulv`
|
||||||
#. :c:func:`glm_vec_broadcast`
|
#. :c:func:`glm_vec3_broadcast`
|
||||||
#. :c:func:`glm_vec_eq`
|
#. :c:func:`glm_vec3_eq`
|
||||||
#. :c:func:`glm_vec_eq_eps`
|
#. :c:func:`glm_vec3_eq_eps`
|
||||||
#. :c:func:`glm_vec_eq_all`
|
#. :c:func:`glm_vec3_eq_all`
|
||||||
#. :c:func:`glm_vec_eqv`
|
#. :c:func:`glm_vec3_eqv`
|
||||||
#. :c:func:`glm_vec_eqv_eps`
|
#. :c:func:`glm_vec3_eqv_eps`
|
||||||
#. :c:func:`glm_vec_max`
|
#. :c:func:`glm_vec3_max`
|
||||||
#. :c:func:`glm_vec_min`
|
#. :c:func:`glm_vec3_min`
|
||||||
|
#. :c:func:`glm_vec3_isnan`
|
||||||
|
#. :c:func:`glm_vec3_isinf`
|
||||||
|
#. :c:func:`glm_vec3_isvalid`
|
||||||
|
#. :c:func:`glm_vec3_sign`
|
||||||
|
#. :c:func:`glm_vec3_sqrt`
|
||||||
|
|
||||||
Functions documentation
|
Functions documentation
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
.. c:function:: void glm_vec_mulv(vec3 a, vec3 b, vec3 d)
|
.. c:function:: void glm_vec3_mulv(vec3 a, vec3 b, vec3 d)
|
||||||
|
|
||||||
multiplies individual items
|
multiplies individual items
|
||||||
|
|
||||||
@@ -36,7 +41,7 @@ Functions documentation
|
|||||||
| *[in]* **b** vec2
|
| *[in]* **b** vec2
|
||||||
| *[out]* **d** destination (v1[0] * v2[0], v1[1] * v2[1], v1[2] * v2[2])
|
| *[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)
|
.. c:function:: void glm_vec3_broadcast(float val, vec3 d)
|
||||||
|
|
||||||
fill a vector with specified value
|
fill a vector with specified value
|
||||||
|
|
||||||
@@ -44,7 +49,7 @@ Functions documentation
|
|||||||
| *[in]* **val** value
|
| *[in]* **val** value
|
||||||
| *[out]* **dest** destination
|
| *[out]* **dest** destination
|
||||||
|
|
||||||
.. c:function:: bool glm_vec_eq(vec3 v, float val)
|
.. c:function:: bool glm_vec3_eq(vec3 v, float val)
|
||||||
|
|
||||||
check if vector is equal to value (without epsilon)
|
check if vector is equal to value (without epsilon)
|
||||||
|
|
||||||
@@ -52,7 +57,7 @@ Functions documentation
|
|||||||
| *[in]* **v** vector
|
| *[in]* **v** vector
|
||||||
| *[in]* **val** value
|
| *[in]* **val** value
|
||||||
|
|
||||||
.. c:function:: bool glm_vec_eq_eps(vec3 v, float val)
|
.. c:function:: bool glm_vec3_eq_eps(vec3 v, float val)
|
||||||
|
|
||||||
check if vector is equal to value (with epsilon)
|
check if vector is equal to value (with epsilon)
|
||||||
|
|
||||||
@@ -60,14 +65,14 @@ Functions documentation
|
|||||||
| *[in]* **v** vector
|
| *[in]* **v** vector
|
||||||
| *[in]* **val** value
|
| *[in]* **val** value
|
||||||
|
|
||||||
.. c:function:: bool glm_vec_eq_all(vec3 v)
|
.. c:function:: bool glm_vec3_eq_all(vec3 v)
|
||||||
|
|
||||||
check if vectors members are equal (without epsilon)
|
check if vectors members are equal (without epsilon)
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **v** vector
|
| *[in]* **v** vector
|
||||||
|
|
||||||
.. c:function:: bool glm_vec_eqv(vec3 v1, vec3 v2)
|
.. c:function:: bool glm_vec3_eqv(vec3 v1, vec3 v2)
|
||||||
|
|
||||||
check if vector is equal to another (without epsilon) vector
|
check if vector is equal to another (without epsilon) vector
|
||||||
|
|
||||||
@@ -75,7 +80,7 @@ Functions documentation
|
|||||||
| *[in]* **vec** vector 1
|
| *[in]* **vec** vector 1
|
||||||
| *[in]* **vec** vector 2
|
| *[in]* **vec** vector 2
|
||||||
|
|
||||||
.. c:function:: bool glm_vec_eqv_eps(vec3 v1, vec3 v2)
|
.. c:function:: bool glm_vec3_eqv_eps(vec3 v1, vec3 v2)
|
||||||
|
|
||||||
check if vector is equal to another (with epsilon)
|
check if vector is equal to another (with epsilon)
|
||||||
|
|
||||||
@@ -83,16 +88,56 @@ Functions documentation
|
|||||||
| *[in]* **v1** vector1
|
| *[in]* **v1** vector1
|
||||||
| *[in]* **v2** vector2
|
| *[in]* **v2** vector2
|
||||||
|
|
||||||
.. c:function:: float glm_vec_max(vec3 v)
|
.. c:function:: float glm_vec3_max(vec3 v)
|
||||||
|
|
||||||
max value of vector
|
max value of vector
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **v** vector
|
| *[in]* **v** vector
|
||||||
|
|
||||||
.. c:function:: float glm_vec_min(vec3 v)
|
.. c:function:: float glm_vec3_min(vec3 v)
|
||||||
|
|
||||||
min value of vector
|
min value of vector
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **v** vector
|
| *[in]* **v** vector
|
||||||
|
|
||||||
|
.. c:function:: bool glm_vec3_isnan(vec3 v)
|
||||||
|
|
||||||
|
| check if one of items is NaN (not a number)
|
||||||
|
| you should only use this in DEBUG mode or very critical asserts
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
|
||||||
|
.. c:function:: bool glm_vec3_isinf(vec3 v)
|
||||||
|
|
||||||
|
| check if one of items is INFINITY
|
||||||
|
| you should only use this in DEBUG mode or very critical asserts
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
|
||||||
|
.. c:function:: bool glm_vec3_isvalid(vec3 v)
|
||||||
|
|
||||||
|
| check if all items are valid number
|
||||||
|
| you should only use this in DEBUG mode or very critical asserts
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec3_sign(vec3 v, vec3 dest)
|
||||||
|
|
||||||
|
get sign of 32 bit float as +1, -1, 0
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
| *[out]* **dest** sign vector (only keeps signs as -1, 0, -1)
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec3_sqrt(vec3 v, vec3 dest)
|
||||||
|
|
||||||
|
square root of each vector item
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
| *[out]* **dest** destination vector (sqrt(v))
|
||||||
|
|||||||
@@ -5,9 +5,14 @@ vec3
|
|||||||
|
|
||||||
Header: cglm/vec3.h
|
Header: cglm/vec3.h
|
||||||
|
|
||||||
|
**Important:** *cglm* was used **glm_vec_** namespace for vec3 functions until
|
||||||
|
**v0.5.0**, since **v0.5.0** cglm uses **glm_vec3_** namespace for vec3.
|
||||||
|
|
||||||
|
Also `glm_vec3_flipsign` has been renamed to `glm_vec3_negate`
|
||||||
|
|
||||||
We mostly use vectors in graphics math, to make writing code faster
|
We mostly use vectors in graphics math, to make writing code faster
|
||||||
and easy to read, some *vec3* functions are aliased in global namespace.
|
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`,
|
For instance :c:func:`glm_dot` is alias of :c:func:`glm_vec3_dot`,
|
||||||
alias means inline wrapper here. There is no call verison of alias functions
|
alias means inline wrapper here. There is no call verison of alias functions
|
||||||
|
|
||||||
There are also functions for rotating *vec3* vector. **_m4**, **_m3** prefixes
|
There are also functions for rotating *vec3* vector. **_m4**, **_m3** prefixes
|
||||||
@@ -18,7 +23,7 @@ Table of contents (click to go):
|
|||||||
|
|
||||||
Macros:
|
Macros:
|
||||||
|
|
||||||
1. glm_vec_dup(v, dest)
|
1. glm_vec3_dup(v, dest)
|
||||||
#. GLM_VEC3_ONE_INIT
|
#. GLM_VEC3_ONE_INIT
|
||||||
#. GLM_VEC3_ZERO_INIT
|
#. GLM_VEC3_ZERO_INIT
|
||||||
#. GLM_VEC3_ONE
|
#. GLM_VEC3_ONE
|
||||||
@@ -30,29 +35,50 @@ Macros:
|
|||||||
Functions:
|
Functions:
|
||||||
|
|
||||||
1. :c:func:`glm_vec3`
|
1. :c:func:`glm_vec3`
|
||||||
#. :c:func:`glm_vec_copy`
|
#. :c:func:`glm_vec3_copy`
|
||||||
#. :c:func:`glm_vec_dot`
|
#. :c:func:`glm_vec3_zero`
|
||||||
#. :c:func:`glm_vec_cross`
|
#. :c:func:`glm_vec3_one`
|
||||||
#. :c:func:`glm_vec_norm2`
|
#. :c:func:`glm_vec3_dot`
|
||||||
#. :c:func:`glm_vec_norm`
|
#. :c:func:`glm_vec3_norm2`
|
||||||
#. :c:func:`glm_vec_add`
|
#. :c:func:`glm_vec3_norm`
|
||||||
#. :c:func:`glm_vec_sub`
|
#. :c:func:`glm_vec3_add`
|
||||||
#. :c:func:`glm_vec_scale`
|
#. :c:func:`glm_vec3_adds`
|
||||||
#. :c:func:`glm_vec_scale_as`
|
#. :c:func:`glm_vec3_sub`
|
||||||
#. :c:func:`glm_vec_flipsign`
|
#. :c:func:`glm_vec3_subs`
|
||||||
#. :c:func:`glm_vec_inv`
|
#. :c:func:`glm_vec3_mul`
|
||||||
#. :c:func:`glm_vec_inv_to`
|
#. :c:func:`glm_vec3_scale`
|
||||||
#. :c:func:`glm_vec_normalize`
|
#. :c:func:`glm_vec3_scale_as`
|
||||||
#. :c:func:`glm_vec_normalize_to`
|
#. :c:func:`glm_vec3_div`
|
||||||
#. :c:func:`glm_vec_distance`
|
#. :c:func:`glm_vec3_divs`
|
||||||
#. :c:func:`glm_vec_angle`
|
#. :c:func:`glm_vec3_addadd`
|
||||||
#. :c:func:`glm_vec_rotate`
|
#. :c:func:`glm_vec3_subadd`
|
||||||
#. :c:func:`glm_vec_rotate_m4`
|
#. :c:func:`glm_vec3_muladd`
|
||||||
#. :c:func:`glm_vec_proj`
|
#. :c:func:`glm_vec3_muladds`
|
||||||
#. :c:func:`glm_vec_center`
|
#. :c:func:`glm_vec3_maxadd`
|
||||||
#. :c:func:`glm_vec_maxv`
|
#. :c:func:`glm_vec3_minadd`
|
||||||
#. :c:func:`glm_vec_minv`
|
#. :c:func:`glm_vec3_flipsign`
|
||||||
#. :c:func:`glm_vec_ortho`
|
#. :c:func:`glm_vec3_flipsign_to`
|
||||||
|
#. :c:func:`glm_vec3_inv`
|
||||||
|
#. :c:func:`glm_vec3_inv_to`
|
||||||
|
#. :c:func:`glm_vec3_negate`
|
||||||
|
#. :c:func:`glm_vec3_negate_to`
|
||||||
|
#. :c:func:`glm_vec3_normalize`
|
||||||
|
#. :c:func:`glm_vec3_normalize_to`
|
||||||
|
#. :c:func:`glm_vec3_cross`
|
||||||
|
#. :c:func:`glm_vec3_crossn`
|
||||||
|
#. :c:func:`glm_vec3_distance2`
|
||||||
|
#. :c:func:`glm_vec3_distance`
|
||||||
|
#. :c:func:`glm_vec3_angle`
|
||||||
|
#. :c:func:`glm_vec3_rotate`
|
||||||
|
#. :c:func:`glm_vec3_rotate_m4`
|
||||||
|
#. :c:func:`glm_vec3_rotate_m3`
|
||||||
|
#. :c:func:`glm_vec3_proj`
|
||||||
|
#. :c:func:`glm_vec3_center`
|
||||||
|
#. :c:func:`glm_vec3_maxv`
|
||||||
|
#. :c:func:`glm_vec3_minv`
|
||||||
|
#. :c:func:`glm_vec3_ortho`
|
||||||
|
#. :c:func:`glm_vec3_clamp`
|
||||||
|
#. :c:func:`glm_vec3_lerp`
|
||||||
|
|
||||||
Functions documentation
|
Functions documentation
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
@@ -65,7 +91,7 @@ Functions documentation
|
|||||||
| *[in]* **v4** vector4
|
| *[in]* **v4** vector4
|
||||||
| *[out]* **dest** destination
|
| *[out]* **dest** destination
|
||||||
|
|
||||||
.. c:function:: void glm_vec_copy(vec3 a, vec3 dest)
|
.. c:function:: void glm_vec3_copy(vec3 a, vec3 dest)
|
||||||
|
|
||||||
copy all members of [a] to [dest]
|
copy all members of [a] to [dest]
|
||||||
|
|
||||||
@@ -73,7 +99,21 @@ Functions documentation
|
|||||||
| *[in]* **a** source
|
| *[in]* **a** source
|
||||||
| *[out]* **dest** destination
|
| *[out]* **dest** destination
|
||||||
|
|
||||||
.. c:function:: float glm_vec_dot(vec3 a, vec3 b)
|
.. c:function:: void glm_vec3_zero(vec3 v)
|
||||||
|
|
||||||
|
makes all members 0.0f (zero)
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in, out]* **v** vector
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec3_one(vec3 v)
|
||||||
|
|
||||||
|
makes all members 1.0f (one)
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in, out]* **v** vector
|
||||||
|
|
||||||
|
.. c:function:: float glm_vec3_dot(vec3 a, vec3 b)
|
||||||
|
|
||||||
dot product of vec3
|
dot product of vec3
|
||||||
|
|
||||||
@@ -84,16 +124,25 @@ Functions documentation
|
|||||||
Returns:
|
Returns:
|
||||||
dot product
|
dot product
|
||||||
|
|
||||||
.. c:function:: void glm_vec_cross(vec3 a, vec3 b, vec3 d)
|
.. c:function:: void glm_vec3_cross(vec3 a, vec3 b, vec3 d)
|
||||||
|
|
||||||
cross product
|
cross product of two vector (RH)
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **a** source 1
|
| *[in]* **a** vector 1
|
||||||
| *[in]* **b** source 2
|
| *[in]* **b** vector 2
|
||||||
| *[out]* **d** destination
|
| *[out]* **dest** destination
|
||||||
|
|
||||||
.. c:function:: float glm_vec_norm2(vec3 v)
|
.. c:function:: void glm_vec3_crossn(vec3 a, vec3 b, vec3 dest)
|
||||||
|
|
||||||
|
cross product of two vector (RH) and normalize the result
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **a** vector 1
|
||||||
|
| *[in]* **b** vector 2
|
||||||
|
| *[out]* **dest** destination
|
||||||
|
|
||||||
|
.. c:function:: float glm_vec3_norm2(vec3 v)
|
||||||
|
|
||||||
norm * norm (magnitude) of vector
|
norm * norm (magnitude) of vector
|
||||||
|
|
||||||
@@ -107,32 +156,59 @@ Functions documentation
|
|||||||
Returns:
|
Returns:
|
||||||
square of norm / magnitude
|
square of norm / magnitude
|
||||||
|
|
||||||
.. c:function:: float glm_vec_norm(vec3 vec)
|
.. c:function:: float glm_vec3_norm(vec3 vec)
|
||||||
|
|
||||||
norm (magnitude) of vec3
|
norm (magnitude) of vec3
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **vec** vector
|
| *[in]* **vec** vector
|
||||||
|
|
||||||
.. c:function:: void glm_vec_add(vec3 v1, vec3 v2, vec3 dest)
|
.. c:function:: void glm_vec3_add(vec3 a, vec3 b, vec3 dest)
|
||||||
|
|
||||||
add v2 vector to v1 vector store result in dest
|
add a vector to b vector store result in dest
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **v1** vector1
|
| *[in]* **a** vector1
|
||||||
| *[in]* **v2** vector2
|
| *[in]* **b** vector2
|
||||||
| *[out]* **dest** destination vector
|
| *[out]* **dest** destination vector
|
||||||
|
|
||||||
.. c:function:: void glm_vec_sub(vec3 v1, vec3 v2, vec3 dest)
|
.. c:function:: void glm_vec3_adds(vec3 a, float s, vec3 dest)
|
||||||
|
|
||||||
subtract v2 vector from v1 vector store result in dest
|
add scalar to v vector store result in dest (d = v + vec(s))
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **v1** vector1
|
| *[in]* **v** vector
|
||||||
| *[in]* **v2** vector2
|
| *[in]* **s** scalar
|
||||||
| *[out]* **dest** destination vector
|
| *[out]* **dest** destination vector
|
||||||
|
|
||||||
.. c:function:: void glm_vec_scale(vec3 v, float s, vec3 dest)
|
.. c:function:: void glm_vec3_sub(vec3 v1, vec3 v2, vec3 dest)
|
||||||
|
|
||||||
|
subtract b vector from a vector store result in dest (d = v1 - v2)
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **a** vector1
|
||||||
|
| *[in]* **b** vector2
|
||||||
|
| *[out]* **dest** destination vector
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec3_subs(vec3 v, float s, vec3 dest)
|
||||||
|
|
||||||
|
subtract scalar from v vector store result in dest (d = v - vec(s))
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
| *[in]* **s** scalar
|
||||||
|
| *[out]* **dest** destination vector
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec3_mul(vec3 a, vec3 b, vec3 d)
|
||||||
|
|
||||||
|
multiply two vector (component-wise multiplication)
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **a** vector
|
||||||
|
| *[in]* **b** scalar
|
||||||
|
| *[out]* **d** result = (a[0] * b[0], a[1] * b[1], a[2] * b[2])
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec3_scale(vec3 v, float s, vec3 dest)
|
||||||
|
|
||||||
multiply/scale vec3 vector with scalar: result = v * s
|
multiply/scale vec3 vector with scalar: result = v * s
|
||||||
|
|
||||||
@@ -142,7 +218,7 @@ Functions documentation
|
|||||||
| *[in]* **s** scalar
|
| *[in]* **s** scalar
|
||||||
| *[out]* **dest** destination vector
|
| *[out]* **dest** destination vector
|
||||||
|
|
||||||
.. c:function:: void glm_vec_scale_as(vec3 v, float s, vec3 dest)
|
.. c:function:: void glm_vec3_scale_as(vec3 v, float s, vec3 dest)
|
||||||
|
|
||||||
make vec3 vector scale as specified: result = unit(v) * s
|
make vec3 vector scale as specified: result = unit(v) * s
|
||||||
|
|
||||||
@@ -151,36 +227,145 @@ Functions documentation
|
|||||||
| *[in]* **s** scalar
|
| *[in]* **s** scalar
|
||||||
| *[out]* **dest** destination vector
|
| *[out]* **dest** destination vector
|
||||||
|
|
||||||
.. c:function:: void glm_vec_flipsign(vec3 v)
|
.. c:function:: void glm_vec3_div(vec3 a, vec3 b, vec3 dest)
|
||||||
|
|
||||||
flip sign of all vec3 members
|
div vector with another component-wise division: d = a / b
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in, out]* **v** vector
|
| *[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_inv(vec3 v)
|
.. c:function:: void glm_vec3_divs(vec3 v, float s, vec3 dest)
|
||||||
|
|
||||||
make vector as inverse/opposite of itself
|
div vector with scalar: d = v / s
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
| *[in]* **s** scalar
|
||||||
|
| *[out]* **dest** result = (a[0] / s, a[1] / s, a[2] / s])
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec3_addadd(vec3 a, vec3 b, vec3 dest)
|
||||||
|
|
||||||
|
| add two vectors and add result to sum
|
||||||
|
| it applies += operator so dest must be initialized
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **a** vector 1
|
||||||
|
| *[in]* **b** vector 2
|
||||||
|
| *[out]* **dest** dest += (a + b)
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec3_subadd(vec3 a, vec3 b, vec3 dest)
|
||||||
|
|
||||||
|
| sub two vectors and add result to sum
|
||||||
|
| it applies += operator so dest must be initialized
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **a** vector 1
|
||||||
|
| *[in]* **b** vector 2
|
||||||
|
| *[out]* **dest** dest += (a - b)
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec3_muladd(vec3 a, vec3 b, vec3 dest)
|
||||||
|
|
||||||
|
| mul two vectors and add result to sum
|
||||||
|
| it applies += operator so dest must be initialized
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **a** vector 1
|
||||||
|
| *[in]* **b** vector 2
|
||||||
|
| *[out]* **dest** dest += (a * b)
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec3_muladds(vec3 a, float s, vec3 dest)
|
||||||
|
|
||||||
|
| mul vector with scalar and add result to sum
|
||||||
|
| it applies += operator so dest must be initialized
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **a** vector
|
||||||
|
| *[in]* **s** scalar
|
||||||
|
| *[out]* **dest** dest += (a * b)
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec3_maxadd(vec3 a, vec3 b, vec3 dest)
|
||||||
|
|
||||||
|
| add max of two vector to result/dest
|
||||||
|
| it applies += operator so dest must be initialized
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **a** vector 1
|
||||||
|
| *[in]* **b** vector 2
|
||||||
|
| *[out]* **dest** dest += (a * b)
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec3_minadd(vec3 a, vec3 b, vec3 dest)
|
||||||
|
|
||||||
|
| add min of two vector to result/dest
|
||||||
|
| it applies += operator so dest must be initialized
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **a** vector 1
|
||||||
|
| *[in]* **b** vector 2
|
||||||
|
| *[out]* **dest** dest += (a * b)
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec3_flipsign(vec3 v)
|
||||||
|
|
||||||
|
**DEPRACATED!**
|
||||||
|
|
||||||
|
use :c:func:`glm_vec3_negate`
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in, out]* **v** vector
|
| *[in, out]* **v** vector
|
||||||
|
|
||||||
.. c:function:: void glm_vec_inv_to(vec3 v, vec3 dest)
|
.. c:function:: void glm_vec3_flipsign_to(vec3 v, vec3 dest)
|
||||||
|
|
||||||
inverse/opposite vector
|
**DEPRACATED!**
|
||||||
|
|
||||||
|
use :c:func:`glm_vec3_negate_to`
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
| *[out]* **dest** negated vector
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec3_inv(vec3 v)
|
||||||
|
|
||||||
|
**DEPRACATED!**
|
||||||
|
|
||||||
|
use :c:func:`glm_vec3_negate`
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in, out]* **v** vector
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec3_inv_to(vec3 v, vec3 dest)
|
||||||
|
|
||||||
|
**DEPRACATED!**
|
||||||
|
|
||||||
|
use :c:func:`glm_vec3_negate_to`
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **v** source
|
| *[in]* **v** source
|
||||||
| *[out]* **dest** destination
|
| *[out]* **dest** destination
|
||||||
|
|
||||||
.. c:function:: void glm_vec_normalize(vec3 v)
|
.. c:function:: void glm_vec3_negate(vec3 v)
|
||||||
|
|
||||||
|
negate vector components
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in, out]* **v** vector
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec3_negate_to(vec3 v, vec3 dest)
|
||||||
|
|
||||||
|
negate vector components and store result in dest
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
| *[out]* **dest** negated vector
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec3_normalize(vec3 v)
|
||||||
|
|
||||||
normalize vec3 and store result in same vec
|
normalize vec3 and store result in same vec
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in, out]* **v** vector
|
| *[in, out]* **v** vector
|
||||||
|
|
||||||
.. c:function:: void glm_vec_normalize_to(vec3 vec, vec3 dest)
|
.. c:function:: void glm_vec3_normalize_to(vec3 vec, vec3 dest)
|
||||||
|
|
||||||
normalize vec3 to dest
|
normalize vec3 to dest
|
||||||
|
|
||||||
@@ -188,7 +373,7 @@ Functions documentation
|
|||||||
| *[in]* **vec** source
|
| *[in]* **vec** source
|
||||||
| *[out]* **dest** destination
|
| *[out]* **dest** destination
|
||||||
|
|
||||||
.. c:function:: float glm_vec_angle(vec3 v1, vec3 v2)
|
.. c:function:: float glm_vec3_angle(vec3 v1, vec3 v2)
|
||||||
|
|
||||||
angle betwen two vector
|
angle betwen two vector
|
||||||
|
|
||||||
@@ -199,16 +384,16 @@ Functions documentation
|
|||||||
Return:
|
Return:
|
||||||
| angle as radians
|
| angle as radians
|
||||||
|
|
||||||
.. c:function:: void glm_vec_rotate(vec3 v, float angle, vec3 axis)
|
.. c:function:: void glm_vec3_rotate(vec3 v, float angle, vec3 axis)
|
||||||
|
|
||||||
rotate vec3 around axis by angle using Rodrigues' rotation formula
|
rotate vec3 around axis by angle using Rodrigues' rotation formula
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in, out]* **v** vector
|
| *[in, out]* **v** vector
|
||||||
| *[in]* **axis** axis vector (must be unit vector)
|
| *[in]* **axis** axis vector (will be normalized)
|
||||||
| *[out]* **angle** angle (radians)
|
| *[out]* **angle** angle (radians)
|
||||||
|
|
||||||
.. c:function:: void glm_vec_rotate_m4(mat4 m, vec3 v, vec3 dest)
|
.. c:function:: void glm_vec3_rotate_m4(mat4 m, vec3 v, vec3 dest)
|
||||||
|
|
||||||
apply rotation matrix to vector
|
apply rotation matrix to vector
|
||||||
|
|
||||||
@@ -217,7 +402,16 @@ Functions documentation
|
|||||||
| *[in]* **v** vector
|
| *[in]* **v** vector
|
||||||
| *[out]* **dest** rotated vector
|
| *[out]* **dest** rotated vector
|
||||||
|
|
||||||
.. c:function:: void glm_vec_proj(vec3 a, vec3 b, vec3 dest)
|
.. c:function:: void glm_vec3_rotate_m3(mat3 m, vec3 v, vec3 dest)
|
||||||
|
|
||||||
|
apply rotation matrix to vector
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **m** affine matrix or rot matrix
|
||||||
|
| *[in]* **v** vector
|
||||||
|
| *[out]* **dest** rotated vector
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec3_proj(vec3 a, vec3 b, vec3 dest)
|
||||||
|
|
||||||
project a vector onto b vector
|
project a vector onto b vector
|
||||||
|
|
||||||
@@ -226,7 +420,7 @@ Functions documentation
|
|||||||
| *[in]* **b** vector2
|
| *[in]* **b** vector2
|
||||||
| *[out]* **dest** projected vector
|
| *[out]* **dest** projected vector
|
||||||
|
|
||||||
.. c:function:: void glm_vec_center(vec3 v1, vec3 v2, vec3 dest)
|
.. c:function:: void glm_vec3_center(vec3 v1, vec3 v2, vec3 dest)
|
||||||
|
|
||||||
find center point of two vector
|
find center point of two vector
|
||||||
|
|
||||||
@@ -235,7 +429,18 @@ Functions documentation
|
|||||||
| *[in]* **v2** vector2
|
| *[in]* **v2** vector2
|
||||||
| *[out]* **dest** center point
|
| *[out]* **dest** center point
|
||||||
|
|
||||||
.. c:function:: float glm_vec_distance(vec3 v1, vec3 v2)
|
.. c:function:: float glm_vec3_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_vec3_distance(vec3 v1, vec3 v2)
|
||||||
|
|
||||||
distance between two vectors
|
distance between two vectors
|
||||||
|
|
||||||
@@ -246,7 +451,7 @@ Functions documentation
|
|||||||
Returns:
|
Returns:
|
||||||
| distance
|
| distance
|
||||||
|
|
||||||
.. c:function:: void glm_vec_maxv(vec3 v1, vec3 v2, vec3 dest)
|
.. c:function:: void glm_vec3_maxv(vec3 v1, vec3 v2, vec3 dest)
|
||||||
|
|
||||||
max values of vectors
|
max values of vectors
|
||||||
|
|
||||||
@@ -255,7 +460,7 @@ Functions documentation
|
|||||||
| *[in]* **v2** vector2
|
| *[in]* **v2** vector2
|
||||||
| *[out]* **dest** destination
|
| *[out]* **dest** destination
|
||||||
|
|
||||||
.. c:function:: void glm_vec_minv(vec3 v1, vec3 v2, vec3 dest)
|
.. c:function:: void glm_vec3_minv(vec3 v1, vec3 v2, vec3 dest)
|
||||||
|
|
||||||
min values of vectors
|
min values of vectors
|
||||||
|
|
||||||
@@ -264,10 +469,31 @@ Functions documentation
|
|||||||
| *[in]* **v2** vector2
|
| *[in]* **v2** vector2
|
||||||
| *[out]* **dest** destination
|
| *[out]* **dest** destination
|
||||||
|
|
||||||
.. c:function:: void glm_vec_ortho(vec3 v, vec3 dest)
|
.. c:function:: void glm_vec3_ortho(vec3 v, vec3 dest)
|
||||||
|
|
||||||
possible orthogonal/perpendicular vector
|
possible orthogonal/perpendicular vector
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **mat** vector
|
| *[in]* **mat** vector
|
||||||
| *[out]* **dest** orthogonal/perpendicular vector
|
| *[out]* **dest** orthogonal/perpendicular vector
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec3_clamp(vec3 v, float minVal, float maxVal)
|
||||||
|
|
||||||
|
constrain a value to lie between two further values
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in, out]* **v** vector
|
||||||
|
| *[in]* **minVal** minimum value
|
||||||
|
| *[in]* **maxVal** maximum value
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec3_lerp(vec3 from, vec3 to, float t, vec3 dest)
|
||||||
|
|
||||||
|
linear interpolation between two vector
|
||||||
|
|
||||||
|
| formula: from + s * (to - from)
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **from** from value
|
||||||
|
| *[in]* **to** to value
|
||||||
|
| *[in]* **t** interpolant (amount) clamped between 0 and 1
|
||||||
|
| *[out]* **dest** destination
|
||||||
|
|||||||
@@ -96,3 +96,43 @@ Functions documentation
|
|||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **v** vector
|
| *[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))
|
||||||
|
|||||||
@@ -24,21 +24,41 @@ Functions:
|
|||||||
1. :c:func:`glm_vec4`
|
1. :c:func:`glm_vec4`
|
||||||
#. :c:func:`glm_vec4_copy3`
|
#. :c:func:`glm_vec4_copy3`
|
||||||
#. :c:func:`glm_vec4_copy`
|
#. :c:func:`glm_vec4_copy`
|
||||||
|
#. :c:func:`glm_vec4_ucopy`
|
||||||
|
#. :c:func:`glm_vec4_zero`
|
||||||
|
#. :c:func:`glm_vec4_one`
|
||||||
#. :c:func:`glm_vec4_dot`
|
#. :c:func:`glm_vec4_dot`
|
||||||
#. :c:func:`glm_vec4_norm2`
|
#. :c:func:`glm_vec4_norm2`
|
||||||
#. :c:func:`glm_vec4_norm`
|
#. :c:func:`glm_vec4_norm`
|
||||||
#. :c:func:`glm_vec4_add`
|
#. :c:func:`glm_vec4_add`
|
||||||
|
#. :c:func:`glm_vec4_adds`
|
||||||
#. :c:func:`glm_vec4_sub`
|
#. :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`
|
||||||
#. :c:func:`glm_vec4_scale_as`
|
#. :c:func:`glm_vec4_scale_as`
|
||||||
|
#. :c:func:`glm_vec4_div`
|
||||||
|
#. :c:func:`glm_vec4_divs`
|
||||||
|
#. :c:func:`glm_vec4_addadd`
|
||||||
|
#. :c:func:`glm_vec4_subadd`
|
||||||
|
#. :c:func:`glm_vec4_muladd`
|
||||||
|
#. :c:func:`glm_vec4_muladds`
|
||||||
|
#. :c:func:`glm_vec4_maxadd`
|
||||||
|
#. :c:func:`glm_vec4_minadd`
|
||||||
#. :c:func:`glm_vec4_flipsign`
|
#. :c:func:`glm_vec4_flipsign`
|
||||||
|
#. :c:func:`glm_vec4_flipsign_to`
|
||||||
#. :c:func:`glm_vec4_inv`
|
#. :c:func:`glm_vec4_inv`
|
||||||
#. :c:func:`glm_vec4_inv_to`
|
#. :c:func:`glm_vec4_inv_to`
|
||||||
|
#. :c:func:`glm_vec4_negate`
|
||||||
|
#. :c:func:`glm_vec4_negate_to`
|
||||||
#. :c:func:`glm_vec4_normalize`
|
#. :c:func:`glm_vec4_normalize`
|
||||||
#. :c:func:`glm_vec4_normalize_to`
|
#. :c:func:`glm_vec4_normalize_to`
|
||||||
#. :c:func:`glm_vec4_distance`
|
#. :c:func:`glm_vec4_distance`
|
||||||
#. :c:func:`glm_vec4_maxv`
|
#. :c:func:`glm_vec4_maxv`
|
||||||
#. :c:func:`glm_vec4_minv`
|
#. :c:func:`glm_vec4_minv`
|
||||||
|
#. :c:func:`glm_vec4_clamp`
|
||||||
|
#. :c:func:`glm_vec4_lerp`
|
||||||
|
#. :c:func:`glm_vec4_cubic`
|
||||||
|
|
||||||
Functions documentation
|
Functions documentation
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
@@ -70,6 +90,23 @@ Functions documentation
|
|||||||
| *[in]* **v** source
|
| *[in]* **v** source
|
||||||
| *[in]* **dest** destination
|
| *[in]* **dest** destination
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec4_ucopy(vec4 v, vec4 dest)
|
||||||
|
|
||||||
|
copy all members of [a] to [dest]
|
||||||
|
|
||||||
|
| alignment is not required
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** source
|
||||||
|
| *[in]* **dest** destination
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec4_zero(vec4 v)
|
||||||
|
|
||||||
|
makes all members zero
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in, out]* **v** vector
|
||||||
|
|
||||||
.. c:function:: float glm_vec4_dot(vec4 a, vec4 b)
|
.. c:function:: float glm_vec4_dot(vec4 a, vec4 b)
|
||||||
|
|
||||||
dot product of vec4
|
dot product of vec4
|
||||||
@@ -102,24 +139,51 @@ Functions documentation
|
|||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **vec** vector
|
| *[in]* **vec** vector
|
||||||
|
|
||||||
.. c:function:: void glm_vec4_add(vec4 v1, vec4 v2, vec4 dest)
|
.. c:function:: void glm_vec4_add(vec4 a, vec4 b, vec4 dest)
|
||||||
|
|
||||||
add v2 vector to v1 vector store result in dest
|
add a vector to b vector store result in dest
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **v1** vector1
|
| *[in]* **a** vector1
|
||||||
| *[in]* **v2** vector2
|
| *[in]* **b** vector2
|
||||||
| *[out]* **dest** destination vector
|
| *[out]* **dest** destination vector
|
||||||
|
|
||||||
.. c:function:: void glm_vec4_sub(vec4 v1, vec4 v2, vec4 dest)
|
.. c:function:: void glm_vec4_adds(vec4 v, float s, vec4 dest)
|
||||||
|
|
||||||
subtract v2 vector from v1 vector store result in dest
|
add scalar to v vector store result in dest (d = v + vec(s))
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **v1** vector1
|
| *[in]* **v** vector
|
||||||
| *[in]* **v2** vector2
|
| *[in]* **s** scalar
|
||||||
| *[out]* **dest** destination vector
|
| *[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)
|
.. c:function:: void glm_vec4_scale(vec4 v, float s, vec4 dest)
|
||||||
|
|
||||||
multiply/scale vec4 vector with scalar: result = v * s
|
multiply/scale vec4 vector with scalar: result = v * s
|
||||||
@@ -138,28 +202,137 @@ Functions documentation
|
|||||||
| *[in]* **s** scalar
|
| *[in]* **s** scalar
|
||||||
| *[out]* **dest** destination vector
|
| *[out]* **dest** destination vector
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec4_div(vec4 a, vec4 b, vec4 dest)
|
||||||
|
|
||||||
|
div vector with another component-wise division: d = v1 / v2
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **a** vector1
|
||||||
|
| *[in]* **b** vector2
|
||||||
|
| *[out]* **dest** result = (a[0] / b[0], a[1] / b[1], a[2] / b[2], a[3] / b[3])
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec4_divs(vec4 v, float s, vec4 dest)
|
||||||
|
|
||||||
|
div vector with scalar: d = v / s
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
| *[in]* **s** scalar
|
||||||
|
| *[out]* **dest** result = (a[0] / s, a[1] / s, a[2] / s, a[3] / s)
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec4_addadd(vec4 a, vec4 b, vec4 dest)
|
||||||
|
|
||||||
|
| add two vectors and add result to sum
|
||||||
|
| it applies += operator so dest must be initialized
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **a** vector 1
|
||||||
|
| *[in]* **b** vector 2
|
||||||
|
| *[out]* **dest** dest += (a + b)
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec4_subadd(vec4 a, vec4 b, vec4 dest)
|
||||||
|
|
||||||
|
| sub two vectors and add result to sum
|
||||||
|
| it applies += operator so dest must be initialized
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **a** vector 1
|
||||||
|
| *[in]* **b** vector 2
|
||||||
|
| *[out]* **dest** dest += (a - b)
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec4_muladd(vec4 a, vec4 b, vec4 dest)
|
||||||
|
|
||||||
|
| mul two vectors and add result to sum
|
||||||
|
| it applies += operator so dest must be initialized
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **a** vector 1
|
||||||
|
| *[in]* **b** vector 2
|
||||||
|
| *[out]* **dest** dest += (a * b)
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec4_muladds(vec4 a, float s, vec4 dest)
|
||||||
|
|
||||||
|
| mul vector with scalar and add result to sum
|
||||||
|
| it applies += operator so dest must be initialized
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **a** vector
|
||||||
|
| *[in]* **s** scalar
|
||||||
|
| *[out]* **dest** dest += (a * b)
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec4_maxadd(vec4 a, vec4 b, vec4 dest)
|
||||||
|
|
||||||
|
| add max of two vector to result/dest
|
||||||
|
| it applies += operator so dest must be initialized
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **a** vector 1
|
||||||
|
| *[in]* **b** vector 2
|
||||||
|
| *[out]* **dest** dest += (a * b)
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec4_minadd(vec4 a, vec4 b, vec4 dest)
|
||||||
|
|
||||||
|
| add min of two vector to result/dest
|
||||||
|
| it applies += operator so dest must be initialized
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **a** vector 1
|
||||||
|
| *[in]* **b** vector 2
|
||||||
|
| *[out]* **dest** dest += (a * b)
|
||||||
|
|
||||||
.. c:function:: void glm_vec4_flipsign(vec4 v)
|
.. c:function:: void glm_vec4_flipsign(vec4 v)
|
||||||
|
|
||||||
flip sign of all vec4 members
|
**DEPRACATED!**
|
||||||
|
|
||||||
|
use :c:func:`glm_vec4_negate`
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in, out]* **v** vector
|
| *[in, out]* **v** vector
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec4_flipsign_to(vec4 v, vec4 dest)
|
||||||
|
|
||||||
|
**DEPRACATED!**
|
||||||
|
|
||||||
|
use :c:func:`glm_vec4_negate_to`
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
| *[out]* **dest** negated vector
|
||||||
|
|
||||||
.. c:function:: void glm_vec4_inv(vec4 v)
|
.. c:function:: void glm_vec4_inv(vec4 v)
|
||||||
|
|
||||||
make vector as inverse/opposite of itself
|
**DEPRACATED!**
|
||||||
|
|
||||||
|
use :c:func:`glm_vec4_negate`
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in, out]* **v** vector
|
| *[in, out]* **v** vector
|
||||||
|
|
||||||
.. c:function:: void glm_vec4_inv_to(vec4 v, vec4 dest)
|
.. c:function:: void glm_vec4_inv_to(vec4 v, vec4 dest)
|
||||||
|
|
||||||
inverse/opposite vector
|
**DEPRACATED!**
|
||||||
|
|
||||||
|
use :c:func:`glm_vec4_negate_to`
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **v** source
|
| *[in]* **v** source
|
||||||
| *[out]* **dest** destination
|
| *[out]* **dest** destination
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec4_negate(vec4 v)
|
||||||
|
|
||||||
|
negate vector components
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in, out]* **v** vector
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec4_negate_to(vec4 v, vec4 dest)
|
||||||
|
|
||||||
|
negate vector components and store result in dest
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
| *[out]* **dest** negated vector
|
||||||
|
|
||||||
.. c:function:: void glm_vec4_normalize(vec4 v)
|
.. c:function:: void glm_vec4_normalize(vec4 v)
|
||||||
|
|
||||||
normalize vec4 and store result in same vec
|
normalize vec4 and store result in same vec
|
||||||
@@ -203,3 +376,32 @@ Functions documentation
|
|||||||
| *[in]* **v1** vector1
|
| *[in]* **v1** vector1
|
||||||
| *[in]* **v2** vector2
|
| *[in]* **v2** vector2
|
||||||
| *[out]* **dest** destination
|
| *[out]* **dest** destination
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec4_clamp(vec4 v, float minVal, float maxVal)
|
||||||
|
|
||||||
|
constrain a value to lie between two further values
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in, out]* **v** vector
|
||||||
|
| *[in]* **minVal** minimum value
|
||||||
|
| *[in]* **maxVal** maximum value
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec4_lerp(vec4 from, vec4 to, float t, vec4 dest)
|
||||||
|
|
||||||
|
linear interpolation between two vector
|
||||||
|
|
||||||
|
| formula: from + s * (to - from)
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **from** from value
|
||||||
|
| *[in]* **to** to value
|
||||||
|
| *[in]* **t** interpolant (amount) clamped between 0 and 1
|
||||||
|
| *[out]* **dest** destination
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec4_cubic(float s, vec4 dest)
|
||||||
|
|
||||||
|
helper to fill vec4 as [S^3, S^2, S, 1]
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **s** parameter
|
||||||
|
| *[out]* **dest** destination
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "mat4.h"
|
#include "mat4.h"
|
||||||
|
#include "mat3.h"
|
||||||
|
|
||||||
#ifdef CGLM_SSE_FP
|
#ifdef CGLM_SSE_FP
|
||||||
# include "simd/sse2/affine.h"
|
# include "simd/sse2/affine.h"
|
||||||
@@ -43,7 +44,7 @@
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mul(mat4 m1, mat4 m2, mat4 dest) {
|
glm_mul(const mat4 m1, const mat4 m2, mat4 dest) {
|
||||||
#ifdef __AVX__
|
#ifdef __AVX__
|
||||||
glm_mul_avx(m1, m2, dest);
|
glm_mul_avx(m1, m2, dest);
|
||||||
#elif defined( __SSE__ ) || defined( __SSE2__ )
|
#elif defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
@@ -81,6 +82,59 @@ glm_mul(mat4 m1, mat4 m2, mat4 dest) {
|
|||||||
#endif
|
#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(const mat4 m1, const 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)
|
* @brief inverse orthonormal rotation + translation matrix (ridig-body)
|
||||||
*
|
*
|
||||||
@@ -97,8 +151,8 @@ glm_inv_tr(mat4 mat) {
|
|||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
glm_inv_tr_sse2(mat);
|
glm_inv_tr_sse2(mat);
|
||||||
#else
|
#else
|
||||||
CGLM_ALIGN(16) mat3 r;
|
CGLM_ALIGN_MAT mat3 r;
|
||||||
CGLM_ALIGN(16) vec3 t;
|
CGLM_ALIGN(8) vec3 t;
|
||||||
|
|
||||||
/* rotate */
|
/* rotate */
|
||||||
glm_mat4_pick3t(mat, r);
|
glm_mat4_pick3t(mat, r);
|
||||||
@@ -106,8 +160,8 @@ glm_inv_tr(mat4 mat) {
|
|||||||
|
|
||||||
/* translate */
|
/* translate */
|
||||||
glm_mat3_mulv(r, mat[3], t);
|
glm_mat3_mulv(r, mat[3], t);
|
||||||
glm_vec_flipsign(t);
|
glm_vec3_negate(t);
|
||||||
glm_vec_copy(t, mat[3]);
|
glm_vec3_copy(t, mat[3]);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -16,15 +16,14 @@
|
|||||||
CGLM_INLINE void glm_scale_to(mat4 m, vec3 v, mat4 dest);
|
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_make(mat4 m, vec3 v);
|
||||||
CGLM_INLINE void glm_scale(mat4 m, vec3 v);
|
CGLM_INLINE void glm_scale(mat4 m, vec3 v);
|
||||||
CGLM_INLINE void glm_scale1(mat4 m, float s);
|
|
||||||
CGLM_INLINE void glm_scale_uni(mat4 m, float s);
|
CGLM_INLINE void glm_scale_uni(mat4 m, float s);
|
||||||
CGLM_INLINE void glm_rotate_x(mat4 m, float angle, mat4 dest);
|
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_y(mat4 m, float angle, mat4 dest);
|
||||||
CGLM_INLINE void glm_rotate_z(mat4 m, float angle, mat4 dest);
|
CGLM_INLINE void glm_rotate_z(mat4 m, float angle, mat4 dest);
|
||||||
CGLM_INLINE void glm_rotate_ndc_make(mat4 m, float angle, vec3 axis_ndc);
|
|
||||||
CGLM_INLINE void glm_rotate_make(mat4 m, float angle, vec3 axis);
|
CGLM_INLINE void glm_rotate_make(mat4 m, float angle, vec3 axis);
|
||||||
CGLM_INLINE void glm_rotate_ndc(mat4 m, float angle, vec3 axis);
|
|
||||||
CGLM_INLINE void glm_rotate(mat4 m, float angle, vec3 axis);
|
CGLM_INLINE void glm_rotate(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 void glm_decompose_scalev(mat4 m, vec3 s);
|
||||||
CGLM_INLINE bool glm_uniscaled(mat4 m);
|
CGLM_INLINE bool glm_uniscaled(mat4 m);
|
||||||
CGLM_INLINE void glm_decompose_rs(mat4 m, mat4 r, vec3 s);
|
CGLM_INLINE void glm_decompose_rs(mat4 m, mat4 r, vec3 s);
|
||||||
@@ -35,51 +34,15 @@
|
|||||||
#define cglm_affine_h
|
#define cglm_affine_h
|
||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "vec4.h"
|
|
||||||
#include "affine-mat.h"
|
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
#include "vec3.h"
|
||||||
|
#include "vec4.h"
|
||||||
|
#include "mat4.h"
|
||||||
|
#include "affine-mat.h"
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief translate existing transform matrix by v vector
|
|
||||||
* and store result in dest
|
|
||||||
*
|
|
||||||
* @param[in] m affine transfrom
|
|
||||||
* @param[in] v translate vector [x, y, z]
|
|
||||||
* @param[out] dest translated matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_translate_to(mat4 m, vec3 v, mat4 dest) {
|
glm_mat4_mul(const mat4 m1, const mat4 m2, mat4 dest);
|
||||||
mat4 t = GLM_MAT4_IDENTITY_INIT;
|
|
||||||
|
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
|
||||||
_mm_store_ps(dest[3],
|
|
||||||
_mm_add_ps(_mm_add_ps(_mm_mul_ps(_mm_load_ps(t[0]),
|
|
||||||
_mm_set1_ps(v[0])),
|
|
||||||
_mm_mul_ps(_mm_load_ps(t[1]),
|
|
||||||
_mm_set1_ps(v[1]))),
|
|
||||||
_mm_add_ps(_mm_mul_ps(_mm_load_ps(t[2]),
|
|
||||||
_mm_set1_ps(v[2])),
|
|
||||||
_mm_load_ps(t[3]))))
|
|
||||||
;
|
|
||||||
|
|
||||||
_mm_store_ps(dest[0], _mm_load_ps(m[0]));
|
|
||||||
_mm_store_ps(dest[1], _mm_load_ps(m[1]));
|
|
||||||
_mm_store_ps(dest[2], _mm_load_ps(m[2]));
|
|
||||||
#else
|
|
||||||
vec4 v1, v2, v3;
|
|
||||||
|
|
||||||
glm_vec4_scale(t[0], v[0], v1);
|
|
||||||
glm_vec4_scale(t[1], v[1], v2);
|
|
||||||
glm_vec4_scale(t[2], v[2], v3);
|
|
||||||
|
|
||||||
glm_vec4_add(v1, t[3], t[3]);
|
|
||||||
glm_vec4_add(v2, t[3], t[3]);
|
|
||||||
glm_vec4_add(v3, t[3], t[3]);
|
|
||||||
|
|
||||||
glm__memcpy(float, dest, t, sizeof(mat4));
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief translate existing transform matrix by v vector
|
* @brief translate existing transform matrix by v vector
|
||||||
@@ -90,16 +53,16 @@ glm_translate_to(mat4 m, vec3 v, mat4 dest) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_translate(mat4 m, vec3 v) {
|
glm_translate(mat4 m, const vec3 v) {
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
_mm_store_ps(m[3],
|
glmm_store(m[3],
|
||||||
_mm_add_ps(_mm_add_ps(_mm_mul_ps(_mm_load_ps(m[0]),
|
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_load(m[0]),
|
||||||
_mm_set1_ps(v[0])),
|
_mm_set1_ps(v[0])),
|
||||||
_mm_mul_ps(_mm_load_ps(m[1]),
|
_mm_mul_ps(glmm_load(m[1]),
|
||||||
_mm_set1_ps(v[1]))),
|
_mm_set1_ps(v[1]))),
|
||||||
_mm_add_ps(_mm_mul_ps(_mm_load_ps(m[2]),
|
_mm_add_ps(_mm_mul_ps(glmm_load(m[2]),
|
||||||
_mm_set1_ps(v[2])),
|
_mm_set1_ps(v[2])),
|
||||||
_mm_load_ps(m[3]))))
|
glmm_load(m[3]))))
|
||||||
;
|
;
|
||||||
#else
|
#else
|
||||||
vec4 v1, v2, v3;
|
vec4 v1, v2, v3;
|
||||||
@@ -114,6 +77,23 @@ glm_translate(mat4 m, vec3 v) {
|
|||||||
#endif
|
#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(const mat4 m, const vec3 v, mat4 dest) {
|
||||||
|
glm_mat4_copy(m, dest);
|
||||||
|
glm_translate(dest, v);
|
||||||
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief translate existing transform matrix by x factor
|
* @brief translate existing transform matrix by x factor
|
||||||
*
|
*
|
||||||
@@ -124,10 +104,10 @@ CGLM_INLINE
|
|||||||
void
|
void
|
||||||
glm_translate_x(mat4 m, float x) {
|
glm_translate_x(mat4 m, float x) {
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
_mm_store_ps(m[3],
|
glmm_store(m[3],
|
||||||
_mm_add_ps(_mm_mul_ps(_mm_load_ps(m[0]),
|
_mm_add_ps(_mm_mul_ps(glmm_load(m[0]),
|
||||||
_mm_set1_ps(x)),
|
_mm_set1_ps(x)),
|
||||||
_mm_load_ps(m[3])))
|
glmm_load(m[3])))
|
||||||
;
|
;
|
||||||
#else
|
#else
|
||||||
vec4 v1;
|
vec4 v1;
|
||||||
@@ -146,10 +126,10 @@ CGLM_INLINE
|
|||||||
void
|
void
|
||||||
glm_translate_y(mat4 m, float y) {
|
glm_translate_y(mat4 m, float y) {
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
_mm_store_ps(m[3],
|
glmm_store(m[3],
|
||||||
_mm_add_ps(_mm_mul_ps(_mm_load_ps(m[1]),
|
_mm_add_ps(_mm_mul_ps(glmm_load(m[1]),
|
||||||
_mm_set1_ps(y)),
|
_mm_set1_ps(y)),
|
||||||
_mm_load_ps(m[3])))
|
glmm_load(m[3])))
|
||||||
;
|
;
|
||||||
#else
|
#else
|
||||||
vec4 v1;
|
vec4 v1;
|
||||||
@@ -168,10 +148,10 @@ CGLM_INLINE
|
|||||||
void
|
void
|
||||||
glm_translate_z(mat4 m, float z) {
|
glm_translate_z(mat4 m, float z) {
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
_mm_store_ps(m[3],
|
glmm_store(m[3],
|
||||||
_mm_add_ps(_mm_mul_ps(_mm_load_ps(m[2]),
|
_mm_add_ps(_mm_mul_ps(glmm_load(m[2]),
|
||||||
_mm_set1_ps(z)),
|
_mm_set1_ps(z)),
|
||||||
_mm_load_ps(m[3])))
|
glmm_load(m[3])))
|
||||||
;
|
;
|
||||||
#else
|
#else
|
||||||
vec4 v1;
|
vec4 v1;
|
||||||
@@ -188,9 +168,9 @@ glm_translate_z(mat4 m, float z) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_translate_make(mat4 m, vec3 v) {
|
glm_translate_make(mat4 m, const vec3 v) {
|
||||||
mat4 t = GLM_MAT4_IDENTITY_INIT;
|
glm_mat4_identity(m);
|
||||||
glm_translate_to(t, v, m);
|
glm_vec3_copy(v, m[3]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -203,7 +183,7 @@ glm_translate_make(mat4 m, vec3 v) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_scale_to(mat4 m, vec3 v, mat4 dest) {
|
glm_scale_to(const mat4 m, const vec3 v, mat4 dest) {
|
||||||
glm_vec4_scale(m[0], v[0], dest[0]);
|
glm_vec4_scale(m[0], v[0], dest[0]);
|
||||||
glm_vec4_scale(m[1], v[1], dest[1]);
|
glm_vec4_scale(m[1], v[1], dest[1]);
|
||||||
glm_vec4_scale(m[2], v[2], dest[2]);
|
glm_vec4_scale(m[2], v[2], dest[2]);
|
||||||
@@ -219,9 +199,11 @@ glm_scale_to(mat4 m, vec3 v, mat4 dest) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_scale_make(mat4 m, vec3 v) {
|
glm_scale_make(mat4 m, const vec3 v) {
|
||||||
mat4 t = GLM_MAT4_IDENTITY_INIT;
|
glm_mat4_identity(m);
|
||||||
glm_scale_to(t, v, m);
|
m[0][0] = v[0];
|
||||||
|
m[1][1] = v[1];
|
||||||
|
m[2][2] = v[2];
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -233,17 +215,7 @@ glm_scale_make(mat4 m, vec3 v) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_scale(mat4 m, vec3 v) {
|
glm_scale(mat4 m, const vec3 v) {
|
||||||
glm_scale_to(m, v, m);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief DEPRECATED! Use glm_scale_uni
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_scale1(mat4 m, float s) {
|
|
||||||
vec3 v = { s, s, s };
|
|
||||||
glm_scale_to(m, v, m);
|
glm_scale_to(m, v, m);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -257,7 +229,7 @@ glm_scale1(mat4 m, float s) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_scale_uni(mat4 m, float s) {
|
glm_scale_uni(mat4 m, float s) {
|
||||||
vec3 v = { s, s, s };
|
CGLM_ALIGN(8) vec3 v = { s, s, s };
|
||||||
glm_scale_to(m, v, m);
|
glm_scale_to(m, v, m);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -271,20 +243,19 @@ glm_scale_uni(mat4 m, float s) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_rotate_x(mat4 m, float angle, mat4 dest) {
|
glm_rotate_x(const mat4 m, float angle, mat4 dest) {
|
||||||
float cosVal;
|
CGLM_ALIGN_MAT mat4 t = GLM_MAT4_IDENTITY_INIT;
|
||||||
float sinVal;
|
float c, s;
|
||||||
mat4 t = GLM_MAT4_IDENTITY_INIT;
|
|
||||||
|
|
||||||
cosVal = cosf(angle);
|
c = cosf(angle);
|
||||||
sinVal = sinf(angle);
|
s = sinf(angle);
|
||||||
|
|
||||||
t[1][1] = cosVal;
|
t[1][1] = c;
|
||||||
t[1][2] = sinVal;
|
t[1][2] = s;
|
||||||
t[2][1] = -sinVal;
|
t[2][1] = -s;
|
||||||
t[2][2] = cosVal;
|
t[2][2] = c;
|
||||||
|
|
||||||
glm_mat4_mul(m, t, dest);
|
glm_mul_rot(m, t, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -297,20 +268,19 @@ glm_rotate_x(mat4 m, float angle, mat4 dest) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_rotate_y(mat4 m, float angle, mat4 dest) {
|
glm_rotate_y(const mat4 m, float angle, mat4 dest) {
|
||||||
float cosVal;
|
CGLM_ALIGN_MAT mat4 t = GLM_MAT4_IDENTITY_INIT;
|
||||||
float sinVal;
|
float c, s;
|
||||||
mat4 t = GLM_MAT4_IDENTITY_INIT;
|
|
||||||
|
|
||||||
cosVal = cosf(angle);
|
c = cosf(angle);
|
||||||
sinVal = sinf(angle);
|
s = sinf(angle);
|
||||||
|
|
||||||
t[0][0] = cosVal;
|
t[0][0] = c;
|
||||||
t[0][2] = -sinVal;
|
t[0][2] = -s;
|
||||||
t[2][0] = sinVal;
|
t[2][0] = s;
|
||||||
t[2][2] = cosVal;
|
t[2][2] = c;
|
||||||
|
|
||||||
glm_mat4_mul(m, t, dest);
|
glm_mul_rot(m, t, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -323,62 +293,19 @@ glm_rotate_y(mat4 m, float angle, mat4 dest) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_rotate_z(mat4 m, float angle, mat4 dest) {
|
glm_rotate_z(const mat4 m, float angle, mat4 dest) {
|
||||||
float cosVal;
|
CGLM_ALIGN_MAT mat4 t = GLM_MAT4_IDENTITY_INIT;
|
||||||
float sinVal;
|
float c, s;
|
||||||
mat4 t = GLM_MAT4_IDENTITY_INIT;
|
|
||||||
|
|
||||||
cosVal = cosf(angle);
|
|
||||||
sinVal = sinf(angle);
|
|
||||||
|
|
||||||
t[0][0] = cosVal;
|
|
||||||
t[0][1] = sinVal;
|
|
||||||
t[1][0] = -sinVal;
|
|
||||||
t[1][1] = cosVal;
|
|
||||||
|
|
||||||
glm_mat4_mul(m, t, dest);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief creates NEW rotation matrix by angle and axis
|
|
||||||
*
|
|
||||||
* this name may change in the future. axis must be is normalized
|
|
||||||
*
|
|
||||||
* @param[out] m affine transfrom
|
|
||||||
* @param[in] angle angle (radians)
|
|
||||||
* @param[in] axis_ndc normalized axis
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_rotate_ndc_make(mat4 m, float angle, vec3 axis_ndc) {
|
|
||||||
/* https://www.opengl.org/sdk/docs/man2/xhtml/glRotate.xml */
|
|
||||||
|
|
||||||
vec3 v, vs;
|
|
||||||
float c;
|
|
||||||
|
|
||||||
c = cosf(angle);
|
c = cosf(angle);
|
||||||
|
s = sinf(angle);
|
||||||
|
|
||||||
glm_vec_scale(axis_ndc, 1.0f - c, v);
|
t[0][0] = c;
|
||||||
glm_vec_scale(axis_ndc, sinf(angle), vs);
|
t[0][1] = s;
|
||||||
|
t[1][0] = -s;
|
||||||
|
t[1][1] = c;
|
||||||
|
|
||||||
glm_vec_scale(axis_ndc, v[0], m[0]);
|
glm_mul_rot(m, t, dest);
|
||||||
glm_vec_scale(axis_ndc, v[1], m[1]);
|
|
||||||
glm_vec_scale(axis_ndc, v[2], m[2]);
|
|
||||||
|
|
||||||
m[0][0] += c;
|
|
||||||
m[0][1] += vs[2];
|
|
||||||
m[0][2] -= vs[1];
|
|
||||||
|
|
||||||
m[1][0] -= vs[2];
|
|
||||||
m[1][1] += c;
|
|
||||||
m[1][2] += vs[0];
|
|
||||||
|
|
||||||
m[2][0] += vs[1];
|
|
||||||
m[2][1] -= vs[0];
|
|
||||||
m[2][2] += c;
|
|
||||||
|
|
||||||
m[0][3] = m[1][3] = m[2][3] = m[3][0] = m[3][1] = m[3][2] = 0.0f;
|
|
||||||
m[3][3] = 1.0f;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -392,54 +319,30 @@ glm_rotate_ndc_make(mat4 m, float angle, vec3 axis_ndc) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_rotate_make(mat4 m, float angle, vec3 axis) {
|
glm_rotate_make(mat4 m, float angle, const vec3 axis) {
|
||||||
vec3 axis_ndc;
|
CGLM_ALIGN(8) vec3 axisn, v, vs;
|
||||||
|
float c;
|
||||||
|
|
||||||
glm_vec_normalize_to(axis, axis_ndc);
|
c = cosf(angle);
|
||||||
glm_rotate_ndc_make(m, angle, axis_ndc);
|
|
||||||
|
glm_vec3_normalize_to(axis, axisn);
|
||||||
|
glm_vec3_scale(axisn, 1.0f - c, v);
|
||||||
|
glm_vec3_scale(axisn, sinf(angle), vs);
|
||||||
|
|
||||||
|
glm_vec3_scale(axisn, v[0], m[0]);
|
||||||
|
glm_vec3_scale(axisn, v[1], m[1]);
|
||||||
|
glm_vec3_scale(axisn, v[2], m[2]);
|
||||||
|
|
||||||
|
m[0][0] += c; m[1][0] -= vs[2]; m[2][0] += vs[1];
|
||||||
|
m[0][1] += vs[2]; m[1][1] += c; m[2][1] -= vs[0];
|
||||||
|
m[0][2] -= vs[1]; m[1][2] += vs[0]; m[2][2] += c;
|
||||||
|
|
||||||
|
m[0][3] = m[1][3] = m[2][3] = m[3][0] = m[3][1] = m[3][2] = 0.0f;
|
||||||
|
m[3][3] = 1.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief rotate existing transform matrix around Z axis by angle and axis
|
* @brief rotate existing transform matrix around given axis by angle
|
||||||
*
|
|
||||||
* this name may change in the future, axis must be normalized.
|
|
||||||
*
|
|
||||||
* @param[in, out] m affine transfrom
|
|
||||||
* @param[in] angle angle (radians)
|
|
||||||
* @param[in] axis_ndc normalized axis
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_rotate_ndc(mat4 m, float angle, vec3 axis_ndc) {
|
|
||||||
mat4 rot, tmp;
|
|
||||||
|
|
||||||
glm_rotate_ndc_make(rot, angle, axis_ndc);
|
|
||||||
|
|
||||||
glm_vec4_scale(m[0], rot[0][0], tmp[1]);
|
|
||||||
glm_vec4_scale(m[1], rot[0][1], tmp[0]);
|
|
||||||
glm_vec4_add(tmp[1], tmp[0], tmp[1]);
|
|
||||||
glm_vec4_scale(m[2], rot[0][2], tmp[0]);
|
|
||||||
glm_vec4_add(tmp[1], tmp[0], tmp[1]);
|
|
||||||
|
|
||||||
glm_vec4_scale(m[0], rot[1][0], tmp[2]);
|
|
||||||
glm_vec4_scale(m[1], rot[1][1], tmp[0]);
|
|
||||||
glm_vec4_add(tmp[2], tmp[0], tmp[2]);
|
|
||||||
glm_vec4_scale(m[2], rot[1][2], tmp[0]);
|
|
||||||
glm_vec4_add(tmp[2], tmp[0], tmp[2]);
|
|
||||||
|
|
||||||
glm_vec4_scale(m[0], rot[2][0], tmp[3]);
|
|
||||||
glm_vec4_scale(m[1], rot[2][1], tmp[0]);
|
|
||||||
glm_vec4_add(tmp[3], tmp[0], tmp[3]);
|
|
||||||
glm_vec4_scale(m[2], rot[2][2], tmp[0]);
|
|
||||||
glm_vec4_add(tmp[3], tmp[0], tmp[3]);
|
|
||||||
|
|
||||||
glm_vec4_copy(tmp[1], m[0]);
|
|
||||||
glm_vec4_copy(tmp[2], m[1]);
|
|
||||||
glm_vec4_copy(tmp[3], m[2]);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief rotate existing transform matrix around Z axis by angle and axis
|
|
||||||
*
|
*
|
||||||
* @param[in, out] m affine transfrom
|
* @param[in, out] m affine transfrom
|
||||||
* @param[in] angle angle (radians)
|
* @param[in] angle angle (radians)
|
||||||
@@ -447,11 +350,56 @@ glm_rotate_ndc(mat4 m, float angle, vec3 axis_ndc) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_rotate(mat4 m, float angle, vec3 axis) {
|
glm_rotate(mat4 m, float angle, const vec3 axis) {
|
||||||
vec3 axis_ndc;
|
CGLM_ALIGN_MAT mat4 rot;
|
||||||
|
glm_rotate_make(rot, angle, axis);
|
||||||
|
glm_mul_rot(m, rot, m);
|
||||||
|
}
|
||||||
|
|
||||||
glm_vec_normalize_to(axis, axis_ndc);
|
/*!
|
||||||
glm_rotate_ndc(m, angle, axis_ndc);
|
* @brief rotate existing transform
|
||||||
|
* around given axis by angle at given pivot point (rotation center)
|
||||||
|
*
|
||||||
|
* @param[in, out] m affine transfrom
|
||||||
|
* @param[in] pivot rotation center
|
||||||
|
* @param[in] angle angle (radians)
|
||||||
|
* @param[in] axis axis
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_rotate_at(mat4 m, const vec3 pivot, float angle, const vec3 axis) {
|
||||||
|
CGLM_ALIGN(8) vec3 pivotInv;
|
||||||
|
|
||||||
|
glm_vec3_negate_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, const vec3 pivot, float angle, const vec3 axis) {
|
||||||
|
CGLM_ALIGN(8) vec3 pivotInv;
|
||||||
|
|
||||||
|
glm_vec3_negate_to(pivot, pivotInv);
|
||||||
|
|
||||||
|
glm_translate_make(m, pivot);
|
||||||
|
glm_rotate(m, angle, axis);
|
||||||
|
glm_translate(m, pivotInv);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -462,14 +410,14 @@ glm_rotate(mat4 m, float angle, vec3 axis) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_decompose_scalev(mat4 m, vec3 s) {
|
glm_decompose_scalev(const mat4 m, vec3 s) {
|
||||||
s[0] = glm_vec_norm(m[0]);
|
s[0] = glm_vec3_norm(m[0]);
|
||||||
s[1] = glm_vec_norm(m[1]);
|
s[1] = glm_vec3_norm(m[1]);
|
||||||
s[2] = glm_vec_norm(m[2]);
|
s[2] = glm_vec3_norm(m[2]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief returns true if matrix is uniform scaled. This is helpful for
|
* @brief returns true if matrix is uniform scaled. This is helpful for
|
||||||
* creating normal matrix.
|
* creating normal matrix.
|
||||||
*
|
*
|
||||||
* @param[in] m m
|
* @param[in] m m
|
||||||
@@ -478,11 +426,10 @@ glm_decompose_scalev(mat4 m, vec3 s) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
bool
|
bool
|
||||||
glm_uniscaled(mat4 m) {
|
glm_uniscaled(const mat4 m) {
|
||||||
vec3 s;
|
CGLM_ALIGN(8) vec3 s;
|
||||||
glm_decompose_scalev(m, s);
|
glm_decompose_scalev(m, s);
|
||||||
|
return glm_vec3_eq_all(s);
|
||||||
return glm_vec_eq_all(s);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -495,18 +442,18 @@ glm_uniscaled(mat4 m) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_decompose_rs(mat4 m, mat4 r, vec3 s) {
|
glm_decompose_rs(const mat4 m, mat4 r, vec3 s) {
|
||||||
vec4 t = {0.0f, 0.0f, 0.0f, 1.0f};
|
CGLM_ALIGN(16) vec4 t = {0.0f, 0.0f, 0.0f, 1.0f};
|
||||||
vec3 v;
|
CGLM_ALIGN(8) vec3 v;
|
||||||
|
|
||||||
glm_vec4_copy(m[0], r[0]);
|
glm_vec4_copy(m[0], r[0]);
|
||||||
glm_vec4_copy(m[1], r[1]);
|
glm_vec4_copy(m[1], r[1]);
|
||||||
glm_vec4_copy(m[2], r[2]);
|
glm_vec4_copy(m[2], r[2]);
|
||||||
glm_vec4_copy(t, r[3]);
|
glm_vec4_copy(t, r[3]);
|
||||||
|
|
||||||
s[0] = glm_vec_norm(m[0]);
|
s[0] = glm_vec3_norm(m[0]);
|
||||||
s[1] = glm_vec_norm(m[1]);
|
s[1] = glm_vec3_norm(m[1]);
|
||||||
s[2] = glm_vec_norm(m[2]);
|
s[2] = glm_vec3_norm(m[2]);
|
||||||
|
|
||||||
glm_vec4_scale(r[0], 1.0f/s[0], r[0]);
|
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[1], 1.0f/s[1], r[1]);
|
||||||
@@ -515,12 +462,12 @@ glm_decompose_rs(mat4 m, mat4 r, vec3 s) {
|
|||||||
/* Note from Apple Open Source (asume that the matrix is orthonormal):
|
/* Note from Apple Open Source (asume that the matrix is orthonormal):
|
||||||
check for a coordinate system flip. If the determinant
|
check for a coordinate system flip. If the determinant
|
||||||
is -1, then negate the matrix and the scaling factors. */
|
is -1, then negate the matrix and the scaling factors. */
|
||||||
glm_vec_cross(m[0], m[1], v);
|
glm_vec3_cross(m[0], m[1], v);
|
||||||
if (glm_vec_dot(v, m[2]) < 0.0f) {
|
if (glm_vec3_dot(v, m[2]) < 0.0f) {
|
||||||
glm_vec4_flipsign(r[0]);
|
glm_vec4_negate(r[0]);
|
||||||
glm_vec4_flipsign(r[1]);
|
glm_vec4_negate(r[1]);
|
||||||
glm_vec4_flipsign(r[2]);
|
glm_vec4_negate(r[2]);
|
||||||
glm_vec_flipsign(s);
|
glm_vec3_negate(s);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -535,7 +482,7 @@ glm_decompose_rs(mat4 m, mat4 r, vec3 s) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_decompose(mat4 m, vec4 t, mat4 r, vec3 s) {
|
glm_decompose(const mat4 m, vec4 t, mat4 r, vec3 s) {
|
||||||
glm_vec4_copy(m[3], t);
|
glm_vec4_copy(m[3], t);
|
||||||
glm_decompose_rs(m, r, s);
|
glm_decompose_rs(m, r, s);
|
||||||
}
|
}
|
||||||
|
|||||||
154
include/cglm/bezier.h
Normal file
154
include/cglm/bezier.h
Normal file
@@ -0,0 +1,154 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglm_bezier_h
|
||||||
|
#define cglm_bezier_h
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
|
||||||
|
#define GLM_BEZIER_MAT_INIT {{-1.0f, 3.0f, -3.0f, 1.0f}, \
|
||||||
|
{ 3.0f, -6.0f, 3.0f, 0.0f}, \
|
||||||
|
{-3.0f, 3.0f, 0.0f, 0.0f}, \
|
||||||
|
{ 1.0f, 0.0f, 0.0f, 0.0f}}
|
||||||
|
#define GLM_HERMITE_MAT_INIT {{ 2.0f, -3.0f, 0.0f, 1.0f}, \
|
||||||
|
{-2.0f, 3.0f, 0.0f, 0.0f}, \
|
||||||
|
{ 1.0f, -2.0f, 1.0f, 0.0f}, \
|
||||||
|
{ 1.0f, -1.0f, 0.0f, 0.0f}}
|
||||||
|
/* for C only */
|
||||||
|
#define GLM_BEZIER_MAT ((mat4)GLM_BEZIER_MAT_INIT)
|
||||||
|
#define GLM_HERMITE_MAT ((mat4)GLM_HERMITE_MAT_INIT)
|
||||||
|
|
||||||
|
#define CGLM_DECASTEL_EPS 1e-9
|
||||||
|
#define CGLM_DECASTEL_MAX 1000
|
||||||
|
#define CGLM_DECASTEL_SMALL 1e-20
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief cubic bezier interpolation
|
||||||
|
*
|
||||||
|
* Formula:
|
||||||
|
* B(s) = P0*(1-s)^3 + 3*C0*s*(1-s)^2 + 3*C1*s^2*(1-s) + P1*s^3
|
||||||
|
*
|
||||||
|
* similar result using matrix:
|
||||||
|
* B(s) = glm_smc(t, GLM_BEZIER_MAT, (vec4){p0, c0, c1, p1})
|
||||||
|
*
|
||||||
|
* glm_eq(glm_smc(...), glm_bezier(...)) should return TRUE
|
||||||
|
*
|
||||||
|
* @param[in] s parameter between 0 and 1
|
||||||
|
* @param[in] p0 begin point
|
||||||
|
* @param[in] c0 control point 1
|
||||||
|
* @param[in] c1 control point 2
|
||||||
|
* @param[in] p1 end point
|
||||||
|
*
|
||||||
|
* @return B(s)
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_bezier(float s, float p0, float c0, float c1, float p1) {
|
||||||
|
float x, xx, ss, xs3, a;
|
||||||
|
|
||||||
|
x = 1.0f - s;
|
||||||
|
xx = x * x;
|
||||||
|
ss = s * s;
|
||||||
|
xs3 = (s - ss) * 3.0f;
|
||||||
|
a = p0 * xx + c0 * xs3;
|
||||||
|
|
||||||
|
return a + s * (c1 * xs3 + p1 * ss - a);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief cubic hermite interpolation
|
||||||
|
*
|
||||||
|
* Formula:
|
||||||
|
* H(s) = P0*(2*s^3 - 3*s^2 + 1) + T0*(s^3 - 2*s^2 + s)
|
||||||
|
* + P1*(-2*s^3 + 3*s^2) + T1*(s^3 - s^2)
|
||||||
|
*
|
||||||
|
* similar result using matrix:
|
||||||
|
* H(s) = glm_smc(t, GLM_HERMITE_MAT, (vec4){p0, p1, c0, c1})
|
||||||
|
*
|
||||||
|
* glm_eq(glm_smc(...), glm_hermite(...)) should return TRUE
|
||||||
|
*
|
||||||
|
* @param[in] s parameter between 0 and 1
|
||||||
|
* @param[in] p0 begin point
|
||||||
|
* @param[in] t0 tangent 1
|
||||||
|
* @param[in] t1 tangent 2
|
||||||
|
* @param[in] p1 end point
|
||||||
|
*
|
||||||
|
* @return H(s)
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_hermite(float s, float p0, float t0, float t1, float p1) {
|
||||||
|
float ss, d, a, b, c, e, f;
|
||||||
|
|
||||||
|
ss = s * s;
|
||||||
|
a = ss + ss;
|
||||||
|
c = a + ss;
|
||||||
|
b = a * s;
|
||||||
|
d = s * ss;
|
||||||
|
f = d - ss;
|
||||||
|
e = b - c;
|
||||||
|
|
||||||
|
return p0 * (e + 1.0f) + t0 * (f - ss + s) + t1 * f - p1 * e;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief iterative way to solve cubic equation
|
||||||
|
*
|
||||||
|
* @param[in] prm parameter between 0 and 1
|
||||||
|
* @param[in] p0 begin point
|
||||||
|
* @param[in] c0 control point 1
|
||||||
|
* @param[in] c1 control point 2
|
||||||
|
* @param[in] p1 end point
|
||||||
|
*
|
||||||
|
* @return parameter to use in cubic equation
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_decasteljau(float prm, float p0, float c0, float c1, float p1) {
|
||||||
|
float u, v, a, b, c, d, e, f;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (prm - p0 < CGLM_DECASTEL_SMALL)
|
||||||
|
return 0.0f;
|
||||||
|
|
||||||
|
if (p1 - prm < CGLM_DECASTEL_SMALL)
|
||||||
|
return 1.0f;
|
||||||
|
|
||||||
|
u = 0.0f;
|
||||||
|
v = 1.0f;
|
||||||
|
|
||||||
|
for (i = 0; i < CGLM_DECASTEL_MAX; i++) {
|
||||||
|
/* de Casteljau Subdivision */
|
||||||
|
a = (p0 + c0) * 0.5f;
|
||||||
|
b = (c0 + c1) * 0.5f;
|
||||||
|
c = (c1 + p1) * 0.5f;
|
||||||
|
d = (a + b) * 0.5f;
|
||||||
|
e = (b + c) * 0.5f;
|
||||||
|
f = (d + e) * 0.5f; /* this one is on the curve! */
|
||||||
|
|
||||||
|
/* The curve point is close enough to our wanted t */
|
||||||
|
if (fabsf(f - prm) < CGLM_DECASTEL_EPS)
|
||||||
|
return glm_clamp_zo((u + v) * 0.5f);
|
||||||
|
|
||||||
|
/* dichotomy */
|
||||||
|
if (f < prm) {
|
||||||
|
p0 = f;
|
||||||
|
c0 = e;
|
||||||
|
c1 = c;
|
||||||
|
u = (u + v) * 0.5f;
|
||||||
|
} else {
|
||||||
|
c0 = a;
|
||||||
|
c1 = d;
|
||||||
|
p1 = f;
|
||||||
|
v = (u + v) * 0.5f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return glm_clamp_zo((u + v) * 0.5f);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* cglm_bezier_h */
|
||||||
@@ -11,6 +11,7 @@
|
|||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "vec3.h"
|
#include "vec3.h"
|
||||||
#include "vec4.h"
|
#include "vec4.h"
|
||||||
|
#include "util.h"
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief apply transform to Axis-Aligned Bounding Box
|
* @brief apply transform to Axis-Aligned Bounding Box
|
||||||
@@ -21,36 +22,32 @@
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_aabb_transform(vec3 box[2], mat4 m, vec3 dest[2]) {
|
glm_aabb_transform(const vec3 box[2], const mat4 m, vec3 dest[2]) {
|
||||||
vec3 v[2], xa, xb, ya, yb, za, zb, tmp;
|
vec3 v[2], xa, xb, ya, yb, za, zb;
|
||||||
|
|
||||||
glm_vec_scale(m[0], box[0][0], xa);
|
glm_vec3_scale(m[0], box[0][0], xa);
|
||||||
glm_vec_scale(m[0], box[1][0], xb);
|
glm_vec3_scale(m[0], box[1][0], xb);
|
||||||
|
|
||||||
glm_vec_scale(m[1], box[0][1], ya);
|
glm_vec3_scale(m[1], box[0][1], ya);
|
||||||
glm_vec_scale(m[1], box[1][1], yb);
|
glm_vec3_scale(m[1], box[1][1], yb);
|
||||||
|
|
||||||
glm_vec_scale(m[2], box[0][2], za);
|
glm_vec3_scale(m[2], box[0][2], za);
|
||||||
glm_vec_scale(m[2], box[1][2], zb);
|
glm_vec3_scale(m[2], box[1][2], zb);
|
||||||
|
|
||||||
/* min(xa, xb) + min(ya, yb) + min(za, zb) + translation */
|
/* translation + min(xa, xb) + min(ya, yb) + min(za, zb) */
|
||||||
glm_vec_minv(xa, xb, v[0]);
|
glm_vec3(m[3], v[0]);
|
||||||
glm_vec_minv(ya, yb, tmp);
|
glm_vec3_minadd(xa, xb, v[0]);
|
||||||
glm_vec_add(v[0], tmp, v[0]);
|
glm_vec3_minadd(ya, yb, v[0]);
|
||||||
glm_vec_minv(za, zb, tmp);
|
glm_vec3_minadd(za, zb, v[0]);
|
||||||
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 */
|
/* translation + max(xa, xb) + max(ya, yb) + max(za, zb) */
|
||||||
glm_vec_maxv(xa, xb, v[1]);
|
glm_vec3(m[3], v[1]);
|
||||||
glm_vec_maxv(ya, yb, tmp);
|
glm_vec3_maxadd(xa, xb, v[1]);
|
||||||
glm_vec_add(v[1], tmp, v[1]);
|
glm_vec3_maxadd(ya, yb, v[1]);
|
||||||
glm_vec_maxv(za, zb, tmp);
|
glm_vec3_maxadd(za, zb, v[1]);
|
||||||
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_vec3_copy(v[0], dest[0]);
|
||||||
glm_vec_copy(v[1], dest[1]);
|
glm_vec3_copy(v[1], dest[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -65,7 +62,7 @@ glm_aabb_transform(vec3 box[2], mat4 m, vec3 dest[2]) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_aabb_merge(vec3 box1[2], vec3 box2[2], vec3 dest[2]) {
|
glm_aabb_merge(const vec3 box1[2], const vec3 box2[2], vec3 dest[2]) {
|
||||||
dest[0][0] = glm_min(box1[0][0], box2[0][0]);
|
dest[0][0] = glm_min(box1[0][0], box2[0][0]);
|
||||||
dest[0][1] = glm_min(box1[0][1], box2[0][1]);
|
dest[0][1] = glm_min(box1[0][1], box2[0][1]);
|
||||||
dest[0][2] = glm_min(box1[0][2], box2[0][2]);
|
dest[0][2] = glm_min(box1[0][2], box2[0][2]);
|
||||||
@@ -88,7 +85,7 @@ glm_aabb_merge(vec3 box1[2], vec3 box2[2], vec3 dest[2]) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_aabb_crop(vec3 box[2], vec3 cropBox[2], vec3 dest[2]) {
|
glm_aabb_crop(const vec3 box[2], const vec3 cropBox[2], vec3 dest[2]) {
|
||||||
dest[0][0] = glm_max(box[0][0], cropBox[0][0]);
|
dest[0][0] = glm_max(box[0][0], cropBox[0][0]);
|
||||||
dest[0][1] = glm_max(box[0][1], cropBox[0][1]);
|
dest[0][1] = glm_max(box[0][1], cropBox[0][1]);
|
||||||
dest[0][2] = glm_max(box[0][2], cropBox[0][2]);
|
dest[0][2] = glm_max(box[0][2], cropBox[0][2]);
|
||||||
@@ -112,10 +109,10 @@ glm_aabb_crop(vec3 box[2], vec3 cropBox[2], vec3 dest[2]) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_aabb_crop_until(vec3 box[2],
|
glm_aabb_crop_until(const vec3 box[2],
|
||||||
vec3 cropBox[2],
|
const vec3 cropBox[2],
|
||||||
vec3 clampBox[2],
|
const vec3 clampBox[2],
|
||||||
vec3 dest[2]) {
|
vec3 dest[2]) {
|
||||||
glm_aabb_crop(box, cropBox, dest);
|
glm_aabb_crop(box, cropBox, dest);
|
||||||
glm_aabb_merge(clampBox, dest, dest);
|
glm_aabb_merge(clampBox, dest, dest);
|
||||||
}
|
}
|
||||||
@@ -136,9 +133,10 @@ glm_aabb_crop_until(vec3 box[2],
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
bool
|
bool
|
||||||
glm_aabb_frustum(vec3 box[2], vec4 planes[6]) {
|
glm_aabb_frustum(const vec3 box[2], const vec4 planes[6]) {
|
||||||
float *p, dp;
|
const float *p;
|
||||||
int i;
|
float dp;
|
||||||
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < 6; i++) {
|
for (i = 0; i < 6; i++) {
|
||||||
p = planes[i];
|
p = planes[i];
|
||||||
@@ -153,4 +151,130 @@ glm_aabb_frustum(vec3 box[2], vec4 planes[6]) {
|
|||||||
return true;
|
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_vec3_broadcast(FLT_MAX, box[0]);
|
||||||
|
glm_vec3_broadcast(-FLT_MAX, box[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief check if AABB is valid or not
|
||||||
|
*
|
||||||
|
* @param[in] box bounding box
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
bool
|
||||||
|
glm_aabb_isvalid(const vec3 box[2]) {
|
||||||
|
return glm_vec3_max(box[0]) != FLT_MAX
|
||||||
|
&& glm_vec3_min(box[1]) != -FLT_MAX;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief distance between of min and max
|
||||||
|
*
|
||||||
|
* @param[in] box bounding box
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_aabb_size(const vec3 box[2]) {
|
||||||
|
return glm_vec3_distance(box[0], box[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief radius of sphere which surrounds AABB
|
||||||
|
*
|
||||||
|
* @param[in] box bounding box
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_aabb_radius(const 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(const vec3 box[2], vec3 dest) {
|
||||||
|
glm_vec3_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(const vec3 box[2], const 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(const vec3 box[2], const 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(const vec3 box[2], const 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(const vec3 box[2], const 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 */
|
#endif /* cglm_box_h */
|
||||||
|
|||||||
@@ -24,6 +24,11 @@ extern "C" {
|
|||||||
#include "call/frustum.h"
|
#include "call/frustum.h"
|
||||||
#include "call/box.h"
|
#include "call/box.h"
|
||||||
#include "call/io.h"
|
#include "call/io.h"
|
||||||
|
#include "call/project.h"
|
||||||
|
#include "call/sphere.h"
|
||||||
|
#include "call/ease.h"
|
||||||
|
#include "call/curve.h"
|
||||||
|
#include "call/bezier.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,11 +15,15 @@ extern "C" {
|
|||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_translate_to(mat4 m, vec3 v, mat4 dest);
|
glmc_translate_make(mat4 m, const vec3 v);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_translate(mat4 m, vec3 v);
|
glmc_translate_to(const mat4 m, const vec3 v, mat4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_translate(mat4 m, const vec3 v);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
@@ -35,55 +39,77 @@ glmc_translate_z(mat4 m, float to);
|
|||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_scale_to(mat4 m, vec3 v, mat4 dest);
|
glmc_scale_make(mat4 m, const vec3 v);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_scale(mat4 m, vec3 v);
|
glmc_scale_to(const mat4 m, const vec3 v, mat4 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_scale1(mat4 m, float s);
|
glmc_scale(mat4 m, const vec3 v);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_rotate_x(mat4 m, float rad, mat4 dest);
|
glmc_scale_uni(mat4 m, float s);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_rotate_y(mat4 m, float rad, mat4 dest);
|
glmc_rotate_x(const mat4 m, float rad, mat4 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_rotate_z(mat4 m, float rad, mat4 dest);
|
glmc_rotate_y(const mat4 m, float rad, mat4 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_rotate_ndc_make(mat4 m, float angle, vec3 axis_ndc);
|
glmc_rotate_z(const mat4 m, float rad, mat4 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_rotate_make(mat4 m, float angle, vec3 axis);
|
glmc_rotate_make(mat4 m, float angle, const vec3 axis);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_rotate_ndc(mat4 m, float angle, vec3 axis_ndc);
|
glmc_rotate(mat4 m, float angle, const vec3 axis);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_rotate(mat4 m, float angle, vec3 axis);
|
glmc_rotate_at(mat4 m, const vec3 pivot, float angle, const vec3 axis);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_decompose_scalev(mat4 m, vec3 s);
|
glmc_rotate_atm(mat4 m, const vec3 pivot, float angle, const vec3 axis);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_decompose_rs(mat4 m, mat4 r, vec3 s);
|
glmc_decompose_scalev(const mat4 m, vec3 s);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
bool
|
||||||
|
glmc_uniscaled(const mat4 m);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_decompose(mat4 m, vec4 t, mat4 r, vec3 s);
|
glmc_decompose_rs(const mat4 m, mat4 r, vec3 s);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_decompose(const mat4 m, vec4 t, mat4 r, vec3 s);
|
||||||
|
|
||||||
|
/* affine-mat */
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mul(const mat4 m1, const mat4 m2, mat4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mul_rot(const mat4 m1, const mat4 m2, mat4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_inv_tr(mat4 mat);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|||||||
31
include/cglm/call/bezier.h
Normal file
31
include/cglm/call/bezier.h
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglmc_bezier_h
|
||||||
|
#define cglmc_bezier_h
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "../cglm.h"
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_bezier(float s, float p0, float c0, float c1, float p1);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_hermite(float s, float p0, float t0, float t1, float p1);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_decasteljau(float prm, float p0, float c0, float c1, float p1);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* cglmc_bezier_h */
|
||||||
@@ -15,22 +15,62 @@ extern "C" {
|
|||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_aabb_transform(vec3 box[2], mat4 m, vec3 dest[2]);
|
glmc_aabb_transform(const vec3 box[2], const mat4 m, vec3 dest[2]);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_aabb_merge(vec3 box1[2], vec3 box2[2], vec3 dest[2]);
|
glmc_aabb_merge(const vec3 box1[2], const vec3 box2[2], vec3 dest[2]);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_aabb_crop(vec3 box[2], vec3 cropBox[2], vec3 dest[2]);
|
glmc_aabb_crop(const vec3 box[2], const vec3 cropBox[2], vec3 dest[2]);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_aabb_crop_until(vec3 box[2],
|
glmc_aabb_crop_until(const vec3 box[2],
|
||||||
vec3 cropBox[2],
|
const vec3 cropBox[2],
|
||||||
vec3 clampBox[2],
|
const vec3 clampBox[2],
|
||||||
vec3 dest[2]);
|
vec3 dest[2]);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
bool
|
||||||
|
glmc_aabb_frustum(const vec3 box[2], vec4 planes[6]);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_aabb_invalidate(vec3 box[2]);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
bool
|
||||||
|
glmc_aabb_isvalid(const vec3 box[2]);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_aabb_size(const vec3 box[2]);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_aabb_radius(const vec3 box[2]);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_aabb_center(const vec3 box[2], vec3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
bool
|
||||||
|
glmc_aabb_aabb(const vec3 box[2], const vec3 other[2]);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
bool
|
||||||
|
glmc_aabb_point(const vec3 box[2], const vec3 point);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
bool
|
||||||
|
glmc_aabb_contains(const vec3 box[2], const vec3 other[2]);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
bool
|
||||||
|
glmc_aabb_sphere(const vec3 box[2], const vec4 s);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ glmc_frustum(float left,
|
|||||||
float top,
|
float top,
|
||||||
float nearVal,
|
float nearVal,
|
||||||
float farVal,
|
float farVal,
|
||||||
mat4 dest);
|
mat4 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
@@ -31,7 +31,27 @@ glmc_ortho(float left,
|
|||||||
float top,
|
float top,
|
||||||
float nearVal,
|
float nearVal,
|
||||||
float farVal,
|
float farVal,
|
||||||
mat4 dest);
|
mat4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_ortho_aabb(const vec3 box[2], mat4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_ortho_aabb_p(const vec3 box[2], float padding, mat4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_ortho_aabb_pz(const 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
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
@@ -39,19 +59,83 @@ glmc_perspective(float fovy,
|
|||||||
float aspect,
|
float aspect,
|
||||||
float nearVal,
|
float nearVal,
|
||||||
float farVal,
|
float farVal,
|
||||||
mat4 dest);
|
mat4 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_lookat(vec3 eye, vec3 center, vec3 up, mat4 dest);
|
glmc_persp_move_far(mat4 proj, float deltaFar);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_look(vec3 eye, vec3 dir, vec3 up, mat4 dest);
|
glmc_perspective_default(float aspect, mat4 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_look_anyup(vec3 eye, vec3 dir, mat4 dest);
|
glmc_perspective_resize(float aspect, mat4 proj);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_lookat(const vec3 eye, const vec3 center, const vec3 up, mat4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_look(const vec3 eye, const vec3 dir, const vec3 up, mat4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_look_anyup(const vec3 eye, const vec3 dir, mat4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_persp_decomp(const 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(const mat4 proj, float dest[6]);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_persp_decomp_x(const mat4 proj,
|
||||||
|
float * __restrict left,
|
||||||
|
float * __restrict right);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_persp_decomp_y(const mat4 proj,
|
||||||
|
float * __restrict top,
|
||||||
|
float * __restrict bottom);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_persp_decomp_z(const mat4 proj,
|
||||||
|
float * __restrict nearVal,
|
||||||
|
float * __restrict farVal);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_persp_decomp_far(const mat4 proj, float * __restrict farVal);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_persp_decomp_near(const mat4 proj, float * __restrict nearVal);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_persp_fovy(const mat4 proj);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_persp_aspect(const mat4 proj);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_persp_sizes(const mat4 proj, float fovy, vec4 dest);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|||||||
23
include/cglm/call/curve.h
Normal file
23
include/cglm/call/curve.h
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglmc_curve_h
|
||||||
|
#define cglmc_curve_h
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "../cglm.h"
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_smc(float s, const mat4 m, const vec4 c);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* cglmc_curve_h */
|
||||||
143
include/cglm/call/ease.h
Normal file
143
include/cglm/call/ease.h
Normal file
@@ -0,0 +1,143 @@
|
|||||||
|
/*
|
||||||
|
* 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 "../cglm.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);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* cglmc_ease_h */
|
||||||
@@ -15,35 +15,39 @@ extern "C" {
|
|||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_euler_angles(mat4 m, vec3 dest);
|
glmc_euler_angles(const mat4 m, vec3 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_euler(vec3 angles, mat4 dest);
|
glmc_euler(const vec3 angles, mat4 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_euler_zyx(vec3 angles, mat4 dest);
|
glmc_euler_xyz(const vec3 angles, mat4 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_euler_zxy(vec3 angles, mat4 dest);
|
glmc_euler_zyx(const vec3 angles, mat4 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_euler_xzy(vec3 angles, mat4 dest);
|
glmc_euler_zxy(const vec3 angles, mat4 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_euler_yzx(vec3 angles, mat4 dest);
|
glmc_euler_xzy(const vec3 angles, mat4 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_euler_yxz(vec3 angles, mat4 dest);
|
glmc_euler_yzx(const vec3 angles, mat4 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_euler_by_order(vec3 angles, glm_euler_sq axis, mat4 dest);
|
glmc_euler_yxz(const vec3 angles, mat4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_euler_by_order(const vec3 angles, glm_euler_sq axis, mat4 dest);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,26 +15,26 @@ extern "C" {
|
|||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_frustum_planes(mat4 m, vec4 dest[6]);
|
glmc_frustum_planes(const mat4 m, vec4 dest[6]);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_frustum_corners(mat4 invMat, vec4 dest[8]);
|
glmc_frustum_corners(const mat4 invMat, vec4 dest[8]);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_frustum_center(vec4 corners[8], vec4 dest);
|
glmc_frustum_center(const vec4 corners[8], vec4 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_frustum_box(vec4 corners[8], mat4 m, vec3 box[2]);
|
glmc_frustum_box(const vec4 corners[8], const mat4 m, vec3 box[2]);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_frustum_corners_at(vec4 corners[8],
|
glmc_frustum_corners_at(const vec4 corners[8],
|
||||||
float splitDist,
|
float splitDist,
|
||||||
float farDist,
|
float farDist,
|
||||||
vec4 planeCorners[4]);
|
vec4 planeCorners[4]);
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -15,28 +15,28 @@ extern "C" {
|
|||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_mat4_print(mat4 matrix,
|
glmc_mat4_print(const mat4 matrix,
|
||||||
FILE * __restrict ostream);
|
FILE * const __restrict ostream);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_mat3_print(mat3 matrix,
|
glmc_mat3_print(const mat3 matrix,
|
||||||
FILE * __restrict ostream);
|
FILE * const __restrict ostream);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec4_print(vec4 vec,
|
glmc_vec4_print(const vec4 vec,
|
||||||
FILE * __restrict ostream);
|
FILE * const __restrict ostream);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec3_print(vec3 vec,
|
glmc_vec3_print(const vec3 vec,
|
||||||
FILE * __restrict ostream);
|
FILE * const __restrict ostream);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_versor_print(versor vec,
|
glmc_versor_print(const versor vec,
|
||||||
FILE * __restrict ostream);
|
FILE * const __restrict ostream);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ extern "C" {
|
|||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_mat3_copy(mat3 mat, mat3 dest);
|
glmc_mat3_copy(const mat3 mat, mat3 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
@@ -26,11 +26,15 @@ glmc_mat3_identity(mat3 mat);
|
|||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_mat3_mul(mat3 m1, mat3 m2, mat3 dest);
|
glmc_mat3_identity_array(mat3 * const __restrict mat, size_t count);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_mat3_transpose_to(mat3 m, mat3 dest);
|
glmc_mat3_mul(const mat3 m1, const mat3 m2, mat3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat3_transpose_to(const mat3 m, mat3 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
@@ -38,7 +42,15 @@ glmc_mat3_transpose(mat3 m);
|
|||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_mat3_mulv(mat3 m, vec3 v, vec3 dest);
|
glmc_mat3_mulv(const mat3 m, const vec3 v, vec3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_mat3_trace(const mat3 m);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat3_quat(const mat3 m, versor dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
@@ -46,11 +58,11 @@ glmc_mat3_scale(mat3 m, float s);
|
|||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
float
|
float
|
||||||
glmc_mat3_det(mat3 mat);
|
glmc_mat3_det(const mat3 mat);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_mat3_inv(mat3 mat, mat3 dest);
|
glmc_mat3_inv(const mat3 mat, mat3 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
@@ -60,6 +72,10 @@ CGLM_EXPORT
|
|||||||
void
|
void
|
||||||
glmc_mat3_swap_row(mat3 mat, int row1, int row2);
|
glmc_mat3_swap_row(mat3 mat, int row1, int row2);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_mat3_rmc(const vec3 r, const mat3 m, const vec3 c);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -19,11 +19,11 @@ extern "C" {
|
|||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_mat4_ucopy(mat4 mat, mat4 dest);
|
glmc_mat4_ucopy(const mat4 mat, mat4 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_mat4_copy(mat4 mat, mat4 dest);
|
glmc_mat4_copy(const mat4 mat, mat4 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
@@ -31,31 +31,51 @@ glmc_mat4_identity(mat4 mat);
|
|||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_mat4_pick3(mat4 mat, mat3 dest);
|
glmc_mat4_identity_array(mat4 * const __restrict mat, size_t count);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_mat4_pick3t(mat4 mat, mat3 dest);
|
glmc_mat4_pick3(const mat4 mat, mat3 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_mat4_ins3(mat3 mat, mat4 dest);
|
glmc_mat4_pick3t(const mat4 mat, mat3 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_mat4_mul(mat4 m1, mat4 m2, mat4 dest);
|
glmc_mat4_ins3(const mat3 mat, mat4 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_mat4_mulN(mat4 * __restrict matrices[], int len, mat4 dest);
|
glmc_mat4_mul(const mat4 m1, const mat4 m2, mat4 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_mat4_mulv(mat4 m, vec4 v, vec4 dest);
|
glmc_mat4_mulN(mat4 * const __restrict matrices[], uint32_t len, mat4 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_mat4_transpose_to(mat4 m, mat4 dest);
|
glmc_mat4_mulv(const mat4 m, const vec4 v, vec4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat4_mulv3(const mat4 m, const vec3 v, float last, vec3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_mat4_trace(const mat4 m);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_mat4_trace3(const mat4 m);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat4_quat(const mat4 m, versor dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat4_transpose_to(const mat4 m, mat4 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
@@ -71,15 +91,19 @@ glmc_mat4_scale(mat4 m, float s);
|
|||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
float
|
float
|
||||||
glmc_mat4_det(mat4 mat);
|
glmc_mat4_det(const mat4 mat);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_mat4_inv(mat4 mat, mat4 dest);
|
glmc_mat4_inv(const mat4 mat, mat4 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_mat4_inv_precise(mat4 mat, mat4 dest);
|
glmc_mat4_inv_precise(const mat4 mat, mat4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat4_inv_fast(const mat4 mat, mat4 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
@@ -89,6 +113,10 @@ CGLM_EXPORT
|
|||||||
void
|
void
|
||||||
glmc_mat4_swap_row(mat4 mat, int row1, int row2);
|
glmc_mat4_swap_row(mat4 mat, int row1, int row2);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_mat4_rmc(const vec4 r, const mat4 m, const vec4 c);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
33
include/cglm/call/project.h
Normal file
33
include/cglm/call/project.h
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglmc_project_h
|
||||||
|
#define cglmc_project_h
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "../cglm.h"
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_unprojecti(const vec3 pos, const mat4 invMat, const vec4 vp, vec3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_unproject(const vec3 pos, const mat4 m, const vec4 vp, vec3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_project(const vec3 pos, const mat4 m, const vec4 vp, vec3 dest);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* cglmc_project_h */
|
||||||
|
|
||||||
|
|
||||||
@@ -19,21 +19,31 @@ glmc_quat_identity(versor q);
|
|||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_quat(versor q,
|
glmc_quat_identity_array(versor * const __restrict q, size_t count);
|
||||||
float angle,
|
|
||||||
float x,
|
|
||||||
float y,
|
|
||||||
float z);
|
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_quatv(versor q,
|
glmc_quat_init(versor q, float x, float y, float z, float w);
|
||||||
float angle,
|
|
||||||
vec3 v);
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_quat(versor q, float angle, float x, float y, float z);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_quatv(versor q, float angle, const vec3 axis);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_quat_copy(const versor q, versor dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
float
|
float
|
||||||
glmc_quat_norm(versor q);
|
glmc_quat_norm(const versor q);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_quat_normalize_to(const versor q, versor dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
@@ -41,22 +51,107 @@ glmc_quat_normalize(versor q);
|
|||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
float
|
float
|
||||||
glmc_quat_dot(versor q, versor r);
|
glmc_quat_dot(const versor p, const versor q);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_quat_mulv(versor q1, versor q2, versor dest);
|
glmc_quat_conjugate(const versor q, versor dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_quat_mat4(versor q, mat4 dest);
|
glmc_quat_inv(const versor q, versor dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_quat_slerp(versor q,
|
glmc_quat_add(const versor p, const versor q, versor dest);
|
||||||
versor r,
|
|
||||||
float t,
|
CGLM_EXPORT
|
||||||
versor dest);
|
void
|
||||||
|
glmc_quat_sub(const versor p, const versor q, versor dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_quat_real(const versor q);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_quat_imag(const versor q, vec3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_quat_imagn(const versor q, vec3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_quat_imaglen(const versor q);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_quat_angle(const versor q);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_quat_axis(const versor q, versor dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_quat_mul(const versor p, const versor q, versor dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_quat_mat4(const versor q, mat4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_quat_mat4t(const versor q, mat4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_quat_mat3(const versor q, mat3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_quat_mat3t(const versor q, mat3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_quat_lerp(const versor from, const versor to, float t, versor dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_quat_slerp(const versor q, const versor r, float t, versor dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_quat_look(const vec3 eye, const versor ori, mat4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_quat_for(const vec3 dir, const vec3 fwd, const vec3 up, versor dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_quat_forp(const vec3 from,
|
||||||
|
const vec3 to,
|
||||||
|
const vec3 fwd,
|
||||||
|
const vec3 up,
|
||||||
|
versor dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_quat_rotatev(const versor from, const vec3 to, vec3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_quat_rotate(const mat4 m, const versor q, mat4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_quat_rotate_at(mat4 model, const versor q, const vec3 pivot);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_quat_rotate_atm(mat4 m, const versor q, const vec3 pivot);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|||||||
39
include/cglm/call/sphere.h
Normal file
39
include/cglm/call/sphere.h
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
/*
|
||||||
|
* 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 "../cglm.h"
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_sphere_radii(const vec4 s);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_sphere_transform(const vec4 s, const mat4 m, vec4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_sphere_merge(const vec4 s1, const vec4 s2, vec4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
bool
|
||||||
|
glmc_sphere_sphere(const vec4 s1, const vec4 s2);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
bool
|
||||||
|
glmc_sphere_point(const vec4 s, const vec3 point);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* cglmc_sphere_h */
|
||||||
@@ -14,95 +14,233 @@ extern "C" {
|
|||||||
#include "../cglm.h"
|
#include "../cglm.h"
|
||||||
|
|
||||||
/* DEPRECATED! use _copy, _ucopy versions */
|
/* DEPRECATED! use _copy, _ucopy versions */
|
||||||
#define glmc_vec_dup(v, dest) glmc_vec_copy(v, dest)
|
#define glmc_vec_dup(v, dest) glmc_vec3_copy(v, dest)
|
||||||
|
#define glmc_vec3_flipsign(v) glmc_vec3_negate(v)
|
||||||
|
#define glmc_vec3_flipsign_to(v, dest) glmc_vec3_negate_to(v, dest)
|
||||||
|
#define glmc_vec3_inv(v) glmc_vec3_negate(v)
|
||||||
|
#define glmc_vec3_inv_to(v, dest) glmc_vec3_negate_to(v, dest)
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_copy(vec3 a, vec3 dest);
|
glmc_vec3(const vec4 v4, vec3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec3_copy(const vec3 a, vec3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec3_zero(vec3 v);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec3_one(vec3 v);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
float
|
float
|
||||||
glmc_vec_dot(vec3 a, vec3 b);
|
glmc_vec3_dot(const vec3 a, const vec3 b);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_cross(vec3 a, vec3 b, vec3 d);
|
glmc_vec3_cross(const vec3 a, const vec3 b, vec3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec3_crossn(const vec3 a, const vec3 b, vec3 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
float
|
float
|
||||||
glmc_vec_norm(vec3 vec);
|
glmc_vec3_norm(const vec3 v);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
float
|
float
|
||||||
glmc_vec_norm2(vec3 vec);
|
glmc_vec3_norm2(const vec3 v);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_normalize_to(vec3 vec, vec3 dest);
|
glmc_vec3_normalize_to(const vec3 v, vec3 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_normalize(vec3 v);
|
glmc_vec3_normalize(vec3 v);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_add(vec3 v1, vec3 v2, vec3 dest);
|
glmc_vec3_add(const vec3 a, const vec3 b, vec3 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_sub(vec3 v1, vec3 v2, vec3 dest);
|
glmc_vec3_adds(const vec3 v, float s, vec3 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_scale(vec3 v, float s, vec3 dest);
|
glmc_vec3_sub(const vec3 a, const vec3 b, vec3 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_scale_as(vec3 v, float s, vec3 dest);
|
glmc_vec3_subs(const vec3 v, float s, vec3 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_flipsign(vec3 v);
|
glmc_vec3_mul(const vec3 a, const vec3 b, vec3 d);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_inv(vec3 v);
|
glmc_vec3_scale(const vec3 v, float s, vec3 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_inv_to(vec3 v, vec3 dest);
|
glmc_vec3_scale_as(const vec3 v, float s, vec3 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
|
||||||
float
|
|
||||||
glmc_vec_angle(vec3 v1, vec3 v2);
|
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_rotate(vec3 v, float angle, vec3 axis);
|
glmc_vec3_div(const vec3 a, const vec3 b, vec3 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_rotate_m4(mat4 m, vec3 v, vec3 dest);
|
glmc_vec3_divs(const vec3 a, float s, vec3 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_proj(vec3 a, vec3 b, vec3 dest);
|
glmc_vec3_addadd(const vec3 a, const vec3 b, vec3 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_center(vec3 v1, vec3 v2, vec3 dest);
|
glmc_vec3_subadd(const vec3 a, const vec3 b, vec3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec3_muladd(const vec3 a, const vec3 b, vec3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec3_muladds(const vec3 a, float s, vec3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec3_maxadd(const vec3 a, const vec3 b, vec3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec3_minadd(const vec3 a, const vec3 b, vec3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec3_negate(vec3 v);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec3_negate_to(const vec3 v, vec3 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
float
|
float
|
||||||
glmc_vec_distance(vec3 v1, vec3 v2);
|
glmc_vec3_angle(const vec3 a, const vec3 b);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_maxv(vec3 v1, vec3 v2, vec3 dest);
|
glmc_vec3_rotate(vec3 v, float angle, const vec3 axis);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_minv(vec3 v1, vec3 v2, vec3 dest);
|
glmc_vec3_rotate_m4(const mat4 m, const vec3 v, vec3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec3_rotate_m3(const mat3 m, const vec3 v, vec3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec3_proj(const vec3 a, const vec3 b, vec3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec3_center(const vec3 a, const vec3 b, vec3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_vec3_distance2(const vec3 a, const vec3 b);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_vec3_distance(const vec3 a, const vec3 b);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec3_maxv(const vec3 a, const vec3 b, vec3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec3_minv(const vec3 a, const vec3 b, vec3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec3_clamp(vec3 v, float minVal, float maxVal);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec3_ortho(const vec3 v, vec3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec3_lerp(const vec3 from, const vec3 to, float t, vec3 dest);
|
||||||
|
|
||||||
|
/* ext */
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec3_mulv(const vec3 a, const vec3 b, vec3 d);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec3_broadcast(float val, vec3 d);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
bool
|
||||||
|
glmc_vec3_eq(const vec3 v, float val);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
bool
|
||||||
|
glmc_vec3_eq_eps(const vec3 v, float val);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
bool
|
||||||
|
glmc_vec3_eq_all(const vec3 v);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
bool
|
||||||
|
glmc_vec3_eqv(const vec3 a, const vec3 b);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
bool
|
||||||
|
glmc_vec3_eqv_eps(const vec3 a, const vec3 b);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_vec3_max(const vec3 v);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_vec3_min(const vec3 v);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
bool
|
||||||
|
glmc_vec3_isnan(const vec3 v);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
bool
|
||||||
|
glmc_vec3_isinf(const vec3 v);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
bool
|
||||||
|
glmc_vec3_isvalid(const vec3 v);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec3_sign(const vec3 v, vec3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec3_sqrt(const vec3 v, vec3 dest);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,32 +14,52 @@ extern "C" {
|
|||||||
#include "../cglm.h"
|
#include "../cglm.h"
|
||||||
|
|
||||||
/* DEPRECATED! use _copy, _ucopy versions */
|
/* DEPRECATED! use _copy, _ucopy versions */
|
||||||
#define glmc_vec4_dup3(v, dest) glmc_vec4_copy3(v, dest)
|
#define glmc_vec4_dup3(v, dest) glmc_vec4_copy3(v, dest)
|
||||||
#define glmc_vec4_dup(v, dest) glmc_vec4_copy(v, dest)
|
#define glmc_vec4_dup(v, dest) glmc_vec4_copy(v, dest)
|
||||||
|
#define glmc_vec4_flipsign(v) glmc_vec4_negate(v)
|
||||||
|
#define glmc_vec4_flipsign_to(v, dest) glmc_vec4_negate_to(v, dest)
|
||||||
|
#define glmc_vec4_inv(v) glmc_vec4_negate(v)
|
||||||
|
#define glmc_vec4_inv_to(v, dest) glmc_vec4_negate_to(v, dest)
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec4_copy3(vec4 a, vec3 dest);
|
glmc_vec4(const vec3 v3, float last, vec4 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec4_copy(vec4 v, vec4 dest);
|
glmc_vec4_zero(vec4 v);
|
||||||
|
|
||||||
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
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec4_normalize_to(vec4 vec, vec4 dest);
|
glmc_vec4_one(vec4 v);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec4_copy3(const vec4 v, vec3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec4_copy(const vec4 v, vec4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec4_ucopy(const vec4 v, vec4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_vec4_dot(const vec4 a, const vec4 b);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_vec4_norm(const vec4 v);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_vec4_norm2(const vec4 v);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec4_normalize_to(const vec4 v, vec4 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
@@ -47,43 +67,153 @@ glmc_vec4_normalize(vec4 v);
|
|||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec4_add(vec4 v1, vec4 v2, vec4 dest);
|
glmc_vec4_add(const vec4 a, const vec4 b, vec4 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec4_sub(vec4 v1, vec4 v2, vec4 dest);
|
glmc_vec4_adds(const vec4 v, float s, vec4 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec4_scale(vec4 v, float s, vec4 dest);
|
glmc_vec4_sub(const vec4 a, const vec4 b, vec4 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec4_scale_as(vec3 v, float s, vec3 dest);
|
glmc_vec4_subs(const vec4 v, float s, vec4 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec4_flipsign(vec4 v);
|
glmc_vec4_mul(const vec4 a, const vec4 b, vec4 d);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec4_inv(vec4 v);
|
glmc_vec4_scale(const vec4 v, float s, vec4 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec4_inv_to(vec4 v, vec4 dest);
|
glmc_vec4_scale_as(const vec3 v, float s, vec3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec4_div(const vec4 a, const vec4 b, vec4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec4_divs(const vec4 v, float s, vec4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec4_addadd(const vec4 a, const vec4 b, vec4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec4_subadd(const vec4 a, const vec4 b, vec4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec4_muladd(const vec4 a, const vec4 b, vec4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec4_muladds(const vec4 a, float s, vec4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec4_maxadd(const vec4 a, const vec4 b, vec4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec4_minadd(const vec4 a, const vec4 b, vec4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec4_negate(vec4 v);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec4_negate_to(const vec4 v, vec4 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
float
|
float
|
||||||
glmc_vec4_distance(vec4 v1, vec4 v2);
|
glmc_vec4_distance(const vec4 a, const vec4 b);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec4_maxv(vec4 v1, vec4 v2, vec4 dest);
|
glmc_vec4_maxv(const vec4 a, const vec4 b, vec4 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec4_minv(vec4 v1, vec4 v2, vec4 dest);
|
glmc_vec4_minv(const vec4 a, const vec4 b, vec4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec4_clamp(vec4 v, float minVal, float maxVal);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec4_lerp(const vec4 from, const vec4 to, float t, vec4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec4_cubic(float s, vec4 dest);
|
||||||
|
|
||||||
|
/* ext */
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec4_mulv(const vec4 a, const vec4 b, vec4 d);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec4_broadcast(float val, vec4 d);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
bool
|
||||||
|
glmc_vec4_eq(const vec4 v, float val);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
bool
|
||||||
|
glmc_vec4_eq_eps(const vec4 v, float val);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
bool
|
||||||
|
glmc_vec4_eq_all(const vec4 v);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
bool
|
||||||
|
glmc_vec4_eqv(const vec4 a, const vec4 b);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
bool
|
||||||
|
glmc_vec4_eqv_eps(const vec4 a, const vec4 b);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_vec4_max(const vec4 v);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_vec4_min(const vec4 v);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
bool
|
||||||
|
glmc_vec4_isnan(const vec4 v);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
bool
|
||||||
|
glmc_vec4_isinf(const vec4 v);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
bool
|
||||||
|
glmc_vec4_isvalid(const vec4 v);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec4_sign(const vec4 v, vec4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec4_sqrt(const vec4 v, vec4 dest);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -84,7 +84,7 @@ glm_frustum(float left,
|
|||||||
mat4 dest) {
|
mat4 dest) {
|
||||||
float rl, tb, fn, nv;
|
float rl, tb, fn, nv;
|
||||||
|
|
||||||
glm__memzero(float, dest, sizeof(mat4));
|
glm_mat4_zero(dest);
|
||||||
|
|
||||||
rl = 1.0f / (right - left);
|
rl = 1.0f / (right - left);
|
||||||
tb = 1.0f / (top - bottom);
|
tb = 1.0f / (top - bottom);
|
||||||
@@ -122,7 +122,7 @@ glm_ortho(float left,
|
|||||||
mat4 dest) {
|
mat4 dest) {
|
||||||
float rl, tb, fn;
|
float rl, tb, fn;
|
||||||
|
|
||||||
glm__memzero(float, dest, sizeof(mat4));
|
glm_mat4_zero(dest);
|
||||||
|
|
||||||
rl = 1.0f / (right - left);
|
rl = 1.0f / (right - left);
|
||||||
tb = 1.0f / (top - bottom);
|
tb = 1.0f / (top - bottom);
|
||||||
@@ -147,7 +147,7 @@ glm_ortho(float left,
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_ortho_aabb(vec3 box[2], mat4 dest) {
|
glm_ortho_aabb(const vec3 box[2], mat4 dest) {
|
||||||
glm_ortho(box[0][0], box[1][0],
|
glm_ortho(box[0][0], box[1][0],
|
||||||
box[0][1], box[1][1],
|
box[0][1], box[1][1],
|
||||||
-box[1][2], -box[0][2],
|
-box[1][2], -box[0][2],
|
||||||
@@ -165,7 +165,7 @@ glm_ortho_aabb(vec3 box[2], mat4 dest) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_ortho_aabb_p(vec3 box[2], float padding, mat4 dest) {
|
glm_ortho_aabb_p(const vec3 box[2], float padding, mat4 dest) {
|
||||||
glm_ortho(box[0][0] - padding, box[1][0] + padding,
|
glm_ortho(box[0][0] - padding, box[1][0] + padding,
|
||||||
box[0][1] - padding, box[1][1] + padding,
|
box[0][1] - padding, box[1][1] + padding,
|
||||||
-(box[1][2] + padding), -(box[0][2] - padding),
|
-(box[1][2] + padding), -(box[0][2] - padding),
|
||||||
@@ -183,7 +183,7 @@ glm_ortho_aabb_p(vec3 box[2], float padding, mat4 dest) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_ortho_aabb_pz(vec3 box[2], float padding, mat4 dest) {
|
glm_ortho_aabb_pz(const vec3 box[2], float padding, mat4 dest) {
|
||||||
glm_ortho(box[0][0], box[1][0],
|
glm_ortho(box[0][0], box[1][0],
|
||||||
box[0][1], box[1][1],
|
box[0][1], box[1][1],
|
||||||
-(box[1][2] + padding), -(box[0][2] - padding),
|
-(box[1][2] + padding), -(box[0][2] - padding),
|
||||||
@@ -198,26 +198,15 @@ glm_ortho_aabb_pz(vec3 box[2], float padding, mat4 dest) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_ortho_default(float aspect,
|
glm_ortho_default(float aspect, mat4 dest) {
|
||||||
mat4 dest) {
|
|
||||||
if (aspect >= 1.0f) {
|
if (aspect >= 1.0f) {
|
||||||
glm_ortho(-1.0f * aspect,
|
glm_ortho(-aspect, aspect, -1.0f, 1.0f, -100.0f, 100.0f, dest);
|
||||||
1.0f * aspect,
|
return;
|
||||||
-1.0f,
|
|
||||||
1.0f,
|
|
||||||
-100.0f,
|
|
||||||
100.0f,
|
|
||||||
dest);
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
glm_ortho(-1.0f,
|
aspect = 1.0f / aspect;
|
||||||
1.0f,
|
|
||||||
-1.0f / aspect,
|
glm_ortho(-1.0f, 1.0f, -aspect, aspect, -100.0f, 100.0f, dest);
|
||||||
1.0f / aspect,
|
|
||||||
-100.0f,
|
|
||||||
100.0f,
|
|
||||||
dest);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -229,9 +218,7 @@ glm_ortho_default(float aspect,
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_ortho_default_s(float aspect,
|
glm_ortho_default_s(float aspect, float size, mat4 dest) {
|
||||||
float size,
|
|
||||||
mat4 dest) {
|
|
||||||
if (aspect >= 1.0f) {
|
if (aspect >= 1.0f) {
|
||||||
glm_ortho(-size * aspect,
|
glm_ortho(-size * aspect,
|
||||||
size * aspect,
|
size * aspect,
|
||||||
@@ -240,7 +227,7 @@ glm_ortho_default_s(float aspect,
|
|||||||
-size - 100.0f,
|
-size - 100.0f,
|
||||||
size + 100.0f,
|
size + 100.0f,
|
||||||
dest);
|
dest);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
glm_ortho(-size,
|
glm_ortho(-size,
|
||||||
@@ -270,7 +257,7 @@ glm_perspective(float fovy,
|
|||||||
mat4 dest) {
|
mat4 dest) {
|
||||||
float f, fn;
|
float f, fn;
|
||||||
|
|
||||||
glm__memzero(float, dest, sizeof(mat4));
|
glm_mat4_zero(dest);
|
||||||
|
|
||||||
f = 1.0f / tanf(fovy * 0.5f);
|
f = 1.0f / tanf(fovy * 0.5f);
|
||||||
fn = 1.0f / (nearVal - farVal);
|
fn = 1.0f / (nearVal - farVal);
|
||||||
@@ -282,6 +269,30 @@ glm_perspective(float fovy,
|
|||||||
dest[3][2] = 2.0f * nearVal * farVal * fn;
|
dest[3][2] = 2.0f * nearVal * farVal * fn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief extend perspective projection matrix's far distance
|
||||||
|
*
|
||||||
|
* this function does not guarantee far >= near, be aware of that!
|
||||||
|
*
|
||||||
|
* @param[in, out] proj projection matrix to extend
|
||||||
|
* @param[in] deltaFar distance from existing far (negative to shink)
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_persp_move_far(mat4 proj, float deltaFar) {
|
||||||
|
float fn, farVal, nearVal, p22, p32;
|
||||||
|
|
||||||
|
p22 = proj[2][2];
|
||||||
|
p32 = proj[3][2];
|
||||||
|
|
||||||
|
nearVal = p32 / (p22 - 1.0f);
|
||||||
|
farVal = p32 / (p22 + 1.0f) + deltaFar;
|
||||||
|
fn = 1.0f / (nearVal - farVal);
|
||||||
|
|
||||||
|
proj[2][2] = (nearVal + farVal) * fn;
|
||||||
|
proj[3][2] = 2.0f * nearVal * farVal * fn;
|
||||||
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief set up perspective projection matrix with default near/far
|
* @brief set up perspective projection matrix with default near/far
|
||||||
* and angle values
|
* and angle values
|
||||||
@@ -291,13 +302,8 @@ glm_perspective(float fovy,
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_perspective_default(float aspect,
|
glm_perspective_default(float aspect, mat4 dest) {
|
||||||
mat4 dest) {
|
glm_perspective(GLM_PI_4f, aspect, 0.01f, 100.0f, dest);
|
||||||
glm_perspective((float)CGLM_PI_4,
|
|
||||||
aspect,
|
|
||||||
0.01f,
|
|
||||||
100.0f,
|
|
||||||
dest);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -310,8 +316,7 @@ glm_perspective_default(float aspect,
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_perspective_resize(float aspect,
|
glm_perspective_resize(float aspect, mat4 proj) {
|
||||||
mat4 proj) {
|
|
||||||
if (proj[0][0] == 0.0f)
|
if (proj[0][0] == 0.0f)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -321,6 +326,9 @@ glm_perspective_resize(float aspect,
|
|||||||
/*!
|
/*!
|
||||||
* @brief set up view matrix
|
* @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] eye eye vector
|
||||||
* @param[in] center center vector
|
* @param[in] center center vector
|
||||||
* @param[in] up up vector
|
* @param[in] up up vector
|
||||||
@@ -328,19 +336,17 @@ glm_perspective_resize(float aspect,
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_lookat(vec3 eye,
|
glm_lookat(const vec3 eye,
|
||||||
vec3 center,
|
const vec3 center,
|
||||||
vec3 up,
|
const vec3 up,
|
||||||
mat4 dest) {
|
mat4 dest) {
|
||||||
vec3 f, u, s;
|
CGLM_ALIGN(8) vec3 f, u, s;
|
||||||
|
|
||||||
glm_vec_sub(center, eye, f);
|
glm_vec3_sub(center, eye, f);
|
||||||
glm_vec_normalize(f);
|
glm_vec3_normalize(f);
|
||||||
|
|
||||||
glm_vec_cross(f, up, s);
|
glm_vec3_crossn(f, up, s);
|
||||||
glm_vec_normalize(s);
|
glm_vec3_cross(s, f, u);
|
||||||
|
|
||||||
glm_vec_cross(s, f, u);
|
|
||||||
|
|
||||||
dest[0][0] = s[0];
|
dest[0][0] = s[0];
|
||||||
dest[0][1] = u[0];
|
dest[0][1] = u[0];
|
||||||
@@ -351,9 +357,9 @@ glm_lookat(vec3 eye,
|
|||||||
dest[2][0] = s[2];
|
dest[2][0] = s[2];
|
||||||
dest[2][1] = u[2];
|
dest[2][1] = u[2];
|
||||||
dest[2][2] =-f[2];
|
dest[2][2] =-f[2];
|
||||||
dest[3][0] =-glm_vec_dot(s, eye);
|
dest[3][0] =-glm_vec3_dot(s, eye);
|
||||||
dest[3][1] =-glm_vec_dot(u, eye);
|
dest[3][1] =-glm_vec3_dot(u, eye);
|
||||||
dest[3][2] = glm_vec_dot(f, eye);
|
dest[3][2] = glm_vec3_dot(f, eye);
|
||||||
dest[0][3] = dest[1][3] = dest[2][3] = 0.0f;
|
dest[0][3] = dest[1][3] = dest[2][3] = 0.0f;
|
||||||
dest[3][3] = 1.0f;
|
dest[3][3] = 1.0f;
|
||||||
}
|
}
|
||||||
@@ -364,6 +370,9 @@ glm_lookat(vec3 eye,
|
|||||||
* convenient wrapper for lookat: if you only have direction not target self
|
* 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.
|
* 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] eye eye vector
|
||||||
* @param[in] dir direction vector
|
* @param[in] dir direction vector
|
||||||
* @param[in] up up vector
|
* @param[in] up up vector
|
||||||
@@ -371,9 +380,9 @@ glm_lookat(vec3 eye,
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_look(vec3 eye, vec3 dir, vec3 up, mat4 dest) {
|
glm_look(const vec3 eye, const vec3 dir, const vec3 up, mat4 dest) {
|
||||||
vec3 target;
|
CGLM_ALIGN(8) vec3 target;
|
||||||
glm_vec_add(eye, dir, target);
|
glm_vec3_add(eye, dir, target);
|
||||||
glm_lookat(eye, target, up, dest);
|
glm_lookat(eye, target, up, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -389,9 +398,9 @@ glm_look(vec3 eye, vec3 dir, vec3 up, mat4 dest) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_look_anyup(vec3 eye, vec3 dir, mat4 dest) {
|
glm_look_anyup(const vec3 eye, const vec3 dir, mat4 dest) {
|
||||||
vec3 up;
|
CGLM_ALIGN(8) vec3 up;
|
||||||
glm_vec_ortho(dir, up);
|
glm_vec3_ortho(dir, up);
|
||||||
glm_look(eye, dir, up, dest);
|
glm_look(eye, dir, up, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -408,7 +417,7 @@ glm_look_anyup(vec3 eye, vec3 dir, mat4 dest) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_persp_decomp(mat4 proj,
|
glm_persp_decomp(const mat4 proj,
|
||||||
float * __restrict nearVal,
|
float * __restrict nearVal,
|
||||||
float * __restrict farVal,
|
float * __restrict farVal,
|
||||||
float * __restrict top,
|
float * __restrict top,
|
||||||
@@ -448,7 +457,7 @@ glm_persp_decomp(mat4 proj,
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_persp_decompv(mat4 proj, float dest[6]) {
|
glm_persp_decompv(const mat4 proj, float dest[6]) {
|
||||||
glm_persp_decomp(proj, &dest[0], &dest[1], &dest[2],
|
glm_persp_decomp(proj, &dest[0], &dest[1], &dest[2],
|
||||||
&dest[3], &dest[4], &dest[5]);
|
&dest[3], &dest[4], &dest[5]);
|
||||||
}
|
}
|
||||||
@@ -463,7 +472,7 @@ glm_persp_decompv(mat4 proj, float dest[6]) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_persp_decomp_x(mat4 proj,
|
glm_persp_decomp_x(const mat4 proj,
|
||||||
float * __restrict left,
|
float * __restrict left,
|
||||||
float * __restrict right) {
|
float * __restrict right) {
|
||||||
float nearVal, m20, m00;
|
float nearVal, m20, m00;
|
||||||
@@ -486,7 +495,7 @@ glm_persp_decomp_x(mat4 proj,
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_persp_decomp_y(mat4 proj,
|
glm_persp_decomp_y(const mat4 proj,
|
||||||
float * __restrict top,
|
float * __restrict top,
|
||||||
float * __restrict bottom) {
|
float * __restrict bottom) {
|
||||||
float nearVal, m21, m11;
|
float nearVal, m21, m11;
|
||||||
@@ -509,7 +518,7 @@ glm_persp_decomp_y(mat4 proj,
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_persp_decomp_z(mat4 proj,
|
glm_persp_decomp_z(const mat4 proj,
|
||||||
float * __restrict nearVal,
|
float * __restrict nearVal,
|
||||||
float * __restrict farVal) {
|
float * __restrict farVal) {
|
||||||
float m32, m22;
|
float m32, m22;
|
||||||
@@ -529,7 +538,7 @@ glm_persp_decomp_z(mat4 proj,
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_persp_decomp_far(mat4 proj, float * __restrict farVal) {
|
glm_persp_decomp_far(const mat4 proj, float * __restrict farVal) {
|
||||||
*farVal = proj[3][2] / (proj[2][2] + 1.0f);
|
*farVal = proj[3][2] / (proj[2][2] + 1.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -541,7 +550,7 @@ glm_persp_decomp_far(mat4 proj, float * __restrict farVal) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_persp_decomp_near(mat4 proj, float * __restrict nearVal) {
|
glm_persp_decomp_near(const mat4 proj, float * __restrict nearVal) {
|
||||||
*nearVal = proj[3][2] / (proj[2][2] - 1.0f);
|
*nearVal = proj[3][2] / (proj[2][2] - 1.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -555,7 +564,7 @@ glm_persp_decomp_near(mat4 proj, float * __restrict nearVal) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
float
|
float
|
||||||
glm_persp_fovy(mat4 proj) {
|
glm_persp_fovy(const mat4 proj) {
|
||||||
return 2.0f * atanf(1.0f / proj[1][1]);
|
return 2.0f * atanf(1.0f / proj[1][1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -566,7 +575,7 @@ glm_persp_fovy(mat4 proj) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
float
|
float
|
||||||
glm_persp_aspect(mat4 proj) {
|
glm_persp_aspect(const mat4 proj) {
|
||||||
return proj[1][1] / proj[0][0];
|
return proj[1][1] / proj[0][0];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -579,7 +588,7 @@ glm_persp_aspect(mat4 proj) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_persp_sizes(mat4 proj, float fovy, vec4 dest) {
|
glm_persp_sizes(const mat4 proj, float fovy, vec4 dest) {
|
||||||
float t, a, nearVal, farVal;
|
float t, a, nearVal, farVal;
|
||||||
|
|
||||||
t = 2.0f * tanf(fovy * 0.5f);
|
t = 2.0f * tanf(fovy * 0.5f);
|
||||||
|
|||||||
@@ -23,5 +23,10 @@
|
|||||||
#include "color.h"
|
#include "color.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "io.h"
|
#include "io.h"
|
||||||
|
#include "project.h"
|
||||||
|
#include "sphere.h"
|
||||||
|
#include "ease.h"
|
||||||
|
#include "curve.h"
|
||||||
|
#include "bezier.h"
|
||||||
|
|
||||||
#endif /* cglm_h */
|
#endif /* cglm_h */
|
||||||
|
|||||||
@@ -18,7 +18,7 @@
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
float
|
float
|
||||||
glm_luminance(vec3 rgb) {
|
glm_luminance(const vec3 rgb) {
|
||||||
vec3 l = {0.212671f, 0.715160f, 0.072169f};
|
vec3 l = {0.212671f, 0.715160f, 0.072169f};
|
||||||
return glm_dot(rgb, l);
|
return glm_dot(rgb, l);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,10 +11,12 @@
|
|||||||
#define _USE_MATH_DEFINES /* for windows */
|
#define _USE_MATH_DEFINES /* for windows */
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <stddef.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <float.h>
|
#include <float.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
#if defined(_WIN32)
|
#if defined(_MSC_VER)
|
||||||
# ifdef CGLM_DLL
|
# ifdef CGLM_DLL
|
||||||
# define CGLM_EXPORT __declspec(dllexport)
|
# define CGLM_EXPORT __declspec(dllexport)
|
||||||
# else
|
# else
|
||||||
@@ -26,34 +28,6 @@
|
|||||||
# define CGLM_INLINE static inline __attribute((always_inline))
|
# define CGLM_INLINE static inline __attribute((always_inline))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define glm__memcpy(type, dest, src, size) \
|
|
||||||
do { \
|
|
||||||
type *srci; \
|
|
||||||
type *srci_end; \
|
|
||||||
type *desti; \
|
|
||||||
\
|
|
||||||
srci = (type *)src; \
|
|
||||||
srci_end = (type *)((char *)srci + size); \
|
|
||||||
desti = (type *)dest; \
|
|
||||||
\
|
|
||||||
while (srci != srci_end) \
|
|
||||||
*desti++ = *srci++; \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define glm__memset(type, dest, size, val) \
|
|
||||||
do { \
|
|
||||||
type *desti; \
|
|
||||||
type *desti_end; \
|
|
||||||
\
|
|
||||||
desti = (type *)dest; \
|
|
||||||
desti_end = (type *)((char *)desti + size); \
|
|
||||||
\
|
|
||||||
while (desti != desti_end) \
|
|
||||||
*desti++ = val; \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define glm__memzero(type, dest, size) glm__memset(type, dest, size, 0)
|
|
||||||
|
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
#include "simd/intrin.h"
|
#include "simd/intrin.h"
|
||||||
|
|
||||||
|
|||||||
40
include/cglm/curve.h
Normal file
40
include/cglm/curve.h
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglm_curve_h
|
||||||
|
#define cglm_curve_h
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "vec4.h"
|
||||||
|
#include "mat4.h"
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief helper function to calculate S*M*C multiplication for curves
|
||||||
|
*
|
||||||
|
* This function does not encourage you to use SMC,
|
||||||
|
* instead it is a helper if you use SMC.
|
||||||
|
*
|
||||||
|
* if you want to specify S as vector then use more generic glm_mat4_rmc() func.
|
||||||
|
*
|
||||||
|
* Example usage:
|
||||||
|
* B(s) = glm_smc(s, GLM_BEZIER_MAT, (vec4){p0, c0, c1, p1})
|
||||||
|
*
|
||||||
|
* @param[in] s parameter between 0 and 1 (this will be [s3, s2, s, 1])
|
||||||
|
* @param[in] m basis matrix
|
||||||
|
* @param[in] c position/control vector
|
||||||
|
*
|
||||||
|
* @return B(s)
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_smc(float s, const mat4 m, const vec4 c) {
|
||||||
|
vec4 vs;
|
||||||
|
glm_vec4_cubic(s, vs);
|
||||||
|
return glm_mat4_rmc(vs, m, c);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* cglm_curve_h */
|
||||||
317
include/cglm/ease.h
Normal file
317
include/cglm/ease.h
Normal file
@@ -0,0 +1,317 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglm_ease_h
|
||||||
|
#define cglm_ease_h
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_ease_linear(float t) {
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_ease_sine_in(float t) {
|
||||||
|
return sinf((t - 1.0f) * GLM_PI_2f) + 1.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_ease_sine_out(float t) {
|
||||||
|
return sinf(t * GLM_PI_2f);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_ease_sine_inout(float t) {
|
||||||
|
return 0.5f * (1.0f - cosf(t * GLM_PIf));
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_ease_quad_in(float t) {
|
||||||
|
return t * t;
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_ease_quad_out(float t) {
|
||||||
|
return -(t * (t - 2.0f));
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_ease_quad_inout(float t) {
|
||||||
|
float tt;
|
||||||
|
|
||||||
|
tt = t * t;
|
||||||
|
if (t < 0.5f)
|
||||||
|
return 2.0f * tt;
|
||||||
|
|
||||||
|
return (-2.0f * tt) + (4.0f * t) - 1.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_ease_cubic_in(float t) {
|
||||||
|
return t * t * t;
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_ease_cubic_out(float t) {
|
||||||
|
float f;
|
||||||
|
f = t - 1.0f;
|
||||||
|
return f * f * f + 1.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_ease_cubic_inout(float t) {
|
||||||
|
float f;
|
||||||
|
|
||||||
|
if (t < 0.5f)
|
||||||
|
return 4.0f * t * t * t;
|
||||||
|
|
||||||
|
f = 2.0f * t - 2.0f;
|
||||||
|
|
||||||
|
return 0.5f * f * f * f + 1.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_ease_quart_in(float t) {
|
||||||
|
float f;
|
||||||
|
f = t * t;
|
||||||
|
return f * f;
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_ease_quart_out(float t) {
|
||||||
|
float f;
|
||||||
|
|
||||||
|
f = t - 1.0f;
|
||||||
|
|
||||||
|
return f * f * f * (1.0f - t) + 1.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_ease_quart_inout(float t) {
|
||||||
|
float f, g;
|
||||||
|
|
||||||
|
if (t < 0.5f) {
|
||||||
|
f = t * t;
|
||||||
|
return 8.0f * f * f;
|
||||||
|
}
|
||||||
|
|
||||||
|
f = t - 1.0f;
|
||||||
|
g = f * f;
|
||||||
|
|
||||||
|
return -8.0f * g * g + 1.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_ease_quint_in(float t) {
|
||||||
|
float f;
|
||||||
|
f = t * t;
|
||||||
|
return f * f * t;
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_ease_quint_out(float t) {
|
||||||
|
float f, g;
|
||||||
|
|
||||||
|
f = t - 1.0f;
|
||||||
|
g = f * f;
|
||||||
|
|
||||||
|
return g * g * f + 1.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_ease_quint_inout(float t) {
|
||||||
|
float f, g;
|
||||||
|
|
||||||
|
if (t < 0.5f) {
|
||||||
|
f = t * t;
|
||||||
|
return 16.0f * f * f * t;
|
||||||
|
}
|
||||||
|
|
||||||
|
f = 2.0f * t - 2.0f;
|
||||||
|
g = f * f;
|
||||||
|
|
||||||
|
return 0.5f * g * g * f + 1.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_ease_exp_in(float t) {
|
||||||
|
if (t == 0.0f)
|
||||||
|
return t;
|
||||||
|
|
||||||
|
return powf(2.0f, 10.0f * (t - 1.0f));
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_ease_exp_out(float t) {
|
||||||
|
if (t == 1.0f)
|
||||||
|
return t;
|
||||||
|
|
||||||
|
return 1.0f - powf(2.0f, -10.0f * t);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_ease_exp_inout(float t) {
|
||||||
|
if (t == 0.0f || t == 1.0f)
|
||||||
|
return t;
|
||||||
|
|
||||||
|
if (t < 0.5f)
|
||||||
|
return 0.5f * powf(2.0f, (20.0f * t) - 10.0f);
|
||||||
|
|
||||||
|
return -0.5f * powf(2.0f, (-20.0f * t) + 10.0f) + 1.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_ease_circ_in(float t) {
|
||||||
|
return 1.0f - sqrtf(1.0f - (t * t));
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_ease_circ_out(float t) {
|
||||||
|
return sqrtf((2.0f - t) * t);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_ease_circ_inout(float t) {
|
||||||
|
if (t < 0.5f)
|
||||||
|
return 0.5f * (1.0f - sqrtf(1.0f - 4.0f * (t * t)));
|
||||||
|
|
||||||
|
return 0.5f * (sqrtf(-((2.0f * t) - 3.0f) * ((2.0f * t) - 1.0f)) + 1.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_ease_back_in(float t) {
|
||||||
|
float o, z;
|
||||||
|
|
||||||
|
o = 1.70158f;
|
||||||
|
z = ((o + 1.0f) * t) - o;
|
||||||
|
|
||||||
|
return t * t * z;
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_ease_back_out(float t) {
|
||||||
|
float o, z, n;
|
||||||
|
|
||||||
|
o = 1.70158f;
|
||||||
|
n = t - 1.0f;
|
||||||
|
z = (o + 1.0f) * n + o;
|
||||||
|
|
||||||
|
return n * n * z + 1.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_ease_back_inout(float t) {
|
||||||
|
float o, z, n, m, s, x;
|
||||||
|
|
||||||
|
o = 1.70158f;
|
||||||
|
s = o * 1.525f;
|
||||||
|
x = 0.5;
|
||||||
|
n = t / 0.5f;
|
||||||
|
|
||||||
|
if (n < 1.0f) {
|
||||||
|
z = (s + 1) * n - s;
|
||||||
|
m = n * n * z;
|
||||||
|
return x * m;
|
||||||
|
}
|
||||||
|
|
||||||
|
n -= 2.0f;
|
||||||
|
z = (s + 1.0f) * n + s;
|
||||||
|
m = (n * n * z) + 2;
|
||||||
|
|
||||||
|
return x * m;
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_ease_elast_in(float t) {
|
||||||
|
return sinf(13.0f * GLM_PI_2f * t) * powf(2.0f, 10.0f * (t - 1.0f));
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_ease_elast_out(float t) {
|
||||||
|
return sinf(-13.0f * GLM_PI_2f * (t + 1.0f)) * powf(2.0f, -10.0f * t) + 1.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_ease_elast_inout(float t) {
|
||||||
|
float a;
|
||||||
|
|
||||||
|
a = 2.0f * t;
|
||||||
|
|
||||||
|
if (t < 0.5f)
|
||||||
|
return 0.5f * sinf(13.0f * GLM_PI_2f * a)
|
||||||
|
* powf(2.0f, 10.0f * (a - 1.0f));
|
||||||
|
|
||||||
|
return 0.5f * (sinf(-13.0f * GLM_PI_2f * a)
|
||||||
|
* powf(2.0f, -10.0f * (a - 1.0f)) + 2.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_ease_bounce_out(float t) {
|
||||||
|
float tt;
|
||||||
|
|
||||||
|
tt = t * t;
|
||||||
|
|
||||||
|
if (t < (4.0f / 11.0f))
|
||||||
|
return (121.0f * tt) / 16.0f;
|
||||||
|
|
||||||
|
if (t < 8.0f / 11.0f)
|
||||||
|
return ((363.0f / 40.0f) * tt) - ((99.0f / 10.0f) * t) + (17.0f / 5.0f);
|
||||||
|
|
||||||
|
if (t < (9.0f / 10.0f))
|
||||||
|
return (4356.0f / 361.0f) * tt
|
||||||
|
- (35442.0f / 1805.0f) * t
|
||||||
|
+ (16061.0f / 1805.0f);
|
||||||
|
|
||||||
|
return ((54.0f / 5.0f) * tt) - ((513.0f / 25.0f) * t) + (268.0f / 25.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_ease_bounce_in(float t) {
|
||||||
|
return 1.0f - glm_ease_bounce_out(1.0f - t);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_ease_bounce_inout(float t) {
|
||||||
|
if (t < 0.5f)
|
||||||
|
return 0.5f * (1.0f - glm_ease_bounce_out(t * 2.0f));
|
||||||
|
|
||||||
|
return 0.5f * glm_ease_bounce_out(t * 2.0f - 1.0f) + 0.5f;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* cglm_ease_h */
|
||||||
@@ -5,6 +5,14 @@
|
|||||||
* Full license can be found in the LICENSE file
|
* Full license can be found in the LICENSE file
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
NOTE:
|
||||||
|
angles must be passed as [X-Angle, Y-Angle, Z-angle] order
|
||||||
|
For instance you don't pass angles as [Z-Angle, X-Angle, Y-angle] to
|
||||||
|
glm_euler_zxy funciton, All RELATED functions accept angles same order
|
||||||
|
which is [X, Y, Z].
|
||||||
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Types:
|
Types:
|
||||||
enum glm_euler_sq
|
enum glm_euler_sq
|
||||||
@@ -13,6 +21,7 @@
|
|||||||
CGLM_INLINE glm_euler_sq glm_euler_order(int newOrder[3]);
|
CGLM_INLINE glm_euler_sq glm_euler_order(int newOrder[3]);
|
||||||
CGLM_INLINE void glm_euler_angles(mat4 m, vec3 dest);
|
CGLM_INLINE void glm_euler_angles(mat4 m, vec3 dest);
|
||||||
CGLM_INLINE void glm_euler(vec3 angles, mat4 dest);
|
CGLM_INLINE void glm_euler(vec3 angles, mat4 dest);
|
||||||
|
CGLM_INLINE void glm_euler_xyz(vec3 angles, mat4 dest);
|
||||||
CGLM_INLINE void glm_euler_zyx(vec3 angles, mat4 dest);
|
CGLM_INLINE void glm_euler_zyx(vec3 angles, mat4 dest);
|
||||||
CGLM_INLINE void glm_euler_zxy(vec3 angles, mat4 dest);
|
CGLM_INLINE void glm_euler_zxy(vec3 angles, mat4 dest);
|
||||||
CGLM_INLINE void glm_euler_xzy(vec3 angles, mat4 dest);
|
CGLM_INLINE void glm_euler_xzy(vec3 angles, mat4 dest);
|
||||||
@@ -48,7 +57,7 @@ typedef enum glm_euler_sq {
|
|||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
glm_euler_sq
|
glm_euler_sq
|
||||||
glm_euler_order(int ord[3]) {
|
glm_euler_order(const int ord[3]) {
|
||||||
return (glm_euler_sq)(ord[0] << 0 | ord[1] << 2 | ord[2] << 4);
|
return (glm_euler_sq)(ord[0] << 0 | ord[1] << 2 | ord[2] << 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -60,260 +69,290 @@ glm_euler_order(int ord[3]) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_euler_angles(mat4 m, vec3 dest) {
|
glm_euler_angles(const mat4 m, vec3 dest) {
|
||||||
if (m[0][2] < 1.0f) {
|
float m00, m01, m10, m11, m20, m21, m22;
|
||||||
if (m[0][2] > -1.0f) {
|
float thetaX, thetaY, thetaZ;
|
||||||
vec3 a[2];
|
|
||||||
float cy1, cy2;
|
|
||||||
int path;
|
|
||||||
|
|
||||||
a[0][1] = asinf(-m[0][2]);
|
m00 = m[0][0]; m10 = m[1][0]; m20 = m[2][0];
|
||||||
a[1][1] = CGLM_PI - a[0][1];
|
m01 = m[0][1]; m11 = m[1][1]; m21 = m[2][1];
|
||||||
|
m22 = m[2][2];
|
||||||
|
|
||||||
cy1 = cosf(a[0][1]);
|
if (m20 < 1.0f) {
|
||||||
cy2 = cosf(a[1][1]);
|
if (m20 > -1.0f) {
|
||||||
|
thetaY = asinf(m20);
|
||||||
a[0][0] = atan2f(m[1][2] / cy1, m[2][2] / cy1);
|
thetaX = atan2f(-m21, m22);
|
||||||
a[1][0] = atan2f(m[1][2] / cy2, m[2][2] / cy2);
|
thetaZ = atan2f(-m10, m00);
|
||||||
|
} else { /* m20 == -1 */
|
||||||
a[0][2] = atan2f(m[0][1] / cy1, m[0][0] / cy1);
|
/* Not a unique solution */
|
||||||
a[1][2] = atan2f(m[0][1] / cy2, m[0][0] / cy2);
|
thetaY = -GLM_PI_2f;
|
||||||
|
thetaX = -atan2f(m01, m11);
|
||||||
path = (fabsf(a[0][0]) + fabsf(a[0][1]) + fabsf(a[0][2])) >=
|
thetaZ = 0.0f;
|
||||||
(fabsf(a[1][0]) + fabsf(a[1][1]) + fabsf(a[1][2]));
|
|
||||||
|
|
||||||
glm_vec_copy(a[path], dest);
|
|
||||||
} else {
|
|
||||||
dest[0] = atan2f(m[1][0], m[2][0]);
|
|
||||||
dest[1] = CGLM_PI_2;
|
|
||||||
dest[2] = 0.0f;
|
|
||||||
}
|
}
|
||||||
} else {
|
} else { /* m20 == +1 */
|
||||||
dest[0] = atan2f(-m[1][0], -m[2][0]);
|
thetaY = GLM_PI_2f;
|
||||||
dest[1] =-CGLM_PI_2;
|
thetaX = atan2f(m01, m11);
|
||||||
dest[2] = 0.0f;
|
thetaZ = 0.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dest[0] = thetaX;
|
||||||
|
dest[1] = thetaY;
|
||||||
|
dest[2] = thetaZ;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief build rotation matrix from euler angles
|
* @brief build rotation matrix from euler angles
|
||||||
*
|
*
|
||||||
* @param[in] angles angles as vector [Ex, Ey, Ez]
|
* @param[in] angles angles as vector [Xangle, Yangle, Zangle]
|
||||||
* @param[out] dest rotation matrix
|
* @param[out] dest rotation matrix
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_euler(vec3 angles, mat4 dest) {
|
glm_euler_xyz(const vec3 angles, mat4 dest) {
|
||||||
float cx, cy, cz,
|
float cx, cy, cz,
|
||||||
sx, sy, sz;
|
sx, sy, sz, czsx, cxcz, sysz;
|
||||||
|
|
||||||
sx = sinf(angles[0]); cx = cosf(angles[0]);
|
sx = sinf(angles[0]); cx = cosf(angles[0]);
|
||||||
sy = sinf(angles[1]); cy = cosf(angles[1]);
|
sy = sinf(angles[1]); cy = cosf(angles[1]);
|
||||||
sz = sinf(angles[2]); cz = cosf(angles[2]);
|
sz = sinf(angles[2]); cz = cosf(angles[2]);
|
||||||
|
|
||||||
dest[0][0] = cy * cz;
|
czsx = cz * sx;
|
||||||
dest[0][1] = cy * sz;
|
cxcz = cx * cz;
|
||||||
dest[0][2] =-sy;
|
sysz = sy * sz;
|
||||||
dest[1][0] = cz * sx * sy - cx * sz;
|
|
||||||
dest[1][1] = cx * cz + sx * sy * sz;
|
dest[0][0] = cy * cz;
|
||||||
dest[1][2] = cy * sx;
|
dest[0][1] = czsx * sy + cx * sz;
|
||||||
dest[2][0] = cx * cz * sy + sx * sz;
|
dest[0][2] = -cxcz * sy + sx * sz;
|
||||||
dest[2][1] =-cz * sx + cx * sy * sz;
|
dest[1][0] = -cy * sz;
|
||||||
dest[2][2] = cx * cy;
|
dest[1][1] = cxcz - sx * sysz;
|
||||||
dest[0][3] = 0.0f;
|
dest[1][2] = czsx + cx * sysz;
|
||||||
dest[1][3] = 0.0f;
|
dest[2][0] = sy;
|
||||||
dest[2][3] = 0.0f;
|
dest[2][1] = -cy * sx;
|
||||||
dest[3][0] = 0.0f;
|
dest[2][2] = cx * cy;
|
||||||
dest[3][1] = 0.0f;
|
dest[0][3] = 0.0f;
|
||||||
dest[3][2] = 0.0f;
|
dest[1][3] = 0.0f;
|
||||||
dest[3][3] = 1.0f;
|
dest[2][3] = 0.0f;
|
||||||
|
dest[3][0] = 0.0f;
|
||||||
|
dest[3][1] = 0.0f;
|
||||||
|
dest[3][2] = 0.0f;
|
||||||
|
dest[3][3] = 1.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief build rotation matrix from euler angles
|
* @brief build rotation matrix from euler angles
|
||||||
*
|
*
|
||||||
* @param[in] angles angles as vector [Ez, Ey, Ex]
|
* @param[in] angles angles as vector [Xangle, Yangle, Zangle]
|
||||||
* @param[out] dest rotation matrix
|
* @param[out] dest rotation matrix
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_euler_zyx(vec3 angles,
|
glm_euler(const vec3 angles, mat4 dest) {
|
||||||
mat4 dest) {
|
glm_euler_xyz(angles, dest);
|
||||||
float cx, cy, cz,
|
|
||||||
sx, sy, sz;
|
|
||||||
|
|
||||||
sx = sinf(angles[0]); cx = cosf(angles[0]);
|
|
||||||
sy = sinf(angles[1]); cy = cosf(angles[1]);
|
|
||||||
sz = sinf(angles[2]); cz = cosf(angles[2]);
|
|
||||||
|
|
||||||
dest[0][0] = cy * cz;
|
|
||||||
dest[0][1] = cz * sx * sy + cx * sz;
|
|
||||||
dest[0][2] =-cx * cz * sy + sx * sz;
|
|
||||||
dest[1][0] =-cy * sz;
|
|
||||||
dest[1][1] = cx * cz - sx * sy * sz;
|
|
||||||
dest[1][2] = cz * sx + cx * sy * sz;
|
|
||||||
dest[2][0] = sy;
|
|
||||||
dest[2][1] =-cy * sx;
|
|
||||||
dest[2][2] = cx * cy;
|
|
||||||
dest[0][3] = 0.0f;
|
|
||||||
dest[1][3] = 0.0f;
|
|
||||||
dest[2][3] = 0.0f;
|
|
||||||
dest[3][0] = 0.0f;
|
|
||||||
dest[3][1] = 0.0f;
|
|
||||||
dest[3][2] = 0.0f;
|
|
||||||
dest[3][3] = 1.0f;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief build rotation matrix from euler angles
|
* @brief build rotation matrix from euler angles
|
||||||
*
|
*
|
||||||
* @param[in] angles angles as vector [Ez, Ex, Ey]
|
* @param[in] angles angles as vector [Xangle, Yangle, Zangle]
|
||||||
* @param[out] dest rotation matrix
|
* @param[out] dest rotation matrix
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_euler_zxy(vec3 angles,
|
glm_euler_xzy(const vec3 angles, mat4 dest) {
|
||||||
mat4 dest) {
|
|
||||||
float cx, cy, cz,
|
float cx, cy, cz,
|
||||||
sx, sy, sz;
|
sx, sy, sz, sxsy, cysx, cxsy, cxcy;
|
||||||
|
|
||||||
sx = sinf(angles[0]); cx = cosf(angles[0]);
|
sx = sinf(angles[0]); cx = cosf(angles[0]);
|
||||||
sy = sinf(angles[1]); cy = cosf(angles[1]);
|
sy = sinf(angles[1]); cy = cosf(angles[1]);
|
||||||
sz = sinf(angles[2]); cz = cosf(angles[2]);
|
sz = sinf(angles[2]); cz = cosf(angles[2]);
|
||||||
|
|
||||||
dest[0][0] = cy * cz + sx * sy * sz;
|
sxsy = sx * sy;
|
||||||
dest[0][1] = cx * sz;
|
cysx = cy * sx;
|
||||||
dest[0][2] =-cz * sy + cy * sx * sz;
|
cxsy = cx * sy;
|
||||||
dest[1][0] = cz * sx * sy - cy * sz;
|
cxcy = cx * cy;
|
||||||
dest[1][1] = cx * cz;
|
|
||||||
dest[1][2] = cy * cz * sx + sy * sz;
|
dest[0][0] = cy * cz;
|
||||||
dest[2][0] = cx * sy;
|
dest[0][1] = sxsy + cxcy * sz;
|
||||||
dest[2][1] =-sx;
|
dest[0][2] = -cxsy + cysx * sz;
|
||||||
dest[2][2] = cx * cy;
|
dest[1][0] = -sz;
|
||||||
dest[0][3] = 0.0f;
|
dest[1][1] = cx * cz;
|
||||||
dest[1][3] = 0.0f;
|
dest[1][2] = cz * sx;
|
||||||
dest[2][3] = 0.0f;
|
dest[2][0] = cz * sy;
|
||||||
dest[3][0] = 0.0f;
|
dest[2][1] = -cysx + cxsy * sz;
|
||||||
dest[3][1] = 0.0f;
|
dest[2][2] = cxcy + sxsy * sz;
|
||||||
dest[3][2] = 0.0f;
|
dest[0][3] = 0.0f;
|
||||||
dest[3][3] = 1.0f;
|
dest[1][3] = 0.0f;
|
||||||
|
dest[2][3] = 0.0f;
|
||||||
|
dest[3][0] = 0.0f;
|
||||||
|
dest[3][1] = 0.0f;
|
||||||
|
dest[3][2] = 0.0f;
|
||||||
|
dest[3][3] = 1.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief build rotation matrix from euler angles
|
* @brief build rotation matrix from euler angles
|
||||||
*
|
*
|
||||||
* @param[in] angles angles as vector [Ex, Ez, Ey]
|
* @param[in] angles angles as vector [Xangle, Yangle, Zangle]
|
||||||
* @param[out] dest rotation matrix
|
* @param[out] dest rotation matrix
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_euler_xzy(vec3 angles,
|
glm_euler_yxz(const vec3 angles, mat4 dest) {
|
||||||
mat4 dest) {
|
|
||||||
float cx, cy, cz,
|
float cx, cy, cz,
|
||||||
sx, sy, sz;
|
sx, sy, sz, cycz, sysz, czsy, cysz;
|
||||||
|
|
||||||
sx = sinf(angles[0]); cx = cosf(angles[0]);
|
sx = sinf(angles[0]); cx = cosf(angles[0]);
|
||||||
sy = sinf(angles[1]); cy = cosf(angles[1]);
|
sy = sinf(angles[1]); cy = cosf(angles[1]);
|
||||||
sz = sinf(angles[2]); cz = cosf(angles[2]);
|
sz = sinf(angles[2]); cz = cosf(angles[2]);
|
||||||
|
|
||||||
dest[0][0] = cy * cz;
|
cycz = cy * cz;
|
||||||
dest[0][1] = sz;
|
sysz = sy * sz;
|
||||||
dest[0][2] =-cz * sy;
|
czsy = cz * sy;
|
||||||
dest[1][0] = sx * sy - cx * cy * sz;
|
cysz = cy * sz;
|
||||||
dest[1][1] = cx * cz;
|
|
||||||
dest[1][2] = cy * sx + cx * sy * sz;
|
dest[0][0] = cycz + sx * sysz;
|
||||||
dest[2][0] = cx * sy + cy * sx * sz;
|
dest[0][1] = cx * sz;
|
||||||
dest[2][1] =-cz * sx;
|
dest[0][2] = -czsy + cysz * sx;
|
||||||
dest[2][2] = cx * cy - sx * sy * sz;
|
dest[1][0] = -cysz + czsy * sx;
|
||||||
dest[0][3] = 0.0f;
|
dest[1][1] = cx * cz;
|
||||||
dest[1][3] = 0.0f;
|
dest[1][2] = cycz * sx + sysz;
|
||||||
dest[2][3] = 0.0f;
|
dest[2][0] = cx * sy;
|
||||||
dest[3][0] = 0.0f;
|
dest[2][1] = -sx;
|
||||||
dest[3][1] = 0.0f;
|
dest[2][2] = cx * cy;
|
||||||
dest[3][2] = 0.0f;
|
dest[0][3] = 0.0f;
|
||||||
dest[3][3] = 1.0f;
|
dest[1][3] = 0.0f;
|
||||||
|
dest[2][3] = 0.0f;
|
||||||
|
dest[3][0] = 0.0f;
|
||||||
|
dest[3][1] = 0.0f;
|
||||||
|
dest[3][2] = 0.0f;
|
||||||
|
dest[3][3] = 1.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief build rotation matrix from euler angles
|
* @brief build rotation matrix from euler angles
|
||||||
*
|
*
|
||||||
* @param[in] angles angles as vector [Ey, Ez, Ex]
|
* @param[in] angles angles as vector [Xangle, Yangle, Zangle]
|
||||||
* @param[out] dest rotation matrix
|
* @param[out] dest rotation matrix
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_euler_yzx(vec3 angles,
|
glm_euler_yzx(const vec3 angles, mat4 dest) {
|
||||||
mat4 dest) {
|
|
||||||
float cx, cy, cz,
|
float cx, cy, cz,
|
||||||
sx, sy, sz;
|
sx, sy, sz, sxsy, cxcy, cysx, cxsy;
|
||||||
|
|
||||||
sx = sinf(angles[0]); cx = cosf(angles[0]);
|
sx = sinf(angles[0]); cx = cosf(angles[0]);
|
||||||
sy = sinf(angles[1]); cy = cosf(angles[1]);
|
sy = sinf(angles[1]); cy = cosf(angles[1]);
|
||||||
sz = sinf(angles[2]); cz = cosf(angles[2]);
|
sz = sinf(angles[2]); cz = cosf(angles[2]);
|
||||||
|
|
||||||
dest[0][0] = cy * cz;
|
sxsy = sx * sy;
|
||||||
dest[0][1] = sx * sy + cx * cy * sz;
|
cxcy = cx * cy;
|
||||||
dest[0][2] =-cx * sy + cy * sx * sz;
|
cysx = cy * sx;
|
||||||
dest[1][0] =-sz;
|
cxsy = cx * sy;
|
||||||
dest[1][1] = cx * cz;
|
|
||||||
dest[1][2] = cz * sx;
|
dest[0][0] = cy * cz;
|
||||||
dest[2][0] = cz * sy;
|
dest[0][1] = sz;
|
||||||
dest[2][1] =-cy * sx + cx * sy * sz;
|
dest[0][2] = -cz * sy;
|
||||||
dest[2][2] = cx * cy + sx * sy * sz;
|
dest[1][0] = sxsy - cxcy * sz;
|
||||||
dest[0][3] = 0.0f;
|
dest[1][1] = cx * cz;
|
||||||
dest[1][3] = 0.0f;
|
dest[1][2] = cysx + cxsy * sz;
|
||||||
dest[2][3] = 0.0f;
|
dest[2][0] = cxsy + cysx * sz;
|
||||||
dest[3][0] = 0.0f;
|
dest[2][1] = -cz * sx;
|
||||||
dest[3][1] = 0.0f;
|
dest[2][2] = cxcy - sxsy * sz;
|
||||||
dest[3][2] = 0.0f;
|
dest[0][3] = 0.0f;
|
||||||
dest[3][3] = 1.0f;
|
dest[1][3] = 0.0f;
|
||||||
|
dest[2][3] = 0.0f;
|
||||||
|
dest[3][0] = 0.0f;
|
||||||
|
dest[3][1] = 0.0f;
|
||||||
|
dest[3][2] = 0.0f;
|
||||||
|
dest[3][3] = 1.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief build rotation matrix from euler angles
|
* @brief build rotation matrix from euler angles
|
||||||
*
|
*
|
||||||
* @param[in] angles angles as vector [Ey, Ex, Ez]
|
* @param[in] angles angles as vector [Xangle, Yangle, Zangle]
|
||||||
* @param[out] dest rotation matrix
|
* @param[out] dest rotation matrix
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_euler_yxz(vec3 angles,
|
glm_euler_zxy(const vec3 angles, mat4 dest) {
|
||||||
mat4 dest) {
|
|
||||||
float cx, cy, cz,
|
float cx, cy, cz,
|
||||||
sx, sy, sz;
|
sx, sy, sz, cycz, sxsy, cysz;
|
||||||
|
|
||||||
sx = sinf(angles[0]); cx = cosf(angles[0]);
|
sx = sinf(angles[0]); cx = cosf(angles[0]);
|
||||||
sy = sinf(angles[1]); cy = cosf(angles[1]);
|
sy = sinf(angles[1]); cy = cosf(angles[1]);
|
||||||
sz = sinf(angles[2]); cz = cosf(angles[2]);
|
sz = sinf(angles[2]); cz = cosf(angles[2]);
|
||||||
|
|
||||||
dest[0][0] = cy * cz - sx * sy * sz;
|
cycz = cy * cz;
|
||||||
dest[0][1] = cz * sx * sy + cy * sz;
|
sxsy = sx * sy;
|
||||||
dest[0][2] =-cx * sy;
|
cysz = cy * sz;
|
||||||
dest[1][0] =-cx * sz;
|
|
||||||
dest[1][1] = cx * cz;
|
dest[0][0] = cycz - sxsy * sz;
|
||||||
dest[1][2] = sx;
|
dest[0][1] = cz * sxsy + cysz;
|
||||||
dest[2][0] = cz * sy + cy * sx * sz;
|
dest[0][2] = -cx * sy;
|
||||||
dest[2][1] =-cy * cz * sx + sy * sz;
|
dest[1][0] = -cx * sz;
|
||||||
dest[2][2] = cx * cy;
|
dest[1][1] = cx * cz;
|
||||||
dest[0][3] = 0.0f;
|
dest[1][2] = sx;
|
||||||
dest[1][3] = 0.0f;
|
dest[2][0] = cz * sy + cysz * sx;
|
||||||
dest[2][3] = 0.0f;
|
dest[2][1] = -cycz * sx + sy * sz;
|
||||||
dest[3][0] = 0.0f;
|
dest[2][2] = cx * cy;
|
||||||
dest[3][1] = 0.0f;
|
dest[0][3] = 0.0f;
|
||||||
dest[3][2] = 0.0f;
|
dest[1][3] = 0.0f;
|
||||||
dest[3][3] = 1.0f;
|
dest[2][3] = 0.0f;
|
||||||
|
dest[3][0] = 0.0f;
|
||||||
|
dest[3][1] = 0.0f;
|
||||||
|
dest[3][2] = 0.0f;
|
||||||
|
dest[3][3] = 1.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief build rotation matrix from euler angles
|
* @brief build rotation matrix from euler angles
|
||||||
*
|
*
|
||||||
* @param[in] angles angles as vector (ord parameter spceifies angles order)
|
* @param[in] angles angles as vector [Xangle, Yangle, Zangle]
|
||||||
|
* @param[out] dest rotation matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_euler_zyx(const vec3 angles, mat4 dest) {
|
||||||
|
float cx, cy, cz,
|
||||||
|
sx, sy, sz, czsx, cxcz, sysz;
|
||||||
|
|
||||||
|
sx = sinf(angles[0]); cx = cosf(angles[0]);
|
||||||
|
sy = sinf(angles[1]); cy = cosf(angles[1]);
|
||||||
|
sz = sinf(angles[2]); cz = cosf(angles[2]);
|
||||||
|
|
||||||
|
czsx = cz * sx;
|
||||||
|
cxcz = cx * cz;
|
||||||
|
sysz = sy * sz;
|
||||||
|
|
||||||
|
dest[0][0] = cy * cz;
|
||||||
|
dest[0][1] = cy * sz;
|
||||||
|
dest[0][2] = -sy;
|
||||||
|
dest[1][0] = czsx * sy - cx * sz;
|
||||||
|
dest[1][1] = cxcz + sx * sysz;
|
||||||
|
dest[1][2] = cy * sx;
|
||||||
|
dest[2][0] = cxcz * sy + sx * sz;
|
||||||
|
dest[2][1] = -czsx + cx * sysz;
|
||||||
|
dest[2][2] = cx * cy;
|
||||||
|
dest[0][3] = 0.0f;
|
||||||
|
dest[1][3] = 0.0f;
|
||||||
|
dest[2][3] = 0.0f;
|
||||||
|
dest[3][0] = 0.0f;
|
||||||
|
dest[3][1] = 0.0f;
|
||||||
|
dest[3][2] = 0.0f;
|
||||||
|
dest[3][3] = 1.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief build rotation matrix from euler angles
|
||||||
|
*
|
||||||
|
* @param[in] angles angles as vector [Xangle, Yangle, Zangle]
|
||||||
* @param[in] ord euler order
|
* @param[in] ord euler order
|
||||||
* @param[out] dest rotation matrix
|
* @param[out] dest rotation matrix
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_euler_by_order(vec3 angles, glm_euler_sq ord, mat4 dest) {
|
glm_euler_by_order(const vec3 angles, glm_euler_sq ord, mat4 dest) {
|
||||||
float cx, cy, cz,
|
float cx, cy, cz,
|
||||||
sx, sy, sz;
|
sx, sy, sz;
|
||||||
|
|
||||||
@@ -332,71 +371,71 @@ glm_euler_by_order(vec3 angles, glm_euler_sq ord, mat4 dest) {
|
|||||||
sysz = sy * sz;
|
sysz = sy * sz;
|
||||||
|
|
||||||
switch (ord) {
|
switch (ord) {
|
||||||
case GLM_EULER_XYZ:
|
|
||||||
dest[0][0] = cycz;
|
|
||||||
dest[0][1] = cysz;
|
|
||||||
dest[0][2] =-sy;
|
|
||||||
dest[1][0] = czsx * sy - cxsz;
|
|
||||||
dest[1][1] = cxcz + sx * sysz;
|
|
||||||
dest[1][2] = cysx;
|
|
||||||
dest[2][0] = cx * czsy + sx * sz;
|
|
||||||
dest[2][1] =-czsx + cx * sysz;
|
|
||||||
dest[2][2] = cxcy;
|
|
||||||
break;
|
|
||||||
case GLM_EULER_XZY:
|
case GLM_EULER_XZY:
|
||||||
dest[0][0] = cycz;
|
dest[0][0] = cycz;
|
||||||
dest[0][1] = sz;
|
dest[0][1] = sx * sy + cx * cysz;
|
||||||
dest[0][2] =-czsy;
|
dest[0][2] = -cx * sy + cysx * sz;
|
||||||
dest[1][0] = sx * sy - cx * cysz;
|
dest[1][0] = -sz;
|
||||||
dest[1][1] = cxcz;
|
dest[1][1] = cxcz;
|
||||||
dest[1][2] = cysx + cx * sysz;
|
dest[1][2] = czsx;
|
||||||
dest[2][0] = cx * sy + cysx * sz;
|
dest[2][0] = czsy;
|
||||||
dest[2][1] =-czsx;
|
dest[2][1] = -cysx + cx * sysz;
|
||||||
dest[2][2] = cxcy - sx * sysz;
|
dest[2][2] = cxcy + sx * sysz;
|
||||||
break;
|
break;
|
||||||
case GLM_EULER_ZXY:
|
case GLM_EULER_XYZ:
|
||||||
dest[0][0] = cycz + sx * sysz;
|
dest[0][0] = cycz;
|
||||||
dest[0][1] = cxsz;
|
dest[0][1] = czsx * sy + cxsz;
|
||||||
dest[0][2] =-czsy + cysx * sz;
|
dest[0][2] = -cx * czsy + sx * sz;
|
||||||
dest[1][0] = czsx * sy - cysz;
|
dest[1][0] = -cysz;
|
||||||
dest[1][1] = cxcz;
|
dest[1][1] = cxcz - sx * sysz;
|
||||||
dest[1][2] = cycz * sx + sysz;
|
dest[1][2] = czsx + cx * sysz;
|
||||||
dest[2][0] = cx * sy;
|
dest[2][0] = sy;
|
||||||
dest[2][1] =-sx;
|
dest[2][1] = -cysx;
|
||||||
dest[2][2] = cxcy;
|
dest[2][2] = cxcy;
|
||||||
break;
|
|
||||||
case GLM_EULER_ZYX:
|
|
||||||
dest[0][0] = cycz;
|
|
||||||
dest[0][1] = czsx * sy + cxsz;
|
|
||||||
dest[0][2] =-cx * czsy + sx * sz;
|
|
||||||
dest[1][0] =-cysz;
|
|
||||||
dest[1][1] = cxcz - sx * sysz;
|
|
||||||
dest[1][2] = czsx + cx * sysz;
|
|
||||||
dest[2][0] = sy;
|
|
||||||
dest[2][1] =-cysx;
|
|
||||||
dest[2][2] = cxcy;
|
|
||||||
break;
|
break;
|
||||||
case GLM_EULER_YXZ:
|
case GLM_EULER_YXZ:
|
||||||
dest[0][0] = cycz - sx * sysz;
|
dest[0][0] = cycz + sx * sysz;
|
||||||
dest[0][1] = czsx * sy + cysz;
|
dest[0][1] = cxsz;
|
||||||
dest[0][2] =-cx * sy;
|
dest[0][2] = -czsy + cysx * sz;
|
||||||
dest[1][0] =-cxsz;
|
dest[1][0] = czsx * sy - cysz;
|
||||||
dest[1][1] = cxcz;
|
dest[1][1] = cxcz;
|
||||||
dest[1][2] = sx;
|
dest[1][2] = cycz * sx + sysz;
|
||||||
dest[2][0] = czsy + cysx * sz;
|
dest[2][0] = cx * sy;
|
||||||
dest[2][1] =-cycz * sx + sysz;
|
dest[2][1] = -sx;
|
||||||
dest[2][2] = cxcy;
|
dest[2][2] = cxcy;
|
||||||
break;
|
break;
|
||||||
case GLM_EULER_YZX:
|
case GLM_EULER_YZX:
|
||||||
dest[0][0] = cycz;
|
dest[0][0] = cycz;
|
||||||
dest[0][1] = sx * sy + cx * cysz;
|
dest[0][1] = sz;
|
||||||
dest[0][2] =-cx * sy + cysx * sz;
|
dest[0][2] = -czsy;
|
||||||
dest[1][0] =-sz;
|
dest[1][0] = sx * sy - cx * cysz;
|
||||||
dest[1][1] = cxcz;
|
dest[1][1] = cxcz;
|
||||||
dest[1][2] = czsx;
|
dest[1][2] = cysx + cx * sysz;
|
||||||
dest[2][0] = czsy;
|
dest[2][0] = cx * sy + cysx * sz;
|
||||||
dest[2][1] =-cysx + cx * sysz;
|
dest[2][1] = -czsx;
|
||||||
dest[2][2] = cxcy + sx * sysz;
|
dest[2][2] = cxcy - sx * sysz;
|
||||||
|
break;
|
||||||
|
case GLM_EULER_ZXY:
|
||||||
|
dest[0][0] = cycz - sx * sysz;
|
||||||
|
dest[0][1] = czsx * sy + cysz;
|
||||||
|
dest[0][2] = -cx * sy;
|
||||||
|
dest[1][0] = -cxsz;
|
||||||
|
dest[1][1] = cxcz;
|
||||||
|
dest[1][2] = sx;
|
||||||
|
dest[2][0] = czsy + cysx * sz;
|
||||||
|
dest[2][1] = -cycz * sx + sysz;
|
||||||
|
dest[2][2] = cxcy;
|
||||||
|
break;
|
||||||
|
case GLM_EULER_ZYX:
|
||||||
|
dest[0][0] = cycz;
|
||||||
|
dest[0][1] = cysz;
|
||||||
|
dest[0][2] = -sy;
|
||||||
|
dest[1][0] = czsx * sy - cxsz;
|
||||||
|
dest[1][1] = cxcz + sx * sysz;
|
||||||
|
dest[1][2] = cysx;
|
||||||
|
dest[2][0] = cx * czsy + sx * sz;
|
||||||
|
dest[2][1] = -czsx + cx * sysz;
|
||||||
|
dest[2][2] = cxcy;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -10,6 +10,9 @@
|
|||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "plane.h"
|
#include "plane.h"
|
||||||
|
#include "vec3.h"
|
||||||
|
#include "vec4.h"
|
||||||
|
#include "mat4.h"
|
||||||
|
|
||||||
#define GLM_LBN 0 /* left bottom near */
|
#define GLM_LBN 0 /* left bottom near */
|
||||||
#define GLM_LTN 1 /* left top near */
|
#define GLM_LTN 1 /* left top near */
|
||||||
@@ -66,7 +69,7 @@
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_frustum_planes(mat4 m, vec4 dest[6]) {
|
glm_frustum_planes(const mat4 m, vec4 dest[6]) {
|
||||||
mat4 t;
|
mat4 t;
|
||||||
|
|
||||||
glm_mat4_transpose_to(m, t);
|
glm_mat4_transpose_to(m, t);
|
||||||
@@ -103,7 +106,7 @@ glm_frustum_planes(mat4 m, vec4 dest[6]) {
|
|||||||
*
|
*
|
||||||
* Find center coordinates:
|
* Find center coordinates:
|
||||||
* for (j = 0; j < 4; j++) {
|
* for (j = 0; j < 4; j++) {
|
||||||
* glm_vec_center(corners[i], corners[i + 4], centerCorners[i]);
|
* glm_vec3_center(corners[i], corners[i + 4], centerCorners[i]);
|
||||||
* }
|
* }
|
||||||
*
|
*
|
||||||
* @param[in] invMat matrix (see brief)
|
* @param[in] invMat matrix (see brief)
|
||||||
@@ -111,7 +114,7 @@ glm_frustum_planes(mat4 m, vec4 dest[6]) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_frustum_corners(mat4 invMat, vec4 dest[8]) {
|
glm_frustum_corners(const mat4 invMat, vec4 dest[8]) {
|
||||||
vec4 c[8];
|
vec4 c[8];
|
||||||
|
|
||||||
/* indexOf(nearCoord) = indexOf(farCoord) + 4 */
|
/* indexOf(nearCoord) = indexOf(farCoord) + 4 */
|
||||||
@@ -154,7 +157,7 @@ glm_frustum_corners(mat4 invMat, vec4 dest[8]) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_frustum_center(vec4 corners[8], vec4 dest) {
|
glm_frustum_center(const vec4 corners[8], vec4 dest) {
|
||||||
vec4 center;
|
vec4 center;
|
||||||
|
|
||||||
glm_vec4_copy(corners[0], center);
|
glm_vec4_copy(corners[0], center);
|
||||||
@@ -179,13 +182,13 @@ glm_frustum_center(vec4 corners[8], vec4 dest) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_frustum_box(vec4 corners[8], mat4 m, vec3 box[2]) {
|
glm_frustum_box(const vec4 corners[8], const mat4 m, vec3 box[2]) {
|
||||||
vec4 v;
|
vec4 v;
|
||||||
vec3 min, max;
|
vec3 min, max;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
glm_vec_broadcast(FLT_MAX, min);
|
glm_vec3_broadcast(FLT_MAX, min);
|
||||||
glm_vec_broadcast(-FLT_MAX, max);
|
glm_vec3_broadcast(-FLT_MAX, max);
|
||||||
|
|
||||||
for (i = 0; i < 8; i++) {
|
for (i = 0; i < 8; i++) {
|
||||||
glm_mat4_mulv(m, corners[i], v);
|
glm_mat4_mulv(m, corners[i], v);
|
||||||
@@ -199,8 +202,8 @@ glm_frustum_box(vec4 corners[8], mat4 m, vec3 box[2]) {
|
|||||||
max[2] = glm_max(max[2], v[2]);
|
max[2] = glm_max(max[2], v[2]);
|
||||||
}
|
}
|
||||||
|
|
||||||
glm_vec_copy(min, box[0]);
|
glm_vec3_copy(min, box[0]);
|
||||||
glm_vec_copy(max, box[1]);
|
glm_vec3_copy(max, box[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -217,15 +220,15 @@ glm_frustum_box(vec4 corners[8], mat4 m, vec3 box[2]) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_frustum_corners_at(vec4 corners[8],
|
glm_frustum_corners_at(const vec4 corners[8],
|
||||||
float splitDist,
|
float splitDist,
|
||||||
float farDist,
|
float farDist,
|
||||||
vec4 planeCorners[4]) {
|
vec4 planeCorners[4]) {
|
||||||
vec4 corner;
|
vec4 corner;
|
||||||
float dist, sc;
|
float dist, sc;
|
||||||
|
|
||||||
/* because distance and scale is same for all */
|
/* because distance and scale is same for all */
|
||||||
dist = glm_vec_distance(corners[GLM_RTF], corners[GLM_RTN]);
|
dist = glm_vec3_distance(corners[GLM_RTF], corners[GLM_RTN]);
|
||||||
sc = dist * (splitDist / farDist);
|
sc = dist * (splitDist / farDist);
|
||||||
|
|
||||||
/* left bottom */
|
/* left bottom */
|
||||||
|
|||||||
@@ -25,8 +25,8 @@
|
|||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat4_print(mat4 matrix,
|
glm_mat4_print(const mat4 matrix,
|
||||||
FILE * __restrict ostream) {
|
FILE * const __restrict ostream) {
|
||||||
int i;
|
int i;
|
||||||
int j;
|
int j;
|
||||||
|
|
||||||
@@ -55,8 +55,8 @@ glm_mat4_print(mat4 matrix,
|
|||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat3_print(mat3 matrix,
|
glm_mat3_print(const mat3 matrix,
|
||||||
FILE * __restrict ostream) {
|
FILE * const __restrict ostream) {
|
||||||
int i;
|
int i;
|
||||||
int j;
|
int j;
|
||||||
|
|
||||||
@@ -85,8 +85,8 @@ glm_mat3_print(mat3 matrix,
|
|||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec4_print(vec4 vec,
|
glm_vec4_print(const vec4 vec,
|
||||||
FILE * __restrict ostream) {
|
FILE * const __restrict ostream) {
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
#define m 4
|
#define m 4
|
||||||
@@ -107,8 +107,8 @@ glm_vec4_print(vec4 vec,
|
|||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec3_print(vec3 vec,
|
glm_vec3_print(const vec3 vec,
|
||||||
FILE * __restrict ostream) {
|
FILE * const __restrict ostream) {
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
#define m 3
|
#define m 3
|
||||||
@@ -129,8 +129,8 @@ glm_vec3_print(vec3 vec,
|
|||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_ivec3_print(ivec3 vec,
|
glm_ivec3_print(const ivec3 vec,
|
||||||
FILE * __restrict ostream) {
|
FILE * const __restrict ostream) {
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
#define m 3
|
#define m 3
|
||||||
@@ -151,8 +151,8 @@ glm_ivec3_print(ivec3 vec,
|
|||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_versor_print(versor vec,
|
glm_versor_print(const versor vec,
|
||||||
FILE * __restrict ostream) {
|
FILE * const __restrict ostream) {
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
#define m 4
|
#define m 4
|
||||||
@@ -171,4 +171,33 @@ glm_versor_print(versor vec,
|
|||||||
#undef m
|
#undef m
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_aabb_print(const vec3 bbox[2],
|
||||||
|
const char * __restrict tag,
|
||||||
|
FILE * const __restrict ostream) {
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
#define m 3
|
||||||
|
|
||||||
|
fprintf(ostream, "AABB (%s):\n", tag ? tag: "float");
|
||||||
|
|
||||||
|
for (i = 0; i < 2; i++) {
|
||||||
|
fprintf(ostream, "\t|");
|
||||||
|
|
||||||
|
for (j = 0; j < m; j++) {
|
||||||
|
fprintf(ostream, "%0.4f", bbox[i][j]);
|
||||||
|
|
||||||
|
if (j != m - 1)
|
||||||
|
fprintf(ostream, "\t");
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(ostream, "|\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(ostream, "\n");
|
||||||
|
|
||||||
|
#undef m
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* cglm_io_h */
|
#endif /* cglm_io_h */
|
||||||
|
|||||||
@@ -16,21 +16,27 @@
|
|||||||
Functions:
|
Functions:
|
||||||
CGLM_INLINE void glm_mat3_copy(mat3 mat, mat3 dest);
|
CGLM_INLINE void glm_mat3_copy(mat3 mat, mat3 dest);
|
||||||
CGLM_INLINE void glm_mat3_identity(mat3 mat);
|
CGLM_INLINE void glm_mat3_identity(mat3 mat);
|
||||||
|
CGLM_INLINE void glm_mat3_identity_array(mat3 * restrict mat, size_t count);
|
||||||
|
CGLM_INLINE void glm_mat3_zero(mat3 mat);
|
||||||
CGLM_INLINE void glm_mat3_mul(mat3 m1, mat3 m2, mat3 dest);
|
CGLM_INLINE void glm_mat3_mul(mat3 m1, mat3 m2, mat3 dest);
|
||||||
CGLM_INLINE void glm_mat3_transpose_to(mat3 m, mat3 dest);
|
CGLM_INLINE void glm_mat3_transpose_to(mat3 m, mat3 dest);
|
||||||
CGLM_INLINE void glm_mat3_transpose(mat3 m);
|
CGLM_INLINE void glm_mat3_transpose(mat3 m);
|
||||||
CGLM_INLINE void glm_mat3_mulv(mat3 m, vec3 v, vec3 dest);
|
CGLM_INLINE void glm_mat3_mulv(mat3 m, vec3 v, vec3 dest);
|
||||||
|
CGLM_INLINE float glm_mat3_trace(mat3 m);
|
||||||
|
CGLM_INLINE void glm_mat3_quat(mat3 m, versor dest);
|
||||||
CGLM_INLINE void glm_mat3_scale(mat3 m, float s);
|
CGLM_INLINE void glm_mat3_scale(mat3 m, float s);
|
||||||
CGLM_INLINE float glm_mat3_det(mat3 mat);
|
CGLM_INLINE float glm_mat3_det(mat3 mat);
|
||||||
CGLM_INLINE void glm_mat3_inv(mat3 mat, mat3 dest);
|
CGLM_INLINE void glm_mat3_inv(mat3 mat, mat3 dest);
|
||||||
CGLM_INLINE void glm_mat3_swap_col(mat3 mat, int col1, int col2);
|
CGLM_INLINE void glm_mat3_swap_col(mat3 mat, int col1, int col2);
|
||||||
CGLM_INLINE void glm_mat3_swap_row(mat3 mat, int row1, int row2);
|
CGLM_INLINE void glm_mat3_swap_row(mat3 mat, int row1, int row2);
|
||||||
|
CGLM_INLINE float glm_mat3_rmc(vec3 r, mat3 m, vec3 c);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef cglm_mat3_h
|
#ifndef cglm_mat3_h
|
||||||
#define cglm_mat3_h
|
#define cglm_mat3_h
|
||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
#include "vec3.h"
|
||||||
|
|
||||||
#ifdef CGLM_SSE_FP
|
#ifdef CGLM_SSE_FP
|
||||||
# include "simd/sse2/mat3.h"
|
# include "simd/sse2/mat3.h"
|
||||||
@@ -59,8 +65,18 @@
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat3_copy(mat3 mat, mat3 dest) {
|
glm_mat3_copy(const mat3 mat, mat3 dest) {
|
||||||
glm__memcpy(float, dest, mat, sizeof(mat3));
|
dest[0][0] = mat[0][0];
|
||||||
|
dest[0][1] = mat[0][1];
|
||||||
|
dest[0][2] = mat[0][2];
|
||||||
|
|
||||||
|
dest[1][0] = mat[1][0];
|
||||||
|
dest[1][1] = mat[1][1];
|
||||||
|
dest[1][2] = mat[1][2];
|
||||||
|
|
||||||
|
dest[2][0] = mat[2][0];
|
||||||
|
dest[2][1] = mat[2][1];
|
||||||
|
dest[2][2] = mat[2][2];
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -80,7 +96,38 @@ glm_mat3_copy(mat3 mat, mat3 dest) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat3_identity(mat3 mat) {
|
glm_mat3_identity(mat3 mat) {
|
||||||
mat3 t = GLM_MAT3_IDENTITY_INIT;
|
CGLM_ALIGN_MAT mat3 t = GLM_MAT3_IDENTITY_INIT;
|
||||||
|
glm_mat3_copy(t, mat);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief make given matrix array's each element identity matrix
|
||||||
|
*
|
||||||
|
* @param[in, out] mat matrix array (must be aligned (16/32)
|
||||||
|
* if alignment is not disabled)
|
||||||
|
*
|
||||||
|
* @param[in] count count of matrices
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat3_identity_array(mat3 * const __restrict mat, size_t count) {
|
||||||
|
CGLM_ALIGN_MAT mat3 t = GLM_MAT3_IDENTITY_INIT;
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
for (i = 0; i < count; i++) {
|
||||||
|
glm_mat3_copy(t, mat[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief make given matrix zero.
|
||||||
|
*
|
||||||
|
* @param[in, out] mat matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat3_zero(mat3 mat) {
|
||||||
|
CGLM_ALIGN_MAT mat3 t = GLM_MAT3_ZERO_INIT;
|
||||||
glm_mat3_copy(t, mat);
|
glm_mat3_copy(t, mat);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -100,7 +147,7 @@ glm_mat3_identity(mat3 mat) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat3_mul(mat3 m1, mat3 m2, mat3 dest) {
|
glm_mat3_mul(const mat3 m1, const mat3 m2, mat3 dest) {
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
glm_mat3_mul_sse2(m1, m2, dest);
|
glm_mat3_mul_sse2(m1, m2, dest);
|
||||||
#else
|
#else
|
||||||
@@ -134,7 +181,7 @@ glm_mat3_mul(mat3 m1, mat3 m2, mat3 dest) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat3_transpose_to(mat3 m, mat3 dest) {
|
glm_mat3_transpose_to(const mat3 m, mat3 dest) {
|
||||||
dest[0][0] = m[0][0];
|
dest[0][0] = m[0][0];
|
||||||
dest[0][1] = m[1][0];
|
dest[0][1] = m[1][0];
|
||||||
dest[0][2] = m[2][0];
|
dest[0][2] = m[2][0];
|
||||||
@@ -154,7 +201,7 @@ glm_mat3_transpose_to(mat3 m, mat3 dest) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat3_transpose(mat3 m) {
|
glm_mat3_transpose(mat3 m) {
|
||||||
mat3 tmp;
|
CGLM_ALIGN_MAT mat3 tmp;
|
||||||
|
|
||||||
tmp[0][1] = m[1][0];
|
tmp[0][1] = m[1][0];
|
||||||
tmp[0][2] = m[2][0];
|
tmp[0][2] = m[2][0];
|
||||||
@@ -180,12 +227,74 @@ glm_mat3_transpose(mat3 m) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat3_mulv(mat3 m, vec3 v, vec3 dest) {
|
glm_mat3_mulv(const mat3 m, const vec3 v, vec3 dest) {
|
||||||
dest[0] = m[0][0] * v[0] + m[1][0] * v[1] + m[2][0] * v[2];
|
dest[0] = m[0][0] * v[0] + m[1][0] * v[1] + m[2][0] * v[2];
|
||||||
dest[1] = m[0][1] * v[0] + m[1][1] * v[1] + m[2][1] * v[2];
|
dest[1] = m[0][1] * v[0] + m[1][1] * v[1] + m[2][1] * v[2];
|
||||||
dest[2] = m[0][2] * v[0] + m[1][2] * v[1] + m[2][2] * v[2];
|
dest[2] = m[0][2] * v[0] + m[1][2] * v[1] + m[2][2] * v[2];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief trace of matrix
|
||||||
|
*
|
||||||
|
* sum of the elements on the main diagonal from upper left to the lower right
|
||||||
|
*
|
||||||
|
* @param[in] m matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_mat3_trace(const mat3 m) {
|
||||||
|
return m[0][0] + m[1][1] + m[2][2];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief convert mat3 to quaternion
|
||||||
|
*
|
||||||
|
* @param[in] m rotation matrix
|
||||||
|
* @param[out] dest destination quaternion
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat3_quat(const mat3 m, versor dest) {
|
||||||
|
float trace, r, rinv;
|
||||||
|
|
||||||
|
/* it seems using like m12 instead of m[1][2] causes extra instructions */
|
||||||
|
|
||||||
|
trace = m[0][0] + m[1][1] + m[2][2];
|
||||||
|
if (trace >= 0.0f) {
|
||||||
|
r = sqrtf(1.0f + trace);
|
||||||
|
rinv = 0.5f / r;
|
||||||
|
|
||||||
|
dest[0] = rinv * (m[1][2] - m[2][1]);
|
||||||
|
dest[1] = rinv * (m[2][0] - m[0][2]);
|
||||||
|
dest[2] = rinv * (m[0][1] - m[1][0]);
|
||||||
|
dest[3] = r * 0.5f;
|
||||||
|
} else if (m[0][0] >= m[1][1] && m[0][0] >= m[2][2]) {
|
||||||
|
r = sqrtf(1.0f - m[1][1] - m[2][2] + m[0][0]);
|
||||||
|
rinv = 0.5f / r;
|
||||||
|
|
||||||
|
dest[0] = r * 0.5f;
|
||||||
|
dest[1] = rinv * (m[0][1] + m[1][0]);
|
||||||
|
dest[2] = rinv * (m[0][2] + m[2][0]);
|
||||||
|
dest[3] = rinv * (m[1][2] - m[2][1]);
|
||||||
|
} else if (m[1][1] >= m[2][2]) {
|
||||||
|
r = sqrtf(1.0f - m[0][0] - m[2][2] + m[1][1]);
|
||||||
|
rinv = 0.5f / r;
|
||||||
|
|
||||||
|
dest[0] = rinv * (m[0][1] + m[1][0]);
|
||||||
|
dest[1] = r * 0.5f;
|
||||||
|
dest[2] = rinv * (m[1][2] + m[2][1]);
|
||||||
|
dest[3] = rinv * (m[2][0] - m[0][2]);
|
||||||
|
} else {
|
||||||
|
r = sqrtf(1.0f - m[0][0] - m[1][1] + m[2][2]);
|
||||||
|
rinv = 0.5f / r;
|
||||||
|
|
||||||
|
dest[0] = rinv * (m[0][2] + m[2][0]);
|
||||||
|
dest[1] = rinv * (m[1][2] + m[2][1]);
|
||||||
|
dest[2] = r * 0.5f;
|
||||||
|
dest[3] = rinv * (m[0][1] - m[1][0]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief scale (multiply with scalar) matrix
|
* @brief scale (multiply with scalar) matrix
|
||||||
*
|
*
|
||||||
@@ -211,7 +320,7 @@ glm_mat3_scale(mat3 m, float s) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
float
|
float
|
||||||
glm_mat3_det(mat3 mat) {
|
glm_mat3_det(const mat3 mat) {
|
||||||
float a = mat[0][0], b = mat[0][1], c = mat[0][2],
|
float a = mat[0][0], b = mat[0][1], c = mat[0][2],
|
||||||
d = mat[1][0], e = mat[1][1], f = mat[1][2],
|
d = mat[1][0], e = mat[1][1], f = mat[1][2],
|
||||||
g = mat[2][0], h = mat[2][1], i = mat[2][2];
|
g = mat[2][0], h = mat[2][1], i = mat[2][2];
|
||||||
@@ -227,7 +336,7 @@ glm_mat3_det(mat3 mat) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat3_inv(mat3 mat, mat3 dest) {
|
glm_mat3_inv(const mat3 mat, mat3 dest) {
|
||||||
float det;
|
float det;
|
||||||
float a = mat[0][0], b = mat[0][1], c = mat[0][2],
|
float a = mat[0][0], b = mat[0][1], c = mat[0][2],
|
||||||
d = mat[1][0], e = mat[1][1], f = mat[1][2],
|
d = mat[1][0], e = mat[1][1], f = mat[1][2],
|
||||||
@@ -259,9 +368,9 @@ CGLM_INLINE
|
|||||||
void
|
void
|
||||||
glm_mat3_swap_col(mat3 mat, int col1, int col2) {
|
glm_mat3_swap_col(mat3 mat, int col1, int col2) {
|
||||||
vec3 tmp;
|
vec3 tmp;
|
||||||
glm_vec_copy(mat[col1], tmp);
|
glm_vec3_copy(mat[col1], tmp);
|
||||||
glm_vec_copy(mat[col2], mat[col1]);
|
glm_vec3_copy(mat[col2], mat[col1]);
|
||||||
glm_vec_copy(tmp, mat[col2]);
|
glm_vec3_copy(tmp, mat[col2]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -288,4 +397,26 @@ glm_mat3_swap_row(mat3 mat, int row1, int row2) {
|
|||||||
mat[2][row2] = tmp[2];
|
mat[2][row2] = tmp[2];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief helper for R (row vector) * M (matrix) * C (column vector)
|
||||||
|
*
|
||||||
|
* rmc stands for Row * Matrix * Column
|
||||||
|
*
|
||||||
|
* the result is scalar because R * M = Matrix1x3 (row vector),
|
||||||
|
* then Matrix1x3 * Vec3 (column vector) = Matrix1x1 (Scalar)
|
||||||
|
*
|
||||||
|
* @param[in] r row vector or matrix1x3
|
||||||
|
* @param[in] m matrix3x3
|
||||||
|
* @param[in] c column vector or matrix3x1
|
||||||
|
*
|
||||||
|
* @return scalar value e.g. Matrix1x1
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_mat3_rmc(const vec3 r, const mat3 m, const vec3 c) {
|
||||||
|
vec3 tmp;
|
||||||
|
glm_mat3_mulv(m, c, tmp);
|
||||||
|
return glm_vec3_dot(r, tmp);
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* cglm_mat3_h */
|
#endif /* cglm_mat3_h */
|
||||||
|
|||||||
@@ -16,13 +16,13 @@
|
|||||||
GLM_MAT4_ZERO_INIT
|
GLM_MAT4_ZERO_INIT
|
||||||
GLM_MAT4_IDENTITY
|
GLM_MAT4_IDENTITY
|
||||||
GLM_MAT4_ZERO
|
GLM_MAT4_ZERO
|
||||||
glm_mat4_udup(mat, dest)
|
|
||||||
glm_mat4_dup(mat, dest)
|
|
||||||
|
|
||||||
Functions:
|
Functions:
|
||||||
CGLM_INLINE void glm_mat4_ucopy(mat4 mat, mat4 dest);
|
CGLM_INLINE void glm_mat4_ucopy(mat4 mat, mat4 dest);
|
||||||
CGLM_INLINE void glm_mat4_copy(mat4 mat, mat4 dest);
|
CGLM_INLINE void glm_mat4_copy(mat4 mat, mat4 dest);
|
||||||
CGLM_INLINE void glm_mat4_identity(mat4 mat);
|
CGLM_INLINE void glm_mat4_identity(mat4 mat);
|
||||||
|
CGLM_INLINE void glm_mat4_identity_array(mat4 * restrict mat, size_t count);
|
||||||
|
CGLM_INLINE void glm_mat4_zero(mat4 mat);
|
||||||
CGLM_INLINE void glm_mat4_pick3(mat4 mat, mat3 dest);
|
CGLM_INLINE void glm_mat4_pick3(mat4 mat, mat3 dest);
|
||||||
CGLM_INLINE void glm_mat4_pick3t(mat4 mat, mat3 dest);
|
CGLM_INLINE void glm_mat4_pick3t(mat4 mat, mat3 dest);
|
||||||
CGLM_INLINE void glm_mat4_ins3(mat3 mat, mat4 dest);
|
CGLM_INLINE void glm_mat4_ins3(mat3 mat, mat4 dest);
|
||||||
@@ -30,6 +30,9 @@
|
|||||||
CGLM_INLINE void glm_mat4_mulN(mat4 *matrices[], int len, mat4 dest);
|
CGLM_INLINE void glm_mat4_mulN(mat4 *matrices[], int len, mat4 dest);
|
||||||
CGLM_INLINE void glm_mat4_mulv(mat4 m, vec4 v, vec4 dest);
|
CGLM_INLINE void glm_mat4_mulv(mat4 m, vec4 v, vec4 dest);
|
||||||
CGLM_INLINE void glm_mat4_mulv3(mat4 m, vec3 v, vec3 dest);
|
CGLM_INLINE void glm_mat4_mulv3(mat4 m, vec3 v, vec3 dest);
|
||||||
|
CGLM_INLINE float glm_mat4_trace(mat4 m);
|
||||||
|
CGLM_INLINE float glm_mat4_trace3(mat4 m);
|
||||||
|
CGLM_INLINE void glm_mat4_quat(mat4 m, versor dest) ;
|
||||||
CGLM_INLINE void glm_mat4_transpose_to(mat4 m, mat4 dest);
|
CGLM_INLINE void glm_mat4_transpose_to(mat4 m, mat4 dest);
|
||||||
CGLM_INLINE void glm_mat4_transpose(mat4 m);
|
CGLM_INLINE void glm_mat4_transpose(mat4 m);
|
||||||
CGLM_INLINE void glm_mat4_scale_p(mat4 m, float s);
|
CGLM_INLINE void glm_mat4_scale_p(mat4 m, float s);
|
||||||
@@ -39,12 +42,15 @@
|
|||||||
CGLM_INLINE void glm_mat4_inv_fast(mat4 mat, mat4 dest);
|
CGLM_INLINE void glm_mat4_inv_fast(mat4 mat, mat4 dest);
|
||||||
CGLM_INLINE void glm_mat4_swap_col(mat4 mat, int col1, int col2);
|
CGLM_INLINE void glm_mat4_swap_col(mat4 mat, int col1, int col2);
|
||||||
CGLM_INLINE void glm_mat4_swap_row(mat4 mat, int row1, int row2);
|
CGLM_INLINE void glm_mat4_swap_row(mat4 mat, int row1, int row2);
|
||||||
|
CGLM_INLINE float glm_mat4_rmc(vec4 r, mat4 m, vec4 c);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef cglm_mat_h
|
#ifndef cglm_mat_h
|
||||||
#define cglm_mat_h
|
#define cglm_mat_h
|
||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
#include "vec4.h"
|
||||||
|
#include "vec3.h"
|
||||||
|
|
||||||
#ifdef CGLM_SSE_FP
|
#ifdef CGLM_SSE_FP
|
||||||
# include "simd/sse2/mat4.h"
|
# include "simd/sse2/mat4.h"
|
||||||
@@ -58,7 +64,9 @@
|
|||||||
# include "simd/neon/mat4.h"
|
# include "simd/neon/mat4.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <assert.h>
|
#ifdef DEBUG
|
||||||
|
# include <assert.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#define GLM_MAT4_IDENTITY_INIT {{1.0f, 0.0f, 0.0f, 0.0f}, \
|
#define GLM_MAT4_IDENTITY_INIT {{1.0f, 0.0f, 0.0f, 0.0f}, \
|
||||||
{0.0f, 1.0f, 0.0f, 0.0f}, \
|
{0.0f, 1.0f, 0.0f, 0.0f}, \
|
||||||
@@ -92,8 +100,16 @@
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat4_ucopy(mat4 mat, mat4 dest) {
|
glm_mat4_ucopy(const mat4 mat, mat4 dest) {
|
||||||
glm__memcpy(float, dest, mat, sizeof(mat4));
|
dest[0][0] = mat[0][0]; dest[1][0] = mat[1][0];
|
||||||
|
dest[0][1] = mat[0][1]; dest[1][1] = mat[1][1];
|
||||||
|
dest[0][2] = mat[0][2]; dest[1][2] = mat[1][2];
|
||||||
|
dest[0][3] = mat[0][3]; dest[1][3] = mat[1][3];
|
||||||
|
|
||||||
|
dest[2][0] = mat[2][0]; dest[3][0] = mat[3][0];
|
||||||
|
dest[2][1] = mat[2][1]; dest[3][1] = mat[3][1];
|
||||||
|
dest[2][2] = mat[2][2]; dest[3][2] = mat[3][2];
|
||||||
|
dest[2][3] = mat[2][3]; dest[3][3] = mat[3][3];
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -104,15 +120,20 @@ glm_mat4_ucopy(mat4 mat, mat4 dest) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat4_copy(mat4 mat, mat4 dest) {
|
glm_mat4_copy(const mat4 mat, mat4 dest) {
|
||||||
#ifdef __AVX__
|
#ifdef __AVX__
|
||||||
_mm256_store_ps(dest[0], _mm256_load_ps(mat[0]));
|
glmm_store256(dest[0], glmm_load256(mat[0]));
|
||||||
_mm256_store_ps(dest[2], _mm256_load_ps(mat[2]));
|
glmm_store256(dest[2], glmm_load256(mat[2]));
|
||||||
#elif defined( __SSE__ ) || defined( __SSE2__ )
|
#elif defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
_mm_store_ps(dest[0], _mm_load_ps(mat[0]));
|
glmm_store(dest[0], glmm_load(mat[0]));
|
||||||
_mm_store_ps(dest[1], _mm_load_ps(mat[1]));
|
glmm_store(dest[1], glmm_load(mat[1]));
|
||||||
_mm_store_ps(dest[2], _mm_load_ps(mat[2]));
|
glmm_store(dest[2], glmm_load(mat[2]));
|
||||||
_mm_store_ps(dest[3], _mm_load_ps(mat[3]));
|
glmm_store(dest[3], glmm_load(mat[3]));
|
||||||
|
#elif defined(CGLM_NEON_FP)
|
||||||
|
vst1q_f32(dest[0], vld1q_f32(mat[0]));
|
||||||
|
vst1q_f32(dest[1], vld1q_f32(mat[1]));
|
||||||
|
vst1q_f32(dest[2], vld1q_f32(mat[2]));
|
||||||
|
vst1q_f32(dest[3], vld1q_f32(mat[3]));
|
||||||
#else
|
#else
|
||||||
glm_mat4_ucopy(mat, dest);
|
glm_mat4_ucopy(mat, dest);
|
||||||
#endif
|
#endif
|
||||||
@@ -135,7 +156,38 @@ glm_mat4_copy(mat4 mat, mat4 dest) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat4_identity(mat4 mat) {
|
glm_mat4_identity(mat4 mat) {
|
||||||
mat4 t = GLM_MAT4_IDENTITY_INIT;
|
CGLM_ALIGN_MAT mat4 t = GLM_MAT4_IDENTITY_INIT;
|
||||||
|
glm_mat4_copy(t, mat);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief make given matrix array's each element identity matrix
|
||||||
|
*
|
||||||
|
* @param[in, out] mat matrix array (must be aligned (16/32)
|
||||||
|
* if alignment is not disabled)
|
||||||
|
*
|
||||||
|
* @param[in] count count of matrices
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat4_identity_array(mat4 * const __restrict mat, size_t count) {
|
||||||
|
CGLM_ALIGN_MAT mat4 t = GLM_MAT4_IDENTITY_INIT;
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
for (i = 0; i < count; i++) {
|
||||||
|
glm_mat4_copy(t, mat[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief make given matrix zero.
|
||||||
|
*
|
||||||
|
* @param[in, out] mat matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat4_zero(mat4 mat) {
|
||||||
|
CGLM_ALIGN_MAT mat4 t = GLM_MAT4_ZERO_INIT;
|
||||||
glm_mat4_copy(t, mat);
|
glm_mat4_copy(t, mat);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -147,7 +199,7 @@ glm_mat4_identity(mat4 mat) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat4_pick3(mat4 mat, mat3 dest) {
|
glm_mat4_pick3(const mat4 mat, mat3 dest) {
|
||||||
dest[0][0] = mat[0][0];
|
dest[0][0] = mat[0][0];
|
||||||
dest[0][1] = mat[0][1];
|
dest[0][1] = mat[0][1];
|
||||||
dest[0][2] = mat[0][2];
|
dest[0][2] = mat[0][2];
|
||||||
@@ -171,7 +223,7 @@ glm_mat4_pick3(mat4 mat, mat3 dest) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat4_pick3t(mat4 mat, mat3 dest) {
|
glm_mat4_pick3t(const mat4 mat, mat3 dest) {
|
||||||
dest[0][0] = mat[0][0];
|
dest[0][0] = mat[0][0];
|
||||||
dest[0][1] = mat[1][0];
|
dest[0][1] = mat[1][0];
|
||||||
dest[0][2] = mat[2][0];
|
dest[0][2] = mat[2][0];
|
||||||
@@ -193,7 +245,7 @@ glm_mat4_pick3t(mat4 mat, mat3 dest) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat4_ins3(mat3 mat, mat4 dest) {
|
glm_mat4_ins3(const mat3 mat, mat4 dest) {
|
||||||
dest[0][0] = mat[0][0];
|
dest[0][0] = mat[0][0];
|
||||||
dest[0][1] = mat[0][1];
|
dest[0][1] = mat[0][1];
|
||||||
dest[0][2] = mat[0][2];
|
dest[0][2] = mat[0][2];
|
||||||
@@ -223,12 +275,12 @@ glm_mat4_ins3(mat3 mat, mat4 dest) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat4_mul(mat4 m1, mat4 m2, mat4 dest) {
|
glm_mat4_mul(const mat4 m1, const mat4 m2, mat4 dest) {
|
||||||
#ifdef __AVX__
|
#ifdef __AVX__
|
||||||
glm_mat4_mul_avx(m1, m2, dest);
|
glm_mat4_mul_avx(m1, m2, dest);
|
||||||
#elif defined( __SSE__ ) || defined( __SSE2__ )
|
#elif defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
glm_mat4_mul_sse2(m1, m2, dest);
|
glm_mat4_mul_sse2(m1, m2, dest);
|
||||||
#elif defined( __ARM_NEON_FP )
|
#elif defined(CGLM_NEON_FP)
|
||||||
glm_mat4_mul_neon(m1, m2, dest);
|
glm_mat4_mul_neon(m1, m2, dest);
|
||||||
#else
|
#else
|
||||||
float a00 = m1[0][0], a01 = m1[0][1], a02 = m1[0][2], a03 = m1[0][3],
|
float a00 = m1[0][0], a01 = m1[0][1], a02 = m1[0][2], a03 = m1[0][3],
|
||||||
@@ -281,19 +333,17 @@ glm_mat4_mul(mat4 m1, mat4 m2, mat4 dest) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat4_mulN(mat4 * __restrict matrices[], int len, mat4 dest) {
|
glm_mat4_mulN(mat4 * const __restrict matrices[], uint32_t len, mat4 dest) {
|
||||||
int i;
|
uint32_t i;
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
assert(len > 1 && "there must be least 2 matrices to go!");
|
assert(len > 1 && "there must be least 2 matrices to go!");
|
||||||
|
#endif
|
||||||
|
|
||||||
glm_mat4_mul(*matrices[0],
|
glm_mat4_mul(*matrices[0], *matrices[1], dest);
|
||||||
*matrices[1],
|
|
||||||
dest);
|
|
||||||
|
|
||||||
for (i = 2; i < len; i++)
|
for (i = 2; i < len; i++)
|
||||||
glm_mat4_mul(dest,
|
glm_mat4_mul(dest, *matrices[i], dest);
|
||||||
*matrices[i],
|
|
||||||
dest);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -305,7 +355,7 @@ glm_mat4_mulN(mat4 * __restrict matrices[], int len, mat4 dest) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat4_mulv(mat4 m, vec4 v, vec4 dest) {
|
glm_mat4_mulv(const mat4 m, const vec4 v, vec4 dest) {
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
glm_mat4_mulv_sse2(m, v, dest);
|
glm_mat4_mulv_sse2(m, v, dest);
|
||||||
#else
|
#else
|
||||||
@@ -319,20 +369,95 @@ glm_mat4_mulv(mat4 m, vec4 v, vec4 dest) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief multiply vector with mat4's mat3 part(rotation)
|
* @brief trace of matrix
|
||||||
*
|
*
|
||||||
* @param[in] m mat4(affine transform)
|
* sum of the elements on the main diagonal from upper left to the lower right
|
||||||
* @param[in] v vec3
|
*
|
||||||
* @param[out] dest vec3
|
* @param[in] m matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_mat4_trace(const mat4 m) {
|
||||||
|
return m[0][0] + m[1][1] + m[2][2] + m[3][3];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief trace of matrix (rotation part)
|
||||||
|
*
|
||||||
|
* sum of the elements on the main diagonal from upper left to the lower right
|
||||||
|
*
|
||||||
|
* @param[in] m matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_mat4_trace3(const mat4 m) {
|
||||||
|
return m[0][0] + m[1][1] + m[2][2];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief convert mat4's rotation part to quaternion
|
||||||
|
*
|
||||||
|
* @param[in] m affine matrix
|
||||||
|
* @param[out] dest destination quaternion
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat4_mulv3(mat4 m, vec3 v, vec3 dest) {
|
glm_mat4_quat(const mat4 m, versor dest) {
|
||||||
vec3 res;
|
float trace, r, rinv;
|
||||||
res[0] = m[0][0] * v[0] + m[1][0] * v[1] + m[2][0] * v[2];
|
|
||||||
res[1] = m[0][1] * v[0] + m[1][1] * v[1] + m[2][1] * v[2];
|
/* it seems using like m12 instead of m[1][2] causes extra instructions */
|
||||||
res[2] = m[0][2] * v[0] + m[1][2] * v[1] + m[2][2] * v[2];
|
|
||||||
glm_vec_copy(res, dest);
|
trace = m[0][0] + m[1][1] + m[2][2];
|
||||||
|
if (trace >= 0.0f) {
|
||||||
|
r = sqrtf(1.0f + trace);
|
||||||
|
rinv = 0.5f / r;
|
||||||
|
|
||||||
|
dest[0] = rinv * (m[1][2] - m[2][1]);
|
||||||
|
dest[1] = rinv * (m[2][0] - m[0][2]);
|
||||||
|
dest[2] = rinv * (m[0][1] - m[1][0]);
|
||||||
|
dest[3] = r * 0.5f;
|
||||||
|
} else if (m[0][0] >= m[1][1] && m[0][0] >= m[2][2]) {
|
||||||
|
r = sqrtf(1.0f - m[1][1] - m[2][2] + m[0][0]);
|
||||||
|
rinv = 0.5f / r;
|
||||||
|
|
||||||
|
dest[0] = r * 0.5f;
|
||||||
|
dest[1] = rinv * (m[0][1] + m[1][0]);
|
||||||
|
dest[2] = rinv * (m[0][2] + m[2][0]);
|
||||||
|
dest[3] = rinv * (m[1][2] - m[2][1]);
|
||||||
|
} else if (m[1][1] >= m[2][2]) {
|
||||||
|
r = sqrtf(1.0f - m[0][0] - m[2][2] + m[1][1]);
|
||||||
|
rinv = 0.5f / r;
|
||||||
|
|
||||||
|
dest[0] = rinv * (m[0][1] + m[1][0]);
|
||||||
|
dest[1] = r * 0.5f;
|
||||||
|
dest[2] = rinv * (m[1][2] + m[2][1]);
|
||||||
|
dest[3] = rinv * (m[2][0] - m[0][2]);
|
||||||
|
} else {
|
||||||
|
r = sqrtf(1.0f - m[0][0] - m[1][1] + m[2][2]);
|
||||||
|
rinv = 0.5f / r;
|
||||||
|
|
||||||
|
dest[0] = rinv * (m[0][2] + m[2][0]);
|
||||||
|
dest[1] = rinv * (m[1][2] + m[2][1]);
|
||||||
|
dest[2] = r * 0.5f;
|
||||||
|
dest[3] = rinv * (m[0][1] - m[1][0]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief multiply vector with mat4
|
||||||
|
*
|
||||||
|
* @param[in] m mat4(affine transform)
|
||||||
|
* @param[in] v vec3
|
||||||
|
* @param[in] last 4th item to make it vec4
|
||||||
|
* @param[out] dest result vector (vec3)
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat4_mulv3(const mat4 m, const vec3 v, float last, vec3 dest) {
|
||||||
|
vec4 res;
|
||||||
|
glm_vec4(v, last, res);
|
||||||
|
glm_mat4_mulv(m, res, res);
|
||||||
|
glm_vec3(res, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -345,7 +470,7 @@ glm_mat4_mulv3(mat4 m, vec3 v, vec3 dest) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat4_transpose_to(mat4 m, mat4 dest) {
|
glm_mat4_transpose_to(const mat4 m, mat4 dest) {
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
glm_mat4_transp_sse2(m, dest);
|
glm_mat4_transp_sse2(m, dest);
|
||||||
#else
|
#else
|
||||||
@@ -372,10 +497,8 @@ glm_mat4_transpose(mat4 m) {
|
|||||||
glm_mat4_transp_sse2(m, m);
|
glm_mat4_transp_sse2(m, m);
|
||||||
#else
|
#else
|
||||||
mat4 d;
|
mat4 d;
|
||||||
|
|
||||||
glm_mat4_transpose_to(m, d);
|
glm_mat4_transpose_to(m, d);
|
||||||
|
glm_mat4_ucopy(d, m);
|
||||||
glm__memcpy(float, m, d, sizeof(mat4));
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -409,6 +532,13 @@ void
|
|||||||
glm_mat4_scale(mat4 m, float s) {
|
glm_mat4_scale(mat4 m, float s) {
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
glm_mat4_scale_sse2(m, s);
|
glm_mat4_scale_sse2(m, s);
|
||||||
|
#elif defined(CGLM_NEON_FP)
|
||||||
|
float32x4_t v0;
|
||||||
|
v0 = vdupq_n_f32(s);
|
||||||
|
vst1q_f32(m[0], vmulq_f32(vld1q_f32(m[0]), v0));
|
||||||
|
vst1q_f32(m[1], vmulq_f32(vld1q_f32(m[1]), v0));
|
||||||
|
vst1q_f32(m[2], vmulq_f32(vld1q_f32(m[2]), v0));
|
||||||
|
vst1q_f32(m[3], vmulq_f32(vld1q_f32(m[3]), v0));
|
||||||
#else
|
#else
|
||||||
glm_mat4_scale_p(m, s);
|
glm_mat4_scale_p(m, s);
|
||||||
#endif
|
#endif
|
||||||
@@ -423,7 +553,7 @@ glm_mat4_scale(mat4 m, float s) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
float
|
float
|
||||||
glm_mat4_det(mat4 mat) {
|
glm_mat4_det(const mat4 mat) {
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
return glm_mat4_det_sse2(mat);
|
return glm_mat4_det_sse2(mat);
|
||||||
#else
|
#else
|
||||||
@@ -456,7 +586,7 @@ glm_mat4_det(mat4 mat) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat4_inv(mat4 mat, mat4 dest) {
|
glm_mat4_inv(const mat4 mat, mat4 dest) {
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
glm_mat4_inv_sse2(mat, dest);
|
glm_mat4_inv_sse2(mat, dest);
|
||||||
#else
|
#else
|
||||||
@@ -517,7 +647,7 @@ glm_mat4_inv(mat4 mat, mat4 dest) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat4_inv_fast(mat4 mat, mat4 dest) {
|
glm_mat4_inv_fast(const mat4 mat, mat4 dest) {
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
glm_mat4_inv_fast_sse2(mat, dest);
|
glm_mat4_inv_fast_sse2(mat, dest);
|
||||||
#else
|
#else
|
||||||
@@ -535,7 +665,7 @@ glm_mat4_inv_fast(mat4 mat, mat4 dest) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat4_swap_col(mat4 mat, int col1, int col2) {
|
glm_mat4_swap_col(mat4 mat, int col1, int col2) {
|
||||||
vec4 tmp;
|
CGLM_ALIGN(16) vec4 tmp;
|
||||||
glm_vec4_copy(mat[col1], tmp);
|
glm_vec4_copy(mat[col1], tmp);
|
||||||
glm_vec4_copy(mat[col2], mat[col1]);
|
glm_vec4_copy(mat[col2], mat[col1]);
|
||||||
glm_vec4_copy(tmp, mat[col2]);
|
glm_vec4_copy(tmp, mat[col2]);
|
||||||
@@ -550,8 +680,8 @@ glm_mat4_swap_col(mat4 mat, int col1, int col2) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat4_swap_row(mat4 mat, int row1, int row2) {
|
glm_mat4_swap_row(mat4 mat, const int row1, const int row2) {
|
||||||
vec4 tmp;
|
CGLM_ALIGN(16) vec4 tmp;
|
||||||
tmp[0] = mat[0][row1];
|
tmp[0] = mat[0][row1];
|
||||||
tmp[1] = mat[1][row1];
|
tmp[1] = mat[1][row1];
|
||||||
tmp[2] = mat[2][row1];
|
tmp[2] = mat[2][row1];
|
||||||
@@ -568,5 +698,26 @@ glm_mat4_swap_row(mat4 mat, int row1, int row2) {
|
|||||||
mat[3][row2] = tmp[3];
|
mat[3][row2] = tmp[3];
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
/*!
|
||||||
|
* @brief helper for R (row vector) * M (matrix) * C (column vector)
|
||||||
|
*
|
||||||
|
* rmc stands for Row * Matrix * Column
|
||||||
|
*
|
||||||
|
* the result is scalar because R * M = Matrix1x4 (row vector),
|
||||||
|
* then Matrix1x4 * Vec4 (column vector) = Matrix1x1 (Scalar)
|
||||||
|
*
|
||||||
|
* @param[in] r row vector or matrix1x4
|
||||||
|
* @param[in] m matrix4x4
|
||||||
|
* @param[in] c column vector or matrix4x1
|
||||||
|
*
|
||||||
|
* @return scalar value e.g. B(s)
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_mat4_rmc(const vec4 r, const mat4 m, const vec4 c) {
|
||||||
|
vec4 tmp;
|
||||||
|
glm_mat4_mulv(m, c, tmp);
|
||||||
|
return glm_vec4_dot(r, tmp);
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* cglm_mat_h */
|
#endif /* cglm_mat_h */
|
||||||
|
|||||||
@@ -9,9 +9,7 @@
|
|||||||
#define cglm_plane_h
|
#define cglm_plane_h
|
||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "mat4.h"
|
|
||||||
#include "vec4.h"
|
#include "vec4.h"
|
||||||
#include "vec3.h"
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Plane equation: Ax + By + Cz + D = 0;
|
Plane equation: Ax + By + Cz + D = 0;
|
||||||
@@ -32,7 +30,7 @@
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_plane_normalize(vec4 plane) {
|
glm_plane_normalize(vec4 plane) {
|
||||||
glm_vec4_scale(plane, 1.0f / glm_vec_norm(plane), plane);
|
glm_vec4_scale(plane, 1.0f / glm_vec3_norm(plane), plane);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* cglm_plane_h */
|
#endif /* cglm_plane_h */
|
||||||
|
|||||||
118
include/cglm/project.h
Normal file
118
include/cglm/project.h
Normal file
@@ -0,0 +1,118 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglm_project_h
|
||||||
|
#define cglm_project_h
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "vec3.h"
|
||||||
|
#include "vec4.h"
|
||||||
|
#include "mat4.h"
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief 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:
|
||||||
|
* 1- if m = invProj: View Space
|
||||||
|
* 2- if m = invViewProj: World Space
|
||||||
|
* 3- if m = invMVP: Object Space
|
||||||
|
*
|
||||||
|
* You probably want to map the coordinates into object space
|
||||||
|
* so use invMVP as m
|
||||||
|
*
|
||||||
|
* Computing viewProj:
|
||||||
|
* glm_mat4_mul(proj, view, viewProj);
|
||||||
|
* glm_mat4_mul(viewProj, model, MVP);
|
||||||
|
* glm_mat4_inv(viewProj, invMVP);
|
||||||
|
*
|
||||||
|
* @param[in] pos point/position in viewport coordinates
|
||||||
|
* @param[in] invMat matrix (see brief)
|
||||||
|
* @param[in] vp viewport as [x, y, width, height]
|
||||||
|
* @param[out] dest unprojected coordinates
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_unprojecti(const vec3 pos, const mat4 invMat, const vec4 vp, vec3 dest) {
|
||||||
|
vec4 v;
|
||||||
|
|
||||||
|
v[0] = 2.0f * (pos[0] - vp[0]) / vp[2] - 1.0f;
|
||||||
|
v[1] = 2.0f * (pos[1] - vp[1]) / vp[3] - 1.0f;
|
||||||
|
v[2] = 2.0f * pos[2] - 1.0f;
|
||||||
|
v[3] = 1.0f;
|
||||||
|
|
||||||
|
glm_mat4_mulv(invMat, v, v);
|
||||||
|
glm_vec4_scale(v, 1.0f / v[3], v);
|
||||||
|
glm_vec3(v, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief 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:
|
||||||
|
* 1- if m = proj: View Space
|
||||||
|
* 2- if m = viewProj: World Space
|
||||||
|
* 3- if m = MVP: Object Space
|
||||||
|
*
|
||||||
|
* You probably want to map the coordinates into object space
|
||||||
|
* so use MVP as m
|
||||||
|
*
|
||||||
|
* Computing viewProj and MVP:
|
||||||
|
* glm_mat4_mul(proj, view, viewProj);
|
||||||
|
* glm_mat4_mul(viewProj, model, MVP);
|
||||||
|
*
|
||||||
|
* @param[in] pos point/position in viewport coordinates
|
||||||
|
* @param[in] m matrix (see brief)
|
||||||
|
* @param[in] vp viewport as [x, y, width, height]
|
||||||
|
* @param[out] dest unprojected coordinates
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_unproject(const vec3 pos, const mat4 m, const vec4 vp, vec3 dest) {
|
||||||
|
mat4 inv;
|
||||||
|
glm_mat4_inv(m, inv);
|
||||||
|
glm_unprojecti(pos, inv, vp, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief map object coordinates to window coordinates
|
||||||
|
*
|
||||||
|
* Computing MVP:
|
||||||
|
* glm_mat4_mul(proj, view, viewProj);
|
||||||
|
* glm_mat4_mul(viewProj, model, MVP);
|
||||||
|
*
|
||||||
|
* @param[in] pos object coordinates
|
||||||
|
* @param[in] m MVP matrix
|
||||||
|
* @param[in] vp viewport as [x, y, width, height]
|
||||||
|
* @param[out] dest projected coordinates
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_project(const vec3 pos, const mat4 m, const vec4 vp, vec3 dest) {
|
||||||
|
CGLM_ALIGN(16) vec4 pos4, vone = GLM_VEC4_ONE_INIT;
|
||||||
|
|
||||||
|
glm_vec4(pos, 1.0f, pos4);
|
||||||
|
|
||||||
|
glm_mat4_mulv(m, pos4, pos4);
|
||||||
|
glm_vec4_scale(pos4, 1.0f / pos4[3], pos4); /* pos = pos / pos.w */
|
||||||
|
glm_vec4_add(pos4, vone, pos4);
|
||||||
|
glm_vec4_scale(pos4, 0.5f, pos4);
|
||||||
|
|
||||||
|
dest[0] = pos4[0] * vp[2] + vp[0];
|
||||||
|
dest[1] = pos4[1] * vp[3] + vp[1];
|
||||||
|
dest[2] = pos4[2];
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* cglm_project_h */
|
||||||
@@ -11,41 +11,84 @@
|
|||||||
GLM_QUAT_IDENTITY
|
GLM_QUAT_IDENTITY
|
||||||
|
|
||||||
Functions:
|
Functions:
|
||||||
CGLM_INLINE void glm_quat_identity(versor q);
|
CGLM_INLINE void glm_quat_identity(versor q);
|
||||||
CGLM_INLINE void glm_quat(versor q, float angle, float x, float y, float z);
|
CGLM_INLINE void glm_quat_init(versor q, float x, float y, float z, float w);
|
||||||
CGLM_INLINE void glm_quatv(versor q, float angle, vec3 v);
|
CGLM_INLINE void glm_quat(versor q, float angle, float x, float y, float z);
|
||||||
|
CGLM_INLINE void glm_quatv(versor q, float angle, vec3 axis);
|
||||||
|
CGLM_INLINE void glm_quat_copy(versor q, versor dest);
|
||||||
CGLM_INLINE float glm_quat_norm(versor q);
|
CGLM_INLINE float glm_quat_norm(versor q);
|
||||||
CGLM_INLINE void glm_quat_normalize(versor q);
|
CGLM_INLINE void glm_quat_normalize(versor q);
|
||||||
CGLM_INLINE float glm_quat_dot(versor q, versor r);
|
CGLM_INLINE void glm_quat_normalize_to(versor q, versor dest);
|
||||||
CGLM_INLINE void glm_quat_mulv(versor q1, versor q2, versor dest);
|
CGLM_INLINE float glm_quat_dot(versor p, versor q);
|
||||||
CGLM_INLINE void glm_quat_mat4(versor q, mat4 dest);
|
CGLM_INLINE void glm_quat_conjugate(versor q, versor dest);
|
||||||
CGLM_INLINE void glm_quat_slerp(versor q, versor r, float t, versor dest);
|
CGLM_INLINE void glm_quat_inv(versor q, versor dest);
|
||||||
|
CGLM_INLINE void glm_quat_add(versor p, versor q, versor dest);
|
||||||
|
CGLM_INLINE void glm_quat_sub(versor p, versor q, versor dest);
|
||||||
|
CGLM_INLINE float glm_quat_real(versor q);
|
||||||
|
CGLM_INLINE void glm_quat_imag(versor q, vec3 dest);
|
||||||
|
CGLM_INLINE void glm_quat_imagn(versor q, vec3 dest);
|
||||||
|
CGLM_INLINE float glm_quat_imaglen(versor q);
|
||||||
|
CGLM_INLINE float glm_quat_angle(versor q);
|
||||||
|
CGLM_INLINE void glm_quat_axis(versor q, versor dest);
|
||||||
|
CGLM_INLINE void glm_quat_mul(versor p, versor q, versor dest);
|
||||||
|
CGLM_INLINE void glm_quat_mat4(versor q, mat4 dest);
|
||||||
|
CGLM_INLINE void glm_quat_mat4t(versor q, mat4 dest);
|
||||||
|
CGLM_INLINE void glm_quat_mat3(versor q, mat3 dest);
|
||||||
|
CGLM_INLINE void glm_quat_mat3t(versor q, mat3 dest);
|
||||||
|
CGLM_INLINE void glm_quat_lerp(versor from, versor to, float t, versor dest);
|
||||||
|
CGLM_INLINE void glm_quat_slerp(versor q, versor r, float t, versor dest);
|
||||||
|
CGLM_INLINE void glm_quat_look(vec3 eye, versor ori, mat4 dest);
|
||||||
|
CGLM_INLINE void glm_quat_for(vec3 dir, vec3 fwd, vec3 up, versor dest);
|
||||||
|
CGLM_INLINE void glm_quat_forp(vec3 from,
|
||||||
|
vec3 to,
|
||||||
|
vec3 fwd,
|
||||||
|
vec3 up,
|
||||||
|
versor dest);
|
||||||
|
CGLM_INLINE void glm_quat_rotatev(versor q, vec3 v, vec3 dest);
|
||||||
|
CGLM_INLINE void glm_quat_rotate(mat4 m, versor q, mat4 dest);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef cglm_quat_h
|
#ifndef cglm_quat_h
|
||||||
#define cglm_quat_h
|
#define cglm_quat_h
|
||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
#include "vec3.h"
|
||||||
#include "vec4.h"
|
#include "vec4.h"
|
||||||
|
#include "mat4.h"
|
||||||
|
#include "mat3.h"
|
||||||
|
#include "affine-mat.h"
|
||||||
|
|
||||||
#ifdef CGLM_SSE_FP
|
#ifdef CGLM_SSE_FP
|
||||||
# include "simd/sse2/quat.h"
|
# include "simd/sse2/quat.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat4_identity(mat4 mat);
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat4_mulv(const mat4 m, const vec4 v, vec4 dest);
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mul_rot(const mat4 m1, const mat4 m2, mat4 dest);
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_translate(mat4 m, const vec3 v);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* IMPORTANT! cglm stores quat as [w, x, y, z]
|
* IMPORTANT:
|
||||||
|
* ----------------------------------------------------------------------------
|
||||||
|
* cglm stores quat as [x, y, z, w] since v0.3.6
|
||||||
*
|
*
|
||||||
* Possible changes (these may be changed in the future):
|
* it was [w, x, y, z] before v0.3.6 it has been changed to [x, y, z, w]
|
||||||
* - versor is identity quat, we can define new type for quat.
|
* with v0.3.6 version.
|
||||||
* it can't be quat or quaternion becuase someone can use that name for
|
* ----------------------------------------------------------------------------
|
||||||
* variable name. maybe just vec4.
|
|
||||||
* - it stores [w, x, y, z] but it may change to [x, y, z, w] if we get enough
|
|
||||||
* feedback to change it.
|
|
||||||
* - in general we use last param as dest, but this header used first param
|
|
||||||
* as dest this may be changed but decided yet
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define GLM_QUAT_IDENTITY_INIT {1.0f, 0.0f, 0.0f, 0.0f}
|
#define GLM_QUAT_IDENTITY_INIT {0.0f, 0.0f, 0.0f, 1.0f}
|
||||||
#define GLM_QUAT_IDENTITY ((versor)GLM_QUAT_IDENTITY_INIT)
|
#define GLM_QUAT_IDENTITY ((versor)GLM_QUAT_IDENTITY_INIT)
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -56,10 +99,72 @@
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_quat_identity(versor q) {
|
glm_quat_identity(versor q) {
|
||||||
versor v = GLM_QUAT_IDENTITY_INIT;
|
CGLM_ALIGN(16) versor v = GLM_QUAT_IDENTITY_INIT;
|
||||||
glm_vec4_copy(v, q);
|
glm_vec4_copy(v, q);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief make given quaternion array's each element identity quaternion
|
||||||
|
*
|
||||||
|
* @param[in, out] q quat array (must be aligned (16)
|
||||||
|
* if alignment is not disabled)
|
||||||
|
*
|
||||||
|
* @param[in] count count of quaternions
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_quat_identity_array(versor * const __restrict q, size_t count) {
|
||||||
|
CGLM_ALIGN(16) versor v = GLM_QUAT_IDENTITY_INIT;
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
for (i = 0; i < count; i++) {
|
||||||
|
glm_vec4_copy(v, q[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief inits quaterion with raw values
|
||||||
|
*
|
||||||
|
* @param[out] q quaternion
|
||||||
|
* @param[in] x x
|
||||||
|
* @param[in] y y
|
||||||
|
* @param[in] z z
|
||||||
|
* @param[in] w w (real part)
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_quat_init(versor q, float x, float y, float z, float w) {
|
||||||
|
q[0] = x;
|
||||||
|
q[1] = y;
|
||||||
|
q[2] = z;
|
||||||
|
q[3] = w;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief creates NEW quaternion with axis vector
|
||||||
|
*
|
||||||
|
* @param[out] q quaternion
|
||||||
|
* @param[in] angle angle (radians)
|
||||||
|
* @param[in] axis axis
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_quatv(versor q, float angle, const vec3 axis) {
|
||||||
|
CGLM_ALIGN(8) vec3 k;
|
||||||
|
float a, c, s;
|
||||||
|
|
||||||
|
a = angle * 0.5f;
|
||||||
|
c = cosf(a);
|
||||||
|
s = sinf(a);
|
||||||
|
|
||||||
|
glm_normalize_to(axis, k);
|
||||||
|
|
||||||
|
q[0] = s * k[0];
|
||||||
|
q[1] = s * k[1];
|
||||||
|
q[2] = s * k[2];
|
||||||
|
q[3] = c;
|
||||||
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief creates NEW quaternion with individual axis components
|
* @brief creates NEW quaternion with individual axis components
|
||||||
*
|
*
|
||||||
@@ -71,45 +176,21 @@ glm_quat_identity(versor q) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_quat(versor q,
|
glm_quat(versor q, float angle, float x, float y, float z) {
|
||||||
float angle,
|
CGLM_ALIGN(8) vec3 axis = {x, y, z};
|
||||||
float x,
|
glm_quatv(q, angle, axis);
|
||||||
float y,
|
|
||||||
float z) {
|
|
||||||
float a, c, s;
|
|
||||||
|
|
||||||
a = angle * 0.5f;
|
|
||||||
c = cosf(a);
|
|
||||||
s = sinf(a);
|
|
||||||
|
|
||||||
q[0] = c;
|
|
||||||
q[1] = s * x;
|
|
||||||
q[2] = s * y;
|
|
||||||
q[3] = s * z;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief creates NEW quaternion with axis vector
|
* @brief copy quaternion to another one
|
||||||
*
|
*
|
||||||
* @param[out] q quaternion
|
* @param[in] q quaternion
|
||||||
* @param[in] angle angle (radians)
|
* @param[out] dest destination
|
||||||
* @param[in] v axis
|
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_quatv(versor q,
|
glm_quat_copy(const versor q, versor dest) {
|
||||||
float angle,
|
glm_vec4_copy(q, dest);
|
||||||
vec3 v) {
|
|
||||||
float a, c, s;
|
|
||||||
|
|
||||||
a = angle * 0.5f;
|
|
||||||
c = cosf(a);
|
|
||||||
s = sinf(a);
|
|
||||||
|
|
||||||
q[0] = c;
|
|
||||||
q[1] = s * v[0];
|
|
||||||
q[2] = s * v[1];
|
|
||||||
q[3] = s * v[2];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -119,10 +200,47 @@ glm_quatv(versor q,
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
float
|
float
|
||||||
glm_quat_norm(versor q) {
|
glm_quat_norm(const versor q) {
|
||||||
return glm_vec4_norm(q);
|
return glm_vec4_norm(q);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief normalize quaternion and store result in dest
|
||||||
|
*
|
||||||
|
* @param[in] q quaternion to normalze
|
||||||
|
* @param[out] dest destination quaternion
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_quat_normalize_to(const versor q, versor dest) {
|
||||||
|
#if defined( __SSE2__ ) || defined( __SSE2__ )
|
||||||
|
__m128 xdot, x0;
|
||||||
|
float dot;
|
||||||
|
|
||||||
|
x0 = glmm_load(q);
|
||||||
|
xdot = glmm_vdot(x0, x0);
|
||||||
|
dot = _mm_cvtss_f32(xdot);
|
||||||
|
|
||||||
|
if (dot <= 0.0f) {
|
||||||
|
glm_quat_identity(dest);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
glmm_store(dest, _mm_div_ps(x0, _mm_sqrt_ps(xdot)));
|
||||||
|
#else
|
||||||
|
float dot;
|
||||||
|
|
||||||
|
dot = glm_vec4_norm2(q);
|
||||||
|
|
||||||
|
if (dot <= 0.0f) {
|
||||||
|
glm_quat_identity(q);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
glm_vec4_scale(q, 1.0f / sqrtf(dot), dest);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief normalize quaternion
|
* @brief normalize quaternion
|
||||||
*
|
*
|
||||||
@@ -131,45 +249,178 @@ glm_quat_norm(versor q) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_quat_normalize(versor q) {
|
glm_quat_normalize(versor q) {
|
||||||
float sum;
|
glm_quat_normalize_to(q, q);
|
||||||
|
|
||||||
sum = q[0] * q[0] + q[1] * q[1]
|
|
||||||
+ q[2] * q[2] + q[3] * q[3];
|
|
||||||
|
|
||||||
if (fabs(1.0f - sum) < 0.0001f)
|
|
||||||
return;
|
|
||||||
|
|
||||||
glm_vec4_scale(q, 1.0f / sqrtf(sum), q);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief dot product of two quaternion
|
* @brief dot product of two quaternion
|
||||||
*
|
*
|
||||||
* @param[in] q quaternion 1
|
* @param[in] p quaternion 1
|
||||||
* @param[in] r quaternion 2
|
* @param[in] q quaternion 2
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
float
|
float
|
||||||
glm_quat_dot(versor q, versor r) {
|
glm_quat_dot(const versor p, const versor q) {
|
||||||
return glm_vec4_dot(q, r);
|
return glm_vec4_dot(p, q);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief conjugate of quaternion
|
||||||
|
*
|
||||||
|
* @param[in] q quaternion
|
||||||
|
* @param[out] dest conjugate
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_quat_conjugate(const versor q, versor dest) {
|
||||||
|
glm_vec4_negate_to(q, dest);
|
||||||
|
dest[3] = -dest[3];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief inverse of non-zero quaternion
|
||||||
|
*
|
||||||
|
* @param[in] q quaternion
|
||||||
|
* @param[out] dest inverse quaternion
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_quat_inv(const versor q, versor dest) {
|
||||||
|
CGLM_ALIGN(16) versor conj;
|
||||||
|
glm_quat_conjugate(q, conj);
|
||||||
|
glm_vec4_scale(conj, 1.0f / glm_vec4_norm2(q), dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief add (componentwise) two quaternions and store result in dest
|
||||||
|
*
|
||||||
|
* @param[in] p quaternion 1
|
||||||
|
* @param[in] q quaternion 2
|
||||||
|
* @param[out] dest result quaternion
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_quat_add(const versor p, const versor q, versor dest) {
|
||||||
|
glm_vec4_add(p, q, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief subtract (componentwise) two quaternions and store result in dest
|
||||||
|
*
|
||||||
|
* @param[in] p quaternion 1
|
||||||
|
* @param[in] q quaternion 2
|
||||||
|
* @param[out] dest result quaternion
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_quat_sub(const versor p, const versor q, versor dest) {
|
||||||
|
glm_vec4_sub(p, q, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief returns real part of quaternion
|
||||||
|
*
|
||||||
|
* @param[in] q quaternion
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_quat_real(const versor q) {
|
||||||
|
return q[3];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief returns imaginary part of quaternion
|
||||||
|
*
|
||||||
|
* @param[in] q quaternion
|
||||||
|
* @param[out] dest imag
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_quat_imag(const versor q, vec3 dest) {
|
||||||
|
dest[0] = q[0];
|
||||||
|
dest[1] = q[1];
|
||||||
|
dest[2] = q[2];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief returns normalized imaginary part of quaternion
|
||||||
|
*
|
||||||
|
* @param[in] q quaternion
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_quat_imagn(const versor q, vec3 dest) {
|
||||||
|
glm_normalize_to(q, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief returns length of imaginary part of quaternion
|
||||||
|
*
|
||||||
|
* @param[in] q quaternion
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_quat_imaglen(const versor q) {
|
||||||
|
return glm_vec3_norm(q);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief returns angle of quaternion
|
||||||
|
*
|
||||||
|
* @param[in] q quaternion
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_quat_angle(const versor q) {
|
||||||
|
/*
|
||||||
|
sin(theta / 2) = length(x*x + y*y + z*z)
|
||||||
|
cos(theta / 2) = w
|
||||||
|
theta = 2 * atan(sin(theta / 2) / cos(theta / 2))
|
||||||
|
*/
|
||||||
|
return 2.0f * atan2f(glm_quat_imaglen(q), glm_quat_real(q));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief axis of quaternion
|
||||||
|
*
|
||||||
|
* @param[in] q quaternion
|
||||||
|
* @param[out] dest axis of quaternion
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_quat_axis(const versor q, versor dest) {
|
||||||
|
glm_quat_imagn(q, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief multiplies two quaternion and stores result in dest
|
* @brief multiplies two quaternion and stores result in dest
|
||||||
|
* this is also called Hamilton Product
|
||||||
*
|
*
|
||||||
* @param[in] q1 quaternion 1
|
* According to WikiPedia:
|
||||||
* @param[in] q2 quaternion 2
|
* The product of two rotation quaternions [clarification needed] will be
|
||||||
|
* equivalent to the rotation q followed by the rotation p
|
||||||
|
*
|
||||||
|
* @param[in] p quaternion 1
|
||||||
|
* @param[in] q quaternion 2
|
||||||
* @param[out] dest result quaternion
|
* @param[out] dest result quaternion
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_quat_mulv(versor q1, versor q2, versor dest) {
|
glm_quat_mul(const versor p, const versor q, versor dest) {
|
||||||
dest[0] = q2[0] * q1[0] - q2[1] * q1[1] - q2[2] * q1[2] - q2[3] * q1[3];
|
/*
|
||||||
dest[1] = q2[0] * q1[1] + q2[1] * q1[0] - q2[2] * q1[3] + q2[3] * q1[2];
|
+ (a1 b2 + b1 a2 + c1 d2 − d1 c2)i
|
||||||
dest[2] = q2[0] * q1[2] + q2[1] * q1[3] + q2[2] * q1[0] - q2[3] * q1[1];
|
+ (a1 c2 − b1 d2 + c1 a2 + d1 b2)j
|
||||||
dest[3] = q2[0] * q1[3] - q2[1] * q1[2] + q2[2] * q1[1] + q2[3] * q1[0];
|
+ (a1 d2 + b1 c2 − c1 b2 + d1 a2)k
|
||||||
|
a1 a2 − b1 b2 − c1 c2 − d1 d2
|
||||||
glm_quat_normalize(dest);
|
*/
|
||||||
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
|
glm_quat_mul_sse2(p, q, dest);
|
||||||
|
#else
|
||||||
|
dest[0] = p[3] * q[0] + p[0] * q[3] + p[1] * q[2] - p[2] * q[1];
|
||||||
|
dest[1] = p[3] * q[1] - p[0] * q[2] + p[1] * q[3] + p[2] * q[0];
|
||||||
|
dest[2] = p[3] * q[2] + p[0] * q[1] - p[1] * q[0] + p[2] * q[3];
|
||||||
|
dest[3] = p[3] * q[3] - p[0] * q[0] - p[1] * q[1] - p[2] * q[2];
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -180,20 +431,23 @@ glm_quat_mulv(versor q1, versor q2, versor dest) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_quat_mat4(versor q, mat4 dest) {
|
glm_quat_mat4(const versor q, mat4 dest) {
|
||||||
float w, x, y, z;
|
float w, x, y, z,
|
||||||
float xx, yy, zz;
|
xx, yy, zz,
|
||||||
float xy, yz, xz;
|
xy, yz, xz,
|
||||||
float wx, wy, wz;
|
wx, wy, wz, norm, s;
|
||||||
|
|
||||||
w = q[0];
|
norm = glm_quat_norm(q);
|
||||||
x = q[1];
|
s = norm > 0.0f ? 2.0f / norm : 0.0f;
|
||||||
y = q[2];
|
|
||||||
z = q[3];
|
|
||||||
|
|
||||||
xx = 2.0f * x * x; xy = 2.0f * x * y; wx = 2.0f * w * x;
|
x = q[0];
|
||||||
yy = 2.0f * y * y; yz = 2.0f * y * z; wy = 2.0f * w * y;
|
y = q[1];
|
||||||
zz = 2.0f * z * z; xz = 2.0f * x * z; wz = 2.0f * w * z;
|
z = q[2];
|
||||||
|
w = q[3];
|
||||||
|
|
||||||
|
xx = s * x * x; xy = s * x * y; wx = s * w * x;
|
||||||
|
yy = s * y * y; yz = s * y * z; wy = s * w * y;
|
||||||
|
zz = s * z * z; xz = s * x * z; wz = s * w * z;
|
||||||
|
|
||||||
dest[0][0] = 1.0f - yy - zz;
|
dest[0][0] = 1.0f - yy - zz;
|
||||||
dest[1][1] = 1.0f - xx - zz;
|
dest[1][1] = 1.0f - xx - zz;
|
||||||
@@ -207,8 +461,8 @@ glm_quat_mat4(versor q, mat4 dest) {
|
|||||||
dest[2][1] = yz - wx;
|
dest[2][1] = yz - wx;
|
||||||
dest[0][2] = xz - wy;
|
dest[0][2] = xz - wy;
|
||||||
|
|
||||||
dest[1][3] = 0.0f;
|
|
||||||
dest[0][3] = 0.0f;
|
dest[0][3] = 0.0f;
|
||||||
|
dest[1][3] = 0.0f;
|
||||||
dest[2][3] = 0.0f;
|
dest[2][3] = 0.0f;
|
||||||
dest[3][0] = 0.0f;
|
dest[3][0] = 0.0f;
|
||||||
dest[3][1] = 0.0f;
|
dest[3][1] = 0.0f;
|
||||||
@@ -216,69 +470,347 @@ glm_quat_mat4(versor q, mat4 dest) {
|
|||||||
dest[3][3] = 1.0f;
|
dest[3][3] = 1.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief convert quaternion to mat4 (transposed)
|
||||||
|
*
|
||||||
|
* @param[in] q quaternion
|
||||||
|
* @param[out] dest result matrix as transposed
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_quat_mat4t(const versor q, mat4 dest) {
|
||||||
|
float w, x, y, z,
|
||||||
|
xx, yy, zz,
|
||||||
|
xy, yz, xz,
|
||||||
|
wx, wy, wz, norm, s;
|
||||||
|
|
||||||
|
norm = glm_quat_norm(q);
|
||||||
|
s = norm > 0.0f ? 2.0f / norm : 0.0f;
|
||||||
|
|
||||||
|
x = q[0];
|
||||||
|
y = q[1];
|
||||||
|
z = q[2];
|
||||||
|
w = q[3];
|
||||||
|
|
||||||
|
xx = s * x * x; xy = s * x * y; wx = s * w * x;
|
||||||
|
yy = s * y * y; yz = s * y * z; wy = s * w * y;
|
||||||
|
zz = s * z * z; xz = s * x * z; wz = s * w * z;
|
||||||
|
|
||||||
|
dest[0][0] = 1.0f - yy - zz;
|
||||||
|
dest[1][1] = 1.0f - xx - zz;
|
||||||
|
dest[2][2] = 1.0f - xx - yy;
|
||||||
|
|
||||||
|
dest[1][0] = xy + wz;
|
||||||
|
dest[2][1] = yz + wx;
|
||||||
|
dest[0][2] = xz + wy;
|
||||||
|
|
||||||
|
dest[0][1] = xy - wz;
|
||||||
|
dest[1][2] = yz - wx;
|
||||||
|
dest[2][0] = xz - wy;
|
||||||
|
|
||||||
|
dest[0][3] = 0.0f;
|
||||||
|
dest[1][3] = 0.0f;
|
||||||
|
dest[2][3] = 0.0f;
|
||||||
|
dest[3][0] = 0.0f;
|
||||||
|
dest[3][1] = 0.0f;
|
||||||
|
dest[3][2] = 0.0f;
|
||||||
|
dest[3][3] = 1.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief convert quaternion to mat3
|
||||||
|
*
|
||||||
|
* @param[in] q quaternion
|
||||||
|
* @param[out] dest result matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_quat_mat3(const versor q, mat3 dest) {
|
||||||
|
float w, x, y, z,
|
||||||
|
xx, yy, zz,
|
||||||
|
xy, yz, xz,
|
||||||
|
wx, wy, wz, norm, s;
|
||||||
|
|
||||||
|
norm = glm_quat_norm(q);
|
||||||
|
s = norm > 0.0f ? 2.0f / norm : 0.0f;
|
||||||
|
|
||||||
|
x = q[0];
|
||||||
|
y = q[1];
|
||||||
|
z = q[2];
|
||||||
|
w = q[3];
|
||||||
|
|
||||||
|
xx = s * x * x; xy = s * x * y; wx = s * w * x;
|
||||||
|
yy = s * y * y; yz = s * y * z; wy = s * w * y;
|
||||||
|
zz = s * z * z; xz = s * x * z; wz = s * w * z;
|
||||||
|
|
||||||
|
dest[0][0] = 1.0f - yy - zz;
|
||||||
|
dest[1][1] = 1.0f - xx - zz;
|
||||||
|
dest[2][2] = 1.0f - xx - yy;
|
||||||
|
|
||||||
|
dest[0][1] = xy + wz;
|
||||||
|
dest[1][2] = yz + wx;
|
||||||
|
dest[2][0] = xz + wy;
|
||||||
|
|
||||||
|
dest[1][0] = xy - wz;
|
||||||
|
dest[2][1] = yz - wx;
|
||||||
|
dest[0][2] = xz - wy;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief convert quaternion to mat3 (transposed)
|
||||||
|
*
|
||||||
|
* @param[in] q quaternion
|
||||||
|
* @param[out] dest result matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_quat_mat3t(const versor q, mat3 dest) {
|
||||||
|
float w, x, y, z,
|
||||||
|
xx, yy, zz,
|
||||||
|
xy, yz, xz,
|
||||||
|
wx, wy, wz, norm, s;
|
||||||
|
|
||||||
|
norm = glm_quat_norm(q);
|
||||||
|
s = norm > 0.0f ? 2.0f / norm : 0.0f;
|
||||||
|
|
||||||
|
x = q[0];
|
||||||
|
y = q[1];
|
||||||
|
z = q[2];
|
||||||
|
w = q[3];
|
||||||
|
|
||||||
|
xx = s * x * x; xy = s * x * y; wx = s * w * x;
|
||||||
|
yy = s * y * y; yz = s * y * z; wy = s * w * y;
|
||||||
|
zz = s * z * z; xz = s * x * z; wz = s * w * z;
|
||||||
|
|
||||||
|
dest[0][0] = 1.0f - yy - zz;
|
||||||
|
dest[1][1] = 1.0f - xx - zz;
|
||||||
|
dest[2][2] = 1.0f - xx - yy;
|
||||||
|
|
||||||
|
dest[1][0] = xy + wz;
|
||||||
|
dest[2][1] = yz + wx;
|
||||||
|
dest[0][2] = xz + wy;
|
||||||
|
|
||||||
|
dest[0][1] = xy - wz;
|
||||||
|
dest[1][2] = yz - wx;
|
||||||
|
dest[2][0] = xz - wy;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief interpolates between two quaternions
|
||||||
|
* using linear interpolation (LERP)
|
||||||
|
*
|
||||||
|
* @param[in] from from
|
||||||
|
* @param[in] to to
|
||||||
|
* @param[in] t interpolant (amount) clamped between 0 and 1
|
||||||
|
* @param[out] dest result quaternion
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_quat_lerp(const versor from, const versor to, float t, versor dest) {
|
||||||
|
glm_vec4_lerp(from, to, t, dest);
|
||||||
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief interpolates between two quaternions
|
* @brief interpolates between two quaternions
|
||||||
* using spherical linear interpolation (SLERP)
|
* using spherical linear interpolation (SLERP)
|
||||||
*
|
*
|
||||||
* @param[in] q from
|
* @param[in] from from
|
||||||
* @param[in] r to
|
* @param[in] to to
|
||||||
* @param[in] t amout
|
* @param[in] t amout
|
||||||
* @param[out] dest result quaternion
|
* @param[out] dest result quaternion
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_quat_slerp(versor q,
|
glm_quat_slerp(const versor from, const versor to, float t, versor dest) {
|
||||||
versor r,
|
CGLM_ALIGN(16) vec4 q1, q2;
|
||||||
float t,
|
float cosTheta, sinTheta, angle;
|
||||||
versor dest) {
|
|
||||||
/* https://en.wikipedia.org/wiki/Slerp */
|
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
|
||||||
glm_quat_slerp_sse2(q, r, t, dest);
|
|
||||||
#else
|
|
||||||
float cosTheta, sinTheta, angle, a, b, c;
|
|
||||||
|
|
||||||
cosTheta = glm_quat_dot(q, r);
|
cosTheta = glm_quat_dot(from, to);
|
||||||
if (cosTheta < 0.0f) {
|
glm_quat_copy(from, q1);
|
||||||
q[0] *= -1.0f;
|
|
||||||
q[1] *= -1.0f;
|
|
||||||
q[2] *= -1.0f;
|
|
||||||
q[3] *= -1.0f;
|
|
||||||
|
|
||||||
cosTheta = -cosTheta;
|
if (fabsf(cosTheta) >= 1.0f) {
|
||||||
}
|
glm_quat_copy(q1, dest);
|
||||||
|
|
||||||
if (fabs(cosTheta) >= 1.0f) {
|
|
||||||
dest[0] = q[0];
|
|
||||||
dest[1] = q[1];
|
|
||||||
dest[2] = q[2];
|
|
||||||
dest[3] = q[3];
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
sinTheta = sqrt(1.0f - cosTheta * cosTheta);
|
if (cosTheta < 0.0f) {
|
||||||
|
glm_vec4_negate(q1);
|
||||||
|
cosTheta = -cosTheta;
|
||||||
|
}
|
||||||
|
|
||||||
c = 1.0f - t;
|
sinTheta = sqrtf(1.0f - cosTheta * cosTheta);
|
||||||
|
|
||||||
/* LERP */
|
/* LERP to avoid zero division */
|
||||||
/* TODO: FLT_EPSILON vs 0.001? */
|
if (fabsf(sinTheta) < 0.001f) {
|
||||||
if (sinTheta < 0.001f) {
|
glm_quat_lerp(from, to, t, dest);
|
||||||
dest[0] = c * q[0] + t * r[0];
|
|
||||||
dest[1] = c * q[1] + t * r[1];
|
|
||||||
dest[2] = c * q[2] + t * r[2];
|
|
||||||
dest[3] = c * q[3] + t * r[3];
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* SLERP */
|
/* SLERP */
|
||||||
angle = acosf(cosTheta);
|
angle = acosf(cosTheta);
|
||||||
a = sinf(c * angle);
|
glm_vec4_scale(q1, sinf((1.0f - t) * angle), q1);
|
||||||
b = sinf(t * angle);
|
glm_vec4_scale(to, sinf(t * angle), q2);
|
||||||
|
|
||||||
dest[0] = (q[0] * a + r[0] * b) / sinTheta;
|
glm_vec4_add(q1, q2, q1);
|
||||||
dest[1] = (q[1] * a + r[1] * b) / sinTheta;
|
glm_vec4_scale(q1, 1.0f / sinTheta, dest);
|
||||||
dest[2] = (q[2] * a + r[2] * b) / sinTheta;
|
}
|
||||||
dest[3] = (q[3] * a + r[3] * b) / sinTheta;
|
|
||||||
#endif
|
/*!
|
||||||
|
* @brief creates view matrix using quaternion as camera orientation
|
||||||
|
*
|
||||||
|
* @param[in] eye eye
|
||||||
|
* @param[in] ori orientation in world space as quaternion
|
||||||
|
* @param[out] dest view matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_quat_look(const vec3 eye, const versor ori, mat4 dest) {
|
||||||
|
/* orientation */
|
||||||
|
glm_quat_mat4t(ori, dest);
|
||||||
|
|
||||||
|
/* translate */
|
||||||
|
glm_mat4_mulv3(dest, eye, 1.0f, dest[3]);
|
||||||
|
glm_vec3_negate(dest[3]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief creates look rotation quaternion
|
||||||
|
*
|
||||||
|
* @param[in] dir direction to look
|
||||||
|
* @param[in] fwd forward vector
|
||||||
|
* @param[in] up up vector
|
||||||
|
* @param[out] dest destination quaternion
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_quat_for(const vec3 dir, const vec3 fwd, const vec3 up, versor dest) {
|
||||||
|
CGLM_ALIGN(8) vec3 axis;
|
||||||
|
float dot, angle;
|
||||||
|
|
||||||
|
dot = glm_vec3_dot(dir, fwd);
|
||||||
|
if (fabsf(dot + 1.0f) < 0.000001f) {
|
||||||
|
glm_quat_init(dest, up[0], up[1], up[2], GLM_PIf);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fabsf(dot - 1.0f) < 0.000001f) {
|
||||||
|
glm_quat_identity(dest);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
angle = acosf(dot);
|
||||||
|
glm_cross(fwd, dir, axis);
|
||||||
|
glm_normalize(axis);
|
||||||
|
|
||||||
|
glm_quatv(dest, angle, axis);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief creates look rotation quaternion using source and
|
||||||
|
* destination positions p suffix stands for position
|
||||||
|
*
|
||||||
|
* @param[in] from source point
|
||||||
|
* @param[in] to destination point
|
||||||
|
* @param[in] fwd forward vector
|
||||||
|
* @param[in] up up vector
|
||||||
|
* @param[out] dest destination quaternion
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_quat_forp(const vec3 from,
|
||||||
|
const vec3 to,
|
||||||
|
const vec3 fwd,
|
||||||
|
const vec3 up,
|
||||||
|
versor dest) {
|
||||||
|
CGLM_ALIGN(8) vec3 dir;
|
||||||
|
glm_vec3_sub(to, from, dir);
|
||||||
|
glm_quat_for(dir, fwd, up, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief rotate vector using using quaternion
|
||||||
|
*
|
||||||
|
* @param[in] q quaternion
|
||||||
|
* @param[in] v vector to rotate
|
||||||
|
* @param[out] dest rotated vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_quat_rotatev(const versor q, const vec3 v, vec3 dest) {
|
||||||
|
CGLM_ALIGN(16) versor p;
|
||||||
|
CGLM_ALIGN(8) vec3 u, v1, v2;
|
||||||
|
float s;
|
||||||
|
|
||||||
|
glm_quat_normalize_to(q, p);
|
||||||
|
glm_quat_imag(p, u);
|
||||||
|
s = glm_quat_real(p);
|
||||||
|
|
||||||
|
glm_vec3_scale(u, 2.0f * glm_vec3_dot(u, v), v1);
|
||||||
|
glm_vec3_scale(v, s * s - glm_vec3_dot(u, u), v2);
|
||||||
|
glm_vec3_add(v1, v2, v1);
|
||||||
|
|
||||||
|
glm_vec3_cross(u, v, v2);
|
||||||
|
glm_vec3_scale(v2, 2.0f * s, v2);
|
||||||
|
|
||||||
|
glm_vec3_add(v1, v2, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief rotate existing transform matrix using quaternion
|
||||||
|
*
|
||||||
|
* @param[in] m existing transform matrix
|
||||||
|
* @param[in] q quaternion
|
||||||
|
* @param[out] dest rotated matrix/transform
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_quat_rotate(const mat4 m, const versor q, mat4 dest) {
|
||||||
|
CGLM_ALIGN_MAT mat4 rot;
|
||||||
|
glm_quat_mat4(q, rot);
|
||||||
|
glm_mul_rot(m, rot, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief rotate existing transform matrix using quaternion at pivot point
|
||||||
|
*
|
||||||
|
* @param[in, out] m existing transform matrix
|
||||||
|
* @param[in] q quaternion
|
||||||
|
* @param[out] pivot pivot
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_quat_rotate_at(mat4 m, const versor q, const vec3 pivot) {
|
||||||
|
CGLM_ALIGN(8) vec3 pivotInv;
|
||||||
|
|
||||||
|
glm_vec3_negate_to(pivot, pivotInv);
|
||||||
|
|
||||||
|
glm_translate(m, pivot);
|
||||||
|
glm_quat_rotate(m, q, m);
|
||||||
|
glm_translate(m, pivotInv);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief 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.
|
||||||
|
*
|
||||||
|
* @param[out] m existing transform matrix
|
||||||
|
* @param[in] q quaternion
|
||||||
|
* @param[in] pivot pivot
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_quat_rotate_atm(mat4 m, const versor q, const vec3 pivot) {
|
||||||
|
CGLM_ALIGN(8) vec3 pivotInv;
|
||||||
|
|
||||||
|
glm_vec3_negate_to(pivot, pivotInv);
|
||||||
|
|
||||||
|
glm_translate_make(m, pivot);
|
||||||
|
glm_quat_rotate(m, q, m);
|
||||||
|
glm_translate(m, pivotInv);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* cglm_quat_h */
|
#endif /* cglm_quat_h */
|
||||||
|
|||||||
41
include/cglm/simd/arm.h
Normal file
41
include/cglm/simd/arm.h
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglm_simd_arm_h
|
||||||
|
#define cglm_simd_arm_h
|
||||||
|
#include "intrin.h"
|
||||||
|
#ifdef CGLM_SIMD_ARM
|
||||||
|
|
||||||
|
#define glmm_load(p) vld1q_f32(p)
|
||||||
|
#define glmm_store(p, a) vst1q_f32(p, a)
|
||||||
|
|
||||||
|
static inline
|
||||||
|
float
|
||||||
|
glmm_hadd(float32x4_t v) {
|
||||||
|
#if defined(__aarch64__)
|
||||||
|
return vaddvq_f32(v);
|
||||||
|
#else
|
||||||
|
v = vaddq_f32(v, vrev64q_f32(v));
|
||||||
|
v = vaddq_f32(v, vcombine_f32(vget_high_f32(v), vget_low_f32(v)));
|
||||||
|
return vgetq_lane_f32(v, 0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
float
|
||||||
|
glmm_dot(float32x4_t a, float32x4_t b) {
|
||||||
|
return glmm_hadd(vmulq_f32(a, b));
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
float
|
||||||
|
glmm_norm(float32x4_t a) {
|
||||||
|
return sqrtf(glmm_dot(a, a));
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif /* cglm_simd_arm_h */
|
||||||
@@ -16,32 +16,35 @@
|
|||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mul_avx(mat4 m1, mat4 m2, mat4 dest) {
|
glm_mul_avx(const mat4 m1, const mat4 m2, mat4 dest) {
|
||||||
/* D = R * L (Column-Major) */
|
/* D = R * L (Column-Major) */
|
||||||
|
|
||||||
__m256 y0, y1, y2, y3, y4, y5, y6, y7, y8, y9;
|
__m256 y0, y1, y2, y3, y4, y5, y6, y7, y8, y9;
|
||||||
|
|
||||||
y0 = _mm256_load_ps(m2[0]); /* h g f e d c b a */
|
y0 = glmm_load256(m2[0]); /* h g f e d c b a */
|
||||||
y1 = _mm256_load_ps(m2[2]); /* p o n m l k j i */
|
y1 = glmm_load256(m2[2]); /* p o n m l k j i */
|
||||||
|
|
||||||
y2 = _mm256_load_ps(m1[0]); /* h g f e d c b a */
|
y2 = glmm_load256(m1[0]); /* h g f e d c b a */
|
||||||
y3 = _mm256_load_ps(m1[2]); /* p o n m l k j i */
|
y3 = glmm_load256(m1[2]); /* p o n m l k j i */
|
||||||
|
|
||||||
y4 = _mm256_permute2f128_ps(y2, y2, 0b00000011); /* d c b a h g f e */
|
/* 0x03: 0b00000011 */
|
||||||
y5 = _mm256_permute2f128_ps(y3, y3, 0b00000000); /* l k j i l k j i */
|
y4 = _mm256_permute2f128_ps(y2, y2, 0x03); /* d c b a h g f e */
|
||||||
|
y5 = _mm256_permute2f128_ps(y3, y3, 0x03); /* l k j i p o n m */
|
||||||
|
|
||||||
/* f f f f a a a a */
|
/* f f f f a a a a */
|
||||||
/* g g g g c c c c */
|
/* h h h h c c c c */
|
||||||
/* e e e e b b b b */
|
/* e e e e b b b b */
|
||||||
y7 = _mm256_permute_ps(y0, 0b10101010);
|
/* g g g g d d d d */
|
||||||
y6 = _mm256_permutevar_ps(y0, _mm256_set_epi32(1, 1, 1, 1, 0, 0, 0, 0));
|
y6 = _mm256_permutevar_ps(y0, _mm256_set_epi32(1, 1, 1, 1, 0, 0, 0, 0));
|
||||||
|
y7 = _mm256_permutevar_ps(y0, _mm256_set_epi32(3, 3, 3, 3, 2, 2, 2, 2));
|
||||||
y8 = _mm256_permutevar_ps(y0, _mm256_set_epi32(0, 0, 0, 0, 1, 1, 1, 1));
|
y8 = _mm256_permutevar_ps(y0, _mm256_set_epi32(0, 0, 0, 0, 1, 1, 1, 1));
|
||||||
|
y9 = _mm256_permutevar_ps(y0, _mm256_set_epi32(2, 2, 2, 2, 3, 3, 3, 3));
|
||||||
|
|
||||||
_mm256_store_ps(dest[0],
|
glmm_store256(dest[0],
|
||||||
_mm256_add_ps(_mm256_add_ps(_mm256_mul_ps(y2, y6),
|
_mm256_add_ps(_mm256_add_ps(_mm256_mul_ps(y2, y6),
|
||||||
_mm256_mul_ps(y4, y8)),
|
_mm256_mul_ps(y3, y7)),
|
||||||
_mm256_mul_ps(y5, y7)));
|
_mm256_add_ps(_mm256_mul_ps(y4, y8),
|
||||||
|
_mm256_mul_ps(y5, y9))));
|
||||||
|
|
||||||
/* n n n n i i i i */
|
/* n n n n i i i i */
|
||||||
/* p p p p k k k k */
|
/* p p p p k k k k */
|
||||||
@@ -52,11 +55,11 @@ glm_mul_avx(mat4 m1, mat4 m2, mat4 dest) {
|
|||||||
y8 = _mm256_permutevar_ps(y1, _mm256_set_epi32(0, 0, 0, 0, 1, 1, 1, 1));
|
y8 = _mm256_permutevar_ps(y1, _mm256_set_epi32(0, 0, 0, 0, 1, 1, 1, 1));
|
||||||
y9 = _mm256_permutevar_ps(y1, _mm256_set_epi32(2, 2, 2, 2, 3, 3, 3, 3));
|
y9 = _mm256_permutevar_ps(y1, _mm256_set_epi32(2, 2, 2, 2, 3, 3, 3, 3));
|
||||||
|
|
||||||
_mm256_store_ps(dest[2],
|
glmm_store256(dest[2],
|
||||||
_mm256_add_ps(_mm256_add_ps(_mm256_mul_ps(y2, y6),
|
_mm256_add_ps(_mm256_add_ps(_mm256_mul_ps(y2, y6),
|
||||||
_mm256_mul_ps(y3, y7)),
|
_mm256_mul_ps(y3, y7)),
|
||||||
_mm256_add_ps(_mm256_mul_ps(y4, y8),
|
_mm256_add_ps(_mm256_mul_ps(y4, y8),
|
||||||
_mm256_mul_ps(y5, y9))));
|
_mm256_mul_ps(y5, y9))));
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -16,19 +16,20 @@
|
|||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat4_mul_avx(mat4 m1, mat4 m2, mat4 dest) {
|
glm_mat4_mul_avx(const mat4 m1, const mat4 m2, mat4 dest) {
|
||||||
/* D = R * L (Column-Major) */
|
/* D = R * L (Column-Major) */
|
||||||
|
|
||||||
__m256 y0, y1, y2, y3, y4, y5, y6, y7, y8, y9;
|
__m256 y0, y1, y2, y3, y4, y5, y6, y7, y8, y9;
|
||||||
|
|
||||||
y0 = _mm256_load_ps(m2[0]); /* h g f e d c b a */
|
y0 = glmm_load256(m2[0]); /* h g f e d c b a */
|
||||||
y1 = _mm256_load_ps(m2[2]); /* p o n m l k j i */
|
y1 = glmm_load256(m2[2]); /* p o n m l k j i */
|
||||||
|
|
||||||
y2 = _mm256_load_ps(m1[0]); /* h g f e d c b a */
|
y2 = glmm_load256(m1[0]); /* h g f e d c b a */
|
||||||
y3 = _mm256_load_ps(m1[2]); /* p o n m l k j i */
|
y3 = glmm_load256(m1[2]); /* p o n m l k j i */
|
||||||
|
|
||||||
y4 = _mm256_permute2f128_ps(y2, y2, 0b00000011); /* d c b a h g f e */
|
/* 0x03: 0b00000011 */
|
||||||
y5 = _mm256_permute2f128_ps(y3, y3, 0b00000011); /* l k j i p o n m */
|
y4 = _mm256_permute2f128_ps(y2, y2, 0x03); /* d c b a h g f e */
|
||||||
|
y5 = _mm256_permute2f128_ps(y3, y3, 0x03); /* l k j i p o n m */
|
||||||
|
|
||||||
/* f f f f a a a a */
|
/* f f f f a a a a */
|
||||||
/* h h h h c c c c */
|
/* h h h h c c c c */
|
||||||
@@ -39,11 +40,11 @@ glm_mat4_mul_avx(mat4 m1, mat4 m2, mat4 dest) {
|
|||||||
y8 = _mm256_permutevar_ps(y0, _mm256_set_epi32(0, 0, 0, 0, 1, 1, 1, 1));
|
y8 = _mm256_permutevar_ps(y0, _mm256_set_epi32(0, 0, 0, 0, 1, 1, 1, 1));
|
||||||
y9 = _mm256_permutevar_ps(y0, _mm256_set_epi32(2, 2, 2, 2, 3, 3, 3, 3));
|
y9 = _mm256_permutevar_ps(y0, _mm256_set_epi32(2, 2, 2, 2, 3, 3, 3, 3));
|
||||||
|
|
||||||
_mm256_store_ps(dest[0],
|
glmm_store256(dest[0],
|
||||||
_mm256_add_ps(_mm256_add_ps(_mm256_mul_ps(y2, y6),
|
_mm256_add_ps(_mm256_add_ps(_mm256_mul_ps(y2, y6),
|
||||||
_mm256_mul_ps(y3, y7)),
|
_mm256_mul_ps(y3, y7)),
|
||||||
_mm256_add_ps(_mm256_mul_ps(y4, y8),
|
_mm256_add_ps(_mm256_mul_ps(y4, y8),
|
||||||
_mm256_mul_ps(y5, y9))));
|
_mm256_mul_ps(y5, y9))));
|
||||||
|
|
||||||
/* n n n n i i i i */
|
/* n n n n i i i i */
|
||||||
/* p p p p k k k k */
|
/* p p p p k k k k */
|
||||||
@@ -54,11 +55,11 @@ glm_mat4_mul_avx(mat4 m1, mat4 m2, mat4 dest) {
|
|||||||
y8 = _mm256_permutevar_ps(y1, _mm256_set_epi32(0, 0, 0, 0, 1, 1, 1, 1));
|
y8 = _mm256_permutevar_ps(y1, _mm256_set_epi32(0, 0, 0, 0, 1, 1, 1, 1));
|
||||||
y9 = _mm256_permutevar_ps(y1, _mm256_set_epi32(2, 2, 2, 2, 3, 3, 3, 3));
|
y9 = _mm256_permutevar_ps(y1, _mm256_set_epi32(2, 2, 2, 2, 3, 3, 3, 3));
|
||||||
|
|
||||||
_mm256_store_ps(dest[2],
|
glmm_store256(dest[2],
|
||||||
_mm256_add_ps(_mm256_add_ps(_mm256_mul_ps(y2, y6),
|
_mm256_add_ps(_mm256_add_ps(_mm256_mul_ps(y2, y6),
|
||||||
_mm256_mul_ps(y3, y7)),
|
_mm256_mul_ps(y3, y7)),
|
||||||
_mm256_add_ps(_mm256_mul_ps(y4, y8),
|
_mm256_add_ps(_mm256_mul_ps(y4, y8),
|
||||||
_mm256_mul_ps(y5, y9))));
|
_mm256_mul_ps(y5, y9))));
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -8,45 +8,83 @@
|
|||||||
#ifndef cglm_intrin_h
|
#ifndef cglm_intrin_h
|
||||||
#define cglm_intrin_h
|
#define cglm_intrin_h
|
||||||
|
|
||||||
#if defined( _WIN32 )
|
#if defined( _MSC_VER )
|
||||||
# if (defined(_M_AMD64) || defined(_M_X64)) || _M_IX86_FP == 2
|
# if (defined(_M_AMD64) || defined(_M_X64)) || _M_IX86_FP == 2
|
||||||
# define __SSE2__
|
# ifndef __SSE2__
|
||||||
|
# define __SSE2__
|
||||||
|
# endif
|
||||||
# elif _M_IX86_FP == 1
|
# elif _M_IX86_FP == 1
|
||||||
# define __SSE__
|
# ifndef __SSE__
|
||||||
|
# define __SSE__
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
/* do not use alignment for older visual studio versions */
|
||||||
|
# if _MSC_VER < 1913 /* Visual Studio 2017 version 15.6 */
|
||||||
|
# define CGLM_ALL_UNALIGNED
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
# include <xmmintrin.h>
|
# include <xmmintrin.h>
|
||||||
# include <emmintrin.h>
|
# include <emmintrin.h>
|
||||||
|
# define CGLM_SSE_FP 1
|
||||||
/* float */
|
# ifndef CGLM_SIMD_x86
|
||||||
# define _mm_shuffle1_ps(a, z, y, x, w) \
|
# define CGLM_SIMD_x86
|
||||||
_mm_shuffle_ps(a, a, _MM_SHUFFLE(z, y, x, w))
|
# endif
|
||||||
|
|
||||||
# define _mm_shuffle1_ps1(a, x) \
|
|
||||||
_mm_shuffle_ps(a, a, _MM_SHUFFLE(x, x, x, x))
|
|
||||||
|
|
||||||
# define _mm_shuffle2_ps(a, b, z0, y0, x0, w0, z1, y1, x1, w1) \
|
|
||||||
_mm_shuffle1_ps(_mm_shuffle_ps(a, b, _MM_SHUFFLE(z0, y0, x0, w0)), \
|
|
||||||
z1, y1, x1, w1)
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* x86, x64 */
|
#if defined(__SSE3__)
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
# include <x86intrin.h>
|
||||||
# define CGLM_SSE_FP 1
|
# ifndef CGLM_SIMD_x86
|
||||||
|
# define CGLM_SIMD_x86
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__SSE4_1__)
|
||||||
|
# include <smmintrin.h>
|
||||||
|
# ifndef CGLM_SIMD_x86
|
||||||
|
# define CGLM_SIMD_x86
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__SSE4_2__)
|
||||||
|
# include <nmmintrin.h>
|
||||||
|
# ifndef CGLM_SIMD_x86
|
||||||
|
# define CGLM_SIMD_x86
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __AVX__
|
#ifdef __AVX__
|
||||||
|
# include <immintrin.h>
|
||||||
# define CGLM_AVX_FP 1
|
# define CGLM_AVX_FP 1
|
||||||
|
# ifndef CGLM_SIMD_x86
|
||||||
|
# define CGLM_SIMD_x86
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* ARM Neon */
|
/* ARM Neon */
|
||||||
#if defined(__ARM_NEON) && defined(__ARM_NEON_FP)
|
#if defined(__ARM_NEON)
|
||||||
# include <arm_neon.h>
|
# include <arm_neon.h>
|
||||||
# define CGLM_NEON_FP 1
|
# if defined(__ARM_NEON_FP)
|
||||||
#else
|
# define CGLM_NEON_FP 1
|
||||||
# undef CGLM_NEON_FP
|
# ifndef CGLM_SIMD_ARM
|
||||||
|
# define CGLM_SIMD_ARM
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CGLM_SIMD_x86) || defined(CGLM_NEON_FP)
|
||||||
|
# ifndef CGLM_SIMD
|
||||||
|
# define CGLM_SIMD
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CGLM_SIMD_x86)
|
||||||
|
# include "x86.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CGLM_SIMD_ARM)
|
||||||
|
# include "arm.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* cglm_intrin_h */
|
#endif /* cglm_intrin_h */
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat4_mul_neon(mat4 m1, mat4 m2, mat4 dest) {
|
glm_mat4_mul_neon(const mat4 m1, const mat4 m2, mat4 dest) {
|
||||||
/* D = R * L (Column-Major) */
|
/* D = R * L (Column-Major) */
|
||||||
float32x4_t l0, l1, l2, l3, r, d0, d1, d2, d3;
|
float32x4_t l0, l1, l2, l3, r, d0, d1, d2, d3;
|
||||||
|
|
||||||
|
|||||||
@@ -14,39 +14,71 @@
|
|||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mul_sse2(mat4 m1, mat4 m2, mat4 dest) {
|
glm_mul_sse2(const mat4 m1, const mat4 m2, mat4 dest) {
|
||||||
/* D = R * L (Column-Major) */
|
/* D = R * L (Column-Major) */
|
||||||
__m128 l0, l1, l2, l3, r;
|
__m128 l0, l1, l2, l3, r;
|
||||||
|
|
||||||
l0 = _mm_load_ps(m1[0]);
|
l0 = glmm_load(m1[0]);
|
||||||
l1 = _mm_load_ps(m1[1]);
|
l1 = glmm_load(m1[1]);
|
||||||
l2 = _mm_load_ps(m1[2]);
|
l2 = glmm_load(m1[2]);
|
||||||
l3 = _mm_load_ps(m1[3]);
|
l3 = glmm_load(m1[3]);
|
||||||
|
|
||||||
r = _mm_load_ps(m2[0]);
|
r = glmm_load(m2[0]);
|
||||||
_mm_store_ps(dest[0],
|
glmm_store(dest[0],
|
||||||
_mm_add_ps(_mm_add_ps(_mm_mul_ps(_mm_shuffle1_ps1(r, 0), l0),
|
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 0), l0),
|
||||||
_mm_mul_ps(_mm_shuffle1_ps1(r, 1), l1)),
|
_mm_mul_ps(glmm_shuff1x(r, 1), l1)),
|
||||||
_mm_mul_ps(_mm_shuffle1_ps1(r, 2), l2)));
|
_mm_mul_ps(glmm_shuff1x(r, 2), l2)));
|
||||||
|
|
||||||
r = _mm_load_ps(m2[1]);
|
r = glmm_load(m2[1]);
|
||||||
_mm_store_ps(dest[1],
|
glmm_store(dest[1],
|
||||||
_mm_add_ps(_mm_add_ps(_mm_mul_ps(_mm_shuffle1_ps1(r, 0), l0),
|
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 0), l0),
|
||||||
_mm_mul_ps(_mm_shuffle1_ps1(r, 1), l1)),
|
_mm_mul_ps(glmm_shuff1x(r, 1), l1)),
|
||||||
_mm_mul_ps(_mm_shuffle1_ps1(r, 2), l2)));
|
_mm_mul_ps(glmm_shuff1x(r, 2), l2)));
|
||||||
|
|
||||||
r = _mm_load_ps(m2[2]);
|
r = glmm_load(m2[2]);
|
||||||
_mm_store_ps(dest[2],
|
glmm_store(dest[2],
|
||||||
_mm_add_ps(_mm_add_ps(_mm_mul_ps(_mm_shuffle1_ps1(r, 0), l0),
|
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 0), l0),
|
||||||
_mm_mul_ps(_mm_shuffle1_ps1(r, 1), l1)),
|
_mm_mul_ps(glmm_shuff1x(r, 1), l1)),
|
||||||
_mm_mul_ps(_mm_shuffle1_ps1(r, 2), l2)));
|
_mm_mul_ps(glmm_shuff1x(r, 2), l2)));
|
||||||
|
|
||||||
r = _mm_load_ps(m2[3]);
|
r = glmm_load(m2[3]);
|
||||||
_mm_store_ps(dest[3],
|
glmm_store(dest[3],
|
||||||
_mm_add_ps(_mm_add_ps(_mm_mul_ps(_mm_shuffle1_ps1(r, 0), l0),
|
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 0), l0),
|
||||||
_mm_mul_ps(_mm_shuffle1_ps1(r, 1), l1)),
|
_mm_mul_ps(glmm_shuff1x(r, 1), l1)),
|
||||||
_mm_add_ps(_mm_mul_ps(_mm_shuffle1_ps1(r, 2), l2),
|
_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 2), l2),
|
||||||
_mm_mul_ps(_mm_shuffle1_ps1(r, 3), l3))));
|
_mm_mul_ps(glmm_shuff1x(r, 3), l3))));
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mul_rot_sse2(const mat4 m1, const mat4 m2, mat4 dest) {
|
||||||
|
/* D = R * L (Column-Major) */
|
||||||
|
__m128 l0, l1, l2, l3, r;
|
||||||
|
|
||||||
|
l0 = glmm_load(m1[0]);
|
||||||
|
l1 = glmm_load(m1[1]);
|
||||||
|
l2 = glmm_load(m1[2]);
|
||||||
|
l3 = glmm_load(m1[3]);
|
||||||
|
|
||||||
|
r = glmm_load(m2[0]);
|
||||||
|
glmm_store(dest[0],
|
||||||
|
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 0), l0),
|
||||||
|
_mm_mul_ps(glmm_shuff1x(r, 1), l1)),
|
||||||
|
_mm_mul_ps(glmm_shuff1x(r, 2), l2)));
|
||||||
|
|
||||||
|
r = glmm_load(m2[1]);
|
||||||
|
glmm_store(dest[1],
|
||||||
|
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 0), l0),
|
||||||
|
_mm_mul_ps(glmm_shuff1x(r, 1), l1)),
|
||||||
|
_mm_mul_ps(glmm_shuff1x(r, 2), l2)));
|
||||||
|
|
||||||
|
r = glmm_load(m2[2]);
|
||||||
|
glmm_store(dest[2],
|
||||||
|
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 0), l0),
|
||||||
|
_mm_mul_ps(glmm_shuff1x(r, 1), l1)),
|
||||||
|
_mm_mul_ps(glmm_shuff1x(r, 2), l2)));
|
||||||
|
|
||||||
|
glmm_store(dest[3], l3);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
@@ -54,25 +86,25 @@ void
|
|||||||
glm_inv_tr_sse2(mat4 mat) {
|
glm_inv_tr_sse2(mat4 mat) {
|
||||||
__m128 r0, r1, r2, r3, x0, x1;
|
__m128 r0, r1, r2, r3, x0, x1;
|
||||||
|
|
||||||
r0 = _mm_load_ps(mat[0]);
|
r0 = glmm_load(mat[0]);
|
||||||
r1 = _mm_load_ps(mat[1]);
|
r1 = glmm_load(mat[1]);
|
||||||
r2 = _mm_load_ps(mat[2]);
|
r2 = glmm_load(mat[2]);
|
||||||
r3 = _mm_load_ps(mat[3]);
|
r3 = glmm_load(mat[3]);
|
||||||
x1 = _mm_set_ps(1.0f, 0.0f, 0.0f, 0.0f);
|
x1 = _mm_set_ps(1.0f, 0.0f, 0.0f, 0.0f);
|
||||||
|
|
||||||
_MM_TRANSPOSE4_PS(r0, r1, r2, x1);
|
_MM_TRANSPOSE4_PS(r0, r1, r2, x1);
|
||||||
|
|
||||||
x0 = _mm_add_ps(_mm_mul_ps(r0, _mm_shuffle1_ps(r3, 0, 0, 0, 0)),
|
x0 = _mm_add_ps(_mm_mul_ps(r0, glmm_shuff1(r3, 0, 0, 0, 0)),
|
||||||
_mm_mul_ps(r1, _mm_shuffle1_ps(r3, 1, 1, 1, 1)));
|
_mm_mul_ps(r1, glmm_shuff1(r3, 1, 1, 1, 1)));
|
||||||
x0 = _mm_add_ps(x0, _mm_mul_ps(r2, _mm_shuffle1_ps(r3, 2, 2, 2, 2)));
|
x0 = _mm_add_ps(x0, _mm_mul_ps(r2, glmm_shuff1(r3, 2, 2, 2, 2)));
|
||||||
x0 = _mm_xor_ps(x0, _mm_set1_ps(-0.f));
|
x0 = _mm_xor_ps(x0, _mm_set1_ps(-0.f));
|
||||||
|
|
||||||
x0 = _mm_add_ps(x0, x1);
|
x0 = _mm_add_ps(x0, x1);
|
||||||
|
|
||||||
_mm_store_ps(mat[0], r0);
|
glmm_store(mat[0], r0);
|
||||||
_mm_store_ps(mat[1], r1);
|
glmm_store(mat[1], r1);
|
||||||
_mm_store_ps(mat[2], r2);
|
glmm_store(mat[2], r2);
|
||||||
_mm_store_ps(mat[3], x0);
|
glmm_store(mat[3], x0);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat3_mul_sse2(mat3 m1, mat3 m2, mat3 dest) {
|
glm_mat3_mul_sse2(const mat3 m1, const mat3 m2, mat3 dest) {
|
||||||
__m128 l0, l1, l2;
|
__m128 l0, l1, l2;
|
||||||
__m128 r0, r1, r2;
|
__m128 r0, r1, r2;
|
||||||
__m128 x0, x1, x2;
|
__m128 x0, x1, x2;
|
||||||
@@ -27,27 +27,25 @@ glm_mat3_mul_sse2(mat3 m1, mat3 m2, mat3 dest) {
|
|||||||
r1 = _mm_loadu_ps(&m2[1][1]);
|
r1 = _mm_loadu_ps(&m2[1][1]);
|
||||||
r2 = _mm_set1_ps(m2[2][2]);
|
r2 = _mm_set1_ps(m2[2][2]);
|
||||||
|
|
||||||
x1 = _mm_shuffle2_ps(l0, l1, 1, 0, 3, 3, 0, 3, 2, 0);
|
x1 = glmm_shuff2(l0, l1, 1, 0, 3, 3, 0, 3, 2, 0);
|
||||||
x2 = _mm_shuffle2_ps(l1, l2, 0, 0, 3, 2, 0, 2, 1, 0);
|
x2 = glmm_shuff2(l1, l2, 0, 0, 3, 2, 0, 2, 1, 0);
|
||||||
|
|
||||||
x0 = _mm_add_ps(_mm_mul_ps(_mm_shuffle1_ps(l0, 0, 2, 1, 0),
|
x0 = _mm_add_ps(_mm_mul_ps(glmm_shuff1(l0, 0, 2, 1, 0),
|
||||||
_mm_shuffle1_ps(r0, 3, 0, 0, 0)),
|
glmm_shuff1(r0, 3, 0, 0, 0)),
|
||||||
_mm_mul_ps(x1,
|
_mm_mul_ps(x1, glmm_shuff2(r0, r1, 0, 0, 1, 1, 2, 0, 0, 0)));
|
||||||
_mm_shuffle2_ps(r0, r1, 0, 0, 1, 1, 2, 0, 0, 0)));
|
|
||||||
|
|
||||||
x0 = _mm_add_ps(x0,
|
x0 = _mm_add_ps(x0,
|
||||||
_mm_mul_ps(x2,
|
_mm_mul_ps(x2, glmm_shuff2(r0, r1, 1, 1, 2, 2, 2, 0, 0, 0)));
|
||||||
_mm_shuffle2_ps(r0, r1, 1, 1, 2, 2, 2, 0, 0, 0)));
|
|
||||||
|
|
||||||
_mm_storeu_ps(dest[0], x0);
|
_mm_storeu_ps(dest[0], x0);
|
||||||
|
|
||||||
x0 = _mm_add_ps(_mm_mul_ps(_mm_shuffle1_ps(l0, 1, 0, 2, 1),
|
x0 = _mm_add_ps(_mm_mul_ps(glmm_shuff1(l0, 1, 0, 2, 1),
|
||||||
_mm_shuffle_ps(r0, r1, _MM_SHUFFLE(2, 2, 3, 3))),
|
_mm_shuffle_ps(r0, r1, _MM_SHUFFLE(2, 2, 3, 3))),
|
||||||
_mm_mul_ps(_mm_shuffle1_ps(x1, 1, 0, 2, 1),
|
_mm_mul_ps(glmm_shuff1(x1, 1, 0, 2, 1),
|
||||||
_mm_shuffle1_ps(r1, 3, 3, 0, 0)));
|
glmm_shuff1(r1, 3, 3, 0, 0)));
|
||||||
|
|
||||||
x0 = _mm_add_ps(x0,
|
x0 = _mm_add_ps(x0,
|
||||||
_mm_mul_ps(_mm_shuffle1_ps(x2, 1, 0, 2, 1),
|
_mm_mul_ps(glmm_shuff1(x2, 1, 0, 2, 1),
|
||||||
_mm_shuffle_ps(r1, r2, _MM_SHUFFLE(0, 0, 1, 1))));
|
_mm_shuffle_ps(r1, r2, _MM_SHUFFLE(0, 0, 1, 1))));
|
||||||
|
|
||||||
_mm_storeu_ps(&dest[1][1], x0);
|
_mm_storeu_ps(&dest[1][1], x0);
|
||||||
|
|||||||
@@ -16,102 +16,98 @@
|
|||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat4_scale_sse2(mat4 m, float s){
|
glm_mat4_scale_sse2(mat4 m, float s) {
|
||||||
__m128 x0;
|
__m128 x0;
|
||||||
x0 = _mm_set1_ps(s);
|
x0 = _mm_set1_ps(s);
|
||||||
|
|
||||||
_mm_store_ps(m[0], _mm_mul_ps(_mm_load_ps(m[0]), x0));
|
glmm_store(m[0], _mm_mul_ps(glmm_load(m[0]), x0));
|
||||||
_mm_store_ps(m[1], _mm_mul_ps(_mm_load_ps(m[1]), x0));
|
glmm_store(m[1], _mm_mul_ps(glmm_load(m[1]), x0));
|
||||||
_mm_store_ps(m[2], _mm_mul_ps(_mm_load_ps(m[2]), x0));
|
glmm_store(m[2], _mm_mul_ps(glmm_load(m[2]), x0));
|
||||||
_mm_store_ps(m[3], _mm_mul_ps(_mm_load_ps(m[3]), x0));
|
glmm_store(m[3], _mm_mul_ps(glmm_load(m[3]), x0));
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat4_transp_sse2(mat4 m, mat4 dest){
|
glm_mat4_transp_sse2(const mat4 m, mat4 dest) {
|
||||||
__m128 r0, r1, r2, r3;
|
__m128 r0, r1, r2, r3;
|
||||||
|
|
||||||
r0 = _mm_load_ps(m[0]);
|
r0 = glmm_load(m[0]);
|
||||||
r1 = _mm_load_ps(m[1]);
|
r1 = glmm_load(m[1]);
|
||||||
r2 = _mm_load_ps(m[2]);
|
r2 = glmm_load(m[2]);
|
||||||
r3 = _mm_load_ps(m[3]);
|
r3 = glmm_load(m[3]);
|
||||||
|
|
||||||
_MM_TRANSPOSE4_PS(r0, r1, r2, r3);
|
_MM_TRANSPOSE4_PS(r0, r1, r2, r3);
|
||||||
|
|
||||||
_mm_store_ps(dest[0], r0);
|
glmm_store(dest[0], r0);
|
||||||
_mm_store_ps(dest[1], r1);
|
glmm_store(dest[1], r1);
|
||||||
_mm_store_ps(dest[2], r2);
|
glmm_store(dest[2], r2);
|
||||||
_mm_store_ps(dest[3], r3);
|
glmm_store(dest[3], r3);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat4_mul_sse2(mat4 m1, mat4 m2, mat4 dest) {
|
glm_mat4_mul_sse2(const mat4 m1, const mat4 m2, mat4 dest) {
|
||||||
/* D = R * L (Column-Major) */
|
/* D = R * L (Column-Major) */
|
||||||
|
|
||||||
__m128 l0, l1, l2, l3, r;
|
__m128 l0, l1, l2, l3, r;
|
||||||
|
|
||||||
l0 = _mm_load_ps(m1[0]);
|
l0 = glmm_load(m1[0]);
|
||||||
l1 = _mm_load_ps(m1[1]);
|
l1 = glmm_load(m1[1]);
|
||||||
l2 = _mm_load_ps(m1[2]);
|
l2 = glmm_load(m1[2]);
|
||||||
l3 = _mm_load_ps(m1[3]);
|
l3 = glmm_load(m1[3]);
|
||||||
|
|
||||||
r = _mm_load_ps(m2[0]);
|
r = glmm_load(m2[0]);
|
||||||
_mm_store_ps(dest[0],
|
glmm_store(dest[0],
|
||||||
_mm_add_ps(_mm_add_ps(_mm_mul_ps(_mm_shuffle1_ps1(r, 0), l0),
|
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 0), l0),
|
||||||
_mm_mul_ps(_mm_shuffle1_ps1(r, 1), l1)),
|
_mm_mul_ps(glmm_shuff1x(r, 1), l1)),
|
||||||
_mm_add_ps(_mm_mul_ps(_mm_shuffle1_ps1(r, 2), l2),
|
_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 2), l2),
|
||||||
_mm_mul_ps(_mm_shuffle1_ps1(r, 3), l3))));
|
_mm_mul_ps(glmm_shuff1x(r, 3), l3))));
|
||||||
r = _mm_load_ps(m2[1]);
|
r = glmm_load(m2[1]);
|
||||||
_mm_store_ps(dest[1],
|
glmm_store(dest[1],
|
||||||
_mm_add_ps(_mm_add_ps(_mm_mul_ps(_mm_shuffle1_ps1(r, 0), l0),
|
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 0), l0),
|
||||||
_mm_mul_ps(_mm_shuffle1_ps1(r, 1), l1)),
|
_mm_mul_ps(glmm_shuff1x(r, 1), l1)),
|
||||||
_mm_add_ps(_mm_mul_ps(_mm_shuffle1_ps1(r, 2), l2),
|
_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 2), l2),
|
||||||
_mm_mul_ps(_mm_shuffle1_ps1(r, 3), l3))));
|
_mm_mul_ps(glmm_shuff1x(r, 3), l3))));
|
||||||
r = _mm_load_ps(m2[2]);
|
r = glmm_load(m2[2]);
|
||||||
_mm_store_ps(dest[2],
|
glmm_store(dest[2],
|
||||||
_mm_add_ps(_mm_add_ps(_mm_mul_ps(_mm_shuffle1_ps1(r, 0), l0),
|
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 0), l0),
|
||||||
_mm_mul_ps(_mm_shuffle1_ps1(r, 1), l1)),
|
_mm_mul_ps(glmm_shuff1x(r, 1), l1)),
|
||||||
_mm_add_ps(_mm_mul_ps(_mm_shuffle1_ps1(r, 2), l2),
|
_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 2), l2),
|
||||||
_mm_mul_ps(_mm_shuffle1_ps1(r, 3), l3))));
|
_mm_mul_ps(glmm_shuff1x(r, 3), l3))));
|
||||||
|
|
||||||
r = _mm_load_ps(m2[3]);
|
r = glmm_load(m2[3]);
|
||||||
_mm_store_ps(dest[3],
|
glmm_store(dest[3],
|
||||||
_mm_add_ps(_mm_add_ps(_mm_mul_ps(_mm_shuffle1_ps1(r, 0), l0),
|
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 0), l0),
|
||||||
_mm_mul_ps(_mm_shuffle1_ps1(r, 1), l1)),
|
_mm_mul_ps(glmm_shuff1x(r, 1), l1)),
|
||||||
_mm_add_ps(_mm_mul_ps(_mm_shuffle1_ps1(r, 2), l2),
|
_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 2), l2),
|
||||||
_mm_mul_ps(_mm_shuffle1_ps1(r, 3), l3))));
|
_mm_mul_ps(glmm_shuff1x(r, 3), l3))));
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat4_mulv_sse2(mat4 m, vec4 v, vec4 dest) {
|
glm_mat4_mulv_sse2(const mat4 m, const vec4 v, vec4 dest) {
|
||||||
__m128 x0, x1, x2;
|
__m128 x0, x1, x2;
|
||||||
|
|
||||||
x0 = _mm_load_ps(v);
|
x0 = glmm_load(v);
|
||||||
x1 = _mm_add_ps(_mm_mul_ps(_mm_load_ps(m[0]),
|
x1 = _mm_add_ps(_mm_mul_ps(glmm_load(m[0]), glmm_shuff1x(x0, 0)),
|
||||||
_mm_shuffle1_ps1(x0, 0)),
|
_mm_mul_ps(glmm_load(m[1]), glmm_shuff1x(x0, 1)));
|
||||||
_mm_mul_ps(_mm_load_ps(m[1]),
|
|
||||||
_mm_shuffle1_ps1(x0, 1)));
|
|
||||||
|
|
||||||
x2 = _mm_add_ps(_mm_mul_ps(_mm_load_ps(m[2]),
|
x2 = _mm_add_ps(_mm_mul_ps(glmm_load(m[2]), glmm_shuff1x(x0, 2)),
|
||||||
_mm_shuffle1_ps1(x0, 2)),
|
_mm_mul_ps(glmm_load(m[3]), glmm_shuff1x(x0, 3)));
|
||||||
_mm_mul_ps(_mm_load_ps(m[3]),
|
|
||||||
_mm_shuffle1_ps1(x0, 3)));
|
|
||||||
|
|
||||||
_mm_store_ps(dest, _mm_add_ps(x1, x2));
|
glmm_store(dest, _mm_add_ps(x1, x2));
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
float
|
float
|
||||||
glm_mat4_det_sse2(mat4 mat) {
|
glm_mat4_det_sse2(const mat4 mat) {
|
||||||
__m128 r0, r1, r2, r3, x0, x1, x2;
|
__m128 r0, r1, r2, r3, x0, x1, x2;
|
||||||
|
|
||||||
/* 127 <- 0, [square] det(A) = det(At) */
|
/* 127 <- 0, [square] det(A) = det(At) */
|
||||||
r0 = _mm_load_ps(mat[0]); /* d c b a */
|
r0 = glmm_load(mat[0]); /* d c b a */
|
||||||
r1 = _mm_load_ps(mat[1]); /* h g f e */
|
r1 = glmm_load(mat[1]); /* h g f e */
|
||||||
r2 = _mm_load_ps(mat[2]); /* l k j i */
|
r2 = glmm_load(mat[2]); /* l k j i */
|
||||||
r3 = _mm_load_ps(mat[3]); /* p o n m */
|
r3 = glmm_load(mat[3]); /* p o n m */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
t[1] = j * p - n * l;
|
t[1] = j * p - n * l;
|
||||||
@@ -119,20 +115,20 @@ glm_mat4_det_sse2(mat4 mat) {
|
|||||||
t[3] = i * p - m * l;
|
t[3] = i * p - m * l;
|
||||||
t[4] = i * o - m * k;
|
t[4] = i * o - m * k;
|
||||||
*/
|
*/
|
||||||
x0 = _mm_sub_ps(_mm_mul_ps(_mm_shuffle1_ps(r2, 0, 0, 1, 1),
|
x0 = _mm_sub_ps(_mm_mul_ps(glmm_shuff1(r2, 0, 0, 1, 1),
|
||||||
_mm_shuffle1_ps(r3, 2, 3, 2, 3)),
|
glmm_shuff1(r3, 2, 3, 2, 3)),
|
||||||
_mm_mul_ps(_mm_shuffle1_ps(r3, 0, 0, 1, 1),
|
_mm_mul_ps(glmm_shuff1(r3, 0, 0, 1, 1),
|
||||||
_mm_shuffle1_ps(r2, 2, 3, 2, 3)));
|
glmm_shuff1(r2, 2, 3, 2, 3)));
|
||||||
/*
|
/*
|
||||||
t[0] = k * p - o * l;
|
t[0] = k * p - o * l;
|
||||||
t[0] = k * p - o * l;
|
t[0] = k * p - o * l;
|
||||||
t[5] = i * n - m * j;
|
t[5] = i * n - m * j;
|
||||||
t[5] = i * n - m * j;
|
t[5] = i * n - m * j;
|
||||||
*/
|
*/
|
||||||
x1 = _mm_sub_ps(_mm_mul_ps(_mm_shuffle1_ps(r2, 0, 0, 2, 2),
|
x1 = _mm_sub_ps(_mm_mul_ps(glmm_shuff1(r2, 0, 0, 2, 2),
|
||||||
_mm_shuffle1_ps(r3, 1, 1, 3, 3)),
|
glmm_shuff1(r3, 1, 1, 3, 3)),
|
||||||
_mm_mul_ps(_mm_shuffle1_ps(r3, 0, 0, 2, 2),
|
_mm_mul_ps(glmm_shuff1(r3, 0, 0, 2, 2),
|
||||||
_mm_shuffle1_ps(r2, 1, 1, 3, 3)));
|
glmm_shuff1(r2, 1, 1, 3, 3)));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
a * (f * t[0] - g * t[1] + h * t[2])
|
a * (f * t[0] - g * t[1] + h * t[2])
|
||||||
@@ -140,40 +136,40 @@ glm_mat4_det_sse2(mat4 mat) {
|
|||||||
+ c * (e * t[1] - f * t[3] + h * t[5])
|
+ c * (e * t[1] - f * t[3] + h * t[5])
|
||||||
- d * (e * t[2] - f * t[4] + g * t[5])
|
- d * (e * t[2] - f * t[4] + g * t[5])
|
||||||
*/
|
*/
|
||||||
x2 = _mm_sub_ps(_mm_mul_ps(_mm_shuffle1_ps(r1, 0, 0, 0, 1),
|
x2 = _mm_sub_ps(_mm_mul_ps(glmm_shuff1(r1, 0, 0, 0, 1),
|
||||||
_mm_shuffle_ps(x1, x0, _MM_SHUFFLE(1, 0, 0, 0))),
|
_mm_shuffle_ps(x1, x0, _MM_SHUFFLE(1, 0, 0, 0))),
|
||||||
_mm_mul_ps(_mm_shuffle1_ps(r1, 1, 1, 2, 2),
|
_mm_mul_ps(glmm_shuff1(r1, 1, 1, 2, 2),
|
||||||
_mm_shuffle1_ps(x0, 3, 2, 2, 0)));
|
glmm_shuff1(x0, 3, 2, 2, 0)));
|
||||||
|
|
||||||
x2 = _mm_add_ps(x2,
|
x2 = _mm_add_ps(x2,
|
||||||
_mm_mul_ps(_mm_shuffle1_ps(r1, 2, 3, 3, 3),
|
_mm_mul_ps(glmm_shuff1(r1, 2, 3, 3, 3),
|
||||||
_mm_shuffle_ps(x0, x1, _MM_SHUFFLE(2, 2, 3, 1))));
|
_mm_shuffle_ps(x0, x1, _MM_SHUFFLE(2, 2, 3, 1))));
|
||||||
x2 = _mm_xor_ps(x2, _mm_set_ps(-0.f, 0.f, -0.f, 0.f));
|
x2 = _mm_xor_ps(x2, _mm_set_ps(-0.f, 0.f, -0.f, 0.f));
|
||||||
|
|
||||||
x0 = _mm_mul_ps(r0, x2);
|
x0 = _mm_mul_ps(r0, x2);
|
||||||
x0 = _mm_add_ps(x0, _mm_shuffle1_ps(x0, 0, 1, 2, 3));
|
x0 = _mm_add_ps(x0, glmm_shuff1(x0, 0, 1, 2, 3));
|
||||||
x0 = _mm_add_ps(x0, _mm_shuffle1_ps(x0, 1, 3, 3, 1));
|
x0 = _mm_add_ps(x0, glmm_shuff1(x0, 1, 3, 3, 1));
|
||||||
|
|
||||||
return _mm_cvtss_f32(x0);
|
return _mm_cvtss_f32(x0);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat4_inv_fast_sse2(mat4 mat, mat4 dest) {
|
glm_mat4_inv_fast_sse2(const mat4 mat, mat4 dest) {
|
||||||
__m128 r0, r1, r2, r3,
|
__m128 r0, r1, r2, r3,
|
||||||
v0, v1, v2, v3,
|
v0, v1, v2, v3,
|
||||||
t0, t1, t2, t3, t4, t5,
|
t0, t1, t2, t3, t4, t5,
|
||||||
x0, x1, x2, x3, x4, x5, x6, x7;
|
x0, x1, x2, x3, x4, x5, x6, x7;
|
||||||
|
|
||||||
/* 127 <- 0 */
|
/* 127 <- 0 */
|
||||||
r0 = _mm_load_ps(mat[0]); /* d c b a */
|
r0 = glmm_load(mat[0]); /* d c b a */
|
||||||
r1 = _mm_load_ps(mat[1]); /* h g f e */
|
r1 = glmm_load(mat[1]); /* h g f e */
|
||||||
r2 = _mm_load_ps(mat[2]); /* l k j i */
|
r2 = glmm_load(mat[2]); /* l k j i */
|
||||||
r3 = _mm_load_ps(mat[3]); /* p o n m */
|
r3 = glmm_load(mat[3]); /* p o n m */
|
||||||
|
|
||||||
x0 = _mm_shuffle_ps(r2, r3, _MM_SHUFFLE(3, 2, 3, 2)); /* p o l k */
|
x0 = _mm_shuffle_ps(r2, r3, _MM_SHUFFLE(3, 2, 3, 2)); /* p o l k */
|
||||||
x1 = _mm_shuffle1_ps(x0, 1, 3, 3, 3); /* l p p p */
|
x1 = glmm_shuff1(x0, 1, 3, 3, 3); /* l p p p */
|
||||||
x2 = _mm_shuffle1_ps(x0, 0, 2, 2, 2); /* k o o o */
|
x2 = glmm_shuff1(x0, 0, 2, 2, 2); /* k o o o */
|
||||||
x0 = _mm_shuffle_ps(r2, r1, _MM_SHUFFLE(3, 3, 3, 3)); /* h h l l */
|
x0 = _mm_shuffle_ps(r2, r1, _MM_SHUFFLE(3, 3, 3, 3)); /* h h l l */
|
||||||
x3 = _mm_shuffle_ps(r2, r1, _MM_SHUFFLE(2, 2, 2, 2)); /* g g k k */
|
x3 = _mm_shuffle_ps(r2, r1, _MM_SHUFFLE(2, 2, 2, 2)); /* g g k k */
|
||||||
|
|
||||||
@@ -184,7 +180,7 @@ glm_mat4_inv_fast_sse2(mat4 mat, mat4 dest) {
|
|||||||
t0 = _mm_sub_ps(_mm_mul_ps(x3, x1), _mm_mul_ps(x2, x0));
|
t0 = _mm_sub_ps(_mm_mul_ps(x3, x1), _mm_mul_ps(x2, x0));
|
||||||
|
|
||||||
x4 = _mm_shuffle_ps(r2, r3, _MM_SHUFFLE(2, 1, 2, 1)); /* o n k j */
|
x4 = _mm_shuffle_ps(r2, r3, _MM_SHUFFLE(2, 1, 2, 1)); /* o n k j */
|
||||||
x4 = _mm_shuffle1_ps(x4, 0, 2, 2, 2); /* j n n n */
|
x4 = glmm_shuff1(x4, 0, 2, 2, 2); /* j n n n */
|
||||||
x5 = _mm_shuffle_ps(r2, r1, _MM_SHUFFLE(1, 1, 1, 1)); /* f f j j */
|
x5 = _mm_shuffle_ps(r2, r1, _MM_SHUFFLE(1, 1, 1, 1)); /* f f j j */
|
||||||
|
|
||||||
/* t1[1] = j * p - n * l;
|
/* t1[1] = j * p - n * l;
|
||||||
@@ -200,7 +196,7 @@ glm_mat4_inv_fast_sse2(mat4 mat, mat4 dest) {
|
|||||||
t2 = _mm_sub_ps(_mm_mul_ps(x5, x2), _mm_mul_ps(x4, x3));
|
t2 = _mm_sub_ps(_mm_mul_ps(x5, x2), _mm_mul_ps(x4, x3));
|
||||||
|
|
||||||
x6 = _mm_shuffle_ps(r2, r1, _MM_SHUFFLE(0, 0, 0, 0)); /* e e i i */
|
x6 = _mm_shuffle_ps(r2, r1, _MM_SHUFFLE(0, 0, 0, 0)); /* e e i i */
|
||||||
x7 = _mm_shuffle2_ps(r3, r2, 0, 0, 0, 0, 2, 0, 0, 0); /* i m m m */
|
x7 = glmm_shuff2(r3, r2, 0, 0, 0, 0, 2, 0, 0, 0); /* i m m m */
|
||||||
|
|
||||||
/* t1[3] = i * p - m * l;
|
/* t1[3] = i * p - m * l;
|
||||||
t1[3] = i * p - m * l;
|
t1[3] = i * p - m * l;
|
||||||
@@ -220,10 +216,10 @@ glm_mat4_inv_fast_sse2(mat4 mat, mat4 dest) {
|
|||||||
t3[5] = e * j - i * f; */
|
t3[5] = e * j - i * f; */
|
||||||
t5 = _mm_sub_ps(_mm_mul_ps(x6, x4), _mm_mul_ps(x7, x5));
|
t5 = _mm_sub_ps(_mm_mul_ps(x6, x4), _mm_mul_ps(x7, x5));
|
||||||
|
|
||||||
x0 = _mm_shuffle2_ps(r1, r0, 0, 0, 0, 0, 2, 2, 2, 0); /* a a a e */
|
x0 = glmm_shuff2(r1, r0, 0, 0, 0, 0, 2, 2, 2, 0); /* a a a e */
|
||||||
x1 = _mm_shuffle2_ps(r1, r0, 1, 1, 1, 1, 2, 2, 2, 0); /* b b b f */
|
x1 = glmm_shuff2(r1, r0, 1, 1, 1, 1, 2, 2, 2, 0); /* b b b f */
|
||||||
x2 = _mm_shuffle2_ps(r1, r0, 2, 2, 2, 2, 2, 2, 2, 0); /* c c c g */
|
x2 = glmm_shuff2(r1, r0, 2, 2, 2, 2, 2, 2, 2, 0); /* c c c g */
|
||||||
x3 = _mm_shuffle2_ps(r1, r0, 3, 3, 3, 3, 2, 2, 2, 0); /* d d d h */
|
x3 = glmm_shuff2(r1, r0, 3, 3, 3, 3, 2, 2, 2, 0); /* d d d h */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
dest[0][0] = f * t1[0] - g * t1[1] + h * t1[2];
|
dest[0][0] = f * t1[0] - g * t1[1] + h * t1[2];
|
||||||
@@ -271,33 +267,33 @@ glm_mat4_inv_fast_sse2(mat4 mat, mat4 dest) {
|
|||||||
x0 = _mm_shuffle_ps(x0, x1, _MM_SHUFFLE(2, 0, 2, 0));
|
x0 = _mm_shuffle_ps(x0, x1, _MM_SHUFFLE(2, 0, 2, 0));
|
||||||
|
|
||||||
x0 = _mm_mul_ps(x0, r0);
|
x0 = _mm_mul_ps(x0, r0);
|
||||||
x0 = _mm_add_ps(x0, _mm_shuffle1_ps(x0, 0, 1, 2, 3));
|
x0 = _mm_add_ps(x0, glmm_shuff1(x0, 0, 1, 2, 3));
|
||||||
x0 = _mm_add_ps(x0, _mm_shuffle1_ps(x0, 1, 0, 0, 1));
|
x0 = _mm_add_ps(x0, glmm_shuff1(x0, 1, 0, 0, 1));
|
||||||
x0 = _mm_rcp_ps(x0);
|
x0 = _mm_rcp_ps(x0);
|
||||||
|
|
||||||
_mm_store_ps(dest[0], _mm_mul_ps(v0, x0));
|
glmm_store(dest[0], _mm_mul_ps(v0, x0));
|
||||||
_mm_store_ps(dest[1], _mm_mul_ps(v1, x0));
|
glmm_store(dest[1], _mm_mul_ps(v1, x0));
|
||||||
_mm_store_ps(dest[2], _mm_mul_ps(v2, x0));
|
glmm_store(dest[2], _mm_mul_ps(v2, x0));
|
||||||
_mm_store_ps(dest[3], _mm_mul_ps(v3, x0));
|
glmm_store(dest[3], _mm_mul_ps(v3, x0));
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat4_inv_sse2(mat4 mat, mat4 dest) {
|
glm_mat4_inv_sse2(const mat4 mat, mat4 dest) {
|
||||||
__m128 r0, r1, r2, r3,
|
__m128 r0, r1, r2, r3,
|
||||||
v0, v1, v2, v3,
|
v0, v1, v2, v3,
|
||||||
t0, t1, t2, t3, t4, t5,
|
t0, t1, t2, t3, t4, t5,
|
||||||
x0, x1, x2, x3, x4, x5, x6, x7;
|
x0, x1, x2, x3, x4, x5, x6, x7;
|
||||||
|
|
||||||
/* 127 <- 0 */
|
/* 127 <- 0 */
|
||||||
r0 = _mm_load_ps(mat[0]); /* d c b a */
|
r0 = glmm_load(mat[0]); /* d c b a */
|
||||||
r1 = _mm_load_ps(mat[1]); /* h g f e */
|
r1 = glmm_load(mat[1]); /* h g f e */
|
||||||
r2 = _mm_load_ps(mat[2]); /* l k j i */
|
r2 = glmm_load(mat[2]); /* l k j i */
|
||||||
r3 = _mm_load_ps(mat[3]); /* p o n m */
|
r3 = glmm_load(mat[3]); /* p o n m */
|
||||||
|
|
||||||
x0 = _mm_shuffle_ps(r2, r3, _MM_SHUFFLE(3, 2, 3, 2)); /* p o l k */
|
x0 = _mm_shuffle_ps(r2, r3, _MM_SHUFFLE(3, 2, 3, 2)); /* p o l k */
|
||||||
x1 = _mm_shuffle1_ps(x0, 1, 3, 3, 3); /* l p p p */
|
x1 = glmm_shuff1(x0, 1, 3, 3, 3); /* l p p p */
|
||||||
x2 = _mm_shuffle1_ps(x0, 0, 2, 2, 2); /* k o o o */
|
x2 = glmm_shuff1(x0, 0, 2, 2, 2); /* k o o o */
|
||||||
x0 = _mm_shuffle_ps(r2, r1, _MM_SHUFFLE(3, 3, 3, 3)); /* h h l l */
|
x0 = _mm_shuffle_ps(r2, r1, _MM_SHUFFLE(3, 3, 3, 3)); /* h h l l */
|
||||||
x3 = _mm_shuffle_ps(r2, r1, _MM_SHUFFLE(2, 2, 2, 2)); /* g g k k */
|
x3 = _mm_shuffle_ps(r2, r1, _MM_SHUFFLE(2, 2, 2, 2)); /* g g k k */
|
||||||
|
|
||||||
@@ -308,7 +304,7 @@ glm_mat4_inv_sse2(mat4 mat, mat4 dest) {
|
|||||||
t0 = _mm_sub_ps(_mm_mul_ps(x3, x1), _mm_mul_ps(x2, x0));
|
t0 = _mm_sub_ps(_mm_mul_ps(x3, x1), _mm_mul_ps(x2, x0));
|
||||||
|
|
||||||
x4 = _mm_shuffle_ps(r2, r3, _MM_SHUFFLE(2, 1, 2, 1)); /* o n k j */
|
x4 = _mm_shuffle_ps(r2, r3, _MM_SHUFFLE(2, 1, 2, 1)); /* o n k j */
|
||||||
x4 = _mm_shuffle1_ps(x4, 0, 2, 2, 2); /* j n n n */
|
x4 = glmm_shuff1(x4, 0, 2, 2, 2); /* j n n n */
|
||||||
x5 = _mm_shuffle_ps(r2, r1, _MM_SHUFFLE(1, 1, 1, 1)); /* f f j j */
|
x5 = _mm_shuffle_ps(r2, r1, _MM_SHUFFLE(1, 1, 1, 1)); /* f f j j */
|
||||||
|
|
||||||
/* t1[1] = j * p - n * l;
|
/* t1[1] = j * p - n * l;
|
||||||
@@ -324,7 +320,7 @@ glm_mat4_inv_sse2(mat4 mat, mat4 dest) {
|
|||||||
t2 = _mm_sub_ps(_mm_mul_ps(x5, x2), _mm_mul_ps(x4, x3));
|
t2 = _mm_sub_ps(_mm_mul_ps(x5, x2), _mm_mul_ps(x4, x3));
|
||||||
|
|
||||||
x6 = _mm_shuffle_ps(r2, r1, _MM_SHUFFLE(0, 0, 0, 0)); /* e e i i */
|
x6 = _mm_shuffle_ps(r2, r1, _MM_SHUFFLE(0, 0, 0, 0)); /* e e i i */
|
||||||
x7 = _mm_shuffle2_ps(r3, r2, 0, 0, 0, 0, 2, 0, 0, 0); /* i m m m */
|
x7 = glmm_shuff2(r3, r2, 0, 0, 0, 0, 2, 0, 0, 0); /* i m m m */
|
||||||
|
|
||||||
/* t1[3] = i * p - m * l;
|
/* t1[3] = i * p - m * l;
|
||||||
t1[3] = i * p - m * l;
|
t1[3] = i * p - m * l;
|
||||||
@@ -344,10 +340,10 @@ glm_mat4_inv_sse2(mat4 mat, mat4 dest) {
|
|||||||
t3[5] = e * j - i * f; */
|
t3[5] = e * j - i * f; */
|
||||||
t5 = _mm_sub_ps(_mm_mul_ps(x6, x4), _mm_mul_ps(x7, x5));
|
t5 = _mm_sub_ps(_mm_mul_ps(x6, x4), _mm_mul_ps(x7, x5));
|
||||||
|
|
||||||
x0 = _mm_shuffle2_ps(r1, r0, 0, 0, 0, 0, 2, 2, 2, 0); /* a a a e */
|
x0 = glmm_shuff2(r1, r0, 0, 0, 0, 0, 2, 2, 2, 0); /* a a a e */
|
||||||
x1 = _mm_shuffle2_ps(r1, r0, 1, 1, 1, 1, 2, 2, 2, 0); /* b b b f */
|
x1 = glmm_shuff2(r1, r0, 1, 1, 1, 1, 2, 2, 2, 0); /* b b b f */
|
||||||
x2 = _mm_shuffle2_ps(r1, r0, 2, 2, 2, 2, 2, 2, 2, 0); /* c c c g */
|
x2 = glmm_shuff2(r1, r0, 2, 2, 2, 2, 2, 2, 2, 0); /* c c c g */
|
||||||
x3 = _mm_shuffle2_ps(r1, r0, 3, 3, 3, 3, 2, 2, 2, 0); /* d d d h */
|
x3 = glmm_shuff2(r1, r0, 3, 3, 3, 3, 2, 2, 2, 0); /* d d d h */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
dest[0][0] = f * t1[0] - g * t1[1] + h * t1[2];
|
dest[0][0] = f * t1[0] - g * t1[1] + h * t1[2];
|
||||||
@@ -395,14 +391,14 @@ glm_mat4_inv_sse2(mat4 mat, mat4 dest) {
|
|||||||
x0 = _mm_shuffle_ps(x0, x1, _MM_SHUFFLE(2, 0, 2, 0));
|
x0 = _mm_shuffle_ps(x0, x1, _MM_SHUFFLE(2, 0, 2, 0));
|
||||||
|
|
||||||
x0 = _mm_mul_ps(x0, r0);
|
x0 = _mm_mul_ps(x0, r0);
|
||||||
x0 = _mm_add_ps(x0, _mm_shuffle1_ps(x0, 0, 1, 2, 3));
|
x0 = _mm_add_ps(x0, glmm_shuff1(x0, 0, 1, 2, 3));
|
||||||
x0 = _mm_add_ps(x0, _mm_shuffle1_ps(x0, 1, 0, 0, 1));
|
x0 = _mm_add_ps(x0, glmm_shuff1(x0, 1, 0, 0, 1));
|
||||||
x0 = _mm_div_ps(_mm_set1_ps(1.0f), x0);
|
x0 = _mm_div_ps(_mm_set1_ps(1.0f), x0);
|
||||||
|
|
||||||
_mm_store_ps(dest[0], _mm_mul_ps(v0, x0));
|
glmm_store(dest[0], _mm_mul_ps(v0, x0));
|
||||||
_mm_store_ps(dest[1], _mm_mul_ps(v1, x0));
|
glmm_store(dest[1], _mm_mul_ps(v1, x0));
|
||||||
_mm_store_ps(dest[2], _mm_mul_ps(v2, x0));
|
glmm_store(dest[2], _mm_mul_ps(v2, x0));
|
||||||
_mm_store_ps(dest[3], _mm_mul_ps(v3, x0));
|
glmm_store(dest[3], _mm_mul_ps(v3, x0));
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -14,56 +14,33 @@
|
|||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_quat_slerp_sse2(versor q,
|
glm_quat_mul_sse2(const versor p, const versor q, versor dest) {
|
||||||
versor r,
|
/*
|
||||||
float t,
|
+ (a1 b2 + b1 a2 + c1 d2 − d1 c2)i
|
||||||
versor dest) {
|
+ (a1 c2 − b1 d2 + c1 a2 + d1 b2)j
|
||||||
/* https://en.wikipedia.org/wiki/Slerp */
|
+ (a1 d2 + b1 c2 − c1 b2 + d1 a2)k
|
||||||
float cosTheta, sinTheta, angle, a, b, c;
|
a1 a2 − b1 b2 − c1 c2 − d1 d2
|
||||||
|
*/
|
||||||
|
|
||||||
__m128 xmm_q;
|
__m128 xp, xq, x0, r;
|
||||||
|
|
||||||
xmm_q = _mm_load_ps(q);
|
xp = glmm_load(p); /* 3 2 1 0 */
|
||||||
|
xq = glmm_load(q);
|
||||||
|
|
||||||
cosTheta = glm_vec4_dot(q, r);
|
r = _mm_mul_ps(glmm_shuff1x(xp, 3), xq);
|
||||||
if (cosTheta < 0.0f) {
|
|
||||||
_mm_store_ps(q,
|
|
||||||
_mm_xor_ps(xmm_q,
|
|
||||||
_mm_set1_ps(-0.f))) ;
|
|
||||||
|
|
||||||
cosTheta = -cosTheta;
|
x0 = _mm_xor_ps(glmm_shuff1x(xp, 0), _mm_set_ps(-0.f, 0.f, -0.f, 0.f));
|
||||||
}
|
r = _mm_add_ps(r, _mm_mul_ps(x0, glmm_shuff1(xq, 0, 1, 2, 3)));
|
||||||
|
|
||||||
if (cosTheta >= 1.0f) {
|
x0 = _mm_xor_ps(glmm_shuff1x(xp, 1), _mm_set_ps(-0.f, -0.f, 0.f, 0.f));
|
||||||
_mm_store_ps(dest, xmm_q);
|
r = _mm_add_ps(r, _mm_mul_ps(x0, glmm_shuff1(xq, 1, 0, 3, 2)));
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
sinTheta = sqrtf(1.0f - cosTheta * cosTheta);
|
x0 = _mm_xor_ps(glmm_shuff1x(xp, 2), _mm_set_ps(-0.f, 0.f, 0.f, -0.f));
|
||||||
|
r = _mm_add_ps(r, _mm_mul_ps(x0, glmm_shuff1(xq, 2, 3, 0, 1)));
|
||||||
|
|
||||||
c = 1.0f - t;
|
glmm_store(dest, r);
|
||||||
|
|
||||||
/* LERP */
|
|
||||||
if (sinTheta < 0.001f) {
|
|
||||||
_mm_store_ps(dest, _mm_add_ps(_mm_mul_ps(_mm_set1_ps(c),
|
|
||||||
xmm_q),
|
|
||||||
_mm_mul_ps(_mm_set1_ps(t),
|
|
||||||
_mm_load_ps(r))));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* SLERP */
|
|
||||||
angle = acosf(cosTheta);
|
|
||||||
a = sinf(c * angle);
|
|
||||||
b = sinf(t * angle);
|
|
||||||
|
|
||||||
_mm_store_ps(dest,
|
|
||||||
_mm_div_ps(_mm_add_ps(_mm_mul_ps(_mm_set1_ps(a),
|
|
||||||
xmm_q),
|
|
||||||
_mm_mul_ps(_mm_set1_ps(b),
|
|
||||||
_mm_load_ps(r))),
|
|
||||||
_mm_set1_ps(sinTheta)));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
#endif /* cglm_quat_simd_h */
|
#endif /* cglm_quat_simd_h */
|
||||||
|
|||||||
136
include/cglm/simd/x86.h
Normal file
136
include/cglm/simd/x86.h
Normal file
@@ -0,0 +1,136 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglm_simd_x86_h
|
||||||
|
#define cglm_simd_x86_h
|
||||||
|
#include "intrin.h"
|
||||||
|
#ifdef CGLM_SIMD_x86
|
||||||
|
|
||||||
|
#ifdef CGLM_ALL_UNALIGNED
|
||||||
|
# define glmm_load(p) _mm_loadu_ps(p)
|
||||||
|
# define glmm_store(p, a) _mm_storeu_ps(p, a)
|
||||||
|
#else
|
||||||
|
# define glmm_load(p) _mm_load_ps(p)
|
||||||
|
# define glmm_store(p, a) _mm_store_ps(p, a)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CGLM_USE_INT_DOMAIN
|
||||||
|
# define glmm_shuff1(xmm, z, y, x, w) \
|
||||||
|
_mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(xmm), \
|
||||||
|
_MM_SHUFFLE(z, y, x, w)))
|
||||||
|
#else
|
||||||
|
# define glmm_shuff1(xmm, z, y, x, w) \
|
||||||
|
_mm_shuffle_ps(xmm, xmm, _MM_SHUFFLE(z, y, x, w))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define glmm_shuff1x(xmm, x) glmm_shuff1(xmm, x, x, x, x)
|
||||||
|
#define glmm_shuff2(a, b, z0, y0, x0, w0, z1, y1, x1, w1) \
|
||||||
|
glmm_shuff1(_mm_shuffle_ps(a, b, _MM_SHUFFLE(z0, y0, x0, w0)), \
|
||||||
|
z1, y1, x1, w1)
|
||||||
|
|
||||||
|
#ifdef __AVX__
|
||||||
|
# ifdef CGLM_ALL_UNALIGNED
|
||||||
|
# define glmm_load256(p) _mm256_loadu_ps(p)
|
||||||
|
# define glmm_store256(p, a) _mm256_storeu_ps(p, a)
|
||||||
|
# else
|
||||||
|
# define glmm_load256(p) _mm256_load_ps(p)
|
||||||
|
# define glmm_store256(p, a) _mm256_store_ps(p, a)
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static inline
|
||||||
|
__m128
|
||||||
|
glmm_vhadds(__m128 v) {
|
||||||
|
#if defined(__SSE3__)
|
||||||
|
__m128 shuf, sums;
|
||||||
|
shuf = _mm_movehdup_ps(v);
|
||||||
|
sums = _mm_add_ps(v, shuf);
|
||||||
|
shuf = _mm_movehl_ps(shuf, sums);
|
||||||
|
sums = _mm_add_ss(sums, shuf);
|
||||||
|
return sums;
|
||||||
|
#else
|
||||||
|
__m128 shuf, sums;
|
||||||
|
shuf = glmm_shuff1(v, 2, 3, 0, 1);
|
||||||
|
sums = _mm_add_ps(v, shuf);
|
||||||
|
shuf = _mm_movehl_ps(shuf, sums);
|
||||||
|
sums = _mm_add_ss(sums, shuf);
|
||||||
|
return sums;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
float
|
||||||
|
glmm_hadd(__m128 v) {
|
||||||
|
return _mm_cvtss_f32(glmm_vhadds(v));
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
__m128
|
||||||
|
glmm_vdots(__m128 a, __m128 b) {
|
||||||
|
#if (defined(__SSE4_1__) || defined(__SSE4_2__)) && defined(CGLM_SSE4_DOT)
|
||||||
|
return _mm_dp_ps(a, b, 0xFF);
|
||||||
|
#elif defined(__SSE3__) && defined(CGLM_SSE3_DOT)
|
||||||
|
__m128 x0, x1;
|
||||||
|
x0 = _mm_mul_ps(a, b);
|
||||||
|
x1 = _mm_hadd_ps(x0, x0);
|
||||||
|
return _mm_hadd_ps(x1, x1);
|
||||||
|
#else
|
||||||
|
return glmm_vhadds(_mm_mul_ps(a, b));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
__m128
|
||||||
|
glmm_vdot(__m128 a, __m128 b) {
|
||||||
|
#if (defined(__SSE4_1__) || defined(__SSE4_2__)) && defined(CGLM_SSE4_DOT)
|
||||||
|
return _mm_dp_ps(a, b, 0xFF);
|
||||||
|
#elif defined(__SSE3__) && defined(CGLM_SSE3_DOT)
|
||||||
|
__m128 x0, x1;
|
||||||
|
x0 = _mm_mul_ps(a, b);
|
||||||
|
x1 = _mm_hadd_ps(x0, x0);
|
||||||
|
return _mm_hadd_ps(x1, x1);
|
||||||
|
#else
|
||||||
|
__m128 x0;
|
||||||
|
x0 = _mm_mul_ps(a, b);
|
||||||
|
x0 = _mm_add_ps(x0, glmm_shuff1(x0, 1, 0, 3, 2));
|
||||||
|
return _mm_add_ps(x0, glmm_shuff1(x0, 0, 1, 0, 1));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
float
|
||||||
|
glmm_dot(const __m128 a, const __m128 b) {
|
||||||
|
return _mm_cvtss_f32(glmm_vdots(a, b));
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
float
|
||||||
|
glmm_norm(__m128 a) {
|
||||||
|
return _mm_cvtss_f32(_mm_sqrt_ss(glmm_vhadds(_mm_mul_ps(a, a))));
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
__m128
|
||||||
|
glmm_load3(const float v[3]) {
|
||||||
|
__m128i xy;
|
||||||
|
__m128 z;
|
||||||
|
|
||||||
|
xy = _mm_loadl_epi64((const __m128i *)v);
|
||||||
|
z = _mm_load_ss(&v[2]);
|
||||||
|
|
||||||
|
return _mm_movelh_ps(_mm_castsi128_ps(xy), z);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
void
|
||||||
|
glmm_store3(__m128 vx, float v[3]) {
|
||||||
|
_mm_storel_pi((__m64 *)&v[0], vx);
|
||||||
|
_mm_store_ss(&v[2], glmm_shuff1(vx, 2, 2, 2, 2));
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif /* cglm_simd_x86_h */
|
||||||
99
include/cglm/sphere.h
Normal file
99
include/cglm/sphere.h
Normal file
@@ -0,0 +1,99 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglm_sphere_h
|
||||||
|
#define cglm_sphere_h
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "mat4.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
Sphere Representation in cglm: [center.x, center.y, center.z, radii]
|
||||||
|
|
||||||
|
You could use this representation or you can convert it to vec4 before call
|
||||||
|
any function
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief helper for getting sphere radius
|
||||||
|
*
|
||||||
|
* @param[in] s sphere
|
||||||
|
*
|
||||||
|
* @return returns radii
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_sphere_radii(const vec4 s) {
|
||||||
|
return s[3];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief apply transform to sphere, it is just wrapper for glm_mat4_mulv3
|
||||||
|
*
|
||||||
|
* @param[in] s sphere
|
||||||
|
* @param[in] m transform matrix
|
||||||
|
* @param[out] dest transformed sphere
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_sphere_transform(const vec4 s, const mat4 m, vec4 dest) {
|
||||||
|
glm_mat4_mulv3(m, s, 1.0f, dest);
|
||||||
|
dest[3] = s[3];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief 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.
|
||||||
|
*
|
||||||
|
* @param[in] s1 sphere 1
|
||||||
|
* @param[in] s2 sphere 2
|
||||||
|
* @param[out] dest merged/extended sphere
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_sphere_merge(const vec4 s1, const vec4 s2, vec4 dest) {
|
||||||
|
float dist, radii;
|
||||||
|
|
||||||
|
dist = glm_vec3_distance(s1, s2);
|
||||||
|
radii = dist + s1[3] + s2[3];
|
||||||
|
|
||||||
|
radii = glm_max(radii, s1[3]);
|
||||||
|
radii = glm_max(radii, s2[3]);
|
||||||
|
|
||||||
|
glm_vec3_center(s1, s2, dest);
|
||||||
|
dest[3] = radii;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief check if two sphere intersects
|
||||||
|
*
|
||||||
|
* @param[in] s1 sphere
|
||||||
|
* @param[in] s2 other sphere
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
bool
|
||||||
|
glm_sphere_sphere(const vec4 s1, const vec4 s2) {
|
||||||
|
return glm_vec3_distance2(s1, s2) <= glm_pow2(s1[3] + s2[3]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief check if sphere intersects with point
|
||||||
|
*
|
||||||
|
* @param[in] s sphere
|
||||||
|
* @param[in] point point
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
bool
|
||||||
|
glm_sphere_point(const vec4 s, const vec3 point) {
|
||||||
|
float rr;
|
||||||
|
rr = s[3] * s[3];
|
||||||
|
return glm_vec3_distance2(point, s) <= rr;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* cglm_sphere_h */
|
||||||
@@ -9,22 +9,73 @@
|
|||||||
#define cglm_types_h
|
#define cglm_types_h
|
||||||
|
|
||||||
#if defined(_MSC_VER)
|
#if defined(_MSC_VER)
|
||||||
# define CGLM_ALIGN(X) /* __declspec(align(X)) */
|
/* do not use alignment for older visual studio versions */
|
||||||
|
# if _MSC_VER < 1913 /* Visual Studio 2017 version 15.6 */
|
||||||
|
# define CGLM_ALL_UNALIGNED
|
||||||
|
# define CGLM_ALIGN(X) /* no alignment */
|
||||||
|
# else
|
||||||
|
# define CGLM_ALIGN(X) __declspec(align(X))
|
||||||
|
# endif
|
||||||
#else
|
#else
|
||||||
# define CGLM_ALIGN(X) __attribute((aligned(X)))
|
# define CGLM_ALIGN(X) __attribute((aligned(X)))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef float vec3[3];
|
#ifndef CGLM_ALL_UNALIGNED
|
||||||
typedef int ivec3[3];
|
# define CGLM_ALIGN_IF(X) CGLM_ALIGN(X)
|
||||||
typedef CGLM_ALIGN(16) float vec4[4];
|
#else
|
||||||
|
# define CGLM_ALIGN_IF(X) /* no alignment */
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef vec3 mat3[3];
|
#ifdef __AVX__
|
||||||
typedef vec4 mat4[4];
|
# define CGLM_ALIGN_MAT CGLM_ALIGN(32)
|
||||||
|
#else
|
||||||
|
# define CGLM_ALIGN_MAT CGLM_ALIGN(16)
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef vec4 versor;
|
typedef float vec2[2];
|
||||||
|
typedef float vec3[3];
|
||||||
|
typedef int ivec3[3];
|
||||||
|
typedef CGLM_ALIGN_IF(16) float vec4[4];
|
||||||
|
typedef vec4 versor;
|
||||||
|
typedef vec3 mat3[3];
|
||||||
|
|
||||||
#define CGLM_PI (float)M_PI
|
#ifdef __AVX__
|
||||||
#define CGLM_PI_2 (float)M_PI_2
|
typedef CGLM_ALIGN_IF(32) vec4 mat4[4];
|
||||||
#define CGLM_PI_4 (float)M_PI_4
|
#else
|
||||||
|
typedef CGLM_ALIGN_IF(16) vec4 mat4[4];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define GLM_E 2.71828182845904523536028747135266250 /* e */
|
||||||
|
#define GLM_LOG2E 1.44269504088896340735992468100189214 /* log2(e) */
|
||||||
|
#define GLM_LOG10E 0.434294481903251827651128918916605082 /* log10(e) */
|
||||||
|
#define GLM_LN2 0.693147180559945309417232121458176568 /* loge(2) */
|
||||||
|
#define GLM_LN10 2.30258509299404568401799145468436421 /* loge(10) */
|
||||||
|
#define GLM_PI 3.14159265358979323846264338327950288 /* pi */
|
||||||
|
#define GLM_PI_2 1.57079632679489661923132169163975144 /* pi/2 */
|
||||||
|
#define GLM_PI_4 0.785398163397448309615660845819875721 /* pi/4 */
|
||||||
|
#define GLM_1_PI 0.318309886183790671537767526745028724 /* 1/pi */
|
||||||
|
#define GLM_2_PI 0.636619772367581343075535053490057448 /* 2/pi */
|
||||||
|
#define GLM_2_SQRTPI 1.12837916709551257389615890312154517 /* 2/sqrt(pi) */
|
||||||
|
#define GLM_SQRT2 1.41421356237309504880168872420969808 /* sqrt(2) */
|
||||||
|
#define GLM_SQRT1_2 0.707106781186547524400844362104849039 /* 1/sqrt(2) */
|
||||||
|
|
||||||
|
#define GLM_Ef ((float)GLM_E)
|
||||||
|
#define GLM_LOG2Ef ((float)GLM_LOG2E)
|
||||||
|
#define GLM_LOG10Ef ((float)GLM_LOG10E)
|
||||||
|
#define GLM_LN2f ((float)GLM_LN2)
|
||||||
|
#define GLM_LN10f ((float)GLM_LN10)
|
||||||
|
#define GLM_PIf ((float)GLM_PI)
|
||||||
|
#define GLM_PI_2f ((float)GLM_PI_2)
|
||||||
|
#define GLM_PI_4f ((float)GLM_PI_4)
|
||||||
|
#define GLM_1_PIf ((float)GLM_1_PI)
|
||||||
|
#define GLM_2_PIf ((float)GLM_2_PI)
|
||||||
|
#define GLM_2_SQRTPIf ((float)GLM_2_SQRTPI)
|
||||||
|
#define GLM_SQRT2f ((float)GLM_SQRT2)
|
||||||
|
#define GLM_SQRT1_2f ((float)GLM_SQRT1_2)
|
||||||
|
|
||||||
|
/* DEPRECATED! use GLM_PI and friends */
|
||||||
|
#define CGLM_PI GLM_PIf
|
||||||
|
#define CGLM_PI_2 GLM_PI_2f
|
||||||
|
#define CGLM_PI_4 GLM_PI_4f
|
||||||
|
|
||||||
#endif /* cglm_types_h */
|
#endif /* cglm_types_h */
|
||||||
|
|||||||
@@ -20,8 +20,13 @@
|
|||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
|
||||||
|
#define GLM_MIN(X, Y) (((X) < (Y)) ? (X) : (Y))
|
||||||
|
#define GLM_MAX(X, Y) (((X) > (Y)) ? (X) : (Y))
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief get sign of 32 bit integer as +1 or -1
|
* @brief get sign of 32 bit integer as +1, -1, 0
|
||||||
|
*
|
||||||
|
* Important: It returns 0 for zero input
|
||||||
*
|
*
|
||||||
* @param val integer value
|
* @param val integer value
|
||||||
*/
|
*/
|
||||||
@@ -31,6 +36,19 @@ glm_sign(int val) {
|
|||||||
return ((val >> 31) - (-val >> 31));
|
return ((val >> 31) - (-val >> 31));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief get sign of 32 bit float as +1, -1, 0
|
||||||
|
*
|
||||||
|
* Important: It returns 0 for zero/NaN input
|
||||||
|
*
|
||||||
|
* @param val float value
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_signf(float val) {
|
||||||
|
return (float)((val > 0.0f) - (val < 0.0f));
|
||||||
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief convert degree to radians
|
* @brief convert degree to radians
|
||||||
*
|
*
|
||||||
@@ -39,7 +57,7 @@ glm_sign(int val) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
float
|
float
|
||||||
glm_rad(float deg) {
|
glm_rad(float deg) {
|
||||||
return deg * CGLM_PI / 180.0f;
|
return deg * GLM_PIf / 180.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -50,7 +68,7 @@ glm_rad(float deg) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
float
|
float
|
||||||
glm_deg(float rad) {
|
glm_deg(float rad) {
|
||||||
return rad * 180.0f / CGLM_PI;
|
return rad * 180.0f / GLM_PIf;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -61,7 +79,7 @@ glm_deg(float rad) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_make_rad(float *deg) {
|
glm_make_rad(float *deg) {
|
||||||
*deg = *deg * CGLM_PI / 180.0f;
|
*deg = *deg * GLM_PIf / 180.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -72,7 +90,7 @@ glm_make_rad(float *deg) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_make_deg(float *rad) {
|
glm_make_deg(float *rad) {
|
||||||
*rad = *rad * 180.0f / CGLM_PI;
|
*rad = *rad * 180.0f / GLM_PIf;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -83,7 +101,6 @@ glm_make_deg(float *rad) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
float
|
float
|
||||||
glm_pow2(float x) {
|
glm_pow2(float x) {
|
||||||
|
|
||||||
return x * x;
|
return x * x;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -115,4 +132,88 @@ glm_max(float a, float b) {
|
|||||||
return b;
|
return b;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief clamp a number between min and max
|
||||||
|
*
|
||||||
|
* @param[in] val value to clamp
|
||||||
|
* @param[in] minVal minimum value
|
||||||
|
* @param[in] maxVal maximum value
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_clamp(float val, float minVal, float maxVal) {
|
||||||
|
return glm_min(glm_max(val, minVal), maxVal);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief clamp a number to zero and one
|
||||||
|
*
|
||||||
|
* @param[in] val value to clamp
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_clamp_zo(float val) {
|
||||||
|
return glm_clamp(val, 0.0f, 1.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief linear interpolation between two number
|
||||||
|
*
|
||||||
|
* formula: from + s * (to - from)
|
||||||
|
*
|
||||||
|
* @param[in] from from value
|
||||||
|
* @param[in] to to value
|
||||||
|
* @param[in] t interpolant (amount) clamped between 0 and 1
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_lerp(float from, float to, float t) {
|
||||||
|
return from + glm_clamp_zo(t) * (to - from);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief check if two float equal with using EPSILON
|
||||||
|
*
|
||||||
|
* @param[in] a a
|
||||||
|
* @param[in] b b
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
bool
|
||||||
|
glm_eq(float a, float b) {
|
||||||
|
return fabsf(a - b) <= FLT_EPSILON;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief percentage of current value between start and end value
|
||||||
|
*
|
||||||
|
* maybe fraction could be alternative name.
|
||||||
|
*
|
||||||
|
* @param[in] from from value
|
||||||
|
* @param[in] to to value
|
||||||
|
* @param[in] current current value
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_percent(float from, float to, float current) {
|
||||||
|
float t;
|
||||||
|
|
||||||
|
if ((t = to - from) == 0.0f)
|
||||||
|
return 1.0f;
|
||||||
|
|
||||||
|
return (current - from) / t;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief clamped percentage of current value between start and end value
|
||||||
|
*
|
||||||
|
* @param[in] from from value
|
||||||
|
* @param[in] to to value
|
||||||
|
* @param[in] current current value
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_percentc(float from, float to, float current) {
|
||||||
|
return glm_clamp(glm_percent(from, to, current), 0.0f, 1.0f);
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* cglm_util_h */
|
#endif /* cglm_util_h */
|
||||||
|
|||||||
@@ -11,39 +11,26 @@
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
Functions:
|
Functions:
|
||||||
CGLM_INLINE void glm_vec_mulv(vec3 a, vec3 b, vec3 d);
|
CGLM_INLINE void glm_vec3_broadcast(float val, vec3 d);
|
||||||
CGLM_INLINE void glm_vec_broadcast(float val, vec3 d);
|
CGLM_INLINE bool glm_vec3_eq(vec3 v, float val);
|
||||||
CGLM_INLINE bool glm_vec_eq(vec3 v, float val);
|
CGLM_INLINE bool glm_vec3_eq_eps(vec3 v, float val);
|
||||||
CGLM_INLINE bool glm_vec_eq_eps(vec3 v, float val);
|
CGLM_INLINE bool glm_vec3_eq_all(vec3 v);
|
||||||
CGLM_INLINE bool glm_vec_eq_all(vec3 v);
|
CGLM_INLINE bool glm_vec3_eqv(vec3 a, vec3 b);
|
||||||
CGLM_INLINE bool glm_vec_eqv(vec3 v1, vec3 v2);
|
CGLM_INLINE bool glm_vec3_eqv_eps(vec3 a, vec3 b);
|
||||||
CGLM_INLINE bool glm_vec_eqv_eps(vec3 v1, vec3 v2);
|
CGLM_INLINE float glm_vec3_max(vec3 v);
|
||||||
CGLM_INLINE float glm_vec_max(vec3 v);
|
CGLM_INLINE float glm_vec3_min(vec3 v);
|
||||||
CGLM_INLINE float glm_vec_min(vec3 v);
|
CGLM_INLINE bool glm_vec3_isnan(vec3 v);
|
||||||
|
CGLM_INLINE bool glm_vec3_isinf(vec3 v);
|
||||||
|
CGLM_INLINE bool glm_vec3_isvalid(vec3 v);
|
||||||
|
CGLM_INLINE void glm_vec3_sign(vec3 v, vec3 dest);
|
||||||
|
CGLM_INLINE void glm_vec3_sqrt(vec3 v, vec3 dest);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef cglm_vec3_ext_h
|
#ifndef cglm_vec3_ext_h
|
||||||
#define cglm_vec3_ext_h
|
#define cglm_vec3_ext_h
|
||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include <stdbool.h>
|
#include "util.h"
|
||||||
#include <math.h>
|
|
||||||
#include <float.h>
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief multiplies individual items, just for convenient like SIMD
|
|
||||||
*
|
|
||||||
* @param[in] a vec1
|
|
||||||
* @param[in] b vec2
|
|
||||||
* @param[out] d vec3 = (v1[0] * v2[0], v1[1] * v2[1], v1[2] * v2[2])
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_vec_mulv(vec3 a, vec3 b, vec3 d) {
|
|
||||||
d[0] = a[0] * b[0];
|
|
||||||
d[1] = a[1] * b[1];
|
|
||||||
d[2] = a[2] * b[2];
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief fill a vector with specified value
|
* @brief fill a vector with specified value
|
||||||
@@ -53,7 +40,7 @@ glm_vec_mulv(vec3 a, vec3 b, vec3 d) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec_broadcast(float val, vec3 d) {
|
glm_vec3_broadcast(float val, vec3 d) {
|
||||||
d[0] = d[1] = d[2] = val;
|
d[0] = d[1] = d[2] = val;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -65,7 +52,7 @@ glm_vec_broadcast(float val, vec3 d) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
bool
|
bool
|
||||||
glm_vec_eq(vec3 v, float val) {
|
glm_vec3_eq(const vec3 v, float val) {
|
||||||
return v[0] == val && v[0] == v[1] && v[0] == v[2];
|
return v[0] == val && v[0] == v[1] && v[0] == v[2];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -77,7 +64,7 @@ glm_vec_eq(vec3 v, float val) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
bool
|
bool
|
||||||
glm_vec_eq_eps(vec3 v, float val) {
|
glm_vec3_eq_eps(const vec3 v, float val) {
|
||||||
return fabsf(v[0] - val) <= FLT_EPSILON
|
return fabsf(v[0] - val) <= FLT_EPSILON
|
||||||
&& fabsf(v[1] - val) <= FLT_EPSILON
|
&& fabsf(v[1] - val) <= FLT_EPSILON
|
||||||
&& fabsf(v[2] - val) <= FLT_EPSILON;
|
&& fabsf(v[2] - val) <= FLT_EPSILON;
|
||||||
@@ -90,36 +77,36 @@ glm_vec_eq_eps(vec3 v, float val) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
bool
|
bool
|
||||||
glm_vec_eq_all(vec3 v) {
|
glm_vec3_eq_all(const vec3 v) {
|
||||||
return v[0] == v[1] && v[0] == v[2];
|
return v[0] == v[1] && v[0] == v[2];
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief check if vector is equal to another (without epsilon)
|
* @brief check if vector is equal to another (without epsilon)
|
||||||
*
|
*
|
||||||
* @param[in] v1 vector
|
* @param[in] a vector
|
||||||
* @param[in] v2 vector
|
* @param[in] b vector
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
bool
|
bool
|
||||||
glm_vec_eqv(vec3 v1, vec3 v2) {
|
glm_vec3_eqv(const vec3 a, const vec3 b) {
|
||||||
return v1[0] == v2[0]
|
return a[0] == b[0]
|
||||||
&& v1[1] == v2[1]
|
&& a[1] == b[1]
|
||||||
&& v1[2] == v2[2];
|
&& a[2] == b[2];
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief check if vector is equal to another (with epsilon)
|
* @brief check if vector is equal to another (with epsilon)
|
||||||
*
|
*
|
||||||
* @param[in] v1 vector
|
* @param[in] a vector
|
||||||
* @param[in] v2 vector
|
* @param[in] b vector
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
bool
|
bool
|
||||||
glm_vec_eqv_eps(vec3 v1, vec3 v2) {
|
glm_vec3_eqv_eps(const vec3 a, const vec3 b) {
|
||||||
return fabsf(v1[0] - v2[0]) <= FLT_EPSILON
|
return fabsf(a[0] - b[0]) <= FLT_EPSILON
|
||||||
&& fabsf(v1[1] - v2[1]) <= FLT_EPSILON
|
&& fabsf(a[1] - b[1]) <= FLT_EPSILON
|
||||||
&& fabsf(v1[2] - v2[2]) <= FLT_EPSILON;
|
&& fabsf(a[2] - b[2]) <= FLT_EPSILON;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -129,7 +116,7 @@ glm_vec_eqv_eps(vec3 v1, vec3 v2) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
float
|
float
|
||||||
glm_vec_max(vec3 v) {
|
glm_vec3_max(const vec3 v) {
|
||||||
float max;
|
float max;
|
||||||
|
|
||||||
max = v[0];
|
max = v[0];
|
||||||
@@ -148,7 +135,7 @@ glm_vec_max(vec3 v) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
float
|
float
|
||||||
glm_vec_min(vec3 v) {
|
glm_vec3_min(const vec3 v) {
|
||||||
float min;
|
float min;
|
||||||
|
|
||||||
min = v[0];
|
min = v[0];
|
||||||
@@ -160,4 +147,69 @@ glm_vec_min(vec3 v) {
|
|||||||
return min;
|
return min;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief check if all items are NaN (not a number)
|
||||||
|
* you should only use this in DEBUG mode or very critical asserts
|
||||||
|
*
|
||||||
|
* @param[in] v vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
bool
|
||||||
|
glm_vec3_isnan(const vec3 v) {
|
||||||
|
return isnan(v[0]) || isnan(v[1]) || isnan(v[2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief check if all items are INFINITY
|
||||||
|
* you should only use this in DEBUG mode or very critical asserts
|
||||||
|
*
|
||||||
|
* @param[in] v vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
bool
|
||||||
|
glm_vec3_isinf(const vec3 v) {
|
||||||
|
return isinf(v[0]) || isinf(v[1]) || isinf(v[2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief check if all items are valid number
|
||||||
|
* you should only use this in DEBUG mode or very critical asserts
|
||||||
|
*
|
||||||
|
* @param[in] v vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
bool
|
||||||
|
glm_vec3_isvalid(const vec3 v) {
|
||||||
|
return !glm_vec3_isnan(v) && !glm_vec3_isinf(v);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief get sign of 32 bit float as +1, -1, 0
|
||||||
|
*
|
||||||
|
* Important: It returns 0 for zero/NaN input
|
||||||
|
*
|
||||||
|
* @param v vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec3_sign(const vec3 v, vec3 dest) {
|
||||||
|
dest[0] = glm_signf(v[0]);
|
||||||
|
dest[1] = glm_signf(v[1]);
|
||||||
|
dest[2] = glm_signf(v[2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief square root of each vector item
|
||||||
|
*
|
||||||
|
* @param[in] v vector
|
||||||
|
* @param[out] dest destination vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec3_sqrt(const vec3 v, vec3 dest) {
|
||||||
|
dest[0] = sqrtf(v[0]);
|
||||||
|
dest[1] = sqrtf(v[1]);
|
||||||
|
dest[2] = sqrtf(v[2]);
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* cglm_vec3_ext_h */
|
#endif /* cglm_vec3_ext_h */
|
||||||
|
|||||||
@@ -5,14 +5,8 @@
|
|||||||
* Full license can be found in the LICENSE file
|
* Full license can be found in the LICENSE file
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*!
|
|
||||||
* vec3 functions dont have suffix e.g glm_vec_dot (not glm_vec3_dot)
|
|
||||||
* all functions without suffix are vec3 functions
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Macros:
|
Macros:
|
||||||
glm_vec_dup(v, dest)
|
|
||||||
GLM_VEC3_ONE_INIT
|
GLM_VEC3_ONE_INIT
|
||||||
GLM_VEC3_ZERO_INIT
|
GLM_VEC3_ZERO_INIT
|
||||||
GLM_VEC3_ONE
|
GLM_VEC3_ONE
|
||||||
@@ -23,46 +17,81 @@
|
|||||||
|
|
||||||
Functions:
|
Functions:
|
||||||
CGLM_INLINE void glm_vec3(vec4 v4, vec3 dest);
|
CGLM_INLINE void glm_vec3(vec4 v4, vec3 dest);
|
||||||
CGLM_INLINE void glm_vec_copy(vec3 a, vec3 dest);
|
CGLM_INLINE void glm_vec3_copy(vec3 a, vec3 dest);
|
||||||
CGLM_INLINE float glm_vec_dot(vec3 a, vec3 b);
|
CGLM_INLINE void glm_vec3_zero(vec3 v);
|
||||||
CGLM_INLINE void glm_vec_cross(vec3 a, vec3 b, vec3 d);
|
CGLM_INLINE void glm_vec3_one(vec3 v);
|
||||||
CGLM_INLINE float glm_vec_norm2(vec3 v);
|
CGLM_INLINE float glm_vec3_dot(vec3 a, vec3 b);
|
||||||
CGLM_INLINE float glm_vec_norm(vec3 vec);
|
CGLM_INLINE float glm_vec3_norm2(vec3 v);
|
||||||
CGLM_INLINE void glm_vec_add(vec3 v1, vec3 v2, vec3 dest);
|
CGLM_INLINE float glm_vec3_norm(vec3 v);
|
||||||
CGLM_INLINE void glm_vec_sub(vec3 v1, vec3 v2, vec3 dest);
|
CGLM_INLINE void glm_vec3_add(vec3 a, vec3 b, vec3 dest);
|
||||||
CGLM_INLINE void glm_vec_scale(vec3 v, float s, vec3 dest);
|
CGLM_INLINE void glm_vec3_adds(vec3 a, float s, vec3 dest);
|
||||||
CGLM_INLINE void glm_vec_scale_as(vec3 v, float s, vec3 dest);
|
CGLM_INLINE void glm_vec3_sub(vec3 a, vec3 b, vec3 dest);
|
||||||
CGLM_INLINE void glm_vec_flipsign(vec3 v);
|
CGLM_INLINE void glm_vec3_subs(vec3 a, float s, vec3 dest);
|
||||||
CGLM_INLINE void glm_vec_inv(vec3 v);
|
CGLM_INLINE void glm_vec3_mul(vec3 a, vec3 b, vec3 dest);
|
||||||
CGLM_INLINE void glm_vec_inv_to(vec3 v, vec3 dest);
|
CGLM_INLINE void glm_vec3_scale(vec3 v, float s, vec3 dest);
|
||||||
CGLM_INLINE void glm_vec_normalize(vec3 v);
|
CGLM_INLINE void glm_vec3_scale_as(vec3 v, float s, vec3 dest);
|
||||||
CGLM_INLINE void glm_vec_normalize_to(vec3 vec, vec3 dest);
|
CGLM_INLINE void glm_vec3_div(vec3 a, vec3 b, vec3 dest);
|
||||||
CGLM_INLINE float glm_vec_distance(vec3 v1, vec3 v2);
|
CGLM_INLINE void glm_vec3_divs(vec3 a, float s, vec3 dest);
|
||||||
CGLM_INLINE float glm_vec_angle(vec3 v1, vec3 v2);
|
CGLM_INLINE void glm_vec3_addadd(vec3 a, vec3 b, vec3 dest);
|
||||||
CGLM_INLINE void glm_vec_rotate(vec3 v, float angle, vec3 axis);
|
CGLM_INLINE void glm_vec3_subadd(vec3 a, vec3 b, vec3 dest);
|
||||||
CGLM_INLINE void glm_vec_rotate_m4(mat4 m, vec3 v, vec3 dest);
|
CGLM_INLINE void glm_vec3_muladd(vec3 a, vec3 b, vec3 dest);
|
||||||
CGLM_INLINE void glm_vec_proj(vec3 a, vec3 b, vec3 dest);
|
CGLM_INLINE void glm_vec3_muladds(vec3 a, float s, vec3 dest);
|
||||||
CGLM_INLINE void glm_vec_center(vec3 v1, vec3 v2, vec3 dest);
|
CGLM_INLINE void glm_vec3_maxadd(vec3 a, vec3 b, vec3 dest);
|
||||||
CGLM_INLINE void glm_vec_maxv(vec3 v1, vec3 v2, vec3 dest);
|
CGLM_INLINE void glm_vec3_minadd(vec3 a, vec3 b, vec3 dest);
|
||||||
CGLM_INLINE void glm_vec_minv(vec3 v1, vec3 v2, vec3 dest);
|
CGLM_INLINE void glm_vec3_flipsign(vec3 v);
|
||||||
CGLM_INLINE void glm_vec_ortho(vec3 v, vec3 dest);
|
CGLM_INLINE void glm_vec3_flipsign_to(vec3 v, vec3 dest);
|
||||||
|
CGLM_INLINE void glm_vec3_negate_to(vec3 v, vec3 dest);
|
||||||
|
CGLM_INLINE void glm_vec3_negate(vec3 v);
|
||||||
|
CGLM_INLINE void glm_vec3_inv(vec3 v);
|
||||||
|
CGLM_INLINE void glm_vec3_inv_to(vec3 v, vec3 dest);
|
||||||
|
CGLM_INLINE void glm_vec3_normalize(vec3 v);
|
||||||
|
CGLM_INLINE void glm_vec3_normalize_to(vec3 v, vec3 dest);
|
||||||
|
CGLM_INLINE void glm_vec3_cross(vec3 a, vec3 b, vec3 d);
|
||||||
|
CGLM_INLINE void glm_vec3_crossn(vec3 a, vec3 b, vec3 dest);
|
||||||
|
CGLM_INLINE float glm_vec3_distance(vec3 a, vec3 b);
|
||||||
|
CGLM_INLINE float glm_vec3_angle(vec3 a, vec3 b);
|
||||||
|
CGLM_INLINE void glm_vec3_rotate(vec3 v, float angle, vec3 axis);
|
||||||
|
CGLM_INLINE void glm_vec3_rotate_m4(mat4 m, vec3 v, vec3 dest);
|
||||||
|
CGLM_INLINE void glm_vec3_rotate_m3(mat3 m, vec3 v, vec3 dest);
|
||||||
|
CGLM_INLINE void glm_vec3_proj(vec3 a, vec3 b, vec3 dest);
|
||||||
|
CGLM_INLINE void glm_vec3_center(vec3 a, vec3 b, vec3 dest);
|
||||||
|
CGLM_INLINE float glm_vec3_distance2(vec3 a, vec3 b);
|
||||||
|
CGLM_INLINE void glm_vec3_maxv(vec3 a, vec3 b, vec3 dest);
|
||||||
|
CGLM_INLINE void glm_vec3_minv(vec3 a, vec3 b, vec3 dest);
|
||||||
|
CGLM_INLINE void glm_vec3_ortho(vec3 v, vec3 dest);
|
||||||
|
CGLM_INLINE void glm_vec3_clamp(vec3 v, float minVal, float maxVal);
|
||||||
|
CGLM_INLINE void glm_vec3_lerp(vec3 from, vec3 to, float t, vec3 dest);
|
||||||
|
|
||||||
Convenient:
|
Convenient:
|
||||||
CGLM_INLINE void glm_cross(vec3 a, vec3 b, vec3 d);
|
CGLM_INLINE void glm_cross(vec3 a, vec3 b, vec3 d);
|
||||||
CGLM_INLINE float glm_dot(vec3 a, vec3 b);
|
CGLM_INLINE float glm_dot(vec3 a, vec3 b);
|
||||||
CGLM_INLINE void glm_normalize(vec3 v);
|
CGLM_INLINE void glm_normalize(vec3 v);
|
||||||
CGLM_INLINE void glm_normalize_to(vec3 v, vec3 dest);
|
CGLM_INLINE void glm_normalize_to(vec3 v, vec3 dest);
|
||||||
|
|
||||||
|
DEPRECATED:
|
||||||
|
glm_vec3_dup
|
||||||
|
glm_vec3_flipsign
|
||||||
|
glm_vec3_flipsign_to
|
||||||
|
glm_vec3_inv
|
||||||
|
glm_vec3_inv_to
|
||||||
|
glm_vec3_mulv
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef cglm_vec3_h
|
#ifndef cglm_vec3_h
|
||||||
#define cglm_vec3_h
|
#define cglm_vec3_h
|
||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
#include "vec4.h"
|
||||||
#include "vec3-ext.h"
|
#include "vec3-ext.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
/* DEPRECATED! use _copy, _ucopy versions */
|
/* DEPRECATED! use _copy, _ucopy versions */
|
||||||
#define glm_vec_dup(v, dest) glm_vec_copy(v, dest)
|
#define glm_vec3_dup(v, dest) glm_vec3_copy(v, dest)
|
||||||
|
#define glm_vec3_flipsign(v) glm_vec3_negate(v)
|
||||||
|
#define glm_vec3_flipsign_to(v, dest) glm_vec3_negate_to(v, dest)
|
||||||
|
#define glm_vec3_inv(v) glm_vec3_negate(v)
|
||||||
|
#define glm_vec3_inv_to(v, dest) glm_vec3_negate_to(v, dest)
|
||||||
|
#define glm_vec3_mulv(a, b, d) glm_vec3_mul(a, b, d)
|
||||||
|
|
||||||
#define GLM_VEC3_ONE_INIT {1.0f, 1.0f, 1.0f}
|
#define GLM_VEC3_ONE_INIT {1.0f, 1.0f, 1.0f}
|
||||||
#define GLM_VEC3_ZERO_INIT {0.0f, 0.0f, 0.0f}
|
#define GLM_VEC3_ZERO_INIT {0.0f, 0.0f, 0.0f}
|
||||||
@@ -82,7 +111,7 @@
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec3(vec4 v4, vec3 dest) {
|
glm_vec3(const vec4 v4, vec3 dest) {
|
||||||
dest[0] = v4[0];
|
dest[0] = v4[0];
|
||||||
dest[1] = v4[1];
|
dest[1] = v4[1];
|
||||||
dest[2] = v4[2];
|
dest[2] = v4[2];
|
||||||
@@ -96,12 +125,34 @@ glm_vec3(vec4 v4, vec3 dest) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec_copy(vec3 a, vec3 dest) {
|
glm_vec3_copy(const vec3 a, vec3 dest) {
|
||||||
dest[0] = a[0];
|
dest[0] = a[0];
|
||||||
dest[1] = a[1];
|
dest[1] = a[1];
|
||||||
dest[2] = a[2];
|
dest[2] = a[2];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief make vector zero
|
||||||
|
*
|
||||||
|
* @param[in, out] v vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec3_zero(vec3 v) {
|
||||||
|
v[0] = v[1] = v[2] = 0.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief make vector one
|
||||||
|
*
|
||||||
|
* @param[in, out] v vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec3_one(vec3 v) {
|
||||||
|
v[0] = v[1] = v[2] = 1.0f;
|
||||||
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief vec3 dot product
|
* @brief vec3 dot product
|
||||||
*
|
*
|
||||||
@@ -112,26 +163,10 @@ glm_vec_copy(vec3 a, vec3 dest) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
float
|
float
|
||||||
glm_vec_dot(vec3 a, vec3 b) {
|
glm_vec3_dot(const vec3 a, const vec3 b) {
|
||||||
return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
|
return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief vec3 cross product
|
|
||||||
*
|
|
||||||
* @param[in] a source 1
|
|
||||||
* @param[in] b source 2
|
|
||||||
* @param[out] d destination
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_vec_cross(vec3 a, vec3 b, vec3 d) {
|
|
||||||
/* (u2.v3 - u3.v2, u3.v1 - u1.v3, u1.v2 - u2.v1) */
|
|
||||||
d[0] = a[1] * b[2] - a[2] * b[1];
|
|
||||||
d[1] = a[2] * b[0] - a[0] * b[2];
|
|
||||||
d[2] = a[0] * b[1] - a[1] * b[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief norm * norm (magnitude) of vec
|
* @brief norm * norm (magnitude) of vec
|
||||||
*
|
*
|
||||||
@@ -145,51 +180,96 @@ glm_vec_cross(vec3 a, vec3 b, vec3 d) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
float
|
float
|
||||||
glm_vec_norm2(vec3 v) {
|
glm_vec3_norm2(const vec3 v) {
|
||||||
return v[0] * v[0] + v[1] * v[1] + v[2] * v[2];
|
return glm_vec3_dot(v, v);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief norm (magnitude) of vec3
|
* @brief norm (magnitude) of vec3
|
||||||
*
|
*
|
||||||
* @param[in] vec vector
|
* @param[in] v vector
|
||||||
*
|
*
|
||||||
* @return norm
|
* @return norm
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
float
|
float
|
||||||
glm_vec_norm(vec3 vec) {
|
glm_vec3_norm(const vec3 v) {
|
||||||
return sqrtf(glm_vec_norm2(vec));
|
return sqrtf(glm_vec3_norm2(v));
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief add v2 vector to v1 vector store result in dest
|
* @brief add a vector to b vector store result in dest
|
||||||
*
|
*
|
||||||
* @param[in] v1 vector1
|
* @param[in] a vector1
|
||||||
* @param[in] v2 vector2
|
* @param[in] b vector2
|
||||||
* @param[out] dest destination vector
|
* @param[out] dest destination vector
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec_add(vec3 v1, vec3 v2, vec3 dest) {
|
glm_vec3_add(const vec3 a, const vec3 b, vec3 dest) {
|
||||||
dest[0] = v1[0] + v2[0];
|
dest[0] = a[0] + b[0];
|
||||||
dest[1] = v1[1] + v2[1];
|
dest[1] = a[1] + b[1];
|
||||||
dest[2] = v1[2] + v2[2];
|
dest[2] = a[2] + b[2];
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief subtract v2 vector from v1 vector store result in dest
|
* @brief add scalar to v vector store result in dest (d = v + s)
|
||||||
*
|
*
|
||||||
* @param[in] v1 vector1
|
* @param[in] v vector
|
||||||
* @param[in] v2 vector2
|
* @param[in] s scalar
|
||||||
* @param[out] dest destination vector
|
* @param[out] dest destination vector
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec_sub(vec3 v1, vec3 v2, vec3 dest) {
|
glm_vec3_adds(const vec3 v, float s, vec3 dest) {
|
||||||
dest[0] = v1[0] - v2[0];
|
dest[0] = v[0] + s;
|
||||||
dest[1] = v1[1] - v2[1];
|
dest[1] = v[1] + s;
|
||||||
dest[2] = v1[2] - v2[2];
|
dest[2] = v[2] + s;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief subtract b vector from a vector store result in dest
|
||||||
|
*
|
||||||
|
* @param[in] a vector1
|
||||||
|
* @param[in] b vector2
|
||||||
|
* @param[out] dest destination vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec3_sub(const vec3 a, const vec3 b, vec3 dest) {
|
||||||
|
dest[0] = a[0] - b[0];
|
||||||
|
dest[1] = a[1] - b[1];
|
||||||
|
dest[2] = a[2] - b[2];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief subtract scalar from v vector store result in dest (d = v - s)
|
||||||
|
*
|
||||||
|
* @param[in] v vector
|
||||||
|
* @param[in] s scalar
|
||||||
|
* @param[out] dest destination vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec3_subs(const vec3 v, float s, vec3 dest) {
|
||||||
|
dest[0] = v[0] - s;
|
||||||
|
dest[1] = v[1] - s;
|
||||||
|
dest[2] = v[2] - s;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief multiply two vector (component-wise multiplication)
|
||||||
|
*
|
||||||
|
* @param a vector1
|
||||||
|
* @param b vector2
|
||||||
|
* @param dest v3 = (a[0] * b[0], a[1] * b[1], a[2] * b[2])
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec3_mul(const vec3 a, const vec3 b, vec3 dest) {
|
||||||
|
dest[0] = a[0] * b[0];
|
||||||
|
dest[1] = a[1] * b[1];
|
||||||
|
dest[2] = a[2] * b[2];
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -201,7 +281,7 @@ glm_vec_sub(vec3 v1, vec3 v2, vec3 dest) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec_scale(vec3 v, float s, vec3 dest) {
|
glm_vec3_scale(const vec3 v, float s, vec3 dest) {
|
||||||
dest[0] = v[0] * s;
|
dest[0] = v[0] * s;
|
||||||
dest[1] = v[1] * s;
|
dest[1] = v[1] * s;
|
||||||
dest[2] = v[2] * s;
|
dest[2] = v[2] * s;
|
||||||
@@ -216,53 +296,173 @@ glm_vec_scale(vec3 v, float s, vec3 dest) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec_scale_as(vec3 v, float s, vec3 dest) {
|
glm_vec3_scale_as(const vec3 v, float s, vec3 dest) {
|
||||||
float norm;
|
float norm;
|
||||||
norm = glm_vec_norm(v);
|
norm = glm_vec3_norm(v);
|
||||||
|
|
||||||
if (norm == 0) {
|
if (norm == 0.0f) {
|
||||||
glm_vec_copy(v, dest);
|
glm_vec3_zero(dest);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
glm_vec_scale(v, s / norm, dest);
|
glm_vec3_scale(v, s / norm, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief flip sign of all vec3 members
|
* @brief div vector with another component-wise division: d = a / b
|
||||||
|
*
|
||||||
|
* @param[in] a vector 1
|
||||||
|
* @param[in] b vector 2
|
||||||
|
* @param[out] dest result = (a[0]/b[0], a[1]/b[1], a[2]/b[2])
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec3_div(const vec3 a, const vec3 b, vec3 dest) {
|
||||||
|
dest[0] = a[0] / b[0];
|
||||||
|
dest[1] = a[1] / b[1];
|
||||||
|
dest[2] = a[2] / b[2];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief div vector with scalar: d = v / s
|
||||||
|
*
|
||||||
|
* @param[in] v vector
|
||||||
|
* @param[in] s scalar
|
||||||
|
* @param[out] dest result = (a[0]/s, a[1]/s, a[2]/s)
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec3_divs(const vec3 v, float s, vec3 dest) {
|
||||||
|
dest[0] = v[0] / s;
|
||||||
|
dest[1] = v[1] / s;
|
||||||
|
dest[2] = v[2] / s;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief add two vectors and add result to sum
|
||||||
|
*
|
||||||
|
* it applies += operator so dest must be initialized
|
||||||
|
*
|
||||||
|
* @param[in] a vector 1
|
||||||
|
* @param[in] b vector 2
|
||||||
|
* @param[out] dest dest += (a + b)
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec3_addadd(const vec3 a, const vec3 b, vec3 dest) {
|
||||||
|
dest[0] += a[0] + b[0];
|
||||||
|
dest[1] += a[1] + b[1];
|
||||||
|
dest[2] += a[2] + b[2];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief sub two vectors and add result to dest
|
||||||
|
*
|
||||||
|
* it applies += operator so dest must be initialized
|
||||||
|
*
|
||||||
|
* @param[in] a vector 1
|
||||||
|
* @param[in] b vector 2
|
||||||
|
* @param[out] dest dest += (a + b)
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec3_subadd(const vec3 a, const vec3 b, vec3 dest) {
|
||||||
|
dest[0] += a[0] - b[0];
|
||||||
|
dest[1] += a[1] - b[1];
|
||||||
|
dest[2] += a[2] - b[2];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief mul two vectors and add result to dest
|
||||||
|
*
|
||||||
|
* it applies += operator so dest must be initialized
|
||||||
|
*
|
||||||
|
* @param[in] a vector 1
|
||||||
|
* @param[in] b vector 2
|
||||||
|
* @param[out] dest dest += (a * b)
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec3_muladd(const vec3 a, const vec3 b, vec3 dest) {
|
||||||
|
dest[0] += a[0] * b[0];
|
||||||
|
dest[1] += a[1] * b[1];
|
||||||
|
dest[2] += a[2] * b[2];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief mul vector with scalar and add result to sum
|
||||||
|
*
|
||||||
|
* it applies += operator so dest must be initialized
|
||||||
|
*
|
||||||
|
* @param[in] a vector
|
||||||
|
* @param[in] s scalar
|
||||||
|
* @param[out] dest dest += (a * b)
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec3_muladds(const vec3 a, float s, vec3 dest) {
|
||||||
|
dest[0] += a[0] * s;
|
||||||
|
dest[1] += a[1] * s;
|
||||||
|
dest[2] += a[2] * s;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief add max of two vector to result/dest
|
||||||
|
*
|
||||||
|
* it applies += operator so dest must be initialized
|
||||||
|
*
|
||||||
|
* @param[in] a vector 1
|
||||||
|
* @param[in] b vector 2
|
||||||
|
* @param[out] dest dest += max(a, b)
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec3_maxadd(const vec3 a, const vec3 b, vec3 dest) {
|
||||||
|
dest[0] += glm_max(a[0], b[0]);
|
||||||
|
dest[1] += glm_max(a[1], b[1]);
|
||||||
|
dest[2] += glm_max(a[2], b[2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief add min of two vector to result/dest
|
||||||
|
*
|
||||||
|
* it applies += operator so dest must be initialized
|
||||||
|
*
|
||||||
|
* @param[in] a vector 1
|
||||||
|
* @param[in] b vector 2
|
||||||
|
* @param[out] dest dest += min(a, b)
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec3_minadd(const vec3 a, const vec3 b, vec3 dest) {
|
||||||
|
dest[0] += glm_min(a[0], b[0]);
|
||||||
|
dest[1] += glm_min(a[1], b[1]);
|
||||||
|
dest[2] += glm_min(a[2], b[2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief negate vector components and store result in dest
|
||||||
|
*
|
||||||
|
* @param[in] v vector
|
||||||
|
* @param[out] dest result vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec3_negate_to(const vec3 v, vec3 dest) {
|
||||||
|
dest[0] = -v[0];
|
||||||
|
dest[1] = -v[1];
|
||||||
|
dest[2] = -v[2];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief negate vector components
|
||||||
*
|
*
|
||||||
* @param[in, out] v vector
|
* @param[in, out] v vector
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec_flipsign(vec3 v) {
|
glm_vec3_negate(vec3 v) {
|
||||||
v[0] = -v[0];
|
glm_vec3_negate_to(v, v);
|
||||||
v[1] = -v[1];
|
|
||||||
v[2] = -v[2];
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief make vector as inverse/opposite of itself
|
|
||||||
*
|
|
||||||
* @param[in, out] v vector
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_vec_inv(vec3 v) {
|
|
||||||
glm_vec_flipsign(v);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief inverse/opposite vector
|
|
||||||
*
|
|
||||||
* @param[in] v source
|
|
||||||
* @param[out] dest destination
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_vec_inv_to(vec3 v, vec3 dest) {
|
|
||||||
glm_vec_copy(v, dest);
|
|
||||||
glm_vec_flipsign(dest);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -272,63 +472,94 @@ glm_vec_inv_to(vec3 v, vec3 dest) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec_normalize(vec3 v) {
|
glm_vec3_normalize(vec3 v) {
|
||||||
float norm;
|
float norm;
|
||||||
|
|
||||||
norm = glm_vec_norm(v);
|
norm = glm_vec3_norm(v);
|
||||||
|
|
||||||
if (norm == 0.0f) {
|
if (norm == 0.0f) {
|
||||||
v[0] = v[1] = v[2] = 0.0f;
|
v[0] = v[1] = v[2] = 0.0f;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
glm_vec_scale(v, 1.0f / norm, v);
|
glm_vec3_scale(v, 1.0f / norm, v);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief normalize vec3 to dest
|
* @brief normalize vec3 to dest
|
||||||
*
|
*
|
||||||
* @param[in] vec source
|
* @param[in] v source
|
||||||
* @param[out] dest destination
|
* @param[out] dest destination
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec_normalize_to(vec3 vec, vec3 dest) {
|
glm_vec3_normalize_to(const vec3 v, vec3 dest) {
|
||||||
float norm;
|
float norm;
|
||||||
|
|
||||||
norm = glm_vec_norm(vec);
|
norm = glm_vec3_norm(v);
|
||||||
|
|
||||||
if (norm == 0.0f) {
|
if (norm == 0.0f) {
|
||||||
dest[0] = dest[1] = dest[2] = 0.0f;
|
glm_vec3_zero(dest);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
glm_vec_scale(vec, 1.0f / norm, dest);
|
glm_vec3_scale(v, 1.0f / norm, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief cross product of two vector (RH)
|
||||||
|
*
|
||||||
|
* @param[in] a vector 1
|
||||||
|
* @param[in] b vector 2
|
||||||
|
* @param[out] dest destination
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec3_cross(const vec3 a, const vec3 b, vec3 dest) {
|
||||||
|
/* (u2.v3 - u3.v2, u3.v1 - u1.v3, u1.v2 - u2.v1) */
|
||||||
|
dest[0] = a[1] * b[2] - a[2] * b[1];
|
||||||
|
dest[1] = a[2] * b[0] - a[0] * b[2];
|
||||||
|
dest[2] = a[0] * b[1] - a[1] * b[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief cross product of two vector (RH) and normalize the result
|
||||||
|
*
|
||||||
|
* @param[in] a vector 1
|
||||||
|
* @param[in] b vector 2
|
||||||
|
* @param[out] dest destination
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec3_crossn(const vec3 a, const vec3 b, vec3 dest) {
|
||||||
|
glm_vec3_cross(a, b, dest);
|
||||||
|
glm_vec3_normalize(dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief angle betwen two vector
|
* @brief angle betwen two vector
|
||||||
*
|
*
|
||||||
* @param[in] v1 vector1
|
* @param[in] a vector1
|
||||||
* @param[in] v2 vector2
|
* @param[in] b vector2
|
||||||
*
|
*
|
||||||
* @return angle as radians
|
* @return angle as radians
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
float
|
float
|
||||||
glm_vec_angle(vec3 v1, vec3 v2) {
|
glm_vec3_angle(const vec3 a, const vec3 b) {
|
||||||
float norm;
|
float norm, dot;
|
||||||
|
|
||||||
/* maybe compiler generate approximation instruction (rcp) */
|
/* maybe compiler generate approximation instruction (rcp) */
|
||||||
norm = 1.0f / (glm_vec_norm(v1) * glm_vec_norm(v2));
|
norm = 1.0f / (glm_vec3_norm(a) * glm_vec3_norm(b));
|
||||||
return acosf(glm_vec_dot(v1, v2) * norm);
|
dot = glm_vec3_dot(a, b) * norm;
|
||||||
}
|
|
||||||
|
|
||||||
CGLM_INLINE
|
if (dot > 1.0f)
|
||||||
void
|
return 0.0f;
|
||||||
glm_quatv(versor q,
|
else if (dot < -1.0f)
|
||||||
float angle,
|
return CGLM_PI;
|
||||||
vec3 v);
|
|
||||||
|
return acosf(dot);
|
||||||
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief rotate vec3 around axis by angle using Rodrigues' rotation formula
|
* @brief rotate vec3 around axis by angle using Rodrigues' rotation formula
|
||||||
@@ -339,32 +570,56 @@ glm_quatv(versor q,
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec_rotate(vec3 v, float angle, vec3 axis) {
|
glm_vec3_rotate(vec3 v, float angle, const vec3 axis) {
|
||||||
versor q;
|
vec3 v1, v2, k;
|
||||||
vec3 v1, v2, v3;
|
|
||||||
float c, s;
|
float c, s;
|
||||||
|
|
||||||
c = cosf(angle);
|
c = cosf(angle);
|
||||||
s = sinf(angle);
|
s = sinf(angle);
|
||||||
|
|
||||||
|
glm_vec3_normalize_to(axis, k);
|
||||||
|
|
||||||
/* Right Hand, Rodrigues' rotation formula:
|
/* Right Hand, Rodrigues' rotation formula:
|
||||||
v = v*cos(t) + (kxv)sin(t) + k*(k.v)(1 - cos(t))
|
v = v*cos(t) + (kxv)sin(t) + k*(k.v)(1 - cos(t))
|
||||||
*/
|
*/
|
||||||
|
glm_vec3_scale(v, c, v1);
|
||||||
|
|
||||||
/* quaternion */
|
glm_vec3_cross(k, v, v2);
|
||||||
glm_quatv(q, angle, v);
|
glm_vec3_scale(v2, s, v2);
|
||||||
|
|
||||||
glm_vec_scale(v, c, v1);
|
glm_vec3_add(v1, v2, v1);
|
||||||
|
|
||||||
glm_vec_cross(axis, v, v2);
|
glm_vec3_scale(k, glm_vec3_dot(k, v) * (1.0f - c), v2);
|
||||||
glm_vec_scale(v2, s, v2);
|
glm_vec3_add(v1, v2, v);
|
||||||
|
}
|
||||||
|
|
||||||
glm_vec_scale(axis,
|
/*!
|
||||||
glm_vec_dot(axis, v) * (1.0f - c),
|
* @brief apply rotation matrix to vector
|
||||||
v3);
|
*
|
||||||
|
* matrix format should be (no perspective):
|
||||||
|
* a b c x
|
||||||
|
* e f g y
|
||||||
|
* i j k z
|
||||||
|
* 0 0 0 w
|
||||||
|
*
|
||||||
|
* @param[in] m affine matrix or rot matrix
|
||||||
|
* @param[in] v vector
|
||||||
|
* @param[out] dest rotated vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec3_rotate_m4(const mat4 m, const vec3 v, vec3 dest) {
|
||||||
|
vec4 x, y, z, res;
|
||||||
|
|
||||||
glm_vec_add(v1, v2, v1);
|
glm_vec4_normalize_to(m[0], x);
|
||||||
glm_vec_add(v1, v3, v);
|
glm_vec4_normalize_to(m[1], y);
|
||||||
|
glm_vec4_normalize_to(m[2], z);
|
||||||
|
|
||||||
|
glm_vec4_scale(x, v[0], res);
|
||||||
|
glm_vec4_muladds(y, v[1], res);
|
||||||
|
glm_vec4_muladds(z, v[2], res);
|
||||||
|
|
||||||
|
glm_vec3(res, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -376,92 +631,109 @@ glm_vec_rotate(vec3 v, float angle, vec3 axis) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec_rotate_m4(mat4 m, vec3 v, vec3 dest) {
|
glm_vec3_rotate_m3(const mat3 m, const vec3 v, vec3 dest) {
|
||||||
vec3 res, x, y, z;
|
vec4 res, x, y, z;
|
||||||
|
|
||||||
glm_vec_normalize_to(m[0], x);
|
glm_vec4(m[0], 0.0f, x);
|
||||||
glm_vec_normalize_to(m[1], y);
|
glm_vec4(m[1], 0.0f, y);
|
||||||
glm_vec_normalize_to(m[2], z);
|
glm_vec4(m[2], 0.0f, z);
|
||||||
|
|
||||||
res[0] = x[0] * v[0] + y[0] * v[1] + z[0] * v[2];
|
glm_vec4_normalize(x);
|
||||||
res[1] = x[1] * v[0] + y[1] * v[1] + z[1] * v[2];
|
glm_vec4_normalize(y);
|
||||||
res[2] = x[2] * v[0] + y[2] * v[1] + z[2] * v[2];
|
glm_vec4_normalize(z);
|
||||||
|
|
||||||
glm_vec_copy(res, dest);
|
glm_vec4_scale(x, v[0], res);
|
||||||
|
glm_vec4_muladds(y, v[1], res);
|
||||||
|
glm_vec4_muladds(z, v[2], res);
|
||||||
|
|
||||||
|
glm_vec3(res, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief project a vector onto b vector
|
* @brief project a vector onto b vector
|
||||||
*
|
*
|
||||||
* @param[in] a vector1
|
* @param[in] a vector1
|
||||||
* @param[in] b vector2
|
* @param[in] b vector2
|
||||||
* @param[out] dest projected vector
|
* @param[out] dest projected vector
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec_proj(vec3 a, vec3 b, vec3 dest) {
|
glm_vec3_proj(const vec3 a, const vec3 b, vec3 dest) {
|
||||||
glm_vec_scale(b,
|
glm_vec3_scale(b,
|
||||||
glm_vec_dot(a, b) / glm_vec_norm2(b),
|
glm_vec3_dot(a, b) / glm_vec3_norm2(b),
|
||||||
dest);
|
dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief find center point of two vector
|
* @brief find center point of two vector
|
||||||
*
|
*
|
||||||
* @param[in] v1 vector1
|
* @param[in] a vector1
|
||||||
* @param[in] v2 vector2
|
* @param[in] b vector2
|
||||||
* @param[out] dest center point
|
* @param[out] dest center point
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec_center(vec3 v1, vec3 v2, vec3 dest) {
|
glm_vec3_center(const vec3 a, const vec3 b, vec3 dest) {
|
||||||
glm_vec_add(v1, v2, dest);
|
glm_vec3_add(a, b, dest);
|
||||||
glm_vec_scale(dest, 0.5f, dest);
|
glm_vec3_scale(dest, 0.5f, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief squared distance between two vectors
|
||||||
|
*
|
||||||
|
* @param[in] a vector1
|
||||||
|
* @param[in] b vector2
|
||||||
|
* @return returns squared distance (distance * distance)
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_vec3_distance2(const vec3 a, const vec3 b) {
|
||||||
|
return glm_pow2(b[0] - a[0])
|
||||||
|
+ glm_pow2(b[1] - a[1])
|
||||||
|
+ glm_pow2(b[2] - a[2]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief distance between two vectors
|
* @brief distance between two vectors
|
||||||
*
|
*
|
||||||
* @param[in] v1 vector1
|
* @param[in] a vector1
|
||||||
* @param[in] v2 vector2
|
* @param[in] b vector2
|
||||||
* @return returns distance
|
* @return returns distance
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
float
|
float
|
||||||
glm_vec_distance(vec3 v1, vec3 v2) {
|
glm_vec3_distance(const vec3 a, const vec3 b) {
|
||||||
return sqrtf(glm_pow2(v2[0] - v1[0])
|
return sqrtf(glm_vec3_distance2(a, b));
|
||||||
+ glm_pow2(v2[1] - v1[1])
|
|
||||||
+ glm_pow2(v2[2] - v1[2]));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief max values of vectors
|
* @brief max values of vectors
|
||||||
*
|
*
|
||||||
* @param[in] v1 vector1
|
* @param[in] a vector1
|
||||||
* @param[in] v2 vector2
|
* @param[in] b vector2
|
||||||
* @param[out] dest destination
|
* @param[out] dest destination
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec_maxv(vec3 v1, vec3 v2, vec3 dest) {
|
glm_vec3_maxv(const vec3 a, const vec3 b, vec3 dest) {
|
||||||
dest[0] = glm_max(v1[0], v2[0]);
|
dest[0] = glm_max(a[0], b[0]);
|
||||||
dest[1] = glm_max(v1[1], v2[1]);
|
dest[1] = glm_max(a[1], b[1]);
|
||||||
dest[2] = glm_max(v1[2], v2[2]);
|
dest[2] = glm_max(a[2], b[2]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief min values of vectors
|
* @brief min values of vectors
|
||||||
*
|
*
|
||||||
* @param[in] v1 vector1
|
* @param[in] a vector1
|
||||||
* @param[in] v2 vector2
|
* @param[in] b vector2
|
||||||
* @param[out] dest destination
|
* @param[out] dest destination
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec_minv(vec3 v1, vec3 v2, vec3 dest) {
|
glm_vec3_minv(const vec3 a, const vec3 b, vec3 dest) {
|
||||||
dest[0] = glm_min(v1[0], v2[0]);
|
dest[0] = glm_min(a[0], b[0]);
|
||||||
dest[1] = glm_min(v1[1], v2[1]);
|
dest[1] = glm_min(a[1], b[1]);
|
||||||
dest[2] = glm_min(v1[2], v2[2]);
|
dest[2] = glm_min(a[2], b[2]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -472,12 +744,49 @@ glm_vec_minv(vec3 v1, vec3 v2, vec3 dest) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec_ortho(vec3 v, vec3 dest) {
|
glm_vec3_ortho(const vec3 v, vec3 dest) {
|
||||||
dest[0] = v[1] - v[2];
|
dest[0] = v[1] - v[2];
|
||||||
dest[1] = v[2] - v[0];
|
dest[1] = v[2] - v[0];
|
||||||
dest[2] = v[0] - v[1];
|
dest[2] = v[0] - v[1];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief clamp vector's individual members between min and max values
|
||||||
|
*
|
||||||
|
* @param[in, out] v vector
|
||||||
|
* @param[in] minVal minimum value
|
||||||
|
* @param[in] maxVal maximum value
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec3_clamp(vec3 v, float minVal, float maxVal) {
|
||||||
|
v[0] = glm_clamp(v[0], minVal, maxVal);
|
||||||
|
v[1] = glm_clamp(v[1], minVal, maxVal);
|
||||||
|
v[2] = glm_clamp(v[2], minVal, maxVal);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief linear interpolation between two vector
|
||||||
|
*
|
||||||
|
* formula: from + s * (to - from)
|
||||||
|
*
|
||||||
|
* @param[in] from from value
|
||||||
|
* @param[in] to to value
|
||||||
|
* @param[in] t interpolant (amount) clamped between 0 and 1
|
||||||
|
* @param[out] dest destination
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec3_lerp(const vec3 from, const vec3 to, float t, vec3 dest) {
|
||||||
|
vec3 s, v;
|
||||||
|
|
||||||
|
/* from + s * (to - from) */
|
||||||
|
glm_vec3_broadcast(glm_clamp_zo(t), s);
|
||||||
|
glm_vec3_sub(to, from, v);
|
||||||
|
glm_vec3_mul(s, v, v);
|
||||||
|
glm_vec3_add(from, v, dest);
|
||||||
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief vec3 cross product
|
* @brief vec3 cross product
|
||||||
*
|
*
|
||||||
@@ -489,8 +798,8 @@ glm_vec_ortho(vec3 v, vec3 dest) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_cross(vec3 a, vec3 b, vec3 d) {
|
glm_cross(const vec3 a, const vec3 b, vec3 d) {
|
||||||
glm_vec_cross(a, b, d);
|
glm_vec3_cross(a, b, d);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -505,8 +814,8 @@ glm_cross(vec3 a, vec3 b, vec3 d) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
float
|
float
|
||||||
glm_dot(vec3 a, vec3 b) {
|
glm_dot(const vec3 a, const vec3 b) {
|
||||||
return glm_vec_dot(a, b);
|
return glm_vec3_dot(a, b);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -519,7 +828,7 @@ glm_dot(vec3 a, vec3 b) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_normalize(vec3 v) {
|
glm_normalize(vec3 v) {
|
||||||
glm_vec_normalize(v);
|
glm_vec3_normalize(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -532,8 +841,8 @@ glm_normalize(vec3 v) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_normalize_to(vec3 v, vec3 dest) {
|
glm_normalize_to(const vec3 v, vec3 dest) {
|
||||||
glm_vec_normalize_to(v, dest);
|
glm_vec3_normalize_to(v, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* cglm_vec3_h */
|
#endif /* cglm_vec3_h */
|
||||||
|
|||||||
@@ -11,15 +11,19 @@
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
Functions:
|
Functions:
|
||||||
CGLM_INLINE void glm_vec4_mulv(vec4 a, vec4 b, vec4 d);
|
|
||||||
CGLM_INLINE void glm_vec4_broadcast(float val, vec4 d);
|
CGLM_INLINE void glm_vec4_broadcast(float val, vec4 d);
|
||||||
CGLM_INLINE bool glm_vec4_eq(vec4 v, float val);
|
CGLM_INLINE bool glm_vec4_eq(vec4 v, float val);
|
||||||
CGLM_INLINE bool glm_vec4_eq_eps(vec4 v, float val);
|
CGLM_INLINE bool glm_vec4_eq_eps(vec4 v, float val);
|
||||||
CGLM_INLINE bool glm_vec4_eq_all(vec4 v);
|
CGLM_INLINE bool glm_vec4_eq_all(vec4 v);
|
||||||
CGLM_INLINE bool glm_vec4_eqv(vec4 v1, vec4 v2);
|
CGLM_INLINE bool glm_vec4_eqv(vec4 a, vec4 b);
|
||||||
CGLM_INLINE bool glm_vec4_eqv_eps(vec4 v1, vec4 v2);
|
CGLM_INLINE bool glm_vec4_eqv_eps(vec4 a, vec4 b);
|
||||||
CGLM_INLINE float glm_vec4_max(vec4 v);
|
CGLM_INLINE float glm_vec4_max(vec4 v);
|
||||||
CGLM_INLINE float glm_vec4_min(vec4 v);
|
CGLM_INLINE float glm_vec4_min(vec4 v);
|
||||||
|
CGLM_INLINE bool glm_vec4_isnan(vec4 v);
|
||||||
|
CGLM_INLINE bool glm_vec4_isinf(vec4 v);
|
||||||
|
CGLM_INLINE bool glm_vec4_isvalid(vec4 v);
|
||||||
|
CGLM_INLINE void glm_vec4_sign(vec4 v, vec4 dest);
|
||||||
|
CGLM_INLINE void glm_vec4_sqrt(vec4 v, vec4 dest);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef cglm_vec4_ext_h
|
#ifndef cglm_vec4_ext_h
|
||||||
@@ -27,29 +31,6 @@
|
|||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "vec3-ext.h"
|
#include "vec3-ext.h"
|
||||||
#include <stdbool.h>
|
|
||||||
#include <math.h>
|
|
||||||
#include <float.h>
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief multiplies individual items, just for convenient like SIMD
|
|
||||||
*
|
|
||||||
* @param a v1
|
|
||||||
* @param b v2
|
|
||||||
* @param d v3 = (v1[0] * v2[0], v1[1] * v2[1], v1[2] * v2[2], v1[3] * v2[3])
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_vec4_mulv(vec4 a, vec4 b, vec4 d) {
|
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
|
||||||
_mm_store_ps(d, _mm_mul_ps(_mm_load_ps(a), _mm_load_ps(b)));
|
|
||||||
#else
|
|
||||||
d[0] = a[0] * b[0];
|
|
||||||
d[1] = a[1] * b[1];
|
|
||||||
d[2] = a[2] * b[2];
|
|
||||||
d[3] = a[3] * b[3];
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief fill a vector with specified value
|
* @brief fill a vector with specified value
|
||||||
@@ -61,7 +42,7 @@ CGLM_INLINE
|
|||||||
void
|
void
|
||||||
glm_vec4_broadcast(float val, vec4 d) {
|
glm_vec4_broadcast(float val, vec4 d) {
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
_mm_store_ps(d, _mm_set1_ps(val));
|
glmm_store(d, _mm_set1_ps(val));
|
||||||
#else
|
#else
|
||||||
d[0] = d[1] = d[2] = d[3] = val;
|
d[0] = d[1] = d[2] = d[3] = val;
|
||||||
#endif
|
#endif
|
||||||
@@ -75,7 +56,7 @@ glm_vec4_broadcast(float val, vec4 d) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
bool
|
bool
|
||||||
glm_vec4_eq(vec4 v, float val) {
|
glm_vec4_eq(const vec4 v, float val) {
|
||||||
return v[0] == val
|
return v[0] == val
|
||||||
&& v[0] == v[1]
|
&& v[0] == v[1]
|
||||||
&& v[0] == v[2]
|
&& v[0] == v[2]
|
||||||
@@ -90,7 +71,7 @@ glm_vec4_eq(vec4 v, float val) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
bool
|
bool
|
||||||
glm_vec4_eq_eps(vec4 v, float val) {
|
glm_vec4_eq_eps(const vec4 v, float val) {
|
||||||
return fabsf(v[0] - val) <= FLT_EPSILON
|
return fabsf(v[0] - val) <= FLT_EPSILON
|
||||||
&& fabsf(v[1] - val) <= FLT_EPSILON
|
&& fabsf(v[1] - val) <= FLT_EPSILON
|
||||||
&& fabsf(v[2] - val) <= FLT_EPSILON
|
&& fabsf(v[2] - val) <= FLT_EPSILON
|
||||||
@@ -104,7 +85,7 @@ glm_vec4_eq_eps(vec4 v, float val) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
bool
|
bool
|
||||||
glm_vec4_eq_all(vec4 v) {
|
glm_vec4_eq_all(const vec4 v) {
|
||||||
return v[0] == v[1]
|
return v[0] == v[1]
|
||||||
&& v[0] == v[2]
|
&& v[0] == v[2]
|
||||||
&& v[0] == v[3];
|
&& v[0] == v[3];
|
||||||
@@ -113,31 +94,31 @@ glm_vec4_eq_all(vec4 v) {
|
|||||||
/*!
|
/*!
|
||||||
* @brief check if vector is equal to another (without epsilon)
|
* @brief check if vector is equal to another (without epsilon)
|
||||||
*
|
*
|
||||||
* @param v1 vector
|
* @param a vector
|
||||||
* @param v2 vector
|
* @param b vector
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
bool
|
bool
|
||||||
glm_vec4_eqv(vec4 v1, vec4 v2) {
|
glm_vec4_eqv(const vec4 a, const vec4 b) {
|
||||||
return v1[0] == v2[0]
|
return a[0] == b[0]
|
||||||
&& v1[1] == v2[1]
|
&& a[1] == b[1]
|
||||||
&& v1[2] == v2[2]
|
&& a[2] == b[2]
|
||||||
&& v1[3] == v2[3];
|
&& a[3] == b[3];
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief check if vector is equal to another (with epsilon)
|
* @brief check if vector is equal to another (with epsilon)
|
||||||
*
|
*
|
||||||
* @param v1 vector
|
* @param a vector
|
||||||
* @param v2 vector
|
* @param b vector
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
bool
|
bool
|
||||||
glm_vec4_eqv_eps(vec4 v1, vec4 v2) {
|
glm_vec4_eqv_eps(const vec4 a, const vec4 b) {
|
||||||
return fabsf(v1[0] - v2[0]) <= FLT_EPSILON
|
return fabsf(a[0] - b[0]) <= FLT_EPSILON
|
||||||
&& fabsf(v1[1] - v2[1]) <= FLT_EPSILON
|
&& fabsf(a[1] - b[1]) <= FLT_EPSILON
|
||||||
&& fabsf(v1[2] - v2[2]) <= FLT_EPSILON
|
&& fabsf(a[2] - b[2]) <= FLT_EPSILON
|
||||||
&& fabsf(v1[3] - v2[3]) <= FLT_EPSILON;
|
&& fabsf(a[3] - b[3]) <= FLT_EPSILON;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -147,10 +128,10 @@ glm_vec4_eqv_eps(vec4 v1, vec4 v2) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
float
|
float
|
||||||
glm_vec4_max(vec4 v) {
|
glm_vec4_max(const vec4 v) {
|
||||||
float max;
|
float max;
|
||||||
|
|
||||||
max = glm_vec_max(v);
|
max = glm_vec3_max(v);
|
||||||
if (v[3] > max)
|
if (v[3] > max)
|
||||||
max = v[3];
|
max = v[3];
|
||||||
|
|
||||||
@@ -164,15 +145,98 @@ glm_vec4_max(vec4 v) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
float
|
float
|
||||||
glm_vec4_min(vec4 v) {
|
glm_vec4_min(const vec4 v) {
|
||||||
float min;
|
float min;
|
||||||
|
|
||||||
min = glm_vec_min(v);
|
min = glm_vec3_min(v);
|
||||||
if (v[3] < min)
|
if (v[3] < min)
|
||||||
min = v[3];
|
min = v[3];
|
||||||
|
|
||||||
return min;
|
return min;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* cglm_vec4_ext_h */
|
/*!
|
||||||
|
* @brief check if one of items is NaN (not a number)
|
||||||
|
* you should only use this in DEBUG mode or very critical asserts
|
||||||
|
*
|
||||||
|
* @param[in] v vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
bool
|
||||||
|
glm_vec4_isnan(const vec4 v) {
|
||||||
|
return isnan(v[0]) || isnan(v[1]) || isnan(v[2]) || isnan(v[3]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief check if one of items is INFINITY
|
||||||
|
* you should only use this in DEBUG mode or very critical asserts
|
||||||
|
*
|
||||||
|
* @param[in] v vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
bool
|
||||||
|
glm_vec4_isinf(const vec4 v) {
|
||||||
|
return isinf(v[0]) || isinf(v[1]) || isinf(v[2]) || isinf(v[3]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief check if all items are valid number
|
||||||
|
* you should only use this in DEBUG mode or very critical asserts
|
||||||
|
*
|
||||||
|
* @param[in] v vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
bool
|
||||||
|
glm_vec4_isvalid(const vec4 v) {
|
||||||
|
return !glm_vec4_isnan(v) && !glm_vec4_isinf(v);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief get sign of 32 bit float as +1, -1, 0
|
||||||
|
*
|
||||||
|
* Important: It returns 0 for zero/NaN input
|
||||||
|
*
|
||||||
|
* @param v vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec4_sign(const vec4 v, vec4 dest) {
|
||||||
|
#if defined( __SSE2__ ) || defined( __SSE2__ )
|
||||||
|
__m128 x0, x1, x2, x3, x4;
|
||||||
|
|
||||||
|
x0 = glmm_load(v);
|
||||||
|
x1 = _mm_set_ps(0.0f, 0.0f, 1.0f, -1.0f);
|
||||||
|
x2 = glmm_shuff1x(x1, 2);
|
||||||
|
|
||||||
|
x3 = _mm_and_ps(_mm_cmpgt_ps(x0, x2), glmm_shuff1x(x1, 1));
|
||||||
|
x4 = _mm_and_ps(_mm_cmplt_ps(x0, x2), glmm_shuff1x(x1, 0));
|
||||||
|
|
||||||
|
glmm_store(dest, _mm_or_ps(x3, x4));
|
||||||
|
#else
|
||||||
|
dest[0] = glm_signf(v[0]);
|
||||||
|
dest[1] = glm_signf(v[1]);
|
||||||
|
dest[2] = glm_signf(v[2]);
|
||||||
|
dest[3] = glm_signf(v[3]);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief square root of each vector item
|
||||||
|
*
|
||||||
|
* @param[in] v vector
|
||||||
|
* @param[out] dest destination vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec4_sqrt(const vec4 v, vec4 dest) {
|
||||||
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
|
glmm_store(dest, _mm_sqrt_ps(glmm_load(v)));
|
||||||
|
#else
|
||||||
|
dest[0] = sqrtf(v[0]);
|
||||||
|
dest[1] = sqrtf(v[1]);
|
||||||
|
dest[2] = sqrtf(v[2]);
|
||||||
|
dest[3] = sqrtf(v[3]);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* cglm_vec4_ext_h */
|
||||||
|
|||||||
@@ -5,15 +5,8 @@
|
|||||||
* Full license can be found in the LICENSE file
|
* Full license can be found in the LICENSE file
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*!
|
|
||||||
* vec3 functions dont have suffix e.g glm_vec_dot (not glm_vec3_dot)
|
|
||||||
* all functions without suffix are vec3 functions
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Macros:
|
Macros:
|
||||||
glm_vec4_dup3(v, dest)
|
|
||||||
glm_vec4_dup(v, dest)
|
|
||||||
GLM_VEC4_ONE_INIT
|
GLM_VEC4_ONE_INIT
|
||||||
GLM_VEC4_BLACK_INIT
|
GLM_VEC4_BLACK_INIT
|
||||||
GLM_VEC4_ZERO_INIT
|
GLM_VEC4_ZERO_INIT
|
||||||
@@ -25,21 +18,43 @@
|
|||||||
CGLM_INLINE void glm_vec4(vec3 v3, float last, vec4 dest);
|
CGLM_INLINE void glm_vec4(vec3 v3, float last, vec4 dest);
|
||||||
CGLM_INLINE void glm_vec4_copy3(vec4 a, vec3 dest);
|
CGLM_INLINE void glm_vec4_copy3(vec4 a, vec3 dest);
|
||||||
CGLM_INLINE void glm_vec4_copy(vec4 v, vec4 dest);
|
CGLM_INLINE void glm_vec4_copy(vec4 v, vec4 dest);
|
||||||
|
CGLM_INLINE void glm_vec4_ucopy(vec4 v, vec4 dest);
|
||||||
CGLM_INLINE float glm_vec4_dot(vec4 a, vec4 b);
|
CGLM_INLINE float glm_vec4_dot(vec4 a, vec4 b);
|
||||||
CGLM_INLINE float glm_vec4_norm2(vec4 v);
|
CGLM_INLINE float glm_vec4_norm2(vec4 v);
|
||||||
CGLM_INLINE float glm_vec4_norm(vec4 vec);
|
CGLM_INLINE float glm_vec4_norm(vec4 v);
|
||||||
CGLM_INLINE void glm_vec4_add(vec4 v1, vec4 v2, vec4 dest);
|
CGLM_INLINE void glm_vec4_add(vec4 a, vec4 b, vec4 dest);
|
||||||
CGLM_INLINE void glm_vec4_sub(vec4 v1, vec4 v2, vec4 dest);
|
CGLM_INLINE void glm_vec4_adds(vec4 v, float s, vec4 dest);
|
||||||
|
CGLM_INLINE void glm_vec4_sub(vec4 a, vec4 b, vec4 dest);
|
||||||
|
CGLM_INLINE void glm_vec4_subs(vec4 v, float s, vec4 dest);
|
||||||
|
CGLM_INLINE void glm_vec4_mul(vec4 a, vec4 b, vec4 dest);
|
||||||
CGLM_INLINE void glm_vec4_scale(vec4 v, float s, vec4 dest);
|
CGLM_INLINE void glm_vec4_scale(vec4 v, float s, vec4 dest);
|
||||||
CGLM_INLINE void glm_vec4_scale_as(vec4 v, float s, vec4 dest);
|
CGLM_INLINE void glm_vec4_scale_as(vec4 v, float s, vec4 dest);
|
||||||
CGLM_INLINE void glm_vec4_flipsign(vec4 v);
|
CGLM_INLINE void glm_vec4_div(vec4 a, vec4 b, vec4 dest);
|
||||||
|
CGLM_INLINE void glm_vec4_divs(vec4 v, float s, vec4 dest);
|
||||||
|
CGLM_INLINE void glm_vec4_addadd(vec4 a, vec4 b, vec4 dest);
|
||||||
|
CGLM_INLINE void glm_vec4_subadd(vec4 a, vec4 b, vec4 dest);
|
||||||
|
CGLM_INLINE void glm_vec4_muladd(vec4 a, vec4 b, vec4 dest);
|
||||||
|
CGLM_INLINE void glm_vec4_muladds(vec4 a, float s, vec4 dest);
|
||||||
|
CGLM_INLINE void glm_vec4_maxadd(vec4 a, vec4 b, vec4 dest);
|
||||||
|
CGLM_INLINE void glm_vec4_minadd(vec4 a, vec4 b, vec4 dest);
|
||||||
|
CGLM_INLINE void glm_vec4_negate(vec4 v);
|
||||||
CGLM_INLINE void glm_vec4_inv(vec4 v);
|
CGLM_INLINE void glm_vec4_inv(vec4 v);
|
||||||
CGLM_INLINE void glm_vec4_inv_to(vec4 v, vec4 dest);
|
CGLM_INLINE void glm_vec4_inv_to(vec4 v, vec4 dest);
|
||||||
CGLM_INLINE void glm_vec4_normalize(vec4 v);
|
CGLM_INLINE void glm_vec4_normalize(vec4 v);
|
||||||
CGLM_INLINE void glm_vec4_normalize_to(vec4 vec, vec4 dest);
|
CGLM_INLINE void glm_vec4_normalize_to(vec4 vec, vec4 dest);
|
||||||
CGLM_INLINE float glm_vec4_distance(vec4 v1, vec4 v2);
|
CGLM_INLINE float glm_vec4_distance(vec4 a, vec4 b);
|
||||||
CGLM_INLINE void glm_vec4_maxv(vec4 v1, vec4 v2, vec4 dest);
|
CGLM_INLINE void glm_vec4_maxv(vec4 a, vec4 b, vec4 dest);
|
||||||
CGLM_INLINE void glm_vec4_minv(vec4 v1, vec4 v2, vec4 dest);
|
CGLM_INLINE void glm_vec4_minv(vec4 a, vec4 b, vec4 dest);
|
||||||
|
CGLM_INLINE void glm_vec4_clamp(vec4 v, float minVal, float maxVal);
|
||||||
|
CGLM_INLINE void glm_vec4_lerp(vec4 from, vec4 to, float t, vec4 dest)
|
||||||
|
|
||||||
|
DEPRECATED:
|
||||||
|
glm_vec4_dup
|
||||||
|
glm_vec4_flipsign
|
||||||
|
glm_vec4_flipsign_to
|
||||||
|
glm_vec4_inv
|
||||||
|
glm_vec4_inv_to
|
||||||
|
glm_vec4_mulv
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef cglm_vec4_h
|
#ifndef cglm_vec4_h
|
||||||
@@ -49,9 +64,14 @@
|
|||||||
#include "vec4-ext.h"
|
#include "vec4-ext.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
/* DEPRECATED! use _copy, _ucopy versions */
|
/* DEPRECATED! functions */
|
||||||
#define glm_vec4_dup3(v, dest) glm_vec4_copy3(v, dest)
|
#define glm_vec4_dup3(v, dest) glm_vec4_copy3(v, dest)
|
||||||
#define glm_vec4_dup(v, dest) glm_vec4_copy(v, dest)
|
#define glm_vec4_dup(v, dest) glm_vec4_copy(v, dest)
|
||||||
|
#define glm_vec4_flipsign(v) glm_vec4_negate(v)
|
||||||
|
#define glm_vec4_flipsign_to(v, dest) glm_vec4_negate_to(v, dest)
|
||||||
|
#define glm_vec4_inv(v) glm_vec4_negate(v)
|
||||||
|
#define glm_vec4_inv_to(v, dest) glm_vec4_negate_to(v, dest)
|
||||||
|
#define glm_vec4_mulv(a, b, d) glm_vec4_mul(a, b, d)
|
||||||
|
|
||||||
#define GLM_VEC4_ONE_INIT {1.0f, 1.0f, 1.0f, 1.0f}
|
#define GLM_VEC4_ONE_INIT {1.0f, 1.0f, 1.0f, 1.0f}
|
||||||
#define GLM_VEC4_BLACK_INIT {0.0f, 0.0f, 0.0f, 1.0f}
|
#define GLM_VEC4_BLACK_INIT {0.0f, 0.0f, 0.0f, 1.0f}
|
||||||
@@ -70,7 +90,7 @@
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec4(vec3 v3, float last, vec4 dest) {
|
glm_vec4(const vec3 v3, float last, vec4 dest) {
|
||||||
dest[0] = v3[0];
|
dest[0] = v3[0];
|
||||||
dest[1] = v3[1];
|
dest[1] = v3[1];
|
||||||
dest[2] = v3[2];
|
dest[2] = v3[2];
|
||||||
@@ -85,7 +105,7 @@ glm_vec4(vec3 v3, float last, vec4 dest) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec4_copy3(vec4 a, vec3 dest) {
|
glm_vec4_copy3(const vec4 a, vec3 dest) {
|
||||||
dest[0] = a[0];
|
dest[0] = a[0];
|
||||||
dest[1] = a[1];
|
dest[1] = a[1];
|
||||||
dest[2] = a[2];
|
dest[2] = a[2];
|
||||||
@@ -99,9 +119,11 @@ glm_vec4_copy3(vec4 a, vec3 dest) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec4_copy(vec4 v, vec4 dest) {
|
glm_vec4_copy(const vec4 v, vec4 dest) {
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
_mm_store_ps(dest, _mm_load_ps(v));
|
glmm_store(dest, glmm_load(v));
|
||||||
|
#elif defined(CGLM_NEON_FP)
|
||||||
|
vst1q_f32(dest, vld1q_f32(v));
|
||||||
#else
|
#else
|
||||||
dest[0] = v[0];
|
dest[0] = v[0];
|
||||||
dest[1] = v[1];
|
dest[1] = v[1];
|
||||||
@@ -110,6 +132,63 @@ glm_vec4_copy(vec4 v, vec4 dest) {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief copy all members of [a] to [dest]
|
||||||
|
*
|
||||||
|
* alignment is not required
|
||||||
|
*
|
||||||
|
* @param[in] v source
|
||||||
|
* @param[out] dest destination
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec4_ucopy(const vec4 v, vec4 dest) {
|
||||||
|
dest[0] = v[0];
|
||||||
|
dest[1] = v[1];
|
||||||
|
dest[2] = v[2];
|
||||||
|
dest[3] = v[3];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief make vector zero
|
||||||
|
*
|
||||||
|
* @param[in, out] v vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec4_zero(vec4 v) {
|
||||||
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
|
glmm_store(v, _mm_setzero_ps());
|
||||||
|
#elif defined(CGLM_NEON_FP)
|
||||||
|
vst1q_f32(v, vdupq_n_f32(0.0f));
|
||||||
|
#else
|
||||||
|
v[0] = 0.0f;
|
||||||
|
v[1] = 0.0f;
|
||||||
|
v[2] = 0.0f;
|
||||||
|
v[3] = 0.0f;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief make vector one
|
||||||
|
*
|
||||||
|
* @param[in, out] v vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec4_one(vec4 v) {
|
||||||
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
|
glmm_store(v, _mm_set1_ps(1.0f));
|
||||||
|
#elif defined(CGLM_NEON_FP)
|
||||||
|
vst1q_f32(v, vdupq_n_f32(1.0f));
|
||||||
|
#else
|
||||||
|
v[0] = 1.0f;
|
||||||
|
v[1] = 1.0f;
|
||||||
|
v[2] = 1.0f;
|
||||||
|
v[3] = 1.0f;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief vec4 dot product
|
* @brief vec4 dot product
|
||||||
*
|
*
|
||||||
@@ -120,8 +199,12 @@ glm_vec4_copy(vec4 v, vec4 dest) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
float
|
float
|
||||||
glm_vec4_dot(vec4 a, vec4 b) {
|
glm_vec4_dot(const vec4 a, const vec4 b) {
|
||||||
|
#if defined(CGLM_SIMD)
|
||||||
|
return glmm_dot(glmm_load(a), glmm_load(b));
|
||||||
|
#else
|
||||||
return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];
|
return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -137,64 +220,134 @@ glm_vec4_dot(vec4 a, vec4 b) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
float
|
float
|
||||||
glm_vec4_norm2(vec4 v) {
|
glm_vec4_norm2(const vec4 v) {
|
||||||
return v[0] * v[0] + v[1] * v[1] + v[2] * v[2] + v[3] * v[3];
|
return glm_vec4_dot(v, v);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief norm (magnitude) of vec4
|
* @brief norm (magnitude) of vec4
|
||||||
*
|
*
|
||||||
* @param[in] vec vector
|
* @param[in] v vector
|
||||||
*
|
*
|
||||||
* @return norm
|
* @return norm
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
float
|
float
|
||||||
glm_vec4_norm(vec4 vec) {
|
glm_vec4_norm(const vec4 v) {
|
||||||
return sqrtf(glm_vec4_norm2(vec));
|
#if defined(CGLM_SIMD)
|
||||||
}
|
return glmm_norm(glmm_load(v));
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief add v2 vector to v1 vector store result in dest
|
|
||||||
*
|
|
||||||
* @param[in] v1 vector1
|
|
||||||
* @param[in] v2 vector2
|
|
||||||
* @param[out] dest destination vector
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_vec4_add(vec4 v1, vec4 v2, vec4 dest) {
|
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
|
||||||
_mm_store_ps(dest,
|
|
||||||
_mm_add_ps(_mm_load_ps(v1),
|
|
||||||
_mm_load_ps(v2)));
|
|
||||||
#else
|
#else
|
||||||
dest[0] = v1[0] + v2[0];
|
return sqrtf(glm_vec4_dot(v, v));
|
||||||
dest[1] = v1[1] + v2[1];
|
|
||||||
dest[2] = v1[2] + v2[2];
|
|
||||||
dest[3] = v1[3] + v2[3];
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief subtract v2 vector from v1 vector store result in dest
|
* @brief add b vector to a vector store result in dest
|
||||||
*
|
*
|
||||||
* @param[in] v1 vector1
|
* @param[in] a vector1
|
||||||
* @param[in] v2 vector2
|
* @param[in] b vector2
|
||||||
* @param[out] dest destination vector
|
* @param[out] dest destination vector
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec4_sub(vec4 v1, vec4 v2, vec4 dest) {
|
glm_vec4_add(const vec4 a, const vec4 b, vec4 dest) {
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
_mm_store_ps(dest,
|
glmm_store(dest, _mm_add_ps(glmm_load(a), glmm_load(b)));
|
||||||
_mm_sub_ps(_mm_load_ps(v1),
|
#elif defined(CGLM_NEON_FP)
|
||||||
_mm_load_ps(v2)));
|
vst1q_f32(dest, vaddq_f32(vld1q_f32(a), vld1q_f32(b)));
|
||||||
#else
|
#else
|
||||||
dest[0] = v1[0] - v2[0];
|
dest[0] = a[0] + b[0];
|
||||||
dest[1] = v1[1] - v2[1];
|
dest[1] = a[1] + b[1];
|
||||||
dest[2] = v1[2] - v2[2];
|
dest[2] = a[2] + b[2];
|
||||||
dest[3] = v1[3] - v2[3];
|
dest[3] = a[3] + b[3];
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief add scalar to v vector store result in dest (d = v + vec(s))
|
||||||
|
*
|
||||||
|
* @param[in] v vector
|
||||||
|
* @param[in] s scalar
|
||||||
|
* @param[out] dest destination vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec4_adds(const vec4 v, float s, vec4 dest) {
|
||||||
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
|
glmm_store(dest, _mm_add_ps(glmm_load(v), _mm_set1_ps(s)));
|
||||||
|
#elif defined(CGLM_NEON_FP)
|
||||||
|
vst1q_f32(dest, vaddq_f32(vld1q_f32(v), vdupq_n_f32(s)));
|
||||||
|
#else
|
||||||
|
dest[0] = v[0] + s;
|
||||||
|
dest[1] = v[1] + s;
|
||||||
|
dest[2] = v[2] + s;
|
||||||
|
dest[3] = v[3] + s;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief subtract b vector from a vector store result in dest (d = a - b)
|
||||||
|
*
|
||||||
|
* @param[in] a vector1
|
||||||
|
* @param[in] b vector2
|
||||||
|
* @param[out] dest destination vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec4_sub(const vec4 a, const vec4 b, vec4 dest) {
|
||||||
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
|
glmm_store(dest, _mm_sub_ps(glmm_load(a), glmm_load(b)));
|
||||||
|
#elif defined(CGLM_NEON_FP)
|
||||||
|
vst1q_f32(dest, vsubq_f32(vld1q_f32(a), vld1q_f32(b)));
|
||||||
|
#else
|
||||||
|
dest[0] = a[0] - b[0];
|
||||||
|
dest[1] = a[1] - b[1];
|
||||||
|
dest[2] = a[2] - b[2];
|
||||||
|
dest[3] = a[3] - b[3];
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief subtract scalar from v vector store result in dest (d = v - vec(s))
|
||||||
|
*
|
||||||
|
* @param[in] v vector
|
||||||
|
* @param[in] s scalar
|
||||||
|
* @param[out] dest destination vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec4_subs(const vec4 v, float s, vec4 dest) {
|
||||||
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
|
glmm_store(dest, _mm_sub_ps(glmm_load(v), _mm_set1_ps(s)));
|
||||||
|
#elif defined(CGLM_NEON_FP)
|
||||||
|
vst1q_f32(dest, vsubq_f32(vld1q_f32(v), vdupq_n_f32(s)));
|
||||||
|
#else
|
||||||
|
dest[0] = v[0] - s;
|
||||||
|
dest[1] = v[1] - s;
|
||||||
|
dest[2] = v[2] - s;
|
||||||
|
dest[3] = v[3] - s;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief multiply two vector (component-wise multiplication)
|
||||||
|
*
|
||||||
|
* @param a vector1
|
||||||
|
* @param b vector2
|
||||||
|
* @param dest dest = (a[0] * b[0], a[1] * b[1], a[2] * b[2], a[3] * b[3])
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec4_mul(const vec4 a, const vec4 b, vec4 dest) {
|
||||||
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
|
glmm_store(dest, _mm_mul_ps(glmm_load(a), glmm_load(b)));
|
||||||
|
#elif defined(CGLM_NEON_FP)
|
||||||
|
vst1q_f32(dest, vmulq_f32(vld1q_f32(a), vld1q_f32(b)));
|
||||||
|
#else
|
||||||
|
dest[0] = a[0] * b[0];
|
||||||
|
dest[1] = a[1] * b[1];
|
||||||
|
dest[2] = a[2] * b[2];
|
||||||
|
dest[3] = a[3] * b[3];
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -207,11 +360,11 @@ glm_vec4_sub(vec4 v1, vec4 v2, vec4 dest) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec4_scale(vec4 v, float s, vec4 dest) {
|
glm_vec4_scale(const vec4 v, float s, vec4 dest) {
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
_mm_store_ps(dest,
|
glmm_store(dest, _mm_mul_ps(glmm_load(v), _mm_set1_ps(s)));
|
||||||
_mm_mul_ps(_mm_load_ps(v),
|
#elif defined(CGLM_NEON_FP)
|
||||||
_mm_set1_ps(s)));
|
vst1q_f32(dest, vmulq_f32(vld1q_f32(v), vdupq_n_f32(s)));
|
||||||
#else
|
#else
|
||||||
dest[0] = v[0] * s;
|
dest[0] = v[0] * s;
|
||||||
dest[1] = v[1] * s;
|
dest[1] = v[1] * s;
|
||||||
@@ -229,18 +382,244 @@ glm_vec4_scale(vec4 v, float s, vec4 dest) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec4_scale_as(vec4 v, float s, vec4 dest) {
|
glm_vec4_scale_as(const vec4 v, float s, vec4 dest) {
|
||||||
float norm;
|
float norm;
|
||||||
norm = glm_vec4_norm(v);
|
norm = glm_vec4_norm(v);
|
||||||
|
|
||||||
if (norm == 0) {
|
if (norm == 0.0f) {
|
||||||
glm_vec4_copy(v, dest);
|
glm_vec4_zero(dest);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
glm_vec4_scale(v, s / norm, dest);
|
glm_vec4_scale(v, s / norm, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief div vector with another component-wise division: d = a / b
|
||||||
|
*
|
||||||
|
* @param[in] a vector 1
|
||||||
|
* @param[in] b vector 2
|
||||||
|
* @param[out] dest result = (a[0]/b[0], a[1]/b[1], a[2]/b[2], a[3]/b[3])
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec4_div(const vec4 a, const vec4 b, vec4 dest) {
|
||||||
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
|
glmm_store(dest, _mm_div_ps(glmm_load(a), glmm_load(b)));
|
||||||
|
#else
|
||||||
|
dest[0] = a[0] / b[0];
|
||||||
|
dest[1] = a[1] / b[1];
|
||||||
|
dest[2] = a[2] / b[2];
|
||||||
|
dest[3] = a[3] / b[3];
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief div vec4 vector with scalar: d = v / s
|
||||||
|
*
|
||||||
|
* @param[in] v vector
|
||||||
|
* @param[in] s scalar
|
||||||
|
* @param[out] dest destination vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec4_divs(const vec4 v, float s, vec4 dest) {
|
||||||
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
|
glmm_store(dest, _mm_div_ps(glmm_load(v), _mm_set1_ps(s)));
|
||||||
|
#else
|
||||||
|
glm_vec4_scale(v, 1.0f / s, dest);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief add two vectors and add result to sum
|
||||||
|
*
|
||||||
|
* it applies += operator so dest must be initialized
|
||||||
|
*
|
||||||
|
* @param[in] a vector 1
|
||||||
|
* @param[in] b vector 2
|
||||||
|
* @param[out] dest dest += (a + b)
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec4_addadd(const vec4 a, const vec4 b, vec4 dest) {
|
||||||
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
|
glmm_store(dest, _mm_add_ps(glmm_load(dest),
|
||||||
|
_mm_add_ps(glmm_load(a),
|
||||||
|
glmm_load(b))));
|
||||||
|
#elif defined(CGLM_NEON_FP)
|
||||||
|
vst1q_f32(dest, vaddq_f32(vld1q_f32(dest),
|
||||||
|
vaddq_f32(vld1q_f32(a),
|
||||||
|
vld1q_f32(b))));
|
||||||
|
#else
|
||||||
|
dest[0] += a[0] + b[0];
|
||||||
|
dest[1] += a[1] + b[1];
|
||||||
|
dest[2] += a[2] + b[2];
|
||||||
|
dest[3] += a[3] + b[3];
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief sub two vectors and add result to dest
|
||||||
|
*
|
||||||
|
* it applies += operator so dest must be initialized
|
||||||
|
*
|
||||||
|
* @param[in] a vector 1
|
||||||
|
* @param[in] b vector 2
|
||||||
|
* @param[out] dest dest += (a - b)
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec4_subadd(const vec4 a, const vec4 b, vec4 dest) {
|
||||||
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
|
glmm_store(dest, _mm_add_ps(glmm_load(dest),
|
||||||
|
_mm_sub_ps(glmm_load(a),
|
||||||
|
glmm_load(b))));
|
||||||
|
#elif defined(CGLM_NEON_FP)
|
||||||
|
vst1q_f32(dest, vaddq_f32(vld1q_f32(dest),
|
||||||
|
vsubq_f32(vld1q_f32(a),
|
||||||
|
vld1q_f32(b))));
|
||||||
|
#else
|
||||||
|
dest[0] += a[0] - b[0];
|
||||||
|
dest[1] += a[1] - b[1];
|
||||||
|
dest[2] += a[2] - b[2];
|
||||||
|
dest[3] += a[3] - b[3];
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief mul two vectors and add result to dest
|
||||||
|
*
|
||||||
|
* it applies += operator so dest must be initialized
|
||||||
|
*
|
||||||
|
* @param[in] a vector 1
|
||||||
|
* @param[in] b vector 2
|
||||||
|
* @param[out] dest dest += (a * b)
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec4_muladd(const vec4 a, const vec4 b, vec4 dest) {
|
||||||
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
|
glmm_store(dest, _mm_add_ps(glmm_load(dest),
|
||||||
|
_mm_mul_ps(glmm_load(a),
|
||||||
|
glmm_load(b))));
|
||||||
|
#elif defined(CGLM_NEON_FP)
|
||||||
|
vst1q_f32(dest, vaddq_f32(vld1q_f32(dest),
|
||||||
|
vmulq_f32(vld1q_f32(a),
|
||||||
|
vld1q_f32(b))));
|
||||||
|
#else
|
||||||
|
dest[0] += a[0] * b[0];
|
||||||
|
dest[1] += a[1] * b[1];
|
||||||
|
dest[2] += a[2] * b[2];
|
||||||
|
dest[3] += a[3] * b[3];
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief mul vector with scalar and add result to sum
|
||||||
|
*
|
||||||
|
* it applies += operator so dest must be initialized
|
||||||
|
*
|
||||||
|
* @param[in] a vector
|
||||||
|
* @param[in] s scalar
|
||||||
|
* @param[out] dest dest += (a * b)
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec4_muladds(const vec4 a, float s, vec4 dest) {
|
||||||
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
|
glmm_store(dest, _mm_add_ps(glmm_load(dest),
|
||||||
|
_mm_mul_ps(glmm_load(a),
|
||||||
|
_mm_set1_ps(s))));
|
||||||
|
#elif defined(CGLM_NEON_FP)
|
||||||
|
vst1q_f32(dest, vaddq_f32(vld1q_f32(dest),
|
||||||
|
vsubq_f32(vld1q_f32(a),
|
||||||
|
vdupq_n_f32(s))));
|
||||||
|
#else
|
||||||
|
dest[0] += a[0] * s;
|
||||||
|
dest[1] += a[1] * s;
|
||||||
|
dest[2] += a[2] * s;
|
||||||
|
dest[3] += a[3] * s;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief add max of two vector to result/dest
|
||||||
|
*
|
||||||
|
* it applies += operator so dest must be initialized
|
||||||
|
*
|
||||||
|
* @param[in] a vector 1
|
||||||
|
* @param[in] b vector 2
|
||||||
|
* @param[out] dest dest += max(a, b)
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec4_maxadd(const vec4 a, const vec4 b, vec4 dest) {
|
||||||
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
|
glmm_store(dest, _mm_add_ps(glmm_load(dest),
|
||||||
|
_mm_max_ps(glmm_load(a),
|
||||||
|
glmm_load(b))));
|
||||||
|
#elif defined(CGLM_NEON_FP)
|
||||||
|
vst1q_f32(dest, vaddq_f32(vld1q_f32(dest),
|
||||||
|
vmaxq_f32(vld1q_f32(a),
|
||||||
|
vld1q_f32(b))));
|
||||||
|
#else
|
||||||
|
dest[0] += glm_max(a[0], b[0]);
|
||||||
|
dest[1] += glm_max(a[1], b[1]);
|
||||||
|
dest[2] += glm_max(a[2], b[2]);
|
||||||
|
dest[3] += glm_max(a[3], b[3]);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief add min of two vector to result/dest
|
||||||
|
*
|
||||||
|
* it applies += operator so dest must be initialized
|
||||||
|
*
|
||||||
|
* @param[in] a vector 1
|
||||||
|
* @param[in] b vector 2
|
||||||
|
* @param[out] dest dest += min(a, b)
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec4_minadd(const vec4 a,const vec4 b, vec4 dest) {
|
||||||
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
|
glmm_store(dest, _mm_add_ps(glmm_load(dest),
|
||||||
|
_mm_min_ps(glmm_load(a),
|
||||||
|
glmm_load(b))));
|
||||||
|
#elif defined(CGLM_NEON_FP)
|
||||||
|
vst1q_f32(dest, vaddq_f32(vld1q_f32(dest),
|
||||||
|
vminq_f32(vld1q_f32(a),
|
||||||
|
vld1q_f32(b))));
|
||||||
|
#else
|
||||||
|
dest[0] += glm_min(a[0], b[0]);
|
||||||
|
dest[1] += glm_min(a[1], b[1]);
|
||||||
|
dest[2] += glm_min(a[2], b[2]);
|
||||||
|
dest[3] += glm_min(a[3], b[3]);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief negate vector components and store result in dest
|
||||||
|
*
|
||||||
|
* @param[in] v vector
|
||||||
|
* @param[out] dest result vector
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec4_negate_to(const vec4 v, vec4 dest) {
|
||||||
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
|
glmm_store(dest, _mm_xor_ps(glmm_load(v), _mm_set1_ps(-0.0f)));
|
||||||
|
#elif defined(CGLM_NEON_FP)
|
||||||
|
vst1q_f32(dest, veorq_s32(vld1q_f32(v), vdupq_n_f32(-0.0f)));
|
||||||
|
#else
|
||||||
|
dest[0] = -v[0];
|
||||||
|
dest[1] = -v[1];
|
||||||
|
dest[2] = -v[2];
|
||||||
|
dest[3] = -v[3];
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief flip sign of all vec4 members
|
* @brief flip sign of all vec4 members
|
||||||
*
|
*
|
||||||
@@ -248,40 +627,45 @@ glm_vec4_scale_as(vec4 v, float s, vec4 dest) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec4_flipsign(vec4 v) {
|
glm_vec4_negate(vec4 v) {
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
glm_vec4_negate_to(v, v);
|
||||||
_mm_store_ps(v, _mm_xor_ps(_mm_load_ps(v),
|
|
||||||
_mm_set1_ps(-0.0f)));
|
|
||||||
#else
|
|
||||||
v[0] = -v[0];
|
|
||||||
v[1] = -v[1];
|
|
||||||
v[2] = -v[2];
|
|
||||||
v[3] = -v[3];
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief make vector as inverse/opposite of itself
|
* @brief normalize vec4 to dest
|
||||||
*
|
|
||||||
* @param[in, out] v vector
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_vec4_inv(vec4 v) {
|
|
||||||
glm_vec4_flipsign(v);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief inverse/opposite vector
|
|
||||||
*
|
*
|
||||||
* @param[in] v source
|
* @param[in] v source
|
||||||
* @param[out] dest destination
|
* @param[out] dest destination
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec4_inv_to(vec4 v, vec4 dest) {
|
glm_vec4_normalize_to(const vec4 v, vec4 dest) {
|
||||||
glm_vec4_copy(v, dest);
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
glm_vec4_flipsign(dest);
|
__m128 xdot, x0;
|
||||||
|
float dot;
|
||||||
|
|
||||||
|
x0 = glmm_load(v);
|
||||||
|
xdot = glmm_vdot(x0, x0);
|
||||||
|
dot = _mm_cvtss_f32(xdot);
|
||||||
|
|
||||||
|
if (dot == 0.0f) {
|
||||||
|
glmm_store(dest, _mm_setzero_ps());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
glmm_store(dest, _mm_div_ps(x0, _mm_sqrt_ps(xdot)));
|
||||||
|
#else
|
||||||
|
float norm;
|
||||||
|
|
||||||
|
norm = glm_vec4_norm(v);
|
||||||
|
|
||||||
|
if (norm == 0.0f) {
|
||||||
|
glm_vec4_zero(dest);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
glm_vec4_scale(v, 1.0f / norm, dest);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -292,85 +676,138 @@ glm_vec4_inv_to(vec4 v, vec4 dest) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec4_normalize(vec4 v) {
|
glm_vec4_normalize(vec4 v) {
|
||||||
float norm;
|
glm_vec4_normalize_to(v, v);
|
||||||
|
|
||||||
norm = glm_vec4_norm(v);
|
|
||||||
|
|
||||||
if (norm == 0.0f) {
|
|
||||||
v[0] = v[1] = v[2] = v[3] = 0.0f;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
glm_vec4_scale(v, 1.0f / norm, v);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief normalize vec4 to dest
|
|
||||||
*
|
|
||||||
* @param[in] vec source
|
|
||||||
* @param[out] dest destination
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_vec4_normalize_to(vec4 vec, vec4 dest) {
|
|
||||||
float norm;
|
|
||||||
|
|
||||||
norm = glm_vec4_norm(vec);
|
|
||||||
|
|
||||||
if (norm == 0.0f) {
|
|
||||||
dest[0] = dest[1] = dest[2] = dest[3] = 0.0f;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
glm_vec4_scale(vec, 1.0f / norm, dest);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief distance between two vectors
|
* @brief distance between two vectors
|
||||||
*
|
*
|
||||||
* @param[in] v1 vector1
|
* @param[in] a vector1
|
||||||
* @param[in] v2 vector2
|
* @param[in] b vector2
|
||||||
* @return returns distance
|
* @return returns distance
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
float
|
float
|
||||||
glm_vec4_distance(vec4 v1, vec4 v2) {
|
glm_vec4_distance(const vec4 a, const vec4 b) {
|
||||||
return sqrtf(glm_pow2(v2[0] - v1[0])
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
+ glm_pow2(v2[1] - v1[1])
|
return glmm_norm(_mm_sub_ps(glmm_load(b), glmm_load(a)));
|
||||||
+ glm_pow2(v2[2] - v1[2])
|
#elif defined(CGLM_NEON_FP)
|
||||||
+ glm_pow2(v2[3] - v1[3]));
|
return glmm_norm(vsubq_f32(glmm_load(a), glmm_load(b)));
|
||||||
|
#else
|
||||||
|
return sqrtf(glm_pow2(b[0] - a[0])
|
||||||
|
+ glm_pow2(b[1] - a[1])
|
||||||
|
+ glm_pow2(b[2] - a[2])
|
||||||
|
+ glm_pow2(b[3] - a[3]));
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief max values of vectors
|
* @brief max values of vectors
|
||||||
*
|
*
|
||||||
* @param[in] v1 vector1
|
* @param[in] a vector1
|
||||||
* @param[in] v2 vector2
|
* @param[in] b vector2
|
||||||
* @param[out] dest destination
|
* @param[out] dest destination
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec4_maxv(vec4 v1, vec4 v2, vec4 dest) {
|
glm_vec4_maxv(const vec4 a, const vec4 b, vec4 dest) {
|
||||||
dest[0] = glm_max(v1[0], v2[0]);
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
dest[1] = glm_max(v1[1], v2[1]);
|
glmm_store(dest, _mm_max_ps(glmm_load(a), glmm_load(b)));
|
||||||
dest[2] = glm_max(v1[2], v2[2]);
|
#elif defined(CGLM_NEON_FP)
|
||||||
dest[3] = glm_max(v1[3], v2[3]);
|
vst1q_f32(dest, vmaxq_f32(vld1q_f32(a), vld1q_f32(b)));
|
||||||
|
#else
|
||||||
|
dest[0] = glm_max(a[0], b[0]);
|
||||||
|
dest[1] = glm_max(a[1], b[1]);
|
||||||
|
dest[2] = glm_max(a[2], b[2]);
|
||||||
|
dest[3] = glm_max(a[3], b[3]);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief min values of vectors
|
* @brief min values of vectors
|
||||||
*
|
*
|
||||||
* @param[in] v1 vector1
|
* @param[in] a vector1
|
||||||
* @param[in] v2 vector2
|
* @param[in] b vector2
|
||||||
* @param[out] dest destination
|
* @param[out] dest destination
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec4_minv(vec4 v1, vec4 v2, vec4 dest) {
|
glm_vec4_minv(const vec4 a, const vec4 b, vec4 dest) {
|
||||||
dest[0] = glm_min(v1[0], v2[0]);
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
dest[1] = glm_min(v1[1], v2[1]);
|
glmm_store(dest, _mm_min_ps(glmm_load(a), glmm_load(b)));
|
||||||
dest[2] = glm_min(v1[2], v2[2]);
|
#elif defined(CGLM_NEON_FP)
|
||||||
dest[3] = glm_min(v1[3], v2[3]);
|
vst1q_f32(dest, vminq_f32(vld1q_f32(a), vld1q_f32(b)));
|
||||||
|
#else
|
||||||
|
dest[0] = glm_min(a[0], b[0]);
|
||||||
|
dest[1] = glm_min(a[1], b[1]);
|
||||||
|
dest[2] = glm_min(a[2], b[2]);
|
||||||
|
dest[3] = glm_min(a[3], b[3]);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief clamp vector's individual members between min and max values
|
||||||
|
*
|
||||||
|
* @param[in, out] v vector
|
||||||
|
* @param[in] minVal minimum value
|
||||||
|
* @param[in] maxVal maximum value
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec4_clamp(vec4 v, float minVal, float maxVal) {
|
||||||
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
|
glmm_store(v, _mm_min_ps(_mm_max_ps(glmm_load(v), _mm_set1_ps(minVal)),
|
||||||
|
_mm_set1_ps(maxVal)));
|
||||||
|
#elif defined(CGLM_NEON_FP)
|
||||||
|
vst1q_f32(v, vminq_f32(vmaxq_f32(vld1q_f32(v), vdupq_n_f32(minVal)),
|
||||||
|
vdupq_n_f32(maxVal)));
|
||||||
|
#else
|
||||||
|
v[0] = glm_clamp(v[0], minVal, maxVal);
|
||||||
|
v[1] = glm_clamp(v[1], minVal, maxVal);
|
||||||
|
v[2] = glm_clamp(v[2], minVal, maxVal);
|
||||||
|
v[3] = glm_clamp(v[3], minVal, maxVal);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief linear interpolation between two vector
|
||||||
|
*
|
||||||
|
* formula: from + s * (to - from)
|
||||||
|
*
|
||||||
|
* @param[in] from from value
|
||||||
|
* @param[in] to to value
|
||||||
|
* @param[in] t interpolant (amount) clamped between 0 and 1
|
||||||
|
* @param[out] dest destination
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec4_lerp(const vec4 from, const vec4 to, float t, vec4 dest) {
|
||||||
|
vec4 s, v;
|
||||||
|
|
||||||
|
/* from + s * (to - from) */
|
||||||
|
glm_vec4_broadcast(glm_clamp_zo(t), s);
|
||||||
|
glm_vec4_sub(to, from, v);
|
||||||
|
glm_vec4_mul(s, v, v);
|
||||||
|
glm_vec4_add(from, v, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief helper to fill vec4 as [S^3, S^2, S, 1]
|
||||||
|
*
|
||||||
|
* @param[in] s parameter
|
||||||
|
* @param[out] dest destination
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec4_cubic(float s, vec4 dest) {
|
||||||
|
float ss;
|
||||||
|
|
||||||
|
ss = s * s;
|
||||||
|
|
||||||
|
dest[0] = ss * s;
|
||||||
|
dest[1] = ss;
|
||||||
|
dest[2] = s;
|
||||||
|
dest[3] = 1.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* cglm_vec4_h */
|
#endif /* cglm_vec4_h */
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
#define cglm_version_h
|
#define cglm_version_h
|
||||||
|
|
||||||
#define CGLM_VERSION_MAJOR 0
|
#define CGLM_VERSION_MAJOR 0
|
||||||
#define CGLM_VERSION_MINOR 3
|
#define CGLM_VERSION_MINOR 5
|
||||||
#define CGLM_VERSION_PATCH 4
|
#define CGLM_VERSION_PATCH 4
|
||||||
|
|
||||||
#endif /* cglm_version_h */
|
#endif /* cglm_version_h */
|
||||||
|
|||||||
76
makefile.am
76
makefile.am
@@ -34,27 +34,32 @@ test_tests_CFLAGS = $(checkCFLAGS)
|
|||||||
|
|
||||||
cglmdir=$(includedir)/cglm
|
cglmdir=$(includedir)/cglm
|
||||||
cglm_HEADERS = include/cglm/version.h \
|
cglm_HEADERS = include/cglm/version.h \
|
||||||
include/cglm/cglm.h \
|
include/cglm/cglm.h \
|
||||||
include/cglm/call.h \
|
include/cglm/call.h \
|
||||||
include/cglm/cam.h \
|
include/cglm/cam.h \
|
||||||
include/cglm/io.h \
|
include/cglm/io.h \
|
||||||
include/cglm/mat4.h \
|
include/cglm/mat4.h \
|
||||||
include/cglm/mat3.h \
|
include/cglm/mat3.h \
|
||||||
include/cglm/types.h \
|
include/cglm/types.h \
|
||||||
include/cglm/common.h \
|
include/cglm/common.h \
|
||||||
include/cglm/affine.h \
|
include/cglm/affine.h \
|
||||||
include/cglm/vec3.h \
|
include/cglm/vec3.h \
|
||||||
include/cglm/vec3-ext.h \
|
include/cglm/vec3-ext.h \
|
||||||
include/cglm/vec4.h \
|
include/cglm/vec4.h \
|
||||||
include/cglm/vec4-ext.h \
|
include/cglm/vec4-ext.h \
|
||||||
include/cglm/euler.h \
|
include/cglm/euler.h \
|
||||||
include/cglm/util.h \
|
include/cglm/util.h \
|
||||||
include/cglm/quat.h \
|
include/cglm/quat.h \
|
||||||
include/cglm/affine-mat.h \
|
include/cglm/affine-mat.h \
|
||||||
include/cglm/plane.h \
|
include/cglm/plane.h \
|
||||||
include/cglm/frustum.h \
|
include/cglm/frustum.h \
|
||||||
include/cglm/box.h \
|
include/cglm/box.h \
|
||||||
include/cglm/color.h
|
include/cglm/color.h \
|
||||||
|
include/cglm/project.h \
|
||||||
|
include/cglm/sphere.h \
|
||||||
|
include/cglm/ease.h \
|
||||||
|
include/cglm/curve.h \
|
||||||
|
include/cglm/bezier.h
|
||||||
|
|
||||||
cglm_calldir=$(includedir)/cglm/call
|
cglm_calldir=$(includedir)/cglm/call
|
||||||
cglm_call_HEADERS = include/cglm/call/mat4.h \
|
cglm_call_HEADERS = include/cglm/call/mat4.h \
|
||||||
@@ -68,10 +73,17 @@ cglm_call_HEADERS = include/cglm/call/mat4.h \
|
|||||||
include/cglm/call/euler.h \
|
include/cglm/call/euler.h \
|
||||||
include/cglm/call/plane.h \
|
include/cglm/call/plane.h \
|
||||||
include/cglm/call/frustum.h \
|
include/cglm/call/frustum.h \
|
||||||
include/cglm/call/box.h
|
include/cglm/call/box.h \
|
||||||
|
include/cglm/call/project.h \
|
||||||
|
include/cglm/call/sphere.h \
|
||||||
|
include/cglm/call/ease.h \
|
||||||
|
include/cglm/call/curve.h \
|
||||||
|
include/cglm/call/bezier.h
|
||||||
|
|
||||||
cglm_simddir=$(includedir)/cglm/simd
|
cglm_simddir=$(includedir)/cglm/simd
|
||||||
cglm_simd_HEADERS = include/cglm/simd/intrin.h
|
cglm_simd_HEADERS = include/cglm/simd/intrin.h \
|
||||||
|
include/cglm/simd/x86.h \
|
||||||
|
include/cglm/simd/arm.h
|
||||||
|
|
||||||
cglm_simd_sse2dir=$(includedir)/cglm/simd/sse2
|
cglm_simd_sse2dir=$(includedir)/cglm/simd/sse2
|
||||||
cglm_simd_sse2_HEADERS = include/cglm/simd/sse2/affine.h \
|
cglm_simd_sse2_HEADERS = include/cglm/simd/sse2/affine.h \
|
||||||
@@ -98,13 +110,27 @@ libcglm_la_SOURCES=\
|
|||||||
src/mat4.c \
|
src/mat4.c \
|
||||||
src/plane.c \
|
src/plane.c \
|
||||||
src/frustum.c \
|
src/frustum.c \
|
||||||
src/box.c
|
src/box.c \
|
||||||
|
src/project.c \
|
||||||
|
src/sphere.c \
|
||||||
|
src/ease.c \
|
||||||
|
src/curve.c \
|
||||||
|
src/bezier.c
|
||||||
|
|
||||||
test_tests_SOURCES=\
|
test_tests_SOURCES=\
|
||||||
test/src/test_common.c \
|
test/src/test_common.c \
|
||||||
test/src/test_main.c \
|
test/src/test_main.c \
|
||||||
test/src/test_mat4.c \
|
test/src/test_mat4.c \
|
||||||
test/src/test_cam.c
|
test/src/test_cam.c \
|
||||||
|
test/src/test_project.c \
|
||||||
|
test/src/test_clamp.c \
|
||||||
|
test/src/test_euler.c \
|
||||||
|
test/src/test_quat.c \
|
||||||
|
test/src/test_vec4.c \
|
||||||
|
test/src/test_vec3.c \
|
||||||
|
test/src/test_mat3.c \
|
||||||
|
test/src/test_affine.c \
|
||||||
|
test/src/test_bezier.c
|
||||||
|
|
||||||
all-local:
|
all-local:
|
||||||
sh ./post-build.sh
|
sh ./post-build.sh
|
||||||
|
|||||||
@@ -8,12 +8,17 @@
|
|||||||
|
|
||||||
cd $(dirname "$0")
|
cd $(dirname "$0")
|
||||||
|
|
||||||
mkdir -p .libs
|
mkdir -p "$(pwd)/.libs"
|
||||||
|
|
||||||
|
libmocka_folder=$(pwd)/test/lib/cmocka/build/src/
|
||||||
|
|
||||||
if [ "$(uname)" = "Darwin" ]; then
|
if [ "$(uname)" = "Darwin" ]; then
|
||||||
ln -sf $(pwd)/test/lib/cmocka/build/src/libcmocka.0.dylib \
|
libcmocka=libcmocka.0.dylib
|
||||||
.libs/libcmocka.0.dylib;
|
|
||||||
else
|
else
|
||||||
ln -sf $(pwd)/test/lib/cmocka/build/src/libcmocka.so.0 \
|
libcmocka=libcmocka.so.0
|
||||||
.libs/libcmocka.so.0;
|
fi
|
||||||
|
|
||||||
|
libcmocka_path="$libmocka_folder$libcmocka"
|
||||||
|
if [ -f "$libcmocka_path" ]; then
|
||||||
|
ln -sf "$libcmocka_path" "$(pwd)/.libs/$libcmocka";
|
||||||
fi
|
fi
|
||||||
|
|||||||
90
src/affine.c
90
src/affine.c
@@ -10,13 +10,19 @@
|
|||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_translate_to(mat4 m, vec3 v, mat4 dest) {
|
glmc_translate_make(mat4 m, const vec3 v) {
|
||||||
|
glm_translate_make(m, v);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_translate_to(const mat4 m, const vec3 v, mat4 dest) {
|
||||||
glm_translate_to(m, v, dest);
|
glm_translate_to(m, v, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_translate(mat4 m, vec3 v) {
|
glmc_translate(mat4 m, const vec3 v) {
|
||||||
glm_translate(m, v);
|
glm_translate(m, v);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -40,78 +46,108 @@ glmc_translate_z(mat4 m, float to) {
|
|||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_scale_to(mat4 m, vec3 v, mat4 dest) {
|
glmc_scale_make(mat4 m, const vec3 v) {
|
||||||
|
glm_scale_make(m, v);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_scale_to(const mat4 m, const vec3 v, mat4 dest) {
|
||||||
glm_scale_to(m, v, dest);
|
glm_scale_to(m, v, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_scale(mat4 m, vec3 v) {
|
glmc_scale(mat4 m, const vec3 v) {
|
||||||
glm_scale(m, v);
|
glm_scale(m, v);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_scale1(mat4 m, float s) {
|
glmc_scale_uni(mat4 m, float s) {
|
||||||
glm_scale1(m, s);
|
glm_scale_uni(m, s);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_rotate_x(mat4 m, float rad, mat4 dest) {
|
glmc_rotate_x(const mat4 m, float rad, mat4 dest) {
|
||||||
glm_rotate_x(m, rad, dest);
|
glm_rotate_x(m, rad, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_rotate_y(mat4 m, float rad, mat4 dest) {
|
glmc_rotate_y(const mat4 m, float rad, mat4 dest) {
|
||||||
glm_rotate_y(m, rad, dest);
|
glm_rotate_y(m, rad, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_rotate_z(mat4 m, float rad, mat4 dest) {
|
glmc_rotate_z(const mat4 m, float rad, mat4 dest) {
|
||||||
glm_rotate_z(m, rad, dest);
|
glm_rotate_z(m, rad, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_rotate_ndc_make(mat4 m, float angle, vec3 axis_ndc) {
|
glmc_rotate_make(mat4 m, float angle, const vec3 axis) {
|
||||||
glm_rotate_ndc_make(m, angle, axis_ndc);
|
|
||||||
}
|
|
||||||
|
|
||||||
CGLM_EXPORT
|
|
||||||
void
|
|
||||||
glmc_rotate_make(mat4 m, float angle, vec3 axis) {
|
|
||||||
glm_rotate_make(m, angle, axis);
|
glm_rotate_make(m, angle, axis);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_rotate_ndc(mat4 m, float angle, vec3 axis_ndc) {
|
glmc_rotate(mat4 m, float angle, const vec3 axis) {
|
||||||
glm_rotate_ndc(m, angle, axis_ndc);
|
|
||||||
}
|
|
||||||
|
|
||||||
CGLM_EXPORT
|
|
||||||
void
|
|
||||||
glmc_rotate(mat4 m, float angle, vec3 axis) {
|
|
||||||
glm_rotate(m, angle, axis);
|
glm_rotate(m, angle, axis);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_decompose_scalev(mat4 m, vec3 s) {
|
glmc_rotate_at(mat4 m, const vec3 pivot, float angle, const vec3 axis) {
|
||||||
glm_decompose_scalev(m, s);
|
glm_rotate_at(m, pivot, angle, axis);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_decompose_rs(mat4 m, mat4 r, vec3 s) {
|
glmc_rotate_atm(mat4 m, const vec3 pivot, float angle, const vec3 axis) {
|
||||||
|
glm_rotate_atm(m, pivot, angle, axis);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_decompose_scalev(const mat4 m, vec3 s) {
|
||||||
|
glm_decompose_scalev(m, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
bool
|
||||||
|
glmc_uniscaled(const mat4 m) {
|
||||||
|
return glm_uniscaled(m);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_decompose_rs(const mat4 m, mat4 r, vec3 s) {
|
||||||
glm_decompose_rs(m, r, s);
|
glm_decompose_rs(m, r, s);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_decompose(mat4 m, vec4 t, mat4 r, vec3 s) {
|
glmc_decompose(const mat4 m, vec4 t, mat4 r, vec3 s) {
|
||||||
glm_decompose(m, t, r, s);
|
glm_decompose(m, t, r, s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mul(const mat4 m1, const mat4 m2, mat4 dest) {
|
||||||
|
glm_mul(m1, m2, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mul_rot(const mat4 m1, const mat4 m2, mat4 dest) {
|
||||||
|
glm_mul_rot(m1, m2, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_inv_tr(mat4 mat) {
|
||||||
|
glm_inv_tr(mat);
|
||||||
|
}
|
||||||
|
|||||||
27
src/bezier.c
Normal file
27
src/bezier.c
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "../include/cglm/cglm.h"
|
||||||
|
#include "../include/cglm/call.h"
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_bezier(float s, float p0, float c0, float c1, float p1) {
|
||||||
|
return glm_bezier(s, p0, c0, c1, p1);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_hermite(float s, float p0, float t0, float t1, float p1) {
|
||||||
|
return glm_hermite(s, p0, t0, t1, p1);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_decasteljau(float prm, float p0, float c0, float c1, float p1) {
|
||||||
|
return glm_decasteljau(prm, p0, c0, c1, p1);
|
||||||
|
}
|
||||||
74
src/box.c
74
src/box.c
@@ -10,27 +10,87 @@
|
|||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_aabb_transform(vec3 box[2], mat4 m, vec3 dest[2]) {
|
glmc_aabb_transform(const vec3 box[2], const mat4 m, vec3 dest[2]) {
|
||||||
glm_aabb_transform(box, m, dest);
|
glm_aabb_transform(box, m, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_aabb_merge(vec3 box1[2], vec3 box2[2], vec3 dest[2]) {
|
glmc_aabb_merge(const vec3 box1[2], const vec3 box2[2], vec3 dest[2]) {
|
||||||
glm_aabb_merge(box1, box2, dest);
|
glm_aabb_merge(box1, box2, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_aabb_crop(vec3 box[2], vec3 cropBox[2], vec3 dest[2]) {
|
glmc_aabb_crop(const vec3 box[2], const vec3 cropBox[2], vec3 dest[2]) {
|
||||||
glm_aabb_crop(box, cropBox, dest);
|
glm_aabb_crop(box, cropBox, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_aabb_crop_until(vec3 box[2],
|
glmc_aabb_crop_until(const vec3 box[2],
|
||||||
vec3 cropBox[2],
|
const vec3 cropBox[2],
|
||||||
vec3 clampBox[2],
|
const vec3 clampBox[2],
|
||||||
vec3 dest[2]) {
|
vec3 dest[2]) {
|
||||||
glm_aabb_crop_until(box, cropBox, clampBox, dest);
|
glm_aabb_crop_until(box, cropBox, clampBox, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
bool
|
||||||
|
glmc_aabb_frustum(const vec3 box[2], vec4 planes[6]) {
|
||||||
|
return glm_aabb_frustum(box, planes);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_aabb_invalidate(vec3 box[2]) {
|
||||||
|
glm_aabb_invalidate(box);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
bool
|
||||||
|
glmc_aabb_isvalid(const vec3 box[2]) {
|
||||||
|
return glm_aabb_isvalid(box);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_aabb_size(const vec3 box[2]) {
|
||||||
|
return glm_aabb_size(box);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_aabb_radius(const vec3 box[2]) {
|
||||||
|
return glm_aabb_radius(box);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_aabb_center(const vec3 box[2], vec3 dest) {
|
||||||
|
glm_aabb_center(box, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
bool
|
||||||
|
glmc_aabb_aabb(const vec3 box[2], const vec3 other[2]) {
|
||||||
|
return glm_aabb_aabb(box, other);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
bool
|
||||||
|
glmc_aabb_point(const vec3 box[2], const vec3 point) {
|
||||||
|
return glm_aabb_point(box, point);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
bool
|
||||||
|
glmc_aabb_contains(const vec3 box[2], const vec3 other[2]) {
|
||||||
|
return glm_aabb_contains(box, other);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
bool
|
||||||
|
glmc_aabb_sphere(const vec3 box[2], const vec4 s) {
|
||||||
|
return glm_aabb_sphere(box, s);
|
||||||
|
}
|
||||||
|
|||||||
138
src/cam.c
138
src/cam.c
@@ -16,7 +16,7 @@ glmc_frustum(float left,
|
|||||||
float top,
|
float top,
|
||||||
float nearVal,
|
float nearVal,
|
||||||
float farVal,
|
float farVal,
|
||||||
mat4 dest) {
|
mat4 dest) {
|
||||||
glm_frustum(left,
|
glm_frustum(left,
|
||||||
right,
|
right,
|
||||||
bottom,
|
bottom,
|
||||||
@@ -34,7 +34,7 @@ glmc_ortho(float left,
|
|||||||
float top,
|
float top,
|
||||||
float nearVal,
|
float nearVal,
|
||||||
float farVal,
|
float farVal,
|
||||||
mat4 dest) {
|
mat4 dest) {
|
||||||
glm_ortho(left,
|
glm_ortho(left,
|
||||||
right,
|
right,
|
||||||
bottom,
|
bottom,
|
||||||
@@ -44,13 +44,43 @@ glmc_ortho(float left,
|
|||||||
dest);
|
dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_ortho_aabb(const vec3 box[2], mat4 dest) {
|
||||||
|
glm_ortho_aabb(box, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_ortho_aabb_p(const vec3 box[2], float padding, mat4 dest) {
|
||||||
|
glm_ortho_aabb_p(box, padding, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_ortho_aabb_pz(const vec3 box[2], float padding, mat4 dest) {
|
||||||
|
glm_ortho_aabb_pz(box, padding, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_ortho_default(float aspect, mat4 dest) {
|
||||||
|
glm_ortho_default(aspect, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_ortho_default_s(float aspect, float size, mat4 dest) {
|
||||||
|
glm_ortho_default_s(aspect, size, dest);
|
||||||
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_perspective(float fovy,
|
glmc_perspective(float fovy,
|
||||||
float aspect,
|
float aspect,
|
||||||
float nearVal,
|
float nearVal,
|
||||||
float farVal,
|
float farVal,
|
||||||
mat4 dest) {
|
mat4 dest) {
|
||||||
glm_perspective(fovy,
|
glm_perspective(fovy,
|
||||||
aspect,
|
aspect,
|
||||||
nearVal,
|
nearVal,
|
||||||
@@ -60,21 +90,111 @@ glmc_perspective(float fovy,
|
|||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_lookat(vec3 eye,
|
glmc_persp_move_far(mat4 proj, float deltaFar) {
|
||||||
vec3 center,
|
glm_persp_move_far(proj, deltaFar);
|
||||||
vec3 up,
|
}
|
||||||
mat4 dest) {
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_perspective_default(float aspect, mat4 dest) {
|
||||||
|
glm_perspective_default(aspect, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_perspective_resize(float aspect, mat4 proj) {
|
||||||
|
glm_perspective_resize(aspect, proj);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_lookat(const vec3 eye,
|
||||||
|
const vec3 center,
|
||||||
|
const vec3 up,
|
||||||
|
mat4 dest) {
|
||||||
glm_lookat(eye, center, up, dest);
|
glm_lookat(eye, center, up, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_look(vec3 eye, vec3 dir, vec3 up, mat4 dest) {
|
glmc_look(const vec3 eye, const vec3 dir, const vec3 up, mat4 dest) {
|
||||||
glm_look(eye, dir, up, dest);
|
glm_look(eye, dir, up, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_look_anyup(vec3 eye, vec3 dir, mat4 dest) {
|
glmc_look_anyup(const vec3 eye, const vec3 dir, mat4 dest) {
|
||||||
glm_look_anyup(eye, dir, dest);
|
glm_look_anyup(eye, dir, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_persp_decomp(const mat4 proj,
|
||||||
|
float * __restrict nearVal,
|
||||||
|
float * __restrict farVal,
|
||||||
|
float * __restrict top,
|
||||||
|
float * __restrict bottom,
|
||||||
|
float * __restrict left,
|
||||||
|
float * __restrict right) {
|
||||||
|
glm_persp_decomp(proj, nearVal, farVal, top, bottom, left, right);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_persp_decompv(const mat4 proj, float dest[6]) {
|
||||||
|
glm_persp_decompv(proj, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_persp_decomp_x(const mat4 proj,
|
||||||
|
float * __restrict left,
|
||||||
|
float * __restrict right) {
|
||||||
|
glm_persp_decomp_x(proj, left, right);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_persp_decomp_y(const mat4 proj,
|
||||||
|
float * __restrict top,
|
||||||
|
float * __restrict bottom) {
|
||||||
|
glm_persp_decomp_y(proj, top, bottom);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_persp_decomp_z(const mat4 proj,
|
||||||
|
float * __restrict nearVal,
|
||||||
|
float * __restrict farVal) {
|
||||||
|
glm_persp_decomp_z(proj, nearVal, farVal);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_persp_decomp_far(const mat4 proj, float * __restrict farVal) {
|
||||||
|
glm_persp_decomp_far(proj, farVal);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_persp_decomp_near(const mat4 proj, float * __restrict nearVal) {
|
||||||
|
glm_persp_decomp_near(proj, nearVal);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_persp_fovy(const mat4 proj) {
|
||||||
|
return glm_persp_fovy(proj);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_persp_aspect(const mat4 proj) {
|
||||||
|
return glm_persp_aspect(proj);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_persp_sizes(const mat4 proj, float fovy, vec4 dest) {
|
||||||
|
glm_persp_sizes(proj, fovy, dest);
|
||||||
|
}
|
||||||
|
|||||||
15
src/curve.c
Normal file
15
src/curve.c
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "../include/cglm/cglm.h"
|
||||||
|
#include "../include/cglm/call.h"
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_smc(float s, const mat4 m, const vec4 c) {
|
||||||
|
return glm_smc(s, m, c);
|
||||||
|
}
|
||||||
195
src/ease.c
Normal file
195
src/ease.c
Normal file
@@ -0,0 +1,195 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "../include/cglm/cglm.h"
|
||||||
|
#include "../include/cglm/call.h"
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_ease_linear(float t) {
|
||||||
|
return glm_ease_linear(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_ease_sine_in(float t) {
|
||||||
|
return glm_ease_sine_in(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_ease_sine_out(float t) {
|
||||||
|
return glm_ease_sine_out(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_ease_sine_inout(float t) {
|
||||||
|
return glm_ease_sine_inout(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_ease_quad_in(float t) {
|
||||||
|
return glm_ease_quad_in(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_ease_quad_out(float t) {
|
||||||
|
return glm_ease_quad_out(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_ease_quad_inout(float t) {
|
||||||
|
return glm_ease_quad_inout(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_ease_cubic_in(float t) {
|
||||||
|
return glm_ease_cubic_in(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_ease_cubic_out(float t) {
|
||||||
|
return glm_ease_cubic_out(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_ease_cubic_inout(float t) {
|
||||||
|
return glm_ease_cubic_inout(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_ease_quart_in(float t) {
|
||||||
|
return glm_ease_quart_in(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_ease_quart_out(float t) {
|
||||||
|
return glm_ease_quart_out(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_ease_quart_inout(float t) {
|
||||||
|
return glm_ease_quart_inout(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_ease_quint_in(float t) {
|
||||||
|
return glm_ease_quint_in(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_ease_quint_out(float t) {
|
||||||
|
return glm_ease_quint_out(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_ease_quint_inout(float t) {
|
||||||
|
return glm_ease_quint_inout(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_ease_exp_in(float t) {
|
||||||
|
return glm_ease_exp_in(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_ease_exp_out(float t) {
|
||||||
|
return glm_ease_exp_out(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_ease_exp_inout(float t) {
|
||||||
|
return glm_ease_exp_inout(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_ease_circ_in(float t) {
|
||||||
|
return glm_ease_circ_in(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_ease_circ_out(float t) {
|
||||||
|
return glm_ease_circ_out(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_ease_circ_inout(float t) {
|
||||||
|
return glm_ease_circ_inout(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_ease_back_in(float t) {
|
||||||
|
return glm_ease_back_in(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_ease_back_out(float t) {
|
||||||
|
return glm_ease_back_out(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_ease_back_inout(float t) {
|
||||||
|
return glm_ease_back_inout(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_ease_elast_in(float t) {
|
||||||
|
return glm_ease_elast_in(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_ease_elast_out(float t) {
|
||||||
|
return glm_ease_elast_out(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_ease_elast_inout(float t) {
|
||||||
|
return glm_ease_elast_inout(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_ease_bounce_out(float t) {
|
||||||
|
return glm_ease_bounce_out(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_ease_bounce_in(float t) {
|
||||||
|
return glm_ease_bounce_in(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_ease_bounce_inout(float t) {
|
||||||
|
return glm_ease_bounce_inout(t);
|
||||||
|
}
|
||||||
22
src/euler.c
22
src/euler.c
@@ -10,48 +10,54 @@
|
|||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_euler_angles(mat4 m, vec3 dest) {
|
glmc_euler_angles(const mat4 m, vec3 dest) {
|
||||||
glm_euler_angles(m, dest);
|
glm_euler_angles(m, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_euler(vec3 angles, mat4 dest) {
|
glmc_euler(const vec3 angles, mat4 dest) {
|
||||||
glm_euler(angles, dest);
|
glm_euler(angles, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_euler_zyx(vec3 angles, mat4 dest) {
|
glmc_euler_xyz(const vec3 angles, mat4 dest) {
|
||||||
|
glm_euler_xyz(angles, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_euler_zyx(const vec3 angles, mat4 dest) {
|
||||||
glm_euler_zyx(angles, dest);
|
glm_euler_zyx(angles, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_euler_zxy(vec3 angles, mat4 dest) {
|
glmc_euler_zxy(const vec3 angles, mat4 dest) {
|
||||||
glm_euler_zxy(angles, dest);
|
glm_euler_zxy(angles, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_euler_xzy(vec3 angles, mat4 dest) {
|
glmc_euler_xzy(const vec3 angles, mat4 dest) {
|
||||||
glm_euler_xzy(angles, dest);
|
glm_euler_xzy(angles, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_euler_yzx(vec3 angles, mat4 dest) {
|
glmc_euler_yzx(const vec3 angles, mat4 dest) {
|
||||||
glm_euler_yzx(angles, dest);
|
glm_euler_yzx(angles, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_euler_yxz(vec3 angles, mat4 dest) {
|
glmc_euler_yxz(const vec3 angles, mat4 dest) {
|
||||||
glm_euler_yxz(angles, dest);
|
glm_euler_yxz(angles, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_euler_by_order(vec3 angles, glm_euler_sq axis, mat4 dest) {
|
glmc_euler_by_order(const vec3 angles, glm_euler_sq axis, mat4 dest) {
|
||||||
glm_euler_by_order(angles, axis, dest);
|
glm_euler_by_order(angles, axis, dest);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,33 +10,33 @@
|
|||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_frustum_planes(mat4 m, vec4 dest[6]) {
|
glmc_frustum_planes(const mat4 m, vec4 dest[6]) {
|
||||||
glm_frustum_planes(m, dest);
|
glm_frustum_planes(m, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_frustum_corners(mat4 invMat, vec4 dest[8]) {
|
glmc_frustum_corners(const mat4 invMat, vec4 dest[8]) {
|
||||||
glm_frustum_corners(invMat, dest);
|
glm_frustum_corners(invMat, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_frustum_center(vec4 corners[8], vec4 dest) {
|
glmc_frustum_center(const vec4 corners[8], vec4 dest) {
|
||||||
glm_frustum_center(corners, dest);
|
glm_frustum_center(corners, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_frustum_box(vec4 corners[8], mat4 m, vec3 box[2]) {
|
glmc_frustum_box(const vec4 corners[8], const mat4 m, vec3 box[2]) {
|
||||||
glm_frustum_box(corners, m, box);
|
glm_frustum_box(corners, m, box);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_frustum_corners_at(vec4 corners[8],
|
glmc_frustum_corners_at(const vec4 corners[8],
|
||||||
float splitDist,
|
float splitDist,
|
||||||
float farDist,
|
float farDist,
|
||||||
vec4 planeCorners[4]) {
|
vec4 planeCorners[4]) {
|
||||||
glm_frustum_corners_at(corners, splitDist, farDist, planeCorners);
|
glm_frustum_corners_at(corners, splitDist, farDist, planeCorners);
|
||||||
}
|
}
|
||||||
|
|||||||
20
src/io.c
20
src/io.c
@@ -10,35 +10,35 @@
|
|||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_mat4_print(mat4 matrix,
|
glmc_mat4_print(const mat4 matrix,
|
||||||
FILE * __restrict ostream) {
|
FILE * const __restrict ostream) {
|
||||||
glm_mat4_print(matrix, ostream);
|
glm_mat4_print(matrix, ostream);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_mat3_print(mat3 matrix,
|
glmc_mat3_print(const mat3 matrix,
|
||||||
FILE * __restrict ostream) {
|
FILE * const __restrict ostream) {
|
||||||
glm_mat3_print(matrix, ostream);
|
glm_mat3_print(matrix, ostream);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec4_print(vec4 vec,
|
glmc_vec4_print(const vec4 vec,
|
||||||
FILE * __restrict ostream) {
|
FILE * const __restrict ostream) {
|
||||||
glm_vec4_print(vec, ostream);
|
glm_vec4_print(vec, ostream);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec3_print(vec3 vec,
|
glmc_vec3_print(const vec3 vec,
|
||||||
FILE * __restrict ostream) {
|
FILE * const __restrict ostream) {
|
||||||
glm_vec3_print(vec, ostream);
|
glm_vec3_print(vec, ostream);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_versor_print(versor vec,
|
glmc_versor_print(const versor vec,
|
||||||
FILE * __restrict ostream) {
|
FILE * const __restrict ostream) {
|
||||||
glm_versor_print(vec, ostream);
|
glm_versor_print(vec, ostream);
|
||||||
}
|
}
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user