mirror of
https://github.com/recp/cglm.git
synced 2026-02-17 03:39:05 +00:00
Compare commits
67 Commits
interpolat
...
v0.5.3
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
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 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -69,3 +69,4 @@ win/cglm_test_*
|
|||||||
win/x64
|
win/x64
|
||||||
win/x85
|
win/x85
|
||||||
win/Debug
|
win/Debug
|
||||||
|
cglm-test-ios*
|
||||||
|
|||||||
9
CREDITS
9
CREDITS
@@ -52,3 +52,12 @@ https://gamedev.stackexchange.com/questions/28395/rotating-vector3-by-a-quaterni
|
|||||||
|
|
||||||
9. Sphere AABB intersect
|
9. Sphere AABB intersect
|
||||||
https://github.com/erich666/GraphicsGems/blob/master/gems/BoxSphere.c
|
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
|
||||||
|
|||||||
82
README.md
82
README.md
@@ -16,7 +16,7 @@ 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
|
- **[bugfix]** euler angles was implemented in reverse order (extrinsic) it was fixed, now they are intrinsic. Make sure that
|
||||||
@@ -24,6 +24,8 @@ 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
|
- **[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_**
|
- **[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.
|
- **[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:
|
||||||
@@ -80,7 +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
|
- project, unproject
|
||||||
|
- easing functions
|
||||||
|
- curves
|
||||||
|
- curve interpolation helpers (S*M*C, deCasteljau...)
|
||||||
|
- and other...
|
||||||
|
|
||||||
<hr />
|
<hr />
|
||||||
|
|
||||||
@@ -122,39 +129,6 @@ glm_mul(T, R, modelMat);
|
|||||||
glm_inv_tr(modelMat);
|
glm_inv_tr(modelMat);
|
||||||
```
|
```
|
||||||
|
|
||||||
## Contributors
|
|
||||||
|
|
||||||
This project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)].
|
|
||||||
<a href="graphs/contributors"><img src="https://opencollective.com/cglm/contributors.svg?width=890&button=false" /></a>
|
|
||||||
|
|
||||||
|
|
||||||
## Backers
|
|
||||||
|
|
||||||
Thank you to all our backers! 🙏 [[Become a backer](https://opencollective.com/cglm#backer)]
|
|
||||||
|
|
||||||
<a href="https://opencollective.com/cglm#backers" target="_blank"><img src="https://opencollective.com/cglm/backers.svg?width=890"></a>
|
|
||||||
|
|
||||||
|
|
||||||
## Sponsors
|
|
||||||
|
|
||||||
Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [[Become a sponsor](https://opencollective.com/cglm#sponsor)]
|
|
||||||
|
|
||||||
<a href="https://opencollective.com/cglm/sponsor/0/website" target="_blank"><img src="https://opencollective.com/cglm/sponsor/0/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/cglm/sponsor/1/website" target="_blank"><img src="https://opencollective.com/cglm/sponsor/1/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/cglm/sponsor/2/website" target="_blank"><img src="https://opencollective.com/cglm/sponsor/2/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/cglm/sponsor/3/website" target="_blank"><img src="https://opencollective.com/cglm/sponsor/3/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/cglm/sponsor/4/website" target="_blank"><img src="https://opencollective.com/cglm/sponsor/4/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/cglm/sponsor/5/website" target="_blank"><img src="https://opencollective.com/cglm/sponsor/5/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/cglm/sponsor/6/website" target="_blank"><img src="https://opencollective.com/cglm/sponsor/6/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/cglm/sponsor/7/website" target="_blank"><img src="https://opencollective.com/cglm/sponsor/7/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/cglm/sponsor/8/website" target="_blank"><img src="https://opencollective.com/cglm/sponsor/8/avatar.svg"></a>
|
|
||||||
<a href="https://opencollective.com/cglm/sponsor/9/website" target="_blank"><img src="https://opencollective.com/cglm/sponsor/9/avatar.svg"></a>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## License
|
|
||||||
MIT. check the LICENSE file
|
|
||||||
|
|
||||||
## Build
|
## Build
|
||||||
|
|
||||||
### Unix (Autotools)
|
### Unix (Autotools)
|
||||||
@@ -201,15 +175,15 @@ If you want to use inline versions of funcstions then; include main header
|
|||||||
```
|
```
|
||||||
the header 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
|
||||||
|
|
||||||
@@ -220,7 +194,7 @@ to call pre-compiled versions include header with `c` postfix, c means call. Pre
|
|||||||
```
|
```
|
||||||
this header will include all headers 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:
|
||||||
@@ -284,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
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ Pod::Spec.new do |s|
|
|||||||
|
|
||||||
# Description
|
# Description
|
||||||
s.name = "cglm"
|
s.name = "cglm"
|
||||||
s.version = "0.4.6"
|
s.version = "0.5.1"
|
||||||
s.summary = "📽 Optimized OpenGL/Graphics Math (glm) for C"
|
s.summary = "📽 Optimized OpenGL/Graphics Math (glm) for C"
|
||||||
s.description = <<-DESC
|
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.
|
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.
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
#*****************************************************************************
|
#*****************************************************************************
|
||||||
|
|
||||||
AC_PREREQ([2.69])
|
AC_PREREQ([2.69])
|
||||||
AC_INIT([cglm], [0.4.8], [info@recp.me])
|
AC_INIT([cglm], [0.5.3], [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.
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -46,3 +46,5 @@ Follow the :doc:`build` documentation for this
|
|||||||
io
|
io
|
||||||
call
|
call
|
||||||
sphere
|
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
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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.4.8'
|
version = u'0.5.3'
|
||||||
# The full version, including alpha/beta/rc tags.
|
# The full version, including alpha/beta/rc tags.
|
||||||
release = u'0.4.8'
|
release = u'0.5.3'
|
||||||
|
|
||||||
# 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.
|
||||||
|
|||||||
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
|
||||||
@@ -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.
|
||||||
|
|||||||
@@ -20,6 +20,8 @@ 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`
|
||||||
@@ -28,8 +30,10 @@ Functions:
|
|||||||
#. :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
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
@@ -49,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
|
||||||
@@ -124,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
|
||||||
@@ -141,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,8 @@ 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_quat`
|
||||||
#. :c:func:`glm_mat4_transpose_to`
|
#. :c:func:`glm_mat4_transpose_to`
|
||||||
#. :c:func:`glm_mat4_transpose`
|
#. :c:func:`glm_mat4_transpose`
|
||||||
@@ -42,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
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
@@ -69,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
|
||||||
@@ -147,6 +167,27 @@ 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)
|
.. c:function:: void glm_mat4_quat(mat4 m, versor dest)
|
||||||
|
|
||||||
convert mat4's rotation part to quaternion
|
convert mat4's rotation part to quaternion
|
||||||
@@ -238,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
|
||||||
|
|||||||
@@ -40,3 +40,13 @@ SSE and SSE2 Shuffle Option
|
|||||||
**_mm_shuffle_ps** generates **shufps** instruction even if registers are same.
|
**_mm_shuffle_ps** generates **shufps** instruction even if registers are same.
|
||||||
You can force it to generate **pshufd** instruction by defining
|
You can force it to generate **pshufd** instruction by defining
|
||||||
**CGLM_USE_INT_DOMAIN** macro. As default it is not defined.
|
**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.
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ 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_init`
|
||||||
#. :c:func:`glm_quat`
|
#. :c:func:`glm_quat`
|
||||||
#. :c:func:`glm_quatv`
|
#. :c:func:`glm_quatv`
|
||||||
@@ -70,6 +71,14 @@ 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)
|
.. c:function:: void glm_quat_init(versor q, float x, float y, float z, float w)
|
||||||
|
|
||||||
| inits quaternion with given values
|
| inits quaternion with given values
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ Wrong Results:
|
|||||||
|
|
||||||
Again, you may used wrong function.
|
Again, you may used wrong function.
|
||||||
|
|
||||||
For instance if you use **glm_normalize()** or **glm_vec_normalize()** for **vec4**,
|
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**.
|
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.
|
Since you need to **vec4** to be normalized in your case, you will get wrong results.
|
||||||
|
|
||||||
|
|||||||
@@ -14,25 +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_vec_isnan`
|
#. :c:func:`glm_vec3_isnan`
|
||||||
#. :c:func:`glm_vec_isinf`
|
#. :c:func:`glm_vec3_isinf`
|
||||||
#. :c:func:`glm_vec_isvalid`
|
#. :c:func:`glm_vec3_isvalid`
|
||||||
#. :c:func:`glm_vec_sign`
|
#. :c:func:`glm_vec3_sign`
|
||||||
#. :c:func:`glm_vec_sqrt`
|
#. :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
|
||||||
|
|
||||||
@@ -41,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
|
||||||
|
|
||||||
@@ -49,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)
|
||||||
|
|
||||||
@@ -57,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)
|
||||||
|
|
||||||
@@ -65,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
|
||||||
|
|
||||||
@@ -80,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)
|
||||||
|
|
||||||
@@ -88,21 +88,21 @@ 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_vec_isnan(vec3 v)
|
.. c:function:: bool glm_vec3_isnan(vec3 v)
|
||||||
|
|
||||||
| check if one of items is NaN (not a number)
|
| check if one of items is NaN (not a number)
|
||||||
| you should only use this in DEBUG mode or very critical asserts
|
| you should only use this in DEBUG mode or very critical asserts
|
||||||
@@ -110,7 +110,7 @@ Functions documentation
|
|||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **v** vector
|
| *[in]* **v** vector
|
||||||
|
|
||||||
.. c:function:: bool glm_vec_isinf(vec3 v)
|
.. c:function:: bool glm_vec3_isinf(vec3 v)
|
||||||
|
|
||||||
| check if one of items is INFINITY
|
| check if one of items is INFINITY
|
||||||
| you should only use this in DEBUG mode or very critical asserts
|
| you should only use this in DEBUG mode or very critical asserts
|
||||||
@@ -118,7 +118,7 @@ Functions documentation
|
|||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **v** vector
|
| *[in]* **v** vector
|
||||||
|
|
||||||
.. c:function:: bool glm_vec_isvalid(vec3 v)
|
.. c:function:: bool glm_vec3_isvalid(vec3 v)
|
||||||
|
|
||||||
| check if all items are valid number
|
| check if all items are valid number
|
||||||
| you should only use this in DEBUG mode or very critical asserts
|
| you should only use this in DEBUG mode or very critical asserts
|
||||||
@@ -126,7 +126,7 @@ Functions documentation
|
|||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **v** vector
|
| *[in]* **v** vector
|
||||||
|
|
||||||
.. c:function:: void glm_vec_sign(vec3 v, vec3 dest)
|
.. c:function:: void glm_vec3_sign(vec3 v, vec3 dest)
|
||||||
|
|
||||||
get sign of 32 bit float as +1, -1, 0
|
get sign of 32 bit float as +1, -1, 0
|
||||||
|
|
||||||
@@ -134,7 +134,7 @@ Functions documentation
|
|||||||
| *[in]* **v** vector
|
| *[in]* **v** vector
|
||||||
| *[out]* **dest** sign vector (only keeps signs as -1, 0, -1)
|
| *[out]* **dest** sign vector (only keeps signs as -1, 0, -1)
|
||||||
|
|
||||||
.. c:function:: void glm_vec_sqrt(vec3 v, vec3 dest)
|
.. c:function:: void glm_vec3_sqrt(vec3 v, vec3 dest)
|
||||||
|
|
||||||
square root of each vector item
|
square root of each vector item
|
||||||
|
|
||||||
|
|||||||
@@ -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,45 +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_zero`
|
#. :c:func:`glm_vec3_zero`
|
||||||
#. :c:func:`glm_vec_one`
|
#. :c:func:`glm_vec3_one`
|
||||||
#. :c:func:`glm_vec_dot`
|
#. :c:func:`glm_vec3_dot`
|
||||||
#. :c:func:`glm_vec_cross`
|
#. :c:func:`glm_vec3_norm2`
|
||||||
#. :c:func:`glm_vec_norm2`
|
#. :c:func:`glm_vec3_norm`
|
||||||
#. :c:func:`glm_vec_norm`
|
#. :c:func:`glm_vec3_add`
|
||||||
#. :c:func:`glm_vec_add`
|
#. :c:func:`glm_vec3_adds`
|
||||||
#. :c:func:`glm_vec_adds`
|
#. :c:func:`glm_vec3_sub`
|
||||||
#. :c:func:`glm_vec_sub`
|
#. :c:func:`glm_vec3_subs`
|
||||||
#. :c:func:`glm_vec_subs`
|
#. :c:func:`glm_vec3_mul`
|
||||||
#. :c:func:`glm_vec_mul`
|
#. :c:func:`glm_vec3_scale`
|
||||||
#. :c:func:`glm_vec_scale`
|
#. :c:func:`glm_vec3_scale_as`
|
||||||
#. :c:func:`glm_vec_scale_as`
|
#. :c:func:`glm_vec3_div`
|
||||||
#. :c:func:`glm_vec_div`
|
#. :c:func:`glm_vec3_divs`
|
||||||
#. :c:func:`glm_vec_divs`
|
#. :c:func:`glm_vec3_addadd`
|
||||||
#. :c:func:`glm_vec_addadd`
|
#. :c:func:`glm_vec3_subadd`
|
||||||
#. :c:func:`glm_vec_subadd`
|
#. :c:func:`glm_vec3_muladd`
|
||||||
#. :c:func:`glm_vec_muladd`
|
#. :c:func:`glm_vec3_muladds`
|
||||||
#. :c:func:`glm_vec_muladds`
|
#. :c:func:`glm_vec3_maxadd`
|
||||||
#. :c:func:`glm_vec_flipsign`
|
#. :c:func:`glm_vec3_minadd`
|
||||||
#. :c:func:`glm_vec_flipsign_to`
|
#. :c:func:`glm_vec3_flipsign`
|
||||||
#. :c:func:`glm_vec_inv`
|
#. :c:func:`glm_vec3_flipsign_to`
|
||||||
#. :c:func:`glm_vec_inv_to`
|
#. :c:func:`glm_vec3_inv`
|
||||||
#. :c:func:`glm_vec_normalize`
|
#. :c:func:`glm_vec3_inv_to`
|
||||||
#. :c:func:`glm_vec_normalize_to`
|
#. :c:func:`glm_vec3_negate`
|
||||||
#. :c:func:`glm_vec_distance2`
|
#. :c:func:`glm_vec3_negate_to`
|
||||||
#. :c:func:`glm_vec_distance`
|
#. :c:func:`glm_vec3_normalize`
|
||||||
#. :c:func:`glm_vec_angle`
|
#. :c:func:`glm_vec3_normalize_to`
|
||||||
#. :c:func:`glm_vec_rotate`
|
#. :c:func:`glm_vec3_cross`
|
||||||
#. :c:func:`glm_vec_rotate_m4`
|
#. :c:func:`glm_vec3_crossn`
|
||||||
#. :c:func:`glm_vec_rotate_m3`
|
#. :c:func:`glm_vec3_distance2`
|
||||||
#. :c:func:`glm_vec_proj`
|
#. :c:func:`glm_vec3_distance`
|
||||||
#. :c:func:`glm_vec_center`
|
#. :c:func:`glm_vec3_angle`
|
||||||
#. :c:func:`glm_vec_maxv`
|
#. :c:func:`glm_vec3_rotate`
|
||||||
#. :c:func:`glm_vec_minv`
|
#. :c:func:`glm_vec3_rotate_m4`
|
||||||
#. :c:func:`glm_vec_ortho`
|
#. :c:func:`glm_vec3_rotate_m3`
|
||||||
#. :c:func:`glm_vec_clamp`
|
#. :c:func:`glm_vec3_proj`
|
||||||
#. :c:func:`glm_vec_lerp`
|
#. :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
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
@@ -81,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]
|
||||||
|
|
||||||
@@ -89,21 +99,21 @@ Functions documentation
|
|||||||
| *[in]* **a** source
|
| *[in]* **a** source
|
||||||
| *[out]* **dest** destination
|
| *[out]* **dest** destination
|
||||||
|
|
||||||
.. c:function:: void glm_vec_zero(vec3 v)
|
.. c:function:: void glm_vec3_zero(vec3 v)
|
||||||
|
|
||||||
makes all members 0.0f (zero)
|
makes all members 0.0f (zero)
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in, out]* **v** vector
|
| *[in, out]* **v** vector
|
||||||
|
|
||||||
.. c:function:: void glm_vec_one(vec3 v)
|
.. c:function:: void glm_vec3_one(vec3 v)
|
||||||
|
|
||||||
makes all members 1.0f (one)
|
makes all members 1.0f (one)
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in, out]* **v** vector
|
| *[in, out]* **v** vector
|
||||||
|
|
||||||
.. c:function:: float glm_vec_dot(vec3 a, vec3 b)
|
.. c:function:: float glm_vec3_dot(vec3 a, vec3 b)
|
||||||
|
|
||||||
dot product of vec3
|
dot product of vec3
|
||||||
|
|
||||||
@@ -114,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
|
||||||
|
|
||||||
@@ -137,14 +156,14 @@ 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 a, vec3 b, vec3 dest)
|
.. c:function:: void glm_vec3_add(vec3 a, vec3 b, vec3 dest)
|
||||||
|
|
||||||
add a vector to b vector store result in dest
|
add a vector to b vector store result in dest
|
||||||
|
|
||||||
@@ -153,7 +172,7 @@ Functions documentation
|
|||||||
| *[in]* **b** vector2
|
| *[in]* **b** vector2
|
||||||
| *[out]* **dest** destination vector
|
| *[out]* **dest** destination vector
|
||||||
|
|
||||||
.. c:function:: void glm_vec_adds(vec3 a, float s, vec3 dest)
|
.. c:function:: void glm_vec3_adds(vec3 a, float s, vec3 dest)
|
||||||
|
|
||||||
add scalar to v vector store result in dest (d = v + vec(s))
|
add scalar to v vector store result in dest (d = v + vec(s))
|
||||||
|
|
||||||
@@ -162,7 +181,7 @@ Functions documentation
|
|||||||
| *[in]* **s** scalar
|
| *[in]* **s** scalar
|
||||||
| *[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_sub(vec3 v1, vec3 v2, vec3 dest)
|
||||||
|
|
||||||
subtract b vector from a vector store result in dest (d = v1 - v2)
|
subtract b vector from a vector store result in dest (d = v1 - v2)
|
||||||
|
|
||||||
@@ -171,7 +190,7 @@ Functions documentation
|
|||||||
| *[in]* **b** vector2
|
| *[in]* **b** vector2
|
||||||
| *[out]* **dest** destination vector
|
| *[out]* **dest** destination vector
|
||||||
|
|
||||||
.. c:function:: void glm_vec_subs(vec3 v, float s, vec3 dest)
|
.. 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))
|
subtract scalar from v vector store result in dest (d = v - vec(s))
|
||||||
|
|
||||||
@@ -180,7 +199,7 @@ Functions documentation
|
|||||||
| *[in]* **s** scalar
|
| *[in]* **s** scalar
|
||||||
| *[out]* **dest** destination vector
|
| *[out]* **dest** destination vector
|
||||||
|
|
||||||
.. c:function:: void glm_vec_mul(vec3 a, vec3 b, vec3 d)
|
.. c:function:: void glm_vec3_mul(vec3 a, vec3 b, vec3 d)
|
||||||
|
|
||||||
multiply two vector (component-wise multiplication)
|
multiply two vector (component-wise multiplication)
|
||||||
|
|
||||||
@@ -189,7 +208,7 @@ Functions documentation
|
|||||||
| *[in]* **b** scalar
|
| *[in]* **b** scalar
|
||||||
| *[out]* **d** result = (a[0] * b[0], a[1] * b[1], a[2] * b[2])
|
| *[out]* **d** result = (a[0] * b[0], a[1] * b[1], a[2] * b[2])
|
||||||
|
|
||||||
.. c:function:: void glm_vec_scale(vec3 v, float s, vec3 dest)
|
.. 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
|
||||||
|
|
||||||
@@ -199,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
|
||||||
|
|
||||||
@@ -208,7 +227,7 @@ Functions documentation
|
|||||||
| *[in]* **s** scalar
|
| *[in]* **s** scalar
|
||||||
| *[out]* **dest** destination vector
|
| *[out]* **dest** destination vector
|
||||||
|
|
||||||
.. c:function:: void glm_vec_div(vec3 a, vec3 b, vec3 dest)
|
.. c:function:: void glm_vec3_div(vec3 a, vec3 b, vec3 dest)
|
||||||
|
|
||||||
div vector with another component-wise division: d = a / b
|
div vector with another component-wise division: d = a / b
|
||||||
|
|
||||||
@@ -217,7 +236,7 @@ Functions documentation
|
|||||||
| *[in]* **b** vector 2
|
| *[in]* **b** vector 2
|
||||||
| *[out]* **dest** result = (a[0] / b[0], a[1] / b[1], a[2] / b[2])
|
| *[out]* **dest** result = (a[0] / b[0], a[1] / b[1], a[2] / b[2])
|
||||||
|
|
||||||
.. c:function:: void glm_vec_divs(vec3 v, float s, vec3 dest)
|
.. c:function:: void glm_vec3_divs(vec3 v, float s, vec3 dest)
|
||||||
|
|
||||||
div vector with scalar: d = v / s
|
div vector with scalar: d = v / s
|
||||||
|
|
||||||
@@ -226,7 +245,7 @@ Functions documentation
|
|||||||
| *[in]* **s** scalar
|
| *[in]* **s** scalar
|
||||||
| *[out]* **dest** result = (a[0] / s, a[1] / s, a[2] / s])
|
| *[out]* **dest** result = (a[0] / s, a[1] / s, a[2] / s])
|
||||||
|
|
||||||
.. c:function:: void glm_vec_addadd(vec3 a, vec3 b, vec3 dest)
|
.. c:function:: void glm_vec3_addadd(vec3 a, vec3 b, vec3 dest)
|
||||||
|
|
||||||
| add two vectors and add result to sum
|
| add two vectors and add result to sum
|
||||||
| it applies += operator so dest must be initialized
|
| it applies += operator so dest must be initialized
|
||||||
@@ -236,7 +255,7 @@ Functions documentation
|
|||||||
| *[in]* **b** vector 2
|
| *[in]* **b** vector 2
|
||||||
| *[out]* **dest** dest += (a + b)
|
| *[out]* **dest** dest += (a + b)
|
||||||
|
|
||||||
.. c:function:: void glm_vec_subadd(vec3 a, vec3 b, vec3 dest)
|
.. c:function:: void glm_vec3_subadd(vec3 a, vec3 b, vec3 dest)
|
||||||
|
|
||||||
| sub two vectors and add result to sum
|
| sub two vectors and add result to sum
|
||||||
| it applies += operator so dest must be initialized
|
| it applies += operator so dest must be initialized
|
||||||
@@ -246,7 +265,7 @@ Functions documentation
|
|||||||
| *[in]* **b** vector 2
|
| *[in]* **b** vector 2
|
||||||
| *[out]* **dest** dest += (a - b)
|
| *[out]* **dest** dest += (a - b)
|
||||||
|
|
||||||
.. c:function:: void glm_vec_muladd(vec3 a, vec3 b, vec3 dest)
|
.. c:function:: void glm_vec3_muladd(vec3 a, vec3 b, vec3 dest)
|
||||||
|
|
||||||
| mul two vectors and add result to sum
|
| mul two vectors and add result to sum
|
||||||
| it applies += operator so dest must be initialized
|
| it applies += operator so dest must be initialized
|
||||||
@@ -256,7 +275,7 @@ Functions documentation
|
|||||||
| *[in]* **b** vector 2
|
| *[in]* **b** vector 2
|
||||||
| *[out]* **dest** dest += (a * b)
|
| *[out]* **dest** dest += (a * b)
|
||||||
|
|
||||||
.. c:function:: void glm_vec_muladds(vec3 a, float s, vec3 dest)
|
.. c:function:: void glm_vec3_muladds(vec3 a, float s, vec3 dest)
|
||||||
|
|
||||||
| mul vector with scalar and add result to sum
|
| mul vector with scalar and add result to sum
|
||||||
| it applies += operator so dest must be initialized
|
| it applies += operator so dest must be initialized
|
||||||
@@ -266,44 +285,87 @@ Functions documentation
|
|||||||
| *[in]* **s** scalar
|
| *[in]* **s** scalar
|
||||||
| *[out]* **dest** dest += (a * b)
|
| *[out]* **dest** dest += (a * b)
|
||||||
|
|
||||||
.. c:function:: void glm_vec_flipsign(vec3 v)
|
.. c:function:: void glm_vec3_maxadd(vec3 a, vec3 b, vec3 dest)
|
||||||
|
|
||||||
flip sign of all vec3 members
|
| 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_flipsign_to(vec3 v, vec3 dest)
|
.. c:function:: void glm_vec3_flipsign_to(vec3 v, vec3 dest)
|
||||||
|
|
||||||
flip sign of all vec3 members and store result in dest
|
**DEPRACATED!**
|
||||||
|
|
||||||
|
use :c:func:`glm_vec3_negate_to`
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **v** vector
|
| *[in]* **v** vector
|
||||||
| *[out]* **dest** negated vector
|
| *[out]* **dest** negated vector
|
||||||
|
|
||||||
.. c:function:: void glm_vec_inv(vec3 v)
|
.. c:function:: void glm_vec3_inv(vec3 v)
|
||||||
|
|
||||||
make vector as inverse/opposite of itself
|
**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_inv_to(vec3 v, vec3 dest)
|
||||||
|
|
||||||
inverse/opposite vector
|
**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
|
||||||
|
|
||||||
@@ -311,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
|
||||||
|
|
||||||
@@ -322,7 +384,7 @@ 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
|
||||||
|
|
||||||
@@ -331,7 +393,7 @@ Functions documentation
|
|||||||
| *[in]* **axis** axis vector (will be normalized)
|
| *[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
|
||||||
|
|
||||||
@@ -340,7 +402,7 @@ Functions documentation
|
|||||||
| *[in]* **v** vector
|
| *[in]* **v** vector
|
||||||
| *[out]* **dest** rotated vector
|
| *[out]* **dest** rotated vector
|
||||||
|
|
||||||
.. c:function:: void glm_vec_rotate_m3(mat3 m, vec3 v, vec3 dest)
|
.. c:function:: void glm_vec3_rotate_m3(mat3 m, vec3 v, vec3 dest)
|
||||||
|
|
||||||
apply rotation matrix to vector
|
apply rotation matrix to vector
|
||||||
|
|
||||||
@@ -349,7 +411,7 @@ 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_proj(vec3 a, vec3 b, vec3 dest)
|
||||||
|
|
||||||
project a vector onto b vector
|
project a vector onto b vector
|
||||||
|
|
||||||
@@ -358,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
|
||||||
|
|
||||||
@@ -367,7 +429,7 @@ Functions documentation
|
|||||||
| *[in]* **v2** vector2
|
| *[in]* **v2** vector2
|
||||||
| *[out]* **dest** center point
|
| *[out]* **dest** center point
|
||||||
|
|
||||||
.. c:function:: float glm_vec_distance2(vec3 v1, vec3 v2)
|
.. c:function:: float glm_vec3_distance2(vec3 v1, vec3 v2)
|
||||||
|
|
||||||
squared distance between two vectors
|
squared distance between two vectors
|
||||||
|
|
||||||
@@ -378,7 +440,7 @@ Functions documentation
|
|||||||
Returns:
|
Returns:
|
||||||
| squared distance (distance * distance)
|
| squared distance (distance * distance)
|
||||||
|
|
||||||
.. c:function:: float glm_vec_distance(vec3 v1, vec3 v2)
|
.. c:function:: float glm_vec3_distance(vec3 v1, vec3 v2)
|
||||||
|
|
||||||
distance between two vectors
|
distance between two vectors
|
||||||
|
|
||||||
@@ -389,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
|
||||||
|
|
||||||
@@ -398,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
|
||||||
|
|
||||||
@@ -407,7 +469,7 @@ 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
|
||||||
|
|
||||||
@@ -415,7 +477,7 @@ Functions documentation
|
|||||||
| *[in]* **mat** vector
|
| *[in]* **mat** vector
|
||||||
| *[out]* **dest** orthogonal/perpendicular vector
|
| *[out]* **dest** orthogonal/perpendicular vector
|
||||||
|
|
||||||
.. c:function:: void glm_vec_clamp(vec3 v, float minVal, float maxVal)
|
.. c:function:: void glm_vec3_clamp(vec3 v, float minVal, float maxVal)
|
||||||
|
|
||||||
constrain a value to lie between two further values
|
constrain a value to lie between two further values
|
||||||
|
|
||||||
@@ -424,7 +486,7 @@ Functions documentation
|
|||||||
| *[in]* **minVal** minimum value
|
| *[in]* **minVal** minimum value
|
||||||
| *[in]* **maxVal** maximum value
|
| *[in]* **maxVal** maximum value
|
||||||
|
|
||||||
.. c:function:: void glm_vec_lerp(vec3 from, vec3 to, float t, vec3 dest)
|
.. c:function:: void glm_vec3_lerp(vec3 from, vec3 to, float t, vec3 dest)
|
||||||
|
|
||||||
linear interpolation between two vector
|
linear interpolation between two vector
|
||||||
|
|
||||||
|
|||||||
@@ -43,10 +43,14 @@ Functions:
|
|||||||
#. :c:func:`glm_vec4_subadd`
|
#. :c:func:`glm_vec4_subadd`
|
||||||
#. :c:func:`glm_vec4_muladd`
|
#. :c:func:`glm_vec4_muladd`
|
||||||
#. :c:func:`glm_vec4_muladds`
|
#. :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_vec_flipsign_to`
|
#. :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`
|
||||||
@@ -54,11 +58,7 @@ Functions:
|
|||||||
#. :c:func:`glm_vec4_minv`
|
#. :c:func:`glm_vec4_minv`
|
||||||
#. :c:func:`glm_vec4_clamp`
|
#. :c:func:`glm_vec4_clamp`
|
||||||
#. :c:func:`glm_vec4_lerp`
|
#. :c:func:`glm_vec4_lerp`
|
||||||
#. :c:func:`glm_vec4_isnan`
|
#. :c:func:`glm_vec4_cubic`
|
||||||
#. :c:func:`glm_vec4_isinf`
|
|
||||||
#. :c:func:`glm_vec4_isvalid`
|
|
||||||
#. :c:func:`glm_vec4_sign`
|
|
||||||
#. :c:func:`glm_vec4_sqrt`
|
|
||||||
|
|
||||||
Functions documentation
|
Functions documentation
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
@@ -260,16 +260,40 @@ Functions documentation
|
|||||||
| *[in]* **s** scalar
|
| *[in]* **s** scalar
|
||||||
| *[out]* **dest** dest += (a * b)
|
| *[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)
|
.. c:function:: void glm_vec4_flipsign_to(vec4 v, vec4 dest)
|
||||||
|
|
||||||
flip sign of all vec4 members and store result in dest
|
**DEPRACATED!**
|
||||||
|
|
||||||
|
use :c:func:`glm_vec4_negate_to`
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **v** vector
|
| *[in]* **v** vector
|
||||||
@@ -277,19 +301,38 @@ Functions documentation
|
|||||||
|
|
||||||
.. 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
|
||||||
@@ -354,3 +397,11 @@ Functions documentation
|
|||||||
| *[in]* **to** to value
|
| *[in]* **to** to value
|
||||||
| *[in]* **t** interpolant (amount) clamped between 0 and 1
|
| *[in]* **t** interpolant (amount) clamped between 0 and 1
|
||||||
| *[out]* **dest** destination
|
| *[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
|
||||||
|
|||||||
@@ -151,7 +151,7 @@ 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(16) vec3 t;
|
||||||
|
|
||||||
/* rotate */
|
/* rotate */
|
||||||
@@ -160,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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -170,7 +170,7 @@ CGLM_INLINE
|
|||||||
void
|
void
|
||||||
glm_translate_make(mat4 m, vec3 v) {
|
glm_translate_make(mat4 m, vec3 v) {
|
||||||
glm_mat4_identity(m);
|
glm_mat4_identity(m);
|
||||||
glm_vec_copy(v, m[3]);
|
glm_vec3_copy(v, m[3]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -244,7 +244,7 @@ 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(mat4 m, float angle, mat4 dest) {
|
||||||
CGLM_ALIGN(16) mat4 t = GLM_MAT4_IDENTITY_INIT;
|
CGLM_ALIGN_MAT mat4 t = GLM_MAT4_IDENTITY_INIT;
|
||||||
float c, s;
|
float c, s;
|
||||||
|
|
||||||
c = cosf(angle);
|
c = cosf(angle);
|
||||||
@@ -269,7 +269,7 @@ 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(mat4 m, float angle, mat4 dest) {
|
||||||
CGLM_ALIGN(16) mat4 t = GLM_MAT4_IDENTITY_INIT;
|
CGLM_ALIGN_MAT mat4 t = GLM_MAT4_IDENTITY_INIT;
|
||||||
float c, s;
|
float c, s;
|
||||||
|
|
||||||
c = cosf(angle);
|
c = cosf(angle);
|
||||||
@@ -294,7 +294,7 @@ 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(mat4 m, float angle, mat4 dest) {
|
||||||
CGLM_ALIGN(16) mat4 t = GLM_MAT4_IDENTITY_INIT;
|
CGLM_ALIGN_MAT mat4 t = GLM_MAT4_IDENTITY_INIT;
|
||||||
float c, s;
|
float c, s;
|
||||||
|
|
||||||
c = cosf(angle);
|
c = cosf(angle);
|
||||||
@@ -325,13 +325,13 @@ glm_rotate_make(mat4 m, float angle, vec3 axis) {
|
|||||||
|
|
||||||
c = cosf(angle);
|
c = cosf(angle);
|
||||||
|
|
||||||
glm_vec_normalize_to(axis, axisn);
|
glm_vec3_normalize_to(axis, axisn);
|
||||||
glm_vec_scale(axisn, 1.0f - c, v);
|
glm_vec3_scale(axisn, 1.0f - c, v);
|
||||||
glm_vec_scale(axisn, sinf(angle), vs);
|
glm_vec3_scale(axisn, sinf(angle), vs);
|
||||||
|
|
||||||
glm_vec_scale(axisn, v[0], m[0]);
|
glm_vec3_scale(axisn, v[0], m[0]);
|
||||||
glm_vec_scale(axisn, v[1], m[1]);
|
glm_vec3_scale(axisn, v[1], m[1]);
|
||||||
glm_vec_scale(axisn, v[2], m[2]);
|
glm_vec3_scale(axisn, v[2], m[2]);
|
||||||
|
|
||||||
m[0][0] += c; m[1][0] -= vs[2]; m[2][0] += vs[1];
|
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][1] += vs[2]; m[1][1] += c; m[2][1] -= vs[0];
|
||||||
@@ -351,7 +351,7 @@ glm_rotate_make(mat4 m, float angle, vec3 axis) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_rotate(mat4 m, float angle, vec3 axis) {
|
glm_rotate(mat4 m, float angle, vec3 axis) {
|
||||||
CGLM_ALIGN(16) mat4 rot;
|
CGLM_ALIGN_MAT mat4 rot;
|
||||||
glm_rotate_make(rot, angle, axis);
|
glm_rotate_make(rot, angle, axis);
|
||||||
glm_mul_rot(m, rot, m);
|
glm_mul_rot(m, rot, m);
|
||||||
}
|
}
|
||||||
@@ -370,7 +370,7 @@ void
|
|||||||
glm_rotate_at(mat4 m, vec3 pivot, float angle, vec3 axis) {
|
glm_rotate_at(mat4 m, vec3 pivot, float angle, vec3 axis) {
|
||||||
CGLM_ALIGN(8) vec3 pivotInv;
|
CGLM_ALIGN(8) vec3 pivotInv;
|
||||||
|
|
||||||
glm_vec_inv_to(pivot, pivotInv);
|
glm_vec3_negate_to(pivot, pivotInv);
|
||||||
|
|
||||||
glm_translate(m, pivot);
|
glm_translate(m, pivot);
|
||||||
glm_rotate(m, angle, axis);
|
glm_rotate(m, angle, axis);
|
||||||
@@ -395,7 +395,7 @@ void
|
|||||||
glm_rotate_atm(mat4 m, vec3 pivot, float angle, vec3 axis) {
|
glm_rotate_atm(mat4 m, vec3 pivot, float angle, vec3 axis) {
|
||||||
CGLM_ALIGN(8) vec3 pivotInv;
|
CGLM_ALIGN(8) vec3 pivotInv;
|
||||||
|
|
||||||
glm_vec_inv_to(pivot, pivotInv);
|
glm_vec3_negate_to(pivot, pivotInv);
|
||||||
|
|
||||||
glm_translate_make(m, pivot);
|
glm_translate_make(m, pivot);
|
||||||
glm_rotate(m, angle, axis);
|
glm_rotate(m, angle, axis);
|
||||||
@@ -411,9 +411,9 @@ glm_rotate_atm(mat4 m, vec3 pivot, float angle, vec3 axis) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_decompose_scalev(mat4 m, vec3 s) {
|
glm_decompose_scalev(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]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -429,7 +429,7 @@ bool
|
|||||||
glm_uniscaled(mat4 m) {
|
glm_uniscaled(mat4 m) {
|
||||||
CGLM_ALIGN(8) vec3 s;
|
CGLM_ALIGN(8) vec3 s;
|
||||||
glm_decompose_scalev(m, s);
|
glm_decompose_scalev(m, s);
|
||||||
return glm_vec_eq_all(s);
|
return glm_vec3_eq_all(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -451,9 +451,9 @@ glm_decompose_rs(mat4 m, mat4 r, vec3 s) {
|
|||||||
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]);
|
||||||
@@ -462,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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,12 +8,34 @@
|
|||||||
#ifndef cglm_bezier_h
|
#ifndef cglm_bezier_h
|
||||||
#define 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
|
* @brief cubic bezier interpolation
|
||||||
*
|
*
|
||||||
* @param[in] t time between 0 and 1
|
* 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] p0 begin point
|
||||||
* @param[in] c0 control point 1
|
* @param[in] c0 control point 1
|
||||||
* @param[in] c1 control point 2
|
* @param[in] c1 control point 2
|
||||||
@@ -23,102 +45,108 @@
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
float
|
float
|
||||||
glm_bezier_cubic(float t, float p0, float c0, float c1, float p1) {
|
glm_bezier(float s, float p0, float c0, float c1, float p1) {
|
||||||
float s, ss, tt;
|
float x, xx, ss, xs3, a;
|
||||||
|
|
||||||
s = 1.0f - t;
|
x = 1.0f - s;
|
||||||
ss = s * s;
|
xx = x * x;
|
||||||
tt = t * t;
|
ss = s * s;
|
||||||
|
xs3 = (s - ss) * 3.0f;
|
||||||
|
a = p0 * xx + c0 * xs3;
|
||||||
|
|
||||||
return p0 * ss * s + 3.0f * c0 * t * ss + 3.0f * c1 * tt * s + p1 * tt * t;
|
return a + s * (c1 * xs3 + p1 * ss - a);
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief cubic bezier interpolation for vec3
|
|
||||||
*
|
|
||||||
* @param[in] t time 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
|
|
||||||
* @param[in] dest destination
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_bezier_cubicv3(float t, vec3 p0, vec3 c0, vec3 c1, vec3 p1, vec3 dest) {
|
|
||||||
vec3 Bs, tmp0, tmp1, tmp2;
|
|
||||||
float s, ss, tt;
|
|
||||||
|
|
||||||
s = 1.0f - t;
|
|
||||||
ss = s * s;
|
|
||||||
tt = t * t;
|
|
||||||
|
|
||||||
glm_vec_scale(p0, ss * s, Bs);
|
|
||||||
glm_vec_scale(c0, 3.0f * t * ss, tmp0);
|
|
||||||
glm_vec_scale(c1, 3.0f * tt * s, tmp1);
|
|
||||||
glm_vec_scale(p1, tt * t, tmp2);
|
|
||||||
|
|
||||||
glm_vec_add(Bs, tmp0, Bs);
|
|
||||||
glm_vec_add(Bs, tmp1, Bs);
|
|
||||||
glm_vec_add(Bs, tmp2, Bs);
|
|
||||||
|
|
||||||
glm_vec_copy(Bs, dest);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief cubic hermite interpolation
|
* @brief cubic hermite interpolation
|
||||||
*
|
*
|
||||||
* @param[in] t time between 0 and 1
|
* 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] p0 begin point
|
||||||
* @param[in] t0 tangent 1
|
* @param[in] t0 tangent 1
|
||||||
* @param[in] t1 tangent 2
|
* @param[in] t1 tangent 2
|
||||||
* @param[in] p1 end point
|
* @param[in] p1 end point
|
||||||
*
|
*
|
||||||
* @return B(s)
|
* @return H(s)
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
float
|
float
|
||||||
glm_hermite_cubic(float t, float p0, float t0, float t1, float p1) {
|
glm_hermite(float s, float p0, float t0, float t1, float p1) {
|
||||||
float tt, ttt;
|
float ss, d, a, b, c, e, f;
|
||||||
|
|
||||||
tt = t * t;
|
ss = s * s;
|
||||||
ttt = tt * t;
|
a = ss + ss;
|
||||||
|
c = a + ss;
|
||||||
|
b = a * s;
|
||||||
|
d = s * ss;
|
||||||
|
f = d - ss;
|
||||||
|
e = b - c;
|
||||||
|
|
||||||
return p0 * (2.0f * ttt - 3.0f * tt + 1)
|
return p0 * (e + 1.0f) + t0 * (f - ss + s) + t1 * f - p1 * e;
|
||||||
+ t0 * (ttt - 2.0f * tt + t)
|
|
||||||
+ p1 * (3.0f * tt - 2.0f * ttt)
|
|
||||||
- t1 * (ttt - tt);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief cubic hermite interpolation for vec3
|
* @brief iterative way to solve cubic equation
|
||||||
*
|
*
|
||||||
* @param[in] t time between 0 and 1
|
* @param[in] prm parameter between 0 and 1
|
||||||
* @param[in] p0 begin point
|
* @param[in] p0 begin point
|
||||||
* @param[in] t0 tangent 1
|
* @param[in] c0 control point 1
|
||||||
* @param[in] t1 tangent 2
|
* @param[in] c1 control point 2
|
||||||
* @param[in] p1 end point
|
* @param[in] p1 end point
|
||||||
* @param[in] dest destination
|
*
|
||||||
|
* @return parameter to use in cubic equation
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
float
|
||||||
glm_hermite_cubicv3(float t, vec3 p0, vec3 t0, vec3 t1, vec3 p1, vec3 dest) {
|
glm_decasteljau(float prm, float p0, float c0, float c1, float p1) {
|
||||||
vec3 Hs, tmp0, tmp1, tmp2;
|
float u, v, a, b, c, d, e, f;
|
||||||
float tt, ttt;
|
int i;
|
||||||
|
|
||||||
tt = t * t;
|
if (prm - p0 < CGLM_DECASTEL_SMALL)
|
||||||
ttt = tt * t;
|
return 0.0f;
|
||||||
|
|
||||||
glm_vec_scale(p0, 2.0f * ttt - 3.0f * tt + 1, Hs);
|
if (p1 - prm < CGLM_DECASTEL_SMALL)
|
||||||
glm_vec_scale(t0, ttt - 2.0f * tt + t, tmp0);
|
return 1.0f;
|
||||||
glm_vec_scale(p1, 3.0f * tt - 2.0f * ttt, tmp1);
|
|
||||||
glm_vec_scale(t1, ttt - tt, tmp2);
|
|
||||||
|
|
||||||
glm_vec_add(Hs, tmp0, Hs);
|
u = 0.0f;
|
||||||
glm_vec_add(Hs, tmp1, Hs);
|
v = 1.0f;
|
||||||
glm_vec_add(Hs, tmp2, Hs);
|
|
||||||
|
|
||||||
glm_vec_copy(Hs, dest);
|
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 */
|
#endif /* cglm_bezier_h */
|
||||||
|
|||||||
@@ -23,35 +23,31 @@
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_aabb_transform(vec3 box[2], mat4 m, vec3 dest[2]) {
|
glm_aabb_transform(vec3 box[2], 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]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -162,8 +158,8 @@ glm_aabb_frustum(vec3 box[2], vec4 planes[6]) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_aabb_invalidate(vec3 box[2]) {
|
glm_aabb_invalidate(vec3 box[2]) {
|
||||||
glm_vec_broadcast(FLT_MAX, box[0]);
|
glm_vec3_broadcast(FLT_MAX, box[0]);
|
||||||
glm_vec_broadcast(-FLT_MAX, box[1]);
|
glm_vec3_broadcast(-FLT_MAX, box[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -174,8 +170,8 @@ glm_aabb_invalidate(vec3 box[2]) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
bool
|
bool
|
||||||
glm_aabb_isvalid(vec3 box[2]) {
|
glm_aabb_isvalid(vec3 box[2]) {
|
||||||
return glm_vec_max(box[0]) != FLT_MAX
|
return glm_vec3_max(box[0]) != FLT_MAX
|
||||||
&& glm_vec_min(box[1]) != -FLT_MAX;
|
&& glm_vec3_min(box[1]) != -FLT_MAX;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -186,7 +182,7 @@ glm_aabb_isvalid(vec3 box[2]) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
float
|
float
|
||||||
glm_aabb_size(vec3 box[2]) {
|
glm_aabb_size(vec3 box[2]) {
|
||||||
return glm_vec_distance(box[0], box[1]);
|
return glm_vec3_distance(box[0], box[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -209,7 +205,7 @@ glm_aabb_radius(vec3 box[2]) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_aabb_center(vec3 box[2], vec3 dest) {
|
glm_aabb_center(vec3 box[2], vec3 dest) {
|
||||||
glm_vec_center(box[0], box[1], dest);
|
glm_vec3_center(box[0], box[1], dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
|||||||
@@ -27,6 +27,8 @@ extern "C" {
|
|||||||
#include "call/project.h"
|
#include "call/project.h"
|
||||||
#include "call/sphere.h"
|
#include "call/sphere.h"
|
||||||
#include "call/ease.h"
|
#include "call/ease.h"
|
||||||
|
#include "call/curve.h"
|
||||||
|
#include "call/bezier.h"
|
||||||
|
|
||||||
#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 */
|
||||||
@@ -61,6 +61,10 @@ glmc_perspective(float fovy,
|
|||||||
float farVal,
|
float farVal,
|
||||||
mat4 dest);
|
mat4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_persp_move_far(mat4 proj, float deltaFar);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_perspective_default(float aspect, mat4 dest);
|
glmc_perspective_default(float aspect, mat4 dest);
|
||||||
|
|||||||
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, mat4 m, vec4 c);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* cglmc_curve_h */
|
||||||
@@ -137,4 +137,7 @@ CGLM_EXPORT
|
|||||||
float
|
float
|
||||||
glmc_ease_bounce_inout(float t);
|
glmc_ease_bounce_inout(float t);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
#endif /* cglmc_ease_h */
|
#endif /* cglmc_ease_h */
|
||||||
|
|||||||
@@ -24,6 +24,10 @@ CGLM_EXPORT
|
|||||||
void
|
void
|
||||||
glmc_mat3_identity(mat3 mat);
|
glmc_mat3_identity(mat3 mat);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat3_identity_array(mat3 * __restrict mat, size_t count);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_mat3_mul(mat3 m1, mat3 m2, mat3 dest);
|
glmc_mat3_mul(mat3 m1, mat3 m2, mat3 dest);
|
||||||
@@ -40,6 +44,10 @@ CGLM_EXPORT
|
|||||||
void
|
void
|
||||||
glmc_mat3_mulv(mat3 m, vec3 v, vec3 dest);
|
glmc_mat3_mulv(mat3 m, vec3 v, vec3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_mat3_trace(mat3 m);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_mat3_quat(mat3 m, versor dest);
|
glmc_mat3_quat(mat3 m, versor dest);
|
||||||
@@ -64,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(vec3 r, mat3 m, vec3 c);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -29,6 +29,10 @@ CGLM_EXPORT
|
|||||||
void
|
void
|
||||||
glmc_mat4_identity(mat4 mat);
|
glmc_mat4_identity(mat4 mat);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat4_identity_array(mat4 * __restrict mat, size_t count);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_mat4_pick3(mat4 mat, mat3 dest);
|
glmc_mat4_pick3(mat4 mat, mat3 dest);
|
||||||
@@ -57,6 +61,14 @@ CGLM_EXPORT
|
|||||||
void
|
void
|
||||||
glmc_mat4_mulv3(mat4 m, vec3 v, float last, vec3 dest);
|
glmc_mat4_mulv3(mat4 m, vec3 v, float last, vec3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_mat4_trace(mat4 m);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_mat4_trace3(mat4 m);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_mat4_quat(mat4 m, versor dest);
|
glmc_mat4_quat(mat4 m, versor dest);
|
||||||
@@ -101,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(vec4 r, mat4 m, vec4 c);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -17,6 +17,10 @@ CGLM_EXPORT
|
|||||||
void
|
void
|
||||||
glmc_quat_identity(versor q);
|
glmc_quat_identity(versor q);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_quat_identity_array(versor * __restrict q, size_t count);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_quat_init(versor q, float x, float y, float z, float w);
|
glmc_quat_init(versor q, float x, float y, float z, float w);
|
||||||
|
|||||||
@@ -33,4 +33,7 @@ CGLM_EXPORT
|
|||||||
bool
|
bool
|
||||||
glmc_sphere_point(vec4 s, vec3 point);
|
glmc_sphere_point(vec4 s, vec3 point);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
#endif /* cglmc_sphere_h */
|
#endif /* cglmc_sphere_h */
|
||||||
|
|||||||
@@ -14,7 +14,11 @@ 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
|
||||||
@@ -22,217 +26,221 @@ glmc_vec3(vec4 v4, vec3 dest);
|
|||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_copy(vec3 a, vec3 dest);
|
glmc_vec3_copy(vec3 a, vec3 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_zero(vec3 v);
|
glmc_vec3_zero(vec3 v);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_one(vec3 v);
|
glmc_vec3_one(vec3 v);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
float
|
float
|
||||||
glmc_vec_dot(vec3 a, vec3 b);
|
glmc_vec3_dot(vec3 a, vec3 b);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_cross(vec3 a, vec3 b, vec3 d);
|
glmc_vec3_cross(vec3 a, vec3 b, vec3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec3_crossn(vec3 a, vec3 b, vec3 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
float
|
float
|
||||||
glmc_vec_norm(vec3 vec);
|
glmc_vec3_norm(vec3 v);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
float
|
float
|
||||||
glmc_vec_norm2(vec3 vec);
|
glmc_vec3_norm2(vec3 v);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_normalize_to(vec3 vec, vec3 dest);
|
glmc_vec3_normalize_to(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(vec3 a, vec3 b, vec3 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_adds(vec3 v, float s, vec3 dest);
|
glmc_vec3_adds(vec3 v, float s, vec3 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_sub(vec3 a, vec3 b, vec3 dest);
|
glmc_vec3_sub(vec3 a, vec3 b, vec3 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_subs(vec3 v, float s, vec3 dest);
|
glmc_vec3_subs(vec3 v, float s, vec3 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_mul(vec3 a, vec3 b, vec3 d);
|
glmc_vec3_mul(vec3 a, vec3 b, vec3 d);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_scale(vec3 v, float s, vec3 dest);
|
glmc_vec3_scale(vec3 v, float s, vec3 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_scale_as(vec3 v, float s, vec3 dest);
|
glmc_vec3_scale_as(vec3 v, float s, vec3 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_div(vec3 a, vec3 b, vec3 dest);
|
glmc_vec3_div(vec3 a, vec3 b, vec3 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_divs(vec3 a, float s, vec3 dest);
|
glmc_vec3_divs(vec3 a, float s, vec3 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_addadd(vec3 a, vec3 b, vec3 dest);
|
glmc_vec3_addadd(vec3 a, vec3 b, vec3 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_subadd(vec3 a, vec3 b, vec3 dest);
|
glmc_vec3_subadd(vec3 a, vec3 b, vec3 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_muladd(vec3 a, vec3 b, vec3 dest);
|
glmc_vec3_muladd(vec3 a, vec3 b, vec3 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_muladds(vec3 a, float s, vec3 dest);
|
glmc_vec3_muladds(vec3 a, float s, vec3 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_flipsign(vec3 v);
|
glmc_vec3_maxadd(vec3 a, vec3 b, vec3 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_flipsign_to(vec3 v, vec3 dest);
|
glmc_vec3_minadd(vec3 a, vec3 b, vec3 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_inv(vec3 v);
|
glmc_vec3_negate(vec3 v);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_inv_to(vec3 v, vec3 dest);
|
glmc_vec3_negate_to(vec3 v, vec3 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
float
|
float
|
||||||
glmc_vec_angle(vec3 v1, vec3 v2);
|
glmc_vec3_angle(vec3 a, vec3 b);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_rotate(vec3 v, float angle, vec3 axis);
|
glmc_vec3_rotate(vec3 v, float angle, vec3 axis);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_rotate_m4(mat4 m, vec3 v, vec3 dest);
|
glmc_vec3_rotate_m4(mat4 m, vec3 v, vec3 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_rotate_m3(mat3 m, vec3 v, vec3 dest);
|
glmc_vec3_rotate_m3(mat3 m, vec3 v, vec3 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_proj(vec3 a, vec3 b, vec3 dest);
|
glmc_vec3_proj(vec3 a, vec3 b, vec3 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_center(vec3 v1, vec3 v2, vec3 dest);
|
glmc_vec3_center(vec3 a, vec3 b, vec3 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
float
|
float
|
||||||
glmc_vec_distance2(vec3 v1, vec3 v2);
|
glmc_vec3_distance2(vec3 a, vec3 b);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
float
|
float
|
||||||
glmc_vec_distance(vec3 v1, vec3 v2);
|
glmc_vec3_distance(vec3 a, vec3 b);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_maxv(vec3 v1, vec3 v2, vec3 dest);
|
glmc_vec3_maxv(vec3 a, vec3 b, vec3 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_minv(vec3 v1, vec3 v2, vec3 dest);
|
glmc_vec3_minv(vec3 a, vec3 b, vec3 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_clamp(vec3 v, float minVal, float maxVal);
|
glmc_vec3_clamp(vec3 v, float minVal, float maxVal);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_ortho(vec3 v, vec3 dest);
|
glmc_vec3_ortho(vec3 v, vec3 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_lerp(vec3 from, vec3 to, float t, vec3 dest);
|
glmc_vec3_lerp(vec3 from, vec3 to, float t, vec3 dest);
|
||||||
|
|
||||||
/* ext */
|
/* ext */
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_mulv(vec3 a, vec3 b, vec3 d);
|
glmc_vec3_mulv(vec3 a, vec3 b, vec3 d);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_broadcast(float val, vec3 d);
|
glmc_vec3_broadcast(float val, vec3 d);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
bool
|
bool
|
||||||
glmc_vec_eq(vec3 v, float val);
|
glmc_vec3_eq(vec3 v, float val);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
bool
|
bool
|
||||||
glmc_vec_eq_eps(vec3 v, float val);
|
glmc_vec3_eq_eps(vec3 v, float val);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
bool
|
bool
|
||||||
glmc_vec_eq_all(vec3 v);
|
glmc_vec3_eq_all(vec3 v);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
bool
|
bool
|
||||||
glmc_vec_eqv(vec3 v1, vec3 v2);
|
glmc_vec3_eqv(vec3 a, vec3 b);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
bool
|
bool
|
||||||
glmc_vec_eqv_eps(vec3 v1, vec3 v2);
|
glmc_vec3_eqv_eps(vec3 a, vec3 b);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
float
|
float
|
||||||
glmc_vec_max(vec3 v);
|
glmc_vec3_max(vec3 v);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
float
|
float
|
||||||
glmc_vec_min(vec3 v);
|
glmc_vec3_min(vec3 v);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
bool
|
bool
|
||||||
glmc_vec_isnan(vec3 v);
|
glmc_vec3_isnan(vec3 v);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
bool
|
bool
|
||||||
glmc_vec_isinf(vec3 v);
|
glmc_vec3_isinf(vec3 v);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
bool
|
bool
|
||||||
glmc_vec_isvalid(vec3 v);
|
glmc_vec3_isvalid(vec3 v);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_sign(vec3 v, vec3 dest);
|
glmc_vec3_sign(vec3 v, vec3 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_sqrt(vec3 v, vec3 dest);
|
glmc_vec3_sqrt(vec3 v, vec3 dest);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,8 +14,12 @@ 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
|
||||||
@@ -31,7 +35,7 @@ glmc_vec4_one(vec4 v);
|
|||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec4_copy3(vec4 a, vec3 dest);
|
glmc_vec4_copy3(vec4 v, vec3 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
@@ -47,15 +51,15 @@ glmc_vec4_dot(vec4 a, vec4 b);
|
|||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
float
|
float
|
||||||
glmc_vec4_norm(vec4 vec);
|
glmc_vec4_norm(vec4 v);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
float
|
float
|
||||||
glmc_vec4_norm2(vec4 vec);
|
glmc_vec4_norm2(vec4 v);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec4_normalize_to(vec4 vec, vec4 dest);
|
glmc_vec4_normalize_to(vec4 v, vec4 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
@@ -115,31 +119,31 @@ glmc_vec4_muladds(vec4 a, float s, vec4 dest);
|
|||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec4_flipsign(vec4 v);
|
glmc_vec4_maxadd(vec4 a, vec4 b, vec4 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec4_flipsign_to(vec4 v, vec4 dest);
|
glmc_vec4_minadd(vec4 a, vec4 b, vec4 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec4_inv(vec4 v);
|
glmc_vec4_negate(vec4 v);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec4_inv_to(vec4 v, vec4 dest);
|
glmc_vec4_negate_to(vec4 v, vec4 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
float
|
float
|
||||||
glmc_vec4_distance(vec4 v1, vec4 v2);
|
glmc_vec4_distance(vec4 a, vec4 b);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec4_maxv(vec4 v1, vec4 v2, vec4 dest);
|
glmc_vec4_maxv(vec4 a, vec4 b, vec4 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec4_minv(vec4 v1, vec4 v2, vec4 dest);
|
glmc_vec4_minv(vec4 a, vec4 b, vec4 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
@@ -149,6 +153,10 @@ CGLM_EXPORT
|
|||||||
void
|
void
|
||||||
glmc_vec4_lerp(vec4 from, vec4 to, float t, vec4 dest);
|
glmc_vec4_lerp(vec4 from, vec4 to, float t, vec4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec4_cubic(float s, vec4 dest);
|
||||||
|
|
||||||
/* ext */
|
/* ext */
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
@@ -173,11 +181,11 @@ glmc_vec4_eq_all(vec4 v);
|
|||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
bool
|
bool
|
||||||
glmc_vec4_eqv(vec4 v1, vec4 v2);
|
glmc_vec4_eqv(vec4 a, vec4 b);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
bool
|
bool
|
||||||
glmc_vec4_eqv_eps(vec4 v1, vec4 v2);
|
glmc_vec4_eqv_eps(vec4 a, vec4 b);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
float
|
float
|
||||||
|
|||||||
@@ -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);
|
||||||
@@ -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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -240,7 +229,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 +259,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 +271,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 +304,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 +318,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;
|
||||||
|
|
||||||
@@ -337,13 +344,11 @@ glm_lookat(vec3 eye,
|
|||||||
mat4 dest) {
|
mat4 dest) {
|
||||||
CGLM_ALIGN(8) 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];
|
||||||
@@ -354,9 +359,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;
|
||||||
}
|
}
|
||||||
@@ -379,7 +384,7 @@ CGLM_INLINE
|
|||||||
void
|
void
|
||||||
glm_look(vec3 eye, vec3 dir, vec3 up, mat4 dest) {
|
glm_look(vec3 eye, vec3 dir, vec3 up, mat4 dest) {
|
||||||
CGLM_ALIGN(8) 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);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -397,7 +402,7 @@ CGLM_INLINE
|
|||||||
void
|
void
|
||||||
glm_look_anyup(vec3 eye, vec3 dir, mat4 dest) {
|
glm_look_anyup(vec3 eye, vec3 dir, mat4 dest) {
|
||||||
CGLM_ALIGN(8) 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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -26,6 +26,7 @@
|
|||||||
#include "project.h"
|
#include "project.h"
|
||||||
#include "sphere.h"
|
#include "sphere.h"
|
||||||
#include "ease.h"
|
#include "ease.h"
|
||||||
|
#include "curve.h"
|
||||||
#include "bezier.h"
|
#include "bezier.h"
|
||||||
|
|
||||||
#endif /* cglm_h */
|
#endif /* cglm_h */
|
||||||
|
|||||||
@@ -26,34 +26,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, mat4 m, vec4 c) {
|
||||||
|
vec4 vs;
|
||||||
|
glm_vec4_cubic(s, vs);
|
||||||
|
return glm_mat4_rmc(vs, m, c);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* cglm_curve_h */
|
||||||
@@ -19,19 +19,19 @@ glm_ease_linear(float t) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
float
|
float
|
||||||
glm_ease_sine_in(float t) {
|
glm_ease_sine_in(float t) {
|
||||||
return sinf((t - 1.0f) * CGLM_PI_2) + 1.0f;
|
return sinf((t - 1.0f) * GLM_PI_2f) + 1.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
float
|
float
|
||||||
glm_ease_sine_out(float t) {
|
glm_ease_sine_out(float t) {
|
||||||
return sinf(t * CGLM_PI_2);
|
return sinf(t * GLM_PI_2f);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
float
|
float
|
||||||
glm_ease_sine_inout(float t) {
|
glm_ease_sine_inout(float t) {
|
||||||
return 0.5f * (1.0f - cosf(t * CGLM_PI));
|
return 0.5f * (1.0f - cosf(t * GLM_PIf));
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
@@ -254,13 +254,13 @@ glm_ease_back_inout(float t) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
float
|
float
|
||||||
glm_ease_elast_in(float t) {
|
glm_ease_elast_in(float t) {
|
||||||
return sinf(13.0f * CGLM_PI_2 * t) * powf(2.0f, 10.0f * (t - 1.0f));
|
return sinf(13.0f * GLM_PI_2f * t) * powf(2.0f, 10.0f * (t - 1.0f));
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
float
|
float
|
||||||
glm_ease_elast_out(float t) {
|
glm_ease_elast_out(float t) {
|
||||||
return sinf(-13.0f * CGLM_PI_2 * (t + 1.0f)) * powf(2.0f, -10.0f * t) + 1.0f;
|
return sinf(-13.0f * GLM_PI_2f * (t + 1.0f)) * powf(2.0f, -10.0f * t) + 1.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
@@ -271,10 +271,10 @@ glm_ease_elast_inout(float t) {
|
|||||||
a = 2.0f * t;
|
a = 2.0f * t;
|
||||||
|
|
||||||
if (t < 0.5f)
|
if (t < 0.5f)
|
||||||
return 0.5f * sinf(13.0f * CGLM_PI_2 * a)
|
return 0.5f * sinf(13.0f * GLM_PI_2f * a)
|
||||||
* powf(2.0f, 10.0f * (a - 1.0f));
|
* powf(2.0f, 10.0f * (a - 1.0f));
|
||||||
|
|
||||||
return 0.5f * (sinf(-13.0f * CGLM_PI_2 * a)
|
return 0.5f * (sinf(-13.0f * GLM_PI_2f * a)
|
||||||
* powf(2.0f, -10.0f * (a - 1.0f)) + 2.0f);
|
* powf(2.0f, -10.0f * (a - 1.0f)) + 2.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -84,12 +84,12 @@ glm_euler_angles(mat4 m, vec3 dest) {
|
|||||||
thetaZ = atan2f(-m10, m00);
|
thetaZ = atan2f(-m10, m00);
|
||||||
} else { /* m20 == -1 */
|
} else { /* m20 == -1 */
|
||||||
/* Not a unique solution */
|
/* Not a unique solution */
|
||||||
thetaY = -CGLM_PI_2;
|
thetaY = -GLM_PI_2f;
|
||||||
thetaX = -atan2f(m01, m11);
|
thetaX = -atan2f(m01, m11);
|
||||||
thetaZ = 0.0f;
|
thetaZ = 0.0f;
|
||||||
}
|
}
|
||||||
} else { /* m20 == +1 */
|
} else { /* m20 == +1 */
|
||||||
thetaY = CGLM_PI_2;
|
thetaY = GLM_PI_2f;
|
||||||
thetaX = atan2f(m01, m11);
|
thetaX = atan2f(m01, m11);
|
||||||
thetaZ = 0.0f;
|
thetaZ = 0.0f;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -106,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)
|
||||||
@@ -187,8 +187,8 @@ glm_frustum_box(vec4 corners[8], mat4 m, vec3 box[2]) {
|
|||||||
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);
|
||||||
@@ -202,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]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -228,7 +228,7 @@ glm_frustum_corners_at(vec4 corners[8],
|
|||||||
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,7 +25,7 @@
|
|||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat4_print(mat4 matrix,
|
glm_mat4_print(mat4 matrix,
|
||||||
FILE * __restrict ostream) {
|
FILE * __restrict ostream) {
|
||||||
int i;
|
int i;
|
||||||
int j;
|
int j;
|
||||||
@@ -55,7 +55,7 @@ glm_mat4_print(mat4 matrix,
|
|||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat3_print(mat3 matrix,
|
glm_mat3_print(mat3 matrix,
|
||||||
FILE * __restrict ostream) {
|
FILE * __restrict ostream) {
|
||||||
int i;
|
int i;
|
||||||
int j;
|
int j;
|
||||||
@@ -85,7 +85,7 @@ glm_mat3_print(mat3 matrix,
|
|||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec4_print(vec4 vec,
|
glm_vec4_print(vec4 vec,
|
||||||
FILE * __restrict ostream) {
|
FILE * __restrict ostream) {
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@@ -107,7 +107,7 @@ glm_vec4_print(vec4 vec,
|
|||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec3_print(vec3 vec,
|
glm_vec3_print(vec3 vec,
|
||||||
FILE * __restrict ostream) {
|
FILE * __restrict ostream) {
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@@ -129,7 +129,7 @@ glm_vec3_print(vec3 vec,
|
|||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_ivec3_print(ivec3 vec,
|
glm_ivec3_print(ivec3 vec,
|
||||||
FILE * __restrict ostream) {
|
FILE * __restrict ostream) {
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@@ -151,7 +151,7 @@ glm_ivec3_print(ivec3 vec,
|
|||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_versor_print(versor vec,
|
glm_versor_print(versor vec,
|
||||||
FILE * __restrict ostream) {
|
FILE * __restrict ostream) {
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
|||||||
@@ -16,15 +16,20 @@
|
|||||||
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
|
||||||
@@ -61,7 +66,17 @@
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat3_copy(mat3 mat, mat3 dest) {
|
glm_mat3_copy(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];
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -81,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) {
|
||||||
CGLM_ALIGN(16) 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 * __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);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -155,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) {
|
||||||
CGLM_ALIGN(16) 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];
|
||||||
@@ -187,6 +233,18 @@ glm_mat3_mulv(mat3 m, vec3 v, vec3 dest) {
|
|||||||
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(mat3 m) {
|
||||||
|
return m[0][0] + m[1][1] + m[2][2];
|
||||||
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief convert mat3 to quaternion
|
* @brief convert mat3 to quaternion
|
||||||
@@ -310,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]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -339,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(vec3 r, mat3 m, 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,6 +42,7 @@
|
|||||||
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
|
||||||
@@ -97,7 +101,15 @@
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat4_ucopy(mat4 mat, mat4 dest) {
|
glm_mat4_ucopy(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];
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -117,6 +129,11 @@ glm_mat4_copy(mat4 mat, mat4 dest) {
|
|||||||
glmm_store(dest[1], glmm_load(mat[1]));
|
glmm_store(dest[1], glmm_load(mat[1]));
|
||||||
glmm_store(dest[2], glmm_load(mat[2]));
|
glmm_store(dest[2], glmm_load(mat[2]));
|
||||||
glmm_store(dest[3], glmm_load(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
|
||||||
@@ -139,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) {
|
||||||
CGLM_ALIGN(16) 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 * __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);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -232,7 +280,7 @@ glm_mat4_mul(mat4 m1, mat4 m2, mat4 dest) {
|
|||||||
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],
|
||||||
@@ -320,6 +368,32 @@ glm_mat4_mulv(mat4 m, vec4 v, vec4 dest) {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @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_mat4_trace(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(mat4 m) {
|
||||||
|
return m[0][0] + m[1][1] + m[2][2];
|
||||||
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief convert mat4's rotation part to quaternion
|
* @brief convert mat4's rotation part to quaternion
|
||||||
*
|
*
|
||||||
@@ -423,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
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -460,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
|
||||||
@@ -619,4 +698,26 @@ glm_mat4_swap_row(mat4 mat, int row1, int row2) {
|
|||||||
mat[3][row2] = tmp[3];
|
mat[3][row2] = tmp[3];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @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(vec4 r, mat4 m, vec4 c) {
|
||||||
|
vec4 tmp;
|
||||||
|
glm_mat4_mulv(m, c, tmp);
|
||||||
|
return glm_vec4_dot(r, tmp);
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* cglm_mat_h */
|
#endif /* cglm_mat_h */
|
||||||
|
|||||||
@@ -30,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 */
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
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 void glm_quat_normalize_to(versor q, versor dest);
|
CGLM_INLINE void glm_quat_normalize_to(versor q, versor dest);
|
||||||
CGLM_INLINE float glm_quat_dot(versor q1, versor q2);
|
CGLM_INLINE float glm_quat_dot(versor p, versor q);
|
||||||
CGLM_INLINE void glm_quat_conjugate(versor q, versor dest);
|
CGLM_INLINE void glm_quat_conjugate(versor q, versor dest);
|
||||||
CGLM_INLINE void glm_quat_inv(versor q, 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_add(versor p, versor q, versor dest);
|
||||||
@@ -103,6 +103,25 @@ glm_quat_identity(versor q) {
|
|||||||
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 * __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
|
* @brief inits quaterion with raw values
|
||||||
*
|
*
|
||||||
@@ -199,7 +218,7 @@ glm_quat_normalize_to(versor q, versor dest) {
|
|||||||
float dot;
|
float dot;
|
||||||
|
|
||||||
x0 = glmm_load(q);
|
x0 = glmm_load(q);
|
||||||
xdot = glmm_dot(x0, x0);
|
xdot = glmm_vdot(x0, x0);
|
||||||
dot = _mm_cvtss_f32(xdot);
|
dot = _mm_cvtss_f32(xdot);
|
||||||
|
|
||||||
if (dot <= 0.0f) {
|
if (dot <= 0.0f) {
|
||||||
@@ -254,7 +273,7 @@ glm_quat_dot(versor p, versor q) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_quat_conjugate(versor q, versor dest) {
|
glm_quat_conjugate(versor q, versor dest) {
|
||||||
glm_vec4_flipsign_to(q, dest);
|
glm_vec4_negate_to(q, dest);
|
||||||
dest[3] = -dest[3];
|
dest[3] = -dest[3];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -267,7 +286,7 @@ glm_quat_conjugate(versor q, versor dest) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_quat_inv(versor q, versor dest) {
|
glm_quat_inv(versor q, versor dest) {
|
||||||
CGLM_ALIGN(8) versor conj;
|
CGLM_ALIGN(16) versor conj;
|
||||||
glm_quat_conjugate(q, conj);
|
glm_quat_conjugate(q, conj);
|
||||||
glm_vec4_scale(conj, 1.0f / glm_vec4_norm2(q), dest);
|
glm_vec4_scale(conj, 1.0f / glm_vec4_norm2(q), dest);
|
||||||
}
|
}
|
||||||
@@ -342,7 +361,7 @@ glm_quat_imagn(versor q, vec3 dest) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
float
|
float
|
||||||
glm_quat_imaglen(versor q) {
|
glm_quat_imaglen(versor q) {
|
||||||
return glm_vec_norm(q);
|
return glm_vec3_norm(q);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -615,7 +634,7 @@ glm_quat_slerp(versor from, versor to, float t, versor dest) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (cosTheta < 0.0f) {
|
if (cosTheta < 0.0f) {
|
||||||
glm_vec4_flipsign(q1);
|
glm_vec4_negate(q1);
|
||||||
cosTheta = -cosTheta;
|
cosTheta = -cosTheta;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -651,7 +670,7 @@ glm_quat_look(vec3 eye, versor ori, mat4 dest) {
|
|||||||
|
|
||||||
/* translate */
|
/* translate */
|
||||||
glm_mat4_mulv3(dest, eye, 1.0f, dest[3]);
|
glm_mat4_mulv3(dest, eye, 1.0f, dest[3]);
|
||||||
glm_vec_flipsign(dest[3]);
|
glm_vec3_negate(dest[3]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -668,9 +687,9 @@ glm_quat_for(vec3 dir, vec3 fwd, vec3 up, versor dest) {
|
|||||||
CGLM_ALIGN(8) vec3 axis;
|
CGLM_ALIGN(8) vec3 axis;
|
||||||
float dot, angle;
|
float dot, angle;
|
||||||
|
|
||||||
dot = glm_vec_dot(dir, fwd);
|
dot = glm_vec3_dot(dir, fwd);
|
||||||
if (fabsf(dot + 1.0f) < 0.000001f) {
|
if (fabsf(dot + 1.0f) < 0.000001f) {
|
||||||
glm_quat_init(dest, up[0], up[1], up[2], CGLM_PI);
|
glm_quat_init(dest, up[0], up[1], up[2], GLM_PIf);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -700,7 +719,7 @@ CGLM_INLINE
|
|||||||
void
|
void
|
||||||
glm_quat_forp(vec3 from, vec3 to, vec3 fwd, vec3 up, versor dest) {
|
glm_quat_forp(vec3 from, vec3 to, vec3 fwd, vec3 up, versor dest) {
|
||||||
CGLM_ALIGN(8) vec3 dir;
|
CGLM_ALIGN(8) vec3 dir;
|
||||||
glm_vec_sub(to, from, dir);
|
glm_vec3_sub(to, from, dir);
|
||||||
glm_quat_for(dir, fwd, up, dest);
|
glm_quat_for(dir, fwd, up, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -722,14 +741,14 @@ glm_quat_rotatev(versor q, vec3 v, vec3 dest) {
|
|||||||
glm_quat_imag(p, u);
|
glm_quat_imag(p, u);
|
||||||
s = glm_quat_real(p);
|
s = glm_quat_real(p);
|
||||||
|
|
||||||
glm_vec_scale(u, 2.0f * glm_vec_dot(u, v), v1);
|
glm_vec3_scale(u, 2.0f * glm_vec3_dot(u, v), v1);
|
||||||
glm_vec_scale(v, s * s - glm_vec_dot(u, u), v2);
|
glm_vec3_scale(v, s * s - glm_vec3_dot(u, u), v2);
|
||||||
glm_vec_add(v1, v2, v1);
|
glm_vec3_add(v1, v2, v1);
|
||||||
|
|
||||||
glm_vec_cross(u, v, v2);
|
glm_vec3_cross(u, v, v2);
|
||||||
glm_vec_scale(v2, 2.0f * s, v2);
|
glm_vec3_scale(v2, 2.0f * s, v2);
|
||||||
|
|
||||||
glm_vec_add(v1, v2, dest);
|
glm_vec3_add(v1, v2, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -742,7 +761,7 @@ glm_quat_rotatev(versor q, vec3 v, vec3 dest) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_quat_rotate(mat4 m, versor q, mat4 dest) {
|
glm_quat_rotate(mat4 m, versor q, mat4 dest) {
|
||||||
CGLM_ALIGN(16) mat4 rot;
|
CGLM_ALIGN_MAT mat4 rot;
|
||||||
glm_quat_mat4(q, rot);
|
glm_quat_mat4(q, rot);
|
||||||
glm_mul_rot(m, rot, dest);
|
glm_mul_rot(m, rot, dest);
|
||||||
}
|
}
|
||||||
@@ -759,7 +778,7 @@ void
|
|||||||
glm_quat_rotate_at(mat4 m, versor q, vec3 pivot) {
|
glm_quat_rotate_at(mat4 m, versor q, vec3 pivot) {
|
||||||
CGLM_ALIGN(8) vec3 pivotInv;
|
CGLM_ALIGN(8) vec3 pivotInv;
|
||||||
|
|
||||||
glm_vec_inv_to(pivot, pivotInv);
|
glm_vec3_negate_to(pivot, pivotInv);
|
||||||
|
|
||||||
glm_translate(m, pivot);
|
glm_translate(m, pivot);
|
||||||
glm_quat_rotate(m, q, m);
|
glm_quat_rotate(m, q, m);
|
||||||
@@ -783,7 +802,7 @@ void
|
|||||||
glm_quat_rotate_atm(mat4 m, versor q, vec3 pivot) {
|
glm_quat_rotate_atm(mat4 m, versor q, vec3 pivot) {
|
||||||
CGLM_ALIGN(8) vec3 pivotInv;
|
CGLM_ALIGN(8) vec3 pivotInv;
|
||||||
|
|
||||||
glm_vec_inv_to(pivot, pivotInv);
|
glm_vec3_negate_to(pivot, pivotInv);
|
||||||
|
|
||||||
glm_translate_make(m, pivot);
|
glm_translate_make(m, pivot);
|
||||||
glm_quat_rotate(m, q, m);
|
glm_quat_rotate(m, q, m);
|
||||||
|
|||||||
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 */
|
||||||
@@ -27,21 +27,24 @@ glm_mul_avx(mat4 m1, mat4 m2, mat4 dest) {
|
|||||||
y2 = glmm_load256(m1[0]); /* h g f e d c b a */
|
y2 = glmm_load256(m1[0]); /* h g f e d c b a */
|
||||||
y3 = glmm_load256(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));
|
||||||
|
|
||||||
glmm_store256(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 */
|
||||||
|
|||||||
@@ -27,8 +27,9 @@ glm_mat4_mul_avx(mat4 m1, mat4 m2, mat4 dest) {
|
|||||||
y2 = glmm_load256(m1[0]); /* h g f e d c b a */
|
y2 = glmm_load256(m1[0]); /* h g f e d c b a */
|
||||||
y3 = glmm_load256(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 */
|
||||||
|
|||||||
@@ -27,90 +27,64 @@
|
|||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
# include <xmmintrin.h>
|
# include <xmmintrin.h>
|
||||||
# include <emmintrin.h>
|
# include <emmintrin.h>
|
||||||
|
|
||||||
/* OPTIONAL: You may save some instructions but latency (not sure) */
|
|
||||||
#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)
|
|
||||||
|
|
||||||
static inline
|
|
||||||
__m128
|
|
||||||
glmm_dot(__m128 a, __m128 b) {
|
|
||||||
__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));
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline
|
|
||||||
__m128
|
|
||||||
glmm_norm(__m128 a) {
|
|
||||||
return _mm_sqrt_ps(glmm_dot(a, a));
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline
|
|
||||||
__m128
|
|
||||||
glmm_load3(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));
|
|
||||||
}
|
|
||||||
|
|
||||||
#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
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* x86, x64 */
|
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
|
||||||
# define CGLM_SSE_FP 1
|
# define CGLM_SSE_FP 1
|
||||||
|
# ifndef CGLM_SIMD_x86
|
||||||
|
# define CGLM_SIMD_x86
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__SSE3__)
|
||||||
|
# include <x86intrin.h>
|
||||||
|
# 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
|
||||||
#ifdef CGLM_ALL_UNALIGNED
|
# define CGLM_SIMD_x86
|
||||||
# define glmm_load256(p) _mm256_loadu_ps(p)
|
# endif
|
||||||
# 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
|
#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 */
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
|
|
||||||
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);
|
||||||
|
|
||||||
@@ -28,7 +28,7 @@ glm_mat4_scale_sse2(mat4 m, float s){
|
|||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat4_transp_sse2(mat4 m, mat4 dest){
|
glm_mat4_transp_sse2(mat4 m, mat4 dest) {
|
||||||
__m128 r0, r1, r2, r3;
|
__m128 r0, r1, r2, r3;
|
||||||
|
|
||||||
r0 = glmm_load(m[0]);
|
r0 = glmm_load(m[0]);
|
||||||
|
|||||||
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(__m128 a, __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(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 */
|
||||||
@@ -60,13 +60,13 @@ void
|
|||||||
glm_sphere_merge(vec4 s1, vec4 s2, vec4 dest) {
|
glm_sphere_merge(vec4 s1, vec4 s2, vec4 dest) {
|
||||||
float dist, radii;
|
float dist, radii;
|
||||||
|
|
||||||
dist = glm_vec_distance(s1, s2);
|
dist = glm_vec3_distance(s1, s2);
|
||||||
radii = dist + s1[3] + s2[3];
|
radii = dist + s1[3] + s2[3];
|
||||||
|
|
||||||
radii = glm_max(radii, s1[3]);
|
radii = glm_max(radii, s1[3]);
|
||||||
radii = glm_max(radii, s2[3]);
|
radii = glm_max(radii, s2[3]);
|
||||||
|
|
||||||
glm_vec_center(s1, s2, dest);
|
glm_vec3_center(s1, s2, dest);
|
||||||
dest[3] = radii;
|
dest[3] = radii;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -79,7 +79,7 @@ glm_sphere_merge(vec4 s1, vec4 s2, vec4 dest) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
bool
|
bool
|
||||||
glm_sphere_sphere(vec4 s1, vec4 s2) {
|
glm_sphere_sphere(vec4 s1, vec4 s2) {
|
||||||
return glm_vec_distance2(s1, s2) <= glm_pow2(s1[3] + s2[3]);
|
return glm_vec3_distance2(s1, s2) <= glm_pow2(s1[3] + s2[3]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -93,7 +93,7 @@ bool
|
|||||||
glm_sphere_point(vec4 s, vec3 point) {
|
glm_sphere_point(vec4 s, vec3 point) {
|
||||||
float rr;
|
float rr;
|
||||||
rr = s[3] * s[3];
|
rr = s[3] * s[3];
|
||||||
return glm_vec_distance2(point, s) <= rr;
|
return glm_vec3_distance2(point, s) <= rr;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* cglm_sphere_h */
|
#endif /* cglm_sphere_h */
|
||||||
|
|||||||
@@ -10,12 +10,12 @@
|
|||||||
|
|
||||||
#if defined(_MSC_VER)
|
#if defined(_MSC_VER)
|
||||||
/* do not use alignment for older visual studio versions */
|
/* do not use alignment for older visual studio versions */
|
||||||
#if _MSC_VER < 1913 /* Visual Studio 2017 version 15.6 */
|
# if _MSC_VER < 1913 /* Visual Studio 2017 version 15.6 */
|
||||||
# define CGLM_ALL_UNALIGNED
|
# define CGLM_ALL_UNALIGNED
|
||||||
# define CGLM_ALIGN(X) /* no alignment */
|
# define CGLM_ALIGN(X) /* no alignment */
|
||||||
#else
|
# else
|
||||||
# define CGLM_ALIGN(X) __declspec(align(X))
|
# define CGLM_ALIGN(X) __declspec(align(X))
|
||||||
#endif
|
# endif
|
||||||
#else
|
#else
|
||||||
# define CGLM_ALIGN(X) __attribute((aligned(X)))
|
# define CGLM_ALIGN(X) __attribute((aligned(X)))
|
||||||
#endif
|
#endif
|
||||||
@@ -26,18 +26,56 @@
|
|||||||
# define CGLM_ALIGN_IF(X) /* no alignment */
|
# define CGLM_ALIGN_IF(X) /* no alignment */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef __AVX__
|
||||||
|
# define CGLM_ALIGN_MAT CGLM_ALIGN(32)
|
||||||
|
#else
|
||||||
|
# define CGLM_ALIGN_MAT CGLM_ALIGN(16)
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef float vec2[2];
|
typedef float vec2[2];
|
||||||
typedef CGLM_ALIGN_IF(8) float vec3[3];
|
typedef float vec3[3];
|
||||||
typedef int ivec3[3];
|
typedef int ivec3[3];
|
||||||
typedef CGLM_ALIGN_IF(16) float vec4[4];
|
typedef CGLM_ALIGN_IF(16) float vec4[4];
|
||||||
|
|
||||||
typedef vec3 mat3[3];
|
|
||||||
typedef CGLM_ALIGN_IF(16) vec4 mat4[4];
|
|
||||||
|
|
||||||
typedef vec4 versor;
|
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 */
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ glm_signf(float 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -69,7 +69,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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -80,7 +80,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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -91,7 +91,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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
|||||||
@@ -11,15 +11,19 @@
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
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
|
||||||
@@ -31,21 +35,6 @@
|
|||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <float.h>
|
#include <float.h>
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief DEPRECATED! use glm_vec_mul
|
|
||||||
*
|
|
||||||
* @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
|
||||||
*
|
*
|
||||||
@@ -54,7 +43,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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -66,7 +55,7 @@ glm_vec_broadcast(float val, vec3 d) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
bool
|
bool
|
||||||
glm_vec_eq(vec3 v, float val) {
|
glm_vec3_eq(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];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -78,7 +67,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(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;
|
||||||
@@ -91,36 +80,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(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(vec3 a, 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(vec3 a, 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -130,7 +119,7 @@ glm_vec_eqv_eps(vec3 v1, vec3 v2) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
float
|
float
|
||||||
glm_vec_max(vec3 v) {
|
glm_vec3_max(vec3 v) {
|
||||||
float max;
|
float max;
|
||||||
|
|
||||||
max = v[0];
|
max = v[0];
|
||||||
@@ -149,7 +138,7 @@ glm_vec_max(vec3 v) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
float
|
float
|
||||||
glm_vec_min(vec3 v) {
|
glm_vec3_min(vec3 v) {
|
||||||
float min;
|
float min;
|
||||||
|
|
||||||
min = v[0];
|
min = v[0];
|
||||||
@@ -169,7 +158,7 @@ glm_vec_min(vec3 v) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
bool
|
bool
|
||||||
glm_vec_isnan(vec3 v) {
|
glm_vec3_isnan(vec3 v) {
|
||||||
return isnan(v[0]) || isnan(v[1]) || isnan(v[2]);
|
return isnan(v[0]) || isnan(v[1]) || isnan(v[2]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -181,7 +170,7 @@ glm_vec_isnan(vec3 v) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
bool
|
bool
|
||||||
glm_vec_isinf(vec3 v) {
|
glm_vec3_isinf(vec3 v) {
|
||||||
return isinf(v[0]) || isinf(v[1]) || isinf(v[2]);
|
return isinf(v[0]) || isinf(v[1]) || isinf(v[2]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -193,8 +182,8 @@ glm_vec_isinf(vec3 v) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
bool
|
bool
|
||||||
glm_vec_isvalid(vec3 v) {
|
glm_vec3_isvalid(vec3 v) {
|
||||||
return !glm_vec_isnan(v) && !glm_vec_isinf(v);
|
return !glm_vec3_isnan(v) && !glm_vec3_isinf(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -206,7 +195,7 @@ glm_vec_isvalid(vec3 v) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec_sign(vec3 v, vec3 dest) {
|
glm_vec3_sign(vec3 v, vec3 dest) {
|
||||||
dest[0] = glm_signf(v[0]);
|
dest[0] = glm_signf(v[0]);
|
||||||
dest[1] = glm_signf(v[1]);
|
dest[1] = glm_signf(v[1]);
|
||||||
dest[2] = glm_signf(v[2]);
|
dest[2] = glm_signf(v[2]);
|
||||||
@@ -220,7 +209,7 @@ glm_vec_sign(vec3 v, vec3 dest) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec_sqrt(vec3 v, vec3 dest) {
|
glm_vec3_sqrt(vec3 v, vec3 dest) {
|
||||||
dest[0] = sqrtf(v[0]);
|
dest[0] = sqrtf(v[0]);
|
||||||
dest[1] = sqrtf(v[1]);
|
dest[1] = sqrtf(v[1]);
|
||||||
dest[2] = sqrtf(v[2]);
|
dest[2] = sqrtf(v[2]);
|
||||||
|
|||||||
@@ -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,44 +17,64 @@
|
|||||||
|
|
||||||
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 a, vec3 b, vec3 dest);
|
CGLM_INLINE float glm_vec3_norm(vec3 v);
|
||||||
CGLM_INLINE void glm_vec_adds(vec3 a, float s, vec3 dest);
|
CGLM_INLINE void glm_vec3_add(vec3 a, vec3 b, vec3 dest);
|
||||||
CGLM_INLINE void glm_vec_sub(vec3 a, vec3 b, vec3 dest);
|
CGLM_INLINE void glm_vec3_adds(vec3 a, float s, vec3 dest);
|
||||||
CGLM_INLINE void glm_vec_subs(vec3 a, float s, vec3 dest);
|
CGLM_INLINE void glm_vec3_sub(vec3 a, vec3 b, vec3 dest);
|
||||||
CGLM_INLINE void glm_vec_mul(vec3 a, vec3 b, vec3 dest);
|
CGLM_INLINE void glm_vec3_subs(vec3 a, float s, vec3 dest);
|
||||||
CGLM_INLINE void glm_vec_scale(vec3 v, float s, vec3 dest);
|
CGLM_INLINE void glm_vec3_mul(vec3 a, vec3 b, vec3 dest);
|
||||||
CGLM_INLINE void glm_vec_scale_as(vec3 v, float s, vec3 dest);
|
CGLM_INLINE void glm_vec3_scale(vec3 v, float s, vec3 dest);
|
||||||
CGLM_INLINE void glm_vec_div(vec3 a, vec3 b, vec3 dest);
|
CGLM_INLINE void glm_vec3_scale_as(vec3 v, float s, vec3 dest);
|
||||||
CGLM_INLINE void glm_vec_divs(vec3 a, float s, vec3 dest);
|
CGLM_INLINE void glm_vec3_div(vec3 a, vec3 b, vec3 dest);
|
||||||
CGLM_INLINE void glm_vec_addadd(vec3 a, vec3 b, vec3 dest);
|
CGLM_INLINE void glm_vec3_divs(vec3 a, float s, vec3 dest);
|
||||||
CGLM_INLINE void glm_vec_subadd(vec3 a, vec3 b, vec3 dest);
|
CGLM_INLINE void glm_vec3_addadd(vec3 a, vec3 b, vec3 dest);
|
||||||
CGLM_INLINE void glm_vec_muladd(vec3 a, vec3 b, vec3 dest);
|
CGLM_INLINE void glm_vec3_subadd(vec3 a, vec3 b, vec3 dest);
|
||||||
CGLM_INLINE void glm_vec_flipsign(vec3 v);
|
CGLM_INLINE void glm_vec3_muladd(vec3 a, vec3 b, vec3 dest);
|
||||||
CGLM_INLINE void glm_vec_inv(vec3 v);
|
CGLM_INLINE void glm_vec3_muladds(vec3 a, float s, vec3 dest);
|
||||||
CGLM_INLINE void glm_vec_inv_to(vec3 v, vec3 dest);
|
CGLM_INLINE void glm_vec3_maxadd(vec3 a, vec3 b, vec3 dest);
|
||||||
CGLM_INLINE void glm_vec_normalize(vec3 v);
|
CGLM_INLINE void glm_vec3_minadd(vec3 a, vec3 b, vec3 dest);
|
||||||
CGLM_INLINE void glm_vec_normalize_to(vec3 vec, vec3 dest);
|
CGLM_INLINE void glm_vec3_flipsign(vec3 v);
|
||||||
CGLM_INLINE float glm_vec_distance(vec3 v1, vec3 v2);
|
CGLM_INLINE void glm_vec3_flipsign_to(vec3 v, vec3 dest);
|
||||||
CGLM_INLINE float glm_vec_angle(vec3 v1, vec3 v2);
|
CGLM_INLINE void glm_vec3_negate_to(vec3 v, vec3 dest);
|
||||||
CGLM_INLINE void glm_vec_rotate(vec3 v, float angle, vec3 axis);
|
CGLM_INLINE void glm_vec3_negate(vec3 v);
|
||||||
CGLM_INLINE void glm_vec_rotate_m4(mat4 m, vec3 v, vec3 dest);
|
CGLM_INLINE void glm_vec3_inv(vec3 v);
|
||||||
CGLM_INLINE void glm_vec_proj(vec3 a, vec3 b, vec3 dest);
|
CGLM_INLINE void glm_vec3_inv_to(vec3 v, vec3 dest);
|
||||||
CGLM_INLINE void glm_vec_center(vec3 v1, vec3 v2, vec3 dest);
|
CGLM_INLINE void glm_vec3_normalize(vec3 v);
|
||||||
CGLM_INLINE void glm_vec_maxv(vec3 v1, vec3 v2, vec3 dest);
|
CGLM_INLINE void glm_vec3_normalize_to(vec3 v, vec3 dest);
|
||||||
CGLM_INLINE void glm_vec_minv(vec3 v1, vec3 v2, vec3 dest);
|
CGLM_INLINE void glm_vec3_cross(vec3 a, vec3 b, vec3 d);
|
||||||
CGLM_INLINE void glm_vec_ortho(vec3 v, vec3 dest);
|
CGLM_INLINE void glm_vec3_crossn(vec3 a, vec3 b, vec3 dest);
|
||||||
CGLM_INLINE void glm_vec_clamp(vec3 v, float minVal, float maxVal);
|
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
|
||||||
@@ -72,7 +86,12 @@
|
|||||||
#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}
|
||||||
@@ -106,7 +125,7 @@ glm_vec3(vec4 v4, vec3 dest) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec_copy(vec3 a, vec3 dest) {
|
glm_vec3_copy(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];
|
||||||
@@ -119,10 +138,8 @@ glm_vec_copy(vec3 a, vec3 dest) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec_zero(vec3 v) {
|
glm_vec3_zero(vec3 v) {
|
||||||
v[0] = 0.0f;
|
v[0] = v[1] = v[2] = 0.0f;
|
||||||
v[1] = 0.0f;
|
|
||||||
v[2] = 0.0f;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -132,10 +149,8 @@ glm_vec_zero(vec3 v) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec_one(vec3 v) {
|
glm_vec3_one(vec3 v) {
|
||||||
v[0] = 1.0f;
|
v[0] = v[1] = v[2] = 1.0f;
|
||||||
v[1] = 1.0f;
|
|
||||||
v[2] = 1.0f;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -148,26 +163,10 @@ glm_vec_one(vec3 v) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
float
|
float
|
||||||
glm_vec_dot(vec3 a, vec3 b) {
|
glm_vec3_dot(vec3 a, 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
|
||||||
*
|
*
|
||||||
@@ -181,21 +180,21 @@ glm_vec_cross(vec3 a, vec3 b, vec3 d) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
float
|
float
|
||||||
glm_vec_norm2(vec3 v) {
|
glm_vec3_norm2(vec3 v) {
|
||||||
return glm_vec_dot(v, v);
|
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(vec3 v) {
|
||||||
return sqrtf(glm_vec_norm2(vec));
|
return sqrtf(glm_vec3_norm2(v));
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -207,7 +206,7 @@ glm_vec_norm(vec3 vec) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec_add(vec3 a, vec3 b, vec3 dest) {
|
glm_vec3_add(vec3 a, vec3 b, vec3 dest) {
|
||||||
dest[0] = a[0] + b[0];
|
dest[0] = a[0] + b[0];
|
||||||
dest[1] = a[1] + b[1];
|
dest[1] = a[1] + b[1];
|
||||||
dest[2] = a[2] + b[2];
|
dest[2] = a[2] + b[2];
|
||||||
@@ -222,14 +221,14 @@ glm_vec_add(vec3 a, vec3 b, vec3 dest) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec_adds(vec3 v, float s, vec3 dest) {
|
glm_vec3_adds(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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief subtract v2 vector from v1 vector store result in dest
|
* @brief subtract b vector from a vector store result in dest
|
||||||
*
|
*
|
||||||
* @param[in] a vector1
|
* @param[in] a vector1
|
||||||
* @param[in] b vector2
|
* @param[in] b vector2
|
||||||
@@ -237,7 +236,7 @@ glm_vec_adds(vec3 v, float s, vec3 dest) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec_sub(vec3 a, vec3 b, vec3 dest) {
|
glm_vec3_sub(vec3 a, vec3 b, vec3 dest) {
|
||||||
dest[0] = a[0] - b[0];
|
dest[0] = a[0] - b[0];
|
||||||
dest[1] = a[1] - b[1];
|
dest[1] = a[1] - b[1];
|
||||||
dest[2] = a[2] - b[2];
|
dest[2] = a[2] - b[2];
|
||||||
@@ -252,7 +251,7 @@ glm_vec_sub(vec3 a, vec3 b, vec3 dest) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec_subs(vec3 v, float s, vec3 dest) {
|
glm_vec3_subs(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;
|
||||||
@@ -261,16 +260,16 @@ glm_vec_subs(vec3 v, float s, vec3 dest) {
|
|||||||
/*!
|
/*!
|
||||||
* @brief multiply two vector (component-wise multiplication)
|
* @brief multiply two vector (component-wise multiplication)
|
||||||
*
|
*
|
||||||
* @param a v1
|
* @param a vector1
|
||||||
* @param b v2
|
* @param b vector2
|
||||||
* @param d v3 = (a[0] * b[0], a[1] * b[1], a[2] * b[2])
|
* @param dest v3 = (a[0] * b[0], a[1] * b[1], a[2] * b[2])
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec_mul(vec3 a, vec3 b, vec3 d) {
|
glm_vec3_mul(vec3 a, vec3 b, vec3 dest) {
|
||||||
d[0] = a[0] * b[0];
|
dest[0] = a[0] * b[0];
|
||||||
d[1] = a[1] * b[1];
|
dest[1] = a[1] * b[1];
|
||||||
d[2] = a[2] * b[2];
|
dest[2] = a[2] * b[2];
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -282,7 +281,7 @@ glm_vec_mul(vec3 a, vec3 b, vec3 d) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec_scale(vec3 v, float s, vec3 dest) {
|
glm_vec3_scale(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;
|
||||||
@@ -297,16 +296,16 @@ 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(vec3 v, float s, vec3 dest) {
|
||||||
float norm;
|
float norm;
|
||||||
norm = glm_vec_norm(v);
|
norm = glm_vec3_norm(v);
|
||||||
|
|
||||||
if (norm == 0.0f) {
|
if (norm == 0.0f) {
|
||||||
glm_vec_zero(dest);
|
glm_vec3_zero(dest);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
glm_vec_scale(v, s / norm, dest);
|
glm_vec3_scale(v, s / norm, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -318,7 +317,7 @@ glm_vec_scale_as(vec3 v, float s, vec3 dest) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec_div(vec3 a, vec3 b, vec3 dest) {
|
glm_vec3_div(vec3 a, vec3 b, vec3 dest) {
|
||||||
dest[0] = a[0] / b[0];
|
dest[0] = a[0] / b[0];
|
||||||
dest[1] = a[1] / b[1];
|
dest[1] = a[1] / b[1];
|
||||||
dest[2] = a[2] / b[2];
|
dest[2] = a[2] / b[2];
|
||||||
@@ -333,7 +332,7 @@ glm_vec_div(vec3 a, vec3 b, vec3 dest) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec_divs(vec3 v, float s, vec3 dest) {
|
glm_vec3_divs(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;
|
||||||
@@ -350,7 +349,7 @@ glm_vec_divs(vec3 v, float s, vec3 dest) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec_addadd(vec3 a, vec3 b, vec3 dest) {
|
glm_vec3_addadd(vec3 a, vec3 b, vec3 dest) {
|
||||||
dest[0] += a[0] + b[0];
|
dest[0] += a[0] + b[0];
|
||||||
dest[1] += a[1] + b[1];
|
dest[1] += a[1] + b[1];
|
||||||
dest[2] += a[2] + b[2];
|
dest[2] += a[2] + b[2];
|
||||||
@@ -367,7 +366,7 @@ glm_vec_addadd(vec3 a, vec3 b, vec3 dest) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec_subadd(vec3 a, vec3 b, vec3 dest) {
|
glm_vec3_subadd(vec3 a, vec3 b, vec3 dest) {
|
||||||
dest[0] += a[0] - b[0];
|
dest[0] += a[0] - b[0];
|
||||||
dest[1] += a[1] - b[1];
|
dest[1] += a[1] - b[1];
|
||||||
dest[2] += a[2] - b[2];
|
dest[2] += a[2] - b[2];
|
||||||
@@ -384,7 +383,7 @@ glm_vec_subadd(vec3 a, vec3 b, vec3 dest) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec_muladd(vec3 a, vec3 b, vec3 dest) {
|
glm_vec3_muladd(vec3 a, vec3 b, vec3 dest) {
|
||||||
dest[0] += a[0] * b[0];
|
dest[0] += a[0] * b[0];
|
||||||
dest[1] += a[1] * b[1];
|
dest[1] += a[1] * b[1];
|
||||||
dest[2] += a[2] * b[2];
|
dest[2] += a[2] * b[2];
|
||||||
@@ -401,60 +400,69 @@ glm_vec_muladd(vec3 a, vec3 b, vec3 dest) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec_muladds(vec3 a, float s, vec3 dest) {
|
glm_vec3_muladds(vec3 a, float s, vec3 dest) {
|
||||||
dest[0] += a[0] * s;
|
dest[0] += a[0] * s;
|
||||||
dest[1] += a[1] * s;
|
dest[1] += a[1] * s;
|
||||||
dest[2] += a[2] * s;
|
dest[2] += a[2] * s;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief flip sign of all vec3 members
|
* @brief add max of two vector to result/dest
|
||||||
*
|
*
|
||||||
* @param[in, out] v vector
|
* 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
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec_flipsign(vec3 v) {
|
glm_vec3_maxadd(vec3 a, vec3 b, vec3 dest) {
|
||||||
v[0] = -v[0];
|
dest[0] += glm_max(a[0], b[0]);
|
||||||
v[1] = -v[1];
|
dest[1] += glm_max(a[1], b[1]);
|
||||||
v[2] = -v[2];
|
dest[2] += glm_max(a[2], b[2]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief flip sign of all vec3 members and store result in dest
|
* @brief add min of two vector to result/dest
|
||||||
|
*
|
||||||
|
* it applies += operator so dest must be initialized
|
||||||
|
*
|
||||||
|
* @param[in] a vector
|
||||||
|
* @param[in] b scalar
|
||||||
|
* @param[out] dest dest += min(a, b)
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec3_minadd(vec3 a, 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[in] v vector
|
||||||
* @param[out] dest result vector
|
* @param[out] dest result vector
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec_flipsign_to(vec3 v, vec3 dest) {
|
glm_vec3_negate_to(vec3 v, vec3 dest) {
|
||||||
dest[0] = -v[0];
|
dest[0] = -v[0];
|
||||||
dest[1] = -v[1];
|
dest[1] = -v[1];
|
||||||
dest[2] = -v[2];
|
dest[2] = -v[2];
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief make vector as inverse/opposite of itself
|
* @brief negate vector components
|
||||||
*
|
*
|
||||||
* @param[in, out] v vector
|
* @param[in, out] v vector
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec_inv(vec3 v) {
|
glm_vec3_negate(vec3 v) {
|
||||||
glm_vec_flipsign(v);
|
glm_vec3_negate_to(v, 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_flipsign_to(v, dest);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -464,56 +472,93 @@ 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(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) {
|
||||||
glm_vec_zero(dest);
|
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(vec3 a, 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(vec3 a, 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(vec3 a, 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;
|
||||||
|
|
||||||
|
if (dot > 1.0f)
|
||||||
|
return 0.0f;
|
||||||
|
else if (dot < -1.0f)
|
||||||
|
return CGLM_PI;
|
||||||
|
|
||||||
|
return acosf(dot);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -525,27 +570,27 @@ glm_vec_angle(vec3 v1, vec3 v2) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec_rotate(vec3 v, float angle, vec3 axis) {
|
glm_vec3_rotate(vec3 v, float angle, vec3 axis) {
|
||||||
vec3 v1, v2, k;
|
vec3 v1, v2, k;
|
||||||
float c, s;
|
float c, s;
|
||||||
|
|
||||||
c = cosf(angle);
|
c = cosf(angle);
|
||||||
s = sinf(angle);
|
s = sinf(angle);
|
||||||
|
|
||||||
glm_vec_normalize_to(axis, k);
|
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_vec_scale(v, c, v1);
|
glm_vec3_scale(v, c, v1);
|
||||||
|
|
||||||
glm_vec_cross(k, v, v2);
|
glm_vec3_cross(k, v, v2);
|
||||||
glm_vec_scale(v2, s, v2);
|
glm_vec3_scale(v2, s, v2);
|
||||||
|
|
||||||
glm_vec_add(v1, v2, v1);
|
glm_vec3_add(v1, v2, v1);
|
||||||
|
|
||||||
glm_vec_scale(k, glm_vec_dot(k, v) * (1.0f - c), v2);
|
glm_vec3_scale(k, glm_vec3_dot(k, v) * (1.0f - c), v2);
|
||||||
glm_vec_add(v1, v2, v);
|
glm_vec3_add(v1, v2, v);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -563,7 +608,7 @@ 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_m4(mat4 m, vec3 v, vec3 dest) {
|
||||||
vec4 x, y, z, res;
|
vec4 x, y, z, res;
|
||||||
|
|
||||||
glm_vec4_normalize_to(m[0], x);
|
glm_vec4_normalize_to(m[0], x);
|
||||||
@@ -586,7 +631,7 @@ glm_vec_rotate_m4(mat4 m, vec3 v, vec3 dest) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec_rotate_m3(mat3 m, vec3 v, vec3 dest) {
|
glm_vec3_rotate_m3(mat3 m, vec3 v, vec3 dest) {
|
||||||
vec4 res, x, y, z;
|
vec4 res, x, y, z;
|
||||||
|
|
||||||
glm_vec4(m[0], 0.0f, x);
|
glm_vec4(m[0], 0.0f, x);
|
||||||
@@ -607,88 +652,88 @@ glm_vec_rotate_m3(mat3 m, vec3 v, vec3 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(vec3 a, 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(vec3 a, 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
|
* @brief squared distance between two vectors
|
||||||
*
|
*
|
||||||
* @param[in] v1 vector1
|
* @param[in] a vector1
|
||||||
* @param[in] v2 vector2
|
* @param[in] b vector2
|
||||||
* @return returns squared distance (distance * distance)
|
* @return returns squared distance (distance * distance)
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
float
|
float
|
||||||
glm_vec_distance2(vec3 v1, vec3 v2) {
|
glm_vec3_distance2(vec3 a, vec3 b) {
|
||||||
return glm_pow2(v2[0] - v1[0])
|
return glm_pow2(b[0] - a[0])
|
||||||
+ glm_pow2(v2[1] - v1[1])
|
+ glm_pow2(b[1] - a[1])
|
||||||
+ glm_pow2(v2[2] - v1[2]);
|
+ 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(vec3 a, vec3 b) {
|
||||||
return sqrtf(glm_vec_distance2(v1, v2));
|
return sqrtf(glm_vec3_distance2(a, b));
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @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(vec3 a, 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(vec3 a, 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]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -699,7 +744,7 @@ 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(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];
|
||||||
@@ -714,7 +759,7 @@ glm_vec_ortho(vec3 v, vec3 dest) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec_clamp(vec3 v, float minVal, float maxVal) {
|
glm_vec3_clamp(vec3 v, float minVal, float maxVal) {
|
||||||
v[0] = glm_clamp(v[0], minVal, maxVal);
|
v[0] = glm_clamp(v[0], minVal, maxVal);
|
||||||
v[1] = glm_clamp(v[1], minVal, maxVal);
|
v[1] = glm_clamp(v[1], minVal, maxVal);
|
||||||
v[2] = glm_clamp(v[2], minVal, maxVal);
|
v[2] = glm_clamp(v[2], minVal, maxVal);
|
||||||
@@ -732,14 +777,14 @@ glm_vec_clamp(vec3 v, float minVal, float maxVal) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec_lerp(vec3 from, vec3 to, float t, vec3 dest) {
|
glm_vec3_lerp(vec3 from, vec3 to, float t, vec3 dest) {
|
||||||
vec3 s, v;
|
vec3 s, v;
|
||||||
|
|
||||||
/* from + s * (to - from) */
|
/* from + s * (to - from) */
|
||||||
glm_vec_broadcast(glm_clamp_zo(t), s);
|
glm_vec3_broadcast(glm_clamp_zo(t), s);
|
||||||
glm_vec_sub(to, from, v);
|
glm_vec3_sub(to, from, v);
|
||||||
glm_vec_mulv(s, v, v);
|
glm_vec3_mul(s, v, v);
|
||||||
glm_vec_add(from, v, dest);
|
glm_vec3_add(from, v, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -754,7 +799,7 @@ glm_vec_lerp(vec3 from, vec3 to, float t, vec3 dest) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_cross(vec3 a, vec3 b, vec3 d) {
|
glm_cross(vec3 a, vec3 b, vec3 d) {
|
||||||
glm_vec_cross(a, b, d);
|
glm_vec3_cross(a, b, d);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -770,7 +815,7 @@ glm_cross(vec3 a, vec3 b, vec3 d) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
float
|
float
|
||||||
glm_dot(vec3 a, vec3 b) {
|
glm_dot(vec3 a, vec3 b) {
|
||||||
return glm_vec_dot(a, b);
|
return glm_vec3_dot(a, b);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -783,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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -797,7 +842,7 @@ glm_normalize(vec3 v) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_normalize_to(vec3 v, vec3 dest) {
|
glm_normalize_to(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
|
||||||
@@ -31,26 +35,6 @@
|
|||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <float.h>
|
#include <float.h>
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief DEPRECATED! use glm_vec4_mul
|
|
||||||
*
|
|
||||||
* @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__ )
|
|
||||||
glmm_store(d, _mm_mul_ps(glmm_load(a), glmm_load(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
|
||||||
*
|
*
|
||||||
@@ -113,31 +97,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(vec4 a, 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(vec4 a, 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -150,7 +134,7 @@ float
|
|||||||
glm_vec4_max(vec4 v) {
|
glm_vec4_max(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];
|
||||||
|
|
||||||
@@ -167,7 +151,7 @@ float
|
|||||||
glm_vec4_min(vec4 v) {
|
glm_vec4_min(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];
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -28,7 +21,7 @@
|
|||||||
CGLM_INLINE void glm_vec4_ucopy(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 a, vec4 b, vec4 dest);
|
CGLM_INLINE void glm_vec4_add(vec4 a, vec4 b, vec4 dest);
|
||||||
CGLM_INLINE void glm_vec4_adds(vec4 v, float s, 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_sub(vec4 a, vec4 b, vec4 dest);
|
||||||
@@ -41,16 +34,27 @@
|
|||||||
CGLM_INLINE void glm_vec4_addadd(vec4 a, vec4 b, 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_subadd(vec4 a, vec4 b, vec4 dest);
|
||||||
CGLM_INLINE void glm_vec4_muladd(vec4 a, vec4 b, vec4 dest);
|
CGLM_INLINE void glm_vec4_muladd(vec4 a, vec4 b, vec4 dest);
|
||||||
CGLM_INLINE void glm_vec4_flipsign(vec4 v);
|
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_clamp(vec4 v, float minVal, float maxVal);
|
||||||
CGLM_INLINE void glm_vec4_lerp(vec4 from, vec4 to, float t, vec4 dest)
|
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
|
||||||
@@ -60,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}
|
||||||
@@ -113,6 +122,8 @@ void
|
|||||||
glm_vec4_copy(vec4 v, vec4 dest) {
|
glm_vec4_copy(vec4 v, vec4 dest) {
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
glmm_store(dest, glmm_load(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];
|
||||||
@@ -148,6 +159,8 @@ void
|
|||||||
glm_vec4_zero(vec4 v) {
|
glm_vec4_zero(vec4 v) {
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
glmm_store(v, _mm_setzero_ps());
|
glmm_store(v, _mm_setzero_ps());
|
||||||
|
#elif defined(CGLM_NEON_FP)
|
||||||
|
vst1q_f32(v, vdupq_n_f32(0.0f));
|
||||||
#else
|
#else
|
||||||
v[0] = 0.0f;
|
v[0] = 0.0f;
|
||||||
v[1] = 0.0f;
|
v[1] = 0.0f;
|
||||||
@@ -166,6 +179,8 @@ void
|
|||||||
glm_vec4_one(vec4 v) {
|
glm_vec4_one(vec4 v) {
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
glmm_store(v, _mm_set1_ps(1.0f));
|
glmm_store(v, _mm_set1_ps(1.0f));
|
||||||
|
#elif defined(CGLM_NEON_FP)
|
||||||
|
vst1q_f32(v, vdupq_n_f32(1.0f));
|
||||||
#else
|
#else
|
||||||
v[0] = 1.0f;
|
v[0] = 1.0f;
|
||||||
v[1] = 1.0f;
|
v[1] = 1.0f;
|
||||||
@@ -185,11 +200,8 @@ glm_vec4_one(vec4 v) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
float
|
float
|
||||||
glm_vec4_dot(vec4 a, vec4 b) {
|
glm_vec4_dot(vec4 a, vec4 b) {
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#if defined(CGLM_SIMD)
|
||||||
__m128 x0;
|
return glmm_dot(glmm_load(a), glmm_load(b));
|
||||||
x0 = _mm_mul_ps(glmm_load(a), glmm_load(b));
|
|
||||||
x0 = _mm_add_ps(x0, glmm_shuff1(x0, 1, 0, 3, 2));
|
|
||||||
return _mm_cvtss_f32(_mm_add_ss(x0, glmm_shuff1(x0, 0, 1, 0, 1)));
|
|
||||||
#else
|
#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
|
#endif
|
||||||
@@ -209,38 +221,28 @@ glm_vec4_dot(vec4 a, vec4 b) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
float
|
float
|
||||||
glm_vec4_norm2(vec4 v) {
|
glm_vec4_norm2(vec4 v) {
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
return glm_vec4_dot(v, v);
|
||||||
__m128 x0;
|
|
||||||
x0 = glmm_load(v);
|
|
||||||
x0 = _mm_mul_ps(x0, x0);
|
|
||||||
x0 = _mm_add_ps(x0, glmm_shuff1(x0, 1, 0, 3, 2));
|
|
||||||
return _mm_cvtss_f32(_mm_add_ss(x0, glmm_shuff1(x0, 0, 1, 0, 1)));
|
|
||||||
#else
|
|
||||||
return v[0] * v[0] + v[1] * v[1] + v[2] * v[2] + v[3] * v[3];
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @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(vec4 v) {
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#if defined(CGLM_SIMD)
|
||||||
__m128 x0;
|
return glmm_norm(glmm_load(v));
|
||||||
x0 = glmm_load(vec);
|
|
||||||
return _mm_cvtss_f32(_mm_sqrt_ss(glmm_dot(x0, x0)));
|
|
||||||
#else
|
#else
|
||||||
return sqrtf(glm_vec4_norm2(vec));
|
return sqrtf(glm_vec4_dot(v, v));
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief add v2 vector to v1 vector store result in dest
|
* @brief add b vector to a vector store result in dest
|
||||||
*
|
*
|
||||||
* @param[in] a vector1
|
* @param[in] a vector1
|
||||||
* @param[in] b vector2
|
* @param[in] b vector2
|
||||||
@@ -251,6 +253,8 @@ void
|
|||||||
glm_vec4_add(vec4 a, vec4 b, vec4 dest) {
|
glm_vec4_add(vec4 a, vec4 b, vec4 dest) {
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
glmm_store(dest, _mm_add_ps(glmm_load(a), glmm_load(b)));
|
glmm_store(dest, _mm_add_ps(glmm_load(a), glmm_load(b)));
|
||||||
|
#elif defined(CGLM_NEON_FP)
|
||||||
|
vst1q_f32(dest, vaddq_f32(vld1q_f32(a), vld1q_f32(b)));
|
||||||
#else
|
#else
|
||||||
dest[0] = a[0] + b[0];
|
dest[0] = a[0] + b[0];
|
||||||
dest[1] = a[1] + b[1];
|
dest[1] = a[1] + b[1];
|
||||||
@@ -271,6 +275,8 @@ void
|
|||||||
glm_vec4_adds(vec4 v, float s, vec4 dest) {
|
glm_vec4_adds(vec4 v, float s, vec4 dest) {
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
glmm_store(dest, _mm_add_ps(glmm_load(v), _mm_set1_ps(s)));
|
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
|
#else
|
||||||
dest[0] = v[0] + s;
|
dest[0] = v[0] + s;
|
||||||
dest[1] = v[1] + s;
|
dest[1] = v[1] + s;
|
||||||
@@ -280,7 +286,7 @@ glm_vec4_adds(vec4 v, float s, vec4 dest) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief subtract b vector from a vector store result in dest (d = v1 - v2)
|
* @brief subtract b vector from a vector store result in dest (d = a - b)
|
||||||
*
|
*
|
||||||
* @param[in] a vector1
|
* @param[in] a vector1
|
||||||
* @param[in] b vector2
|
* @param[in] b vector2
|
||||||
@@ -291,6 +297,8 @@ void
|
|||||||
glm_vec4_sub(vec4 a, vec4 b, vec4 dest) {
|
glm_vec4_sub(vec4 a, vec4 b, vec4 dest) {
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
glmm_store(dest, _mm_sub_ps(glmm_load(a), glmm_load(b)));
|
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
|
#else
|
||||||
dest[0] = a[0] - b[0];
|
dest[0] = a[0] - b[0];
|
||||||
dest[1] = a[1] - b[1];
|
dest[1] = a[1] - b[1];
|
||||||
@@ -311,6 +319,8 @@ void
|
|||||||
glm_vec4_subs(vec4 v, float s, vec4 dest) {
|
glm_vec4_subs(vec4 v, float s, vec4 dest) {
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
glmm_store(dest, _mm_sub_ps(glmm_load(v), _mm_set1_ps(s)));
|
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
|
#else
|
||||||
dest[0] = v[0] - s;
|
dest[0] = v[0] - s;
|
||||||
dest[1] = v[1] - s;
|
dest[1] = v[1] - s;
|
||||||
@@ -322,20 +332,22 @@ glm_vec4_subs(vec4 v, float s, vec4 dest) {
|
|||||||
/*!
|
/*!
|
||||||
* @brief multiply two vector (component-wise multiplication)
|
* @brief multiply two vector (component-wise multiplication)
|
||||||
*
|
*
|
||||||
* @param a v1
|
* @param a vector1
|
||||||
* @param b v2
|
* @param b vector2
|
||||||
* @param d v3 = (a[0] * b[0], a[1] * b[1], a[2] * b[2], a[3] * b[3])
|
* @param dest dest = (a[0] * b[0], a[1] * b[1], a[2] * b[2], a[3] * b[3])
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec4_mul(vec4 a, vec4 b, vec4 d) {
|
glm_vec4_mul(vec4 a, vec4 b, vec4 dest) {
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
glmm_store(d, _mm_mul_ps(glmm_load(a), glmm_load(b)));
|
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
|
#else
|
||||||
d[0] = a[0] * b[0];
|
dest[0] = a[0] * b[0];
|
||||||
d[1] = a[1] * b[1];
|
dest[1] = a[1] * b[1];
|
||||||
d[2] = a[2] * b[2];
|
dest[2] = a[2] * b[2];
|
||||||
d[3] = a[3] * b[3];
|
dest[3] = a[3] * b[3];
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -351,6 +363,8 @@ void
|
|||||||
glm_vec4_scale(vec4 v, float s, vec4 dest) {
|
glm_vec4_scale(vec4 v, float s, vec4 dest) {
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
glmm_store(dest, _mm_mul_ps(glmm_load(v), _mm_set1_ps(s)));
|
glmm_store(dest, _mm_mul_ps(glmm_load(v), _mm_set1_ps(s)));
|
||||||
|
#elif defined(CGLM_NEON_FP)
|
||||||
|
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;
|
||||||
@@ -381,7 +395,7 @@ glm_vec4_scale_as(vec4 v, float s, vec4 dest) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief div vector with another component-wise division: d = v1 / v2
|
* @brief div vector with another component-wise division: d = a / b
|
||||||
*
|
*
|
||||||
* @param[in] a vector 1
|
* @param[in] a vector 1
|
||||||
* @param[in] b vector 2
|
* @param[in] b vector 2
|
||||||
@@ -417,7 +431,6 @@ glm_vec4_divs(vec4 v, float s, vec4 dest) {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief add two vectors and add result to sum
|
* @brief add two vectors and add result to sum
|
||||||
*
|
*
|
||||||
@@ -434,6 +447,10 @@ glm_vec4_addadd(vec4 a, vec4 b, vec4 dest) {
|
|||||||
glmm_store(dest, _mm_add_ps(glmm_load(dest),
|
glmm_store(dest, _mm_add_ps(glmm_load(dest),
|
||||||
_mm_add_ps(glmm_load(a),
|
_mm_add_ps(glmm_load(a),
|
||||||
glmm_load(b))));
|
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
|
#else
|
||||||
dest[0] += a[0] + b[0];
|
dest[0] += a[0] + b[0];
|
||||||
dest[1] += a[1] + b[1];
|
dest[1] += a[1] + b[1];
|
||||||
@@ -458,6 +475,10 @@ glm_vec4_subadd(vec4 a, vec4 b, vec4 dest) {
|
|||||||
glmm_store(dest, _mm_add_ps(glmm_load(dest),
|
glmm_store(dest, _mm_add_ps(glmm_load(dest),
|
||||||
_mm_sub_ps(glmm_load(a),
|
_mm_sub_ps(glmm_load(a),
|
||||||
glmm_load(b))));
|
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
|
#else
|
||||||
dest[0] += a[0] - b[0];
|
dest[0] += a[0] - b[0];
|
||||||
dest[1] += a[1] - b[1];
|
dest[1] += a[1] - b[1];
|
||||||
@@ -482,6 +503,10 @@ glm_vec4_muladd(vec4 a, vec4 b, vec4 dest) {
|
|||||||
glmm_store(dest, _mm_add_ps(glmm_load(dest),
|
glmm_store(dest, _mm_add_ps(glmm_load(dest),
|
||||||
_mm_mul_ps(glmm_load(a),
|
_mm_mul_ps(glmm_load(a),
|
||||||
glmm_load(b))));
|
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
|
#else
|
||||||
dest[0] += a[0] * b[0];
|
dest[0] += a[0] * b[0];
|
||||||
dest[1] += a[1] * b[1];
|
dest[1] += a[1] * b[1];
|
||||||
@@ -506,6 +531,10 @@ glm_vec4_muladds(vec4 a, float s, vec4 dest) {
|
|||||||
glmm_store(dest, _mm_add_ps(glmm_load(dest),
|
glmm_store(dest, _mm_add_ps(glmm_load(dest),
|
||||||
_mm_mul_ps(glmm_load(a),
|
_mm_mul_ps(glmm_load(a),
|
||||||
_mm_set1_ps(s))));
|
_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
|
#else
|
||||||
dest[0] += a[0] * s;
|
dest[0] += a[0] * s;
|
||||||
dest[1] += a[1] * s;
|
dest[1] += a[1] * s;
|
||||||
@@ -514,6 +543,83 @@ glm_vec4_muladds(vec4 a, float s, vec4 dest) {
|
|||||||
#endif
|
#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(vec4 a, 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
|
||||||
|
* @param[in] b scalar
|
||||||
|
* @param[out] dest dest += min(a, b)
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec4_minadd(vec4 a, 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(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
|
||||||
*
|
*
|
||||||
@@ -521,75 +627,25 @@ glm_vec4_muladds(vec4 a, 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);
|
||||||
glmm_store(v, _mm_xor_ps(glmm_load(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 flip sign of all vec4 members and store result in dest
|
* @brief normalize vec4 to dest
|
||||||
*
|
|
||||||
* @param[in] v vector
|
|
||||||
* @param[out] dest vector
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_vec4_flipsign_to(vec4 v, vec4 dest) {
|
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
|
||||||
glmm_store(dest, _mm_xor_ps(glmm_load(v), _mm_set1_ps(-0.0f)));
|
|
||||||
#else
|
|
||||||
dest[0] = -v[0];
|
|
||||||
dest[1] = -v[1];
|
|
||||||
dest[2] = -v[2];
|
|
||||||
dest[3] = -v[3];
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief make vector as inverse/opposite of itself
|
|
||||||
*
|
|
||||||
* @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(vec4 v, vec4 dest) {
|
||||||
glm_vec4_copy(v, dest);
|
|
||||||
glm_vec4_flipsign(dest);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief normalize vec4 to dest
|
|
||||||
*
|
|
||||||
* @param[in] vec source
|
|
||||||
* @param[out] dest destination
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_vec4_normalize_to(vec4 vec, vec4 dest) {
|
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
__m128 xdot, x0;
|
__m128 xdot, x0;
|
||||||
float dot;
|
float dot;
|
||||||
|
|
||||||
x0 = glmm_load(vec);
|
x0 = glmm_load(v);
|
||||||
xdot = glmm_dot(x0, x0);
|
xdot = glmm_vdot(x0, x0);
|
||||||
dot = _mm_cvtss_f32(xdot);
|
dot = _mm_cvtss_f32(xdot);
|
||||||
|
|
||||||
if (dot == 0.0f) {
|
if (dot == 0.0f) {
|
||||||
@@ -601,14 +657,14 @@ glm_vec4_normalize_to(vec4 vec, vec4 dest) {
|
|||||||
#else
|
#else
|
||||||
float norm;
|
float norm;
|
||||||
|
|
||||||
norm = glm_vec4_norm(vec);
|
norm = glm_vec4_norm(v);
|
||||||
|
|
||||||
if (norm == 0.0f) {
|
if (norm == 0.0f) {
|
||||||
glm_vec4_zero(dest);
|
glm_vec4_zero(dest);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
glm_vec4_scale(vec, 1.0f / norm, dest);
|
glm_vec4_scale(v, 1.0f / norm, dest);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -626,56 +682,75 @@ glm_vec4_normalize(vec4 v) {
|
|||||||
/**
|
/**
|
||||||
* @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(vec4 a, vec4 b) {
|
||||||
return sqrtf(glm_pow2(v2[0] - v1[0])
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
+ glm_pow2(v2[1] - v1[1])
|
__m128 x0;
|
||||||
+ glm_pow2(v2[2] - v1[2])
|
x0 = _mm_sub_ps(glmm_load(b), glmm_load(a));
|
||||||
+ glm_pow2(v2[3] - v1[3]));
|
x0 = _mm_mul_ps(x0, x0);
|
||||||
|
x0 = _mm_add_ps(x0, glmm_shuff1(x0, 1, 0, 3, 2));
|
||||||
|
return _mm_cvtss_f32(_mm_sqrt_ss(_mm_add_ss(x0,
|
||||||
|
glmm_shuff1(x0, 0, 1, 0, 1))));
|
||||||
|
#elif defined(CGLM_NEON_FP)
|
||||||
|
float32x4_t v0;
|
||||||
|
float32_t r;
|
||||||
|
v0 = vsubq_f32(vld1q_f32(a), vld1q_f32(b));
|
||||||
|
r = vaddvq_f32(vmulq_f32(v0, v0));
|
||||||
|
return sqrtf(r);
|
||||||
|
#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(vec4 a, vec4 b, vec4 dest) {
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
glmm_store(dest, _mm_max_ps(glmm_load(v1), glmm_load(v2)));
|
glmm_store(dest, _mm_max_ps(glmm_load(a), glmm_load(b)));
|
||||||
|
#elif defined(CGLM_NEON_FP)
|
||||||
|
vst1q_f32(dest, vmaxq_f32(vld1q_f32(a), vld1q_f32(b)));
|
||||||
#else
|
#else
|
||||||
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]);
|
||||||
dest[3] = glm_max(v1[3], v2[3]);
|
dest[3] = glm_max(a[3], b[3]);
|
||||||
#endif
|
#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(vec4 a, vec4 b, vec4 dest) {
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
glmm_store(dest, _mm_min_ps(glmm_load(v1), glmm_load(v2)));
|
glmm_store(dest, _mm_min_ps(glmm_load(a), glmm_load(b)));
|
||||||
|
#elif defined(CGLM_NEON_FP)
|
||||||
|
vst1q_f32(dest, vminq_f32(vld1q_f32(a), vld1q_f32(b)));
|
||||||
#else
|
#else
|
||||||
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]);
|
||||||
dest[3] = glm_min(v1[3], v2[3]);
|
dest[3] = glm_min(a[3], b[3]);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -692,6 +767,9 @@ glm_vec4_clamp(vec4 v, float minVal, float maxVal) {
|
|||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
glmm_store(v, _mm_min_ps(_mm_max_ps(glmm_load(v), _mm_set1_ps(minVal)),
|
glmm_store(v, _mm_min_ps(_mm_max_ps(glmm_load(v), _mm_set1_ps(minVal)),
|
||||||
_mm_set1_ps(maxVal)));
|
_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
|
#else
|
||||||
v[0] = glm_clamp(v[0], minVal, maxVal);
|
v[0] = glm_clamp(v[0], minVal, maxVal);
|
||||||
v[1] = glm_clamp(v[1], minVal, maxVal);
|
v[1] = glm_clamp(v[1], minVal, maxVal);
|
||||||
@@ -718,8 +796,27 @@ glm_vec4_lerp(vec4 from, vec4 to, float t, vec4 dest) {
|
|||||||
/* from + s * (to - from) */
|
/* from + s * (to - from) */
|
||||||
glm_vec4_broadcast(glm_clamp_zo(t), s);
|
glm_vec4_broadcast(glm_clamp_zo(t), s);
|
||||||
glm_vec4_sub(to, from, v);
|
glm_vec4_sub(to, from, v);
|
||||||
glm_vec4_mulv(s, v, v);
|
glm_vec4_mul(s, v, v);
|
||||||
glm_vec4_add(from, v, dest);
|
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 4
|
#define CGLM_VERSION_MINOR 5
|
||||||
#define CGLM_VERSION_PATCH 8
|
#define CGLM_VERSION_PATCH 3
|
||||||
|
|
||||||
#endif /* cglm_version_h */
|
#endif /* cglm_version_h */
|
||||||
|
|||||||
65
makefile.am
65
makefile.am
@@ -34,30 +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/project.h \
|
||||||
include/cglm/sphere.h \
|
include/cglm/sphere.h \
|
||||||
include/cglm/ease.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 \
|
||||||
@@ -74,10 +76,14 @@ cglm_call_HEADERS = include/cglm/call/mat4.h \
|
|||||||
include/cglm/call/box.h \
|
include/cglm/call/box.h \
|
||||||
include/cglm/call/project.h \
|
include/cglm/call/project.h \
|
||||||
include/cglm/call/sphere.h \
|
include/cglm/call/sphere.h \
|
||||||
include/cglm/call/ease.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 \
|
||||||
@@ -107,7 +113,9 @@ libcglm_la_SOURCES=\
|
|||||||
src/box.c \
|
src/box.c \
|
||||||
src/project.c \
|
src/project.c \
|
||||||
src/sphere.c \
|
src/sphere.c \
|
||||||
src/ease.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 \
|
||||||
@@ -121,7 +129,8 @@ test_tests_SOURCES=\
|
|||||||
test/src/test_vec4.c \
|
test/src/test_vec4.c \
|
||||||
test/src/test_vec3.c \
|
test/src/test_vec3.c \
|
||||||
test/src/test_mat3.c \
|
test/src/test_mat3.c \
|
||||||
test/src/test_affine.c
|
test/src/test_affine.c \
|
||||||
|
test/src/test_bezier.c
|
||||||
|
|
||||||
all-local:
|
all-local:
|
||||||
sh ./post-build.sh
|
sh ./post-build.sh
|
||||||
|
|||||||
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);
|
||||||
|
}
|
||||||
@@ -88,6 +88,12 @@ glmc_perspective(float fovy,
|
|||||||
dest);
|
dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_persp_move_far(mat4 proj, float deltaFar) {
|
||||||
|
glm_persp_move_far(proj, deltaFar);
|
||||||
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_perspective_default(float aspect, mat4 dest) {
|
glmc_perspective_default(float aspect, mat4 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, mat4 m, vec4 c) {
|
||||||
|
return glm_smc(s, m, c);
|
||||||
|
}
|
||||||
18
src/mat3.c
18
src/mat3.c
@@ -20,6 +20,12 @@ glmc_mat3_identity(mat3 mat) {
|
|||||||
glm_mat3_identity(mat);
|
glm_mat3_identity(mat);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat3_identity_array(mat3 * __restrict mat, size_t count) {
|
||||||
|
glm_mat3_identity_array(mat, count);
|
||||||
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_mat3_mul(mat3 m1, mat3 m2, mat3 dest) {
|
glmc_mat3_mul(mat3 m1, mat3 m2, mat3 dest) {
|
||||||
@@ -44,6 +50,12 @@ glmc_mat3_mulv(mat3 m, vec3 v, vec3 dest) {
|
|||||||
glm_mat3_mulv(m, v, dest);
|
glm_mat3_mulv(m, v, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_mat3_trace(mat3 m) {
|
||||||
|
return glm_mat3_trace(m);
|
||||||
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_mat3_quat(mat3 m, versor dest) {
|
glmc_mat3_quat(mat3 m, versor dest) {
|
||||||
@@ -79,3 +91,9 @@ void
|
|||||||
glmc_mat3_swap_row(mat3 mat, int row1, int row2) {
|
glmc_mat3_swap_row(mat3 mat, int row1, int row2) {
|
||||||
glm_mat3_swap_row(mat, row1, row2);
|
glm_mat3_swap_row(mat, row1, row2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_mat3_rmc(vec3 r, mat3 m, vec3 c) {
|
||||||
|
return glm_mat3_rmc(r, m, c);
|
||||||
|
}
|
||||||
|
|||||||
24
src/mat4.c
24
src/mat4.c
@@ -26,6 +26,12 @@ glmc_mat4_identity(mat4 mat) {
|
|||||||
glm_mat4_identity(mat);
|
glm_mat4_identity(mat);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat4_identity_array(mat4 * __restrict mat, size_t count) {
|
||||||
|
glm_mat4_identity_array(mat, count);
|
||||||
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_mat4_pick3(mat4 mat, mat3 dest) {
|
glmc_mat4_pick3(mat4 mat, mat3 dest) {
|
||||||
@@ -68,6 +74,18 @@ glmc_mat4_mulv3(mat4 m, vec3 v, float last, vec3 dest) {
|
|||||||
glm_mat4_mulv3(m, v, last, dest);
|
glm_mat4_mulv3(m, v, last, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_mat4_trace(mat4 m) {
|
||||||
|
return glm_mat4_trace(m);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_mat4_trace3(mat4 m) {
|
||||||
|
return glm_mat4_trace3(m);
|
||||||
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_mat4_quat(mat4 m, versor dest) {
|
glmc_mat4_quat(mat4 m, versor dest) {
|
||||||
@@ -133,3 +151,9 @@ void
|
|||||||
glmc_mat4_swap_row(mat4 mat, int row1, int row2) {
|
glmc_mat4_swap_row(mat4 mat, int row1, int row2) {
|
||||||
glm_mat4_swap_row(mat, row1, row2);
|
glm_mat4_swap_row(mat, row1, row2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_mat4_rmc(vec4 r, mat4 m, vec4 c) {
|
||||||
|
return glm_mat4_rmc(r, m, c);
|
||||||
|
}
|
||||||
|
|||||||
@@ -8,13 +8,18 @@
|
|||||||
#include "../include/cglm/cglm.h"
|
#include "../include/cglm/cglm.h"
|
||||||
#include "../include/cglm/call.h"
|
#include "../include/cglm/call.h"
|
||||||
|
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_quat_identity(versor q) {
|
glmc_quat_identity(versor q) {
|
||||||
glm_quat_identity(q);
|
glm_quat_identity(q);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_quat_identity_array(versor * __restrict q, size_t count) {
|
||||||
|
glm_quat_identity_array(q, count);
|
||||||
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_quat_init(versor q, float x, float y, float z, float w) {
|
glmc_quat_init(versor q, float x, float y, float z, float w) {
|
||||||
|
|||||||
218
src/vec3.c
218
src/vec3.c
@@ -16,320 +16,326 @@ glmc_vec3(vec4 v4, vec3 dest) {
|
|||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_copy(vec3 a, vec3 dest) {
|
glmc_vec3_copy(vec3 a, vec3 dest) {
|
||||||
glm_vec_copy(a, dest);
|
glm_vec3_copy(a, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_zero(vec3 v) {
|
glmc_vec3_zero(vec3 v) {
|
||||||
glm_vec_zero(v);
|
glm_vec3_zero(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_one(vec3 v) {
|
glmc_vec3_one(vec3 v) {
|
||||||
glm_vec_one(v);
|
glm_vec3_one(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
float
|
float
|
||||||
glmc_vec_dot(vec3 a, vec3 b) {
|
glmc_vec3_dot(vec3 a, vec3 b) {
|
||||||
return glm_vec_dot(a, b);
|
return glm_vec3_dot(a, b);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_cross(vec3 a, vec3 b, vec3 d) {
|
glmc_vec3_cross(vec3 a, vec3 b, vec3 dest) {
|
||||||
glm_vec_cross(a, b, d);
|
glm_vec3_cross(a, b, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec3_crossn(vec3 a, vec3 b, vec3 dest) {
|
||||||
|
glm_vec3_crossn(a, b, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
float
|
float
|
||||||
glmc_vec_norm(vec3 vec) {
|
glmc_vec3_norm(vec3 v) {
|
||||||
return glm_vec_norm(vec);
|
return glm_vec3_norm(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_normalize_to(vec3 vec, vec3 dest) {
|
glmc_vec3_normalize_to(vec3 v, vec3 dest) {
|
||||||
glm_vec_normalize_to(vec, dest);
|
glm_vec3_normalize_to(v, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_normalize(vec3 v) {
|
glmc_vec3_normalize(vec3 v) {
|
||||||
glm_vec_normalize(v);
|
glm_vec3_normalize(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
float
|
float
|
||||||
glmc_vec_norm2(vec3 vec) {
|
glmc_vec3_norm2(vec3 v) {
|
||||||
return glm_vec_norm2(vec);
|
return glm_vec3_norm2(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_add(vec3 v1, vec3 v2, vec3 dest) {
|
glmc_vec3_add(vec3 a, vec3 b, vec3 dest) {
|
||||||
glm_vec_add(v1, v2, dest);
|
glm_vec3_add(a, b, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_adds(vec3 v, float s, vec3 dest) {
|
glmc_vec3_adds(vec3 v, float s, vec3 dest) {
|
||||||
glm_vec_adds(v, s, dest);
|
glm_vec3_adds(v, s, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_sub(vec3 a, vec3 b, vec3 dest) {
|
glmc_vec3_sub(vec3 a, vec3 b, vec3 dest) {
|
||||||
glm_vec_sub(a, b, dest);
|
glm_vec3_sub(a, b, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_subs(vec3 v, float s, vec3 dest) {
|
glmc_vec3_subs(vec3 v, float s, vec3 dest) {
|
||||||
glm_vec_subs(v, s, dest);
|
glm_vec3_subs(v, s, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_mul(vec3 a, vec3 b, vec3 d) {
|
glmc_vec3_mul(vec3 a, vec3 b, vec3 d) {
|
||||||
glm_vec_mul(a, b, d);
|
glm_vec3_mul(a, b, d);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_scale(vec3 v, float s, vec3 dest) {
|
glmc_vec3_scale(vec3 v, float s, vec3 dest) {
|
||||||
glm_vec_scale(v, s, dest);
|
glm_vec3_scale(v, s, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_scale_as(vec3 v, float s, vec3 dest) {
|
glmc_vec3_scale_as(vec3 v, float s, vec3 dest) {
|
||||||
glm_vec_scale_as(v, s, dest);
|
glm_vec3_scale_as(v, s, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_div(vec3 a, vec3 b, vec3 dest) {
|
glmc_vec3_div(vec3 a, vec3 b, vec3 dest) {
|
||||||
glm_vec_div(a, b, dest);
|
glm_vec3_div(a, b, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_divs(vec3 a, float s, vec3 dest) {
|
glmc_vec3_divs(vec3 a, float s, vec3 dest) {
|
||||||
glm_vec_divs(a, s, dest);
|
glm_vec3_divs(a, s, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_addadd(vec3 a, vec3 b, vec3 dest) {
|
glmc_vec3_addadd(vec3 a, vec3 b, vec3 dest) {
|
||||||
glm_vec_addadd(a, b, dest);
|
glm_vec3_addadd(a, b, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_subadd(vec3 a, vec3 b, vec3 dest) {
|
glmc_vec3_subadd(vec3 a, vec3 b, vec3 dest) {
|
||||||
glm_vec_subadd(a, b, dest);
|
glm_vec3_subadd(a, b, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_muladd(vec3 a, vec3 b, vec3 dest) {
|
glmc_vec3_muladd(vec3 a, vec3 b, vec3 dest) {
|
||||||
glm_vec_muladd(a, b, dest);
|
glm_vec3_muladd(a, b, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_muladds(vec3 a, float s, vec3 dest) {
|
glmc_vec3_muladds(vec3 a, float s, vec3 dest) {
|
||||||
glm_vec_muladds(a, s, dest);
|
glm_vec3_muladds(a, s, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_flipsign(vec3 v) {
|
glmc_vec3_maxadd(vec3 a, vec3 b, vec3 dest) {
|
||||||
glm_vec_flipsign(v);
|
glm_vec3_maxadd(a, b, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_flipsign_to(vec3 v, vec3 dest) {
|
glmc_vec3_minadd(vec3 a, vec3 b, vec3 dest) {
|
||||||
glm_vec_flipsign_to(v, dest);
|
glm_vec3_minadd(a, b, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_inv(vec3 v) {
|
glmc_vec3_negate(vec3 v) {
|
||||||
glm_vec_inv(v);
|
glm_vec3_negate(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_inv_to(vec3 v, vec3 dest) {
|
glmc_vec3_negate_to(vec3 v, vec3 dest) {
|
||||||
glm_vec_inv_to(v, dest);
|
glm_vec3_negate_to(v, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
float
|
float
|
||||||
glmc_vec_angle(vec3 v1, vec3 v2) {
|
glmc_vec3_angle(vec3 a, vec3 b) {
|
||||||
return glm_vec_angle(v1, v2);
|
return glm_vec3_angle(a, b);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_rotate(vec3 v, float angle, vec3 axis) {
|
glmc_vec3_rotate(vec3 v, float angle, vec3 axis) {
|
||||||
glm_vec_rotate(v, angle, axis);
|
glm_vec3_rotate(v, angle, axis);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_rotate_m4(mat4 m, vec3 v, vec3 dest) {
|
glmc_vec3_rotate_m4(mat4 m, vec3 v, vec3 dest) {
|
||||||
glm_vec_rotate_m4(m, v, dest);
|
glm_vec3_rotate_m4(m, v, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_rotate_m3(mat3 m, vec3 v, vec3 dest) {
|
glmc_vec3_rotate_m3(mat3 m, vec3 v, vec3 dest) {
|
||||||
glm_vec_rotate_m3(m, v, dest);
|
glm_vec3_rotate_m3(m, v, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_proj(vec3 a, vec3 b, vec3 dest) {
|
glmc_vec3_proj(vec3 a, vec3 b, vec3 dest) {
|
||||||
glm_vec_proj(a, b, dest);
|
glm_vec3_proj(a, b, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_center(vec3 v1, vec3 v2, vec3 dest) {
|
glmc_vec3_center(vec3 a, vec3 b, vec3 dest) {
|
||||||
glm_vec_center(v1, v2, dest);
|
glm_vec3_center(a, b, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
float
|
float
|
||||||
glmc_vec_distance2(vec3 v1, vec3 v2) {
|
glmc_vec3_distance2(vec3 a, vec3 b) {
|
||||||
return glm_vec_distance2(v1, v2);
|
return glm_vec3_distance2(a, b);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
float
|
float
|
||||||
glmc_vec_distance(vec3 v1, vec3 v2) {
|
glmc_vec3_distance(vec3 a, vec3 b) {
|
||||||
return glm_vec_distance(v1, v2);
|
return glm_vec3_distance(a, b);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_maxv(vec3 v1, vec3 v2, vec3 dest) {
|
glmc_vec3_maxv(vec3 a, vec3 b, vec3 dest) {
|
||||||
glm_vec_minv(v1, v2, dest);
|
glm_vec3_minv(a, b, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_minv(vec3 v1, vec3 v2, vec3 dest) {
|
glmc_vec3_minv(vec3 a, vec3 b, vec3 dest) {
|
||||||
glm_vec_maxv(v1, v2, dest);
|
glm_vec3_maxv(a, b, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_clamp(vec3 v, float minVal, float maxVal) {
|
glmc_vec3_clamp(vec3 v, float minVal, float maxVal) {
|
||||||
glm_vec_clamp(v, minVal, maxVal);
|
glm_vec3_clamp(v, minVal, maxVal);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_ortho(vec3 v, vec3 dest) {
|
glmc_vec3_ortho(vec3 v, vec3 dest) {
|
||||||
glm_vec_ortho(v, dest);
|
glm_vec3_ortho(v, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_lerp(vec3 from, vec3 to, float t, vec3 dest) {
|
glmc_vec3_lerp(vec3 from, vec3 to, float t, vec3 dest) {
|
||||||
glm_vec_lerp(from, to, t, dest);
|
glm_vec3_lerp(from, to, t, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ext */
|
/* ext */
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_mulv(vec3 a, vec3 b, vec3 d) {
|
glmc_vec3_mulv(vec3 a, vec3 b, vec3 d) {
|
||||||
glm_vec_mulv(a, b, d);
|
glm_vec3_mulv(a, b, d);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_broadcast(float val, vec3 d) {
|
glmc_vec3_broadcast(float val, vec3 d) {
|
||||||
glm_vec_broadcast(val, d);
|
glm_vec3_broadcast(val, d);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
bool
|
bool
|
||||||
glmc_vec_eq(vec3 v, float val) {
|
glmc_vec3_eq(vec3 v, float val) {
|
||||||
return glm_vec_eq(v, val);
|
return glm_vec3_eq(v, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
bool
|
bool
|
||||||
glmc_vec_eq_eps(vec3 v, float val) {
|
glmc_vec3_eq_eps(vec3 v, float val) {
|
||||||
return glm_vec_eq_eps(v, val);
|
return glm_vec3_eq_eps(v, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
bool
|
bool
|
||||||
glmc_vec_eq_all(vec3 v) {
|
glmc_vec3_eq_all(vec3 v) {
|
||||||
return glm_vec_eq_all(v);
|
return glm_vec3_eq_all(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
bool
|
bool
|
||||||
glmc_vec_eqv(vec3 v1, vec3 v2) {
|
glmc_vec3_eqv(vec3 a, vec3 b) {
|
||||||
return glm_vec_eqv(v1, v2);
|
return glm_vec3_eqv(a, b);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
bool
|
bool
|
||||||
glmc_vec_eqv_eps(vec3 v1, vec3 v2) {
|
glmc_vec3_eqv_eps(vec3 a, vec3 b) {
|
||||||
return glm_vec_eqv_eps(v1, v2);
|
return glm_vec3_eqv_eps(a, b);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
float
|
float
|
||||||
glmc_vec_max(vec3 v) {
|
glmc_vec3_max(vec3 v) {
|
||||||
return glm_vec_max(v);
|
return glm_vec3_max(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
float
|
float
|
||||||
glmc_vec_min(vec3 v) {
|
glmc_vec3_min(vec3 v) {
|
||||||
return glm_vec_min(v);
|
return glm_vec3_min(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
bool
|
bool
|
||||||
glmc_vec_isnan(vec3 v) {
|
glmc_vec3_isnan(vec3 v) {
|
||||||
return glm_vec_isnan(v);
|
return glm_vec3_isnan(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
bool
|
bool
|
||||||
glmc_vec_isinf(vec3 v) {
|
glmc_vec3_isinf(vec3 v) {
|
||||||
return glm_vec_isinf(v);
|
return glm_vec3_isinf(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
bool
|
bool
|
||||||
glmc_vec_isvalid(vec3 v) {
|
glmc_vec3_isvalid(vec3 v) {
|
||||||
return glm_vec_isvalid(v);
|
return glm_vec3_isvalid(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_sign(vec3 v, vec3 dest) {
|
glmc_vec3_sign(vec3 v, vec3 dest) {
|
||||||
glm_vec_sign(v, dest);
|
glm_vec3_sign(v, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec_sqrt(vec3 v, vec3 dest) {
|
glmc_vec3_sqrt(vec3 v, vec3 dest) {
|
||||||
glm_vec_sqrt(v, dest);
|
glm_vec3_sqrt(v, dest);
|
||||||
}
|
}
|
||||||
|
|||||||
58
src/vec4.c
58
src/vec4.c
@@ -28,8 +28,8 @@ glmc_vec4_one(vec4 v) {
|
|||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec4_copy3(vec4 a, vec3 dest) {
|
glmc_vec4_copy3(vec4 v, vec3 dest) {
|
||||||
glm_vec4_copy3(a, dest);
|
glm_vec4_copy3(v, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
@@ -52,14 +52,14 @@ glmc_vec4_dot(vec4 a, vec4 b) {
|
|||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
float
|
float
|
||||||
glmc_vec4_norm(vec4 vec) {
|
glmc_vec4_norm(vec4 v) {
|
||||||
return glm_vec4_norm(vec);
|
return glm_vec4_norm(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec4_normalize_to(vec4 vec, vec4 dest) {
|
glmc_vec4_normalize_to(vec4 v, vec4 dest) {
|
||||||
glm_vec4_normalize_to(vec, dest);
|
glm_vec4_normalize_to(v, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
@@ -70,8 +70,8 @@ glmc_vec4_normalize(vec4 v) {
|
|||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
float
|
float
|
||||||
glmc_vec4_norm2(vec4 vec) {
|
glmc_vec4_norm2(vec4 v) {
|
||||||
return glm_vec4_norm2(vec);
|
return glm_vec4_norm2(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
@@ -154,44 +154,44 @@ glmc_vec4_muladds(vec4 a, float s, vec4 dest) {
|
|||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec4_flipsign(vec4 v) {
|
glmc_vec4_maxadd(vec4 a, vec4 b, vec4 dest) {
|
||||||
glm_vec4_flipsign(v);
|
glm_vec4_maxadd(a, b, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec4_flipsign_to(vec4 v, vec4 dest) {
|
glmc_vec4_minadd(vec4 a, vec4 b, vec4 dest) {
|
||||||
glm_vec4_flipsign_to(v, dest);
|
glm_vec4_minadd(a, b, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec4_inv(vec4 v) {
|
glmc_vec4_negate(vec4 v) {
|
||||||
glm_vec4_inv(v);
|
glm_vec4_negate(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec4_inv_to(vec4 v, vec4 dest) {
|
glmc_vec4_negate_to(vec4 v, vec4 dest) {
|
||||||
glm_vec4_inv_to(v, dest);
|
glm_vec4_negate_to(v, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
float
|
float
|
||||||
glmc_vec4_distance(vec4 v1, vec4 v2) {
|
glmc_vec4_distance(vec4 a, vec4 b) {
|
||||||
return glm_vec4_distance(v1, v2);
|
return glm_vec4_distance(a, b);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec4_maxv(vec4 v1, vec4 v2, vec4 dest) {
|
glmc_vec4_maxv(vec4 a, vec4 b, vec4 dest) {
|
||||||
glm_vec4_minv(v1, v2, dest);
|
glm_vec4_minv(a, b, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec4_minv(vec4 v1, vec4 v2, vec4 dest) {
|
glmc_vec4_minv(vec4 a, vec4 b, vec4 dest) {
|
||||||
glm_vec4_maxv(v1, v2, dest);
|
glm_vec4_maxv(a, b, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
@@ -206,6 +206,12 @@ glmc_vec4_lerp(vec4 from, vec4 to, float t, vec4 dest) {
|
|||||||
glm_vec4_lerp(from, to, t, dest);
|
glm_vec4_lerp(from, to, t, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec4_cubic(float s, vec4 dest) {
|
||||||
|
glm_vec4_cubic(s, dest);
|
||||||
|
}
|
||||||
|
|
||||||
/* ext */
|
/* ext */
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
@@ -240,14 +246,14 @@ glmc_vec4_eq_all(vec4 v) {
|
|||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
bool
|
bool
|
||||||
glmc_vec4_eqv(vec4 v1, vec4 v2) {
|
glmc_vec4_eqv(vec4 a, vec4 b) {
|
||||||
return glm_vec4_eqv(v1, v2);
|
return glm_vec4_eqv(a, b);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
bool
|
bool
|
||||||
glmc_vec4_eqv_eps(vec4 v1, vec4 v2) {
|
glmc_vec4_eqv_eps(vec4 a, vec4 b) {
|
||||||
return glm_vec4_eqv_eps(v1, v2);
|
return glm_vec4_eqv_eps(a, b);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ test_affine(void **state) {
|
|||||||
mat4 t1, t2, t3, t4, t5;
|
mat4 t1, t2, t3, t4, t5;
|
||||||
|
|
||||||
/* test translate is postmultiplied */
|
/* test translate is postmultiplied */
|
||||||
glmc_rotate_make(t1, M_PI_4, GLM_YUP);
|
glmc_rotate_make(t1, GLM_PI_4f, GLM_YUP);
|
||||||
glm_translate_make(t2, (vec3){34, 57, 36});
|
glm_translate_make(t2, (vec3){34, 57, 36});
|
||||||
|
|
||||||
glmc_mat4_mul(t1, t2, t3); /* R * T */
|
glmc_mat4_mul(t1, t2, t3); /* R * T */
|
||||||
@@ -21,16 +21,16 @@ test_affine(void **state) {
|
|||||||
test_assert_mat4_eq(t1, t3);
|
test_assert_mat4_eq(t1, t3);
|
||||||
|
|
||||||
/* test rotate is postmultiplied */
|
/* test rotate is postmultiplied */
|
||||||
glmc_rotate_make(t1, M_PI_4, GLM_YUP);
|
glmc_rotate_make(t1, GLM_PI_4f, GLM_YUP);
|
||||||
glm_translate_make(t2, (vec3){34, 57, 36});
|
glm_translate_make(t2, (vec3){34, 57, 36});
|
||||||
|
|
||||||
glmc_mat4_mul(t2, t1, t3); /* T * R */
|
glmc_mat4_mul(t2, t1, t3); /* T * R */
|
||||||
|
|
||||||
glm_rotate(t2, M_PI_4, GLM_YUP);
|
glm_rotate(t2, GLM_PI_4f, GLM_YUP);
|
||||||
test_assert_mat4_eq(t2, t3);
|
test_assert_mat4_eq(t2, t3);
|
||||||
|
|
||||||
/* test scale is postmultiplied */
|
/* test scale is postmultiplied */
|
||||||
glmc_rotate_make(t1, M_PI_4, GLM_YUP);
|
glmc_rotate_make(t1, GLM_PI_4f, GLM_YUP);
|
||||||
glm_translate_make(t2, (vec3){34, 57, 36});
|
glm_translate_make(t2, (vec3){34, 57, 36});
|
||||||
glm_scale_make(t4, (vec3){3, 5, 6});
|
glm_scale_make(t4, (vec3){3, 5, 6});
|
||||||
|
|
||||||
@@ -41,7 +41,7 @@ test_affine(void **state) {
|
|||||||
test_assert_mat4_eq(t3, t5);
|
test_assert_mat4_eq(t3, t5);
|
||||||
|
|
||||||
/* test translate_x */
|
/* test translate_x */
|
||||||
glmc_rotate_make(t1, M_PI_4, GLM_YUP);
|
glmc_rotate_make(t1, GLM_PI_4f, GLM_YUP);
|
||||||
glm_translate_make(t2, (vec3){34, 0, 0});
|
glm_translate_make(t2, (vec3){34, 0, 0});
|
||||||
|
|
||||||
glmc_mat4_mul(t1, t2, t3); /* R * T */
|
glmc_mat4_mul(t1, t2, t3); /* R * T */
|
||||||
@@ -49,7 +49,7 @@ test_affine(void **state) {
|
|||||||
test_assert_mat4_eq(t1, t3);
|
test_assert_mat4_eq(t1, t3);
|
||||||
|
|
||||||
/* test translate_y */
|
/* test translate_y */
|
||||||
glmc_rotate_make(t1, M_PI_4, GLM_YUP);
|
glmc_rotate_make(t1, GLM_PI_4f, GLM_YUP);
|
||||||
glm_translate_make(t2, (vec3){0, 57, 0});
|
glm_translate_make(t2, (vec3){0, 57, 0});
|
||||||
|
|
||||||
glmc_mat4_mul(t1, t2, t3); /* R * T */
|
glmc_mat4_mul(t1, t2, t3); /* R * T */
|
||||||
@@ -57,7 +57,7 @@ test_affine(void **state) {
|
|||||||
test_assert_mat4_eq(t1, t3);
|
test_assert_mat4_eq(t1, t3);
|
||||||
|
|
||||||
/* test translate_z */
|
/* test translate_z */
|
||||||
glmc_rotate_make(t1, M_PI_4, GLM_YUP);
|
glmc_rotate_make(t1, GLM_PI_4f, GLM_YUP);
|
||||||
glm_translate_make(t2, (vec3){0, 0, 36});
|
glm_translate_make(t2, (vec3){0, 0, 36});
|
||||||
|
|
||||||
glmc_mat4_mul(t1, t2, t3); /* R * T */
|
glmc_mat4_mul(t1, t2, t3); /* R * T */
|
||||||
@@ -65,43 +65,43 @@ test_affine(void **state) {
|
|||||||
test_assert_mat4_eq(t1, t3);
|
test_assert_mat4_eq(t1, t3);
|
||||||
|
|
||||||
/* test rotate_x */
|
/* test rotate_x */
|
||||||
glmc_rotate_make(t1, M_PI_4, (vec3){1, 0, 0});
|
glmc_rotate_make(t1, GLM_PI_4f, (vec3){1, 0, 0});
|
||||||
glm_translate_make(t2, (vec3){34, 57, 36});
|
glm_translate_make(t2, (vec3){34, 57, 36});
|
||||||
|
|
||||||
glmc_mat4_mul(t2, t1, t3); /* T * R */
|
glmc_mat4_mul(t2, t1, t3); /* T * R */
|
||||||
|
|
||||||
glm_rotate_x(t2, M_PI_4, t2);
|
glm_rotate_x(t2, GLM_PI_4f, t2);
|
||||||
test_assert_mat4_eq(t2, t3);
|
test_assert_mat4_eq(t2, t3);
|
||||||
|
|
||||||
/* test rotate_y */
|
/* test rotate_y */
|
||||||
glmc_rotate_make(t1, M_PI_4, (vec3){0, 1, 0});
|
glmc_rotate_make(t1, GLM_PI_4f, (vec3){0, 1, 0});
|
||||||
glm_translate_make(t2, (vec3){34, 57, 36});
|
glm_translate_make(t2, (vec3){34, 57, 36});
|
||||||
|
|
||||||
glmc_mat4_mul(t2, t1, t3); /* T * R */
|
glmc_mat4_mul(t2, t1, t3); /* T * R */
|
||||||
|
|
||||||
glm_rotate_y(t2, M_PI_4, t2);
|
glm_rotate_y(t2, GLM_PI_4f, t2);
|
||||||
test_assert_mat4_eq(t2, t3);
|
test_assert_mat4_eq(t2, t3);
|
||||||
|
|
||||||
/* test rotate_z */
|
/* test rotate_z */
|
||||||
glmc_rotate_make(t1, M_PI_4, (vec3){0, 0, 1});
|
glmc_rotate_make(t1, GLM_PI_4f, (vec3){0, 0, 1});
|
||||||
glm_translate_make(t2, (vec3){34, 57, 36});
|
glm_translate_make(t2, (vec3){34, 57, 36});
|
||||||
|
|
||||||
glmc_mat4_mul(t2, t1, t3); /* T * R */
|
glmc_mat4_mul(t2, t1, t3); /* T * R */
|
||||||
|
|
||||||
glm_rotate_z(t2, M_PI_4, t2);
|
glm_rotate_z(t2, GLM_PI_4f, t2);
|
||||||
test_assert_mat4_eq(t2, t3);
|
test_assert_mat4_eq(t2, t3);
|
||||||
|
|
||||||
/* test rotate */
|
/* test rotate */
|
||||||
glmc_rotate_make(t1, M_PI_4, (vec3){0, 0, 1});
|
glmc_rotate_make(t1, GLM_PI_4f, (vec3){0, 0, 1});
|
||||||
glm_translate_make(t2, (vec3){34, 57, 36});
|
glm_translate_make(t2, (vec3){34, 57, 36});
|
||||||
|
|
||||||
glmc_mat4_mul(t2, t1, t3); /* T * R */
|
glmc_mat4_mul(t2, t1, t3); /* T * R */
|
||||||
glmc_rotate(t2, M_PI_4, (vec3){0, 0, 1});
|
glmc_rotate(t2, GLM_PI_4f, (vec3){0, 0, 1});
|
||||||
|
|
||||||
test_assert_mat4_eq(t3, t2);
|
test_assert_mat4_eq(t3, t2);
|
||||||
|
|
||||||
/* test scale_uni */
|
/* test scale_uni */
|
||||||
glmc_rotate_make(t1, M_PI_4, GLM_YUP);
|
glmc_rotate_make(t1, GLM_PI_4f, GLM_YUP);
|
||||||
glm_translate_make(t2, (vec3){34, 57, 36});
|
glm_translate_make(t2, (vec3){34, 57, 36});
|
||||||
glm_scale_make(t4, (vec3){3, 3, 3});
|
glm_scale_make(t4, (vec3){3, 3, 3});
|
||||||
|
|
||||||
|
|||||||
65
test/src/test_bezier.c
Normal file
65
test/src/test_bezier.c
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "test_common.h"
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
test_bezier_plain(float s, float p0, float c0, float c1, float p1) {
|
||||||
|
float x, xx, xxx, ss, sss;
|
||||||
|
|
||||||
|
x = 1.0f - s;
|
||||||
|
xx = x * x;
|
||||||
|
xxx = xx * x;
|
||||||
|
ss = s * s;
|
||||||
|
sss = ss * s;
|
||||||
|
|
||||||
|
return p0 * xxx + 3.0f * (c0 * s * xx + c1 * ss * x) + p1 * sss;
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
test_hermite_plain(float s, float p0, float t0, float t1, float p1) {
|
||||||
|
float ss, sss;
|
||||||
|
|
||||||
|
ss = s * s;
|
||||||
|
sss = ss * s;
|
||||||
|
|
||||||
|
return p0 * (2.0f * sss - 3.0f * ss + 1.0f)
|
||||||
|
+ t0 * (sss - 2.0f * ss + s)
|
||||||
|
+ p1 * (-2.0f * sss + 3.0f * ss)
|
||||||
|
+ t1 * (sss - ss);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
test_bezier(void **state) {
|
||||||
|
float s, p0, p1, c0, c1, smc, Bs, Bs_plain;
|
||||||
|
|
||||||
|
s = test_rand();
|
||||||
|
p0 = test_rand();
|
||||||
|
p1 = test_rand();
|
||||||
|
c0 = test_rand();
|
||||||
|
c1 = test_rand();
|
||||||
|
|
||||||
|
/* test cubic bezier */
|
||||||
|
smc = glm_smc(s, GLM_BEZIER_MAT, (vec4){p0, c0, c1, p1});
|
||||||
|
Bs = glm_bezier(s, p0, c0, c1, p1);
|
||||||
|
Bs_plain = test_bezier_plain(s, p0, c0, c1, p1);
|
||||||
|
|
||||||
|
assert_true(glm_eq(Bs, Bs_plain));
|
||||||
|
assert_true(glm_eq(smc, Bs_plain));
|
||||||
|
assert_true(glm_eq(Bs, smc));
|
||||||
|
|
||||||
|
/* test cubic hermite */
|
||||||
|
smc = glm_smc(s, GLM_HERMITE_MAT, (vec4){p0, p1, c0, c1});
|
||||||
|
Bs = glm_hermite(s, p0, c0, c1, p1);
|
||||||
|
Bs_plain = test_hermite_plain(s, p0, c0, c1, p1);
|
||||||
|
|
||||||
|
assert_true(glm_eq(Bs, Bs_plain));
|
||||||
|
assert_true(glm_eq(smc, Bs_plain));
|
||||||
|
assert_true(glm_eq(Bs, smc));
|
||||||
|
}
|
||||||
@@ -16,7 +16,7 @@ test_camera_lookat(void **state) {
|
|||||||
up = {0.0f, 1.0f, 0.0f}
|
up = {0.0f, 1.0f, 0.0f}
|
||||||
;
|
;
|
||||||
|
|
||||||
glm_vec_add(eye, dir, center);
|
glm_vec3_add(eye, dir, center);
|
||||||
glm_lookat(eye, center, up, view1);
|
glm_lookat(eye, center, up, view1);
|
||||||
|
|
||||||
glm_look(eye, dir, up, view2);
|
glm_look(eye, dir, up, view2);
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ test_clamp(void **state) {
|
|||||||
assert_true(glm_clamp(-1.6f, 0.0f, 1.0f) == 0.0f);
|
assert_true(glm_clamp(-1.6f, 0.0f, 1.0f) == 0.0f);
|
||||||
assert_true(glm_clamp(0.6f, 0.0f, 1.0f) == 0.6f);
|
assert_true(glm_clamp(0.6f, 0.0f, 1.0f) == 0.6f);
|
||||||
|
|
||||||
glm_vec_clamp(v3, 0.0, 1.0);
|
glm_vec3_clamp(v3, 0.0, 1.0);
|
||||||
glm_vec4_clamp(v4, 1.5, 3.0);
|
glm_vec4_clamp(v4, 1.5, 3.0);
|
||||||
|
|
||||||
assert_true(v3[0] == 1.0f);
|
assert_true(v3[0] == 1.0f);
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ test_rand_vec4(vec4 dest) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
float
|
float
|
||||||
test_rand_angle(void) {
|
test_rand(void) {
|
||||||
srand((unsigned int)time(NULL));
|
srand((unsigned int)time(NULL));
|
||||||
return drand48();
|
return drand48();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ void
|
|||||||
test_rand_vec4(vec4 dest) ;
|
test_rand_vec4(vec4 dest) ;
|
||||||
|
|
||||||
float
|
float
|
||||||
test_rand_angle(void);
|
test_rand(void);
|
||||||
|
|
||||||
void
|
void
|
||||||
test_rand_quat(versor q);
|
test_rand_quat(versor q);
|
||||||
|
|||||||
@@ -38,7 +38,10 @@ main(int argc, const char * argv[]) {
|
|||||||
cmocka_unit_test(test_vec3),
|
cmocka_unit_test(test_vec3),
|
||||||
|
|
||||||
/* affine */
|
/* affine */
|
||||||
cmocka_unit_test(test_affine)
|
cmocka_unit_test(test_affine),
|
||||||
|
|
||||||
|
/* bezier */
|
||||||
|
cmocka_unit_test(test_bezier)
|
||||||
};
|
};
|
||||||
|
|
||||||
return cmocka_run_group_tests(tests, NULL, NULL);
|
return cmocka_run_group_tests(tests, NULL, NULL);
|
||||||
|
|||||||
@@ -24,9 +24,9 @@ test_mat3(void **state) {
|
|||||||
for (i = 0; i < m; i++) {
|
for (i = 0; i < m; i++) {
|
||||||
for (j = 0; j < n; j++) {
|
for (j = 0; j < n; j++) {
|
||||||
if (i == j)
|
if (i == j)
|
||||||
assert_true(m3[i][j] == 1.0f);
|
assert_true(glm_eq(m3[i][j], 1.0f));
|
||||||
else
|
else
|
||||||
assert_true(m3[i][j] == 0.0f);
|
assert_true(glm_eq(m3[i][j], 0.0f));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -24,9 +24,9 @@ test_mat4(void **state) {
|
|||||||
for (i = 0; i < m; i++) {
|
for (i = 0; i < m; i++) {
|
||||||
for (j = 0; j < n; j++) {
|
for (j = 0; j < n; j++) {
|
||||||
if (i == j)
|
if (i == j)
|
||||||
assert_true(m3[i][j] == 1.0f);
|
assert_true(glm_eq(m3[i][j], 1.0f));
|
||||||
else
|
else
|
||||||
assert_true(m3[i][j] == 0.0f);
|
assert_true(glm_eq(m3[i][j], 0.0f));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ test_quat(void **state) {
|
|||||||
|
|
||||||
/* 0. test identiy quat */
|
/* 0. test identiy quat */
|
||||||
glm_quat_identity(q4);
|
glm_quat_identity(q4);
|
||||||
assert_true(glm_quat_real(q4) == cosf(glm_rad(0.0f) * 0.5f));
|
assert_true(glm_eq(glm_quat_real(q4), cosf(glm_rad(0.0f) * 0.5f)));
|
||||||
glm_quat_mat4(q4, rot1);
|
glm_quat_mat4(q4, rot1);
|
||||||
test_assert_mat4_eq2(rot1, GLM_MAT4_IDENTITY, 0.000009);
|
test_assert_mat4_eq2(rot1, GLM_MAT4_IDENTITY, 0.000009);
|
||||||
|
|
||||||
@@ -118,7 +118,7 @@ test_quat(void **state) {
|
|||||||
/* 9. test imag, real */
|
/* 9. test imag, real */
|
||||||
|
|
||||||
/* 9.1 real */
|
/* 9.1 real */
|
||||||
assert_true(glm_quat_real(q4) == cosf(glm_rad(-90.0f) * 0.5f));
|
assert_true(glm_eq(glm_quat_real(q4), cosf(glm_rad(-90.0f) * 0.5f)));
|
||||||
|
|
||||||
/* 9.1 imag */
|
/* 9.1 imag */
|
||||||
glm_quat_imag(q4, imag);
|
glm_quat_imag(q4, imag);
|
||||||
@@ -128,7 +128,7 @@ test_quat(void **state) {
|
|||||||
axis[1] = sinf(glm_rad(-90.0f) * 0.5f) * 1.0f;
|
axis[1] = sinf(glm_rad(-90.0f) * 0.5f) * 1.0f;
|
||||||
axis[2] = 0.0f;
|
axis[2] = 0.0f;
|
||||||
|
|
||||||
assert_true(glm_vec_eqv_eps(imag, axis));
|
assert_true(glm_vec3_eqv_eps(imag, axis));
|
||||||
|
|
||||||
/* 9.2 axis */
|
/* 9.2 axis */
|
||||||
glm_quat_axis(q4, axis);
|
glm_quat_axis(q4, axis);
|
||||||
@@ -143,7 +143,7 @@ test_quat(void **state) {
|
|||||||
v1[0] = 0.0f; v1[1] = 0.0f; v1[2] = -1.0f;
|
v1[0] = 0.0f; v1[1] = 0.0f; v1[2] = -1.0f;
|
||||||
v2[0] = 0.0f; v2[1] = 0.0f; v2[2] = -1.0f;
|
v2[0] = 0.0f; v2[1] = 0.0f; v2[2] = -1.0f;
|
||||||
|
|
||||||
glm_vec_rotate(v1, glm_rad(90.0f), (vec3){1.0f, 0.0f, 0.0f});
|
glm_vec3_rotate(v1, glm_rad(90.0f), (vec3){1.0f, 0.0f, 0.0f});
|
||||||
glm_quatv(q3, glm_rad(90.0f), (vec3){1.0f, 0.0f, 0.0f});
|
glm_quatv(q3, glm_rad(90.0f), (vec3){1.0f, 0.0f, 0.0f});
|
||||||
|
|
||||||
glm_vec4_scale(q3, 1.5, q3);
|
glm_vec4_scale(q3, 1.5, q3);
|
||||||
|
|||||||
@@ -40,4 +40,7 @@ test_vec3(void **state);
|
|||||||
void
|
void
|
||||||
test_affine(void **state);
|
test_affine(void **state);
|
||||||
|
|
||||||
|
void
|
||||||
|
test_bezier(void **state);
|
||||||
|
|
||||||
#endif /* test_tests_h */
|
#endif /* test_tests_h */
|
||||||
|
|||||||
@@ -14,64 +14,64 @@ test_vec3(void **state) {
|
|||||||
vec3 v, v1, v2;
|
vec3 v, v1, v2;
|
||||||
|
|
||||||
/* test zero */
|
/* test zero */
|
||||||
glm_vec_zero(v);
|
glm_vec3_zero(v);
|
||||||
test_assert_vec3_eq(GLM_VEC3_ZERO, v);
|
test_assert_vec3_eq(GLM_VEC3_ZERO, v);
|
||||||
|
|
||||||
/* test one */
|
/* test one */
|
||||||
glm_vec_one(v);
|
glm_vec3_one(v);
|
||||||
test_assert_vec3_eq(GLM_VEC3_ONE, v);
|
test_assert_vec3_eq(GLM_VEC3_ONE, v);
|
||||||
|
|
||||||
/* adds, subs, div, divs, mul */
|
/* adds, subs, div, divs, mul */
|
||||||
glm_vec_add(v, GLM_VEC3_ONE, v);
|
glm_vec3_add(v, GLM_VEC3_ONE, v);
|
||||||
assert_true(glmc_vec_eq_eps(v, 2));
|
assert_true(glmc_vec3_eq_eps(v, 2));
|
||||||
|
|
||||||
glm_vec_adds(v, 10, v);
|
glm_vec3_adds(v, 10, v);
|
||||||
assert_true(glmc_vec_eq_eps(v, 12));
|
assert_true(glmc_vec3_eq_eps(v, 12));
|
||||||
|
|
||||||
glm_vec_sub(v, GLM_VEC3_ONE, v);
|
glm_vec3_sub(v, GLM_VEC3_ONE, v);
|
||||||
assert_true(glmc_vec_eq_eps(v, 11));
|
assert_true(glmc_vec3_eq_eps(v, 11));
|
||||||
|
|
||||||
glm_vec_subs(v, 1, v);
|
glm_vec3_subs(v, 1, v);
|
||||||
assert_true(glmc_vec_eq_eps(v, 10));
|
assert_true(glmc_vec3_eq_eps(v, 10));
|
||||||
|
|
||||||
glm_vec_broadcast(2, v1);
|
glm_vec3_broadcast(2, v1);
|
||||||
glm_vec_div(v, v1, v);
|
glm_vec3_div(v, v1, v);
|
||||||
assert_true(glmc_vec_eq_eps(v, 5));
|
assert_true(glmc_vec3_eq_eps(v, 5));
|
||||||
|
|
||||||
glm_vec_divs(v, 0.5, v);
|
glm_vec3_divs(v, 0.5, v);
|
||||||
assert_true(glmc_vec_eq_eps(v, 10));
|
assert_true(glmc_vec3_eq_eps(v, 10));
|
||||||
|
|
||||||
glm_vec_mul(v, v1, v);
|
glm_vec3_mul(v, v1, v);
|
||||||
assert_true(glmc_vec_eq_eps(v, 20));
|
assert_true(glmc_vec3_eq_eps(v, 20));
|
||||||
|
|
||||||
glm_vec_scale(v, 0.5, v);
|
glm_vec3_scale(v, 0.5, v);
|
||||||
assert_true(glmc_vec_eq_eps(v, 10));
|
assert_true(glmc_vec3_eq_eps(v, 10));
|
||||||
|
|
||||||
glm_vec_normalize_to(v, v1);
|
glm_vec3_normalize_to(v, v1);
|
||||||
glm_vec_scale(v1, 0.8, v1);
|
glm_vec3_scale(v1, 0.8, v1);
|
||||||
glm_vec_scale_as(v, 0.8, v);
|
glm_vec3_scale_as(v, 0.8, v);
|
||||||
test_assert_vec3_eq(v1, v);
|
test_assert_vec3_eq(v1, v);
|
||||||
|
|
||||||
/* addadd, subadd, muladd */
|
/* addadd, subadd, muladd */
|
||||||
glm_vec_one(v);
|
glm_vec3_one(v);
|
||||||
|
|
||||||
glm_vec_addadd(GLM_VEC3_ONE, GLM_VEC3_ONE, v);
|
glm_vec3_addadd(GLM_VEC3_ONE, GLM_VEC3_ONE, v);
|
||||||
assert_true(glmc_vec_eq_eps(v, 3));
|
assert_true(glmc_vec3_eq_eps(v, 3));
|
||||||
|
|
||||||
glm_vec_subadd(GLM_VEC3_ONE, GLM_VEC3_ZERO, v);
|
glm_vec3_subadd(GLM_VEC3_ONE, GLM_VEC3_ZERO, v);
|
||||||
assert_true(glmc_vec_eq_eps(v, 4));
|
assert_true(glmc_vec3_eq_eps(v, 4));
|
||||||
|
|
||||||
glm_vec_broadcast(2, v1);
|
glm_vec3_broadcast(2, v1);
|
||||||
glm_vec_broadcast(3, v2);
|
glm_vec3_broadcast(3, v2);
|
||||||
glm_vec_muladd(v1, v2, v);
|
glm_vec3_muladd(v1, v2, v);
|
||||||
assert_true(glmc_vec_eq_eps(v, 10));
|
assert_true(glmc_vec3_eq_eps(v, 10));
|
||||||
|
|
||||||
/* rotate */
|
/* rotate */
|
||||||
glm_vec_copy(GLM_YUP, v);
|
glm_vec3_copy(GLM_YUP, v);
|
||||||
glm_rotate_make(rot1, glm_rad(90), GLM_XUP);
|
glm_rotate_make(rot1, glm_rad(90), GLM_XUP);
|
||||||
glm_vec_rotate_m4(rot1, v, v1);
|
glm_vec3_rotate_m4(rot1, v, v1);
|
||||||
glm_mat4_pick3(rot1, rot1m3);
|
glm_mat4_pick3(rot1, rot1m3);
|
||||||
glm_vec_rotate_m3(rot1m3, v, v2);
|
glm_vec3_rotate_m3(rot1m3, v, v2);
|
||||||
|
|
||||||
test_assert_vec3_eq(v1, v2);
|
test_assert_vec3_eq(v1, v2);
|
||||||
test_assert_vec3_eq(v1, GLM_ZUP);
|
test_assert_vec3_eq(v1, GLM_ZUP);
|
||||||
|
|||||||
@@ -20,8 +20,10 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="..\src\affine.c" />
|
<ClCompile Include="..\src\affine.c" />
|
||||||
|
<ClCompile Include="..\src\bezier.c" />
|
||||||
<ClCompile Include="..\src\box.c" />
|
<ClCompile Include="..\src\box.c" />
|
||||||
<ClCompile Include="..\src\cam.c" />
|
<ClCompile Include="..\src\cam.c" />
|
||||||
|
<ClCompile Include="..\src\curve.c" />
|
||||||
<ClCompile Include="..\src\dllmain.c" />
|
<ClCompile Include="..\src\dllmain.c" />
|
||||||
<ClCompile Include="..\src\ease.c" />
|
<ClCompile Include="..\src\ease.c" />
|
||||||
<ClCompile Include="..\src\euler.c" />
|
<ClCompile Include="..\src\euler.c" />
|
||||||
@@ -39,11 +41,14 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="..\include\cglm\affine-mat.h" />
|
<ClInclude Include="..\include\cglm\affine-mat.h" />
|
||||||
<ClInclude Include="..\include\cglm\affine.h" />
|
<ClInclude Include="..\include\cglm\affine.h" />
|
||||||
|
<ClInclude Include="..\include\cglm\bezier.h" />
|
||||||
<ClInclude Include="..\include\cglm\box.h" />
|
<ClInclude Include="..\include\cglm\box.h" />
|
||||||
<ClInclude Include="..\include\cglm\call.h" />
|
<ClInclude Include="..\include\cglm\call.h" />
|
||||||
<ClInclude Include="..\include\cglm\call\affine.h" />
|
<ClInclude Include="..\include\cglm\call\affine.h" />
|
||||||
|
<ClInclude Include="..\include\cglm\call\bezier.h" />
|
||||||
<ClInclude Include="..\include\cglm\call\box.h" />
|
<ClInclude Include="..\include\cglm\call\box.h" />
|
||||||
<ClInclude Include="..\include\cglm\call\cam.h" />
|
<ClInclude Include="..\include\cglm\call\cam.h" />
|
||||||
|
<ClInclude Include="..\include\cglm\call\curve.h" />
|
||||||
<ClInclude Include="..\include\cglm\call\ease.h" />
|
<ClInclude Include="..\include\cglm\call\ease.h" />
|
||||||
<ClInclude Include="..\include\cglm\call\euler.h" />
|
<ClInclude Include="..\include\cglm\call\euler.h" />
|
||||||
<ClInclude Include="..\include\cglm\call\frustum.h" />
|
<ClInclude Include="..\include\cglm\call\frustum.h" />
|
||||||
@@ -60,6 +65,7 @@
|
|||||||
<ClInclude Include="..\include\cglm\cglm.h" />
|
<ClInclude Include="..\include\cglm\cglm.h" />
|
||||||
<ClInclude Include="..\include\cglm\color.h" />
|
<ClInclude Include="..\include\cglm\color.h" />
|
||||||
<ClInclude Include="..\include\cglm\common.h" />
|
<ClInclude Include="..\include\cglm\common.h" />
|
||||||
|
<ClInclude Include="..\include\cglm\curve.h" />
|
||||||
<ClInclude Include="..\include\cglm\ease.h" />
|
<ClInclude Include="..\include\cglm\ease.h" />
|
||||||
<ClInclude Include="..\include\cglm\euler.h" />
|
<ClInclude Include="..\include\cglm\euler.h" />
|
||||||
<ClInclude Include="..\include\cglm\frustum.h" />
|
<ClInclude Include="..\include\cglm\frustum.h" />
|
||||||
@@ -69,6 +75,7 @@
|
|||||||
<ClInclude Include="..\include\cglm\plane.h" />
|
<ClInclude Include="..\include\cglm\plane.h" />
|
||||||
<ClInclude Include="..\include\cglm\project.h" />
|
<ClInclude Include="..\include\cglm\project.h" />
|
||||||
<ClInclude Include="..\include\cglm\quat.h" />
|
<ClInclude Include="..\include\cglm\quat.h" />
|
||||||
|
<ClInclude Include="..\include\cglm\simd\arm.h" />
|
||||||
<ClInclude Include="..\include\cglm\simd\avx\affine.h" />
|
<ClInclude Include="..\include\cglm\simd\avx\affine.h" />
|
||||||
<ClInclude Include="..\include\cglm\simd\avx\mat4.h" />
|
<ClInclude Include="..\include\cglm\simd\avx\mat4.h" />
|
||||||
<ClInclude Include="..\include\cglm\simd\intrin.h" />
|
<ClInclude Include="..\include\cglm\simd\intrin.h" />
|
||||||
@@ -77,6 +84,7 @@
|
|||||||
<ClInclude Include="..\include\cglm\simd\sse2\mat3.h" />
|
<ClInclude Include="..\include\cglm\simd\sse2\mat3.h" />
|
||||||
<ClInclude Include="..\include\cglm\simd\sse2\mat4.h" />
|
<ClInclude Include="..\include\cglm\simd\sse2\mat4.h" />
|
||||||
<ClInclude Include="..\include\cglm\simd\sse2\quat.h" />
|
<ClInclude Include="..\include\cglm\simd\sse2\quat.h" />
|
||||||
|
<ClInclude Include="..\include\cglm\simd\x86.h" />
|
||||||
<ClInclude Include="..\include\cglm\sphere.h" />
|
<ClInclude Include="..\include\cglm\sphere.h" />
|
||||||
<ClInclude Include="..\include\cglm\types.h" />
|
<ClInclude Include="..\include\cglm\types.h" />
|
||||||
<ClInclude Include="..\include\cglm\util.h" />
|
<ClInclude Include="..\include\cglm\util.h" />
|
||||||
|
|||||||
@@ -84,6 +84,12 @@
|
|||||||
<ClCompile Include="..\src\ease.c">
|
<ClCompile Include="..\src\ease.c">
|
||||||
<Filter>src</Filter>
|
<Filter>src</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\src\curve.c">
|
||||||
|
<Filter>src</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\src\bezier.c">
|
||||||
|
<Filter>src</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="..\src\config.h">
|
<ClInclude Include="..\src\config.h">
|
||||||
@@ -233,5 +239,23 @@
|
|||||||
<ClInclude Include="..\include\cglm\ease.h">
|
<ClInclude Include="..\include\cglm\ease.h">
|
||||||
<Filter>include\cglm</Filter>
|
<Filter>include\cglm</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\include\cglm\simd\arm.h">
|
||||||
|
<Filter>include\cglm\simd</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\include\cglm\simd\x86.h">
|
||||||
|
<Filter>include\cglm\simd</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\include\cglm\call\curve.h">
|
||||||
|
<Filter>include\cglm\call</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\include\cglm\curve.h">
|
||||||
|
<Filter>include\cglm</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\include\cglm\bezier.h">
|
||||||
|
<Filter>include\cglm</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\include\cglm\call\bezier.h">
|
||||||
|
<Filter>include\cglm\call</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
Reference in New Issue
Block a user