Compare commits

..

703 Commits

Author SHA1 Message Date
Recep Aslantas
34e5704fe8 bump version to v0.8.4 2021-08-18 04:47:11 +03:00
Recep Aslantas
672523e5af Merge pull request #219 from recp/project_zo
extend glm_project() to support ZERO_TO_ONE
2021-08-16 16:55:19 +03:00
Recep Aslantas
8427d02a9b pick matrix helper (aka gluPickMatrix) 2021-08-16 16:53:46 +03:00
Recep Aslantas
a2bd00df32 fix including headers, and suppress warnings 2021-08-16 15:51:52 +03:00
Recep Aslantas
4c8f7f310c Update project_zo.h 2021-08-16 14:27:20 +03:00
Recep Aslantas
9096fa6bab fix include paths 2021-08-16 14:27:12 +03:00
Recep Aslantas
29c3837672 implement project zo 2021-08-16 14:16:43 +03:00
Recep Aslantas
4530e0381b build: add missing files 2021-08-16 01:10:29 +03:00
Recep Aslantas
6cf1fb8992 Update .gitignore 2021-08-16 01:10:19 +03:00
Recep Aslantas
9ed4e41afd call version for clipspace-project 2021-08-16 01:08:11 +03:00
Recep Aslantas
28d24da6df build: add missing files 2021-08-16 00:55:19 +03:00
Recep Aslantas
ef22e2063f win: fix build error and comment style 2021-08-16 00:54:37 +03:00
Recep Aslantas
5a48aad1b0 Merge pull request #218 from Nairou/master
Add CGLM_FORCE_DEPTH_ZERO_TO_ONE support to glm_unprojecti
2021-08-16 00:45:22 +03:00
Caleb Gingles
07aee82125 Add CGLM_FORCE_DEPTH_ZERO_TO_ONE support to glm_unprojecti 2021-08-15 17:34:26 -04:00
Recep Aslantas
abbeb274c5 Merge pull request #214 from bubba2k/patch-1
Note that radians is expected in glm_perspective()
2021-08-09 10:54:02 +03:00
bubba2k
814adf11de Note that radians is expected in glm_perspective()
The `fovy` parameter is expected in radians, which isn't mentioned anywhere in the docs. Causes unnecessary confusion. Might as well point it out.
2021-08-09 03:02:47 +02:00
Recep Aslantas
d0d1e46533 Merge pull request #210 from legends2k/quat_rot_vecs 2021-06-15 19:59:45 +03:00
Sundaram Ramaswamy
03b4594d9e quat_from_vecs: incorporate PR comments
* C89-style comments
* Move all variable declarations to function start
* Remove constant variables
* Remove newline for ‘else’
2021-06-15 19:11:41 +05:30
Sundaram Ramaswamy
01e2b74a29 Update documentation for qaut_from_vecs 2021-06-10 23:52:09 +05:30
Sundaram Ramaswamy
ee5050f43c Tests for quaternion from two vec3 2021-06-10 23:15:10 +05:30
Sundaram Ramaswamy
b5802b99b2 Compute quaternion rotating a vector into another
Both `vec3` inputs should be of unit length; returns a unit quaternion.
2021-06-10 23:10:54 +05:30
Recep Aslantas
8b958e9600 Merge pull request #209 from legends2k/fix_vec3_cross
Fix cross product when an operand is also dest
2021-06-10 16:49:17 +03:00
Sundaram Ramaswamy
aa071b2a6b Fix cross product when operand is also dest 2021-06-10 17:20:50 +05:30
Recep Aslantas
479e7d4240 Merge pull request #207 from legends2k/fix_vec3_ortho
Fix vec3_ortho
2021-06-10 10:15:12 +03:00
Recep Aslantas
38c6188e12 Update vec3.h 2021-06-10 10:13:51 +03:00
Sundaram Ramaswamy
c330b47ded Remove debug printf statements 2021-06-10 10:27:28 +05:30
Sundaram Ramaswamy
2e8162b133 Fix vec3_ortho 2021-06-09 23:18:32 +05:30
Recep Aslantas
afdcae08dd Merge pull request #205 from legends2k/master
Include affine.h in quat.h; remove needless decls
2021-06-07 11:45:54 +03:00
Sundaram Ramaswamy
32d1c96dc0 Include affine.h in quat.h; remove needless decls
* affine.h is needed for glm_translate_make
* Remove function declarations
  - glm_mat4_mulv since mat4.h is already included
  - glm_mul_rot as affine-mat.h is already include
  - glm_translate as affine.h is included with this change
2021-06-07 11:35:56 +05:30
Recep Aslantas
4d2ba464a0 Update README.md 2021-05-30 18:11:17 +03:00
Recep Aslantas
398e47070b Update README.md 2021-05-30 18:09:17 +03:00
Recep Aslantas
619ac4ce9a Update README.md 2021-05-30 18:03:33 +03:00
Recep Aslantas
e83940f3b1 Create cglm.png 2021-05-30 17:48:29 +03:00
Recep Aslantas
e5d88f22a0 Update README.md 2021-05-30 15:31:06 +03:00
Recep Aslantas
8e10ab2b49 Update features.rst 2021-05-30 15:30:55 +03:00
Recep Aslantas
4ede0815d4 Update features.rst 2021-05-30 15:28:38 +03:00
Recep Aslantas
7d16e3583f Merge branch 'master' of https://github.com/recp/cglm 2021-05-30 15:23:38 +03:00
Recep Aslantas
6011baff06 Update opt.rst 2021-05-30 15:23:30 +03:00
Recep Aslantas
af92df4e84 ci: migrate cglm from tavis-ci.org to travis-ci.com 2021-05-30 15:17:33 +03:00
Recep Aslantas
94381d3067 struct: fix glms_perspective_resize
since struct param is copy-by-value, result was noop
2021-05-30 13:06:49 +03:00
Recep Aslantas
0e794f8f8f struct: fix glms_persp_move_far
since struct param is copy-by-value, result was noop
2021-05-30 13:02:10 +03:00
Recep Aslantas
b895e424b0 docs: add docs about clipspace configuration 2021-05-30 12:53:04 +03:00
Recep Aslantas
a2b8858e36 win: suppress warnings 2021-05-30 12:50:30 +03:00
Recep Aslantas
9d08407897 win: suppress warnings 2021-05-30 12:46:26 +03:00
Recep Aslantas
8898c3b471 win: add missing files to build 2021-05-30 12:43:17 +03:00
Recep Aslantas
f0c2860179 Merge pull request #203 from bwhmather/meson-fixes
Update lists of source files in meson.build
2021-05-29 14:31:41 +03:00
Ben Mather
f142e8e16e build: rebuild list of test files in meson.build 2021-05-29 10:43:29 +01:00
Ben Mather
5ac916236c build: fix lists broken by missing commas in meson.build 2021-05-29 10:43:29 +01:00
Ben Mather
4327935b9f style: fix trailing whitespace in meson.build 2021-05-29 10:43:23 +01:00
Recep Aslantas
086b40bf6a Merge pull request #201 from hartenfels/master
Add struct clipspace files to autoconf build
2021-05-24 22:31:33 +03:00
Carsten Hartenfels
af3b356762 Add struct clipspace files to autoconf build
They weren't being installed.

Fixes #200.
2021-05-24 21:20:27 +02:00
Recep Aslantas
9ac291c673 Merge pull request #198 from raedwulf/clipspace
Clipspace implementations for left/righted-handed coordinate systems and [-1,1] and [0,1] clipspace
2021-05-23 18:59:01 +03:00
Tai Chi Minh Ralph Eastwood
7f7e9f69da clipspace: add struct API implementations 2021-05-22 22:41:03 +02:00
Tai Chi Minh Ralph Eastwood
8ddb5d5740 build: fix incorrect include paths for libcglm 2021-05-14 16:58:48 +02:00
Tai Chi Minh Ralph Eastwood
56ec058c7d style: fix documentation consistency for describing clipspace 2021-05-14 16:55:16 +02:00
Tai Chi Minh Ralph Eastwood
a5af9e5eac build: fix Makefile.am missing clipspace source files 2021-05-14 16:49:18 +02:00
Tai Chi Minh Ralph Eastwood
4d20f97275 clipspace: fix typo'd clip control define 2021-05-14 16:33:16 +02:00
Tai Chi Minh Ralph Eastwood
89e8c352ec style: fix missing whitespace for alignment
Co-authored-by: Michael <michael.guyver@gmail.com>
2021-05-14 15:44:10 +02:00
Tai Chi Minh Ralph Eastwood
403097d56c build: fix duplicate line in CMakeLists.txt 2021-05-14 15:27:28 +02:00
Tai Chi Minh Ralph Eastwood
eddaf464ff style: fix missing whitespace for alignment
Co-authored-by: Michael <michael.guyver@gmail.com>
2021-05-14 15:25:29 +02:00
Tai Chi Minh Ralph Eastwood
7065011bf3 clipspace: add initial implementations LH, RH and NO, ZO
Add the initial implementations of the left-handed and right-handed
coordinate systems as well as clipspace depth values of [-1, 0] and
[0, 1].
2021-05-13 23:22:58 +02:00
michaelg
db46ea110a Updated README.md to remove ref to glm_cmp stub 2021-05-13 23:18:05 +02:00
michaelg
c013bd462c Add LH & RH_NO perspective functions
This commit adds functions `glm_perspective_lh_no` and
`glm_perspective_rh_no` to the code. Unit tests are added and this
commit follows the new pattern of adding the a new file per
coordinate-system and clip-space tuple.

. Makefile.am updated
. removed test/glm_cmp project stub
. unit tests include naive implementations to as well as magic number
  ref-data generated by the corresponding GLM functions.

No tests run yet on Windows or Mac.
2021-05-13 23:18:05 +02:00
michaelg
b3a18b8a15 Add glm_perspective_rh_zo function + tests
This commit adds the RH/ZO perspective function. It does so in the new
file `cam_rh_zo.h` and further refactors the LH variant into new file
`cam_lh_zo.h`. This creates some churn in the tests and configuration
files as new test files were added as well, and all these changes found
their way into the build files.

Tests passing on Linux.
2021-05-13 23:18:05 +02:00
michaelg
1bce62c371 Add function glm_perspective_lh_zo
This commit adds the function `glm_perspective_lh_zo`, modelled on the
implementation of glm_perspective, but amended to provide a left-hand
coordinate system expected by DirectX, Metal and Vulkan (per the GLM
project's `glm/detail/setup.hpp`). It uses a clip-space of zero-to-one.

The function is tested against a longhand version of the algorithm it
seeks to implement as well as against the output of the GLM project's
`glm::perspectiveLH_ZO` function. This commit adds a new subdirectory
`test/glm_cmp` which contains a basic CMake file and `main.cpp`. An
interested user should link or copy or clone the GLM project into this
directory. The `main` function can be used to print the reference data
used so others can verify behaviour in the future, or add new literal
reference values.
2021-05-13 23:18:05 +02:00
Recep Aslantas
a242d83805 style: rename nearVal, farVal to nearZ and farZ 2021-05-08 22:42:44 +03:00
Recep Aslantas
7760c709da build, meson: add so version to meson build 2021-05-08 15:44:14 +03:00
Recep Aslantas
919e3bcf4a Merge pull request #193 from recp/simd-3
SIMD and ILP Update
2021-05-08 14:14:22 +03:00
Recep Aslantas
607182982d Merge branch 'master' into simd-3 2021-05-07 14:08:56 +03:00
Recep Aslantas
ad17f38934 Merge pull request #195 from legends2k/master
Add nlerp for quaternions
2021-05-07 12:58:05 +03:00
Sundaram Ramaswamy
8302f78484 Update documentation with nlerp 2021-05-07 14:26:31 +05:30
Sundaram Ramaswamy
9665be3138 Add struct API wrapper 2021-05-07 13:49:44 +05:30
Recep Aslantas
5c22ca3abb arrm, neon: use negate instruction instead of xor in glm_inv_tr_neon() 2021-05-07 01:52:12 +03:00
Recep Aslantas
7f9585ca72 arrm, neon: impove hadd performance 2021-05-07 01:46:24 +03:00
Recep Aslantas
d0ab3aaa2e arm, neon: util macros 2021-05-07 01:46:03 +03:00
Sundaram Ramaswamy
83dbdcc4a9 Add nlerp tests 2021-05-07 01:21:28 +05:30
Sundaram Ramaswamy
8ce45b4303 Add call and struct interfaces 2021-05-07 00:35:20 +05:30
Sundaram Ramaswamy
f19ff5d064 Use scale for both cases 2021-05-06 23:47:03 +05:30
Sundaram Ramaswamy
d6b93f052e Add nlerp for quaternions
Normalized linear interpolation for quaterions are a cheaper
alternative to slerp.  This PR adds nlerp operaiton for quaternions.
2021-05-06 23:38:26 +05:30
Recep Aslantas
28705be5a3 simd, sse: reduce some computation at glm_mul_rot_sse2() 2021-05-01 23:16:03 +03:00
Recep Aslantas
e1b142bce7 add todo to quat.h 2021-05-01 23:03:41 +03:00
Recep Aslantas
0f96eaad20 sse2: optimize glm_mat3_mul_sse2() with sse2
* reduce memory access for dest[2][2]
* the speed is increased ;)
2021-05-01 22:55:19 +03:00
Recep Aslantas
d5d3178ae0 Merge pull request #192 from Winter091/fixing-typo
fix typo: vec3 -> vec4
2021-05-01 21:24:31 +03:00
winter091
13269f4af8 fix typo: vec3 -> vec4 2021-05-01 16:48:31 +03:00
Recep Aslantas
faf6186c29 sse: optimize glm_mat2_mul_sse2 with sse 2021-05-01 03:44:04 +03:00
Recep Aslantas
2be6ac949b sse: optimize glm_quat_mul with sse 2021-05-01 03:18:26 +03:00
Recep Aslantas
5b7bc522ac sse: optimize affine with sse
* re-oder instructions for ILP
2021-05-01 02:58:14 +03:00
Recep Aslantas
376cf31ee7 armi neon: optimize affine with neon 2021-05-01 02:46:14 +03:00
Recep Aslantas
d28b381dd6 armi neon: optimize mat4 mul with neon 2021-05-01 02:45:15 +03:00
Recep Aslantas
3673622cc3 simd, sse: optimize mat4 mul-v with sse
* re-oder instructions for ILP
2021-05-01 02:17:34 +03:00
Recep Aslantas
a90f706e12 simd, sse: optimize mat4 mul with sse
* re-oder instructions for ILP
2021-05-01 02:17:08 +03:00
Recep Aslantas
c065d71a2f simd, sse: optimize mat4 inv with sse
* reduce a few shufflees
* re-oder instructions for ILP
2021-04-30 21:12:17 +03:00
Recep Aslantas
1b3b91fe0b Merge pull request #191 from quadroli/master
very minor correction in readme
2021-04-30 20:35:15 +03:00
quadroli
17560a0687 very minor correction in readme 2021-04-30 18:03:50 +03:00
Recep Aslantas
ba634d6c83 simd: optimize glm_mat4_zero() with simd 2021-04-30 04:04:27 +03:00
Recep Aslantas
f35badd436 now working on v0.8.3 2021-04-30 01:00:42 +03:00
Recep Aslantas
04eaf9c535 arm, neon: neon/fma support for glm_quat_mul() 2021-04-29 01:12:00 +03:00
Recep Aslantas
bd6641bd0a build: add missing files to build files 2021-04-28 22:45:03 +03:00
Recep Aslantas
4e4bff418d arm, neon: neon/fma support for glm_mat2_mul() 2021-04-28 22:06:46 +03:00
Recep Aslantas
55ebbdbe40 arm, neon: neon/fma support for glm_inv_tr() 2021-04-28 14:46:14 +03:00
Recep Aslantas
e4c35e32fc Merge pull request #190 from ylecuyer/patch-3
Minor typo in doc
2021-04-27 23:52:40 +03:00
Yoann Lecuyer
ec467fef1f Minor typo in doc
I stumbled upon while reading the doc
2021-04-27 22:09:13 +02:00
Recep Aslantas
1e8865233b Merge pull request #189 from recp/simd-2
ARM Neon Update
2021-04-25 15:20:24 +03:00
Recep Aslantas
155eb109a8 arm, neon: neon/fma support for glm_mul_rot() 2021-04-25 03:49:35 +03:00
Recep Aslantas
2903813765 arm, neon: neon/fma support for glm_mul() 2021-04-25 03:45:00 +03:00
Recep Aslantas
0ab50f7208 arm, neon: update mat4_mul to use FMA 2021-04-25 03:41:39 +03:00
Recep Aslantas
701e015bfd avoid loading vec3 by glmm_load()
* use glmm_set1() for each for now
2021-04-25 02:36:06 +03:00
Recep Aslantas
1fb941a41b drop swizzling helpers fro now for simplicity 2021-04-25 02:35:55 +03:00
Recep Aslantas
92151c6328 arm, neon: use div instead of mul by 1 / det for mat4_inv 2021-04-24 18:02:47 +03:00
Recep Aslantas
afac887850 arm, neon: implement mat4 inv with neon 2021-04-24 17:54:01 +03:00
Recep Aslantas
a111693b6b arm, neon: implement mat4 determinant with neon 2021-04-24 15:45:36 +03:00
Recep Aslantas
ce9e5f5575 arm: update glmm swizzling func names 2021-04-24 01:38:04 +03:00
Recep Aslantas
d13842e7de arm: optimize vec4 div with NEON 2021-04-24 00:51:09 +03:00
Recep Aslantas
059e5010e6 arm: define CGLM_ARM64 for identify arm64 2021-04-24 00:44:07 +03:00
Recep Aslantas
65292a94a6 swizzling functions for NEON 2021-04-24 00:00:00 +03:00
Recep Aslantas
f303984aad use unified glmm api for vec4 2021-04-23 23:34:36 +03:00
Recep Aslantas
7d5c4da7cf optimize translate functions 2021-04-23 23:32:48 +03:00
Recep Aslantas
63988a515c glmm: new defines for splat 2021-04-23 23:32:21 +03:00
Recep Aslantas
9725b60d46 rename glmm_shuff1x() to glmm_splat()
* mark glmm_shuff1x() as DEPRECATED
2021-04-23 22:12:57 +03:00
Recep Aslantas
50c93f3d30 Merge pull request #188 from wdouglass/cmake-pkgconfig
configure and install cglm.pc with cmake
2021-04-23 17:12:04 +03:00
Recep Aslantas
f14ca0c3f2 now working on v0.8.2 2021-04-23 17:03:39 +03:00
Woodrow Douglass
0c165cba76 configure and install cglm.pc with cmake 2021-04-23 09:28:55 -04:00
Recep Aslantas
2de1133012 fix enabling FMA macro for MSVC 2021-04-19 06:04:22 +03:00
Recep Aslantas
12dc054e49 Merge pull request #186 from recp/fma
Optimizations with FMA
2021-04-19 04:32:01 +03:00
Recep Aslantas
ebba4eea8e win, msvc: enable FMA macro for MSVC 2021-04-19 04:14:14 +03:00
Recep Aslantas
aa2fa89e6c arm: fma msub and nmsub 2021-04-19 00:35:19 +03:00
Recep Aslantas
7b0eee497e arm: fix fmadd parameter order 2021-04-19 00:28:07 +03:00
Recep Aslantas
04008d9c3f arm: fix fma for glm_vec4_muladds 2021-04-19 00:21:04 +03:00
Recep Aslantas
11b1588105 glmm: missing FMA funcs for SSE and AVX 2021-04-19 00:20:47 +03:00
Recep Aslantas
7c81482248 avx: implement scale matrix using AVX 2021-04-19 00:11:43 +03:00
Recep Aslantas
f3f29bd383 vec4: optimize muladd and muladds with fma 2021-04-18 16:24:29 +03:00
Recep Aslantas
0d0d22f96c opitimize affine matrix operations with fma 2021-04-18 13:51:22 +03:00
Recep Aslantas
7df5aa2e26 opitimize mat2 operations with fma 2021-04-18 13:51:09 +03:00
Recep Aslantas
7cc4c37afb opitimize mat3 operations with fma 2021-04-18 13:51:03 +03:00
Recep Aslantas
abe29a788a opitimize mat4 operations with fma 2021-04-18 13:50:51 +03:00
Recep Aslantas
c5655bbd2e glmm: define fma functions 2021-04-18 13:49:50 +03:00
Recep Aslantas
47e0045015 glmm, x86: define hadd function 2021-04-18 13:49:36 +03:00
Recep Aslantas
8f09cc8583 Merge pull request #183 from legends2k/master
Add CMake interface library target
2021-03-26 20:36:56 +03:00
Sundaram Ramaswamy
d6a0ac320b Update docs on CMake header-only usage 2021-03-26 12:32:36 +05:30
Sundaram Ramaswamy
616d38c13a Remove redundant header listing 2021-03-26 12:23:56 +05:30
Sundaram Ramaswamy
9e12908556 Add CMake interface library target
Projects using cglm as a header-only library needn’t build files under
src/. Provide a target which allows them to skip compiling them by

add_subdirectory(external/cglm EXCLUDE_FROM_ALL)
target_link_libraries(MyExe PRIVATE cglm_headers)
2021-03-25 17:47:43 +05:30
Recep Aslantas
405cda6ee9 now working on v0.8.1 2021-03-02 23:36:33 +03:00
Recep Aslantas
1b0322e51c Merge pull request #180 from recp/aabb-sphere-fix
fix aabb-sphere test (#179)
2021-03-01 10:48:04 +03:00
Recep Aslantas
4a308dcd9e fix aabb-sphere test (#179) 2021-02-28 23:12:06 +03:00
Recep Aslantas
fec396950b Merge pull request #178 from gaurapanasenko/master
Fixed cmake config install path
2021-02-22 10:31:06 +03:00
Yehor Panasenko
981af0565e Fixed cmake config install path
Now you can use library with
```cmake
find_package(cglm REQUIRED)
target_link_libraries(${PROJECT_NAME} PRIVATE ${CGLM_LIBRARY})
```
2021-02-22 04:46:22 +02:00
Recep Aslantas
1d215ef5f3 Merge pull request #177 from Winter091/master
remove wrong c standard bug
2021-01-25 20:05:58 +03:00
winter091
2b7cfde64f remove wrong c standard bug 2021-01-25 15:50:18 +03:00
Recep Aslantas
c783c42101 Merge pull request #174 from timgates42/bugfix_typo_assume
docs: fix simple typo, asume -> assume
2020-12-12 09:18:09 +03:00
Tim Gates
bddcfedead docs: fix simple typo, asume -> assume
There is a small typo in include/cglm/affine.h.

Should read `assume` rather than `asume`.
2020-12-12 12:13:48 +11:00
Recep Aslantas
34e7438271 Merge pull request #172 from SanderMertens/master
Replace hex floating point literals
2020-12-04 13:00:07 +03:00
Sander Mertens
485ff6bc46 Replace hex floating point literals 2020-12-01 21:49:35 -08:00
Recep Aslantas
4ab9ab4772 docs: fix/improve build documentation 2020-11-21 18:20:04 +03:00
Recep Aslantas
a5ff477fc8 doc: fix duplicate entry warning 2020-11-21 18:13:59 +03:00
Recep Aslantas
254570d006 Merge pull request #169 from podsvirov/docs-c-id-attribute-restrict
Fix Documentions WARNING for __restrict attribute
2020-11-21 18:11:28 +03:00
Konstantin Podsvirov
681f20d540 Fix Documentions WARNING for __restrict attribute
Add `__restrict` keyword to `c_id_attributes` added in `sphinx 3.0`.

Closes #167
2020-11-21 15:34:18 +03:00
Recep Aslantas
fd87f6e2c3 Merge pull request #168 from podsvirov/fix-fix-docs-for-vec2
Fix fix docs for glm_vec2()
2020-11-21 14:32:48 +03:00
Konstantin Podsvirov
2c12c6dce5 Fix fix docs for glm_vec2()
Remove extra `\` symbol.
2020-11-21 14:05:19 +03:00
Recep Aslantas
5619527fd3 Update cglm.podspec 2020-11-19 22:42:12 +03:00
Recep Aslantas
8b1c3c3fc4 now working on v0.8.0 2020-11-19 22:21:21 +03:00
Recep Aslantas
ec852c7682 Merge pull request #164 from taisei-project/fix-cast-align
simd/x86: fix -Wcast-align warnings (gcc/clang)
2020-11-09 11:19:02 +03:00
Recep Aslantas
5433c9ed6c Merge pull request #165 from taisei-project/meson-install-option
meson: add 'install' option
2020-11-09 11:11:36 +03:00
Andrei Alexeyev
2a2d51624b meson: add 'install' option
This is useful for people who want to use cglm as a meson subproject
without polluting the main project's install target.
2020-11-08 20:30:24 +02:00
Andrei Alexeyev
5fa908602f simd/x86: fix -Wcast-align warnings (gcc/clang)
This modifies glmm_{load,store}3 functions to make the compiler assume
the v pointer is appropriately aligned for the type it is being cast to.
Not tested with CGLM_ALL_UNALIGNED, but it probably doesn't matter.
2020-11-08 20:09:57 +02:00
Recep Aslantas
9da74f9654 Update CREDITS 2020-11-08 17:57:34 +03:00
Recep Aslantas
dddb077b13 ignore xcode user data 2020-11-08 17:42:55 +03:00
Recep Aslantas
6107287c9a Merge pull request #163 from emersion/glm-vec2-doc-fix
Fix docs for glm_vec2()
2020-10-17 09:19:33 +03:00
Simon Ser
7dccbef6e3 Fix docs for glm_vec2()
The prototype takes a float *, which can be vec3 or vec4.
2020-10-16 22:32:24 +02:00
Recep Aslantas
d920a62be2 Merge pull request #160 from smumryak/master
Added simple swiftpm package file
2020-09-08 11:55:18 +03:00
Serhii Mumriak
73f32b9ef7 Updated README.md with swift configuration information 2020-09-07 17:26:33 -07:00
Serhii Mumriak
2e5257bcc1 Updated 160 PR according review comments. 2020-09-07 17:09:37 -07:00
Serhii Mumriak
65b0b461ab Added simple swiftpm package file with module map and empty C file to trick the compiler to build the empty C target. 2020-09-05 20:39:12 -07:00
Recep Aslantas
e34601f578 arm neon: multiply mat4 with vec4 2020-08-29 11:51:07 +03:00
Recep Aslantas
fa01a3077b neon: support transpose mat4 with neon 2020-08-29 11:33:13 +03:00
Recep Aslantas
54f805a62d neon: move neon-scale to simd header 2020-08-29 11:32:44 +03:00
Recep Aslantas
a05b282fad now working on v0.7.9 2020-08-29 10:19:50 +03:00
Recep Aslantas
66f6bbde6c io: deprecate CGLM_NO_PRINTS_NOOP 2020-08-08 10:53:35 +03:00
Recep Aslantas
4054d9a190 io: update documentation + README 2020-08-08 10:47:38 +03:00
Recep Aslantas
c1112f0063 io: make options changable by user
* this will help to disable colorful output because not all terminals can print colors.
2020-08-08 10:22:16 +03:00
Recep Aslantas
b62e922f32 io: make prints noop if we can't define them 2020-08-08 10:20:44 +03:00
Recep Aslantas
3c53bed709 now working on v0.7.8 2020-08-08 10:14:41 +03:00
Recep Aslantas
a2b6d71558 Merge pull request #158 from randy408/meson
Add meson build support
2020-08-06 00:55:04 +03:00
Randy
fdfceb9f5b update build.rst 2020-08-05 23:14:05 +02:00
Randy
d273daecfe update README 2020-08-05 23:05:11 +02:00
Randy
92b75a1345 meson: add option to build tests, default to false 2020-08-05 22:49:52 +02:00
Randy
640795a771 update README 2020-08-04 20:50:33 +02:00
Randy
cad265ebcd add meson.build 2020-08-04 20:31:39 +02:00
Recep Aslantas
387c33fb4d Merge pull request #154 from randy408/symbol
win32: fix symbol exports
2020-08-04 21:05:28 +03:00
Randy
77585de397 remove CGLM_DLL from vs solution 2020-08-04 19:16:05 +02:00
Randy
a9b06e4b35 gcc: fix warnings (#156) 2020-08-04 19:57:10 +03:00
Recep Aslantas
7976ac78f2 Merge pull request #155 from randy408/test
test: don't link 'm' with msvc
2020-08-04 00:23:13 +03:00
Randy
208f8073ad test: don't link 'm' with msvc 2020-08-03 22:47:23 +02:00
Randy
009fb966a6 drop CGLM_DLL, add CGLM_STATIC 2020-08-03 22:45:50 +02:00
Randy
09fd9f86b9 update CMakefile 2020-08-03 20:47:12 +02:00
Randy
2ff4ae0b4c simplify exports check 2020-08-03 20:47:00 +02:00
Randy
aa0a195e98 win32: fix symbol exports 2020-08-03 19:34:45 +02:00
Recep Aslantas
87092e6849 build: add missing files to project files 2020-07-31 20:09:57 +03:00
Recep Aslantas
89ced4166a Merge pull request #151 from recp/affine2d
2D Affine Transforms
2020-07-31 19:21:30 +03:00
Recep Aslantas
6080099434 2d: add documentation for 2D Affine Transforms 2020-07-31 19:19:07 +03:00
Recep Aslantas
f3735c9036 2d: struct versions of affine2d transforms 2020-07-31 18:38:32 +03:00
Recep Aslantas
2242e9a5e1 2d: add tests for rotate2d and its friends 2020-07-31 18:21:23 +03:00
Recep Aslantas
a12364d486 2d: fix rotate2d and its friends 2020-07-31 18:20:51 +03:00
Recep Aslantas
b133c2e3e3 2d: add rotate2d and its friends 2020-07-31 15:11:00 +03:00
Recep Aslantas
0127d30fa8 2d: add scale2d and its friends 2020-07-31 13:49:33 +03:00
Recep Aslantas
9b13b2f872 add tests for translate2d functions 2020-07-31 12:43:46 +03:00
Recep Aslantas
40d903c2bc build: define CGLM_DEFINE_PRINTS to enable print functions for test results 2020-07-31 12:41:53 +03:00
Recep Aslantas
06016220c0 build: add affine2d to CMake 2020-07-31 12:41:29 +03:00
Recep Aslantas
bb751d32ca 2d: add translate2d and its friends 2020-07-31 11:40:52 +03:00
Recep Aslantas
6dc37f6cc9 build: CFLAGS for check/test target to match the main target 2020-07-31 00:25:08 +03:00
Recep Aslantas
5ff42799b2 mat2: don't use vec4 directly on mat2 becauce of alignment requirements may be different 2020-07-31 00:06:38 +03:00
Recep Aslantas
2326e627b5 now working on v0.7.7 2020-07-31 00:06:17 +03:00
Recep Aslantas
c18fe8098f build: try to remove RTC1 from CMake build 2020-07-23 19:12:54 +03:00
Recep Aslantas
a9ed8470b4 win: try to disable /RTC flags 2020-07-20 20:41:00 +03:00
Recep Aslantas
332087da61 Update mat4.rst 2020-07-12 23:30:04 +03:00
Recep Aslantas
56c43d7a74 Update mat4.rst 2020-07-12 23:29:44 +03:00
Recep Aslantas
649f390662 Update mat4.rst 2020-07-12 23:27:15 +03:00
Recep Aslantas
0818bbdf51 Update mat4.rst 2020-07-12 23:24:41 +03:00
Recep Aslantas
edd1517f85 Update mat4.rst 2020-07-12 23:23:50 +03:00
Recep Aslantas
d0c2e8233c Update mat4.rst 2020-07-12 23:23:06 +03:00
Recep Aslantas
87837aa074 Merge branch 'master' of https://github.com/recp/cglm 2020-07-12 23:21:16 +03:00
Recep Aslantas
62ab6c56c0 Update mat4.rst 2020-07-12 23:21:13 +03:00
Recep Aslantas
a2985aa444 Merge pull request #146 from Terri00/patch-1
mat3_mulv: function behaviour to match with mat4
2020-07-03 23:25:54 +03:00
Harry Godden
7274cee153 mat3_mulv: function behaviour to match with mat4
Using mat3_mulv with the same input/output vector creates undesired results. 

Respective mat4_mulv function provides temporary vec3 'res'.
Updated this function to match behaviour of mat4.
2020-07-02 23:29:10 +01:00
Recep Aslantas
79c44fdbfa drop pedantic from C Flags and allow extensions
this will also suppress warnings on test target
2020-05-29 13:01:36 +03:00
Recep Aslantas
c32e986497 mat2: suppress warnings for initializing mat2 sruct 2020-05-29 12:51:45 +03:00
Recep Aslantas
b953fcf1bd ci, travis: add multiple cpu arch 2020-05-29 00:47:18 +03:00
Recep Aslantas
c0a4c245f0 tests: add test for frustum 2020-05-28 14:19:35 +03:00
Recep Aslantas
acc0885e52 tests: add option to disable colors in test output
* because some terminals may not support colors, in that case, colors can be disabled by defining `GLM_TESTS_NO_COLORFUL_OUTPUT`
2020-05-28 11:47:13 +03:00
Recep Aslantas
f49e8f9991 neon: fix vec4_muladds (critical) 2020-05-26 23:03:32 +03:00
Recep Aslantas
d2e5a3cd5b use epsilon to compare vec2/vec3/vec4_eq_all 2020-05-26 23:02:58 +03:00
Recep Aslantas
a1485a14f6 option to override FLT_EPSILON with GLM_FLT_EPSILON 2020-05-26 23:00:00 +03:00
Recep Aslantas
271e3b15d6 Merge branch 'cmake' 2020-05-25 17:07:46 +03:00
Recep Aslantas
74cf89a82f build, cmake: update cmake to export Config to use find_package() 2020-05-25 17:06:48 +03:00
Recep Aslantas
8698082411 Merge pull request #143 from recp/cmake
Improve CMakeLists.txt
2020-05-22 00:01:42 +03:00
Recep Aslantas
799de548f4 Update CMakeLists.txt 2020-05-18 16:04:15 +03:00
Recep Aslantas
671dae3e22 now working on v0.7.6 2020-05-18 15:55:04 +03:00
Recep Aslantas
7e142132bf win: suppress warning; C4005: '_CRT_SECURE_NO_WARNINGS': macro redefinition 2020-05-17 19:24:48 +03:00
Recep Aslantas
0ccd58da01 docs: add clarification/troubleshooting for a crash type 2020-05-16 22:37:16 +03:00
Recep Aslantas
4211c230cc now working on v0.7.5 2020-05-16 22:11:54 +03:00
Recep Aslantas
269bdb3dbd fix arm neon build 2020-05-11 20:19:05 +03:00
Recep Aslantas
b032b803ca build, cmake: use PROJECT_VERSION_** to set so version instead of custom variables 2020-05-10 23:54:55 +03:00
Recep Aslantas
26a638e11d io: make print functions macro to supress unused parameter warrnings 2020-05-03 14:10:24 +03:00
Recep Aslantas
099522ada3 fix LICENSE alignments 2020-05-02 22:32:57 +03:00
Recep Aslantas
4903dd62ea now working on v0.7.4 2020-05-02 22:32:53 +03:00
Recep Aslantas
95161f7776 Merge pull request #140 from recp/print-io
Print Improvements
2020-05-01 01:12:16 +03:00
Recep Aslantas
f0942c13a1 remove redundant typedef. 2020-05-01 01:07:18 +03:00
Recep Aslantas
8eddeb77d0 win: fix print function for _DEBUG and supress warnings 2020-05-01 01:03:20 +03:00
Recep Aslantas
cbed29820b ios: update docs for prints 2020-04-30 23:49:38 +03:00
Recep Aslantas
3ec6bad5b3 io: open library-called print functions 2020-04-30 23:40:21 +03:00
Recep Aslantas
fefc3dc32d io: print has been maden optional to DEBUG or to CGLM_DEFINE_PRINTS 2020-04-30 23:38:27 +03:00
Recep Aslantas
203d40208c io: new way to print items
* now mis-alignment of columns are fixed: larger numbers are printed via %g and others are printed via %f. Column withs are calculated before print.

* Now values are colorful ;)
* Some print improvements
2020-04-30 23:37:51 +03:00
Recep Aslantas
c45445c613 suppress documentation warnings 2020-04-30 10:15:55 +03:00
Recep Aslantas
73c6766806 Update .gitignore 2020-04-30 10:14:12 +03:00
Recep Aslantas
65dff25ed5 build: add version info to cmake 2020-04-28 00:33:29 +03:00
Recep Aslantas
c2584c0fe6 now working on v0.7.3 2020-04-28 00:20:04 +03:00
Recep Aslantas
bd951f96be Update cglm.podspec 2020-04-28 00:18:15 +03:00
Recep Aslantas
1200372ced vscode settings 2020-04-28 00:04:24 +03:00
Recep Aslantas
75a5ca153d Merge branch 'master' of https://github.com/recp/cglm 2020-04-27 22:46:22 +03:00
Recep Aslantas
5a9593d9bc update docs 2020-04-27 22:30:52 +03:00
Recep Aslantas
edf46aaf2b Update README.md 2020-04-27 22:26:29 +03:00
Recep Aslantas
e2ba795603 Update README.md 2020-04-27 22:25:36 +03:00
Recep Aslantas
5e6b566d6a Update CMakeLists.txt 2020-04-27 13:43:08 +03:00
altf_four
c973768495 CMake: Fix incorrect compiler flags (#139)
* Fix CMake compiler args.

- Replace -stdlib=libc++ with -std=gnu11 & apply it to clang too.
- Remove redundant -fstrict-aliasing.
- Remove warned and redundant -Weverything
2020-04-27 00:11:51 +03:00
altf_four
6d8e2cc92d Add flags required for cmake. (#138)
- Add flags for clang
- Add flags for msvc
- Use modern cmake in compiler flags handling.
- Globalize compiler options for library and tests
- Address issue with cmake output binary being bigger than make's. (Now
cmake is smaller ~176 (confirmed on dynamic library on Linux)).
2020-04-26 19:42:23 +03:00
Recep Aslantas
010dda6a77 Merge pull request #130 from FMMazur/cmake
Cmake: Integratrion
2020-04-26 14:59:55 +03:00
Recep Aslantas
345c7307ef Merge branch 'master' into cmake 2020-04-26 14:34:34 +03:00
Recep Aslantas
f485c928b1 Merge pull request #136 from Uwila/documentation-fix
Fix some documentation mistakes
2020-04-13 21:13:47 +03:00
Uwila
e895fe884e Fix some documentation mistakes 2020-04-12 16:11:18 +02:00
Felipe Munoz Mazur
18fe47d0c7 Merge branch 'master' into cmake 2020-04-10 00:33:07 -04:00
FMMazur
a84ebc4aaa CMake: Use CCMAKE_INSTALL_PREFIX as default to set directory install 2020-04-09 14:03:18 -04:00
Recep Aslantas
5c35c4ef5d Merge pull request #134 from Uwila/patch-1
Link contributors' avatars to the correct page
2020-04-07 22:47:26 +03:00
Uwila
f79674f66a Link contributors' avatars to the correct page 2020-04-07 21:39:27 +02:00
Recep Aslantas
e40373a1fa Merge pull request #132 from Uwila/ray-tests
* tests: add tests for glm_ray_triangle
2020-04-06 16:44:35 +03:00
Recep Aslantas
47807b7955 Update test_ray.h 2020-04-06 16:44:07 +03:00
Uwila
38cb693834 Update vcxproj files for test_ray 2020-04-06 13:51:29 +02:00
Uwila
7bcd7609eb Fix test_ray.h style 2020-04-06 11:43:12 +02:00
Uwila
90eb164a43 Add tests for cglm_ray_triangle 2020-04-06 11:42:23 +02:00
Uwila
78b2e2d2cc Add tests for glm_ray_triangle 2020-04-06 11:38:27 +02:00
Recep Aslantas
e60e7b5750 Merge pull request #131 from Uwila/ray-triangle-intersection
feature: ray-triangle intersection
2020-04-04 00:33:45 +03:00
Uwila
c1331a1dd4 Improve ray.h style 2020-04-03 18:00:49 +02:00
Uwila
339adab783 Align variables in ray code 2020-04-03 17:56:53 +02:00
Uwila
7bf38a3062 Update credits with ray-triangle intersection algorithm 2020-04-03 13:10:38 +02:00
Uwila
99076be6bb Improve code style in ray.h
- 2 spaces instead of 4, for indentation
- Newline after return
- Check if pointer is null
2020-04-03 13:03:46 +02:00
Uwila
eb332acd7e Merge branch 'master' into ray-triangle-intersection 2020-04-02 14:33:57 +02:00
Uwila
c67f7a14a1 Add ray-triangle intersection check 2020-04-02 14:28:28 +02:00
FMMazur
83f6db1bf8 CMake: Fix install error 2020-03-27 18:43:28 -04:00
FMMazur
e493149a0a CMake: Fix errors 2020-03-27 16:04:46 -04:00
FMMazur
38019f0913 CMake: add lib and include install path 2020-03-27 15:57:26 -04:00
FMMazur
bc6b751429 CMake: add install path option 2020-03-27 15:50:37 -04:00
FMMazur
be68d57499 CMake: Added 'make check' as alias to 'make test' 2020-03-27 15:31:55 -04:00
FMMazur
1fb5f89eaa CMake: Change c99 to c11 and shared build as default options. 2020-03-27 15:30:03 -04:00
FMMazur
6470a91265 Merge branch 'cmake' of https://github.com/FMMazur/cglm into cmake 2020-03-27 11:22:48 -04:00
FMMazur
d4235b2431 CMake: Added test configuration 2020-03-27 11:19:56 -04:00
FMMazur
0ef028244a CMake: Added LDFlags Configuration 2020-03-27 09:11:08 -04:00
FMMazur
a8543bc813 Added folder build/ to .gitignore 2020-03-27 09:02:52 -04:00
Felipe Munoz Mazur
cf3888d734 Update README.md
Document CMake Usage and Project Example
2020-03-27 00:12:47 -04:00
FMMazur
b8e978862e Added install to CMakeLists.txt 2020-03-27 00:04:15 -04:00
FMMazur
dfba2072f7 Added simple CMakeLists.txt 2020-03-26 23:36:20 -04:00
Uwila
2bf576c2cd Fix documentation mistake for glm_vec3_rotate (#126)
In the documentation, for glm_vec3_rotate, correctly labels `angle` as `in` rather than `out`.

Co-authored-by: Recep Aslantas <info@recp.me>
2020-03-20 22:58:48 +03:00
Uwila
3abf47f175 Make Github recognize header language as C (#127)
Without this a lot of `*.h` files are marked as being C++ or Objective-C, even though all of it is C.
2020-03-20 22:56:17 +03:00
Recep Aslantas
2fc51c67a3 Update version.rst 2020-03-19 12:58:48 +03:00
Recep Aslantas
34753546f2 Update version.rst 2020-03-19 12:55:49 +03:00
Recep Aslantas
1711db4fef Update util.rst 2020-03-19 12:54:57 +03:00
Recep Aslantas
373b8d216a Update version.rst 2020-03-19 12:53:54 +03:00
Recep Aslantas
7f9487fd62 docs: update documentation 2020-03-19 12:51:05 +03:00
Recep Aslantas
686deb8eb1 util: use glm_clamp_zo to clamp between 0 and 1 2020-03-19 12:37:52 +03:00
Uwila
a392ac3012 Fix small documentation mistake (#125)
At two points in the documentation the names of the parameters in the parameters list do not match the parameter names in the function:
- glm_look
- glm_look_anyup
2020-03-12 09:47:05 +03:00
Recep Aslantas
fabc655919 Merge branch 'master' of https://github.com/recp/cglm 2020-03-06 23:33:30 +03:00
Recep Aslantas
7eada03909 reemove redundant forward declerations 2020-03-06 23:33:27 +03:00
Zollerboy1
ad4a763d47 fix glms_vec2_rotate() by using a dest vec2s instead of taking an axis vector (#122) 2020-03-04 17:05:32 +03:00
Zollerboy1
1f9765c5e5 fix glms_sphere_transform by using mat4s instead of mat4 (#121)
Co-authored-by: Recep Aslantas <m@recp.me>
2020-03-04 11:56:40 +03:00
Recep Aslantas
b3a464bf89 now working on v0.7.2 2020-03-04 11:51:05 +03:00
Recep Aslantas
69b5584f11 build: add missing headers 2020-03-02 10:09:48 +03:00
Recep Aslantas
00523f0b89 helper to swap two float values 2020-03-01 12:56:11 +03:00
Recep Aslantas
31f313caff now working on v0.7.1 2020-02-29 14:00:50 +03:00
Recep Aslantas
010b88ee7a set version to v0.7.0 for vec2/mat2 release 2020-02-25 22:13:25 +03:00
Recep Aslantas
702da626f1 docs: add documentation for vec2 and mat2 2020-02-25 22:11:10 +03:00
Recep Aslantas
8e008511f4 Merge pull request #97 from recp/vec2_mat2
vec2 and mat2 support
2020-02-25 14:54:22 +03:00
Recep Aslantas
eb0d47cfa1 vec2: add struct version for vec2 and vec2-ext 2020-02-25 14:34:11 +03:00
Recep Aslantas
638b9f6dbe fix 'function declaration isn’t a prototype' 2020-02-24 23:11:03 +03:00
Recep Aslantas
ab20ebc28c build: add vec2 and mat2 files 2020-02-24 22:22:27 +03:00
Recep Aslantas
701a95583a vec2: fix memory access error[s] 2020-02-24 22:21:43 +03:00
Recep Aslantas
ad9370537c add tests for mat2 and its call version 2020-02-24 22:14:26 +03:00
Recep Aslantas
43ae3b332a add tests for vec2 and its call version 2020-02-24 10:06:19 +03:00
Recep Aslantas
8a068c3291 Merge branch 'master' into vec2_mat2 2020-02-23 13:10:36 +03:00
Recep Aslantas
4a7c153d2d tests: fix test for mul_rot 2020-02-23 11:19:30 +03:00
Recep Aslantas
7b0f62f1eb tests: add some tests for affine matrices 2020-02-22 10:54:47 +03:00
Recep Aslantas
0c8dc070d5 tests: tests for affine transforms (continue) 2020-02-22 10:29:16 +03:00
Recep Aslantas
0822d46cd9 tests: tests for remaining rotations 2020-02-22 00:58:04 +03:00
Recep Aslantas
3fca734c30 tests: remove unused variables 2020-02-22 00:48:41 +03:00
Recep Aslantas
5995269195 tests: add tests for some affine rotations 2020-02-21 17:52:50 +03:00
Recep Aslantas
6b32b5dc35 tests: add tests for affine scales 2020-02-21 16:57:09 +03:00
Recep Aslantas
a1f7afe055 Update test_affine.h 2020-02-21 15:56:15 +03:00
Recep Aslantas
81ae182972 tests: add tests for affine translations 2020-02-21 15:52:34 +03:00
Recep Aslantas
de85a4eb2b quat: add tests for quat_rotate_at[m] 2020-02-21 14:28:41 +03:00
Recep Aslantas
8ac1347f8a remove unused params from docs 2020-02-21 12:55:52 +03:00
Recep Aslantas
e7a0906bc2 quat: add tests for quat_rotate 2020-02-21 11:48:25 +03:00
Recep Aslantas
6aa8df8e9b quat: add tests for quat_rotatev 2020-02-21 10:51:53 +03:00
Recep Aslantas
2278eba93c quat: fix quat_for and quat_forp implementations 2020-02-20 23:37:35 +03:00
Recep Aslantas
5ee9bb88df add notes for versor/quaternion type to describe memory layout 2020-02-20 17:29:32 +03:00
Recep Aslantas
349dc274f4 add forward vector as macro (vec3, RH)
* this will be used for where Vec3.Forward is needed
2020-02-20 15:19:20 +03:00
Recep Aslantas
b9f9548b06 test: test for plane 2020-01-19 22:15:19 +03:00
Recep Aslantas
c630293c7d merge test sources into one C source 2020-01-19 22:12:25 +03:00
Recep Aslantas
406d09e085 make plane zero if norm is zero after normalization 2020-01-19 21:48:55 +03:00
Recep Aslantas
65de029acb now working on v0.6.3 2020-01-19 20:37:49 +03:00
Recep Aslantas
f8784ffe8a win: enable anonymous structs for Visual Studio 2015 and later 2020-01-17 23:55:35 +03:00
Recep Aslantas
cf8dc82783 fix tests on windows (msvc) 2020-01-17 23:29:36 +03:00
Recep Aslantas
9af0ebd142 win: fix glms_quat_imagn if use struct option is disabled 2020-01-17 23:27:20 +03:00
Recep Aslantas
82a195f26a now owrkin on v0.6.2 2020-01-17 23:26:40 +03:00
Recep Aslantas
6abe3f05ab tests: fix quat_look test 2020-01-17 15:17:02 +03:00
Recep Aslantas
f53fd45026 Update test_struct.c 2020-01-15 16:44:51 +03:00
Recep Aslantas
c67158ac59 Merge pull request #115 from recp/arm-fix
build fix for ARM NEON
2020-01-15 11:58:16 +03:00
Recep Aslantas
af7f8a5436 vec4: fix parameter name for NEON 2020-01-15 09:56:54 +03:00
Recep Aslantas
c3b5bb869a arm: fix type castings for ARM Neon 2020-01-15 09:56:19 +03:00
Recep Aslantas
d6c34d3330 Merge pull request #113 from jdolan/master
This PR addresses a typo in the naming of glms_rotate_x.
2020-01-06 14:11:21 +03:00
Jay Dolan
13a742f48c Merge pull request #1 from jdolan/issue/glms_rotate_x
Fix spelling error in name of glms_rotate_x.
2020-01-05 14:20:35 -05:00
Jay Dolan
0330be853c Fix spelling error in name of glms_rotate_x. 2020-01-05 14:20:06 -05:00
Recep Aslantas
5cb800bf29 Merge pull request #111 from hartenfels/autoconf-flags
Fix Automake Flags and Matrix Struct Initializers
2019-11-26 22:45:41 +03:00
Carsten Hartenfels
1d19948f30 Document struct API and anonymous struct handling 2019-11-24 17:28:01 -05:00
Carsten Hartenfels
d89c01b39f Intuit if we should use anonymous structs
Rather than making the user #define something explicitly, we can guess
based on the compiler type and C standard.
2019-11-24 16:02:12 -05:00
Carsten Hartenfels
b9aa14d25e Add a test for struct type initializers
To make sure that they all work properly and none of them trigger
warnings.
2019-11-24 16:02:12 -05:00
Carsten Hartenfels
8ad273475f Make GLMS_ initializers use the GLM_ versions
So that we don't write them twice. More consistent this way.
2019-11-24 16:02:03 -05:00
Carsten Hartenfels
c8211b3a62 Re-order struct type contents array-first
So that initializers will prefer the array entry, rather than trying to
initialize the anonymous struct.
2019-11-24 16:01:55 -05:00
Carsten Hartenfels
11dae5126b Add braces around matrix struct intializers
They're missing and trigger warnings in the tests.
2019-11-24 13:32:35 -05:00
Carsten Hartenfels
390a5035a8 Use gnu11 instead of gnu99 to get rid of warnings
CGLM uses anonymous structs, which is a C11 feature. When trying to
build the tests in C99 mode, you get warnings to that effect. Switching
to C11 fixes this.
2019-11-24 13:32:35 -05:00
Carsten Hartenfels
267348af03 Build tests with the same flags as the library
In particular, with the same warning flags. That means it now warns
about a few things during compilation that the following commits are
gonna fix.
2019-11-24 13:32:35 -05:00
Carsten Hartenfels
f9abf2a7df Don't add default autoconf flags to build
By default, it adds something like `-O2 -g` to the cflags. That
conflicts with the flags in Makefile.am, which specifies -O3. This
commit removes the default flags so we only get what we actually
specify.
2019-11-24 13:32:35 -05:00
Recep Aslantas
f0ffef7820 Merge pull request #110 from hartenfels/vec2s
Add a vec2s struct type for consistency
2019-11-24 17:18:50 +03:00
Carsten Hartenfels
4b9b7aeb20 Add a vec2s struct type for consistency
There's a vec2 type, so there should probably be a struct version of it
too. Even if no functions use it right now, if a library user (like me)
needs a 2-element vector, they don't need to roll their own.
2019-11-23 14:37:48 -05:00
Recep Aslantas
1a74361dfb Merge pull request #109 from hartenfels/prototypes
Change `()` Prototypes to `(void)`
2019-11-23 19:18:52 +03:00
Carsten Hartenfels
c83f25343f Error out on invalid empty prototypes
This way, a function prototype like `glms_mat3_identity()` will not
compile, instead you have to change it to the proper
`glms_mat3_identity(void)`.
2019-11-23 10:10:27 -05:00
Carsten Hartenfels
f3ea5b4f3e Change empty prototypes to (void)
Because () means an arbitrary number of arguments in C, which is not
intended here.
2019-11-23 10:10:17 -05:00
Recep Aslantas
9987e1374b build: remove duplicate entry in makefile
close #108
2019-11-17 10:22:01 +03:00
Recep Aslantas
464b2178ce Update README.md 2019-11-08 17:14:24 +03:00
Recep Aslantas
c253769fcd Update applesimd.h 2019-11-07 22:43:47 +03:00
Recep Aslantas
b893c79086 Update Makefile.am 2019-11-07 22:41:41 +03:00
Recep Aslantas
2336256808 Helpers for apple's simd library (#107)
* helper to convert cglm matrix to Apple's simd type
2019-11-07 22:32:15 +03:00
onagurna
52df54e306 fix typo in README (#106) 2019-10-21 23:46:23 +03:00
Recep Aslantas
381e66349a win,test: fix test build for windows and suppress warnings 2019-10-14 19:08:34 +03:00
Recep Aslantas
7cdeada701 tests: add test for glm_quat_look 2019-09-27 17:53:51 +03:00
Recep Aslantas
841257a208 tests: add test for quat_slerp 2019-09-26 19:57:00 +03:00
Recep Aslantas
212cf3b22d Update test_quat.h 2019-09-26 19:29:45 +03:00
Recep Aslantas
ca9b8ceac3 tests: add some tests for quat 2019-09-25 14:03:58 +03:00
Recep Aslantas
5b0e161502 tests: add some tests for quat 2019-09-25 13:47:26 +03:00
Recep Aslantas
fb23d1998e tests: add more tests for quat 2019-09-25 12:43:01 +03:00
Recep Aslantas
b2084fbacf tests: add some tests for quat 2019-09-25 07:42:29 +03:00
Recep Aslantas
2ea9308361 quat: fix glmc_quat_normalize() 2019-09-25 07:41:29 +03:00
Recep Aslantas
56cbacd9f6 tests: add missing test for vec4 2019-09-24 21:45:43 +03:00
Recep Aslantas
1700187f65 tests: add more tests for vec4 2019-09-24 19:10:44 +03:00
Recep Aslantas
36024367bc tests: add more tests for vec4 2019-09-24 17:02:47 +03:00
Recep Aslantas
dcf5b5c1c4 vec: fix min/max for compiled vec3 2019-09-24 17:01:56 +03:00
Recep Aslantas
ce09e543ef tests: add some tests for vec4 2019-09-24 16:33:42 +03:00
Recep Aslantas
f2073b2277 tests: add more tests for vec3 2019-09-23 22:46:45 +03:00
Recep Aslantas
7c10840a85 tests: add more tests for vec3 2019-09-23 22:39:53 +03:00
Recep Aslantas
37c2650b0a tests: add more tests for vec3 2019-09-23 12:03:06 +03:00
Recep Aslantas
3a48e4cd84 tests: add more tests for vec3 2019-09-22 23:32:57 +03:00
Recep Aslantas
378e26140e tests: add more tests for vec3 2019-09-22 23:25:54 +03:00
Recep Aslantas
7b25cbb9cb vec: fix min/max for compiled vec3 2019-09-22 23:25:33 +03:00
Recep Aslantas
bffe103c37 tests: add more tests for vec3 (rotations) 2019-09-22 22:27:28 +03:00
Recep Aslantas
51ffe09589 tests: use test_eq insteaf og glm_eq 2019-09-22 22:27:05 +03:00
Recep Aslantas
d7b37ba245 tests: add some test for project/unproject 2019-09-22 10:52:02 +03:00
Recep Aslantas
d0671b3e7a tests: add missing test for mat4 2019-09-21 14:01:20 +03:00
Recep Aslantas
e98311259c tests: fix some tests for vec3 2019-09-20 22:45:07 +03:00
Recep Aslantas
37cf6b3206 tests: add more tests for vec3 2019-09-20 22:30:32 +03:00
Recep Aslantas
a062f002a0 add codecov badge 2019-09-20 21:16:25 +03:00
Recep Aslantas
9c57d4b247 tests: add more tests for vec3 2019-09-20 14:12:57 +03:00
Recep Aslantas
9fe5efb410 tests: add more tests for vec3 2019-09-19 16:50:22 +03:00
Recep Aslantas
495afb8a3d Update test_vec3.h 2019-09-19 16:16:41 +03:00
Recep Aslantas
ba694f4aec tests: add some tests for vec3 2019-09-19 16:12:27 +03:00
Recep Aslantas
8ac767fd2c tests: fix mat3, mat4 tests 2019-09-19 00:27:26 +03:00
Recep Aslantas
e5fd735e62 Update .travis.yml 2019-09-19 00:09:56 +03:00
Recep Aslantas
7797ee7b06 Update .travis.yml 2019-09-19 00:02:38 +03:00
Recep Aslantas
78f38db480 tests: add missing tests for mat3 2019-09-18 23:33:41 +03:00
Recep Aslantas
79087a9813 mat4: add zero for call 2019-09-18 23:33:10 +03:00
Recep Aslantas
a1283282ef tests: update test design to test both call and inline versions 2019-09-18 17:07:40 +03:00
Recep Aslantas
0377b99f80 mat4: add zero for call 2019-09-18 17:07:15 +03:00
Recep Aslantas
971d753392 tests: add some missing tests for mat4 2019-09-17 18:26:45 +03:00
Recep Aslantas
033d0b0fed tests, win: add visual studio test project files 2019-09-16 10:17:55 +03:00
Recep Aslantas
39dc61af54 tests: add a few test for mat4 2019-09-15 19:33:41 +03:00
Recep Aslantas
f4f9d85caa tests: add more tests for mat4 2019-09-15 15:09:52 +03:00
Recep Aslantas
92f196965e Update .gitignore 2019-09-14 16:22:28 +03:00
Recep Aslantas
fbcbccbf01 Update cglm.podspec 2019-09-14 16:20:33 +03:00
Recep Aslantas
cf41151534 Update troubleshooting.rst 2019-09-14 16:18:45 +03:00
Recep Aslantas
3af861b61e Update README.md 2019-09-14 16:01:43 +03:00
Recep Aslantas
0ed88cfda8 test: fix running test on windows (msvc) 2019-09-14 12:46:04 +03:00
Recep Aslantas
551ed1bd20 tests: improve ASSERTIFY 2019-09-14 11:57:35 +03:00
Recep Aslantas
a328317c70 Merge branch 'master' of https://github.com/recp/cglm 2019-09-13 09:42:48 +03:00
Recep Aslantas
5aa047efdf tests: run tests on windows 2019-09-13 09:40:18 +03:00
Recep Aslantas
32e5784564 test: improve runner output and add assert helper for inline functions 2019-09-12 23:54:24 +03:00
Recep Aslantas
80c2b3712d tests: print elapsed time to run a test 2019-09-12 17:10:31 +03:00
Recep Aslantas
176cc28510 now working on v0.6.1 2019-09-12 07:11:49 +03:00
Recep Aslantas
712cbee580 remove cmocka from submodules and update docs 2019-09-12 07:10:37 +03:00
Recep Aslantas
981fd5ee44 Delete build-deps.sh 2019-09-12 07:01:49 +03:00
Recep Aslantas
092da3e189 Update README.md 2019-09-12 07:01:09 +03:00
Recep Aslantas
9ab9e95ce5 Custom Built-in Unit Test Suite (#105)
* tests: new built-in test runner

* tests: update tests for new builtin test api

* tests: print test suite logs

* tests: remove cmocka from build files

* tests: colorize test suite log and remove redundant prints
2019-09-12 06:56:44 +03:00
Recep Aslantas
b46a4ccee5 Merge branch 'vec2_mat2' of https://github.com/recp/cglm into vec2_mat2 2019-09-01 17:12:12 +03:00
Recep Aslantas
5da864f345 Merge branch 'master' into vec2_mat2 2019-09-01 17:10:28 +03:00
Luigi Castelli
27cc9c3351 vec: some useful functions (#103)
These functions are added:
- abs(): absolute value
- fract(): fractional part
- norm_one(): L1 norm
- norm_inf(): infinity norm
- hadd(): horizontal add
- hmax(): horizontal max
2019-09-01 00:30:15 +03:00
Recep Aslantas
3640e402da mat2 struct version 2019-08-31 14:36:57 +03:00
Recep Aslantas
d86f5df776 vec: call version for vec2 2019-08-30 22:56:20 +03:00
Recep Aslantas
cb54a8b8c5 vec2: rotate vec2 by angle 2019-08-30 22:00:20 +03:00
Recep Aslantas
8cb6fa792c Merge branch 'master' into vec2_mat2 2019-08-30 21:34:23 +03:00
Recep Aslantas
6af1f5af04 Update ccpp.yml 2019-08-30 14:58:47 +03:00
Recep Aslantas
62f4685f86 Update ccpp.yml 2019-08-30 14:55:19 +03:00
Recep Aslantas
03fda193a5 vec: update docs for norm 2019-08-30 14:47:26 +03:00
Recep Aslantas
cfaf01afaa Update ccpp.yml 2019-08-27 20:01:54 +03:00
Recep Aslantas
a450ab2d9c Update ccpp.yml 2019-08-27 20:00:01 +03:00
Luigi Castelli
1d804781de swapped argument order in glmm_store3() (#102)
close https://github.com/recp/cglm/issues/101
2019-08-26 16:37:44 +03:00
Luigi Castelli
144624962a added glm_vec_fill() (#100)
* alternative name for _broadcast(): _fill()
2019-08-26 09:19:26 +03:00
Luigi Castelli
4639f3184a glm_lerpc(), glm_step(), glm_smoothstep(), glm_smoothinterp() (#98)
* lerp, step, smoothstep

* glm_lerp() and friends are no longer clamped, use glm_lerpc() and friends
* mix() function as wrapper of lerp()
* no there are clamp and raw version of lerp functions
2019-08-25 22:17:36 +03:00
Luigi Castelli
43b36f1dc1 squared distance with SIMD support (#96)
squared distance for vec4
2019-08-23 10:32:54 +03:00
Recep Aslantas
ef89cd7236 Merge branch 'master' into vec2_mat2 2019-08-22 15:16:35 +03:00
Luigi Castelli
d03d4b8df5 new name for euler sequence (#94)
* new name for angle sequence
2019-08-21 22:52:01 +03:00
Recep Aslantas
e294fc744b Merge pull request #92 from fmegally/patch-2
Update README.md
2019-07-28 08:52:56 +03:00
Recep Aslantas
90a7aba1bd Merge pull request #91 from fmegally/patch-1
Update README.md
2019-07-28 08:52:32 +03:00
Fady Megally
02fdea941c Update README.md
grammar corrections. multiple linse
2019-07-27 13:54:27 -04:00
Fady Megally
c87499d234 Update README.md
Grammar error correction (line 29)
2019-07-26 16:27:20 -04:00
Recep Aslantas
ec553106f8 Merge branch 'master' of https://github.com/recp/cglm 2019-07-17 17:26:34 +03:00
Recep Aslantas
5bf5ceeb40 win: remove optional DLLMain entry point 2019-07-17 17:26:14 +03:00
Recep Aslantas
cb1d0ef6b5 win: remove optional DLLMain entry point 2019-07-17 17:18:50 +03:00
Recep Aslantas
cc75dc7f34 Merge pull request #90 from hartenfels/pkg-config
Add pkg-config Support + Autotools Fixes
2019-06-23 18:51:48 +03:00
Carsten Hartenfels
a651827012 Make things work for ancient pkg-config versions
Travis CI uses a really, really old pkg-config apparently, which doesn't
have the PKG_INSTALLDIR macro. In that case, we have to emulate it
manually.
2019-06-23 15:12:21 +02:00
Carsten Hartenfels
caba5b3c7c Document pkg-config usage and prefix pitfalls 2019-06-23 14:04:34 +02:00
Carsten Hartenfels
b231645131 Capitalize Makefiles, sometimes matters on Linux
Lowercased Makefiles don't get picked up by the .gitignore for example,
which always looks odd after configuring. This commit just puts a
capital 'M' in front, like it's common.
2019-06-23 13:48:02 +02:00
Carsten Hartenfels
99cff9e74e Add pkg-config support 2019-06-23 13:47:09 +02:00
Carsten Hartenfels
bbb52f352c Add missing struct headers to makefile.am 2019-06-23 13:24:06 +02:00
Recep Aslantas
a4c7c5e1ba implement call version for mat2 2019-06-21 23:17:08 +03:00
Recep Aslantas
44f36559c3 Update cglm.vcxproj 2019-06-21 14:15:42 +03:00
Recep Aslantas
4a9eb8d630 win: import struct headers to visual studio solution/project 2019-06-21 14:03:29 +03:00
Recep Aslantas
2827fbfa79 mat2, vec2: add missing functions 2019-06-20 22:51:51 +03:00
Recep Aslantas
ad823d9681 mat2: implement some mat2 func
* also implement as SSE
2019-06-19 23:35:38 +03:00
Recep Aslantas
24de86c1a4 Merge pull request #24 from recp/swizzle
swizzle support
2019-06-06 13:23:56 +03:00
Recep Aslantas
2025b35757 struct: struct vesion of swizzle funcs 2019-06-06 13:18:31 +03:00
Recep Aslantas
1fdd459733 add tests for vector swizzling, rename vec to vec3 2019-06-06 13:12:17 +03:00
Recep Aslantas
f0be6eb448 Merge branch 'master' into swizzle 2019-06-06 12:58:55 +03:00
Recep Aslantas
047ed259ae vec2: distance implementation 2019-06-04 19:03:31 +03:00
Recep Aslantas
3797c55154 fix test build, supress warnings, update header guards for struct api 2019-06-03 12:54:27 +03:00
Recep Aslantas
817da18f3a build: add struct api to makefile 2019-06-03 12:33:07 +03:00
Recep Aslantas
099239e3f5 rename cglms.h to struct.h 2019-06-03 12:29:36 +03:00
Recep Aslantas
9a73d969a7 struct: euler api as structs 2019-06-03 12:24:18 +03:00
Recep Aslantas
290f54bad4 struct: quaternion api as structs 2019-06-03 12:12:50 +03:00
Recep Aslantas
b9de553f23 quat: fix glm_quat_axis axis parameter type 2019-06-03 12:01:14 +03:00
Recep Aslantas
2b1126a2fc code style 2019-06-03 09:47:52 +03:00
Recep Aslantas
b22170794a struct: camera api as structs 2019-06-03 09:39:11 +03:00
Recep Aslantas
7485674106 Merge pull request #89 from hartenfels/master
Make Building With Prefix Work
2019-06-01 19:15:48 +03:00
Carsten Hartenfels
f7b45776e9 Find post-build.sh even when not building in .
You can make configure build in a different directory than the current
one when you give it a `--prefix` option. When doing that, the current
directy will be the build directory, not the source directory. This
breaks running `./post-build.sh`.

This commit fixes it by replacing the invocation with something that
takes into account `$VPATH` which properly references the source
directory. The `post-build.sh` still works properly because it
references the current directory to do its thing, which will (correctly)
be the build directory.
2019-06-01 14:14:58 +02:00
Recep Aslantas
12a7298474 Update README.md 2019-05-31 22:31:10 +03:00
Recep Aslantas
4e1872c3ac Update README.md 2019-05-31 22:30:39 +03:00
Recep Aslantas
5a66515631 Create FUNDING.yml 2019-05-27 09:34:29 +03:00
Recep Aslantas
56339b9caa Merge pull request #80 from acoto87/cglm-structs
cglm structs
2019-05-25 09:19:15 +03:00
Recep Aslantas
8affe9878f Merge branch 'master' into cglm-structs 2019-05-25 09:13:47 +03:00
Recep Aslantas
f26601bfa7 now working on v0.6.0 2019-05-25 09:12:08 +03:00
acoto87
d322a0ba8f Replace directly assignment with glm_vec{3,4}_copy functions 2019-05-22 16:24:11 -05:00
acoto87
ba2031d977 - Rename structs folder to struct
- Include files in `cglms.h`
- Fix style issues (tabs to spaces, open brace without newline)
2019-05-21 16:45:34 -05:00
acoto87
fd3b0634d2 Change for function that output multiple values
- Now the functions that output mutliple values, such as glms_decompose_rs and glms_decompose receive pointers.
- Added missing comments to struct/vec3 and struct/vec4 files.
2019-05-20 17:11:10 -05:00
acoto87
1d1bf8e91a - Change the approach implementation of several functions
- Added `glms_vec4_pack` and `glms_vec4_unpack` to pack and unpack arrays of `vec4s`.
- Added `glms_vec3_pack` and `glms_vec3_unpack` to pack and unpack arrays of `vec3s`.
- Fixes in functions that accumulates in one parameter
-
2019-05-16 17:03:55 -05:00
Alejandro Coto Gutiérrez
f108bb4c71 Merge branch 'master' into cglm-structs 2019-05-08 10:10:10 -05:00
Recep Aslantas
2adb4c5593 use CGLM_ALIGN_MAT on mat4 typedef 2019-05-08 09:18:11 +03:00
Recep Aslantas
6fa5173cfd now working on v0.5.5 2019-05-08 09:18:05 +03:00
acoto87
bc1969ab75 - Changes in mat3s and mat4s types.
- Added `ivec3s` type
- Struct implementation of: affine.h, box.h, color.h, curve.h, frutum.h, io.h, plane.h, project.h
- Deleted `glms_mat3_transpose_to` and `glms_mat4_transpose_to`
- Bug fixes in mat4.h
2019-05-07 16:16:00 -05:00
acoto87
3ff902de9c add mat3 and mat4 implementation 2019-05-03 22:48:13 -05:00
acoto87
892a7c7dce - add mat3, mat4, sphere.h 2019-04-30 22:08:17 -05:00
Alejandro Coto Gutiérrez
f04078dc33 Merge branch 'master' into cglm-structs 2019-04-30 14:58:02 -05:00
Recep Aslantas
63e60f46f3 Merge pull request #88 from yushli/master
Update quat.h
2019-04-30 10:20:26 +03:00
Recep Aslantas
f28260e20b Merge branch 'master' into master 2019-04-30 10:16:55 +03:00
yushli
d232ab7865 Update quat.h
fix typo
2019-04-30 14:47:20 +08:00
Recep Aslantas
e3b52100e3 Merge pull request #87 from recp/revert-86-const
Revert "mark readonly parameters as const"
2019-04-30 09:40:30 +03:00
Recep Aslantas
bb8ff25752 Revert "mark readonly parameters as const" 2019-04-30 08:19:07 +03:00
Recep Aslantas
98244da67f Merge pull request #86 from recp/const
mark readonly parameters as const
2019-04-29 17:58:51 +03:00
Recep Aslantas
14f06a262f Merge branch 'master' into const 2019-04-28 21:55:23 +03:00
Recep Aslantas
392565f920 mark readonly parameters as const (continue) 2019-04-28 21:48:19 +03:00
Recep Aslantas
120ae9ae99 buil: fix linking cmocka 2019-04-28 19:43:58 +03:00
Recep Aslantas
a5f1ed32af build: don't link libcmocka if not exists 2019-04-28 19:24:09 +03:00
Recep Aslantas
010e887946 build: don't link libcmocka if not exists 2019-04-28 19:21:13 +03:00
Recep Aslantas
6e501ef1f6 build: don't link libcmocka if not exists 2019-04-28 19:15:55 +03:00
Recep Aslantas
6ed275734b mark readonly parameters as const 2019-04-28 12:15:43 +03:00
Recep Aslantas
85ca81ce79 Merge pull request #84 from haxpor/fix_82
Resolve vec4 : glm_vec4_distance() to satisfy compiling on armv7
2019-04-27 10:09:44 +03:00
Recep Aslantas
e909c8268d Merge branch 'master' into fix_82 2019-04-27 09:37:08 +03:00
Recep Aslantas
73e6b65da0 test: fix comparing floats in bezier tests 2019-04-27 09:36:15 +03:00
Recep Aslantas
ecbe36df6b Merge branch 'master' into fix_82 2019-04-21 00:24:52 +03:00
Recep Aslantas
d85b5234a9 ci: print test logs after failure 2019-04-21 00:19:17 +03:00
Wasin Thonkaew
5b80e0e3c2 test cases for glm_vec4_distance 2019-04-19 03:04:00 +08:00
Wasin Thonkaew
461a4009ba refactor vec4 : glm_vec4_distance for SSE/SSE2
According to suggestion by recp at
https://github.com/recp/cglm/issues/82#issuecomment-483051704.
2019-04-19 02:07:57 +08:00
Wasin Thonkaew
8f2f2c5572 Fix to use armv7 compatible function for glm_vec4_distance
Before it used armv8 only function thus it leads to build failed for
Android with target of armv7 i.e. armeabi-v7a. This fixed that issue.
2019-04-19 01:47:50 +08:00
acoto87
1aa54dc110 - separating struct types into types-struct.h
- vec3s implementation
- fix style issues
2019-04-08 21:06:01 -05:00
Alejandro Coto Gutiérrez
1de8aeb940 Merge branch 'master' into cglm-structs 2019-04-08 19:17:52 -05:00
acoto87
c25469829a Initial implementation of struct type vec4s 2019-04-03 22:25:49 -06:00
Recep Aslantas
81a74ba225 move 'stdbool.h' to common header, add missing common.h header to public headers 2019-03-31 18:58:20 +03:00
Recep Aslantas
6c0c5167b0 docs: fix some parameter docs 2019-03-31 18:53:31 +03:00
Recep Aslantas
0729fd40a4 implement vec2 2019-03-31 18:50:52 +03:00
Alejandro Coto Gutiérrez
4c5451994f Include stddef.h to ensure size_t and other dependent types (#79) 2019-03-29 08:54:09 +03:00
acoto87
674e05213a - Add struct types to types.h.
- Add structs/vec4.h file.
2019-03-28 23:41:19 -06:00
acoto87
f848e4451a Include stddef.h to ensure size_t and other dependent types 2019-03-28 20:56:37 -06:00
Wasin Thonkaew
73226bd2fd Fulfill #76 (#77)
* Fulfill #76
2019-03-20 09:32:31 +03:00
Recep Aslantas
8fa21a1837 docs: use sphinx_rtd_theme theme dor documentation 2019-03-17 09:33:38 +03:00
Recep Aslantas
ee1937f28d now working on v0.5.4 2019-03-17 09:29:36 +03:00
Recep Aslantas
b4efcefe7f drop glm__memcpy, glm__memset and glm__memzero
* implement mat3_zero and mat4_zero functions
* copy matrix items manually in ucopy functions
2019-02-13 10:14:53 +03:00
Recep Aslantas
0d2e5a996a docs: add SSE3 and SSE4 dot product options 2019-02-13 10:13:06 +03:00
Recep Aslantas
2b1eece9ac mat3: add rmc for mat3 2019-02-13 10:12:49 +03:00
Recep Aslantas
c8b8f4f6f0 now working on v0.5.3 2019-02-13 10:00:57 +03:00
Recep Aslantas
1a34ffcf4b Merge pull request #72 from recp/simd-update
SIMD update (NEON, SSE3, SSE4) + Features
2019-02-03 17:18:54 +03:00
Recep Aslantas
af088a1059 Merge branch 'master' into simd-update 2019-02-02 15:58:57 +03:00
Recep Aslantas
18f06743ed build: make automake build slient (less-verbose) 2019-02-02 15:54:09 +03:00
Recep Aslantas
60cfc87009 remove bezier_solve for now 2019-02-02 15:30:05 +03:00
Recep Aslantas
4e5879497e update docs 2019-02-02 15:29:48 +03:00
Recep Aslantas
7848dda1dd curve: cubic hermite intrpolation 2019-01-29 22:17:44 +03:00
Recep Aslantas
1e121a4855 mat4: fix rmc multiplication 2019-01-29 22:11:04 +03:00
Recep Aslantas
0f223db7d3 Merge pull request #74 from ccworld1000/patch-1
Update cglm.podspec
2019-01-29 14:48:46 +03:00
CC
a4e2c39c1d Update cglm.podspec
update pod version
2019-01-29 16:54:02 +08:00
Recep Aslantas
c22231f296 curve: de casteljau implementation for solving cubic bezier 2019-01-28 15:52:42 +03:00
Recep Aslantas
730cb1e9f7 add bezier helpers 2019-01-28 15:32:24 +03:00
Recep Aslantas
b0e48a56ca test: rename test_rand_angle() to test_rand() 2019-01-28 15:31:03 +03:00
Recep Aslantas
11a6e4471e fix vec4_cubic function 2019-01-28 14:26:02 +03:00
Recep Aslantas
60cb4beb0a curve: helper for calculate result of SMC multiplication 2019-01-26 18:06:26 +03:00
Recep Aslantas
32ddf49756 mat4: helper for row * matrix * column 2019-01-26 18:05:05 +03:00
Recep Aslantas
807d5589b4 call: add missing end guard to call headers 2019-01-26 16:05:11 +03:00
Recep Aslantas
59b9e54879 vec4: helper to fill vec4 as [S^3, S^2, S, 1] 2019-01-26 15:54:10 +03:00
Recep Aslantas
fc7f958167 simd: remove re-load in SSE4 and SSE3 2019-01-25 21:56:17 +03:00
Recep Aslantas
31bb303c55 simd: organise SIMD-functions
* optimize dot product
2019-01-24 10:17:49 +03:00
Recep Aslantas
be6aa9a89a simd: optimize some mat4 operations with neon 2019-01-22 09:39:57 +03:00
Recep Aslantas
f65f1d491b simd: optimize vec4_distance with sse and neon 2019-01-22 09:23:51 +03:00
Recep Aslantas
f0c2a2984e simd, neon: add missing neon support for vec4 2019-01-22 09:05:38 +03:00
Recep Aslantas
b117f3bf80 neon: add neon support for most vec4 operations 2019-01-21 23:14:04 +03:00
Recep Aslantas
07e60bd098 cam: extend frustum's far distance helper (#71)
* this will help to implement zoom easily
2019-01-16 14:59:58 +03:00
Recep Aslantas
e3d3cd8ab8 now working on v0.5.2 2019-01-15 12:08:54 +03:00
Recep Aslantas
d17c99215d Update README.md 2018-12-26 09:57:52 +03:00
Recep Aslantas
dc6eb492c1 Merge pull request #70 from recp/vec3-mat3
remove builtin alignment from vec3 and mat3 types
2018-12-26 09:54:48 +03:00
Recep Aslantas
7219b02d23 remove alignment from vec3 and mat3 2018-12-25 10:08:36 +03:00
Recep Aslantas
21834b4ffb matrix: trace of matrix 2018-12-06 18:17:02 +03:00
Recep Aslantas
2ef9c23a6c vec: normalize cross product helper 2018-12-06 18:01:52 +03:00
Recep Aslantas
92605f845a test: fix comparing two float values in tests 2018-12-05 16:34:22 +03:00
Recep Aslantas
b23d65bef5 now working on v0.5.1 2018-12-05 16:32:13 +03:00
Recep Aslantas
2f632c6311 Update README.md 2018-12-02 21:35:50 +03:00
Recep Aslantas
b47d148b81 Update README.md 2018-12-02 21:35:31 +03:00
Recep Aslantas
a5bc2f710e Merge pull request #68 from recp/vec-update
major vector update
2018-12-02 21:24:14 +03:00
Recep Aslantas
6d6954b208 vec: minnadd and maxadd helpers 2018-11-29 10:50:24 +03:00
Recep Aslantas
4e08b7e335 vec: rename parameter names 2018-11-29 09:55:27 +03:00
Recep Aslantas
aee381d869 vec: deprecate glm_vec_inv and glm_vec4_inv
* because in the current implementation, `glm_vec3_negate` does same thing. It is duplicate.
2018-11-29 09:23:14 +03:00
Recep Aslantas
b4bf8f3537 vec: rename glm_vec_ to glm_vec3_ (continue)
* add missing functions to vec4
* update docs
2018-11-29 09:07:48 +03:00
Recep Aslantas
0b8c63a90e vec: rename glm_vec_ namespace to glm_vec3_ 2018-11-28 23:22:30 +03:00
Recep Aslantas
ef6134263e vec: improve angle between two vector
* because `acosf()` may return NaN if cosine/dot is out of range
2018-11-28 14:48:12 +03:00
Recep Aslantas
9af61d2101 vec: use _negate instead of _flipsign and _inv 2018-11-28 10:50:21 +03:00
Recep Aslantas
463099350a vec: use _negate instead of _flipsign and _inv
* negate is better and common name, flipsign is deprecated now.
2018-11-28 10:28:00 +03:00
Recep Aslantas
89f64f0794 Merge pull request #65 from sinisterchipmunk/fix-versor-alignment
fix versor alignment
2018-11-17 22:36:12 +03:00
Recep Aslantas
d794f17e51 Merge branch 'master' into fix-versor-alignment 2018-11-17 22:32:48 +03:00
Recep Aslantas
a7cdbcec2b now working on v0.5.0 2018-11-17 22:31:51 +03:00
Colin MacKenzie IV
20a2312351 fix versor alignment 2018-11-16 19:25:44 -05:00
Recep Aslantas
08479f38ce Merge pull request #63 from recp/avx
avx: replace binary constants (resolve https://github.com/recp/cglm/issues/62) with hex and fix glm_mul_avx
2018-10-19 09:52:32 +03:00
Recep Aslantas
dadae4b773 avx: fix glm_mul_avx
* use glm_mat4_mul_avx here. because it seems there is no big difference for now.
2018-10-19 09:40:40 +03:00
Recep Aslantas
20360f2296 avx: replace binary constants with hex 2018-10-12 09:05:42 +03:00
Recep Aslantas
aa2b0f2631 code style and minor optimization[s] 2018-09-22 00:10:50 +03:00
Recep Aslantas
280ac72fd8 Merge pull request #61 from hartenfels/master
Replace non-standard M_PI* constants
2018-09-21 23:39:10 +03:00
Recep Aslantas
7405d5e1d0 Update types.h 2018-09-21 23:33:42 +03:00
Carsten Hartenfels
eefafefbae Also add a load of other number constants
These are all missing from standard C, so we might as well define em.

See https://github.com/recp/cglm/pull/61#discussion_r219406859
2018-09-21 20:03:28 +02:00
Carsten Hartenfels
b9021978cb Replace the use of deprecated CGLM_PI* constants 2018-09-21 19:59:23 +02:00
Carsten Hartenfels
3fd12032e6 Clean up pi constants, deprecating the old names
GLM_PI* is now used for the double versions, GLM_PI*f for the float
versions. The CGLM_ prefixed versions are now deprecated, since that
prefix is kinda only used for constants.

See https://github.com/recp/cglm/pull/61#issuecomment-423069770
2018-09-21 07:29:54 +02:00
Carsten Hartenfels
59ee8c1fd2 Use even more precise definitions for pi constants
See https://github.com/recp/cglm/pull/61#issuecomment-422955122
2018-09-21 07:26:55 +02:00
Carsten Hartenfels
b00f2b9ccc Replace M_PI_4 in test_affine with CGLM_PI_4
As in the previous commit, because it's non-standard and depending on
your settings it can fail to compile because of it.
2018-09-19 20:46:37 +02:00
Carsten Hartenfels
d3c50147cb Replace non-standard M_PI* constants with literals
M_PI, M_PI_2 and M_PI_4 aren't part of the C standard. If you put your
gcc into strict standards mode, like `-std=c11`, you won't get these
constants and including cglm.h will fail.

This commit replaces those constants with their literal values. The cast
to a float remains, to keep exactly the same behavior as before.
2018-09-19 20:42:05 +02:00
Recep Aslantas
98da3daf82 identiy helper for arrays (matrix/quaternion)
this helpers makes all array elements identity
2018-09-12 12:44:11 +03:00
Recep Aslantas
2e1790ccf9 Merge pull request #59 from jonathanplatzer/avx
Fix alignment issue when using AVX
2018-07-19 11:38:55 +03:00
Jonathan Platzer
cc5f533fc9 Add macro for automatic alignment of matrices 2018-07-19 10:14:30 +02:00
Jonathan Platzer
2d63d7e0cd Fix alignment issue when using AVX 2018-07-18 12:03:38 +02:00
Recep Aslantas
3738499927 update doc for vec4_ucopy 2018-07-14 12:12:15 +03:00
Recep Aslantas
1d527dc2f0 unalignned version for vec4_copy 2018-07-14 12:03:42 +03:00
Recep Aslantas
43c4d05d4a new version for clamp: clamp to zero and one 2018-07-12 11:39:56 +03:00
Recep Aslantas
c5f5032fcc fix function params docs 2018-07-10 11:42:18 +03:00
Recep Aslantas
5d605ce372 avoid zero division for percent
* two value may be same, in this case now returns 1.
* to must be >= from and current <= to && current >= from
2018-07-10 10:54:31 +03:00
Recep Aslantas
c216c0cb7e add MIN and MAX macros
because we could use min/max for intergers too. it may not guarantee that MIN and MAX macros will always be defined by compiler
2018-06-26 15:27:53 +03:00
Recep Aslantas
eb8e0df6df update version 2018-06-21 10:54:53 +03:00
Recep Aslantas
1775bf7458 Merge pull request #57 from recp/anim
Animation Utils
2018-06-21 10:48:19 +03:00
Recep Aslantas
3adeac06f8 update build files 2018-06-21 10:07:51 +03:00
Recep Aslantas
669777eb37 additional utils 2018-06-18 17:55:25 +03:00
Recep Aslantas
02f6c67393 improve easing funcs 2018-06-15 08:55:59 +03:00
Recep Aslantas
564324f5d2 easing functions 2018-06-10 10:29:02 +03:00
Recep Aslantas
93e6c3c102 Merge pull request #56 from recp/sphere
aabb and sphere intersect functions
2018-06-09 18:43:54 +03:00
Recep Aslantas
857265b892 sphere point intersection 2018-06-09 18:21:29 +03:00
Recep Aslantas
fc14cedf89 update version 2018-06-09 18:10:54 +03:00
Recep Aslantas
7a80178357 improve quat_look 2018-06-09 18:10:44 +03:00
Recep Aslantas
720b617ee0 sphere and aabb 2018-05-30 23:42:22 +03:00
Recep Aslantas
3dc9070909 squared distance for vec3 2018-05-30 23:35:59 +03:00
Recep Aslantas
6b2b4b4f12 implement glm_aabb_sphere as GraphicsGems Solid Box - Solid Sphere test 2018-05-30 23:00:18 +03:00
Recep Aslantas
c8fc460ba1 add support for spheres 2018-05-29 23:29:09 +03:00
Recep Aslantas
5b3aabc103 aabb intersect functions
* AABB vs AABB
* AABB vs Point
* AABB vs Sphere
* AABB contains AABB
2018-05-29 23:19:39 +03:00
Recep Aslantas
af812e86eb add a note to clarify up vector restriction for glm_lookat and glm_look 2018-05-29 11:30:38 +03:00
Recep Aslantas
059bdfdd4b update docs 2018-05-27 11:54:05 +03:00
Recep Aslantas
ef0653640f update cocoapod version tag 2018-05-27 11:53:48 +03:00
Recep Aslantas
e5d61b3433 update mat4_mulv3 api to include translation 2018-05-27 11:46:27 +03:00
Recep Aslantas
73c073cf32 add missing call functions 2018-05-27 11:44:06 +03:00
Recep Aslantas
1362bef50f fix glm_translate_to 2018-05-23 23:13:41 +03:00
Recep Aslantas
7d783eeace align local variables on stack 2018-05-23 23:04:06 +03:00
Recep Aslantas
e12e79b1a5 improve scale_make 2018-05-23 22:11:44 +03:00
Recep Aslantas
6cd3d52dc5 improve translate_make 2018-05-23 22:08:12 +03:00
Recep Aslantas
fb2cac9816 aabb: center of AABB helper
* it is just wrapper of vec_center but it saves to access min and max values of AABB
2018-05-22 17:45:37 +03:00
Recep Aslantas
4e63325f55 aabb: add missing call versions 2018-05-22 17:44:36 +03:00
Recep Aslantas
96c3e604ff now working on v0.4.6 2018-05-22 17:43:46 +03:00
Recep Aslantas
077e304fc5 Merge pull request #42 from recp/optimizations
simd: optional shuffle configuration to save move instructions
2018-05-10 16:47:00 +03:00
Recep Aslantas
599524dacf docs: add new option to docs 2018-05-10 16:42:13 +03:00
Recep Aslantas
da5ad69863 simd: rename _mm_ extensions to glmm_ 2018-05-10 14:27:53 +03:00
Recep Aslantas
9fc2ead8ef Merge branch 'master' into optimizations 2018-05-10 13:59:10 +03:00
Recep Aslantas
48d33c16cb Merge pull request #53 from recp/simd
simd: Make alignment OPTIONAL
2018-05-10 13:57:31 +03:00
Recep Aslantas
464bd917d0 update readme 2018-05-10 12:21:33 +03:00
Recep Aslantas
c6d07bb6eb surround PI with parentheses + code style + update docs 2018-05-10 12:18:54 +03:00
Recep Aslantas
94b286f1f9 docs: add new alignment option to docs 2018-05-09 16:43:42 +03:00
Recep Aslantas
f774925e8a win, simd: make sure that CGLM_ALL_UNALIGNED is defined for older visual studios 2018-05-09 15:30:54 +03:00
Recep Aslantas
0e49e95161 win: update visual studio version for align requirement 2018-05-08 18:29:02 +03:00
Recep Aslantas
b277357800 update gitignore 2018-05-08 18:28:31 +03:00
Recep Aslantas
835cec2ccb drop alignment requirement if CGLM_ALL_UNALIGNED defined
* bring alignment back for visual studio 2017
2018-05-08 16:26:33 +03:00
Recep Aslantas
5dbbd0826d simd: replace glm_simd_ with glmm_
* now glmm_ is used as global simd namescape
2018-05-08 15:55:36 +03:00
Recep Aslantas
56f0bb0928 simd, avx: make alignment optional for load/store operations 2018-05-08 15:35:17 +03:00
Recep Aslantas
568001d26a simd, sse2: make alignment optional for store operations 2018-05-08 15:31:09 +03:00
Recep Aslantas
252bf925fc simd, sse2: make alignment optional for load operations 2018-05-08 15:25:23 +03:00
Recep Aslantas
0f339c5c03 fix header dependencies 2018-05-07 21:12:29 +03:00
Recep Aslantas
a9d56f2dae docs: fix typos 2018-05-04 00:50:56 +03:00
Recep Aslantas
dd60496ffc Merge pull request #49 from Yatima1460/master
replace _WIN32 with _MSC_VER
2018-04-30 19:08:59 +03:00
Federico Santamorena
7c0e9e99c6 _WIN32 to _MSC_VER 2018-04-30 17:17:06 +02:00
Federico Santamorena
064209c917 replaced _WIN32 with _MSC_VER 2018-04-30 17:13:16 +02:00
Recep Aslantas
94d6036c38 suppress warnings for Mingw 2018-04-30 11:09:42 +03:00
Recep Aslantas
6c01eff056 now working on v0.4.5 2018-04-30 10:59:40 +03:00
Recep Aslantas
ada69a7c43 fix cocoapods validation errors 2018-04-22 10:14:17 +03:00
Recep Aslantas
cef97fca3e add cocoapods spec 2018-04-22 01:03:17 +03:00
Recep Aslantas
498a33fac5 fix public header's includes 2018-04-21 22:36:25 +03:00
Recep Aslantas
3c7a729729 build: remove making symbolic link for libtoolize 2018-04-20 15:19:06 +03:00
Recep Aslantas
a6a37995e9 build: update automake sources 2018-04-18 23:02:15 +03:00
Recep Aslantas
6202179c23 update version 2018-04-18 22:30:20 +03:00
Recep Aslantas
22b699174c build: improve calling libtoolize 2018-04-18 21:47:53 +03:00
Recep Aslantas
016c0a71a6 Merge pull request #46 from recp/affine
affine transform update
2018-04-18 15:25:40 +03:00
Recep Aslantas
e28cf1d3f6 remove unused variable 2018-04-18 15:23:07 +03:00
Recep Aslantas
63966ee5c0 quat: use the new "glm_mul_rot" for quaternion
* this should be faster than mat4_mul
2018-04-18 15:16:24 +03:00
Recep Aslantas
a723ecdb7e add troubleshooting to docs 2018-04-18 15:11:06 +03:00
Recep Aslantas
065f93ab3c update docs, drop scale1 2018-04-18 14:30:44 +03:00
Recep Aslantas
4dbcd28fdb use mul_rot for rotations to make thrm faster 2018-04-18 14:12:56 +03:00
Recep Aslantas
be0e3fc9f2 new matrix multiplication helper for rotation matrices 2018-04-18 14:05:09 +03:00
Recep Aslantas
d648f5772d affine: drop rotate_ndc functions 2018-04-18 10:57:35 +03:00
Recep Aslantas
f163fcd043 simd: load vec3 helpers for sse/sse2 2018-04-18 00:00:47 +03:00
Recep Aslantas
27ab6a7dd0 update docs, add clarifications for affine transforms 2018-04-17 15:42:24 +03:00
Recep Aslantas
33e951fe2e implement rotate_at for quat and provide make version 2018-04-17 12:17:04 +03:00
Recep Aslantas
c63c6c90ac implement rotate_at 2018-04-17 11:12:18 +03:00
Recep Aslantas
a2792178db add missing call funcs for affine transforms 2018-04-17 11:07:57 +03:00
Recep Aslantas
cefd5fb53d test: add some tests for affine transforms 2018-04-17 10:33:52 +03:00
Recep Aslantas
821c79572f test: add some tests for mat3 2018-04-15 20:47:38 +03:00
Recep Aslantas
f0a27d0ce2 now working on v0.4.2 2018-04-15 20:46:46 +03:00
Recep Aslantas
007ae62e06 update docs version 2018-04-15 13:10:07 +03:00
Recep Aslantas
826ddf0f5b improve normalize vectors 2018-04-15 12:46:29 +03:00
Recep Aslantas
b09b5f260b vec: fix rotate vector using mat4 and mat3 rotation matrices 2018-04-15 12:44:50 +03:00
Recep Aslantas
59aacee968 optimize clamp for vec4 2018-04-14 12:49:37 +03:00
Recep Aslantas
429aff087f optimize min and max for vec4 2018-04-14 11:35:28 +03:00
Recep Aslantas
ca9f61dd74 Merge pull request #44 from recp/vector
new vector functions and optimizations
2018-04-14 09:19:51 +03:00
Recep Aslantas
d6395d4fb8 vec: optimize rotate vector using matrix
* add mat3 version
2018-04-13 22:33:32 +03:00
Recep Aslantas
7f7007574b vec: implement muladd's scalar version 2018-04-13 22:30:44 +03:00
Recep Aslantas
13345f06c1 fix vec4 scalar ops 2018-04-13 15:50:05 +03:00
Recep Aslantas
725fac75d0 now working on v0.4.1 2018-04-13 15:47:45 +03:00
Recep Aslantas
c05f58a169 vec: add addadd, subadd and muladd helpers 2018-04-13 15:46:43 +03:00
Recep Aslantas
d841f8809d vec: add some new functions for vector
* _mul: multiply two vector (replacement for _mulv)
* _div: div two vector
* _divs: div vector with scalar
* adds: add scalar to each components of vec
* subs: sub scalar from each components of vec
2018-04-13 15:12:56 +03:00
Recep Aslantas
af5a2627b4 fix scale_as for zero length vector
* return zero if vector length is zero
2018-04-13 11:57:34 +03:00
Recep Aslantas
25fc3d0284 vec: add one and zero helpers for vectors 2018-04-13 11:57:14 +03:00
Recep Aslantas
c489955b00 add simd norm helper 2018-04-13 11:39:14 +03:00
Recep Aslantas
79f8b1ebf8 vec4: optimize vec4 norm and norm2 2018-04-13 11:18:42 +03:00
Recep Aslantas
0eb37da8bb vec4: optimize vec4 normalize with SIMD 2018-04-13 11:01:07 +03:00
Recep Aslantas
44728c536b ci: update travis ci 2018-04-12 15:52:06 +03:00
Recep Aslantas
c8ed8acbed Update README.md 2018-04-12 14:47:14 +03:00
Recep Aslantas
cfd3600107 simd: optional shuffle configuration to save move instructions 2018-04-04 22:42:21 +03:00
Recep Aslantas
090f940f50 swizzle support 2018-01-20 18:38:26 +03:00
265 changed files with 37395 additions and 3067 deletions

1
.gitattributes vendored Normal file
View File

@@ -0,0 +1 @@
*.h linguist-language=C

8
.github/FUNDING.yml vendored Normal file
View File

@@ -0,0 +1,8 @@
# These are supported funding model platforms
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: # Replace with a single Patreon username
open_collective: cglm
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
custom: # Replace with a single custom sponsorship URL

20
.gitignore vendored
View File

@@ -51,7 +51,6 @@ cscope.*
test/*.trs
test/test_*
*.log
test-*
test/.libs/*
test/tests
cglm_arm/*
@@ -61,3 +60,22 @@ docs/build/*
win/cglm_test_*
* copy.*
*.o
*.obj
*codeanalysis.*.xml
*codeanalysis.xml
*.lib
*.tlog
win/x64
win/x85
win/Debug
cglm-test-ios*
/cglm.pc
test-driver
Default-568h@2x.png
build/
conftest.dir/*
confdefs.h
*.xcuserdatad
.idea
cmake-build-debug
*.o.tmp

3
.gitmodules vendored
View File

@@ -1,3 +0,0 @@
[submodule "test/lib/cmocka"]
path = test/lib/cmocka
url = git://git.cryptomilk.org/projects/cmocka.git

View File

@@ -4,6 +4,12 @@ os:
- linux
- osx
arch:
- amd64
- ppc64le
- s390x
- arm64
sudo: required
dist: trusty
@@ -37,10 +43,9 @@ branches:
- master
script:
- sh ./build-deps.sh
- sh ./autogen.sh
- if [[ "$CC" == "gcc" && "$CODE_COVERAGE" == "ON" ]]; then
./configure CFLAGS="-ftest-coverage -fprofile-arcs";
./configure CFLAGS="-ftest-coverage -fprofile-arcs -coverage";
else
./configure;
fi
@@ -49,11 +54,15 @@ script:
after_success:
- if [[ "$CC" == "gcc" && "$CODE_COVERAGE" == "ON" ]]; then
pip install --user cpp-coveralls
pip install --user cpp-coveralls &&
coveralls
--build-root .
--exclude lib
--exclude test
--gcov-options '\-lp'
--verbose;
--verbose &&
bash <(curl -s https://codecov.io/bash);
fi
# after_failure:
# - cat ./test-suite.log

4
.vscode/settings.json vendored Normal file
View File

@@ -0,0 +1,4 @@
{
"C_Cpp.default.configurationProvider": "vector-of-bool.cmake-tools",
"restructuredtext.confPath": "${workspaceFolder}/docs/source"
}

149
CMakeLists.txt Normal file
View File

@@ -0,0 +1,149 @@
cmake_minimum_required(VERSION 3.8.2)
project(cglm VERSION 0.8.4 LANGUAGES C)
set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED YES)
set(DEFAULT_BUILD_TYPE "Release")
set(CGLM_BUILD)
option(CGLM_SHARED "Shared build" ON)
option(CGLM_STATIC "Static build" OFF)
option(CGLM_USE_C99 "" OFF)
option(CGLM_USE_TEST "Enable Tests" OFF)
if(NOT CGLM_STATIC AND CGLM_SHARED)
set(CGLM_BUILD SHARED)
else(CGLM_STATIC)
set(CGLM_BUILD STATIC)
endif()
if(CGLM_USE_C99)
set(CMAKE_C_STANDARD 99)
endif()
if(MSVC)
add_definitions(-DNDEBUG -D_WINDOWS -D_USRDLL)
add_compile_options(/W3 /Ox /Gy /Oi /TC)
# Ref: https://skia.googlesource.com/third_party/sdl/+/refs/heads/master/CMakeLists.txt#225
# Make sure /RTC1 is disabled, otherwise it will use functions from the CRT
foreach(flag_var
CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO)
string(REGEX REPLACE "/RTC(su|[1su])" "" ${flag_var} "${${flag_var}}")
endforeach(flag_var)
else()
add_compile_options(-Wall -Werror -O3)
endif()
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
message(STATUS "Setting build type to '${DEFAULT_BUILD_TYPE}' as none was specified.")
set(CMAKE_BUILD_TYPE "${DEFAULT_BUILD_TYPE}" CACHE STRING "Choose the type of build." FORCE)
# Set the possible values of build type for cmake-gui
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo")
endif()
include(GNUInstallDirs)
set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)
# Target Start
add_library(${PROJECT_NAME}
${CGLM_BUILD}
src/euler.c
src/affine.c
src/io.c
src/quat.c
src/cam.c
src/vec2.c
src/vec3.c
src/vec4.c
src/mat2.c
src/mat3.c
src/mat4.c
src/plane.c
src/frustum.c
src/box.c
src/project.c
src/sphere.c
src/ease.c
src/curve.c
src/bezier.c
src/ray.c
src/affine2d.c
src/clipspace/persp_lh_zo.c
src/clipspace/persp_rh_zo.c
src/clipspace/persp_lh_no.c
src/clipspace/persp_rh_no.c
src/clipspace/ortho_lh_zo.c
src/clipspace/ortho_rh_zo.c
src/clipspace/ortho_lh_no.c
src/clipspace/ortho_rh_no.c
src/clipspace/view_lh_zo.c
src/clipspace/view_rh_zo.c
src/clipspace/view_lh_no.c
src/clipspace/view_rh_no.c
)
if(CGLM_SHARED)
add_definitions(-DCGLM_EXPORTS)
else()
target_compile_definitions(${PROJECT_NAME} PUBLIC -DCGLM_STATIC)
endif()
set_target_properties(${PROJECT_NAME} PROPERTIES
VERSION ${PROJECT_VERSION}
SOVERSION ${PROJECT_VERSION_MAJOR})
target_include_directories(${PROJECT_NAME}
PUBLIC
$<INSTALL_INTERFACE:include>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/src
)
# Target for header-only usage
add_library(${PROJECT_NAME}_headers INTERFACE)
target_include_directories(${PROJECT_NAME}_headers INTERFACE
${CMAKE_CURRENT_SOURCE_DIR}/include)
# Test Configuration
if(CGLM_USE_TEST)
include(CTest)
enable_testing()
add_subdirectory(test)
endif()
# Install
install(TARGETS ${PROJECT_NAME}
EXPORT ${PROJECT_NAME}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_LIBDIR})
install(DIRECTORY include/${PROJECT_NAME} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
PATTERN ".*" EXCLUDE)
# Config
export(TARGETS ${PROJECT_NAME}
NAMESPACE ${PROJECT_NAME}::
FILE "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
)
install(EXPORT ${PROJECT_NAME}
FILE "${PROJECT_NAME}Config.cmake"
NAMESPACE ${PROJECT_NAME}::
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME})
set(PACKAGE_NAME ${PROJECT_NAME})
set(prefix ${CMAKE_INSTALL_PREFIX})
set(exec_prefix ${CMAKE_INSTALL_PREFIX})
set(includedir "\${prefix}/${CMAKE_INSTALL_INCLUDEDIR}")
set(libdir "\${prefix}/${CMAKE_INSTALL_LIBDIR}")
configure_file(${CMAKE_CURRENT_LIST_DIR}/cglm.pc.in ${CMAKE_BINARY_DIR}/cglm.pc @ONLY)
install(FILES ${CMAKE_BINARY_DIR}/cglm.pc
DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)

View File

@@ -1,11 +1,11 @@
# CONTRIBUTING
Any contributions (code, documentation, ...) are welcome. This project uses [cmocka](http://cmocka.org) for testing, you may need to check their documentation
Any contributions (code, documentation, ...) are welcome.
# New Features
- This library may not accept all new features, it is better to create an issue and get approval before coding
- You must add test for every new feature
- The feature must be compiled in both UNIX/POSIX systems (e.g. macos, linux...) and Windows
- The feature must be compiled on both UNIX/POSIX systems (e.g. macos, linux...) and Windows
# Code Style
This library is written with C99, don't try to add C++ files (yes it can compiled into lib),

38
CREDITS
View File

@@ -1,7 +1,7 @@
This library [initially] used some [piece of] implementations
(may include codes) from these open source projects/resources:
1. Affine Transforms
1. Initial Affine Transforms
The original glm repo (g-truc), url: https://github.com/g-truc/glm
LICENSE[S]:
@@ -11,7 +11,7 @@ LICENSE[S]:
FULL LICENSE: https://github.com/g-truc/glm/blob/master/copying.txt
2. Quaternions
2. Initial Quaternions
Anton's OpenGL 4 Tutorials book source code:
LICENSE:
@@ -47,6 +47,38 @@ http://old.cescg.org/CESCG-2002/DSykoraJJelinek/
7. Quaternions
Initial mat4_quat is borrowed from Apple's simd library
8. Vector Rotation using Quaternion
https://gamedev.stackexchange.com/questions/28395/rotating-vector3-by-a-quaternion
9. Sphere AABB intersect
https://github.com/erich666/GraphicsGems/blob/master/gems/BoxSphere.c
10. Horizontal add
https://stackoverflow.com/questions/6996764/fastest-way-to-do-horizontal-float-vector-sum-on-x86
11. de casteljau implementation and comments
https://forums.khronos.org/showthread.php/10264-Animations-in-1-4-1-release-notes-revision-A/page2?highlight=bezier
https://forums.khronos.org/showthread.php/10644-Animation-Bezier-interpolation
https://forums.khronos.org/showthread.php/10387-2D-Tangents-in-Bezier-Splines?p=34164&viewfull=1#post34164
https://forums.khronos.org/showthread.php/10651-Animation-TCB-Spline-Interpolation-in-COLLADA?highlight=bezier
12. vec2 cross product
http://allenchou.net/2013/07/cross-product-of-2d-vectors/
13. Ray triangle intersect
MöllerTrumbore ray-triangle intersection algorithm, from "Fast, Minimum Storage Ray/Triangle Intersection"
Authors:
Thomas Möller (tompa@clarus.se)
Ben Trumbore (wbt@graphics.cornell.edu)
Link to paper: http://webserver2.tecgraf.puc-rio.br/~mgattass/cg/trbRR/Fast%20MinimumStorage%20RayTriangle%20Intersection.pdf
14. ARM NEON: Matrix Vector Multiplication
https://stackoverflow.com/a/57793352/2676533
16. ARM NEON Div
http://github.com/microsoft/DirectXMath
17. Pick Matrix
glu project -> project.c

250
Makefile.am Normal file
View File

@@ -0,0 +1,250 @@
#******************************************************************************
# Copyright (c), Recep Aslantas. *
# *
# MIT License (MIT), http://opensource.org/licenses/MIT *
# Full license can be found in the LICENSE file *
# *
#******************************************************************************
ACLOCAL_AMFLAGS = -I m4
AM_CFLAGS = -Wall \
-std=gnu11 \
-O3 \
-Wstrict-aliasing=2 \
-fstrict-aliasing \
-Werror=strict-prototypes
lib_LTLIBRARIES = libcglm.la
libcglm_la_LDFLAGS = -no-undefined -version-info 0:1:0
checkLDFLAGS = -L./.libs \
-lm \
-lcglm
checkCFLAGS = $(AM_CFLAGS) \
-std=gnu11 \
-O3 \
-DCGLM_DEFINE_PRINTS \
-I./include
check_PROGRAMS = test/tests
TESTS = $(check_PROGRAMS)
test_tests_LDFLAGS = $(checkLDFLAGS)
test_tests_CFLAGS = $(checkCFLAGS)
cglmdir=$(includedir)/cglm
cglm_HEADERS = include/cglm/version.h \
include/cglm/common.h \
include/cglm/types.h \
include/cglm/types-struct.h \
include/cglm/cglm.h \
include/cglm/call.h \
include/cglm/struct.h \
include/cglm/cam.h \
include/cglm/io.h \
include/cglm/mat4.h \
include/cglm/mat3.h \
include/cglm/mat2.h \
include/cglm/affine.h \
include/cglm/vec2.h \
include/cglm/vec2-ext.h \
include/cglm/vec3.h \
include/cglm/vec3-ext.h \
include/cglm/vec4.h \
include/cglm/vec4-ext.h \
include/cglm/euler.h \
include/cglm/util.h \
include/cglm/quat.h \
include/cglm/affine-mat.h \
include/cglm/plane.h \
include/cglm/frustum.h \
include/cglm/box.h \
include/cglm/color.h \
include/cglm/project.h \
include/cglm/sphere.h \
include/cglm/ease.h \
include/cglm/curve.h \
include/cglm/bezier.h \
include/cglm/applesimd.h \
include/cglm/ray.h \
include/cglm/affine2d.h
cglm_clipspacedir=$(includedir)/cglm/clipspace
cglm_clipspace_HEADERS = include/cglm/clipspace/persp.h \
include/cglm/clipspace/persp_lh_zo.h \
include/cglm/clipspace/persp_rh_zo.h \
include/cglm/clipspace/persp_lh_no.h \
include/cglm/clipspace/persp_rh_no.h \
include/cglm/clipspace/ortho_lh_zo.h \
include/cglm/clipspace/ortho_rh_zo.h \
include/cglm/clipspace/ortho_lh_no.h \
include/cglm/clipspace/ortho_rh_no.h \
include/cglm/clipspace/view_lh.h \
include/cglm/clipspace/view_rh.h \
include/cglm/clipspace/view_lh_zo.h \
include/cglm/clipspace/view_rh_zo.h \
include/cglm/clipspace/view_lh_no.h \
include/cglm/clipspace/view_rh_no.h \
include/cglm/clipspace/project_zo.h \
include/cglm/clipspace/project_no.h
cglm_calldir=$(includedir)/cglm/call
cglm_call_HEADERS = include/cglm/call/mat4.h \
include/cglm/call/mat3.h \
include/cglm/call/mat2.h \
include/cglm/call/vec2.h \
include/cglm/call/vec3.h \
include/cglm/call/vec4.h \
include/cglm/call/affine.h \
include/cglm/call/io.h \
include/cglm/call/cam.h \
include/cglm/call/quat.h \
include/cglm/call/euler.h \
include/cglm/call/plane.h \
include/cglm/call/frustum.h \
include/cglm/call/box.h \
include/cglm/call/project.h \
include/cglm/call/sphere.h \
include/cglm/call/ease.h \
include/cglm/call/curve.h \
include/cglm/call/bezier.h \
include/cglm/call/ray.h \
include/cglm/call/affine2d.h
cglm_call_clipspacedir=$(includedir)/cglm/call/clipspace
cglm_call_clipspace_HEADERS = include/cglm/call/clipspace/persp_lh_zo.h \
include/cglm/call/clipspace/persp_rh_zo.h \
include/cglm/call/clipspace/persp_lh_no.h \
include/cglm/call/clipspace/persp_rh_no.h \
include/cglm/call/clipspace/ortho_lh_zo.h \
include/cglm/call/clipspace/ortho_rh_zo.h \
include/cglm/call/clipspace/ortho_lh_no.h \
include/cglm/call/clipspace/ortho_rh_no.h \
include/cglm/call/clipspace/view_lh_zo.h \
include/cglm/call/clipspace/view_rh_zo.h \
include/cglm/call/clipspace/view_lh_no.h \
include/cglm/call/clipspace/view_rh_no.h \
include/cglm/call/clipspace/project_no.h \
include/cglm/call/clipspace/project_zo.h
cglm_simddir=$(includedir)/cglm/simd
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_sse2_HEADERS = include/cglm/simd/sse2/affine.h \
include/cglm/simd/sse2/mat4.h \
include/cglm/simd/sse2/mat3.h \
include/cglm/simd/sse2/mat2.h \
include/cglm/simd/sse2/quat.h
cglm_simd_avxdir=$(includedir)/cglm/simd/avx
cglm_simd_avx_HEADERS = include/cglm/simd/avx/mat4.h \
include/cglm/simd/avx/affine.h
cglm_simd_neondir=$(includedir)/cglm/simd/neon
cglm_simd_neon_HEADERS = include/cglm/simd/neon/mat4.h \
include/cglm/simd/neon/mat2.h \
include/cglm/simd/neon/affine.h \
include/cglm/simd/neon/quat.h
cglm_structdir=$(includedir)/cglm/struct
cglm_struct_HEADERS = include/cglm/struct/mat4.h \
include/cglm/struct/mat3.h \
include/cglm/struct/mat2.h \
include/cglm/struct/vec2.h \
include/cglm/struct/vec2-ext.h \
include/cglm/struct/vec3.h \
include/cglm/struct/vec3-ext.h \
include/cglm/struct/vec4.h \
include/cglm/struct/vec4-ext.h \
include/cglm/struct/affine.h \
include/cglm/struct/io.h \
include/cglm/struct/cam.h \
include/cglm/struct/quat.h \
include/cglm/struct/euler.h \
include/cglm/struct/plane.h \
include/cglm/struct/frustum.h \
include/cglm/struct/box.h \
include/cglm/struct/project.h \
include/cglm/struct/sphere.h \
include/cglm/struct/color.h \
include/cglm/struct/curve.h \
include/cglm/struct/affine2d.h
cglm_struct_clipspacedir=$(includedir)/cglm/struct/clipspace
cglm_struct_clipspace_HEADERS = include/cglm/struct/clipspace/persp_lh_zo.h \
include/cglm/struct/clipspace/persp_rh_zo.h \
include/cglm/struct/clipspace/persp_lh_no.h \
include/cglm/struct/clipspace/persp_rh_no.h \
include/cglm/struct/clipspace/ortho_lh_zo.h \
include/cglm/struct/clipspace/ortho_rh_zo.h \
include/cglm/struct/clipspace/ortho_lh_no.h \
include/cglm/struct/clipspace/ortho_rh_no.h \
include/cglm/struct/clipspace/view_lh_zo.h \
include/cglm/struct/clipspace/view_rh_zo.h \
include/cglm/struct/clipspace/view_lh_no.h \
include/cglm/struct/clipspace/view_rh_no.h
libcglm_la_SOURCES=\
src/euler.c \
src/affine.c \
src/io.c \
src/quat.c \
src/cam.c \
src/vec2.c \
src/vec3.c \
src/vec4.c \
src/mat2.c \
src/mat3.c \
src/mat4.c \
src/plane.c \
src/frustum.c \
src/box.c \
src/project.c \
src/sphere.c \
src/ease.c \
src/curve.c \
src/bezier.c \
src/ray.c \
src/affine2d.c \
src/clipspace/ortho_lh_no.c \
src/clipspace/ortho_lh_zo.c \
src/clipspace/ortho_rh_no.c \
src/clipspace/ortho_rh_zo.c \
src/clipspace/persp_lh_no.c \
src/clipspace/persp_lh_zo.c \
src/clipspace/persp_rh_no.c \
src/clipspace/persp_rh_zo.c \
src/clipspace/view_lh_no.c \
src/clipspace/view_lh_zo.c \
src/clipspace/view_rh_no.c \
src/clipspace/view_rh_zo.c \
src/clipspace/project_no.c \
src/clipspace/project_zo.c
test_tests_SOURCES=\
test/runner.c \
test/src/test_common.c \
test/src/tests.c \
test/src/test_cam.c \
test/src/test_cam_lh_zo.c \
test/src/test_cam_rh_zo.c \
test/src/test_cam_lh_no.c \
test/src/test_cam_rh_no.c \
test/src/test_clamp.c \
test/src/test_euler.c \
test/src/test_bezier.c \
test/src/test_struct.c
pkgconfig_DATA=cglm.pc
# When running configure with --prefix, $VPATH references
# the source directory that post-build.sh is in. When not
# using a prefix, $VPATH will be unset, so we need to fall
# back to using . to run the script.
#export VPATH
# all-local:
# sh $${VPATH:-.}/post-build.sh

44
Package.swift Normal file
View File

@@ -0,0 +1,44 @@
// swift-tools-version:5.2
import PackageDescription
let package = Package(
name: "cglm",
products: [
.library(name: "cglm", type: .static, targets: ["cglmHeader"]),
.library(name: "cglmc", targets: ["cglmCompiled"]),
],
dependencies: [],
targets: [
.target(
name: "cglmCompiled",
path: "./",
exclude: [
"./docs",
"./src/swift",
"./include",
"./test",
"./win",
],
sources: [
"./src",
],
publicHeadersPath: "./include"
),
.target(
name: "cglmHeader",
path: "./",
exclude: [
"./docs",
"./include",
"./test",
"./win",
],
sources: [
"./src/swift",
],
publicHeadersPath: "./include"
),
],
cLanguageStandard: .c11
)

329
README.md
View File

@@ -1,48 +1,93 @@
# 🎥 OpenGL Mathematics (glm) for `C`
[![Build Status](https://travis-ci.org/recp/cglm.svg?branch=master)](https://travis-ci.org/recp/cglm)
[![Build status](https://ci.appveyor.com/api/projects/status/av7l3gc0yhfex8y4/branch/master?svg=true)](https://ci.appveyor.com/project/recp/cglm/branch/master)
[![Documentation Status](https://readthedocs.org/projects/cglm/badge/?version=latest)](http://cglm.readthedocs.io/en/latest/?badge=latest)
[![Coverage Status](https://coveralls.io/repos/github/recp/cglm/badge.svg?branch=master)](https://coveralls.io/github/recp/cglm?branch=master)
[![Codacy Badge](https://api.codacy.com/project/badge/Grade/6a62b37d5f214f178ebef269dc4a6bf1)](https://www.codacy.com/app/recp/cglm?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=recp/cglm&amp;utm_campaign=Badge_Grade)
[![Backers on Open Collective](https://opencollective.com/cglm/backers/badge.svg)](#backers)
[![Sponsors on Open Collective](https://opencollective.com/cglm/sponsors/badge.svg)](#sponsors)
The original glm library is for C++ only (templates, namespaces, classes...), this library targeted to C99 but currently you can use it for C89 safely by language extensions e.g `__restrict`
<p align="center">
<img alt="" src="cglm.png" width="550" />
</p>
<br>
<p align="center">
<a href="https://travis-ci.com/recp/cglm">
<img src="https://travis-ci.com/recp/cglm.svg?branch=master"
alt="Build Status">
</a>
<a href="https://ci.appveyor.com/project/recp/cglm/branch/master">
<img src="https://ci.appveyor.com/api/projects/status/av7l3gc0yhfex8y4/branch/master?svg=true"
alt="Windows Build Status">
</a>
<a href="http://cglm.readthedocs.io/en/latest/?badge=latest">
<img src="https://readthedocs.org/projects/cglm/badge/?version=latest"
alt="Documentation Status">
</a>
<a href="https://www.codacy.com/app/recp/cglm?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=recp/cglm&amp;utm_campaign=Badge_Grade">
<img src="https://api.codacy.com/project/badge/Grade/6a62b37d5f214f178ebef269dc4a6bf1"
alt="Codacy Badge"/>
</a>
<a href="https://coveralls.io/github/recp/cglm?branch=master">
<img src="https://coveralls.io/repos/github/recp/cglm/badge.svg?branch=master"
alt="Coverage Status"/>
</a>
<a href="https://codecov.io/gh/recp/cglm">
<img src="https://codecov.io/gh/recp/cglm/branch/master/graph/badge.svg"
alt="Coverage Status"/>
</a>
<br /><br />
<a href="#sponsors">
<img src="https://opencollective.com/cglm/sponsors/badge.svg"
alt="Sponsors on Open Collective"/>
</a>
<a href="#backers">
<img src="https://opencollective.com/cglm/backers/badge.svg"
alt="Backers on Open Collective"/>
</a>
</p>
#### Documentation
<br>
Almost all functions (inline versions) and parameters are documented inside related headers. <br />
<p align="center">
Highly optimized 2D|3D math library, also known as <b>OpenGL Mathematics (glm) for `C`</b>. <b>cglm</b> provides lot of utils to help math operations to be fast and quick to write. It is community friendly, feel free to bring any issues, bugs you faced.
</p>
---
#### 📚 Documentation
Almost all functions (inline versions) and parameters are documented inside the corresponding headers. <br />
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
- make sure you have latest version and feel free to report bugs, troubles
- **[bugfix]** euler angles was implemented in reverse order (extrinsic) it was fixed, now they are intrinsic. Make sure that you have the latest version
- **[bugfix]** euler angles was implemented in reverse order (extrinsic) it was fixed, now they are intrinsic. Make sure that
you have the latest version
- **[major change]** by starting v0.4.0, quaternions are stored as [x, y, z, w], it was [w, x, y, z] in v0.3.5 and earlier versions
- **[api rename]** by starting v0.4.5, **glm_simd** functions are renamed to **glmm_**
- **[new option]** by starting v0.4.5, you can disable alignment requirement, check options in docs.
- **[major change]** by starting v0.5.0, vec3 functions use **glm_vec3_** namespace, it was **glm_vec_** until v0.5.0
- **[major change]** by starting v0.5.1, built-in alignment is removed from **vec3** and **mat3** types
- **[major change]** by starting v0.7.3, inline print functions are disabled in release/production mode to eliminate print costs (see options in documentation). Print output also improved. You can disable colors if you need (see documentation)
- **[major change]** by starting v0.8.3, **cglm** supports alternative clipspace configuations e.g. Left Handed, Zero-to-One (_zo)... `CGLM_FORCE_DEPTH_ZERO_TO_ONE` and `CGLM_FORCE_LEFT_HANDED` is provided to control clipspace. You should be able to use **cglm** with Vulkan, DirectX and Metal now... see https://cglm.readthedocs.io/en/latest/opt.html#clipspace-option-s
#### Note for C++ developers:
If you don't aware about original GLM library yet, you may also want to look at:
#### 📌 Note for C++ developers:
If you are not aware of the original GLM library yet, you may also want to look at:
https://github.com/g-truc/glm
#### Note for new comers (Important):
#### 📌 Note for new comers (Important):
- `vec4` and `mat4` variables must be aligned. (There will be unaligned versions later)
- **in** and **[in, out]** parameters must be initialized (please). But **[out]** parameters not, initializing out param is also redundant
- All functions are inline if you don't want to use pre-compiled versions with glmc_ prefix, you can ignore build process. Just incliude headers.
- All functions are inline if you don't want to use pre-compiled versions with glmc_ prefix, you can ignore build process. Just include headers.
- if your debugger takes you to cglm headers then make sure you are not trying to copy vec4 to vec3 or alig issues...
- Welcome!
#### Note for experienced developers:
#### 📌 Note for experienced developers:
- Since I'm testing this library in my projects, sometimes bugs occurs; finding that bug[s] and making improvements would be more easy with multiple developer/contributor and their projects or knowledge. Consider to make some tests if you suspect something is wrong and any feedbacks, contributions and bug reports are always welcome.
#### Allocations?
#### 📌 Allocations?
`cglm` doesn't alloc any memory on heap. So it doesn't provide any allocator. You should alloc memory for **out** parameters too if you pass pointer of memory location. Don't forget that **vec4** (also quat/**versor**) and **mat4** must be aligned (16-bytes), because *cglm* uses SIMD instructions to optimize most operations if available.
#### Returning vector or matrix... ?
Since almost all types are arrays and **C** doesn't allow returning arrays, so **cglm** doesn't support this feature. In the future *cglm* may use **struct** for some types for this purpose.
#### 📌 Returning vector or matrix... ?
#### Other APIs like Vulkan, Metal, Dx?
Currently *cglm* uses default clip space configuration (-1, 1) for camera functions (perspective, extract corners...), in the future other clip space configurations will be supported
**cglm** supports both *ARRAY API* and *STRUCT API*, so you can return structs if you utilize struct api (`glms_`).
<hr/>
@@ -61,11 +106,14 @@ Currently *cglm* uses default clip space configuration (-1, 1) for camera functi
</tbody>
</table>
## Features
## 🚀 Features
- **scalar** and **simd** (sse, avx, neon...) optimizations
- option to use different clipspaces e.g. Left Handed, Zero-to-One... (currrently right handed negative-one is default)
- array api and struct api, you can use arrays or structs.
- general purpose matrix operations (mat4, mat3)
- chain matrix multiplication (square only)
- general purpose vector operations (cross, dot, rotate, proj, angle...)
- affine transforms
- affine transformations
- matrix decomposition (extract rotation, scaling factor)
- optimized affine transform matrices (mul, rigid-body inverse)
- camera (lookat)
@@ -75,14 +123,21 @@ Currently *cglm* uses default clip space configuration (-1, 1) for camera functi
- extract euler angles
- inline or pre-compiled function call
- frustum (extract view frustum planes, corners...)
- bounding box (AABB in Frustum (culling), crop, merge...)
- bounding box (AABB in Frustum (culling), crop, merge...)
- bounding sphere
- project, unproject
- easing functions
- curves
- curve interpolation helpers (S*M*C, deCasteljau...)
- helpers to convert cglm types to Apple's simd library to pass cglm types to Metal GL without packing them on both sides
- ray intersection helpers
- and others...
<hr />
You have two option to call a function/operation: inline or library call (link)
Almost all functions are marked inline (always_inline) so compiler probably will inline.
To call pre-compiled version, just use `glmc_` (c stands for 'call') instead of `glm_`.
You have two options to call a function/operation: inline or library call (link)
Almost all functions are marked inline (always_inline) so compiler will probably inline.
To call pre-compiled versions, just use `glmc_` (c stands for 'call') instead of `glm_`.
```C
#include <cglm/cglm.h> /* for inline */
@@ -108,7 +163,7 @@ You can pass matrices and vectors as array to functions rather than get address.
glm_translate(m, (vec3){1.0f, 0.0f, 0.0f});
```
Library contains general purpose mat4 mul and inverse functions but also contains some special form (optimized) of these functions for affine transform matrices. If you want to multiply two affine transform matrices you can use glm_mul instead of glm_mat4_mul and glm_inv_tr (ROT + TR) instead glm_mat4_inv
Library contains general purpose mat4 mul and inverse functions, and also contains some special forms (optimized) of these functions for affine transformations' matrices. If you want to multiply two affine transformation matrices you can use glm_mul instead of glm_mat4_mul and glm_inv_tr (ROT + TR) instead glm_mat4_inv
```C
/* multiplication */
mat4 modelMat;
@@ -118,59 +173,161 @@ glm_mul(T, R, modelMat);
glm_inv_tr(modelMat);
```
## Contributors
### Struct API
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>
The struct API works as follows, note the `s` suffix on types, the `glms_` prefix on functions and the `GLMS_` prefix on constants:
```C
#include <cglm/struct.h>
## Backers
mat4s mat = GLMS_MAT4_IDENTITY_INIT;
mat4s inv = glms_mat4_inv(mat);
```
Thank you to all our backers! 🙏 [[Become a backer](https://opencollective.com/cglm#backer)]
Struct functions generally take their parameters as *values* and *return* their results, rather than taking pointers and writing to out parameters. That means your parameters can usually be `const`, if you're into that.
<a href="https://opencollective.com/cglm#backers" target="_blank"><img src="https://opencollective.com/cglm/backers.svg?width=890"></a>
The types used are actually unions that allow access to the same data multiple ways. One of those ways involves anonymous structures, available since C11. MSVC also supports it for earlier C versions out of the box and GCC/Clang do if you enable `-fms-extensions`. To explicitly enable these anonymous structures, `#define CGLM_USE_ANONYMOUS_STRUCT` to `1`, to disable them, to `0`. For backward compatibility, you can also `#define CGLM_NO_ANONYMOUS_STRUCT` (value is irrelevant) to disable them. If you don't specify explicitly, cglm will do a best guess based on your compiler and the C version you're using.
## 🔨 Build
## Sponsors
### CMake (All platforms)
```bash
$ mkdir build
$ cd build
$ cmake .. # [Optional] -DCGLM_SHARED=ON
$ make
$ sudo make install # [Optional]
```
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)]
##### Cmake options with Defaults:
<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>
```CMake
option(CGLM_SHARED "Shared build" ON)
option(CGLM_STATIC "Static build" OFF)
option(CGLM_USE_C99 "" OFF) # C11
option(CGLM_USE_TEST "Enable Tests" OFF) # for make check - make test
```
#### Use as header-only library with your CMake project
This requires no building or installation of cglm.
## License
MIT. check the LICENSE file
* Example:
## Build
``` cmake
cmake_minimum_required(VERSION 3.8.2)
project(<Your Project Name>)
add_executable(${PROJECT_NAME} src/main.c)
target_link_libraries(${LIBRARY_NAME} PRIVATE
cglm_headers)
add_subdirectory(external/cglm/ EXCLUDE_FROM_ALL)
```
#### Use with your CMake project
* Example:
```cmake
cmake_minimum_required(VERSION 3.8.2)
project(<Your Project Name>)
add_executable(${PROJECT_NAME} src/main.c)
target_link_libraries(${LIBRARY_NAME} PRIVATE
cglm)
add_subdirectory(external/cglm/)
# or you can use find_package to configure cglm
```
### Meson (All platforms)
```bash
$ meson build # [Optional] --default-library=static
$ cd build
$ ninja
$ sudo ninja install # [Optional]
```
##### Meson options with Defaults:
```meson
c_std=c11
buildtype=release
default_library=shared
enable_tests=false # to run tests: ninja test
```
#### Use with your Meson project
* Example:
```meson
# Clone cglm or create a cglm.wrap under <source_root>/subprojects
project('name', 'c')
cglm_dep = dependency('cglm', fallback : 'cglm', 'cglm_dep')
executable('exe', 'src/main.c', dependencies : cglm_dep)
```
### Swift (Swift Package Manager)
Currently only default build options are supported. Add **cglm** dependency to your project:
```swift
...
Package(
...
dependencies: [
...
.package(url: "https://github.com/recp/cglm", .branch("master")),
]
...
)
```
Now add **cgml** as a dependency to your target. Product choices are:
- **cglm** for inlined version of the library which can be linked only statically
- **cglmc** for a compiled version of the library with no linking limitation
```swift
...
.target(
...
dependencies: [
...
.product(name: "cglm", package: "cglm"),
]
...
)
...
```
### Unix (Autotools)
```bash
$ sh ./build-deps.sh # run only once (dependencies) [Optional].
$ # You can pass this step if you don't want to run `make check` for tests.
$ # cglm uses cmocka for tests and it may reqiure cmake for building it
$
$ sh autogen.sh
$ ./configure
$ make
$ make check # [Optional] (if you run `sh ./build-deps.sh`)
$ [sudo] make install
$ make check # [Optional]
$ [sudo] make install # [Optional]
```
This will also install pkg-config files so you can use
`pkg-config --cflags cglm` and `pkg-config --libs cglm` to retrieve compiler
and linker flags.
The files will be installed into the given prefix (usually `/usr/local` by
default on Linux), but your pkg-config may not be configured to actually check
there. You can figure out where it's looking by running `pkg-config --variable
pc_path pkg-config` and change the path the files are installed to via
`./configure --with-pkgconfigdir=/your/path`. Alternatively, you can add the
prefix path to your `PKG_CONFIG_PATH` environment variable.
### Windows (MSBuild)
Windows related build files, project files are located in `win` folder,
Windows related build file and project files are located in `win` folder,
make sure you are inside `cglm/win` folder.
Code Analysis are enabled, it may take awhile to build
Code Analysis is enabled, so it may take awhile to build.
```Powershell
$ cd win
@@ -181,6 +338,10 @@ if `msbuild` won't work (because of multi version VS) then try to build with `de
$ devenv cglm.sln /Build Release
```
#### Running Tests on Windows
You can see test project in same visual studio solution file. It is enough to run that project to run tests.
### Building Docs
First you need install Sphinx: http://www.sphinx-doc.org/en/master/usage/installation.html
then:
@@ -191,21 +352,21 @@ $ sphinx-build source build
it will compile docs into build folder, you can run index.html inside that function.
## How to use
If you want to use inline versions of funcstions then; include main header
If you want to use the inline versions of functions, then include the main header
```C
#include <cglm/cglm.h>
```
the header will include all headers. Then call func you want e.g. rotate vector by axis:
the header will include all headers. Then call the func you want e.g. rotate vector by axis:
```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:
```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:
```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
@@ -216,7 +377,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:
```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:
@@ -226,7 +387,7 @@ glm_mat4_mul(m1, m2, m1);
/* or */
glm_mat4_mul(m1, m1, m1);
```
the first two parameter are **[in]** and the last one is **[out]** parameter. After multiplied *m1* and *m2* the result is stored in *m1*. This is why we send *m1* twice. You may store result in different matrix, this just an example.
the first two parameter are **[in]** and the last one is **[out]** parameter. After multiplying *m1* and *m2*, the result is stored in *m1*. This is why we send *m1* twice. You may store the result in a different matrix, this is just an example.
### Example: Computing MVP matrix
@@ -266,7 +427,7 @@ Option 2: Cast matrix to pointer type (also valid for multiple dimensional array
glUniformMatrix4fv(location, 1, GL_FALSE, (float *)matrix);
```
You can pass same way to another APIs e.g. Vulkan, DX...
You can pass matrices the same way to other APIs e.g. Vulkan, DX...
## Notes
@@ -279,4 +440,36 @@ You can pass same way to another APIs e.g. Vulkan, DX...
- [x] Add version info
- [ ] Unaligned operations (e.g. `glm_umat4_mul`)
- [x] Extra documentation
- [ ] ARM Neon Arch (In Progress)
- [x] ARM Neon Arch
## Contributors
This project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)].
<a href="https://github.com/recp/cglm/graphs/contributors"><img src="https://opencollective.com/cglm/contributors.svg?width=890&button=false" /></a>
## 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

View File

@@ -8,17 +8,14 @@
cd $(dirname "$0")
if [ "$(uname)" = "Darwin" ]; then
libtoolBin=$(which glibtoolize)
libtoolBinDir=$(dirname "${libtoolBin}")
if [ ! -f "${libtoolBinDir}/libtoolize" ]; then
ln -s $libtoolBin "${libtoolBinDir}/libtoolize"
fi
fi
autoheader
libtoolize
if [ "$(uname)" = "Darwin" ]; then
glibtoolize
else
libtoolize
fi
aclocal -I m4
autoconf
automake --add-missing --copy

View File

@@ -1,34 +0,0 @@
#! /bin/sh
#
# Copyright (c), Recep Aslantas.
#
# MIT License (MIT), http://opensource.org/licenses/MIT
# Full license can be found in the LICENSE file
#
# check if deps are pulled
git submodule update --init --recursive
# fix glibtoolize
cd $(dirname "$0")
if [ "$(uname)" = "Darwin" ]; then
libtoolBin=$(which glibtoolize)
libtoolBinDir=$(dirname "${libtoolBin}")
if [ ! -f "${libtoolBinDir}/libtoolize" ]; then
ln -s $libtoolBin "${libtoolBinDir}/libtoolize"
fi
fi
# general deps: gcc make autoconf automake libtool cmake
# test - cmocka
cd ./test/lib/cmocka
rm -rf build
mkdir -p build
cd build
cmake -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Debug ..
make -j8
cd ../../../../

11
cglm.pc.in Normal file
View File

@@ -0,0 +1,11 @@
prefix=@prefix@
exec_prefix=@exec_prefix@
libdir=@libdir@
includedir=@includedir@
Name: @PACKAGE_NAME@
Description: OpenGL Mathematics (glm) for C
URL: https://github.com/recp/cglm
Version: @PACKAGE_VERSION@
Cflags: -I${includedir}
Libs: -L${libdir} -lcglm @LIBS@

BIN
cglm.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 378 KiB

37
cglm.podspec Normal file
View File

@@ -0,0 +1,37 @@
Pod::Spec.new do |s|
# Description
s.name = "cglm"
s.version = "0.8.4"
s.summary = "📽 Highly Optimized Graphics Math (glm) for C"
s.description = <<-DESC
cglm is math library for graphics programming for C. See the documentation or README for all features.
DESC
s.documentation_url = "http://cglm.readthedocs.io"
# Home
s.homepage = "https://github.com/recp/cglm"
s.license = { :type => "MIT", :file => "LICENSE" }
s.author = { "Recep Aslantas" => "recp@acm.org" }
# Sources
s.source = { :git => "https://github.com/recp/cglm.git", :tag => "v#{s.version}" }
s.source_files = "src", "include/cglm/**/*.h"
s.public_header_files = "include", "include/cglm/**/*.h"
s.exclude_files = "src/win/*", "src/dllmain.c", "src/**/*.h"
s.preserve_paths = "include", "src"
s.header_mappings_dir = "include"
# Linking
s.library = "m"
# Configuration
s.pod_target_xcconfig = {
'CLANG_ENABLE_MODULES' => 'NO',
'CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES' => 'YES',
'CLANG_WARN_DOCUMENTATION_COMMENTS' => 'NO',
'GCC_C_LANGUAGE_STANDARD' => 'gnu11',
'GCC_PREPROCESSOR_DEFINITIONS' => '$(inherited) GLM_TESTS_NO_COLORFUL_OUTPUT'
}
end

View File

@@ -7,13 +7,30 @@
#*****************************************************************************
AC_PREREQ([2.69])
AC_INIT([cglm], [0.4.0], [info@recp.me])
AM_INIT_AUTOMAKE([-Wall -Werror foreign subdir-objects])
AC_INIT([cglm], [0.8.4], [info@recp.me])
AM_INIT_AUTOMAKE([-Wall -Werror foreign subdir-objects serial-tests])
# Don't use the default cflags (-O2 -g), we set ours manually in Makefile.am.
: ${CFLAGS=""}
AC_CONFIG_MACRO_DIR([m4])
AC_CONFIG_SRCDIR([src/])
AC_CONFIG_HEADERS([config.h])
# Dependencies for pkg-config.
PKG_PROG_PKG_CONFIG
# Ancient versions of pkg-config (such as the one used in Travis CI)
# don't have this macro, so we need to do it manually.
m4_ifdef([PKG_INSTALLDIR], [
PKG_INSTALLDIR
], [
AC_ARG_WITH([pkgconfigdir],
[AS_HELP_STRING([--with-pkgconfigdir],
[pkg-config installation directory ['${libdir}/pkgconfig']])],,
[with_pkgconfigdir=]'${libdir}/pkgconfig')
AC_SUBST([pkgconfigdir], [$with_pkgconfigdir])
])
# Checks for programs.
AC_PROG_CC
AM_PROG_CC_C_O
@@ -29,6 +46,7 @@ LT_INIT
# Checks for libraries.
AC_CHECK_LIB([m], [floor])
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
AC_SYS_LARGEFILE
# Checks for header files.
@@ -52,6 +70,6 @@ AC_TYPE_UINT8_T
# Checks for library functions.
AC_FUNC_ERROR_AT_LINE
AC_CONFIG_FILES([makefile])
AC_CONFIG_FILES([Makefile cglm.pc])
AC_OUTPUT

View File

@@ -1,6 +1,6 @@
.. default-domain:: C
affine transform matrix (specialized functions)
3D Affine Transform Matrix (specialized functions)
================================================================================
Header: cglm/affine-mat.h
@@ -33,6 +33,7 @@ Table of contents (click func go):
Functions:
1. :c:func:`glm_mul`
#. :c:func:`glm_mul_rot`
#. :c:func:`glm_inv_tr`
Functions documentation
@@ -59,6 +60,27 @@ Functions documentation
| *[in]* **m2** affine matrix 2
| *[out]* **dest** result matrix
.. c:function:: void glm_mul_rot(mat4 m1, mat4 m2, mat4 dest)
| this is similar to glm_mat4_mul but specialized to rotation matrix
Right Matrix format should be (left is free):
.. code-block:: text
R R R 0
R R R 0
R R R 0
0 0 0 1
this reduces some multiplications. It should be faster than mat4_mul.
if you are not sure about matrix format then DON'T use this! use mat4_mul
Parameters:
| *[in]* **m1** affine matrix 1
| *[in]* **m2** affine matrix 2
| *[out]* **dest** result matrix
.. c:function:: void glm_inv_tr(mat4 mat)
| inverse orthonormal rotation + translation matrix (ridig-body)

View File

@@ -1,10 +1,12 @@
.. default-domain:: C
affine transforms
3D Affine Transforms
================================================================================
Header: cglm/affine.h
Initialize Transform Matrices
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Functions with **_make** prefix expect you don't have a matrix and they create
a matrix for you. You don't need to pass identity matrix.
@@ -15,6 +17,109 @@ before sending to transfrom functions.
There are also functions to decompose transform matrix. These functions can't
decompose matrix after projected.
Rotation Center
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Rotating functions uses origin as rotation center (pivot/anchor point),
since scale factors are stored in rotation matrix, same may also true for scalling.
cglm provides some functions for rotating around at given point e.g.
**glm_rotate_at**, **glm_quat_rotate_at**. Use them or follow next section for algorihm ("Rotate or Scale around specific Point (Pivot Point / Anchor Point)").
Rotate or Scale around specific Point (Anchor Point)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
If you want to rotate model around arbibtrary point follow these steps:
1. Move model from pivot point to origin: **translate(-pivot.x, -pivot.y, -pivot.z)**
2. Apply rotation (or scaling maybe)
3. Move model back from origin to pivot (reverse of step-1): **translate(pivot.x, pivot.y, pivot.z)**
**glm_rotate_at**, **glm_quat_rotate_at** and their helper functions works that way.
The implementation would be:
.. code-block:: c
:linenos:
glm_translate(m, pivot);
glm_rotate(m, angle, axis);
glm_translate(m, pivotInv); /* pivotInv = -pivot */
.. _TransformsOrder:
Transforms Order
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
It is important to understand this part especially if you call transform
functions multiple times
`glm_translate`, `glm_rotate`, `glm_scale` and `glm_quat_rotate` and their
helpers functions works like this (cglm may provide reverse order too as alternative in the future):
.. code-block:: c
:linenos:
TransformMatrix = TransformMatrix * TraslateMatrix; // glm_translate()
TransformMatrix = TransformMatrix * RotateMatrix; // glm_rotate(), glm_quat_rotate()
TransformMatrix = TransformMatrix * ScaleMatrix; // glm_scale()
As you can see it is multipled as right matrix. For instance what will happen if you call `glm_translate` twice?
.. code-block:: c
:linenos:
glm_translate(transform, translate1); /* transform = transform * translate1 */
glm_translate(transform, translate2); /* transform = transform * translate2 */
glm_rotate(transform, angle, axis) /* transform = transform * rotation */
Now lets try to understand this:
1. You call translate using `translate1` and you expect it will be first transform
because you call it first, do you?
Result will be **`transform = transform * translate1`**
2. Then you call translate using `translate2` and you expect it will be second transform?
Result will be **`transform = transform * translate2`**. Now lets expand transform,
it was `transform * translate1` before second call.
Now it is **`transform = transform * translate1 * translate2`**, now do you understand what I say?
3. After last call transform will be:
**`transform = transform * translate1 * translate2 * rotation`**
The order will be; **rotation will be applied first**, then **translate2** then **translate1**
It is all about matrix multiplication order. It is similar to MVP matrix:
`MVP = Projection * View * Model`, model will be applied first, then view then projection.
**Confused?**
In the end the last function call applied first in shaders.
As alternative way, you can create transform matrices individually then combine manually,
but don't forget that `glm_translate`, `glm_rotate`, `glm_scale`... are optimized and should be faster (an smaller assembly output) than manual multiplication
.. code-block:: c
:linenos:
mat4 transform1, transform2, transform3, finalTransform;
glm_translate_make(transform1, translate1);
glm_translate_make(transform2, translate2);
glm_rotate_make(transform3, angle, axis);
/* first apply transform1, then transform2, thentransform3 */
glm_mat4_mulN((mat4 *[]){&transform3, &transform2, &transform1}, 3, finalTransform);
/* if you don't want to use mulN, same as above */
glm_mat4_mul(transform3, transform2, finalTransform);
glm_mat4_mul(finalTransform, transform1, finalTransform);
Now transform1 will be applied first, then transform2 then transform3
Table of contents (click to go):
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -29,15 +134,14 @@ Functions:
#. :c:func:`glm_scale_to`
#. :c:func:`glm_scale_make`
#. :c:func:`glm_scale`
#. :c:func:`glm_scale1`
#. :c:func:`glm_scale_uni`
#. :c:func:`glm_rotate_x`
#. :c:func:`glm_rotate_y`
#. :c:func:`glm_rotate_z`
#. :c:func:`glm_rotate_ndc_make`
#. :c:func:`glm_rotate_make`
#. :c:func:`glm_rotate_ndc`
#. :c:func:`glm_rotate`
#. :c:func:`glm_rotate_at`
#. :c:func:`glm_rotate_atm`
#. :c:func:`glm_decompose_scalev`
#. :c:func:`glm_uniscaled`
#. :c:func:`glm_decompose_rs`
@@ -122,10 +226,6 @@ Functions documentation
| *[in, out]* **m** affine transfrom
| *[in]* **v** scale vector [x, y, z]
.. c:function:: void glm_scale1(mat4 m, float s)
DEPRECATED! Use glm_scale_uni
.. c:function:: void glm_scale_uni(mat4 m, float s)
applies uniform scale to existing transform matrix v = [s, s, s]
@@ -165,16 +265,6 @@ Functions documentation
| *[in]* **angle** angle (radians)
| *[out]* **dest** rotated matrix
.. c:function:: void glm_rotate_ndc_make(mat4 m, float angle, vec3 axis_ndc)
creates NEW rotation matrix by angle and axis
this name may change in the future. axis must be is normalized
Parameters:
| *[out]* **m** affine transfrom
| *[in]* **angle** angle (radians)
| *[in]* **axis_ndc** normalized axis
.. c:function:: void glm_rotate_make(mat4 m, float angle, vec3 axis)
creates NEW rotation matrix by angle and axis,
@@ -185,16 +275,6 @@ Functions documentation
| *[in]* **axis** angle (radians)
| *[in]* **axis** axis
.. c:function:: void glm_rotate_ndc(mat4 m, float angle, vec3 axis_ndc)
rotate existing transform matrix around Z axis by angle and axis
this name may change in the future, axis must be normalized.
Parameters:
| *[out]* **m** affine transfrom
| *[in]* **angle** angle (radians)
| *[in]* **axis_ndc** normalized axis
.. c:function:: void glm_rotate(mat4 m, float angle, vec3 axis)
rotate existing transform matrix around Z axis by angle and axis
@@ -204,6 +284,29 @@ Functions documentation
| *[in]* **angle** angle (radians)
| *[in]* **axis** axis
.. c:function:: void glm_rotate_at(mat4 m, vec3 pivot, float angle, vec3 axis)
rotate existing transform around given axis by angle at given pivot point (rotation center)
Parameters:
| *[in, out]* **m** affine transfrom
| *[in]* **pivot** pivot, anchor point, rotation center
| *[in]* **angle** angle (radians)
| *[in]* **axis** axis
.. c:function:: void glm_rotate_atm(mat4 m, vec3 pivot, float angle, vec3 axis)
| creates NEW rotation matrix by angle and axis at given point
| this creates rotation matrix, it assumes you don't have a matrix
| this should work faster than glm_rotate_at because it reduces one glm_translate.
Parameters:
| *[in, out]* **m** affine transfrom
| *[in]* **pivot** pivot, anchor point, rotation center
| *[in]* **angle** angle (radians)
| *[in]* **axis** axis
.. c:function:: void glm_decompose_scalev(mat4 m, vec3 s)
decompose scale vector

140
docs/source/affine2d.rst Normal file
View File

@@ -0,0 +1,140 @@
.. default-domain:: C
2D Affine Transforms
================================================================================
Header: cglm/affine2d.h
2D Transforms uses `2d` suffix for naming. If there is no 2D suffix it is 3D function.
Initialize Transform Matrices
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Functions with **_make** prefix expect you don't have a matrix and they create
a matrix for you. You don't need to pass identity matrix.
But other functions expect you have a matrix and you want to transform them. If
you didn't have any existing matrix you have to initialize matrix to identity
before sending to transfrom functions.
Transforms Order
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
See :ref:`TransformsOrder` to read similar section.
Table of contents (click to go):
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Functions:
1. :c:func:`glm_translate2d`
#. :c:func:`glm_translate2d_to`
#. :c:func:`glm_translate2d_x`
#. :c:func:`glm_translate2d_y`
#. :c:func:`glm_translate2d_make`
#. :c:func:`glm_scale2d_to`
#. :c:func:`glm_scale2d_make`
#. :c:func:`glm_scale2d`
#. :c:func:`glm_scale2d_uni`
#. :c:func:`glm_rotate2d_make`
#. :c:func:`glm_rotate2d`
#. :c:func:`glm_rotate2d_to`
.. c:function:: void glm_translate2d(mat3 m, vec2 v)
translate existing 2d transform matrix by *v* vector and stores result in same matrix
Parameters:
| *[in, out]* **m** 2d affine transfrom
| *[in]* **v** translate vector [x, y]
.. c:function:: void glm_translate2d_to(mat3 m, vec2 v, mat3 dest)
translate existing 2d transform matrix by *v* vector and store result in dest
Parameters:
| *[in]* **m** 2d affine transfrom
| *[in]* **v** translate vector [x, y]
| *[out]* **dest** translated matrix
.. c:function:: void glm_translate2d_x(mat3 m, float x)
translate existing 2d transform matrix by x factor
Parameters:
| *[in, out]* **m** 2d affine transfrom
| *[in]* **x** x factor
.. c:function:: void glm_translate2d_y(mat3 m, float y)
translate existing 2d transform matrix by y factor
Parameters:
| *[in, out]* **m** 2d affine transfrom
| *[in]* **y** y factor
.. c:function:: void glm_translate2d_make(mat3 m, vec2 v)
creates NEW translate 2d transform matrix by *v* vector
Parameters:
| *[in, out]* **m** affine transfrom
| *[in]* **v** translate vector [x, y]
.. c:function:: void glm_scale2d_to(mat3 m, vec2 v, mat3 dest)
scale existing 2d transform matrix by *v* vector and store result in dest
Parameters:
| *[in]* **m** affine transfrom
| *[in]* **v** scale vector [x, y]
| *[out]* **dest** scaled matrix
.. c:function:: void glm_scale2d_make(mat3 m, vec2 v)
creates NEW 2d scale matrix by *v* vector
Parameters:
| *[in, out]* **m** affine transfrom
| *[in]* **v** scale vector [x, y]
.. c:function:: void glm_scale2d(mat3 m, vec2 v)
scales existing 2d transform matrix by *v* vector and stores result in same matrix
Parameters:
| *[in, out]* **m** affine transfrom
| *[in]* **v** translate vector [x, y]
.. c:function:: void glm_scale2d_uni(mat3 m, float s)
applies uniform scale to existing 2d transform matrix v = [s, s] and stores result in same matrix
Parameters:
| *[in, out]* **m** affine transfrom
| *[in]* **s** scale factor
.. c:function:: void glm_rotate2d_make(mat3 m, float angle)
creates NEW rotation matrix by angle around *Z* axis
Parameters:
| *[in, out]* **m** affine transfrom
| *[in]* **angle** angle (radians)
.. c:function:: void glm_rotate2d(mat3 m, float angle)
rotate existing 2d transform matrix around *Z* axis by angle and store result in same matrix
Parameters:
| *[in, out]* **m** affine transfrom
| *[in]* **angle** angle (radians)
.. c:function:: void glm_rotate2d_to(mat3 m, float angle, mat3 dest)
rotate existing 2d transform matrix around *Z* axis by angle and store result in dest
Parameters:
| *[in]* **m** affine transfrom
| *[in]* **angle** angle (radians)
| *[out]* **dest** rotated matrix

View File

@@ -5,14 +5,14 @@ Some functions may exist twice,
once for their namespace and once for global namespace
to make easier to write very common functions
For instance, in general we use :code:`glm_vec_dot` to get dot product
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`,
same for *_cross* and so on...
The original function stays where it is, the function in global namespace
of same name is just an alias, so there is no call version of those functions.
e.g there is no func like :code:`glmc_dot` because *glm_dot* is just alias for
:code:`glm_vec_dot`
:code:`glm_vec3_dot`
By including **cglm/cglm.h** header you will include all inline version
of functions. Since functions in this header[s] are inline you don't need to
@@ -28,6 +28,7 @@ Follow the :doc:`build` documentation for this
affine
affine-mat
affine2d
cam
frustum
box
@@ -35,13 +36,21 @@ Follow the :doc:`build` documentation for this
euler
mat4
mat3
mat2
vec3
vec3-ext
vec4
vec4-ext
vec2
vec2-ext
color
plane
project
util
io
call
sphere
curve
bezier
version
ray

89
docs/source/bezier.rst Normal file
View 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

View File

@@ -28,6 +28,11 @@ Functions:
#. :c:func:`glm_aabb_isvalid`
#. :c:func:`glm_aabb_size`
#. :c:func:`glm_aabb_radius`
#. :c:func:`glm_aabb_center`
#. :c:func:`glm_aabb_aabb`
#. :c:func:`glm_aabb_sphere`
#. :c:func:`glm_aabb_point`
#. :c:func:`glm_aabb_contains`
Functions documentation
~~~~~~~~~~~~~~~~~~~~~~~
@@ -131,3 +136,46 @@ Functions documentation
Parameters:
| *[in]* **box** bounding box
.. c:function:: void glm_aabb_center(vec3 box[2], vec3 dest)
| computes center point of AABB
Parameters:
| *[in]* **box** bounding box
| *[out]* **dest** center of bounding box
.. c:function:: bool glm_aabb_aabb(vec3 box[2], vec3 other[2])
| check if two AABB intersects
Parameters:
| *[in]* **box** bounding box
| *[out]* **other** other bounding box
.. c:function:: bool glm_aabb_sphere(vec3 box[2], vec4 s)
| check if AABB intersects with sphere
| https://github.com/erich666/GraphicsGems/blob/master/gems/BoxSphere.c
| Solid Box - Solid Sphere test.
Parameters:
| *[in]* **box** solid bounding box
| *[out]* **s** solid sphere
.. c:function:: bool glm_aabb_point(vec3 box[2], vec3 point)
| check if point is inside of AABB
Parameters:
| *[in]* **box** bounding box
| *[out]* **point** point
.. c:function:: bool glm_aabb_contains(vec3 box[2], vec3 other[2])
| check if AABB contains other AABB
Parameters:
| *[in]* **box** bounding box
| *[out]* **other** other bounding box

View File

@@ -1,23 +1,108 @@
Building cglm
Build cglm
================================
| **cglm** does not have external dependencies except for unit testing.
| When you pulled cglm repo with submodules all dependencies will be pulled too.
| `build-deps.sh` will pull all dependencies/submodules and build for you.
External dependencies:
* cmocka - for unit testing
| **cglm** does not have any external dependencies.
**NOTE:**
If you only need to inline versions, you don't need to build **cglm**, you don't need to link it to your program.
Just import cglm to your project as dependency / external lib by copy-paste then use it as usual
**Unix (Autotools):**
CMake (All platforms):
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code-block:: bash
:linenos:
$ sh ./build-deps.sh # run this only once (dependencies)
$ mkdir build
$ cd build
$ cmake .. # [Optional] -DCGLM_SHARED=ON
$ make
$ sudo make install # [Optional]
**make** will build cglm to **build** folder.
If you don't want to install **cglm** to your system's folder you can get static and dynamic libs in this folder.
**CMake Options:**
.. code-block:: CMake
:linenos:
option(CGLM_SHARED "Shared build" ON)
option(CGLM_STATIC "Static build" OFF)
option(CGLM_USE_C99 "" OFF) # C11
option(CGLM_USE_TEST "Enable Tests" OFF) # for make check - make test
**Use as header-only library with your CMake project example**
This requires no building or installation of cglm.
.. code-block:: CMake
:linenos:
cmake_minimum_required(VERSION 3.8.2)
project(<Your Project Name>)
add_executable(${PROJECT_NAME} src/main.c)
target_link_libraries(${LIBRARY_NAME} PRIVATE
cglm_headers)
add_subdirectory(external/cglm/ EXCLUDE_FROM_ALL)
**Use with your CMake project example**
.. code-block:: CMake
:linenos:
cmake_minimum_required(VERSION 3.8.2)
project(<Your Project Name>)
add_executable(${PROJECT_NAME} src/main.c)
target_link_libraries(${LIBRARY_NAME} PRIVATE
cglm)
add_subdirectory(external/cglm/)
Meson (All platforms):
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code-block::
:linenos:
$ meson build # [Optional] --default-library=static
$ cd build
$ ninja
$ sudo ninja install # [Optional]
**Meson Options:**
.. code-block::
:linenos:
c_std=c11
buildtype=release
default_library=shared
enable_tests=false # to run tests: ninja test
**Use with your Meson project**
.. code-block::
:linenos:
# Clone cglm or create a cglm.wrap under <source_root>/subprojects
project('name', 'c')
cglm_dep = dependency('cglm', fallback : 'cglm', 'cglm_dep')
executable('exe', 'src/main.c', dependencies : cglm_dep)
Unix (Autotools):
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code-block:: bash
:linenos:
$ sh autogen.sh
$ ./configure
@@ -26,11 +111,12 @@ Just import cglm to your project as dependency / external lib by copy-paste then
$ [sudo] make install # install to system (optional)
**make** will build cglm to **.libs** sub folder in project folder.
If you don't want to install cglm to your system's folder you can get static and dynamic libs in this folder.
If you don't want to install **cglm** to your system's folder you can get static and dynamic libs in this folder.
**Build dependencies (windows):**
Windows (MSBuild):
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Windows related build files, project files are located in win folder,
Windows related build files, project files are located in `win` folder,
make sure you are inside in cglm/win folder.
Code Analysis are enabled, it may take awhile to build.
@@ -50,3 +136,18 @@ then try to build with *devenv*:
$ devenv cglm.sln /Build Release
Currently tests are not available on Windows.
Documentation (Sphinx):
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
**cglm** uses sphinx framework for documentation, it allows lot of formats for documentation. To see all options see sphinx build page:
https://www.sphinx-doc.org/en/master/man/sphinx-build.html
Example build:
.. code-block:: bash
:linenos:
$ cd cglm/docs
$ sphinx-build source build

View File

@@ -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
instead of target, so that makes easy to build view matrix using direction.
There is also :c:func:`glm_look_anyup` function which can help build view matrix
without providing UP axis. It uses :c:func:`glm_vec_ortho` to get a UP axis and
without providing UP axis. It uses :c:func:`glm_vec3_ortho` to get a UP axis and
builds view matrix.
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_s`
#. :c:func:`glm_perspective`
#. :c:func:`glm_persp_move_far`
#. :c:func:`glm_perspective_default`
#. :c:func:`glm_perspective_resize`
#. :c:func:`glm_lookat`
@@ -139,12 +140,22 @@ Functions documentation
| set up perspective projection matrix
Parameters:
| *[in]* **fovy** field of view angle
| *[in]* **fovy** field of view angle (in radians)
| *[in]* **aspect** aspect ratio ( width / height )
| *[in]* **nearVal** near clipping plane
| *[in]* **farVal** far clipping planes
| *[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)
| set up perspective projection matrix with default near/far
@@ -167,11 +178,13 @@ Functions documentation
| set up view matrix
**NOTE:** The UP vector must not be parallel to the line of sight from the eye point to the reference point.
Parameters:
| *[in]* **eye** eye vector
| *[in]* **center** center vector
| *[in]* **up** up vector
| *[out]* **dest** result matrix
| *[in]* **eye** eye vector
| *[in]* **center** center vector
| *[in]* **up** up vector
| *[out]* **dest** result matrix
.. c:function:: void glm_look(vec3 eye, vec3 dir, vec3 up, mat4 dest)
@@ -181,9 +194,11 @@ Functions documentation
target self then this might be useful. Because you need to get target
from direction.
**NOTE:** The UP vector must not be parallel to the line of sight from the eye point to the reference point.
Parameters:
| *[in]* **eye** eye vector
| *[in]* **center** direction vector
| *[in]* **dir** direction vector
| *[in]* **up** up vector
| *[out]* **dest** result matrix
@@ -197,7 +212,7 @@ Functions documentation
Parameters:
| *[in]* **eye** eye vector
| *[in]* **center** direction vector
| *[in]* **dir** direction vector
| *[out]* **dest** result matrix
.. c:function:: void glm_persp_decomp(mat4 proj, float *nearVal, float *farVal, float *top, float *bottom, float *left, float *right)

View File

@@ -25,7 +25,7 @@
# If your documentation needs a minimal Sphinx version, state it here.
#
# needs_sphinx = '1.0'
# needs_sphinx = '3.0'
# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
@@ -62,9 +62,9 @@ author = u'Recep Aslantas'
# built documents.
#
# The short X.Y version.
version = u'0.3.4'
version = u'0.8.4'
# The full version, including alpha/beta/rc tags.
release = u'0.3.4'
release = u'0.8.4'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
@@ -90,7 +90,7 @@ todo_include_todos = False
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
#
html_theme = 'alabaster'
html_theme = 'sphinx_rtd_theme'
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
@@ -99,13 +99,13 @@ html_theme = 'alabaster'
# html_theme_options = {}
html_theme_options = {
'github_banner': 'true',
'github_button': 'true',
'github_user': 'recp',
'github_repo': 'cglm',
'travis_button': 'true',
'show_related': 'true',
'fixed_sidebar': 'true'
# 'github_banner': 'true',
# 'github_button': 'true',
# 'github_user': 'recp',
# 'github_repo': 'cglm',
# 'travis_button': 'true',
# 'show_related': 'true',
# 'fixed_sidebar': 'true'
}
# Add any paths that contain custom static files (such as style sheets) here,
@@ -197,3 +197,7 @@ epub_exclude_files = ['search.html']
# If true, `todo` and `todoList` produce output, else they produce nothing.
todo_include_todos = True
# -- Options for the C domain ------------------------------------------------
c_id_attributes = ['__restrict']

41
docs/source/curve.rst Normal file
View 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

28
docs/source/features.rst Normal file
View File

@@ -0,0 +1,28 @@
Features
================================================================================
* **scalar** and **simd** (sse, avx, neon...) optimizations
* option to use different clipspaces e.g. Left Handed, Zero-to-One... (currrently right handed negative-one is default)
* array api and struct api, you can use arrays or structs.
* general purpose matrix operations (mat4, mat3)
* chain matrix multiplication (square only)
* general purpose vector operations (cross, dot, rotate, proj, angle...)
* affine transformations
* matrix decomposition (extract rotation, scaling factor)
* optimized affine transform matrices (mul, rigid-body inverse)
* camera (lookat)
* projections (ortho, perspective)
* quaternions
* euler angles / yaw-pitch-roll to matrix
* extract euler angles
* inline or pre-compiled function call
* frustum (extract view frustum planes, corners...)
* bounding box (AABB in Frustum (culling), crop, merge...)
* bounding sphere
* project, unproject
* easing functions
* curves
* curve interpolation helpers (SMC, deCasteljau...)
* helpers to convert cglm types to Apple's simd library to pass cglm types to Metal GL without packing them on both sides
* ray intersection helpers
* and others...

View File

@@ -127,7 +127,7 @@ Functions documentation
.. code-block:: c
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.

View File

@@ -9,31 +9,40 @@ Types:
.. code-block:: c
:linenos:
typedef float vec3[3];
typedef int ivec3[3];
typedef CGLM_ALIGN(16) float vec4[4];
typedef float vec2[2];
typedef float vec3[3];
typedef int ivec3[3];
typedef CGLM_ALIGN_IF(16) float vec4[4];
typedef vec4 versor;
typedef vec3 mat3[3];
typedef vec3 mat3[3];
typedef vec4 mat4[4];
typedef vec4 versor;
#ifdef __AVX__
typedef CGLM_ALIGN_IF(32) vec4 mat4[4];
#else
typedef CGLM_ALIGN_IF(16) vec4 mat4[4];
#endif
As you can see types don't store extra informations in favor of space.
You can send these values e.g. matrix to OpenGL directly without casting or calling a function like *value_ptr*
Aligment is Required:
Alignment Is Required:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
**vec4** and **mat4** requires 16 byte aligment because vec4 and mat4 operations are
vectorized by SIMD instructions (SSE/AVX).
**vec4** and **mat4** requires 16 (32 for **mat4** if AVX is enabled) byte alignment because **vec4** and **mat4** operations are vectorized by SIMD instructions (SSE/AVX/NEON).
**UPDATE:**
By starting v0.4.5 cglm provides an option to disable alignment requirement, it is enabled as default
| Check :doc:`opt` page for more details
Also alignment is disabled for older msvc verisons as default. Now alignment is only required in Visual Studio 2017 version 15.6+ if CGLM_ALL_UNALIGNED macro is not defined.
Allocations:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*cglm* doesn't alloc any memory on heap. So it doesn't provide any allocator.
You must allocate memory yourself. You should alloc memory for out parameters too if you pass pointer of memory location.
When allocating memory don't forget that **vec4** and **mat4** requires aligment.
You must allocate memory yourself. You should alloc memory for out parameters too if you pass pointer of memory location. When allocating memory, don't forget that **vec4** and **mat4** require alignment.
**NOTE:** Unaligned vec4 and unaligned mat4 operations will be supported in the future. Check todo list.
**NOTE:** Unaligned **vec4** and unaligned **mat4** operations will be supported in the future. Check todo list.
Because you may want to multiply a CGLM matrix with external matrix.
There is no guarantee that non-CGLM matrix is aligned. Unaligned types will have *u* prefix e.g. **umat4**

View File

@@ -3,7 +3,7 @@
You can adapt this file completely to your liking, but it should at least
contain the root `toctree` directive.
Welcome to cglm's documentation!
cglm Documentation
================================
**cglm** is optimized 3D math library written in C99 (compatible with C89).
@@ -14,33 +14,38 @@ is considered to be supported as optional.
Also currently only **float** type is supported for most operations.
**Features**
* general purpose matrix operations (mat4, mat3)
* chain matrix multiplication (square only)
* general purpose vector operations (cross, dot, rotate, proj, angle...)
* affine transforms
* matrix decomposition (extract rotation, scaling factor)
* optimized affine transform matrices (mul, rigid-body inverse)
* camera (lookat)
* projections (ortho, perspective)
* quaternions
* euler angles / yaw-pitch-roll to matrix
* extract euler angles
* inline or pre-compiled function call
* frustum (extract view frustum planes, corners...)
* bounding box (AABB in Frustum (culling), crop, merge...)
.. toctree::
:maxdepth: 1
:caption: Table Of Contents:
:maxdepth: 2
:caption: Getting Started:
features
build
getting_started
.. toctree::
:maxdepth: 2
:caption: How To:
opengl
.. toctree::
:maxdepth: 2
:caption: API:
api
.. toctree::
:maxdepth: 2
:caption: Options:
opt
.. toctree::
:maxdepth: 2
:caption: Troubleshooting:
troubleshooting
Indices and tables
==================

View File

@@ -28,6 +28,23 @@ Example to print mat4 matrix:
(you probably will in some cases), you can change it temporary.
cglm may provide precision parameter in the future
Changes since **v0.7.3**:
* Now mis-alignment of columns are fixed: larger numbers are printed via %g and others are printed via %f. Column withs are calculated before print.
* Now values are colorful ;)
* Some print improvements
* New options with default values:
.. code-block:: c
#define CGLM_PRINT_PRECISION 5
#define CGLM_PRINT_MAX_TO_SHORT 1e5
#define CGLM_PRINT_COLOR "\033[36m"
#define CGLM_PRINT_COLOR_RESET "\033[0m"
* Inline prints are only enabled in DEBUG mode and if **CGLM_DEFINE_PRINTS** is defined.
Check options page.
Table of contents (click to go):
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

179
docs/source/mat2.rst Normal file
View File

@@ -0,0 +1,179 @@
.. default-domain:: C
mat2
====
Header: cglm/mat2.h
Table of contents (click to go):
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Macros:
1. GLM_mat2_IDENTITY_INIT
#. GLM_mat2_ZERO_INIT
#. GLM_mat2_IDENTITY
#. GLM_mat2_ZERO
Functions:
1. :c:func:`glm_mat2_copy`
#. :c:func:`glm_mat2_identity`
#. :c:func:`glm_mat2_identity_array`
#. :c:func:`glm_mat2_zero`
#. :c:func:`glm_mat2_mul`
#. :c:func:`glm_mat2_transpose_to`
#. :c:func:`glm_mat2_transpose`
#. :c:func:`glm_mat2_mulv`
#. :c:func:`glm_mat2_scale`
#. :c:func:`glm_mat2_det`
#. :c:func:`glm_mat2_inv`
#. :c:func:`glm_mat2_trace`
#. :c:func:`glm_mat2_swap_col`
#. :c:func:`glm_mat2_swap_row`
#. :c:func:`glm_mat2_rmc`
Functions documentation
~~~~~~~~~~~~~~~~~~~~~~~
.. c:function:: void glm_mat2_copy(mat2 mat, mat2 dest)
copy mat2 to another one (dest).
Parameters:
| *[in]* **mat** source
| *[out]* **dest** destination
.. c:function:: void glm_mat2_identity(mat2 mat)
copy identity mat2 to mat, or makes mat to identiy
Parameters:
| *[out]* **mat** matrix
.. c:function:: void glm_mat2_identity_array(mat2 * __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_mat2_zero(mat2 mat)
make given matrix zero
Parameters:
| *[in,out]* **mat** matrix to
.. c:function:: void glm_mat2_mul(mat2 m1, mat2 m2, mat2 dest)
multiply m1 and m2 to dest
m1, m2 and dest matrices can be same matrix, it is possible to write this:
.. code-block:: c
mat2 m = GLM_mat2_IDENTITY_INIT;
glm_mat2_mul(m, m, m);
Parameters:
| *[in]* **m1** left matrix
| *[in]* **m2** right matrix
| *[out]* **dest** destination matrix
.. c:function:: void glm_mat2_transpose_to(mat2 m, mat2 dest)
transpose mat4 and store in dest
source matrix will not be transposed unless dest is m
Parameters:
| *[in]* **mat** source
| *[out]* **dest** destination
.. c:function:: void glm_mat2_transpose(mat2 m)
tranpose mat2 and store result in same matrix
Parameters:
| *[in]* **mat** source
| *[out]* **dest** destination
.. c:function:: void glm_mat2_mulv(mat2 m, vec2 v, vec2 dest)
multiply mat4 with vec4 (column vector) and store in dest vector
Parameters:
| *[in]* **mat** mat2 (left)
| *[in]* **v** vec2 (right, column vector)
| *[out]* **dest** destination (result, column vector)
.. c:function:: void glm_mat2_scale(mat2 m, float s)
multiply matrix with scalar
Parameters:
| *[in, out]* **mat** matrix
| *[in]* **dest** scalar
.. c:function:: float glm_mat2_det(mat2 mat)
returns mat2 determinant
Parameters:
| *[in]* **mat** matrix
Returns:
mat2 determinant
.. c:function:: void glm_mat2_inv(mat2 mat, mat2 dest)
inverse mat2 and store in dest
Parameters:
| *[in]* **mat** matrix
| *[out]* **dest** destination (inverse matrix)
.. c:function:: void glm_mat2_trace(mat2 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_mat2_swap_col(mat2 mat, int col1, int col2)
swap two matrix columns
Parameters:
| *[in, out]* **mat** matrix
| *[in]* **col1** col1
| *[in]* **col2** col2
.. c:function:: void glm_mat2_swap_row(mat2 mat, int row1, int row2)
swap two matrix rows
Parameters:
| *[in, out]* **mat** matrix
| *[in]* **row1** row1
| *[in]* **row2** row2
.. c:function:: float glm_mat2_rmc(vec2 r, mat2 m, vec2 c)
| **rmc** stands for **Row** * **Matrix** * **Column**
| helper for R (row vector) * M (matrix) * C (column vector)
| the result is scalar because R * M = Matrix1x2 (row vector),
| then Matrix1x2 * Vec2 (column vector) = Matrix1x1 (Scalar)
Parameters:
| *[in]* **r** row vector or matrix1x2
| *[in]* **m** matrix2x2
| *[in]* **c** column vector or matrix2x1
Returns:
scalar value e.g. Matrix1x1

View File

@@ -20,15 +20,20 @@ Functions:
1. :c:func:`glm_mat3_copy`
#. :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_transpose_to`
#. :c:func:`glm_mat3_transpose`
#. :c:func:`glm_mat3_mulv`
#. :c:func:`glm_mat3_quat`
#. :c:func:`glm_mat3_scale`
#. :c:func:`glm_mat3_det`
#. :c:func:`glm_mat3_inv`
#. :c:func:`glm_mat3_trace`
#. :c:func:`glm_mat3_swap_col`
#. :c:func:`glm_mat3_swap_row`
#. :c:func:`glm_mat3_rmc`
Functions documentation
~~~~~~~~~~~~~~~~~~~~~~~
@@ -48,6 +53,21 @@ Functions documentation
Parameters:
| *[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)
multiply m1 and m2 to dest
@@ -89,6 +109,14 @@ Functions documentation
| *[in]* **v** vec3 (right, column vector)
| *[out]* **dest** destination (result, column vector)
.. c:function:: void glm_mat3_quat(mat3 m, versor dest)
convert mat3 to quaternion
Parameters:
| *[in]* **m** rotation matrix
| *[out]* **dest** destination quaternion
.. c:function:: void glm_mat3_scale(mat3 m, float s)
multiply matrix with scalar
@@ -115,6 +143,16 @@ Functions documentation
| *[in]* **mat** 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)
swap two matrix columns
@@ -132,3 +170,20 @@ Functions documentation
| *[in, out]* **mat** matrix
| *[in]* **row1** row1
| *[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

View File

@@ -25,6 +25,8 @@ Functions:
1. :c:func:`glm_mat4_ucopy`
#. :c:func:`glm_mat4_copy`
#. :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_pick3t`
#. :c:func:`glm_mat4_ins3`
@@ -32,6 +34,9 @@ Functions:
#. :c:func:`glm_mat4_mulN`
#. :c:func:`glm_mat4_mulv`
#. :c:func:`glm_mat4_mulv3`
#. :c:func:`glm_mat3_trace`
#. :c:func:`glm_mat3_trace3`
#. :c:func:`glm_mat4_quat`
#. :c:func:`glm_mat4_transpose_to`
#. :c:func:`glm_mat4_transpose`
#. :c:func:`glm_mat4_scale_p`
@@ -41,6 +46,7 @@ Functions:
#. :c:func:`glm_mat4_inv_fast`
#. :c:func:`glm_mat4_swap_col`
#. :c:func:`glm_mat4_swap_row`
#. :c:func:`glm_mat4_rmc`
Functions documentation
~~~~~~~~~~~~~~~~~~~~~~~
@@ -68,6 +74,21 @@ Functions documentation
Parameters:
| *[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)
copy upper-left of mat4 to mat3
@@ -135,16 +156,51 @@ Functions documentation
Parameters:
| *[in]* **m** mat4 (left)
| *[in]* **v** vec4 (right, column vector)
| *[in]* **last** 4th item to make it vec4
| *[out]* **dest** vec4 (result, column vector)
.. c:function:: void glm_mat4_mulv3(mat4 m, vec3 v, vec3 dest)
.. c:function:: void glm_mat4_mulv3(mat4 m, vec3 v, float last, vec3 dest)
multiply vector with mat4's mat3 part(rotation)
| multiply **vec3** with **mat4** and get **vec3** as result
|
| actually the result is **vec4**, after multiplication,
the last component is trimmed, if you need the result's last component
then don't use this function and consider to use **glm_mat4_mulv()**
Parameters:
| *[in]* **m** mat4 (left)
| *[in]* **v** vec3 (right, column vector)
| *[out]* **dest** vec3 (result, column vector)
| *[in]* **m** mat4(affine transform)
| *[in]* **v** vec3
| *[in]* **last** 4th item to make it vec4
| *[out]* **dest** result vector (vec3)
.. c:function:: void glm_mat4_trace(mat4 m)
| sum of the elements on the main diagonal from upper left to the lower right
Parameters:
| *[in]* **m** matrix
Returns:
trace of matrix
.. c:function:: void glm_mat4_trace3(mat4 m)
| trace of matrix (rotation part)
| sum of the elements on the main diagonal from upper left to the lower right
Parameters:
| *[in]* **m** matrix
Returns:
trace of matrix
.. c:function:: void glm_mat4_quat(mat4 m, versor dest)
convert mat4's rotation part to quaternion
Parameters:
| *[in]* **m** affine matrix
| *[out]* **dest** destination quaternion
.. c:function:: void glm_mat4_transpose_to(mat4 m, mat4 dest)
@@ -229,3 +285,20 @@ Functions documentation
| *[in, out]* **mat** matrix
| *[in]* **row1** row1
| *[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

View File

@@ -2,7 +2,7 @@ How to send vector or matrix to OpenGL like API
==================================================
*cglm*'s vector and matrix types are arrays. So you can send them directly to a
function which accecpts pointer. But you may got warnings for matrix because it is
function which accepts pointer. But you may got warnings for matrix because it is
two dimensional array.
Passing / Uniforming Matrix to OpenGL:
@@ -43,9 +43,9 @@ array of matrices:
/* ... */
glUniformMatrix4fv(location, count, GL_FALSE, (float *)matrix);
in this way, passing aray of matrices is same
in this way, passing aray of matrices is same
Passing / Uniforming Vectors to OpenGL:
Passing / Uniforming Vectors to OpenGL:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
You don't need to do extra thing when passing cglm vectors to OpengL or other APIs.

124
docs/source/opt.rst Normal file
View File

@@ -0,0 +1,124 @@
.. default-domain:: C
Options
===============================================================================
A few options are provided via macros.
Alignment Option
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
As default, cglm requires types to be aligned. Alignment requirements:
vec3: 8 byte
vec4: 16 byte
mat4: 16 byte
versor: 16 byte
By starting **v0.4.5** cglm provides an option to disable alignment requirement.
To enable this option define **CGLM_ALL_UNALIGNED** macro before all headers.
You can define it in Xcode, Visual Studio (or other IDEs) or you can also prefer
to define it in build system. If you use pre-compiled versions then you
have to compile cglm with **CGLM_ALL_UNALIGNED** macro.
**VERY VERY IMPORTANT:** If you use cglm in multiple projects and
those projects are depends on each other, then
| *ALWAYS* or *NEVER USE* **CGLM_ALL_UNALIGNED** macro in linked projects
if you do not know what you are doing. Because a cglm header included
via 'project A' may force types to be aligned and another cglm header
included via 'project B' may not require alignment. In this case
cglm functions will read from and write to **INVALID MEMORY LOCATIONs**.
ALWAYS USE SAME CONFIGURATION / OPTION for **cglm** if you have multiple projects.
For instance if you set CGLM_ALL_UNALIGNED in a project then set it in other projects too
Clipspace Option[s]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
By starting **v0.8.3** cglm provides options to switch between clipspace configurations.
Clipspace related files are located at `include/cglm/[struct]/clipspace.h` but
these are included in related files like `cam.h`. If you don't want to change your existing
clipspace configuration and want to use different clipspace function like `glm_lookat_zo` or `glm_lookat_lh_zo`...
then you can include individual headers or just define `CGLM_CLIPSPACE_INCLUDE_ALL` which will iclude all headers for you.
1. **CGLM_CLIPSPACE_INCLUDE_ALL**
2. **CGLM_FORCE_DEPTH_ZERO_TO_ONE**
3. **CGLM_FORCE_LEFT_HANDED**
1. **CGLM_CLIPSPACE_INCLUDE_ALL**:
By defining this macro, **cglm** will include all clipspace functions for you by just using
`#include cglm/cglm.h` or `#include cglm/struct.h` or `#include cglm/call.h`
Otherwise you need to include header you want manually e.g. `#include cglm/clipspace/view_rh_zo.h`
2. **CGLM_FORCE_DEPTH_ZERO_TO_ONE**
This is similar to **GLM**'s **GLM_FORCE_DEPTH_ZERO_TO_ONE** option.
This will set clip space between 0 to 1 which makes **cglm** Vulkan, Metal friendly.
You can use functions like `glm_lookat_lh_zo()` individually. By setting **CGLM_FORCE_DEPTH_ZERO_TO_ONE**
functions in cam.h for instance will use `_zo` versions.
3. **CGLM_FORCE_LEFT_HANDED**
Force **cglm** to use the left handed coordinate system by default, currently **cglm** uses right handed coordinate system as default,
you can change this behavior with this option.
**VERY VERY IMPORTANT:**
Be careful if you include **cglm** in multiple projects.
SSE and SSE2 Shuffle Option
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
**_mm_shuffle_ps** generates **shufps** instruction even if registers are same.
You can force it to generate **pshufd** instruction by defining
**CGLM_USE_INT_DOMAIN** macro. As default it is not defined.
SSE3 and SSE4 Dot Product Options
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
You have to extra options for dot product: **CGLM_SSE4_DOT** and **CGLM_SSE3_DOT**.
- If **SSE4** is enabled then you can define **CGLM_SSE4_DOT** to force cglm to use **_mm_dp_ps** instruction.
- If **SSE3** is enabled then you can define **CGLM_SSE3_DOT** to force cglm to use **_mm_hadd_ps** instructions.
otherwise cglm will use custom cglm's hadd functions which are optimized too.
Print Options
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. **CGLM_DEFINE_PRINTS**
2. **CGLM_NO_PRINTS_NOOP** (use CGLM_DEFINE_PRINTS)
Inline prints are only enabled in **DEBUG** mode or if **CGLM_DEFINE_PRINTS** is defined.
**glmc_** versions will always print too.
Because **cglm** tried to enable print functions in debug mode and disable them in
release/production mode to eliminate printing costs when we do not need them.
**cglm** checks **DEBUG** or **_DEBUG** macros to test debug mode, if these are not working for you then you can use
**CGLM_DEFINE_PRINTS** to force enable, or create a PR to introduce new macro to test against debugging mode.
If DEBUG mode is not enabled then print functions will be emptied to eliminate print function calls.
You can disable this feature too by defining **CGLM_DEFINE_PRINTS** macro top of cglm header
or in project/build settings...
3. **CGLM_PRINT_PRECISION** 5
precision.
4. **CGLM_PRINT_MAX_TO_SHORT** 1e5
if a number is greater than this value then %g will be used, since this is shorten print you won't be able to see high precision.
5. **CGLM_PRINT_COLOR** "\033[36m"
6. **CGLM_PRINT_COLOR_RESET** "\033[0m"
You can disable colorful print output by defining **CGLM_PRINT_COLOR** and **CGLM_PRINT_COLOR_RESET** as empty macro.
Because some terminals may not support colors.

View File

@@ -27,10 +27,12 @@ Macros:
Functions:
1. :c:func:`glm_quat_identity`
#. :c:func:`glm_quat_identity_array`
#. :c:func:`glm_quat_init`
#. :c:func:`glm_quat`
#. :c:func:`glm_quatv`
#. :c:func:`glm_quat_copy`
#. :c:func:`glm_quat_from_vecs`
#. :c:func:`glm_quat_norm`
#. :c:func:`glm_quat_normalize`
#. :c:func:`glm_quat_normalize_to`
@@ -51,11 +53,15 @@ Functions:
#. :c:func:`glm_quat_mat3`
#. :c:func:`glm_quat_mat3t`
#. :c:func:`glm_quat_lerp`
#. :c:func:`glm_quat_nlerp`
#. :c:func:`glm_quat_slerp`
#. :c:func:`glm_quat_look`
#. :c:func:`glm_quat_for`
#. :c:func:`glm_quat_forp`
#. :c:func:`glm_quat_rotatev`
#. :c:func:`glm_quat_rotate`
#. :c:func:`glm_quat_rotate_at`
#. :c:func:`glm_quat_rotate_atm`
Functions documentation
~~~~~~~~~~~~~~~~~~~~~~~
@@ -67,6 +73,14 @@ Functions documentation
Parameters:
| *[in, out]* **q** quaternion
.. c:function:: void glm_quat_identity_array(versor * __restrict q, size_t count)
| make given quaternion array's each element identity quaternion
Parameters:
| *[in, out]* **q** quat array (must be aligned (16) if alignment is not disabled)
| *[in]* **count** count of quaternions
.. c:function:: void glm_quat_init(versor q, float x, float y, float z, float w)
| inits quaternion with given values
@@ -110,6 +124,20 @@ Functions documentation
| *[in]* **q** source quaternion
| *[out]* **dest** destination quaternion
.. c:function:: void glm_quat_from_vecs(vec3 a, vec3 b, versor dest)
| compute unit quaternion needed to rotate a into b
References:
* `Finding quaternion representing the rotation from one vector to another <https://stackoverflow.com/a/11741520/183120>`_
* `Quaternion from two vectors <http://lolengine.net/blog/2014/02/24/quaternion-from-two-vectors-final>`_
* `Angle between vectors <http://www.euclideanspace.com/maths/algebra/vectors/angleBetween/minorlogic.htm>`_
Parameters:
| *[in]* **a** unit vector
| *[in]* **b** unit vector
| *[in]* **dest** unit quaternion
.. c:function:: float glm_quat_norm(versor q)
| returns norm (magnitude) of quaternion
@@ -292,6 +320,25 @@ Functions documentation
| *[in]* **t** interpolant (amount) clamped between 0 and 1
| *[out]* **dest** result quaternion
.. c:function:: void glm_quat_nlerp(versor q, versor r, float t, versor dest)
| interpolates between two quaternions
| taking the shortest rotation path using
| normalized linear interpolation (NLERP)
| This is a cheaper alternative to slerp; most games use nlerp
| for animations as it visually makes little difference.
References:
* `Understanding Slerp, Then Not Using it <http://number-none.com/product/Understanding%20Slerp,%20Then%20Not%20Using%20It>`_
* `Lerp, Slerp and Nlerp <https://keithmaggio.wordpress.com/2011/02/15/math-magician-lerp-slerp-and-nlerp/>`_
Parameters:
| *[in]* **from** from
| *[in]* **to** to
| *[in]* **t** interpolant (amount) clamped between 0 and 1
| *[out]* **dest** result quaternion
.. c:function:: void glm_quat_slerp(versor q, versor r, float t, versor dest)
| interpolates between two quaternions
@@ -312,26 +359,24 @@ Functions documentation
| *[in]* **ori** orientation in world space as quaternion
| *[out]* **dest** result matrix
.. c:function:: void glm_quat_for(vec3 dir, vec3 fwd, vec3 up, versor dest)
.. c:function:: void glm_quat_for(vec3 dir, vec3 up, versor dest)
| creates look rotation quaternion
Parameters:
| *[in]* **dir** direction to look
| *[in]* **fwd** forward vector
| *[in]* **up** up vector
| *[out]* **dest** result matrix
.. c:function:: void glm_quat_forp(vec3 from, vec3 to, vec3 fwd, vec3 up, versor dest)
.. c:function:: void glm_quat_forp(vec3 from, vec3 to, vec3 up, versor dest)
| creates look rotation quaternion using source and destination positions p suffix stands for position
| creates look rotation quaternion using source and destination positions p suffix stands for position
| this is similar to glm_quat_for except this computes direction for glm_quat_for for you.
Parameters:
| *[in]* **from** source point
| *[in]* **to** destination point
| *[in]* **fwd** forward vector
| *[in]* **up** up vector
| *[out]* **dest** result matrix
@@ -354,3 +399,24 @@ Functions documentation
| *[in]* **m** existing transform matrix to rotate
| *[in]* **q** quaternion
| *[out]* **dest** rotated matrix/transform
.. c:function:: void glm_quat_rotate_at(mat4 m, versor q, vec3 pivot)
| rotate existing transform matrix using quaternion at pivot point
Parameters:
| *[in, out]* **m** existing transform matrix to rotate
| *[in]* **q** quaternion
| *[in]* **pivot** pivot
.. c:function:: void glm_quat_rotate_atm(mat4 m, versor q, vec3 pivot)
| rotate NEW transform matrix using quaternion at pivot point
| this creates rotation matrix, it assumes you don't have a matrix
| this should work faster than glm_quat_rotate_at because it reduces one glm_translate.
Parameters:
| *[in, out]* **m** existing transform matrix to rotate
| *[in]* **q** quaternion
| *[in]* **pivot** pivot

31
docs/source/ray.rst Normal file
View File

@@ -0,0 +1,31 @@
.. default-domain:: C
ray
====
Header: cglm/ray.h
This is for collision-checks used by ray-tracers and the like.
Table of contents (click to go):
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Functions:
1. :c:func:`glm_ray_triangle`
Functions documentation
~~~~~~~~~~~~~~~~~~~~~~~
.. c:function:: bool glm_ray_triangle(vec3 origin, vec3 direction, vec3 v0, vec3 v1, vec3 v2, float *d)
MöllerTrumbore ray-triangle intersection algorithm
Parameters:
| *[in]* **origin** origin of ray
| *[in]* **direction** direction of ray
| *[in]* **v0** first vertex of triangle
| *[in]* **v1** second vertex of triangle
| *[in]* **v2** third vertex of triangle
| *[in, out]* **d** float pointer to save distance to intersection
| *[out]* **intersection** whether there is intersection

74
docs/source/sphere.rst Normal file
View File

@@ -0,0 +1,74 @@
.. default-domain:: C
Sphere
================================================================================
Header: cglm/sphere.h
**Definition of sphere:**
Sphere Representation in cglm is *vec4*: **[center.x, center.y, center.z, radii]**
You can call any vec3 function by pasing sphere. Because first three elements
defines center of sphere.
Table of contents (click to go):
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Functions:
1. :c:func:`glm_sphere_radii`
#. :c:func:`glm_sphere_transform`
#. :c:func:`glm_sphere_merge`
#. :c:func:`glm_sphere_sphere`
#. :c:func:`glm_sphere_point`
Functions documentation
~~~~~~~~~~~~~~~~~~~~~~~
.. c:function:: float glm_sphere_radii(vec4 s)
| helper for getting sphere radius
Parameters:
| *[in]* **s** sphere
Returns:
returns radii
.. c:function:: void glm_sphere_transform(vec4 s, mat4 m, vec4 dest)
| apply transform to sphere, it is just wrapper for glm_mat4_mulv3
Parameters:
| *[in]* **s** sphere
| *[in]* **m** transform matrix
| *[out]* **dest** transformed sphere
.. c:function:: void glm_sphere_merge(vec4 s1, vec4 s2, vec4 dest)
| merges two spheres and creates a new one
two sphere must be in same space, for instance if one in world space then
the other must be in world space too, not in local space.
Parameters:
| *[in]* **s1** sphere 1
| *[in]* **s2** sphere 2
| *[out]* **dest** merged/extended sphere
.. c:function:: bool glm_sphere_sphere(vec4 s1, vec4 s2)
| check if two sphere intersects
Parameters:
| *[in]* **s1** sphere
| *[in]* **s2** other sphere
.. c:function:: bool glm_sphere_point(vec4 s, vec3 point)
| check if sphere intersects with point
Parameters:
| *[in]* **s** sphere
| *[in]* **point** point

View File

@@ -0,0 +1,99 @@
.. default-domain:: C
Troubleshooting
================================================================================
It is possible that sometimes you may get crashes or wrong results.
Follow these topics
Memory Allocation:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Again, **cglm** doesn't alloc any memory on heap.
cglm functions works like memcpy; it copies data from src,
makes calculations then copy the result to dest.
You are responsible for allocation of **src** and **dest** parameters.
Alignment:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
**vec4** and **mat4** types requires 16 byte alignment.
These types are marked with align attribute to let compiler know about this
requirement.
But since MSVC (Windows) throws the error:
**"formal parameter with requested alignment of 16 won't be aligned"**
The alignment attribute has been commented for MSVC
.. code-block:: c
#if defined(_MSC_VER)
# define CGLM_ALIGN(X) /* __declspec(align(X)) */
#else
# define CGLM_ALIGN(X) __attribute((aligned(X)))
#endif.
So MSVC may not know about alignment requirements when creating variables.
The interesting thing is that, if I remember correctly Visual Studio 2017
doesn't throw the above error. So we may uncomment that line for Visual Studio 2017,
you may do it yourself.
**This MSVC issue is still in TODOs.**
**UPDATE:** By starting v0.4.5 cglm provides an option to disable alignment requirement.
Also alignment is disabled for older msvc verisons as default. Now alignment is only required in Visual Studio 2017 version 15.6+ if CGLM_ALL_UNALIGNED macro is not defined.
Crashes, Invalid Memory Access:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Probably you are trying to write to invalid memory location.
You may used wrong function for what you want to do.
For instance you may called **glm_vec4_** functions for **vec3** data type.
It will try to write 32 byte but since **vec3** is 24 byte it should throw
memory access error or exit the app without saying anything.
**UPDATE - IMPORTANT:**
| On MSVC or some other compilers, if alignment is enabled (default) then double check alignment requirements if you got a crash.
| If you send GLM_VEC4_ONE or similar macros directly to a function, it may be crashed.
| Because compiler may not apply alignment as defined on **typedef** to that macro while passing it (on stack) to a function.
Wrong Results:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Again, you may used wrong function.
For instance if you use **glm_normalize()** or **glm_vec3_normalize()** for **vec4**,
it will assume that passed param is **vec3** and will normalize it for **vec3**.
Since you need to **vec4** to be normalized in your case, you will get wrong results.
Accessing vec4 type with vec3 functions is valid, you will not get any error, exception or crash.
You only get wrong results if you don't know what you are doing!
So be carefull, when your IDE (Xcode, Visual Studio ...) tried to autocomplete function names, READ IT :)
**Also implementation may be wrong please let us know by creating an issue on Github.**
BAD_ACCESS : Thread 1: EXC_BAD_ACCESS (code=EXC_I386_GPFLT) or Similar Errors/Crashes
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
This is similar issue with alignment. For instance if you compiled **cglm** with
AVX (**-mavx**, intentionally or not) and if you use **cglm** in an environment that doesn't
support AVX (or if AVX is disabled intentionally) e.g. environment that max support SSE2/3/4,
then you probably get **BAD ACCESS** or similar...
Because if you compile **cglm** with AVX it aligns **mat4** with 32 byte boundary,
and your project aligns that as 16 byte boundary...
Check alignment, supported vector extension or simd in **cglm** and linked projects...
Other Issues?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
**Please let us know by creating an issue on Github.**

View File

@@ -23,6 +23,7 @@ Functions:
#. :c:func:`glm_max`
#. :c:func:`glm_clamp`
#. :c:func:`glm_lerp`
#. :c:func:`glm_swapf`
Functions documentation
~~~~~~~~~~~~~~~~~~~~~~~
@@ -136,3 +137,46 @@ Functions documentation
Returns:
interpolated value
.. c:function:: bool glm_eq(float a, float b)
check if two float equal with using EPSILON
Parameters:
| *[in]* **a** a
| *[in]* **b** b
Returns:
true if a and b are equal
.. c:function:: float glm_percent(float from, float to, float current)
percentage of current value between start and end value
Parameters:
| *[in]* **from** from value
| *[in]* **to** to value
| *[in]* **current** value between from and to values
Returns:
percentage of current value
.. c:function:: float glm_percentc(float from, float to, float current)
clamped percentage of current value between start and end value
Parameters:
| *[in]* **from** from value
| *[in]* **to** to value
| *[in]* **current** value between from and to values
Returns:
clamped normalized percent (0-100 in 0-1)
.. c:function:: void glm_swapf(float *a, float *b)
swap two float values
Parameters:
| *[in]* **a** float 1
| *[in]* **b** float 2

134
docs/source/vec2-ext.rst Normal file
View File

@@ -0,0 +1,134 @@
.. default-domain:: C
vec2 extra
==========
Header: cglm/vec2-ext.h
There are some functions are in called in extra header. These are called extra
because they are not used like other functions in vec2.h in the future some of
these functions ma be moved to vec2 header.
Table of contents (click to go):
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Functions:
1. :c:func:`glm_vec2_fill`
#. :c:func:`glm_vec2_eq`
#. :c:func:`glm_vec2_eq_eps`
#. :c:func:`glm_vec2_eq_all`
#. :c:func:`glm_vec2_eqv`
#. :c:func:`glm_vec2_eqv_eps`
#. :c:func:`glm_vec2_max`
#. :c:func:`glm_vec2_min`
#. :c:func:`glm_vec2_isnan`
#. :c:func:`glm_vec2_isinf`
#. :c:func:`glm_vec2_isvalid`
#. :c:func:`glm_vec2_sign`
#. :c:func:`glm_vec2_sqrt`
Functions documentation
~~~~~~~~~~~~~~~~~~~~~~~
.. c:function:: void glm_vec2_fill(vec2 v, float val)
fill a vector with specified value
Parameters:
| *[in,out]* **dest** destination
| *[in]* **val** value
.. c:function:: bool glm_vec2_eq(vec2 v, float val)
check if vector is equal to value (without epsilon)
Parameters:
| *[in]* **v** vector
| *[in]* **val** value
.. c:function:: bool glm_vec2_eq_eps(vec2 v, float val)
check if vector is equal to value (with epsilon)
Parameters:
| *[in]* **v** vector
| *[in]* **val** value
.. c:function:: bool glm_vec2_eq_all(vec2 v)
check if vectors members are equal (without epsilon)
Parameters:
| *[in]* **v** vector
.. c:function:: bool glm_vec2_eqv(vec2 v1, vec2 v2)
check if vector is equal to another (without epsilon) vector
Parameters:
| *[in]* **vec** vector 1
| *[in]* **vec** vector 2
.. c:function:: bool glm_vec2_eqv_eps(vec2 v1, vec2 v2)
check if vector is equal to another (with epsilon)
Parameters:
| *[in]* **v1** vector1
| *[in]* **v2** vector2
.. c:function:: float glm_vec2_max(vec2 v)
max value of vector
Parameters:
| *[in]* **v** vector
.. c:function:: float glm_vec2_min(vec2 v)
min value of vector
Parameters:
| *[in]* **v** vector
.. c:function:: bool glm_vec2_isnan(vec2 v)
| check if one of items is NaN (not a number)
| you should only use this in DEBUG mode or very critical asserts
Parameters:
| *[in]* **v** vector
.. c:function:: bool glm_vec2_isinf(vec2 v)
| check if one of items is INFINITY
| you should only use this in DEBUG mode or very critical asserts
Parameters:
| *[in]* **v** vector
.. c:function:: bool glm_vec2_isvalid(vec2 v)
| check if all items are valid number
| you should only use this in DEBUG mode or very critical asserts
Parameters:
| *[in]* **v** vector
.. c:function:: void glm_vec2_sign(vec2 v, vec2 dest)
get sign of 32 bit float as +1, -1, 0
Parameters:
| *[in]* **v** vector
| *[out]* **dest** sign vector (only keeps signs as -1, 0, -1)
.. c:function:: void glm_vec2_sqrt(vec2 v, vec2 dest)
square root of each vector item
Parameters:
| *[in]* **v** vector
| *[out]* **dest** destination vector (sqrt(v))

375
docs/source/vec2.rst Normal file
View File

@@ -0,0 +1,375 @@
.. default-domain:: C
vec2
====
Header: cglm/vec2.h
Table of contents (click to go):
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Macros:
1. GLM_vec2_ONE_INIT
#. GLM_vec2_ZERO_INIT
#. GLM_vec2_ONE
#. GLM_vec2_ZERO
Functions:
1. :c:func:`glm_vec2`
#. :c:func:`glm_vec2_copy`
#. :c:func:`glm_vec2_zero`
#. :c:func:`glm_vec2_one`
#. :c:func:`glm_vec2_dot`
#. :c:func:`glm_vec2_cross`
#. :c:func:`glm_vec2_norm2`
#. :c:func:`glm_vec2_norm`
#. :c:func:`glm_vec2_add`
#. :c:func:`glm_vec2_adds`
#. :c:func:`glm_vec2_sub`
#. :c:func:`glm_vec2_subs`
#. :c:func:`glm_vec2_mul`
#. :c:func:`glm_vec2_scale`
#. :c:func:`glm_vec2_scale_as`
#. :c:func:`glm_vec2_div`
#. :c:func:`glm_vec2_divs`
#. :c:func:`glm_vec2_addadd`
#. :c:func:`glm_vec2_subadd`
#. :c:func:`glm_vec2_muladd`
#. :c:func:`glm_vec2_muladds`
#. :c:func:`glm_vec2_maxadd`
#. :c:func:`glm_vec2_minadd`
#. :c:func:`glm_vec2_negate`
#. :c:func:`glm_vec2_negate_to`
#. :c:func:`glm_vec2_normalize`
#. :c:func:`glm_vec2_normalize_to`
#. :c:func:`glm_vec2_rotate`
#. :c:func:`glm_vec2_distance2`
#. :c:func:`glm_vec2_distance`
#. :c:func:`glm_vec2_maxv`
#. :c:func:`glm_vec2_minv`
#. :c:func:`glm_vec2_clamp`
#. :c:func:`glm_vec2_lerp`
Functions documentation
~~~~~~~~~~~~~~~~~~~~~~~
.. c:function:: void glm_vec2(float * v, vec2 dest)
init vec2 using vec3 or vec4
Parameters:
| *[in]* **v** vector
| *[out]* **dest** destination
.. c:function:: void glm_vec2_copy(vec2 a, vec2 dest)
copy all members of [a] to [dest]
Parameters:
| *[in]* **a** source
| *[out]* **dest** destination
.. c:function:: void glm_vec2_zero(vec2 v)
makes all members 0.0f (zero)
Parameters:
| *[in, out]* **v** vector
.. c:function:: void glm_vec2_one(vec2 v)
makes all members 1.0f (one)
Parameters:
| *[in, out]* **v** vector
.. c:function:: float glm_vec2_dot(vec2 a, vec2 b)
dot product of vec2
Parameters:
| *[in]* **a** vector1
| *[in]* **b** vector2
Returns:
dot product
.. c:function:: void glm_vec2_cross(vec2 a, vec2 b, vec2 d)
cross product of two vector (RH)
| ref: http://allenchou.net/2013/07/cross-product-of-2d-vectors/
Parameters:
| *[in]* **a** vector 1
| *[in]* **b** vector 2
| *[out]* **dest** destination
Returns:
Z component of cross product
.. c:function:: float glm_vec2_norm2(vec2 v)
norm * norm (magnitude) of vector
we can use this func instead of calling norm * norm, because it would call
sqrtf fuction twice but with this func we can avoid func call, maybe this is
not good name for this func
Parameters:
| *[in]* **v** vector
Returns:
square of norm / magnitude
.. c:function:: float glm_vec2_norm(vec2 vec)
| euclidean norm (magnitude), also called L2 norm
| this will give magnitude of vector in euclidean space
Parameters:
| *[in]* **vec** vector
.. c:function:: void glm_vec2_add(vec2 a, vec2 b, vec2 dest)
add a vector to b vector store result in dest
Parameters:
| *[in]* **a** vector1
| *[in]* **b** vector2
| *[out]* **dest** destination vector
.. c:function:: void glm_vec2_adds(vec2 a, float s, vec2 dest)
add scalar to v vector store result in dest (d = v + vec(s))
Parameters:
| *[in]* **v** vector
| *[in]* **s** scalar
| *[out]* **dest** destination vector
.. c:function:: void glm_vec2_sub(vec2 v1, vec2 v2, vec2 dest)
subtract b vector from a vector store result in dest (d = v1 - v2)
Parameters:
| *[in]* **a** vector1
| *[in]* **b** vector2
| *[out]* **dest** destination vector
.. c:function:: void glm_vec2_subs(vec2 v, float s, vec2 dest)
subtract scalar from v vector store result in dest (d = v - vec(s))
Parameters:
| *[in]* **v** vector
| *[in]* **s** scalar
| *[out]* **dest** destination vector
.. c:function:: void glm_vec2_mul(vec2 a, vec2 b, vec2 d)
multiply two vector (component-wise multiplication)
Parameters:
| *[in]* **a** vector
| *[in]* **b** scalar
| *[out]* **d** result = (a[0] * b[0], a[1] * b[1], a[2] * b[2])
.. c:function:: void glm_vec2_scale(vec2 v, float s, vec2 dest)
multiply/scale vec2 vector with scalar: result = v * s
Parameters:
| *[in]* **v** vector
| *[in]* **s** scalar
| *[out]* **dest** destination vector
.. c:function:: void glm_vec2_scale_as(vec2 v, float s, vec2 dest)
make vec2 vector scale as specified: result = unit(v) * s
Parameters:
| *[in]* **v** vector
| *[in]* **s** scalar
| *[out]* **dest** destination vector
.. c:function:: void glm_vec2_div(vec2 a, vec2 b, vec2 dest)
div vector with another component-wise division: d = a / b
Parameters:
| *[in]* **a** vector 1
| *[in]* **b** vector 2
| *[out]* **dest** result = (a[0] / b[0], a[1] / b[1], a[2] / b[2])
.. c:function:: void glm_vec2_divs(vec2 v, float s, vec2 dest)
div vector with scalar: d = v / s
Parameters:
| *[in]* **v** vector
| *[in]* **s** scalar
| *[out]* **dest** result = (a[0] / s, a[1] / s, a[2] / s])
.. c:function:: void glm_vec2_addadd(vec2 a, vec2 b, vec2 dest)
| add two vectors and add result to sum
| it applies += operator so dest must be initialized
Parameters:
| *[in]* **a** vector 1
| *[in]* **b** vector 2
| *[out]* **dest** dest += (a + b)
.. c:function:: void glm_vec2_subadd(vec2 a, vec2 b, vec2 dest)
| sub two vectors and add result to sum
| it applies += operator so dest must be initialized
Parameters:
| *[in]* **a** vector 1
| *[in]* **b** vector 2
| *[out]* **dest** dest += (a - b)
.. c:function:: void glm_vec2_muladd(vec2 a, vec2 b, vec2 dest)
| mul two vectors and add result to sum
| it applies += operator so dest must be initialized
Parameters:
| *[in]* **a** vector 1
| *[in]* **b** vector 2
| *[out]* **dest** dest += (a * b)
.. c:function:: void glm_vec2_muladds(vec2 a, float s, vec2 dest)
| mul vector with scalar and add result to sum
| it applies += operator so dest must be initialized
Parameters:
| *[in]* **a** vector
| *[in]* **s** scalar
| *[out]* **dest** dest += (a * b)
.. c:function:: void glm_vec2_maxadd(vec2 a, vec2 b, vec2 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_vec2_minadd(vec2 a, vec2 b, vec2 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_vec2_negate(vec2 v)
negate vector components
Parameters:
| *[in, out]* **v** vector
.. c:function:: void glm_vec2_negate_to(vec2 v, vec2 dest)
negate vector components and store result in dest
Parameters:
| *[in]* **v** vector
| *[out]* **dest** negated vector
.. c:function:: void glm_vec2_normalize(vec2 v)
normalize vec2 and store result in same vec
Parameters:
| *[in, out]* **v** vector
.. c:function:: void glm_vec2_normalize_to(vec2 vec, vec2 dest)
normalize vec2 to dest
Parameters:
| *[in]* **vec** source
| *[out]* **dest** destination
.. c:function:: void glm_vec2_rotate(vec2 v, float angle, vec2 dest)
rotate vec2 around axis by angle using Rodrigues' rotation formula
Parameters:
| *[in]* **v** vector
| *[in]* **axis** axis vector
| *[out]* **dest** destination
.. c:function:: float glm_vec2_distance2(vec2 v1, vec2 v2)
squared distance between two vectors
Parameters:
| *[in]* **mat** vector1
| *[in]* **row1** vector2
Returns:
| squared distance (distance * distance)
.. c:function:: float glm_vec2_distance(vec2 v1, vec2 v2)
distance between two vectors
Parameters:
| *[in]* **mat** vector1
| *[in]* **row1** vector2
Returns:
| distance
.. c:function:: void glm_vec2_maxv(vec2 v1, vec2 v2, vec2 dest)
max values of vectors
Parameters:
| *[in]* **v1** vector1
| *[in]* **v2** vector2
| *[out]* **dest** destination
.. c:function:: void glm_vec2_minv(vec2 v1, vec2 v2, vec2 dest)
min values of vectors
Parameters:
| *[in]* **v1** vector1
| *[in]* **v2** vector2
| *[out]* **dest** destination
.. c:function:: void glm_vec2_clamp(vec2 v, float minVal, float maxVal)
constrain a value to lie between two further values
Parameters:
| *[in, out]* **v** vector
| *[in]* **minVal** minimum value
| *[in]* **maxVal** maximum value
.. c:function:: void glm_vec2_lerp(vec2 from, vec2 to, float t, vec2 dest)
linear interpolation between two vector
| formula: from + s * (to - from)
Parameters:
| *[in]* **from** from value
| *[in]* **to** to value
| *[in]* **t** interpolant (amount) clamped between 0 and 1
| *[out]* **dest** destination

View File

@@ -14,25 +14,25 @@ Table of contents (click to go):
Functions:
1. :c:func:`glm_vec_mulv`
#. :c:func:`glm_vec_broadcast`
#. :c:func:`glm_vec_eq`
#. :c:func:`glm_vec_eq_eps`
#. :c:func:`glm_vec_eq_all`
#. :c:func:`glm_vec_eqv`
#. :c:func:`glm_vec_eqv_eps`
#. :c:func:`glm_vec_max`
#. :c:func:`glm_vec_min`
#. :c:func:`glm_vec_isnan`
#. :c:func:`glm_vec_isinf`
#. :c:func:`glm_vec_isvalid`
#. :c:func:`glm_vec_sign`
#. :c:func:`glm_vec_sqrt`
1. :c:func:`glm_vec3_mulv`
#. :c:func:`glm_vec3_broadcast`
#. :c:func:`glm_vec3_eq`
#. :c:func:`glm_vec3_eq_eps`
#. :c:func:`glm_vec3_eq_all`
#. :c:func:`glm_vec3_eqv`
#. :c:func:`glm_vec3_eqv_eps`
#. :c:func:`glm_vec3_max`
#. :c:func:`glm_vec3_min`
#. :c:func:`glm_vec3_isnan`
#. :c:func:`glm_vec3_isinf`
#. :c:func:`glm_vec3_isvalid`
#. :c:func:`glm_vec3_sign`
#. :c:func:`glm_vec3_sqrt`
Functions documentation
~~~~~~~~~~~~~~~~~~~~~~~
.. 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
@@ -41,7 +41,7 @@ Functions documentation
| *[in]* **b** vec2
| *[out]* **d** destination (v1[0] * v2[0], v1[1] * v2[1], v1[2] * v2[2])
.. c:function:: void glm_vec_broadcast(float val, vec3 d)
.. c:function:: void glm_vec3_broadcast(float val, vec3 d)
fill a vector with specified value
@@ -49,7 +49,7 @@ Functions documentation
| *[in]* **val** value
| *[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)
@@ -57,7 +57,7 @@ Functions documentation
| *[in]* **v** vector
| *[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)
@@ -65,14 +65,14 @@ Functions documentation
| *[in]* **v** vector
| *[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)
Parameters:
| *[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
@@ -80,7 +80,7 @@ Functions documentation
| *[in]* **vec** vector 1
| *[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)
@@ -88,21 +88,21 @@ Functions documentation
| *[in]* **v1** vector1
| *[in]* **v2** vector2
.. c:function:: float glm_vec_max(vec3 v)
.. c:function:: float glm_vec3_max(vec3 v)
max value of vector
Parameters:
| *[in]* **v** vector
.. c:function:: float glm_vec_min(vec3 v)
.. c:function:: float glm_vec3_min(vec3 v)
min value of vector
Parameters:
| *[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)
| you should only use this in DEBUG mode or very critical asserts
@@ -110,7 +110,7 @@ Functions documentation
Parameters:
| *[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
| you should only use this in DEBUG mode or very critical asserts
@@ -118,7 +118,7 @@ Functions documentation
Parameters:
| *[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
| you should only use this in DEBUG mode or very critical asserts
@@ -126,7 +126,7 @@ Functions documentation
Parameters:
| *[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
@@ -134,7 +134,7 @@ Functions documentation
| *[in]* **v** vector
| *[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

View File

@@ -5,9 +5,14 @@ vec3
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
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
There are also functions for rotating *vec3* vector. **_m4**, **_m3** prefixes
@@ -18,7 +23,7 @@ Table of contents (click to go):
Macros:
1. glm_vec_dup(v, dest)
1. glm_vec3_dup(v, dest)
#. GLM_VEC3_ONE_INIT
#. GLM_VEC3_ZERO_INIT
#. GLM_VEC3_ONE
@@ -30,32 +35,50 @@ Macros:
Functions:
1. :c:func:`glm_vec3`
#. :c:func:`glm_vec_copy`
#. :c:func:`glm_vec_dot`
#. :c:func:`glm_vec_cross`
#. :c:func:`glm_vec_norm2`
#. :c:func:`glm_vec_norm`
#. :c:func:`glm_vec_add`
#. :c:func:`glm_vec_sub`
#. :c:func:`glm_vec_scale`
#. :c:func:`glm_vec_scale_as`
#. :c:func:`glm_vec_flipsign`
#. :c:func:`glm_vec_flipsign_to`
#. :c:func:`glm_vec_inv`
#. :c:func:`glm_vec_inv_to`
#. :c:func:`glm_vec_normalize`
#. :c:func:`glm_vec_normalize_to`
#. :c:func:`glm_vec_distance`
#. :c:func:`glm_vec_angle`
#. :c:func:`glm_vec_rotate`
#. :c:func:`glm_vec_rotate_m4`
#. :c:func:`glm_vec_proj`
#. :c:func:`glm_vec_center`
#. :c:func:`glm_vec_maxv`
#. :c:func:`glm_vec_minv`
#. :c:func:`glm_vec_ortho`
#. :c:func:`glm_vec_clamp`
#. :c:func:`glm_vec_lerp`
#. :c:func:`glm_vec3_copy`
#. :c:func:`glm_vec3_zero`
#. :c:func:`glm_vec3_one`
#. :c:func:`glm_vec3_dot`
#. :c:func:`glm_vec3_norm2`
#. :c:func:`glm_vec3_norm`
#. :c:func:`glm_vec3_add`
#. :c:func:`glm_vec3_adds`
#. :c:func:`glm_vec3_sub`
#. :c:func:`glm_vec3_subs`
#. :c:func:`glm_vec3_mul`
#. :c:func:`glm_vec3_scale`
#. :c:func:`glm_vec3_scale_as`
#. :c:func:`glm_vec3_div`
#. :c:func:`glm_vec3_divs`
#. :c:func:`glm_vec3_addadd`
#. :c:func:`glm_vec3_subadd`
#. :c:func:`glm_vec3_muladd`
#. :c:func:`glm_vec3_muladds`
#. :c:func:`glm_vec3_maxadd`
#. :c:func:`glm_vec3_minadd`
#. :c:func:`glm_vec3_flipsign`
#. :c:func:`glm_vec3_flipsign_to`
#. :c:func:`glm_vec3_inv`
#. :c:func:`glm_vec3_inv_to`
#. :c:func:`glm_vec3_negate`
#. :c:func:`glm_vec3_negate_to`
#. :c:func:`glm_vec3_normalize`
#. :c:func:`glm_vec3_normalize_to`
#. :c:func:`glm_vec3_cross`
#. :c:func:`glm_vec3_crossn`
#. :c:func:`glm_vec3_distance2`
#. :c:func:`glm_vec3_distance`
#. :c:func:`glm_vec3_angle`
#. :c:func:`glm_vec3_rotate`
#. :c:func:`glm_vec3_rotate_m4`
#. :c:func:`glm_vec3_rotate_m3`
#. :c:func:`glm_vec3_proj`
#. :c:func:`glm_vec3_center`
#. :c:func:`glm_vec3_maxv`
#. :c:func:`glm_vec3_minv`
#. :c:func:`glm_vec3_ortho`
#. :c:func:`glm_vec3_clamp`
#. :c:func:`glm_vec3_lerp`
Functions documentation
~~~~~~~~~~~~~~~~~~~~~~~
@@ -68,7 +91,7 @@ Functions documentation
| *[in]* **v4** vector4
| *[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]
@@ -76,7 +99,21 @@ Functions documentation
| *[in]* **a** source
| *[out]* **dest** destination
.. c:function:: float glm_vec_dot(vec3 a, vec3 b)
.. c:function:: void glm_vec3_zero(vec3 v)
makes all members 0.0f (zero)
Parameters:
| *[in, out]* **v** vector
.. c:function:: void glm_vec3_one(vec3 v)
makes all members 1.0f (one)
Parameters:
| *[in, out]* **v** vector
.. c:function:: float glm_vec3_dot(vec3 a, vec3 b)
dot product of vec3
@@ -87,16 +124,25 @@ Functions documentation
Returns:
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:
| *[in]* **a** source 1
| *[in]* **b** source 2
| *[out]* **d** destination
| *[in]* **a** vector 1
| *[in]* **b** vector 2
| *[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
@@ -110,32 +156,60 @@ Functions documentation
Returns:
square of norm / magnitude
.. c:function:: float glm_vec_norm(vec3 vec)
.. c:function:: float glm_vec3_norm(vec3 vec)
norm (magnitude) of vec3
| euclidean norm (magnitude), also called L2 norm
| this will give magnitude of vector in euclidean space
Parameters:
| *[in]* **vec** vector
.. c:function:: void glm_vec_add(vec3 v1, vec3 v2, vec3 dest)
.. c:function:: void glm_vec3_add(vec3 a, vec3 b, vec3 dest)
add v2 vector to v1 vector store result in dest
add a vector to b vector store result in dest
Parameters:
| *[in]* **v1** vector1
| *[in]* **v2** vector2
| *[in]* **a** vector1
| *[in]* **b** vector2
| *[out]* **dest** destination vector
.. c:function:: void glm_vec_sub(vec3 v1, vec3 v2, vec3 dest)
.. c:function:: void glm_vec3_adds(vec3 a, float s, vec3 dest)
subtract v2 vector from v1 vector store result in dest
add scalar to v vector store result in dest (d = v + vec(s))
Parameters:
| *[in]* **v1** vector1
| *[in]* **v2** vector2
| *[in]* **v** vector
| *[in]* **s** scalar
| *[out]* **dest** destination vector
.. c:function:: void glm_vec_scale(vec3 v, float s, vec3 dest)
.. c:function:: void glm_vec3_sub(vec3 v1, vec3 v2, vec3 dest)
subtract b vector from a vector store result in dest (d = v1 - v2)
Parameters:
| *[in]* **a** vector1
| *[in]* **b** vector2
| *[out]* **dest** destination vector
.. c:function:: void glm_vec3_subs(vec3 v, float s, vec3 dest)
subtract scalar from v vector store result in dest (d = v - vec(s))
Parameters:
| *[in]* **v** vector
| *[in]* **s** scalar
| *[out]* **dest** destination vector
.. c:function:: void glm_vec3_mul(vec3 a, vec3 b, vec3 d)
multiply two vector (component-wise multiplication)
Parameters:
| *[in]* **a** vector
| *[in]* **b** scalar
| *[out]* **d** result = (a[0] * b[0], a[1] * b[1], a[2] * b[2])
.. c:function:: void glm_vec3_scale(vec3 v, float s, vec3 dest)
multiply/scale vec3 vector with scalar: result = v * s
@@ -145,7 +219,7 @@ Functions documentation
| *[in]* **s** scalar
| *[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
@@ -154,44 +228,145 @@ Functions documentation
| *[in]* **s** scalar
| *[out]* **dest** destination vector
.. c:function:: void glm_vec_flipsign(vec3 v)
.. c:function:: void glm_vec3_div(vec3 a, vec3 b, vec3 dest)
flip sign of all vec3 members
div vector with another component-wise division: d = a / b
Parameters:
| *[in]* **a** vector 1
| *[in]* **b** vector 2
| *[out]* **dest** result = (a[0] / b[0], a[1] / b[1], a[2] / b[2])
.. c:function:: void glm_vec3_divs(vec3 v, float s, vec3 dest)
div vector with scalar: d = v / s
Parameters:
| *[in]* **v** vector
| *[in]* **s** scalar
| *[out]* **dest** result = (a[0] / s, a[1] / s, a[2] / s])
.. c:function:: void glm_vec3_addadd(vec3 a, vec3 b, vec3 dest)
| add two vectors and add result to sum
| it applies += operator so dest must be initialized
Parameters:
| *[in]* **a** vector 1
| *[in]* **b** vector 2
| *[out]* **dest** dest += (a + b)
.. c:function:: void glm_vec3_subadd(vec3 a, vec3 b, vec3 dest)
| sub two vectors and add result to sum
| it applies += operator so dest must be initialized
Parameters:
| *[in]* **a** vector 1
| *[in]* **b** vector 2
| *[out]* **dest** dest += (a - b)
.. c:function:: void glm_vec3_muladd(vec3 a, vec3 b, vec3 dest)
| mul two vectors and add result to sum
| it applies += operator so dest must be initialized
Parameters:
| *[in]* **a** vector 1
| *[in]* **b** vector 2
| *[out]* **dest** dest += (a * b)
.. c:function:: void glm_vec3_muladds(vec3 a, float s, vec3 dest)
| mul vector with scalar and add result to sum
| it applies += operator so dest must be initialized
Parameters:
| *[in]* **a** vector
| *[in]* **s** scalar
| *[out]* **dest** dest += (a * b)
.. c:function:: void glm_vec3_maxadd(vec3 a, vec3 b, vec3 dest)
| add max of two vector to result/dest
| it applies += operator so dest must be initialized
Parameters:
| *[in]* **a** vector 1
| *[in]* **b** vector 2
| *[out]* **dest** dest += (a * b)
.. c:function:: void glm_vec3_minadd(vec3 a, vec3 b, vec3 dest)
| add min of two vector to result/dest
| it applies += operator so dest must be initialized
Parameters:
| *[in]* **a** vector 1
| *[in]* **b** vector 2
| *[out]* **dest** dest += (a * b)
.. c:function:: void glm_vec3_flipsign(vec3 v)
**DEPRACATED!**
use :c:func:`glm_vec3_negate`
Parameters:
| *[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:
| *[in]* **v** 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:
| *[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:
| *[in]* **v** source
| *[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
Parameters:
| *[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
@@ -199,7 +374,7 @@ Functions documentation
| *[in]* **vec** source
| *[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
@@ -210,16 +385,16 @@ Functions documentation
Return:
| 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
Parameters:
| *[in, out]* **v** vector
| *[in]* **axis** axis vector (will be normalized)
| *[out]* **angle** angle (radians)
| *[in]* **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
@@ -228,7 +403,16 @@ Functions documentation
| *[in]* **v** vector
| *[out]* **dest** rotated vector
.. c:function:: void glm_vec_proj(vec3 a, vec3 b, vec3 dest)
.. c:function:: void glm_vec3_rotate_m3(mat3 m, vec3 v, vec3 dest)
apply rotation matrix to vector
Parameters:
| *[in]* **m** affine matrix or rot matrix
| *[in]* **v** vector
| *[out]* **dest** rotated vector
.. c:function:: void glm_vec3_proj(vec3 a, vec3 b, vec3 dest)
project a vector onto b vector
@@ -237,7 +421,7 @@ Functions documentation
| *[in]* **b** vector2
| *[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
@@ -246,18 +430,29 @@ Functions documentation
| *[in]* **v2** vector2
| *[out]* **dest** center point
.. c:function:: float glm_vec_distance(vec3 v1, vec3 v2)
.. c:function:: float glm_vec3_distance2(vec3 v1, vec3 v2)
squared distance between two vectors
Parameters:
| *[in]* **v1** vector1
| *[in]* **v2** vector2
Returns:
| squared distance (distance * distance)
.. c:function:: float glm_vec3_distance(vec3 v1, vec3 v2)
distance between two vectors
Parameters:
| *[in]* **mat** vector1
| *[in]* **row1** vector2
| *[in]* **v1** vector1
| *[in]* **v2** vector2
Returns:
| 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
@@ -266,7 +461,7 @@ Functions documentation
| *[in]* **v2** vector2
| *[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
@@ -275,15 +470,18 @@ Functions documentation
| *[in]* **v2** vector2
| *[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
References:
* `On picking an orthogonal vector (and combing coconuts) <http://lolengine.net/blog/2013/09/21/picking-orthogonal-vector-combing-coconuts>`_
Parameters:
| *[in]* **mat** vector
| *[in]* **v** 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
@@ -292,7 +490,7 @@ Functions documentation
| *[in]* **minVal** minimum 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

View File

@@ -24,17 +24,33 @@ Functions:
1. :c:func:`glm_vec4`
#. :c:func:`glm_vec4_copy3`
#. :c:func:`glm_vec4_copy`
#. :c:func:`glm_vec4_ucopy`
#. :c:func:`glm_vec4_zero`
#. :c:func:`glm_vec4_one`
#. :c:func:`glm_vec4_dot`
#. :c:func:`glm_vec4_norm2`
#. :c:func:`glm_vec4_norm`
#. :c:func:`glm_vec4_add`
#. :c:func:`glm_vec4_adds`
#. :c:func:`glm_vec4_sub`
#. :c:func:`glm_vec4_subs`
#. :c:func:`glm_vec4_mul`
#. :c:func:`glm_vec4_scale`
#. :c:func:`glm_vec4_scale_as`
#. :c:func:`glm_vec4_div`
#. :c:func:`glm_vec4_divs`
#. :c:func:`glm_vec4_addadd`
#. :c:func:`glm_vec4_subadd`
#. :c:func:`glm_vec4_muladd`
#. :c:func:`glm_vec4_muladds`
#. :c:func:`glm_vec4_maxadd`
#. :c:func:`glm_vec4_minadd`
#. :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_to`
#. :c:func:`glm_vec4_negate`
#. :c:func:`glm_vec4_negate_to`
#. :c:func:`glm_vec4_normalize`
#. :c:func:`glm_vec4_normalize_to`
#. :c:func:`glm_vec4_distance`
@@ -42,11 +58,7 @@ Functions:
#. :c:func:`glm_vec4_minv`
#. :c:func:`glm_vec4_clamp`
#. :c:func:`glm_vec4_lerp`
#. :c:func:`glm_vec4_isnan`
#. :c:func:`glm_vec4_isinf`
#. :c:func:`glm_vec4_isvalid`
#. :c:func:`glm_vec4_sign`
#. :c:func:`glm_vec4_sqrt`
#. :c:func:`glm_vec4_cubic`
Functions documentation
~~~~~~~~~~~~~~~~~~~~~~~
@@ -78,6 +90,23 @@ Functions documentation
| *[in]* **v** source
| *[in]* **dest** destination
.. c:function:: void glm_vec4_ucopy(vec4 v, vec4 dest)
copy all members of [a] to [dest]
| alignment is not required
Parameters:
| *[in]* **v** source
| *[in]* **dest** destination
.. c:function:: void glm_vec4_zero(vec4 v)
makes all members zero
Parameters:
| *[in, out]* **v** vector
.. c:function:: float glm_vec4_dot(vec4 a, vec4 b)
dot product of vec4
@@ -105,29 +134,57 @@ Functions documentation
.. c:function:: float glm_vec4_norm(vec4 vec)
norm (magnitude) of vec4
| euclidean norm (magnitude), also called L2 norm
| this will give magnitude of vector in euclidean space
Parameters:
| *[in]* **vec** vector
.. c:function:: void glm_vec4_add(vec4 v1, vec4 v2, vec4 dest)
.. c:function:: void glm_vec4_add(vec4 a, vec4 b, vec4 dest)
add v2 vector to v1 vector store result in dest
add a vector to b vector store result in dest
Parameters:
| *[in]* **v1** vector1
| *[in]* **v2** vector2
| *[in]* **a** vector1
| *[in]* **b** vector2
| *[out]* **dest** destination vector
.. c:function:: void glm_vec4_sub(vec4 v1, vec4 v2, vec4 dest)
.. c:function:: void glm_vec4_adds(vec4 v, float s, vec4 dest)
subtract v2 vector from v1 vector store result in dest
add scalar to v vector store result in dest (d = v + vec(s))
Parameters:
| *[in]* **v1** vector1
| *[in]* **v2** vector2
| *[in]* **v** vector
| *[in]* **s** scalar
| *[out]* **dest** destination vector
.. c:function:: void glm_vec4_sub(vec4 a, vec4 b, vec4 dest)
subtract b vector from a vector store result in dest (d = v1 - v2)
Parameters:
| *[in]* **a** vector1
| *[in]* **b** vector2
| *[out]* **dest** destination vector
.. c:function:: void glm_vec4_subs(vec4 v, float s, vec4 dest)
subtract scalar from v vector store result in dest (d = v - vec(s))
Parameters:
| *[in]* **v** vector
| *[in]* **s** scalar
| *[out]* **dest** destination vector
.. c:function:: void glm_vec4_mul(vec4 a, vec4 b, vec4 d)
multiply two vector (component-wise multiplication)
Parameters:
| *[in]* **a** vector1
| *[in]* **b** vector2
| *[out]* **dest** result = (a[0] * b[0], a[1] * b[1], a[2] * b[2], a[3] * b[3])
.. c:function:: void glm_vec4_scale(vec4 v, float s, vec4 dest)
multiply/scale vec4 vector with scalar: result = v * s
@@ -146,16 +203,98 @@ Functions documentation
| *[in]* **s** scalar
| *[out]* **dest** destination vector
.. c:function:: void glm_vec4_div(vec4 a, vec4 b, vec4 dest)
div vector with another component-wise division: d = v1 / v2
Parameters:
| *[in]* **a** vector1
| *[in]* **b** vector2
| *[out]* **dest** result = (a[0] / b[0], a[1] / b[1], a[2] / b[2], a[3] / b[3])
.. c:function:: void glm_vec4_divs(vec4 v, float s, vec4 dest)
div vector with scalar: d = v / s
Parameters:
| *[in]* **v** vector
| *[in]* **s** scalar
| *[out]* **dest** result = (a[0] / s, a[1] / s, a[2] / s, a[3] / s)
.. c:function:: void glm_vec4_addadd(vec4 a, vec4 b, vec4 dest)
| add two vectors and add result to sum
| it applies += operator so dest must be initialized
Parameters:
| *[in]* **a** vector 1
| *[in]* **b** vector 2
| *[out]* **dest** dest += (a + b)
.. c:function:: void glm_vec4_subadd(vec4 a, vec4 b, vec4 dest)
| sub two vectors and add result to sum
| it applies += operator so dest must be initialized
Parameters:
| *[in]* **a** vector 1
| *[in]* **b** vector 2
| *[out]* **dest** dest += (a - b)
.. c:function:: void glm_vec4_muladd(vec4 a, vec4 b, vec4 dest)
| mul two vectors and add result to sum
| it applies += operator so dest must be initialized
Parameters:
| *[in]* **a** vector 1
| *[in]* **b** vector 2
| *[out]* **dest** dest += (a * b)
.. c:function:: void glm_vec4_muladds(vec4 a, float s, vec4 dest)
| mul vector with scalar and add result to sum
| it applies += operator so dest must be initialized
Parameters:
| *[in]* **a** vector
| *[in]* **s** scalar
| *[out]* **dest** dest += (a * b)
.. c:function:: void glm_vec4_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)
flip sign of all vec4 members
**DEPRACATED!**
use :c:func:`glm_vec4_negate`
Parameters:
| *[in, out]* **v** vector
.. c:function:: void glm_vec4_flipsign_to(vec4 v, vec4 dest)
flip sign of all vec4 members and store result in dest
**DEPRACATED!**
use :c:func:`glm_vec4_negate_to`
Parameters:
| *[in]* **v** vector
@@ -163,19 +302,38 @@ Functions documentation
.. c:function:: void glm_vec4_inv(vec4 v)
make vector as inverse/opposite of itself
**DEPRACATED!**
use :c:func:`glm_vec4_negate`
Parameters:
| *[in, out]* **v** vector
.. c:function:: void glm_vec4_inv_to(vec4 v, vec4 dest)
inverse/opposite vector
**DEPRACATED!**
use :c:func:`glm_vec4_negate_to`
Parameters:
| *[in]* **v** source
| *[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)
normalize vec4 and store result in same vec
@@ -240,3 +398,11 @@ Functions documentation
| *[in]* **to** to value
| *[in]* **t** interpolant (amount) clamped between 0 and 1
| *[out]* **dest** destination
.. c:function:: void glm_vec4_cubic(float s, vec4 dest)
helper to fill vec4 as [S^3, S^2, S, 1]
Parameters:
| *[in]* **s** parameter
| *[out]* **dest** destination

15
docs/source/version.rst Normal file
View File

@@ -0,0 +1,15 @@
.. default-domain:: C
version
================================================================================
Header: cglm/version.h
**cglm** uses semantic versioning (http://semver.org) which is MAJOR.MINOR.PATCH
| **CGLM_VERSION_MAJOR** is major number of the version.
| **CGLM_VERSION_MINOR** is minor number of the version.
| **CGLM_VERSION_PATCH** is patch number of the version.
every release increases these numbers. You can check existing version by
including `cglm/version.h`

View File

@@ -16,6 +16,7 @@
#include "common.h"
#include "mat4.h"
#include "mat3.h"
#ifdef CGLM_SSE_FP
# include "simd/sse2/affine.h"
@@ -25,6 +26,10 @@
# include "simd/avx/affine.h"
#endif
#ifdef CGLM_NEON_FP
# include "simd/neon/affine.h"
#endif
/*!
* @brief this is similar to glm_mat4_mul but specialized to affine transform
*
@@ -48,6 +53,8 @@ glm_mul(mat4 m1, mat4 m2, mat4 dest) {
glm_mul_avx(m1, m2, dest);
#elif defined( __SSE__ ) || defined( __SSE2__ )
glm_mul_sse2(m1, m2, dest);
#elif defined(CGLM_NEON_FP)
glm_mul_neon(m1, m2, dest);
#else
float a00 = m1[0][0], a01 = m1[0][1], a02 = m1[0][2], a03 = m1[0][3],
a10 = m1[1][0], a11 = m1[1][1], a12 = m1[1][2], a13 = m1[1][3],
@@ -81,6 +88,61 @@ glm_mul(mat4 m1, mat4 m2, mat4 dest) {
#endif
}
/*!
* @brief this is similar to glm_mat4_mul but specialized to affine transform
*
* Right Matrix format should be:
* R R R 0
* R R R 0
* R R R 0
* 0 0 0 1
*
* this reduces some multiplications. It should be faster than mat4_mul.
* if you are not sure about matrix format then DON'T use this! use mat4_mul
*
* @param[in] m1 affine matrix 1
* @param[in] m2 affine matrix 2
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_mul_rot(mat4 m1, mat4 m2, mat4 dest) {
#if defined( __SSE__ ) || defined( __SSE2__ )
glm_mul_rot_sse2(m1, m2, dest);
#elif defined(CGLM_NEON_FP)
glm_mul_rot_neon(m1, m2, dest);
#else
float a00 = m1[0][0], a01 = m1[0][1], a02 = m1[0][2], a03 = m1[0][3],
a10 = m1[1][0], a11 = m1[1][1], a12 = m1[1][2], a13 = m1[1][3],
a20 = m1[2][0], a21 = m1[2][1], a22 = m1[2][2], a23 = m1[2][3],
a30 = m1[3][0], a31 = m1[3][1], a32 = m1[3][2], a33 = m1[3][3],
b00 = m2[0][0], b01 = m2[0][1], b02 = m2[0][2],
b10 = m2[1][0], b11 = m2[1][1], b12 = m2[1][2],
b20 = m2[2][0], b21 = m2[2][1], b22 = m2[2][2];
dest[0][0] = a00 * b00 + a10 * b01 + a20 * b02;
dest[0][1] = a01 * b00 + a11 * b01 + a21 * b02;
dest[0][2] = a02 * b00 + a12 * b01 + a22 * b02;
dest[0][3] = a03 * b00 + a13 * b01 + a23 * b02;
dest[1][0] = a00 * b10 + a10 * b11 + a20 * b12;
dest[1][1] = a01 * b10 + a11 * b11 + a21 * b12;
dest[1][2] = a02 * b10 + a12 * b11 + a22 * b12;
dest[1][3] = a03 * b10 + a13 * b11 + a23 * b12;
dest[2][0] = a00 * b20 + a10 * b21 + a20 * b22;
dest[2][1] = a01 * b20 + a11 * b21 + a21 * b22;
dest[2][2] = a02 * b20 + a12 * b21 + a22 * b22;
dest[2][3] = a03 * b20 + a13 * b21 + a23 * b22;
dest[3][0] = a30;
dest[3][1] = a31;
dest[3][2] = a32;
dest[3][3] = a33;
#endif
}
/*!
* @brief inverse orthonormal rotation + translation matrix (ridig-body)
*
@@ -96,9 +158,11 @@ void
glm_inv_tr(mat4 mat) {
#if defined( __SSE__ ) || defined( __SSE2__ )
glm_inv_tr_sse2(mat);
#elif defined(CGLM_NEON_FP)
glm_inv_tr_neon(mat);
#else
CGLM_ALIGN(16) mat3 r;
CGLM_ALIGN(16) vec3 t;
CGLM_ALIGN_MAT mat3 r;
CGLM_ALIGN(8) vec3 t;
/* rotate */
glm_mat4_pick3t(mat, r);
@@ -106,8 +170,8 @@ glm_inv_tr(mat4 mat) {
/* translate */
glm_mat3_mulv(r, mat[3], t);
glm_vec_flipsign(t);
glm_vec_copy(t, mat[3]);
glm_vec3_negate(t);
glm_vec3_copy(t, mat[3]);
#endif
}

View File

@@ -16,15 +16,14 @@
CGLM_INLINE void glm_scale_to(mat4 m, vec3 v, mat4 dest);
CGLM_INLINE void glm_scale_make(mat4 m, vec3 v);
CGLM_INLINE void glm_scale(mat4 m, vec3 v);
CGLM_INLINE void glm_scale1(mat4 m, float s);
CGLM_INLINE void glm_scale_uni(mat4 m, float s);
CGLM_INLINE void glm_rotate_x(mat4 m, float angle, mat4 dest);
CGLM_INLINE void glm_rotate_y(mat4 m, float angle, mat4 dest);
CGLM_INLINE void glm_rotate_z(mat4 m, float angle, mat4 dest);
CGLM_INLINE void glm_rotate_ndc_make(mat4 m, float angle, vec3 axis_ndc);
CGLM_INLINE void glm_rotate_make(mat4 m, float angle, vec3 axis);
CGLM_INLINE void glm_rotate_ndc(mat4 m, float angle, vec3 axis);
CGLM_INLINE void glm_rotate(mat4 m, float angle, vec3 axis);
CGLM_INLINE void glm_rotate_at(mat4 m, vec3 pivot, float angle, vec3 axis);
CGLM_INLINE void glm_rotate_atm(mat4 m, vec3 pivot, float angle, vec3 axis);
CGLM_INLINE void glm_decompose_scalev(mat4 m, vec3 s);
CGLM_INLINE bool glm_uniscaled(mat4 m);
CGLM_INLINE void glm_decompose_rs(mat4 m, mat4 r, vec3 s);
@@ -35,51 +34,11 @@
#define cglm_affine_h
#include "common.h"
#include "vec4.h"
#include "affine-mat.h"
#include "util.h"
/*!
* @brief translate existing transform matrix by v vector
* and store result in dest
*
* @param[in] m affine transfrom
* @param[in] v translate vector [x, y, z]
* @param[out] dest translated matrix
*/
CGLM_INLINE
void
glm_translate_to(mat4 m, vec3 v, mat4 dest) {
mat4 t = GLM_MAT4_IDENTITY_INIT;
#if defined( __SSE__ ) || defined( __SSE2__ )
_mm_store_ps(dest[3],
_mm_add_ps(_mm_add_ps(_mm_mul_ps(_mm_load_ps(t[0]),
_mm_set1_ps(v[0])),
_mm_mul_ps(_mm_load_ps(t[1]),
_mm_set1_ps(v[1]))),
_mm_add_ps(_mm_mul_ps(_mm_load_ps(t[2]),
_mm_set1_ps(v[2])),
_mm_load_ps(t[3]))))
;
_mm_store_ps(dest[0], _mm_load_ps(m[0]));
_mm_store_ps(dest[1], _mm_load_ps(m[1]));
_mm_store_ps(dest[2], _mm_load_ps(m[2]));
#else
vec4 v1, v2, v3;
glm_vec4_scale(t[0], v[0], v1);
glm_vec4_scale(t[1], v[1], v2);
glm_vec4_scale(t[2], v[2], v3);
glm_vec4_add(v1, t[3], t[3]);
glm_vec4_add(v2, t[3], t[3]);
glm_vec4_add(v3, t[3], t[3]);
glm__memcpy(float, dest, t, sizeof(mat4));
#endif
}
#include "vec3.h"
#include "vec4.h"
#include "mat4.h"
#include "affine-mat.h"
/*!
* @brief translate existing transform matrix by v vector
@@ -91,29 +50,42 @@ glm_translate_to(mat4 m, vec3 v, mat4 dest) {
CGLM_INLINE
void
glm_translate(mat4 m, vec3 v) {
#if defined( __SSE__ ) || defined( __SSE2__ )
_mm_store_ps(m[3],
_mm_add_ps(_mm_add_ps(_mm_mul_ps(_mm_load_ps(m[0]),
_mm_set1_ps(v[0])),
_mm_mul_ps(_mm_load_ps(m[1]),
_mm_set1_ps(v[1]))),
_mm_add_ps(_mm_mul_ps(_mm_load_ps(m[2]),
_mm_set1_ps(v[2])),
_mm_load_ps(m[3]))))
;
#if defined(CGLM_SIMD)
glmm_128 m0, m1, m2, m3;
m0 = glmm_load(m[0]);
m1 = glmm_load(m[1]);
m2 = glmm_load(m[2]);
m3 = glmm_load(m[3]);
glmm_store(m[3],
glmm_fmadd(m0, glmm_set1(v[0]),
glmm_fmadd(m1, glmm_set1(v[1]),
glmm_fmadd(m2, glmm_set1(v[2]), m3))));
#else
vec4 v1, v2, v3;
glm_vec4_scale(m[0], v[0], v1);
glm_vec4_scale(m[1], v[1], v2);
glm_vec4_scale(m[2], v[2], v3);
glm_vec4_add(v1, m[3], m[3]);
glm_vec4_add(v2, m[3], m[3]);
glm_vec4_add(v3, m[3], m[3]);
glm_vec4_muladds(m[0], v[0], m[3]);
glm_vec4_muladds(m[1], v[1], m[3]);
glm_vec4_muladds(m[2], v[2], m[3]);
#endif
}
/*!
* @brief translate existing transform matrix by v vector
* and store result in dest
*
* source matrix will remain same
*
* @param[in] m affine transfrom
* @param[in] v translate vector [x, y, z]
* @param[out] dest translated matrix
*/
CGLM_INLINE
void
glm_translate_to(mat4 m, vec3 v, mat4 dest) {
glm_mat4_copy(m, dest);
glm_translate(dest, v);
}
/*!
* @brief translate existing transform matrix by x factor
*
@@ -123,12 +95,8 @@ glm_translate(mat4 m, vec3 v) {
CGLM_INLINE
void
glm_translate_x(mat4 m, float x) {
#if defined( __SSE__ ) || defined( __SSE2__ )
_mm_store_ps(m[3],
_mm_add_ps(_mm_mul_ps(_mm_load_ps(m[0]),
_mm_set1_ps(x)),
_mm_load_ps(m[3])))
;
#if defined(CGLM_SIMD)
glmm_store(m[3], glmm_fmadd(glmm_load(m[0]), glmm_set1(x), glmm_load(m[3])));
#else
vec4 v1;
glm_vec4_scale(m[0], x, v1);
@@ -145,12 +113,8 @@ glm_translate_x(mat4 m, float x) {
CGLM_INLINE
void
glm_translate_y(mat4 m, float y) {
#if defined( __SSE__ ) || defined( __SSE2__ )
_mm_store_ps(m[3],
_mm_add_ps(_mm_mul_ps(_mm_load_ps(m[1]),
_mm_set1_ps(y)),
_mm_load_ps(m[3])))
;
#if defined(CGLM_SIMD)
glmm_store(m[3], glmm_fmadd(glmm_load(m[1]), glmm_set1(y), glmm_load(m[3])));
#else
vec4 v1;
glm_vec4_scale(m[1], y, v1);
@@ -167,12 +131,8 @@ glm_translate_y(mat4 m, float y) {
CGLM_INLINE
void
glm_translate_z(mat4 m, float z) {
#if defined( __SSE__ ) || defined( __SSE2__ )
_mm_store_ps(m[3],
_mm_add_ps(_mm_mul_ps(_mm_load_ps(m[2]),
_mm_set1_ps(z)),
_mm_load_ps(m[3])))
;
#if defined(CGLM_SIMD)
glmm_store(m[3], glmm_fmadd(glmm_load(m[2]), glmm_set1(z), glmm_load(m[3])));
#else
vec4 v1;
glm_vec4_scale(m[2], z, v1);
@@ -189,8 +149,8 @@ glm_translate_z(mat4 m, float z) {
CGLM_INLINE
void
glm_translate_make(mat4 m, vec3 v) {
mat4 t = GLM_MAT4_IDENTITY_INIT;
glm_translate_to(t, v, m);
glm_mat4_identity(m);
glm_vec3_copy(v, m[3]);
}
/*!
@@ -220,8 +180,10 @@ glm_scale_to(mat4 m, vec3 v, mat4 dest) {
CGLM_INLINE
void
glm_scale_make(mat4 m, vec3 v) {
mat4 t = GLM_MAT4_IDENTITY_INIT;
glm_scale_to(t, v, m);
glm_mat4_identity(m);
m[0][0] = v[0];
m[1][1] = v[1];
m[2][2] = v[2];
}
/*!
@@ -237,16 +199,6 @@ glm_scale(mat4 m, vec3 v) {
glm_scale_to(m, v, m);
}
/*!
* @brief DEPRECATED! Use glm_scale_uni
*/
CGLM_INLINE
void
glm_scale1(mat4 m, float s) {
vec3 v = { s, s, s };
glm_scale_to(m, v, m);
}
/*!
* @brief applies uniform scale to existing transform matrix v = [s, s, s]
* and stores result in same matrix
@@ -257,7 +209,7 @@ glm_scale1(mat4 m, float s) {
CGLM_INLINE
void
glm_scale_uni(mat4 m, float s) {
vec3 v = { s, s, s };
CGLM_ALIGN(8) vec3 v = { s, s, s };
glm_scale_to(m, v, m);
}
@@ -272,19 +224,18 @@ glm_scale_uni(mat4 m, float s) {
CGLM_INLINE
void
glm_rotate_x(mat4 m, float angle, mat4 dest) {
float cosVal;
float sinVal;
mat4 t = GLM_MAT4_IDENTITY_INIT;
CGLM_ALIGN_MAT mat4 t = GLM_MAT4_IDENTITY_INIT;
float c, s;
cosVal = cosf(angle);
sinVal = sinf(angle);
c = cosf(angle);
s = sinf(angle);
t[1][1] = cosVal;
t[1][2] = sinVal;
t[2][1] = -sinVal;
t[2][2] = cosVal;
t[1][1] = c;
t[1][2] = s;
t[2][1] = -s;
t[2][2] = c;
glm_mat4_mul(m, t, dest);
glm_mul_rot(m, t, dest);
}
/*!
@@ -298,19 +249,18 @@ glm_rotate_x(mat4 m, float angle, mat4 dest) {
CGLM_INLINE
void
glm_rotate_y(mat4 m, float angle, mat4 dest) {
float cosVal;
float sinVal;
mat4 t = GLM_MAT4_IDENTITY_INIT;
CGLM_ALIGN_MAT mat4 t = GLM_MAT4_IDENTITY_INIT;
float c, s;
cosVal = cosf(angle);
sinVal = sinf(angle);
c = cosf(angle);
s = sinf(angle);
t[0][0] = cosVal;
t[0][2] = -sinVal;
t[2][0] = sinVal;
t[2][2] = cosVal;
t[0][0] = c;
t[0][2] = -s;
t[2][0] = s;
t[2][2] = c;
glm_mat4_mul(m, t, dest);
glm_mul_rot(m, t, dest);
}
/*!
@@ -324,61 +274,18 @@ glm_rotate_y(mat4 m, float angle, mat4 dest) {
CGLM_INLINE
void
glm_rotate_z(mat4 m, float angle, mat4 dest) {
float cosVal;
float sinVal;
mat4 t = GLM_MAT4_IDENTITY_INIT;
cosVal = cosf(angle);
sinVal = sinf(angle);
t[0][0] = cosVal;
t[0][1] = sinVal;
t[1][0] = -sinVal;
t[1][1] = cosVal;
glm_mat4_mul(m, t, dest);
}
/*!
* @brief creates NEW rotation matrix by angle and axis
*
* this name may change in the future. axis must be is normalized
*
* @param[out] m affine transfrom
* @param[in] angle angle (radians)
* @param[in] axis_ndc normalized axis
*/
CGLM_INLINE
void
glm_rotate_ndc_make(mat4 m, float angle, vec3 axis_ndc) {
/* https://www.opengl.org/sdk/docs/man2/xhtml/glRotate.xml */
vec3 v, vs;
float c;
CGLM_ALIGN_MAT mat4 t = GLM_MAT4_IDENTITY_INIT;
float c, s;
c = cosf(angle);
s = sinf(angle);
glm_vec_scale(axis_ndc, 1.0f - c, v);
glm_vec_scale(axis_ndc, sinf(angle), vs);
t[0][0] = c;
t[0][1] = s;
t[1][0] = -s;
t[1][1] = c;
glm_vec_scale(axis_ndc, v[0], m[0]);
glm_vec_scale(axis_ndc, v[1], m[1]);
glm_vec_scale(axis_ndc, v[2], m[2]);
m[0][0] += c;
m[0][1] += vs[2];
m[0][2] -= vs[1];
m[1][0] -= vs[2];
m[1][1] += c;
m[1][2] += vs[0];
m[2][0] += vs[1];
m[2][1] -= vs[0];
m[2][2] += c;
m[0][3] = m[1][3] = m[2][3] = m[3][0] = m[3][1] = m[3][2] = 0.0f;
m[3][3] = 1.0f;
glm_mul_rot(m, t, dest);
}
/*!
@@ -393,53 +300,29 @@ glm_rotate_ndc_make(mat4 m, float angle, vec3 axis_ndc) {
CGLM_INLINE
void
glm_rotate_make(mat4 m, float angle, vec3 axis) {
vec3 axis_ndc;
CGLM_ALIGN(8) vec3 axisn, v, vs;
float c;
glm_vec_normalize_to(axis, axis_ndc);
glm_rotate_ndc_make(m, angle, axis_ndc);
c = cosf(angle);
glm_vec3_normalize_to(axis, axisn);
glm_vec3_scale(axisn, 1.0f - c, v);
glm_vec3_scale(axisn, sinf(angle), vs);
glm_vec3_scale(axisn, v[0], m[0]);
glm_vec3_scale(axisn, v[1], m[1]);
glm_vec3_scale(axisn, v[2], m[2]);
m[0][0] += c; m[1][0] -= vs[2]; m[2][0] += vs[1];
m[0][1] += vs[2]; m[1][1] += c; m[2][1] -= vs[0];
m[0][2] -= vs[1]; m[1][2] += vs[0]; m[2][2] += c;
m[0][3] = m[1][3] = m[2][3] = m[3][0] = m[3][1] = m[3][2] = 0.0f;
m[3][3] = 1.0f;
}
/*!
* @brief rotate existing transform matrix around Z axis by angle and axis
*
* this name may change in the future, axis must be normalized.
*
* @param[in, out] m affine transfrom
* @param[in] angle angle (radians)
* @param[in] axis_ndc normalized axis
*/
CGLM_INLINE
void
glm_rotate_ndc(mat4 m, float angle, vec3 axis_ndc) {
mat4 rot, tmp;
glm_rotate_ndc_make(rot, angle, axis_ndc);
glm_vec4_scale(m[0], rot[0][0], tmp[1]);
glm_vec4_scale(m[1], rot[0][1], tmp[0]);
glm_vec4_add(tmp[1], tmp[0], tmp[1]);
glm_vec4_scale(m[2], rot[0][2], tmp[0]);
glm_vec4_add(tmp[1], tmp[0], tmp[1]);
glm_vec4_scale(m[0], rot[1][0], tmp[2]);
glm_vec4_scale(m[1], rot[1][1], tmp[0]);
glm_vec4_add(tmp[2], tmp[0], tmp[2]);
glm_vec4_scale(m[2], rot[1][2], tmp[0]);
glm_vec4_add(tmp[2], tmp[0], tmp[2]);
glm_vec4_scale(m[0], rot[2][0], tmp[3]);
glm_vec4_scale(m[1], rot[2][1], tmp[0]);
glm_vec4_add(tmp[3], tmp[0], tmp[3]);
glm_vec4_scale(m[2], rot[2][2], tmp[0]);
glm_vec4_add(tmp[3], tmp[0], tmp[3]);
glm_vec4_copy(tmp[1], m[0]);
glm_vec4_copy(tmp[2], m[1]);
glm_vec4_copy(tmp[3], m[2]);
}
/*!
* @brief rotate existing transform matrix around Z axis by angle and axis
* @brief rotate existing transform matrix around given axis by angle
*
* @param[in, out] m affine transfrom
* @param[in] angle angle (radians)
@@ -448,10 +331,55 @@ glm_rotate_ndc(mat4 m, float angle, vec3 axis_ndc) {
CGLM_INLINE
void
glm_rotate(mat4 m, float angle, vec3 axis) {
vec3 axis_ndc;
CGLM_ALIGN_MAT mat4 rot;
glm_rotate_make(rot, angle, axis);
glm_mul_rot(m, rot, m);
}
glm_vec_normalize_to(axis, axis_ndc);
glm_rotate_ndc(m, angle, axis_ndc);
/*!
* @brief rotate existing transform
* around given axis by angle at given pivot point (rotation center)
*
* @param[in, out] m affine transfrom
* @param[in] pivot rotation center
* @param[in] angle angle (radians)
* @param[in] axis axis
*/
CGLM_INLINE
void
glm_rotate_at(mat4 m, vec3 pivot, float angle, vec3 axis) {
CGLM_ALIGN(8) vec3 pivotInv;
glm_vec3_negate_to(pivot, pivotInv);
glm_translate(m, pivot);
glm_rotate(m, angle, axis);
glm_translate(m, pivotInv);
}
/*!
* @brief creates NEW rotation matrix by angle and axis at given point
*
* this creates rotation matrix, it assumes you don't have a matrix
*
* this should work faster than glm_rotate_at because it reduces
* one glm_translate.
*
* @param[out] m affine transfrom
* @param[in] pivot rotation center
* @param[in] angle angle (radians)
* @param[in] axis axis
*/
CGLM_INLINE
void
glm_rotate_atm(mat4 m, vec3 pivot, float angle, vec3 axis) {
CGLM_ALIGN(8) vec3 pivotInv;
glm_vec3_negate_to(pivot, pivotInv);
glm_translate_make(m, pivot);
glm_rotate(m, angle, axis);
glm_translate(m, pivotInv);
}
/*!
@@ -463,13 +391,13 @@ glm_rotate(mat4 m, float angle, vec3 axis) {
CGLM_INLINE
void
glm_decompose_scalev(mat4 m, vec3 s) {
s[0] = glm_vec_norm(m[0]);
s[1] = glm_vec_norm(m[1]);
s[2] = glm_vec_norm(m[2]);
s[0] = glm_vec3_norm(m[0]);
s[1] = glm_vec3_norm(m[1]);
s[2] = glm_vec3_norm(m[2]);
}
/*!
* @brief returns true if matrix is uniform scaled. This is helpful for
* @brief returns true if matrix is uniform scaled. This is helpful for
* creating normal matrix.
*
* @param[in] m m
@@ -479,10 +407,9 @@ glm_decompose_scalev(mat4 m, vec3 s) {
CGLM_INLINE
bool
glm_uniscaled(mat4 m) {
vec3 s;
CGLM_ALIGN(8) vec3 s;
glm_decompose_scalev(m, s);
return glm_vec_eq_all(s);
return glm_vec3_eq_all(s);
}
/*!
@@ -496,31 +423,31 @@ glm_uniscaled(mat4 m) {
CGLM_INLINE
void
glm_decompose_rs(mat4 m, mat4 r, vec3 s) {
vec4 t = {0.0f, 0.0f, 0.0f, 1.0f};
vec3 v;
CGLM_ALIGN(16) vec4 t = {0.0f, 0.0f, 0.0f, 1.0f};
CGLM_ALIGN(8) vec3 v;
glm_vec4_copy(m[0], r[0]);
glm_vec4_copy(m[1], r[1]);
glm_vec4_copy(m[2], r[2]);
glm_vec4_copy(t, r[3]);
s[0] = glm_vec_norm(m[0]);
s[1] = glm_vec_norm(m[1]);
s[2] = glm_vec_norm(m[2]);
s[0] = glm_vec3_norm(m[0]);
s[1] = glm_vec3_norm(m[1]);
s[2] = glm_vec3_norm(m[2]);
glm_vec4_scale(r[0], 1.0f/s[0], r[0]);
glm_vec4_scale(r[1], 1.0f/s[1], r[1]);
glm_vec4_scale(r[2], 1.0f/s[2], r[2]);
/* Note from Apple Open Source (asume that the matrix is orthonormal):
/* Note from Apple Open Source (assume that the matrix is orthonormal):
check for a coordinate system flip. If the determinant
is -1, then negate the matrix and the scaling factors. */
glm_vec_cross(m[0], m[1], v);
if (glm_vec_dot(v, m[2]) < 0.0f) {
glm_vec4_flipsign(r[0]);
glm_vec4_flipsign(r[1]);
glm_vec4_flipsign(r[2]);
glm_vec_flipsign(s);
glm_vec3_cross(m[0], m[1], v);
if (glm_vec3_dot(v, m[2]) < 0.0f) {
glm_vec4_negate(r[0]);
glm_vec4_negate(r[1]);
glm_vec4_negate(r[2]);
glm_vec3_negate(s);
}
}

268
include/cglm/affine2d.h Normal file
View File

@@ -0,0 +1,268 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
/*
Functions:
CGLM_INLINE void glm_translate2d(mat3 m, vec2 v)
CGLM_INLINE void glm_translate2d_to(mat3 m, vec2 v, mat3 dest)
CGLM_INLINE void glm_translate2d_x(mat3 m, float x)
CGLM_INLINE void glm_translate2d_y(mat3 m, float y)
CGLM_INLINE void glm_translate2d_make(mat3 m, vec2 v)
CGLM_INLINE void glm_scale2d_to(mat3 m, vec2 v, mat3 dest)
CGLM_INLINE void glm_scale2d_make(mat3 m, vec2 v)
CGLM_INLINE void glm_scale2d(mat3 m, vec2 v)
CGLM_INLINE void glm_scale2d_uni(mat3 m, float s)
CGLM_INLINE void glm_rotate2d_make(mat3 m, float angle)
CGLM_INLINE void glm_rotate2d(mat3 m, float angle)
CGLM_INLINE void glm_rotate2d_to(mat3 m, float angle, mat3 dest)
*/
#ifndef cglm_affine2d_h
#define cglm_affine2d_h
#include "common.h"
#include "util.h"
#include "vec2.h"
#include "mat3.h"
/*!
* @brief translate existing 2d transform matrix by v vector
* and stores result in same matrix
*
* @param[in, out] m affine transfrom
* @param[in] v translate vector [x, y]
*/
CGLM_INLINE
void
glm_translate2d(mat3 m, vec2 v) {
m[2][0] = m[0][0] * v[0] + m[1][0] * v[1] + m[2][0];
m[2][1] = m[0][1] * v[0] + m[1][1] * v[1] + m[2][1];
m[2][2] = m[0][2] * v[0] + m[1][2] * v[1] + m[2][2];
}
/*!
* @brief translate existing 2d transform matrix by v vector
* and store result in dest
*
* source matrix will remain same
*
* @param[in] m affine transfrom
* @param[in] v translate vector [x, y]
* @param[out] dest translated matrix
*/
CGLM_INLINE
void
glm_translate2d_to(mat3 m, vec2 v, mat3 dest) {
glm_mat3_copy(m, dest);
glm_translate2d(dest, v);
}
/*!
* @brief translate existing 2d transform matrix by x factor
*
* @param[in, out] m affine transfrom
* @param[in] x x factor
*/
CGLM_INLINE
void
glm_translate2d_x(mat3 m, float x) {
m[2][0] = m[0][0] * x + m[2][0];
m[2][1] = m[0][1] * x + m[2][1];
m[2][2] = m[0][2] * x + m[2][2];
}
/*!
* @brief translate existing 2d transform matrix by y factor
*
* @param[in, out] m affine transfrom
* @param[in] y y factor
*/
CGLM_INLINE
void
glm_translate2d_y(mat3 m, float y) {
m[2][0] = m[1][0] * y + m[2][0];
m[2][1] = m[1][1] * y + m[2][1];
m[2][2] = m[1][2] * y + m[2][2];
}
/*!
* @brief creates NEW translate 2d transform matrix by v vector
*
* @param[out] m affine transfrom
* @param[in] v translate vector [x, y]
*/
CGLM_INLINE
void
glm_translate2d_make(mat3 m, vec2 v) {
glm_mat3_identity(m);
m[2][0] = v[0];
m[2][1] = v[1];
}
/*!
* @brief scale existing 2d transform matrix by v vector
* and store result in dest
*
* @param[in] m affine transfrom
* @param[in] v scale vector [x, y]
* @param[out] dest scaled matrix
*/
CGLM_INLINE
void
glm_scale2d_to(mat3 m, vec2 v, mat3 dest) {
dest[0][0] = m[0][0] * v[0];
dest[0][1] = m[0][1] * v[0];
dest[0][2] = m[0][2] * v[0];
dest[1][0] = m[1][0] * v[1];
dest[1][1] = m[1][1] * v[1];
dest[1][2] = m[1][2] * v[1];
dest[2][0] = m[2][0];
dest[2][1] = m[2][1];
dest[2][2] = m[2][2];
}
/*!
* @brief creates NEW 2d scale matrix by v vector
*
* @param[out] m affine transfrom
* @param[in] v scale vector [x, y]
*/
CGLM_INLINE
void
glm_scale2d_make(mat3 m, vec2 v) {
glm_mat3_identity(m);
m[0][0] = v[0];
m[1][1] = v[1];
}
/*!
* @brief scales existing 2d transform matrix by v vector
* and stores result in same matrix
*
* @param[in, out] m affine transfrom
* @param[in] v scale vector [x, y]
*/
CGLM_INLINE
void
glm_scale2d(mat3 m, vec2 v) {
m[0][0] = m[0][0] * v[0];
m[0][1] = m[0][1] * v[0];
m[0][2] = m[0][2] * v[0];
m[1][0] = m[1][0] * v[1];
m[1][1] = m[1][1] * v[1];
m[1][2] = m[1][2] * v[1];
}
/*!
* @brief applies uniform scale to existing 2d transform matrix v = [s, s]
* and stores result in same matrix
*
* @param[in, out] m affine transfrom
* @param[in] s scale factor
*/
CGLM_INLINE
void
glm_scale2d_uni(mat3 m, float s) {
m[0][0] = m[0][0] * s;
m[0][1] = m[0][1] * s;
m[0][2] = m[0][2] * s;
m[1][0] = m[1][0] * s;
m[1][1] = m[1][1] * s;
m[1][2] = m[1][2] * s;
}
/*!
* @brief creates NEW rotation matrix by angle around Z axis
*
* @param[out] m affine transfrom
* @param[in] angle angle (radians)
*/
CGLM_INLINE
void
glm_rotate2d_make(mat3 m, float angle) {
float c, s;
s = sinf(angle);
c = cosf(angle);
m[0][0] = c;
m[0][1] = s;
m[0][2] = 0;
m[1][0] = -s;
m[1][1] = c;
m[1][2] = 0;
m[2][0] = 0.0f;
m[2][1] = 0.0f;
m[2][2] = 1.0f;
}
/*!
* @brief rotate existing 2d transform matrix around Z axis by angle
* and store result in same matrix
*
* @param[in, out] m affine transfrom
* @param[in] angle angle (radians)
*/
CGLM_INLINE
void
glm_rotate2d(mat3 m, float angle) {
float m00 = m[0][0], m10 = m[1][0],
m01 = m[0][1], m11 = m[1][1],
m02 = m[0][2], m12 = m[1][2];
float c, s;
s = sinf(angle);
c = cosf(angle);
m[0][0] = m00 * c + m10 * s;
m[0][1] = m01 * c + m11 * s;
m[0][2] = m02 * c + m12 * s;
m[1][0] = m00 * -s + m10 * c;
m[1][1] = m01 * -s + m11 * c;
m[1][2] = m02 * -s + m12 * c;
}
/*!
* @brief rotate existing 2d transform matrix around Z axis by angle
* and store result in dest
*
* @param[in] m affine transfrom
* @param[in] angle angle (radians)
* @param[out] dest destination
*/
CGLM_INLINE
void
glm_rotate2d_to(mat3 m, float angle, mat3 dest) {
float m00 = m[0][0], m10 = m[1][0],
m01 = m[0][1], m11 = m[1][1],
m02 = m[0][2], m12 = m[1][2];
float c, s;
s = sinf(angle);
c = cosf(angle);
dest[0][0] = m00 * c + m10 * s;
dest[0][1] = m01 * c + m11 * s;
dest[0][2] = m02 * c + m12 * s;
dest[1][0] = m00 * -s + m10 * c;
dest[1][1] = m01 * -s + m11 * c;
dest[1][2] = m02 * -s + m12 * c;
dest[2][0] = m[2][0];
dest[2][1] = m[2][1];
dest[2][2] = m[2][2];
}
#endif /* cglm_affine2d_h */

95
include/cglm/applesimd.h Normal file
View File

@@ -0,0 +1,95 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#ifndef cglm_applesimd_h
#define cglm_applesimd_h
#if defined(__APPLE__) \
&& defined(SIMD_COMPILER_HAS_REQUIRED_FEATURES) \
&& defined(SIMD_BASE) \
&& defined(SIMD_TYPES) \
&& defined(SIMD_VECTOR_TYPES)
#include "common.h"
/*!
* @brief converts mat4 to Apple's simd type simd_float4x4
* @return simd_float4x4
*/
CGLM_INLINE
simd_float4x4
glm_mat4_applesimd(mat4 m) {
simd_float4x4 t;
t.columns[0][0] = m[0][0];
t.columns[0][1] = m[0][1];
t.columns[0][2] = m[0][2];
t.columns[0][3] = m[0][3];
t.columns[1][0] = m[1][0];
t.columns[1][1] = m[1][1];
t.columns[1][2] = m[1][2];
t.columns[1][3] = m[1][3];
t.columns[2][0] = m[2][0];
t.columns[2][1] = m[2][1];
t.columns[2][2] = m[2][2];
t.columns[2][3] = m[2][3];
t.columns[3][0] = m[3][0];
t.columns[3][1] = m[3][1];
t.columns[3][2] = m[3][2];
t.columns[3][3] = m[3][3];
return t;
}
/*!
* @brief converts mat3 to Apple's simd type simd_float3x3
* @return simd_float3x3
*/
CGLM_INLINE
simd_float3x3
glm_mat3_applesimd(mat3 m) {
simd_float3x3 t;
t.columns[0][0] = m[0][0];
t.columns[0][1] = m[0][1];
t.columns[0][2] = m[0][2];
t.columns[1][0] = m[1][0];
t.columns[1][1] = m[1][1];
t.columns[1][2] = m[1][2];
t.columns[2][0] = m[2][0];
t.columns[2][1] = m[2][1];
t.columns[2][2] = m[2][2];
return t;
}
/*!
* @brief converts vec4 to Apple's simd type simd_float4
* @return simd_float4
*/
CGLM_INLINE
simd_float4
glm_vec4_applesimd(vec4 v) {
return (simd_float4){v[0], v[1], v[2], v[3]};
}
/*!
* @brief converts vec3 to Apple's simd type simd_float3
* @return v
*/
CGLM_INLINE
simd_float3
glm_vec3_applesimd(vec3 v) {
return (simd_float3){v[0], v[1], v[2]};
}
#endif
#endif /* cglm_applesimd_h */

154
include/cglm/bezier.h Normal file
View File

@@ -0,0 +1,154 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#ifndef cglm_bezier_h
#define cglm_bezier_h
#include "common.h"
#define GLM_BEZIER_MAT_INIT {{-1.0f, 3.0f, -3.0f, 1.0f}, \
{ 3.0f, -6.0f, 3.0f, 0.0f}, \
{-3.0f, 3.0f, 0.0f, 0.0f}, \
{ 1.0f, 0.0f, 0.0f, 0.0f}}
#define GLM_HERMITE_MAT_INIT {{ 2.0f, -3.0f, 0.0f, 1.0f}, \
{-2.0f, 3.0f, 0.0f, 0.0f}, \
{ 1.0f, -2.0f, 1.0f, 0.0f}, \
{ 1.0f, -1.0f, 0.0f, 0.0f}}
/* for C only */
#define GLM_BEZIER_MAT ((mat4)GLM_BEZIER_MAT_INIT)
#define GLM_HERMITE_MAT ((mat4)GLM_HERMITE_MAT_INIT)
#define CGLM_DECASTEL_EPS 1e-9f
#define CGLM_DECASTEL_MAX 1000.0f
#define CGLM_DECASTEL_SMALL 1e-20f
/*!
* @brief cubic bezier interpolation
*
* Formula:
* B(s) = P0*(1-s)^3 + 3*C0*s*(1-s)^2 + 3*C1*s^2*(1-s) + P1*s^3
*
* similar result using matrix:
* B(s) = glm_smc(t, GLM_BEZIER_MAT, (vec4){p0, c0, c1, p1})
*
* glm_eq(glm_smc(...), glm_bezier(...)) should return TRUE
*
* @param[in] s parameter between 0 and 1
* @param[in] p0 begin point
* @param[in] c0 control point 1
* @param[in] c1 control point 2
* @param[in] p1 end point
*
* @return B(s)
*/
CGLM_INLINE
float
glm_bezier(float s, float p0, float c0, float c1, float p1) {
float x, xx, ss, xs3, a;
x = 1.0f - s;
xx = x * x;
ss = s * s;
xs3 = (s - ss) * 3.0f;
a = p0 * xx + c0 * xs3;
return a + s * (c1 * xs3 + p1 * ss - a);
}
/*!
* @brief cubic hermite interpolation
*
* Formula:
* H(s) = P0*(2*s^3 - 3*s^2 + 1) + T0*(s^3 - 2*s^2 + s)
* + P1*(-2*s^3 + 3*s^2) + T1*(s^3 - s^2)
*
* similar result using matrix:
* H(s) = glm_smc(t, GLM_HERMITE_MAT, (vec4){p0, p1, c0, c1})
*
* glm_eq(glm_smc(...), glm_hermite(...)) should return TRUE
*
* @param[in] s parameter between 0 and 1
* @param[in] p0 begin point
* @param[in] t0 tangent 1
* @param[in] t1 tangent 2
* @param[in] p1 end point
*
* @return H(s)
*/
CGLM_INLINE
float
glm_hermite(float s, float p0, float t0, float t1, float p1) {
float ss, d, a, b, c, e, f;
ss = s * s;
a = ss + ss;
c = a + ss;
b = a * s;
d = s * ss;
f = d - ss;
e = b - c;
return p0 * (e + 1.0f) + t0 * (f - ss + s) + t1 * f - p1 * e;
}
/*!
* @brief iterative way to solve cubic equation
*
* @param[in] prm parameter between 0 and 1
* @param[in] p0 begin point
* @param[in] c0 control point 1
* @param[in] c1 control point 2
* @param[in] p1 end point
*
* @return parameter to use in cubic equation
*/
CGLM_INLINE
float
glm_decasteljau(float prm, float p0, float c0, float c1, float p1) {
float u, v, a, b, c, d, e, f;
int i;
if (prm - p0 < CGLM_DECASTEL_SMALL)
return 0.0f;
if (p1 - prm < CGLM_DECASTEL_SMALL)
return 1.0f;
u = 0.0f;
v = 1.0f;
for (i = 0; i < CGLM_DECASTEL_MAX; i++) {
/* de Casteljau Subdivision */
a = (p0 + c0) * 0.5f;
b = (c0 + c1) * 0.5f;
c = (c1 + p1) * 0.5f;
d = (a + b) * 0.5f;
e = (b + c) * 0.5f;
f = (d + e) * 0.5f; /* this one is on the curve! */
/* The curve point is close enough to our wanted t */
if (fabsf(f - prm) < CGLM_DECASTEL_EPS)
return glm_clamp_zo((u + v) * 0.5f);
/* dichotomy */
if (f < prm) {
p0 = f;
c0 = e;
c1 = c;
u = (u + v) * 0.5f;
} else {
c0 = a;
c1 = d;
p1 = f;
v = (u + v) * 0.5f;
}
}
return glm_clamp_zo((u + v) * 0.5f);
}
#endif /* cglm_bezier_h */

View File

@@ -11,6 +11,7 @@
#include "common.h"
#include "vec3.h"
#include "vec4.h"
#include "util.h"
/*!
* @brief apply transform to Axis-Aligned Bounding Box
@@ -22,35 +23,31 @@
CGLM_INLINE
void
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_vec_scale(m[0], box[1][0], xb);
glm_vec3_scale(m[0], box[0][0], xa);
glm_vec3_scale(m[0], box[1][0], xb);
glm_vec_scale(m[1], box[0][1], ya);
glm_vec_scale(m[1], box[1][1], yb);
glm_vec3_scale(m[1], box[0][1], ya);
glm_vec3_scale(m[1], box[1][1], yb);
glm_vec_scale(m[2], box[0][2], za);
glm_vec_scale(m[2], box[1][2], zb);
glm_vec3_scale(m[2], box[0][2], za);
glm_vec3_scale(m[2], box[1][2], zb);
/* min(xa, xb) + min(ya, yb) + min(za, zb) + translation */
glm_vec_minv(xa, xb, v[0]);
glm_vec_minv(ya, yb, tmp);
glm_vec_add(v[0], tmp, v[0]);
glm_vec_minv(za, zb, tmp);
glm_vec_add(v[0], tmp, v[0]);
glm_vec_add(v[0], m[3], v[0]);
/* translation + min(xa, xb) + min(ya, yb) + min(za, zb) */
glm_vec3(m[3], v[0]);
glm_vec3_minadd(xa, xb, v[0]);
glm_vec3_minadd(ya, yb, v[0]);
glm_vec3_minadd(za, zb, v[0]);
/* max(xa, xb) + max(ya, yb) + max(za, zb) + translation */
glm_vec_maxv(xa, xb, v[1]);
glm_vec_maxv(ya, yb, tmp);
glm_vec_add(v[1], tmp, v[1]);
glm_vec_maxv(za, zb, tmp);
glm_vec_add(v[1], tmp, v[1]);
glm_vec_add(v[1], m[3], v[1]);
/* translation + max(xa, xb) + max(ya, yb) + max(za, zb) */
glm_vec3(m[3], v[1]);
glm_vec3_maxadd(xa, xb, v[1]);
glm_vec3_maxadd(ya, yb, v[1]);
glm_vec3_maxadd(za, zb, v[1]);
glm_vec_copy(v[0], dest[0]);
glm_vec_copy(v[1], dest[1]);
glm_vec3_copy(v[0], dest[0]);
glm_vec3_copy(v[1], dest[1]);
}
/*!
@@ -161,8 +158,8 @@ glm_aabb_frustum(vec3 box[2], vec4 planes[6]) {
CGLM_INLINE
void
glm_aabb_invalidate(vec3 box[2]) {
glm_vec_broadcast(FLT_MAX, box[0]);
glm_vec_broadcast(-FLT_MAX, box[1]);
glm_vec3_broadcast(FLT_MAX, box[0]);
glm_vec3_broadcast(-FLT_MAX, box[1]);
}
/*!
@@ -173,8 +170,8 @@ glm_aabb_invalidate(vec3 box[2]) {
CGLM_INLINE
bool
glm_aabb_isvalid(vec3 box[2]) {
return glm_vec_max(box[0]) != FLT_MAX
&& glm_vec_min(box[1]) != -FLT_MAX;
return glm_vec3_max(box[0]) != FLT_MAX
&& glm_vec3_min(box[1]) != -FLT_MAX;
}
/*!
@@ -185,7 +182,7 @@ glm_aabb_isvalid(vec3 box[2]) {
CGLM_INLINE
float
glm_aabb_size(vec3 box[2]) {
return glm_vec_distance(box[0], box[1]);
return glm_vec3_distance(box[0], box[1]);
}
/*!
@@ -199,4 +196,86 @@ glm_aabb_radius(vec3 box[2]) {
return glm_aabb_size(box) * 0.5f;
}
/*!
* @brief computes center point of AABB
*
* @param[in] box bounding box
* @param[out] dest center of bounding box
*/
CGLM_INLINE
void
glm_aabb_center(vec3 box[2], vec3 dest) {
glm_vec3_center(box[0], box[1], dest);
}
/*!
* @brief check if two AABB intersects
*
* @param[in] box bounding box
* @param[in] other other bounding box
*/
CGLM_INLINE
bool
glm_aabb_aabb(vec3 box[2], vec3 other[2]) {
return (box[0][0] <= other[1][0] && box[1][0] >= other[0][0])
&& (box[0][1] <= other[1][1] && box[1][1] >= other[0][1])
&& (box[0][2] <= other[1][2] && box[1][2] >= other[0][2]);
}
/*!
* @brief check if AABB intersects with sphere
*
* https://github.com/erich666/GraphicsGems/blob/master/gems/BoxSphere.c
* Solid Box - Solid Sphere test.
*
* Sphere Representation in cglm: [center.x, center.y, center.z, radii]
*
* @param[in] box solid bounding box
* @param[in] s solid sphere
*/
CGLM_INLINE
bool
glm_aabb_sphere(vec3 box[2], vec4 s) {
float dmin;
int a, b, c;
a = (s[0] < box[0][0]) + (s[0] > box[1][0]);
b = (s[1] < box[0][1]) + (s[1] > box[1][1]);
c = (s[2] < box[0][2]) + (s[2] > box[1][2]);
dmin = glm_pow2((s[0] - box[!(a - 1)][0]) * (a != 0))
+ glm_pow2((s[1] - box[!(b - 1)][1]) * (b != 0))
+ glm_pow2((s[2] - box[!(c - 1)][2]) * (c != 0));
return dmin <= glm_pow2(s[3]);
}
/*!
* @brief check if point is inside of AABB
*
* @param[in] box bounding box
* @param[in] point point
*/
CGLM_INLINE
bool
glm_aabb_point(vec3 box[2], vec3 point) {
return (point[0] >= box[0][0] && point[0] <= box[1][0])
&& (point[1] >= box[0][1] && point[1] <= box[1][1])
&& (point[2] >= box[0][2] && point[2] <= box[1][2]);
}
/*!
* @brief check if AABB contains other AABB
*
* @param[in] box bounding box
* @param[in] other other bounding box
*/
CGLM_INLINE
bool
glm_aabb_contains(vec3 box[2], vec3 other[2]) {
return (box[0][0] <= other[0][0] && box[1][0] >= other[1][0])
&& (box[0][1] <= other[0][1] && box[1][1] >= other[1][1])
&& (box[0][2] <= other[0][2] && box[1][2] >= other[1][2]);
}
#endif /* cglm_box_h */

View File

@@ -12,10 +12,12 @@ extern "C" {
#endif
#include "cglm.h"
#include "call/vec2.h"
#include "call/vec3.h"
#include "call/vec4.h"
#include "call/mat4.h"
#include "call/mat2.h"
#include "call/mat3.h"
#include "call/mat4.h"
#include "call/affine.h"
#include "call/cam.h"
#include "call/quat.h"
@@ -25,6 +27,12 @@ extern "C" {
#include "call/box.h"
#include "call/io.h"
#include "call/project.h"
#include "call/sphere.h"
#include "call/ease.h"
#include "call/curve.h"
#include "call/bezier.h"
#include "call/ray.h"
#include "call/affine2d.h"
#ifdef __cplusplus
}

View File

@@ -13,6 +13,10 @@ extern "C" {
#include "../cglm.h"
CGLM_EXPORT
void
glmc_translate_make(mat4 m, vec3 v);
CGLM_EXPORT
void
glmc_translate_to(mat4 m, vec3 v, mat4 dest);
@@ -33,6 +37,10 @@ CGLM_EXPORT
void
glmc_translate_z(mat4 m, float to);
CGLM_EXPORT
void
glmc_scale_make(mat4 m, vec3 v);
CGLM_EXPORT
void
glmc_scale_to(mat4 m, vec3 v, mat4 dest);
@@ -43,7 +51,7 @@ glmc_scale(mat4 m, vec3 v);
CGLM_EXPORT
void
glmc_scale1(mat4 m, float s);
glmc_scale_uni(mat4 m, float s);
CGLM_EXPORT
void
@@ -57,26 +65,30 @@ CGLM_EXPORT
void
glmc_rotate_z(mat4 m, float rad, mat4 dest);
CGLM_EXPORT
void
glmc_rotate_ndc_make(mat4 m, float angle, vec3 axis_ndc);
CGLM_EXPORT
void
glmc_rotate_make(mat4 m, float angle, vec3 axis);
CGLM_EXPORT
void
glmc_rotate_ndc(mat4 m, float angle, vec3 axis_ndc);
CGLM_EXPORT
void
glmc_rotate(mat4 m, float angle, vec3 axis);
CGLM_EXPORT
void
glmc_rotate_at(mat4 m, vec3 pivot, float angle, vec3 axis);
CGLM_EXPORT
void
glmc_rotate_atm(mat4 m, vec3 pivot, float angle, vec3 axis);
CGLM_EXPORT
void
glmc_decompose_scalev(mat4 m, vec3 s);
CGLM_EXPORT
bool
glmc_uniscaled(mat4 m);
CGLM_EXPORT
void
glmc_decompose_rs(mat4 m, mat4 r, vec3 s);
@@ -85,6 +97,20 @@ CGLM_EXPORT
void
glmc_decompose(mat4 m, vec4 t, mat4 r, vec3 s);
/* affine-mat */
CGLM_EXPORT
void
glmc_mul(mat4 m1, mat4 m2, mat4 dest);
CGLM_EXPORT
void
glmc_mul_rot(mat4 m1, mat4 m2, mat4 dest);
CGLM_EXPORT
void
glmc_inv_tr(mat4 mat);
#ifdef __cplusplus
}
#endif

View File

@@ -0,0 +1,67 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#ifndef cglmc_affine2d_h
#define cglmc_affine2d_h
#ifdef __cplusplus
extern "C" {
#endif
#include "../cglm.h"
CGLM_EXPORT
void
glmc_translate2d_make(mat3 m, vec2 v);
CGLM_EXPORT
void
glmc_translate2d_to(mat3 m, vec2 v, mat3 dest);
CGLM_EXPORT
void
glmc_translate2d(mat3 m, vec2 v);
CGLM_EXPORT
void
glmc_translate2d_x(mat3 m, float to);
CGLM_EXPORT
void
glmc_translate2d_y(mat3 m, float to);
CGLM_EXPORT
void
glmc_scale2d_to(mat3 m, vec2 v, mat3 dest);
CGLM_EXPORT
void
glmc_scale2d_make(mat3 m, vec2 v);
CGLM_EXPORT
void
glmc_scale2d(mat3 m, vec2 v);
CGLM_EXPORT
void
glmc_scale2d_uni(mat3 m, float s);
CGLM_EXPORT
void
glmc_rotate2d_make(mat3 m, float angle);
CGLM_EXPORT
void
glmc_rotate2d(mat3 m, float angle);
CGLM_EXPORT
void
glmc_rotate2d_to(mat3 m, float angle, mat3 dest);
#ifdef __cplusplus
}
#endif
#endif /* cglmc_affine2d_h */

View 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 */

View File

@@ -32,6 +32,46 @@ glmc_aabb_crop_until(vec3 box[2],
vec3 clampBox[2],
vec3 dest[2]);
CGLM_EXPORT
bool
glmc_aabb_frustum(vec3 box[2], vec4 planes[6]);
CGLM_EXPORT
void
glmc_aabb_invalidate(vec3 box[2]);
CGLM_EXPORT
bool
glmc_aabb_isvalid(vec3 box[2]);
CGLM_EXPORT
float
glmc_aabb_size(vec3 box[2]);
CGLM_EXPORT
float
glmc_aabb_radius(vec3 box[2]);
CGLM_EXPORT
void
glmc_aabb_center(vec3 box[2], vec3 dest);
CGLM_EXPORT
bool
glmc_aabb_aabb(vec3 box[2], vec3 other[2]);
CGLM_EXPORT
bool
glmc_aabb_point(vec3 box[2], vec3 point);
CGLM_EXPORT
bool
glmc_aabb_contains(vec3 box[2], vec3 other[2]);
CGLM_EXPORT
bool
glmc_aabb_sphere(vec3 box[2], vec4 s);
#ifdef __cplusplus
}
#endif

View File

@@ -15,31 +15,53 @@ extern "C" {
CGLM_EXPORT
void
glmc_frustum(float left,
float right,
float bottom,
float top,
float nearVal,
float farVal,
mat4 dest);
glmc_frustum(float left, float right,
float bottom, float top,
float nearZ, float farZ,
mat4 dest);
CGLM_EXPORT
void
glmc_ortho(float left,
float right,
float bottom,
float top,
float nearVal,
float farVal,
mat4 dest);
glmc_ortho(float left, float right,
float bottom, float top,
float nearZ, float farZ,
mat4 dest);
CGLM_EXPORT
void
glmc_perspective(float fovy,
float aspect,
float nearVal,
float farVal,
mat4 dest);
glmc_ortho_aabb(vec3 box[2], mat4 dest);
CGLM_EXPORT
void
glmc_ortho_aabb_p(vec3 box[2], float padding, mat4 dest);
CGLM_EXPORT
void
glmc_ortho_aabb_pz(vec3 box[2], float padding, mat4 dest);
CGLM_EXPORT
void
glmc_ortho_default(float aspect, mat4 dest);
CGLM_EXPORT
void
glmc_ortho_default_s(float aspect, float size, mat4 dest);
CGLM_EXPORT
void
glmc_perspective(float fovy, float aspect, float nearZ, float farZ, mat4 dest);
CGLM_EXPORT
void
glmc_persp_move_far(mat4 proj, float deltaFar);
CGLM_EXPORT
void
glmc_perspective_default(float aspect, mat4 dest);
CGLM_EXPORT
void
glmc_perspective_resize(float aspect, mat4 proj);
CGLM_EXPORT
void
@@ -53,6 +75,58 @@ CGLM_EXPORT
void
glmc_look_anyup(vec3 eye, vec3 dir, mat4 dest);
CGLM_EXPORT
void
glmc_persp_decomp(mat4 proj,
float * __restrict nearZ,
float * __restrict farZ,
float * __restrict top,
float * __restrict bottom,
float * __restrict left,
float * __restrict right);
CGLM_EXPORT
void
glmc_persp_decompv(mat4 proj, float dest[6]);
CGLM_EXPORT
void
glmc_persp_decomp_x(mat4 proj,
float * __restrict left,
float * __restrict right);
CGLM_EXPORT
void
glmc_persp_decomp_y(mat4 proj,
float * __restrict top,
float * __restrict bottom);
CGLM_EXPORT
void
glmc_persp_decomp_z(mat4 proj,
float * __restrict nearZ,
float * __restrict farZ);
CGLM_EXPORT
void
glmc_persp_decomp_far(mat4 proj, float * __restrict farZ);
CGLM_EXPORT
void
glmc_persp_decomp_near(mat4 proj, float * __restrict nearZ);
CGLM_EXPORT
float
glmc_persp_fovy(mat4 proj);
CGLM_EXPORT
float
glmc_persp_aspect(mat4 proj);
CGLM_EXPORT
void
glmc_persp_sizes(mat4 proj, float fovy, vec4 dest);
#ifdef __cplusplus
}
#endif

View File

@@ -0,0 +1,46 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#ifndef cglmc_ortho_lh_no_h
#define cglmc_ortho_lh_no_h
#ifdef __cplusplus
extern "C" {
#endif
#include "../../cglm.h"
CGLM_EXPORT
void
glmc_ortho_lh_no(float left, float right,
float bottom, float top,
float nearZ, float farZ,
mat4 dest);
CGLM_EXPORT
void
glmc_ortho_aabb_lh_no(vec3 box[2], mat4 dest);
CGLM_EXPORT
void
glmc_ortho_aabb_p_lh_no(vec3 box[2], float padding, mat4 dest);
CGLM_EXPORT
void
glmc_ortho_aabb_pz_lh_no(vec3 box[2], float padding, mat4 dest);
CGLM_EXPORT
void
glmc_ortho_default_lh_no(float aspect, mat4 dest);
CGLM_EXPORT
void
glmc_ortho_default_s_lh_no(float aspect, float size, mat4 dest);
#ifdef __cplusplus
}
#endif
#endif /* cglmc_ortho_lh_no_h */

View File

@@ -0,0 +1,46 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#ifndef cglmc_ortho_lh_zo_h
#define cglmc_ortho_lh_zo_h
#ifdef __cplusplus
extern "C" {
#endif
#include "../../cglm.h"
CGLM_EXPORT
void
glmc_ortho_lh_zo(float left, float right,
float bottom, float top,
float nearZ, float farZ,
mat4 dest);
CGLM_EXPORT
void
glmc_ortho_aabb_lh_zo(vec3 box[2], mat4 dest);
CGLM_EXPORT
void
glmc_ortho_aabb_p_lh_zo(vec3 box[2], float padding, mat4 dest);
CGLM_EXPORT
void
glmc_ortho_aabb_pz_lh_zo(vec3 box[2], float padding, mat4 dest);
CGLM_EXPORT
void
glmc_ortho_default_lh_zo(float aspect, mat4 dest);
CGLM_EXPORT
void
glmc_ortho_default_s_lh_zo(float aspect, float size, mat4 dest);
#ifdef __cplusplus
}
#endif
#endif /* cglmc_ortho_lh_zo_h */

View File

@@ -0,0 +1,46 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#ifndef cglmc_ortho_rh_no_h
#define cglmc_ortho_rh_no_h
#ifdef __cplusplus
extern "C" {
#endif
#include "../../cglm.h"
CGLM_EXPORT
void
glmc_ortho_rh_no(float left, float right,
float bottom, float top,
float nearZ, float farZ,
mat4 dest);
CGLM_EXPORT
void
glmc_ortho_aabb_rh_no(vec3 box[2], mat4 dest);
CGLM_EXPORT
void
glmc_ortho_aabb_p_rh_no(vec3 box[2], float padding, mat4 dest);
CGLM_EXPORT
void
glmc_ortho_aabb_pz_rh_no(vec3 box[2], float padding, mat4 dest);
CGLM_EXPORT
void
glmc_ortho_default_rh_no(float aspect, mat4 dest);
CGLM_EXPORT
void
glmc_ortho_default_s_rh_no(float aspect, float size, mat4 dest);
#ifdef __cplusplus
}
#endif
#endif /* cglmc_ortho_rh_no_h */

View File

@@ -0,0 +1,46 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#ifndef cglmc_ortho_rh_zo_h
#define cglmc_ortho_rh_zo_h
#ifdef __cplusplus
extern "C" {
#endif
#include "../../cglm.h"
CGLM_EXPORT
void
glmc_ortho_rh_zo(float left, float right,
float bottom, float top,
float nearZ, float farZ,
mat4 dest);
CGLM_EXPORT
void
glmc_ortho_aabb_rh_zo(vec3 box[2], mat4 dest);
CGLM_EXPORT
void
glmc_ortho_aabb_p_rh_zo(vec3 box[2], float padding, mat4 dest);
CGLM_EXPORT
void
glmc_ortho_aabb_pz_rh_zo(vec3 box[2], float padding, mat4 dest);
CGLM_EXPORT
void
glmc_ortho_default_rh_zo(float aspect, mat4 dest);
CGLM_EXPORT
void
glmc_ortho_default_s_rh_zo(float aspect, float size, mat4 dest);
#ifdef __cplusplus
}
#endif
#endif /* cglmc_ortho_rh_zo_h */

View File

@@ -0,0 +1,87 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#ifndef cglmc_persp_lh_no_h
#define cglmc_persp_lh_no_h
#ifdef __cplusplus
extern "C" {
#endif
#include "../../cglm.h"
CGLM_EXPORT
void
glmc_frustum_lh_no(float left, float right,
float bottom, float top,
float nearZ, float farZ,
mat4 dest);
CGLM_EXPORT
void
glmc_perspective_lh_no(float fovy,
float aspect,
float nearVal,
float farVal,
mat4 dest);
CGLM_EXPORT
void
glmc_persp_move_far_lh_no(mat4 proj, float deltaFar);
CGLM_EXPORT
void
glmc_persp_decomp_lh_no(mat4 proj,
float * __restrict nearZ, float * __restrict farZ,
float * __restrict top, float * __restrict bottom,
float * __restrict left, float * __restrict right);
CGLM_EXPORT
void
glmc_persp_decompv_lh_no(mat4 proj, float dest[6]);
CGLM_EXPORT
void
glmc_persp_decomp_x_lh_no(mat4 proj,
float * __restrict left,
float * __restrict right);
CGLM_EXPORT
void
glmc_persp_decomp_y_lh_no(mat4 proj,
float * __restrict top,
float * __restrict bottom);
CGLM_EXPORT
void
glmc_persp_decomp_z_lh_no(mat4 proj,
float * __restrict nearZ,
float * __restrict farZ);
CGLM_EXPORT
void
glmc_persp_decomp_far_lh_no(mat4 proj, float * __restrict farZ);
CGLM_EXPORT
void
glmc_persp_decomp_near_lh_no(mat4 proj, float * __restrict nearZ);
CGLM_EXPORT
void
glmc_persp_sizes_lh_no(mat4 proj, float fovy, vec4 dest);
CGLM_EXPORT
float
glmc_persp_fovy_lh_no(mat4 proj);
CGLM_EXPORT
float
glmc_persp_aspect_lh_no(mat4 proj);
#ifdef __cplusplus
}
#endif
#endif /* cglmc_persp_lh_no_h */

View File

@@ -0,0 +1,87 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#ifndef cglmc_persp_lh_zo_h
#define cglmc_persp_lh_zo_h
#ifdef __cplusplus
extern "C" {
#endif
#include "../../cglm.h"
CGLM_EXPORT
void
glmc_frustum_lh_zo(float left, float right,
float bottom, float top,
float nearZ, float farZ,
mat4 dest);
CGLM_EXPORT
void
glmc_perspective_lh_zo(float fovy,
float aspect,
float nearVal,
float farVal,
mat4 dest);
CGLM_EXPORT
void
glmc_persp_move_far_lh_zo(mat4 proj, float deltaFar);
CGLM_EXPORT
void
glmc_persp_decomp_lh_zo(mat4 proj,
float * __restrict nearZ, float * __restrict farZ,
float * __restrict top, float * __restrict bottom,
float * __restrict left, float * __restrict right);
CGLM_EXPORT
void
glmc_persp_decompv_lh_zo(mat4 proj, float dest[6]);
CGLM_EXPORT
void
glmc_persp_decomp_x_lh_zo(mat4 proj,
float * __restrict left,
float * __restrict right);
CGLM_EXPORT
void
glmc_persp_decomp_y_lh_zo(mat4 proj,
float * __restrict top,
float * __restrict bottom);
CGLM_EXPORT
void
glmc_persp_decomp_z_lh_zo(mat4 proj,
float * __restrict nearZ,
float * __restrict farZ);
CGLM_EXPORT
void
glmc_persp_decomp_far_lh_zo(mat4 proj, float * __restrict farZ);
CGLM_EXPORT
void
glmc_persp_decomp_near_lh_zo(mat4 proj, float * __restrict nearZ);
CGLM_EXPORT
void
glmc_persp_sizes_lh_zo(mat4 proj, float fovy, vec4 dest);
CGLM_EXPORT
float
glmc_persp_fovy_lh_zo(mat4 proj);
CGLM_EXPORT
float
glmc_persp_aspect_lh_zo(mat4 proj);
#ifdef __cplusplus
}
#endif
#endif /* cglmc_persp_lh_zo_h */

View File

@@ -0,0 +1,87 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#ifndef cglmc_persp_rh_no_h
#define cglmc_persp_rh_no_h
#ifdef __cplusplus
extern "C" {
#endif
#include "../../cglm.h"
CGLM_EXPORT
void
glmc_frustum_rh_no(float left, float right,
float bottom, float top,
float nearZ, float farZ,
mat4 dest);
CGLM_EXPORT
void
glmc_perspective_rh_no(float fovy,
float aspect,
float nearVal,
float farVal,
mat4 dest);
CGLM_EXPORT
void
glmc_persp_move_far_rh_no(mat4 proj, float deltaFar);
CGLM_EXPORT
void
glmc_persp_decomp_rh_no(mat4 proj,
float * __restrict nearZ, float * __restrict farZ,
float * __restrict top, float * __restrict bottom,
float * __restrict left, float * __restrict right);
CGLM_EXPORT
void
glmc_persp_decompv_rh_no(mat4 proj, float dest[6]);
CGLM_EXPORT
void
glmc_persp_decomp_x_rh_no(mat4 proj,
float * __restrict left,
float * __restrict right);
CGLM_EXPORT
void
glmc_persp_decomp_y_rh_no(mat4 proj,
float * __restrict top,
float * __restrict bottom);
CGLM_EXPORT
void
glmc_persp_decomp_z_rh_no(mat4 proj,
float * __restrict nearZ,
float * __restrict farZ);
CGLM_EXPORT
void
glmc_persp_decomp_far_rh_no(mat4 proj, float * __restrict farZ);
CGLM_EXPORT
void
glmc_persp_decomp_near_rh_no(mat4 proj, float * __restrict nearZ);
CGLM_EXPORT
void
glmc_persp_sizes_rh_no(mat4 proj, float fovy, vec4 dest);
CGLM_EXPORT
float
glmc_persp_fovy_rh_no(mat4 proj);
CGLM_EXPORT
float
glmc_persp_aspect_rh_no(mat4 proj);
#ifdef __cplusplus
}
#endif
#endif /* cglmc_persp_rh_no_h */

View File

@@ -0,0 +1,87 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#ifndef cglmc_persp_rh_zo_h
#define cglmc_persp_rh_zo_h
#ifdef __cplusplus
extern "C" {
#endif
#include "../../cglm.h"
CGLM_EXPORT
void
glmc_frustum_rh_zo(float left, float right,
float bottom, float top,
float nearZ, float farZ,
mat4 dest);
CGLM_EXPORT
void
glmc_perspective_rh_zo(float fovy,
float aspect,
float nearVal,
float farVal,
mat4 dest);
CGLM_EXPORT
void
glmc_persp_move_far_rh_zo(mat4 proj, float deltaFar);
CGLM_EXPORT
void
glmc_persp_decomp_rh_zo(mat4 proj,
float * __restrict nearZ, float * __restrict farZ,
float * __restrict top, float * __restrict bottom,
float * __restrict left, float * __restrict right);
CGLM_EXPORT
void
glmc_persp_decompv_rh_zo(mat4 proj, float dest[6]);
CGLM_EXPORT
void
glmc_persp_decomp_x_rh_zo(mat4 proj,
float * __restrict left,
float * __restrict right);
CGLM_EXPORT
void
glmc_persp_decomp_y_rh_zo(mat4 proj,
float * __restrict top,
float * __restrict bottom);
CGLM_EXPORT
void
glmc_persp_decomp_z_rh_zo(mat4 proj,
float * __restrict nearZ,
float * __restrict farZ);
CGLM_EXPORT
void
glmc_persp_decomp_far_rh_zo(mat4 proj, float * __restrict farZ);
CGLM_EXPORT
void
glmc_persp_decomp_near_rh_zo(mat4 proj, float * __restrict nearZ);
CGLM_EXPORT
void
glmc_persp_sizes_rh_zo(mat4 proj, float fovy, vec4 dest);
CGLM_EXPORT
float
glmc_persp_fovy_rh_zo(mat4 proj);
CGLM_EXPORT
float
glmc_persp_aspect_rh_zo(mat4 proj);
#ifdef __cplusplus
}
#endif
#endif /* cglmc_persp_rh_zo_h */

View 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
*/
#ifndef cglmc_project_no_h
#define cglmc_project_no_h
#ifdef __cplusplus
extern "C" {
#endif
#include "../../cglm.h"
CGLM_EXPORT
void
glmc_unprojecti_no(vec3 pos, mat4 invMat, vec4 vp, vec3 dest);
CGLM_EXPORT
void
glmc_project_no(vec3 pos, mat4 m, vec4 vp, vec3 dest);
#ifdef __cplusplus
}
#endif
#endif /* cglmc_project_no_h */

View 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
*/
#ifndef cglmc_project_zo_h
#define cglmc_project_zo_h
#ifdef __cplusplus
extern "C" {
#endif
#include "../../cglm.h"
CGLM_EXPORT
void
glmc_unprojecti_zo(vec3 pos, mat4 invMat, vec4 vp, vec3 dest);
CGLM_EXPORT
void
glmc_project_zo(vec3 pos, mat4 m, vec4 vp, vec3 dest);
#ifdef __cplusplus
}
#endif
#endif /* cglmc_project_zo_h */

View 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_view_lh_no_h
#define cglmc_view_lh_no_h
#ifdef __cplusplus
extern "C" {
#endif
#include "../../cglm.h"
CGLM_EXPORT
void
glmc_lookat_lh_no(vec3 eye, vec3 center, vec3 up, mat4 dest);
CGLM_EXPORT
void
glmc_look_lh_no(vec3 eye, vec3 dir, vec3 up, mat4 dest);
CGLM_EXPORT
void
glmc_look_anyup_lh_no(vec3 eye, vec3 dir, mat4 dest);
#ifdef __cplusplus
}
#endif
#endif /* cglmc_view_lh_no_h */

View 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_view_lh_zo_h
#define cglmc_view_lh_zo_h
#ifdef __cplusplus
extern "C" {
#endif
#include "../../cglm.h"
CGLM_EXPORT
void
glmc_lookat_lh_zo(vec3 eye, vec3 center, vec3 up, mat4 dest);
CGLM_EXPORT
void
glmc_look_lh_zo(vec3 eye, vec3 dir, vec3 up, mat4 dest);
CGLM_EXPORT
void
glmc_look_anyup_lh_zo(vec3 eye, vec3 dir, mat4 dest);
#ifdef __cplusplus
}
#endif
#endif /* cglmc_view_lh_zo_h */

View 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_view_rh_no_h
#define cglmc_view_rh_no_h
#ifdef __cplusplus
extern "C" {
#endif
#include "../../cglm.h"
CGLM_EXPORT
void
glmc_lookat_rh_no(vec3 eye, vec3 center, vec3 up, mat4 dest);
CGLM_EXPORT
void
glmc_look_rh_no(vec3 eye, vec3 dir, vec3 up, mat4 dest);
CGLM_EXPORT
void
glmc_look_anyup_rh_no(vec3 eye, vec3 dir, mat4 dest);
#ifdef __cplusplus
}
#endif
#endif /* cglmc_view_rh_no_h */

View 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_view_rh_zo_h
#define cglmc_view_rh_zo_h
#ifdef __cplusplus
extern "C" {
#endif
#include "../../cglm.h"
CGLM_EXPORT
void
glmc_lookat_rh_zo(vec3 eye, vec3 center, vec3 up, mat4 dest);
CGLM_EXPORT
void
glmc_look_rh_zo(vec3 eye, vec3 dir, vec3 up, mat4 dest);
CGLM_EXPORT
void
glmc_look_anyup_rh_zo(vec3 eye, vec3 dir, mat4 dest);
#ifdef __cplusplus
}
#endif
#endif /* cglmc_view_rh_zo_h */

23
include/cglm/call/curve.h Normal file
View 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 */

143
include/cglm/call/ease.h Normal file
View File

@@ -0,0 +1,143 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#ifndef cglmc_ease_h
#define cglmc_ease_h
#ifdef __cplusplus
extern "C" {
#endif
#include "../cglm.h"
CGLM_EXPORT
float
glmc_ease_linear(float t);
CGLM_EXPORT
float
glmc_ease_sine_in(float t);
CGLM_EXPORT
float
glmc_ease_sine_out(float t);
CGLM_EXPORT
float
glmc_ease_sine_inout(float t);
CGLM_EXPORT
float
glmc_ease_quad_in(float t);
CGLM_EXPORT
float
glmc_ease_quad_out(float t);
CGLM_EXPORT
float
glmc_ease_quad_inout(float t);
CGLM_EXPORT
float
glmc_ease_cubic_in(float t);
CGLM_EXPORT
float
glmc_ease_cubic_out(float t);
CGLM_EXPORT
float
glmc_ease_cubic_inout(float t);
CGLM_EXPORT
float
glmc_ease_quart_in(float t);
CGLM_EXPORT
float
glmc_ease_quart_out(float t);
CGLM_EXPORT
float
glmc_ease_quart_inout(float t);
CGLM_EXPORT
float
glmc_ease_quint_in(float t);
CGLM_EXPORT
float
glmc_ease_quint_out(float t);
CGLM_EXPORT
float
glmc_ease_quint_inout(float t);
CGLM_EXPORT
float
glmc_ease_exp_in(float t);
CGLM_EXPORT
float
glmc_ease_exp_out(float t);
CGLM_EXPORT
float
glmc_ease_exp_inout(float t);
CGLM_EXPORT
float
glmc_ease_circ_in(float t);
CGLM_EXPORT
float
glmc_ease_circ_out(float t);
CGLM_EXPORT
float
glmc_ease_circ_inout(float t);
CGLM_EXPORT
float
glmc_ease_back_in(float t);
CGLM_EXPORT
float
glmc_ease_back_out(float t);
CGLM_EXPORT
float
glmc_ease_back_inout(float t);
CGLM_EXPORT
float
glmc_ease_elast_in(float t);
CGLM_EXPORT
float
glmc_ease_elast_out(float t);
CGLM_EXPORT
float
glmc_ease_elast_inout(float t);
CGLM_EXPORT
float
glmc_ease_bounce_out(float t);
CGLM_EXPORT
float
glmc_ease_bounce_in(float t);
CGLM_EXPORT
float
glmc_ease_bounce_inout(float t);
#ifdef __cplusplus
}
#endif
#endif /* cglmc_ease_h */

View File

@@ -47,7 +47,7 @@ glmc_euler_yxz(vec3 angles, mat4 dest);
CGLM_EXPORT
void
glmc_euler_by_order(vec3 angles, glm_euler_sq axis, mat4 dest);
glmc_euler_by_order(vec3 angles, glm_euler_seq axis, mat4 dest);
#ifdef __cplusplus
}

View File

@@ -7,6 +7,7 @@
#ifndef cglmc_io_h
#define cglmc_io_h
#ifdef __cplusplus
extern "C" {
#endif

79
include/cglm/call/mat2.h Normal file
View File

@@ -0,0 +1,79 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#ifndef cglmc_mat2_h
#define cglmc_mat2_h
#ifdef __cplusplus
extern "C" {
#endif
#include "../cglm.h"
CGLM_EXPORT
void
glmc_mat2_copy(mat2 mat, mat2 dest);
CGLM_EXPORT
void
glmc_mat2_identity(mat2 mat);
CGLM_EXPORT
void
glmc_mat2_identity_array(mat2 * __restrict mat, size_t count);
CGLM_EXPORT
void
glmc_mat2_zero(mat2 mat);
CGLM_EXPORT
void
glmc_mat2_mul(mat2 m1, mat2 m2, mat2 dest);
CGLM_EXPORT
void
glmc_mat2_transpose_to(mat2 m, mat2 dest);
CGLM_EXPORT
void
glmc_mat2_transpose(mat2 m);
CGLM_EXPORT
void
glmc_mat2_mulv(mat2 m, vec2 v, vec2 dest);
CGLM_EXPORT
float
glmc_mat2_trace(mat2 m);
CGLM_EXPORT
void
glmc_mat2_scale(mat2 m, float s);
CGLM_EXPORT
float
glmc_mat2_det(mat2 mat);
CGLM_EXPORT
void
glmc_mat2_inv(mat2 mat, mat2 dest);
CGLM_EXPORT
void
glmc_mat2_swap_col(mat2 mat, int col1, int col2);
CGLM_EXPORT
void
glmc_mat2_swap_row(mat2 mat, int row1, int row2);
CGLM_EXPORT
float
glmc_mat2_rmc(vec2 r, mat2 m, vec2 c);
#ifdef __cplusplus
}
#endif
#endif /* cglmc_mat2_h */

View File

@@ -24,6 +24,14 @@ CGLM_EXPORT
void
glmc_mat3_identity(mat3 mat);
CGLM_EXPORT
void
glmc_mat3_zero(mat3 mat);
CGLM_EXPORT
void
glmc_mat3_identity_array(mat3 * __restrict mat, size_t count);
CGLM_EXPORT
void
glmc_mat3_mul(mat3 m1, mat3 m2, mat3 dest);
@@ -40,6 +48,14 @@ CGLM_EXPORT
void
glmc_mat3_mulv(mat3 m, vec3 v, vec3 dest);
CGLM_EXPORT
float
glmc_mat3_trace(mat3 m);
CGLM_EXPORT
void
glmc_mat3_quat(mat3 m, versor dest);
CGLM_EXPORT
void
glmc_mat3_scale(mat3 m, float s);
@@ -60,6 +76,10 @@ CGLM_EXPORT
void
glmc_mat3_swap_row(mat3 mat, int row1, int row2);
CGLM_EXPORT
float
glmc_mat3_rmc(vec3 r, mat3 m, vec3 c);
#ifdef __cplusplus
}
#endif

View File

@@ -29,6 +29,14 @@ CGLM_EXPORT
void
glmc_mat4_identity(mat4 mat);
CGLM_EXPORT
void
glmc_mat4_identity_array(mat4 * __restrict mat, size_t count);
CGLM_EXPORT
void
glmc_mat4_zero(mat4 mat);
CGLM_EXPORT
void
glmc_mat4_pick3(mat4 mat, mat3 dest);
@@ -53,6 +61,18 @@ CGLM_EXPORT
void
glmc_mat4_mulv(mat4 m, vec4 v, vec4 dest);
CGLM_EXPORT
void
glmc_mat4_mulv3(mat4 m, vec3 v, float last, vec3 dest);
CGLM_EXPORT
float
glmc_mat4_trace(mat4 m);
CGLM_EXPORT
float
glmc_mat4_trace3(mat4 m);
CGLM_EXPORT
void
glmc_mat4_quat(mat4 m, versor dest);
@@ -85,6 +105,10 @@ CGLM_EXPORT
void
glmc_mat4_inv_precise(mat4 mat, mat4 dest);
CGLM_EXPORT
void
glmc_mat4_inv_fast(mat4 mat, mat4 dest);
CGLM_EXPORT
void
glmc_mat4_swap_col(mat4 mat, int col1, int col2);
@@ -93,6 +117,10 @@ CGLM_EXPORT
void
glmc_mat4_swap_row(mat4 mat, int row1, int row2);
CGLM_EXPORT
float
glmc_mat4_rmc(vec4 r, mat4 m, vec4 c);
#ifdef __cplusplus
}
#endif

View File

@@ -25,6 +25,10 @@ CGLM_EXPORT
void
glmc_project(vec3 pos, mat4 m, vec4 vp, vec3 dest);
CGLM_EXPORT
void
glmc_pickmatrix(vec2 center, vec2 size, vec4 vp, mat4 dest);
#ifdef __cplusplus
}
#endif

View File

@@ -17,6 +17,10 @@ CGLM_EXPORT
void
glmc_quat_identity(versor q);
CGLM_EXPORT
void
glmc_quat_identity_array(versor * __restrict q, size_t count);
CGLM_EXPORT
void
glmc_quat_init(versor q, float x, float y, float z, float w);
@@ -33,6 +37,10 @@ CGLM_EXPORT
void
glmc_quat_copy(versor q, versor dest);
CGLM_EXPORT
void
glmc_quat_from_vecs(vec3 a, vec3 b, versor dest);
CGLM_EXPORT
float
glmc_quat_norm(versor q);
@@ -87,7 +95,7 @@ glmc_quat_angle(versor q);
CGLM_EXPORT
void
glmc_quat_axis(versor q, versor dest);
glmc_quat_axis(versor q, vec3 dest);
CGLM_EXPORT
void
@@ -113,6 +121,14 @@ CGLM_EXPORT
void
glmc_quat_lerp(versor from, versor to, float t, versor dest);
CGLM_EXPORT
void
glmc_quat_lerpc(versor from, versor to, float t, versor dest);
CGLM_EXPORT
void
glmc_quat_nlerp(versor q, versor r, float t, versor dest);
CGLM_EXPORT
void
glmc_quat_slerp(versor q, versor r, float t, versor dest);
@@ -123,11 +139,11 @@ glmc_quat_look(vec3 eye, versor ori, mat4 dest);
CGLM_EXPORT
void
glmc_quat_for(vec3 dir, vec3 fwd, vec3 up, versor dest);
glmc_quat_for(vec3 dir, vec3 up, versor dest);
CGLM_EXPORT
void
glmc_quat_forp(vec3 from, vec3 to, vec3 fwd, vec3 up, versor dest);
glmc_quat_forp(vec3 from, vec3 to, vec3 up, versor dest);
CGLM_EXPORT
void
@@ -137,6 +153,14 @@ CGLM_EXPORT
void
glmc_quat_rotate(mat4 m, versor q, mat4 dest);
CGLM_EXPORT
void
glmc_quat_rotate_at(mat4 model, versor q, vec3 pivot);
CGLM_EXPORT
void
glmc_quat_rotate_atm(mat4 m, versor q, vec3 pivot);
#ifdef __cplusplus
}
#endif

27
include/cglm/call/ray.h Normal file
View 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
*/
#ifndef cglmc_ray_h
#define cglmc_ray_h
#ifdef __cplusplus
extern "C" {
#endif
#include "../cglm.h"
CGLM_EXPORT
bool
glmc_ray_triangle(vec3 origin,
vec3 direction,
vec3 v0,
vec3 v1,
vec3 v2,
float *d);
#ifdef __cplusplus
}
#endif
#endif /* cglmc_ray_h */

View File

@@ -0,0 +1,39 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#ifndef cglmc_sphere_h
#define cglmc_sphere_h
#ifdef __cplusplus
extern "C" {
#endif
#include "../cglm.h"
CGLM_EXPORT
float
glmc_sphere_radii(vec4 s);
CGLM_EXPORT
void
glmc_sphere_transform(vec4 s, mat4 m, vec4 dest);
CGLM_EXPORT
void
glmc_sphere_merge(vec4 s1, vec4 s2, vec4 dest);
CGLM_EXPORT
bool
glmc_sphere_sphere(vec4 s1, vec4 s2);
CGLM_EXPORT
bool
glmc_sphere_point(vec4 s, vec3 point);
#ifdef __cplusplus
}
#endif
#endif /* cglmc_sphere_h */

155
include/cglm/call/vec2.h Normal file
View File

@@ -0,0 +1,155 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#ifndef cglmc_vec2_h
#define cglmc_vec2_h
#ifdef __cplusplus
extern "C" {
#endif
#include "../cglm.h"
CGLM_EXPORT
void
glmc_vec2(float * __restrict v, vec2 dest);
CGLM_EXPORT
void
glmc_vec2_copy(vec2 a, vec2 dest);
CGLM_EXPORT
void
glmc_vec2_zero(vec2 v);
CGLM_EXPORT
void
glmc_vec2_one(vec2 v);
CGLM_EXPORT
float
glmc_vec2_dot(vec2 a, vec2 b);
CGLM_EXPORT
float
glmc_vec2_cross(vec2 a, vec2 b);
CGLM_EXPORT
float
glmc_vec2_norm2(vec2 v);
CGLM_EXPORT
float
glmc_vec2_norm(vec2 v);
CGLM_EXPORT
void
glmc_vec2_add(vec2 a, vec2 b, vec2 dest);
CGLM_EXPORT
void
glmc_vec2_adds(vec2 v, float s, vec2 dest);
CGLM_EXPORT
void
glmc_vec2_sub(vec2 a, vec2 b, vec2 dest);
CGLM_EXPORT
void
glmc_vec2_subs(vec2 v, float s, vec2 dest);
CGLM_EXPORT
void
glmc_vec2_mul(vec2 a, vec2 b, vec2 dest);
CGLM_EXPORT
void
glmc_vec2_scale(vec2 v, float s, vec2 dest);
CGLM_EXPORT
void
glmc_vec2_scale_as(vec2 v, float s, vec2 dest);
CGLM_EXPORT
void
glmc_vec2_div(vec2 a, vec2 b, vec2 dest);
CGLM_EXPORT
void
glmc_vec2_divs(vec2 v, float s, vec2 dest);
CGLM_EXPORT
void
glmc_vec2_addadd(vec2 a, vec2 b, vec2 dest);
CGLM_EXPORT
void
glmc_vec2_subadd(vec2 a, vec2 b, vec2 dest);
CGLM_EXPORT
void
glmc_vec2_muladd(vec2 a, vec2 b, vec2 dest);
CGLM_EXPORT
void
glmc_vec2_muladds(vec2 a, float s, vec2 dest);
CGLM_EXPORT
void
glmc_vec2_maxadd(vec2 a, vec2 b, vec2 dest);
CGLM_EXPORT
void
glmc_vec2_minadd(vec2 a, vec2 b, vec2 dest);
CGLM_EXPORT
void
glmc_vec2_negate_to(vec2 v, vec2 dest);
CGLM_EXPORT
void
glmc_vec2_negate(vec2 v);
CGLM_EXPORT
void
glmc_vec2_normalize(vec2 v);
CGLM_EXPORT
void
glmc_vec2_normalize_to(vec2 v, vec2 dest);
CGLM_EXPORT
void
glmc_vec2_rotate(vec2 v, float angle, vec2 dest);
CGLM_EXPORT
float
glmc_vec2_distance2(vec2 a, vec2 b);
CGLM_EXPORT
float
glmc_vec2_distance(vec2 a, vec2 b);
CGLM_EXPORT
void
glmc_vec2_maxv(vec2 a, vec2 b, vec2 dest);
CGLM_EXPORT
void
glmc_vec2_minv(vec2 a, vec2 b, vec2 dest);
CGLM_EXPORT
void
glmc_vec2_clamp(vec2 v, float minval, float maxval);
CGLM_EXPORT
void
glmc_vec2_lerp(vec2 from, vec2 to, float t, vec2 dest);
#ifdef __cplusplus
}
#endif
#endif /* cglmc_vec2_h */

View File

@@ -14,7 +14,11 @@ extern "C" {
#include "../cglm.h"
/* 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
void
@@ -22,165 +26,285 @@ glmc_vec3(vec4 v4, vec3 dest);
CGLM_EXPORT
void
glmc_vec_copy(vec3 a, vec3 dest);
glmc_vec3_copy(vec3 a, vec3 dest);
CGLM_EXPORT
void
glmc_vec3_zero(vec3 v);
CGLM_EXPORT
void
glmc_vec3_one(vec3 v);
CGLM_EXPORT
float
glmc_vec_dot(vec3 a, vec3 b);
glmc_vec3_dot(vec3 a, vec3 b);
CGLM_EXPORT
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
float
glmc_vec_norm(vec3 vec);
glmc_vec3_norm(vec3 v);
CGLM_EXPORT
float
glmc_vec_norm2(vec3 vec);
CGLM_EXPORT
void
glmc_vec_normalize_to(vec3 vec, vec3 dest);
CGLM_EXPORT
void
glmc_vec_normalize(vec3 v);
CGLM_EXPORT
void
glmc_vec_add(vec3 v1, vec3 v2, vec3 dest);
CGLM_EXPORT
void
glmc_vec_sub(vec3 v1, vec3 v2, vec3 dest);
CGLM_EXPORT
void
glmc_vec_scale(vec3 v, float s, vec3 dest);
CGLM_EXPORT
void
glmc_vec_scale_as(vec3 v, float s, vec3 dest);
CGLM_EXPORT
void
glmc_vec_flipsign(vec3 v);
CGLM_EXPORT
void
glmc_vec_flipsign_to(vec3 v, vec3 dest);
CGLM_EXPORT
void
glmc_vec_inv(vec3 v);
CGLM_EXPORT
void
glmc_vec_inv_to(vec3 v, vec3 dest);
glmc_vec3_norm2(vec3 v);
CGLM_EXPORT
float
glmc_vec_angle(vec3 v1, vec3 v2);
CGLM_EXPORT
void
glmc_vec_rotate(vec3 v, float angle, vec3 axis);
CGLM_EXPORT
void
glmc_vec_rotate_m4(mat4 m, vec3 v, vec3 dest);
CGLM_EXPORT
void
glmc_vec_proj(vec3 a, vec3 b, vec3 dest);
CGLM_EXPORT
void
glmc_vec_center(vec3 v1, vec3 v2, vec3 dest);
glmc_vec3_norm_one(vec3 v);
CGLM_EXPORT
float
glmc_vec_distance(vec3 v1, vec3 v2);
glmc_vec3_norm_inf(vec3 v);
CGLM_EXPORT
void
glmc_vec_maxv(vec3 v1, vec3 v2, vec3 dest);
glmc_vec3_normalize_to(vec3 v, vec3 dest);
CGLM_EXPORT
void
glmc_vec_minv(vec3 v1, vec3 v2, vec3 dest);
glmc_vec3_normalize(vec3 v);
CGLM_EXPORT
void
glmc_vec_clamp(vec3 v, float minVal, float maxVal);
glmc_vec3_add(vec3 a, vec3 b, vec3 dest);
CGLM_EXPORT
void
glmc_vec_ortho(vec3 v, vec3 dest);
glmc_vec3_adds(vec3 v, float s, vec3 dest);
CGLM_EXPORT
void
glmc_vec_lerp(vec3 from, vec3 to, float t, vec3 dest);
glmc_vec3_sub(vec3 a, vec3 b, vec3 dest);
CGLM_EXPORT
void
glmc_vec3_subs(vec3 v, float s, vec3 dest);
CGLM_EXPORT
void
glmc_vec3_mul(vec3 a, vec3 b, vec3 d);
CGLM_EXPORT
void
glmc_vec3_scale(vec3 v, float s, vec3 dest);
CGLM_EXPORT
void
glmc_vec3_scale_as(vec3 v, float s, vec3 dest);
CGLM_EXPORT
void
glmc_vec3_div(vec3 a, vec3 b, vec3 dest);
CGLM_EXPORT
void
glmc_vec3_divs(vec3 a, float s, vec3 dest);
CGLM_EXPORT
void
glmc_vec3_addadd(vec3 a, vec3 b, vec3 dest);
CGLM_EXPORT
void
glmc_vec3_subadd(vec3 a, vec3 b, vec3 dest);
CGLM_EXPORT
void
glmc_vec3_muladd(vec3 a, vec3 b, vec3 dest);
CGLM_EXPORT
void
glmc_vec3_muladds(vec3 a, float s, vec3 dest);
CGLM_EXPORT
void
glmc_vec3_maxadd(vec3 a, vec3 b, vec3 dest);
CGLM_EXPORT
void
glmc_vec3_minadd(vec3 a, vec3 b, vec3 dest);
CGLM_EXPORT
void
glmc_vec3_negate(vec3 v);
CGLM_EXPORT
void
glmc_vec3_negate_to(vec3 v, vec3 dest);
CGLM_EXPORT
float
glmc_vec3_angle(vec3 a, vec3 b);
CGLM_EXPORT
void
glmc_vec3_rotate(vec3 v, float angle, vec3 axis);
CGLM_EXPORT
void
glmc_vec3_rotate_m4(mat4 m, vec3 v, vec3 dest);
CGLM_EXPORT
void
glmc_vec3_rotate_m3(mat3 m, vec3 v, vec3 dest);
CGLM_EXPORT
void
glmc_vec3_proj(vec3 a, vec3 b, vec3 dest);
CGLM_EXPORT
void
glmc_vec3_center(vec3 a, vec3 b, vec3 dest);
CGLM_EXPORT
float
glmc_vec3_distance2(vec3 a, vec3 b);
CGLM_EXPORT
float
glmc_vec3_distance(vec3 a, vec3 b);
CGLM_EXPORT
void
glmc_vec3_maxv(vec3 a, vec3 b, vec3 dest);
CGLM_EXPORT
void
glmc_vec3_minv(vec3 a, vec3 b, vec3 dest);
CGLM_EXPORT
void
glmc_vec3_clamp(vec3 v, float minVal, float maxVal);
CGLM_EXPORT
void
glmc_vec3_ortho(vec3 v, vec3 dest);
CGLM_EXPORT
void
glmc_vec3_lerp(vec3 from, vec3 to, float t, vec3 dest);
CGLM_EXPORT
void
glmc_vec3_lerpc(vec3 from, vec3 to, float t, vec3 dest);
CGLM_INLINE
void
glmc_vec3_mix(vec3 from, vec3 to, float t, vec3 dest) {
glmc_vec3_lerp(from, to, t, dest);
}
CGLM_INLINE
void
glmc_vec3_mixc(vec3 from, vec3 to, float t, vec3 dest) {
glmc_vec3_lerpc(from, to, t, dest);
}
CGLM_EXPORT
void
glmc_vec3_step_uni(float edge, vec3 x, vec3 dest);
CGLM_EXPORT
void
glmc_vec3_step(vec3 edge, vec3 x, vec3 dest);
CGLM_EXPORT
void
glmc_vec3_smoothstep_uni(float edge0, float edge1, vec3 x, vec3 dest);
CGLM_EXPORT
void
glmc_vec3_smoothstep(vec3 edge0, vec3 edge1, vec3 x, vec3 dest);
CGLM_EXPORT
void
glmc_vec3_smoothinterp(vec3 from, vec3 to, float t, vec3 dest);
CGLM_EXPORT
void
glmc_vec3_smoothinterpc(vec3 from, vec3 to, float t, vec3 dest);
/* ext */
CGLM_EXPORT
void
glmc_vec_mulv(vec3 a, vec3 b, vec3 d);
glmc_vec3_mulv(vec3 a, vec3 b, vec3 d);
CGLM_EXPORT
void
glmc_vec_broadcast(float val, vec3 d);
glmc_vec3_broadcast(float val, vec3 d);
CGLM_EXPORT
void
glmc_vec3_fill(vec3 v, float val);
CGLM_EXPORT
bool
glmc_vec_eq(vec3 v, float val);
glmc_vec3_eq(vec3 v, float val);
CGLM_EXPORT
bool
glmc_vec_eq_eps(vec3 v, float val);
glmc_vec3_eq_eps(vec3 v, float val);
CGLM_EXPORT
bool
glmc_vec_eq_all(vec3 v);
glmc_vec3_eq_all(vec3 v);
CGLM_EXPORT
bool
glmc_vec_eqv(vec3 v1, vec3 v2);
glmc_vec3_eqv(vec3 a, vec3 b);
CGLM_EXPORT
bool
glmc_vec_eqv_eps(vec3 v1, vec3 v2);
glmc_vec3_eqv_eps(vec3 a, vec3 b);
CGLM_EXPORT
float
glmc_vec_max(vec3 v);
glmc_vec3_max(vec3 v);
CGLM_EXPORT
float
glmc_vec_min(vec3 v);
glmc_vec3_min(vec3 v);
CGLM_EXPORT
bool
glmc_vec_isnan(vec3 v);
glmc_vec3_isnan(vec3 v);
CGLM_EXPORT
bool
glmc_vec_isinf(vec3 v);
glmc_vec3_isinf(vec3 v);
CGLM_EXPORT
bool
glmc_vec_isvalid(vec3 v);
glmc_vec3_isvalid(vec3 v);
CGLM_EXPORT
void
glmc_vec_sign(vec3 v, vec3 dest);
glmc_vec3_sign(vec3 v, vec3 dest);
CGLM_EXPORT
void
glmc_vec3_abs(vec3 v, vec3 dest);
CGLM_EXPORT
void
glmc_vec3_fract(vec3 v, vec3 dest);
CGLM_EXPORT
float
glmc_vec3_hadd(vec3 v);
CGLM_EXPORT
void
glmc_vec_sqrt(vec3 v, vec3 dest);
glmc_vec3_sqrt(vec3 v, vec3 dest);
#ifdef __cplusplus
}

View File

@@ -14,8 +14,12 @@ extern "C" {
#include "../cglm.h"
/* DEPRECATED! use _copy, _ucopy versions */
#define glmc_vec4_dup3(v, dest) glmc_vec4_copy3(v, dest)
#define glmc_vec4_dup(v, dest) glmc_vec4_copy(v, dest)
#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_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
void
@@ -23,27 +27,47 @@ glmc_vec4(vec3 v3, float last, vec4 dest);
CGLM_EXPORT
void
glmc_vec4_copy3(vec4 a, vec3 dest);
glmc_vec4_zero(vec4 v);
CGLM_EXPORT
void
glmc_vec4_one(vec4 v);
CGLM_EXPORT
void
glmc_vec4_copy3(vec4 v, vec3 dest);
CGLM_EXPORT
void
glmc_vec4_copy(vec4 v, vec4 dest);
CGLM_EXPORT
void
glmc_vec4_ucopy(vec4 v, vec4 dest);
CGLM_EXPORT
float
glmc_vec4_dot(vec4 a, vec4 b);
CGLM_EXPORT
float
glmc_vec4_norm(vec4 vec);
glmc_vec4_norm(vec4 v);
CGLM_EXPORT
float
glmc_vec4_norm2(vec4 vec);
glmc_vec4_norm2(vec4 v);
CGLM_EXPORT
float
glmc_vec4_norm_one(vec4 v);
CGLM_EXPORT
float
glmc_vec4_norm_inf(vec4 v);
CGLM_EXPORT
void
glmc_vec4_normalize_to(vec4 vec, vec4 dest);
glmc_vec4_normalize_to(vec4 v, vec4 dest);
CGLM_EXPORT
void
@@ -51,11 +75,23 @@ glmc_vec4_normalize(vec4 v);
CGLM_EXPORT
void
glmc_vec4_add(vec4 v1, vec4 v2, vec4 dest);
glmc_vec4_add(vec4 a, vec4 b, vec4 dest);
CGLM_EXPORT
void
glmc_vec4_sub(vec4 v1, vec4 v2, vec4 dest);
glmc_vec4_adds(vec4 v, float s, vec4 dest);
CGLM_EXPORT
void
glmc_vec4_sub(vec4 a, vec4 b, vec4 dest);
CGLM_EXPORT
void
glmc_vec4_subs(vec4 v, float s, vec4 dest);
CGLM_EXPORT
void
glmc_vec4_mul(vec4 a, vec4 b, vec4 d);
CGLM_EXPORT
void
@@ -63,43 +99,115 @@ glmc_vec4_scale(vec4 v, float s, vec4 dest);
CGLM_EXPORT
void
glmc_vec4_scale_as(vec3 v, float s, vec3 dest);
glmc_vec4_scale_as(vec4 v, float s, vec4 dest);
CGLM_EXPORT
void
glmc_vec4_flipsign(vec4 v);
glmc_vec4_div(vec4 a, vec4 b, vec4 dest);
CGLM_EXPORT
void
glmc_vec4_flipsign_to(vec4 v, vec4 dest);
glmc_vec4_divs(vec4 v, float s, vec4 dest);
CGLM_EXPORT
void
glmc_vec4_inv(vec4 v);
glmc_vec4_addadd(vec4 a, vec4 b, vec4 dest);
CGLM_EXPORT
void
glmc_vec4_inv_to(vec4 v, vec4 dest);
glmc_vec4_subadd(vec4 a, vec4 b, vec4 dest);
CGLM_EXPORT
void
glmc_vec4_muladd(vec4 a, vec4 b, vec4 dest);
CGLM_EXPORT
void
glmc_vec4_muladds(vec4 a, float s, vec4 dest);
CGLM_EXPORT
void
glmc_vec4_maxadd(vec4 a, vec4 b, vec4 dest);
CGLM_EXPORT
void
glmc_vec4_minadd(vec4 a, vec4 b, vec4 dest);
CGLM_EXPORT
void
glmc_vec4_negate(vec4 v);
CGLM_EXPORT
void
glmc_vec4_negate_to(vec4 v, vec4 dest);
CGLM_EXPORT
float
glmc_vec4_distance(vec4 v1, vec4 v2);
glmc_vec4_distance(vec4 a, vec4 b);
CGLM_EXPORT
float
glmc_vec4_distance2(vec4 a, vec4 b);
CGLM_EXPORT
void
glmc_vec4_maxv(vec4 v1, vec4 v2, vec4 dest);
glmc_vec4_maxv(vec4 a, vec4 b, vec4 dest);
CGLM_EXPORT
void
glmc_vec4_minv(vec4 v1, vec4 v2, vec4 dest);
glmc_vec4_minv(vec4 a, vec4 b, vec4 dest);
CGLM_EXPORT
void
glmc_vec4_clamp(vec4 v, float minVal, float maxVal);
CGLM_EXPORT
void
glmc_vec4_lerp(vec4 from, vec4 to, float t, vec4 dest);
CGLM_EXPORT
void
glmc_vec4_lerpc(vec4 from, vec4 to, float t, vec4 dest);
CGLM_INLINE
void
glmc_vec4_mix(vec4 from, vec4 to, float t, vec4 dest) {
glmc_vec4_lerp(from, to, t, dest);
}
CGLM_INLINE
void
glmc_vec4_mixc(vec4 from, vec4 to, float t, vec4 dest) {
glmc_vec4_lerpc(from, to, t, dest);
}
CGLM_EXPORT
void
glmc_vec4_step_uni(float edge, vec4 x, vec4 dest);
CGLM_EXPORT
void
glmc_vec4_step(vec4 edge, vec4 x, vec4 dest);
CGLM_EXPORT
void
glmc_vec4_smoothstep_uni(float edge0, float edge1, vec4 x, vec4 dest);
CGLM_EXPORT
void
glmc_vec4_smoothstep(vec4 edge0, vec4 edge1, vec4 x, vec4 dest);
CGLM_EXPORT
void
glmc_vec4_smoothinterp(vec4 from, vec4 to, float t, vec4 dest);
CGLM_EXPORT
void
glmc_vec4_smoothinterpc(vec4 from, vec4 to, float t, vec4 dest);
CGLM_EXPORT
void
glmc_vec4_cubic(float s, vec4 dest);
/* ext */
@@ -110,6 +218,10 @@ glmc_vec4_mulv(vec4 a, vec4 b, vec4 d);
CGLM_EXPORT
void
glmc_vec4_broadcast(float val, vec4 d);
CGLM_EXPORT
void
glmc_vec4_fill(vec4 v, float val);
CGLM_EXPORT
bool
@@ -125,11 +237,11 @@ glmc_vec4_eq_all(vec4 v);
CGLM_EXPORT
bool
glmc_vec4_eqv(vec4 v1, vec4 v2);
glmc_vec4_eqv(vec4 a, vec4 b);
CGLM_EXPORT
bool
glmc_vec4_eqv_eps(vec4 v1, vec4 v2);
glmc_vec4_eqv_eps(vec4 a, vec4 b);
CGLM_EXPORT
float
@@ -154,6 +266,18 @@ glmc_vec4_isvalid(vec4 v);
CGLM_EXPORT
void
glmc_vec4_sign(vec4 v, vec4 dest);
CGLM_EXPORT
void
glmc_vec4_abs(vec4 v, vec4 dest);
CGLM_EXPORT
void
glmc_vec4_fract(vec4 v, vec4 dest);
CGLM_EXPORT
float
glmc_vec4_hadd(vec4 v);
CGLM_EXPORT
void

View File

@@ -7,61 +7,85 @@
/*
Functions:
CGLM_INLINE void glm_frustum(float left,
float right,
float bottom,
float top,
float nearVal,
float farVal,
CGLM_INLINE void glm_frustum(float left, float right,
float bottom, float top,
float nearZ, float farZ,
mat4 dest)
CGLM_INLINE void glm_ortho(float left,
float right,
float bottom,
float top,
float nearVal,
float farVal,
CGLM_INLINE void glm_ortho(float left, float right,
float bottom, float top,
float nearZ, float farZ,
mat4 dest)
CGLM_INLINE void glm_ortho_aabb(vec3 box[2], mat4 dest)
CGLM_INLINE void glm_ortho_aabb_p(vec3 box[2], float padding, mat4 dest)
CGLM_INLINE void glm_ortho_aabb_p(vec3 box[2], float padding, mat4 dest)
CGLM_INLINE void glm_ortho_aabb_pz(vec3 box[2], float padding, mat4 dest)
CGLM_INLINE void glm_ortho_default(float aspect, mat4 dest)
CGLM_INLINE void glm_ortho_default_s(float aspect, float size, mat4 dest)
CGLM_INLINE void glm_ortho_default_s(float aspect, float size, mat4 dest)
CGLM_INLINE void glm_perspective(float fovy,
float aspect,
float nearVal,
float farVal,
float nearZ,
float farZ,
mat4 dest)
CGLM_INLINE void glm_perspective_default(float aspect, mat4 dest)
CGLM_INLINE void glm_perspective_resize(float aspect, mat4 proj)
CGLM_INLINE void glm_perspective_default(float aspect, mat4 dest)
CGLM_INLINE void glm_perspective_resize(float aspect, mat4 proj)
CGLM_INLINE void glm_lookat(vec3 eye, vec3 center, vec3 up, mat4 dest)
CGLM_INLINE void glm_look(vec3 eye, vec3 dir, vec3 up, mat4 dest)
CGLM_INLINE void glm_look_anyup(vec3 eye, vec3 dir, mat4 dest)
CGLM_INLINE void glm_persp_decomp(mat4 proj,
float *nearVal,
float *farVal,
float *top,
float *bottom,
float *left,
float *right)
float *nearZ, float *farZ,
float *top, float *bottom,
float *left, float *right)
CGLM_INLINE void glm_persp_decompv(mat4 proj, float dest[6])
CGLM_INLINE void glm_persp_decomp_x(mat4 proj, float *left, float *right)
CGLM_INLINE void glm_persp_decomp_y(mat4 proj, float *top, float *bottom)
CGLM_INLINE void glm_persp_decomp_z(mat4 proj,
float *nearVal,
float *farVal)
CGLM_INLINE void glm_persp_decomp_far(mat4 proj, float *farVal)
CGLM_INLINE void glm_persp_decomp_near(mat4 proj, float *nearVal)
CGLM_INLINE void glm_persp_decomp_z(mat4 proj, float *nearv, float *farv)
CGLM_INLINE void glm_persp_decomp_far(mat4 proj, float *farZ)
CGLM_INLINE void glm_persp_decomp_near(mat4 proj, float *nearZ)
CGLM_INLINE float glm_persp_fovy(mat4 proj)
CGLM_INLINE float glm_persp_aspect(mat4 proj)
CGLM_INLINE void glm_persp_sizes(mat4 proj, float fovy, vec4 dest)
*/
#ifndef cglm_vcam_h
#define cglm_vcam_h
#ifndef cglm_cam_h
#define cglm_cam_h
#include "common.h"
#include "plane.h"
#include "clipspace/persp.h"
#ifndef CGLM_CLIPSPACE_INCLUDE_ALL
# if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
# include "clipspace/ortho_lh_zo.h"
# include "clipspace/persp_lh_zo.h"
# include "clipspace/view_lh_zo.h"
# elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
# include "clipspace/ortho_lh_no.h"
# include "clipspace/persp_lh_no.h"
# include "clipspace/view_lh_no.h"
# elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
# include "clipspace/ortho_rh_zo.h"
# include "clipspace/persp_rh_zo.h"
# include "clipspace/view_rh_zo.h"
# elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
# include "clipspace/ortho_rh_no.h"
# include "clipspace/persp_rh_no.h"
# include "clipspace/view_rh_no.h"
# endif
#else
# include "clipspace/ortho_lh_zo.h"
# include "clipspace/persp_lh_zo.h"
# include "clipspace/ortho_lh_no.h"
# include "clipspace/persp_lh_no.h"
# include "clipspace/ortho_rh_zo.h"
# include "clipspace/persp_rh_zo.h"
# include "clipspace/ortho_rh_no.h"
# include "clipspace/persp_rh_no.h"
# include "clipspace/view_lh_zo.h"
# include "clipspace/view_lh_no.h"
# include "clipspace/view_rh_zo.h"
# include "clipspace/view_rh_no.h"
#endif
/*!
* @brief set up perspective peprojection matrix
*
@@ -69,35 +93,25 @@
* @param[in] right viewport.right
* @param[in] bottom viewport.bottom
* @param[in] top viewport.top
* @param[in] nearVal near clipping plane
* @param[in] farVal far clipping plane
* @param[in] nearZ near clipping plane
* @param[in] farZ far clipping plane
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_frustum(float left,
float right,
float bottom,
float top,
float nearVal,
float farVal,
glm_frustum(float left, float right,
float bottom, float top,
float nearZ, float farZ,
mat4 dest) {
float rl, tb, fn, nv;
glm__memzero(float, dest, sizeof(mat4));
rl = 1.0f / (right - left);
tb = 1.0f / (top - bottom);
fn =-1.0f / (farVal - nearVal);
nv = 2.0f * nearVal;
dest[0][0] = nv * rl;
dest[1][1] = nv * tb;
dest[2][0] = (right + left) * rl;
dest[2][1] = (top + bottom) * tb;
dest[2][2] = (farVal + nearVal) * fn;
dest[2][3] =-1.0f;
dest[3][2] = farVal * nv * fn;
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
glm_frustum_lh_zo(left, right, bottom, top, nearZ, farZ, dest);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
glm_frustum_lh_no(left, right, bottom, top, nearZ, farZ, dest);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
glm_frustum_rh_zo(left, right, bottom, top, nearZ, farZ, dest);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
glm_frustum_rh_no(left, right, bottom, top, nearZ, farZ, dest);
#endif
}
/*!
@@ -107,34 +121,25 @@ glm_frustum(float left,
* @param[in] right viewport.right
* @param[in] bottom viewport.bottom
* @param[in] top viewport.top
* @param[in] nearVal near clipping plane
* @param[in] farVal far clipping plane
* @param[in] nearZ near clipping plane
* @param[in] farZ far clipping plane
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_ortho(float left,
float right,
float bottom,
float top,
float nearVal,
float farVal,
glm_ortho(float left, float right,
float bottom, float top,
float nearZ, float farZ,
mat4 dest) {
float rl, tb, fn;
glm__memzero(float, dest, sizeof(mat4));
rl = 1.0f / (right - left);
tb = 1.0f / (top - bottom);
fn =-1.0f / (farVal - nearVal);
dest[0][0] = 2.0f * rl;
dest[1][1] = 2.0f * tb;
dest[2][2] = 2.0f * fn;
dest[3][0] =-(right + left) * rl;
dest[3][1] =-(top + bottom) * tb;
dest[3][2] = (farVal + nearVal) * fn;
dest[3][3] = 1.0f;
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
glm_ortho_lh_zo(left, right, bottom, top, nearZ, farZ, dest);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
glm_ortho_lh_no(left, right, bottom, top, nearZ, farZ, dest);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
glm_ortho_rh_zo(left, right, bottom, top, nearZ, farZ, dest);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
glm_ortho_rh_no(left, right, bottom, top, nearZ, farZ, dest);
#endif
}
/*!
@@ -148,10 +153,15 @@ glm_ortho(float left,
CGLM_INLINE
void
glm_ortho_aabb(vec3 box[2], mat4 dest) {
glm_ortho(box[0][0], box[1][0],
box[0][1], box[1][1],
-box[1][2], -box[0][2],
dest);
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
glm_ortho_aabb_lh_zo(box, dest);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
glm_ortho_aabb_lh_no(box, dest);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
glm_ortho_aabb_rh_zo(box, dest);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
glm_ortho_aabb_rh_no(box, dest);
#endif
}
/*!
@@ -166,10 +176,15 @@ glm_ortho_aabb(vec3 box[2], mat4 dest) {
CGLM_INLINE
void
glm_ortho_aabb_p(vec3 box[2], float padding, mat4 dest) {
glm_ortho(box[0][0] - padding, box[1][0] + padding,
box[0][1] - padding, box[1][1] + padding,
-(box[1][2] + padding), -(box[0][2] - padding),
dest);
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
glm_ortho_aabb_p_lh_zo(box, padding, dest);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
glm_ortho_aabb_p_lh_no(box, padding, dest);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
glm_ortho_aabb_p_rh_zo(box, padding, dest);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
glm_ortho_aabb_p_rh_no(box, padding, dest);
#endif
}
/*!
@@ -184,10 +199,15 @@ glm_ortho_aabb_p(vec3 box[2], float padding, mat4 dest) {
CGLM_INLINE
void
glm_ortho_aabb_pz(vec3 box[2], float padding, mat4 dest) {
glm_ortho(box[0][0], box[1][0],
box[0][1], box[1][1],
-(box[1][2] + padding), -(box[0][2] - padding),
dest);
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
glm_ortho_aabb_pz_lh_zo(box, padding, dest);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
glm_ortho_aabb_pz_lh_no(box, padding, dest);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
glm_ortho_aabb_pz_rh_zo(box, padding, dest);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
glm_ortho_aabb_pz_rh_no(box, padding, dest);
#endif
}
/*!
@@ -198,26 +218,16 @@ glm_ortho_aabb_pz(vec3 box[2], float padding, mat4 dest) {
*/
CGLM_INLINE
void
glm_ortho_default(float aspect,
mat4 dest) {
if (aspect >= 1.0f) {
glm_ortho(-1.0f * aspect,
1.0f * aspect,
-1.0f,
1.0f,
-100.0f,
100.0f,
dest);
return;
}
glm_ortho(-1.0f,
1.0f,
-1.0f / aspect,
1.0f / aspect,
-100.0f,
100.0f,
dest);
glm_ortho_default(float aspect, mat4 dest) {
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
glm_ortho_default_lh_zo(aspect, dest);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
glm_ortho_default_lh_no(aspect, dest);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
glm_ortho_default_rh_zo(aspect, dest);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
glm_ortho_default_rh_no(aspect, dest);
#endif
}
/*!
@@ -229,27 +239,16 @@ glm_ortho_default(float aspect,
*/
CGLM_INLINE
void
glm_ortho_default_s(float aspect,
float size,
mat4 dest) {
if (aspect >= 1.0f) {
glm_ortho(-size * aspect,
size * aspect,
-size,
size,
-size - 100.0f,
size + 100.0f,
dest);
return;
}
glm_ortho(-size,
size,
-size / aspect,
size / aspect,
-size - 100.0f,
size + 100.0f,
dest);
glm_ortho_default_s(float aspect, float size, mat4 dest) {
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
glm_ortho_default_s_lh_zo(aspect, size, dest);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
glm_ortho_default_s_lh_no(aspect, size, dest);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
glm_ortho_default_s_rh_zo(aspect, size, dest);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
glm_ortho_default_s_rh_no(aspect, size, dest);
#endif
}
/*!
@@ -257,29 +256,44 @@ glm_ortho_default_s(float aspect,
*
* @param[in] fovy field of view angle
* @param[in] aspect aspect ratio ( width / height )
* @param[in] nearVal near clipping plane
* @param[in] farVal far clipping planes
* @param[in] nearZ near clipping plane
* @param[in] farZ far clipping planes
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_perspective(float fovy,
float aspect,
float nearVal,
float farVal,
mat4 dest) {
float f, fn;
glm_perspective(float fovy, float aspect, float nearZ, float farZ, mat4 dest) {
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
glm_perspective_lh_zo(fovy, aspect, nearZ, farZ, dest);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
glm_perspective_lh_no(fovy, aspect, nearZ, farZ, dest);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
glm_perspective_rh_zo(fovy, aspect, nearZ, farZ, dest);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
glm_perspective_rh_no(fovy, aspect, nearZ, farZ, dest);
#endif
}
glm__memzero(float, dest, sizeof(mat4));
f = 1.0f / tanf(fovy * 0.5f);
fn = 1.0f / (nearVal - farVal);
dest[0][0] = f / aspect;
dest[1][1] = f;
dest[2][2] = (nearVal + farVal) * fn;
dest[2][3] =-1.0f;
dest[3][2] = 2.0f * nearVal * farVal * fn;
/*!
* @brief 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) {
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
glm_persp_move_far_lh_zo(proj, deltaFar);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
glm_persp_move_far_lh_no(proj, deltaFar);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
glm_persp_move_far_rh_zo(proj, deltaFar);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
glm_persp_move_far_rh_no(proj, deltaFar);
#endif
}
/*!
@@ -291,13 +305,16 @@ glm_perspective(float fovy,
*/
CGLM_INLINE
void
glm_perspective_default(float aspect,
mat4 dest) {
glm_perspective((float)CGLM_PI_4,
aspect,
0.01f,
100.0f,
dest);
glm_perspective_default(float aspect, mat4 dest) {
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
glm_perspective_default_lh_zo(aspect, dest);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
glm_perspective_default_lh_no(aspect, dest);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
glm_perspective_default_rh_zo(aspect, dest);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
glm_perspective_default_rh_no(aspect, dest);
#endif
}
/*!
@@ -310,8 +327,7 @@ glm_perspective_default(float aspect,
*/
CGLM_INLINE
void
glm_perspective_resize(float aspect,
mat4 proj) {
glm_perspective_resize(float aspect, mat4 proj) {
if (proj[0][0] == 0.0f)
return;
@@ -321,6 +337,9 @@ glm_perspective_resize(float aspect,
/*!
* @brief set up view matrix
*
* NOTE: The UP vector must not be parallel to the line of sight from
* the eye point to the reference point
*
* @param[in] eye eye vector
* @param[in] center center vector
* @param[in] up up vector
@@ -328,34 +347,12 @@ glm_perspective_resize(float aspect,
*/
CGLM_INLINE
void
glm_lookat(vec3 eye,
vec3 center,
vec3 up,
mat4 dest) {
vec3 f, u, s;
glm_vec_sub(center, eye, f);
glm_vec_normalize(f);
glm_vec_cross(f, up, s);
glm_vec_normalize(s);
glm_vec_cross(s, f, u);
dest[0][0] = s[0];
dest[0][1] = u[0];
dest[0][2] =-f[0];
dest[1][0] = s[1];
dest[1][1] = u[1];
dest[1][2] =-f[1];
dest[2][0] = s[2];
dest[2][1] = u[2];
dest[2][2] =-f[2];
dest[3][0] =-glm_vec_dot(s, eye);
dest[3][1] =-glm_vec_dot(u, eye);
dest[3][2] = glm_vec_dot(f, eye);
dest[0][3] = dest[1][3] = dest[2][3] = 0.0f;
dest[3][3] = 1.0f;
glm_lookat(vec3 eye, vec3 center, vec3 up, mat4 dest) {
#if CGLM_CONFIG_CLIP_CONTROL & CGLM_CLIP_CONTROL_LH_BIT
glm_lookat_lh(eye, center, up, dest);
#elif CGLM_CONFIG_CLIP_CONTROL & CGLM_CLIP_CONTROL_RH_BIT
glm_lookat_rh(eye, center, up, dest);
#endif
}
/*!
@@ -364,6 +361,9 @@ glm_lookat(vec3 eye,
* convenient wrapper for lookat: if you only have direction not target self
* then this might be useful. Because you need to get target from direction.
*
* NOTE: The UP vector must not be parallel to the line of sight from
* the eye point to the reference point
*
* @param[in] eye eye vector
* @param[in] dir direction vector
* @param[in] up up vector
@@ -372,9 +372,11 @@ glm_lookat(vec3 eye,
CGLM_INLINE
void
glm_look(vec3 eye, vec3 dir, vec3 up, mat4 dest) {
vec3 target;
glm_vec_add(eye, dir, target);
glm_lookat(eye, target, up, dest);
#if CGLM_CONFIG_CLIP_CONTROL & CGLM_CLIP_CONTROL_LH_BIT
glm_look_lh(eye, dir, up, dest);
#elif CGLM_CONFIG_CLIP_CONTROL & CGLM_CLIP_CONTROL_RH_BIT
glm_look_rh(eye, dir, up, dest);
#endif
}
/*!
@@ -390,17 +392,19 @@ glm_look(vec3 eye, vec3 dir, vec3 up, mat4 dest) {
CGLM_INLINE
void
glm_look_anyup(vec3 eye, vec3 dir, mat4 dest) {
vec3 up;
glm_vec_ortho(dir, up);
glm_look(eye, dir, up, dest);
#if CGLM_CONFIG_CLIP_CONTROL & CGLM_CLIP_CONTROL_LH_BIT
glm_look_anyup_lh(eye, dir, dest);
#elif CGLM_CONFIG_CLIP_CONTROL & CGLM_CLIP_CONTROL_RH_BIT
glm_look_anyup_rh(eye, dir, dest);
#endif
}
/*!
* @brief decomposes frustum values of perspective projection.
*
* @param[in] proj perspective projection matrix
* @param[out] nearVal near
* @param[out] farVal far
* @param[out] nearZ near
* @param[out] farZ far
* @param[out] top top
* @param[out] bottom bottom
* @param[out] left left
@@ -409,34 +413,18 @@ glm_look_anyup(vec3 eye, vec3 dir, mat4 dest) {
CGLM_INLINE
void
glm_persp_decomp(mat4 proj,
float * __restrict nearVal,
float * __restrict farVal,
float * __restrict top,
float * __restrict bottom,
float * __restrict left,
float * __restrict right) {
float m00, m11, m20, m21, m22, m32, n, f;
float n_m11, n_m00;
m00 = proj[0][0];
m11 = proj[1][1];
m20 = proj[2][0];
m21 = proj[2][1];
m22 = proj[2][2];
m32 = proj[3][2];
n = m32 / (m22 - 1.0f);
f = m32 / (m22 + 1.0f);
n_m11 = n / m11;
n_m00 = n / m00;
*nearVal = n;
*farVal = f;
*bottom = n_m11 * (m21 - 1.0f);
*top = n_m11 * (m21 + 1.0f);
*left = n_m00 * (m20 - 1.0f);
*right = n_m00 * (m20 + 1.0f);
float * __restrict nearZ, float * __restrict farZ,
float * __restrict top, float * __restrict bottom,
float * __restrict left, float * __restrict right) {
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
glm_persp_decomp_lh_zo(proj, nearZ, farZ, top, bottom, left, right);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
glm_persp_decomp_lh_no(proj, nearZ, farZ, top, bottom, left, right);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
glm_persp_decomp_rh_zo(proj, nearZ, farZ, top, bottom, left, right);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
glm_persp_decomp_rh_no(proj, nearZ, farZ, top, bottom, left, right);
#endif
}
/*!
@@ -449,8 +437,15 @@ glm_persp_decomp(mat4 proj,
CGLM_INLINE
void
glm_persp_decompv(mat4 proj, float dest[6]) {
glm_persp_decomp(proj, &dest[0], &dest[1], &dest[2],
&dest[3], &dest[4], &dest[5]);
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
glm_persp_decompv_lh_zo(proj, dest);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
glm_persp_decompv_lh_no(proj, dest);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
glm_persp_decompv_rh_zo(proj, dest);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
glm_persp_decompv_rh_no(proj, dest);
#endif
}
/*!
@@ -466,14 +461,15 @@ void
glm_persp_decomp_x(mat4 proj,
float * __restrict left,
float * __restrict right) {
float nearVal, m20, m00;
m00 = proj[0][0];
m20 = proj[2][0];
nearVal = proj[3][2] / (proj[3][3] - 1.0f);
*left = nearVal * (m20 - 1.0f) / m00;
*right = nearVal * (m20 + 1.0f) / m00;
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
glm_persp_decomp_x_lh_zo(proj, left, right);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
glm_persp_decomp_x_lh_no(proj, left, right);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
glm_persp_decomp_x_rh_zo(proj, left, right);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
glm_persp_decomp_x_rh_no(proj, left, right);
#endif
}
/*!
@@ -489,14 +485,15 @@ void
glm_persp_decomp_y(mat4 proj,
float * __restrict top,
float * __restrict bottom) {
float nearVal, m21, m11;
m21 = proj[2][1];
m11 = proj[1][1];
nearVal = proj[3][2] / (proj[3][3] - 1.0f);
*bottom = nearVal * (m21 - 1) / m11;
*top = nearVal * (m21 + 1) / m11;
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
glm_persp_decomp_y_lh_zo(proj, top, bottom);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
glm_persp_decomp_y_lh_no(proj, top, bottom);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
glm_persp_decomp_y_rh_zo(proj, top, bottom);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
glm_persp_decomp_y_rh_no(proj, top, bottom);
#endif
}
/*!
@@ -504,70 +501,61 @@ glm_persp_decomp_y(mat4 proj,
* z stands for z axis (near / far axis)
*
* @param[in] proj perspective projection matrix
* @param[out] nearVal near
* @param[out] farVal far
* @param[out] nearZ near
* @param[out] farZ far
*/
CGLM_INLINE
void
glm_persp_decomp_z(mat4 proj,
float * __restrict nearVal,
float * __restrict farVal) {
float m32, m22;
m32 = proj[3][2];
m22 = proj[2][2];
*nearVal = m32 / (m22 - 1.0f);
*farVal = m32 / (m22 + 1.0f);
glm_persp_decomp_z(mat4 proj, float * __restrict nearZ, float * __restrict farZ) {
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
glm_persp_decomp_z_lh_zo(proj, nearZ, farZ);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
glm_persp_decomp_z_lh_no(proj, nearZ, farZ);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
glm_persp_decomp_z_rh_zo(proj, nearZ, farZ);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
glm_persp_decomp_z_rh_no(proj, nearZ, farZ);
#endif
}
/*!
* @brief decomposes far value of perspective projection.
*
* @param[in] proj perspective projection matrix
* @param[out] farVal far
* @param[out] farZ far
*/
CGLM_INLINE
void
glm_persp_decomp_far(mat4 proj, float * __restrict farVal) {
*farVal = proj[3][2] / (proj[2][2] + 1.0f);
glm_persp_decomp_far(mat4 proj, float * __restrict farZ) {
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
glm_persp_decomp_far_lh_zo(proj, farZ);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
glm_persp_decomp_far_lh_no(proj, farZ);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
glm_persp_decomp_far_rh_zo(proj, farZ);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
glm_persp_decomp_far_rh_no(proj, farZ);
#endif
}
/*!
* @brief decomposes near value of perspective projection.
*
* @param[in] proj perspective projection matrix
* @param[out] nearVal near
* @param[in] proj perspective projection matrix
* @param[out] nearZ near
*/
CGLM_INLINE
void
glm_persp_decomp_near(mat4 proj, float * __restrict nearVal) {
*nearVal = proj[3][2] / (proj[2][2] - 1.0f);
}
/*!
* @brief returns field of view angle along the Y-axis (in radians)
*
* if you need to degrees, use glm_deg to convert it or use this:
* fovy_deg = glm_deg(glm_persp_fovy(projMatrix))
*
* @param[in] proj perspective projection matrix
*/
CGLM_INLINE
float
glm_persp_fovy(mat4 proj) {
return 2.0f * atanf(1.0f / proj[1][1]);
}
/*!
* @brief returns aspect ratio of perspective projection
*
* @param[in] proj perspective projection matrix
*/
CGLM_INLINE
float
glm_persp_aspect(mat4 proj) {
return proj[1][1] / proj[0][0];
glm_persp_decomp_near(mat4 proj, float * __restrict nearZ) {
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
glm_persp_decomp_near_lh_zo(proj, nearZ);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
glm_persp_decomp_near_lh_no(proj, nearZ);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
glm_persp_decomp_near_rh_zo(proj, nearZ);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
glm_persp_decomp_near_rh_no(proj, nearZ);
#endif
}
/*!
@@ -580,17 +568,15 @@ glm_persp_aspect(mat4 proj) {
CGLM_INLINE
void
glm_persp_sizes(mat4 proj, float fovy, vec4 dest) {
float t, a, nearVal, farVal;
t = 2.0f * tanf(fovy * 0.5f);
a = glm_persp_aspect(proj);
glm_persp_decomp_z(proj, &nearVal, &farVal);
dest[1] = t * nearVal;
dest[3] = t * farVal;
dest[0] = a * dest[1];
dest[2] = a * dest[3];
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
glm_persp_sizes_lh_zo(proj, fovy, dest);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
glm_persp_sizes_lh_no(proj, fovy, dest);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
glm_persp_sizes_rh_zo(proj, fovy, dest);
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
glm_persp_sizes_rh_no(proj, fovy, dest);
#endif
}
#endif /* cglm_vcam_h */
#endif /* cglm_cam_h */

View File

@@ -9,10 +9,12 @@
#define cglm_h
#include "common.h"
#include "vec2.h"
#include "vec3.h"
#include "vec4.h"
#include "mat4.h"
#include "mat3.h"
#include "mat2.h"
#include "affine.h"
#include "cam.h"
#include "frustum.h"
@@ -24,5 +26,11 @@
#include "util.h"
#include "io.h"
#include "project.h"
#include "sphere.h"
#include "ease.h"
#include "curve.h"
#include "bezier.h"
#include "ray.h"
#include "affine2d.h"
#endif /* cglm_h */

View File

@@ -0,0 +1,183 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
/*
Functions:
CGLM_INLINE void glm_ortho_lh_no(float left, float right,
float bottom, float top,
float nearZ, float farZ,
mat4 dest)
CGLM_INLINE void glm_ortho_aabb_lh_no(vec3 box[2], mat4 dest)
CGLM_INLINE void glm_ortho_aabb_p_lh_no(vec3 box[2],
float padding,
mat4 dest)
CGLM_INLINE void glm_ortho_aabb_pz_lh_no(vec3 box[2],
float padding,
mat4 dest)
CGLM_INLINE void glm_ortho_default_lh_no(float aspect,
mat4 dest)
CGLM_INLINE void glm_ortho_default_s_lh_no(float aspect,
float size,
mat4 dest)
*/
#ifndef cglm_ortho_lh_no_h
#define cglm_ortho_lh_no_h
#include "../common.h"
#include "../plane.h"
#include "../mat4.h"
/*!
* @brief set up orthographic projection matrix
* with a left-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] left viewport.left
* @param[in] right viewport.right
* @param[in] bottom viewport.bottom
* @param[in] top viewport.top
* @param[in] nearZ near clipping plane
* @param[in] farZ far clipping plane
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_ortho_lh_no(float left, float right,
float bottom, float top,
float nearZ, float farZ,
mat4 dest) {
float rl, tb, fn;
glm_mat4_zero(dest);
rl = 1.0f / (right - left);
tb = 1.0f / (top - bottom);
fn =-1.0f / (farZ - nearZ);
dest[0][0] = 2.0f * rl;
dest[1][1] = 2.0f * tb;
dest[2][2] =-2.0f * fn;
dest[3][0] =-(right + left) * rl;
dest[3][1] =-(top + bottom) * tb;
dest[3][2] = (farZ + nearZ) * fn;
dest[3][3] = 1.0f;
}
/*!
* @brief set up orthographic projection matrix using bounding box
* with a left-hand coordinate system and a
* clip-space of [-1, 1].
*
* bounding box (AABB) must be in view space
*
* @param[in] box AABB
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_ortho_aabb_lh_no(vec3 box[2], mat4 dest) {
glm_ortho_lh_no(box[0][0], box[1][0],
box[0][1], box[1][1],
-box[1][2], -box[0][2],
dest);
}
/*!
* @brief set up orthographic projection matrix using bounding box
* with a left-hand coordinate system and a
* clip-space of [-1, 1].
*
* bounding box (AABB) must be in view space
*
* @param[in] box AABB
* @param[in] padding padding
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_ortho_aabb_p_lh_no(vec3 box[2], float padding, mat4 dest) {
glm_ortho_lh_no(box[0][0] - padding, box[1][0] + padding,
box[0][1] - padding, box[1][1] + padding,
-(box[1][2] + padding), -(box[0][2] - padding),
dest);
}
/*!
* @brief set up orthographic projection matrix using bounding box
* with a left-hand coordinate system and a
* clip-space of [-1, 1].
*
* bounding box (AABB) must be in view space
*
* @param[in] box AABB
* @param[in] padding padding for near and far
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_ortho_aabb_pz_lh_no(vec3 box[2], float padding, mat4 dest) {
glm_ortho_lh_no(box[0][0], box[1][0],
box[0][1], box[1][1],
-(box[1][2] + padding), -(box[0][2] - padding),
dest);
}
/*!
* @brief set up unit orthographic projection matrix
* with a left-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] aspect aspect ration ( width / height )
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_ortho_default_lh_no(float aspect, mat4 dest) {
if (aspect >= 1.0f) {
glm_ortho_lh_no(-aspect, aspect, -1.0f, 1.0f, -100.0f, 100.0f, dest);
return;
}
aspect = 1.0f / aspect;
glm_ortho_lh_no(-1.0f, 1.0f, -aspect, aspect, -100.0f, 100.0f, dest);
}
/*!
* @brief set up orthographic projection matrix with given CUBE size
* with a left-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] aspect aspect ratio ( width / height )
* @param[in] size cube size
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_ortho_default_s_lh_no(float aspect, float size, mat4 dest) {
if (aspect >= 1.0f) {
glm_ortho_lh_no(-size * aspect,
size * aspect,
-size,
size,
-size - 100.0f,
size + 100.0f,
dest);
return;
}
glm_ortho_lh_no(-size,
size,
-size / aspect,
size / aspect,
-size - 100.0f,
size + 100.0f,
dest);
}
#endif /*cglm_ortho_lh_no_h*/

View File

@@ -0,0 +1,177 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
/*
Functions:
CGLM_INLINE void glm_ortho_lh_zo(float left, float right,
float bottom, float top,
float nearZ, float farZ,
mat4 dest)
CGLM_INLINE void glm_ortho_aabb_lh_zo(vec3 box[2], mat4 dest)
CGLM_INLINE void glm_ortho_aabb_p_lh_zo(vec3 box[2],
float padding,
mat4 dest)
CGLM_INLINE void glm_ortho_aabb_pz_lh_zo(vec3 box[2],
float padding,
mat4 dest)
CGLM_INLINE void glm_ortho_default_lh_zo(float aspect,
mat4 dest)
CGLM_INLINE void glm_ortho_default_s_lh_zo(float aspect,
float size,
mat4 dest)
*/
#ifndef cglm_ortho_lh_zo_h
#define cglm_ortho_lh_zo_h
#include "../common.h"
#include "../plane.h"
#include "../mat4.h"
/*!
* @brief set up orthographic projection matrix with a left-hand coordinate
* system and a clip-space of [0, 1].
*
* @param[in] left viewport.left
* @param[in] right viewport.right
* @param[in] bottom viewport.bottom
* @param[in] top viewport.top
* @param[in] nearZ near clipping plane
* @param[in] farZ far clipping plane
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_ortho_lh_zo(float left, float right,
float bottom, float top,
float nearZ, float farZ,
mat4 dest) {
float rl, tb, fn;
glm_mat4_zero(dest);
rl = 1.0f / (right - left);
tb = 1.0f / (top - bottom);
fn =-1.0f / (farZ - nearZ);
dest[0][0] = 2.0f * rl;
dest[1][1] = 2.0f * tb;
dest[2][2] =-fn;
dest[3][0] =-(right + left) * rl;
dest[3][1] =-(top + bottom) * tb;
dest[3][2] = nearZ * fn;
dest[3][3] = 1.0f;
}
/*!
* @brief set up orthographic projection matrix using bounding box
* with a left-hand coordinate system and a clip-space of [0, 1].
*
* bounding box (AABB) must be in view space
*
* @param[in] box AABB
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_ortho_aabb_lh_zo(vec3 box[2], mat4 dest) {
glm_ortho_lh_zo(box[0][0], box[1][0],
box[0][1], box[1][1],
-box[1][2], -box[0][2],
dest);
}
/*!
* @brief set up orthographic projection matrix using bounding box
* with a left-hand coordinate system and a clip-space of [0, 1].
*
* bounding box (AABB) must be in view space
*
* @param[in] box AABB
* @param[in] padding padding
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_ortho_aabb_p_lh_zo(vec3 box[2], float padding, mat4 dest) {
glm_ortho_lh_zo(box[0][0] - padding, box[1][0] + padding,
box[0][1] - padding, box[1][1] + padding,
-(box[1][2] + padding), -(box[0][2] - padding),
dest);
}
/*!
* @brief set up orthographic projection matrix using bounding box
* with a left-hand coordinate system and a clip-space of [0, 1].
*
* bounding box (AABB) must be in view space
*
* @param[in] box AABB
* @param[in] padding padding for near and far
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_ortho_aabb_pz_lh_zo(vec3 box[2], float padding, mat4 dest) {
glm_ortho_lh_zo(box[0][0], box[1][0],
box[0][1], box[1][1],
-(box[1][2] + padding), -(box[0][2] - padding),
dest);
}
/*!
* @brief set up unit orthographic projection matrix
* with a left-hand coordinate system and a clip-space of [0, 1].
*
* @param[in] aspect aspect ration ( width / height )
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_ortho_default_lh_zo(float aspect, mat4 dest) {
if (aspect >= 1.0f) {
glm_ortho_lh_zo(-aspect, aspect, -1.0f, 1.0f, -100.0f, 100.0f, dest);
return;
}
aspect = 1.0f / aspect;
glm_ortho_lh_zo(-1.0f, 1.0f, -aspect, aspect, -100.0f, 100.0f, dest);
}
/*!
* @brief set up orthographic projection matrix with given CUBE size
* with a left-hand coordinate system and a clip-space of [0, 1].
*
* @param[in] aspect aspect ratio ( width / height )
* @param[in] size cube size
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_ortho_default_s_lh_zo(float aspect, float size, mat4 dest) {
if (aspect >= 1.0f) {
glm_ortho_lh_zo(-size * aspect,
size * aspect,
-size,
size,
-size - 100.0f,
size + 100.0f,
dest);
return;
}
glm_ortho_lh_zo(-size,
size,
-size / aspect,
size / aspect,
-size - 100.0f,
size + 100.0f,
dest);
}
#endif /*cglm_ortho_lh_zo_h*/

View File

@@ -0,0 +1,183 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
/*
Functions:
CGLM_INLINE void glm_ortho_rh_no(float left, float right,
float bottom, float top,
float nearZ, float farZ,
mat4 dest)
CGLM_INLINE void glm_ortho_aabb_rh_no(vec3 box[2], mat4 dest)
CGLM_INLINE void glm_ortho_aabb_p_rh_no(vec3 box[2],
float padding,
mat4 dest)
CGLM_INLINE void glm_ortho_aabb_pz_rh_no(vec3 box[2],
float padding,
mat4 dest)
CGLM_INLINE void glm_ortho_default_rh_no(float aspect,
mat4 dest)
CGLM_INLINE void glm_ortho_default_s_rh_no(float aspect,
float size,
mat4 dest)
*/
#ifndef cglm_ortho_rh_no_h
#define cglm_ortho_rh_no_h
#include "../common.h"
#include "../plane.h"
#include "../mat4.h"
/*!
* @brief set up orthographic projection matrix
* with a right-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] left viewport.left
* @param[in] right viewport.right
* @param[in] bottom viewport.bottom
* @param[in] top viewport.top
* @param[in] nearZ near clipping plane
* @param[in] farZ far clipping plane
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_ortho_rh_no(float left, float right,
float bottom, float top,
float nearZ, float farZ,
mat4 dest) {
float rl, tb, fn;
glm_mat4_zero(dest);
rl = 1.0f / (right - left);
tb = 1.0f / (top - bottom);
fn =-1.0f / (farZ - nearZ);
dest[0][0] = 2.0f * rl;
dest[1][1] = 2.0f * tb;
dest[2][2] = 2.0f * fn;
dest[3][0] =-(right + left) * rl;
dest[3][1] =-(top + bottom) * tb;
dest[3][2] = (farZ + nearZ) * fn;
dest[3][3] = 1.0f;
}
/*!
* @brief set up orthographic projection matrix using bounding box
* with a right-hand coordinate system and a
* clip-space of [-1, 1].
*
* bounding box (AABB) must be in view space
*
* @param[in] box AABB
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_ortho_aabb_rh_no(vec3 box[2], mat4 dest) {
glm_ortho_rh_no(box[0][0], box[1][0],
box[0][1], box[1][1],
-box[1][2], -box[0][2],
dest);
}
/*!
* @brief set up orthographic projection matrix using bounding box
* with a right-hand coordinate system and a
* clip-space of [-1, 1].
*
* bounding box (AABB) must be in view space
*
* @param[in] box AABB
* @param[in] padding padding
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_ortho_aabb_p_rh_no(vec3 box[2], float padding, mat4 dest) {
glm_ortho_rh_no(box[0][0] - padding, box[1][0] + padding,
box[0][1] - padding, box[1][1] + padding,
-(box[1][2] + padding), -(box[0][2] - padding),
dest);
}
/*!
* @brief set up orthographic projection matrix using bounding box
* with a right-hand coordinate system and a
* clip-space of [-1, 1].
*
* bounding box (AABB) must be in view space
*
* @param[in] box AABB
* @param[in] padding padding for near and far
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_ortho_aabb_pz_rh_no(vec3 box[2], float padding, mat4 dest) {
glm_ortho_rh_no(box[0][0], box[1][0],
box[0][1], box[1][1],
-(box[1][2] + padding), -(box[0][2] - padding),
dest);
}
/*!
* @brief set up unit orthographic projection matrix
* with a right-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] aspect aspect ration ( width / height )
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_ortho_default_rh_no(float aspect, mat4 dest) {
if (aspect >= 1.0f) {
glm_ortho_rh_no(-aspect, aspect, -1.0f, 1.0f, -100.0f, 100.0f, dest);
return;
}
aspect = 1.0f / aspect;
glm_ortho_rh_no(-1.0f, 1.0f, -aspect, aspect, -100.0f, 100.0f, dest);
}
/*!
* @brief set up orthographic projection matrix with given CUBE size
* with a right-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] aspect aspect ratio ( width / height )
* @param[in] size cube size
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_ortho_default_s_rh_no(float aspect, float size, mat4 dest) {
if (aspect >= 1.0f) {
glm_ortho_rh_no(-size * aspect,
size * aspect,
-size,
size,
-size - 100.0f,
size + 100.0f,
dest);
return;
}
glm_ortho_rh_no(-size,
size,
-size / aspect,
size / aspect,
-size - 100.0f,
size + 100.0f,
dest);
}
#endif /*cglm_ortho_rh_no_h*/

View File

@@ -0,0 +1,181 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
/*
Functions:
CGLM_INLINE void glm_ortho_rh_zo(float left, float right,
float bottom, float top,
float nearZ, float farZ,
mat4 dest)
CGLM_INLINE void glm_ortho_aabb_rh_zo(vec3 box[2], mat4 dest)
CGLM_INLINE void glm_ortho_aabb_p_rh_zo(vec3 box[2],
float padding,
mat4 dest)
CGLM_INLINE void glm_ortho_aabb_pz_rh_zo(vec3 box[2],
float padding,
mat4 dest)
CGLM_INLINE void glm_ortho_default_rh_zo(float aspect,
mat4 dest)
CGLM_INLINE void glm_ortho_default_s_rh_zo(float aspect,
float size,
mat4 dest)
*/
#ifndef cglm_ortho_rh_zo_h
#define cglm_ortho_rh_zo_h
#include "../common.h"
#include "../plane.h"
#include "../mat4.h"
/*!
* @brief set up orthographic projection matrix with a right-hand coordinate
* system and a clip-space of [0, 1].
*
* @param[in] left viewport.left
* @param[in] right viewport.right
* @param[in] bottom viewport.bottom
* @param[in] top viewport.top
* @param[in] nearZ near clipping plane
* @param[in] farZ far clipping plane
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_ortho_rh_zo(float left, float right,
float bottom, float top,
float nearZ, float farZ,
mat4 dest) {
float rl, tb, fn;
glm_mat4_zero(dest);
rl = 1.0f / (right - left);
tb = 1.0f / (top - bottom);
fn =-1.0f / (farZ - nearZ);
dest[0][0] = 2.0f * rl;
dest[1][1] = 2.0f * tb;
dest[2][2] = fn;
dest[3][0] =-(right + left) * rl;
dest[3][1] =-(top + bottom) * tb;
dest[3][2] = nearZ * fn;
dest[3][3] = 1.0f;
}
/*!
* @brief set up orthographic projection matrix using bounding box
* with a right-hand coordinate system and a clip-space with depth
* values from zero to one.
*
* bounding box (AABB) must be in view space
*
* @param[in] box AABB
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_ortho_aabb_rh_zo(vec3 box[2], mat4 dest) {
glm_ortho_rh_zo(box[0][0], box[1][0],
box[0][1], box[1][1],
-box[1][2], -box[0][2],
dest);
}
/*!
* @brief set up orthographic projection matrix using bounding box
* with a right-hand coordinate system and a clip-space with depth
* values from zero to one.
*
* bounding box (AABB) must be in view space
*
* @param[in] box AABB
* @param[in] padding padding
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_ortho_aabb_p_rh_zo(vec3 box[2], float padding, mat4 dest) {
glm_ortho_rh_zo(box[0][0] - padding, box[1][0] + padding,
box[0][1] - padding, box[1][1] + padding,
-(box[1][2] + padding), -(box[0][2] - padding),
dest);
}
/*!
* @brief set up orthographic projection matrix using bounding box
* with a right-hand coordinate system and a clip-space with depth
* values from zero to one.
*
* bounding box (AABB) must be in view space
*
* @param[in] box AABB
* @param[in] padding padding for near and far
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_ortho_aabb_pz_rh_zo(vec3 box[2], float padding, mat4 dest) {
glm_ortho_rh_zo(box[0][0], box[1][0],
box[0][1], box[1][1],
-(box[1][2] + padding), -(box[0][2] - padding),
dest);
}
/*!
* @brief set up unit orthographic projection matrix with a right-hand
* coordinate system and a clip-space of [0, 1].
*
* @param[in] aspect aspect ration ( width / height )
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_ortho_default_rh_zo(float aspect, mat4 dest) {
if (aspect >= 1.0f) {
glm_ortho_rh_zo(-aspect, aspect, -1.0f, 1.0f, -100.0f, 100.0f, dest);
return;
}
aspect = 1.0f / aspect;
glm_ortho_rh_zo(-1.0f, 1.0f, -aspect, aspect, -100.0f, 100.0f, dest);
}
/*!
* @brief set up orthographic projection matrix with given CUBE size
* with a right-hand coordinate system and a clip-space with depth
* values from zero to one.
*
* @param[in] aspect aspect ratio ( width / height )
* @param[in] size cube size
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_ortho_default_s_rh_zo(float aspect, float size, mat4 dest) {
if (aspect >= 1.0f) {
glm_ortho_rh_zo(-size * aspect,
size * aspect,
-size,
size,
-size - 100.0f,
size + 100.0f,
dest);
return;
}
glm_ortho_rh_zo(-size,
size,
-size / aspect,
size / aspect,
-size - 100.0f,
size + 100.0f,
dest);
}
#endif /*cglm_ortho_rh_zo_h*/

View File

@@ -0,0 +1,48 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
/*
Functions:
CGLM_INLINE void glm_persp_decomp_far(mat4 proj, float *farZ)
CGLM_INLINE float glm_persp_fovy(mat4 proj)
CGLM_INLINE float glm_persp_aspect(mat4 proj)
CGLM_INLINE void glm_persp_sizes(mat4 proj, float fovy, vec4 dest)
*/
#ifndef cglm_persp_h
#define cglm_persp_h
#include "../common.h"
#include "../plane.h"
#include "../mat4.h"
/*!
* @brief returns field of view angle along the Y-axis (in radians)
*
* if you need to degrees, use glm_deg to convert it or use this:
* fovy_deg = glm_deg(glm_persp_fovy(projMatrix))
*
* @param[in] proj perspective projection matrix
*/
CGLM_INLINE
float
glm_persp_fovy(mat4 proj) {
return 2.0f * atanf(1.0f / proj[1][1]);
}
/*!
* @brief returns aspect ratio of perspective projection
*
* @param[in] proj perspective projection matrix
*/
CGLM_INLINE
float
glm_persp_aspect(mat4 proj) {
return proj[1][1] / proj[0][0];
}
#endif /* cglm_persp_h */

View File

@@ -0,0 +1,395 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
/*
Functions:
CGLM_INLINE void glm_frustum_lh_no(float left, float right,
float bottom, float top,
float nearZ, float farZ,
mat4 dest)
CGLM_INLINE void glm_perspective_lh_no(float fovy,
float aspect,
float nearZ,
float farZ,
mat4 dest)
CGLM_INLINE void glm_perspective_default_lh_no(float aspect, mat4 dest)
CGLM_INLINE void glm_perspective_resize_lh_no(float aspect, mat4 proj)
CGLM_INLINE void glm_persp_move_far_lh_no(mat4 proj,
float deltaFar)
CGLM_INLINE void glm_persp_decomp_lh_no(mat4 proj,
float * __restrict nearZ,
float * __restrict farZ,
float * __restrict top,
float * __restrict bottom,
float * __restrict left,
float * __restrict right)
CGLM_INLINE void glm_persp_decompv_lh_no(mat4 proj,
float dest[6])
CGLM_INLINE void glm_persp_decomp_x_lh_no(mat4 proj,
float * __restrict left,
float * __restrict right)
CGLM_INLINE void glm_persp_decomp_y_lh_no(mat4 proj,
float * __restrict top,
float * __restrict bottom)
CGLM_INLINE void glm_persp_decomp_z_lh_no(mat4 proj,
float * __restrict nearZ,
float * __restrict farZ)
CGLM_INLINE void glm_persp_decomp_far_lh_no(mat4 proj, float * __restrict farZ)
CGLM_INLINE void glm_persp_decomp_near_lh_no(mat4 proj, float * __restrict nearZ)
CGLM_INLINE void glm_persp_sizes_lh_no(mat4 proj, float fovy, vec4 dest)
*/
#ifndef cglm_persp_lh_no_h
#define cglm_persp_lh_no_h
#include "../common.h"
#include "persp.h"
/*!
* @brief set up perspective peprojection matrix
* with a left-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] left viewport.left
* @param[in] right viewport.right
* @param[in] bottom viewport.bottom
* @param[in] top viewport.top
* @param[in] nearZ near clipping plane
* @param[in] farZ far clipping plane
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_frustum_lh_no(float left, float right,
float bottom, float top,
float nearZ, float farZ,
mat4 dest) {
float rl, tb, fn, nv;
glm_mat4_zero(dest);
rl = 1.0f / (right - left);
tb = 1.0f / (top - bottom);
fn =-1.0f / (farZ - nearZ);
nv = 2.0f * nearZ;
dest[0][0] = nv * rl;
dest[1][1] = nv * tb;
dest[2][0] = (right + left) * rl;
dest[2][1] = (top + bottom) * tb;
dest[2][2] =-(farZ + nearZ) * fn;
dest[2][3] = 1.0f;
dest[3][2] = farZ * nv * fn;
}
/*!
* @brief set up perspective projection matrix
* with a left-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] fovy field of view angle
* @param[in] aspect aspect ratio ( width / height )
* @param[in] nearZ near clipping plane
* @param[in] farZ far clipping planes
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_perspective_lh_no(float fovy,
float aspect,
float nearZ,
float farZ,
mat4 dest) {
float f, fn;
glm_mat4_zero(dest);
f = 1.0f / tanf(fovy * 0.5f);
fn = 1.0f / (nearZ - farZ);
dest[0][0] = f / aspect;
dest[1][1] = f;
dest[2][2] =-(nearZ + farZ) * fn;
dest[2][3] = 1.0f;
dest[3][2] = 2.0f * nearZ * farZ * fn;
}
/*!
* @brief set up perspective projection matrix with default near/far
* and angle values with a left-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] aspect aspect ratio ( width / height )
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_perspective_default_lh_no(float aspect, mat4 dest) {
glm_perspective_lh_no(GLM_PI_4f, aspect, 0.01f, 100.0f, dest);
}
/*!
* @brief resize perspective matrix by aspect ratio ( width / height )
* this makes very easy to resize proj matrix when window /viewport
* resized with a left-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] aspect aspect ratio ( width / height )
* @param[in, out] proj perspective projection matrix
*/
CGLM_INLINE
void
glm_perspective_resize_lh_no(float aspect, mat4 proj) {
if (proj[0][0] == 0.0f)
return;
proj[0][0] = proj[1][1] / aspect;
}
/*!
* @brief extend perspective projection matrix's far distance
* with a left-hand coordinate system and a
* clip-space of [-1, 1].
*
* 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_lh_no(mat4 proj, float deltaFar) {
float fn, farZ, nearZ, p22, p32;
p22 = -proj[2][2];
p32 = proj[3][2];
nearZ = p32 / (p22 - 1.0f);
farZ = p32 / (p22 + 1.0f) + deltaFar;
fn = 1.0f / (nearZ - farZ);
proj[2][2] = -(farZ + nearZ) * fn;
proj[3][2] = 2.0f * nearZ * farZ * fn;
}
/*!
* @brief decomposes frustum values of perspective projection
* with a left-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] proj perspective projection matrix
* @param[out] nearZ near
* @param[out] farZ far
* @param[out] top top
* @param[out] bottom bottom
* @param[out] left left
* @param[out] right right
*/
CGLM_INLINE
void
glm_persp_decomp_lh_no(mat4 proj,
float * __restrict nearZ, float * __restrict farZ,
float * __restrict top, float * __restrict bottom,
float * __restrict left, float * __restrict right) {
float m00, m11, m20, m21, m22, m32, n, f;
float n_m11, n_m00;
m00 = proj[0][0];
m11 = proj[1][1];
m20 = proj[2][0];
m21 = proj[2][1];
m22 =-proj[2][2];
m32 = proj[3][2];
n = m32 / (m22 - 1.0f);
f = m32 / (m22 + 1.0f);
n_m11 = n / m11;
n_m00 = n / m00;
*nearZ = n;
*farZ = f;
*bottom = n_m11 * (m21 - 1.0f);
*top = n_m11 * (m21 + 1.0f);
*left = n_m00 * (m20 - 1.0f);
*right = n_m00 * (m20 + 1.0f);
}
/*!
* @brief decomposes frustum values of perspective projection
* with a left-hand coordinate system and a
* clip-space of [-1, 1].
* this makes easy to get all values at once
*
* @param[in] proj perspective projection matrix
* @param[out] dest array
*/
CGLM_INLINE
void
glm_persp_decompv_lh_no(mat4 proj, float dest[6]) {
glm_persp_decomp_lh_no(proj, &dest[0], &dest[1], &dest[2],
&dest[3], &dest[4], &dest[5]);
}
/*!
* @brief decomposes left and right values of perspective projection
* with a left-hand coordinate system and a
* clip-space of [-1, 1].
* x stands for x axis (left / right axis)
*
* @param[in] proj perspective projection matrix
* @param[out] left left
* @param[out] right right
*/
CGLM_INLINE
void
glm_persp_decomp_x_lh_no(mat4 proj,
float * __restrict left,
float * __restrict right) {
float nearZ, m20, m00, m22;
m00 = proj[0][0];
m20 = proj[2][0];
m22 =-proj[2][2];
nearZ = proj[3][2] / (m22 - 1.0f);
*left = nearZ * (m20 - 1.0f) / m00;
*right = nearZ * (m20 + 1.0f) / m00;
}
/*!
* @brief decomposes top and bottom values of perspective projection
* with a left-hand coordinate system and a
* clip-space of [-1, 1].
* y stands for y axis (top / botom axis)
*
* @param[in] proj perspective projection matrix
* @param[out] top top
* @param[out] bottom bottom
*/
CGLM_INLINE
void
glm_persp_decomp_y_lh_no(mat4 proj,
float * __restrict top,
float * __restrict bottom) {
float nearZ, m21, m11, m22;
m21 = proj[2][1];
m11 = proj[1][1];
m22 =-proj[2][2];
nearZ = proj[3][2] / (m22 - 1.0f);
*bottom = nearZ * (m21 - 1.0f) / m11;
*top = nearZ * (m21 + 1.0f) / m11;
}
/*!
* @brief decomposes near and far values of perspective projection
* with a left-hand coordinate system and a
* clip-space of [-1, 1].
* z stands for z axis (near / far axis)
*
* @param[in] proj perspective projection matrix
* @param[out] nearZ near
* @param[out] farZ far
*/
CGLM_INLINE
void
glm_persp_decomp_z_lh_no(mat4 proj,
float * __restrict nearZ,
float * __restrict farZ) {
float m32, m22;
m32 = proj[3][2];
m22 =-proj[2][2];
*nearZ = m32 / (m22 - 1.0f);
*farZ = m32 / (m22 + 1.0f);
}
/*!
* @brief decomposes far value of perspective projection
* with a left-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] proj perspective projection matrix
* @param[out] farZ far
*/
CGLM_INLINE
void
glm_persp_decomp_far_lh_no(mat4 proj, float * __restrict farZ) {
*farZ = proj[3][2] / (-proj[2][2] + 1.0f);
}
/*!
* @brief decomposes near value of perspective projection
* with a left-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] proj perspective projection matrix
* @param[out] nearZ near
*/
CGLM_INLINE
void
glm_persp_decomp_near_lh_no(mat4 proj, float * __restrict nearZ) {
*nearZ = proj[3][2] / (-proj[2][2] - 1.0f);
}
/*!
* @brief returns sizes of near and far planes of perspective projection
* with a left-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] proj perspective projection matrix
* @param[in] fovy fovy (see brief)
* @param[out] dest sizes order: [Wnear, Hnear, Wfar, Hfar]
*/
CGLM_INLINE
void
glm_persp_sizes_lh_no(mat4 proj, float fovy, vec4 dest) {
float t, a, nearZ, farZ;
t = 2.0f * tanf(fovy * 0.5f);
a = glm_persp_aspect(proj);
glm_persp_decomp_z_lh_no(proj, &nearZ, &farZ);
dest[1] = t * nearZ;
dest[3] = t * farZ;
dest[0] = a * dest[1];
dest[2] = a * dest[3];
}
/*!
* @brief returns field of view angle along the Y-axis (in radians)
* with a left-hand coordinate system and a clip-space of [-1, 1].
*
* if you need to degrees, use glm_deg to convert it or use this:
* fovy_deg = glm_deg(glm_persp_fovy(projMatrix))
*
* @param[in] proj perspective projection matrix
*/
CGLM_INLINE
float
glm_persp_fovy_lh_no(mat4 proj) {
return glm_persp_fovy(proj);
}
/*!
* @brief returns aspect ratio of perspective projection
* with a left-hand coordinate system and a clip-space of [-1, 1].
*
* @param[in] proj perspective projection matrix
*/
CGLM_INLINE
float
glm_persp_aspect_lh_no(mat4 proj) {
return glm_persp_aspect(proj);
}
#endif /*cglm_cam_lh_no_h*/

View File

@@ -0,0 +1,387 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
/*
Functions:
CGLM_INLINE void glm_frustum_lh_zo(float left, float right,
float bottom, float top,
float nearZ, float farZ,
mat4 dest)
CGLM_INLINE void glm_perspective_lh_zo(float fovy,
float aspect,
float nearZ,
float farZ,
mat4 dest)
CGLM_INLINE void glm_perspective_default_lh_zo(float aspect, mat4 dest)
CGLM_INLINE void glm_perspective_resize_lh_zo(float aspect, mat4 proj)
CGLM_INLINE void glm_persp_move_far_lh_zo(mat4 proj,
float deltaFar)
CGLM_INLINE void glm_persp_decomp_lh_zo(mat4 proj,
float * __restrict nearZ,
float * __restrict farZ,
float * __restrict top,
float * __restrict bottom,
float * __restrict left,
float * __restrict right)
CGLM_INLINE void glm_persp_decompv_lh_zo(mat4 proj,
float dest[6])
CGLM_INLINE void glm_persp_decomp_x_lh_zo(mat4 proj,
float * __restrict left,
float * __restrict right)
CGLM_INLINE void glm_persp_decomp_y_lh_zo(mat4 proj,
float * __restrict top,
float * __restrict bottom)
CGLM_INLINE void glm_persp_decomp_z_lh_zo(mat4 proj,
float * __restrict nearZ,
float * __restrict farZ)
CGLM_INLINE void glm_persp_decomp_far_lh_zo(mat4 proj, float * __restrict farZ)
CGLM_INLINE void glm_persp_decomp_near_lh_zo(mat4 proj, float * __restrict nearZ)
CGLM_INLINE void glm_persp_sizes_lh_zo(mat4 proj, float fovy, vec4 dest)
*/
#ifndef cglm_persp_lh_zo_h
#define cglm_persp_lh_zo_h
#include "../common.h"
#include "persp.h"
/*!
* @brief set up perspective peprojection matrix with a left-hand coordinate
* system and a clip-space of [0, 1].
*
* @param[in] left viewport.left
* @param[in] right viewport.right
* @param[in] bottom viewport.bottom
* @param[in] top viewport.top
* @param[in] nearZ near clipping plane
* @param[in] farZ far clipping plane
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_frustum_lh_zo(float left, float right,
float bottom, float top,
float nearZ, float farZ,
mat4 dest) {
float rl, tb, fn, nv;
glm_mat4_zero(dest);
rl = 1.0f / (right - left);
tb = 1.0f / (top - bottom);
fn =-1.0f / (farZ - nearZ);
nv = 2.0f * nearZ;
dest[0][0] = nv * rl;
dest[1][1] = nv * tb;
dest[2][0] = (right + left) * rl;
dest[2][1] = (top + bottom) * tb;
dest[2][2] =-farZ * fn;
dest[2][3] = 1.0f;
dest[3][2] = farZ * nearZ * fn;
}
/*!
* @brief set up perspective projection matrix with a left-hand coordinate
* system and a clip-space of [0, 1].
*
* @param[in] fovy field of view angle
* @param[in] aspect aspect ratio ( width / height )
* @param[in] nearZ near clipping plane
* @param[in] farZ far clipping planes
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_perspective_lh_zo(float fovy,
float aspect,
float nearZ,
float farZ,
mat4 dest) {
float f, fn;
glm_mat4_zero(dest);
f = 1.0f / tanf(fovy * 0.5f);
fn = 1.0f / (nearZ - farZ);
dest[0][0] = f / aspect;
dest[1][1] = f;
dest[2][2] =-farZ * fn;
dest[2][3] = 1.0f;
dest[3][2] = nearZ * farZ * fn;
}
/*!
* @brief extend perspective projection matrix's far distance with a
* left-hand coordinate system and a clip-space with depth values
* from zero to one.
*
* 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_lh_zo(mat4 proj, float deltaFar) {
float fn, farZ, nearZ, p22, p32;
p22 = -proj[2][2];
p32 = proj[3][2];
nearZ = p32 / p22;
farZ = p32 / (p22 + 1.0f) + deltaFar;
fn = 1.0f / (nearZ - farZ);
proj[2][2] = -farZ * fn;
proj[3][2] = nearZ * farZ * fn;
}
/*!
* @brief set up perspective projection matrix with default near/far
* and angle values with a left-hand coordinate system and a
* clip-space of [0, 1].
*
* @param[in] aspect aspect ratio ( width / height )
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_perspective_default_lh_zo(float aspect, mat4 dest) {
glm_perspective_lh_zo(GLM_PI_4f, aspect, 0.01f, 100.0f, dest);
}
/*!
* @brief resize perspective matrix by aspect ratio ( width / height )
* this makes very easy to resize proj matrix when window /viewport
* reized
*
* @param[in] aspect aspect ratio ( width / height )
* @param[in, out] proj perspective projection matrix
*/
CGLM_INLINE
void
glm_perspective_resize_lh_zo(float aspect, mat4 proj) {
if (proj[0][0] == 0.0f)
return;
proj[0][0] = proj[1][1] / aspect;
}
/*!
* @brief decomposes frustum values of perspective projection
* with angle values with a left-hand coordinate system and a
* clip-space of [0, 1].
*
* @param[in] proj perspective projection matrix
* @param[out] nearZ near
* @param[out] farZ far
* @param[out] top top
* @param[out] bottom bottom
* @param[out] left left
* @param[out] right right
*/
CGLM_INLINE
void
glm_persp_decomp_lh_zo(mat4 proj,
float * __restrict nearZ, float * __restrict farZ,
float * __restrict top, float * __restrict bottom,
float * __restrict left, float * __restrict right) {
float m00, m11, m20, m21, m22, m32, n, f;
float n_m11, n_m00;
m00 = proj[0][0];
m11 = proj[1][1];
m20 = proj[2][0];
m21 = proj[2][1];
m22 =-proj[2][2];
m32 = proj[3][2];
n = m32 / m22;
f = m32 / (m22 + 1.0f);
n_m11 = n / m11;
n_m00 = n / m00;
*nearZ = n;
*farZ = f;
*bottom = n_m11 * (m21 - 1.0f);
*top = n_m11 * (m21 + 1.0f);
*left = n_m00 * (m20 - 1.0f);
*right = n_m00 * (m20 + 1.0f);
}
/*!
* @brief decomposes frustum values of perspective projection
* with angle values with a left-hand coordinate system and a
* clip-space of [0, 1].
* this makes easy to get all values at once
*
* @param[in] proj perspective projection matrix
* @param[out] dest array
*/
CGLM_INLINE
void
glm_persp_decompv_lh_zo(mat4 proj, float dest[6]) {
glm_persp_decomp_lh_zo(proj, &dest[0], &dest[1], &dest[2],
&dest[3], &dest[4], &dest[5]);
}
/*!
* @brief decomposes left and right values of perspective projection (ZO).
* x stands for x axis (left / right axis)
*
* @param[in] proj perspective projection matrix
* @param[out] left left
* @param[out] right right
*/
CGLM_INLINE
void
glm_persp_decomp_x_lh_zo(mat4 proj,
float * __restrict left,
float * __restrict right) {
float nearZ, m20, m00;
m00 = proj[0][0];
m20 = proj[2][0];
nearZ = proj[3][2] / (proj[3][3]);
*left = nearZ * (m20 - 1.0f) / m00;
*right = nearZ * (m20 + 1.0f) / m00;
}
/*!
* @brief decomposes top and bottom values of perspective projection
* with angle values with a left-hand coordinate system and a
* clip-space of [0, 1].
* y stands for y axis (top / bottom axis)
*
* @param[in] proj perspective projection matrix
* @param[out] top top
* @param[out] bottom bottom
*/
CGLM_INLINE
void
glm_persp_decomp_y_lh_zo(mat4 proj,
float * __restrict top,
float * __restrict bottom) {
float nearZ, m21, m11;
m21 = proj[2][1];
m11 = proj[1][1];
nearZ = proj[3][2] / (proj[3][3]);
*bottom = nearZ * (m21 - 1) / m11;
*top = nearZ * (m21 + 1) / m11;
}
/*!
* @brief decomposes near and far values of perspective projection
* with angle values with a left-hand coordinate system and a
* clip-space of [0, 1].
* z stands for z axis (near / far axis)
*
* @param[in] proj perspective projection matrix
* @param[out] nearZ near
* @param[out] farZ far
*/
CGLM_INLINE
void
glm_persp_decomp_z_lh_zo(mat4 proj,
float * __restrict nearZ,
float * __restrict farZ) {
float m32, m22;
m32 = proj[3][2];
m22 = -proj[2][2];
*nearZ = m32 / m22;
*farZ = m32 / (m22 + 1.0f);
}
/*!
* @brief decomposes far value of perspective projection
* with angle values with a left-hand coordinate system and a
* clip-space of [0, 1].
*
* @param[in] proj perspective projection matrix
* @param[out] farZ far
*/
CGLM_INLINE
void
glm_persp_decomp_far_lh_zo(mat4 proj, float * __restrict farZ) {
*farZ = proj[3][2] / (-proj[2][2] + 1.0f);
}
/*!
* @brief decomposes near value of perspective projection
* with angle values with a left-hand coordinate system and a
* clip-space of [0, 1].
*
* @param[in] proj perspective projection matrix
* @param[out] nearZ near
*/
CGLM_INLINE
void
glm_persp_decomp_near_lh_zo(mat4 proj, float * __restrict nearZ) {
*nearZ = proj[3][2] / -proj[2][2];
}
/*!
* @brief returns sizes of near and far planes of perspective projection
* with a left-hand coordinate system and a
* clip-space of [0, 1].
*
* @param[in] proj perspective projection matrix
* @param[in] fovy fovy (see brief)
* @param[out] dest sizes order: [Wnear, Hnear, Wfar, Hfar]
*/
CGLM_INLINE
void
glm_persp_sizes_lh_zo(mat4 proj, float fovy, vec4 dest) {
float t, a, nearZ, farZ;
t = 2.0f * tanf(fovy * 0.5f);
a = glm_persp_aspect(proj);
glm_persp_decomp_z_lh_zo(proj, &nearZ, &farZ);
dest[1] = t * nearZ;
dest[3] = t * farZ;
dest[0] = a * dest[1];
dest[2] = a * dest[3];
}
/*!
* @brief returns field of view angle along the Y-axis (in radians)
* with a left-hand coordinate system and a clip-space of [0, 1].
*
* if you need to degrees, use glm_deg to convert it or use this:
* fovy_deg = glm_deg(glm_persp_fovy(projMatrix))
*
* @param[in] proj perspective projection matrix
*/
CGLM_INLINE
float
glm_persp_fovy_lh_zo(mat4 proj) {
return glm_persp_fovy(proj);
}
/*!
* @brief returns aspect ratio of perspective projection
* with a left-hand coordinate system and a clip-space of [0, 1].
*
* @param[in] proj perspective projection matrix
*/
CGLM_INLINE
float
glm_persp_aspect_lh_zo(mat4 proj) {
return glm_persp_aspect(proj);
}
#endif /*cglm_persp_lh_zo_h*/

View File

@@ -0,0 +1,395 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
/*
Functions:
CGLM_INLINE void glm_frustum_rh_no(float left, float right,
float bottom, float top,
float nearZ, float farZ,
mat4 dest)
CGLM_INLINE void glm_perspective_rh_no(float fovy,
float aspect,
float nearZ,
float farZ,
mat4 dest)
CGLM_INLINE void glm_perspective_default_rh_no(float aspect, mat4 dest)
CGLM_INLINE void glm_perspective_resize_rh_no(float aspect, mat4 proj)
CGLM_INLINE void glm_persp_move_far_rh_no(mat4 proj,
float deltaFar)
CGLM_INLINE void glm_persp_decomp_rh_no(mat4 proj,
float * __restrict nearZ,
float * __restrict farZ,
float * __restrict top,
float * __restrict bottom,
float * __restrict left,
float * __restrict right)
CGLM_INLINE void glm_persp_decompv_rh_no(mat4 proj,
float dest[6])
CGLM_INLINE void glm_persp_decomp_x_rh_no(mat4 proj,
float * __restrict left,
float * __restrict right)
CGLM_INLINE void glm_persp_decomp_y_rh_no(mat4 proj,
float * __restrict top,
float * __restrict bottom)
CGLM_INLINE void glm_persp_decomp_z_rh_no(mat4 proj,
float * __restrict nearZ,
float * __restrict farZ)
CGLM_INLINE void glm_persp_decomp_far_rh_no(mat4 proj, float * __restrict farZ)
CGLM_INLINE void glm_persp_decomp_near_rh_no(mat4 proj, float * __restrict nearZ)
CGLM_INLINE void glm_persp_sizes_rh_no(mat4 proj, float fovy, vec4 dest)
*/
#ifndef cglm_persp_rh_no_h
#define cglm_persp_rh_no_h
#include "../common.h"
#include "persp.h"
/*!
* @brief set up perspective peprojection matrix
* with a right-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] left viewport.left
* @param[in] right viewport.right
* @param[in] bottom viewport.bottom
* @param[in] top viewport.top
* @param[in] nearZ near clipping plane
* @param[in] farZ far clipping plane
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_frustum_rh_no(float left, float right,
float bottom, float top,
float nearZ, float farZ,
mat4 dest) {
float rl, tb, fn, nv;
glm_mat4_zero(dest);
rl = 1.0f / (right - left);
tb = 1.0f / (top - bottom);
fn =-1.0f / (farZ - nearZ);
nv = 2.0f * nearZ;
dest[0][0] = nv * rl;
dest[1][1] = nv * tb;
dest[2][0] = (right + left) * rl;
dest[2][1] = (top + bottom) * tb;
dest[2][2] = (farZ + nearZ) * fn;
dest[2][3] =-1.0f;
dest[3][2] = farZ * nv * fn;
}
/*!
* @brief set up perspective projection matrix
* with a right-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] fovy field of view angle
* @param[in] aspect aspect ratio ( width / height )
* @param[in] nearZ near clipping plane
* @param[in] farZ far clipping planes
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_perspective_rh_no(float fovy,
float aspect,
float nearZ,
float farZ,
mat4 dest) {
float f, fn;
glm_mat4_zero(dest);
f = 1.0f / tanf(fovy * 0.5f);
fn = 1.0f / (nearZ - farZ);
dest[0][0] = f / aspect;
dest[1][1] = f;
dest[2][2] = (nearZ + farZ) * fn;
dest[2][3] =-1.0f;
dest[3][2] = 2.0f * nearZ * farZ * fn;
}
/*!
* @brief set up perspective projection matrix with default near/far
* and angle values with a right-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] aspect aspect ratio ( width / height )
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_perspective_default_rh_no(float aspect, mat4 dest) {
glm_perspective_rh_no(GLM_PI_4f, aspect, 0.01f, 100.0f, dest);
}
/*!
* @brief resize perspective matrix by aspect ratio ( width / height )
* this makes very easy to resize proj matrix when window /viewport
* resized with a right-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] aspect aspect ratio ( width / height )
* @param[in, out] proj perspective projection matrix
*/
CGLM_INLINE
void
glm_perspective_resize_rh_no(float aspect, mat4 proj) {
if (proj[0][0] == 0.0f)
return;
proj[0][0] = proj[1][1] / aspect;
}
/*!
* @brief extend perspective projection matrix's far distance
* with a right-hand coordinate system and a
* clip-space of [-1, 1].
*
* 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_rh_no(mat4 proj, float deltaFar) {
float fn, farZ, nearZ, p22, p32;
p22 = proj[2][2];
p32 = proj[3][2];
nearZ = p32 / (p22 - 1.0f);
farZ = p32 / (p22 + 1.0f) + deltaFar;
fn = 1.0f / (nearZ - farZ);
proj[2][2] = (farZ + nearZ) * fn;
proj[3][2] = 2.0f * nearZ * farZ * fn;
}
/*!
* @brief decomposes frustum values of perspective projection
* with a right-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] proj perspective projection matrix
* @param[out] nearZ near
* @param[out] farZ far
* @param[out] top top
* @param[out] bottom bottom
* @param[out] left left
* @param[out] right right
*/
CGLM_INLINE
void
glm_persp_decomp_rh_no(mat4 proj,
float * __restrict nearZ, float * __restrict farZ,
float * __restrict top, float * __restrict bottom,
float * __restrict left, float * __restrict right) {
float m00, m11, m20, m21, m22, m32, n, f;
float n_m11, n_m00;
m00 = proj[0][0];
m11 = proj[1][1];
m20 = proj[2][0];
m21 = proj[2][1];
m22 = proj[2][2];
m32 = proj[3][2];
n = m32 / (m22 - 1.0f);
f = m32 / (m22 + 1.0f);
n_m11 = n / m11;
n_m00 = n / m00;
*nearZ = n;
*farZ = f;
*bottom = n_m11 * (m21 - 1.0f);
*top = n_m11 * (m21 + 1.0f);
*left = n_m00 * (m20 - 1.0f);
*right = n_m00 * (m20 + 1.0f);
}
/*!
* @brief decomposes frustum values of perspective projection
* with a right-hand coordinate system and a
* clip-space of [-1, 1].
* this makes easy to get all values at once
*
* @param[in] proj perspective projection matrix
* @param[out] dest array
*/
CGLM_INLINE
void
glm_persp_decompv_rh_no(mat4 proj, float dest[6]) {
glm_persp_decomp_rh_no(proj, &dest[0], &dest[1], &dest[2],
&dest[3], &dest[4], &dest[5]);
}
/*!
* @brief decomposes left and right values of perspective projection
* with a right-hand coordinate system and a
* clip-space of [-1, 1].
* x stands for x axis (left / right axis)
*
* @param[in] proj perspective projection matrix
* @param[out] left left
* @param[out] right right
*/
CGLM_INLINE
void
glm_persp_decomp_x_rh_no(mat4 proj,
float * __restrict left,
float * __restrict right) {
float nearZ, m20, m00, m22;
m00 = proj[0][0];
m20 = proj[2][0];
m22 = proj[2][2];
nearZ = proj[3][2] / (m22 - 1.0f);
*left = nearZ * (m20 - 1.0f) / m00;
*right = nearZ * (m20 + 1.0f) / m00;
}
/*!
* @brief decomposes top and bottom values of perspective projection
* with a right-hand coordinate system and a
* clip-space of [-1, 1].
* y stands for y axis (top / botom axis)
*
* @param[in] proj perspective projection matrix
* @param[out] top top
* @param[out] bottom bottom
*/
CGLM_INLINE
void
glm_persp_decomp_y_rh_no(mat4 proj,
float * __restrict top,
float * __restrict bottom) {
float nearZ, m21, m11, m22;
m21 = proj[2][1];
m11 = proj[1][1];
m22 = proj[2][2];
nearZ = proj[3][2] / (m22 - 1.0f);
*bottom = nearZ * (m21 - 1.0f) / m11;
*top = nearZ * (m21 + 1.0f) / m11;
}
/*!
* @brief decomposes near and far values of perspective projection
* with a right-hand coordinate system and a
* clip-space of [-1, 1].
* z stands for z axis (near / far axis)
*
* @param[in] proj perspective projection matrix
* @param[out] nearZ near
* @param[out] farZ far
*/
CGLM_INLINE
void
glm_persp_decomp_z_rh_no(mat4 proj,
float * __restrict nearZ,
float * __restrict farZ) {
float m32, m22;
m32 = proj[3][2];
m22 = proj[2][2];
*nearZ = m32 / (m22 - 1.0f);
*farZ = m32 / (m22 + 1.0f);
}
/*!
* @brief decomposes far value of perspective projection
* with a right-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] proj perspective projection matrix
* @param[out] farZ far
*/
CGLM_INLINE
void
glm_persp_decomp_far_rh_no(mat4 proj, float * __restrict farZ) {
*farZ = proj[3][2] / (proj[2][2] + 1.0f);
}
/*!
* @brief decomposes near value of perspective projection
* with a right-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] proj perspective projection matrix
* @param[out] nearZ near
*/
CGLM_INLINE
void
glm_persp_decomp_near_rh_no(mat4 proj, float * __restrict nearZ) {
*nearZ = proj[3][2] / (proj[2][2] - 1.0f);
}
/*!
* @brief returns sizes of near and far planes of perspective projection
* with a right-hand coordinate system and a
* clip-space of [-1, 1].
*
* @param[in] proj perspective projection matrix
* @param[in] fovy fovy (see brief)
* @param[out] dest sizes order: [Wnear, Hnear, Wfar, Hfar]
*/
CGLM_INLINE
void
glm_persp_sizes_rh_no(mat4 proj, float fovy, vec4 dest) {
float t, a, nearZ, farZ;
t = 2.0f * tanf(fovy * 0.5f);
a = glm_persp_aspect(proj);
glm_persp_decomp_z_rh_no(proj, &nearZ, &farZ);
dest[1] = t * nearZ;
dest[3] = t * farZ;
dest[0] = a * dest[1];
dest[2] = a * dest[3];
}
/*!
* @brief returns field of view angle along the Y-axis (in radians)
* with a right-hand coordinate system and a clip-space of [-1, 1].
*
* if you need to degrees, use glm_deg to convert it or use this:
* fovy_deg = glm_deg(glm_persp_fovy(projMatrix))
*
* @param[in] proj perspective projection matrix
*/
CGLM_INLINE
float
glm_persp_fovy_rh_no(mat4 proj) {
return glm_persp_fovy(proj);
}
/*!
* @brief returns aspect ratio of perspective projection
* with a right-hand coordinate system and a clip-space of [-1, 1].
*
* @param[in] proj perspective projection matrix
*/
CGLM_INLINE
float
glm_persp_aspect_rh_no(mat4 proj) {
return glm_persp_aspect(proj);
}
#endif /*cglm_cam_rh_no_h*/

View File

@@ -0,0 +1,389 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
/*
Functions:
CGLM_INLINE void glm_frustum_rh_zo(float left, float right,
float bottom, float top,
float nearZ, float farZ,
mat4 dest)
CGLM_INLINE void glm_perspective_rh_zo(float fovy,
float aspect,
float nearZ,
float farZ,
mat4 dest)
CGLM_INLINE void glm_perspective_default_rh_zo(float aspect, mat4 dest)
CGLM_INLINE void glm_perspective_resize_rh_zo(float aspect, mat4 proj)
CGLM_INLINE void glm_persp_move_far_rh_zo(mat4 proj,
float deltaFar)
CGLM_INLINE void glm_persp_decomp_rh_zo(mat4 proj,
float * __restrict nearZ,
float * __restrict farZ,
float * __restrict top,
float * __restrict bottom,
float * __restrict left,
float * __restrict right)
CGLM_INLINE void glm_persp_decompv_rh_zo(mat4 proj,
float dest[6])
CGLM_INLINE void glm_persp_decomp_x_rh_zo(mat4 proj,
float * __restrict left,
float * __restrict right)
CGLM_INLINE void glm_persp_decomp_y_rh_zo(mat4 proj,
float * __restrict top,
float * __restrict bottom)
CGLM_INLINE void glm_persp_decomp_z_rh_zo(mat4 proj,
float * __restrict nearZ,
float * __restrict farZ)
CGLM_INLINE void glm_persp_decomp_far_rh_zo(mat4 proj, float * __restrict farZ)
CGLM_INLINE void glm_persp_decomp_near_rh_zo(mat4 proj, float * __restrict nearZ)
CGLM_INLINE void glm_persp_sizes_rh_zo(mat4 proj, float fovy, vec4 dest)
*/
#ifndef cglm_persp_rh_zo_h
#define cglm_persp_rh_zo_h
#include "../common.h"
#include "persp.h"
/*!
* @brief set up perspective peprojection matrix with a right-hand coordinate
* system and a clip-space of [0, 1].
*
* @param[in] left viewport.left
* @param[in] right viewport.right
* @param[in] bottom viewport.bottom
* @param[in] top viewport.top
* @param[in] nearZ near clipping plane
* @param[in] farZ far clipping plane
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_frustum_rh_zo(float left, float right,
float bottom, float top,
float nearZ, float farZ,
mat4 dest) {
float rl, tb, fn, nv;
glm_mat4_zero(dest);
rl = 1.0f / (right - left);
tb = 1.0f / (top - bottom);
fn =-1.0f / (farZ - nearZ);
nv = 2.0f * nearZ;
dest[0][0] = nv * rl;
dest[1][1] = nv * tb;
dest[2][0] = (right + left) * rl;
dest[2][1] = (top + bottom) * tb;
dest[2][2] = farZ * fn;
dest[2][3] =-1.0f;
dest[3][2] = farZ * nearZ * fn;
}
/*!
* @brief set up perspective projection matrix with a right-hand coordinate
* system and a clip-space of [0, 1].
*
* @param[in] fovy field of view angle
* @param[in] aspect aspect ratio ( width / height )
* @param[in] nearZ near clipping plane
* @param[in] farZ far clipping planes
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_perspective_rh_zo(float fovy,
float aspect,
float nearZ,
float farZ,
mat4 dest) {
float f, fn;
glm_mat4_zero(dest);
f = 1.0f / tanf(fovy * 0.5f);
fn = 1.0f / (nearZ - farZ);
dest[0][0] = f / aspect;
dest[1][1] = f;
dest[2][2] = farZ * fn;
dest[2][3] =-1.0f;
dest[3][2] = nearZ * farZ * fn;
}
/*!
* @brief set up perspective projection matrix with default near/far
* and angle values with a right-hand coordinate system and a
* clip-space of [0, 1].
*
* @param[in] aspect aspect ratio ( width / height )
* @param[out] dest result matrix
*/
CGLM_INLINE
void
glm_perspective_default_rh_zo(float aspect, mat4 dest) {
glm_perspective_rh_zo(GLM_PI_4f, aspect, 0.01f, 100.0f, dest);
}
/*!
* @brief resize perspective matrix by aspect ratio ( width / height )
* this makes very easy to resize proj matrix when window /viewport
* resized with a right-hand coordinate system and a clip-space of
* [0, 1].
*
* @param[in] aspect aspect ratio ( width / height )
* @param[in, out] proj perspective projection matrix
*/
CGLM_INLINE
void
glm_perspective_resize_rh_zo(float aspect, mat4 proj) {
if (proj[0][0] == 0.0f)
return;
proj[0][0] = proj[1][1] / aspect;
}
/*!
* @brief extend perspective projection matrix's far distance with a
* right-hand coordinate system and a clip-space of [0, 1].
*
* 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_rh_zo(mat4 proj, float deltaFar) {
float fn, farZ, nearZ, p22, p32;
p22 = proj[2][2];
p32 = proj[3][2];
nearZ = p32 / p22;
farZ = p32 / (p22 + 1.0f) + deltaFar;
fn = 1.0f / (nearZ - farZ);
proj[2][2] = farZ * fn;
proj[3][2] = nearZ * farZ * fn;
}
/*!
* @brief decomposes frustum values of perspective projection
* with angle values with a right-hand coordinate system and a
* clip-space of [0, 1].
*
* @param[in] proj perspective projection matrix
* @param[out] nearZ near
* @param[out] farZ far
* @param[out] top top
* @param[out] bottom bottom
* @param[out] left left
* @param[out] right right
*/
CGLM_INLINE
void
glm_persp_decomp_rh_zo(mat4 proj,
float * __restrict nearZ, float * __restrict farZ,
float * __restrict top, float * __restrict bottom,
float * __restrict left, float * __restrict right) {
float m00, m11, m20, m21, m22, m32, n, f;
float n_m11, n_m00;
m00 = proj[0][0];
m11 = proj[1][1];
m20 = proj[2][0];
m21 = proj[2][1];
m22 = proj[2][2];
m32 = proj[3][2];
n = m32 / m22;
f = m32 / (m22 + 1.0f);
n_m11 = n / m11;
n_m00 = n / m00;
*nearZ = n;
*farZ = f;
*bottom = n_m11 * (m21 - 1.0f);
*top = n_m11 * (m21 + 1.0f);
*left = n_m00 * (m20 - 1.0f);
*right = n_m00 * (m20 + 1.0f);
}
/*!
* @brief decomposes frustum values of perspective projection
* with angle values with a right-hand coordinate system and a
* clip-space of [0, 1].
* this makes easy to get all values at once
*
* @param[in] proj perspective projection matrix
* @param[out] dest array
*/
CGLM_INLINE
void
glm_persp_decompv_rh_zo(mat4 proj, float dest[6]) {
glm_persp_decomp_rh_zo(proj, &dest[0], &dest[1], &dest[2],
&dest[3], &dest[4], &dest[5]);
}
/*!
* @brief decomposes left and right values of perspective projection (ZO).
* x stands for x axis (left / right axis)
*
* @param[in] proj perspective projection matrix
* @param[out] left left
* @param[out] right right
*/
CGLM_INLINE
void
glm_persp_decomp_x_rh_zo(mat4 proj,
float * __restrict left,
float * __restrict right) {
float nearZ, m20, m00, m22;
m00 = proj[0][0];
m20 = proj[2][0];
m22 = proj[2][2];
nearZ = proj[3][2] / m22;
*left = nearZ * (m20 - 1.0f) / m00;
*right = nearZ * (m20 + 1.0f) / m00;
}
/*!
* @brief decomposes top and bottom values of perspective projection
* with angle values with a right-hand coordinate system and a
* clip-space of [0, 1].
* y stands for y axis (top / bottom axis)
*
* @param[in] proj perspective projection matrix
* @param[out] top top
* @param[out] bottom bottom
*/
CGLM_INLINE
void
glm_persp_decomp_y_rh_zo(mat4 proj,
float * __restrict top,
float * __restrict bottom) {
float nearZ, m21, m11, m22;
m21 = proj[2][1];
m11 = proj[1][1];
m22 = proj[2][2];
nearZ = proj[3][2] / m22;
*bottom = nearZ * (m21 - 1) / m11;
*top = nearZ * (m21 + 1) / m11;
}
/*!
* @brief decomposes near and far values of perspective projection
* with angle values with a right-hand coordinate system and a
* clip-space of [0, 1].
* z stands for z axis (near / far axis)
*
* @param[in] proj perspective projection matrix
* @param[out] nearZ near
* @param[out] farZ far
*/
CGLM_INLINE
void
glm_persp_decomp_z_rh_zo(mat4 proj,
float * __restrict nearZ,
float * __restrict farZ) {
float m32, m22;
m32 = proj[3][2];
m22 = proj[2][2];
*nearZ = m32 / m22;
*farZ = m32 / (m22 + 1.0f);
}
/*!
* @brief decomposes far value of perspective projection
* with angle values with a right-hand coordinate system and a
* clip-space of [0, 1].
*
* @param[in] proj perspective projection matrix
* @param[out] farZ far
*/
CGLM_INLINE
void
glm_persp_decomp_far_rh_zo(mat4 proj, float * __restrict farZ) {
*farZ = proj[3][2] / (proj[2][2] + 1.0f);
}
/*!
* @brief decomposes near value of perspective projection
* with angle values with a right-hand coordinate system and a
* clip-space of [0, 1].
*
* @param[in] proj perspective projection matrix
* @param[out] nearZ near
*/
CGLM_INLINE
void
glm_persp_decomp_near_rh_zo(mat4 proj, float * __restrict nearZ) {
*nearZ = proj[3][2] / proj[2][2];
}
/*!
* @brief returns sizes of near and far planes of perspective projection
* with a right-hand coordinate system and a
* clip-space of [0, 1].
*
* @param[in] proj perspective projection matrix
* @param[in] fovy fovy (see brief)
* @param[out] dest sizes order: [Wnear, Hnear, Wfar, Hfar]
*/
CGLM_INLINE
void
glm_persp_sizes_rh_zo(mat4 proj, float fovy, vec4 dest) {
float t, a, nearZ, farZ;
t = 2.0f * tanf(fovy * 0.5f);
a = glm_persp_aspect(proj);
glm_persp_decomp_z_rh_zo(proj, &nearZ, &farZ);
dest[1] = t * nearZ;
dest[3] = t * farZ;
dest[0] = a * dest[1];
dest[2] = a * dest[3];
}
/*!
* @brief returns field of view angle along the Y-axis (in radians)
* with a right-hand coordinate system and a clip-space of [0, 1].
*
* if you need to degrees, use glm_deg to convert it or use this:
* fovy_deg = glm_deg(glm_persp_fovy(projMatrix))
*
* @param[in] proj perspective projection matrix
*/
CGLM_INLINE
float
glm_persp_fovy_rh_zo(mat4 proj) {
return glm_persp_fovy(proj);
}
/*!
* @brief returns aspect ratio of perspective projection
* with a right-hand coordinate system and a clip-space of [0, 1].
*
* @param[in] proj perspective projection matrix
*/
CGLM_INLINE
float
glm_persp_aspect_rh_zo(mat4 proj) {
return glm_persp_aspect(proj);
}
#endif /*cglm_persp_rh_zo_h*/

Some files were not shown because too many files have changed in this diff Show More