Compare commits

...

90 Commits

Author SHA1 Message Date
Recep Aslantas
da5c66d735 update affine-post.h 2022-10-23 14:27:34 +03:00
Recep Aslantas
c4b45a0917 remove redundant comments 2022-10-23 14:22:16 +03:00
Recep Aslantas
8034073965 Merge pull request #260 from recp/new-affine
new affine transform functions 🚀
2022-10-23 14:06:34 +03:00
Recep Aslantas
53009d69c0 update build files 2022-10-23 12:09:44 +03:00
Recep Aslantas
7c62ad965b add missing call functions 2022-10-23 12:08:37 +03:00
Recep Aslantas
878e829767 update docs 2022-10-23 12:00:17 +03:00
Recep Aslantas
7c7ac8b82e add missing impl for project_z 2022-10-22 23:06:46 +03:00
Recep Aslantas
ba66459708 new project function for projecting Z
someitmes we need to project z only. this function reduces a few calculations and parameters.
2022-10-21 10:20:03 +03:00
Recep Aslantas
45e176680f post rotation operaqtions 2022-10-18 15:43:07 +03:00
Recep Aslantas
c0bd65027a add missing spin impl 2022-10-18 07:38:06 +03:00
Recep Aslantas
03d5699f32 new rotation function: spin; rotate around self at any position 2022-10-17 23:57:41 +03:00
Recep Aslantas
199d1fa031 Merge pull request #259 from bobvanderlinden/pr-cmake-pkgconfig-fix
fix: simplified pkgconfig generation
2022-09-20 16:38:48 +03:00
Bob van der Linden
c7393f75c3 fix: simplified pkgconfig generation 2022-09-16 16:45:12 +02:00
Recep Aslantas
a3186a7f32 Merge pull request #257 from Rokannon/patch-1
Added missing include in io.h which adds GLM_MAX macro
2022-09-11 11:33:46 +03:00
Vladimir Atamanov
5a89faafff Added missing include in io.h which adds GLM_MAX macro 2022-09-11 00:49:24 +02:00
Recep Aslantas
51853db559 Merge pull request #256 from ogtn/master
Fix typo in comment
2022-09-04 07:25:27 +03:00
Olivier Guittonneau
8f8417a883 Fix typo in comment 2022-09-04 01:08:50 +02:00
Recep Aslantas
2238fd127c win: suppress warnings for tests 2022-08-23 18:01:05 +03:00
Recep Aslantas
073a11a6b8 win: add missing files to visual studio project 2022-08-23 16:01:40 +03:00
Recep Aslantas
2d348ceba0 build: add missing files to meson and cmake lists 2022-08-23 15:43:04 +03:00
Recep Aslantas
ce69ecaa5a struct: project_no and project_zo apis for struct api 2022-08-23 15:31:55 +03:00
Recep Aslantas
5ad0f1c6f3 fix MIT License links 2022-08-23 15:30:09 +03:00
Recep Aslantas
aea75bbe7c build: update Makefile.am 2022-08-23 14:13:00 +03:00
Recep Aslantas
7dfe67cdde Update .gitignore 2022-08-07 11:49:13 +03:00
Recep Aslantas
84f64a5b65 Update FUNDING.yml 2022-08-01 05:10:14 +03:00
Recep Aslantas
7df8ffa7fe Merge pull request #254 from Chris-F5/fix-readme-notes
Update README to show that integer types are supported
2022-07-16 12:01:00 +03:00
Christopher Lang
dc5558d8f4 Fix readme supported types note 2022-07-15 20:17:58 +01:00
Recep Aslantas
63990be905 Merge pull request #251 from Chris-F5/add-basic-ivec-functions
Add basic ivec functions
2022-05-22 21:06:07 +03:00
Christopher Lang
cd0ae19459 Add ivec[2|3|4] sources to meson.build 2022-05-21 11:11:34 +01:00
Christopher Lang
838124af49 Declare varables at top of scope for ivec[2|3|4] 2022-05-20 17:30:54 +01:00
Christopher Lang
e3981b6d96 Add ivec[3|4] docs 2022-05-20 17:16:41 +01:00
Christopher Lang
7bb765367e Small ivec2 docs fix 2022-05-20 17:16:09 +01:00
Christopher Lang
82982abaef Add ivec2 documentation 2022-05-20 17:07:16 +01:00
Christopher Lang
dbe3b719c7 Fix ivec[2|3|4]_clamp doc comments 2022-05-20 16:53:02 +01:00
Christopher Lang
09155986fe Update ivec[2|3|4]_distance2 doc comments 2022-05-20 16:49:23 +01:00
Christopher Lang
1b3e2fdaec Improve ivec[2|3|4] documentation comments 2022-05-20 15:24:36 +01:00
Christopher Lang
4aef2510e9 Init ivec[2|3|4] docs 2022-05-20 15:02:58 +01:00
Chris-F5
2432970f90 Merge branch 'recp:master' into add-basic-ivec-functions 2022-05-20 14:45:57 +01:00
Christopher Lang
d1bdfde48d Add ivec4 tests 2022-05-20 14:42:42 +01:00
Christopher Lang
f27e26f632 Fix glm_ivec3 test 2022-05-20 14:41:59 +01:00
Christopher Lang
a3265ebe84 Fix glm_ivec3_one test 2022-05-20 14:27:30 +01:00
Christopher Lang
57ec29bd31 Update glm_ivec3 test 2022-05-20 14:26:49 +01:00
Recep Aslantas
1b217c3dd0 Merge pull request #250 from alexshpilkin/fix-pkg-config
Fix pkg-config generation when CMAKE_INSTALL_*DIR is absolute
2022-05-19 22:23:10 +03:00
Christopher Lang
94a1e6f6e1 Add ivec4 functions 2022-05-19 17:43:17 +01:00
Christopher Lang
a1a2a046a4 Fix ivec[2|3]_clamp comment docs 2022-05-19 17:32:01 +01:00
Christopher Lang
bffaa13bd5 Add ivec3 tests 2022-05-19 17:12:38 +01:00
Christopher Lang
cd4d0a1efe Update glm_ivec2_copy test 2022-05-19 17:11:58 +01:00
Christopher Lang
8916c50a3d Update glm_ivec2 test 2022-05-19 16:52:55 +01:00
Christopher Lang
7a19b8f8a3 Fix glmc_ivec3 naming 2022-05-19 16:52:10 +01:00
Alexander Shpilkin
f587c00f26 allow absolute paths in CMAKE_INSTALL_*DIR 2022-05-19 18:47:00 +03:00
Christopher Lang
65409bcda1 Add ivec3 functions 2022-05-18 18:05:17 +01:00
Christopher Lang
d2957e6275 Fix ivec2 function list comment 2022-05-18 17:55:25 +01:00
Christopher Lang
04bd1bd633 Fix ivec2 doc comment 2022-05-17 23:03:26 +01:00
Christopher Lang
db1a23d13c Add ivec2 tests 2022-05-17 22:27:38 +01:00
Christopher Lang
a85744430a Add ivec2 functions 2022-05-17 22:25:10 +01:00
Christopher Lang
d582146d9a Add ivec3 and ivec4 files 2022-05-17 16:04:47 +01:00
Christopher Lang
ee09707c1c Fix ivec2 test 2022-05-17 15:53:37 +01:00
Christopher Lang
4c85b970a9 Add ivec2 files 2022-05-16 22:41:04 +01:00
Christopher Lang
f7f0f66193 Reorder api docs 2022-05-16 22:14:57 +01:00
Christopher Lang
495b98a54d Fix tests.h comments 2022-05-16 20:51:44 +01:00
Recep Aslantas
aee47ce545 Merge pull request #247 from Chris-F5/improve-docs-index
Fix grammatical errors in docs index
2022-05-12 07:11:38 +03:00
Christopher Lang
52debe6a04 improve docs index 2022-05-08 21:49:30 +01:00
Recep Aslantas
cf7f4231f0 now working on v0.8.6 2022-03-20 22:19:31 +03:00
Recep Aslantas
7e5d1f435f Merge pull request #244 from geckor14/master
Remove unused variable
2022-03-18 12:39:29 +03:00
geckor14
851a58cedb Remove unused variable
The most recent version of Apple Clang (13.1.6) on macOS complains r3 is an unused variable. With -Werror enabled, this breaks the build.
2022-03-18 18:42:19 +11:00
Recep Aslantas
6fa1cefcc2 Merge pull request #243 from Sand3r-/patch-1
Fix a bug in glm_lookat_lh
2022-03-09 09:38:26 +03:00
Michał Gallus
7e211e1f49 Fix bug in view_lh.h #2
Reverse order of parameters in the second crossproduct
2022-03-08 01:42:43 +01:00
Michał Gallus
7d47b7f1fd Fix a bug in glm_lookat_lh
Fix the order of arguments passed to glm_vec3_crossn to avoid the negation of X axis.
2022-03-08 01:29:35 +01:00
Recep Aslantas
2a4748d452 fix glm_pickmatrix()'s param type 2022-01-31 02:56:39 +03:00
Recep Aslantas
f20bf0aaaf Merge pull request #236 from recp/ivec
add missing ivec types
2022-01-07 00:23:32 +03:00
Recep Aslantas
3a141b7cc8 extend unions for struct api 2022-01-06 18:12:46 +03:00
Recep Aslantas
5cd1a4ab44 add missing ivec types 2022-01-06 18:01:35 +03:00
Recep Aslantas
897f2afd88 Merge pull request #234 from madebr/sse3_header
Header containing sse3 intrinsics is pmmintrin.h
2021-12-31 17:51:30 +03:00
Anonymous Maarten
68e3a072e8 Header containing sse3 intrinsics is pmmintrin.h 2021-12-29 08:48:55 +01:00
Recep Aslantas
282ea84dc0 Merge pull request #231 from omar-polo/master
set PACKAGE_VERSION so it gets substituted in cglm.pc.in by cmake
2021-11-22 11:20:20 +03:00
Omar Polo
2d5506d15d set PACKAGE_VERSION so it gets substituted in cglm.pc.in by cmake
otherwise it ends up being an empty string and the installed pc has a
bogus line:

	Version:
2021-11-21 21:04:59 +01:00
Recep Aslantas
87f561fb06 Merge pull request #229 from mxi/vec2-ext-complex
Add complex routines to `vec2-ext`
2021-11-10 10:09:09 +03:00
Maxim Kasyanenko
522b18bda9 Add tests 2021-11-08 17:53:39 -08:00
Maxim Kasyanenko
b7178749ee Forgot to add the dynamic implementation file itself 2021-11-08 17:53:27 -08:00
Maxim Kasyanenko
98c708281f Syntax errors 2021-11-08 17:52:47 -08:00
Maxim Kasyanenko
896ba0a0f9 Add dynamic/struct versions of routines 2021-11-08 17:52:31 -08:00
Maxim Kasyanenko
4603816330 Forgot return type 2021-11-08 17:09:28 -08:00
Maxim Kasyanenko
9f5cc3a745 Implement a few complex routines 2021-11-08 16:28:55 -08:00
Recep Aslantas
bde653b607 Update CMakeLists.txt 2021-10-28 19:10:19 +03:00
Recep Aslantas
ede72ca412 Merge pull request #225 from podsvirov/fix-win32-shared
win: fix shared library name and destination
2021-10-17 18:09:18 +03:00
Konstantin Podsvirov
8e784e762f win: fix shared library name and destination 2021-10-10 12:02:44 +03:00
Recep Aslantas
82d1050c63 update GLM_FLT_EPSILON to use 1e-5 instead of 1e-6 2021-10-06 21:08:55 +03:00
Recep Aslantas
0631598d08 now working on v0.8.5 2021-08-18 05:03:59 +03:00
Recep Aslantas
34e5704fe8 bump version to v0.8.4 2021-08-18 04:47:11 +03:00
Recep Aslantas
672523e5af Merge pull request #219 from recp/project_zo
extend glm_project() to support ZERO_TO_ONE
2021-08-16 16:55:19 +03:00
83 changed files with 4597 additions and 564 deletions

4
.github/FUNDING.yml vendored
View File

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

1
.gitignore vendored
View File

