Compare commits

..

212 Commits

Author SHA1 Message Date
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
92 changed files with 3269 additions and 492 deletions

1
.gitattributes vendored Normal file
View File

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

4
.gitignore vendored
View File

@@ -72,3 +72,7 @@ cglm-test-ios*
/cglm.pc
test-driver
Default-568h@2x.png
build/
conftest.dir/*
confdefs.h
*.xcuserdatad

View File

@@ -4,6 +4,12 @@ os:
- linux
- osx
arch:
- amd64
- ppc64le
- s390x
- arm64
sudo: required
dist: trusty

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"
}

137
CMakeLists.txt Normal file
View File

@@ -0,0 +1,137 @@
cmake_minimum_required(VERSION 3.8.2)
project(cglm VERSION 0.8.2 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
)
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)

13
CREDITS
View File

@@ -65,3 +65,16 @@ https://forums.khronos.org/showthread.php/10651-Animation-TCB-Spline-Interpolati
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

View File

@@ -12,7 +12,6 @@ AM_CFLAGS = -Wall \
-O3 \
-Wstrict-aliasing=2 \
-fstrict-aliasing \
-pedantic \
-Werror=strict-prototypes
lib_LTLIBRARIES = libcglm.la
@@ -22,6 +21,9 @@ checkLDFLAGS = -L./.libs \
-lm \
-lcglm
checkCFLAGS = $(AM_CFLAGS) \
-std=gnu11 \
-O3 \
-DCGLM_DEFINE_PRINTS \
-I./include
check_PROGRAMS = test/tests
@@ -63,7 +65,9 @@ cglm_HEADERS = include/cglm/version.h \
include/cglm/ease.h \
include/cglm/curve.h \
include/cglm/bezier.h \
include/cglm/applesimd.h
include/cglm/applesimd.h \
include/cglm/ray.h \
include/cglm/affine2d.h
cglm_calldir=$(includedir)/cglm/call
cglm_call_HEADERS = include/cglm/call/mat4.h \
@@ -84,7 +88,9 @@ cglm_call_HEADERS = include/cglm/call/mat4.h \
include/cglm/call/sphere.h \
include/cglm/call/ease.h \
include/cglm/call/curve.h \
include/cglm/call/bezier.h
include/cglm/call/bezier.h \
include/cglm/call/ray.h \
include/cglm/call/affine2d.h
cglm_simddir=$(includedir)/cglm/simd
cglm_simd_HEADERS = include/cglm/simd/intrin.h \
@@ -95,6 +101,7 @@ 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
@@ -107,6 +114,7 @@ cglm_simd_neon_HEADERS = include/cglm/simd/neon/mat4.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 \
@@ -124,7 +132,8 @@ cglm_struct_HEADERS = include/cglm/struct/mat4.h \
include/cglm/struct/project.h \
include/cglm/struct/sphere.h \
include/cglm/struct/color.h \
include/cglm/struct/curve.h
include/cglm/struct/curve.h \
include/cglm/struct/affine2d.h
libcglm_la_SOURCES=\
src/euler.c \
@@ -145,7 +154,9 @@ libcglm_la_SOURCES=\
src/sphere.c \
src/ease.c \
src/curve.c \
src/bezier.c
src/bezier.c \
src/ray.c \
src/affine2d.c
test_tests_SOURCES=\
test/runner.c \

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
)

117
README.md
View File

@@ -25,6 +25,7 @@ you have the latest version
- **[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)
#### Note for C++ developers:
If you are not aware of the original GLM library yet, you may also want to look at:
@@ -89,6 +90,7 @@ Currently *cglm* uses default clip space configuration (-1, 1) for camera functi
- 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 />
@@ -148,6 +150,119 @@ The types used are actually unions that allow access to the same data multiple w
## Build
### CMake (All platforms)
```bash
$ mkdir build
$ cd build
$ cmake .. # [Optional] -DCGLM_SHARED=ON
$ make
$ sudo make install # [Optional]
```
##### Cmake options with Defaults:
```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.
* 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_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
@@ -291,7 +406,7 @@ You can pass matrices the same way to other APIs e.g. Vulkan, DX...
## Contributors
This project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)].
<a href="graphs/contributors"><img src="https://opencollective.com/cglm/contributors.svg?width=890&button=false" /></a>
<a href="https://github.com/recp/cglm/graphs/contributors"><img src="https://opencollective.com/cglm/contributors.svg?width=890&button=false" /></a>
## Backers

View File

@@ -2,10 +2,10 @@ Pod::Spec.new do |s|
# Description
s.name = "cglm"
s.version = "0.6.1"
s.summary = "📽 Optimized OpenGL/Graphics Math (glm) for C"
s.version = "0.8.1"
s.summary = "📽 Highly Optimized Graphics Math (glm) for C"
s.description = <<-DESC
cglm is math library for graphics programming for C. It is similar to original glm but it is written for C instead of C++ (you can use here too). See the documentation or README for all features.
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"
@@ -25,4 +25,13 @@ cglm is math library for graphics programming for C. It is similar to original g
# 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,7 +7,7 @@
#*****************************************************************************
AC_PREREQ([2.69])
AC_INIT([cglm], [0.7.0], [info@recp.me])
AC_INIT([cglm], [0.8.2], [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.

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

View File

@@ -1,6 +1,6 @@
.. default-domain:: C
affine transforms
3D Affine Transforms
================================================================================
Header: cglm/affine.h
@@ -45,6 +45,8 @@ The implementation would be:
glm_rotate(m, angle, axis);
glm_translate(m, pivotInv); /* pivotInv = -pivot */
.. _TransformsOrder:
Transforms Order
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

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

@@ -28,6 +28,7 @@ Follow the :doc:`build` documentation for this
affine
affine-mat
affine2d
cam
frustum
box
@@ -51,3 +52,5 @@ Follow the :doc:`build` documentation for this
sphere
curve
bezier
version
ray

View File

@@ -7,6 +7,97 @@ Build cglm
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
CMake (All platforms):
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code-block:: bash
:linenos:
$ 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):
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

View File

@@ -198,7 +198,7 @@ Functions documentation
Parameters:
| *[in]* **eye** eye vector
| *[in]* **center** direction vector
| *[in]* **dir** direction vector
| *[in]* **up** up vector
| *[out]* **dest** result matrix
@@ -212,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.7.0'
version = u'0.8.2'
# The full version, including alpha/beta/rc tags.
release = u'0.7.0'
release = u'0.8.2'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
@@ -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']

View File

@@ -1,10 +1,11 @@
Features
================================================================================
* 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)
@@ -20,4 +21,6 @@ Features
* easing functions
* curves
* curve interpolation helpers (SMC, deCasteljau...)
* and other...
* 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

@@ -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):
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

View File

@@ -156,16 +156,22 @@ 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)

View File

@@ -18,7 +18,7 @@ versor: 16 byte
By starting **v0.4.5** cglm provides an option to disable alignment requirement.
To enable this option define **CGLM_ALL_UNALIGNED** macro before all headers.
You can define it in Xcode, Visual Studio (or other IDEs) or you can also prefer
to define it in build system. If you use pre-compiled verisons then you
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
@@ -50,3 +50,36 @@ You have to extra options for dot product: **CGLM_SSE4_DOT** and **CGLM_SSE3_DOT
- 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

@@ -374,7 +374,7 @@ Functions documentation
| *[in]* **q** quaternion
| *[in]* **pivot** pivot
.. c:function:: void glm_quat_rotate(mat4 m, versor q, mat4 dest)
.. 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

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

View File

@@ -80,6 +80,19 @@ So be carefull, when your IDE (Xcode, Visual Studio ...) tried to autocomplete f
**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?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

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
~~~~~~~~~~~~~~~~~~~~~~~
@@ -146,7 +147,7 @@ Functions documentation
| *[in]* **b** b
Returns:
true if a and b equals
true if a and b are equal
.. c:function:: float glm_percent(float from, float to, float current)
@@ -158,7 +159,7 @@ Functions documentation
| *[in]* **current** value between from and to values
Returns:
clamped normalized percent (0-100 in 0-1)
percentage of current value
.. c:function:: float glm_percentc(float from, float to, float current)
@@ -171,3 +172,11 @@ Functions documentation
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

View File

@@ -55,12 +55,12 @@ Functions:
Functions documentation
~~~~~~~~~~~~~~~~~~~~~~~
.. c:function:: void glm_vec2(vec4 v4, vec2 dest)
.. c:function:: void glm_vec2(float * v, vec2 dest)
init vec2 using vec3
init vec2 using vec3 or vec4
Parameters:
| *[in]* **v3** vector3
| *[in]* **v** vector
| *[out]* **dest** destination
.. c:function:: void glm_vec2_copy(vec2 a, vec2 dest)

View File

@@ -392,7 +392,7 @@ Functions documentation
Parameters:
| *[in, out]* **v** vector
| *[in]* **axis** axis vector (will be normalized)
| *[out]* **angle** angle (radians)
| *[in]* **angle** angle (radians)
.. c:function:: void glm_vec3_rotate_m4(mat4 m, vec3 v, vec3 dest)
@@ -435,8 +435,8 @@ Functions documentation
squared distance between two vectors
Parameters:
| *[in]* **mat** vector1
| *[in]* **row1** vector2
| *[in]* **v1** vector1
| *[in]* **v2** vector2
Returns:
| squared distance (distance * distance)
@@ -446,8 +446,8 @@ Functions documentation
distance between two vectors
Parameters:
| *[in]* **mat** vector1
| *[in]* **row1** vector2
| *[in]* **v1** vector1
| *[in]* **v2** vector2
Returns:
| distance
@@ -475,7 +475,7 @@ Functions documentation
possible orthogonal/perpendicular vector
Parameters:
| *[in]* **mat** vector
| *[in]* **v** vector
| *[out]* **dest** orthogonal/perpendicular vector
.. c:function:: void glm_vec3_clamp(vec3 v, float minVal, float maxVal)

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

@@ -26,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
*
@@ -49,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],
@@ -103,6 +109,8 @@ 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],

View File

@@ -40,10 +40,6 @@
#include "mat4.h"
#include "affine-mat.h"
CGLM_INLINE
void
glm_mat4_mul(mat4 m1, mat4 m2, mat4 dest);
/*!
* @brief translate existing transform matrix by v vector
* and stores result in same matrix
@@ -54,26 +50,22 @@ glm_mat4_mul(mat4 m1, mat4 m2, mat4 dest);
CGLM_INLINE
void
glm_translate(mat4 m, vec3 v) {
#if defined( __SSE__ ) || defined( __SSE2__ )
#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],
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_load(m[0]),
_mm_set1_ps(v[0])),
_mm_mul_ps(glmm_load(m[1]),
_mm_set1_ps(v[1]))),
_mm_add_ps(_mm_mul_ps(glmm_load(m[2]),
_mm_set1_ps(v[2])),
glmm_load(m[3]))))
;
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
}
@@ -103,12 +95,8 @@ glm_translate_to(mat4 m, vec3 v, mat4 dest) {
CGLM_INLINE
void
glm_translate_x(mat4 m, float x) {
#if defined( __SSE__ ) || defined( __SSE2__ )
glmm_store(m[3],
_mm_add_ps(_mm_mul_ps(glmm_load(m[0]),
_mm_set1_ps(x)),
glmm_load(m[3])))
;
#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);
@@ -125,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__ )
glmm_store(m[3],
_mm_add_ps(_mm_mul_ps(glmm_load(m[1]),
_mm_set1_ps(y)),
glmm_load(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);
@@ -147,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__ )
glmm_store(m[3],
_mm_add_ps(_mm_mul_ps(glmm_load(m[2]),
_mm_set1_ps(z)),
glmm_load(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);
@@ -459,7 +439,7 @@ glm_decompose_rs(mat4 m, mat4 r, vec3 s) {
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_vec3_cross(m[0], m[1], v);

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

View File

@@ -228,6 +228,8 @@ glm_aabb_aabb(vec3 box[2], vec3 other[2]) {
* 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
*/
@@ -237,13 +239,13 @@ glm_aabb_sphere(vec3 box[2], vec4 s) {
float dmin;
int a, b, c;
a = s[0] >= box[0][0];
b = s[1] >= box[0][1];
c = s[2] >= box[0][2];
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][0])
+ glm_pow2(s[1] - box[b][1])
+ glm_pow2(s[2] - box[c][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]);
}

View File

@@ -31,6 +31,8 @@ extern "C" {
#include "call/ease.h"
#include "call/curve.h"
#include "call/bezier.h"
#include "call/ray.h"
#include "call/affine2d.h"
#ifdef __cplusplus
}

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

