mirror of
https://github.com/recp/cglm.git
synced 2026-02-17 03:39:05 +00:00
Compare commits
170 Commits
v0.8.3
...
structapi-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c221f8883a | ||
|
|
ea8ef4a3c9 | ||
|
|
0b3049dca0 | ||
|
|
a542d54fca | ||
|
|
1d51459a4f | ||
|
|
6e35d927eb | ||
|
|
92a8e38162 | ||
|
|
dd3c3ceae0 | ||
|
|
77b4c5cffb | ||
|
|
e276b5b405 | ||
|
|
13ed79a61a | ||
|
|
ba993b3ea9 | ||
|
|
4a6fc485fd | ||
|
|
9ed325018d | ||
|
|
a30baffafa | ||
|
|
8a117017ea | ||
|
|
799749fc6a | ||
|
|
f4c9ddf530 | ||
|
|
bc8dc72739 | ||
|
|
3eafc599ac | ||
|
|
7fba424f64 | ||
|
|
c51040cd41 | ||
|
|
9fc3a20d0f | ||
|
|
7f1c062696 | ||
|
|
e70571e9e0 | ||
|
|
007ee48b58 | ||
|
|
38771599c7 | ||
|
|
bfd87acfc4 | ||
|
|
a38622e1d6 | ||
|
|
9c7012bb39 | ||
|
|
71367b67cf | ||
|
|
3894ea32fb | ||
|
|
a430408ec4 | ||
|
|
3815e18fea | ||
|
|
8b5eaa5301 | ||
|
|
6037618942 | ||
|
|
c6d198d780 | ||
|
|
d001593f9c | ||
|
|
ac9461778c | ||
|
|
0b3d227568 | ||
|
|
78236d24a1 | ||
|
|
b41858f184 | ||
|
|
60bf21ba43 | ||
|
|
2386cdcc19 | ||
|
|
a0f01c5ed1 | ||
|
|
8cfc98d283 | ||
|
|
074189163f | ||
|
|
bfbd9ba1dc | ||
|
|
89cee7912a | ||
|
|
da5c66d735 | ||
|
|
c4b45a0917 | ||
|
|
8034073965 | ||
|
|
53009d69c0 | ||
|
|
7c62ad965b | ||
|
|
878e829767 | ||
|
|
7c7ac8b82e | ||
|
|
ba66459708 | ||
|
|
45e176680f | ||
|
|
c0bd65027a | ||
|
|
03d5699f32 | ||
|
|
199d1fa031 | ||
|
|
c7393f75c3 | ||
|
|
a3186a7f32 | ||
|
|
5a89faafff | ||
|
|
51853db559 | ||
|
|
8f8417a883 | ||
|
|
2238fd127c | ||
|
|
073a11a6b8 | ||
|
|
2d348ceba0 | ||
|
|
ce69ecaa5a | ||
|
|
5ad0f1c6f3 | ||
|
|
aea75bbe7c | ||
|
|
7dfe67cdde | ||
|
|
84f64a5b65 | ||
|
|
7df8ffa7fe | ||
|
|
dc5558d8f4 | ||
|
|
63990be905 | ||
|
|
cd0ae19459 | ||
|
|
838124af49 | ||
|
|
e3981b6d96 | ||
|
|
7bb765367e | ||
|
|
82982abaef | ||
|
|
dbe3b719c7 | ||
|
|
09155986fe | ||
|
|
1b3e2fdaec | ||
|
|
4aef2510e9 | ||
|
|
2432970f90 | ||
|
|
d1bdfde48d | ||
|
|
f27e26f632 | ||
|
|
a3265ebe84 | ||
|
|
57ec29bd31 | ||
|
|
1b217c3dd0 | ||
|
|
94a1e6f6e1 | ||
|
|
a1a2a046a4 | ||
|
|
bffaa13bd5 | ||
|
|
cd4d0a1efe | ||
|
|
8916c50a3d | ||
|
|
7a19b8f8a3 | ||
|
|
f587c00f26 | ||
|
|
65409bcda1 | ||
|
|
d2957e6275 | ||
|
|
04bd1bd633 | ||
|
|
db1a23d13c | ||
|
|
a85744430a | ||
|
|
d582146d9a | ||
|
|
ee09707c1c | ||
|
|
4c85b970a9 | ||
|
|
f7f0f66193 | ||
|
|
495b98a54d | ||
|
|
aee47ce545 | ||
|
|
52debe6a04 | ||
|
|
cf7f4231f0 | ||
|
|
7e5d1f435f | ||
|
|
851a58cedb | ||
|
|
6fa1cefcc2 | ||
|
|
7e211e1f49 | ||
|
|
7d47b7f1fd | ||
|
|
2a4748d452 | ||
|
|
f20bf0aaaf | ||
|
|
3a141b7cc8 | ||
|
|
5cd1a4ab44 | ||
|
|
897f2afd88 | ||
|
|
68e3a072e8 | ||
|
|
282ea84dc0 | ||
|
|
2d5506d15d | ||
|
|
87f561fb06 | ||
|
|
522b18bda9 | ||
|
|
b7178749ee | ||
|
|
98c708281f | ||
|
|
896ba0a0f9 | ||
|
|
4603816330 | ||
|
|
9f5cc3a745 | ||
|
|
bde653b607 | ||
|
|
ede72ca412 | ||
|
|
8e784e762f | ||
|
|
82d1050c63 | ||
|
|
0631598d08 | ||
|
|
34e5704fe8 | ||
|
|
672523e5af | ||
|
|
8427d02a9b | ||
|
|
a2bd00df32 | ||
|
|
4c8f7f310c | ||
|
|
9096fa6bab | ||
|
|
29c3837672 | ||
|
|
4530e0381b | ||
|
|
6cf1fb8992 | ||
|
|
9ed4e41afd | ||
|
|
28d24da6df | ||
|
|
ef22e2063f | ||
|
|
5a48aad1b0 | ||
|
|
07aee82125 | ||
|
|
abbeb274c5 | ||
|
|
814adf11de | ||
|
|
d0d1e46533 | ||
|
|
03b4594d9e | ||
|
|
01e2b74a29 | ||
|
|
ee5050f43c | ||
|
|
b5802b99b2 | ||
|
|
8b958e9600 | ||
|
|
aa071b2a6b | ||
|
|
479e7d4240 | ||
|
|
38c6188e12 | ||
|
|
c330b47ded | ||
|
|
2e8162b133 | ||
|
|
afdcae08dd | ||
|
|
32d1c96dc0 | ||
|
|
4d2ba464a0 | ||
|
|
398e47070b | ||
|
|
619ac4ce9a | ||
|
|
e83940f3b1 |
4
.github/FUNDING.yml
vendored
4
.github/FUNDING.yml
vendored
@@ -1,7 +1,7 @@
|
||||
# These are supported funding model platforms
|
||||
|
||||
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
|
||||
patreon: # Replace with a single Patreon username
|
||||
github: [recp]
|
||||
patreon: recp
|
||||
open_collective: cglm
|
||||
ko_fi: # Replace with a single Ko-fi username
|
||||
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
|
||||
|
||||
2
.gitignore
vendored
2
.gitignore
vendored
@@ -78,3 +78,5 @@ confdefs.h
|
||||
*.xcuserdatad
|
||||
.idea
|
||||
cmake-build-debug
|
||||
*.o.tmp
|
||||
xcode/*
|
||||
|
||||
20
.vscode/c_cpp_properties.json
vendored
Normal file
20
.vscode/c_cpp_properties.json
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"configurations": [
|
||||
{
|
||||
"name": "Mac",
|
||||
"includePath": [
|
||||
"${workspaceFolder}/**"
|
||||
],
|
||||
"defines": [],
|
||||
"macFrameworkPath": [
|
||||
"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks"
|
||||
],
|
||||
"compilerPath": "/usr/bin/clang",
|
||||
"cStandard": "c23",
|
||||
"cppStandard": "c++23",
|
||||
"intelliSenseMode": "macos-clang-arm64",
|
||||
"configurationProvider": "vector-of-bool.cmake-tools"
|
||||
}
|
||||
],
|
||||
"version": 4
|
||||
}
|
||||
29
.vscode/settings.json
vendored
29
.vscode/settings.json
vendored
@@ -1,4 +1,31 @@
|
||||
{
|
||||
"C_Cpp.default.configurationProvider": "vector-of-bool.cmake-tools",
|
||||
"restructuredtext.confPath": "${workspaceFolder}/docs/source"
|
||||
"restructuredtext.confPath": "${workspaceFolder}/docs/source",
|
||||
"workbench.colorTheme": "Default Light+ Experimental",
|
||||
"editor.fontSize": 14,
|
||||
"workbench.colorCustomizations": {
|
||||
"[Default Light*]": {
|
||||
"editor.background": "#fefefe",
|
||||
"sideBar.background": "#fefefe",
|
||||
"sideBar.foreground": "#343436",
|
||||
"sideBarTitle.foreground": "#343436",
|
||||
"sideBar.border": "#e2e2e4",
|
||||
"statusBar.background": "#fefefe",
|
||||
"titleBar.activeBackground": "#fefefe",
|
||||
"tab.activeBackground": "#f4fff4aa",
|
||||
"tab.inactiveBackground": "#fefefe",
|
||||
"activityBar.background": "#fefefe",
|
||||
"editorGroupHeader.tabsBackground": "#fefefe"
|
||||
},
|
||||
"[Default Dark*]": {
|
||||
"editor.background": "#1D1D25",
|
||||
"sideBar.background": "#1D1D25",
|
||||
"statusBar.background": "#1D1D25",
|
||||
"titleBar.activeBackground": "#1D1D25",
|
||||
"tab.activeBackground": "#2C2C3A",
|
||||
"tab.inactiveBackground": "#1D1D25",
|
||||
"activityBar.background": "#1D1D25",
|
||||
"editorGroupHeader.tabsBackground": "#1D1D25"
|
||||
}
|
||||
},
|
||||
}
|
||||
@@ -1,5 +1,10 @@
|
||||
cmake_minimum_required(VERSION 3.8.2)
|
||||
project(cglm VERSION 0.8.3 LANGUAGES C)
|
||||
project(cglm
|
||||
VERSION 0.9.0
|
||||
HOMEPAGE_URL https://github.com/recp/cglm
|
||||
DESCRIPTION "OpenGL Mathematics (glm) for C"
|
||||
LANGUAGES C
|
||||
)
|
||||
|
||||
set(CMAKE_C_STANDARD 11)
|
||||
set(CMAKE_C_STANDARD_REQUIRED YES)
|
||||
@@ -36,7 +41,9 @@ else()
|
||||
add_compile_options(-Wall -Werror -O3)
|
||||
endif()
|
||||
|
||||
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
|
||||
get_directory_property(hasParent PARENT_DIRECTORY)
|
||||
|
||||
if(NOT hasParent AND NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
|
||||
message(STATUS "Setting build type to '${DEFAULT_BUILD_TYPE}' as none was specified.")
|
||||
set(CMAKE_BUILD_TYPE "${DEFAULT_BUILD_TYPE}" CACHE STRING "Choose the type of build." FORCE)
|
||||
# Set the possible values of build type for cmake-gui
|
||||
@@ -47,7 +54,10 @@ include(GNUInstallDirs)
|
||||
|
||||
set(CPACK_PROJECT_NAME ${PROJECT_NAME})
|
||||
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
|
||||
|
||||
if(NOT CPack_CMake_INCLUDED)
|
||||
include(CPack)
|
||||
endif()
|
||||
|
||||
# Target Start
|
||||
add_library(${PROJECT_NAME}
|
||||
@@ -58,8 +68,11 @@ add_library(${PROJECT_NAME}
|
||||
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/mat3.c
|
||||
src/mat4.c
|
||||
@@ -73,18 +86,20 @@ add_library(${PROJECT_NAME}
|
||||
src/bezier.c
|
||||
src/ray.c
|
||||
src/affine2d.c
|
||||
src/clipspace/persp_lh_zo.c
|
||||
src/clipspace/persp_rh_zo.c
|
||||
src/clipspace/persp_lh_no.c
|
||||
src/clipspace/persp_rh_no.c
|
||||
src/clipspace/ortho_lh_zo.c
|
||||
src/clipspace/ortho_rh_zo.c
|
||||
src/clipspace/ortho_lh_no.c
|
||||
src/clipspace/ortho_lh_zo.c
|
||||
src/clipspace/ortho_rh_no.c
|
||||
src/clipspace/view_lh_zo.c
|
||||
src/clipspace/view_rh_zo.c
|
||||
src/clipspace/ortho_rh_zo.c
|
||||
src/clipspace/persp_lh_no.c
|
||||
src/clipspace/persp_lh_zo.c
|
||||
src/clipspace/persp_rh_no.c
|
||||
src/clipspace/persp_rh_zo.c
|
||||
src/clipspace/view_lh_no.c
|
||||
src/clipspace/view_lh_zo.c
|
||||
src/clipspace/view_rh_no.c
|
||||
src/clipspace/view_rh_zo.c
|
||||
src/clipspace/project_no.c
|
||||
src/clipspace/project_zo.c
|
||||
)
|
||||
|
||||
if(CGLM_SHARED)
|
||||
@@ -97,6 +112,12 @@ set_target_properties(${PROJECT_NAME} PROPERTIES
|
||||
VERSION ${PROJECT_VERSION}
|
||||
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}
|
||||
PUBLIC
|
||||
$<INSTALL_INTERFACE:include>
|
||||
@@ -122,7 +143,7 @@ install(TARGETS ${PROJECT_NAME}
|
||||
EXPORT ${PROJECT_NAME}
|
||||
LIBRARY 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}
|
||||
PATTERN ".*" EXCLUDE)
|
||||
@@ -141,9 +162,18 @@ install(EXPORT ${PROJECT_NAME}
|
||||
set(PACKAGE_NAME ${PROJECT_NAME})
|
||||
set(prefix ${CMAKE_INSTALL_PREFIX})
|
||||
set(exec_prefix ${CMAKE_INSTALL_PREFIX})
|
||||
if (IS_ABSOLUTE "${CMAKE_INSTALL_INCLUDEDIR}")
|
||||
set(includedir "${CMAKE_INSTALL_INCLUDEDIR}")
|
||||
else()
|
||||
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)
|
||||
endif()
|
||||
if (IS_ABSOLUTE "${CMAKE_INSTALL_LIBDIR}")
|
||||
set(libdir "${CMAKE_INSTALL_LIBDIR}")
|
||||
else()
|
||||
set(libdir "\${exec_prefix}/${CMAKE_INSTALL_LIBDIR}")
|
||||
endif()
|
||||
set(PACKAGE_VERSION "${PROJECT_VERSION}")
|
||||
configure_file(cglm.pc.in cglm.pc @ONLY)
|
||||
|
||||
install(FILES ${CMAKE_BINARY_DIR}/cglm.pc
|
||||
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/cglm.pc
|
||||
DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
|
||||
|
||||
4
CREDITS
4
CREDITS
@@ -78,3 +78,7 @@ https://stackoverflow.com/a/57793352/2676533
|
||||
16. ARM NEON Div
|
||||
|
||||
http://github.com/microsoft/DirectXMath
|
||||
|
||||
17. Pick Matrix
|
||||
|
||||
glu project -> project.c
|
||||
|
||||
81
Makefile.am
81
Makefile.am
@@ -45,17 +45,22 @@ cglm_HEADERS = include/cglm/version.h \
|
||||
include/cglm/mat4.h \
|
||||
include/cglm/mat3.h \
|
||||
include/cglm/mat2.h \
|
||||
include/cglm/affine-pre.h \
|
||||
include/cglm/affine-post.h \
|
||||
include/cglm/affine.h \
|
||||
include/cglm/affine-mat.h \
|
||||
include/cglm/vec2.h \
|
||||
include/cglm/vec2-ext.h \
|
||||
include/cglm/ivec2.h \
|
||||
include/cglm/vec3.h \
|
||||
include/cglm/vec3-ext.h \
|
||||
include/cglm/ivec3.h \
|
||||
include/cglm/vec4.h \
|
||||
include/cglm/vec4-ext.h \
|
||||
include/cglm/ivec4.h \
|
||||
include/cglm/euler.h \
|
||||
include/cglm/util.h \
|
||||
include/cglm/quat.h \
|
||||
include/cglm/affine-mat.h \
|
||||
include/cglm/plane.h \
|
||||
include/cglm/frustum.h \
|
||||
include/cglm/box.h \
|
||||
@@ -71,20 +76,22 @@ cglm_HEADERS = include/cglm/version.h \
|
||||
|
||||
cglm_clipspacedir=$(includedir)/cglm/clipspace
|
||||
cglm_clipspace_HEADERS = include/cglm/clipspace/persp.h \
|
||||
include/cglm/clipspace/persp_lh_zo.h \
|
||||
include/cglm/clipspace/persp_rh_zo.h \
|
||||
include/cglm/clipspace/persp_lh_no.h \
|
||||
include/cglm/clipspace/persp_lh_zo.h \
|
||||
include/cglm/clipspace/persp_rh_no.h \
|
||||
include/cglm/clipspace/ortho_lh_zo.h \
|
||||
include/cglm/clipspace/ortho_rh_zo.h \
|
||||
include/cglm/clipspace/persp_rh_zo.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_zo.h \
|
||||
include/cglm/clipspace/view_lh.h \
|
||||
include/cglm/clipspace/view_rh.h \
|
||||
include/cglm/clipspace/view_lh_zo.h \
|
||||
include/cglm/clipspace/view_rh_zo.h \
|
||||
include/cglm/clipspace/view_lh_no.h \
|
||||
include/cglm/clipspace/view_rh_no.h
|
||||
include/cglm/clipspace/view_lh_zo.h \
|
||||
include/cglm/clipspace/view_rh_no.h \
|
||||
include/cglm/clipspace/view_rh_zo.h \
|
||||
include/cglm/clipspace/project_no.h \
|
||||
include/cglm/clipspace/project_zo.h
|
||||
|
||||
cglm_calldir=$(includedir)/cglm/call
|
||||
cglm_call_HEADERS = include/cglm/call/mat4.h \
|
||||
@@ -93,7 +100,9 @@ cglm_call_HEADERS = include/cglm/call/mat4.h \
|
||||
include/cglm/call/vec2.h \
|
||||
include/cglm/call/vec3.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/cam.h \
|
||||
include/cglm/call/quat.h \
|
||||
@@ -107,8 +116,25 @@ cglm_call_HEADERS = include/cglm/call/mat4.h \
|
||||
include/cglm/call/curve.h \
|
||||
include/cglm/call/bezier.h \
|
||||
include/cglm/call/ray.h \
|
||||
include/cglm/call/affine.h \
|
||||
include/cglm/call/affine2d.h
|
||||
|
||||
cglm_call_clipspacedir=$(includedir)/cglm/call/clipspace
|
||||
cglm_call_clipspace_HEADERS = include/cglm/call/clipspace/persp_lh_no.h \
|
||||
include/cglm/call/clipspace/persp_lh_zo.h \
|
||||
include/cglm/call/clipspace/persp_rh_no.h \
|
||||
include/cglm/call/clipspace/persp_rh_zo.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_zo.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_zo.h \
|
||||
include/cglm/call/clipspace/project_no.h \
|
||||
include/cglm/call/clipspace/project_zo.h
|
||||
|
||||
cglm_simddir=$(includedir)/cglm/simd
|
||||
cglm_simd_HEADERS = include/cglm/simd/intrin.h \
|
||||
include/cglm/simd/x86.h \
|
||||
@@ -126,22 +152,25 @@ cglm_simd_avx_HEADERS = include/cglm/simd/avx/mat4.h \
|
||||
include/cglm/simd/avx/affine.h
|
||||
|
||||
cglm_simd_neondir=$(includedir)/cglm/simd/neon
|
||||
cglm_simd_neon_HEADERS = include/cglm/simd/neon/mat4.h \
|
||||
cglm_simd_neon_HEADERS = include/cglm/simd/neon/affine.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
|
||||
|
||||
cglm_structdir=$(includedir)/cglm/struct
|
||||
cglm_struct_HEADERS = include/cglm/struct/mat4.h \
|
||||
include/cglm/struct/mat3.h \
|
||||
include/cglm/struct/mat2.h \
|
||||
include/cglm/struct/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-ext.h \
|
||||
include/cglm/struct/vec3.h \
|
||||
include/cglm/struct/vec3-ext.h \
|
||||
include/cglm/struct/vec4.h \
|
||||
include/cglm/struct/vec4-ext.h \
|
||||
include/cglm/struct/affine.h \
|
||||
include/cglm/struct/io.h \
|
||||
include/cglm/struct/cam.h \
|
||||
include/cglm/struct/quat.h \
|
||||
@@ -152,22 +181,23 @@ cglm_struct_HEADERS = include/cglm/struct/mat4.h \
|
||||
include/cglm/struct/project.h \
|
||||
include/cglm/struct/sphere.h \
|
||||
include/cglm/struct/color.h \
|
||||
include/cglm/struct/curve.h \
|
||||
include/cglm/struct/affine2d.h
|
||||
include/cglm/struct/curve.h
|
||||
|
||||
cglm_struct_clipspacedir=$(includedir)/cglm/struct/clipspace
|
||||
cglm_struct_clipspace_HEADERS = include/cglm/struct/clipspace/persp_lh_zo.h \
|
||||
include/cglm/struct/clipspace/persp_rh_zo.h \
|
||||
include/cglm/struct/clipspace/persp_lh_no.h \
|
||||
cglm_struct_clipspace_HEADERS = include/cglm/struct/clipspace/persp_lh_no.h \
|
||||
include/cglm/struct/clipspace/persp_lh_zo.h \
|
||||
include/cglm/struct/clipspace/persp_rh_no.h \
|
||||
include/cglm/struct/clipspace/ortho_lh_zo.h \
|
||||
include/cglm/struct/clipspace/ortho_rh_zo.h \
|
||||
include/cglm/struct/clipspace/persp_rh_zo.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/view_lh_zo.h \
|
||||
include/cglm/struct/clipspace/view_rh_zo.h \
|
||||
include/cglm/struct/clipspace/ortho_rh_zo.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=\
|
||||
src/euler.c \
|
||||
@@ -176,8 +206,11 @@ libcglm_la_SOURCES=\
|
||||
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/mat3.c \
|
||||
src/mat4.c \
|
||||
@@ -202,7 +235,9 @@ libcglm_la_SOURCES=\
|
||||
src/clipspace/view_lh_no.c \
|
||||
src/clipspace/view_lh_zo.c \
|
||||
src/clipspace/view_rh_no.c \
|
||||
src/clipspace/view_rh_zo.c
|
||||
src/clipspace/view_rh_zo.c \
|
||||
src/clipspace/project_no.c \
|
||||
src/clipspace/project_zo.c
|
||||
|
||||
test_tests_SOURCES=\
|
||||
test/runner.c \
|
||||
|
||||
81
README.md
81
README.md
@@ -1,19 +1,59 @@
|
||||
# 🎥 OpenGL Mathematics (glm) for `C`
|
||||
[](https://travis-ci.com/recp/cglm)
|
||||
[](https://ci.appveyor.com/project/recp/cglm/branch/master)
|
||||
[](http://cglm.readthedocs.io/en/latest/?badge=latest)
|
||||
[](https://coveralls.io/github/recp/cglm?branch=master)
|
||||
[](https://codecov.io/gh/recp/cglm)
|
||||
[](https://www.codacy.com/app/recp/cglm?utm_source=github.com&utm_medium=referral&utm_content=recp/cglm&utm_campaign=Badge_Grade)
|
||||
[](#backers)
|
||||
[](#sponsors)
|
||||
|
||||
#### Documentation
|
||||
<p align="center">
|
||||
<img alt="" src="cglm.png" width="550" />
|
||||
</p>
|
||||
<br>
|
||||
<p align="center">
|
||||
<a href="https://travis-ci.com/recp/cglm">
|
||||
<img src="https://travis-ci.com/recp/cglm.svg?branch=master"
|
||||
alt="Build Status">
|
||||
</a>
|
||||
<a href="https://ci.appveyor.com/project/recp/cglm/branch/master">
|
||||
<img src="https://ci.appveyor.com/api/projects/status/av7l3gc0yhfex8y4/branch/master?svg=true"
|
||||
alt="Windows Build Status">
|
||||
</a>
|
||||
<a href="http://cglm.readthedocs.io/en/latest/?badge=latest">
|
||||
<img src="https://readthedocs.org/projects/cglm/badge/?version=latest"
|
||||
alt="Documentation Status">
|
||||
</a>
|
||||
<a href="https://www.codacy.com/app/recp/cglm?utm_source=github.com&utm_medium=referral&utm_content=recp/cglm&utm_campaign=Badge_Grade">
|
||||
<img src="https://api.codacy.com/project/badge/Grade/6a62b37d5f214f178ebef269dc4a6bf1"
|
||||
alt="Codacy Badge"/>
|
||||
</a>
|
||||
<a href="https://coveralls.io/github/recp/cglm?branch=master">
|
||||
<img src="https://coveralls.io/repos/github/recp/cglm/badge.svg?branch=master"
|
||||
alt="Coverage Status"/>
|
||||
</a>
|
||||
<a href="https://codecov.io/gh/recp/cglm">
|
||||
<img src="https://codecov.io/gh/recp/cglm/branch/master/graph/badge.svg"
|
||||
alt="Coverage Status"/>
|
||||
</a>
|
||||
<br /><br />
|
||||
<a href="#sponsors">
|
||||
<img src="https://opencollective.com/cglm/sponsors/badge.svg"
|
||||
alt="Sponsors on Open Collective"/>
|
||||
</a>
|
||||
<a href="#backers">
|
||||
<img src="https://opencollective.com/cglm/backers/badge.svg"
|
||||
alt="Backers on Open Collective"/>
|
||||
</a>
|
||||
</p>
|
||||
|
||||
<br>
|
||||
|
||||
<p align="center">
|
||||
Highly optimized 2D|3D math library, also known as <b>OpenGL Mathematics (glm) for `C`</b>. <b>cglm</b> provides lot of utils to help math operations to be fast and quick to write. It is community friendly, feel free to bring any issues, bugs you faced.
|
||||
</p>
|
||||
|
||||
---
|
||||
|
||||
#### 📚 Documentation
|
||||
|
||||
Almost all functions (inline versions) and parameters are documented inside the corresponding headers. <br />
|
||||
Complete documentation: http://cglm.readthedocs.io
|
||||
|
||||
#### Note for previous versions:
|
||||
#### 📌 Note for previous versions:
|
||||
|
||||
- _dup (duplicate) is changed to _copy. For instance `glm_vec_dup -> glm_vec3_copy`
|
||||
- OpenGL related functions are dropped to make this lib platform/third-party independent
|
||||
@@ -28,30 +68,27 @@ you have the latest version
|
||||
- **[major change]** by starting v0.7.3, inline print functions are disabled in release/production mode to eliminate print costs (see options in documentation). Print output also improved. You can disable colors if you need (see documentation)
|
||||
- **[major change]** by starting v0.8.3, **cglm** supports alternative clipspace configuations e.g. Left Handed, Zero-to-One (_zo)... `CGLM_FORCE_DEPTH_ZERO_TO_ONE` and `CGLM_FORCE_LEFT_HANDED` is provided to control clipspace. You should be able to use **cglm** with Vulkan, DirectX and Metal now... see https://cglm.readthedocs.io/en/latest/opt.html#clipspace-option-s
|
||||
|
||||
#### Note for C++ developers:
|
||||
#### 📌 Note for C++ developers:
|
||||
If you are not aware of the original GLM library yet, you may also want to look at:
|
||||
https://github.com/g-truc/glm
|
||||
|
||||
#### Note for new comers (Important):
|
||||
#### 📌 Note for new comers (Important):
|
||||
- `vec4` and `mat4` variables must be aligned. (There will be unaligned versions later)
|
||||
- **in** and **[in, out]** parameters must be initialized (please). But **[out]** parameters not, initializing out param is also redundant
|
||||
- All functions are inline if you don't want to use pre-compiled versions with glmc_ prefix, you can ignore build process. Just include headers.
|
||||
- if your debugger takes you to cglm headers then make sure you are not trying to copy vec4 to vec3 or alig issues...
|
||||
- Welcome!
|
||||
|
||||
#### Note for experienced developers:
|
||||
#### 📌 Note for experienced developers:
|
||||
- Since I'm testing this library in my projects, sometimes bugs occurs; finding that bug[s] and making improvements would be more easy with multiple developer/contributor and their projects or knowledge. Consider to make some tests if you suspect something is wrong and any feedbacks, contributions and bug reports are always welcome.
|
||||
|
||||
#### Allocations?
|
||||
#### 📌 Allocations?
|
||||
`cglm` doesn't alloc any memory on heap. So it doesn't provide any allocator. You should alloc memory for **out** parameters too if you pass pointer of memory location. Don't forget that **vec4** (also quat/**versor**) and **mat4** must be aligned (16-bytes), because *cglm* uses SIMD instructions to optimize most operations if available.
|
||||
|
||||
#### Returning vector or matrix... ?
|
||||
#### 📌 Returning vector or matrix... ?
|
||||
|
||||
**cglm** supports both *ARRAY API* and *STRUCT API*, so you can return structs if you utilize struct api (`glms_`).
|
||||
|
||||
#### Other APIs like Vulkan, Metal, Dx?
|
||||
Currently *cglm* uses default clip space configuration (-1, 1) for camera functions (perspective, extract corners...), in the future other clip space configurations will be supported
|
||||
|
||||
<hr/>
|
||||
|
||||
<table>
|
||||
@@ -69,7 +106,7 @@ Currently *cglm* uses default clip space configuration (-1, 1) for camera functi
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
## Features
|
||||
## 🚀 Features
|
||||
- **scalar** and **simd** (sse, avx, neon...) optimizations
|
||||
- option to use different clipspaces e.g. Left Handed, Zero-to-One... (currrently right handed negative-one is default)
|
||||
- array api and struct api, you can use arrays or structs.
|
||||
@@ -151,7 +188,7 @@ Struct functions generally take their parameters as *values* and *return* their
|
||||
|
||||
The types used are actually unions that allow access to the same data multiple ways. One of those ways involves anonymous structures, available since C11. MSVC also supports it for earlier C versions out of the box and GCC/Clang do if you enable `-fms-extensions`. To explicitly enable these anonymous structures, `#define CGLM_USE_ANONYMOUS_STRUCT` to `1`, to disable them, to `0`. For backward compatibility, you can also `#define CGLM_NO_ANONYMOUS_STRUCT` (value is irrelevant) to disable them. If you don't specify explicitly, cglm will do a best guess based on your compiler and the C version you're using.
|
||||
|
||||
## Build
|
||||
## 🔨 Build
|
||||
|
||||
### CMake (All platforms)
|
||||
```bash
|
||||
@@ -394,7 +431,7 @@ You can pass matrices the same way to other APIs e.g. Vulkan, DX...
|
||||
|
||||
## 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
|
||||
|
||||
**TODO:**
|
||||
@@ -403,7 +440,7 @@ You can pass matrices the same way to other APIs e.g. Vulkan, DX...
|
||||
- [x] Add version info
|
||||
- [ ] Unaligned operations (e.g. `glm_umat4_mul`)
|
||||
- [x] Extra documentation
|
||||
- [ ] ARM Neon Arch (In Progress)
|
||||
- [x] ARM Neon Arch
|
||||
|
||||
|
||||
## Contributors
|
||||
|
||||
@@ -2,7 +2,7 @@ Pod::Spec.new do |s|
|
||||
|
||||
# Description
|
||||
s.name = "cglm"
|
||||
s.version = "0.8.2"
|
||||
s.version = "0.8.9"
|
||||
s.summary = "📽 Highly Optimized Graphics Math (glm) for C"
|
||||
s.description = <<-DESC
|
||||
cglm is math library for graphics programming for C. See the documentation or README for all features.
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
#*****************************************************************************
|
||||
|
||||
AC_PREREQ([2.69])
|
||||
AC_INIT([cglm], [0.8.3], [info@recp.me])
|
||||
AC_INIT([cglm], [0.9.0], [info@recp.me])
|
||||
AM_INIT_AUTOMAKE([-Wall -Werror foreign subdir-objects serial-tests])
|
||||
|
||||
# Don't use the default cflags (-O2 -g), we set ours manually in Makefile.am.
|
||||
|
||||
129
docs/source/affine-common.rst
Normal file
129
docs/source/affine-common.rst
Normal 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
129
docs/source/affine-post.rst
Normal 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
240
docs/source/affine-pre.rst
Normal 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
|
||||
@@ -5,6 +5,18 @@
|
||||
|
||||
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
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
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.
|
||||
**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)
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
@@ -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)**
|
||||
|
||||
**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:
|
||||
|
||||
@@ -45,6 +61,13 @@ The implementation would be:
|
||||
glm_rotate(m, angle, axis);
|
||||
glm_translate(m, pivotInv); /* pivotInv = -pivot */
|
||||
|
||||
or just:
|
||||
|
||||
.. code-block:: c
|
||||
:linenos:
|
||||
|
||||
glm_rotate_at(m, pivot, angle, axis);
|
||||
|
||||
.. _TransformsOrder:
|
||||
|
||||
Transforms Order
|
||||
@@ -54,7 +77,7 @@ It is important to understand this part especially if you call transform
|
||||
functions multiple times
|
||||
|
||||
`glm_translate`, `glm_rotate`, `glm_scale` and `glm_quat_rotate` and their
|
||||
helpers functions works like this (cglm may provide reverse order too as alternative in the future):
|
||||
helpers functions works like this (cglm provides reverse order as `ed` suffix e.g `glm_translated`, `glm_rotated` see post transforms):
|
||||
|
||||
.. code-block:: c
|
||||
:linenos:
|
||||
@@ -147,199 +170,27 @@ Functions:
|
||||
#. :c:func:`glm_decompose_rs`
|
||||
#. :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
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. 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
|
||||
|
||||
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]
|
||||
affine-common
|
||||
affine-pre
|
||||
affine-post
|
||||
|
||||
@@ -34,15 +34,18 @@ Follow the :doc:`build` documentation for this
|
||||
box
|
||||
quat
|
||||
euler
|
||||
mat4
|
||||
mat3
|
||||
mat2
|
||||
mat3
|
||||
mat4
|
||||
vec2
|
||||
vec2-ext
|
||||
vec3
|
||||
vec3-ext
|
||||
vec4
|
||||
vec4-ext
|
||||
vec2
|
||||
vec2-ext
|
||||
ivec2
|
||||
ivec3
|
||||
ivec4
|
||||
color
|
||||
plane
|
||||
project
|
||||
|
||||
@@ -101,7 +101,7 @@ Functions documentation
|
||||
Parameters:
|
||||
| *[in]* **box** AABB
|
||||
| *[in]* **padding** padding
|
||||
| *[out]* **d** result matrix
|
||||
| *[out]* **dest** result matrix
|
||||
|
||||
.. c:function:: void glm_ortho_aabb_pz(vec3 box[2], float padding, mat4 dest)
|
||||
|
||||
@@ -113,7 +113,7 @@ Functions documentation
|
||||
Parameters:
|
||||
| *[in]* **box** AABB
|
||||
| *[in]* **padding** padding for near and far
|
||||
| *[out]* **d** result matrix
|
||||
| *[out]* **dest** result matrix
|
||||
|
||||
Returns:
|
||||
square of norm / magnitude
|
||||
@@ -140,7 +140,7 @@ Functions documentation
|
||||
| set up perspective projection matrix
|
||||
|
||||
Parameters:
|
||||
| *[in]* **fovy** field of view angle
|
||||
| *[in]* **fovy** field of view angle (in radians)
|
||||
| *[in]* **aspect** aspect ratio ( width / height )
|
||||
| *[in]* **nearVal** near clipping plane
|
||||
| *[in]* **farVal** far clipping planes
|
||||
|
||||
@@ -62,9 +62,9 @@ author = u'Recep Aslantas'
|
||||
# built documents.
|
||||
#
|
||||
# The short X.Y version.
|
||||
version = u'0.8.3'
|
||||
version = u'0.9.0'
|
||||
# The full version, including alpha/beta/rc tags.
|
||||
release = u'0.8.3'
|
||||
release = u'0.9.0'
|
||||
|
||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||
# for a list of supported languages.
|
||||
|
||||
@@ -6,13 +6,12 @@
|
||||
cglm Documentation
|
||||
================================
|
||||
|
||||
**cglm** is optimized 3D math library written in C99 (compatible with C89).
|
||||
It is similar to original **glm** library except this is mainly for **C**
|
||||
**cglm** is an optimized 3D math library written in C99 (compatible with C89).
|
||||
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
|
||||
is considered to be supported as optional.
|
||||
|
||||
Also currently only **float** type is supported for most operations.
|
||||
**cglm** stores matrices as column-major order but in the future row-major is
|
||||
considered to be supported as optional.
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
@@ -46,8 +45,8 @@ Also currently only **float** type is supported for most operations.
|
||||
|
||||
troubleshooting
|
||||
|
||||
Indices and tables
|
||||
==================
|
||||
Indices and Tables:
|
||||
===================
|
||||
|
||||
* :ref:`genindex`
|
||||
* :ref:`modindex`
|
||||
|
||||
179
docs/source/ivec2.rst
Normal file
179
docs/source/ivec2.rst
Normal file
@@ -0,0 +1,179 @@
|
||||
.. default-domain:: C
|
||||
|
||||
ivec2
|
||||
=====
|
||||
|
||||
Header: cglm/ivec2.h
|
||||
|
||||
Table of contents (click to go):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Macros:
|
||||
|
||||
1. GLM_IVEC2_ONE_INIT
|
||||
#. GLM_IVEC2_ZERO_INIT
|
||||
#. GLM_IVEC2_ONE
|
||||
#. GLM_IVEC2_ZERO
|
||||
|
||||
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`
|
||||
#. :c:func:`glm_ivec2_abs`
|
||||
|
||||
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
|
||||
|
||||
.. c:function:: void glm_ivec2_abs(ivec2 v, ivec2 dest)
|
||||
|
||||
absolute value of each vector item
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[out]* **dest** destination vector
|
||||
179
docs/source/ivec3.rst
Normal file
179
docs/source/ivec3.rst
Normal file
@@ -0,0 +1,179 @@
|
||||
.. default-domain:: C
|
||||
|
||||
ivec3
|
||||
=====
|
||||
|
||||
Header: cglm/ivec3.h
|
||||
|
||||
Table of contents (click to go):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Macros:
|
||||
|
||||
1. GLM_IVEC3_ONE_INIT
|
||||
#. GLM_IVEC3_ZERO_INIT
|
||||
#. GLM_IVEC3_ONE
|
||||
#. GLM_IVEC3_ZERO
|
||||
|
||||
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`
|
||||
#. :c:func:`glm_ivec2_abs`
|
||||
|
||||
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
|
||||
|
||||
.. c:function:: void glm_ivec3_abs(ivec3 v, ivec3 dest)
|
||||
|
||||
absolute value of each vector item
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[out]* **dest** destination vector
|
||||
179
docs/source/ivec4.rst
Normal file
179
docs/source/ivec4.rst
Normal file
@@ -0,0 +1,179 @@
|
||||
.. default-domain:: C
|
||||
|
||||
ivec4
|
||||
=====
|
||||
|
||||
Header: cglm/ivec4.h
|
||||
|
||||
Table of contents (click to go):
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Macros:
|
||||
|
||||
1. GLM_IVEC4_ONE_INIT
|
||||
#. GLM_IVEC4_ZERO_INIT
|
||||
#. GLM_IVEC4_ONE
|
||||
#. GLM_IVEC4_ZERO
|
||||
|
||||
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`
|
||||
#. :c:func:`glm_ivec4_abs`
|
||||
|
||||
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
|
||||
|
||||
.. c:function:: void glm_ivec4_abs(ivec4 v, ivec4 dest)
|
||||
|
||||
absolute value of each vector item
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[out]* **dest** destination vector
|
||||
@@ -27,8 +27,8 @@ Functions documentation
|
||||
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
|
||||
:c:func:`glm_unproject` version. You may use existing inverse of matrix in somewhere
|
||||
else, this is why **glm_unprojecti** exists to save inversion cost
|
||||
|
||||
[1] space:
|
||||
- if m = invProj: View Space
|
||||
@@ -57,7 +57,7 @@ Functions documentation
|
||||
| maps the specified viewport coordinates into specified space [1]
|
||||
the matrix should contain projection matrix.
|
||||
|
||||
this is same as glm_unprojecti except this function get inverse matrix for
|
||||
this is same as :c:func:`glm_unprojecti` except this function get inverse matrix for
|
||||
you.
|
||||
|
||||
[1] space:
|
||||
@@ -91,12 +91,29 @@ Functions documentation
|
||||
glm_mat4_mul(proj, view, viewProj);
|
||||
glm_mat4_mul(viewProj, model, MVP);
|
||||
|
||||
this could be useful for gettng a bbox which fits with view frustum and
|
||||
object bounding boxes. In this case you crop view frustum box with objects
|
||||
box
|
||||
|
||||
Parameters:
|
||||
| *[in]* **pos** object coordinates
|
||||
| *[in]* **m** MVP matrix
|
||||
| *[in]* **vp** viewport as [x, y, width, height]
|
||||
| *[out]* **dest** projected coordinates
|
||||
|
||||
.. 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
|
||||
@@ -32,6 +32,7 @@ Functions:
|
||||
#. :c:func:`glm_quat`
|
||||
#. :c:func:`glm_quatv`
|
||||
#. :c:func:`glm_quat_copy`
|
||||
#. :c:func:`glm_quat_from_vecs`
|
||||
#. :c:func:`glm_quat_norm`
|
||||
#. :c:func:`glm_quat_normalize`
|
||||
#. :c:func:`glm_quat_normalize_to`
|
||||
@@ -123,6 +124,20 @@ Functions documentation
|
||||
| *[in]* **q** source quaternion
|
||||
| *[out]* **dest** destination quaternion
|
||||
|
||||
.. c:function:: void glm_quat_from_vecs(vec3 a, vec3 b, versor dest)
|
||||
|
||||
| compute unit quaternion needed to rotate a into b
|
||||
|
||||
References:
|
||||
* `Finding quaternion representing the rotation from one vector to another <https://stackoverflow.com/a/11741520/183120>`_
|
||||
* `Quaternion from two vectors <http://lolengine.net/blog/2014/02/24/quaternion-from-two-vectors-final>`_
|
||||
* `Angle between vectors <http://www.euclideanspace.com/maths/algebra/vectors/angleBetween/minorlogic.htm>`_
|
||||
|
||||
Parameters:
|
||||
| *[in]* **a** unit vector
|
||||
| *[in]* **b** unit vector
|
||||
| *[in]* **dest** unit quaternion
|
||||
|
||||
.. c:function:: float glm_quat_norm(versor q)
|
||||
|
||||
| returns norm (magnitude) of quaternion
|
||||
|
||||
@@ -26,6 +26,7 @@ Functions:
|
||||
#. :c:func:`glm_vec2_isinf`
|
||||
#. :c:func:`glm_vec2_isvalid`
|
||||
#. :c:func:`glm_vec2_sign`
|
||||
#. :c:func:`glm_vec2_abs`
|
||||
#. :c:func:`glm_vec2_sqrt`
|
||||
|
||||
Functions documentation
|
||||
@@ -125,6 +126,14 @@ Functions documentation
|
||||
| *[in]* **v** vector
|
||||
| *[out]* **dest** sign vector (only keeps signs as -1, 0, -1)
|
||||
|
||||
.. c:function:: void glm_vec2_abs(vec2 v, vec2 dest)
|
||||
|
||||
absolute value of each vector item
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[out]* **dest** destination vector
|
||||
|
||||
.. c:function:: void glm_vec2_sqrt(vec2 v, vec2 dest)
|
||||
|
||||
square root of each vector item
|
||||
|
||||
@@ -10,10 +10,10 @@ Table of contents (click to go):
|
||||
|
||||
Macros:
|
||||
|
||||
1. GLM_vec2_ONE_INIT
|
||||
#. GLM_vec2_ZERO_INIT
|
||||
#. GLM_vec2_ONE
|
||||
#. GLM_vec2_ZERO
|
||||
1. GLM_VEC2_ONE_INIT
|
||||
#. GLM_VEC2_ZERO_INIT
|
||||
#. GLM_VEC2_ONE
|
||||
#. GLM_VEC2_ZERO
|
||||
|
||||
Functions:
|
||||
|
||||
|
||||
@@ -27,6 +27,7 @@ Functions:
|
||||
#. :c:func:`glm_vec3_isinf`
|
||||
#. :c:func:`glm_vec3_isvalid`
|
||||
#. :c:func:`glm_vec3_sign`
|
||||
#. :c:func:`glm_vec3_abs`
|
||||
#. :c:func:`glm_vec3_sqrt`
|
||||
|
||||
Functions documentation
|
||||
@@ -134,6 +135,14 @@ Functions documentation
|
||||
| *[in]* **v** vector
|
||||
| *[out]* **dest** sign vector (only keeps signs as -1, 0, -1)
|
||||
|
||||
.. c:function:: void glm_vec3_abs(vec3 v, vec3 dest)
|
||||
|
||||
absolute value of each vector item
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[out]* **dest** destination vector
|
||||
|
||||
.. c:function:: void glm_vec3_sqrt(vec3 v, vec3 dest)
|
||||
|
||||
square root of each vector item
|
||||
|
||||
@@ -474,6 +474,9 @@ Functions documentation
|
||||
|
||||
possible orthogonal/perpendicular vector
|
||||
|
||||
References:
|
||||
* `On picking an orthogonal vector (and combing coconuts) <http://lolengine.net/blog/2013/09/21/picking-orthogonal-vector-combing-coconuts>`_
|
||||
|
||||
Parameters:
|
||||
| *[in]* **v** vector
|
||||
| *[out]* **dest** orthogonal/perpendicular vector
|
||||
|
||||
247
include/cglm/affine-post.h
Normal file
247
include/cglm/affine-post.h
Normal 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
285
include/cglm/affine-pre.h
Normal 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 */
|
||||
@@ -24,6 +24,7 @@
|
||||
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);
|
||||
CGLM_INLINE void glm_decompose_scalev(mat4 m, vec3 s);
|
||||
CGLM_INLINE bool glm_uniscaled(mat4 m);
|
||||
CGLM_INLINE void glm_decompose_rs(mat4 m, mat4 r, vec3 s);
|
||||
@@ -40,106 +41,6 @@
|
||||
#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 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);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @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
|
||||
*
|
||||
@@ -321,67 +147,6 @@ glm_rotate_make(mat4 m, float angle, vec3 axis) {
|
||||
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
|
||||
*
|
||||
@@ -467,4 +232,7 @@ glm_decompose(mat4 m, vec4 t, mat4 r, vec3 s) {
|
||||
glm_decompose_rs(m, r, s);
|
||||
}
|
||||
|
||||
#include "affine-pre.h"
|
||||
#include "affine-post.h"
|
||||
|
||||
#endif /* cglm_affine_h */
|
||||
|
||||
@@ -15,6 +15,9 @@ extern "C" {
|
||||
#include "call/vec2.h"
|
||||
#include "call/vec3.h"
|
||||
#include "call/vec4.h"
|
||||
#include "call/ivec2.h"
|
||||
#include "call/ivec3.h"
|
||||
#include "call/ivec4.h"
|
||||
#include "call/mat2.h"
|
||||
#include "call/mat3.h"
|
||||
#include "call/mat4.h"
|
||||
|
||||
@@ -81,6 +81,10 @@ CGLM_EXPORT
|
||||
void
|
||||
glmc_rotate_atm(mat4 m, vec3 pivot, float angle, vec3 axis);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_spin(mat4 m, float angle, vec3 axis);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_decompose_scalev(mat4 m, vec3 s);
|
||||
@@ -97,6 +101,52 @@ CGLM_EXPORT
|
||||
void
|
||||
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 */
|
||||
|
||||
CGLM_EXPORT
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "../cglm.h"
|
||||
#include "../../cglm.h"
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "../cglm.h"
|
||||
#include "../../cglm.h"
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "../cglm.h"
|
||||
#include "../../cglm.h"
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "../cglm.h"
|
||||
#include "../../cglm.h"
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "../cglm.h"
|
||||
#include "../../cglm.h"
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "../cglm.h"
|
||||
#include "../../cglm.h"
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "../cglm.h"
|
||||
#include "../../cglm.h"
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "../cglm.h"
|
||||
#include "../../cglm.h"
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
|
||||
31
include/cglm/call/clipspace/project_no.h
Normal file
31
include/cglm/call/clipspace/project_no.h
Normal file
@@ -0,0 +1,31 @@
|
||||
/*
|
||||
* Copyright (c), Recep Aslantas.
|
||||
*
|
||||
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||
* Full license can be found in the LICENSE file
|
||||
*/
|
||||
|
||||
#ifndef cglmc_project_no_h
|
||||
#define cglmc_project_no_h
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "../../cglm.h"
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_unprojecti_no(vec3 pos, mat4 invMat, vec4 vp, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_project_no(vec3 pos, mat4 m, vec4 vp, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_project_z_no(vec3 pos, mat4 m);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif /* cglmc_project_no_h */
|
||||
31
include/cglm/call/clipspace/project_zo.h
Normal file
31
include/cglm/call/clipspace/project_zo.h
Normal file
@@ -0,0 +1,31 @@
|
||||
/*
|
||||
* Copyright (c), Recep Aslantas.
|
||||
*
|
||||
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||
* Full license can be found in the LICENSE file
|
||||
*/
|
||||
|
||||
#ifndef cglmc_project_zo_h
|
||||
#define cglmc_project_zo_h
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "../../cglm.h"
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_unprojecti_zo(vec3 pos, mat4 invMat, vec4 vp, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_project_zo(vec3 pos, mat4 m, vec4 vp, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_project_z_zo(vec3 pos, mat4 m);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif /* cglmc_project_zo_h */
|
||||
@@ -11,7 +11,7 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "../cglm.h"
|
||||
#include "../../cglm.h"
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "../cglm.h"
|
||||
#include "../../cglm.h"
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "../cglm.h"
|
||||
#include "../../cglm.h"
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "../cglm.h"
|
||||
#include "../../cglm.h"
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
|
||||
83
include/cglm/call/ivec2.h
Normal file
83
include/cglm/call/ivec2.h
Normal file
@@ -0,0 +1,83 @@
|
||||
/*
|
||||
* 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);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec2_abs(ivec2 v, ivec2 dest);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif /* cglmc_ivec2_h */
|
||||
83
include/cglm/call/ivec3.h
Normal file
83
include/cglm/call/ivec3.h
Normal file
@@ -0,0 +1,83 @@
|
||||
/*
|
||||
* 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);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec3_abs(ivec3 v, ivec3 dest);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif /* cglmc_ivec3_h */
|
||||
83
include/cglm/call/ivec4.h
Normal file
83
include/cglm/call/ivec4.h
Normal file
@@ -0,0 +1,83 @@
|
||||
/*
|
||||
* 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);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_ivec4_abs(ivec4 v, ivec4 dest);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif /* cglmc_ivec4_h */
|
||||
@@ -25,6 +25,14 @@ CGLM_EXPORT
|
||||
void
|
||||
glmc_project(vec3 pos, mat4 m, vec4 vp, vec3 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_project_z(vec3 pos, mat4 m);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_pickmatrix(vec2 center, vec2 size, vec4 vp, mat4 dest);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -37,6 +37,10 @@ CGLM_EXPORT
|
||||
void
|
||||
glmc_quat_copy(versor q, versor dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_quat_from_vecs(vec3 a, vec3 b, versor dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
float
|
||||
glmc_quat_norm(versor q);
|
||||
|
||||
@@ -145,10 +145,26 @@ CGLM_EXPORT
|
||||
void
|
||||
glmc_vec2_clamp(vec2 v, float minval, float maxval);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
glmc_vec2_abs(vec2 v, vec2 dest);
|
||||
|
||||
CGLM_EXPORT
|
||||
void
|
||||
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
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -12,6 +12,9 @@
|
||||
#include "vec2.h"
|
||||
#include "vec3.h"
|
||||
#include "vec4.h"
|
||||
#include "ivec2.h"
|
||||
#include "ivec3.h"
|
||||
#include "ivec4.h"
|
||||
#include "mat4.h"
|
||||
#include "mat3.h"
|
||||
#include "mat2.h"
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
|
||||
#include "../common.h"
|
||||
#include "../plane.h"
|
||||
#include "../mat4.h"
|
||||
|
||||
/*!
|
||||
* @brief set up orthographic projection matrix
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
|
||||
#include "../common.h"
|
||||
#include "../plane.h"
|
||||
#include "../mat4.h"
|
||||
|
||||
/*!
|
||||
* @brief set up orthographic projection matrix with a left-hand coordinate
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
|
||||
#include "../common.h"
|
||||
#include "../plane.h"
|
||||
#include "../mat4.h"
|
||||
|
||||
/*!
|
||||
* @brief set up orthographic projection matrix
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
|
||||
#include "../common.h"
|
||||
#include "../plane.h"
|
||||
#include "../mat4.h"
|
||||
|
||||
/*!
|
||||
* @brief set up orthographic projection matrix with a right-hand coordinate
|
||||
|
||||
@@ -47,7 +47,6 @@
|
||||
#define cglm_persp_lh_no_h
|
||||
|
||||
#include "../common.h"
|
||||
#include "../plane.h"
|
||||
#include "persp.h"
|
||||
|
||||
/*!
|
||||
|
||||
@@ -47,7 +47,6 @@
|
||||
#define cglm_persp_lh_zo_h
|
||||
|
||||
#include "../common.h"
|
||||
#include "../plane.h"
|
||||
#include "persp.h"
|
||||
|
||||
/*!
|
||||
|
||||
@@ -47,7 +47,6 @@
|
||||
#define cglm_persp_rh_no_h
|
||||
|
||||
#include "../common.h"
|
||||
#include "../plane.h"
|
||||
#include "persp.h"
|
||||
|
||||
/*!
|
||||
|
||||
@@ -47,7 +47,6 @@
|
||||
#define cglm_persp_rh_zo_h
|
||||
|
||||
#include "../common.h"
|
||||
#include "../plane.h"
|
||||
#include "persp.h"
|
||||
|
||||
/*!
|
||||
|
||||
109
include/cglm/clipspace/project_no.h
Normal file
109
include/cglm/clipspace/project_no.h
Normal file
@@ -0,0 +1,109 @@
|
||||
/*
|
||||
* Copyright (c), Recep Aslantas.
|
||||
*
|
||||
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||
* Full license can be found in the LICENSE file
|
||||
*/
|
||||
|
||||
#ifndef cglm_project_no_h
|
||||
#define cglm_project_no_h
|
||||
|
||||
#include "../common.h"
|
||||
#include "../vec3.h"
|
||||
#include "../vec4.h"
|
||||
#include "../mat4.h"
|
||||
|
||||
/*!
|
||||
* @brief maps the specified viewport coordinates into specified space [1]
|
||||
* the matrix should contain projection matrix.
|
||||
*
|
||||
* if you don't have ( and don't want to have ) an inverse matrix then use
|
||||
* glm_unproject version. You may use existing inverse of matrix in somewhere
|
||||
* else, this is why glm_unprojecti exists to save save inversion cost
|
||||
*
|
||||
* [1] space:
|
||||
* 1- if m = invProj: View Space
|
||||
* 2- if m = invViewProj: World Space
|
||||
* 3- if m = invMVP: Object Space
|
||||
*
|
||||
* You probably want to map the coordinates into object space
|
||||
* so use invMVP as m
|
||||
*
|
||||
* Computing viewProj:
|
||||
* glm_mat4_mul(proj, view, viewProj);
|
||||
* glm_mat4_mul(viewProj, model, MVP);
|
||||
* glm_mat4_inv(viewProj, invMVP);
|
||||
*
|
||||
* @param[in] pos point/position in viewport coordinates
|
||||
* @param[in] invMat matrix (see brief)
|
||||
* @param[in] vp viewport as [x, y, width, height]
|
||||
* @param[out] dest unprojected coordinates
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_unprojecti_no(vec3 pos, mat4 invMat, vec4 vp, vec3 dest) {
|
||||
vec4 v;
|
||||
|
||||
v[0] = 2.0f * (pos[0] - vp[0]) / vp[2] - 1.0f;
|
||||
v[1] = 2.0f * (pos[1] - vp[1]) / vp[3] - 1.0f;
|
||||
v[2] = 2.0f * pos[2] - 1.0f;
|
||||
v[3] = 1.0f;
|
||||
|
||||
glm_mat4_mulv(invMat, v, v);
|
||||
glm_vec4_scale(v, 1.0f / v[3], v);
|
||||
glm_vec3(v, dest);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief map object coordinates to window coordinates
|
||||
*
|
||||
* Computing MVP:
|
||||
* glm_mat4_mul(proj, view, viewProj);
|
||||
* glm_mat4_mul(viewProj, model, MVP);
|
||||
*
|
||||
* @param[in] pos object coordinates
|
||||
* @param[in] m MVP matrix
|
||||
* @param[in] vp viewport as [x, y, width, height]
|
||||
* @param[out] dest projected coordinates
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_project_no(vec3 pos, mat4 m, vec4 vp, vec3 dest) {
|
||||
CGLM_ALIGN(16) vec4 pos4;
|
||||
|
||||
glm_vec4(pos, 1.0f, pos4);
|
||||
|
||||
glm_mat4_mulv(m, pos4, pos4);
|
||||
glm_vec4_scale(pos4, 1.0f / pos4[3], pos4); /* pos = pos / pos.w */
|
||||
glm_vec4_scale(pos4, 0.5f, pos4);
|
||||
glm_vec4_adds(pos4, 0.5f, pos4);
|
||||
|
||||
dest[0] = pos4[0] * vp[2] + vp[0];
|
||||
dest[1] = pos4[1] * vp[3] + vp[1];
|
||||
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 */
|
||||
111
include/cglm/clipspace/project_zo.h
Normal file
111
include/cglm/clipspace/project_zo.h
Normal file
@@ -0,0 +1,111 @@
|
||||
/*
|
||||
* Copyright (c), Recep Aslantas.
|
||||
*
|
||||
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||
* Full license can be found in the LICENSE file
|
||||
*/
|
||||
|
||||
#ifndef cglm_project_zo_h
|
||||
#define cglm_project_zo_h
|
||||
|
||||
#include "../common.h"
|
||||
#include "../vec3.h"
|
||||
#include "../vec4.h"
|
||||
#include "../mat4.h"
|
||||
|
||||
/*!
|
||||
* @brief maps the specified viewport coordinates into specified space [1]
|
||||
* the matrix should contain projection matrix.
|
||||
*
|
||||
* if you don't have ( and don't want to have ) an inverse matrix then use
|
||||
* glm_unproject version. You may use existing inverse of matrix in somewhere
|
||||
* else, this is why glm_unprojecti exists to save save inversion cost
|
||||
*
|
||||
* [1] space:
|
||||
* 1- if m = invProj: View Space
|
||||
* 2- if m = invViewProj: World Space
|
||||
* 3- if m = invMVP: Object Space
|
||||
*
|
||||
* You probably want to map the coordinates into object space
|
||||
* so use invMVP as m
|
||||
*
|
||||
* Computing viewProj:
|
||||
* glm_mat4_mul(proj, view, viewProj);
|
||||
* glm_mat4_mul(viewProj, model, MVP);
|
||||
* glm_mat4_inv(viewProj, invMVP);
|
||||
*
|
||||
* @param[in] pos point/position in viewport coordinates
|
||||
* @param[in] invMat matrix (see brief)
|
||||
* @param[in] vp viewport as [x, y, width, height]
|
||||
* @param[out] dest unprojected coordinates
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_unprojecti_zo(vec3 pos, mat4 invMat, vec4 vp, vec3 dest) {
|
||||
vec4 v;
|
||||
|
||||
v[0] = 2.0f * (pos[0] - vp[0]) / vp[2] - 1.0f;
|
||||
v[1] = 2.0f * (pos[1] - vp[1]) / vp[3] - 1.0f;
|
||||
v[2] = pos[2];
|
||||
v[3] = 1.0f;
|
||||
|
||||
glm_mat4_mulv(invMat, v, v);
|
||||
glm_vec4_scale(v, 1.0f / v[3], v);
|
||||
glm_vec3(v, dest);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief map object coordinates to window coordinates
|
||||
*
|
||||
* Computing MVP:
|
||||
* glm_mat4_mul(proj, view, viewProj);
|
||||
* glm_mat4_mul(viewProj, model, MVP);
|
||||
*
|
||||
* @param[in] pos object coordinates
|
||||
* @param[in] m MVP matrix
|
||||
* @param[in] vp viewport as [x, y, width, height]
|
||||
* @param[out] dest projected coordinates
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_project_zo(vec3 pos, mat4 m, vec4 vp, vec3 dest) {
|
||||
CGLM_ALIGN(16) vec4 pos4;
|
||||
|
||||
glm_vec4(pos, 1.0f, pos4);
|
||||
|
||||
glm_mat4_mulv(m, pos4, pos4);
|
||||
glm_vec4_scale(pos4, 1.0f / pos4[3], pos4); /* pos = pos / pos.w */
|
||||
|
||||
dest[2] = pos4[2];
|
||||
|
||||
glm_vec4_scale(pos4, 0.5f, pos4);
|
||||
glm_vec4_adds(pos4, 0.5f, pos4);
|
||||
|
||||
dest[0] = pos4[0] * vp[2] + vp[0];
|
||||
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 */
|
||||
@@ -37,8 +37,8 @@ glm_lookat_lh(vec3 eye, vec3 center, vec3 up, mat4 dest) {
|
||||
glm_vec3_sub(center, eye, f);
|
||||
glm_vec3_normalize(f);
|
||||
|
||||
glm_vec3_crossn(f, up, s);
|
||||
glm_vec3_cross(s, f, u);
|
||||
glm_vec3_crossn(up, f, s);
|
||||
glm_vec3_cross(f, s, u);
|
||||
|
||||
dest[0][0] = s[0];
|
||||
dest[0][1] = u[0];
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
#ifndef cglm_view_lh_no_h
|
||||
#define cglm_view_lh_no_h
|
||||
|
||||
#include "../common.h"
|
||||
#include "view_lh.h"
|
||||
|
||||
/*!
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
#ifndef cglm_view_lh_zo_h
|
||||
#define cglm_view_lh_zo_h
|
||||
|
||||
#include "../common.h"
|
||||
#include "view_lh.h"
|
||||
|
||||
/*!
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
#ifndef cglm_view_rh_no_h
|
||||
#define cglm_view_rh_no_h
|
||||
|
||||
#include "../common.h"
|
||||
#include "view_rh.h"
|
||||
|
||||
/*!
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
#ifndef cglm_view_rh_zo_h
|
||||
#define cglm_view_rh_zo_h
|
||||
|
||||
#include "../common.h"
|
||||
#include "view_rh.h"
|
||||
|
||||
/*!
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stddef.h>
|
||||
#include <stdlib.h>
|
||||
#include <math.h>
|
||||
#include <float.h>
|
||||
#include <stdbool.h>
|
||||
@@ -44,16 +45,16 @@
|
||||
|
||||
#ifndef CGLM_USE_DEFAULT_EPSILON
|
||||
# ifndef GLM_FLT_EPSILON
|
||||
# define GLM_FLT_EPSILON 1e-6
|
||||
# define GLM_FLT_EPSILON 1e-5f
|
||||
# endif
|
||||
#else
|
||||
# define GLM_FLT_EPSILON FLT_EPSILON
|
||||
#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.
|
||||
* 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.
|
||||
*/
|
||||
|
||||
@@ -81,4 +82,34 @@
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* struct API configurator */
|
||||
/* TODO: move struct/common.h? */
|
||||
/* WARN: dont use concant helpers outside cglm headers, because they may be changed */
|
||||
|
||||
#define CGLM_MACRO_CONCAT_HELPER(A, B, C, D, E, ...) A ## B ## C ## D ## E ## __VA_ARGS__
|
||||
#define CGLM_MACRO_CONCAT(A, B, C, D, E, ...) CGLM_MACRO_CONCAT_HELPER(A, B, C, D, E,__VA_ARGS__)
|
||||
|
||||
#ifndef CGLM_OMIT_NS_FROM_STRUCT_API
|
||||
# ifndef CGLM_STRUCT_API_NS
|
||||
# define CGLM_STRUCT_API_NS glms
|
||||
# endif
|
||||
# ifndef CGLM_STRUCT_API_NS_SEPERATOR
|
||||
# define CGLM_STRUCT_API_NS_SEPERATOR _
|
||||
# endif
|
||||
#else
|
||||
# define CGLM_STRUCT_API_NS
|
||||
# define CGLM_STRUCT_API_NS_SEPERATOR
|
||||
#endif
|
||||
|
||||
#ifndef CGLM_STRUCT_API_NAME_SUFFIX
|
||||
# define CGLM_STRUCT_API_NAME_SUFFIX
|
||||
#endif
|
||||
|
||||
#define CGLM_STRUCTAPI(A, ...) CGLM_MACRO_CONCAT(CGLM_STRUCT_API_NS, \
|
||||
CGLM_STRUCT_API_NS_SEPERATOR, \
|
||||
A, \
|
||||
CGLM_STRUCT_API_NAME_SUFFIX, \
|
||||
_, \
|
||||
__VA_ARGS__)
|
||||
|
||||
#endif /* cglm_common_h */
|
||||
|
||||
@@ -39,6 +39,7 @@
|
||||
|| defined(CGLM_NO_PRINTS_NOOP)
|
||||
|
||||
#include "common.h"
|
||||
#include "util.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
@@ -48,7 +49,7 @@
|
||||
#endif
|
||||
|
||||
#ifndef CGLM_PRINT_MAX_TO_SHORT
|
||||
# define CGLM_PRINT_MAX_TO_SHORT 1e5
|
||||
# define CGLM_PRINT_MAX_TO_SHORT 1e5f
|
||||
#endif
|
||||
|
||||
#ifndef CGLM_PRINT_COLOR
|
||||
@@ -59,6 +60,32 @@
|
||||
# define CGLM_PRINT_COLOR_RESET "\033[0m"
|
||||
#endif
|
||||
|
||||
/*!
|
||||
* @brief prints current SIMD path in general
|
||||
*
|
||||
* @param[in] ostream stream to print e.g. stdout, stderr, FILE ...
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_arch_print_name(FILE* __restrict ostream) {
|
||||
#ifdef CGLM_SIMD_x86
|
||||
fprintf(ostream, CGLM_PRINT_COLOR "\ncglm arch: x86 SSE*"
|
||||
#ifdef __AVX__
|
||||
" AVX"
|
||||
#endif
|
||||
"\n\n" CGLM_PRINT_COLOR_RESET);
|
||||
#elif defined(CGLM_SIMD_ARM)
|
||||
fprintf(ostream, CGLM_PRINT_COLOR "\ncglm arch: arm"
|
||||
#ifndef __ARM_NEON_FP
|
||||
" NEON_FP"
|
||||
#endif
|
||||
#ifdef CGLM_ARM64
|
||||
" ARM64"
|
||||
#endif
|
||||
"\n\n" CGLM_PRINT_COLOR_RESET);
|
||||
#endif
|
||||
}
|
||||
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat4_print(mat4 matrix,
|
||||
@@ -76,9 +103,9 @@ glm_mat4_print(mat4 matrix,
|
||||
for (i = 0; i < m; i++) {
|
||||
for (j = 0; j < n; j++) {
|
||||
if (matrix[i][j] < CGLM_PRINT_MAX_TO_SHORT)
|
||||
cwi = sprintf(buff, "% .*f", CGLM_PRINT_PRECISION, matrix[i][j]);
|
||||
cwi = sprintf(buff, "% .*f", CGLM_PRINT_PRECISION, (double)matrix[i][j]);
|
||||
else
|
||||
cwi = sprintf(buff, "% g", matrix[i][j]);
|
||||
cwi = sprintf(buff, "% g", (double)matrix[i][j]);
|
||||
cw[i] = GLM_MAX(cw[i], cwi);
|
||||
}
|
||||
}
|
||||
@@ -88,9 +115,9 @@ glm_mat4_print(mat4 matrix,
|
||||
|
||||
for (j = 0; j < n; j++)
|
||||
if (matrix[i][j] < CGLM_PRINT_MAX_TO_SHORT)
|
||||
fprintf(ostream, " % *.*f", cw[j], CGLM_PRINT_PRECISION, matrix[j][i]);
|
||||
fprintf(ostream, " % *.*f", cw[j], CGLM_PRINT_PRECISION, (double)matrix[j][i]);
|
||||
else
|
||||
fprintf(ostream, " % *g", cw[j], matrix[j][i]);
|
||||
fprintf(ostream, " % *g", cw[j], (double)matrix[j][i]);
|
||||
|
||||
fprintf(ostream, " |\n");
|
||||
}
|
||||
@@ -119,9 +146,9 @@ glm_mat3_print(mat3 matrix,
|
||||
for (i = 0; i < m; i++) {
|
||||
for (j = 0; j < n; j++) {
|
||||
if (matrix[i][j] < CGLM_PRINT_MAX_TO_SHORT)
|
||||
cwi = sprintf(buff, "% .*f", CGLM_PRINT_PRECISION, matrix[i][j]);
|
||||
cwi = sprintf(buff, "% .*f", CGLM_PRINT_PRECISION, (double)matrix[i][j]);
|
||||
else
|
||||
cwi = sprintf(buff, "% g", matrix[i][j]);
|
||||
cwi = sprintf(buff, "% g", (double)matrix[i][j]);
|
||||
cw[i] = GLM_MAX(cw[i], cwi);
|
||||
}
|
||||
}
|
||||
@@ -131,9 +158,9 @@ glm_mat3_print(mat3 matrix,
|
||||
|
||||
for (j = 0; j < n; j++)
|
||||
if (matrix[i][j] < CGLM_PRINT_MAX_TO_SHORT)
|
||||
fprintf(ostream, " % *.*f", cw[j], CGLM_PRINT_PRECISION, matrix[j][i]);
|
||||
fprintf(ostream, " % *.*f", cw[j], CGLM_PRINT_PRECISION, (double)matrix[j][i]);
|
||||
else
|
||||
fprintf(ostream, " % *g", cw[j], matrix[j][i]);
|
||||
fprintf(ostream, " % *g", cw[j], (double)matrix[j][i]);
|
||||
|
||||
fprintf(ostream, " |\n");
|
||||
}
|
||||
@@ -161,9 +188,9 @@ glm_mat2_print(mat2 matrix,
|
||||
for (i = 0; i < m; i++) {
|
||||
for (j = 0; j < n; j++) {
|
||||
if (matrix[i][j] < CGLM_PRINT_MAX_TO_SHORT)
|
||||
cwi = sprintf(buff, "% .*f", CGLM_PRINT_PRECISION, matrix[i][j]);
|
||||
cwi = sprintf(buff, "% .*f", CGLM_PRINT_PRECISION, (double)matrix[i][j]);
|
||||
else
|
||||
cwi = sprintf(buff, "% g", matrix[i][j]);
|
||||
cwi = sprintf(buff, "% g", (double)matrix[i][j]);
|
||||
cw[i] = GLM_MAX(cw[i], cwi);
|
||||
}
|
||||
}
|
||||
@@ -173,9 +200,9 @@ glm_mat2_print(mat2 matrix,
|
||||
|
||||
for (j = 0; j < n; j++)
|
||||
if (matrix[i][j] < CGLM_PRINT_MAX_TO_SHORT)
|
||||
fprintf(ostream, " % *.*f", cw[j], CGLM_PRINT_PRECISION, matrix[j][i]);
|
||||
fprintf(ostream, " % *.*f", cw[j], CGLM_PRINT_PRECISION, (double)matrix[j][i]);
|
||||
else
|
||||
fprintf(ostream, " % *g", cw[j], matrix[j][i]);
|
||||
fprintf(ostream, " % *g", cw[j], (double)matrix[j][i]);
|
||||
|
||||
fprintf(ostream, " |\n");
|
||||
}
|
||||
@@ -198,9 +225,9 @@ glm_vec4_print(vec4 vec,
|
||||
|
||||
for (i = 0; i < m; i++) {
|
||||
if (vec[i] < CGLM_PRINT_MAX_TO_SHORT)
|
||||
fprintf(ostream, " % .*f", CGLM_PRINT_PRECISION, vec[i]);
|
||||
fprintf(ostream, " % .*f", CGLM_PRINT_PRECISION, (double)vec[i]);
|
||||
else
|
||||
fprintf(ostream, " % g", vec[i]);
|
||||
fprintf(ostream, " % g", (double)vec[i]);
|
||||
}
|
||||
|
||||
fprintf(ostream, " )" CGLM_PRINT_COLOR_RESET "\n\n");
|
||||
@@ -220,9 +247,9 @@ glm_vec3_print(vec3 vec,
|
||||
|
||||
for (i = 0; i < m; i++) {
|
||||
if (vec[i] < CGLM_PRINT_MAX_TO_SHORT)
|
||||
fprintf(ostream, " % .*f", CGLM_PRINT_PRECISION, vec[i]);
|
||||
fprintf(ostream, " % .*f", CGLM_PRINT_PRECISION, (double)vec[i]);
|
||||
else
|
||||
fprintf(ostream, " % g", vec[i]);
|
||||
fprintf(ostream, " % g", (double)vec[i]);
|
||||
}
|
||||
|
||||
fprintf(ostream, " )" CGLM_PRINT_COLOR_RESET "\n\n");
|
||||
@@ -260,9 +287,9 @@ glm_vec2_print(vec2 vec,
|
||||
|
||||
for (i = 0; i < m; i++) {
|
||||
if (vec[i] < CGLM_PRINT_MAX_TO_SHORT)
|
||||
fprintf(ostream, " % .*f", CGLM_PRINT_PRECISION, vec[i]);
|
||||
fprintf(ostream, " % .*f", CGLM_PRINT_PRECISION, (double)vec[i]);
|
||||
else
|
||||
fprintf(ostream, " % g", vec[i]);
|
||||
fprintf(ostream, " % g", (double)vec[i]);
|
||||
}
|
||||
|
||||
fprintf(ostream, " )" CGLM_PRINT_COLOR_RESET "\n\n");
|
||||
@@ -282,9 +309,9 @@ glm_versor_print(versor vec,
|
||||
|
||||
for (i = 0; i < m; i++) {
|
||||
if (vec[i] < CGLM_PRINT_MAX_TO_SHORT)
|
||||
fprintf(ostream, " % .*f", CGLM_PRINT_PRECISION, vec[i]);
|
||||
fprintf(ostream, " % .*f", CGLM_PRINT_PRECISION, (double)vec[i]);
|
||||
else
|
||||
fprintf(ostream, " % g", vec[i]);
|
||||
fprintf(ostream, " % g", (double)vec[i]);
|
||||
}
|
||||
|
||||
|
||||
@@ -309,9 +336,9 @@ glm_aabb_print(vec3 bbox[2],
|
||||
|
||||
for (j = 0; j < m; j++) {
|
||||
if (bbox[i][j] < CGLM_PRINT_MAX_TO_SHORT)
|
||||
fprintf(ostream, " % .*f", CGLM_PRINT_PRECISION, bbox[i][j]);
|
||||
fprintf(ostream, " % .*f", CGLM_PRINT_PRECISION, (double)bbox[i][j]);
|
||||
else
|
||||
fprintf(ostream, " % g", bbox[i][j]);
|
||||
fprintf(ostream, " % g", (double)bbox[i][j]);
|
||||
}
|
||||
|
||||
fprintf(ostream, " )\n");
|
||||
|
||||
268
include/cglm/ivec2.h
Normal file
268
include/cglm/ivec2.h
Normal file
@@ -0,0 +1,268 @@
|
||||
/*
|
||||
* Copyright (c), Recep Aslantas.
|
||||
*
|
||||
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||
* Full license can be found in the LICENSE file
|
||||
*/
|
||||
|
||||
/*
|
||||
Macros:
|
||||
GLM_IVEC2_ONE_INIT
|
||||
GLM_IVEC2_ZERO_INIT
|
||||
GLM_IVEC2_ONE
|
||||
GLM_IVEC2_ZERO
|
||||
|
||||
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)
|
||||
CGLM_INLINE void glm_ivec2_abs(ivec2 v, ivec2 dest)
|
||||
*/
|
||||
|
||||
#ifndef cglm_ivec2_h
|
||||
#define cglm_ivec2_h
|
||||
|
||||
#include "common.h"
|
||||
|
||||
#define GLM_IVEC2_ONE_INIT {1, 1}
|
||||
#define GLM_IVEC2_ZERO_INIT {0, 0}
|
||||
|
||||
#define GLM_IVEC2_ONE ((ivec2)GLM_IVEC2_ONE_INIT)
|
||||
#define GLM_IVEC2_ZERO ((ivec2)GLM_IVEC2_ZERO_INIT)
|
||||
|
||||
/*!
|
||||
* @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;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief absolute value of v
|
||||
*
|
||||
* @param[in] v vector
|
||||
* @param[out] dest destination
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_ivec2_abs(ivec2 v, ivec2 dest) {
|
||||
dest[0] = abs(v[0]);
|
||||
dest[1] = abs(v[1]);
|
||||
}
|
||||
|
||||
#endif /* cglm_ivec2_h */
|
||||
285
include/cglm/ivec3.h
Normal file
285
include/cglm/ivec3.h
Normal 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
|
||||
*/
|
||||
|
||||
/*
|
||||
Macros:
|
||||
GLM_IVEC3_ONE_INIT
|
||||
GLM_IVEC3_ZERO_INIT
|
||||
GLM_IVEC3_ONE
|
||||
GLM_IVEC3_ZERO
|
||||
|
||||
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)
|
||||
CGLM_INLINE void glm_ivec3_abs(ivec3 v, ivec3 dest)
|
||||
*/
|
||||
|
||||
#ifndef cglm_ivec3_h
|
||||
#define cglm_ivec3_h
|
||||
|
||||
#include "common.h"
|
||||
|
||||
#define GLM_IVEC3_ONE_INIT {1, 1, 1}
|
||||
#define GLM_IVEC3_ZERO_INIT {0, 0, 0}
|
||||
|
||||
#define GLM_IVEC3_ONE ((ivec3)GLM_IVEC3_ONE_INIT)
|
||||
#define GLM_IVEC3_ZERO ((ivec3)GLM_IVEC3_ZERO_INIT)
|
||||
|
||||
/*!
|
||||
* @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;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief absolute value of v
|
||||
*
|
||||
* @param[in] v vector
|
||||
* @param[out] dest destination
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_ivec3_abs(ivec3 v, ivec3 dest) {
|
||||
dest[0] = abs(v[0]);
|
||||
dest[1] = abs(v[1]);
|
||||
dest[2] = abs(v[2]);
|
||||
}
|
||||
|
||||
#endif /* cglm_ivec3_h */
|
||||
303
include/cglm/ivec4.h
Normal file
303
include/cglm/ivec4.h
Normal file
@@ -0,0 +1,303 @@
|
||||
/*
|
||||
* Copyright (c), Recep Aslantas.
|
||||
*
|
||||
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||
* Full license can be found in the LICENSE file
|
||||
*/
|
||||
|
||||
/*
|
||||
Macros:
|
||||
GLM_IVEC4_ONE_INIT
|
||||
GLM_IVEC4_ZERO_INIT
|
||||
GLM_IVEC4_ONE
|
||||
GLM_IVEC4_ZERO
|
||||
|
||||
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)
|
||||
CGLM_INLINE void glm_ivec4_abs(ivec4 v, ivec4 dest)
|
||||
*/
|
||||
|
||||
#ifndef cglm_ivec4_h
|
||||
#define cglm_ivec4_h
|
||||
|
||||
#include "common.h"
|
||||
|
||||
#define GLM_IVEC4_ONE_INIT {1, 1, 1, 1}
|
||||
#define GLM_IVEC4_ZERO_INIT {0, 0, 0, 0}
|
||||
|
||||
#define GLM_IVEC4_ONE ((ivec4)GLM_IVEC4_ONE_INIT)
|
||||
#define GLM_IVEC4_ZERO ((ivec4)GLM_IVEC4_ZERO_INIT)
|
||||
|
||||
/*!
|
||||
* @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;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief absolute value of v
|
||||
*
|
||||
* @param[in] v vector
|
||||
* @param[out] dest destination
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_ivec4_abs(ivec4 v, ivec4 dest) {
|
||||
dest[0] = abs(v[0]);
|
||||
dest[1] = abs(v[1]);
|
||||
dest[2] = abs(v[2]);
|
||||
dest[3] = abs(v[3]);
|
||||
}
|
||||
|
||||
#endif /* cglm_ivec4_h */
|
||||
@@ -29,7 +29,7 @@
|
||||
CGLM_INLINE void glm_mat4_mul(mat4 m1, mat4 m2, mat4 dest);
|
||||
CGLM_INLINE void glm_mat4_mulN(mat4 *matrices[], int len, mat4 dest);
|
||||
CGLM_INLINE void glm_mat4_mulv(mat4 m, vec4 v, vec4 dest);
|
||||
CGLM_INLINE void glm_mat4_mulv3(mat4 m, vec3 v, vec3 dest);
|
||||
CGLM_INLINE void glm_mat4_mulv3(mat4 m, vec3 v, float last, vec3 dest);
|
||||
CGLM_INLINE float glm_mat4_trace(mat4 m);
|
||||
CGLM_INLINE float glm_mat4_trace3(mat4 m);
|
||||
CGLM_INLINE void glm_mat4_quat(mat4 m, versor dest) ;
|
||||
|
||||
@@ -13,6 +13,17 @@
|
||||
#include "vec4.h"
|
||||
#include "mat4.h"
|
||||
|
||||
#ifndef CGLM_CLIPSPACE_INCLUDE_ALL
|
||||
# if CGLM_CONFIG_CLIP_CONTROL & CGLM_CLIP_CONTROL_ZO_BIT
|
||||
# include "clipspace/project_zo.h"
|
||||
# elif CGLM_CONFIG_CLIP_CONTROL & CGLM_CLIP_CONTROL_NO_BIT
|
||||
# include "clipspace/project_no.h"
|
||||
# endif
|
||||
#else
|
||||
# include "clipspace/project_zo.h"
|
||||
# include "clipspace/project_no.h"
|
||||
#endif
|
||||
|
||||
/*!
|
||||
* @brief maps the specified viewport coordinates into specified space [1]
|
||||
* the matrix should contain projection matrix.
|
||||
@@ -42,16 +53,11 @@
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_unprojecti(vec3 pos, mat4 invMat, vec4 vp, vec3 dest) {
|
||||
vec4 v;
|
||||
|
||||
v[0] = 2.0f * (pos[0] - vp[0]) / vp[2] - 1.0f;
|
||||
v[1] = 2.0f * (pos[1] - vp[1]) / vp[3] - 1.0f;
|
||||
v[2] = 2.0f * pos[2] - 1.0f;
|
||||
v[3] = 1.0f;
|
||||
|
||||
glm_mat4_mulv(invMat, v, v);
|
||||
glm_vec4_scale(v, 1.0f / v[3], v);
|
||||
glm_vec3(v, dest);
|
||||
#if CGLM_CONFIG_CLIP_CONTROL & CGLM_CLIP_CONTROL_ZO_BIT
|
||||
glm_unprojecti_zo(pos, invMat, vp, dest);
|
||||
#elif CGLM_CONFIG_CLIP_CONTROL & CGLM_CLIP_CONTROL_NO_BIT
|
||||
glm_unprojecti_no(pos, invMat, vp, dest);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*!
|
||||
@@ -101,18 +107,66 @@ glm_unproject(vec3 pos, mat4 m, vec4 vp, vec3 dest) {
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_project(vec3 pos, mat4 m, vec4 vp, vec3 dest) {
|
||||
CGLM_ALIGN(16) vec4 pos4, vone = GLM_VEC4_ONE_INIT;
|
||||
#if CGLM_CONFIG_CLIP_CONTROL & CGLM_CLIP_CONTROL_ZO_BIT
|
||||
glm_project_zo(pos, m, vp, dest);
|
||||
#elif CGLM_CONFIG_CLIP_CONTROL & CGLM_CLIP_CONTROL_NO_BIT
|
||||
glm_project_no(pos, m, vp, dest);
|
||||
#endif
|
||||
}
|
||||
|
||||
glm_vec4(pos, 1.0f, pos4);
|
||||
/*!
|
||||
* @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
|
||||
}
|
||||
|
||||
glm_mat4_mulv(m, pos4, pos4);
|
||||
glm_vec4_scale(pos4, 1.0f / pos4[3], pos4); /* pos = pos / pos.w */
|
||||
glm_vec4_add(pos4, vone, pos4);
|
||||
glm_vec4_scale(pos4, 0.5f, pos4);
|
||||
/*!
|
||||
* @brief define a picking region
|
||||
*
|
||||
* @param[in] center center [x, y] of a picking region in window coordinates
|
||||
* @param[in] size size [width, height] of the picking region in window coordinates
|
||||
* @param[in] vp viewport as [x, y, width, height]
|
||||
* @param[out] dest projected coordinates
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_pickmatrix(vec2 center, vec2 size, vec4 vp, mat4 dest) {
|
||||
mat4 res;
|
||||
vec3 v;
|
||||
|
||||
dest[0] = pos4[0] * vp[2] + vp[0];
|
||||
dest[1] = pos4[1] * vp[3] + vp[1];
|
||||
dest[2] = pos4[2];
|
||||
if (size[0] <= 0.0f || size[1] <= 0.0f)
|
||||
return;
|
||||
|
||||
/* Translate and scale the picked region to the entire window */
|
||||
v[0] = (vp[2] - 2.0f * (center[0] - vp[0])) / size[0];
|
||||
v[1] = (vp[3] - 2.0f * (center[1] - vp[1])) / size[1];
|
||||
v[2] = 0.0f;
|
||||
|
||||
glm_translate_make(res, v);
|
||||
|
||||
v[0] = vp[2] / size[0];
|
||||
v[1] = vp[3] / size[1];
|
||||
v[2] = 1.0f;
|
||||
|
||||
glm_scale(res, v);
|
||||
|
||||
glm_mat4_copy(res, dest);
|
||||
}
|
||||
|
||||
#endif /* cglm_project_h */
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
CGLM_INLINE void glm_quat(versor q, float angle, float x, float y, float z);
|
||||
CGLM_INLINE void glm_quatv(versor q, float angle, vec3 axis);
|
||||
CGLM_INLINE void glm_quat_copy(versor q, versor dest);
|
||||
CGLM_INLINE void glm_quat_from_vecs(vec3 a, vec3 b, versor dest);
|
||||
CGLM_INLINE float glm_quat_norm(versor q);
|
||||
CGLM_INLINE void glm_quat_normalize(versor q);
|
||||
CGLM_INLINE void glm_quat_normalize_to(versor q, versor dest);
|
||||
@@ -59,6 +60,7 @@
|
||||
#include "mat4.h"
|
||||
#include "mat3.h"
|
||||
#include "affine-mat.h"
|
||||
#include "affine.h"
|
||||
|
||||
#ifdef CGLM_SSE_FP
|
||||
# include "simd/sse2/quat.h"
|
||||
@@ -68,17 +70,7 @@
|
||||
# include "simd/neon/quat.h"
|
||||
#endif
|
||||
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mat4_mulv(mat4 m, vec4 v, vec4 dest);
|
||||
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_mul_rot(mat4 m1, mat4 m2, mat4 dest);
|
||||
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_translate(mat4 m, vec3 v);
|
||||
CGLM_INLINE void glm_quat_normalize(versor q);
|
||||
|
||||
/*
|
||||
* IMPORTANT:
|
||||
@@ -195,10 +187,41 @@ glm_quat_copy(versor q, versor dest) {
|
||||
glm_vec4_copy(q, dest);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief compute quaternion rotating vector A to vector B
|
||||
*
|
||||
* @param[in] a vec3 (must have unit length)
|
||||
* @param[in] b vec3 (must have unit length)
|
||||
* @param[out] dest quaternion (of unit length)
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glm_quat_from_vecs(vec3 a, vec3 b, versor dest) {
|
||||
CGLM_ALIGN(8) vec3 axis;
|
||||
float cos_theta;
|
||||
float cos_half_theta;
|
||||
|
||||
cos_theta = glm_vec3_dot(a, b);
|
||||
if (cos_theta >= 1.f - GLM_FLT_EPSILON) { /* a ∥ b */
|
||||
glm_quat_identity(dest);
|
||||
return;
|
||||
}
|
||||
if (cos_theta < -1.f + GLM_FLT_EPSILON) { /* angle(a, b) = π */
|
||||
glm_vec3_ortho(a, axis);
|
||||
cos_half_theta = 0.f; /* cos π/2 */
|
||||
} else {
|
||||
glm_vec3_cross(a, b, axis);
|
||||
cos_half_theta = 1.0f + cos_theta; /* cos 0 + cos θ */
|
||||
}
|
||||
|
||||
glm_quat_init(dest, axis[0], axis[1], axis[2], cos_half_theta);
|
||||
glm_quat_normalize(dest);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief returns norm (magnitude) of quaternion
|
||||
*
|
||||
* @param[out] q quaternion
|
||||
* @param[in] q quaternion
|
||||
*/
|
||||
CGLM_INLINE
|
||||
float
|
||||
|
||||
@@ -12,6 +12,8 @@
|
||||
|
||||
#if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || defined(__aarch64__)
|
||||
# define CGLM_ARM64 1
|
||||
#else
|
||||
# define CGLM_ARM64 0
|
||||
#endif
|
||||
|
||||
#define glmm_load(p) vld1q_f32(p)
|
||||
@@ -38,6 +40,18 @@
|
||||
#define glmm_combine_lh(x, y) vcombine_f32(vget_low_f32(x), vget_high_f32(y))
|
||||
#define glmm_combine_hh(x, y) vcombine_f32(vget_high_f32(x), vget_high_f32(y))
|
||||
|
||||
#if defined(_WIN32) && defined(_MSC_VER)
|
||||
/* # define glmm_float32x4_init(x, y, z, w) { .n128_f32 = { x, y, z, w } } */
|
||||
CGLM_INLINE
|
||||
float32x4_t
|
||||
glmm_float32x4_init(float x, float y, float z, float w) {
|
||||
CGLM_ALIGN(16) float v[4] = {x, y, z, w};
|
||||
return vld1q_f32(v);
|
||||
}
|
||||
#else
|
||||
# define glmm_float32x4_init(x, y, z, w) { x, y, z, w }
|
||||
#endif
|
||||
|
||||
static inline
|
||||
float32x4_t
|
||||
glmm_abs(float32x4_t v) {
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
#endif
|
||||
|
||||
#if defined(__SSE3__)
|
||||
# include <x86intrin.h>
|
||||
# include <pmmintrin.h>
|
||||
# ifndef CGLM_SIMD_x86
|
||||
# define CGLM_SIMD_x86
|
||||
# endif
|
||||
@@ -63,17 +63,43 @@
|
||||
#endif
|
||||
|
||||
/* ARM Neon */
|
||||
#if defined(__ARM_NEON)
|
||||
#if defined(_WIN32)
|
||||
/* TODO: non-ARM stuff already inported, will this be better option */
|
||||
/* # include <intrin.h> */
|
||||
|
||||
# if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC)
|
||||
# include <arm64intr.h>
|
||||
# include <arm64_neon.h>
|
||||
# ifndef CGLM_NEON_FP
|
||||
# define CGLM_NEON_FP 1
|
||||
# endif
|
||||
# ifndef CGLM_SIMD_ARM
|
||||
# define CGLM_SIMD_ARM
|
||||
# endif
|
||||
# elif defined(_M_ARM)
|
||||
# include <armintr.h>
|
||||
# include <arm_neon.h>
|
||||
# ifndef CGLM_NEON_FP
|
||||
# define CGLM_NEON_FP 1
|
||||
# endif
|
||||
# ifndef CGLM_SIMD_ARM
|
||||
# define CGLM_SIMD_ARM
|
||||
# endif
|
||||
# endif
|
||||
|
||||
#else /* non-windows */
|
||||
# if defined(__ARM_NEON) || defined(__ARM_NEON__)
|
||||
# include <arm_neon.h>
|
||||
# if defined(__ARM_NEON_FP)
|
||||
# define CGLM_NEON_FP 1
|
||||
# endif
|
||||
# ifndef CGLM_SIMD_ARM
|
||||
# define CGLM_SIMD_ARM
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if defined(CGLM_SIMD_x86) || defined(CGLM_NEON_FP)
|
||||
#if defined(CGLM_SIMD_x86) || defined(CGLM_SIMD_ARM)
|
||||
# ifndef CGLM_SIMD
|
||||
# define CGLM_SIMD
|
||||
# endif
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
#ifndef cglm_affine_neon_h
|
||||
#define cglm_affine_neon_h
|
||||
#if defined(__ARM_NEON_FP)
|
||||
#if defined(CGLM_NEON_FP)
|
||||
|
||||
#include "../../common.h"
|
||||
#include "../intrin.h"
|
||||
@@ -86,13 +86,12 @@ CGLM_INLINE
|
||||
void
|
||||
glm_inv_tr_neon(mat4 mat) {
|
||||
float32x4x4_t vmat;
|
||||
glmm_128 r0, r1, r2, r3, x0;
|
||||
glmm_128 r0, r1, r2, x0;
|
||||
|
||||
vmat = vld4q_f32(mat[0]);
|
||||
r0 = vmat.val[0];
|
||||
r1 = vmat.val[1];
|
||||
r2 = vmat.val[2];
|
||||
r3 = vmat.val[3];
|
||||
|
||||
x0 = glmm_fmadd(r0, glmm_splat_w(r0),
|
||||
glmm_fmadd(r1, glmm_splat_w(r1),
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
#ifndef cglm_mat2_neon_h
|
||||
#define cglm_mat2_neon_h
|
||||
#if defined(__ARM_NEON_FP)
|
||||
#if defined(CGLM_NEON_FP)
|
||||
|
||||
#include "../../common.h"
|
||||
#include "../intrin.h"
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
#ifndef cglm_mat4_neon_h
|
||||
#define cglm_mat4_neon_h
|
||||
#if defined(__ARM_NEON_FP)
|
||||
#if defined(CGLM_NEON_FP)
|
||||
|
||||
#include "../../common.h"
|
||||
#include "../intrin.h"
|
||||
@@ -108,7 +108,7 @@ glm_mat4_det_neon(mat4 mat) {
|
||||
float32x4_t r0, r1, r2, r3, x0, x1, x2;
|
||||
float32x2_t ij, op, mn, kl, nn, mm, jj, ii, gh, ef, t12, t34;
|
||||
float32x4x2_t a1;
|
||||
float32x4_t x3 = { 0.f, -0.f, 0.f, -0.f };
|
||||
float32x4_t x3 = glmm_float32x4_init(0.f, -0.f, 0.f, -0.f);
|
||||
|
||||
/* 127 <- 0, [square] det(A) = det(At) */
|
||||
r0 = glmm_load(mat[0]); /* d c b a */
|
||||
@@ -181,7 +181,7 @@ glm_mat4_inv_neon(mat4 mat, mat4 dest) {
|
||||
x0, x1, x2, x3, x4, x5, x6, x7, x8;
|
||||
float32x4x2_t a1;
|
||||
float32x2_t lp, ko, hg, jn, im, fe, ae, bf, cg, dh;
|
||||
float32x4_t x9 = { -0.f, 0.f, -0.f, 0.f };
|
||||
float32x4_t x9 = glmm_float32x4_init(-0.f, 0.f, -0.f, 0.f);
|
||||
|
||||
x8 = vrev64q_f32(x9);
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
#ifndef cglm_quat_neon_h
|
||||
#define cglm_quat_neon_h
|
||||
#if defined(__ARM_NEON_FP)
|
||||
#if defined(CGLM_NEON_FP)
|
||||
|
||||
#include "../../common.h"
|
||||
#include "../intrin.h"
|
||||
@@ -23,7 +23,7 @@ glm_quat_mul_neon(versor p, versor q, versor dest) {
|
||||
*/
|
||||
|
||||
glmm_128 xp, xq, xqr, r, x, y, z, s2, s3;
|
||||
glmm_128 s1 = {-0.f, 0.f, 0.f, -0.f};
|
||||
glmm_128 s1 = glmm_float32x4_init(-0.f, 0.f, 0.f, -0.f);
|
||||
float32x2_t qh, ql;
|
||||
|
||||
xp = glmm_load(p); /* 3 2 1 0 */
|
||||
|
||||
184
include/cglm/struct/affine-post.h
Normal file
184
include/cglm/struct/affine-post.h
Normal file
@@ -0,0 +1,184 @@
|
||||
/*
|
||||
* Copyright (c), Recep Aslantas.
|
||||
*
|
||||
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||
* Full license can be found in the LICENSE file
|
||||
*/
|
||||
|
||||
/*
|
||||
Functions:
|
||||
CGLM_INLINE mat4s glms_translated(mat4s m, vec3s v);
|
||||
CGLM_INLINE mat4s glms_translated_x(mat4s m, float x);
|
||||
CGLM_INLINE mat4s glms_translated_y(mat4s m, float y);
|
||||
CGLM_INLINE mat4s glms_translated_z(mat4s m, float z);
|
||||
CGLM_INLINE mat4s glms_rotated_x(mat4s m, float angle);
|
||||
CGLM_INLINE mat4s glms_rotated_y(mat4s m, float angle);
|
||||
CGLM_INLINE mat4s glms_rotated_z(mat4s m, float angle);
|
||||
CGLM_INLINE mat4s glms_rotated(mat4s m, float angle, vec3s axis);
|
||||
CGLM_INLINE mat4s glms_rotated_at(mat4s m, vec3s pivot, float angle, vec3s axis);
|
||||
CGLM_INLINE mat4s glms_spinned(mat4s m, float angle, vec3s axis);
|
||||
*/
|
||||
|
||||
#ifndef cglms_affines_post_h
|
||||
#define cglms_affines_post_h
|
||||
|
||||
#include "../common.h"
|
||||
#include "../types-struct.h"
|
||||
#include "../affine.h"
|
||||
#include "vec3.h"
|
||||
#include "vec4.h"
|
||||
#include "mat4.h"
|
||||
|
||||
/*!
|
||||
* @brief translate existing transform matrix by v vector
|
||||
* and stores result in same matrix
|
||||
*
|
||||
* @param[in] m affine transfrom
|
||||
* @param[in] v translate vector [x, y, z]
|
||||
* @returns affine transfrom
|
||||
*/
|
||||
CGLM_INLINE
|
||||
mat4s
|
||||
glms_translated(mat4s m, vec3s v) {
|
||||
glm_translated(m.raw, v.raw);
|
||||
return m;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief translate existing transform matrix by x factor
|
||||
*
|
||||
* @param[in] m affine transfrom
|
||||
* @param[in] x x factor
|
||||
* @returns affine transfrom
|
||||
*/
|
||||
CGLM_INLINE
|
||||
mat4s
|
||||
glms_translated_x(mat4s m, float x) {
|
||||
glm_translated_x(m.raw, x);
|
||||
return m;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief translate existing transform matrix by y factor
|
||||
*
|
||||
* @param[in] m affine transfrom
|
||||
* @param[in] y y factor
|
||||
* @returns affine transfrom
|
||||
*/
|
||||
CGLM_INLINE
|
||||
mat4s
|
||||
glms_translated_y(mat4s m, float y) {
|
||||
glm_translated_y(m.raw, y);
|
||||
return m;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief translate existing transform matrix by z factor
|
||||
*
|
||||
* @param[in] m affine transfrom
|
||||
* @param[in] z z factor
|
||||
* @returns affine transfrom
|
||||
*/
|
||||
CGLM_INLINE
|
||||
mat4s
|
||||
glms_translated_z(mat4s m, float z) {
|
||||
glm_translated_z(m.raw, z);
|
||||
return 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)
|
||||
* @returns rotated matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
mat4s
|
||||
glms_rotated_x(mat4s m, float angle) {
|
||||
mat4s r;
|
||||
glm_rotated_x(m.raw, angle, r.raw);
|
||||
return r;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @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)
|
||||
* @returns rotated matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
mat4s
|
||||
glms_rotated_y(mat4s m, float angle) {
|
||||
mat4s r;
|
||||
glm_rotated_y(m.raw, angle, r.raw);
|
||||
return r;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @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)
|
||||
* @returns rotated matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
mat4s
|
||||
glms_rotated_z(mat4s m, float angle) {
|
||||
mat4s r;
|
||||
glm_rotated_z(m.raw, angle, r.raw);
|
||||
return r;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief rotate existing transform matrix around given axis by angle
|
||||
*
|
||||
* @param[in] m affine transfrom
|
||||
* @param[in] angle angle (radians)
|
||||
* @param[in] axis axis
|
||||
* @returns affine transfrom
|
||||
*/
|
||||
CGLM_INLINE
|
||||
mat4s
|
||||
glms_rotated(mat4s m, float angle, vec3s axis) {
|
||||
glm_rotated(m.raw, angle, axis.raw);
|
||||
return m;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief rotate existing transform
|
||||
* around given axis by angle at given pivot point (rotation center)
|
||||
*
|
||||
* @param[in] m affine transfrom
|
||||
* @param[in] pivot rotation center
|
||||
* @param[in] angle angle (radians)
|
||||
* @param[in] axis axis
|
||||
* @returns affine transfrom
|
||||
*/
|
||||
CGLM_INLINE
|
||||
mat4s
|
||||
glms_rotated_at(mat4s m, vec3s pivot, float angle, vec3s axis) {
|
||||
glm_rotated_at(m.raw, pivot.raw, angle, axis.raw);
|
||||
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_spinned(mat4s m, float angle, vec3s axis) {
|
||||
glm_spinned(m.raw, angle, axis.raw);
|
||||
return m;
|
||||
}
|
||||
|
||||
#endif /* cglms_affines_post_h */
|
||||
184
include/cglm/struct/affine-pre.h
Normal file
184
include/cglm/struct/affine-pre.h
Normal file
@@ -0,0 +1,184 @@
|
||||
/*
|
||||
* Copyright (c), Recep Aslantas.
|
||||
*
|
||||
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||
* Full license can be found in the LICENSE file
|
||||
*/
|
||||
|
||||
/*
|
||||
Functions:
|
||||
CGLM_INLINE mat4s glms_translate(mat4s m, vec3s v);
|
||||
CGLM_INLINE mat4s glms_translate_x(mat4s m, float x);
|
||||
CGLM_INLINE mat4s glms_translate_y(mat4s m, float y);
|
||||
CGLM_INLINE mat4s glms_translate_z(mat4s m, float z);
|
||||
CGLM_INLINE mat4s glms_rotate_x(mat4s m, float angle);
|
||||
CGLM_INLINE mat4s glms_rotate_y(mat4s m, float angle);
|
||||
CGLM_INLINE mat4s glms_rotate_z(mat4s m, float angle);
|
||||
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_spin(mat4s m, float angle, vec3s axis);
|
||||
*/
|
||||
|
||||
#ifndef cglms_affines_pre_h
|
||||
#define cglms_affines_pre_h
|
||||
|
||||
#include "../common.h"
|
||||
#include "../types-struct.h"
|
||||
#include "../affine.h"
|
||||
#include "vec3.h"
|
||||
#include "vec4.h"
|
||||
#include "mat4.h"
|
||||
|
||||
/*!
|
||||
* @brief translate existing transform matrix by v vector
|
||||
* and stores result in same matrix
|
||||
*
|
||||
* @param[in] m affine transfrom
|
||||
* @param[in] v translate vector [x, y, z]
|
||||
* @returns affine transfrom
|
||||
*/
|
||||
CGLM_INLINE
|
||||
mat4s
|
||||
glms_translate(mat4s m, vec3s v) {
|
||||
glm_translate(m.raw, v.raw);
|
||||
return m;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief translate existing transform matrix by x factor
|
||||
*
|
||||
* @param[in] m affine transfrom
|
||||
* @param[in] x x factor
|
||||
* @returns affine transfrom
|
||||
*/
|
||||
CGLM_INLINE
|
||||
mat4s
|
||||
glms_translate_x(mat4s m, float x) {
|
||||
glm_translate_x(m.raw, x);
|
||||
return m;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief translate existing transform matrix by y factor
|
||||
*
|
||||
* @param[in] m affine transfrom
|
||||
* @param[in] y y factor
|
||||
* @returns affine transfrom
|
||||
*/
|
||||
CGLM_INLINE
|
||||
mat4s
|
||||
glms_translate_y(mat4s m, float y) {
|
||||
glm_translate_y(m.raw, y);
|
||||
return m;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief translate existing transform matrix by z factor
|
||||
*
|
||||
* @param[in] m affine transfrom
|
||||
* @param[in] z z factor
|
||||
* @returns affine transfrom
|
||||
*/
|
||||
CGLM_INLINE
|
||||
mat4s
|
||||
glms_translate_z(mat4s m, float z) {
|
||||
glm_translate_z(m.raw, z);
|
||||
return 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)
|
||||
* @returns rotated matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
mat4s
|
||||
glms_rotate_x(mat4s m, float angle) {
|
||||
mat4s r;
|
||||
glm_rotate_x(m.raw, angle, r.raw);
|
||||
return r;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @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)
|
||||
* @returns rotated matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
mat4s
|
||||
glms_rotate_y(mat4s m, float angle) {
|
||||
mat4s r;
|
||||
glm_rotate_y(m.raw, angle, r.raw);
|
||||
return r;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @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)
|
||||
* @returns rotated matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
mat4s
|
||||
glms_rotate_z(mat4s m, float angle) {
|
||||
mat4s r;
|
||||
glm_rotate_z(m.raw, angle, r.raw);
|
||||
return r;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief rotate existing transform matrix around given axis by angle
|
||||
*
|
||||
* @param[in] m affine transfrom
|
||||
* @param[in] angle angle (radians)
|
||||
* @param[in] axis axis
|
||||
* @returns affine transfrom
|
||||
*/
|
||||
CGLM_INLINE
|
||||
mat4s
|
||||
glms_rotate(mat4s m, float angle, vec3s axis) {
|
||||
glm_rotate(m.raw, angle, axis.raw);
|
||||
return m;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief rotate existing transform
|
||||
* around given axis by angle at given pivot point (rotation center)
|
||||
*
|
||||
* @param[in] m affine transfrom
|
||||
* @param[in] pivot rotation center
|
||||
* @param[in] angle angle (radians)
|
||||
* @param[in] axis axis
|
||||
* @returns affine transfrom
|
||||
*/
|
||||
CGLM_INLINE
|
||||
mat4s
|
||||
glms_rotate_at(mat4s m, vec3s pivot, float angle, vec3s axis) {
|
||||
glm_rotate_at(m.raw, pivot.raw, angle, axis.raw);
|
||||
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;
|
||||
}
|
||||
|
||||
#endif /* cglms_affines_pre_h */
|
||||
@@ -23,6 +23,7 @@
|
||||
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_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 bool glms_uniscaled(mat4s m);
|
||||
CGLM_INLINE void glms_decompose_rs(mat4s m, mat4s * r, vec3s * s);
|
||||
@@ -39,63 +40,6 @@
|
||||
#include "vec4.h"
|
||||
#include "mat4.h"
|
||||
|
||||
/*!
|
||||
* @brief translate existing transform matrix by v vector
|
||||
* and stores result in same matrix
|
||||
*
|
||||
* @param[in] m affine transfrom
|
||||
* @param[in] v translate vector [x, y, z]
|
||||
* @returns affine transfrom
|
||||
*/
|
||||
CGLM_INLINE
|
||||
mat4s
|
||||
glms_translate(mat4s m, vec3s v) {
|
||||
glm_translate(m.raw, v.raw);
|
||||
return m;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief translate existing transform matrix by x factor
|
||||
*
|
||||
* @param[in] m affine transfrom
|
||||
* @param[in] x x factor
|
||||
* @returns affine transfrom
|
||||
*/
|
||||
CGLM_INLINE
|
||||
mat4s
|
||||
glms_translate_x(mat4s m, float x) {
|
||||
glm_translate_x(m.raw, x);
|
||||
return m;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief translate existing transform matrix by y factor
|
||||
*
|
||||
* @param[in] m affine transfrom
|
||||
* @param[in] y y factor
|
||||
* @returns affine transfrom
|
||||
*/
|
||||
CGLM_INLINE
|
||||
mat4s
|
||||
glms_translate_y(mat4s m, float y) {
|
||||
glm_translate_y(m.raw, y);
|
||||
return m;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief translate existing transform matrix by z factor
|
||||
*
|
||||
* @param[in] m affine transfrom
|
||||
* @param[in] z z factor
|
||||
* @returns affine transfrom
|
||||
*/
|
||||
CGLM_INLINE
|
||||
mat4s
|
||||
glms_translate_z(mat4s m, float z) {
|
||||
glm_translate_z(m.raw, z);
|
||||
return m;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief creates NEW translate transform matrix by v vector
|
||||
*
|
||||
@@ -155,54 +99,6 @@ glms_scale_uni(mat4s m, float s) {
|
||||
return 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)
|
||||
* @returns rotated matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
mat4s
|
||||
glms_rotate_x(mat4s m, float angle) {
|
||||
mat4s r;
|
||||
glm_rotate_x(m.raw, angle, r.raw);
|
||||
return r;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @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)
|
||||
* @returns rotated matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
mat4s
|
||||
glms_rotate_y(mat4s m, float angle) {
|
||||
mat4s r;
|
||||
glm_rotate_y(m.raw, angle, r.raw);
|
||||
return r;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @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)
|
||||
* @returns rotated matrix
|
||||
*/
|
||||
CGLM_INLINE
|
||||
mat4s
|
||||
glms_rotate_z(mat4s m, float angle) {
|
||||
mat4s r;
|
||||
glm_rotate_z(m.raw, angle, r.raw);
|
||||
return r;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief creates NEW rotation matrix by angle and axis
|
||||
*
|
||||
@@ -220,38 +116,6 @@ glms_rotate_make(float angle, vec3s axis) {
|
||||
return m;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief rotate existing transform matrix around given axis by angle
|
||||
*
|
||||
* @param[in] m affine transfrom
|
||||
* @param[in] angle angle (radians)
|
||||
* @param[in] axis axis
|
||||
* @returns affine transfrom
|
||||
*/
|
||||
CGLM_INLINE
|
||||
mat4s
|
||||
glms_rotate(mat4s m, float angle, vec3s axis) {
|
||||
glm_rotate(m.raw, angle, axis.raw);
|
||||
return m;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief rotate existing transform
|
||||
* around given axis by angle at given pivot point (rotation center)
|
||||
*
|
||||
* @param[in] m affine transfrom
|
||||
* @param[in] pivot rotation center
|
||||
* @param[in] angle angle (radians)
|
||||
* @param[in] axis axis
|
||||
* @returns affine transfrom
|
||||
*/
|
||||
CGLM_INLINE
|
||||
mat4s
|
||||
glms_rotate_at(mat4s m, vec3s pivot, float angle, vec3s axis) {
|
||||
glm_rotate_at(m.raw, pivot.raw, angle, axis.raw);
|
||||
return m;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief creates NEW rotation matrix by angle and axis at given point
|
||||
*
|
||||
@@ -330,4 +194,7 @@ glms_decompose(mat4s m, vec4s * __restrict t, mat4s * __restrict r, vec3s * __re
|
||||
glm_decompose(m.raw, t->raw, r->raw, s->raw);
|
||||
}
|
||||
|
||||
#include "affine-pre.h"
|
||||
#include "affine-post.h"
|
||||
|
||||
#endif /* cglms_affines_h */
|
||||
|
||||
@@ -15,6 +15,9 @@
|
||||
#include "vec4.h"
|
||||
#include "mat4.h"
|
||||
|
||||
/* api definition */
|
||||
#define glms_aabb_(NAME) CGLM_STRUCTAPI(aabb, NAME)
|
||||
|
||||
/*!
|
||||
* @brief apply transform to Axis-Aligned Bounding Box
|
||||
*
|
||||
@@ -24,7 +27,7 @@
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glms_aabb_transform(vec3s box[2], mat4s m, vec3s dest[2]) {
|
||||
glms_aabb_(transform)(vec3s box[2], mat4s m, vec3s dest[2]) {
|
||||
vec3 rawBox[2];
|
||||
vec3 rawDest[2];
|
||||
|
||||
@@ -45,7 +48,7 @@ glms_aabb_transform(vec3s box[2], mat4s m, vec3s dest[2]) {
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glms_aabb_merge(vec3s box1[2], vec3s box2[2], vec3s dest[2]) {
|
||||
glms_aabb_(merge)(vec3s box1[2], vec3s box2[2], vec3s dest[2]) {
|
||||
vec3 rawBox1[2];
|
||||
vec3 rawBox2[2];
|
||||
vec3 rawDest[2];
|
||||
@@ -69,7 +72,7 @@ glms_aabb_merge(vec3s box1[2], vec3s box2[2], vec3s dest[2]) {
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glms_aabb_crop(vec3s box[2], vec3s cropBox[2], vec3s dest[2]) {
|
||||
glms_aabb_(crop)(vec3s box[2], vec3s cropBox[2], vec3s dest[2]) {
|
||||
vec3 rawBox[2];
|
||||
vec3 rawCropBox[2];
|
||||
vec3 rawDest[2];
|
||||
@@ -94,7 +97,7 @@ glms_aabb_crop(vec3s box[2], vec3s cropBox[2], vec3s dest[2]) {
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glms_aabb_crop_until(vec3s box[2],
|
||||
glms_aabb_(crop_until)(vec3s box[2],
|
||||
vec3s cropBox[2],
|
||||
vec3s clampBox[2],
|
||||
vec3s dest[2]) {
|
||||
@@ -118,7 +121,7 @@ glms_aabb_crop_until(vec3s box[2],
|
||||
*/
|
||||
CGLM_INLINE
|
||||
bool
|
||||
glms_aabb_frustum(vec3s box[2], vec4s planes[6]) {
|
||||
glms_aabb_(frustum)(vec3s box[2], vec4s planes[6]) {
|
||||
vec3 rawBox[2];
|
||||
vec4 rawPlanes[6];
|
||||
|
||||
@@ -134,7 +137,7 @@ glms_aabb_frustum(vec3s box[2], vec4s planes[6]) {
|
||||
*/
|
||||
CGLM_INLINE
|
||||
void
|
||||
glms_aabb_invalidate(vec3s box[2]) {
|
||||
glms_aabb_(invalidate)(vec3s box[2]) {
|
||||
box[0] = glms_vec3_broadcast(FLT_MAX);
|
||||
box[1] = glms_vec3_broadcast(-FLT_MAX);
|
||||
}
|
||||
@@ -146,7 +149,7 @@ glms_aabb_invalidate(vec3s box[2]) {
|
||||
*/
|
||||
CGLM_INLINE
|
||||
bool
|
||||
glms_aabb_isvalid(vec3s box[2]) {
|
||||
glms_aabb_(isvalid)(vec3s box[2]) {
|
||||
vec3 rawBox[2];
|
||||
glms_vec3_unpack(rawBox, box, 2);
|
||||
return glm_aabb_isvalid(rawBox);
|
||||
@@ -159,7 +162,7 @@ glms_aabb_isvalid(vec3s box[2]) {
|
||||
*/
|
||||
CGLM_INLINE
|
||||
float
|
||||
glms_aabb_size(vec3s box[2]) {
|
||||
glms_aabb_(size)(vec3s box[2]) {
|
||||
return glm_vec3_distance(box[0].raw, box[1].raw);
|
||||
}
|
||||
|
||||
@@ -170,7 +173,7 @@ glms_aabb_size(vec3s box[2]) {
|
||||
*/
|
||||
CGLM_INLINE
|
||||
float
|
||||
glms_aabb_radius(vec3s box[2]) {
|
||||
glms_aabb_(radius)(vec3s box[2]) {
|
||||
return glms_aabb_size(box) * 0.5f;
|
||||
}
|
||||
|
||||
@@ -182,7 +185,7 @@ glms_aabb_radius(vec3s box[2]) {
|
||||
*/
|
||||
CGLM_INLINE
|
||||
vec3s
|
||||
glms_aabb_center(vec3s box[2]) {
|
||||
glms_aabb_(center)(vec3s box[2]) {
|
||||
return glms_vec3_center(box[0], box[1]);
|
||||
}
|
||||
|
||||
@@ -194,7 +197,7 @@ glms_aabb_center(vec3s box[2]) {
|
||||
*/
|
||||
CGLM_INLINE
|
||||
bool
|
||||
glms_aabb_aabb(vec3s box[2], vec3s other[2]) {
|
||||
glms_aabb_(aabb)(vec3s box[2], vec3s other[2]) {
|
||||
vec3 rawBox[2];
|
||||
vec3 rawOther[2];
|
||||
|
||||
@@ -214,7 +217,7 @@ glms_aabb_aabb(vec3s box[2], vec3s other[2]) {
|
||||
*/
|
||||
CGLM_INLINE
|
||||
bool
|
||||
glms_aabb_sphere(vec3s box[2], vec4s s) {
|
||||
glms_aabb_(sphere)(vec3s box[2], vec4s s) {
|
||||
vec3 rawBox[2];
|
||||
|
||||
glms_vec3_unpack(rawBox, box, 2);
|
||||
@@ -229,7 +232,7 @@ glms_aabb_sphere(vec3s box[2], vec4s s) {
|
||||
*/
|
||||
CGLM_INLINE
|
||||
bool
|
||||
glms_aabb_point(vec3s box[2], vec3s point) {
|
||||
glms_aabb_(point)(vec3s box[2], vec3s point) {
|
||||
vec3 rawBox[2];
|
||||
|
||||
glms_vec3_unpack(rawBox, box, 2);
|
||||
@@ -244,7 +247,7 @@ glms_aabb_point(vec3s box[2], vec3s point) {
|
||||
*/
|
||||
CGLM_INLINE
|
||||
bool
|
||||
glms_aabb_contains(vec3s box[2], vec3s other[2]) {
|
||||
glms_aabb_(contains)(vec3s box[2], vec3s other[2]) {
|
||||
vec3 rawBox[2];
|
||||
vec3 rawOther[2];
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* 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
|
||||
*/
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* 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
|
||||
*/
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* 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
|
||||
*/
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* 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
|
||||
*/
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* 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
|
||||
*/
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* 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
|
||||
*/
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* 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
|
||||
*/
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* 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
|
||||
*/
|
||||
|
||||
|
||||
96
include/cglm/struct/clipspace/project_no.h
Normal file
96
include/cglm/struct/clipspace/project_no.h
Normal 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 */
|
||||
96
include/cglm/struct/clipspace/project_zo.h
Normal file
96
include/cglm/struct/clipspace/project_zo.h
Normal 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 */
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* 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
|
||||
*/
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* 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
|
||||
*/
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* 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
|
||||
*/
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user