@@ -79,3 +79,4 @@ confdefs.h
.idea .idea
cmake-build-debug cmake-build-debug
*.o.tmp *.o.tmp
xcode/*

View File

@@ -1,5 +1,10 @@
cmake_minimum_required(VERSION 3.8.2) cmake_minimum_required(VERSION 3.8.2)
project(cglm VERSION 0.8.3 LANGUAGES C) project(cglm
VERSION 0.8.6
HOMEPAGE_URL https://github.com/recp/cglm
DESCRIPTION "OpenGL Mathematics (glm) for C"
LANGUAGES C
)
set(CMAKE_C_STANDARD 11) set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED YES) set(CMAKE_C_STANDARD_REQUIRED YES)
@@ -47,7 +52,10 @@ include(GNUInstallDirs)
set(CPACK_PROJECT_NAME ${PROJECT_NAME}) set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION}) set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)
if(NOT CPack_CMake_INCLUDED)
include(CPack)
endif()
# Target Start # Target Start
add_library(${PROJECT_NAME} add_library(${PROJECT_NAME}
@@ -58,8 +66,11 @@ add_library(${PROJECT_NAME}
src/quat.c src/quat.c
src/cam.c src/cam.c
src/vec2.c src/vec2.c
src/ivec2.c
src/vec3.c src/vec3.c
src/ivec3.c
src/vec4.c src/vec4.c
src/ivec4.c
src/mat2.c src/mat2.c
src/mat3.c src/mat3.c
src/mat4.c src/mat4.c
@@ -73,18 +84,20 @@ add_library(${PROJECT_NAME}
src/bezier.c src/bezier.c
src/ray.c src/ray.c
src/affine2d.c src/affine2d.c
src/clipspace/persp_lh_zo.c
src/clipspace/persp_rh_zo.c
src/clipspace/persp_lh_no.c
src/clipspace/persp_rh_no.c
src/clipspace/ortho_lh_zo.c
src/clipspace/ortho_rh_zo.c
src/clipspace/ortho_lh_no.c src/clipspace/ortho_lh_no.c
src/clipspace/ortho_lh_zo.c
src/clipspace/ortho_rh_no.c src/clipspace/ortho_rh_no.c
src/clipspace/view_lh_zo.c src/clipspace/ortho_rh_zo.c
src/clipspace/view_rh_zo.c src/clipspace/persp_lh_no.c
src/clipspace/persp_lh_zo.c
src/clipspace/persp_rh_no.c
src/clipspace/persp_rh_zo.c
src/clipspace/view_lh_no.c src/clipspace/view_lh_no.c
src/clipspace/view_lh_zo.c
src/clipspace/view_rh_no.c src/clipspace/view_rh_no.c
src/clipspace/view_rh_zo.c
src/clipspace/project_no.c
src/clipspace/project_zo.c
) )
if(CGLM_SHARED) if(CGLM_SHARED)
@@ -97,6 +110,12 @@ set_target_properties(${PROJECT_NAME} PROPERTIES
VERSION ${PROJECT_VERSION} VERSION ${PROJECT_VERSION}
SOVERSION ${PROJECT_VERSION_MAJOR}) SOVERSION ${PROJECT_VERSION_MAJOR})
if(WIN32)
# Because SOVERSION has no effect to file naming on Windows
set_target_properties(${PROJECT_NAME} PROPERTIES
RUNTIME_OUTPUT_NAME ${PROJECT_NAME}-${PROJECT_VERSION_MAJOR})
endif()
target_include_directories(${PROJECT_NAME} target_include_directories(${PROJECT_NAME}
PUBLIC PUBLIC
$<INSTALL_INTERFACE:include> $<INSTALL_INTERFACE:include>
@@ -122,7 +141,7 @@ install(TARGETS ${PROJECT_NAME}
EXPORT ${PROJECT_NAME} EXPORT ${PROJECT_NAME}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_LIBDIR}) RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
install(DIRECTORY include/${PROJECT_NAME} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} install(DIRECTORY include/${PROJECT_NAME} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
PATTERN ".*" EXCLUDE) PATTERN ".*" EXCLUDE)
@@ -138,12 +157,7 @@ install(EXPORT ${PROJECT_NAME}
NAMESPACE ${PROJECT_NAME}:: NAMESPACE ${PROJECT_NAME}::
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}) DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME})
set(PACKAGE_NAME ${PROJECT_NAME}) configure_file(cglm.pc.in cglm.pc @ONLY)
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 install(FILES ${CMAKE_BINARY_DIR}/cglm.pc
DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)

View File

@@ -46,16 +46,19 @@ cglm_HEADERS = include/cglm/version.h \
include/cglm/mat3.h \ include/cglm/mat3.h \
include/cglm/mat2.h \ include/cglm/mat2.h \
include/cglm/affine.h \ include/cglm/affine.h \
include/cglm/affine-mat.h \
include/cglm/vec2.h \ include/cglm/vec2.h \
include/cglm/vec2-ext.h \ include/cglm/vec2-ext.h \
include/cglm/ivec2.h \
include/cglm/vec3.h \ include/cglm/vec3.h \
include/cglm/vec3-ext.h \ include/cglm/vec3-ext.h \
include/cglm/ivec3.h \
include/cglm/vec4.h \ include/cglm/vec4.h \
include/cglm/vec4-ext.h \ include/cglm/vec4-ext.h \
include/cglm/ivec4.h \
include/cglm/euler.h \ include/cglm/euler.h \
include/cglm/util.h \ include/cglm/util.h \
include/cglm/quat.h \ include/cglm/quat.h \
include/cglm/affine-mat.h \
include/cglm/plane.h \ include/cglm/plane.h \
include/cglm/frustum.h \ include/cglm/frustum.h \
include/cglm/box.h \ include/cglm/box.h \
@@ -71,22 +74,22 @@ cglm_HEADERS = include/cglm/version.h \
cglm_clipspacedir=$(includedir)/cglm/clipspace cglm_clipspacedir=$(includedir)/cglm/clipspace
cglm_clipspace_HEADERS = include/cglm/clipspace/persp.h \ cglm_clipspace_HEADERS = include/cglm/clipspace/persp.h \
include/cglm/clipspace/persp_lh_zo.h \
include/cglm/clipspace/persp_rh_zo.h \
include/cglm/clipspace/persp_lh_no.h \ include/cglm/clipspace/persp_lh_no.h \
include/cglm/clipspace/persp_lh_zo.h \
include/cglm/clipspace/persp_rh_no.h \ include/cglm/clipspace/persp_rh_no.h \
include/cglm/clipspace/ortho_lh_zo.h \ include/cglm/clipspace/persp_rh_zo.h \
include/cglm/clipspace/ortho_rh_zo.h \
include/cglm/clipspace/ortho_lh_no.h \ include/cglm/clipspace/ortho_lh_no.h \
include/cglm/clipspace/ortho_lh_zo.h \
include/cglm/clipspace/ortho_rh_no.h \ include/cglm/clipspace/ortho_rh_no.h \
include/cglm/clipspace/ortho_rh_zo.h \
include/cglm/clipspace/view_lh.h \ include/cglm/clipspace/view_lh.h \
include/cglm/clipspace/view_rh.h \ include/cglm/clipspace/view_rh.h \
include/cglm/clipspace/view_lh_zo.h \
include/cglm/clipspace/view_rh_zo.h \
include/cglm/clipspace/view_lh_no.h \ include/cglm/clipspace/view_lh_no.h \
include/cglm/clipspace/view_lh_zo.h \
include/cglm/clipspace/view_rh_no.h \ include/cglm/clipspace/view_rh_no.h \
include/cglm/clipspace/project_zo.h \ include/cglm/clipspace/view_rh_zo.h \
include/cglm/clipspace/project_no.h include/cglm/clipspace/project_no.h \
include/cglm/clipspace/project_zo.h
cglm_calldir=$(includedir)/cglm/call cglm_calldir=$(includedir)/cglm/call
cglm_call_HEADERS = include/cglm/call/mat4.h \ cglm_call_HEADERS = include/cglm/call/mat4.h \
@@ -95,7 +98,9 @@ cglm_call_HEADERS = include/cglm/call/mat4.h \
include/cglm/call/vec2.h \ include/cglm/call/vec2.h \
include/cglm/call/vec3.h \ include/cglm/call/vec3.h \
include/cglm/call/vec4.h \ include/cglm/call/vec4.h \
include/cglm/call/affine.h \ include/cglm/call/ivec2.h \
include/cglm/call/ivec3.h \
include/cglm/call/ivec4.h \
include/cglm/call/io.h \ include/cglm/call/io.h \
include/cglm/call/cam.h \ include/cglm/call/cam.h \
include/cglm/call/quat.h \ include/cglm/call/quat.h \
@@ -109,21 +114,22 @@ cglm_call_HEADERS = include/cglm/call/mat4.h \
include/cglm/call/curve.h \ include/cglm/call/curve.h \
include/cglm/call/bezier.h \ include/cglm/call/bezier.h \
include/cglm/call/ray.h \ include/cglm/call/ray.h \
include/cglm/call/affine.h \
include/cglm/call/affine2d.h include/cglm/call/affine2d.h
cglm_call_clipspacedir=$(includedir)/cglm/call/clipspace cglm_call_clipspacedir=$(includedir)/cglm/call/clipspace
cglm_call_clipspace_HEADERS = include/cglm/call/clipspace/persp_lh_zo.h \ cglm_call_clipspace_HEADERS = include/cglm/call/clipspace/persp_lh_no.h \
include/cglm/call/clipspace/persp_rh_zo.h \ include/cglm/call/clipspace/persp_lh_zo.h \
include/cglm/call/clipspace/persp_lh_no.h \
include/cglm/call/clipspace/persp_rh_no.h \ include/cglm/call/clipspace/persp_rh_no.h \
include/cglm/call/clipspace/ortho_lh_zo.h \ include/cglm/call/clipspace/persp_rh_zo.h \
include/cglm/call/clipspace/ortho_rh_zo.h \
include/cglm/call/clipspace/ortho_lh_no.h \ include/cglm/call/clipspace/ortho_lh_no.h \
include/cglm/call/clipspace/ortho_lh_zo.h \
include/cglm/call/clipspace/ortho_rh_no.h \ include/cglm/call/clipspace/ortho_rh_no.h \
include/cglm/call/clipspace/view_lh_zo.h \ include/cglm/call/clipspace/ortho_rh_zo.h \
include/cglm/call/clipspace/view_rh_zo.h \
include/cglm/call/clipspace/view_lh_no.h \ include/cglm/call/clipspace/view_lh_no.h \
include/cglm/call/clipspace/view_lh_zo.h \
include/cglm/call/clipspace/view_rh_no.h \ include/cglm/call/clipspace/view_rh_no.h \
include/cglm/call/clipspace/view_rh_zo.h \
include/cglm/call/clipspace/project_no.h \ include/cglm/call/clipspace/project_no.h \
include/cglm/call/clipspace/project_zo.h include/cglm/call/clipspace/project_zo.h
@@ -144,22 +150,25 @@ cglm_simd_avx_HEADERS = include/cglm/simd/avx/mat4.h \
include/cglm/simd/avx/affine.h include/cglm/simd/avx/affine.h
cglm_simd_neondir=$(includedir)/cglm/simd/neon cglm_simd_neondir=$(includedir)/cglm/simd/neon
cglm_simd_neon_HEADERS = include/cglm/simd/neon/mat4.h \ cglm_simd_neon_HEADERS = include/cglm/simd/neon/affine.h \
include/cglm/simd/neon/mat2.h \ include/cglm/simd/neon/mat2.h \
include/cglm/simd/neon/affine.h \ include/cglm/simd/neon/mat4.h \
include/cglm/simd/neon/quat.h include/cglm/simd/neon/quat.h
cglm_structdir=$(includedir)/cglm/struct cglm_structdir=$(includedir)/cglm/struct
cglm_struct_HEADERS = include/cglm/struct/mat4.h \ cglm_struct_HEADERS = include/cglm/struct/mat4.h \
include/cglm/struct/mat3.h \ include/cglm/struct/mat3.h \
include/cglm/struct/mat2.h \ include/cglm/struct/mat2.h \
include/cglm/struct/affine-pre.h \
include/cglm/struct/affine-post.h \
include/cglm/struct/affine.h \
include/cglm/struct/affine2d.h \
include/cglm/struct/vec2.h \ include/cglm/struct/vec2.h \
include/cglm/struct/vec2-ext.h \ include/cglm/struct/vec2-ext.h \
include/cglm/struct/vec3.h \ include/cglm/struct/vec3.h \
include/cglm/struct/vec3-ext.h \ include/cglm/struct/vec3-ext.h \
include/cglm/struct/vec4.h \ include/cglm/struct/vec4.h \
include/cglm/struct/vec4-ext.h \ include/cglm/struct/vec4-ext.h \
include/cglm/struct/affine.h \
include/cglm/struct/io.h \ include/cglm/struct/io.h \
include/cglm/struct/cam.h \ include/cglm/struct/cam.h \
include/cglm/struct/quat.h \ include/cglm/struct/quat.h \
@@ -170,22 +179,23 @@ cglm_struct_HEADERS = include/cglm/struct/mat4.h \
include/cglm/struct/project.h \ include/cglm/struct/project.h \
include/cglm/struct/sphere.h \ include/cglm/struct/sphere.h \
include/cglm/struct/color.h \ include/cglm/struct/color.h \
include/cglm/struct/curve.h \ include/cglm/struct/curve.h
include/cglm/struct/affine2d.h
cglm_struct_clipspacedir=$(includedir)/cglm/struct/clipspace cglm_struct_clipspacedir=$(includedir)/cglm/struct/clipspace
cglm_struct_clipspace_HEADERS = include/cglm/struct/clipspace/persp_lh_zo.h \ cglm_struct_clipspace_HEADERS = include/cglm/struct/clipspace/persp_lh_no.h \
include/cglm/struct/clipspace/persp_rh_zo.h \ include/cglm/struct/clipspace/persp_lh_zo.h \
include/cglm/struct/clipspace/persp_lh_no.h \
include/cglm/struct/clipspace/persp_rh_no.h \ include/cglm/struct/clipspace/persp_rh_no.h \
include/cglm/struct/clipspace/ortho_lh_zo.h \ include/cglm/struct/clipspace/persp_rh_zo.h \
include/cglm/struct/clipspace/ortho_rh_zo.h \
include/cglm/struct/clipspace/ortho_lh_no.h \ include/cglm/struct/clipspace/ortho_lh_no.h \
include/cglm/struct/clipspace/ortho_lh_zo.h \
include/cglm/struct/clipspace/ortho_rh_no.h \ include/cglm/struct/clipspace/ortho_rh_no.h \
include/cglm/struct/clipspace/view_lh_zo.h \ include/cglm/struct/clipspace/ortho_rh_zo.h \
include/cglm/struct/clipspace/view_rh_zo.h \
include/cglm/struct/clipspace/view_lh_no.h \ include/cglm/struct/clipspace/view_lh_no.h \
include/cglm/struct/clipspace/view_rh_no.h include/cglm/struct/clipspace/view_lh_zo.h \
include/cglm/struct/clipspace/view_rh_no.h \
include/cglm/struct/clipspace/view_rh_zo.h \
include/cglm/struct/clipspace/project_no.h \
include/cglm/struct/clipspace/project_zo.h
libcglm_la_SOURCES=\ libcglm_la_SOURCES=\
src/euler.c \ src/euler.c \
@@ -194,8 +204,11 @@ libcglm_la_SOURCES=\
src/quat.c \ src/quat.c \
src/cam.c \ src/cam.c \
src/vec2.c \ src/vec2.c \
src/ivec2.c \
src/vec3.c \ src/vec3.c \
src/ivec3.c \
src/vec4.c \ src/vec4.c \
src/ivec4.c \
src/mat2.c \ src/mat2.c \
src/mat3.c \ src/mat3.c \
src/mat4.c \ src/mat4.c \

View File

@@ -431,7 +431,7 @@ You can pass matrices the same way to other APIs e.g. Vulkan, DX...
## Notes ## Notes
- This library uses float types only, does not support Integers, Double... yet - This library does not support double type... yet
- If headers are not working properly with your compiler, IDE please open an issue, because I'm using GCC and clang to test it maybe sometimes MSVC - If headers are not working properly with your compiler, IDE please open an issue, because I'm using GCC and clang to test it maybe sometimes MSVC
**TODO:** **TODO:**

View File

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

View File

@@ -2,7 +2,7 @@ Pod::Spec.new do |s|
# Description # Description
s.name = "cglm" s.name = "cglm"
s.version = "0.8.2" s.version = "0.8.4"
s.summary = "📽 Highly Optimized Graphics Math (glm) for C" s.summary = "📽 Highly Optimized Graphics Math (glm) for C"
s.description = <<-DESC s.description = <<-DESC
cglm is math library for graphics programming for C. 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.

View File

@@ -7,7 +7,7 @@
#***************************************************************************** #*****************************************************************************
AC_PREREQ([2.69]) AC_PREREQ([2.69])
AC_INIT([cglm], [0.8.3], [info@recp.me]) AC_INIT([cglm], [0.8.6], [info@recp.me])
AM_INIT_AUTOMAKE([-Wall -Werror foreign subdir-objects serial-tests]) 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. # Don't use the default cflags (-O2 -g), we set ours manually in Makefile.am.

View File

@@ -0,0 +1,129 @@
.. default-domain:: C
3D Affine Transforms (common)
================================================================================
Common transfrom functions.
Table of contents (click to go):
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Functions:
1. :c:func:`glm_translate_make`
#. :c:func:`glm_scale_to`
#. :c:func:`glm_scale_make`
#. :c:func:`glm_scale`
#. :c:func:`glm_scale_uni`
#. :c:func:`glm_rotate_make`
#. :c:func:`glm_rotate_atm`
#. :c:func:`glm_decompose_scalev`
#. :c:func:`glm_uniscaled`
#. :c:func:`glm_decompose_rs`
#. :c:func:`glm_decompose`
Functions documentation
~~~~~~~~~~~~~~~~~~~~~~~
.. c:function:: void glm_translate_make(mat4 m, vec3 v)
creates NEW translate transform matrix by *v* vector.
Parameters:
| *[in, out]* **m** affine transfrom
| *[in]* **v** translate vector [x, y, z]
.. c:function:: void glm_scale_to(mat4 m, vec3 v, mat4 dest)
scale existing transform matrix by *v* vector and store result in dest
Parameters:
| *[in]* **m** affine transfrom
| *[in]* **v** scale vector [x, y, z]
| *[out]* **dest** scaled matrix
.. c:function:: void glm_scale_make(mat4 m, vec3 v)
creates NEW scale matrix by v vector
Parameters:
| *[out]* **m** affine transfrom
| *[in]* **v** scale vector [x, y, z]
.. c:function:: void glm_scale(mat4 m, vec3 v)
scales existing transform matrix by v vector
and stores result in same matrix
Parameters:
| *[in, out]* **m** affine transfrom
| *[in]* **v** scale vector [x, y, z]
.. c:function:: void glm_scale_uni(mat4 m, float s)
applies uniform scale to existing transform matrix v = [s, s, s]
and stores result in same matrix
Parameters:
| *[in, out]* **m** affine transfrom
| *[in]* **v** scale factor
.. c:function:: void glm_rotate_make(mat4 m, float angle, vec3 axis)
creates NEW rotation matrix by angle and axis,
axis will be normalized so you don't need to normalize it
Parameters:
| *[out]* **m** affine transfrom
| *[in]* **axis** angle (radians)
| *[in]* **axis** axis
.. c:function:: void glm_rotate_atm(mat4 m, vec3 pivot, float angle, vec3 axis)
| creates NEW rotation matrix by angle and axis at given point
| this creates rotation matrix, it assumes you don't have a matrix
| this should work faster than glm_rotate_at because it reduces one glm_translate.
Parameters:
| *[in, out]* **m** affine transfrom
| *[in]* **pivot** pivot, anchor point, rotation center
| *[in]* **angle** angle (radians)
| *[in]* **axis** axis
.. c:function:: void glm_decompose_scalev(mat4 m, vec3 s)
decompose scale vector
Parameters:
| *[in]* **m** affine transform
| *[out]* **s** scale vector (Sx, Sy, Sz)
.. c:function:: bool glm_uniscaled(mat4 m)
returns true if matrix is uniform scaled.
This is helpful for creating normal matrix.
Parameters:
| *[in]* **m** matrix
.. c:function:: void glm_decompose_rs(mat4 m, mat4 r, vec3 s)
decompose rotation matrix (mat4) and scale vector [Sx, Sy, Sz]
DON'T pass projected matrix here
Parameters:
| *[in]* **m** affine transform
| *[out]* **r** rotation matrix
| *[out]* **s** scale matrix
.. c:function:: void glm_decompose(mat4 m, vec4 t, mat4 r, vec3 s)
decompose affine transform, TODO: extract shear factors.
DON'T pass projected matrix here
Parameters:
| *[in]* **m** affine transfrom
| *[out]* **t** translation vector
| *[out]* **r** rotation matrix (mat4)
| *[out]* **s** scaling vector [X, Y, Z]

129
docs/source/affine-post.rst Normal file
View File

@@ -0,0 +1,129 @@
.. default-domain:: C
3D Affine Transforms (post)
================================================================================
Post transfrom functions are similar to pre transform functions except order of application is reversed.
Post transform functions are applied after the object is transformed with given (model matrix) transfrom.
Ther are named af
Table of contents (click to go):
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Functions:
1. :c:func:`glm_translated_to`
#. :c:func:`glm_translated`
#. :c:func:`glm_translated_x`
#. :c:func:`glm_translated_y`
#. :c:func:`glm_translated_z`
#. :c:func:`glm_rotated_x`
#. :c:func:`glm_rotated_y`
#. :c:func:`glm_rotated_z`
#. :c:func:`glm_rotated`
#. :c:func:`glm_rotated_at`
#. :c:func:`glm_spinned`
Functions documentation
~~~~~~~~~~~~~~~~~~~~~~~
.. c:function:: void glm_translated_to(mat4 m, vec3 v, mat4 dest)
translate existing transform matrix by *v* vector and store result in dest
Parameters:
| *[in]* **m** affine transfrom
| *[in]* **v** translate vector [x, y, z]
| *[out]* **dest** translated matrix
.. c:function:: void glm_translated(mat4 m, vec3 v)
translate existing transform matrix by *v* vector
and stores result in same matrix
Parameters:
| *[in, out]* **m** affine transfrom
| *[in]* **v** translate vector [x, y, z]
.. c:function:: void glm_translated_x(mat4 m, float x)
translate existing transform matrix by x factor
Parameters:
| *[in, out]* **m** affine transfrom
| *[in]* **v** x factor
.. c:function:: void glm_translated_y(mat4 m, float y)
translate existing transform matrix by *y* factor
Parameters:
| *[in, out]* **m** affine transfrom
| *[in]* **v** y factor
.. c:function:: void glm_translated_z(mat4 m, float z)
translate existing transform matrix by *z* factor
Parameters:
| *[in, out]* **m** affine transfrom
| *[in]* **v** z factor
.. c:function:: void glm_rotated_x(mat4 m, float angle, mat4 dest)
rotate existing transform matrix around X axis by angle
and store result in dest
Parameters:
| *[in]* **m** affine transfrom
| *[in]* **angle** angle (radians)
| *[out]* **dest** rotated matrix
.. c:function:: void glm_rotated_y(mat4 m, float angle, mat4 dest)
rotate existing transform matrix around Y axis by angle
and store result in dest
Parameters:
| *[in]* **m** affine transfrom
| *[in]* **angle** angle (radians)
| *[out]* **dest** rotated matrix
.. c:function:: void glm_rotated_z(mat4 m, float angle, mat4 dest)
rotate existing transform matrix around Z axis by angle
and store result in dest
Parameters:
| *[in]* **m** affine transfrom
| *[in]* **angle** angle (radians)
| *[out]* **dest** rotated matrix
.. c:function:: void glm_rotated(mat4 m, float angle, vec3 axis)
rotate existing transform matrix around Z axis by angle and axis
Parameters:
| *[in, out]* **m** affine transfrom
| *[in]* **angle** angle (radians)
| *[in]* **axis** axis
.. c:function:: void glm_rotated_at(mat4 m, vec3 pivot, float angle, vec3 axis)
rotate existing transform around given axis by angle at given pivot point (rotation center)
Parameters:
| *[in, out]* **m** affine transfrom
| *[in]* **pivot** pivot, anchor point, rotation center
| *[in]* **angle** angle (radians)
| *[in]* **axis** axis
.. c:function:: void glm_spinned(mat4 m, float angle, vec3 axis)
| rotate existing transform matrix around given axis by angle around self (doesn't affected by position)
Parameters:
| *[in, out]* **m** affine transfrom
| *[in]* **angle** angle (radians)
| *[in]* **axis** axis

240
docs/source/affine-pre.rst Normal file
View File

@@ -0,0 +1,240 @@
.. default-domain:: C
3D Affine Transforms (pre)
================================================================================
Pre transfrom functions which are regular transfrom functions.
Table of contents (click to go):
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Functions:
1. :c:func:`glm_translate_to`
#. :c:func:`glm_translate`
#. :c:func:`glm_translate_x`
#. :c:func:`glm_translate_y`
#. :c:func:`glm_translate_z`
#. :c:func:`glm_translate_make`
#. :c:func:`glm_scale_to`
#. :c:func:`glm_scale_make`
#. :c:func:`glm_scale`
#. :c:func:`glm_scale_uni`
#. :c:func:`glm_rotate_x`
#. :c:func:`glm_rotate_y`
#. :c:func:`glm_rotate_z`
#. :c:func:`glm_rotate_make`
#. :c:func:`glm_rotate`
#. :c:func:`glm_rotate_at`
#. :c:func:`glm_rotate_atm`
#. :c:func:`glm_decompose_scalev`
#. :c:func:`glm_uniscaled`
#. :c:func:`glm_decompose_rs`
#. :c:func:`glm_decompose`
#. :c:func:`glm_spin`
Functions documentation
~~~~~~~~~~~~~~~~~~~~~~~
.. c:function:: void glm_translate_to(mat4 m, vec3 v, mat4 dest)
translate existing transform matrix by *v* vector and store result in dest
Parameters:
| *[in]* **m** affine transfrom
| *[in]* **v** translate vector [x, y, z]
| *[out]* **dest** translated matrix
.. c:function:: void glm_translate(mat4 m, vec3 v)
translate existing transform matrix by *v* vector
and stores result in same matrix
Parameters:
| *[in, out]* **m** affine transfrom
| *[in]* **v** translate vector [x, y, z]
.. c:function:: void glm_translate_x(mat4 m, float x)
translate existing transform matrix by x factor
Parameters:
| *[in, out]* **m** affine transfrom
| *[in]* **v** x factor
.. c:function:: void glm_translate_y(mat4 m, float y)
translate existing transform matrix by *y* factor
Parameters:
| *[in, out]* **m** affine transfrom
| *[in]* **v** y factor
.. c:function:: void glm_translate_z(mat4 m, float z)
translate existing transform matrix by *z* factor
Parameters:
| *[in, out]* **m** affine transfrom
| *[in]* **v** z factor
.. c:function:: void glm_translate_make(mat4 m, vec3 v)
creates NEW translate transform matrix by *v* vector.
Parameters:
| *[in, out]* **m** affine transfrom
| *[in]* **v** translate vector [x, y, z]
.. c:function:: void glm_scale_to(mat4 m, vec3 v, mat4 dest)
scale existing transform matrix by *v* vector and store result in dest
Parameters:
| *[in]* **m** affine transfrom
| *[in]* **v** scale vector [x, y, z]
| *[out]* **dest** scaled matrix
.. c:function:: void glm_scale_make(mat4 m, vec3 v)
creates NEW scale matrix by v vector
Parameters:
| *[out]* **m** affine transfrom
| *[in]* **v** scale vector [x, y, z]
.. c:function:: void glm_scale(mat4 m, vec3 v)
scales existing transform matrix by v vector
and stores result in same matrix
Parameters:
| *[in, out]* **m** affine transfrom
| *[in]* **v** scale vector [x, y, z]
.. c:function:: void glm_scale_uni(mat4 m, float s)
applies uniform scale to existing transform matrix v = [s, s, s]
and stores result in same matrix
Parameters:
| *[in, out]* **m** affine transfrom
| *[in]* **v** scale factor
.. c:function:: void glm_rotate_x(mat4 m, float angle, mat4 dest)
rotate existing transform matrix around X axis by angle
and store result in dest
Parameters:
| *[in]* **m** affine transfrom
| *[in]* **angle** angle (radians)
| *[out]* **dest** rotated matrix
.. c:function:: void glm_rotate_y(mat4 m, float angle, mat4 dest)
rotate existing transform matrix around Y axis by angle
and store result in dest
Parameters:
| *[in]* **m** affine transfrom
| *[in]* **angle** angle (radians)
| *[out]* **dest** rotated matrix
.. c:function:: void glm_rotate_z(mat4 m, float angle, mat4 dest)
rotate existing transform matrix around Z axis by angle
and store result in dest
Parameters:
| *[in]* **m** affine transfrom
| *[in]* **angle** angle (radians)
| *[out]* **dest** rotated matrix
.. c:function:: void glm_rotate_make(mat4 m, float angle, vec3 axis)
creates NEW rotation matrix by angle and axis,
axis will be normalized so you don't need to normalize it
Parameters:
| *[out]* **m** affine transfrom
| *[in]* **axis** angle (radians)
| *[in]* **axis** axis
.. c:function:: void glm_rotate(mat4 m, float angle, vec3 axis)
rotate existing transform matrix around Z axis by angle and axis
Parameters:
| *[in, out]* **m** affine transfrom
| *[in]* **angle** angle (radians)
| *[in]* **axis** axis
.. c:function:: void glm_rotate_at(mat4 m, vec3 pivot, float angle, vec3 axis)
rotate existing transform around given axis by angle at given pivot point (rotation center)
Parameters:
| *[in, out]* **m** affine transfrom
| *[in]* **pivot** pivot, anchor point, rotation center
| *[in]* **angle** angle (radians)
| *[in]* **axis** axis
.. c:function:: void glm_rotate_atm(mat4 m, vec3 pivot, float angle, vec3 axis)
| creates NEW rotation matrix by angle and axis at given point
| this creates rotation matrix, it assumes you don't have a matrix
| this should work faster than glm_rotate_at because it reduces one glm_translate.
Parameters:
| *[in, out]* **m** affine transfrom
| *[in]* **pivot** pivot, anchor point, rotation center
| *[in]* **angle** angle (radians)
| *[in]* **axis** axis
.. c:function:: void glm_decompose_scalev(mat4 m, vec3 s)
decompose scale vector
Parameters:
| *[in]* **m** affine transform
| *[out]* **s** scale vector (Sx, Sy, Sz)
.. c:function:: bool glm_uniscaled(mat4 m)
returns true if matrix is uniform scaled.
This is helpful for creating normal matrix.
Parameters:
| *[in]* **m** matrix
.. c:function:: void glm_decompose_rs(mat4 m, mat4 r, vec3 s)
decompose rotation matrix (mat4) and scale vector [Sx, Sy, Sz]
DON'T pass projected matrix here
Parameters:
| *[in]* **m** affine transform
| *[out]* **r** rotation matrix
| *[out]* **s** scale matrix
.. c:function:: void glm_decompose(mat4 m, vec4 t, mat4 r, vec3 s)
decompose affine transform, TODO: extract shear factors.
DON'T pass projected matrix here
Parameters:
| *[in]* **m** affine transfrom
| *[out]* **t** translation vector
| *[out]* **r** rotation matrix (mat4)
| *[out]* **s** scaling vector [X, Y, Z]
.. c:function:: void glm_spin(mat4 m, float angle, vec3 axis)
| rotate existing transform matrix around given axis by angle around self (doesn't affected by position)
Parameters:
| *[in, out]* **m** affine transfrom
| *[in]* **angle** angle (radians)
| *[in]* **axis** axis

View File

@@ -5,6 +5,18 @@
Header: cglm/affine.h Header: cglm/affine.h
Before starting, **cglm** provides two kind of transform functions; pre and post.
Pre functions (`T' = Tnew * T`) are like `glm_translate`, `glm_rotate` which means it will translate the vector first and then apply the model transformation.
Post functions (`T' = T * Tnew`) are like `glm_translated`, `glm_rotated` which means it will apply the model transformation first and then translate the vector.
`glm_translate`, `glm_rotate` are pre functions and are similar to C++ **glm** which you are familiar with.
In new versions of **cglm** we added `glm_translated`, `glm_rotated`... which are post functions,
they are useful in some cases, e.g. append transform to existing transform (apply/append transform as last transfrom T' = T * Tnew).
Post functions are named after pre functions with `ed` suffix, e.g. `glm_translate` -> `glm_translated`. So don't mix them up.
Initialize Transform Matrices Initialize Transform Matrices
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Functions with **_make** prefix expect you don't have a matrix and they create Functions with **_make** prefix expect you don't have a matrix and they create
@@ -25,6 +37,9 @@ since scale factors are stored in rotation matrix, same may also true for scalli
cglm provides some functions for rotating around at given point e.g. cglm provides some functions for rotating around at given point e.g.
**glm_rotate_at**, **glm_quat_rotate_at**. Use them or follow next section for algorihm ("Rotate or Scale around specific Point (Pivot Point / Anchor Point)"). **glm_rotate_at**, **glm_quat_rotate_at**. Use them or follow next section for algorihm ("Rotate or Scale around specific Point (Pivot Point / Anchor Point)").
Also **cglm** provides :c:func:`glm_spin` and :c:func:`glm_spinned` functions to rotate around itself. No need to give pivot.
These functions are useful for rotating around center of object.
Rotate or Scale around specific Point (Anchor Point) Rotate or Scale around specific Point (Anchor Point)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -35,6 +50,7 @@ If you want to rotate model around arbibtrary point follow these steps:
3. Move model back from origin to pivot (reverse of step-1): **translate(pivot.x, pivot.y, pivot.z)** 3. Move model back from origin to pivot (reverse of step-1): **translate(pivot.x, pivot.y, pivot.z)**
**glm_rotate_at**, **glm_quat_rotate_at** and their helper functions works that way. **glm_rotate_at**, **glm_quat_rotate_at** and their helper functions works that way.
So if you use them you don't need to do these steps manually which are done by **cglm**.
The implementation would be: The implementation would be:
@@ -45,6 +61,13 @@ The implementation would be:
glm_rotate(m, angle, axis); glm_rotate(m, angle, axis);
glm_translate(m, pivotInv); /* pivotInv = -pivot */ glm_translate(m, pivotInv); /* pivotInv = -pivot */
or just:
.. code-block:: c
:linenos:
glm_rotate_at(m, pivot, angle, axis);
.. _TransformsOrder: .. _TransformsOrder:
Transforms Order Transforms Order
@@ -54,7 +77,7 @@ It is important to understand this part especially if you call transform
functions multiple times functions multiple times
`glm_translate`, `glm_rotate`, `glm_scale` and `glm_quat_rotate` and their `glm_translate`, `glm_rotate`, `glm_scale` and `glm_quat_rotate` and their
helpers functions works like this (cglm may provide reverse order too as alternative in the future): helpers functions works like this (cglm provides reverse order as `ed` suffix e.g `glm_translated`, `glm_rotated` see post transforms):
.. code-block:: c .. code-block:: c
:linenos: :linenos:
@@ -147,199 +170,27 @@ Functions:
#. :c:func:`glm_decompose_rs` #. :c:func:`glm_decompose_rs`
#. :c:func:`glm_decompose` #. :c:func:`glm_decompose`
Post functions (**NEW**):
1. :c:func:`glm_translated_to`
#. :c:func:`glm_translated`
#. :c:func:`glm_translated_x`
#. :c:func:`glm_translated_y`
#. :c:func:`glm_translated_z`
#. :c:func:`glm_rotated_x`
#. :c:func:`glm_rotated_y`
#. :c:func:`glm_rotated_z`
#. :c:func:`glm_rotated`
#. :c:func:`glm_rotated_at`
#. :c:func:`glm_spinned`
Functions documentation Functions documentation
~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~
.. c:function:: void glm_translate_to(mat4 m, vec3 v, mat4 dest) .. toctree::
:maxdepth: 1
:caption: Affine categories:
translate existing transform matrix by *v* vector and store result in dest affine-common
affine-pre
Parameters: affine-post
| *[in]* **m** affine transfrom
| *[in]* **v** translate vector [x, y, z]
| *[out]* **dest** translated matrix
.. c:function:: void glm_translate(mat4 m, vec3 v)
translate existing transform matrix by *v* vector
and stores result in same matrix
Parameters:
| *[in, out]* **m** affine transfrom
| *[in]* **v** translate vector [x, y, z]
.. c:function:: void glm_translate_x(mat4 m, float x)
translate existing transform matrix by x factor
Parameters:
| *[in, out]* **m** affine transfrom
| *[in]* **v** x factor
.. c:function:: void glm_translate_y(mat4 m, float y)
translate existing transform matrix by *y* factor
Parameters:
| *[in, out]* **m** affine transfrom
| *[in]* **v** y factor
.. c:function:: void glm_translate_z(mat4 m, float z)
translate existing transform matrix by *z* factor
Parameters:
| *[in, out]* **m** affine transfrom
| *[in]* **v** z factor
.. c:function:: void glm_translate_make(mat4 m, vec3 v)
creates NEW translate transform matrix by *v* vector.
Parameters:
| *[in, out]* **m** affine transfrom
| *[in]* **v** translate vector [x, y, z]
.. c:function:: void glm_scale_to(mat4 m, vec3 v, mat4 dest)
scale existing transform matrix by *v* vector and store result in dest
Parameters:
| *[in]* **m** affine transfrom
| *[in]* **v** scale vector [x, y, z]
| *[out]* **dest** scaled matrix
.. c:function:: void glm_scale_make(mat4 m, vec3 v)
creates NEW scale matrix by v vector
Parameters:
| *[out]* **m** affine transfrom
| *[in]* **v** scale vector [x, y, z]
.. c:function:: void glm_scale(mat4 m, vec3 v)
scales existing transform matrix by v vector
and stores result in same matrix
Parameters:
| *[in, out]* **m** affine transfrom
| *[in]* **v** scale vector [x, y, z]
.. c:function:: void glm_scale_uni(mat4 m, float s)
applies uniform scale to existing transform matrix v = [s, s, s]
and stores result in same matrix
Parameters:
| *[in, out]* **m** affine transfrom
| *[in]* **v** scale factor
.. c:function:: void glm_rotate_x(mat4 m, float angle, mat4 dest)
rotate existing transform matrix around X axis by angle
and store result in dest
Parameters:
| *[in]* **m** affine transfrom
| *[in]* **angle** angle (radians)
| *[out]* **dest** rotated matrix
.. c:function:: void glm_rotate_y(mat4 m, float angle, mat4 dest)
rotate existing transform matrix around Y axis by angle
and store result in dest
Parameters:
| *[in]* **m** affine transfrom
| *[in]* **angle** angle (radians)
| *[out]* **dest** rotated matrix
.. c:function:: void glm_rotate_z(mat4 m, float angle, mat4 dest)
rotate existing transform matrix around Z axis by angle
and store result in dest
Parameters:
| *[in]* **m** affine transfrom
| *[in]* **angle** angle (radians)
| *[out]* **dest** rotated matrix
.. c:function:: void glm_rotate_make(mat4 m, float angle, vec3 axis)
creates NEW rotation matrix by angle and axis,
axis will be normalized so you don't need to normalize it
Parameters:
| *[out]* **m** affine transfrom
| *[in]* **axis** angle (radians)
| *[in]* **axis** axis
.. c:function:: void glm_rotate(mat4 m, float angle, vec3 axis)
rotate existing transform matrix around Z axis by angle and axis
Parameters:
| *[in, out]* **m** affine transfrom
| *[in]* **angle** angle (radians)
| *[in]* **axis** axis
.. c:function:: void glm_rotate_at(mat4 m, vec3 pivot, float angle, vec3 axis)
rotate existing transform around given axis by angle at given pivot point (rotation center)
Parameters:
| *[in, out]* **m** affine transfrom
| *[in]* **pivot** pivot, anchor point, rotation center
| *[in]* **angle** angle (radians)
| *[in]* **axis** axis
.. c:function:: void glm_rotate_atm(mat4 m, vec3 pivot, float angle, vec3 axis)
| creates NEW rotation matrix by angle and axis at given point
| this creates rotation matrix, it assumes you don't have a matrix
| this should work faster than glm_rotate_at because it reduces one glm_translate.
Parameters:
| *[in, out]* **m** affine transfrom
| *[in]* **pivot** pivot, anchor point, rotation center
| *[in]* **angle** angle (radians)
| *[in]* **axis** axis
.. c:function:: void glm_decompose_scalev(mat4 m, vec3 s)
decompose scale vector
Parameters:
| *[in]* **m** affine transform
| *[out]* **s** scale vector (Sx, Sy, Sz)
.. c:function:: bool glm_uniscaled(mat4 m)
returns true if matrix is uniform scaled.
This is helpful for creating normal matrix.
Parameters:
| *[in]* **m** matrix
.. c:function:: void glm_decompose_rs(mat4 m, mat4 r, vec3 s)
decompose rotation matrix (mat4) and scale vector [Sx, Sy, Sz]
DON'T pass projected matrix here
Parameters:
| *[in]* **m** affine transform
| *[out]* **r** rotation matrix
| *[out]* **s** scale matrix
.. c:function:: void glm_decompose(mat4 m, vec4 t, mat4 r, vec3 s)
decompose affine transform, TODO: extract shear factors.
DON'T pass projected matrix here
Parameters:
| *[in]* **m** affine transfrom
| *[out]* **t** translation vector
| *[out]* **r** rotation matrix (mat4)
| *[out]* **s** scaling vector [X, Y, Z]