@@ -7,6 +7,7 @@
#ifndef cglmc_io_h
#define cglmc_io_h
#ifdef __cplusplus
extern "C" {
#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

@@ -30,5 +30,7 @@
#include "ease.h"
#include "curve.h"
#include "bezier.h"
#include "ray.h"
#include "affine2d.h"
#endif /* cglm_h */

View File

@@ -8,7 +8,13 @@
#ifndef cglm_common_h
#define cglm_common_h
#define _USE_MATH_DEFINES /* for windows */
#ifndef _USE_MATH_DEFINES
# define _USE_MATH_DEFINES /* for windows */
#endif
#ifndef _CRT_SECURE_NO_WARNINGS
# define _CRT_SECURE_NO_WARNINGS /* for windows */
#endif
#include <stdint.h>
#include <stddef.h>
@@ -17,7 +23,9 @@
#include <stdbool.h>
#if defined(_MSC_VER)
# ifdef CGLM_DLL
# ifdef CGLM_STATIC
# define CGLM_EXPORT
# elif defined(CGLM_EXPORTS)
# define CGLM_EXPORT __declspec(dllexport)
# else
# define CGLM_EXPORT __declspec(dllimport)
@@ -34,4 +42,12 @@
#include "types.h"
#include "simd/intrin.h"
#ifndef CGLM_USE_DEFAULT_EPSILON
# ifndef GLM_FLT_EPSILON
# define GLM_FLT_EPSILON 1e-6
# endif
#else
# define GLM_FLT_EPSILON FLT_EPSILON
#endif
#endif /* cglm_common_h */

View File

@@ -55,8 +55,6 @@ typedef enum glm_euler_seq {
GLM_EULER_ZYX = 2 << 0 | 1 << 2 | 0 << 4
} glm_euler_seq;
typedef glm_euler_seq glm_euler_sq;
CGLM_INLINE
glm_euler_seq
glm_euler_order(int ord[3]) {

View File

@@ -15,69 +15,130 @@
CGLM_INLINE void glm_versor_print(versor vec, FILE *ostream);
*/
/*
cglm tried to enable print functions in debug mode and disable them in
release/production mode to eliminate printing costs.
if you need to force enable then define CGLM_DEFINE_PRINTS macro not DEBUG one
Print functions are enabled if:
- DEBUG or _DEBUG macro is defined (mostly defined automatically in debugging)
- CGLM_DEFINE_PRINTS macro is defined including release/production
which makes enabled printing always
- glmc_ calls for io are always prints
*/
/* DEPRECATED: CGLM_NO_PRINTS_NOOP (use CGLM_DEFINE_PRINTS) */
#ifndef cglm_io_h
#define cglm_io_h
#if defined(DEBUG) || defined(_DEBUG) \
|| defined(CGLM_DEFINE_PRINTS) || defined(CGLM_LIB_SRC) \
|| defined(CGLM_NO_PRINTS_NOOP)
#include "common.h"
#include <stdio.h>
#include <stdlib.h>
#ifndef CGLM_PRINT_PRECISION
# define CGLM_PRINT_PRECISION 5
#endif
#ifndef CGLM_PRINT_MAX_TO_SHORT
# define CGLM_PRINT_MAX_TO_SHORT 1e5
#endif
#ifndef CGLM_PRINT_COLOR
# define CGLM_PRINT_COLOR "\033[36m"
#endif
#ifndef CGLM_PRINT_COLOR_RESET
# define CGLM_PRINT_COLOR_RESET "\033[0m"
#endif
CGLM_INLINE
void
glm_mat4_print(mat4 matrix,
FILE * __restrict ostream) {
int i;
int j;
char buff[16];
int i, j, cw[4], cwi;
#define m 4
#define n 4
fprintf(ostream, "Matrix (float%dx%d):\n", m, n);
fprintf(ostream, "Matrix (float%dx%d): " CGLM_PRINT_COLOR "\n" , m, n);
cw[0] = cw[1] = cw[2] = cw[3] = 0;
for (i = 0; i < m; i++) {
fprintf(ostream, "\t|");
for (j = 0; j < n; j++) {
fprintf(ostream, "%0.4f", matrix[j][i]);;
if (j != n - 1)
fprintf(ostream, "\t");
if (matrix[i][j] < CGLM_PRINT_MAX_TO_SHORT)
cwi = sprintf(buff, "% .*f", CGLM_PRINT_PRECISION, matrix[i][j]);
else
cwi = sprintf(buff, "% g", matrix[i][j]);
cw[i] = GLM_MAX(cw[i], cwi);
}
}
fprintf(ostream, "|\n");
for (i = 0; i < m; i++) {
fprintf(ostream, " |");
for (j = 0; j < n; j++)
if (matrix[i][j] < CGLM_PRINT_MAX_TO_SHORT)
fprintf(ostream, " % *.*f", cw[j], CGLM_PRINT_PRECISION, matrix[j][i]);
else
fprintf(ostream, " % *g", cw[j], matrix[j][i]);
fprintf(ostream, " |\n");
}
fprintf(ostream, "\n");
fprintf(ostream, CGLM_PRINT_COLOR_RESET "\n");
#undef m
#undef n
}
CGLM_INLINE
void
glm_mat3_print(mat3 matrix,
FILE * __restrict ostream) {
int i;
int j;
char buff[16];
int i, j, cw[4], cwi;
#define m 3
#define n 3
fprintf(ostream, "Matrix (float%dx%d):\n", m, n);
fprintf(ostream, "Matrix (float%dx%d): " CGLM_PRINT_COLOR "\n", m, n);
cw[0] = cw[1] = cw[2] = 0;
for (i = 0; i < m; i++) {
fprintf(ostream, "\t|");
for (j = 0; j < n; j++) {
fprintf(ostream, "%0.4f", matrix[j][i]);;
if (j != n - 1)
fprintf(ostream, "\t");
if (matrix[i][j] < CGLM_PRINT_MAX_TO_SHORT)
cwi = sprintf(buff, "% .*f", CGLM_PRINT_PRECISION, matrix[i][j]);
else
cwi = sprintf(buff, "% g", matrix[i][j]);
cw[i] = GLM_MAX(cw[i], cwi);
}
}
fprintf(ostream, "|\n");
for (i = 0; i < m; i++) {
fprintf(ostream, " |");
for (j = 0; j < n; j++)
if (matrix[i][j] < CGLM_PRINT_MAX_TO_SHORT)
fprintf(ostream, " % *.*f", cw[j], CGLM_PRINT_PRECISION, matrix[j][i]);
else
fprintf(ostream, " % *g", cw[j], matrix[j][i]);
fprintf(ostream, " |\n");
}
fprintf(ostream, "\n");
fprintf(ostream, CGLM_PRINT_COLOR_RESET "\n");
#undef m
#undef n
@@ -87,27 +148,39 @@ CGLM_INLINE
void
glm_mat2_print(mat2 matrix,
FILE * __restrict ostream) {
int i;
int j;
char buff[16];
int i, j, cw[4], cwi;
#define m 2
#define n 2
fprintf(ostream, "Matrix (float%dx%d):\n", m, n);
fprintf(ostream, "Matrix (float%dx%d): " CGLM_PRINT_COLOR "\n", m, n);
cw[0] = cw[1] = 0;
for (i = 0; i < m; i++) {
fprintf(ostream, "\t|");
for (j = 0; j < n; j++) {
fprintf(ostream, "%0.4f", matrix[j][i]);;
if (j != n - 1)
fprintf(ostream, "\t");
if (matrix[i][j] < CGLM_PRINT_MAX_TO_SHORT)
cwi = sprintf(buff, "% .*f", CGLM_PRINT_PRECISION, matrix[i][j]);
else
cwi = sprintf(buff, "% g", matrix[i][j]);
cw[i] = GLM_MAX(cw[i], cwi);
}
}
fprintf(ostream, "|\n");
for (i = 0; i < m; i++) {
fprintf(ostream, " |");
for (j = 0; j < n; j++)
if (matrix[i][j] < CGLM_PRINT_MAX_TO_SHORT)
fprintf(ostream, " % *.*f", cw[j], CGLM_PRINT_PRECISION, matrix[j][i]);
else
fprintf(ostream, " % *g", cw[j], matrix[j][i]);
fprintf(ostream, " |\n");
}
fprintf(ostream, "\n");
fprintf(ostream, CGLM_PRINT_COLOR_RESET "\n");
#undef m
#undef n
@@ -121,16 +194,16 @@ glm_vec4_print(vec4 vec,
#define m 4
fprintf(ostream, "Vector (float%d):\n\t|", m);
fprintf(ostream, "Vector (float%d): " CGLM_PRINT_COLOR "\n (", m);
for (i = 0; i < m; i++) {
fprintf(ostream, "%0.4f", vec[i]);
if (i != m - 1)
fprintf(ostream, "\t");
if (vec[i] < CGLM_PRINT_MAX_TO_SHORT)
fprintf(ostream, " % .*f", CGLM_PRINT_PRECISION, vec[i]);
else
fprintf(ostream, " % g", vec[i]);
}
fprintf(ostream, "|\n\n");
fprintf(ostream, " )" CGLM_PRINT_COLOR_RESET "\n\n");
#undef m
}
@@ -143,16 +216,16 @@ glm_vec3_print(vec3 vec,
#define m 3
fprintf(ostream, "Vector (float%d):\n\t|", m);
fprintf(ostream, "Vector (float%d): " CGLM_PRINT_COLOR "\n (", m);
for (i = 0; i < m; i++) {
fprintf(ostream, "%0.4f", vec[i]);
if (i != m - 1)
fprintf(ostream, "\t");
if (vec[i] < CGLM_PRINT_MAX_TO_SHORT)
fprintf(ostream, " % .*f", CGLM_PRINT_PRECISION, vec[i]);
else
fprintf(ostream, " % g", vec[i]);
}
fprintf(ostream, "|\n\n");
fprintf(ostream, " )" CGLM_PRINT_COLOR_RESET "\n\n");
#undef m
}
@@ -165,16 +238,12 @@ glm_ivec3_print(ivec3 vec,
#define m 3
fprintf(ostream, "Vector (int%d):\n\t|", m);
fprintf(ostream, "Vector (int%d): " CGLM_PRINT_COLOR "\n (", m);
for (i = 0; i < m; i++) {
fprintf(ostream, "%d", vec[i]);
for (i = 0; i < m; i++)
fprintf(ostream, " % d", vec[i]);
if (i != m - 1)
fprintf(ostream, "\t");
}
fprintf(ostream, "|\n\n");
fprintf(ostream, " )" CGLM_PRINT_COLOR_RESET "\n\n");
#undef m
}
@@ -187,16 +256,16 @@ glm_vec2_print(vec2 vec,
#define m 2
fprintf(ostream, "Vector (float%d):\n\t|", m);
fprintf(ostream, "Vector (float%d): " CGLM_PRINT_COLOR "\n (", m);
for (i = 0; i < m; i++) {
fprintf(ostream, "%0.4f", vec[i]);
if (i != m - 1)
fprintf(ostream, "\t");
if (vec[i] < CGLM_PRINT_MAX_TO_SHORT)
fprintf(ostream, " % .*f", CGLM_PRINT_PRECISION, vec[i]);
else
fprintf(ostream, " % g", vec[i]);
}
fprintf(ostream, "|\n\n");
fprintf(ostream, " )" CGLM_PRINT_COLOR_RESET "\n\n");
#undef m
}
@@ -209,16 +278,17 @@ glm_versor_print(versor vec,
#define m 4
fprintf(ostream, "Versor (float%d):\n\t|", m);
fprintf(ostream, "Quaternion (float%d): " CGLM_PRINT_COLOR "\n (", m);
for (i = 0; i < m; i++) {
fprintf(ostream, "%0.4f", vec[i]);
if (i != m - 1)
fprintf(ostream, "\t");
if (vec[i] < CGLM_PRINT_MAX_TO_SHORT)
fprintf(ostream, " % .*f", CGLM_PRINT_PRECISION, vec[i]);
else
fprintf(ostream, " % g", vec[i]);
}
fprintf(ostream, "|\n\n");
fprintf(ostream, " )" CGLM_PRINT_COLOR_RESET "\n\n");
#undef m
}
@@ -232,24 +302,43 @@ glm_aabb_print(vec3 bbox[2],
#define m 3
fprintf(ostream, "AABB (%s):\n", tag ? tag: "float");
fprintf(ostream, "AABB (%s): " CGLM_PRINT_COLOR "\n", tag ? tag: "float");
for (i = 0; i < 2; i++) {
fprintf(ostream, "\t|");
fprintf(ostream, " (");
for (j = 0; j < m; j++) {
fprintf(ostream, "%0.4f", bbox[i][j]);
if (j != m - 1)
fprintf(ostream, "\t");
if (bbox[i][j] < CGLM_PRINT_MAX_TO_SHORT)
fprintf(ostream, " % .*f", CGLM_PRINT_PRECISION, bbox[i][j]);
else
fprintf(ostream, " % g", bbox[i][j]);
}
fprintf(ostream, "|\n");
fprintf(ostream, " )\n");
}
fprintf(ostream, "\n");
fprintf(ostream, CGLM_PRINT_COLOR_RESET "\n");
#undef m
}
#else
#include "common.h"
#include <stdio.h>
#include <stdlib.h>
/* NOOP: Remove print from DEBUG */
#define glm_mat4_print(v, s) (void)v; (void)s;
#define glm_mat3_print(v, s) (void)v; (void)s;
#define glm_mat2_print(v, s) (void)v; (void)s;
#define glm_vec4_print(v, s) (void)v; (void)s;
#define glm_vec3_print(v, s) (void)v; (void)s;
#define glm_ivec3_print(v, s) (void)v; (void)s;
#define glm_vec2_print(v, s) (void)v; (void)s;
#define glm_versor_print(v, s) (void)v; (void)s;
#define glm_aabb_print(v, t, s) (void)v; (void)t; (void)s;
#endif
#endif /* cglm_io_h */

View File

@@ -56,7 +56,7 @@
CGLM_INLINE
void
glm_mat2_copy(mat2 mat, mat2 dest) {
glm_vec4_copy(mat[0], dest[0]);
glm_vec4_ucopy(mat[0], dest[0]);
}
/*!
@@ -216,7 +216,16 @@ glm_mat2_trace(mat2 m) {
CGLM_INLINE
void
glm_mat2_scale(mat2 m, float s) {
glm_vec4_scale(m[0], s, m[0]);
#if defined( __SSE__ ) || defined( __SSE2__ )
glmm_store(m[0], _mm_mul_ps(_mm_loadu_ps(m[0]), _mm_set1_ps(s)));
#elif defined(CGLM_NEON_FP)
vst1q_f32(m[0], vmulq_f32(vld1q_f32(m[0]), vdupq_n_f32(s)));
#else
m[0][0] = m[0][0] * s;
m[0][1] = m[0][1] * s;
m[1][0] = m[1][0] * s;
m[1][1] = m[1][1] * s;
#endif
}
/*!

View File

@@ -228,9 +228,11 @@ glm_mat3_transpose(mat3 m) {
CGLM_INLINE
void
glm_mat3_mulv(mat3 m, vec3 v, vec3 dest) {
dest[0] = m[0][0] * v[0] + m[1][0] * v[1] + m[2][0] * v[2];
dest[1] = m[0][1] * v[0] + m[1][1] * v[1] + m[2][1] * v[2];
dest[2] = m[0][2] * v[0] + m[1][2] * v[1] + m[2][2] * v[2];
vec3 res;
res[0] = m[0][0] * v[0] + m[1][0] * v[1] + m[2][0] * v[2];
res[1] = m[0][1] * v[0] + m[1][1] * v[1] + m[2][1] * v[2];
res[2] = m[0][2] * v[0] + m[1][2] * v[1] + m[2][2] * v[2];
glm_vec3_copy(res, dest);
}
/*!

View File

@@ -358,6 +358,8 @@ void
glm_mat4_mulv(mat4 m, vec4 v, vec4 dest) {
#if defined( __SSE__ ) || defined( __SSE2__ )
glm_mat4_mulv_sse2(m, v, dest);
#elif defined(CGLM_NEON_FP)
glm_mat4_mulv_neon(m, v, dest);
#else
vec4 res;
res[0] = m[0][0] * v[0] + m[1][0] * v[1] + m[2][0] * v[2] + m[3][0] * v[3];
@@ -476,6 +478,8 @@ void
glm_mat4_transpose_to(mat4 m, mat4 dest) {
#if defined( __SSE__ ) || defined( __SSE2__ )
glm_mat4_transp_sse2(m, dest);
#elif defined(CGLM_NEON_FP)
glm_mat4_transp_neon(m, dest);
#else
dest[0][0] = m[0][0]; dest[1][0] = m[0][1];
dest[0][1] = m[1][0]; dest[1][1] = m[1][1];
@@ -498,6 +502,8 @@ void
glm_mat4_transpose(mat4 m) {
#if defined( __SSE__ ) || defined( __SSE2__ )
glm_mat4_transp_sse2(m, m);
#elif defined(CGLM_NEON_FP)
glm_mat4_transp_neon(m, m);
#else
mat4 d;
glm_mat4_transpose_to(m, d);
@@ -533,15 +539,12 @@ glm_mat4_scale_p(mat4 m, float s) {
CGLM_INLINE
void
glm_mat4_scale(mat4 m, float s) {
#if defined( __SSE__ ) || defined( __SSE2__ )
#ifdef __AVX__
glm_mat4_scale_avx(m, s);
#elif defined( __SSE__ ) || defined( __SSE2__ )
glm_mat4_scale_sse2(m, s);
#elif defined(CGLM_NEON_FP)
float32x4_t v0;
v0 = vdupq_n_f32(s);
vst1q_f32(m[0], vmulq_f32(vld1q_f32(m[0]), v0));
vst1q_f32(m[1], vmulq_f32(vld1q_f32(m[1]), v0));
vst1q_f32(m[2], vmulq_f32(vld1q_f32(m[2]), v0));
vst1q_f32(m[3], vmulq_f32(vld1q_f32(m[3]), v0));
glm_mat4_scale_neon(m, s);
#else
glm_mat4_scale_p(m, s);
#endif
@@ -559,6 +562,8 @@ float
glm_mat4_det(mat4 mat) {
#if defined( __SSE__ ) || defined( __SSE2__ )
return glm_mat4_det_sse2(mat);
#elif defined(CGLM_NEON_FP)
return glm_mat4_det_neon(mat);
#else
/* [square] det(A) = det(At) */
float t[6];
@@ -592,6 +597,8 @@ void
glm_mat4_inv(mat4 mat, mat4 dest) {
#if defined( __SSE__ ) || defined( __SSE2__ )
glm_mat4_inv_sse2(mat, dest);
#elif defined(CGLM_NEON_FP)
glm_mat4_inv_neon(mat, dest);
#else
float t[6];
float det;

View File

@@ -63,10 +63,6 @@
# include "simd/sse2/quat.h"
#endif
CGLM_INLINE
void
glm_mat4_identity(mat4 mat);
CGLM_INLINE
void
glm_mat4_mulv(mat4 m, vec4 v, vec4 dest);

77
include/cglm/ray.h Normal file
View File

@@ -0,0 +1,77 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
/*
Functions:
CGLM_INLINE bool glm_line_triangle_intersect(vec3 origin,
vec3 direction,
vec3 v0,
vec3 v1,
vec3 v2,
float *d);
*/
#ifndef cglm_ray_h
#define cglm_ray_h
#include "vec3.h"
/*!
* @brief MöllerTrumbore ray-triangle intersection algorithm
*
* @param[in] origin origin of ray
* @param[in] direction direction of ray
* @param[in] v0 first vertex of triangle
* @param[in] v1 second vertex of triangle
* @param[in] v2 third vertex of triangle
* @param[in, out] d distance to intersection
* @return whether there is intersection
*/
CGLM_INLINE
bool
glm_ray_triangle(vec3 origin,
vec3 direction,
vec3 v0,
vec3 v1,
vec3 v2,
float *d) {
vec3 edge1, edge2, p, t, q;
float det, inv_det, u, v, dist;
const float epsilon = 0.000001f;
glm_vec3_sub(v1, v0, edge1);
glm_vec3_sub(v2, v0, edge2);
glm_vec3_cross(direction, edge2, p);
det = glm_vec3_dot(edge1, p);
if (det > -epsilon && det < epsilon)
return false;
inv_det = 1.0f / det;
glm_vec3_sub(origin, v0, t);
u = inv_det * glm_vec3_dot(t, p);
if (u < 0.0f || u > 1.0f)
return false;
glm_vec3_cross(t, edge1, q);
v = inv_det * glm_vec3_dot(direction, q);
if (v < 0.0f || u + v > 1.0f)
return false;
dist = inv_det * glm_vec3_dot(edge2, q);
if (d)
*d = dist;
return dist > epsilon;
}
#endif

View File

@@ -10,19 +10,42 @@
#include "intrin.h"
#ifdef CGLM_SIMD_ARM
#if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || defined(__aarch64__)
# define CGLM_ARM64 1
#endif
#define glmm_load(p) vld1q_f32(p)
#define glmm_store(p, a) vst1q_f32(p, a)
#define glmm_set1(x) vdupq_n_f32(x)
#define glmm_128 float32x4_t
#define glmm_splat_x(x) vdupq_lane_f32(vget_low_f32(x), 0)
#define glmm_splat_y(x) vdupq_lane_f32(vget_low_f32(x), 1)
#define glmm_splat_z(x) vdupq_lane_f32(vget_high_f32(x), 0)
#define glmm_splat_w(x) vdupq_lane_f32(vget_high_f32(x), 1)
#define glmm_xor(a, b) \
vreinterpretq_f32_s32(veorq_s32(vreinterpretq_s32_f32(a), \
vreinterpretq_s32_f32(b)))
static inline
float32x4_t
glmm_abs(float32x4_t v) {
return vabsq_f32(v);
}
static inline
float32x4_t
glmm_vhadd(float32x4_t v) {
v = vaddq_f32(v, vrev64q_f32(v));
return vaddq_f32(v, vcombine_f32(vget_high_f32(v), vget_low_f32(v)));
}
static inline
float
glmm_hadd(float32x4_t v) {
#if defined(__aarch64__)
#if CGLM_ARM64
return vaddvq_f32(v);
#else
v = vaddq_f32(v, vrev64q_f32(v));
@@ -79,5 +102,58 @@ glmm_norm_inf(float32x4_t a) {
return glmm_hmax(glmm_abs(a));
}
static inline
float32x4_t
glmm_div(float32x4_t a, float32x4_t b) {
#if CGLM_ARM64
return vdivq_f32(a, b);
#else
/* 2 iterations of Newton-Raphson refinement of reciprocal */
float32x4_t r0, r1;
r0 = vrecpeq_f32(b);
r1 = vrecpsq_f32(r0, b);
r0 = vmulq_f32(r1, r0);
r1 = vrecpsq_f32(r0, b);
r0 = vmulq_f32(r1, r0);
return vmulq_f32(a, r0);
#endif
}
static inline
float32x4_t
glmm_fmadd(float32x4_t a, float32x4_t b, float32x4_t c) {
#if CGLM_ARM64
return vfmaq_f32(c, a, b); /* why vfmaq_f32 is slower than vmlaq_f32 ??? */
#else
return vmlaq_f32(c, a, b);
#endif
}
static inline
float32x4_t
glmm_fnmadd(float32x4_t a, float32x4_t b, float32x4_t c) {
#if CGLM_ARM64
return vfmsq_f32(c, a, b);
#else
return vmlsq_f32(c, a, b);
#endif
}
static inline
float32x4_t
glmm_fmsub(float32x4_t a, float32x4_t b, float32x4_t c) {
#if CGLM_ARM64
return vfmsq_f32(c, a, b);
#else
return vmlsq_f32(c, a, b);
#endif
}
static inline
float32x4_t
glmm_fnmsub(float32x4_t a, float32x4_t b, float32x4_t c) {
return vsubq_f32(vdupq_n_f32(0.0f), glmm_fmadd(a, b, c));
}
#endif
#endif /* cglm_simd_arm_h */

View File

@@ -14,6 +14,16 @@
#include <immintrin.h>
CGLM_INLINE
void
glm_mat4_scale_avx(mat4 m, float s) {
__m256 y0;
y0 = _mm256_set1_ps(s);
glmm_store256(m[0], _mm256_mul_ps(y0, glmm_load256(m[0])));
glmm_store256(m[2], _mm256_mul_ps(y0, glmm_load256(m[2])));
}
CGLM_INLINE
void
glm_mat4_mul_avx(mat4 m1, mat4 m2, mat4 dest) {

View File

@@ -0,0 +1,80 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#ifndef cglm_affine_neon_h
#define cglm_affine_neon_h
#if defined(__ARM_NEON_FP)
#include "../../common.h"
#include "../intrin.h"
CGLM_INLINE
void
glm_mul_neon(mat4 m1, mat4 m2, mat4 dest) {
/* D = R * L (Column-Major) */
glmm_128 l0, l1, l2, l3, r0, r1, r2, r3, v0, v1, v2, v3;
l0 = glmm_load(m1[0]); r0 = glmm_load(m2[0]);
l1 = glmm_load(m1[1]); r1 = glmm_load(m2[1]);
l2 = glmm_load(m1[2]); r2 = glmm_load(m2[2]);
l3 = glmm_load(m1[3]); r3 = glmm_load(m2[3]);
v0 = vmulq_f32(glmm_splat_x(r0), l0);
v1 = vmulq_f32(glmm_splat_x(r1), l0);
v2 = vmulq_f32(glmm_splat_x(r2), l0);
v3 = vmulq_f32(glmm_splat_x(r3), l0);
v0 = glmm_fmadd(glmm_splat_y(r0), l1, v0);
v1 = glmm_fmadd(glmm_splat_y(r1), l1, v1);
v2 = glmm_fmadd(glmm_splat_y(r2), l1, v2);
v3 = glmm_fmadd(glmm_splat_y(r3), l1, v3);
v0 = glmm_fmadd(glmm_splat_z(r0), l2, v0);
v1 = glmm_fmadd(glmm_splat_z(r1), l2, v1);
v2 = glmm_fmadd(glmm_splat_z(r2), l2, v2);
v3 = glmm_fmadd(glmm_splat_z(r3), l2, v3);
v3 = glmm_fmadd(glmm_splat_w(r3), l3, v3);
glmm_store(dest[0], v0);
glmm_store(dest[1], v1);
glmm_store(dest[2], v2);
glmm_store(dest[3], v3);
}
CGLM_INLINE
void
glm_mul_rot_neon(mat4 m1, mat4 m2, mat4 dest) {
/* D = R * L (Column-Major) */
glmm_128 l0, l1, l2, r0, r1, r2, v0, v1, v2;
l0 = glmm_load(m1[0]); r0 = glmm_load(m2[0]);
l1 = glmm_load(m1[1]); r1 = glmm_load(m2[1]);
l2 = glmm_load(m1[2]); r2 = glmm_load(m2[2]);
v0 = vmulq_f32(glmm_splat_x(r0), l0);
v1 = vmulq_f32(glmm_splat_x(r1), l0);
v2 = vmulq_f32(glmm_splat_x(r2), l0);
v0 = glmm_fmadd(glmm_splat_y(r0), l1, v0);
v1 = glmm_fmadd(glmm_splat_y(r1), l1, v1);
v2 = glmm_fmadd(glmm_splat_y(r2), l1, v2);
v0 = glmm_fmadd(glmm_splat_z(r0), l2, v0);
v1 = glmm_fmadd(glmm_splat_z(r1), l2, v1);
v2 = glmm_fmadd(glmm_splat_z(r2), l2, v2);
glmm_store(dest[0], v0);
glmm_store(dest[1], v1);
glmm_store(dest[2], v2);
glmm_store(dest[3], glmm_load(m1[3]));
}
#endif
#endif /* cglm_affine_neon_h */

View File

@@ -12,45 +12,301 @@
#include "../../common.h"
#include "../intrin.h"
CGLM_INLINE
void
glm_mat4_scale_neon(mat4 m, float s) {
float32x4_t v0;
v0 = vdupq_n_f32(s);
vst1q_f32(m[0], vmulq_f32(vld1q_f32(m[0]), v0));
vst1q_f32(m[1], vmulq_f32(vld1q_f32(m[1]), v0));
vst1q_f32(m[2], vmulq_f32(vld1q_f32(m[2]), v0));
vst1q_f32(m[3], vmulq_f32(vld1q_f32(m[3]), v0));
}
CGLM_INLINE
void
glm_mat4_transp_neon(mat4 m, mat4 dest) {
float32x4x4_t vmat;
vmat = vld4q_f32(m[0]);
vst1q_f32(dest[0], vmat.val[0]);
vst1q_f32(dest[1], vmat.val[1]);
vst1q_f32(dest[2], vmat.val[2]);
vst1q_f32(dest[3], vmat.val[3]);
}
CGLM_INLINE
void
glm_mat4_mul_neon(mat4 m1, mat4 m2, mat4 dest) {
/* D = R * L (Column-Major) */
float32x4_t l0, l1, l2, l3, r, d0, d1, d2, d3;
l0 = vld1q_f32(m2[0]);
l1 = vld1q_f32(m2[1]);
l2 = vld1q_f32(m2[2]);
l3 = vld1q_f32(m2[3]);
glmm_128 l0, l1, l2, l3, r0, r1, r2, r3, v0, v1, v2, v3;
r = vld1q_f32(m1[0]);
d0 = vmulq_lane_f32(r, vget_low_f32(l0), 0);
d1 = vmulq_lane_f32(r, vget_low_f32(l1), 0);
d2 = vmulq_lane_f32(r, vget_low_f32(l2), 0);
d3 = vmulq_lane_f32(r, vget_low_f32(l3), 0);
l0 = glmm_load(m1[0]); r0 = glmm_load(m2[0]);
l1 = glmm_load(m1[1]); r1 = glmm_load(m2[1]);
l2 = glmm_load(m1[2]); r2 = glmm_load(m2[2]);
l3 = glmm_load(m1[3]); r3 = glmm_load(m2[3]);
r = vld1q_f32(m1[1]);
d0 = vmlaq_lane_f32(d0, r, vget_low_f32(l0), 1);
d1 = vmlaq_lane_f32(d1, r, vget_low_f32(l1), 1);
d2 = vmlaq_lane_f32(d2, r, vget_low_f32(l2), 1);
d3 = vmlaq_lane_f32(d3, r, vget_low_f32(l3), 1);
v0 = vmulq_f32(glmm_splat_x(r0), l0);
v1 = vmulq_f32(glmm_splat_x(r1), l0);
v2 = vmulq_f32(glmm_splat_x(r2), l0);
v3 = vmulq_f32(glmm_splat_x(r3), l0);
r = vld1q_f32(m1[2]);
d0 = vmlaq_lane_f32(d0, r, vget_high_f32(l0), 0);
d1 = vmlaq_lane_f32(d1, r, vget_high_f32(l1), 0);
d2 = vmlaq_lane_f32(d2, r, vget_high_f32(l2), 0);
d3 = vmlaq_lane_f32(d3, r, vget_high_f32(l3), 0);
v0 = glmm_fmadd(glmm_splat_y(r0), l1, v0);
v1 = glmm_fmadd(glmm_splat_y(r1), l1, v1);
v2 = glmm_fmadd(glmm_splat_y(r2), l1, v2);
v3 = glmm_fmadd(glmm_splat_y(r3), l1, v3);
r = vld1q_f32(m1[3]);
d0 = vmlaq_lane_f32(d0, r, vget_high_f32(l0), 1);
d1 = vmlaq_lane_f32(d1, r, vget_high_f32(l1), 1);
d2 = vmlaq_lane_f32(d2, r, vget_high_f32(l2), 1);
d3 = vmlaq_lane_f32(d3, r, vget_high_f32(l3), 1);
v0 = glmm_fmadd(glmm_splat_z(r0), l2, v0);
v1 = glmm_fmadd(glmm_splat_z(r1), l2, v1);
v2 = glmm_fmadd(glmm_splat_z(r2), l2, v2);
v3 = glmm_fmadd(glmm_splat_z(r3), l2, v3);
vst1q_f32(dest[0], d0);
vst1q_f32(dest[1], d1);
vst1q_f32(dest[2], d2);
vst1q_f32(dest[3], d3);
v0 = glmm_fmadd(glmm_splat_w(r0), l3, v0);
v1 = glmm_fmadd(glmm_splat_w(r1), l3, v1);
v2 = glmm_fmadd(glmm_splat_w(r2), l3, v2);
v3 = glmm_fmadd(glmm_splat_w(r3), l3, v3);
glmm_store(dest[0], v0);
glmm_store(dest[1], v1);
glmm_store(dest[2], v2);
glmm_store(dest[3], v3);
}
CGLM_INLINE
void
glm_mat4_mulv_neon(mat4 m, vec4 v, vec4 dest) {
float32x4_t l0, l1, l2, l3;
float32x2_t vlo, vhi;
l0 = vld1q_f32(m[0]);
l1 = vld1q_f32(m[1]);
l2 = vld1q_f32(m[2]);
l3 = vld1q_f32(m[3]);
vlo = vld1_f32(&v[0]);
vhi = vld1_f32(&v[2]);
l0 = vmulq_lane_f32(l0, vlo, 0);
l0 = vmlaq_lane_f32(l0, l1, vlo, 1);
l0 = vmlaq_lane_f32(l0, l2, vhi, 0);
l0 = vmlaq_lane_f32(l0, l3, vhi, 1);
vst1q_f32(dest, l0);
}
CGLM_INLINE
float
glm_mat4_det_neon(mat4 mat) {
float32x4_t r0, r1, r2, r3, x0, x1, x2;
float32x2_t ij, op, mn, kl, nn, mm, jj, ii, gh, ef, t12, t34;
float32x4x2_t a1;
float32x4_t x3 = { 0.f, -0.f, 0.f, -0.f };
/* 127 <- 0, [square] det(A) = det(At) */
r0 = glmm_load(mat[0]); /* d c b a */
r1 = vrev64q_f32(glmm_load(mat[1])); /* g h e f */
r2 = vrev64q_f32(glmm_load(mat[2])); /* l k i j */
r3 = vrev64q_f32(glmm_load(mat[3])); /* o p m n */
gh = vget_high_f32(r1);
ef = vget_low_f32(r1);
kl = vget_high_f32(r2);
ij = vget_low_f32(r2);
op = vget_high_f32(r3);
mn = vget_low_f32(r3);
mm = vdup_lane_f32(mn, 1);
nn = vdup_lane_f32(mn, 0);
ii = vdup_lane_f32(ij, 1);
jj = vdup_lane_f32(ij, 0);
/*
t[1] = j * p - n * l;
t[2] = j * o - n * k;
t[3] = i * p - m * l;
t[4] = i * o - m * k;
*/
x0 = glmm_fnmadd(vcombine_f32(kl, kl), vcombine_f32(nn, mm),
vmulq_f32(vcombine_f32(op, op), vcombine_f32(jj, ii)));
t12 = vget_low_f32(x0);
t34 = vget_high_f32(x0);
/* 1 3 1 3 2 4 2 4 */
a1 = vuzpq_f32(x0, x0);
/*
t[0] = k * p - o * l;
t[0] = k * p - o * l;
t[5] = i * n - m * j;
t[5] = i * n - m * j;
*/
x1 = glmm_fnmadd(vcombine_f32(vdup_lane_f32(kl, 0), jj),
vcombine_f32(vdup_lane_f32(op, 1), mm),
vmulq_f32(vcombine_f32(vdup_lane_f32(op, 0), nn),
vcombine_f32(vdup_lane_f32(kl, 1), ii)));
/*
a * (f * t[0] - g * t[1] + h * t[2])
- b * (e * t[0] - g * t[3] + h * t[4])
+ c * (e * t[1] - f * t[3] + h * t[5])
- d * (e * t[2] - f * t[4] + g * t[5])
*/
x2 = glmm_fnmadd(vcombine_f32(vdup_lane_f32(gh, 1), vdup_lane_f32(ef, 0)),
vcombine_f32(vget_low_f32(a1.val[0]), t34),
vmulq_f32(vcombine_f32(ef, vdup_lane_f32(ef, 1)),
vcombine_f32(vget_low_f32(x1), t12)));
x2 = glmm_fmadd(vcombine_f32(vdup_lane_f32(gh, 0), gh),
vcombine_f32(vget_low_f32(a1.val[1]), vget_high_f32(x1)), x2);
x2 = glmm_xor(x2, x3);
return glmm_hadd(vmulq_f32(x2, r0));
}
CGLM_INLINE
void
glm_mat4_inv_neon(mat4 mat, mat4 dest) {
float32x4_t r0, r1, r2, r3,
v0, v1, v2, v3,
t0, t1, t2, t3, t4, t5,
x0, x1, x2, x3, x4, x5, x6, x7, x8;
float32x4x2_t a1;
float32x2_t lp, ko, hg, jn, im, fe, ae, bf, cg, dh;
float32x4_t x9 = { -0.f, 0.f, -0.f, 0.f };
x8 = vrev64q_f32(x9);
/* 127 <- 0 */
r0 = glmm_load(mat[0]); /* d c b a */
r1 = glmm_load(mat[1]); /* h g f e */
r2 = glmm_load(mat[2]); /* l k j i */
r3 = glmm_load(mat[3]); /* p o n m */
/* l p k o, j n i m */
a1 = vzipq_f32(r3, r2);
jn = vget_high_f32(a1.val[0]);
im = vget_low_f32(a1.val[0]);
lp = vget_high_f32(a1.val[1]);
ko = vget_low_f32(a1.val[1]);
hg = vget_high_f32(r1);
x1 = vcombine_f32(vdup_lane_f32(lp, 0), lp); /* l p p p */
x2 = vcombine_f32(vdup_lane_f32(ko, 0), ko); /* k o o o */
x0 = vcombine_f32(vdup_lane_f32(lp, 1), vdup_lane_f32(hg, 1)); /* h h l l */
x3 = vcombine_f32(vdup_lane_f32(ko, 1), vdup_lane_f32(hg, 0)); /* g g k k */
/* t1[0] = k * p - o * l;
t1[0] = k * p - o * l;
t2[0] = g * p - o * h;
t3[0] = g * l - k * h; */
t0 = glmm_fnmadd(x2, x0, vmulq_f32(x3, x1));
fe = vget_low_f32(r1);
x4 = vcombine_f32(vdup_lane_f32(jn, 0), jn); /* j n n n */
x5 = vcombine_f32(vdup_lane_f32(jn, 1), vdup_lane_f32(fe, 1)); /* f f j j */
/* t1[1] = j * p - n * l;
t1[1] = j * p - n * l;
t2[1] = f * p - n * h;
t3[1] = f * l - j * h; */
t1 = glmm_fnmadd(x4, x0, vmulq_f32(x5, x1));
/* t1[2] = j * o - n * k
t1[2] = j * o - n * k;
t2[2] = f * o - n * g;
t3[2] = f * k - j * g; */
t2 = glmm_fnmadd(x4, x3, vmulq_f32(x5, x2));
x6 = vcombine_f32(vdup_lane_f32(im, 1), vdup_lane_f32(fe, 0)); /* e e i i */
x7 = vcombine_f32(vdup_lane_f32(im, 0), im); /* i m m m */
/* t1[3] = i * p - m * l;
t1[3] = i * p - m * l;
t2[3] = e * p - m * h;
t3[3] = e * l - i * h; */
t3 = glmm_fnmadd(x7, x0, vmulq_f32(x6, x1));
/* t1[4] = i * o - m * k;
t1[4] = i * o - m * k;
t2[4] = e * o - m * g;
t3[4] = e * k - i * g; */
t4 = glmm_fnmadd(x7, x3, vmulq_f32(x6, x2));
/* t1[5] = i * n - m * j;
t1[5] = i * n - m * j;
t2[5] = e * n - m * f;
t3[5] = e * j - i * f; */
t5 = glmm_fnmadd(x7, x5, vmulq_f32(x6, x4));
/* h d f b, g c e a */
a1 = vtrnq_f32(r0, r1);
x4 = vrev64q_f32(a1.val[0]); /* c g a e */
x5 = vrev64q_f32(a1.val[1]); /* d h b f */
ae = vget_low_f32(x4);
cg = vget_high_f32(x4);
bf = vget_low_f32(x5);
dh = vget_high_f32(x5);
x0 = vcombine_f32(ae, vdup_lane_f32(ae, 1)); /* a a a e */
x1 = vcombine_f32(bf, vdup_lane_f32(bf, 1)); /* b b b f */
x2 = vcombine_f32(cg, vdup_lane_f32(cg, 1)); /* c c c g */
x3 = vcombine_f32(dh, vdup_lane_f32(dh, 1)); /* d d d h */
/*
dest[0][0] = f * t1[0] - g * t1[1] + h * t1[2];
dest[0][1] =-(b * t1[0] - c * t1[1] + d * t1[2]);
dest[0][2] = b * t2[0] - c * t2[1] + d * t2[2];
dest[0][3] =-(b * t3[0] - c * t3[1] + d * t3[2]); */
v0 = glmm_xor(glmm_fmadd(x3, t2, glmm_fnmadd(x2, t1, vmulq_f32(x1, t0))), x8);
/*
dest[2][0] = e * t1[1] - f * t1[3] + h * t1[5];
dest[2][1] =-(a * t1[1] - b * t1[3] + d * t1[5]);
dest[2][2] = a * t2[1] - b * t2[3] + d * t2[5];
dest[2][3] =-(a * t3[1] - b * t3[3] + d * t3[5]);*/
v2 = glmm_xor(glmm_fmadd(x3, t5, glmm_fnmadd(x1, t3, vmulq_f32(x0, t1))), x8);
/*
dest[1][0] =-(e * t1[0] - g * t1[3] + h * t1[4]);
dest[1][1] = a * t1[0] - c * t1[3] + d * t1[4];
dest[1][2] =-(a * t2[0] - c * t2[3] + d * t2[4]);
dest[1][3] = a * t3[0] - c * t3[3] + d * t3[4]; */
v1 = glmm_xor(glmm_fmadd(x3, t4, glmm_fnmadd(x2, t3, vmulq_f32(x0, t0))), x9);
/*
dest[3][0] =-(e * t1[2] - f * t1[4] + g * t1[5]);
dest[3][1] = a * t1[2] - b * t1[4] + c * t1[5];
dest[3][2] =-(a * t2[2] - b * t2[4] + c * t2[5]);
dest[3][3] = a * t3[2] - b * t3[4] + c * t3[5]; */
v3 = glmm_xor(glmm_fmadd(x2, t5, glmm_fnmadd(x1, t4, vmulq_f32(x0, t2))), x9);
/* determinant */
x0 = vcombine_f32(vget_low_f32(vzipq_f32(v0, v1).val[0]),
vget_low_f32(vzipq_f32(v2, v3).val[0]));
/*
x0 = glmm_div(glmm_set1(1.0f), glmm_vhadd(vmulq_f32(x0, r0)));
glmm_store(dest[0], vmulq_f32(v0, x0));
glmm_store(dest[1], vmulq_f32(v1, x0));
glmm_store(dest[2], vmulq_f32(v2, x0));
glmm_store(dest[3], vmulq_f32(v3, x0));
*/
x0 = glmm_vhadd(vmulq_f32(x0, r0));
glmm_store(dest[0], glmm_div(v0, x0));
glmm_store(dest[1], glmm_div(v1, x0));
glmm_store(dest[2], glmm_div(v2, x0));
glmm_store(dest[3], glmm_div(v3, x0));
}
#endif

View File

@@ -25,28 +25,28 @@ glm_mul_sse2(mat4 m1, mat4 m2, mat4 dest) {
r = glmm_load(m2[0]);
glmm_store(dest[0],
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 0), l0),
_mm_mul_ps(glmm_shuff1x(r, 1), l1)),
_mm_mul_ps(glmm_shuff1x(r, 2), l2)));
glmm_fmadd(glmm_splat(r, 0), l0,
glmm_fmadd(glmm_splat(r, 1), l1,
_mm_mul_ps(glmm_splat(r, 2), l2))));
r = glmm_load(m2[1]);
glmm_store(dest[1],
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 0), l0),
_mm_mul_ps(glmm_shuff1x(r, 1), l1)),
_mm_mul_ps(glmm_shuff1x(r, 2), l2)));
glmm_fmadd(glmm_splat(r, 0), l0,
glmm_fmadd(glmm_splat(r, 1), l1,
_mm_mul_ps(glmm_splat(r, 2), l2))));
r = glmm_load(m2[2]);
glmm_store(dest[2],
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 0), l0),
_mm_mul_ps(glmm_shuff1x(r, 1), l1)),
_mm_mul_ps(glmm_shuff1x(r, 2), l2)));
glmm_fmadd(glmm_splat(r, 0), l0,
glmm_fmadd(glmm_splat(r, 1), l1,
_mm_mul_ps(glmm_splat(r, 2), l2))));
r = glmm_load(m2[3]);
glmm_store(dest[3],
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 0), l0),
_mm_mul_ps(glmm_shuff1x(r, 1), l1)),
_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 2), l2),
_mm_mul_ps(glmm_shuff1x(r, 3), l3))));
glmm_fmadd(glmm_splat(r, 0), l0,
glmm_fmadd(glmm_splat(r, 1), l1,
glmm_fmadd(glmm_splat(r, 2), l2,
_mm_mul_ps(glmm_splat(r, 3), l3)))));
}
CGLM_INLINE
@@ -62,21 +62,22 @@ glm_mul_rot_sse2(mat4 m1, mat4 m2, mat4 dest) {
r = glmm_load(m2[0]);
glmm_store(dest[0],
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 0), l0),
_mm_mul_ps(glmm_shuff1x(r, 1), l1)),
_mm_mul_ps(glmm_shuff1x(r, 2), l2)));
glmm_fmadd(glmm_splat(r, 0), l0,
glmm_fmadd(glmm_splat(r, 1), l1,
_mm_mul_ps(glmm_splat(r, 2), l2))));
r = glmm_load(m2[1]);
glmm_store(dest[1],
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 0), l0),
_mm_mul_ps(glmm_shuff1x(r, 1), l1)),
_mm_mul_ps(glmm_shuff1x(r, 2), l2)));
glmm_fmadd(glmm_splat(r, 0), l0,
glmm_fmadd(glmm_splat(r, 1), l1,
_mm_mul_ps(glmm_splat(r, 2), l2))));
r = glmm_load(m2[2]);
glmm_store(dest[2],
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 0), l0),
_mm_mul_ps(glmm_shuff1x(r, 1), l1)),
_mm_mul_ps(glmm_shuff1x(r, 2), l2)));
glmm_fmadd(glmm_splat(r, 0), l0,
glmm_fmadd(glmm_splat(r, 1), l1,
_mm_mul_ps(glmm_splat(r, 2), l2))));
glmm_store(dest[3], l3);
}
@@ -94,9 +95,9 @@ glm_inv_tr_sse2(mat4 mat) {
_MM_TRANSPOSE4_PS(r0, r1, r2, x1);
x0 = _mm_add_ps(_mm_mul_ps(r0, glmm_shuff1(r3, 0, 0, 0, 0)),
_mm_mul_ps(r1, glmm_shuff1(r3, 1, 1, 1, 1)));
x0 = _mm_add_ps(x0, _mm_mul_ps(r2, glmm_shuff1(r3, 2, 2, 2, 2)));
x0 = glmm_fmadd(r0, glmm_shuff1(r3, 0, 0, 0, 0),
glmm_fmadd(r1, glmm_shuff1(r3, 1, 1, 1, 1),
_mm_mul_ps(r2, glmm_shuff1(r3, 2, 2, 2, 2))));
x0 = _mm_xor_ps(x0, _mm_set1_ps(-0.f));
x0 = _mm_add_ps(x0, x1);

View File

@@ -26,11 +26,11 @@ glm_mat2_mul_sse2(mat2 m1, mat2 m2, mat2 dest) {
dest[1][0] = a * g + c * h;
dest[1][1] = b * g + d * h;
*/
x0 = _mm_mul_ps(_mm_movelh_ps(x1, x1), glmm_shuff1(x2, 2, 2, 0, 0));
x1 = _mm_mul_ps(_mm_movehl_ps(x1, x1), glmm_shuff1(x2, 3, 3, 1, 1));
x1 = _mm_add_ps(x0, x1);
x0 = glmm_fmadd(_mm_movelh_ps(x1, x1), glmm_shuff1(x2, 2, 2, 0, 0),
_mm_mul_ps(_mm_movehl_ps(x1, x1),
glmm_shuff1(x2, 3, 3, 1, 1)));
glmm_store(dest[0], x1);
glmm_store(dest[0], x0);
}
CGLM_INLINE

View File

@@ -30,23 +30,16 @@ glm_mat3_mul_sse2(mat3 m1, mat3 m2, mat3 dest) {
x1 = glmm_shuff2(l0, l1, 1, 0, 3, 3, 0, 3, 2, 0);
x2 = glmm_shuff2(l1, l2, 0, 0, 3, 2, 0, 2, 1, 0);
x0 = _mm_add_ps(_mm_mul_ps(glmm_shuff1(l0, 0, 2, 1, 0),
glmm_shuff1(r0, 3, 0, 0, 0)),
_mm_mul_ps(x1, glmm_shuff2(r0, r1, 0, 0, 1, 1, 2, 0, 0, 0)));
x0 = _mm_add_ps(x0,
_mm_mul_ps(x2, glmm_shuff2(r0, r1, 1, 1, 2, 2, 2, 0, 0, 0)));
x0 = glmm_fmadd(glmm_shuff1(l0, 0, 2, 1, 0), glmm_shuff1(r0, 3, 0, 0, 0),
glmm_fmadd(x1, glmm_shuff2(r0, r1, 0, 0, 1, 1, 2, 0, 0, 0),
_mm_mul_ps(x2, glmm_shuff2(r0, r1, 1, 1, 2, 2, 2, 0, 0, 0))));
_mm_storeu_ps(dest[0], x0);
x0 = _mm_add_ps(_mm_mul_ps(glmm_shuff1(l0, 1, 0, 2, 1),
_mm_shuffle_ps(r0, r1, _MM_SHUFFLE(2, 2, 3, 3))),
_mm_mul_ps(glmm_shuff1(x1, 1, 0, 2, 1),
glmm_shuff1(r1, 3, 3, 0, 0)));
x0 = _mm_add_ps(x0,
x0 = glmm_fmadd(glmm_shuff1(l0, 1, 0, 2, 1), _mm_shuffle_ps(r0, r1, _MM_SHUFFLE(2, 2, 3, 3)),
glmm_fmadd(glmm_shuff1(x1, 1, 0, 2, 1), glmm_shuff1(r1, 3, 3, 0, 0),
_mm_mul_ps(glmm_shuff1(x2, 1, 0, 2, 1),
_mm_shuffle_ps(r1, r2, _MM_SHUFFLE(0, 0, 1, 1))));
_mm_shuffle_ps(r1, r2, _MM_SHUFFLE(0, 0, 1, 1)))));
_mm_storeu_ps(&dest[1][1], x0);

View File

@@ -56,46 +56,36 @@ glm_mat4_mul_sse2(mat4 m1, mat4 m2, mat4 dest) {
l2 = glmm_load(m1[2]);
l3 = glmm_load(m1[3]);
r = glmm_load(m2[0]);
glmm_store(dest[0],
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 0), l0),
_mm_mul_ps(glmm_shuff1x(r, 1), l1)),
_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 2), l2),
_mm_mul_ps(glmm_shuff1x(r, 3), l3))));
r = glmm_load(m2[1]);
glmm_store(dest[1],
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 0), l0),
_mm_mul_ps(glmm_shuff1x(r, 1), l1)),
_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 2), l2),
_mm_mul_ps(glmm_shuff1x(r, 3), l3))));
r = glmm_load(m2[2]);
glmm_store(dest[2],
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 0), l0),
_mm_mul_ps(glmm_shuff1x(r, 1), l1)),
_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 2), l2),
_mm_mul_ps(glmm_shuff1x(r, 3), l3))));
#define XX(C) \
\
r = glmm_load(m2[C]); \
glmm_store(dest[C], \
glmm_fmadd(glmm_splat(r, 0), l0, \
glmm_fmadd(glmm_splat(r, 1), l1, \
glmm_fmadd(glmm_splat(r, 2), l2, \
_mm_mul_ps(glmm_splat(r, 3), l3)))));
r = glmm_load(m2[3]);
glmm_store(dest[3],
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 0), l0),
_mm_mul_ps(glmm_shuff1x(r, 1), l1)),
_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 2), l2),
_mm_mul_ps(glmm_shuff1x(r, 3), l3))));
XX(0);
XX(1);
XX(2);
XX(3);
#undef XX
}
CGLM_INLINE
void
glm_mat4_mulv_sse2(mat4 m, vec4 v, vec4 dest) {
__m128 x0, x1, x2;
__m128 x0, x1;
x0 = glmm_load(v);
x1 = _mm_add_ps(_mm_mul_ps(glmm_load(m[0]), glmm_shuff1x(x0, 0)),
_mm_mul_ps(glmm_load(m[1]), glmm_shuff1x(x0, 1)));
x1 = glmm_fmadd(glmm_load(m[0]), glmm_splat(x0, 0),
glmm_fmadd(glmm_load(m[1]), glmm_splat(x0, 1),
glmm_fmadd(glmm_load(m[2]), glmm_splat(x0, 2),
_mm_mul_ps(glmm_load(m[3]),
glmm_splat(x0, 3)))));
x2 = _mm_add_ps(_mm_mul_ps(glmm_load(m[2]), glmm_shuff1x(x0, 2)),
_mm_mul_ps(glmm_load(m[3]), glmm_shuff1x(x0, 3)));
glmm_store(dest, _mm_add_ps(x1, x2));
glmm_store(dest, x1);
}
CGLM_INLINE
@@ -115,20 +105,18 @@ glm_mat4_det_sse2(mat4 mat) {
t[3] = i * p - m * l;
t[4] = i * o - m * k;
*/
x0 = _mm_sub_ps(_mm_mul_ps(glmm_shuff1(r2, 0, 0, 1, 1),
glmm_shuff1(r3, 2, 3, 2, 3)),
_mm_mul_ps(glmm_shuff1(r3, 0, 0, 1, 1),
glmm_shuff1(r2, 2, 3, 2, 3)));
x0 = glmm_fnmadd(glmm_shuff1(r3, 0, 0, 1, 1), glmm_shuff1(r2, 2, 3, 2, 3),
_mm_mul_ps(glmm_shuff1(r2, 0, 0, 1, 1),
glmm_shuff1(r3, 2, 3, 2, 3)));
/*
t[0] = k * p - o * l;
t[0] = k * p - o * l;
t[5] = i * n - m * j;
t[5] = i * n - m * j;
*/
x1 = _mm_sub_ps(_mm_mul_ps(glmm_shuff1(r2, 0, 0, 2, 2),
glmm_shuff1(r3, 1, 1, 3, 3)),
_mm_mul_ps(glmm_shuff1(r3, 0, 0, 2, 2),
glmm_shuff1(r2, 1, 1, 3, 3)));
x1 = glmm_fnmadd(glmm_shuff1(r3, 0, 0, 2, 2), glmm_shuff1(r2, 1, 1, 3, 3),
_mm_mul_ps(glmm_shuff1(r2, 0, 0, 2, 2),
glmm_shuff1(r3, 1, 1, 3, 3)));
/*
a * (f * t[0] - g * t[1] + h * t[2])
@@ -136,21 +124,16 @@ glm_mat4_det_sse2(mat4 mat) {
+ c * (e * t[1] - f * t[3] + h * t[5])
- d * (e * t[2] - f * t[4] + g * t[5])
*/
x2 = _mm_sub_ps(_mm_mul_ps(glmm_shuff1(r1, 0, 0, 0, 1),
_mm_shuffle_ps(x1, x0, _MM_SHUFFLE(1, 0, 0, 0))),
_mm_mul_ps(glmm_shuff1(r1, 1, 1, 2, 2),
glmm_shuff1(x0, 3, 2, 2, 0)));
x2 = glmm_fnmadd(glmm_shuff1(r1, 1, 1, 2, 2), glmm_shuff1(x0, 3, 2, 2, 0),
_mm_mul_ps(glmm_shuff1(r1, 0, 0, 0, 1),
_mm_shuffle_ps(x1, x0, _MM_SHUFFLE(1, 0, 0, 0))));
x2 = glmm_fmadd(glmm_shuff1(r1, 2, 3, 3, 3),
_mm_shuffle_ps(x0, x1, _MM_SHUFFLE(2, 2, 3, 1)),
x2);
x2 = _mm_add_ps(x2,
_mm_mul_ps(glmm_shuff1(r1, 2, 3, 3, 3),
_mm_shuffle_ps(x0, x1, _MM_SHUFFLE(2, 2, 3, 1))));
x2 = _mm_xor_ps(x2, _mm_set_ps(-0.f, 0.f, -0.f, 0.f));
x0 = _mm_mul_ps(r0, x2);
x0 = _mm_add_ps(x0, glmm_shuff1(x0, 0, 1, 2, 3));
x0 = _mm_add_ps(x0, glmm_shuff1(x0, 1, 3, 3, 1));
return _mm_cvtss_f32(x0);
return glmm_hadd(_mm_mul_ps(x2, r0));
}
CGLM_INLINE
@@ -159,7 +142,10 @@ glm_mat4_inv_fast_sse2(mat4 mat, mat4 dest) {
__m128 r0, r1, r2, r3,
v0, v1, v2, v3,
t0, t1, t2, t3, t4, t5,
x0, x1, x2, x3, x4, x5, x6, x7;
x0, x1, x2, x3, x4, x5, x6, x7, x8, x9;
x8 = _mm_set_ps(-0.f, 0.f, -0.f, 0.f);
x9 = glmm_shuff1(x8, 2, 1, 2, 1);
/* 127 <- 0 */
r0 = glmm_load(mat[0]); /* d c b a */
@@ -177,7 +163,7 @@ glm_mat4_inv_fast_sse2(mat4 mat, mat4 dest) {
t1[0] = k * p - o * l;
t2[0] = g * p - o * h;
t3[0] = g * l - k * h; */
t0 = _mm_sub_ps(_mm_mul_ps(x3, x1), _mm_mul_ps(x2, x0));
t0 = glmm_fnmadd(x2, x0, _mm_mul_ps(x3, x1));
x4 = _mm_shuffle_ps(r2, r3, _MM_SHUFFLE(2, 1, 2, 1)); /* o n k j */
x4 = glmm_shuff1(x4, 0, 2, 2, 2); /* j n n n */
@@ -187,13 +173,13 @@ glm_mat4_inv_fast_sse2(mat4 mat, mat4 dest) {
t1[1] = j * p - n * l;
t2[1] = f * p - n * h;
t3[1] = f * l - j * h; */
t1 = _mm_sub_ps(_mm_mul_ps(x5, x1), _mm_mul_ps(x4, x0));
t1 = glmm_fnmadd(x4, x0, _mm_mul_ps(x5, x1));
/* t1[2] = j * o - n * k
t1[2] = j * o - n * k;
t2[2] = f * o - n * g;
t3[2] = f * k - j * g; */
t2 = _mm_sub_ps(_mm_mul_ps(x5, x2), _mm_mul_ps(x4, x3));
t2 = glmm_fnmadd(x4, x3, _mm_mul_ps(x5, x2));
x6 = _mm_shuffle_ps(r2, r1, _MM_SHUFFLE(0, 0, 0, 0)); /* e e i i */
x7 = glmm_shuff2(r3, r2, 0, 0, 0, 0, 2, 0, 0, 0); /* i m m m */
@@ -202,19 +188,19 @@ glm_mat4_inv_fast_sse2(mat4 mat, mat4 dest) {
t1[3] = i * p - m * l;
t2[3] = e * p - m * h;
t3[3] = e * l - i * h; */
t3 = _mm_sub_ps(_mm_mul_ps(x6, x1), _mm_mul_ps(x7, x0));
t3 = glmm_fnmadd(x7, x0, _mm_mul_ps(x6, x1));
/* t1[4] = i * o - m * k;
t1[4] = i * o - m * k;
t2[4] = e * o - m * g;
t3[4] = e * k - i * g; */
t4 = _mm_sub_ps(_mm_mul_ps(x6, x2), _mm_mul_ps(x7, x3));
t4 = glmm_fnmadd(x7, x3, _mm_mul_ps(x6, x2));
/* t1[5] = i * n - m * j;
t1[5] = i * n - m * j;
t2[5] = e * n - m * f;
t3[5] = e * j - i * f; */
t5 = _mm_sub_ps(_mm_mul_ps(x6, x4), _mm_mul_ps(x7, x5));
t5 = glmm_fnmadd(x7, x5, _mm_mul_ps(x6, x4));
x0 = glmm_shuff2(r1, r0, 0, 0, 0, 0, 2, 2, 2, 0); /* a a a e */
x1 = glmm_shuff2(r1, r0, 1, 1, 1, 1, 2, 2, 2, 0); /* b b b f */
@@ -226,50 +212,35 @@ glm_mat4_inv_fast_sse2(mat4 mat, mat4 dest) {
dest[0][1] =-(b * t1[0] - c * t1[1] + d * t1[2]);
dest[0][2] = b * t2[0] - c * t2[1] + d * t2[2];
dest[0][3] =-(b * t3[0] - c * t3[1] + d * t3[2]); */
v0 = _mm_add_ps(_mm_mul_ps(x3, t2),
_mm_sub_ps(_mm_mul_ps(x1, t0),
_mm_mul_ps(x2, t1)));
v0 = _mm_xor_ps(v0, _mm_set_ps(-0.f, 0.f, -0.f, 0.f));
/*
dest[1][0] =-(e * t1[0] - g * t1[3] + h * t1[4]);
dest[1][1] = a * t1[0] - c * t1[3] + d * t1[4];
dest[1][2] =-(a * t2[0] - c * t2[3] + d * t2[4]);
dest[1][3] = a * t3[0] - c * t3[3] + d * t3[4]; */
v1 = _mm_add_ps(_mm_mul_ps(x3, t4),
_mm_sub_ps(_mm_mul_ps(x0, t0),
_mm_mul_ps(x2, t3)));
v1 = _mm_xor_ps(v1, _mm_set_ps(0.f, -0.f, 0.f, -0.f));
v0 = _mm_xor_ps(glmm_fmadd(x3, t2, glmm_fnmadd(x2, t1, _mm_mul_ps(x1, t0))), x8);
/*
dest[2][0] = e * t1[1] - f * t1[3] + h * t1[5];
dest[2][1] =-(a * t1[1] - b * t1[3] + d * t1[5]);
dest[2][2] = a * t2[1] - b * t2[3] + d * t2[5];
dest[2][3] =-(a * t3[1] - b * t3[3] + d * t3[5]);*/
v2 = _mm_add_ps(_mm_mul_ps(x3, t5),
_mm_sub_ps(_mm_mul_ps(x0, t1),
_mm_mul_ps(x1, t3)));
v2 = _mm_xor_ps(v2, _mm_set_ps(-0.f, 0.f, -0.f, 0.f));
v2 = _mm_xor_ps(glmm_fmadd(x3, t5, glmm_fnmadd(x1, t3, _mm_mul_ps(x0, t1))), x8);
/*
dest[1][0] =-(e * t1[0] - g * t1[3] + h * t1[4]);
dest[1][1] = a * t1[0] - c * t1[3] + d * t1[4];
dest[1][2] =-(a * t2[0] - c * t2[3] + d * t2[4]);
dest[1][3] = a * t3[0] - c * t3[3] + d * t3[4]; */
v1 = _mm_xor_ps(glmm_fmadd(x3, t4, glmm_fnmadd(x2, t3, _mm_mul_ps(x0, t0))), x9);
/*
dest[3][0] =-(e * t1[2] - f * t1[4] + g * t1[5]);
dest[3][1] = a * t1[2] - b * t1[4] + c * t1[5];
dest[3][2] =-(a * t2[2] - b * t2[4] + c * t2[5]);
dest[3][3] = a * t3[2] - b * t3[4] + c * t3[5]; */
v3 = _mm_add_ps(_mm_mul_ps(x2, t5),
_mm_sub_ps(_mm_mul_ps(x0, t2),
_mm_mul_ps(x1, t4)));
v3 = _mm_xor_ps(v3, _mm_set_ps(0.f, -0.f, 0.f, -0.f));
v3 = _mm_xor_ps(glmm_fmadd(x2, t5, glmm_fnmadd(x1, t4, _mm_mul_ps(x0, t2))), x9);
/* determinant */
x0 = _mm_shuffle_ps(v0, v1, _MM_SHUFFLE(0, 0, 0, 0));
x1 = _mm_shuffle_ps(v2, v3, _MM_SHUFFLE(0, 0, 0, 0));
x0 = _mm_shuffle_ps(x0, x1, _MM_SHUFFLE(2, 0, 2, 0));
x0 = _mm_mul_ps(x0, r0);
x0 = _mm_add_ps(x0, glmm_shuff1(x0, 0, 1, 2, 3));
x0 = _mm_add_ps(x0, glmm_shuff1(x0, 1, 0, 0, 1));
x0 = _mm_rcp_ps(x0);
x0 = _mm_rcp_ps(glmm_vhadd(_mm_mul_ps(x0, r0)));
glmm_store(dest[0], _mm_mul_ps(v0, x0));
glmm_store(dest[1], _mm_mul_ps(v1, x0));
@@ -283,7 +254,10 @@ glm_mat4_inv_sse2(mat4 mat, mat4 dest) {
__m128 r0, r1, r2, r3,
v0, v1, v2, v3,
t0, t1, t2, t3, t4, t5,
x0, x1, x2, x3, x4, x5, x6, x7;
x0, x1, x2, x3, x4, x5, x6, x7, x8, x9;
x8 = _mm_set_ps(-0.f, 0.f, -0.f, 0.f);
x9 = glmm_shuff1(x8, 2, 1, 2, 1);
/* 127 <- 0 */
r0 = glmm_load(mat[0]); /* d c b a */
@@ -301,7 +275,7 @@ glm_mat4_inv_sse2(mat4 mat, mat4 dest) {
t1[0] = k * p - o * l;
t2[0] = g * p - o * h;
t3[0] = g * l - k * h; */
t0 = _mm_sub_ps(_mm_mul_ps(x3, x1), _mm_mul_ps(x2, x0));
t0 = glmm_fnmadd(x2, x0, _mm_mul_ps(x3, x1));
x4 = _mm_shuffle_ps(r2, r3, _MM_SHUFFLE(2, 1, 2, 1)); /* o n k j */
x4 = glmm_shuff1(x4, 0, 2, 2, 2); /* j n n n */
@@ -311,13 +285,13 @@ glm_mat4_inv_sse2(mat4 mat, mat4 dest) {
t1[1] = j * p - n * l;
t2[1] = f * p - n * h;
t3[1] = f * l - j * h; */
t1 = _mm_sub_ps(_mm_mul_ps(x5, x1), _mm_mul_ps(x4, x0));
t1 = glmm_fnmadd(x4, x0, _mm_mul_ps(x5, x1));
/* t1[2] = j * o - n * k
t1[2] = j * o - n * k;
t2[2] = f * o - n * g;
t3[2] = f * k - j * g; */
t2 = _mm_sub_ps(_mm_mul_ps(x5, x2), _mm_mul_ps(x4, x3));
t2 = glmm_fnmadd(x4, x3, _mm_mul_ps(x5, x2));
x6 = _mm_shuffle_ps(r2, r1, _MM_SHUFFLE(0, 0, 0, 0)); /* e e i i */
x7 = glmm_shuff2(r3, r2, 0, 0, 0, 0, 2, 0, 0, 0); /* i m m m */
@@ -326,19 +300,19 @@ glm_mat4_inv_sse2(mat4 mat, mat4 dest) {
t1[3] = i * p - m * l;
t2[3] = e * p - m * h;
t3[3] = e * l - i * h; */
t3 = _mm_sub_ps(_mm_mul_ps(x6, x1), _mm_mul_ps(x7, x0));
t3 = glmm_fnmadd(x7, x0, _mm_mul_ps(x6, x1));
/* t1[4] = i * o - m * k;
t1[4] = i * o - m * k;
t2[4] = e * o - m * g;
t3[4] = e * k - i * g; */
t4 = _mm_sub_ps(_mm_mul_ps(x6, x2), _mm_mul_ps(x7, x3));
t4 = glmm_fnmadd(x7, x3, _mm_mul_ps(x6, x2));
/* t1[5] = i * n - m * j;
t1[5] = i * n - m * j;
t2[5] = e * n - m * f;
t3[5] = e * j - i * f; */
t5 = _mm_sub_ps(_mm_mul_ps(x6, x4), _mm_mul_ps(x7, x5));
t5 = glmm_fnmadd(x7, x5, _mm_mul_ps(x6, x4));
x0 = glmm_shuff2(r1, r0, 0, 0, 0, 0, 2, 2, 2, 0); /* a a a e */
x1 = glmm_shuff2(r1, r0, 1, 1, 1, 1, 2, 2, 2, 0); /* b b b f */
@@ -350,50 +324,35 @@ glm_mat4_inv_sse2(mat4 mat, mat4 dest) {
dest[0][1] =-(b * t1[0] - c * t1[1] + d * t1[2]);
dest[0][2] = b * t2[0] - c * t2[1] + d * t2[2];
dest[0][3] =-(b * t3[0] - c * t3[1] + d * t3[2]); */
v0 = _mm_add_ps(_mm_mul_ps(x3, t2),
_mm_sub_ps(_mm_mul_ps(x1, t0),
_mm_mul_ps(x2, t1)));
v0 = _mm_xor_ps(v0, _mm_set_ps(-0.f, 0.f, -0.f, 0.f));
/*
dest[1][0] =-(e * t1[0] - g * t1[3] + h * t1[4]);
dest[1][1] = a * t1[0] - c * t1[3] + d * t1[4];
dest[1][2] =-(a * t2[0] - c * t2[3] + d * t2[4]);
dest[1][3] = a * t3[0] - c * t3[3] + d * t3[4]; */
v1 = _mm_add_ps(_mm_mul_ps(x3, t4),
_mm_sub_ps(_mm_mul_ps(x0, t0),
_mm_mul_ps(x2, t3)));
v1 = _mm_xor_ps(v1, _mm_set_ps(0.f, -0.f, 0.f, -0.f));
v0 = _mm_xor_ps(glmm_fmadd(x3, t2, glmm_fnmadd(x2, t1, _mm_mul_ps(x1, t0))), x8);
/*
dest[2][0] = e * t1[1] - f * t1[3] + h * t1[5];
dest[2][1] =-(a * t1[1] - b * t1[3] + d * t1[5]);
dest[2][2] = a * t2[1] - b * t2[3] + d * t2[5];
dest[2][3] =-(a * t3[1] - b * t3[3] + d * t3[5]);*/
v2 = _mm_add_ps(_mm_mul_ps(x3, t5),
_mm_sub_ps(_mm_mul_ps(x0, t1),
_mm_mul_ps(x1, t3)));
v2 = _mm_xor_ps(v2, _mm_set_ps(-0.f, 0.f, -0.f, 0.f));
v2 = _mm_xor_ps(glmm_fmadd(x3, t5, glmm_fnmadd(x1, t3, _mm_mul_ps(x0, t1))), x8);
/*
dest[1][0] =-(e * t1[0] - g * t1[3] + h * t1[4]);
dest[1][1] = a * t1[0] - c * t1[3] + d * t1[4];
dest[1][2] =-(a * t2[0] - c * t2[3] + d * t2[4]);
dest[1][3] = a * t3[0] - c * t3[3] + d * t3[4]; */
v1 = _mm_xor_ps(glmm_fmadd(x3, t4, glmm_fnmadd(x2, t3, _mm_mul_ps(x0, t0))), x9);
/*
dest[3][0] =-(e * t1[2] - f * t1[4] + g * t1[5]);
dest[3][1] = a * t1[2] - b * t1[4] + c * t1[5];
dest[3][2] =-(a * t2[2] - b * t2[4] + c * t2[5]);
dest[3][3] = a * t3[2] - b * t3[4] + c * t3[5]; */
v3 = _mm_add_ps(_mm_mul_ps(x2, t5),
_mm_sub_ps(_mm_mul_ps(x0, t2),
_mm_mul_ps(x1, t4)));
v3 = _mm_xor_ps(v3, _mm_set_ps(0.f, -0.f, 0.f, -0.f));
v3 = _mm_xor_ps(glmm_fmadd(x2, t5, glmm_fnmadd(x1, t4, _mm_mul_ps(x0, t2))), x9);
/* determinant */
x0 = _mm_shuffle_ps(v0, v1, _MM_SHUFFLE(0, 0, 0, 0));
x1 = _mm_shuffle_ps(v2, v3, _MM_SHUFFLE(0, 0, 0, 0));
x0 = _mm_shuffle_ps(x0, x1, _MM_SHUFFLE(2, 0, 2, 0));
x0 = _mm_mul_ps(x0, r0);
x0 = _mm_add_ps(x0, glmm_shuff1(x0, 0, 1, 2, 3));
x0 = _mm_add_ps(x0, glmm_shuff1(x0, 1, 0, 0, 1));
x0 = _mm_div_ps(_mm_set1_ps(1.0f), x0);
x0 = _mm_div_ps(_mm_set1_ps(1.0f), glmm_vhadd(_mm_mul_ps(x0, r0)));
glmm_store(dest[0], _mm_mul_ps(v0, x0));
glmm_store(dest[1], _mm_mul_ps(v1, x0));

View File

@@ -27,15 +27,15 @@ glm_quat_mul_sse2(versor p, versor q, versor dest) {
xp = glmm_load(p); /* 3 2 1 0 */
xq = glmm_load(q);
r = _mm_mul_ps(glmm_shuff1x(xp, 3), xq);
r = _mm_mul_ps(glmm_splat(xp, 3), xq);
x0 = _mm_xor_ps(glmm_shuff1x(xp, 0), _mm_set_ps(-0.f, 0.f, -0.f, 0.f));
x0 = _mm_xor_ps(glmm_splat(xp, 0), _mm_set_ps(-0.f, 0.f, -0.f, 0.f));
r = _mm_add_ps(r, _mm_mul_ps(x0, glmm_shuff1(xq, 0, 1, 2, 3)));
x0 = _mm_xor_ps(glmm_shuff1x(xp, 1), _mm_set_ps(-0.f, -0.f, 0.f, 0.f));
x0 = _mm_xor_ps(glmm_splat(xp, 1), _mm_set_ps(-0.f, -0.f, 0.f, 0.f));
r = _mm_add_ps(r, _mm_mul_ps(x0, glmm_shuff1(xq, 1, 0, 3, 2)));
x0 = _mm_xor_ps(glmm_shuff1x(xp, 2), _mm_set_ps(-0.f, 0.f, 0.f, -0.f));
x0 = _mm_xor_ps(glmm_splat(xp, 2), _mm_set_ps(-0.f, 0.f, 0.f, -0.f));
r = _mm_add_ps(r, _mm_mul_ps(x0, glmm_shuff1(xq, 2, 3, 0, 1)));
glmm_store(dest, r);

View File

@@ -18,6 +18,9 @@
# define glmm_store(p, a) _mm_store_ps(p, a)
#endif
#define glmm_set1(x) _mm_set1_ps(x)
#define glmm_128 __m128
#ifdef CGLM_USE_INT_DOMAIN
# define glmm_shuff1(xmm, z, y, x, w) \
_mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(xmm), \
@@ -27,7 +30,16 @@
_mm_shuffle_ps(xmm, xmm, _MM_SHUFFLE(z, y, x, w))
#endif
#define glmm_splat(x, lane) glmm_shuff1(x, lane, lane, lane, lane)
#define glmm_splat_x(x) glmm_splat(x, 0)
#define glmm_splat_y(x) glmm_splat(x, 1)
#define glmm_splat_z(x) glmm_splat(x, 2)
#define glmm_splat_w(x) glmm_splat(x, 3)
/* glmm_shuff1x() is DEPRECATED!, use glmm_splat() */
#define glmm_shuff1x(xmm, x) glmm_shuff1(xmm, x, x, x, x)
#define glmm_shuff2(a, b, z0, y0, x0, w0, z1, y1, x1, w1) \
glmm_shuff1(_mm_shuffle_ps(a, b, _MM_SHUFFLE(z0, y0, x0, w0)), \
z1, y1, x1, w1)
@@ -48,6 +60,15 @@ glmm_abs(__m128 x) {
return _mm_andnot_ps(_mm_set1_ps(-0.0f), x);
}
static inline
__m128
glmm_vhadd(__m128 v) {
__m128 x0;
x0 = _mm_add_ps(v, glmm_shuff1(v, 0, 1, 2, 3));
x0 = _mm_add_ps(x0, glmm_shuff1(x0, 1, 0, 0, 1));
return x0;
}
static inline
__m128
glmm_vhadds(__m128 v) {
@@ -80,7 +101,7 @@ glmm_vhmin(__m128 v) {
__m128 x0, x1, x2;
x0 = _mm_movehl_ps(v, v); /* [2, 3, 2, 3] */
x1 = _mm_min_ps(x0, v); /* [0|2, 1|3, 2|2, 3|3] */
x2 = glmm_shuff1x(x1, 1); /* [1|3, 1|3, 1|3, 1|3] */
x2 = glmm_splat(x1, 1); /* [1|3, 1|3, 1|3, 1|3] */
return _mm_min_ss(x1, x2);
}
@@ -96,7 +117,7 @@ glmm_vhmax(__m128 v) {
__m128 x0, x1, x2;
x0 = _mm_movehl_ps(v, v); /* [2, 3, 2, 3] */
x1 = _mm_max_ps(x0, v); /* [0|2, 1|3, 2|2, 3|3] */
x2 = glmm_shuff1x(x1, 1); /* [1|3, 1|3, 1|3, 1|3] */
x2 = glmm_splat(x1, 1); /* [1|3, 1|3, 1|3, 1|3] */
return _mm_max_ss(x1, x2);
}
@@ -175,7 +196,7 @@ glmm_load3(float v[3]) {
__m128i xy;
__m128 z;
xy = _mm_loadl_epi64((const __m128i *)v);
xy = _mm_loadl_epi64(CGLM_CASTPTR_ASSUME_ALIGNED(v, const __m128i));
z = _mm_load_ss(&v[2]);
return _mm_movelh_ps(_mm_castsi128_ps(xy), z);
@@ -184,9 +205,103 @@ glmm_load3(float v[3]) {
static inline
void
glmm_store3(float v[3], __m128 vx) {
_mm_storel_pi((__m64 *)&v[0], vx);
_mm_storel_pi(CGLM_CASTPTR_ASSUME_ALIGNED(v, __m64), vx);
_mm_store_ss(&v[2], glmm_shuff1(vx, 2, 2, 2, 2));
}
static inline
__m128
glmm_div(__m128 a, __m128 b) {
return _mm_div_ps(a, b);
}
/* enable FMA macro for MSVC? */
#if defined(_MSC_VER) && !defined(__FMA__) && defined(__AVX2__)
# define __FMA__ 1
#endif
static inline
__m128
glmm_fmadd(__m128 a, __m128 b, __m128 c) {
#ifdef __FMA__
return _mm_fmadd_ps(a, b, c);
#else
return _mm_add_ps(c, _mm_mul_ps(a, b));
#endif
}
static inline
__m128
glmm_fnmadd(__m128 a, __m128 b, __m128 c) {
#ifdef __FMA__
return _mm_fnmadd_ps(a, b, c);
#else
return _mm_sub_ps(c, _mm_mul_ps(a, b));
#endif
}
static inline
__m128
glmm_fmsub(__m128 a, __m128 b, __m128 c) {
#ifdef __FMA__
return _mm_fmsub_ps(a, b, c);
#else
return _mm_sub_ps(_mm_mul_ps(a, b), c);
#endif
}
static inline
__m128
glmm_fnmsub(__m128 a, __m128 b, __m128 c) {
#ifdef __FMA__
return _mm_fnmsub_ps(a, b, c);
#else
return _mm_xor_ps(_mm_add_ps(_mm_mul_ps(a, b), c), _mm_set1_ps(-0.0f));
#endif
}
#if defined(__AVX__)
static inline
__m256
glmm256_fmadd(__m256 a, __m256 b, __m256 c) {
#ifdef __FMA__
return _mm256_fmadd_ps(a, b, c);
#else
return _mm256_add_ps(c, _mm256_mul_ps(a, b));
#endif
}
static inline
__m256
glmm256_fnmadd(__m256 a, __m256 b, __m256 c) {
#ifdef __FMA__
return _mm256_fnmadd_ps(a, b, c);
#else
return _mm256_sub_ps(c, _mm256_mul_ps(a, b));
#endif
}
static inline
__m256
glmm256_fmsub(__m256 a, __m256 b, __m256 c) {
#ifdef __FMA__
return _mm256_fmsub_ps(a, b, c);
#else
return _mm256_sub_ps(_mm256_mul_ps(a, b), c);
#endif
}
static inline
__m256
glmm256_fnmsub(__m256 a, __m256 b, __m256 c) {
#ifdef __FMA__
return _mm256_fmsub_ps(a, b, c);
#else
return _mm256_xor_ps(_mm256_sub_ps(_mm256_mul_ps(a, b), c),
_mm256_set1_ps(-0.0f));
#endif
}
#endif
#endif
#endif /* cglm_simd_x86_h */

View File

@@ -31,6 +31,7 @@ extern "C" {
#include "struct/project.h"
#include "struct/sphere.h"
#include "struct/curve.h"
#include "struct/affine2d.h"
#ifdef __cplusplus
}

View File

@@ -39,10 +39,6 @@
#include "vec4.h"
#include "mat4.h"
CGLM_INLINE
mat4s
glms_mat4_mul(mat4s m1, mat4s m2);
/*!
* @brief translate existing transform matrix by v vector
* and stores result in same matrix

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 mat3s glms_translate2d(mat3 m, vec2 v)
CGLM_INLINE mat3s glms_translate2d_x(mat3s m, float x)
CGLM_INLINE mat3s glms_translate2d_y(mat3s m, float y)
CGLM_INLINE mat3s glms_translate2d_make(vec2s v)
CGLM_INLINE mat3s glms_scale2d_make(vec2s v)
CGLM_INLINE mat3s glms_scale2d(mat3s m, vec2s v)
CGLM_INLINE mat3s glms_scale2d_uni(mat3s m, float s)
CGLM_INLINE mat3s glms_rotate2d_make(float angle)
CGLM_INLINE mat3s glms_rotate2d(mat3s m, float angle)
CGLM_INLINE mat3s glms_rotate2d_to(mat3s m, float angle)
*/
#ifndef cglms_affine2ds_h
#define cglms_affine2ds_h
#include "../common.h"
#include "../types-struct.h"
#include "../affine2d.h"
#include "vec3.h"
#include "mat3.h"
/*!
* @brief translate existing 2d transform matrix by v vector
* and stores result in same matrix
*
* @param[in] m affine transfrom
* @param[in] v translate vector [x, y]
* @returns affine transfrom
*/
CGLM_INLINE
mat3s
glms_translate2d(mat3s m, vec2s v) {
glm_translate2d(m.raw, v.raw);
return m;
}
/*!
* @brief translate existing 2d transform matrix by x factor
*
* @param[in] m affine transfrom
* @param[in] x x factor
* @returns affine transfrom
*/
CGLM_INLINE
mat3s
glms_translate2d_x(mat3s m, float x) {
glm_translate2d_x(m.raw, x);
return m;
}
/*!
* @brief translate existing 2d transform matrix by y factor
*
* @param[in] m affine transfrom
* @param[in] y y factor
* @returns affine transfrom
*/
CGLM_INLINE
mat3s
glms_translate2d_y(mat3s m, float y) {
glm_translate2d_y(m.raw, y);
return m;
}
/*!
* @brief creates NEW translate 2d transform matrix by v vector
*
* @param[in] v translate vector [x, y]
* @returns affine transfrom
*/
CGLM_INLINE
mat3s
glms_translate2d_make(vec2s v) {
mat3s m;
glm_translate2d_make(m.raw, v.raw);
return m;
}
/*!
* @brief creates NEW 2d scale matrix by v vector
*
* @param[in] v scale vector [x, y]
* @returns affine transfrom
*/
CGLM_INLINE
mat3s
glms_scale2d_make(vec2s v) {
mat3s m;
glm_scale2d_make(m.raw, v.raw);
return m;
}
/*!
* @brief scales existing 2d transform matrix by v vector
* and stores result in same matrix
*
* @param[in] m affine transfrom
* @param[in] v scale vector [x, y, z]
* @returns affine transfrom
*/
CGLM_INLINE
mat3s
glms_scale2d(mat3s m, vec2s v) {
mat3s r;
glm_scale2d_to(m.raw, v.raw, r.raw);
return r;
}
/*!
* @brief applies uniform scale to existing 2d transform matrix v = [s, s, s]
* and stores result in same matrix
*
* @param[in] m affine transfrom
* @param[in] s scale factor
* @returns affine transfrom
*/
CGLM_INLINE
mat3s
glms_scale2d_uni(mat3s m, float s) {
glm_scale2d_uni(m.raw, s);
return m;
}
/*!
* @brief creates NEW 2d rotation matrix by angle and axis
*
* axis will be normalized so you don't need to normalize it
*
* @param[in] angle angle (radians)
* @returns affine transfrom
*/
CGLM_INLINE
mat3s
glms_rotate2d_make(float angle) {
mat3s m;
glm_rotate2d_make(m.raw, angle);
return m;
}
/*!
* @brief rotate existing 2d transform matrix around given axis by angle
*
* @param[in] m affine transfrom
* @param[in] angle angle (radians)
* @returns affine transfrom
*/
CGLM_INLINE
mat3s
glms_rotate2d(mat3s m, float angle) {
glm_rotate2d(m.raw, angle);
return m;
}
/*!
* @brief rotate existing 2d transform matrix around given axis by angle
*
* @param[in] m affine transfrom
* @param[in] angle angle (radians)
* @returns affine transfrom
*/
CGLM_INLINE
mat3s
glms_rotate2d_to(mat3s m, float angle) {
glm_rotate2d(m.raw, angle);
return m;
}
#endif /* cglms_affine2ds_h */

View File

@@ -36,8 +36,8 @@
#include "../types-struct.h"
#include "../mat2.h"
#define GLMS_MAT2_IDENTITY_INIT {1.0f, 0.0f, 0.0f, 1.0f}
#define GLMS_MAT2_ZERO_INIT {0.0f, 0.0f, 0.0f, 0.0f}
#define GLMS_MAT2_IDENTITY_INIT {GLM_MAT2_IDENTITY_INIT}
#define GLMS_MAT2_ZERO_INIT {GLM_MAT2_ZERO_INIT}
/* for C only */
#define GLMS_MAT2_IDENTITY ((mat3s)GLMS_MAT2_IDENTITY_INIT)

View File

@@ -42,9 +42,9 @@ glms_sphere_radii(vec4s s) {
*/
CGLM_INLINE
vec4s
glms_sphere_transform(vec4s s, mat4 m) {
glms_sphere_transform(vec4s s, mat4s m) {
vec4s r;
glm_sphere_transform(s.raw, m, r.raw);
glm_sphere_transform(s.raw, m.raw, r.raw);
return r;
}

View File

@@ -66,7 +66,7 @@
/*!
* @brief init vec2 using vec2
*
* @param[in] v4 vector3
* @param[in] v3 vector3
* @returns destination
*/
CGLM_INLINE
@@ -455,18 +455,18 @@ glms_vec2_normalize(vec2s v) {
}
/*!
* @brief rotate vec2 around axis by angle using Rodrigues' rotation formula
* @brief rotate vec2 by angle using Rodrigues' rotation formula
*
* @param[in] v vector
* @param[in] axis axis vector (must be unit vector)
* @param[in] angle angle by radians
* @returns rotated vector
*/
CGLM_INLINE
vec2s
glms_vec2_rotate(vec2s v, float angle, vec2s axis) {
glm_vec2_rotate(v.raw, angle, axis.raw);
return v;
glms_vec2_rotate(vec2s v, float angle) {
vec2s r;
glm_vec2_rotate(v.raw, angle, r.raw);
return r;
}
/**

View File

@@ -32,6 +32,16 @@
# define CGLM_ALIGN_MAT CGLM_ALIGN(16)
#endif
#ifdef __GNUC__
# define CGLM_ASSUME_ALIGNED(expr, alignment) \
__builtin_assume_aligned((expr), (alignment))
#else
# define CGLM_ASSUME_ALIGNED(expr, alignment) (expr)
#endif
#define CGLM_CASTPTR_ASSUME_ALIGNED(expr, type) \
((type*)CGLM_ASSUME_ALIGNED((expr), __alignof__(type)))
typedef float vec2[2];
typedef float vec3[3];
typedef int ivec3[3];

View File

@@ -289,7 +289,7 @@ glm_smoothinterpc(float from, float to, float t) {
CGLM_INLINE
bool
glm_eq(float a, float b) {
return fabsf(a - b) <= FLT_EPSILON;
return fabsf(a - b) <= GLM_FLT_EPSILON;
}
/*!
@@ -322,7 +322,22 @@ glm_percent(float from, float to, float current) {
CGLM_INLINE
float
glm_percentc(float from, float to, float current) {
return glm_clamp(glm_percent(from, to, current), 0.0f, 1.0f);
return glm_clamp_zo(glm_percent(from, to, current));
}
/*!
* @brief swap two float values
*
* @param[in] a float value 1 (pointer)
* @param[in] b float value 2 (pointer)
*/
CGLM_INLINE
void
glm_swapf(float * __restrict a, float * __restrict b) {
float t;
t = *a;
*a = *b;
*b = t;
}
#endif /* cglm_util_h */

View File

@@ -61,8 +61,8 @@ glm_vec2_eq(vec2 v, float val) {
CGLM_INLINE
bool
glm_vec2_eq_eps(vec2 v, float val) {
return fabsf(v[0] - val) <= FLT_EPSILON
&& fabsf(v[1] - val) <= FLT_EPSILON;
return fabsf(v[0] - val) <= GLM_FLT_EPSILON
&& fabsf(v[1] - val) <= GLM_FLT_EPSILON;
}
/*!
@@ -73,7 +73,7 @@ glm_vec2_eq_eps(vec2 v, float val) {
CGLM_INLINE
bool
glm_vec2_eq_all(vec2 v) {
return v[0] == v[1];
return glm_vec2_eq_eps(v, v[0]);
}
/*!
@@ -97,8 +97,8 @@ glm_vec2_eqv(vec2 a, vec2 b) {
CGLM_INLINE
bool
glm_vec2_eqv_eps(vec2 a, vec2 b) {
return fabsf(a[0] - b[0]) <= FLT_EPSILON
&& fabsf(a[1] - b[1]) <= FLT_EPSILON;
return fabsf(a[0] - b[0]) <= GLM_FLT_EPSILON
&& fabsf(a[1] - b[1]) <= GLM_FLT_EPSILON;
}
/*!

View File

@@ -81,9 +81,9 @@ glm_vec3_eq(vec3 v, float val) {
CGLM_INLINE
bool
glm_vec3_eq_eps(vec3 v, float val) {
return fabsf(v[0] - val) <= FLT_EPSILON
&& fabsf(v[1] - val) <= FLT_EPSILON
&& fabsf(v[2] - val) <= FLT_EPSILON;
return fabsf(v[0] - val) <= GLM_FLT_EPSILON
&& fabsf(v[1] - val) <= GLM_FLT_EPSILON
&& fabsf(v[2] - val) <= GLM_FLT_EPSILON;
}
/*!
@@ -94,7 +94,7 @@ glm_vec3_eq_eps(vec3 v, float val) {
CGLM_INLINE
bool
glm_vec3_eq_all(vec3 v) {
return v[0] == v[1] && v[0] == v[2];
return glm_vec3_eq_eps(v, v[0]);
}
/*!
@@ -120,9 +120,9 @@ glm_vec3_eqv(vec3 a, vec3 b) {
CGLM_INLINE
bool
glm_vec3_eqv_eps(vec3 a, vec3 b) {
return fabsf(a[0] - b[0]) <= FLT_EPSILON
&& fabsf(a[1] - b[1]) <= FLT_EPSILON
&& fabsf(a[2] - b[2]) <= FLT_EPSILON;
return fabsf(a[0] - b[0]) <= GLM_FLT_EPSILON
&& fabsf(a[1] - b[1]) <= GLM_FLT_EPSILON
&& fabsf(a[2] - b[2]) <= GLM_FLT_EPSILON;
}
/*!
@@ -237,9 +237,9 @@ glm_vec3_abs(vec3 v, vec3 dest) {
CGLM_INLINE
void
glm_vec3_fract(vec3 v, vec3 dest) {
dest[0] = fminf(v[0] - floorf(v[0]), 0x1.fffffep-1f);
dest[1] = fminf(v[1] - floorf(v[1]), 0x1.fffffep-1f);
dest[2] = fminf(v[2] - floorf(v[2]), 0x1.fffffep-1f);
dest[0] = fminf(v[0] - floorf(v[0]), 0.999999940395355224609375f);
dest[1] = fminf(v[1] - floorf(v[1]), 0.999999940395355224609375f);
dest[2] = fminf(v[2] - floorf(v[2]), 0.999999940395355224609375f);
}
/*!

View File

@@ -92,10 +92,10 @@ glm_vec4_eq(vec4 v, float val) {
CGLM_INLINE
bool
glm_vec4_eq_eps(vec4 v, float val) {
return fabsf(v[0] - val) <= FLT_EPSILON
&& fabsf(v[1] - val) <= FLT_EPSILON
&& fabsf(v[2] - val) <= FLT_EPSILON
&& fabsf(v[3] - val) <= FLT_EPSILON;
return fabsf(v[0] - val) <= GLM_FLT_EPSILON
&& fabsf(v[1] - val) <= GLM_FLT_EPSILON
&& fabsf(v[2] - val) <= GLM_FLT_EPSILON
&& fabsf(v[3] - val) <= GLM_FLT_EPSILON;
}
/*!
@@ -106,9 +106,7 @@ glm_vec4_eq_eps(vec4 v, float val) {
CGLM_INLINE
bool
glm_vec4_eq_all(vec4 v) {
return v[0] == v[1]
&& v[0] == v[2]
&& v[0] == v[3];
return glm_vec4_eq_eps(v, v[0]);
}
/*!
@@ -135,10 +133,10 @@ glm_vec4_eqv(vec4 a, vec4 b) {
CGLM_INLINE
bool
glm_vec4_eqv_eps(vec4 a, vec4 b) {
return fabsf(a[0] - b[0]) <= FLT_EPSILON
&& fabsf(a[1] - b[1]) <= FLT_EPSILON
&& fabsf(a[2] - b[2]) <= FLT_EPSILON
&& fabsf(a[3] - b[3]) <= FLT_EPSILON;
return fabsf(a[0] - b[0]) <= GLM_FLT_EPSILON
&& fabsf(a[1] - b[1]) <= GLM_FLT_EPSILON
&& fabsf(a[2] - b[2]) <= GLM_FLT_EPSILON
&& fabsf(a[3] - b[3]) <= GLM_FLT_EPSILON;
}
/*!
@@ -226,10 +224,10 @@ glm_vec4_sign(vec4 v, vec4 dest) {
x0 = glmm_load(v);
x1 = _mm_set_ps(0.0f, 0.0f, 1.0f, -1.0f);
x2 = glmm_shuff1x(x1, 2);
x2 = glmm_splat(x1, 2);
x3 = _mm_and_ps(_mm_cmpgt_ps(x0, x2), glmm_shuff1x(x1, 1));
x4 = _mm_and_ps(_mm_cmplt_ps(x0, x2), glmm_shuff1x(x1, 0));
x3 = _mm_and_ps(_mm_cmpgt_ps(x0, x2), glmm_splat(x1, 1));
x4 = _mm_and_ps(_mm_cmplt_ps(x0, x2), glmm_splat(x1, 0));
glmm_store(dest, _mm_or_ps(x3, x4));
#else
@@ -270,10 +268,10 @@ glm_vec4_abs(vec4 v, vec4 dest) {
CGLM_INLINE
void
glm_vec4_fract(vec4 v, vec4 dest) {
dest[0] = fminf(v[0] - floorf(v[0]), 0x1.fffffep-1f);
dest[1] = fminf(v[1] - floorf(v[1]), 0x1.fffffep-1f);
dest[2] = fminf(v[2] - floorf(v[2]), 0x1.fffffep-1f);
dest[3] = fminf(v[3] - floorf(v[3]), 0x1.fffffep-1f);
dest[0] = fminf(v[0] - floorf(v[0]), 0.999999940395355224609375f);
dest[1] = fminf(v[1] - floorf(v[1]), 0.999999940395355224609375f);
dest[2] = fminf(v[2] - floorf(v[2]), 0.999999940395355224609375f);
dest[3] = fminf(v[3] - floorf(v[3]), 0.999999940395355224609375f);
}
/*!

View File

@@ -473,8 +473,8 @@ glm_vec4_scale_as(vec4 v, float s, vec4 dest) {
CGLM_INLINE
void
glm_vec4_div(vec4 a, vec4 b, vec4 dest) {
#if defined( __SSE__ ) || defined( __SSE2__ )
glmm_store(dest, _mm_div_ps(glmm_load(a), glmm_load(b)));
#if defined(CGLM_SIMD)
glmm_store(dest, glmm_div(glmm_load(a), glmm_load(b)));
#else
dest[0] = a[0] / b[0];
dest[1] = a[1] / b[1];
@@ -568,14 +568,8 @@ glm_vec4_subadd(vec4 a, vec4 b, vec4 dest) {
CGLM_INLINE
void
glm_vec4_muladd(vec4 a, vec4 b, vec4 dest) {
#if defined( __SSE__ ) || defined( __SSE2__ )
glmm_store(dest, _mm_add_ps(glmm_load(dest),
_mm_mul_ps(glmm_load(a),
glmm_load(b))));
#elif defined(CGLM_NEON_FP)
vst1q_f32(dest, vaddq_f32(vld1q_f32(dest),
vmulq_f32(vld1q_f32(a),
vld1q_f32(b))));
#if defined(CGLM_SIMD)
glmm_store(dest, glmm_fmadd(glmm_load(a), glmm_load(b), glmm_load(dest)));
#else
dest[0] += a[0] * b[0];
dest[1] += a[1] * b[1];
@@ -596,14 +590,8 @@ glm_vec4_muladd(vec4 a, vec4 b, vec4 dest) {
CGLM_INLINE
void
glm_vec4_muladds(vec4 a, float s, vec4 dest) {
#if defined( __SSE__ ) || defined( __SSE2__ )
glmm_store(dest, _mm_add_ps(glmm_load(dest),
_mm_mul_ps(glmm_load(a),
_mm_set1_ps(s))));
#elif defined(CGLM_NEON_FP)
vst1q_f32(dest, vaddq_f32(vld1q_f32(dest),
vsubq_f32(vld1q_f32(a),
vdupq_n_f32(s))));
#if defined(CGLM_SIMD)
glmm_store(dest, glmm_fmadd(glmm_load(a), glmm_set1(s), glmm_load(dest)));
#else
dest[0] += a[0] * s;
dest[1] += a[1] * s;
@@ -680,7 +668,7 @@ glm_vec4_negate_to(vec4 v, vec4 dest) {
#if defined( __SSE__ ) || defined( __SSE2__ )
glmm_store(dest, _mm_xor_ps(glmm_load(v), _mm_set1_ps(-0.0f)));
#elif defined(CGLM_NEON_FP)
vst1q_f32(dest, veorq_s32(vld1q_f32(v), vdupq_n_f32(-0.0f)));
vst1q_f32(dest, vnegq_f32(vld1q_f32(v)));
#else
dest[0] = -v[0];
dest[1] = -v[1];

View File

@@ -9,7 +9,7 @@
#define cglm_version_h
#define CGLM_VERSION_MAJOR 0
#define CGLM_VERSION_MINOR 7
#define CGLM_VERSION_PATCH 0
#define CGLM_VERSION_MINOR 8
#define CGLM_VERSION_PATCH 2
#endif /* cglm_version_h */

14
include/module.modulemap Normal file
View File

@@ -0,0 +1,14 @@
module cglm {
header "cglm/cglm.h"
header "cglm/struct.h"
export *
}
module cglmc {
header "cglm/cglm.h"
header "cglm/struct.h"
header "cglm/call.h"
export *
}

108
meson.build Normal file
View File

@@ -0,0 +1,108 @@
project('cglm', 'c',
version : '0.8.2',
license : 'mit',
default_options : [
'c_std=c11',
'werror=true',
'warning_level=2',
'buildtype=release'
]
)
cc = meson.get_compiler('c')
cglm_install = get_option('install')
cglm_deps = cc.find_library('m', required : false)
cglm_args = []
build_args = []
if get_option('default_library') == 'static'
cglm_args = '-DCGLM_STATIC'
endif
if host_machine.system() == 'windows'
build_args = '-DCGLM_EXPORTS'
endif
cglm_inc = include_directories('include')
cglm_src = files(
'src/affine.c',
'src/affine2d.c',
'src/bezier.c',
'src/box.c',
'src/cam.c',
'src/curve.c',
'src/ease.c',
'src/euler.c',
'src/frustum.c',
'src/io.c',
'src/mat2.c',
'src/mat3.c',
'src/mat4.c',
'src/plane.c',
'src/project.c',
'src/quat.c',
'src/ray.c',
'src/sphere.c',
'src/vec2.c',
'src/vec3.c',
'src/vec4.c'
)
cglm_lib = library('cglm',
cglm_src,
install : cglm_install,
dependencies : cglm_deps,
c_args : [ build_args, cglm_args ]
)
cglm_dep = declare_dependency(
link_with : cglm_lib,
dependencies : cglm_deps,
compile_args : cglm_args,
include_directories : cglm_inc,
version : meson.project_version()
)
if meson.version().version_compare('>= 0.54.0')
meson.override_dependency('cglm', cglm_dep)
endif
if cglm_install
install_subdir('include/cglm', install_dir : get_option('includedir'))
pkg = import('pkgconfig')
pkg.generate(
name : 'cglm',
libraries : cglm_lib,
extra_cflags : cglm_args,
version : meson.project_version(),
url : 'https://github.com/recp/cglm',
description : 'OpenGL Mathematics (glm) for C'
)
endif
if get_option('build_tests') == true
test_src = files(
'test/runner.c',
'test/src/test_euler.c',
'test/src/test_bezier.c',
'test/src/test_cam.c',
'test/src/test_struct.c',
'test/src/test_clamp.c',
'test/src/test_common.c',
'test/src/tests.c'
)
test_exe = executable('tests',
test_src,
dependencies : cglm_dep,
c_args : '-DGLM_TESTS_NO_COLORFUL_OUTPUT'
)
test('cglm.tests', test_exe)
endif

2
meson_options.txt Normal file
View File

@@ -0,0 +1,2 @@
option('build_tests', type : 'boolean', value : false, description : 'Build tests')
option('install', type : 'boolean', value : true, description : 'Include the library, headers, and pkg-config file in the install target')

81
src/affine2d.c Normal file
View File

@@ -0,0 +1,81 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#include "../include/cglm/cglm.h"
#include "../include/cglm/call.h"
CGLM_EXPORT
void
glmc_translate2d_make(mat3 m, vec2 v) {
glm_translate2d_make(m, v);
}
CGLM_EXPORT
void
glmc_translate2d_to(mat3 m, vec2 v, mat3 dest) {
glm_translate2d_to(m, v, dest);
}
CGLM_EXPORT
void
glmc_translate2d(mat3 m, vec2 v) {
glm_translate2d(m, v);
}
CGLM_EXPORT
void
glmc_translate2d_x(mat3 m, float to) {
glm_translate2d_x(m, to);
}
CGLM_EXPORT
void
glmc_translate2d_y(mat3 m, float to) {
glm_translate2d_y(m, to);
}
CGLM_EXPORT
void
glmc_scale2d_to(mat3 m, vec2 v, mat3 dest) {
glm_scale2d_to(m, v, dest);
}
CGLM_EXPORT
void
glmc_scale2d_make(mat3 m, vec2 v) {
glm_scale2d_make(m, v);
}
CGLM_EXPORT
void
glmc_scale2d(mat3 m, vec2 v) {
glm_scale2d(m, v);
}
CGLM_EXPORT
void
glmc_scale2d_uni(mat3 m, float s) {
glm_scale2d_uni(m, s);
}
CGLM_EXPORT
void
glmc_rotate2d_make(mat3 m, float angle) {
glm_rotate2d_make(m, angle);
}
CGLM_EXPORT
void
glmc_rotate2d(mat3 m, float angle) {
glm_rotate2d(m, angle);
}
CGLM_EXPORT
void
glmc_rotate2d_to(mat3 m, float angle, mat3 dest) {
glm_rotate2d_to(m, angle, dest);
}

View File

@@ -1,9 +1,9 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#ifndef cglm__config__h_
#define cglm__config__h_

View File

@@ -5,6 +5,8 @@
* Full license can be found in the LICENSE file
*/
#define CGLM_LIB_SRC
#include "../include/cglm/cglm.h"
#include "../include/cglm/call.h"

13
src/ray.c Normal file
View File

@@ -0,0 +1,13 @@
#include "../include/cglm/cglm.h"
#include "../include/cglm/call.h"
CGLM_EXPORT
bool
glmc_ray_triangle(vec3 origin,
vec3 direction,
vec3 v0,
vec3 v1,
vec3 v2,
float *d) {
return glm_ray_triangle(origin, direction, v0, v1, v2, d);
}

1
src/swift/empty.c Normal file
View File

@@ -0,0 +1 @@
// This empty file is needed to trick swiftpm to build the header-only version of cglm as swiftpm itself does not support C targets that have no source code files

44
test/CMakeLists.txt Normal file
View File

@@ -0,0 +1,44 @@
cmake_minimum_required(VERSION 3.8.2)
# List all files containing tests. (Change as needed)
set(TESTFILES
runner.c
src/test_euler.c
src/test_bezier.c
src/test_cam.c
src/test_struct.c
src/test_clamp.c
src/test_common.c
src/tests.c
)
set(TEST_MAIN tests)
set(TEST_RUNNER_PARAMS "")
add_executable(${TEST_MAIN} ${TESTFILES})
target_compile_definitions(${TEST_MAIN} PRIVATE CGLM_DEFINE_PRINTS=1)
if(NOT MSVC)
target_link_libraries(${TEST_MAIN} PRIVATE m)
endif()
target_link_libraries(${TEST_MAIN} PRIVATE cglm)
target_include_directories(${TEST_MAIN} PRIVATE
${CMAKE_CURRENT_LIST_DIR}/include
${CMAKE_CURRENT_LIST_DIR}/src
)
set_target_properties(${TEST_MAIN} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR})
if(LDFLAGS)
target_compile_options(${TEST_MAIN} PRIVATE ${LDFLAGS})
endif()
add_test(
NAME cglm.${TEST_MAIN}
COMMAND ${TEST_MAIN} ${TEST_RUNNER_PARAMS})
add_custom_target(check
make
COMMAND ${CMAKE_CTEST_COMMAND} -V
DEPENDS cglm)

View File

@@ -8,6 +8,18 @@
#ifndef tests_common_h
#define tests_common_h
#ifndef _USE_MATH_DEFINES
# define _USE_MATH_DEFINES /* for windows */
#endif
#ifndef _CRT_SECURE_NO_WARNINGS
# define _CRT_SECURE_NO_WARNINGS /* for windows */
#endif
#ifndef _GNU_SOURCE
# define _GNU_SOURCE /* for drand48() */
#endif
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
@@ -30,6 +42,8 @@ typedef struct test_entry_t {
int show_output;
} test_entry_t;
#ifndef GLM_TESTS_NO_COLORFUL_OUTPUT
#define RESET "\033[0m"
#define BLACK "\033[30m" /* Black */
#define RED "\033[31m" /* Red */
@@ -48,6 +62,28 @@ typedef struct test_entry_t {
#define BOLDCYAN "\033[1m\033[36m" /* Bold Cyan */
#define BOLDWHITE "\033[1m\033[37m" /* Bold White */
#else
#define RESET
#define BLACK
#define RED
#define GREEN
#define YELLOW
#define BLUE
#define MAGENTA
#define CYAN
#define WHITE
#define BOLDBLACK
#define BOLDRED
#define BOLDGREEN
#define BOLDYELLOW
#define BOLDBLUE
#define BOLDMAGENTA
#define BOLDCYAN
#define BOLDWHITE
#endif
#define TEST_DECLARE(FUN) test_status_t test_ ## FUN(void);
#define TEST_ENTRY(FUN) { #FUN, test_ ## FUN, 0, 0 },
#define TEST_LIST static test_entry_t tests[] =

View File

@@ -18,6 +18,8 @@ main(int argc, const char * argv[]) {
test_status_t st;
int32_t i, count, passed, failed, maxlen;
double start, end, elapsed, total;
(void)argc;
(void)argv;
passed = failed = maxlen = 0;
total = 0.0;

310
test/src/test_affine2d.h Normal file
View File

@@ -0,0 +1,310 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#include "test_common.h"
TEST_IMPL(GLM_PREFIX, translate2d) {
mat3 m1;
vec3 v1 = {2.0f, 3.0f, 1.0f}, v2;
glm_mat3_identity(m1);
GLM(translate2d)(m1, (vec2){13.0f, 11.0f});
glm_mat3_mulv(m1, v1, v2);
ASSERT(test_eq(v2[0], 15.0f))
ASSERT(test_eq(v2[1], 14.0f))
ASSERT(test_eq(v2[2], 1.0f))
glm_mat3_identity(m1);
GLM(translate2d)(m1, (vec2){1.0f, -1.0f});
glm_mat3_mulv(m1, v2, v2);
ASSERT(test_eq(v2[0], 16.0f))
ASSERT(test_eq(v2[1], 13.0f))
ASSERT(test_eq(v2[2], 1.0f))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, translate2d_to) {
mat3 m1, m2;
vec3 v1 = {2.0f, 3.0f, 1.0f}, v2;
glm_mat3_identity(m1);
GLM(translate2d_to)(m1, (vec2){13.0f, 11.0f}, m2);
glm_mat3_mulv(m2, v1, v2);
ASSERT(test_eq(v2[0], 15.0f))
ASSERT(test_eq(v2[1], 14.0f))
ASSERT(test_eq(v2[2], 1.0f))
glm_mat3_identity(m1);
GLM(translate2d_to)(m1, (vec2){1.0f, -1.0f}, m2);
glm_mat3_mulv(m2, v2, v2);
ASSERT(test_eq(v2[0], 16.0f))
ASSERT(test_eq(v2[1], 13.0f))
ASSERT(test_eq(v2[2], 1.0f))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, translate2d_x) {
mat3 m1;
vec3 v1 = {2.0f, 3.0f, 1.0f}, v2;
glm_mat3_identity(m1);
GLM(translate2d_x)(m1, 13.0f);
glm_mat3_mulv(m1, v1, v2);
ASSERT(test_eq(v2[0], 15.0f))
ASSERT(test_eq(v2[1], 3.0f))
ASSERT(test_eq(v2[2], 1.0f))
glm_mat3_identity(m1);
GLM(translate2d_x)(m1, -1.0f);
glm_mat3_mulv(m1, v2, v2);
ASSERT(test_eq(v2[0], 14.0f))
ASSERT(test_eq(v2[1], 3.0f))
ASSERT(test_eq(v2[2], 1.0f))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, translate2d_y) {
mat3 m1;
vec3 v1 = {2.0f, 3.0f, 1.0f}, v2;
glm_mat3_identity(m1);
GLM(translate2d_y)(m1, 11.0f);
glm_mat3_mulv(m1, v1, v2);
ASSERT(test_eq(v2[0], 2.0f))
ASSERT(test_eq(v2[1], 14.0f))
ASSERT(test_eq(v2[2], 1.0f))
glm_mat3_identity(m1);
GLM(translate2d_y)(m1, -1.0f);
glm_mat3_mulv(m1, v2, v2);
ASSERT(test_eq(v2[0], 2.0f))
ASSERT(test_eq(v2[1], 13.0f))
ASSERT(test_eq(v2[2], 1.0f))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, translate2d_make) {
mat3 m1;
vec3 v1 = {2.0f, 3.0f, 1.0f}, v2;
glm_mat3_identity(m1);
GLM(translate2d_make)(m1, (vec2){13.0f, 11.0f});
glm_mat3_mulv(m1, v1, v2);
ASSERT(test_eq(v2[0], 15.0f))
ASSERT(test_eq(v2[1], 14.0f))
ASSERT(test_eq(v2[2], 1.0f))
glm_mat3_identity(m1);
GLM(translate2d_make)(m1, (vec2){-1.0f, -5.0f});
glm_mat3_mulv(m1, v2, v2);
ASSERT(test_eq(v2[0], 14.0f))
ASSERT(test_eq(v2[1], 9.0f))
ASSERT(test_eq(v2[2], 1.0f))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, scale2d_to) {
mat3 m1, m2;
vec3 v1 = {2.0f, 3.0f, 1.0f}, v2;
glm_mat3_identity(m1);
GLM(scale2d_to)(m1, (vec2){13.0f, 11.0f}, m2);
glm_mat3_mulv(m2, v1, v2);
ASSERT(test_eq(v2[0], 26.0f))
ASSERT(test_eq(v2[1], 33.0f))
ASSERT(test_eq(v2[2], 1.0f))
glm_mat3_identity(m1);
GLM(scale2d_to)(m1, (vec2){-1.0f, -5.0f}, m2);
glm_mat3_mulv(m2, v2, v2);
ASSERT(test_eq(v2[0], -26.0f))
ASSERT(test_eq(v2[1], -165.0f))
ASSERT(test_eq(v2[2], 1.0f))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, scale2d_make) {
mat3 m1;
vec3 v1 = {2.0f, 3.0f, 1.0f}, v2;
GLM(scale2d_make)(m1, (vec2){13.0f, 11.0f});
glm_mat3_mulv(m1, v1, v2);
ASSERT(test_eq(v2[0], 26.0f))
ASSERT(test_eq(v2[1], 33.0f))
ASSERT(test_eq(v2[2], 1.0f))
GLM(scale2d_make)(m1, (vec3){-1.0f, -5.0f});
glm_mat3_mulv(m1, v2, v2);
ASSERT(test_eq(v2[0], -26.0f))
ASSERT(test_eq(v2[1], -165.0f))
ASSERT(test_eq(v2[2], 1.0f))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, scale2d) {
mat3 m1;
vec3 v1 = {2.0f, 3.0f, 1.0f}, v2;
glm_mat3_identity(m1);
GLM(scale2d)(m1, (vec2){13.0f, 11.0f});
glm_mat3_mulv(m1, v1, v2);
ASSERT(test_eq(v2[0], 26.0f))
ASSERT(test_eq(v2[1], 33.0f))
ASSERT(test_eq(v2[2], 1.0f))
glm_mat3_identity(m1);
GLM(scale2d)(m1, (vec2){-1.0f, -5.0f});
glm_mat3_mulv(m1, v2, v2);
ASSERT(test_eq(v2[0], -26.0f))
ASSERT(test_eq(v2[1], -165.0f))
ASSERT(test_eq(v2[2], 1.0f))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, scale2d_uni) {
mat3 m1;
vec3 v1 = {2.0f, 3.0f, 1.0f}, v2;
glm_mat3_identity(m1);
GLM(scale2d_uni)(m1, 13.0f);
glm_mat3_mulv(m1, v1, v2);
ASSERT(test_eq(v2[0], 26.0f))
ASSERT(test_eq(v2[1], 39.0f))
ASSERT(test_eq(v2[2], 1.0f))
glm_mat3_identity(m1);
GLM(scale2d_uni)(m1, -5.0f);
glm_mat3_mulv(m1, v2, v2);
ASSERT(test_eq(v2[0], -130.0f))
ASSERT(test_eq(v2[1], -195.0f))
ASSERT(test_eq(v2[2], 1.0f))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, rotate2d_make) {
mat3 m1 = GLM_MAT3_IDENTITY_INIT;
vec3 v1 = {0.0f, 1.0f, 1.0f}, v2 = {0.0f, 1.0f, 1.0f};
GLM(rotate2d_make)(m1, GLM_PI_2f);
glm_mat3_mulv(m1, v1, v1);
ASSERT(test_eq(v1[0], -1.0f))
ASSERT(test_eq(v1[1], 0.0f))
ASSERT(test_eq(v1[2], 1.0f))
glm_vec3_copy(v2, v1);
GLM(rotate2d_make)(m1, -GLM_PI_2f);
glm_mat3_mulv(m1, v1, v1);
ASSERT(test_eq(v1[0], 1.0f))
ASSERT(test_eq(v1[1], 0.0f))
ASSERT(test_eq(v1[2], 1.0f))
glm_vec3_copy(v2, v1);
GLM(rotate2d_make)(m1, GLM_PIf);
glm_mat3_mulv(m1, v1, v1);
ASSERT(test_eq(v1[0], 0.0f))
ASSERT(test_eq(v1[1], -1.0f))
ASSERT(test_eq(v1[2], 1.0f))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, rotate2d) {
mat3 m1 = GLM_MAT3_IDENTITY_INIT;
vec3 v1 = {0.0f, 1.0f, 1.0f}, v2 = {0.0f, 1.0f, 1.0f};
GLM(rotate2d)(m1, GLM_PI_2f);
glm_mat3_mulv(m1, v1, v1);
ASSERT(test_eq(v1[0], -1.0f))
ASSERT(test_eq(v1[1], 0.0f))
ASSERT(test_eq(v1[2], 1.0f))
glm_vec3_copy(v2, v1);
GLM(rotate2d)(m1, GLM_PI_2f);
glm_mat3_mulv(m1, v1, v1);
ASSERT(test_eq(v1[0], 0.0f))
ASSERT(test_eq(v1[1], -1.0f))
ASSERT(test_eq(v1[2], 1.0f))
glm_vec3_copy(v2, v1);
GLM(rotate2d)(m1, GLM_PI_2f);
glm_mat3_mulv(m1, v1, v1);
ASSERT(test_eq(v1[0], 1.0f))
ASSERT(test_eq(v1[1], 0.0f))
ASSERT(test_eq(v1[2], 1.0f))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, rotate2d_to) {
mat3 m1 = GLM_MAT3_IDENTITY_INIT, m2;
vec3 v1 = {0.0f, 1.0f, 1.0f}, v2 = {0.0f, 1.0f, 1.0f};
GLM(rotate2d_to)(m1, GLM_PI_2f, m1);
glm_mat3_mulv(m1, v1, v1);
ASSERT(test_eq(v1[0], -1.0f))
ASSERT(test_eq(v1[1], 0.0f))
ASSERT(test_eq(v1[2], 1.0f))
glm_vec3_copy(v2, v1);
GLM(rotate2d_to)(m1, GLM_PI_2f, m2);
glm_mat3_mulv(m2, v1, v1);
ASSERT(test_eq(v1[0], 0.0f))
ASSERT(test_eq(v1[1], -1.0f))
ASSERT(test_eq(v1[2], 1.0f))
glm_vec3_copy(v2, v1);
GLM(rotate2d_to)(m2, GLM_PI_2f, m1);
glm_mat3_mulv(m1, v1, v1);
ASSERT(test_eq(v1[0], 1.0f))
ASSERT(test_eq(v1[1], 0.0f))
ASSERT(test_eq(v1[2], 1.0f))
TEST_SUCCESS
}

View File

@@ -35,9 +35,9 @@ TEST_IMPL(camera_decomp) {
farVal = 100.0f;
glm_perspective(fovy, aspect, nearVal, farVal, proj);
ASSERT(fabsf(aspect - glm_persp_aspect(proj)) < FLT_EPSILON)
ASSERT(fabsf(fovy - glm_persp_fovy(proj)) < FLT_EPSILON)
ASSERT(fabsf(49.984f - glm_deg(glm_persp_fovy(proj))) < FLT_EPSILON)
ASSERT(fabsf(aspect - glm_persp_aspect(proj)) < GLM_FLT_EPSILON)
ASSERT(fabsf(fovy - glm_persp_fovy(proj)) < GLM_FLT_EPSILON)
ASSERT(fabsf(49.984f - glm_deg(glm_persp_fovy(proj))) < GLM_FLT_EPSILON)
glm_persp_sizes(proj, fovy, sizes);

68
test/src/test_camera.h Normal file
View File

@@ -0,0 +1,68 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#include "test_common.h"
TEST_IMPL(GLM_PREFIX, frustum) {
mat4 proj;
vec4 vp = {0.0f, 0.0f, 800.0f, 600.0f};
float left, right, top, bottom, znear, zfar;
znear = 0.1f;
zfar = 100.0f;
left = -100.0f;
right = 100.0f;
bottom = -100.0f;
top = 100.0f;
GLM(frustum)(left, right, bottom, top, znear, zfar, proj);
ASSERT(test_eq(proj[0][1], 0.0f))
ASSERT(test_eq(proj[0][2], 0.0f))
ASSERT(test_eq(proj[0][3], 0.0f))
ASSERT(test_eq(proj[1][0], 0.0f))
ASSERT(test_eq(proj[1][2], 0.0f))
ASSERT(test_eq(proj[1][3], 0.0f))
ASSERT(test_eq(proj[2][3], -1.0f))
ASSERT(test_eq(proj[3][0], 0.0f))
ASSERT(test_eq(proj[3][1], 0.0f))
ASSERT(test_eq(proj[3][3], 0.0f))
vec4 v1 = {1.0f, 20.0f, znear};
vec4 v2 = {1.0f, 20.0f, zfar};
vec4 v3, v4;
/* perspective test */
GLM(mat4_mulv)(proj, v1, v3);
GLM(project)(v3, proj, vp, v3);
ASSERT(v3[0] > v1[0])
ASSERT(v3[1] > v1[1])
GLM(mat4_mulv)(proj, v2, v4);
GLM(project)(v4, proj, vp, v4);
ASSERT(v4[0] < v3[0])
ASSERT(v4[1] < v3[1])
/* not infinity */
ASSERT(!GLM(vec4_isinf)(proj[0]))
ASSERT(!GLM(vec4_isinf)(proj[1]))
ASSERT(!GLM(vec4_isinf)(proj[2]))
ASSERT(!GLM(vec4_isinf)(proj[3]))
/* not NaN */
ASSERT(!GLM(vec4_isnan)(proj[0]))
ASSERT(!GLM(vec4_isnan)(proj[1]))
ASSERT(!GLM(vec4_isnan)(proj[2]))
ASSERT(!GLM(vec4_isnan)(proj[3]))
TEST_SUCCESS
}

View File

@@ -106,7 +106,7 @@ test_rand_quat(versor q);
CGLM_INLINE
bool
test_eq(float a, float b) {
return fabsf(a - b) <= 1e-6;
return fabsf(a - b) <= GLM_FLT_EPSILON * 10;
}
CGLM_INLINE

34
test/src/test_ray.h Normal file
View File

@@ -0,0 +1,34 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#include "test_common.h"
TEST_IMPL(GLM_PREFIX, ray_triangle) {
/* Check whether a simple hit is recognized with the right distance */
vec3 origin = { 0.0f, 0.0f, 0.0f};
vec3 direction = { 1.0f, 0.0f, 0.0f};
vec3 opposite = {-1.0f, 0.0f, 0.0f};
vec3 v0 = { 5.0f, -1.0f, 1.0f};
vec3 v1 = { 5.0f, -1.0f, -1.0f};
vec3 v2 = { 5.0f, 1.0f, 0.0f};
float d;
bool hit;
hit = GLM(ray_triangle)(origin, direction, v0, v1, v2, &d);
ASSERT(hit);
ASSERT(fabsf(d - 5.0f) <= 0.0000009);
/* Check whether a simple miss works */
hit = GLM(ray_triangle)(origin, opposite, v0, v1, v2, &d);
ASSERT(!hit);
/* Check that we can disregard distance and pass NULL pointer instead */
hit = GLM(ray_triangle)(origin, direction, v0, v1, v2, NULL);
ASSERT(hit);
TEST_SUCCESS
}

View File

@@ -1,9 +1,9 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#include "test_common.h"

View File

@@ -22,7 +22,10 @@
#include "test_project.h"
#include "test_plane.h"
#include "test_affine.h"
#include "test_affine2d.h"
#include "test_affine_mat.h"
#include "test_ray.h"
#include "test_camera.h"
#undef GLM
#undef GLM_PREFIX
@@ -43,7 +46,10 @@
#include "test_project.h"
#include "test_plane.h"
#include "test_affine.h"
#include "test_affine2d.h"
#include "test_affine_mat.h"
#include "test_ray.h"
#include "test_camera.h"
#undef GLM
#undef GLM_PREFIX

View File

@@ -70,6 +70,33 @@ TEST_DECLARE(glmc_uniscaled)
TEST_DECLARE(glmc_decompose_rs)
TEST_DECLARE(glmc_decompose)
/* affine 2d */
TEST_DECLARE(glm_translate2d)
TEST_DECLARE(glm_translate2d_to)
TEST_DECLARE(glm_translate2d_x)
TEST_DECLARE(glm_translate2d_y)
TEST_DECLARE(glm_translate2d_make)
TEST_DECLARE(glm_scale2d_to)
TEST_DECLARE(glm_scale2d_make)
TEST_DECLARE(glm_scale2d)
TEST_DECLARE(glm_scale2d_uni)
TEST_DECLARE(glm_rotate2d_make)
TEST_DECLARE(glm_rotate2d)
TEST_DECLARE(glm_rotate2d_to)
TEST_DECLARE(glmc_translate2d)
TEST_DECLARE(glmc_translate2d_to)
TEST_DECLARE(glmc_translate2d_x)
TEST_DECLARE(glmc_translate2d_y)
TEST_DECLARE(glmc_translate2d_make)
TEST_DECLARE(glmc_scale2d_to)
TEST_DECLARE(glmc_scale2d_make)
TEST_DECLARE(glmc_scale2d)
TEST_DECLARE(glmc_scale2d_uni)
TEST_DECLARE(glmc_rotate2d_make)
TEST_DECLARE(glmc_rotate2d)
TEST_DECLARE(glmc_rotate2d_to)
/* mat4 */
TEST_DECLARE(glm_mat4_ucopy)
TEST_DECLARE(glm_mat4_copy)
@@ -199,6 +226,10 @@ TEST_DECLARE(glmc_mat2_rmc)
TEST_DECLARE(camera_lookat)
TEST_DECLARE(camera_decomp)
TEST_DECLARE(glm_frustum)
TEST_DECLARE(glmc_frustum)
/* project */
TEST_DECLARE(glm_unprojecti)
TEST_DECLARE(glm_unproject)
@@ -218,6 +249,10 @@ TEST_DECLARE(clamp)
/* euler */
TEST_DECLARE(euler)
/* ray */
TEST_DECLARE(glm_ray_triangle)
TEST_DECLARE(glmc_ray_triangle)
/* quat */
TEST_DECLARE(MACRO_GLM_QUAT_IDENTITY_INIT)
TEST_DECLARE(MACRO_GLM_QUAT_IDENTITY)
@@ -757,6 +792,33 @@ TEST_LIST {
TEST_ENTRY(glmc_decompose_rs)
TEST_ENTRY(glmc_decompose)
/* affine 2d */
TEST_ENTRY(glm_translate2d)
TEST_ENTRY(glm_translate2d_to)
TEST_ENTRY(glm_translate2d_x)
TEST_ENTRY(glm_translate2d_y)
TEST_ENTRY(glm_translate2d_make)
TEST_ENTRY(glm_scale2d_to)
TEST_ENTRY(glm_scale2d_make)
TEST_ENTRY(glm_scale2d)
TEST_ENTRY(glm_scale2d_uni)
TEST_ENTRY(glm_rotate2d_make)
TEST_ENTRY(glm_rotate2d)
TEST_ENTRY(glm_rotate2d_to)
TEST_ENTRY(glmc_translate2d)
TEST_ENTRY(glmc_translate2d_to)
TEST_ENTRY(glmc_translate2d_x)
TEST_ENTRY(glmc_translate2d_y)
TEST_ENTRY(glmc_translate2d_make)
TEST_ENTRY(glmc_scale2d_to)
TEST_ENTRY(glmc_scale2d_make)
TEST_ENTRY(glmc_scale2d)
TEST_ENTRY(glmc_scale2d_uni)
TEST_ENTRY(glmc_rotate2d_make)
TEST_ENTRY(glmc_rotate2d)
TEST_ENTRY(glmc_rotate2d_to)
/* mat4 */
TEST_ENTRY(glm_mat4_ucopy)
TEST_ENTRY(glm_mat4_copy)
@@ -886,6 +948,10 @@ TEST_LIST {
TEST_ENTRY(camera_lookat)
TEST_ENTRY(camera_decomp)
TEST_ENTRY(glm_frustum)
TEST_ENTRY(glmc_frustum)
/* project */
TEST_ENTRY(glm_unprojecti)
TEST_ENTRY(glm_unproject)
@@ -905,6 +971,10 @@ TEST_LIST {
/* euler */
TEST_ENTRY(euler)
/* ray */
TEST_ENTRY(glm_ray_triangle)
TEST_ENTRY(glmc_ray_triangle)
/* quat */
TEST_ENTRY(MACRO_GLM_QUAT_IDENTITY_INIT)
TEST_ENTRY(MACRO_GLM_QUAT_IDENTITY)
@@ -984,6 +1054,7 @@ TEST_LIST {
/* bezier */
TEST_ENTRY(bezier)
/* vec2 */
/* Macros */
TEST_ENTRY(MACRO_GLM_VEC2_ONE_INIT)
@@ -1062,7 +1133,6 @@ TEST_LIST {
TEST_ENTRY(glmc_vec2_lerp)
/* vec3 */
/* Macros */
TEST_ENTRY(MACRO_GLM_VEC3_ONE_INIT)
@@ -1228,6 +1298,7 @@ TEST_LIST {
TEST_ENTRY(glmc_vec3_sqrt)
/* vec4 */
/* Macros */
TEST_ENTRY(MACRO_GLM_VEC4_ONE_INIT)
TEST_ENTRY(MACRO_GLM_VEC4_ZERO_INIT)

View File

@@ -31,7 +31,9 @@
<ItemGroup>
<ClInclude Include="..\test\include\common.h" />
<ClInclude Include="..\test\src\test_affine.h" />
<ClInclude Include="..\test\src\test_affine2d.h" />
<ClInclude Include="..\test\src\test_affine_mat.h" />
<ClInclude Include="..\test\src\test_camera.h" />
<ClInclude Include="..\test\src\test_common.h" />
<ClInclude Include="..\test\src\test_mat2.h" />
<ClInclude Include="..\test\src\test_mat3.h" />
@@ -42,6 +44,7 @@
<ClInclude Include="..\test\src\test_vec2.h" />
<ClInclude Include="..\test\src\test_vec3.h" />
<ClInclude Include="..\test\src\test_vec4.h" />
<ClInclude Include="..\test\src\test_ray.h" />
<ClInclude Include="..\test\tests.h" />
</ItemGroup>
<ItemGroup>
@@ -144,6 +147,7 @@
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<BasicRuntimeChecks>Default</BasicRuntimeChecks>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
@@ -161,6 +165,7 @@
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<BasicRuntimeChecks>Default</BasicRuntimeChecks>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>

View File

@@ -79,5 +79,14 @@
<ClInclude Include="..\test\src\test_vec2.h">
<Filter>src</Filter>
</ClInclude>
<ClInclude Include="..\test\src\test_ray.h">
<Filter>src</Filter>
</ClInclude>
<ClInclude Include="..\test\src\test_affine2d.h">
<Filter>src</Filter>
</ClInclude>
<ClInclude Include="..\test\src\test_camera.h">
<Filter>src</Filter>
</ClInclude>
</ItemGroup>
</Project>

View File

@@ -20,6 +20,7 @@
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\src\affine.c" />
<ClCompile Include="..\src\affine2d.c" />
<ClCompile Include="..\src\bezier.c" />
<ClCompile Include="..\src\box.c" />
<ClCompile Include="..\src\cam.c" />
@@ -34,6 +35,7 @@
<ClCompile Include="..\src\plane.c" />
<ClCompile Include="..\src\project.c" />
<ClCompile Include="..\src\quat.c" />
<ClCompile Include="..\src\ray.c" />
<ClCompile Include="..\src\sphere.c" />
<ClCompile Include="..\src\vec2.c" />
<ClCompile Include="..\src\vec3.c" />
@@ -42,11 +44,13 @@
<ItemGroup>
<ClInclude Include="..\include\cglm\affine-mat.h" />
<ClInclude Include="..\include\cglm\affine.h" />
<ClInclude Include="..\include\cglm\affine2d.h" />
<ClInclude Include="..\include\cglm\applesimd.h" />
<ClInclude Include="..\include\cglm\bezier.h" />
<ClInclude Include="..\include\cglm\box.h" />
<ClInclude Include="..\include\cglm\call.h" />
<ClInclude Include="..\include\cglm\call\affine.h" />
<ClInclude Include="..\include\cglm\call\affine2d.h" />
<ClInclude Include="..\include\cglm\call\bezier.h" />
<ClInclude Include="..\include\cglm\call\box.h" />
<ClInclude Include="..\include\cglm\call\cam.h" />
@@ -61,6 +65,7 @@
<ClInclude Include="..\include\cglm\call\plane.h" />
<ClInclude Include="..\include\cglm\call\project.h" />
<ClInclude Include="..\include\cglm\call\quat.h" />
<ClInclude Include="..\include\cglm\call\ray.h" />
<ClInclude Include="..\include\cglm\call\sphere.h" />
<ClInclude Include="..\include\cglm\call\vec2.h" />
<ClInclude Include="..\include\cglm\call\vec3.h" />
@@ -80,12 +85,14 @@
<ClInclude Include="..\include\cglm\plane.h" />
<ClInclude Include="..\include\cglm\project.h" />
<ClInclude Include="..\include\cglm\quat.h" />
<ClInclude Include="..\include\cglm\ray.h" />
<ClInclude Include="..\include\cglm\simd\arm.h" />
<ClInclude Include="..\include\cglm\simd\avx\affine.h" />
<ClInclude Include="..\include\cglm\simd\avx\mat4.h" />
<ClInclude Include="..\include\cglm\simd\intrin.h" />
<ClInclude Include="..\include\cglm\simd\neon\mat4.h" />
<ClInclude Include="..\include\cglm\simd\sse2\affine.h" />
<ClInclude Include="..\include\cglm\simd\sse2\mat2.h" />
<ClInclude Include="..\include\cglm\simd\sse2\mat3.h" />
<ClInclude Include="..\include\cglm\simd\sse2\mat4.h" />
<ClInclude Include="..\include\cglm\simd\sse2\quat.h" />
@@ -93,6 +100,7 @@
<ClInclude Include="..\include\cglm\sphere.h" />
<ClInclude Include="..\include\cglm\struct.h" />
<ClInclude Include="..\include\cglm\struct\affine.h" />
<ClInclude Include="..\include\cglm\struct\affine2d.h" />
<ClInclude Include="..\include\cglm\struct\box.h" />
<ClInclude Include="..\include\cglm\struct\cam.h" />
<ClInclude Include="..\include\cglm\struct\color.h" />
@@ -201,7 +209,7 @@
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>MaxSpeed</Optimization>
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;CGLM_EXPORTS;CGLM_DLL;%(PreprocessorDefinitions);CGLM_DLL</PreprocessorDefinitions>
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;CGLM_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<DebugInformationFormat>None</DebugInformationFormat>
<BasicRuntimeChecks>Default</BasicRuntimeChecks>
<PrecompiledHeaderFile />
@@ -217,7 +225,7 @@
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>MaxSpeed</Optimization>
<PreprocessorDefinitions>_DEBUG;_WINDOWS;_USRDLL;CGLM_EXPORTS;CGLM_DLL;%(PreprocessorDefinitions);CGLM_DLL</PreprocessorDefinitions>
<PreprocessorDefinitions>_DEBUG;_WINDOWS;_USRDLL;CGLM_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>
<IntrinsicFunctions>true</IntrinsicFunctions>
<WholeProgramOptimization>true</WholeProgramOptimization>
@@ -238,11 +246,12 @@
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;CGLM_EXPORTS;CGLM_DLL;%(PreprocessorDefinitions);CGLM_DLL</PreprocessorDefinitions>
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;CGLM_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<DebugInformationFormat>None</DebugInformationFormat>
<PrecompiledHeaderFile />
<CompileAs>CompileAsC</CompileAs>
<EnablePREfast>true</EnablePREfast>
<BasicRuntimeChecks>Default</BasicRuntimeChecks>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
@@ -257,11 +266,12 @@
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>NDEBUG;_WINDOWS;_USRDLL;CGLM_EXPORTS;CGLM_DLL;%(PreprocessorDefinitions);CGLM_DLL</PreprocessorDefinitions>
<PreprocessorDefinitions>NDEBUG;_WINDOWS;_USRDLL;CGLM_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<DebugInformationFormat>None</DebugInformationFormat>
<PrecompiledHeaderFile />
<CompileAs>CompileAsC</CompileAs>
<EnablePREfast>true</EnablePREfast>
<BasicRuntimeChecks>Default</BasicRuntimeChecks>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>

View File

@@ -92,6 +92,12 @@
<ClCompile Include="..\src\vec2.c">
<Filter>src</Filter>
</ClCompile>
<ClCompile Include="..\src\ray.c">
<Filter>src</Filter>
</ClCompile>
<ClCompile Include="..\src\affine2d.c">
<Filter>src</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\src\config.h">
@@ -124,6 +130,9 @@
<ClInclude Include="..\include\cglm\call\vec4.h">
<Filter>include\cglm\call</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\call\ray.h">
<Filter>include\cglm\call</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\simd\avx\affine.h">
<Filter>include\cglm\simd\avx</Filter>
</ClInclude>
@@ -241,6 +250,9 @@
<ClInclude Include="..\include\cglm\ease.h">
<Filter>include\cglm</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\ray.h">
<Filter>include\cglm</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\simd\arm.h">
<Filter>include\cglm\simd</Filter>
</ClInclude>
@@ -346,5 +358,17 @@
<ClInclude Include="..\include\cglm\struct\vec2-ext.h">
<Filter>include\cglm\struct</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\simd\sse2\mat2.h">
<Filter>include\cglm\simd\sse2</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\call\affine2d.h">
<Filter>include\cglm\call</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\affine2d.h">
<Filter>include\cglm</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\struct\affine2d.h">
<Filter>include\cglm\struct</Filter>
</ClInclude>
</ItemGroup>
</Project>