View File

@@ -34,15 +34,18 @@ Follow the :doc:`build` documentation for this
box box
quat quat
euler euler
mat4
mat3
mat2 mat2
mat3
mat4
vec2
vec2-ext
vec3 vec3
vec3-ext vec3-ext
vec4 vec4
vec4-ext vec4-ext
vec2 ivec2
vec2-ext ivec3
ivec4
color color
plane plane
project project

View File

@@ -62,9 +62,9 @@ author = u'Recep Aslantas'
# built documents. # built documents.
# #
# The short X.Y version. # The short X.Y version.
version = u'0.8.3' version = u'0.8.6'
# The full version, including alpha/beta/rc tags. # The full version, including alpha/beta/rc tags.
release = u'0.8.3' release = u'0.8.6'
# The language for content autogenerated by Sphinx. Refer to documentation # The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages. # for a list of supported languages.

View File

@@ -6,13 +6,12 @@
cglm Documentation cglm Documentation
================================ ================================
**cglm** is optimized 3D math library written in C99 (compatible with C89). **cglm** is an optimized 3D math library written in C99 (compatible with C89).
It is similar to original **glm** library except this is mainly for **C** It is similar to the original **glm** library, except **cglm** is mainly for
**C**.
This library stores matrices as column-major order but in the future row-major **cglm** stores matrices as column-major order but in the future row-major is
is considered to be supported as optional. considered to be supported as optional.
Also currently only **float** type is supported for most operations.
.. toctree:: .. toctree::
:maxdepth: 2 :maxdepth: 2
@@ -46,8 +45,8 @@ Also currently only **float** type is supported for most operations.
troubleshooting troubleshooting
Indices and tables Indices and Tables:
================== ===================
* :ref:`genindex` * :ref:`genindex`
* :ref:`modindex` * :ref:`modindex`

163
docs/source/ivec2.rst Normal file
View File

@@ -0,0 +1,163 @@
.. default-domain:: C
ivec2
=====
Header: cglm/ivec2.h
Table of contents (click to go):
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Functions:
1. :c:func:`glm_ivec2`
#. :c:func:`glm_ivec2_copy`
#. :c:func:`glm_ivec2_zero`
#. :c:func:`glm_ivec2_one`
#. :c:func:`glm_ivec2_add`
#. :c:func:`glm_ivec2_adds`
#. :c:func:`glm_ivec2_sub`
#. :c:func:`glm_ivec2_subs`
#. :c:func:`glm_ivec2_mul`
#. :c:func:`glm_ivec2_scale`
#. :c:func:`glm_ivec2_distance2`
#. :c:func:`glm_ivec2_distance`
#. :c:func:`glm_ivec2_maxv`
#. :c:func:`glm_ivec2_minv`
#. :c:func:`glm_ivec2_clamp`
Functions documentation
~~~~~~~~~~~~~~~~~~~~~~~
.. c:function:: void glm_ivec2(int * v, ivec2 dest)
init ivec2 using vec3 or vec4
Parameters:
| *[in]* **v** vector
| *[out]* **dest** destination
.. c:function:: void glm_ivec2_copy(ivec2 a, ivec2 dest)
copy all members of [a] to [dest]
Parameters:
| *[in]* **a** source vector
| *[out]* **dest** destination
.. c:function:: void glm_ivec2_zero(ivec2 v)
set all members of [v] to zero
Parameters:
| *[out]* **v** vector
.. c:function:: void glm_ivec2_one(ivec2 v)
set all members of [v] to one
Parameters:
| *[out]* **v** vector
.. c:function:: void glm_ivec2_add(ivec2 a, ivec2 b, ivec2 dest)
add vector [a] to vector [b] and store result in [dest]
Parameters:
| *[in]* **a** first vector
| *[in]* **b** second vector
| *[out]* **dest** destination
.. c:function:: void glm_ivec2_adds(ivec2 v, int s, ivec2 dest)
add scalar s to vector [v] and store result in [dest]
Parameters:
| *[in]* **v** vector
| *[in]* **s** scalar
| *[out]* **dest** destination
.. c:function:: void glm_ivec2_sub(ivec2 a, ivec2 b, ivec2 dest)
subtract vector [b] from vector [a] and store result in [dest]
Parameters:
| *[in]* **a** first vector
| *[in]* **b** second vector
| *[out]* **dest** destination
.. c:function:: void glm_ivec2_subs(ivec2 v, int s, ivec2 dest)
subtract scalar s from vector [v] and store result in [dest]
Parameters:
| *[in]* **v** vector
| *[in]* **s** scalar
| *[out]* **dest** destination
.. c:function:: void glm_ivec2_mul(ivec2 a, ivec2 b, ivec2 dest)
multiply vector [a] with vector [b] and store result in [dest]
Parameters:
| *[in]* **a** first vector
| *[in]* **b** second vector
| *[out]* **dest** destination
.. c:function:: void glm_ivec2_scale(ivec2 v, int s, ivec2 dest)
multiply vector [a] with scalar s and store result in [dest]
Parameters:
| *[in]* **v** vector
| *[in]* **s** scalar
| *[out]* **dest** destination
.. c:function:: int glm_ivec2_distance2(ivec2 a, ivec2 b)
squared distance between two vectors
Parameters:
| *[in]* **a** first vector
| *[in]* **b** second vector
Returns:
squared distance (distance * distance)
.. c:function:: float glm_ivec2_distance(ivec2 a, ivec2 b)
distance between two vectors
Parameters:
| *[in]* **a** first vector
| *[in]* **b** second vector
Returns:
distance
.. c:function:: void glm_ivec2_maxv(ivec2 a, ivec2 b, ivec2 dest)
set each member of dest to greater of vector a and b
Parameters:
| *[in]* **a** first vector
| *[in]* **b** second vector
| *[out]* **dest** destination
.. c:function:: void glm_ivec2_minv(ivec2 a, ivec2 b, ivec2 dest)
set each member of dest to lesser of vector a and b
Parameters:
| *[in]* **a** first vector
| *[in]* **b** second vector
| *[out]* **dest** destination
.. c:function:: void glm_ivec2_clamp(ivec2 v, int minVal, int maxVal)
clamp each member of [v] between minVal and maxVal (inclusive)
Parameters:
| *[in, out]* **v** vector
| *[in]* **minVal** minimum value
| *[in]* **maxVal** maximum value

163
docs/source/ivec3.rst Normal file
View File

@@ -0,0 +1,163 @@
.. default-domain:: C
ivec3
=====
Header: cglm/ivec3.h
Table of contents (click to go):
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Functions:
1. :c:func:`glm_ivec3`
#. :c:func:`glm_ivec3_copy`
#. :c:func:`glm_ivec3_zero`
#. :c:func:`glm_ivec3_one`
#. :c:func:`glm_ivec3_add`
#. :c:func:`glm_ivec3_adds`
#. :c:func:`glm_ivec3_sub`
#. :c:func:`glm_ivec3_subs`
#. :c:func:`glm_ivec3_mul`
#. :c:func:`glm_ivec3_scale`
#. :c:func:`glm_ivec3_distance2`
#. :c:func:`glm_ivec3_distance`
#. :c:func:`glm_ivec3_maxv`
#. :c:func:`glm_ivec3_minv`
#. :c:func:`glm_ivec3_clamp`
Functions documentation
~~~~~~~~~~~~~~~~~~~~~~~
.. c:function:: void glm_ivec3(ivec4 v4, ivec3 dest)
init ivec3 using ivec4
Parameters:
| *[in]* **v** vector
| *[out]* **dest** destination
.. c:function:: void glm_ivec3_copy(ivec3 a, ivec3 dest)
copy all members of [a] to [dest]
Parameters:
| *[in]* **a** source vector
| *[out]* **dest** destination
.. c:function:: void glm_ivec3_zero(ivec3 v)
set all members of [v] to zero
Parameters:
| *[out]* **v** vector
.. c:function:: void glm_ivec3_one(ivec3 v)
set all members of [v] to one
Parameters:
| *[out]* **v** vector
.. c:function:: void glm_ivec3_add(ivec3 a, ivec3 b, ivec3 dest)
add vector [a] to vector [b] and store result in [dest]
Parameters:
| *[in]* **a** first vector
| *[in]* **b** second vector
| *[out]* **dest** destination
.. c:function:: void glm_ivec3_adds(ivec3 v, int s, ivec3 dest)
add scalar s to vector [v] and store result in [dest]
Parameters:
| *[in]* **v** vector
| *[in]* **s** scalar
| *[out]* **dest** destination
.. c:function:: void glm_ivec3_sub(ivec3 a, ivec3 b, ivec3 dest)
subtract vector [b] from vector [a] and store result in [dest]
Parameters:
| *[in]* **a** first vector
| *[in]* **b** second vector
| *[out]* **dest** destination
.. c:function:: void glm_ivec3_subs(ivec3 v, int s, ivec3 dest)
subtract scalar s from vector [v] and store result in [dest]
Parameters:
| *[in]* **v** vector
| *[in]* **s** scalar
| *[out]* **dest** destination
.. c:function:: void glm_ivec3_mul(ivec3 a, ivec3 b, ivec3 dest)
multiply vector [a] with vector [b] and store result in [dest]
Parameters:
| *[in]* **a** first vector
| *[in]* **b** second vector
| *[out]* **dest** destination
.. c:function:: void glm_ivec3_scale(ivec3 v, int s, ivec3 dest)
multiply vector [a] with scalar s and store result in [dest]
Parameters:
| *[in]* **v** vector
| *[in]* **s** scalar
| *[out]* **dest** destination
.. c:function:: int glm_ivec3_distance2(ivec3 a, ivec3 b)
squared distance between two vectors
Parameters:
| *[in]* **a** first vector
| *[in]* **b** second vector
Returns:
squared distance (distance * distance)
.. c:function:: float glm_ivec3_distance(ivec3 a, ivec3 b)
distance between two vectors
Parameters:
| *[in]* **a** first vector
| *[in]* **b** second vector
Returns:
distance
.. c:function:: void glm_ivec3_maxv(ivec3 a, ivec3 b, ivec3 dest)
set each member of dest to greater of vector a and b
Parameters:
| *[in]* **a** first vector
| *[in]* **b** second vector
| *[out]* **dest** destination
.. c:function:: void glm_ivec3_minv(ivec3 a, ivec3 b, ivec3 dest)
set each member of dest to lesser of vector a and b
Parameters:
| *[in]* **a** first vector
| *[in]* **b** second vector
| *[out]* **dest** destination
.. c:function:: void glm_ivec3_clamp(ivec3 v, int minVal, int maxVal)
clamp each member of [v] between minVal and maxVal (inclusive)
Parameters:
| *[in, out]* **v** vector
| *[in]* **minVal** minimum value
| *[in]* **maxVal** maximum value

163
docs/source/ivec4.rst Normal file
View File

@@ -0,0 +1,163 @@
.. default-domain:: C
ivec4
=====
Header: cglm/ivec4.h
Table of contents (click to go):
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Functions:
1. :c:func:`glm_ivec4`
#. :c:func:`glm_ivec4_copy`
#. :c:func:`glm_ivec4_zero`
#. :c:func:`glm_ivec4_one`
#. :c:func:`glm_ivec4_add`
#. :c:func:`glm_ivec4_adds`
#. :c:func:`glm_ivec4_sub`
#. :c:func:`glm_ivec4_subs`
#. :c:func:`glm_ivec4_mul`
#. :c:func:`glm_ivec4_scale`
#. :c:func:`glm_ivec4_distance2`
#. :c:func:`glm_ivec4_distance`
#. :c:func:`glm_ivec4_maxv`
#. :c:func:`glm_ivec4_minv`
#. :c:func:`glm_ivec4_clamp`
Functions documentation
~~~~~~~~~~~~~~~~~~~~~~~
.. c:function:: void glm_ivec4(ivec3 v3, int last, ivec4 dest)
init ivec4 using ivec3
Parameters:
| *[in]* **v** vector
| *[out]* **dest** destination
.. c:function:: void glm_ivec4_copy(ivec4 a, ivec4 dest)
copy all members of [a] to [dest]
Parameters:
| *[in]* **a** source vector
| *[out]* **dest** destination
.. c:function:: void glm_ivec4_zero(ivec4 v)
set all members of [v] to zero
Parameters:
| *[out]* **v** vector
.. c:function:: void glm_ivec4_one(ivec4 v)
set all members of [v] to one
Parameters:
| *[out]* **v** vector
.. c:function:: void glm_ivec4_add(ivec4 a, ivec4 b, ivec4 dest)
add vector [a] to vector [b] and store result in [dest]
Parameters:
| *[in]* **a** first vector
| *[in]* **b** second vector
| *[out]* **dest** destination
.. c:function:: void glm_ivec4_adds(ivec4 v, int s, ivec4 dest)
add scalar s to vector [v] and store result in [dest]
Parameters:
| *[in]* **v** vector
| *[in]* **s** scalar
| *[out]* **dest** destination
.. c:function:: void glm_ivec4_sub(ivec4 a, ivec4 b, ivec4 dest)
subtract vector [b] from vector [a] and store result in [dest]
Parameters:
| *[in]* **a** first vector
| *[in]* **b** second vector
| *[out]* **dest** destination
.. c:function:: void glm_ivec4_subs(ivec4 v, int s, ivec4 dest)
subtract scalar s from vector [v] and store result in [dest]
Parameters:
| *[in]* **v** vector
| *[in]* **s** scalar
| *[out]* **dest** destination
.. c:function:: void glm_ivec4_mul(ivec4 a, ivec4 b, ivec4 dest)
multiply vector [a] with vector [b] and store result in [dest]
Parameters:
| *[in]* **a** first vector
| *[in]* **b** second vector
| *[out]* **dest** destination
.. c:function:: void glm_ivec4_scale(ivec4 v, int s, ivec4 dest)
multiply vector [a] with scalar s and store result in [dest]
Parameters:
| *[in]* **v** vector
| *[in]* **s** scalar
| *[out]* **dest** destination
.. c:function:: int glm_ivec4_distance2(ivec4 a, ivec4 b)
squared distance between two vectors
Parameters:
| *[in]* **a** first vector
| *[in]* **b** second vector
Returns:
squared distance (distance * distance)
.. c:function:: float glm_ivec4_distance(ivec4 a, ivec4 b)
distance between two vectors
Parameters:
| *[in]* **a** first vector
| *[in]* **b** second vector
Returns:
distance
.. c:function:: void glm_ivec4_maxv(ivec4 a, ivec4 b, ivec4 dest)
set each member of dest to greater of vector a and b
Parameters:
| *[in]* **a** first vector
| *[in]* **b** second vector
| *[out]* **dest** destination
.. c:function:: void glm_ivec4_minv(ivec4 a, ivec4 b, ivec4 dest)
set each member of dest to lesser of vector a and b
Parameters:
| *[in]* **a** first vector
| *[in]* **b** second vector
| *[out]* **dest** destination
.. c:function:: void glm_ivec4_clamp(ivec4 v, int minVal, int maxVal)
clamp each member of [v] between minVal and maxVal (inclusive)
Parameters:
| *[in, out]* **v** vector
| *[in]* **minVal** minimum value
| *[in]* **maxVal** maximum value

View File

@@ -21,14 +21,14 @@ Functions:
Functions documentation Functions documentation
~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~
.. c:function:: void glm_unprojecti(vec3 pos, mat4 invMat, vec4 vp, vec3 dest) .. c:function:: void glm_unprojecti(vec3 pos, mat4 invMat, vec4 vp, vec3 dest)
| maps the specified viewport coordinates into specified space [1] | maps the specified viewport coordinates into specified space [1]
the matrix should contain projection matrix. the matrix should contain projection matrix.
if you don't have ( and don't want to have ) an inverse matrix then use if you don't have ( and don't want to have ) an inverse matrix then use
glm_unproject version. You may use existing inverse of matrix in somewhere :c:func:`glm_unproject` version. You may use existing inverse of matrix in somewhere
else, this is why glm_unprojecti exists to save save inversion cost else, this is why **glm_unprojecti** exists to save inversion cost
[1] space: [1] space:
- if m = invProj: View Space - if m = invProj: View Space
@@ -57,7 +57,7 @@ Functions documentation
| maps the specified viewport coordinates into specified space [1] | maps the specified viewport coordinates into specified space [1]
the matrix should contain projection matrix. the matrix should contain projection matrix.
this is same as glm_unprojecti except this function get inverse matrix for this is same as :c:func:`glm_unprojecti` except this function get inverse matrix for
you. you.
[1] space: [1] space:
@@ -80,7 +80,7 @@ Functions documentation
| *[in]* **vp** viewport as [x, y, width, height] | *[in]* **vp** viewport as [x, y, width, height]
| *[out]* **dest** unprojected coordinates | *[out]* **dest** unprojected coordinates
.. c:function:: void glm_project(vec3 pos, mat4 m, vec4 vp, vec3 dest) .. c:function:: void glm_project(vec3 pos, mat4 m, vec4 vp, vec3 dest)
| map object coordinates to window coordinates | map object coordinates to window coordinates
@@ -91,12 +91,29 @@ Functions documentation
glm_mat4_mul(proj, view, viewProj); glm_mat4_mul(proj, view, viewProj);
glm_mat4_mul(viewProj, model, MVP); glm_mat4_mul(viewProj, model, MVP);
this could be useful for gettng a bbox which fits with view frustum and
object bounding boxes. In this case you crop view frustum box with objects
box
Parameters: Parameters:
| *[in]* **pos** object coordinates | *[in]* **pos** object coordinates
| *[in]* **m** MVP matrix | *[in]* **m** MVP matrix
| *[in]* **vp** viewport as [x, y, width, height] | *[in]* **vp** viewport as [x, y, width, height]
| *[out]* **dest** projected coordinates | *[out]* **dest** projected coordinates
.. c:function:: float glm_project_z(vec3 pos, mat4 m)
| map object's z coordinate to window coordinates
this is same as :c:func:`glm_project` except this function projects only Z coordinate
which reduces a few calculations and parameters.
Computing MVP:
.. code-block:: c
glm_mat4_mul(proj, view, viewProj);
glm_mat4_mul(viewProj, model, MVP);
Parameters:
| *[in]* **pos** object coordinates
| *[in]* **m** MVP matrix
Returns:
projected z coordinate

247
include/cglm/affine-post.h Normal file
View File

@@ -0,0 +1,247 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#ifndef cglm_affine_post_h
#define cglm_affine_post_h
/*
Functions:
CGLM_INLINE void glm_translated_to(mat4 m, vec3 v, mat4 dest);
CGLM_INLINE void glm_translated(mat4 m, vec3 v);
CGLM_INLINE void glm_translated_x(mat4 m, float to);
CGLM_INLINE void glm_translated_y(mat4 m, float to);
CGLM_INLINE void glm_translated_z(mat4 m, float to);
CGLM_INLINE void glm_rotated_x(mat4 m, float angle, mat4 dest);
CGLM_INLINE void glm_rotated_y(mat4 m, float angle, mat4 dest);
CGLM_INLINE void glm_rotated_z(mat4 m, float angle, mat4 dest);
CGLM_INLINE void glm_rotated(mat4 m, float angle, vec3 axis);
CGLM_INLINE void glm_rotated_at(mat4 m, vec3 pivot, float angle, vec3 axis);
CGLM_INLINE void glm_spinned(mat4 m, float angle, vec3 axis);
*/
#include "common.h"
#include "util.h"
#include "vec3.h"
#include "vec4.h"
#include "mat4.h"
#include "affine-mat.h"
/*!
* @brief translate existing transform matrix by v vector
* and stores result in same matrix
*
* this is POST transform, applies to existing transform as last transfrom
*
* @param[in, out] m affine transfrom
* @param[in] v translate vector [x, y, z]
*/
CGLM_INLINE
void
glm_translated(mat4 m, vec3 v) {
glm_vec3_add(m[3], v, m[3]);
}
/*!
* @brief translate existing transform matrix by v vector
* and store result in dest
*
* source matrix will remain same
*
* this is POST transform, applies to existing transform as last transfrom
*
* @param[in] m affine transfrom
* @param[in] v translate vector [x, y, z]
* @param[out] dest translated matrix
*/
CGLM_INLINE
void
glm_translated_to(mat4 m, vec3 v, mat4 dest) {
glm_mat4_copy(m, dest);
glm_translated(dest, v);
}
/*!
* @brief translate existing transform matrix by x factor
*
* this is POST transform, applies to existing transform as last transfrom
*
* @param[in, out] m affine transfrom
* @param[in] x x factor
*/
CGLM_INLINE
void
glm_translated_x(mat4 m, float x) {
m[3][0] += x;
}
/*!
* @brief translate existing transform matrix by y factor
*
* this is POST transform, applies to existing transform as last transfrom
*
* @param[in, out] m affine transfrom
* @param[in] y y factor
*/
CGLM_INLINE
void
glm_translated_y(mat4 m, float y) {
m[3][1] += y;
}
/*!
* @brief translate existing transform matrix by z factor
*
* this is POST transform, applies to existing transform as last transfrom
*
* @param[in, out] m affine transfrom
* @param[in] z z factor
*/
CGLM_INLINE
void
glm_translated_z(mat4 m, float z) {
m[3][2] += z;
}
/*!
* @brief rotate existing transform matrix around X axis by angle
* and store result in dest
*
* this is POST transform, applies to existing transform as last transfrom
*
* @param[in] m affine transfrom
* @param[in] angle angle (radians)
* @param[out] dest rotated matrix
*/
CGLM_INLINE
void
glm_rotated_x(mat4 m, float angle, mat4 dest) {
CGLM_ALIGN_MAT mat4 t = GLM_MAT4_IDENTITY_INIT;
float c, s;
c = cosf(angle);
s = sinf(angle);
t[1][1] = c;
t[1][2] = s;
t[2][1] = -s;
t[2][2] = c;
glm_mul_rot(t, m, dest);
}
/*!
* @brief rotate existing transform matrix around Y axis by angle
* and store result in dest
*
* this is POST transform, applies to existing transform as last transfrom
*
* @param[in] m affine transfrom
* @param[in] angle angle (radians)
* @param[out] dest rotated matrix
*/
CGLM_INLINE
void
glm_rotated_y(mat4 m, float angle, mat4 dest) {
CGLM_ALIGN_MAT mat4 t = GLM_MAT4_IDENTITY_INIT;
float c, s;
c = cosf(angle);
s = sinf(angle);
t[0][0] = c;
t[0][2] = -s;
t[2][0] = s;
t[2][2] = c;
glm_mul_rot(t, m, dest);
}
/*!
* @brief rotate existing transform matrix around Z axis by angle
* and store result in dest
*
* this is POST transform, applies to existing transform as last transfrom
*
* @param[in] m affine transfrom
* @param[in] angle angle (radians)
* @param[out] dest rotated matrix
*/
CGLM_INLINE
void
glm_rotated_z(mat4 m, float angle, mat4 dest) {
CGLM_ALIGN_MAT mat4 t = GLM_MAT4_IDENTITY_INIT;
float c, s;
c = cosf(angle);
s = sinf(angle);
t[0][0] = c;
t[0][1] = s;
t[1][0] = -s;
t[1][1] = c;
glm_mul_rot(t, m, dest);
}
/*!
* @brief rotate existing transform matrix around given axis by angle
*
* this is POST transform, applies to existing transform as last transfrom
*
* @param[in, out] m affine transfrom
* @param[in] angle angle (radians)
* @param[in] axis axis
*/
CGLM_INLINE
void
glm_rotated(mat4 m, float angle, vec3 axis) {
CGLM_ALIGN_MAT mat4 rot;
glm_rotate_make(rot, angle, axis);
glm_mul_rot(rot, m, m);
}
/*!
* @brief rotate existing transform
* around given axis by angle at given pivot point (rotation center)
*
* this is POST transform, applies to existing transform as last transfrom
*
* @param[in, out] m affine transfrom
* @param[in] pivot rotation center
* @param[in] angle angle (radians)
* @param[in] axis axis
*/
CGLM_INLINE
void
glm_rotated_at(mat4 m, vec3 pivot, float angle, vec3 axis) {
CGLM_ALIGN(8) vec3 pivotInv;
glm_vec3_negate_to(pivot, pivotInv);
glm_translated(m, pivot);
glm_rotated(m, angle, axis);
glm_translated(m, pivotInv);
}
/*!
* @brief rotate existing transform matrix around given axis by angle around self (doesn't affected by position)
*
* this is POST transform, applies to existing transform as last transfrom
*
* @param[in, out] m affine transfrom
* @param[in] angle angle (radians)
* @param[in] axis axis
*/
CGLM_INLINE
void
glm_spinned(mat4 m, float angle, vec3 axis) {
CGLM_ALIGN_MAT mat4 rot;
glm_rotate_atm(rot, m[3], angle, axis);
glm_mat4_mul(rot, m, m);
}
#endif /* cglm_affine_post_h */

285
include/cglm/affine-pre.h Normal file
View File

@@ -0,0 +1,285 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#ifndef cglm_affine_pre_h
#define cglm_affine_pre_h
/*
Functions:
CGLM_INLINE void glm_translate_to(mat4 m, vec3 v, mat4 dest);
CGLM_INLINE void glm_translate(mat4 m, vec3 v);
CGLM_INLINE void glm_translate_x(mat4 m, float to);
CGLM_INLINE void glm_translate_y(mat4 m, float to);
CGLM_INLINE void glm_translate_z(mat4 m, float to);
CGLM_INLINE void glm_rotate_x(mat4 m, float angle, mat4 dest);
CGLM_INLINE void glm_rotate_y(mat4 m, float angle, mat4 dest);
CGLM_INLINE void glm_rotate_z(mat4 m, float angle, mat4 dest);
CGLM_INLINE void glm_rotate(mat4 m, float angle, vec3 axis);
CGLM_INLINE void glm_rotate_at(mat4 m, vec3 pivot, float angle, vec3 axis);
CGLM_INLINE void glm_rotate_atm(mat4 m, vec3 pivot, float angle, vec3 axis);
CGLM_INLINE void glm_spin(mat4 m, float angle, vec3 axis);
*/
#include "common.h"
#include "util.h"
#include "vec3.h"
#include "vec4.h"
#include "mat4.h"
#include "affine-mat.h"
/*!
* @brief translate existing transform matrix by v vector
* and stores result in same matrix
*
* @param[in, out] m affine transfrom
* @param[in] v translate vector [x, y, z]
*/
CGLM_INLINE
void
glm_translate(mat4 m, vec3 v) {
#if defined(CGLM_SIMD)
glmm_128 m0, m1, m2, m3;
m0 = glmm_load(m[0]);
m1 = glmm_load(m[1]);
m2 = glmm_load(m[2]);
m3 = glmm_load(m[3]);
glmm_store(m[3],
glmm_fmadd(m0, glmm_set1(v[0]),
glmm_fmadd(m1, glmm_set1(v[1]),
glmm_fmadd(m2, glmm_set1(v[2]), m3))));
#else
glm_vec4_muladds(m[0], v[0], m[3]);
glm_vec4_muladds(m[1], v[1], m[3]);
glm_vec4_muladds(m[2], v[2], m[3]);
#endif
}
/*!
* @brief translate existing transform matrix by v vector
* and store result in dest
*
* source matrix will remain same
*
* @param[in] m affine transfrom
* @param[in] v translate vector [x, y, z]
* @param[out] dest translated matrix
*/
CGLM_INLINE
void
glm_translate_to(mat4 m, vec3 v, mat4 dest) {
glm_mat4_copy(m, dest);
glm_translate(dest, v);
}
/*!
* @brief translate existing transform matrix by x factor
*
* @param[in, out] m affine transfrom
* @param[in] x x factor
*/
CGLM_INLINE
void
glm_translate_x(mat4 m, float x) {
#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);
glm_vec4_add(v1, m[3], m[3]);
#endif
}
/*!
* @brief translate existing transform matrix by y factor
*
* @param[in, out] m affine transfrom
* @param[in] y y factor
*/
CGLM_INLINE
void
glm_translate_y(mat4 m, float y) {
#if defined(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);
glm_vec4_add(v1, m[3], m[3]);
#endif
}
/*!
* @brief translate existing transform matrix by z factor
*
* @param[in, out] m affine transfrom
* @param[in] z z factor
*/
CGLM_INLINE
void
glm_translate_z(mat4 m, float z) {
#if defined(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);
glm_vec4_add(v1, m[3], m[3]);
#endif
}
/*!
* @brief rotate existing transform matrix around X axis by angle
* and store result in dest
*
* @param[in] m affine transfrom
* @param[in] angle angle (radians)
* @param[out] dest rotated matrix
*/
CGLM_INLINE
void
glm_rotate_x(mat4 m, float angle, mat4 dest) {
CGLM_ALIGN_MAT mat4 t = GLM_MAT4_IDENTITY_INIT;
float c, s;
c = cosf(angle);
s = sinf(angle);
t[1][1] = c;
t[1][2] = s;
t[2][1] = -s;
t[2][2] = c;
glm_mul_rot(m, t, dest);
}
/*!
* @brief rotate existing transform matrix around Y axis by angle
* and store result in dest
*
* @param[in] m affine transfrom
* @param[in] angle angle (radians)
* @param[out] dest rotated matrix
*/
CGLM_INLINE
void
glm_rotate_y(mat4 m, float angle, mat4 dest) {
CGLM_ALIGN_MAT mat4 t = GLM_MAT4_IDENTITY_INIT;
float c, s;
c = cosf(angle);
s = sinf(angle);
t[0][0] = c;
t[0][2] = -s;
t[2][0] = s;
t[2][2] = c;
glm_mul_rot(m, t, dest);
}
/*!
* @brief rotate existing transform matrix around Z axis by angle
* and store result in dest
*
* @param[in] m affine transfrom
* @param[in] angle angle (radians)
* @param[out] dest rotated matrix
*/
CGLM_INLINE
void
glm_rotate_z(mat4 m, float angle, mat4 dest) {
CGLM_ALIGN_MAT mat4 t = GLM_MAT4_IDENTITY_INIT;
float c, s;
c = cosf(angle);
s = sinf(angle);
t[0][0] = c;
t[0][1] = s;
t[1][0] = -s;
t[1][1] = c;
glm_mul_rot(m, t, dest);
}
/*!
* @brief rotate existing transform matrix around given axis by angle
*
* @param[in, out] m affine transfrom
* @param[in] angle angle (radians)
* @param[in] axis axis
*/
CGLM_INLINE
void
glm_rotate(mat4 m, float angle, vec3 axis) {
CGLM_ALIGN_MAT mat4 rot;
glm_rotate_make(rot, angle, axis);
glm_mul_rot(m, rot, m);
}
/*!
* @brief rotate existing transform
* around given axis by angle at given pivot point (rotation center)
*
* @param[in, out] m affine transfrom
* @param[in] pivot rotation center
* @param[in] angle angle (radians)
* @param[in] axis axis
*/
CGLM_INLINE
void
glm_rotate_at(mat4 m, vec3 pivot, float angle, vec3 axis) {
CGLM_ALIGN(8) vec3 pivotInv;
glm_vec3_negate_to(pivot, pivotInv);
glm_translate(m, pivot);
glm_rotate(m, angle, axis);
glm_translate(m, pivotInv);
}
/*!
* @brief creates NEW rotation matrix by angle and axis at given point
*
* this creates rotation matrix, it assumes you don't have a matrix
*
* this should work faster than glm_rotate_at because it reduces
* one glm_translate.
*
* @param[out] m affine transfrom
* @param[in] pivot rotation center
* @param[in] angle angle (radians)
* @param[in] axis axis
*/
CGLM_INLINE
void
glm_rotate_atm(mat4 m, vec3 pivot, float angle, vec3 axis) {
CGLM_ALIGN(8) vec3 pivotInv;
glm_vec3_negate_to(pivot, pivotInv);
glm_translate_make(m, pivot);
glm_rotate(m, angle, axis);
glm_translate(m, pivotInv);
}
/*!
* @brief rotate existing transform matrix around given axis by angle around self (doesn't affected by position)
*
* @param[in, out] m affine transfrom
* @param[in] angle angle (radians)
* @param[in] axis axis
*/
CGLM_INLINE
void
glm_spin(mat4 m, float angle, vec3 axis) {
CGLM_ALIGN_MAT mat4 rot;
glm_rotate_atm(rot, m[3], angle, axis);
glm_mat4_mul(m, rot, m);
}
#endif /* cglm_affine_pre_h */

View File

@@ -24,6 +24,7 @@
CGLM_INLINE void glm_rotate(mat4 m, float angle, vec3 axis); CGLM_INLINE void glm_rotate(mat4 m, float angle, vec3 axis);
CGLM_INLINE void glm_rotate_at(mat4 m, vec3 pivot, float angle, vec3 axis); CGLM_INLINE void glm_rotate_at(mat4 m, vec3 pivot, float angle, vec3 axis);
CGLM_INLINE void glm_rotate_atm(mat4 m, vec3 pivot, float angle, vec3 axis); CGLM_INLINE void glm_rotate_atm(mat4 m, vec3 pivot, float angle, vec3 axis);
CGLM_INLINE void glm_spin(mat4 m, float angle, vec3 axis);
CGLM_INLINE void glm_decompose_scalev(mat4 m, vec3 s); CGLM_INLINE void glm_decompose_scalev(mat4 m, vec3 s);
CGLM_INLINE bool glm_uniscaled(mat4 m); CGLM_INLINE bool glm_uniscaled(mat4 m);
CGLM_INLINE void glm_decompose_rs(mat4 m, mat4 r, vec3 s); CGLM_INLINE void glm_decompose_rs(mat4 m, mat4 r, vec3 s);
@@ -40,106 +41,6 @@
#include "mat4.h" #include "mat4.h"
#include "affine-mat.h" #include "affine-mat.h"
/*!
* @brief translate existing transform matrix by v vector
* and stores result in same matrix
*
* @param[in, out] m affine transfrom
* @param[in] v translate vector [x, y, z]
*/
CGLM_INLINE
void
glm_translate(mat4 m, vec3 v) {
#if defined(CGLM_SIMD)
glmm_128 m0, m1, m2, m3;
m0 = glmm_load(m[0]);
m1 = glmm_load(m[1]);
m2 = glmm_load(m[2]);
m3 = glmm_load(m[3]);
glmm_store(m[3],
glmm_fmadd(m0, glmm_set1(v[0]),
glmm_fmadd(m1, glmm_set1(v[1]),
glmm_fmadd(m2, glmm_set1(v[2]), m3))));
#else
glm_vec4_muladds(m[0], v[0], m[3]);
glm_vec4_muladds(m[1], v[1], m[3]);
glm_vec4_muladds(m[2], v[2], m[3]);
#endif
}
/*!
* @brief translate existing transform matrix by v vector
* and store result in dest
*
* source matrix will remain same
*
* @param[in] m affine transfrom
* @param[in] v translate vector [x, y, z]
* @param[out] dest translated matrix
*/
CGLM_INLINE
void
glm_translate_to(mat4 m, vec3 v, mat4 dest) {
glm_mat4_copy(m, dest);
glm_translate(dest, v);
}
/*!
* @brief translate existing transform matrix by x factor
*
* @param[in, out] m affine transfrom
* @param[in] x x factor
*/
CGLM_INLINE
void
glm_translate_x(mat4 m, float x) {
#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);
glm_vec4_add(v1, m[3], m[3]);
#endif
}
/*!
* @brief translate existing transform matrix by y factor
*
* @param[in, out] m affine transfrom
* @param[in] y y factor
*/
CGLM_INLINE
void
glm_translate_y(mat4 m, float y) {
#if defined(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);
glm_vec4_add(v1, m[3], m[3]);
#endif
}
/*!
* @brief translate existing transform matrix by z factor
*
* @param[in, out] m affine transfrom
* @param[in] z z factor
*/
CGLM_INLINE
void
glm_translate_z(mat4 m, float z) {
#if defined(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);
glm_vec4_add(v1, m[3], m[3]);
#endif
}
/*! /*!
* @brief creates NEW translate transform matrix by v vector * @brief creates NEW translate transform matrix by v vector
* *
@@ -213,81 +114,6 @@ glm_scale_uni(mat4 m, float s) {
glm_scale_to(m, v, m); glm_scale_to(m, v, m);
} }
/*!
* @brief rotate existing transform matrix around X axis by angle
* and store result in dest
*
* @param[in] m affine transfrom
* @param[in] angle angle (radians)
* @param[out] dest rotated matrix
*/
CGLM_INLINE
void
glm_rotate_x(mat4 m, float angle, mat4 dest) {
CGLM_ALIGN_MAT mat4 t = GLM_MAT4_IDENTITY_INIT;
float c, s;
c = cosf(angle);
s = sinf(angle);
t[1][1] = c;
t[1][2] = s;
t[2][1] = -s;
t[2][2] = c;
glm_mul_rot(m, t, dest);
}
/*!
* @brief rotate existing transform matrix around Y axis by angle
* and store result in dest
*
* @param[in] m affine transfrom
* @param[in] angle angle (radians)
* @param[out] dest rotated matrix
*/
CGLM_INLINE
void
glm_rotate_y(mat4 m, float angle, mat4 dest) {
CGLM_ALIGN_MAT mat4 t = GLM_MAT4_IDENTITY_INIT;
float c, s;
c = cosf(angle);
s = sinf(angle);
t[0][0] = c;
t[0][2] = -s;
t[2][0] = s;
t[2][2] = c;
glm_mul_rot(m, t, dest);
}
/*!
* @brief rotate existing transform matrix around Z axis by angle
* and store result in dest
*
* @param[in] m affine transfrom
* @param[in] angle angle (radians)
* @param[out] dest rotated matrix
*/
CGLM_INLINE
void
glm_rotate_z(mat4 m, float angle, mat4 dest) {
CGLM_ALIGN_MAT mat4 t = GLM_MAT4_IDENTITY_INIT;
float c, s;
c = cosf(angle);
s = sinf(angle);
t[0][0] = c;
t[0][1] = s;
t[1][0] = -s;
t[1][1] = c;
glm_mul_rot(m, t, dest);
}
/*! /*!
* @brief creates NEW rotation matrix by angle and axis * @brief creates NEW rotation matrix by angle and axis
* *
@@ -321,67 +147,6 @@ glm_rotate_make(mat4 m, float angle, vec3 axis) {
m[3][3] = 1.0f; m[3][3] = 1.0f;
} }
/*!
* @brief rotate existing transform matrix around given axis by angle
*
* @param[in, out] m affine transfrom
* @param[in] angle angle (radians)
* @param[in] axis axis
*/
CGLM_INLINE
void
glm_rotate(mat4 m, float angle, vec3 axis) {
CGLM_ALIGN_MAT mat4 rot;
glm_rotate_make(rot, angle, axis);
glm_mul_rot(m, rot, m);
}
/*!
* @brief rotate existing transform
* around given axis by angle at given pivot point (rotation center)
*
* @param[in, out] m affine transfrom
* @param[in] pivot rotation center
* @param[in] angle angle (radians)
* @param[in] axis axis
*/
CGLM_INLINE
void
glm_rotate_at(mat4 m, vec3 pivot, float angle, vec3 axis) {
CGLM_ALIGN(8) vec3 pivotInv;
glm_vec3_negate_to(pivot, pivotInv);
glm_translate(m, pivot);
glm_rotate(m, angle, axis);
glm_translate(m, pivotInv);
}
/*!
* @brief creates NEW rotation matrix by angle and axis at given point
*
* this creates rotation matrix, it assumes you don't have a matrix
*
* this should work faster than glm_rotate_at because it reduces
* one glm_translate.
*
* @param[out] m affine transfrom
* @param[in] pivot rotation center
* @param[in] angle angle (radians)
* @param[in] axis axis
*/
CGLM_INLINE
void
glm_rotate_atm(mat4 m, vec3 pivot, float angle, vec3 axis) {
CGLM_ALIGN(8) vec3 pivotInv;
glm_vec3_negate_to(pivot, pivotInv);
glm_translate_make(m, pivot);
glm_rotate(m, angle, axis);
glm_translate(m, pivotInv);
}
/*! /*!
* @brief decompose scale vector * @brief decompose scale vector
* *
@@ -467,4 +232,7 @@ glm_decompose(mat4 m, vec4 t, mat4 r, vec3 s) {
glm_decompose_rs(m, r, s); glm_decompose_rs(m, r, s);
} }
#include "affine-pre.h"
#include "affine-post.h"
#endif /* cglm_affine_h */ #endif /* cglm_affine_h */

View File

@@ -15,6 +15,9 @@ extern "C" {
#include "call/vec2.h" #include "call/vec2.h"
#include "call/vec3.h" #include "call/vec3.h"
#include "call/vec4.h" #include "call/vec4.h"
#include "call/ivec2.h"
#include "call/ivec3.h"
#include "call/ivec4.h"
#include "call/mat2.h" #include "call/mat2.h"
#include "call/mat3.h" #include "call/mat3.h"
#include "call/mat4.h" #include "call/mat4.h"

View File

@@ -81,6 +81,10 @@ CGLM_EXPORT
void void
glmc_rotate_atm(mat4 m, vec3 pivot, float angle, vec3 axis); glmc_rotate_atm(mat4 m, vec3 pivot, float angle, vec3 axis);
CGLM_EXPORT
void
glmc_spin(mat4 m, float angle, vec3 axis);
CGLM_EXPORT CGLM_EXPORT
void void
glmc_decompose_scalev(mat4 m, vec3 s); glmc_decompose_scalev(mat4 m, vec3 s);
@@ -97,6 +101,52 @@ CGLM_EXPORT
void void
glmc_decompose(mat4 m, vec4 t, mat4 r, vec3 s); glmc_decompose(mat4 m, vec4 t, mat4 r, vec3 s);
/* affine-post */
CGLM_EXPORT
void
glmc_translated(mat4 m, vec3 v);
CGLM_EXPORT
void
glmc_translated_to(mat4 m, vec3 v, mat4 dest);
CGLM_EXPORT
void
glmc_translated_x(mat4 m, float x);
CGLM_EXPORT
void
glmc_translated_y(mat4 m, float y);
CGLM_EXPORT
void
glmc_translated_z(mat4 m, float z);
CGLM_EXPORT
void
glmc_rotated_x(mat4 m, float angle, mat4 dest);
CGLM_EXPORT
void
glmc_rotated_y(mat4 m, float angle, mat4 dest);
CGLM_EXPORT
void
glmc_rotated_z(mat4 m, float angle, mat4 dest);
CGLM_EXPORT
void
glmc_rotated(mat4 m, float angle, vec3 axis);
CGLM_EXPORT
void
glmc_rotated_at(mat4 m, vec3 pivot, float angle, vec3 axis);
CGLM_EXPORT
void
glmc_spinned(mat4 m, float angle, vec3 axis);
/* affine-mat */ /* affine-mat */
CGLM_EXPORT CGLM_EXPORT

View File

@@ -21,6 +21,10 @@ CGLM_EXPORT
void void
glmc_project_no(vec3 pos, mat4 m, vec4 vp, vec3 dest); glmc_project_no(vec3 pos, mat4 m, vec4 vp, vec3 dest);
CGLM_EXPORT
float
glmc_project_z_no(vec3 pos, mat4 m);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View File

@@ -21,6 +21,10 @@ CGLM_EXPORT
void void
glmc_project_zo(vec3 pos, mat4 m, vec4 vp, vec3 dest); glmc_project_zo(vec3 pos, mat4 m, vec4 vp, vec3 dest);
CGLM_EXPORT
float
glmc_project_z_zo(vec3 pos, mat4 m);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

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

@@ -0,0 +1,79 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#ifndef cglmc_ivec2_h
#define cglmc_ivec2_h
#ifdef __cplusplus
extern "C" {
#endif
#include "../cglm.h"
CGLM_EXPORT
void
glmc_ivec2(int * __restrict v, ivec2 dest);
CGLM_EXPORT
void
glmc_ivec2_copy(ivec2 a, ivec2 dest);
CGLM_EXPORT
void
glmc_ivec2_zero(ivec2 v);
CGLM_EXPORT
void
glmc_ivec2_one(ivec2 v);
CGLM_EXPORT
void
glmc_ivec2_add(ivec2 a, ivec2 b, ivec2 dest);
CGLM_EXPORT
void
glmc_ivec2_adds(ivec2 v, int s, ivec2 dest);
CGLM_EXPORT
void
glmc_ivec2_sub(ivec2 a, ivec2 b, ivec2 dest);
CGLM_EXPORT
void
glmc_ivec2_subs(ivec2 v, int s, ivec2 dest);
CGLM_EXPORT
void
glmc_ivec2_mul(ivec2 a, ivec2 b, ivec2 dest);
CGLM_EXPORT
void
glmc_ivec2_scale(ivec2 v, int s, ivec2 dest);
CGLM_EXPORT
int
glmc_ivec2_distance2(ivec2 a, ivec2 b);
CGLM_EXPORT
float
glmc_ivec2_distance(ivec2 a, ivec2 b);
CGLM_EXPORT
void
glmc_ivec2_maxv(ivec2 a, ivec2 b, ivec2 dest);
CGLM_EXPORT
void
glmc_ivec2_minv(ivec2 a, ivec2 b, ivec2 dest);
CGLM_EXPORT
void
glmc_ivec2_clamp(ivec2 v, int minVal, int maxVal);
#ifdef __cplusplus
}
#endif
#endif /* cglmc_ivec2_h */

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

@@ -0,0 +1,79 @@
/*
* Copyright (c);, Recep Aslantas.
*
* MIT License (MIT);, http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#ifndef cglmc_ivec3_h
#define cglmc_ivec3_h
#ifdef __cplusplus
extern "C" {
#endif
#include "../cglm.h"
CGLM_EXPORT
void
glmc_ivec3(ivec4 v4, ivec3 dest);
CGLM_EXPORT
void
glmc_ivec3_copy(ivec3 a, ivec3 dest);
CGLM_EXPORT
void
glmc_ivec3_zero(ivec3 v);
CGLM_EXPORT
void
glmc_ivec3_one(ivec3 v);
CGLM_EXPORT
void
glmc_ivec3_add(ivec3 a, ivec3 b, ivec3 dest);
CGLM_EXPORT
void
glmc_ivec3_adds(ivec3 v, int s, ivec3 dest);
CGLM_EXPORT
void
glmc_ivec3_sub(ivec3 a, ivec3 b, ivec3 dest);
CGLM_EXPORT
void
glmc_ivec3_subs(ivec3 v, int s, ivec3 dest);
CGLM_EXPORT
void
glmc_ivec3_mul(ivec3 a, ivec3 b, ivec3 dest);
CGLM_EXPORT
void
glmc_ivec3_scale(ivec3 v, int s, ivec3 dest);
CGLM_EXPORT
int
glmc_ivec3_distance2(ivec3 a, ivec3 b);
CGLM_EXPORT
float
glmc_ivec3_distance(ivec3 a, ivec3 b);
CGLM_EXPORT
void
glmc_ivec3_maxv(ivec3 a, ivec3 b, ivec3 dest);
CGLM_EXPORT
void
glmc_ivec3_minv(ivec3 a, ivec3 b, ivec3 dest);
CGLM_EXPORT
void
glmc_ivec3_clamp(ivec3 v, int minVal, int maxVal);
#ifdef __cplusplus
}
#endif
#endif /* cglmc_ivec3_h */

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

@@ -0,0 +1,79 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#ifndef cglmc_ivec4_h
#define cglmc_ivec4_h
#ifdef __cplusplus
extern "C" {
#endif
#include "../cglm.h"
CGLM_EXPORT
void
glmc_ivec4(ivec3 v3, int last, ivec4 dest);
CGLM_EXPORT
void
glmc_ivec4_copy(ivec4 a, ivec4 dest);
CGLM_EXPORT
void
glmc_ivec4_zero(ivec4 v);
CGLM_EXPORT
void
glmc_ivec4_one(ivec4 v);
CGLM_EXPORT
void
glmc_ivec4_add(ivec4 a, ivec4 b, ivec4 dest);
CGLM_EXPORT
void
glmc_ivec4_adds(ivec4 v, int s, ivec4 dest);
CGLM_EXPORT
void
glmc_ivec4_sub(ivec4 a, ivec4 b, ivec4 dest);
CGLM_EXPORT
void
glmc_ivec4_subs(ivec4 v, int s, ivec4 dest);
CGLM_EXPORT
void
glmc_ivec4_mul(ivec4 a, ivec4 b, ivec4 dest);
CGLM_EXPORT
void
glmc_ivec4_scale(ivec4 v, int s, ivec4 dest);
CGLM_EXPORT
int
glmc_ivec4_distance2(ivec4 a, ivec4 b);
CGLM_EXPORT
float
glmc_ivec4_distance(ivec4 a, ivec4 b);
CGLM_EXPORT
void
glmc_ivec4_maxv(ivec4 a, ivec4 b, ivec4 dest);
CGLM_EXPORT
void
glmc_ivec4_minv(ivec4 a, ivec4 b, ivec4 dest);
CGLM_EXPORT
void
glmc_ivec4_clamp(ivec4 v, int minVal, int maxVal);
#ifdef __cplusplus
}
#endif
#endif /* cglmc_ivec4_h */

View File

@@ -25,6 +25,10 @@ CGLM_EXPORT
void void
glmc_project(vec3 pos, mat4 m, vec4 vp, vec3 dest); glmc_project(vec3 pos, mat4 m, vec4 vp, vec3 dest);
CGLM_EXPORT
float
glmc_project_z(vec3 pos, mat4 m);
CGLM_EXPORT CGLM_EXPORT
void void
glmc_pickmatrix(vec2 center, vec2 size, vec4 vp, mat4 dest); glmc_pickmatrix(vec2 center, vec2 size, vec4 vp, mat4 dest);

View File

@@ -149,6 +149,18 @@ CGLM_EXPORT
void void
glmc_vec2_lerp(vec2 from, vec2 to, float t, vec2 dest); glmc_vec2_lerp(vec2 from, vec2 to, float t, vec2 dest);
CGLM_EXPORT
void
glmc_vec2_complex_mul(vec2 a, vec2 b, vec2 dest);
CGLM_EXPORT
void
glmc_vec2_complex_div(vec2 a, vec2 b, vec2 dest);
CGLM_EXPORT
void
glmc_vec2_complex_conjugate(vec2 a, vec2 dest);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View File

@@ -12,6 +12,9 @@
#include "vec2.h" #include "vec2.h"
#include "vec3.h" #include "vec3.h"
#include "vec4.h" #include "vec4.h"
#include "ivec2.h"
#include "ivec3.h"
#include "ivec4.h"
#include "mat4.h" #include "mat4.h"
#include "mat3.h" #include "mat3.h"
#include "mat2.h" #include "mat2.h"

View File

@@ -83,4 +83,27 @@ glm_project_no(vec3 pos, mat4 m, vec4 vp, vec3 dest) {
dest[2] = pos4[2]; dest[2] = pos4[2];
} }
/*!
* @brief map object's z coordinate to window coordinates
*
* Computing MVP:
* glm_mat4_mul(proj, view, viewProj);
* glm_mat4_mul(viewProj, model, MVP);
*
* @param[in] v object coordinates
* @param[in] m MVP matrix
*
* @returns projected z coordinate
*/
CGLM_INLINE
float
glm_project_z_no(vec3 v, mat4 m) {
float z, w;
z = m[0][2] * v[0] + m[1][2] * v[1] + m[2][2] * v[2] + m[3][2];
w = m[0][3] * v[0] + m[1][3] * v[1] + m[2][3] * v[2] + m[3][3];
return 0.5f * (z / w) + 0.5f;
}
#endif /* cglm_project_no_h */ #endif /* cglm_project_no_h */

View File

@@ -85,4 +85,27 @@ glm_project_zo(vec3 pos, mat4 m, vec4 vp, vec3 dest) {
dest[1] = pos4[1] * vp[3] + vp[1]; dest[1] = pos4[1] * vp[3] + vp[1];
} }
/*!
* @brief map object's z coordinate to window coordinates
*
* Computing MVP:
* glm_mat4_mul(proj, view, viewProj);
* glm_mat4_mul(viewProj, model, MVP);
*
* @param[in] v object coordinates
* @param[in] m MVP matrix
*
* @returns projected z coordinate
*/
CGLM_INLINE
float
glm_project_z_zo(vec3 v, mat4 m) {
float z, w;
z = m[0][2] * v[0] + m[1][2] * v[1] + m[2][2] * v[2] + m[3][2];
w = m[0][3] * v[0] + m[1][3] * v[1] + m[2][3] * v[2] + m[3][3];
return z / w;
}
#endif /* cglm_project_zo_h */ #endif /* cglm_project_zo_h */

View File

@@ -37,8 +37,8 @@ glm_lookat_lh(vec3 eye, vec3 center, vec3 up, mat4 dest) {
glm_vec3_sub(center, eye, f); glm_vec3_sub(center, eye, f);
glm_vec3_normalize(f); glm_vec3_normalize(f);
glm_vec3_crossn(f, up, s); glm_vec3_crossn(up, f, s);
glm_vec3_cross(s, f, u); glm_vec3_cross(f, s, u);
dest[0][0] = s[0]; dest[0][0] = s[0];
dest[0][1] = u[0]; dest[0][1] = u[0];

View File

@@ -44,16 +44,16 @@
#ifndef CGLM_USE_DEFAULT_EPSILON #ifndef CGLM_USE_DEFAULT_EPSILON
# ifndef GLM_FLT_EPSILON # ifndef GLM_FLT_EPSILON
# define GLM_FLT_EPSILON 1e-6 # define GLM_FLT_EPSILON 1e-5
# endif # endif
#else #else
# define GLM_FLT_EPSILON FLT_EPSILON # define GLM_FLT_EPSILON FLT_EPSILON
#endif #endif
/* /*
* Clip control: define GLM_FORCE_DEPTH_ZERO_TO_ONE before including * Clip control: define CGLM_FORCE_DEPTH_ZERO_TO_ONE before including
* CGLM to use a clip space between 0 to 1. * CGLM to use a clip space between 0 to 1.
* Coordinate system: define GLM_FORCE_LEFT_HANDED before including * Coordinate system: define CGLM_FORCE_LEFT_HANDED before including
* CGLM to use the left handed coordinate system by default. * CGLM to use the left handed coordinate system by default.
*/ */

View File

@@ -39,6 +39,7 @@
|| defined(CGLM_NO_PRINTS_NOOP) || defined(CGLM_NO_PRINTS_NOOP)
#include "common.h" #include "common.h"
#include "util.h"
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>

242
include/cglm/ivec2.h Normal file
View File

@@ -0,0 +1,242 @@
/*
* 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_ivec2(int * __restrict v, ivec2 dest)
CGLM_INLINE void glm_ivec2_copy(ivec2 a, ivec2 dest)
CGLM_INLINE void glm_ivec2_zero(ivec2 v)
CGLM_INLINE void glm_ivec2_one(ivec2 v)
CGLM_INLINE void glm_ivec2_add(ivec2 a, ivec2 b, ivec2 dest)
CGLM_INLINE void glm_ivec2_adds(ivec2 v, int s, ivec2 dest)
CGLM_INLINE void glm_ivec2_sub(ivec2 a, ivec2 b, ivec2 dest)
CGLM_INLINE void glm_ivec2_subs(ivec2 v, int s, ivec2 dest)
CGLM_INLINE void glm_ivec2_mul(ivec2 a, ivec2 b, ivec2 dest)
CGLM_INLINE void glm_ivec2_scale(ivec2 v, int s, ivec2 dest)
CGLM_INLINE int glm_ivec2_distance2(ivec2 a, ivec2 b)
CGLM_INLINE float glm_ivec2_distance(ivec2 a, ivec2 b)
CGLM_INLINE void glm_ivec2_maxv(ivec2 a, ivec2 b, ivec2 dest)
CGLM_INLINE void glm_ivec2_minv(ivec2 a, ivec2 b, ivec2 dest)
CGLM_INLINE void glm_ivec2_clamp(ivec2 v, int minVal, int maxVal)
*/
#ifndef cglm_ivec2_h
#define cglm_ivec2_h
#include "common.h"
/*!
* @brief init ivec2 using vec3 or vec4
*
* @param[in] v vector
* @param[out] dest destination
*/
CGLM_INLINE
void
glm_ivec2(int * __restrict v, ivec2 dest) {
dest[0] = v[0];
dest[1] = v[1];
}
/*!
* @brief copy all members of [a] to [dest]
*
* @param[in] a source vector
* @param[out] dest destination
*/
CGLM_INLINE
void
glm_ivec2_copy(ivec2 a, ivec2 dest) {
dest[0] = a[0];
dest[1] = a[1];
}
/*!
* @brief set all members of [v] to zero
*
* @param[out] v vector
*/
CGLM_INLINE
void
glm_ivec2_zero(ivec2 v) {
v[0] = v[1] = 0;
}
/*!
* @brief set all members of [v] to one
*
* @param[out] v vector
*/
CGLM_INLINE
void
glm_ivec2_one(ivec2 v) {
v[0] = v[1] = 1;
}
/*!
* @brief add vector [a] to vector [b] and store result in [dest]
*
* @param[in] a first vector
* @param[in] b second vector
* @param[out] dest destination
*/
CGLM_INLINE
void
glm_ivec2_add(ivec2 a, ivec2 b, ivec2 dest) {
dest[0] = a[0] + b[0];
dest[1] = a[1] + b[1];
}
/*!
* @brief add scalar s to vector [v] and store result in [dest]
*
* @param[in] v vector
* @param[in] s scalar
* @param[out] dest destination
*/
CGLM_INLINE
void
glm_ivec2_adds(ivec2 v, int s, ivec2 dest) {
dest[0] = v[0] + s;
dest[1] = v[1] + s;
}
/*!
* @brief subtract vector [b] from vector [a] and store result in [dest]
*
* @param[in] a first vector
* @param[in] b second vector
* @param[out] dest destination
*/
CGLM_INLINE
void
glm_ivec2_sub(ivec2 a, ivec2 b, ivec2 dest) {
dest[0] = a[0] - b[0];
dest[1] = a[1] - b[1];
}
/*!
* @brief subtract scalar s from vector [v] and store result in [dest]
*
* @param[in] v vector
* @param[in] s scalar
* @param[out] dest destination
*/
CGLM_INLINE
void
glm_ivec2_subs(ivec2 v, int s, ivec2 dest) {
dest[0] = v[0] - s;
dest[1] = v[1] - s;
}
/*!
* @brief multiply vector [a] with vector [b] and store result in [dest]
*
* @param[in] a frist vector
* @param[in] b second vector
* @param[out] dest destination
*/
CGLM_INLINE
void
glm_ivec2_mul(ivec2 a, ivec2 b, ivec2 dest) {
dest[0] = a[0] * b[0];
dest[1] = a[1] * b[1];
}
/*!
* @brief multiply vector [a] with scalar s and store result in [dest]
*
* @param[in] v vector
* @param[in] s scalar
* @param[out] dest destination
*/
CGLM_INLINE
void
glm_ivec2_scale(ivec2 v, int s, ivec2 dest) {
dest[0] = v[0] * s;
dest[1] = v[1] * s;
}
/*!
* @brief squared distance between two vectors
*
* @param[in] a first vector
* @param[in] b second vector
* @return returns squared distance (distance * distance)
*/
CGLM_INLINE
int
glm_ivec2_distance2(ivec2 a, ivec2 b) {
int xd, yd;
xd = a[0] - b[0];
yd = a[1] - b[1];
return xd * xd + yd * yd;
}
/*!
* @brief distance between two vectors
*
* @param[in] a first vector
* @param[in] b second vector
* @return returns distance
*/
CGLM_INLINE
float
glm_ivec2_distance(ivec2 a, ivec2 b) {
return sqrtf((float)glm_ivec2_distance2(a, b));
}
/*!
* @brief set each member of dest to greater of vector a and b
*
* @param[in] a first vector
* @param[in] b second vector
* @param[out] dest destination
*/
CGLM_INLINE
void
glm_ivec2_maxv(ivec2 a, ivec2 b, ivec2 dest) {
dest[0] = a[0] > b[0] ? a[0] : b[0];
dest[1] = a[1] > b[1] ? a[1] : b[1];
}
/*!
* @brief set each member of dest to lesser of vector a and b
*
* @param[in] a first vector
* @param[in] b second vector
* @param[out] dest destination
*/
CGLM_INLINE
void
glm_ivec2_minv(ivec2 a, ivec2 b, ivec2 dest) {
dest[0] = a[0] < b[0] ? a[0] : b[0];
dest[1] = a[1] < b[1] ? a[1] : b[1];
}
/*!
* @brief clamp each member of [v] between minVal and maxVal (inclusive)
*
* @param[in, out] v vector
* @param[in] minVal minimum value
* @param[in] maxVal maximum value
*/
CGLM_INLINE
void
glm_ivec2_clamp(ivec2 v, int minVal, int maxVal) {
if (v[0] < minVal)
v[0] = minVal;
else if(v[0] > maxVal)
v[0] = maxVal;
if (v[1] < minVal)
v[1] = minVal;
else if(v[1] > maxVal)
v[1] = maxVal;
}
#endif /* cglm_ivec2_h */

258
include/cglm/ivec3.h Normal file
View File

@@ -0,0 +1,258 @@
/*
* 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_ivec3(ivec4 v4, ivec3 dest)
CGLM_INLINE void glm_ivec3_copy(ivec3 a, ivec3 dest)
CGLM_INLINE void glm_ivec3_zero(ivec3 v)
CGLM_INLINE void glm_ivec3_one(ivec3 v)
CGLM_INLINE void glm_ivec3_add(ivec3 a, ivec3 b, ivec3 dest)
CGLM_INLINE void glm_ivec3_adds(ivec3 v, int s, ivec3 dest)
CGLM_INLINE void glm_ivec3_sub(ivec3 a, ivec3 b, ivec3 dest)
CGLM_INLINE void glm_ivec3_subs(ivec3 v, int s, ivec3 dest)
CGLM_INLINE void glm_ivec3_mul(ivec3 a, ivec3 b, ivec3 dest)
CGLM_INLINE void glm_ivec3_scale(ivec3 v, int s, ivec3 dest)
CGLM_INLINE int glm_ivec3_distance2(ivec3 a, ivec3 b)
CGLM_INLINE float glm_ivec3_distance(ivec3 a, ivec3 b)
CGLM_INLINE void glm_ivec3_maxv(ivec3 a, ivec3 b, ivec3 dest)
CGLM_INLINE void glm_ivec3_minv(ivec3 a, ivec3 b, ivec3 dest)
CGLM_INLINE void glm_ivec3_clamp(ivec3 v, int minVal, int maxVal)
*/
#ifndef cglm_ivec3_h
#define cglm_ivec3_h
#include "common.h"
/*!
* @brief init ivec3 using ivec4
*
* @param[in] v4 vector4
* @param[out] dest destination
*/
CGLM_INLINE
void
glm_ivec3(ivec4 v4, ivec3 dest) {
dest[0] = v4[0];
dest[1] = v4[1];
dest[2] = v4[2];
}
/*!
* @brief copy all members of [a] to [dest]
*
* @param[in] a source vector
* @param[out] dest destination
*/
CGLM_INLINE
void
glm_ivec3_copy(ivec3 a, ivec3 dest) {
dest[0] = a[0];
dest[1] = a[1];
dest[2] = a[2];
}
/*!
* @brief set all members of [v] to zero
*
* @param[out] v vector
*/
CGLM_INLINE
void
glm_ivec3_zero(ivec3 v) {
v[0] = v[1] = v[2] = 0;
}
/*!
* @brief set all members of [v] to one
*
* @param[out] v vector
*/
CGLM_INLINE
void
glm_ivec3_one(ivec3 v) {
v[0] = v[1] = v[2] = 1;
}
/*!
* @brief add vector [a] to vector [b] and store result in [dest]
*
* @param[in] a first vector
* @param[in] b second vector
* @param[out] dest destination
*/
CGLM_INLINE
void
glm_ivec3_add(ivec3 a, ivec3 b, ivec3 dest) {
dest[0] = a[0] + b[0];
dest[1] = a[1] + b[1];
dest[2] = a[2] + b[2];
}
/*!
* @brief add scalar s to vector [v] and store result in [dest]
*
* @param[in] v vector
* @param[in] s scalar
* @param[out] dest destination
*/
CGLM_INLINE
void
glm_ivec3_adds(ivec3 v, int s, ivec3 dest) {
dest[0] = v[0] + s;
dest[1] = v[1] + s;
dest[2] = v[2] + s;
}
/*!
* @brief subtract vector [b] from vector [a] and store result in [dest]
*
* @param[in] a first vector
* @param[in] b second vector
* @param[out] dest destination
*/
CGLM_INLINE
void
glm_ivec3_sub(ivec3 a, ivec3 b, ivec3 dest) {
dest[0] = a[0] - b[0];
dest[1] = a[1] - b[1];
dest[2] = a[2] - b[2];
}
/*!
* @brief subtract scalar s from vector [v] and store result in [dest]
*
* @param[in] v vector
* @param[in] s scalar
* @param[out] dest destination
*/
CGLM_INLINE
void
glm_ivec3_subs(ivec3 v, int s, ivec3 dest) {
dest[0] = v[0] - s;
dest[1] = v[1] - s;
dest[2] = v[2] - s;
}
/*!
* @brief multiply vector [a] with vector [b] and store result in [dest]
*
* @param[in] a frist vector
* @param[in] b second vector
* @param[out] dest destination
*/
CGLM_INLINE
void
glm_ivec3_mul(ivec3 a, ivec3 b, ivec3 dest) {
dest[0] = a[0] * b[0];
dest[1] = a[1] * b[1];
dest[2] = a[2] * b[2];
}
/*!
* @brief multiply vector [a] with scalar s and store result in [dest]
*
* @param[in] v vector
* @param[in] s scalar
* @param[out] dest destination
*/
CGLM_INLINE
void
glm_ivec3_scale(ivec3 v, int s, ivec3 dest) {
dest[0] = v[0] * s;
dest[1] = v[1] * s;
dest[2] = v[2] * s;
}
/*!
* @brief squared distance between two vectors
*
* @param[in] a first vector
* @param[in] b second vector
* @return returns squared distance (distance * distance)
*/
CGLM_INLINE
int
glm_ivec3_distance2(ivec3 a, ivec3 b) {
int xd, yd, zd;
xd = a[0] - b[0];
yd = a[1] - b[1];
zd = a[2] - b[2];
return xd * xd + yd * yd + zd * zd;
}
/*!
* @brief distance between two vectors
*
* @param[in] a first vector
* @param[in] b second vector
* @return returns distance
*/
CGLM_INLINE
float
glm_ivec3_distance(ivec3 a, ivec3 b) {
return sqrtf((float)glm_ivec3_distance2(a, b));
}
/*!
* @brief set each member of dest to greater of vector a and b
*
* @param[in] a first vector
* @param[in] b second vector
* @param[out] dest destination
*/
CGLM_INLINE
void
glm_ivec3_maxv(ivec3 a, ivec3 b, ivec3 dest) {
dest[0] = a[0] > b[0] ? a[0] : b[0];
dest[1] = a[1] > b[1] ? a[1] : b[1];
dest[2] = a[2] > b[2] ? a[2] : b[2];
}
/*!
* @brief set each member of dest to lesser of vector a and b
*
* @param[in] a first vector
* @param[in] b second vector
* @param[out] dest destination
*/
CGLM_INLINE
void
glm_ivec3_minv(ivec3 a, ivec3 b, ivec3 dest) {
dest[0] = a[0] < b[0] ? a[0] : b[0];
dest[1] = a[1] < b[1] ? a[1] : b[1];
dest[2] = a[2] < b[2] ? a[2] : b[2];
}
/*!
* @brief clamp each member of [v] between minVal and maxVal (inclusive)
*
* @param[in, out] v vector
* @param[in] minVal minimum value
* @param[in] maxVal maximum value
*/
CGLM_INLINE
void
glm_ivec3_clamp(ivec3 v, int minVal, int maxVal) {
if (v[0] < minVal)
v[0] = minVal;
else if(v[0] > maxVal)
v[0] = maxVal;
if (v[1] < minVal)
v[1] = minVal;
else if(v[1] > maxVal)
v[1] = maxVal;
if (v[2] < minVal)
v[2] = minVal;
else if(v[2] > maxVal)
v[2] = maxVal;
}
#endif /* cglm_ivec3_h */

275
include/cglm/ivec4.h Normal file
View File

@@ -0,0 +1,275 @@
/*
* 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_ivec4(ivec3 v3, int last, ivec4 dest)
CGLM_INLINE void glm_ivec4_copy(ivec4 a, ivec4 dest)
CGLM_INLINE void glm_ivec4_zero(ivec4 v)
CGLM_INLINE void glm_ivec4_one(ivec4 v)
CGLM_INLINE void glm_ivec4_add(ivec4 a, ivec4 b, ivec4 dest)
CGLM_INLINE void glm_ivec4_adds(ivec4 v, int s, ivec4 dest)
CGLM_INLINE void glm_ivec4_sub(ivec4 a, ivec4 b, ivec4 dest)
CGLM_INLINE void glm_ivec4_subs(ivec4 v, int s, ivec4 dest)
CGLM_INLINE void glm_ivec4_mul(ivec4 a, ivec4 b, ivec4 dest)
CGLM_INLINE void glm_ivec4_scale(ivec4 v, int s, ivec4 dest)
CGLM_INLINE int glm_ivec4_distance2(ivec4 a, ivec4 b)
CGLM_INLINE float glm_ivec4_distance(ivec4 a, ivec4 b)
CGLM_INLINE void glm_ivec4_maxv(ivec4 a, ivec4 b, ivec4 dest)
CGLM_INLINE void glm_ivec4_minv(ivec4 a, ivec4 b, ivec4 dest)
CGLM_INLINE void glm_ivec4_clamp(ivec4 v, int minVal, int maxVal)
*/
#ifndef cglm_ivec4_h
#define cglm_ivec4_h
#include "common.h"
/*!
* @brief init ivec4 using ivec3
*
* @param[in] v3 vector3
* @param[in] last last item
* @param[out] dest destination
*/
CGLM_INLINE
void
glm_ivec4(ivec3 v3, int last, ivec4 dest) {
dest[0] = v3[0];
dest[1] = v3[1];
dest[2] = v3[2];
dest[3] = last;
}
/*!
* @brief copy all members of [a] to [dest]
*
* @param[in] a source vector
* @param[out] dest destination
*/
CGLM_INLINE
void
glm_ivec4_copy(ivec4 a, ivec4 dest) {
dest[0] = a[0];
dest[1] = a[1];
dest[2] = a[2];
dest[3] = a[3];
}
/*!
* @brief set all members of [v] to zero
*
* @param[out] v vector
*/
CGLM_INLINE
void
glm_ivec4_zero(ivec4 v) {
v[0] = v[1] = v[2] = v[3] = 0;
}
/*!
* @brief set all members of [v] to one
*
* @param[out] v vector
*/
CGLM_INLINE
void
glm_ivec4_one(ivec4 v) {
v[0] = v[1] = v[2] = v[3] = 1;
}
/*!
* @brief add vector [a] to vector [b] and store result in [dest]
*
* @param[in] a first vector
* @param[in] b second vector
* @param[out] dest destination
*/
CGLM_INLINE
void
glm_ivec4_add(ivec4 a, ivec4 b, ivec4 dest) {
dest[0] = a[0] + b[0];
dest[1] = a[1] + b[1];
dest[2] = a[2] + b[2];
dest[3] = a[3] + b[3];
}
/*!
* @brief add scalar s to vector [v] and store result in [dest]
*
* @param[in] v vector
* @param[in] s scalar
* @param[out] dest destination
*/
CGLM_INLINE
void
glm_ivec4_adds(ivec4 v, int s, ivec4 dest) {
dest[0] = v[0] + s;
dest[1] = v[1] + s;
dest[2] = v[2] + s;
dest[3] = v[3] + s;
}
/*!
* @brief subtract vector [b] from vector [a] and store result in [dest]
*
* @param[in] a first vector
* @param[in] b second vector
* @param[out] dest destination
*/
CGLM_INLINE
void
glm_ivec4_sub(ivec4 a, ivec4 b, ivec4 dest) {
dest[0] = a[0] - b[0];
dest[1] = a[1] - b[1];
dest[2] = a[2] - b[2];
dest[3] = a[3] - b[3];
}
/*!
* @brief subtract scalar s from vector [v] and store result in [dest]
*
* @param[in] v vector
* @param[in] s scalar
* @param[out] dest destination
*/
CGLM_INLINE
void
glm_ivec4_subs(ivec4 v, int s, ivec4 dest) {
dest[0] = v[0] - s;
dest[1] = v[1] - s;
dest[2] = v[2] - s;
dest[3] = v[3] - s;
}
/*!
* @brief multiply vector [a] with vector [b] and store result in [dest]
*
* @param[in] a frist vector
* @param[in] b second vector
* @param[out] dest destination
*/
CGLM_INLINE
void
glm_ivec4_mul(ivec4 a, ivec4 b, ivec4 dest) {
dest[0] = a[0] * b[0];
dest[1] = a[1] * b[1];
dest[2] = a[2] * b[2];
dest[3] = a[3] * b[3];
}
/*!
* @brief multiply vector [a] with scalar s and store result in [dest]
*
* @param[in] v vector
* @param[in] s scalar
* @param[out] dest destination
*/
CGLM_INLINE
void
glm_ivec4_scale(ivec4 v, int s, ivec4 dest) {
dest[0] = v[0] * s;
dest[1] = v[1] * s;
dest[2] = v[2] * s;
dest[3] = v[3] * s;
}
/*!
* @brief squared distance between two vectors
*
* @param[in] a first vector
* @param[in] b second vector
* @return returns squared distance (distance * distance)
*/
CGLM_INLINE
int
glm_ivec4_distance2(ivec4 a, ivec4 b) {
int xd, yd, zd, wd;
xd = a[0] - b[0];
yd = a[1] - b[1];
zd = a[2] - b[2];
wd = a[3] - b[3];
return xd * xd + yd * yd + zd * zd + wd * wd;
}
/*!
* @brief distance between two vectors
*
* @param[in] a first vector
* @param[in] b second vector
* @return returns distance
*/
CGLM_INLINE
float
glm_ivec4_distance(ivec4 a, ivec4 b) {
return sqrtf((float)glm_ivec4_distance2(a, b));
}
/*!
* @brief set each member of dest to greater of vector a and b
*
* @param[in] a first vector
* @param[in] b second vector
* @param[out] dest destination
*/
CGLM_INLINE
void
glm_ivec4_maxv(ivec4 a, ivec4 b, ivec4 dest) {
dest[0] = a[0] > b[0] ? a[0] : b[0];
dest[1] = a[1] > b[1] ? a[1] : b[1];
dest[2] = a[2] > b[2] ? a[2] : b[2];
dest[3] = a[3] > b[3] ? a[3] : b[3];
}
/*!
* @brief set each member of dest to lesser of vector a and b
*
* @param[in] a first vector
* @param[in] b second vector
* @param[out] dest destination
*/
CGLM_INLINE
void
glm_ivec4_minv(ivec4 a, ivec4 b, ivec4 dest) {
dest[0] = a[0] < b[0] ? a[0] : b[0];
dest[1] = a[1] < b[1] ? a[1] : b[1];
dest[2] = a[2] < b[2] ? a[2] : b[2];
dest[3] = a[3] < b[3] ? a[3] : b[3];
}
/*!
* @brief clamp each member of [v] between minVal and maxVal (inclusive)
*
* @param[in, out] v vector
* @param[in] minVal minimum value
* @param[in] maxVal maximum value
*/
CGLM_INLINE
void
glm_ivec4_clamp(ivec4 v, int minVal, int maxVal) {
if (v[0] < minVal)
v[0] = minVal;
else if(v[0] > maxVal)
v[0] = maxVal;
if (v[1] < minVal)
v[1] = minVal;
else if(v[1] > maxVal)
v[1] = maxVal;
if (v[2] < minVal)
v[2] = minVal;
else if(v[2] > maxVal)
v[2] = maxVal;
if (v[3] < minVal)
v[3] = minVal;
else if(v[3] > maxVal)
v[3] = maxVal;
}
#endif /* cglm_ivec4_h */

View File

@@ -114,6 +114,28 @@ glm_project(vec3 pos, mat4 m, vec4 vp, vec3 dest) {
#endif #endif
} }
/*!
* @brief map object's z coordinate to window coordinates
*
* Computing MVP:
* glm_mat4_mul(proj, view, viewProj);
* glm_mat4_mul(viewProj, model, MVP);
*
* @param[in] v object coordinates
* @param[in] m MVP matrix
*
* @returns projected z coordinate
*/
CGLM_INLINE
float
glm_project_z(vec3 v, mat4 m) {
#if CGLM_CONFIG_CLIP_CONTROL & CGLM_CLIP_CONTROL_ZO_BIT
return glm_project_z_zo(v, m);
#elif CGLM_CONFIG_CLIP_CONTROL & CGLM_CLIP_CONTROL_NO_BIT
return glm_project_z_no(v, m);
#endif
}
/*! /*!
* @brief define a picking region * @brief define a picking region
* *
@@ -124,7 +146,7 @@ glm_project(vec3 pos, mat4 m, vec4 vp, vec3 dest) {
*/ */
CGLM_INLINE CGLM_INLINE
void void
glm_pickmatrix(vec3 center, vec2 size, vec4 vp, mat4 dest) { glm_pickmatrix(vec2 center, vec2 size, vec4 vp, mat4 dest) {
mat4 res; mat4 res;
vec3 v; vec3 v;

View File

@@ -34,7 +34,7 @@
#endif #endif
#if defined(__SSE3__) #if defined(__SSE3__)
# include <x86intrin.h> # include <pmmintrin.h>
# ifndef CGLM_SIMD_x86 # ifndef CGLM_SIMD_x86
# define CGLM_SIMD_x86 # define CGLM_SIMD_x86
# endif # endif

View File

@@ -86,13 +86,12 @@ CGLM_INLINE
void void
glm_inv_tr_neon(mat4 mat) { glm_inv_tr_neon(mat4 mat) {
float32x4x4_t vmat; float32x4x4_t vmat;
glmm_128 r0, r1, r2, r3, x0; glmm_128 r0, r1, r2, x0;
vmat = vld4q_f32(mat[0]); vmat = vld4q_f32(mat[0]);
r0 = vmat.val[0]; r0 = vmat.val[0];
r1 = vmat.val[1]; r1 = vmat.val[1];
r2 = vmat.val[2]; r2 = vmat.val[2];
r3 = vmat.val[3];
x0 = glmm_fmadd(r0, glmm_splat_w(r0), x0 = glmm_fmadd(r0, glmm_splat_w(r0),
glmm_fmadd(r1, glmm_splat_w(r1), glmm_fmadd(r1, glmm_splat_w(r1),

View File

@@ -23,6 +23,7 @@
CGLM_INLINE mat4s glms_rotate(mat4s m, float angle, vec3s axis); CGLM_INLINE mat4s glms_rotate(mat4s m, float angle, vec3s axis);
CGLM_INLINE mat4s glms_rotate_at(mat4s m, vec3s pivot, float angle, vec3s axis); CGLM_INLINE mat4s glms_rotate_at(mat4s m, vec3s pivot, float angle, vec3s axis);
CGLM_INLINE mat4s glms_rotate_atm(mat4s m, vec3s pivot, float angle, vec3s axis); CGLM_INLINE mat4s glms_rotate_atm(mat4s m, vec3s pivot, float angle, vec3s axis);
CGLM_INLINE mat4s glms_spin(mat4s m, float angle, vec3s axis);
CGLM_INLINE vec3s glms_decompose_scalev(mat4s m); CGLM_INLINE vec3s glms_decompose_scalev(mat4s m);
CGLM_INLINE bool glms_uniscaled(mat4s m); CGLM_INLINE bool glms_uniscaled(mat4s m);
CGLM_INLINE void glms_decompose_rs(mat4s m, mat4s * r, vec3s * s); CGLM_INLINE void glms_decompose_rs(mat4s m, mat4s * r, vec3s * s);
@@ -226,7 +227,7 @@ glms_rotate_make(float angle, vec3s axis) {
* @param[in] m affine transfrom * @param[in] m affine transfrom
* @param[in] angle angle (radians) * @param[in] angle angle (radians)
* @param[in] axis axis * @param[in] axis axis
* @returns affine transfrom * @returns affine transfrom
*/ */
CGLM_INLINE CGLM_INLINE
mat4s mat4s
@@ -273,6 +274,21 @@ glms_rotate_atm(mat4s m, vec3s pivot, float angle, vec3s axis) {
return m; return m;
} }
/*!
* @brief rotate existing transform matrix around given axis by angle around self (doesn't affected by position)
*
* @param[in] m affine transfrom
* @param[in] angle angle (radians)
* @param[in] axis axis
* @returns affine transfrom
*/
CGLM_INLINE
mat4s
glms_spin(mat4s m, float angle, vec3s axis) {
glm_spin(m.raw, angle, axis.raw);
return m;
}
/*! /*!
* @brief decompose scale vector * @brief decompose scale vector
* *

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -0,0 +1,96 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
/*
Functions:
CGLM_INLINE vec3s glms_unprojecti_no(vec3s pos, mat4s invMat, vec4s vp, vec3 dest)
CGLM_INLINE vec3s glms_project_no(vec3s pos, mat4s m, vec4s vp, vec3s dest)
*/
#ifndef cglms_project_no_h
#define cglms_project_no_h
#include "../../common.h"
#include "../../types-struct.h"
#include "../../plane.h"
#include "../../cam.h"
/*!
* @brief maps the specified viewport coordinates into specified space [1]
* the matrix should contain projection matrix.
*
* if you don't have ( and don't want to have ) an inverse matrix then use
* glm_unproject version. You may use existing inverse of matrix in somewhere
* else, this is why glm_unprojecti exists to save save inversion cost
*
* [1] space:
* 1- if m = invProj: View Space
* 2- if m = invViewProj: World Space
* 3- if m = invMVP: Object Space
*
* You probably want to map the coordinates into object space
* so use invMVP as m
*
* Computing viewProj:
* glm_mat4_mul(proj, view, viewProj);
* glm_mat4_mul(viewProj, model, MVP);
* glm_mat4_inv(viewProj, invMVP);
*
* @param[in] pos point/position in viewport coordinates
* @param[in] invMat matrix (see brief)
* @param[in] vp viewport as [x, y, width, height]
*
* @returns unprojected coordinates
*/
CGLM_INLINE
vec3s
glms_unprojecti_no(vec3s pos, mat4s invMat, vec4s vp, vec3 dest) {
vec3s dest;
glm_unprojecti_no(pos.raw, invMat.raw, vp.raw, dest.raw);
return dest;
}
/*!
* @brief map object coordinates to window coordinates
*
* Computing MVP:
* glm_mat4_mul(proj, view, viewProj);
* glm_mat4_mul(viewProj, model, MVP);
*
* @param[in] pos object coordinates
* @param[in] m MVP matrix
* @param[in] vp viewport as [x, y, width, height]
*
* @returns projected coordinates
*/
CGLM_INLINE
vec3s
glms_project_no(vec3s pos, mat4s m, vec4s vp, vec3s dest) {
vec3s dest;
glm_project_no(pos.raw, m.raw, vp.raw, dest.raw);
return dest;
}
/*!
* @brief map object's z coordinate to window coordinates
*
* Computing MVP:
* glm_mat4_mul(proj, view, viewProj);
* glm_mat4_mul(viewProj, model, MVP);
*
* @param[in] v object coordinates
* @param[in] m MVP matrix
*
* @returns projected z coordinate
*/
CGLM_INLINE
vec3s
glms_project_z_no(vec3s v, mat4s m) {
return glm_project_z_no(v.raw, m.raw);
}
#endif /* cglms_project_rh_no_h */

View File

@@ -0,0 +1,96 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
/*
Functions:
CGLM_INLINE vec3s glms_unprojecti_no(vec3s pos, mat4s invMat, vec4s vp, vec3 dest)
CGLM_INLINE vec3s glms_project_no(vec3s pos, mat4s m, vec4s vp, vec3s dest)
*/
#ifndef cglms_project_zo_h
#define cglms_project_zo_h
#include "../../common.h"
#include "../../types-struct.h"
#include "../../plane.h"
#include "../../cam.h"
/*!
* @brief maps the specified viewport coordinates into specified space [1]
* the matrix should contain projection matrix.
*
* if you don't have ( and don't want to have ) an inverse matrix then use
* glm_unproject version. You may use existing inverse of matrix in somewhere
* else, this is why glm_unprojecti exists to save save inversion cost
*
* [1] space:
* 1- if m = invProj: View Space
* 2- if m = invViewProj: World Space
* 3- if m = invMVP: Object Space
*
* You probably want to map the coordinates into object space
* so use invMVP as m
*
* Computing viewProj:
* glm_mat4_mul(proj, view, viewProj);
* glm_mat4_mul(viewProj, model, MVP);
* glm_mat4_inv(viewProj, invMVP);
*
* @param[in] pos point/position in viewport coordinates
* @param[in] invMat matrix (see brief)
* @param[in] vp viewport as [x, y, width, height]
*
* @returns unprojected coordinates
*/
CGLM_INLINE
vec3s
glms_unprojecti_zo(vec3s pos, mat4s invMat, vec4s vp, vec3 dest) {
vec3s dest;
glm_unprojecti_zo(pos.raw, invMat.raw, vp.raw, dest.raw);
return dest;
}
/*!
* @brief map object coordinates to window coordinates
*
* Computing MVP:
* glm_mat4_mul(proj, view, viewProj);
* glm_mat4_mul(viewProj, model, MVP);
*
* @param[in] pos object coordinates
* @param[in] m MVP matrix
* @param[in] vp viewport as [x, y, width, height]
*
* @returns projected coordinates
*/
CGLM_INLINE
vec3s
glms_project_zo(vec3s pos, mat4s m, vec4s vp, vec3 dest) {
vec3s dest;
glm_project_zo(pos.raw, m.raw, vp.raw, dest.raw);
return dest;
}
/*!
* @brief map object's z coordinate to window coordinates
*
* Computing MVP:
* glm_mat4_mul(proj, view, viewProj);
* glm_mat4_mul(viewProj, model, MVP);
*
* @param[in] v object coordinates
* @param[in] m MVP matrix
*
* @returns projected z coordinate
*/
CGLM_INLINE
vec3s
glms_project_z_zo(vec3s v, mat4s m) {
return glm_project_z_zo(v.raw, m.raw);
}
#endif /* cglm_project_zo_h */

View File

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

View File

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

View File

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

View File

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

View File

@@ -111,7 +111,7 @@ glms_project(vec3s pos, mat4s m, vec4s vp) {
*/ */
CGLM_INLINE CGLM_INLINE
mat4s mat4s
glms_pickmatrix(vec3s center, vec2s size, vec4s vp) { glms_pickmatrix(vec2s center, vec2s size, vec4s vp) {
mat4s res; mat4s res;
glm_pickmatrix(center.raw, size.raw, vp.raw, res.raw); glm_pickmatrix(center.raw, size.raw, vp.raw, res.raw);
return res; return res;

View File

@@ -195,4 +195,45 @@ glms_vec2_sqrt(vec2s v) {
return r; return r;
} }
/*!
* @brief treat vectors as complex numbers and multiply them as such.
*
* @param[in] a left number
* @param[in] b right number
* @param[out] dest destination number
*/
CGLM_INLINE
vec2s
glms_vec2_complex_mul(vec2s a, vec2s b, vec2s dest) {
glm_vec2_complex_mul(a.raw, b.raw, dest.raw);
return dest;
}
/*!
* @brief treat vectors as complex numbers and divide them as such.
*
* @param[in] a left number (numerator)
* @param[in] b right number (denominator)
* @param[out] dest destination number
*/
CGLM_INLINE
vec2s
glms_vec2_complex_div(vec2s a, vec2s b, vec2s dest) {
glm_vec2_complex_div(a.raw, b.raw, dest.raw);
return dest;
}
/*!
* @brief treat the vector as a complex number and conjugate it as such.
*
* @param[in] a the number
* @param[out] dest destination number
*/
CGLM_INLINE
vec2s
glms_vec2_complex_conjugate(vec2s a, vec2s dest) {
glm_vec2_complex_conjugate(a.raw, dest.raw);
return dest;
}
#endif /* cglms_vec2s_ext_h */ #endif /* cglms_vec2s_ext_h */

View File

@@ -47,6 +47,21 @@ typedef union vec2s {
float x; float x;
float y; float y;
}; };
struct {
float r;
float i;
};
struct {
float u;
float v;
};
struct {
float s;
float t;
};
#endif #endif
} vec2s; } vec2s;
@@ -58,9 +73,40 @@ typedef union vec3s {
float y; float y;
float z; float z;
}; };
struct {
float r;
float g;
float b;
};
#endif #endif
} vec3s; } vec3s;
typedef union ivec2s {
ivec2 raw;
#if CGLM_USE_ANONYMOUS_STRUCT
struct {
int x;
int y;
};
struct {
int r;
int i;
};
struct {
int u;
int v;
};
struct {
int s;
int t;
};
#endif
} ivec2s;
typedef union ivec3s { typedef union ivec3s {
ivec3 raw; ivec3 raw;
#if CGLM_USE_ANONYMOUS_STRUCT #if CGLM_USE_ANONYMOUS_STRUCT
@@ -69,9 +115,34 @@ typedef union ivec3s {
int y; int y;
int z; int z;
}; };
struct {
int r;
int g;
int b;
};
#endif #endif
} ivec3s; } ivec3s;
typedef union ivec4s {
ivec4 raw;
#if CGLM_USE_ANONYMOUS_STRUCT
struct {
int x;
int y;
int z;
int w;
};
struct {
int r;
int g;
int b;
int a;
};
#endif
} ivec4s;
typedef union CGLM_ALIGN_IF(16) vec4s { typedef union CGLM_ALIGN_IF(16) vec4s {
vec4 raw; vec4 raw;
#if CGLM_USE_ANONYMOUS_STRUCT #if CGLM_USE_ANONYMOUS_STRUCT
@@ -81,6 +152,13 @@ typedef union CGLM_ALIGN_IF(16) vec4s {
float z; float z;
float w; float w;
}; };
struct {
float r;
float g;
float b;
float a;
};
#endif #endif
} vec4s; } vec4s;

View File

@@ -42,9 +42,12 @@
#define CGLM_CASTPTR_ASSUME_ALIGNED(expr, type) \ #define CGLM_CASTPTR_ASSUME_ALIGNED(expr, type) \
((type*)CGLM_ASSUME_ALIGNED((expr), __alignof__(type))) ((type*)CGLM_ASSUME_ALIGNED((expr), __alignof__(type)))
typedef int ivec2[2];
typedef int ivec3[3];
typedef int ivec4[4];
typedef float vec2[2]; typedef float vec2[2];
typedef float vec3[3]; typedef float vec3[3];
typedef int ivec3[3];
typedef CGLM_ALIGN_IF(16) float vec4[4]; typedef CGLM_ALIGN_IF(16) float vec4[4];
typedef vec4 versor; /* |x, y, z, w| -> w is the last */ typedef vec4 versor; /* |x, y, z, w| -> w is the last */
typedef vec3 mat3[3]; typedef vec3 mat3[3];

View File

@@ -20,6 +20,9 @@
CGLM_INLINE bool glm_vec2_isvalid(vec2 v); CGLM_INLINE bool glm_vec2_isvalid(vec2 v);
CGLM_INLINE void glm_vec2_sign(vec2 v, vec2 dest); CGLM_INLINE void glm_vec2_sign(vec2 v, vec2 dest);
CGLM_INLINE void glm_vec2_sqrt(vec2 v, vec2 dest); CGLM_INLINE void glm_vec2_sqrt(vec2 v, vec2 dest);
CGLM_INLINE void glm_vec2_complex_mul(vec2 a, vec2 b, vec2 dest)
CGLM_INLINE void glm_vec2_complex_div(vec2 a, vec2 b, vec2 dest)
CGLM_INLINE void glm_vec2_complex_conjugate(vec2 a, vec2 dest)
*/ */
#ifndef cglm_vec2_ext_h #ifndef cglm_vec2_ext_h
@@ -186,4 +189,53 @@ glm_vec2_sqrt(vec2 v, vec2 dest) {
dest[1] = sqrtf(v[1]); dest[1] = sqrtf(v[1]);
} }
/*!
* @brief treat vectors as complex numbers and multiply them as such.
*
* @param[in] a left number
* @param[in] b right number
* @param[out] dest destination number
*/
CGLM_INLINE
void
glm_vec2_complex_mul(vec2 a, vec2 b, vec2 dest) {
float tr, ti;
tr = a[0] * b[0] - a[1] * b[1];
ti = a[0] * b[1] + a[1] * b[0];
dest[0] = tr;
dest[1] = ti;
}
/*!
* @brief treat vectors as complex numbers and divide them as such.
*
* @param[in] a left number (numerator)
* @param[in] b right number (denominator)
* @param[out] dest destination number
*/
CGLM_INLINE
void
glm_vec2_complex_div(vec2 a, vec2 b, vec2 dest) {
float tr, ti;
float const ibnorm2 = 1.0f / (b[0] * b[0] + b[1] * b[1]);
tr = ibnorm2 * (a[0] * b[0] + a[1] * b[1]);
ti = ibnorm2 * (a[1] * b[0] - a[0] * b[1]);
dest[0] = tr;
dest[1] = ti;
}
/*!
* @brief treat the vector as a complex number and conjugate it as such.
*
* @param[in] a the number
* @param[out] dest destination number
*/
CGLM_INLINE
void
glm_vec2_complex_conjugate(vec2 a, vec2 dest) {
dest[0] = a[0];
dest[1] = -a[1];
}
#endif /* cglm_vec2_ext_h */ #endif /* cglm_vec2_ext_h */

View File

@@ -10,6 +10,6 @@
#define CGLM_VERSION_MAJOR 0 #define CGLM_VERSION_MAJOR 0
#define CGLM_VERSION_MINOR 8 #define CGLM_VERSION_MINOR 8
#define CGLM_VERSION_PATCH 3 #define CGLM_VERSION_PATCH 6
#endif /* cglm_version_h */ #endif /* cglm_version_h */

View File

@@ -1,5 +1,5 @@
project('cglm', 'c', project('cglm', 'c',
version : '0.8.3', version : '0.8.6',
license : 'mit', license : 'mit',
default_options : [ default_options : [
'c_std=c11', 'c_std=c11',
@@ -28,27 +28,30 @@ endif
cglm_inc = include_directories('include') cglm_inc = include_directories('include')
cglm_src = files( 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/euler.c',
'src/frustum.c', 'src/affine.c',
'src/io.c', 'src/io.c',
'src/quat.c',
'src/cam.c',
'src/vec2.c',
'src/ivec2.c',
'src/vec3.c',
'src/ivec3.c',
'src/vec4.c',
'src/ivec4.c',
'src/mat2.c', 'src/mat2.c',
'src/mat3.c', 'src/mat3.c',
'src/mat4.c', 'src/mat4.c',
'src/plane.c', 'src/plane.c',
'src/frustum.c',
'src/box.c',
'src/project.c', 'src/project.c',
'src/quat.c',
'src/ray.c',
'src/sphere.c', 'src/sphere.c',
'src/vec2.c', 'src/ease.c',
'src/vec3.c', 'src/curve.c',
'src/vec4.c', 'src/bezier.c',
'src/ray.c',
'src/affine2d.c',
'src/clipspace/ortho_lh_no.c', 'src/clipspace/ortho_lh_no.c',
'src/clipspace/ortho_lh_zo.c', 'src/clipspace/ortho_lh_zo.c',
'src/clipspace/ortho_rh_no.c', 'src/clipspace/ortho_rh_no.c',
@@ -61,6 +64,8 @@ cglm_src = files(
'src/clipspace/view_lh_zo.c', 'src/clipspace/view_lh_zo.c',
'src/clipspace/view_rh_no.c', 'src/clipspace/view_rh_no.c',
'src/clipspace/view_rh_zo.c', 'src/clipspace/view_rh_zo.c',
'src/clipspace/project_no.c',
'src/clipspace/project_zo.c'
) )
cglm_lib = library('cglm', cglm_lib = library('cglm',

View File

@@ -110,6 +110,12 @@ glmc_rotate_atm(mat4 m, vec3 pivot, float angle, vec3 axis) {
glm_rotate_atm(m, pivot, angle, axis); glm_rotate_atm(m, pivot, angle, axis);
} }
CGLM_EXPORT
void
glmc_spin(mat4 m, float angle, vec3 axis) {
glm_spin(m, angle, axis);
}
CGLM_EXPORT CGLM_EXPORT
void void
glmc_decompose_scalev(mat4 m, vec3 s) { glmc_decompose_scalev(mat4 m, vec3 s) {
@@ -128,6 +134,72 @@ glmc_decompose_rs(mat4 m, mat4 r, vec3 s) {
glm_decompose_rs(m, r, s); glm_decompose_rs(m, r, s);
} }
CGLM_EXPORT
void
glmc_translated(mat4 m, vec3 v) {
glm_translated(m, v);
}
CGLM_EXPORT
void
glmc_translated_to(mat4 m, vec3 v, mat4 dest) {
glm_translated_to(m, v, dest);
}
CGLM_EXPORT
void
glmc_translated_x(mat4 m, float x) {
glm_translated_x(m, x);
}
CGLM_EXPORT
void
glmc_translated_y(mat4 m, float y) {
glm_translated_y(m, y);
}
CGLM_EXPORT
void
glmc_translated_z(mat4 m, float z) {
glm_translated_z(m, z);
}
CGLM_EXPORT
void
glmc_rotated_x(mat4 m, float angle, mat4 dest) {
glm_rotated_x(m, angle, dest);
}
CGLM_EXPORT
void
glmc_rotated_y(mat4 m, float angle, mat4 dest) {
glm_rotated_y(m, angle, dest);
}
CGLM_EXPORT
void
glmc_rotated_z(mat4 m, float angle, mat4 dest) {
glm_rotated_z(m, angle, dest);
}
CGLM_EXPORT
void
glmc_rotated(mat4 m, float angle, vec3 axis) {
glm_rotated(m, angle, axis);
}
CGLM_EXPORT
void
glmc_rotated_at(mat4 m, vec3 pivot, float angle, vec3 axis) {
glm_rotated_at(m, pivot, angle, axis);
}
CGLM_EXPORT
void
glmc_spinned(mat4 m, float angle, vec3 axis) {
glm_spinned(m, angle, axis);
}
CGLM_EXPORT CGLM_EXPORT
void void
glmc_decompose(mat4 m, vec4 t, mat4 r, vec3 s) { glmc_decompose(mat4 m, vec4 t, mat4 r, vec3 s) {

View File

@@ -19,3 +19,9 @@ void
glmc_project_no(vec3 pos, mat4 m, vec4 vp, vec3 dest) { glmc_project_no(vec3 pos, mat4 m, vec4 vp, vec3 dest) {
glm_project_no(pos, m, vp, dest); glm_project_no(pos, m, vp, dest);
} }
CGLM_EXPORT
float
glmc_project_z_no(vec3 pos, mat4 m) {
return glm_project_z_no(pos, m);
}

View File

@@ -19,3 +19,9 @@ void
glmc_project_zo(vec3 pos, mat4 m, vec4 vp, vec3 dest) { glmc_project_zo(vec3 pos, mat4 m, vec4 vp, vec3 dest) {
glm_project_zo(pos, m, vp, dest); glm_project_zo(pos, m, vp, dest);
} }
CGLM_EXPORT
float
glmc_project_z_zo(vec3 pos, mat4 m) {
return glm_project_z_zo(pos, m);
}

99
src/ivec2.c Normal file
View File

@@ -0,0 +1,99 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#include "../include/cglm/cglm.h"
#include "../include/cglm/call.h"
CGLM_EXPORT
void
glmc_ivec2(int * __restrict v, ivec2 dest) {
glm_ivec2(v, dest);
}
CGLM_EXPORT
void
glmc_ivec2_copy(ivec2 a, ivec2 dest) {
glm_ivec2_copy(a, dest);
}
CGLM_EXPORT
void
glmc_ivec2_zero(ivec2 v) {
glm_ivec2_zero(v);
}
CGLM_EXPORT
void
glmc_ivec2_one(ivec2 v) {
glm_ivec2_one(v);
}
CGLM_EXPORT
void
glmc_ivec2_add(ivec2 a, ivec2 b, ivec2 dest) {
glm_ivec2_add(a, b, dest);
}
CGLM_EXPORT
void
glmc_ivec2_adds(ivec2 v, int s, ivec2 dest) {
glm_ivec2_adds(v, s, dest);
}
CGLM_EXPORT
void
glmc_ivec2_sub(ivec2 a, ivec2 b, ivec2 dest) {
glm_ivec2_sub(a, b, dest);
}
CGLM_EXPORT
void
glmc_ivec2_subs(ivec2 v, int s, ivec2 dest) {
glm_ivec2_subs(v, s, dest);
}
CGLM_EXPORT
void
glmc_ivec2_mul(ivec2 a, ivec2 b, ivec2 dest) {
glm_ivec2_mul(a, b, dest);
}
CGLM_EXPORT
void
glmc_ivec2_scale(ivec2 v, int s, ivec2 dest) {
glm_ivec2_scale(v, s, dest);
}
CGLM_EXPORT
int
glmc_ivec2_distance2(ivec2 a, ivec2 b) {
return glm_ivec2_distance2(a, b);
}
CGLM_EXPORT
float
glmc_ivec2_distance(ivec2 a, ivec2 b) {
return glm_ivec2_distance(a, b);
}
CGLM_EXPORT
void
glmc_ivec2_maxv(ivec2 a, ivec2 b, ivec2 dest) {
glm_ivec2_maxv(a, b, dest);
}
CGLM_EXPORT
void
glmc_ivec2_minv(ivec2 a, ivec2 b, ivec2 dest) {
glm_ivec2_minv(a, b, dest);
}
CGLM_EXPORT
void
glmc_ivec2_clamp(ivec2 v, int minVal, int maxVal) {
glm_ivec2_clamp(v, minVal, maxVal);
}

99
src/ivec3.c Normal file
View File

@@ -0,0 +1,99 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#include "../include/cglm/cglm.h"
#include "../include/cglm/call.h"
CGLM_EXPORT
void
glmc_ivec3(ivec4 v4, ivec3 dest) {
glm_ivec3(v4, dest);
}
CGLM_EXPORT
void
glmc_ivec3_copy(ivec3 a, ivec3 dest) {
glm_ivec3_copy(a, dest);
}
CGLM_EXPORT
void
glmc_ivec3_zero(ivec3 v) {
glm_ivec3_zero(v);
}
CGLM_EXPORT
void
glmc_ivec3_one(ivec3 v) {
glm_ivec3_one(v);
}
CGLM_EXPORT
void
glmc_ivec3_add(ivec3 a, ivec3 b, ivec3 dest) {
glm_ivec3_add(a, b, dest);
}
CGLM_EXPORT
void
glmc_ivec3_adds(ivec3 v, int s, ivec3 dest) {
glm_ivec3_adds(v, s, dest);
}
CGLM_EXPORT
void
glmc_ivec3_sub(ivec3 a, ivec3 b, ivec3 dest) {
glm_ivec3_sub(a, b, dest);
}
CGLM_EXPORT
void
glmc_ivec3_subs(ivec3 v, int s, ivec3 dest) {
glm_ivec3_subs(v, s, dest);
}
CGLM_EXPORT
void
glmc_ivec3_mul(ivec3 a, ivec3 b, ivec3 dest) {
glm_ivec3_mul(a, b, dest);
}
CGLM_EXPORT
void
glmc_ivec3_scale(ivec3 v, int s, ivec3 dest) {
glm_ivec3_scale(v, s, dest);
}
CGLM_EXPORT
int
glmc_ivec3_distance2(ivec3 a, ivec3 b) {
return glm_ivec3_distance2(a, b);
}
CGLM_EXPORT
float
glmc_ivec3_distance(ivec3 a, ivec3 b) {
return glm_ivec3_distance(a, b);
}
CGLM_EXPORT
void
glmc_ivec3_maxv(ivec3 a, ivec3 b, ivec3 dest) {
glm_ivec3_maxv(a, b, dest);
}
CGLM_EXPORT
void
glmc_ivec3_minv(ivec3 a, ivec3 b, ivec3 dest) {
glm_ivec3_minv(a, b, dest);
}
CGLM_EXPORT
void
glmc_ivec3_clamp(ivec3 v, int minVal, int maxVal) {
glm_ivec3_clamp(v, minVal, maxVal);
}

99
src/ivec4.c Normal file
View File

@@ -0,0 +1,99 @@
/*
* Copyright (c), Recep Aslantas.
*
* MIT License (MIT), http://opensource.org/licenses/MIT
* Full license can be found in the LICENSE file
*/
#include "../include/cglm/cglm.h"
#include "../include/cglm/call.h"
CGLM_EXPORT
void
glmc_ivec4(ivec3 v3, int last, ivec4 dest) {
glm_ivec4(v3, last, dest);
}
CGLM_EXPORT
void
glmc_ivec4_copy(ivec4 a, ivec4 dest) {
glm_ivec4_copy(a, dest);
}
CGLM_EXPORT
void
glmc_ivec4_zero(ivec4 v) {
glm_ivec4_zero(v);
}
CGLM_EXPORT
void
glmc_ivec4_one(ivec4 v) {
glm_ivec4_one(v);
}
CGLM_EXPORT
void
glmc_ivec4_add(ivec4 a, ivec4 b, ivec4 dest) {
glm_ivec4_add(a, b, dest);
}
CGLM_EXPORT
void
glmc_ivec4_adds(ivec4 v, int s, ivec4 dest) {
glm_ivec4_adds(v, s, dest);
}
CGLM_EXPORT
void
glmc_ivec4_sub(ivec4 a, ivec4 b, ivec4 dest) {
glm_ivec4_sub(a, b, dest);
}
CGLM_EXPORT
void
glmc_ivec4_subs(ivec4 v, int s, ivec4 dest) {
glm_ivec4_subs(v, s, dest);
}
CGLM_EXPORT
void
glmc_ivec4_mul(ivec4 a, ivec4 b, ivec4 dest) {
glm_ivec4_mul(a, b, dest);
}
CGLM_EXPORT
void
glmc_ivec4_scale(ivec4 v, int s, ivec4 dest) {
glm_ivec4_scale(v, s, dest);
}
CGLM_EXPORT
int
glmc_ivec4_distance2(ivec4 a, ivec4 b) {
return glm_ivec4_distance2(a, b);
}
CGLM_EXPORT
float
glmc_ivec4_distance(ivec4 a, ivec4 b) {
return glm_ivec4_distance(a, b);
}
CGLM_EXPORT
void
glmc_ivec4_maxv(ivec4 a, ivec4 b, ivec4 dest) {
glm_ivec4_maxv(a, b, dest);
}
CGLM_EXPORT
void
glmc_ivec4_minv(ivec4 a, ivec4 b, ivec4 dest) {
glm_ivec4_minv(a, b, dest);
}
CGLM_EXPORT
void
glmc_ivec4_clamp(ivec4 v, int minVal, int maxVal) {
glm_ivec4_clamp(v, minVal, maxVal);
}

View File

@@ -26,6 +26,12 @@ glmc_project(vec3 pos, mat4 m, vec4 vp, vec3 dest) {
glm_project(pos, m, vp, dest); glm_project(pos, m, vp, dest);
} }
CGLM_EXPORT
float
glmc_project_z(vec3 pos, mat4 m) {
return glm_project_z(pos, m);
}
CGLM_EXPORT CGLM_EXPORT
void void
glmc_pickmatrix(vec2 center, vec2 size, vec4 vp, mat4 dest) { glmc_pickmatrix(vec2 center, vec2 size, vec4 vp, mat4 dest) {

View File

@@ -211,3 +211,21 @@ void
glmc_vec2_lerp(vec2 from, vec2 to, float t, vec2 dest) { glmc_vec2_lerp(vec2 from, vec2 to, float t, vec2 dest) {
glm_vec2_lerp(from, to, t, dest); glm_vec2_lerp(from, to, t, dest);
} }
CGLM_EXPORT
void
glmc_vec2_complex_mul(vec2 a, vec2 b, vec2 dest) {
glm_vec2_complex_mul(a, b, dest);
}
CGLM_EXPORT
void
glmc_vec2_complex_div(vec2 a, vec2 b, vec2 dest) {
glm_vec2_complex_div(a, b, dest);
}
CGLM_EXPORT
void
glmc_vec2_complex_conjugate(vec2 a, vec2 dest) {
glm_vec2_complex_conjugate(a, dest);
}

189
test/src/test_ivec2.h Normal file
View File

@@ -0,0 +1,189 @@
/*
* 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, ivec2) {
ivec4 v4 = {2, 3, 5, 7};
ivec3 v3 = {11, 13, 17};
ivec2 v2;
GLM(ivec2)(v4, v2);
ASSERT(v2[0] == 2)
ASSERT(v2[1] == 3)
GLM(ivec2)(v3, v2);
ASSERT(v2[0] == 11)
ASSERT(v2[1] == 13)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec2_copy) {
ivec2 src = {7, 5};
ivec2 dst = {99, 99};
GLM(ivec2_copy)(src, dst);
ASSERT(dst[0] == 7)
ASSERT(dst[1] == 5)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec2_zero) {
ivec2 v = {2, 3};
GLM(ivec2_zero)(v);
ASSERT(v[0] == 0)
ASSERT(v[1] == 0)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec2_one) {
ivec2 v = {-2, 9};
GLM(ivec2_one)(v);
ASSERT(v[0] == 1)
ASSERT(v[1] == 1)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec2_add) {
ivec2 a = {14, 3};
ivec2 b = {-3, 2};
ivec2 v = {99, 99};
GLM(ivec2_add)(a, b, v);
ASSERT(v[0] == 11)
ASSERT(v[1] == 5)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec2_adds) {
ivec2 a = {-3, 1};
ivec2 v = {99, 99};
int s = 2;
GLM(ivec2_adds)(a, s, v);
ASSERT(v[0] == -1)
ASSERT(v[1] == 3)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec2_sub) {
ivec2 a = {-2, 9};
ivec2 b = {3, 2};
ivec2 v = {99, 99};
GLM(ivec2_sub)(a, b, v);
ASSERT(v[0] == -5)
ASSERT(v[1] == 7)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec2_subs) {
ivec2 a = {5, -2};
ivec2 v = {99, 99};
int s = -3;
GLM(ivec2_subs)(a, s, v);
ASSERT(v[0] == 8)
ASSERT(v[1] == 1)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec2_mul) {
ivec2 a = {3, 4};
ivec2 b = {-2, 3};
ivec2 v = {99, 99};
GLM(ivec2_mul)(a, b, v);
ASSERT(v[0] == -6)
ASSERT(v[1] == 12)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec2_scale) {
ivec2 a = {-9, 2};
ivec2 v = {99, 99};
int s = -2;
GLM(ivec2_scale)(a, s, v);
ASSERT(v[0] == 18)
ASSERT(v[1] == -4)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec2_distance2) {
ivec2 a = {-1, 3};
ivec2 b = {5, 4};
int v;
v = GLM(ivec2_distance2)(a, b);
ASSERT(v == 37)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec2_distance) {
ivec2 a = {3, 2};
ivec2 b = {-2, 5};
float v;
v = GLM(ivec2_distance)(a, b);
ASSERT(test_eq(v, 5.8309518948f))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec2_maxv) {
ivec2 a = {9, -20};
ivec2 b = {8, -1};
ivec2 v = {99, 99};
GLM(ivec2_maxv)(a, b, v);
ASSERT(v[0] == 9)
ASSERT(v[1] == -1)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec2_minv) {
ivec2 a = {16, 0};
ivec2 b = {-15, 10};
ivec2 v = {99, 99};
GLM(ivec2_minv)(a, b, v);
ASSERT(v[0] == -15)
ASSERT(v[1] == 0)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec2_clamp) {
ivec2 v = {3, -1};
GLM(ivec2_clamp)(v, -2, 4);
ASSERT(v[0] == 3)
ASSERT(v[1] == -1)
v[0] = -15;
v[1] = 4;
GLM(ivec2_clamp)(v, -9, 3);
ASSERT(v[0] == -9)
ASSERT(v[1] == 3)
TEST_SUCCESS
}

199
test/src/test_ivec3.h Normal file
View File

@@ -0,0 +1,199 @@
/*
* 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, ivec3) {
ivec4 v4 = {2, 3, 5, 7};
ivec3 v3 = {99, 99, 99};
GLM(ivec3)(v4, v3);
ASSERT(v3[0] == 2)
ASSERT(v3[1] == 3)
ASSERT(v3[2] == 5)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec3_copy) {
ivec3 src = {7, 5, 2};
ivec3 dst = {99, 99, 99};
GLM(ivec3_copy)(src, dst);
ASSERT(dst[0] == 7)
ASSERT(dst[1] == 5)
ASSERT(dst[2] == 2)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec3_zero) {
ivec3 v = {2, 3, 5};
GLM(ivec3_zero)(v);
ASSERT(v[0] == 0)
ASSERT(v[1] == 0)
ASSERT(v[2] == 0)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec3_one) {
ivec3 v = {-2, 9, 12};
GLM(ivec3_one)(v);
ASSERT(v[0] == 1)
ASSERT(v[1] == 1)
ASSERT(v[2] == 1)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec3_add) {
ivec3 a = {14, 3, 2};
ivec3 b = {-3, 2, 1};
ivec3 v = {99, 99, 99};
GLM(ivec3_add)(a, b, v);
ASSERT(v[0] == 11)
ASSERT(v[1] == 5)
ASSERT(v[2] == 3)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec3_adds) {
ivec3 a = {-3, 1, 4};
ivec3 v = {99, 99, 99};
int s = 2;
GLM(ivec3_adds)(a, s, v);
ASSERT(v[0] == -1)
ASSERT(v[1] == 3)
ASSERT(v[2] == 6)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec3_sub) {
ivec3 a = {-2, 9, 1};
ivec3 b = {3, 2, -1};
ivec3 v = {99, 99, 99};
GLM(ivec3_sub)(a, b, v);
ASSERT(v[0] == -5)
ASSERT(v[1] == 7)
ASSERT(v[2] == 2)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec3_subs) {
ivec3 a = {5, -2, 6};
ivec3 v = {99, 99, 99};
int s = -3;
GLM(ivec3_subs)(a, s, v);
ASSERT(v[0] == 8)
ASSERT(v[1] == 1)
ASSERT(v[2] == 9)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec3_mul) {
ivec3 a = {3, 4, 5};
ivec3 b = {-2, 3, 1};
ivec3 v = {99, 99, 99};
GLM(ivec3_mul)(a, b, v);
ASSERT(v[0] == -6)
ASSERT(v[1] == 12)
ASSERT(v[2] == 5)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec3_scale) {
ivec3 a = {-9, 2, 3};
ivec3 v = {99, 99, 99};
int s = -2;
GLM(ivec3_scale)(a, s, v);
ASSERT(v[0] == 18)
ASSERT(v[1] == -4)
ASSERT(v[2] == -6)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec3_distance2) {
ivec3 a = {-1, 3, 0};
ivec3 b = {5, 4, 2};
int v;
v = GLM(ivec3_distance2)(a, b);
ASSERT(v == 41)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec3_distance) {
ivec3 a = {3, 2, 4};
ivec3 b = {-2, 5, 2};
float v;
v = GLM(ivec3_distance)(a, b);
ASSERT(test_eq(v, 6.1644140029f))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec3_maxv) {
ivec3 a = {9, -20, 5};
ivec3 b = {8, -1, 2};
ivec3 v = {99, 99, 99};
GLM(ivec3_maxv)(a, b, v);
ASSERT(v[0] == 9)
ASSERT(v[1] == -1)
ASSERT(v[2] == 5)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec3_minv) {
ivec3 a = {16, 0, 4};
ivec3 b = {-15, 10, 8};
ivec3 v = {99, 99, 99};
GLM(ivec3_minv)(a, b, v);
ASSERT(v[0] == -15)
ASSERT(v[1] == 0)
ASSERT(v[2] == 4)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec3_clamp) {
ivec3 v = {3, -1, 10};
GLM(ivec3_clamp)(v, -2, 4);
ASSERT(v[0] == 3)
ASSERT(v[1] == -1)
ASSERT(v[2] == 4)
v[0] = -15;
v[1] = 4;
v[2] = 1;
GLM(ivec3_clamp)(v, -9, 3);
ASSERT(v[0] == -9)
ASSERT(v[1] == 3)
ASSERT(v[2] == 1)
TEST_SUCCESS
}

214
test/src/test_ivec4.h Normal file
View File

@@ -0,0 +1,214 @@
/*
* 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, ivec4) {
ivec3 v3 = {2, 3, 5};
ivec4 v4;
GLM(ivec4)(v3, 7, v4);
ASSERT(v4[0] == 2)
ASSERT(v4[1] == 3)
ASSERT(v4[2] == 5)
ASSERT(v4[3] == 7)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec4_copy) {
ivec4 src = {7, 5, 2, 11};
ivec4 dst = {99, 99, 99, 99};
GLM(ivec4_copy)(src, dst);
ASSERT(dst[0] == 7)
ASSERT(dst[1] == 5)
ASSERT(dst[2] == 2)
ASSERT(dst[3] == 11)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec4_zero) {
ivec4 v = {2, 3, 5, 7};
GLM(ivec4_zero)(v);
ASSERT(v[0] == 0)
ASSERT(v[1] == 0)
ASSERT(v[2] == 0)
ASSERT(v[3] == 0)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec4_one) {
ivec4 v = {-2, 9, 12, 7};
GLM(ivec4_one)(v);
ASSERT(v[0] == 1)
ASSERT(v[1] == 1)
ASSERT(v[2] == 1)
ASSERT(v[3] == 1)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec4_add) {
ivec4 a = {14, 3, 2, -4};
ivec4 b = {-3, 2, 1, -1};
ivec4 v = {99, 99, 99, 99};
GLM(ivec4_add)(a, b, v);
ASSERT(v[0] == 11)
ASSERT(v[1] == 5)
ASSERT(v[2] == 3)
ASSERT(v[3] == -5)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec4_adds) {
ivec4 a = {-3, 1, 4, 2};
ivec4 v = {99, 99, 99, 99};
int s = -2;
GLM(ivec4_adds)(a, s, v);
ASSERT(v[0] == -5)
ASSERT(v[1] == -1)
ASSERT(v[2] == 2)
ASSERT(v[3] == 0)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec4_sub) {
ivec4 a = {-2, 9, 1, 5};
ivec4 b = {3, 2, -1, 2};
ivec4 v = {99, 99, 99, 99};
GLM(ivec4_sub)(a, b, v);
ASSERT(v[0] == -5)
ASSERT(v[1] == 7)
ASSERT(v[2] == 2)
ASSERT(v[3] == 3)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec4_subs) {
ivec4 a = {5, -2, 6, 1};
ivec4 v = {99, 99, 99, 99};
int s = 2;
GLM(ivec4_subs)(a, s, v);
ASSERT(v[0] == 3)
ASSERT(v[1] == -4)
ASSERT(v[2] == 4)
ASSERT(v[3] == -1)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec4_mul) {
ivec4 a = {3, 4, 5, -3};
ivec4 b = {-2, 3, 1, 2};
ivec4 v = {99, 99, 99, 99};
GLM(ivec4_mul)(a, b, v);
ASSERT(v[0] == -6)
ASSERT(v[1] == 12)
ASSERT(v[2] == 5)
ASSERT(v[3] == -6)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec4_scale) {
ivec4 a = {-9, 2, 3, 0};
ivec4 v = {99, 99, 99, 99};
int s = -2;
GLM(ivec4_scale)(a, s, v);
ASSERT(v[0] == 18)
ASSERT(v[1] == -4)
ASSERT(v[2] == -6)
ASSERT(v[3] == 0)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec4_distance2) {
ivec4 a = {-1, 3, 0, 4};
ivec4 b = {5, 4, 2, 6};
int v;
v = GLM(ivec4_distance2)(a, b);
ASSERT(v == 45)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec4_distance) {
ivec4 a = {3, 2, 4, -1};
ivec4 b = {-2, 5, 2, 4};
float v;
v = GLM(ivec4_distance)(a, b);
ASSERT(test_eq(v, 7.9372539331f))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec4_maxv) {
ivec4 a = {9, -20, 5, -3};
ivec4 b = {8, -1, 2, 2};
ivec4 v = {99, 99, 99, 99};
GLM(ivec4_maxv)(a, b, v);
ASSERT(v[0] == 9)
ASSERT(v[1] == -1)
ASSERT(v[2] == 5)
ASSERT(v[3] == 2)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec4_minv) {
ivec4 a = {16, 0, 4, 5};
ivec4 b = {-15, 10, 8, 2};
ivec4 v = {99, 99, 99, 99};
GLM(ivec4_minv)(a, b, v);
ASSERT(v[0] == -15)
ASSERT(v[1] == 0)
ASSERT(v[2] == 4)
ASSERT(v[3] == 2)
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, ivec4_clamp) {
ivec4 v = {3, -1, 10, -100};
GLM(ivec4_clamp)(v, -2, 4);
ASSERT(v[0] == 3)
ASSERT(v[1] == -1)
ASSERT(v[2] == 4)
ASSERT(v[3] == -2)
v[0] = -15;
v[1] = 4;
v[2] = 1;
v[3] = 0;
GLM(ivec4_clamp)(v, -9, 3);
ASSERT(v[0] == -9)
ASSERT(v[1] == 3)
ASSERT(v[2] == 1)
ASSERT(v[3] == 0)
TEST_SUCCESS
}

View File

@@ -594,3 +594,32 @@ TEST_IMPL(GLM_PREFIX, vec2_lerp) {
TEST_SUCCESS TEST_SUCCESS
} }
TEST_IMPL(GLM_PREFIX, vec2_complex_mul) {
vec2 v1 = { 3.0f, 5.0f },
v2 = { 7.0f, 11.0f },
v3 = { cosf(GLM_PIf/4.0f), sinf(GLM_PIf/4.0f) };
GLM(vec2_complex_mul)(v1, v2, v2);
ASSERTIFY(test_assert_vec2_eq(v2, (vec2){ -34, 68 }))
GLM(vec2_complex_mul)(v3, v3, v3);
ASSERTIFY(test_assert_vec2_eq(v3, (vec2){ 0.0f, 1.0f }))
TEST_SUCCESS
}
TEST_IMPL(GLM_PREFIX, vec2_complex_div) {
vec2 v1 = { -34.0f, 68.0f },
v2 = { 3.0f, 5.0f },
v3 = { cosf(GLM_PIf/4.0f), sinf(GLM_PIf/4.0f) },
v4 = { cosf(GLM_PIf/4.0f), -sinf(GLM_PIf/4.0f) };
GLM(vec2_complex_div)(v1, v2, v2);
ASSERTIFY(test_assert_vec2_eq(v2, (vec2){ 7.0f, 11.0f }))
GLM(vec2_complex_div)(v3, v4, v4);
ASSERTIFY(test_assert_vec2_eq(v4, (vec2){ 0.0f, 1.0f }))
TEST_SUCCESS
}

View File

@@ -15,6 +15,9 @@
#include "test_vec2.h" #include "test_vec2.h"
#include "test_vec3.h" #include "test_vec3.h"
#include "test_vec4.h" #include "test_vec4.h"
#include "test_ivec2.h"
#include "test_ivec3.h"
#include "test_ivec4.h"
#include "test_mat2.h" #include "test_mat2.h"
#include "test_mat3.h" #include "test_mat3.h"
#include "test_mat4.h" #include "test_mat4.h"
@@ -39,6 +42,9 @@
#include "test_vec2.h" #include "test_vec2.h"
#include "test_vec3.h" #include "test_vec3.h"
#include "test_vec4.h" #include "test_vec4.h"
#include "test_ivec2.h"
#include "test_ivec3.h"
#include "test_ivec4.h"
#include "test_mat2.h" #include "test_mat2.h"
#include "test_mat3.h" #include "test_mat3.h"
#include "test_mat4.h" #include "test_mat4.h"

View File

@@ -340,9 +340,7 @@ TEST_DECLARE(glmc_quat_from_vecs)
/* bezier */ /* bezier */
TEST_DECLARE(bezier) TEST_DECLARE(bezier)
/* vec2 */
/* Macros */
TEST_DECLARE(MACRO_GLM_VEC2_ONE_INIT) TEST_DECLARE(MACRO_GLM_VEC2_ONE_INIT)
TEST_DECLARE(MACRO_GLM_VEC2_ZERO_INIT) TEST_DECLARE(MACRO_GLM_VEC2_ZERO_INIT)
TEST_DECLARE(MACRO_GLM_VEC2_ONE) TEST_DECLARE(MACRO_GLM_VEC2_ONE)
@@ -382,7 +380,8 @@ TEST_DECLARE(glm_vec2_maxv)
TEST_DECLARE(glm_vec2_minv) TEST_DECLARE(glm_vec2_minv)
TEST_DECLARE(glm_vec2_clamp) TEST_DECLARE(glm_vec2_clamp)
TEST_DECLARE(glm_vec2_lerp) TEST_DECLARE(glm_vec2_lerp)
TEST_DECLARE(glm_vec2_complex_mul)
TEST_DECLARE(glm_vec2_complex_div)
TEST_DECLARE(glmc_vec2) TEST_DECLARE(glmc_vec2)
TEST_DECLARE(glmc_vec2_copy) TEST_DECLARE(glmc_vec2_copy)
@@ -418,6 +417,8 @@ TEST_DECLARE(glmc_vec2_maxv)
TEST_DECLARE(glmc_vec2_minv) TEST_DECLARE(glmc_vec2_minv)
TEST_DECLARE(glmc_vec2_clamp) TEST_DECLARE(glmc_vec2_clamp)
TEST_DECLARE(glmc_vec2_lerp) TEST_DECLARE(glmc_vec2_lerp)
TEST_DECLARE(glmc_vec2_complex_mul)
TEST_DECLARE(glmc_vec2_complex_div)
/* vec3 */ /* vec3 */
TEST_DECLARE(MACRO_GLM_VEC3_ONE_INIT) TEST_DECLARE(MACRO_GLM_VEC3_ONE_INIT)
@@ -584,7 +585,6 @@ TEST_DECLARE(glmc_vec3_hadd)
TEST_DECLARE(glmc_vec3_sqrt) TEST_DECLARE(glmc_vec3_sqrt)
/* vec4 */ /* vec4 */
TEST_DECLARE(MACRO_GLM_VEC4_ONE_INIT) TEST_DECLARE(MACRO_GLM_VEC4_ONE_INIT)
TEST_DECLARE(MACRO_GLM_VEC4_ZERO_INIT) TEST_DECLARE(MACRO_GLM_VEC4_ZERO_INIT)
TEST_DECLARE(MACRO_GLM_VEC4_ONE) TEST_DECLARE(MACRO_GLM_VEC4_ONE)
@@ -730,8 +730,106 @@ TEST_DECLARE(glmc_vec4_fract)
TEST_DECLARE(glmc_vec4_hadd) TEST_DECLARE(glmc_vec4_hadd)
TEST_DECLARE(glmc_vec4_sqrt) TEST_DECLARE(glmc_vec4_sqrt)
/* structs */ /* ivec2 */
TEST_DECLARE(glm_ivec2)
TEST_DECLARE(glm_ivec2_copy)
TEST_DECLARE(glm_ivec2_zero)
TEST_DECLARE(glm_ivec2_one)
TEST_DECLARE(glm_ivec2_add)
TEST_DECLARE(glm_ivec2_adds)
TEST_DECLARE(glm_ivec2_sub)
TEST_DECLARE(glm_ivec2_subs)
TEST_DECLARE(glm_ivec2_mul)
TEST_DECLARE(glm_ivec2_scale)
TEST_DECLARE(glm_ivec2_distance2)
TEST_DECLARE(glm_ivec2_distance)
TEST_DECLARE(glm_ivec2_maxv)
TEST_DECLARE(glm_ivec2_minv)
TEST_DECLARE(glm_ivec2_clamp)
TEST_DECLARE(glmc_ivec2)
TEST_DECLARE(glmc_ivec2_copy)
TEST_DECLARE(glmc_ivec2_zero)
TEST_DECLARE(glmc_ivec2_one)
TEST_DECLARE(glmc_ivec2_add)
TEST_DECLARE(glmc_ivec2_adds)
TEST_DECLARE(glmc_ivec2_sub)
TEST_DECLARE(glmc_ivec2_subs)
TEST_DECLARE(glmc_ivec2_mul)
TEST_DECLARE(glmc_ivec2_scale)
TEST_DECLARE(glmc_ivec2_distance2)
TEST_DECLARE(glmc_ivec2_distance)
TEST_DECLARE(glmc_ivec2_maxv)
TEST_DECLARE(glmc_ivec2_minv)
TEST_DECLARE(glmc_ivec2_clamp)
/* ivec3 */
TEST_DECLARE(glm_ivec3)
TEST_DECLARE(glm_ivec3_copy)
TEST_DECLARE(glm_ivec3_zero)
TEST_DECLARE(glm_ivec3_one)
TEST_DECLARE(glm_ivec3_add)
TEST_DECLARE(glm_ivec3_adds)
TEST_DECLARE(glm_ivec3_sub)
TEST_DECLARE(glm_ivec3_subs)
TEST_DECLARE(glm_ivec3_mul)
TEST_DECLARE(glm_ivec3_scale)
TEST_DECLARE(glm_ivec3_distance2)
TEST_DECLARE(glm_ivec3_distance)
TEST_DECLARE(glm_ivec3_maxv)
TEST_DECLARE(glm_ivec3_minv)
TEST_DECLARE(glm_ivec3_clamp)
TEST_DECLARE(glmc_ivec3)
TEST_DECLARE(glmc_ivec3_copy)
TEST_DECLARE(glmc_ivec3_zero)
TEST_DECLARE(glmc_ivec3_one)
TEST_DECLARE(glmc_ivec3_add)
TEST_DECLARE(glmc_ivec3_adds)
TEST_DECLARE(glmc_ivec3_sub)
TEST_DECLARE(glmc_ivec3_subs)
TEST_DECLARE(glmc_ivec3_mul)
TEST_DECLARE(glmc_ivec3_scale)
TEST_DECLARE(glmc_ivec3_distance2)
TEST_DECLARE(glmc_ivec3_distance)
TEST_DECLARE(glmc_ivec3_maxv)
TEST_DECLARE(glmc_ivec3_minv)
TEST_DECLARE(glmc_ivec3_clamp)
/* ivec4 */
TEST_DECLARE(glm_ivec4)
TEST_DECLARE(glm_ivec4_copy)
TEST_DECLARE(glm_ivec4_zero)
TEST_DECLARE(glm_ivec4_one)
TEST_DECLARE(glm_ivec4_add)
TEST_DECLARE(glm_ivec4_adds)
TEST_DECLARE(glm_ivec4_sub)
TEST_DECLARE(glm_ivec4_subs)
TEST_DECLARE(glm_ivec4_mul)
TEST_DECLARE(glm_ivec4_scale)
TEST_DECLARE(glm_ivec4_distance2)
TEST_DECLARE(glm_ivec4_distance)
TEST_DECLARE(glm_ivec4_maxv)
TEST_DECLARE(glm_ivec4_minv)
TEST_DECLARE(glm_ivec4_clamp)
TEST_DECLARE(glmc_ivec4)
TEST_DECLARE(glmc_ivec4_copy)
TEST_DECLARE(glmc_ivec4_zero)
TEST_DECLARE(glmc_ivec4_one)
TEST_DECLARE(glmc_ivec4_add)
TEST_DECLARE(glmc_ivec4_adds)
TEST_DECLARE(glmc_ivec4_sub)
TEST_DECLARE(glmc_ivec4_subs)
TEST_DECLARE(glmc_ivec4_mul)
TEST_DECLARE(glmc_ivec4_scale)
TEST_DECLARE(glmc_ivec4_distance2)
TEST_DECLARE(glmc_ivec4_distance)
TEST_DECLARE(glmc_ivec4_maxv)
TEST_DECLARE(glmc_ivec4_minv)
TEST_DECLARE(glmc_ivec4_clamp)
/* structs */
TEST_DECLARE(mat3s_identity_init) TEST_DECLARE(mat3s_identity_init)
TEST_DECLARE(mat3s_zero_init) TEST_DECLARE(mat3s_zero_init)
TEST_DECLARE(mat4s_identity_init) TEST_DECLARE(mat4s_identity_init)
@@ -1071,8 +1169,6 @@ TEST_LIST {
TEST_ENTRY(bezier) TEST_ENTRY(bezier)
/* vec2 */ /* vec2 */
/* Macros */
TEST_ENTRY(MACRO_GLM_VEC2_ONE_INIT) TEST_ENTRY(MACRO_GLM_VEC2_ONE_INIT)
TEST_ENTRY(MACRO_GLM_VEC2_ZERO_INIT) TEST_ENTRY(MACRO_GLM_VEC2_ZERO_INIT)
TEST_ENTRY(MACRO_GLM_VEC2_ONE) TEST_ENTRY(MACRO_GLM_VEC2_ONE)
@@ -1112,6 +1208,8 @@ TEST_LIST {
TEST_ENTRY(glm_vec2_minv) TEST_ENTRY(glm_vec2_minv)
TEST_ENTRY(glm_vec2_clamp) TEST_ENTRY(glm_vec2_clamp)
TEST_ENTRY(glm_vec2_lerp) TEST_ENTRY(glm_vec2_lerp)
TEST_ENTRY(glm_vec2_complex_mul)
TEST_ENTRY(glm_vec2_complex_div)
TEST_ENTRY(glmc_vec2) TEST_ENTRY(glmc_vec2)
TEST_ENTRY(glmc_vec2_copy) TEST_ENTRY(glmc_vec2_copy)
@@ -1147,10 +1245,10 @@ TEST_LIST {
TEST_ENTRY(glmc_vec2_minv) TEST_ENTRY(glmc_vec2_minv)
TEST_ENTRY(glmc_vec2_clamp) TEST_ENTRY(glmc_vec2_clamp)
TEST_ENTRY(glmc_vec2_lerp) TEST_ENTRY(glmc_vec2_lerp)
TEST_ENTRY(glmc_vec2_complex_mul)
TEST_ENTRY(glmc_vec2_complex_div)
/* vec3 */ /* vec3 */
/* Macros */
TEST_ENTRY(MACRO_GLM_VEC3_ONE_INIT) TEST_ENTRY(MACRO_GLM_VEC3_ONE_INIT)
TEST_ENTRY(MACRO_GLM_VEC3_ZERO_INIT) TEST_ENTRY(MACRO_GLM_VEC3_ZERO_INIT)
TEST_ENTRY(MACRO_GLM_VEC3_ONE) TEST_ENTRY(MACRO_GLM_VEC3_ONE)
@@ -1314,8 +1412,6 @@ TEST_LIST {
TEST_ENTRY(glmc_vec3_sqrt) TEST_ENTRY(glmc_vec3_sqrt)
/* vec4 */ /* vec4 */
/* Macros */
TEST_ENTRY(MACRO_GLM_VEC4_ONE_INIT) TEST_ENTRY(MACRO_GLM_VEC4_ONE_INIT)
TEST_ENTRY(MACRO_GLM_VEC4_ZERO_INIT) TEST_ENTRY(MACRO_GLM_VEC4_ZERO_INIT)
TEST_ENTRY(MACRO_GLM_VEC4_ONE) TEST_ENTRY(MACRO_GLM_VEC4_ONE)
@@ -1461,6 +1557,105 @@ TEST_LIST {
TEST_ENTRY(glmc_vec4_hadd) TEST_ENTRY(glmc_vec4_hadd)
TEST_ENTRY(glmc_vec4_sqrt) TEST_ENTRY(glmc_vec4_sqrt)
/* ivec2 */
TEST_ENTRY(glm_ivec2)
TEST_ENTRY(glm_ivec2_copy)
TEST_ENTRY(glm_ivec2_zero)
TEST_ENTRY(glm_ivec2_one)
TEST_ENTRY(glm_ivec2_add)
TEST_ENTRY(glm_ivec2_adds)
TEST_ENTRY(glm_ivec2_sub)
TEST_ENTRY(glm_ivec2_subs)
TEST_ENTRY(glm_ivec2_mul)
TEST_ENTRY(glm_ivec2_scale)
TEST_ENTRY(glm_ivec2_distance2)
TEST_ENTRY(glm_ivec2_distance)
TEST_ENTRY(glm_ivec2_maxv)
TEST_ENTRY(glm_ivec2_minv)
TEST_ENTRY(glm_ivec2_clamp)
TEST_ENTRY(glmc_ivec2)
TEST_ENTRY(glmc_ivec2_copy)
TEST_ENTRY(glmc_ivec2_zero)
TEST_ENTRY(glmc_ivec2_one)
TEST_ENTRY(glmc_ivec2_add)
TEST_ENTRY(glmc_ivec2_adds)
TEST_ENTRY(glmc_ivec2_sub)
TEST_ENTRY(glmc_ivec2_subs)
TEST_ENTRY(glmc_ivec2_mul)
TEST_ENTRY(glmc_ivec2_scale)
TEST_ENTRY(glmc_ivec2_distance2)
TEST_ENTRY(glmc_ivec2_distance)
TEST_ENTRY(glmc_ivec2_maxv)
TEST_ENTRY(glmc_ivec2_minv)
TEST_ENTRY(glmc_ivec2_clamp)
/* ivec3 */
TEST_ENTRY(glm_ivec3)
TEST_ENTRY(glm_ivec3_copy)
TEST_ENTRY(glm_ivec3_zero)
TEST_ENTRY(glm_ivec3_one)
TEST_ENTRY(glm_ivec3_add)
TEST_ENTRY(glm_ivec3_adds)
TEST_ENTRY(glm_ivec3_sub)
TEST_ENTRY(glm_ivec3_subs)
TEST_ENTRY(glm_ivec3_mul)
TEST_ENTRY(glm_ivec3_scale)
TEST_ENTRY(glm_ivec3_distance2)
TEST_ENTRY(glm_ivec3_distance)
TEST_ENTRY(glm_ivec3_maxv)
TEST_ENTRY(glm_ivec3_minv)
TEST_ENTRY(glm_ivec3_clamp)
TEST_ENTRY(glmc_ivec3)
TEST_ENTRY(glmc_ivec3_copy)
TEST_ENTRY(glmc_ivec3_zero)
TEST_ENTRY(glmc_ivec3_one)
TEST_ENTRY(glmc_ivec3_add)
TEST_ENTRY(glmc_ivec3_adds)
TEST_ENTRY(glmc_ivec3_sub)
TEST_ENTRY(glmc_ivec3_subs)
TEST_ENTRY(glmc_ivec3_mul)
TEST_ENTRY(glmc_ivec3_scale)
TEST_ENTRY(glmc_ivec3_distance2)
TEST_ENTRY(glmc_ivec3_distance)
TEST_ENTRY(glmc_ivec3_maxv)
TEST_ENTRY(glmc_ivec3_minv)
TEST_ENTRY(glmc_ivec3_clamp)
/* ivec4 */
TEST_ENTRY(glm_ivec4)
TEST_ENTRY(glm_ivec4_copy)
TEST_ENTRY(glm_ivec4_zero)
TEST_ENTRY(glm_ivec4_one)
TEST_ENTRY(glm_ivec4_add)
TEST_ENTRY(glm_ivec4_adds)
TEST_ENTRY(glm_ivec4_sub)
TEST_ENTRY(glm_ivec4_subs)
TEST_ENTRY(glm_ivec4_mul)
TEST_ENTRY(glm_ivec4_scale)
TEST_ENTRY(glm_ivec4_distance2)
TEST_ENTRY(glm_ivec4_distance)
TEST_ENTRY(glm_ivec4_maxv)
TEST_ENTRY(glm_ivec4_minv)
TEST_ENTRY(glm_ivec4_clamp)
TEST_ENTRY(glmc_ivec4)
TEST_ENTRY(glmc_ivec4_copy)
TEST_ENTRY(glmc_ivec4_zero)
TEST_ENTRY(glmc_ivec4_one)
TEST_ENTRY(glmc_ivec4_add)
TEST_ENTRY(glmc_ivec4_adds)
TEST_ENTRY(glmc_ivec4_sub)
TEST_ENTRY(glmc_ivec4_subs)
TEST_ENTRY(glmc_ivec4_mul)
TEST_ENTRY(glmc_ivec4_scale)
TEST_ENTRY(glmc_ivec4_distance2)
TEST_ENTRY(glmc_ivec4_distance)
TEST_ENTRY(glmc_ivec4_maxv)
TEST_ENTRY(glmc_ivec4_minv)
TEST_ENTRY(glmc_ivec4_clamp)
/* structs */ /* structs */
TEST_ENTRY(mat3s_identity_init) TEST_ENTRY(mat3s_identity_init)
TEST_ENTRY(mat3s_zero_init) TEST_ENTRY(mat3s_zero_init)

View File

@@ -39,6 +39,9 @@
<ClInclude Include="..\test\src\test_affine_mat.h" /> <ClInclude Include="..\test\src\test_affine_mat.h" />
<ClInclude Include="..\test\src\test_camera.h" /> <ClInclude Include="..\test\src\test_camera.h" />
<ClInclude Include="..\test\src\test_common.h" /> <ClInclude Include="..\test\src\test_common.h" />
<ClInclude Include="..\test\src\test_ivec2.h" />
<ClInclude Include="..\test\src\test_ivec3.h" />
<ClInclude Include="..\test\src\test_ivec4.h" />
<ClInclude Include="..\test\src\test_mat2.h" /> <ClInclude Include="..\test\src\test_mat2.h" />
<ClInclude Include="..\test\src\test_mat3.h" /> <ClInclude Include="..\test\src\test_mat3.h" />
<ClInclude Include="..\test\src\test_mat4.h" /> <ClInclude Include="..\test\src\test_mat4.h" />

View File

@@ -100,5 +100,14 @@
<ClInclude Include="..\test\src\test_camera.h"> <ClInclude Include="..\test\src\test_camera.h">
<Filter>src</Filter> <Filter>src</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\test\src\test_ivec2.h">
<Filter>src</Filter>
</ClInclude>
<ClInclude Include="..\test\src\test_ivec3.h">
<Filter>src</Filter>
</ClInclude>
<ClInclude Include="..\test\src\test_ivec4.h">
<Filter>src</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@@ -43,6 +43,9 @@
<ClCompile Include="..\src\euler.c" /> <ClCompile Include="..\src\euler.c" />
<ClCompile Include="..\src\frustum.c" /> <ClCompile Include="..\src\frustum.c" />
<ClCompile Include="..\src\io.c" /> <ClCompile Include="..\src\io.c" />
<ClCompile Include="..\src\ivec2.c" />
<ClCompile Include="..\src\ivec3.c" />
<ClCompile Include="..\src\ivec4.c" />
<ClCompile Include="..\src\mat2.c" /> <ClCompile Include="..\src\mat2.c" />
<ClCompile Include="..\src\mat3.c" /> <ClCompile Include="..\src\mat3.c" />
<ClCompile Include="..\src\mat4.c" /> <ClCompile Include="..\src\mat4.c" />
@@ -57,6 +60,8 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="..\include\cglm\affine-mat.h" /> <ClInclude Include="..\include\cglm\affine-mat.h" />
<ClInclude Include="..\include\cglm\affine-post.h" />
<ClInclude Include="..\include\cglm\affine-pre.h" />
<ClInclude Include="..\include\cglm\affine.h" /> <ClInclude Include="..\include\cglm\affine.h" />
<ClInclude Include="..\include\cglm\affine2d.h" /> <ClInclude Include="..\include\cglm\affine2d.h" />
<ClInclude Include="..\include\cglm\applesimd.h" /> <ClInclude Include="..\include\cglm\applesimd.h" />
@@ -87,6 +92,9 @@
<ClInclude Include="..\include\cglm\call\euler.h" /> <ClInclude Include="..\include\cglm\call\euler.h" />
<ClInclude Include="..\include\cglm\call\frustum.h" /> <ClInclude Include="..\include\cglm\call\frustum.h" />
<ClInclude Include="..\include\cglm\call\io.h" /> <ClInclude Include="..\include\cglm\call\io.h" />
<ClInclude Include="..\include\cglm\call\ivec2.h" />
<ClInclude Include="..\include\cglm\call\ivec3.h" />
<ClInclude Include="..\include\cglm\call\ivec4.h" />
<ClInclude Include="..\include\cglm\call\mat2.h" /> <ClInclude Include="..\include\cglm\call\mat2.h" />
<ClInclude Include="..\include\cglm\call\mat3.h" /> <ClInclude Include="..\include\cglm\call\mat3.h" />
<ClInclude Include="..\include\cglm\call\mat4.h" /> <ClInclude Include="..\include\cglm\call\mat4.h" />
@@ -124,6 +132,9 @@
<ClInclude Include="..\include\cglm\euler.h" /> <ClInclude Include="..\include\cglm\euler.h" />
<ClInclude Include="..\include\cglm\frustum.h" /> <ClInclude Include="..\include\cglm\frustum.h" />
<ClInclude Include="..\include\cglm\io.h" /> <ClInclude Include="..\include\cglm\io.h" />
<ClInclude Include="..\include\cglm\ivec2.h" />
<ClInclude Include="..\include\cglm\ivec3.h" />
<ClInclude Include="..\include\cglm\ivec4.h" />
<ClInclude Include="..\include\cglm\mat2.h" /> <ClInclude Include="..\include\cglm\mat2.h" />
<ClInclude Include="..\include\cglm\mat3.h" /> <ClInclude Include="..\include\cglm\mat3.h" />
<ClInclude Include="..\include\cglm\mat4.h" /> <ClInclude Include="..\include\cglm\mat4.h" />
@@ -159,6 +170,8 @@
<ClInclude Include="..\include\cglm\struct\clipspace\persp_lh_zo.h" /> <ClInclude Include="..\include\cglm\struct\clipspace\persp_lh_zo.h" />
<ClInclude Include="..\include\cglm\struct\clipspace\persp_rh_no.h" /> <ClInclude Include="..\include\cglm\struct\clipspace\persp_rh_no.h" />
<ClInclude Include="..\include\cglm\struct\clipspace\persp_rh_zo.h" /> <ClInclude Include="..\include\cglm\struct\clipspace\persp_rh_zo.h" />
<ClInclude Include="..\include\cglm\struct\clipspace\project_no.h" />
<ClInclude Include="..\include\cglm\struct\clipspace\project_zo.h" />
<ClInclude Include="..\include\cglm\struct\clipspace\view_lh_no.h" /> <ClInclude Include="..\include\cglm\struct\clipspace\view_lh_no.h" />
<ClInclude Include="..\include\cglm\struct\clipspace\view_lh_zo.h" /> <ClInclude Include="..\include\cglm\struct\clipspace\view_lh_zo.h" />
<ClInclude Include="..\include\cglm\struct\clipspace\view_rh_no.h" /> <ClInclude Include="..\include\cglm\struct\clipspace\view_rh_no.h" />

View File

@@ -148,6 +148,15 @@
<ClCompile Include="..\src\clipspace\project_zo.c"> <ClCompile Include="..\src\clipspace\project_zo.c">
<Filter>src\clipspace</Filter> <Filter>src\clipspace</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\src\ivec4.c">
<Filter>src</Filter>
</ClCompile>
<ClCompile Include="..\src\ivec3.c">
<Filter>src</Filter>
</ClCompile>
<ClCompile Include="..\src\ivec2.c">
<Filter>src</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="..\src\config.h"> <ClInclude Include="..\src\config.h">
@@ -558,5 +567,35 @@
<ClInclude Include="..\include\cglm\call\clipspace\project_zo.h"> <ClInclude Include="..\include\cglm\call\clipspace\project_zo.h">
<Filter>include\cglm\call\clipspace</Filter> <Filter>include\cglm\call\clipspace</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\include\cglm\call\ivec2.h">
<Filter>include\cglm\call</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\call\ivec3.h">
<Filter>include\cglm\call</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\call\ivec4.h">
<Filter>include\cglm\call</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\struct\clipspace\project_no.h">
<Filter>include\cglm\struct\clipspace</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\struct\clipspace\project_zo.h">
<Filter>include\cglm\struct\clipspace</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\ivec2.h">
<Filter>include\cglm</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\ivec3.h">
<Filter>include\cglm</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\ivec4.h">
<Filter>include\cglm</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\affine-post.h">
<Filter>include\cglm</Filter>
</ClInclude>
<ClInclude Include="..\include\cglm\affine-pre.h">
<Filter>include\cglm</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
</Project> </Project>