mirror of
https://github.com/recp/cglm.git
synced 2026-02-17 03:39:05 +00:00
Compare commits
375 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
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 | ||
|
|
e5d88f22a0 | ||
|
|
8e10ab2b49 | ||
|
|
4ede0815d4 | ||
|
|
7d16e3583f | ||
|
|
6011baff06 | ||
|
|
af92df4e84 | ||
|
|
94381d3067 | ||
|
|
0e794f8f8f | ||
|
|
b895e424b0 | ||
|
|
a2b8858e36 | ||
|
|
9d08407897 | ||
|
|
8898c3b471 | ||
|
|
f0c2860179 | ||
|
|
f142e8e16e | ||
|
|
5ac916236c | ||
|
|
4327935b9f | ||
|
|
086b40bf6a | ||
|
|
af3b356762 | ||
|
|
9ac291c673 | ||
|
|
7f7e9f69da | ||
|
|
8ddb5d5740 | ||
|
|
56ec058c7d | ||
|
|
a5af9e5eac | ||
|
|
4d20f97275 | ||
|
|
89e8c352ec | ||
|
|
403097d56c | ||
|
|
eddaf464ff | ||
|
|
7065011bf3 | ||
|
|
db46ea110a | ||
|
|
c013bd462c | ||
|
|
b3a18b8a15 | ||
|
|
1bce62c371 | ||
|
|
a242d83805 | ||
|
|
7760c709da | ||
|
|
919e3bcf4a | ||
|
|
607182982d | ||
|
|
ad17f38934 | ||
|
|
8302f78484 | ||
|
|
9665be3138 | ||
|
|
5c22ca3abb | ||
|
|
7f9585ca72 | ||
|
|
d0ab3aaa2e | ||
|
|
83dbdcc4a9 | ||
|
|
8ce45b4303 | ||
|
|
f19ff5d064 | ||
|
|
d6b93f052e | ||
|
|
28705be5a3 | ||
|
|
e1b142bce7 | ||
|
|
0f96eaad20 | ||
|
|
d5d3178ae0 | ||
|
|
13269f4af8 | ||
|
|
faf6186c29 | ||
|
|
2be6ac949b | ||
|
|
5b7bc522ac | ||
|
|
376cf31ee7 | ||
|
|
d28b381dd6 | ||
|
|
3673622cc3 | ||
|
|
a90f706e12 | ||
|
|
c065d71a2f | ||
|
|
1b3b91fe0b | ||
|
|
17560a0687 | ||
|
|
ba634d6c83 | ||
|
|
f35badd436 | ||
|
|
04eaf9c535 | ||
|
|
bd6641bd0a | ||
|
|
4e4bff418d | ||
|
|
55ebbdbe40 | ||
|
|
e4c35e32fc | ||
|
|
ec467fef1f | ||
|
|
1e8865233b | ||
|
|
155eb109a8 | ||
|
|
2903813765 | ||
|
|
0ab50f7208 | ||
|
|
701e015bfd | ||
|
|
1fb941a41b | ||
|
|
92151c6328 | ||
|
|
afac887850 | ||
|
|
a111693b6b | ||
|
|
ce9e5f5575 | ||
|
|
d13842e7de | ||
|
|
059e5010e6 | ||
|
|
65292a94a6 | ||
|
|
f303984aad | ||
|
|
7d5c4da7cf | ||
|
|
63988a515c | ||
|
|
9725b60d46 | ||
|
|
50c93f3d30 | ||
|
|
f14ca0c3f2 | ||
|
|
0c165cba76 | ||
|
|
2de1133012 | ||
|
|
12dc054e49 | ||
|
|
ebba4eea8e | ||
|
|
aa2fa89e6c | ||
|
|
7b0eee497e | ||
|
|
04008d9c3f | ||
|
|
11b1588105 | ||
|
|
7c81482248 | ||
|
|
f3f29bd383 | ||
|
|
0d0d22f96c | ||
|
|
7df5aa2e26 | ||
|
|
7cc4c37afb | ||
|
|
abe29a788a | ||
|
|
c5655bbd2e | ||
|
|
47e0045015 | ||
|
|
8f09cc8583 | ||
|
|
d6a0ac320b | ||
|
|
616d38c13a | ||
|
|
9e12908556 | ||
|
|
405cda6ee9 | ||
|
|
1b0322e51c | ||
|
|
4a308dcd9e | ||
|
|
fec396950b | ||
|
|
981af0565e | ||
|
|
1d215ef5f3 | ||
|
|
2b7cfde64f | ||
|
|
c783c42101 | ||
|
|
bddcfedead | ||
|
|
34e7438271 | ||
|
|
485ff6bc46 | ||
|
|
4ab9ab4772 | ||
|
|
a5ff477fc8 | ||
|
|
254570d006 | ||
|
|
681f20d540 | ||
|
|
fd87f6e2c3 | ||
|
|
2c12c6dce5 | ||
|
|
5619527fd3 | ||
|
|
8b1c3c3fc4 | ||
|
|
ec852c7682 | ||
|
|
5433c9ed6c | ||
|
|
2a2d51624b | ||
|
|
5fa908602f | ||
|
|
9da74f9654 | ||
|
|
dddb077b13 | ||
|
|
6107287c9a | ||
|
|
7dccbef6e3 | ||
|
|
d920a62be2 | ||
|
|
73f32b9ef7 | ||
|
|
2e5257bcc1 | ||
|
|
65b0b461ab | ||
|
|
e34601f578 | ||
|
|
fa01a3077b | ||
|
|
54f805a62d | ||
|
|
a05b282fad | ||
|
|
66f6bbde6c | ||
|
|
4054d9a190 | ||
|
|
c1112f0063 | ||
|
|
b62e922f32 | ||
|
|
3c53bed709 | ||
|
|
a2b6d71558 | ||
|
|
fdfceb9f5b | ||
|
|
d273daecfe | ||
|
|
92b75a1345 | ||
|
|
640795a771 | ||
|
|
cad265ebcd | ||
|
|
387c33fb4d | ||
|
|
77585de397 | ||
|
|
a9b06e4b35 | ||
|
|
7976ac78f2 | ||
|
|
208f8073ad | ||
|
|
009fb966a6 | ||
|
|
09fd9f86b9 | ||
|
|
2ff4ae0b4c | ||
|
|
aa0a195e98 | ||
|
|
87092e6849 | ||
|
|
89ced4166a | ||
|
|
6080099434 | ||
|
|
f3735c9036 | ||
|
|
2242e9a5e1 | ||
|
|
a12364d486 | ||
|
|
b133c2e3e3 | ||
|
|
0127d30fa8 | ||
|
|
9b13b2f872 | ||
|
|
40d903c2bc | ||
|
|
06016220c0 | ||
|
|
bb751d32ca | ||
|
|
6dc37f6cc9 | ||
|
|
5ff42799b2 | ||
|
|
2326e627b5 | ||
|
|
c18fe8098f | ||
|
|
a9ed8470b4 | ||
|
|
332087da61 | ||
|
|
56c43d7a74 | ||
|
|
649f390662 | ||
|
|
0818bbdf51 | ||
|
|
edd1517f85 | ||
|
|
d0c2e8233c | ||
|
|
87837aa074 | ||
|
|
62ab6c56c0 | ||
|
|
a2985aa444 | ||
|
|
7274cee153 | ||
|
|
79c44fdbfa | ||
|
|
c32e986497 | ||
|
|
b953fcf1bd | ||
|
|
c0a4c245f0 | ||
|
|
acc0885e52 | ||
|
|
f49e8f9991 | ||
|
|
d2e5a3cd5b | ||
|
|
a1485a14f6 | ||
|
|
271e3b15d6 | ||
|
|
74cf89a82f | ||
|
|
8698082411 | ||
|
|
799de548f4 | ||
|
|
671dae3e22 | ||
|
|
7e142132bf | ||
|
|
0ccd58da01 | ||
|
|
4211c230cc | ||
|
|
269bdb3dbd | ||
|
|
b032b803ca | ||
|
|
26a638e11d | ||
|
|
099522ada3 | ||
|
|
4903dd62ea | ||
|
|
95161f7776 | ||
|
|
f0942c13a1 | ||
|
|
8eddeb77d0 | ||
|
|
cbed29820b | ||
|
|
3ec6bad5b3 | ||
|
|
fefc3dc32d | ||
|
|
203d40208c | ||
|
|
c45445c613 | ||
|
|
73c6766806 | ||
|
|
65dff25ed5 | ||
|
|
c2584c0fe6 | ||
|
|
bd951f96be | ||
|
|
1200372ced | ||
|
|
75a5ca153d | ||
|
|
5a9593d9bc | ||
|
|
edf46aaf2b | ||
|
|
e2ba795603 | ||
|
|
5e6b566d6a | ||
|
|
c973768495 | ||
|
|
6d8e2cc92d | ||
|
|
010dda6a77 | ||
|
|
345c7307ef | ||
|
|
f485c928b1 | ||
|
|
e895fe884e | ||
|
|
18fe47d0c7 | ||
|
|
a84ebc4aaa | ||
|
|
5c35c4ef5d | ||
|
|
f79674f66a | ||
|
|
e40373a1fa | ||
|
|
47807b7955 | ||
|
|
38cb693834 | ||
|
|
7bcd7609eb | ||
|
|
90eb164a43 | ||
|
|
78b2e2d2cc | ||
|
|
e60e7b5750 | ||
|
|
c1331a1dd4 | ||
|
|
339adab783 | ||
|
|
7bf38a3062 | ||
|
|
99076be6bb | ||
|
|
eb332acd7e | ||
|
|
c67f7a14a1 | ||
|
|
83f6db1bf8 | ||
|
|
e493149a0a | ||
|
|
38019f0913 | ||
|
|
bc6b751429 | ||
|
|
be68d57499 | ||
|
|
1fb5f89eaa | ||
|
|
6470a91265 | ||
|
|
d4235b2431 | ||
|
|
0ef028244a | ||
|
|
a8543bc813 | ||
|
|
cf3888d734 | ||
|
|
b8e978862e | ||
|
|
dfba2072f7 | ||
|
|
2bf576c2cd | ||
|
|
3abf47f175 | ||
|
|
2fc51c67a3 | ||
|
|
34753546f2 | ||
|
|
1711db4fef | ||
|
|
373b8d216a | ||
|
|
7f9487fd62 | ||
|
|
686deb8eb1 | ||
|
|
a392ac3012 | ||
|
|
fabc655919 | ||
|
|
7eada03909 | ||
|
|
ad4a763d47 | ||
|
|
1f9765c5e5 | ||
|
|
b3a464bf89 | ||
|
|
69b5584f11 | ||
|
|
00523f0b89 | ||
|
|
31f313caff | ||
|
|
010b88ee7a | ||
|
|
702da626f1 | ||
|
|
8e008511f4 | ||
|
|
eb0d47cfa1 | ||
|
|
638b9f6dbe | ||
|
|
ab20ebc28c | ||
|
|
701a95583a | ||
|
|
ad9370537c | ||
|
|
43ae3b332a | ||
|
|
8a068c3291 | ||
|
|
4a7c153d2d | ||
|
|
7b0f62f1eb | ||
|
|
0c8dc070d5 | ||
|
|
0822d46cd9 | ||
|
|
3fca734c30 | ||
|
|
5995269195 | ||
|
|
6b32b5dc35 | ||
|
|
a1f7afe055 | ||
|
|
81ae182972 | ||
|
|
de85a4eb2b | ||
|
|
8ac1347f8a | ||
|
|
e7a0906bc2 | ||
|
|
6aa8df8e9b | ||
|
|
2278eba93c | ||
|
|
5ee9bb88df | ||
|
|
349dc274f4 | ||
|
|
b9f9548b06 | ||
|
|
c630293c7d | ||
|
|
406d09e085 | ||
|
|
65de029acb | ||
|
|
b46a4ccee5 | ||
|
|
5da864f345 | ||
|
|
3640e402da | ||
|
|
d86f5df776 | ||
|
|
cb54a8b8c5 | ||
|
|
8cb6fa792c | ||
|
|
ef89cd7236 | ||
|
|
a4c7c5e1ba | ||
|
|
2827fbfa79 | ||
|
|
ad823d9681 | ||
|
|
047ed259ae | ||
|
|
0729fd40a4 |
1
.gitattributes
vendored
Normal file
1
.gitattributes
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
*.h linguist-language=C
|
||||||
7
.gitignore
vendored
7
.gitignore
vendored
@@ -72,3 +72,10 @@ cglm-test-ios*
|
|||||||
/cglm.pc
|
/cglm.pc
|
||||||
test-driver
|
test-driver
|
||||||
Default-568h@2x.png
|
Default-568h@2x.png
|
||||||
|
build/
|
||||||
|
conftest.dir/*
|
||||||
|
confdefs.h
|
||||||
|
*.xcuserdatad
|
||||||
|
.idea
|
||||||
|
cmake-build-debug
|
||||||
|
*.o.tmp
|
||||||
|
|||||||
@@ -4,6 +4,12 @@ os:
|
|||||||
- linux
|
- linux
|
||||||
- osx
|
- osx
|
||||||
|
|
||||||
|
arch:
|
||||||
|
- amd64
|
||||||
|
- ppc64le
|
||||||
|
- s390x
|
||||||
|
- arm64
|
||||||
|
|
||||||
sudo: required
|
sudo: required
|
||||||
dist: trusty
|
dist: trusty
|
||||||
|
|
||||||
|
|||||||
4
.vscode/settings.json
vendored
Normal file
4
.vscode/settings.json
vendored
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"C_Cpp.default.configurationProvider": "vector-of-bool.cmake-tools",
|
||||||
|
"restructuredtext.confPath": "${workspaceFolder}/docs/source"
|
||||||
|
}
|
||||||
159
CMakeLists.txt
Normal file
159
CMakeLists.txt
Normal file
@@ -0,0 +1,159 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.8.2)
|
||||||
|
project(cglm VERSION 0.8.5 LANGUAGES C)
|
||||||
|
|
||||||
|
set(CMAKE_C_STANDARD 11)
|
||||||
|
set(CMAKE_C_STANDARD_REQUIRED YES)
|
||||||
|
set(DEFAULT_BUILD_TYPE "Release")
|
||||||
|
|
||||||
|
set(CGLM_BUILD)
|
||||||
|
option(CGLM_SHARED "Shared build" ON)
|
||||||
|
option(CGLM_STATIC "Static build" OFF)
|
||||||
|
option(CGLM_USE_C99 "" OFF)
|
||||||
|
option(CGLM_USE_TEST "Enable Tests" OFF)
|
||||||
|
|
||||||
|
if(NOT CGLM_STATIC AND CGLM_SHARED)
|
||||||
|
set(CGLM_BUILD SHARED)
|
||||||
|
else(CGLM_STATIC)
|
||||||
|
set(CGLM_BUILD STATIC)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(CGLM_USE_C99)
|
||||||
|
set(CMAKE_C_STANDARD 99)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(MSVC)
|
||||||
|
add_definitions(-DNDEBUG -D_WINDOWS -D_USRDLL)
|
||||||
|
add_compile_options(/W3 /Ox /Gy /Oi /TC)
|
||||||
|
|
||||||
|
# Ref: https://skia.googlesource.com/third_party/sdl/+/refs/heads/master/CMakeLists.txt#225
|
||||||
|
# Make sure /RTC1 is disabled, otherwise it will use functions from the CRT
|
||||||
|
foreach(flag_var
|
||||||
|
CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
|
||||||
|
CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO)
|
||||||
|
string(REGEX REPLACE "/RTC(su|[1su])" "" ${flag_var} "${${flag_var}}")
|
||||||
|
endforeach(flag_var)
|
||||||
|
else()
|
||||||
|
add_compile_options(-Wall -Werror -O3)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
|
||||||
|
message(STATUS "Setting build type to '${DEFAULT_BUILD_TYPE}' as none was specified.")
|
||||||
|
set(CMAKE_BUILD_TYPE "${DEFAULT_BUILD_TYPE}" CACHE STRING "Choose the type of build." FORCE)
|
||||||
|
# Set the possible values of build type for cmake-gui
|
||||||
|
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
include(GNUInstallDirs)
|
||||||
|
|
||||||
|
set(CPACK_PROJECT_NAME ${PROJECT_NAME})
|
||||||
|
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
|
||||||
|
|
||||||
|
if(NOT CPack_CMake_INCLUDED)
|
||||||
|
include(CPack)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Target Start
|
||||||
|
add_library(${PROJECT_NAME}
|
||||||
|
${CGLM_BUILD}
|
||||||
|
src/euler.c
|
||||||
|
src/affine.c
|
||||||
|
src/io.c
|
||||||
|
src/quat.c
|
||||||
|
src/cam.c
|
||||||
|
src/vec2.c
|
||||||
|
src/vec3.c
|
||||||
|
src/vec4.c
|
||||||
|
src/mat2.c
|
||||||
|
src/mat3.c
|
||||||
|
src/mat4.c
|
||||||
|
src/plane.c
|
||||||
|
src/frustum.c
|
||||||
|
src/box.c
|
||||||
|
src/project.c
|
||||||
|
src/sphere.c
|
||||||
|
src/ease.c
|
||||||
|
src/curve.c
|
||||||
|
src/bezier.c
|
||||||
|
src/ray.c
|
||||||
|
src/affine2d.c
|
||||||
|
src/clipspace/persp_lh_zo.c
|
||||||
|
src/clipspace/persp_rh_zo.c
|
||||||
|
src/clipspace/persp_lh_no.c
|
||||||
|
src/clipspace/persp_rh_no.c
|
||||||
|
src/clipspace/ortho_lh_zo.c
|
||||||
|
src/clipspace/ortho_rh_zo.c
|
||||||
|
src/clipspace/ortho_lh_no.c
|
||||||
|
src/clipspace/ortho_rh_no.c
|
||||||
|
src/clipspace/view_lh_zo.c
|
||||||
|
src/clipspace/view_rh_zo.c
|
||||||
|
src/clipspace/view_lh_no.c
|
||||||
|
src/clipspace/view_rh_no.c
|
||||||
|
)
|
||||||
|
|
||||||
|
if(CGLM_SHARED)
|
||||||
|
add_definitions(-DCGLM_EXPORTS)
|
||||||
|
else()
|
||||||
|
target_compile_definitions(${PROJECT_NAME} PUBLIC -DCGLM_STATIC)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set_target_properties(${PROJECT_NAME} PROPERTIES
|
||||||
|
VERSION ${PROJECT_VERSION}
|
||||||
|
SOVERSION ${PROJECT_VERSION_MAJOR})
|
||||||
|
|
||||||
|
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>
|
||||||
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
|
||||||
|
PRIVATE
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/src
|
||||||
|
)
|
||||||
|
|
||||||
|
# Target for header-only usage
|
||||||
|
add_library(${PROJECT_NAME}_headers INTERFACE)
|
||||||
|
target_include_directories(${PROJECT_NAME}_headers INTERFACE
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/include)
|
||||||
|
|
||||||
|
# Test Configuration
|
||||||
|
if(CGLM_USE_TEST)
|
||||||
|
include(CTest)
|
||||||
|
enable_testing()
|
||||||
|
add_subdirectory(test)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Install
|
||||||
|
install(TARGETS ${PROJECT_NAME}
|
||||||
|
EXPORT ${PROJECT_NAME}
|
||||||
|
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||||
|
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||||
|
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
|
||||||
|
|
||||||
|
install(DIRECTORY include/${PROJECT_NAME} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
|
||||||
|
PATTERN ".*" EXCLUDE)
|
||||||
|
|
||||||
|
# Config
|
||||||
|
export(TARGETS ${PROJECT_NAME}
|
||||||
|
NAMESPACE ${PROJECT_NAME}::
|
||||||
|
FILE "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
|
||||||
|
)
|
||||||
|
|
||||||
|
install(EXPORT ${PROJECT_NAME}
|
||||||
|
FILE "${PROJECT_NAME}Config.cmake"
|
||||||
|
NAMESPACE ${PROJECT_NAME}::
|
||||||
|
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME})
|
||||||
|
|
||||||
|
set(PACKAGE_NAME ${PROJECT_NAME})
|
||||||
|
set(prefix ${CMAKE_INSTALL_PREFIX})
|
||||||
|
set(exec_prefix ${CMAKE_INSTALL_PREFIX})
|
||||||
|
set(includedir "\${prefix}/${CMAKE_INSTALL_INCLUDEDIR}")
|
||||||
|
set(libdir "\${prefix}/${CMAKE_INSTALL_LIBDIR}")
|
||||||
|
set(PACKAGE_VERSION "${PROJECT_VERSION}")
|
||||||
|
configure_file(${CMAKE_CURRENT_LIST_DIR}/cglm.pc.in ${CMAKE_BINARY_DIR}/cglm.pc @ONLY)
|
||||||
|
|
||||||
|
install(FILES ${CMAKE_BINARY_DIR}/cglm.pc
|
||||||
|
DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
|
||||||
21
CREDITS
21
CREDITS
@@ -61,3 +61,24 @@ https://forums.khronos.org/showthread.php/10264-Animations-in-1-4-1-release-note
|
|||||||
https://forums.khronos.org/showthread.php/10644-Animation-Bezier-interpolation
|
https://forums.khronos.org/showthread.php/10644-Animation-Bezier-interpolation
|
||||||
https://forums.khronos.org/showthread.php/10387-2D-Tangents-in-Bezier-Splines?p=34164&viewfull=1#post34164
|
https://forums.khronos.org/showthread.php/10387-2D-Tangents-in-Bezier-Splines?p=34164&viewfull=1#post34164
|
||||||
https://forums.khronos.org/showthread.php/10651-Animation-TCB-Spline-Interpolation-in-COLLADA?highlight=bezier
|
https://forums.khronos.org/showthread.php/10651-Animation-TCB-Spline-Interpolation-in-COLLADA?highlight=bezier
|
||||||
|
|
||||||
|
12. vec2 cross product
|
||||||
|
http://allenchou.net/2013/07/cross-product-of-2d-vectors/
|
||||||
|
|
||||||
|
13. Ray triangle intersect
|
||||||
|
Möller–Trumbore ray-triangle intersection algorithm, from "Fast, Minimum Storage Ray/Triangle Intersection"
|
||||||
|
Authors:
|
||||||
|
Thomas Möller (tompa@clarus.se)
|
||||||
|
Ben Trumbore (wbt@graphics.cornell.edu)
|
||||||
|
Link to paper: http://webserver2.tecgraf.puc-rio.br/~mgattass/cg/trbRR/Fast%20MinimumStorage%20RayTriangle%20Intersection.pdf
|
||||||
|
|
||||||
|
14. ARM NEON: Matrix Vector Multiplication
|
||||||
|
https://stackoverflow.com/a/57793352/2676533
|
||||||
|
|
||||||
|
16. ARM NEON Div
|
||||||
|
|
||||||
|
http://github.com/microsoft/DirectXMath
|
||||||
|
|
||||||
|
17. Pick Matrix
|
||||||
|
|
||||||
|
glu project -> project.c
|
||||||
|
|||||||
116
Makefile.am
116
Makefile.am
@@ -12,7 +12,6 @@ AM_CFLAGS = -Wall \
|
|||||||
-O3 \
|
-O3 \
|
||||||
-Wstrict-aliasing=2 \
|
-Wstrict-aliasing=2 \
|
||||||
-fstrict-aliasing \
|
-fstrict-aliasing \
|
||||||
-pedantic \
|
|
||||||
-Werror=strict-prototypes
|
-Werror=strict-prototypes
|
||||||
|
|
||||||
lib_LTLIBRARIES = libcglm.la
|
lib_LTLIBRARIES = libcglm.la
|
||||||
@@ -22,7 +21,10 @@ checkLDFLAGS = -L./.libs \
|
|||||||
-lm \
|
-lm \
|
||||||
-lcglm
|
-lcglm
|
||||||
checkCFLAGS = $(AM_CFLAGS) \
|
checkCFLAGS = $(AM_CFLAGS) \
|
||||||
-I./include
|
-std=gnu11 \
|
||||||
|
-O3 \
|
||||||
|
-DCGLM_DEFINE_PRINTS \
|
||||||
|
-I./include
|
||||||
|
|
||||||
check_PROGRAMS = test/tests
|
check_PROGRAMS = test/tests
|
||||||
TESTS = $(check_PROGRAMS)
|
TESTS = $(check_PROGRAMS)
|
||||||
@@ -42,7 +44,10 @@ cglm_HEADERS = include/cglm/version.h \
|
|||||||
include/cglm/io.h \
|
include/cglm/io.h \
|
||||||
include/cglm/mat4.h \
|
include/cglm/mat4.h \
|
||||||
include/cglm/mat3.h \
|
include/cglm/mat3.h \
|
||||||
|
include/cglm/mat2.h \
|
||||||
include/cglm/affine.h \
|
include/cglm/affine.h \
|
||||||
|
include/cglm/vec2.h \
|
||||||
|
include/cglm/vec2-ext.h \
|
||||||
include/cglm/vec3.h \
|
include/cglm/vec3.h \
|
||||||
include/cglm/vec3-ext.h \
|
include/cglm/vec3-ext.h \
|
||||||
include/cglm/vec4.h \
|
include/cglm/vec4.h \
|
||||||
@@ -60,11 +65,34 @@ cglm_HEADERS = include/cglm/version.h \
|
|||||||
include/cglm/ease.h \
|
include/cglm/ease.h \
|
||||||
include/cglm/curve.h \
|
include/cglm/curve.h \
|
||||||
include/cglm/bezier.h \
|
include/cglm/bezier.h \
|
||||||
include/cglm/applesimd.h
|
include/cglm/applesimd.h \
|
||||||
|
include/cglm/ray.h \
|
||||||
|
include/cglm/affine2d.h
|
||||||
|
|
||||||
|
cglm_clipspacedir=$(includedir)/cglm/clipspace
|
||||||
|
cglm_clipspace_HEADERS = include/cglm/clipspace/persp.h \
|
||||||
|
include/cglm/clipspace/persp_lh_zo.h \
|
||||||
|
include/cglm/clipspace/persp_rh_zo.h \
|
||||||
|
include/cglm/clipspace/persp_lh_no.h \
|
||||||
|
include/cglm/clipspace/persp_rh_no.h \
|
||||||
|
include/cglm/clipspace/ortho_lh_zo.h \
|
||||||
|
include/cglm/clipspace/ortho_rh_zo.h \
|
||||||
|
include/cglm/clipspace/ortho_lh_no.h \
|
||||||
|
include/cglm/clipspace/ortho_rh_no.h \
|
||||||
|
include/cglm/clipspace/view_lh.h \
|
||||||
|
include/cglm/clipspace/view_rh.h \
|
||||||
|
include/cglm/clipspace/view_lh_zo.h \
|
||||||
|
include/cglm/clipspace/view_rh_zo.h \
|
||||||
|
include/cglm/clipspace/view_lh_no.h \
|
||||||
|
include/cglm/clipspace/view_rh_no.h \
|
||||||
|
include/cglm/clipspace/project_zo.h \
|
||||||
|
include/cglm/clipspace/project_no.h
|
||||||
|
|
||||||
cglm_calldir=$(includedir)/cglm/call
|
cglm_calldir=$(includedir)/cglm/call
|
||||||
cglm_call_HEADERS = include/cglm/call/mat4.h \
|
cglm_call_HEADERS = include/cglm/call/mat4.h \
|
||||||
include/cglm/call/mat3.h \
|
include/cglm/call/mat3.h \
|
||||||
|
include/cglm/call/mat2.h \
|
||||||
|
include/cglm/call/vec2.h \
|
||||||
include/cglm/call/vec3.h \
|
include/cglm/call/vec3.h \
|
||||||
include/cglm/call/vec4.h \
|
include/cglm/call/vec4.h \
|
||||||
include/cglm/call/affine.h \
|
include/cglm/call/affine.h \
|
||||||
@@ -79,7 +107,25 @@ cglm_call_HEADERS = include/cglm/call/mat4.h \
|
|||||||
include/cglm/call/sphere.h \
|
include/cglm/call/sphere.h \
|
||||||
include/cglm/call/ease.h \
|
include/cglm/call/ease.h \
|
||||||
include/cglm/call/curve.h \
|
include/cglm/call/curve.h \
|
||||||
include/cglm/call/bezier.h
|
include/cglm/call/bezier.h \
|
||||||
|
include/cglm/call/ray.h \
|
||||||
|
include/cglm/call/affine2d.h
|
||||||
|
|
||||||
|
cglm_call_clipspacedir=$(includedir)/cglm/call/clipspace
|
||||||
|
cglm_call_clipspace_HEADERS = include/cglm/call/clipspace/persp_lh_zo.h \
|
||||||
|
include/cglm/call/clipspace/persp_rh_zo.h \
|
||||||
|
include/cglm/call/clipspace/persp_lh_no.h \
|
||||||
|
include/cglm/call/clipspace/persp_rh_no.h \
|
||||||
|
include/cglm/call/clipspace/ortho_lh_zo.h \
|
||||||
|
include/cglm/call/clipspace/ortho_rh_zo.h \
|
||||||
|
include/cglm/call/clipspace/ortho_lh_no.h \
|
||||||
|
include/cglm/call/clipspace/ortho_rh_no.h \
|
||||||
|
include/cglm/call/clipspace/view_lh_zo.h \
|
||||||
|
include/cglm/call/clipspace/view_rh_zo.h \
|
||||||
|
include/cglm/call/clipspace/view_lh_no.h \
|
||||||
|
include/cglm/call/clipspace/view_rh_no.h \
|
||||||
|
include/cglm/call/clipspace/project_no.h \
|
||||||
|
include/cglm/call/clipspace/project_zo.h
|
||||||
|
|
||||||
cglm_simddir=$(includedir)/cglm/simd
|
cglm_simddir=$(includedir)/cglm/simd
|
||||||
cglm_simd_HEADERS = include/cglm/simd/intrin.h \
|
cglm_simd_HEADERS = include/cglm/simd/intrin.h \
|
||||||
@@ -90,6 +136,7 @@ cglm_simd_sse2dir=$(includedir)/cglm/simd/sse2
|
|||||||
cglm_simd_sse2_HEADERS = include/cglm/simd/sse2/affine.h \
|
cglm_simd_sse2_HEADERS = include/cglm/simd/sse2/affine.h \
|
||||||
include/cglm/simd/sse2/mat4.h \
|
include/cglm/simd/sse2/mat4.h \
|
||||||
include/cglm/simd/sse2/mat3.h \
|
include/cglm/simd/sse2/mat3.h \
|
||||||
|
include/cglm/simd/sse2/mat2.h \
|
||||||
include/cglm/simd/sse2/quat.h
|
include/cglm/simd/sse2/quat.h
|
||||||
|
|
||||||
cglm_simd_avxdir=$(includedir)/cglm/simd/avx
|
cglm_simd_avxdir=$(includedir)/cglm/simd/avx
|
||||||
@@ -97,11 +144,17 @@ cglm_simd_avx_HEADERS = include/cglm/simd/avx/mat4.h \
|
|||||||
include/cglm/simd/avx/affine.h
|
include/cglm/simd/avx/affine.h
|
||||||
|
|
||||||
cglm_simd_neondir=$(includedir)/cglm/simd/neon
|
cglm_simd_neondir=$(includedir)/cglm/simd/neon
|
||||||
cglm_simd_neon_HEADERS = include/cglm/simd/neon/mat4.h
|
cglm_simd_neon_HEADERS = include/cglm/simd/neon/mat4.h \
|
||||||
|
include/cglm/simd/neon/mat2.h \
|
||||||
|
include/cglm/simd/neon/affine.h \
|
||||||
|
include/cglm/simd/neon/quat.h
|
||||||
|
|
||||||
cglm_structdir=$(includedir)/cglm/struct
|
cglm_structdir=$(includedir)/cglm/struct
|
||||||
cglm_struct_HEADERS = include/cglm/struct/mat4.h \
|
cglm_struct_HEADERS = include/cglm/struct/mat4.h \
|
||||||
include/cglm/struct/mat3.h \
|
include/cglm/struct/mat3.h \
|
||||||
|
include/cglm/struct/mat2.h \
|
||||||
|
include/cglm/struct/vec2.h \
|
||||||
|
include/cglm/struct/vec2-ext.h \
|
||||||
include/cglm/struct/vec3.h \
|
include/cglm/struct/vec3.h \
|
||||||
include/cglm/struct/vec3-ext.h \
|
include/cglm/struct/vec3-ext.h \
|
||||||
include/cglm/struct/vec4.h \
|
include/cglm/struct/vec4.h \
|
||||||
@@ -117,7 +170,22 @@ cglm_struct_HEADERS = include/cglm/struct/mat4.h \
|
|||||||
include/cglm/struct/project.h \
|
include/cglm/struct/project.h \
|
||||||
include/cglm/struct/sphere.h \
|
include/cglm/struct/sphere.h \
|
||||||
include/cglm/struct/color.h \
|
include/cglm/struct/color.h \
|
||||||
include/cglm/struct/curve.h
|
include/cglm/struct/curve.h \
|
||||||
|
include/cglm/struct/affine2d.h
|
||||||
|
|
||||||
|
cglm_struct_clipspacedir=$(includedir)/cglm/struct/clipspace
|
||||||
|
cglm_struct_clipspace_HEADERS = include/cglm/struct/clipspace/persp_lh_zo.h \
|
||||||
|
include/cglm/struct/clipspace/persp_rh_zo.h \
|
||||||
|
include/cglm/struct/clipspace/persp_lh_no.h \
|
||||||
|
include/cglm/struct/clipspace/persp_rh_no.h \
|
||||||
|
include/cglm/struct/clipspace/ortho_lh_zo.h \
|
||||||
|
include/cglm/struct/clipspace/ortho_rh_zo.h \
|
||||||
|
include/cglm/struct/clipspace/ortho_lh_no.h \
|
||||||
|
include/cglm/struct/clipspace/ortho_rh_no.h \
|
||||||
|
include/cglm/struct/clipspace/view_lh_zo.h \
|
||||||
|
include/cglm/struct/clipspace/view_rh_zo.h \
|
||||||
|
include/cglm/struct/clipspace/view_lh_no.h \
|
||||||
|
include/cglm/struct/clipspace/view_rh_no.h
|
||||||
|
|
||||||
libcglm_la_SOURCES=\
|
libcglm_la_SOURCES=\
|
||||||
src/euler.c \
|
src/euler.c \
|
||||||
@@ -125,8 +193,10 @@ libcglm_la_SOURCES=\
|
|||||||
src/io.c \
|
src/io.c \
|
||||||
src/quat.c \
|
src/quat.c \
|
||||||
src/cam.c \
|
src/cam.c \
|
||||||
|
src/vec2.c \
|
||||||
src/vec3.c \
|
src/vec3.c \
|
||||||
src/vec4.c \
|
src/vec4.c \
|
||||||
|
src/mat2.c \
|
||||||
src/mat3.c \
|
src/mat3.c \
|
||||||
src/mat4.c \
|
src/mat4.c \
|
||||||
src/plane.c \
|
src/plane.c \
|
||||||
@@ -136,21 +206,35 @@ libcglm_la_SOURCES=\
|
|||||||
src/sphere.c \
|
src/sphere.c \
|
||||||
src/ease.c \
|
src/ease.c \
|
||||||
src/curve.c \
|
src/curve.c \
|
||||||
src/bezier.c
|
src/bezier.c \
|
||||||
|
src/ray.c \
|
||||||
|
src/affine2d.c \
|
||||||
|
src/clipspace/ortho_lh_no.c \
|
||||||
|
src/clipspace/ortho_lh_zo.c \
|
||||||
|
src/clipspace/ortho_rh_no.c \
|
||||||
|
src/clipspace/ortho_rh_zo.c \
|
||||||
|
src/clipspace/persp_lh_no.c \
|
||||||
|
src/clipspace/persp_lh_zo.c \
|
||||||
|
src/clipspace/persp_rh_no.c \
|
||||||
|
src/clipspace/persp_rh_zo.c \
|
||||||
|
src/clipspace/view_lh_no.c \
|
||||||
|
src/clipspace/view_lh_zo.c \
|
||||||
|
src/clipspace/view_rh_no.c \
|
||||||
|
src/clipspace/view_rh_zo.c \
|
||||||
|
src/clipspace/project_no.c \
|
||||||
|
src/clipspace/project_zo.c
|
||||||
|
|
||||||
test_tests_SOURCES=\
|
test_tests_SOURCES=\
|
||||||
test/runner.c \
|
test/runner.c \
|
||||||
test/src/test_common.c \
|
test/src/test_common.c \
|
||||||
test/src/test_mat4.c \
|
test/src/tests.c \
|
||||||
test/src/test_cam.c \
|
test/src/test_cam.c \
|
||||||
test/src/test_project.c \
|
test/src/test_cam_lh_zo.c \
|
||||||
|
test/src/test_cam_rh_zo.c \
|
||||||
|
test/src/test_cam_lh_no.c \
|
||||||
|
test/src/test_cam_rh_no.c \
|
||||||
test/src/test_clamp.c \
|
test/src/test_clamp.c \
|
||||||
test/src/test_euler.c \
|
test/src/test_euler.c \
|
||||||
test/src/test_quat.c \
|
|
||||||
test/src/test_vec4.c \
|
|
||||||
test/src/test_vec3.c \
|
|
||||||
test/src/test_mat3.c \
|
|
||||||
test/src/test_affine.c \
|
|
||||||
test/src/test_bezier.c \
|
test/src/test_bezier.c \
|
||||||
test/src/test_struct.c
|
test/src/test_struct.c
|
||||||
|
|
||||||
|
|||||||
44
Package.swift
Normal file
44
Package.swift
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
// swift-tools-version:5.2
|
||||||
|
|
||||||
|
import PackageDescription
|
||||||
|
|
||||||
|
let package = Package(
|
||||||
|
name: "cglm",
|
||||||
|
products: [
|
||||||
|
.library(name: "cglm", type: .static, targets: ["cglmHeader"]),
|
||||||
|
.library(name: "cglmc", targets: ["cglmCompiled"]),
|
||||||
|
],
|
||||||
|
dependencies: [],
|
||||||
|
targets: [
|
||||||
|
.target(
|
||||||
|
name: "cglmCompiled",
|
||||||
|
path: "./",
|
||||||
|
exclude: [
|
||||||
|
"./docs",
|
||||||
|
"./src/swift",
|
||||||
|
"./include",
|
||||||
|
"./test",
|
||||||
|
"./win",
|
||||||
|
],
|
||||||
|
sources: [
|
||||||
|
"./src",
|
||||||
|
],
|
||||||
|
publicHeadersPath: "./include"
|
||||||
|
),
|
||||||
|
.target(
|
||||||
|
name: "cglmHeader",
|
||||||
|
path: "./",
|
||||||
|
exclude: [
|
||||||
|
"./docs",
|
||||||
|
"./include",
|
||||||
|
"./test",
|
||||||
|
"./win",
|
||||||
|
],
|
||||||
|
sources: [
|
||||||
|
"./src/swift",
|
||||||
|
],
|
||||||
|
publicHeadersPath: "./include"
|
||||||
|
),
|
||||||
|
],
|
||||||
|
cLanguageStandard: .c11
|
||||||
|
)
|
||||||
205
README.md
205
README.md
@@ -1,19 +1,59 @@
|
|||||||
# 🎥 OpenGL Mathematics (glm) for `C`
|
# 🎥 OpenGL Mathematics (glm) for `C`
|
||||||
[](https://travis-ci.org/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 />
|
Almost all functions (inline versions) and parameters are documented inside the corresponding headers. <br />
|
||||||
Complete documentation: http://cglm.readthedocs.io
|
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`
|
- _dup (duplicate) is changed to _copy. For instance `glm_vec_dup -> glm_vec3_copy`
|
||||||
- OpenGL related functions are dropped to make this lib platform/third-party independent
|
- OpenGL related functions are dropped to make this lib platform/third-party independent
|
||||||
@@ -25,31 +65,30 @@ you have the latest version
|
|||||||
- **[new option]** by starting v0.4.5, you can disable alignment requirement, check options in docs.
|
- **[new option]** by starting v0.4.5, you can disable alignment requirement, check options in docs.
|
||||||
- **[major change]** by starting v0.5.0, vec3 functions use **glm_vec3_** namespace, it was **glm_vec_** until v0.5.0
|
- **[major change]** by starting v0.5.0, vec3 functions use **glm_vec3_** namespace, it was **glm_vec_** until v0.5.0
|
||||||
- **[major change]** by starting v0.5.1, built-in alignment is removed from **vec3** and **mat3** types
|
- **[major change]** by starting v0.5.1, built-in alignment is removed from **vec3** and **mat3** types
|
||||||
|
- **[major change]** by starting v0.7.3, inline print functions are disabled in release/production mode to eliminate print costs (see options in documentation). Print output also improved. You can disable colors if you need (see documentation)
|
||||||
|
- **[major change]** by starting v0.8.3, **cglm** supports alternative clipspace configuations e.g. Left Handed, Zero-to-One (_zo)... `CGLM_FORCE_DEPTH_ZERO_TO_ONE` and `CGLM_FORCE_LEFT_HANDED` is provided to control clipspace. You should be able to use **cglm** with Vulkan, DirectX and Metal now... see https://cglm.readthedocs.io/en/latest/opt.html#clipspace-option-s
|
||||||
|
|
||||||
#### Note for C++ developers:
|
#### 📌 Note for C++ developers:
|
||||||
If you are not aware of the original GLM library yet, you may also want to look at:
|
If you are not aware of the original GLM library yet, you may also want to look at:
|
||||||
https://github.com/g-truc/glm
|
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)
|
- `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
|
- **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.
|
- 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...
|
- if your debugger takes you to cglm headers then make sure you are not trying to copy vec4 to vec3 or alig issues...
|
||||||
- Welcome!
|
- 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.
|
- 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.
|
`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_`).
|
**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/>
|
<hr/>
|
||||||
|
|
||||||
<table>
|
<table>
|
||||||
@@ -67,7 +106,9 @@ Currently *cglm* uses default clip space configuration (-1, 1) for camera functi
|
|||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</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.
|
- array api and struct api, you can use arrays or structs.
|
||||||
- general purpose matrix operations (mat4, mat3)
|
- general purpose matrix operations (mat4, mat3)
|
||||||
- chain matrix multiplication (square only)
|
- chain matrix multiplication (square only)
|
||||||
@@ -82,20 +123,21 @@ Currently *cglm* uses default clip space configuration (-1, 1) for camera functi
|
|||||||
- extract euler angles
|
- extract euler angles
|
||||||
- inline or pre-compiled function call
|
- inline or pre-compiled function call
|
||||||
- frustum (extract view frustum planes, corners...)
|
- frustum (extract view frustum planes, corners...)
|
||||||
- bounding box (AABB in Frustum (culling), crop, merge...)
|
- bounding box (AABB in Frustum (culling), crop, merge...)
|
||||||
- bounding sphere
|
- bounding sphere
|
||||||
- project, unproject
|
- project, unproject
|
||||||
- easing functions
|
- easing functions
|
||||||
- curves
|
- curves
|
||||||
- curve interpolation helpers (S*M*C, deCasteljau...)
|
- curve interpolation helpers (S*M*C, deCasteljau...)
|
||||||
- helpers to convert cglm types to Apple's simd library to pass cglm types to Metal GL without packing them on both sides
|
- helpers to convert cglm types to Apple's simd library to pass cglm types to Metal GL without packing them on both sides
|
||||||
|
- ray intersection helpers
|
||||||
- and others...
|
- and others...
|
||||||
|
|
||||||
<hr />
|
<hr />
|
||||||
|
|
||||||
You have two option to call a function/operation: inline or library call (link)
|
You have two options to call a function/operation: inline or library call (link)
|
||||||
Almost all functions are marked inline (always_inline) so compiler will probably inline.
|
Almost all functions are marked inline (always_inline) so compiler will probably inline.
|
||||||
To call pre-compiled version, just use `glmc_` (c stands for 'call') instead of `glm_`.
|
To call pre-compiled versions, just use `glmc_` (c stands for 'call') instead of `glm_`.
|
||||||
|
|
||||||
```C
|
```C
|
||||||
#include <cglm/cglm.h> /* for inline */
|
#include <cglm/cglm.h> /* for inline */
|
||||||
@@ -146,7 +188,120 @@ 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.
|
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
|
||||||
|
$ mkdir build
|
||||||
|
$ cd build
|
||||||
|
$ cmake .. # [Optional] -DCGLM_SHARED=ON
|
||||||
|
$ make
|
||||||
|
$ sudo make install # [Optional]
|
||||||
|
```
|
||||||
|
|
||||||
|
##### Cmake options with Defaults:
|
||||||
|
|
||||||
|
```CMake
|
||||||
|
option(CGLM_SHARED "Shared build" ON)
|
||||||
|
option(CGLM_STATIC "Static build" OFF)
|
||||||
|
option(CGLM_USE_C99 "" OFF) # C11
|
||||||
|
option(CGLM_USE_TEST "Enable Tests" OFF) # for make check - make test
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Use as header-only library with your CMake project
|
||||||
|
|
||||||
|
This requires no building or installation of cglm.
|
||||||
|
|
||||||
|
* Example:
|
||||||
|
|
||||||
|
``` cmake
|
||||||
|
cmake_minimum_required(VERSION 3.8.2)
|
||||||
|
|
||||||
|
project(<Your Project Name>)
|
||||||
|
|
||||||
|
add_executable(${PROJECT_NAME} src/main.c)
|
||||||
|
target_link_libraries(${LIBRARY_NAME} PRIVATE
|
||||||
|
cglm_headers)
|
||||||
|
|
||||||
|
add_subdirectory(external/cglm/ EXCLUDE_FROM_ALL)
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Use with your CMake project
|
||||||
|
* Example:
|
||||||
|
```cmake
|
||||||
|
cmake_minimum_required(VERSION 3.8.2)
|
||||||
|
|
||||||
|
project(<Your Project Name>)
|
||||||
|
|
||||||
|
add_executable(${PROJECT_NAME} src/main.c)
|
||||||
|
target_link_libraries(${LIBRARY_NAME} PRIVATE
|
||||||
|
cglm)
|
||||||
|
|
||||||
|
add_subdirectory(external/cglm/)
|
||||||
|
|
||||||
|
# or you can use find_package to configure cglm
|
||||||
|
```
|
||||||
|
|
||||||
|
### Meson (All platforms)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ meson build # [Optional] --default-library=static
|
||||||
|
$ cd build
|
||||||
|
$ ninja
|
||||||
|
$ sudo ninja install # [Optional]
|
||||||
|
```
|
||||||
|
|
||||||
|
##### Meson options with Defaults:
|
||||||
|
|
||||||
|
```meson
|
||||||
|
c_std=c11
|
||||||
|
buildtype=release
|
||||||
|
default_library=shared
|
||||||
|
enable_tests=false # to run tests: ninja test
|
||||||
|
```
|
||||||
|
#### Use with your Meson project
|
||||||
|
* Example:
|
||||||
|
```meson
|
||||||
|
# Clone cglm or create a cglm.wrap under <source_root>/subprojects
|
||||||
|
project('name', 'c')
|
||||||
|
|
||||||
|
cglm_dep = dependency('cglm', fallback : 'cglm', 'cglm_dep')
|
||||||
|
|
||||||
|
executable('exe', 'src/main.c', dependencies : cglm_dep)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Swift (Swift Package Manager)
|
||||||
|
|
||||||
|
Currently only default build options are supported. Add **cglm** dependency to your project:
|
||||||
|
|
||||||
|
```swift
|
||||||
|
...
|
||||||
|
Package(
|
||||||
|
...
|
||||||
|
dependencies: [
|
||||||
|
...
|
||||||
|
.package(url: "https://github.com/recp/cglm", .branch("master")),
|
||||||
|
]
|
||||||
|
...
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
Now add **cgml** as a dependency to your target. Product choices are:
|
||||||
|
- **cglm** for inlined version of the library which can be linked only statically
|
||||||
|
- **cglmc** for a compiled version of the library with no linking limitation
|
||||||
|
|
||||||
|
```swift
|
||||||
|
...
|
||||||
|
.target(
|
||||||
|
...
|
||||||
|
dependencies: [
|
||||||
|
...
|
||||||
|
.product(name: "cglm", package: "cglm"),
|
||||||
|
]
|
||||||
|
...
|
||||||
|
)
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
### Unix (Autotools)
|
### Unix (Autotools)
|
||||||
|
|
||||||
@@ -285,13 +440,13 @@ You can pass matrices the same way to other APIs e.g. Vulkan, DX...
|
|||||||
- [x] Add version info
|
- [x] Add version info
|
||||||
- [ ] Unaligned operations (e.g. `glm_umat4_mul`)
|
- [ ] Unaligned operations (e.g. `glm_umat4_mul`)
|
||||||
- [x] Extra documentation
|
- [x] Extra documentation
|
||||||
- [ ] ARM Neon Arch (In Progress)
|
- [x] ARM Neon Arch
|
||||||
|
|
||||||
|
|
||||||
## Contributors
|
## Contributors
|
||||||
|
|
||||||
This project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)].
|
This project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)].
|
||||||
<a href="graphs/contributors"><img src="https://opencollective.com/cglm/contributors.svg?width=890&button=false" /></a>
|
<a href="https://github.com/recp/cglm/graphs/contributors"><img src="https://opencollective.com/cglm/contributors.svg?width=890&button=false" /></a>
|
||||||
|
|
||||||
|
|
||||||
## Backers
|
## Backers
|
||||||
|
|||||||
15
cglm.podspec
15
cglm.podspec
@@ -2,10 +2,10 @@ Pod::Spec.new do |s|
|
|||||||
|
|
||||||
# Description
|
# Description
|
||||||
s.name = "cglm"
|
s.name = "cglm"
|
||||||
s.version = "0.6.1"
|
s.version = "0.8.4"
|
||||||
s.summary = "📽 Optimized OpenGL/Graphics Math (glm) for C"
|
s.summary = "📽 Highly Optimized Graphics Math (glm) for C"
|
||||||
s.description = <<-DESC
|
s.description = <<-DESC
|
||||||
cglm is math library for graphics programming for C. It is similar to original glm but it is written for C instead of C++ (you can use here too). See the documentation or README for all features.
|
cglm is math library for graphics programming for C. See the documentation or README for all features.
|
||||||
DESC
|
DESC
|
||||||
|
|
||||||
s.documentation_url = "http://cglm.readthedocs.io"
|
s.documentation_url = "http://cglm.readthedocs.io"
|
||||||
@@ -25,4 +25,13 @@ cglm is math library for graphics programming for C. It is similar to original g
|
|||||||
|
|
||||||
# Linking
|
# Linking
|
||||||
s.library = "m"
|
s.library = "m"
|
||||||
|
|
||||||
|
# Configuration
|
||||||
|
s.pod_target_xcconfig = {
|
||||||
|
'CLANG_ENABLE_MODULES' => 'NO',
|
||||||
|
'CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES' => 'YES',
|
||||||
|
'CLANG_WARN_DOCUMENTATION_COMMENTS' => 'NO',
|
||||||
|
'GCC_C_LANGUAGE_STANDARD' => 'gnu11',
|
||||||
|
'GCC_PREPROCESSOR_DEFINITIONS' => '$(inherited) GLM_TESTS_NO_COLORFUL_OUTPUT'
|
||||||
|
}
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
#*****************************************************************************
|
#*****************************************************************************
|
||||||
|
|
||||||
AC_PREREQ([2.69])
|
AC_PREREQ([2.69])
|
||||||
AC_INIT([cglm], [0.6.2], [info@recp.me])
|
AC_INIT([cglm], [0.8.5], [info@recp.me])
|
||||||
AM_INIT_AUTOMAKE([-Wall -Werror foreign subdir-objects serial-tests])
|
AM_INIT_AUTOMAKE([-Wall -Werror foreign subdir-objects serial-tests])
|
||||||
|
|
||||||
# Don't use the default cflags (-O2 -g), we set ours manually in Makefile.am.
|
# Don't use the default cflags (-O2 -g), we set ours manually in Makefile.am.
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
.. default-domain:: C
|
.. default-domain:: C
|
||||||
|
|
||||||
affine transform matrix (specialized functions)
|
3D Affine Transform Matrix (specialized functions)
|
||||||
================================================================================
|
================================================================================
|
||||||
|
|
||||||
Header: cglm/affine-mat.h
|
Header: cglm/affine-mat.h
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
.. default-domain:: C
|
.. default-domain:: C
|
||||||
|
|
||||||
affine transforms
|
3D Affine Transforms
|
||||||
================================================================================
|
================================================================================
|
||||||
|
|
||||||
Header: cglm/affine.h
|
Header: cglm/affine.h
|
||||||
@@ -45,6 +45,8 @@ The implementation would be:
|
|||||||
glm_rotate(m, angle, axis);
|
glm_rotate(m, angle, axis);
|
||||||
glm_translate(m, pivotInv); /* pivotInv = -pivot */
|
glm_translate(m, pivotInv); /* pivotInv = -pivot */
|
||||||
|
|
||||||
|
.. _TransformsOrder:
|
||||||
|
|
||||||
Transforms Order
|
Transforms Order
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
|||||||
140
docs/source/affine2d.rst
Normal file
140
docs/source/affine2d.rst
Normal file
@@ -0,0 +1,140 @@
|
|||||||
|
.. default-domain:: C
|
||||||
|
|
||||||
|
2D Affine Transforms
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
Header: cglm/affine2d.h
|
||||||
|
|
||||||
|
2D Transforms uses `2d` suffix for naming. If there is no 2D suffix it is 3D function.
|
||||||
|
|
||||||
|
Initialize Transform Matrices
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
Functions with **_make** prefix expect you don't have a matrix and they create
|
||||||
|
a matrix for you. You don't need to pass identity matrix.
|
||||||
|
|
||||||
|
But other functions expect you have a matrix and you want to transform them. If
|
||||||
|
you didn't have any existing matrix you have to initialize matrix to identity
|
||||||
|
before sending to transfrom functions.
|
||||||
|
|
||||||
|
Transforms Order
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
See :ref:`TransformsOrder` to read similar section.
|
||||||
|
|
||||||
|
|
||||||
|
Table of contents (click to go):
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Functions:
|
||||||
|
|
||||||
|
1. :c:func:`glm_translate2d`
|
||||||
|
#. :c:func:`glm_translate2d_to`
|
||||||
|
#. :c:func:`glm_translate2d_x`
|
||||||
|
#. :c:func:`glm_translate2d_y`
|
||||||
|
#. :c:func:`glm_translate2d_make`
|
||||||
|
#. :c:func:`glm_scale2d_to`
|
||||||
|
#. :c:func:`glm_scale2d_make`
|
||||||
|
#. :c:func:`glm_scale2d`
|
||||||
|
#. :c:func:`glm_scale2d_uni`
|
||||||
|
#. :c:func:`glm_rotate2d_make`
|
||||||
|
#. :c:func:`glm_rotate2d`
|
||||||
|
#. :c:func:`glm_rotate2d_to`
|
||||||
|
|
||||||
|
.. c:function:: void glm_translate2d(mat3 m, vec2 v)
|
||||||
|
|
||||||
|
translate existing 2d transform matrix by *v* vector and stores result in same matrix
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in, out]* **m** 2d affine transfrom
|
||||||
|
| *[in]* **v** translate vector [x, y]
|
||||||
|
|
||||||
|
.. c:function:: void glm_translate2d_to(mat3 m, vec2 v, mat3 dest)
|
||||||
|
|
||||||
|
translate existing 2d transform matrix by *v* vector and store result in dest
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **m** 2d affine transfrom
|
||||||
|
| *[in]* **v** translate vector [x, y]
|
||||||
|
| *[out]* **dest** translated matrix
|
||||||
|
|
||||||
|
.. c:function:: void glm_translate2d_x(mat3 m, float x)
|
||||||
|
|
||||||
|
translate existing 2d transform matrix by x factor
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in, out]* **m** 2d affine transfrom
|
||||||
|
| *[in]* **x** x factor
|
||||||
|
|
||||||
|
.. c:function:: void glm_translate2d_y(mat3 m, float y)
|
||||||
|
|
||||||
|
translate existing 2d transform matrix by y factor
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in, out]* **m** 2d affine transfrom
|
||||||
|
| *[in]* **y** y factor
|
||||||
|
|
||||||
|
.. c:function:: void glm_translate2d_make(mat3 m, vec2 v)
|
||||||
|
|
||||||
|
creates NEW translate 2d transform matrix by *v* vector
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in, out]* **m** affine transfrom
|
||||||
|
| *[in]* **v** translate vector [x, y]
|
||||||
|
|
||||||
|
.. c:function:: void glm_scale2d_to(mat3 m, vec2 v, mat3 dest)
|
||||||
|
|
||||||
|
scale existing 2d transform matrix by *v* vector and store result in dest
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **m** affine transfrom
|
||||||
|
| *[in]* **v** scale vector [x, y]
|
||||||
|
| *[out]* **dest** scaled matrix
|
||||||
|
|
||||||
|
.. c:function:: void glm_scale2d_make(mat3 m, vec2 v)
|
||||||
|
|
||||||
|
creates NEW 2d scale matrix by *v* vector
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in, out]* **m** affine transfrom
|
||||||
|
| *[in]* **v** scale vector [x, y]
|
||||||
|
|
||||||
|
.. c:function:: void glm_scale2d(mat3 m, vec2 v)
|
||||||
|
|
||||||
|
scales existing 2d transform matrix by *v* vector and stores result in same matrix
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in, out]* **m** affine transfrom
|
||||||
|
| *[in]* **v** translate vector [x, y]
|
||||||
|
|
||||||
|
.. c:function:: void glm_scale2d_uni(mat3 m, float s)
|
||||||
|
|
||||||
|
applies uniform scale to existing 2d transform matrix v = [s, s] and stores result in same matrix
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in, out]* **m** affine transfrom
|
||||||
|
| *[in]* **s** scale factor
|
||||||
|
|
||||||
|
.. c:function:: void glm_rotate2d_make(mat3 m, float angle)
|
||||||
|
|
||||||
|
creates NEW rotation matrix by angle around *Z* axis
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in, out]* **m** affine transfrom
|
||||||
|
| *[in]* **angle** angle (radians)
|
||||||
|
|
||||||
|
.. c:function:: void glm_rotate2d(mat3 m, float angle)
|
||||||
|
|
||||||
|
rotate existing 2d transform matrix around *Z* axis by angle and store result in same matrix
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in, out]* **m** affine transfrom
|
||||||
|
| *[in]* **angle** angle (radians)
|
||||||
|
|
||||||
|
.. c:function:: void glm_rotate2d_to(mat3 m, float angle, mat3 dest)
|
||||||
|
|
||||||
|
rotate existing 2d transform matrix around *Z* axis by angle and store result in dest
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **m** affine transfrom
|
||||||
|
| *[in]* **angle** angle (radians)
|
||||||
|
| *[out]* **dest** rotated matrix
|
||||||
@@ -28,6 +28,7 @@ Follow the :doc:`build` documentation for this
|
|||||||
|
|
||||||
affine
|
affine
|
||||||
affine-mat
|
affine-mat
|
||||||
|
affine2d
|
||||||
cam
|
cam
|
||||||
frustum
|
frustum
|
||||||
box
|
box
|
||||||
@@ -35,10 +36,13 @@ Follow the :doc:`build` documentation for this
|
|||||||
euler
|
euler
|
||||||
mat4
|
mat4
|
||||||
mat3
|
mat3
|
||||||
|
mat2
|
||||||
vec3
|
vec3
|
||||||
vec3-ext
|
vec3-ext
|
||||||
vec4
|
vec4
|
||||||
vec4-ext
|
vec4-ext
|
||||||
|
vec2
|
||||||
|
vec2-ext
|
||||||
color
|
color
|
||||||
plane
|
plane
|
||||||
project
|
project
|
||||||
@@ -48,3 +52,5 @@ Follow the :doc:`build` documentation for this
|
|||||||
sphere
|
sphere
|
||||||
curve
|
curve
|
||||||
bezier
|
bezier
|
||||||
|
version
|
||||||
|
ray
|
||||||
|
|||||||
@@ -7,6 +7,97 @@ Build cglm
|
|||||||
If you only need to inline versions, you don't need to build **cglm**, you don't need to link it to your program.
|
If you only need to inline versions, you don't need to build **cglm**, you don't need to link it to your program.
|
||||||
Just import cglm to your project as dependency / external lib by copy-paste then use it as usual
|
Just import cglm to your project as dependency / external lib by copy-paste then use it as usual
|
||||||
|
|
||||||
|
CMake (All platforms):
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
:linenos:
|
||||||
|
|
||||||
|
$ mkdir build
|
||||||
|
$ cd build
|
||||||
|
$ cmake .. # [Optional] -DCGLM_SHARED=ON
|
||||||
|
$ make
|
||||||
|
$ sudo make install # [Optional]
|
||||||
|
|
||||||
|
**make** will build cglm to **build** folder.
|
||||||
|
If you don't want to install **cglm** to your system's folder you can get static and dynamic libs in this folder.
|
||||||
|
|
||||||
|
**CMake Options:**
|
||||||
|
|
||||||
|
.. code-block:: CMake
|
||||||
|
:linenos:
|
||||||
|
|
||||||
|
option(CGLM_SHARED "Shared build" ON)
|
||||||
|
option(CGLM_STATIC "Static build" OFF)
|
||||||
|
option(CGLM_USE_C99 "" OFF) # C11
|
||||||
|
option(CGLM_USE_TEST "Enable Tests" OFF) # for make check - make test
|
||||||
|
|
||||||
|
**Use as header-only library with your CMake project example**
|
||||||
|
This requires no building or installation of cglm.
|
||||||
|
|
||||||
|
.. code-block:: CMake
|
||||||
|
:linenos:
|
||||||
|
|
||||||
|
cmake_minimum_required(VERSION 3.8.2)
|
||||||
|
|
||||||
|
project(<Your Project Name>)
|
||||||
|
|
||||||
|
add_executable(${PROJECT_NAME} src/main.c)
|
||||||
|
target_link_libraries(${LIBRARY_NAME} PRIVATE
|
||||||
|
cglm_headers)
|
||||||
|
|
||||||
|
add_subdirectory(external/cglm/ EXCLUDE_FROM_ALL)
|
||||||
|
|
||||||
|
**Use with your CMake project example**
|
||||||
|
|
||||||
|
.. code-block:: CMake
|
||||||
|
:linenos:
|
||||||
|
|
||||||
|
cmake_minimum_required(VERSION 3.8.2)
|
||||||
|
|
||||||
|
project(<Your Project Name>)
|
||||||
|
|
||||||
|
add_executable(${PROJECT_NAME} src/main.c)
|
||||||
|
target_link_libraries(${LIBRARY_NAME} PRIVATE
|
||||||
|
cglm)
|
||||||
|
|
||||||
|
add_subdirectory(external/cglm/)
|
||||||
|
|
||||||
|
Meson (All platforms):
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
.. code-block::
|
||||||
|
:linenos:
|
||||||
|
|
||||||
|
$ meson build # [Optional] --default-library=static
|
||||||
|
$ cd build
|
||||||
|
$ ninja
|
||||||
|
$ sudo ninja install # [Optional]
|
||||||
|
|
||||||
|
**Meson Options:**
|
||||||
|
|
||||||
|
.. code-block::
|
||||||
|
:linenos:
|
||||||
|
|
||||||
|
c_std=c11
|
||||||
|
buildtype=release
|
||||||
|
default_library=shared
|
||||||
|
enable_tests=false # to run tests: ninja test
|
||||||
|
|
||||||
|
|
||||||
|
**Use with your Meson project**
|
||||||
|
|
||||||
|
.. code-block::
|
||||||
|
:linenos:
|
||||||
|
|
||||||
|
# Clone cglm or create a cglm.wrap under <source_root>/subprojects
|
||||||
|
project('name', 'c')
|
||||||
|
|
||||||
|
cglm_dep = dependency('cglm', fallback : 'cglm', 'cglm_dep')
|
||||||
|
|
||||||
|
executable('exe', 'src/main.c', dependencies : cglm_dep)
|
||||||
|
|
||||||
|
|
||||||
Unix (Autotools):
|
Unix (Autotools):
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
|||||||
@@ -140,7 +140,7 @@ Functions documentation
|
|||||||
| set up perspective projection matrix
|
| set up perspective projection matrix
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **fovy** field of view angle
|
| *[in]* **fovy** field of view angle (in radians)
|
||||||
| *[in]* **aspect** aspect ratio ( width / height )
|
| *[in]* **aspect** aspect ratio ( width / height )
|
||||||
| *[in]* **nearVal** near clipping plane
|
| *[in]* **nearVal** near clipping plane
|
||||||
| *[in]* **farVal** far clipping planes
|
| *[in]* **farVal** far clipping planes
|
||||||
@@ -198,7 +198,7 @@ Functions documentation
|
|||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **eye** eye vector
|
| *[in]* **eye** eye vector
|
||||||
| *[in]* **center** direction vector
|
| *[in]* **dir** direction vector
|
||||||
| *[in]* **up** up vector
|
| *[in]* **up** up vector
|
||||||
| *[out]* **dest** result matrix
|
| *[out]* **dest** result matrix
|
||||||
|
|
||||||
@@ -212,7 +212,7 @@ Functions documentation
|
|||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **eye** eye vector
|
| *[in]* **eye** eye vector
|
||||||
| *[in]* **center** direction vector
|
| *[in]* **dir** direction vector
|
||||||
| *[out]* **dest** result matrix
|
| *[out]* **dest** result matrix
|
||||||
|
|
||||||
.. c:function:: void glm_persp_decomp(mat4 proj, float *nearVal, float *farVal, float *top, float *bottom, float *left, float *right)
|
.. c:function:: void glm_persp_decomp(mat4 proj, float *nearVal, float *farVal, float *top, float *bottom, float *left, float *right)
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
|
|
||||||
# If your documentation needs a minimal Sphinx version, state it here.
|
# If your documentation needs a minimal Sphinx version, state it here.
|
||||||
#
|
#
|
||||||
# needs_sphinx = '1.0'
|
# needs_sphinx = '3.0'
|
||||||
|
|
||||||
# Add any Sphinx extension module names here, as strings. They can be
|
# Add any Sphinx extension module names here, as strings. They can be
|
||||||
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
|
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
|
||||||
@@ -62,9 +62,9 @@ author = u'Recep Aslantas'
|
|||||||
# built documents.
|
# built documents.
|
||||||
#
|
#
|
||||||
# The short X.Y version.
|
# The short X.Y version.
|
||||||
version = u'0.6.2'
|
version = u'0.8.5'
|
||||||
# The full version, including alpha/beta/rc tags.
|
# The full version, including alpha/beta/rc tags.
|
||||||
release = u'0.6.2'
|
release = u'0.8.5'
|
||||||
|
|
||||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||||
# for a list of supported languages.
|
# for a list of supported languages.
|
||||||
@@ -197,3 +197,7 @@ epub_exclude_files = ['search.html']
|
|||||||
|
|
||||||
# If true, `todo` and `todoList` produce output, else they produce nothing.
|
# If true, `todo` and `todoList` produce output, else they produce nothing.
|
||||||
todo_include_todos = True
|
todo_include_todos = True
|
||||||
|
|
||||||
|
# -- Options for the C domain ------------------------------------------------
|
||||||
|
|
||||||
|
c_id_attributes = ['__restrict']
|
||||||
|
|||||||
@@ -1,10 +1,13 @@
|
|||||||
Features
|
Features
|
||||||
================================================================================
|
================================================================================
|
||||||
|
|
||||||
|
* **scalar** and **simd** (sse, avx, neon...) optimizations
|
||||||
|
* option to use different clipspaces e.g. Left Handed, Zero-to-One... (currrently right handed negative-one is default)
|
||||||
|
* array api and struct api, you can use arrays or structs.
|
||||||
* general purpose matrix operations (mat4, mat3)
|
* general purpose matrix operations (mat4, mat3)
|
||||||
* chain matrix multiplication (square only)
|
* chain matrix multiplication (square only)
|
||||||
* general purpose vector operations (cross, dot, rotate, proj, angle...)
|
* general purpose vector operations (cross, dot, rotate, proj, angle...)
|
||||||
* affine transforms
|
* affine transformations
|
||||||
* matrix decomposition (extract rotation, scaling factor)
|
* matrix decomposition (extract rotation, scaling factor)
|
||||||
* optimized affine transform matrices (mul, rigid-body inverse)
|
* optimized affine transform matrices (mul, rigid-body inverse)
|
||||||
* camera (lookat)
|
* camera (lookat)
|
||||||
@@ -20,4 +23,6 @@ Features
|
|||||||
* easing functions
|
* easing functions
|
||||||
* curves
|
* curves
|
||||||
* curve interpolation helpers (SMC, deCasteljau...)
|
* curve interpolation helpers (SMC, deCasteljau...)
|
||||||
* and other...
|
* helpers to convert cglm types to Apple's simd library to pass cglm types to Metal GL without packing them on both sides
|
||||||
|
* ray intersection helpers
|
||||||
|
* and others...
|
||||||
|
|||||||
@@ -28,6 +28,23 @@ Example to print mat4 matrix:
|
|||||||
(you probably will in some cases), you can change it temporary.
|
(you probably will in some cases), you can change it temporary.
|
||||||
cglm may provide precision parameter in the future
|
cglm may provide precision parameter in the future
|
||||||
|
|
||||||
|
Changes since **v0.7.3**:
|
||||||
|
* Now mis-alignment of columns are fixed: larger numbers are printed via %g and others are printed via %f. Column withs are calculated before print.
|
||||||
|
* Now values are colorful ;)
|
||||||
|
* Some print improvements
|
||||||
|
* New options with default values:
|
||||||
|
|
||||||
|
.. code-block:: c
|
||||||
|
|
||||||
|
#define CGLM_PRINT_PRECISION 5
|
||||||
|
#define CGLM_PRINT_MAX_TO_SHORT 1e5
|
||||||
|
#define CGLM_PRINT_COLOR "\033[36m"
|
||||||
|
#define CGLM_PRINT_COLOR_RESET "\033[0m"
|
||||||
|
|
||||||
|
* Inline prints are only enabled in DEBUG mode and if **CGLM_DEFINE_PRINTS** is defined.
|
||||||
|
|
||||||
|
Check options page.
|
||||||
|
|
||||||
Table of contents (click to go):
|
Table of contents (click to go):
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
|||||||
179
docs/source/mat2.rst
Normal file
179
docs/source/mat2.rst
Normal file
@@ -0,0 +1,179 @@
|
|||||||
|
.. default-domain:: C
|
||||||
|
|
||||||
|
mat2
|
||||||
|
====
|
||||||
|
|
||||||
|
Header: cglm/mat2.h
|
||||||
|
|
||||||
|
Table of contents (click to go):
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Macros:
|
||||||
|
|
||||||
|
1. GLM_mat2_IDENTITY_INIT
|
||||||
|
#. GLM_mat2_ZERO_INIT
|
||||||
|
#. GLM_mat2_IDENTITY
|
||||||
|
#. GLM_mat2_ZERO
|
||||||
|
|
||||||
|
Functions:
|
||||||
|
|
||||||
|
1. :c:func:`glm_mat2_copy`
|
||||||
|
#. :c:func:`glm_mat2_identity`
|
||||||
|
#. :c:func:`glm_mat2_identity_array`
|
||||||
|
#. :c:func:`glm_mat2_zero`
|
||||||
|
#. :c:func:`glm_mat2_mul`
|
||||||
|
#. :c:func:`glm_mat2_transpose_to`
|
||||||
|
#. :c:func:`glm_mat2_transpose`
|
||||||
|
#. :c:func:`glm_mat2_mulv`
|
||||||
|
#. :c:func:`glm_mat2_scale`
|
||||||
|
#. :c:func:`glm_mat2_det`
|
||||||
|
#. :c:func:`glm_mat2_inv`
|
||||||
|
#. :c:func:`glm_mat2_trace`
|
||||||
|
#. :c:func:`glm_mat2_swap_col`
|
||||||
|
#. :c:func:`glm_mat2_swap_row`
|
||||||
|
#. :c:func:`glm_mat2_rmc`
|
||||||
|
|
||||||
|
Functions documentation
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
.. c:function:: void glm_mat2_copy(mat2 mat, mat2 dest)
|
||||||
|
|
||||||
|
copy mat2 to another one (dest).
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **mat** source
|
||||||
|
| *[out]* **dest** destination
|
||||||
|
|
||||||
|
.. c:function:: void glm_mat2_identity(mat2 mat)
|
||||||
|
|
||||||
|
copy identity mat2 to mat, or makes mat to identiy
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[out]* **mat** matrix
|
||||||
|
|
||||||
|
.. c:function:: void glm_mat2_identity_array(mat2 * __restrict mat, size_t count)
|
||||||
|
|
||||||
|
make given matrix array's each element identity matrix
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in,out]* **mat** matrix array (must be aligned (16/32) if alignment is not disabled)
|
||||||
|
| *[in]* **count** count of matrices
|
||||||
|
|
||||||
|
.. c:function:: void glm_mat2_zero(mat2 mat)
|
||||||
|
|
||||||
|
make given matrix zero
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in,out]* **mat** matrix to
|
||||||
|
|
||||||
|
.. c:function:: void glm_mat2_mul(mat2 m1, mat2 m2, mat2 dest)
|
||||||
|
|
||||||
|
multiply m1 and m2 to dest
|
||||||
|
m1, m2 and dest matrices can be same matrix, it is possible to write this:
|
||||||
|
|
||||||
|
.. code-block:: c
|
||||||
|
|
||||||
|
mat2 m = GLM_mat2_IDENTITY_INIT;
|
||||||
|
glm_mat2_mul(m, m, m);
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **m1** left matrix
|
||||||
|
| *[in]* **m2** right matrix
|
||||||
|
| *[out]* **dest** destination matrix
|
||||||
|
|
||||||
|
.. c:function:: void glm_mat2_transpose_to(mat2 m, mat2 dest)
|
||||||
|
|
||||||
|
transpose mat4 and store in dest
|
||||||
|
source matrix will not be transposed unless dest is m
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **mat** source
|
||||||
|
| *[out]* **dest** destination
|
||||||
|
|
||||||
|
.. c:function:: void glm_mat2_transpose(mat2 m)
|
||||||
|
|
||||||
|
tranpose mat2 and store result in same matrix
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **mat** source
|
||||||
|
| *[out]* **dest** destination
|
||||||
|
|
||||||
|
.. c:function:: void glm_mat2_mulv(mat2 m, vec2 v, vec2 dest)
|
||||||
|
|
||||||
|
multiply mat4 with vec4 (column vector) and store in dest vector
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **mat** mat2 (left)
|
||||||
|
| *[in]* **v** vec2 (right, column vector)
|
||||||
|
| *[out]* **dest** destination (result, column vector)
|
||||||
|
|
||||||
|
.. c:function:: void glm_mat2_scale(mat2 m, float s)
|
||||||
|
|
||||||
|
multiply matrix with scalar
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in, out]* **mat** matrix
|
||||||
|
| *[in]* **dest** scalar
|
||||||
|
|
||||||
|
.. c:function:: float glm_mat2_det(mat2 mat)
|
||||||
|
|
||||||
|
returns mat2 determinant
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **mat** matrix
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
mat2 determinant
|
||||||
|
|
||||||
|
.. c:function:: void glm_mat2_inv(mat2 mat, mat2 dest)
|
||||||
|
|
||||||
|
inverse mat2 and store in dest
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **mat** matrix
|
||||||
|
| *[out]* **dest** destination (inverse matrix)
|
||||||
|
|
||||||
|
.. c:function:: void glm_mat2_trace(mat2 m)
|
||||||
|
|
||||||
|
| sum of the elements on the main diagonal from upper left to the lower right
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **m** matrix
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
trace of matrix
|
||||||
|
|
||||||
|
.. c:function:: void glm_mat2_swap_col(mat2 mat, int col1, int col2)
|
||||||
|
|
||||||
|
swap two matrix columns
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in, out]* **mat** matrix
|
||||||
|
| *[in]* **col1** col1
|
||||||
|
| *[in]* **col2** col2
|
||||||
|
|
||||||
|
.. c:function:: void glm_mat2_swap_row(mat2 mat, int row1, int row2)
|
||||||
|
|
||||||
|
swap two matrix rows
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in, out]* **mat** matrix
|
||||||
|
| *[in]* **row1** row1
|
||||||
|
| *[in]* **row2** row2
|
||||||
|
|
||||||
|
.. c:function:: float glm_mat2_rmc(vec2 r, mat2 m, vec2 c)
|
||||||
|
|
||||||
|
| **rmc** stands for **Row** * **Matrix** * **Column**
|
||||||
|
|
||||||
|
| helper for R (row vector) * M (matrix) * C (column vector)
|
||||||
|
|
||||||
|
| the result is scalar because R * M = Matrix1x2 (row vector),
|
||||||
|
| then Matrix1x2 * Vec2 (column vector) = Matrix1x1 (Scalar)
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **r** row vector or matrix1x2
|
||||||
|
| *[in]* **m** matrix2x2
|
||||||
|
| *[in]* **c** column vector or matrix2x1
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
scalar value e.g. Matrix1x1
|
||||||
@@ -156,16 +156,22 @@ Functions documentation
|
|||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **m** mat4 (left)
|
| *[in]* **m** mat4 (left)
|
||||||
| *[in]* **v** vec4 (right, column vector)
|
| *[in]* **v** vec4 (right, column vector)
|
||||||
|
| *[in]* **last** 4th item to make it vec4
|
||||||
| *[out]* **dest** vec4 (result, column vector)
|
| *[out]* **dest** vec4 (result, column vector)
|
||||||
|
|
||||||
.. c:function:: void glm_mat4_mulv3(mat4 m, vec3 v, vec3 dest)
|
.. c:function:: void glm_mat4_mulv3(mat4 m, vec3 v, float last, vec3 dest)
|
||||||
|
|
||||||
multiply vector with mat4's mat3 part(rotation)
|
| multiply **vec3** with **mat4** and get **vec3** as result
|
||||||
|
|
|
||||||
|
| actually the result is **vec4**, after multiplication,
|
||||||
|
the last component is trimmed, if you need the result's last component
|
||||||
|
then don't use this function and consider to use **glm_mat4_mulv()**
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **m** mat4 (left)
|
| *[in]* **m** mat4(affine transform)
|
||||||
| *[in]* **v** vec3 (right, column vector)
|
| *[in]* **v** vec3
|
||||||
| *[out]* **dest** vec3 (result, column vector)
|
| *[in]* **last** 4th item to make it vec4
|
||||||
|
| *[out]* **dest** result vector (vec3)
|
||||||
|
|
||||||
.. c:function:: void glm_mat4_trace(mat4 m)
|
.. c:function:: void glm_mat4_trace(mat4 m)
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ How to send vector or matrix to OpenGL like API
|
|||||||
==================================================
|
==================================================
|
||||||
|
|
||||||
*cglm*'s vector and matrix types are arrays. So you can send them directly to a
|
*cglm*'s vector and matrix types are arrays. So you can send them directly to a
|
||||||
function which accecpts pointer. But you may got warnings for matrix because it is
|
function which accepts pointer. But you may got warnings for matrix because it is
|
||||||
two dimensional array.
|
two dimensional array.
|
||||||
|
|
||||||
Passing / Uniforming Matrix to OpenGL:
|
Passing / Uniforming Matrix to OpenGL:
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ versor: 16 byte
|
|||||||
By starting **v0.4.5** cglm provides an option to disable alignment requirement.
|
By starting **v0.4.5** cglm provides an option to disable alignment requirement.
|
||||||
To enable this option define **CGLM_ALL_UNALIGNED** macro before all headers.
|
To enable this option define **CGLM_ALL_UNALIGNED** macro before all headers.
|
||||||
You can define it in Xcode, Visual Studio (or other IDEs) or you can also prefer
|
You can define it in Xcode, Visual Studio (or other IDEs) or you can also prefer
|
||||||
to define it in build system. If you use pre-compiled verisons then you
|
to define it in build system. If you use pre-compiled versions then you
|
||||||
have to compile cglm with **CGLM_ALL_UNALIGNED** macro.
|
have to compile cglm with **CGLM_ALL_UNALIGNED** macro.
|
||||||
|
|
||||||
**VERY VERY IMPORTANT:** If you use cglm in multiple projects and
|
**VERY VERY IMPORTANT:** If you use cglm in multiple projects and
|
||||||
@@ -35,6 +35,45 @@ have to compile cglm with **CGLM_ALL_UNALIGNED** macro.
|
|||||||
|
|
||||||
For instance if you set CGLM_ALL_UNALIGNED in a project then set it in other projects too
|
For instance if you set CGLM_ALL_UNALIGNED in a project then set it in other projects too
|
||||||
|
|
||||||
|
Clipspace Option[s]
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
By starting **v0.8.3** cglm provides options to switch between clipspace configurations.
|
||||||
|
|
||||||
|
Clipspace related files are located at `include/cglm/[struct]/clipspace.h` but
|
||||||
|
these are included in related files like `cam.h`. If you don't want to change your existing
|
||||||
|
clipspace configuration and want to use different clipspace function like `glm_lookat_zo` or `glm_lookat_lh_zo`...
|
||||||
|
then you can include individual headers or just define `CGLM_CLIPSPACE_INCLUDE_ALL` which will iclude all headers for you.
|
||||||
|
|
||||||
|
1. **CGLM_CLIPSPACE_INCLUDE_ALL**
|
||||||
|
2. **CGLM_FORCE_DEPTH_ZERO_TO_ONE**
|
||||||
|
3. **CGLM_FORCE_LEFT_HANDED**
|
||||||
|
|
||||||
|
|
||||||
|
1. **CGLM_CLIPSPACE_INCLUDE_ALL**:
|
||||||
|
|
||||||
|
By defining this macro, **cglm** will include all clipspace functions for you by just using
|
||||||
|
`#include cglm/cglm.h` or `#include cglm/struct.h` or `#include cglm/call.h`
|
||||||
|
|
||||||
|
Otherwise you need to include header you want manually e.g. `#include cglm/clipspace/view_rh_zo.h`
|
||||||
|
|
||||||
|
2. **CGLM_FORCE_DEPTH_ZERO_TO_ONE**
|
||||||
|
|
||||||
|
This is similar to **GLM**'s **GLM_FORCE_DEPTH_ZERO_TO_ONE** option.
|
||||||
|
This will set clip space between 0 to 1 which makes **cglm** Vulkan, Metal friendly.
|
||||||
|
|
||||||
|
You can use functions like `glm_lookat_lh_zo()` individually. By setting **CGLM_FORCE_DEPTH_ZERO_TO_ONE**
|
||||||
|
functions in cam.h for instance will use `_zo` versions.
|
||||||
|
|
||||||
|
3. **CGLM_FORCE_LEFT_HANDED**
|
||||||
|
|
||||||
|
Force **cglm** to use the left handed coordinate system by default, currently **cglm** uses right handed coordinate system as default,
|
||||||
|
you can change this behavior with this option.
|
||||||
|
|
||||||
|
**VERY VERY IMPORTANT:**
|
||||||
|
|
||||||
|
Be careful if you include **cglm** in multiple projects.
|
||||||
|
|
||||||
SSE and SSE2 Shuffle Option
|
SSE and SSE2 Shuffle Option
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
**_mm_shuffle_ps** generates **shufps** instruction even if registers are same.
|
**_mm_shuffle_ps** generates **shufps** instruction even if registers are same.
|
||||||
@@ -50,3 +89,36 @@ You have to extra options for dot product: **CGLM_SSE4_DOT** and **CGLM_SSE3_DOT
|
|||||||
- If **SSE3** is enabled then you can define **CGLM_SSE3_DOT** to force cglm to use **_mm_hadd_ps** instructions.
|
- If **SSE3** is enabled then you can define **CGLM_SSE3_DOT** to force cglm to use **_mm_hadd_ps** instructions.
|
||||||
|
|
||||||
otherwise cglm will use custom cglm's hadd functions which are optimized too.
|
otherwise cglm will use custom cglm's hadd functions which are optimized too.
|
||||||
|
|
||||||
|
Print Options
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
1. **CGLM_DEFINE_PRINTS**
|
||||||
|
2. **CGLM_NO_PRINTS_NOOP** (use CGLM_DEFINE_PRINTS)
|
||||||
|
|
||||||
|
Inline prints are only enabled in **DEBUG** mode or if **CGLM_DEFINE_PRINTS** is defined.
|
||||||
|
**glmc_** versions will always print too.
|
||||||
|
|
||||||
|
Because **cglm** tried to enable print functions in debug mode and disable them in
|
||||||
|
release/production mode to eliminate printing costs when we do not need them.
|
||||||
|
|
||||||
|
**cglm** checks **DEBUG** or **_DEBUG** macros to test debug mode, if these are not working for you then you can use
|
||||||
|
**CGLM_DEFINE_PRINTS** to force enable, or create a PR to introduce new macro to test against debugging mode.
|
||||||
|
|
||||||
|
If DEBUG mode is not enabled then print functions will be emptied to eliminate print function calls.
|
||||||
|
You can disable this feature too by defining **CGLM_DEFINE_PRINTS** macro top of cglm header
|
||||||
|
or in project/build settings...
|
||||||
|
|
||||||
|
3. **CGLM_PRINT_PRECISION** 5
|
||||||
|
|
||||||
|
precision.
|
||||||
|
|
||||||
|
4. **CGLM_PRINT_MAX_TO_SHORT** 1e5
|
||||||
|
|
||||||
|
if a number is greater than this value then %g will be used, since this is shorten print you won't be able to see high precision.
|
||||||
|
|
||||||
|
5. **CGLM_PRINT_COLOR** "\033[36m"
|
||||||
|
6. **CGLM_PRINT_COLOR_RESET** "\033[0m"
|
||||||
|
|
||||||
|
You can disable colorful print output by defining **CGLM_PRINT_COLOR** and **CGLM_PRINT_COLOR_RESET** as empty macro.
|
||||||
|
Because some terminals may not support colors.
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ Functions:
|
|||||||
#. :c:func:`glm_quat`
|
#. :c:func:`glm_quat`
|
||||||
#. :c:func:`glm_quatv`
|
#. :c:func:`glm_quatv`
|
||||||
#. :c:func:`glm_quat_copy`
|
#. :c:func:`glm_quat_copy`
|
||||||
|
#. :c:func:`glm_quat_from_vecs`
|
||||||
#. :c:func:`glm_quat_norm`
|
#. :c:func:`glm_quat_norm`
|
||||||
#. :c:func:`glm_quat_normalize`
|
#. :c:func:`glm_quat_normalize`
|
||||||
#. :c:func:`glm_quat_normalize_to`
|
#. :c:func:`glm_quat_normalize_to`
|
||||||
@@ -52,6 +53,7 @@ Functions:
|
|||||||
#. :c:func:`glm_quat_mat3`
|
#. :c:func:`glm_quat_mat3`
|
||||||
#. :c:func:`glm_quat_mat3t`
|
#. :c:func:`glm_quat_mat3t`
|
||||||
#. :c:func:`glm_quat_lerp`
|
#. :c:func:`glm_quat_lerp`
|
||||||
|
#. :c:func:`glm_quat_nlerp`
|
||||||
#. :c:func:`glm_quat_slerp`
|
#. :c:func:`glm_quat_slerp`
|
||||||
#. :c:func:`glm_quat_look`
|
#. :c:func:`glm_quat_look`
|
||||||
#. :c:func:`glm_quat_for`
|
#. :c:func:`glm_quat_for`
|
||||||
@@ -122,6 +124,20 @@ Functions documentation
|
|||||||
| *[in]* **q** source quaternion
|
| *[in]* **q** source quaternion
|
||||||
| *[out]* **dest** destination 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)
|
.. c:function:: float glm_quat_norm(versor q)
|
||||||
|
|
||||||
| returns norm (magnitude) of quaternion
|
| returns norm (magnitude) of quaternion
|
||||||
@@ -304,6 +320,25 @@ Functions documentation
|
|||||||
| *[in]* **t** interpolant (amount) clamped between 0 and 1
|
| *[in]* **t** interpolant (amount) clamped between 0 and 1
|
||||||
| *[out]* **dest** result quaternion
|
| *[out]* **dest** result quaternion
|
||||||
|
|
||||||
|
.. c:function:: void glm_quat_nlerp(versor q, versor r, float t, versor dest)
|
||||||
|
|
||||||
|
| interpolates between two quaternions
|
||||||
|
| taking the shortest rotation path using
|
||||||
|
| normalized linear interpolation (NLERP)
|
||||||
|
|
||||||
|
| This is a cheaper alternative to slerp; most games use nlerp
|
||||||
|
| for animations as it visually makes little difference.
|
||||||
|
|
||||||
|
References:
|
||||||
|
* `Understanding Slerp, Then Not Using it <http://number-none.com/product/Understanding%20Slerp,%20Then%20Not%20Using%20It>`_
|
||||||
|
* `Lerp, Slerp and Nlerp <https://keithmaggio.wordpress.com/2011/02/15/math-magician-lerp-slerp-and-nlerp/>`_
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **from** from
|
||||||
|
| *[in]* **to** to
|
||||||
|
| *[in]* **t** interpolant (amount) clamped between 0 and 1
|
||||||
|
| *[out]* **dest** result quaternion
|
||||||
|
|
||||||
.. c:function:: void glm_quat_slerp(versor q, versor r, float t, versor dest)
|
.. c:function:: void glm_quat_slerp(versor q, versor r, float t, versor dest)
|
||||||
|
|
||||||
| interpolates between two quaternions
|
| interpolates between two quaternions
|
||||||
@@ -324,26 +359,24 @@ Functions documentation
|
|||||||
| *[in]* **ori** orientation in world space as quaternion
|
| *[in]* **ori** orientation in world space as quaternion
|
||||||
| *[out]* **dest** result matrix
|
| *[out]* **dest** result matrix
|
||||||
|
|
||||||
.. c:function:: void glm_quat_for(vec3 dir, vec3 fwd, vec3 up, versor dest)
|
.. c:function:: void glm_quat_for(vec3 dir, vec3 up, versor dest)
|
||||||
|
|
||||||
| creates look rotation quaternion
|
| creates look rotation quaternion
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **dir** direction to look
|
| *[in]* **dir** direction to look
|
||||||
| *[in]* **fwd** forward vector
|
|
||||||
| *[in]* **up** up vector
|
| *[in]* **up** up vector
|
||||||
| *[out]* **dest** result matrix
|
| *[out]* **dest** result matrix
|
||||||
|
|
||||||
.. c:function:: void glm_quat_forp(vec3 from, vec3 to, vec3 fwd, vec3 up, versor dest)
|
.. c:function:: void glm_quat_forp(vec3 from, vec3 to, vec3 up, versor dest)
|
||||||
|
|
||||||
| creates look rotation quaternion using source and destination positions p suffix stands for position
|
| creates look rotation quaternion using source and destination positions p suffix stands for position
|
||||||
|
|
||||||
| this is similar to glm_quat_for except this computes direction for glm_quat_for for you.
|
| this is similar to glm_quat_for except this computes direction for glm_quat_for for you.
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **from** source point
|
| *[in]* **from** source point
|
||||||
| *[in]* **to** destination point
|
| *[in]* **to** destination point
|
||||||
| *[in]* **fwd** forward vector
|
|
||||||
| *[in]* **up** up vector
|
| *[in]* **up** up vector
|
||||||
| *[out]* **dest** result matrix
|
| *[out]* **dest** result matrix
|
||||||
|
|
||||||
@@ -376,7 +409,7 @@ Functions documentation
|
|||||||
| *[in]* **q** quaternion
|
| *[in]* **q** quaternion
|
||||||
| *[in]* **pivot** pivot
|
| *[in]* **pivot** pivot
|
||||||
|
|
||||||
.. c:function:: void glm_quat_rotate(mat4 m, versor q, mat4 dest)
|
.. c:function:: void glm_quat_rotate_atm(mat4 m, versor q, vec3 pivot)
|
||||||
|
|
||||||
| rotate NEW transform matrix using quaternion at pivot point
|
| rotate NEW transform matrix using quaternion at pivot point
|
||||||
| this creates rotation matrix, it assumes you don't have a matrix
|
| this creates rotation matrix, it assumes you don't have a matrix
|
||||||
|
|||||||
31
docs/source/ray.rst
Normal file
31
docs/source/ray.rst
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
.. default-domain:: C
|
||||||
|
|
||||||
|
ray
|
||||||
|
====
|
||||||
|
|
||||||
|
Header: cglm/ray.h
|
||||||
|
|
||||||
|
This is for collision-checks used by ray-tracers and the like.
|
||||||
|
|
||||||
|
Table of contents (click to go):
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Functions:
|
||||||
|
|
||||||
|
1. :c:func:`glm_ray_triangle`
|
||||||
|
|
||||||
|
Functions documentation
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
.. c:function:: bool glm_ray_triangle(vec3 origin, vec3 direction, vec3 v0, vec3 v1, vec3 v2, float *d)
|
||||||
|
|
||||||
|
Möller–Trumbore ray-triangle intersection algorithm
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **origin** origin of ray
|
||||||
|
| *[in]* **direction** direction of ray
|
||||||
|
| *[in]* **v0** first vertex of triangle
|
||||||
|
| *[in]* **v1** second vertex of triangle
|
||||||
|
| *[in]* **v2** third vertex of triangle
|
||||||
|
| *[in, out]* **d** float pointer to save distance to intersection
|
||||||
|
| *[out]* **intersection** whether there is intersection
|
||||||
@@ -80,6 +80,19 @@ So be carefull, when your IDE (Xcode, Visual Studio ...) tried to autocomplete f
|
|||||||
|
|
||||||
**Also implementation may be wrong please let us know by creating an issue on Github.**
|
**Also implementation may be wrong please let us know by creating an issue on Github.**
|
||||||
|
|
||||||
|
BAD_ACCESS : Thread 1: EXC_BAD_ACCESS (code=EXC_I386_GPFLT) or Similar Errors/Crashes
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
This is similar issue with alignment. For instance if you compiled **cglm** with
|
||||||
|
AVX (**-mavx**, intentionally or not) and if you use **cglm** in an environment that doesn't
|
||||||
|
support AVX (or if AVX is disabled intentionally) e.g. environment that max support SSE2/3/4,
|
||||||
|
then you probably get **BAD ACCESS** or similar...
|
||||||
|
|
||||||
|
Because if you compile **cglm** with AVX it aligns **mat4** with 32 byte boundary,
|
||||||
|
and your project aligns that as 16 byte boundary...
|
||||||
|
|
||||||
|
Check alignment, supported vector extension or simd in **cglm** and linked projects...
|
||||||
|
|
||||||
Other Issues?
|
Other Issues?
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ Functions:
|
|||||||
#. :c:func:`glm_max`
|
#. :c:func:`glm_max`
|
||||||
#. :c:func:`glm_clamp`
|
#. :c:func:`glm_clamp`
|
||||||
#. :c:func:`glm_lerp`
|
#. :c:func:`glm_lerp`
|
||||||
|
#. :c:func:`glm_swapf`
|
||||||
|
|
||||||
Functions documentation
|
Functions documentation
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
@@ -146,7 +147,7 @@ Functions documentation
|
|||||||
| *[in]* **b** b
|
| *[in]* **b** b
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
true if a and b equals
|
true if a and b are equal
|
||||||
|
|
||||||
.. c:function:: float glm_percent(float from, float to, float current)
|
.. c:function:: float glm_percent(float from, float to, float current)
|
||||||
|
|
||||||
@@ -158,7 +159,7 @@ Functions documentation
|
|||||||
| *[in]* **current** value between from and to values
|
| *[in]* **current** value between from and to values
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
clamped normalized percent (0-100 in 0-1)
|
percentage of current value
|
||||||
|
|
||||||
.. c:function:: float glm_percentc(float from, float to, float current)
|
.. c:function:: float glm_percentc(float from, float to, float current)
|
||||||
|
|
||||||
@@ -171,3 +172,11 @@ Functions documentation
|
|||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
clamped normalized percent (0-100 in 0-1)
|
clamped normalized percent (0-100 in 0-1)
|
||||||
|
|
||||||
|
.. c:function:: void glm_swapf(float *a, float *b)
|
||||||
|
|
||||||
|
swap two float values
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **a** float 1
|
||||||
|
| *[in]* **b** float 2
|
||||||
|
|||||||
134
docs/source/vec2-ext.rst
Normal file
134
docs/source/vec2-ext.rst
Normal file
@@ -0,0 +1,134 @@
|
|||||||
|
.. default-domain:: C
|
||||||
|
|
||||||
|
vec2 extra
|
||||||
|
==========
|
||||||
|
|
||||||
|
Header: cglm/vec2-ext.h
|
||||||
|
|
||||||
|
There are some functions are in called in extra header. These are called extra
|
||||||
|
because they are not used like other functions in vec2.h in the future some of
|
||||||
|
these functions ma be moved to vec2 header.
|
||||||
|
|
||||||
|
Table of contents (click to go):
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Functions:
|
||||||
|
|
||||||
|
1. :c:func:`glm_vec2_fill`
|
||||||
|
#. :c:func:`glm_vec2_eq`
|
||||||
|
#. :c:func:`glm_vec2_eq_eps`
|
||||||
|
#. :c:func:`glm_vec2_eq_all`
|
||||||
|
#. :c:func:`glm_vec2_eqv`
|
||||||
|
#. :c:func:`glm_vec2_eqv_eps`
|
||||||
|
#. :c:func:`glm_vec2_max`
|
||||||
|
#. :c:func:`glm_vec2_min`
|
||||||
|
#. :c:func:`glm_vec2_isnan`
|
||||||
|
#. :c:func:`glm_vec2_isinf`
|
||||||
|
#. :c:func:`glm_vec2_isvalid`
|
||||||
|
#. :c:func:`glm_vec2_sign`
|
||||||
|
#. :c:func:`glm_vec2_sqrt`
|
||||||
|
|
||||||
|
Functions documentation
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_fill(vec2 v, float val)
|
||||||
|
|
||||||
|
fill a vector with specified value
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in,out]* **dest** destination
|
||||||
|
| *[in]* **val** value
|
||||||
|
|
||||||
|
|
||||||
|
.. c:function:: bool glm_vec2_eq(vec2 v, float val)
|
||||||
|
|
||||||
|
check if vector is equal to value (without epsilon)
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
| *[in]* **val** value
|
||||||
|
|
||||||
|
.. c:function:: bool glm_vec2_eq_eps(vec2 v, float val)
|
||||||
|
|
||||||
|
check if vector is equal to value (with epsilon)
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
| *[in]* **val** value
|
||||||
|
|
||||||
|
.. c:function:: bool glm_vec2_eq_all(vec2 v)
|
||||||
|
|
||||||
|
check if vectors members are equal (without epsilon)
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
|
||||||
|
.. c:function:: bool glm_vec2_eqv(vec2 v1, vec2 v2)
|
||||||
|
|
||||||
|
check if vector is equal to another (without epsilon) vector
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **vec** vector 1
|
||||||
|
| *[in]* **vec** vector 2
|
||||||
|
|
||||||
|
.. c:function:: bool glm_vec2_eqv_eps(vec2 v1, vec2 v2)
|
||||||
|
|
||||||
|
check if vector is equal to another (with epsilon)
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v1** vector1
|
||||||
|
| *[in]* **v2** vector2
|
||||||
|
|
||||||
|
.. c:function:: float glm_vec2_max(vec2 v)
|
||||||
|
|
||||||
|
max value of vector
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
|
||||||
|
.. c:function:: float glm_vec2_min(vec2 v)
|
||||||
|
|
||||||
|
min value of vector
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
|
||||||
|
.. c:function:: bool glm_vec2_isnan(vec2 v)
|
||||||
|
|
||||||
|
| check if one of items is NaN (not a number)
|
||||||
|
| you should only use this in DEBUG mode or very critical asserts
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
|
||||||
|
.. c:function:: bool glm_vec2_isinf(vec2 v)
|
||||||
|
|
||||||
|
| check if one of items is INFINITY
|
||||||
|
| you should only use this in DEBUG mode or very critical asserts
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
|
||||||
|
.. c:function:: bool glm_vec2_isvalid(vec2 v)
|
||||||
|
|
||||||
|
| check if all items are valid number
|
||||||
|
| you should only use this in DEBUG mode or very critical asserts
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_sign(vec2 v, vec2 dest)
|
||||||
|
|
||||||
|
get sign of 32 bit float as +1, -1, 0
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
| *[out]* **dest** sign vector (only keeps signs as -1, 0, -1)
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_sqrt(vec2 v, vec2 dest)
|
||||||
|
|
||||||
|
square root of each vector item
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
| *[out]* **dest** destination vector (sqrt(v))
|
||||||
375
docs/source/vec2.rst
Normal file
375
docs/source/vec2.rst
Normal file
@@ -0,0 +1,375 @@
|
|||||||
|
.. default-domain:: C
|
||||||
|
|
||||||
|
vec2
|
||||||
|
====
|
||||||
|
|
||||||
|
Header: cglm/vec2.h
|
||||||
|
|
||||||
|
Table of contents (click to go):
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Macros:
|
||||||
|
|
||||||
|
1. GLM_vec2_ONE_INIT
|
||||||
|
#. GLM_vec2_ZERO_INIT
|
||||||
|
#. GLM_vec2_ONE
|
||||||
|
#. GLM_vec2_ZERO
|
||||||
|
|
||||||
|
Functions:
|
||||||
|
|
||||||
|
1. :c:func:`glm_vec2`
|
||||||
|
#. :c:func:`glm_vec2_copy`
|
||||||
|
#. :c:func:`glm_vec2_zero`
|
||||||
|
#. :c:func:`glm_vec2_one`
|
||||||
|
#. :c:func:`glm_vec2_dot`
|
||||||
|
#. :c:func:`glm_vec2_cross`
|
||||||
|
#. :c:func:`glm_vec2_norm2`
|
||||||
|
#. :c:func:`glm_vec2_norm`
|
||||||
|
#. :c:func:`glm_vec2_add`
|
||||||
|
#. :c:func:`glm_vec2_adds`
|
||||||
|
#. :c:func:`glm_vec2_sub`
|
||||||
|
#. :c:func:`glm_vec2_subs`
|
||||||
|
#. :c:func:`glm_vec2_mul`
|
||||||
|
#. :c:func:`glm_vec2_scale`
|
||||||
|
#. :c:func:`glm_vec2_scale_as`
|
||||||
|
#. :c:func:`glm_vec2_div`
|
||||||
|
#. :c:func:`glm_vec2_divs`
|
||||||
|
#. :c:func:`glm_vec2_addadd`
|
||||||
|
#. :c:func:`glm_vec2_subadd`
|
||||||
|
#. :c:func:`glm_vec2_muladd`
|
||||||
|
#. :c:func:`glm_vec2_muladds`
|
||||||
|
#. :c:func:`glm_vec2_maxadd`
|
||||||
|
#. :c:func:`glm_vec2_minadd`
|
||||||
|
#. :c:func:`glm_vec2_negate`
|
||||||
|
#. :c:func:`glm_vec2_negate_to`
|
||||||
|
#. :c:func:`glm_vec2_normalize`
|
||||||
|
#. :c:func:`glm_vec2_normalize_to`
|
||||||
|
#. :c:func:`glm_vec2_rotate`
|
||||||
|
#. :c:func:`glm_vec2_distance2`
|
||||||
|
#. :c:func:`glm_vec2_distance`
|
||||||
|
#. :c:func:`glm_vec2_maxv`
|
||||||
|
#. :c:func:`glm_vec2_minv`
|
||||||
|
#. :c:func:`glm_vec2_clamp`
|
||||||
|
#. :c:func:`glm_vec2_lerp`
|
||||||
|
|
||||||
|
Functions documentation
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2(float * v, vec2 dest)
|
||||||
|
|
||||||
|
init vec2 using vec3 or vec4
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
| *[out]* **dest** destination
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_copy(vec2 a, vec2 dest)
|
||||||
|
|
||||||
|
copy all members of [a] to [dest]
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **a** source
|
||||||
|
| *[out]* **dest** destination
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_zero(vec2 v)
|
||||||
|
|
||||||
|
makes all members 0.0f (zero)
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in, out]* **v** vector
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_one(vec2 v)
|
||||||
|
|
||||||
|
makes all members 1.0f (one)
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in, out]* **v** vector
|
||||||
|
|
||||||
|
.. c:function:: float glm_vec2_dot(vec2 a, vec2 b)
|
||||||
|
|
||||||
|
dot product of vec2
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **a** vector1
|
||||||
|
| *[in]* **b** vector2
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
dot product
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_cross(vec2 a, vec2 b, vec2 d)
|
||||||
|
|
||||||
|
cross product of two vector (RH)
|
||||||
|
|
||||||
|
| ref: http://allenchou.net/2013/07/cross-product-of-2d-vectors/
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **a** vector 1
|
||||||
|
| *[in]* **b** vector 2
|
||||||
|
| *[out]* **dest** destination
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Z component of cross product
|
||||||
|
|
||||||
|
.. c:function:: float glm_vec2_norm2(vec2 v)
|
||||||
|
|
||||||
|
norm * norm (magnitude) of vector
|
||||||
|
|
||||||
|
we can use this func instead of calling norm * norm, because it would call
|
||||||
|
sqrtf fuction twice but with this func we can avoid func call, maybe this is
|
||||||
|
not good name for this func
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
square of norm / magnitude
|
||||||
|
|
||||||
|
.. c:function:: float glm_vec2_norm(vec2 vec)
|
||||||
|
|
||||||
|
| euclidean norm (magnitude), also called L2 norm
|
||||||
|
| this will give magnitude of vector in euclidean space
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **vec** vector
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_add(vec2 a, vec2 b, vec2 dest)
|
||||||
|
|
||||||
|
add a vector to b vector store result in dest
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **a** vector1
|
||||||
|
| *[in]* **b** vector2
|
||||||
|
| *[out]* **dest** destination vector
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_adds(vec2 a, float s, vec2 dest)
|
||||||
|
|
||||||
|
add scalar to v vector store result in dest (d = v + vec(s))
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
| *[in]* **s** scalar
|
||||||
|
| *[out]* **dest** destination vector
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_sub(vec2 v1, vec2 v2, vec2 dest)
|
||||||
|
|
||||||
|
subtract b vector from a vector store result in dest (d = v1 - v2)
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **a** vector1
|
||||||
|
| *[in]* **b** vector2
|
||||||
|
| *[out]* **dest** destination vector
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_subs(vec2 v, float s, vec2 dest)
|
||||||
|
|
||||||
|
subtract scalar from v vector store result in dest (d = v - vec(s))
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
| *[in]* **s** scalar
|
||||||
|
| *[out]* **dest** destination vector
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_mul(vec2 a, vec2 b, vec2 d)
|
||||||
|
|
||||||
|
multiply two vector (component-wise multiplication)
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **a** vector
|
||||||
|
| *[in]* **b** scalar
|
||||||
|
| *[out]* **d** result = (a[0] * b[0], a[1] * b[1], a[2] * b[2])
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_scale(vec2 v, float s, vec2 dest)
|
||||||
|
|
||||||
|
multiply/scale vec2 vector with scalar: result = v * s
|
||||||
|
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
| *[in]* **s** scalar
|
||||||
|
| *[out]* **dest** destination vector
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_scale_as(vec2 v, float s, vec2 dest)
|
||||||
|
|
||||||
|
make vec2 vector scale as specified: result = unit(v) * s
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
| *[in]* **s** scalar
|
||||||
|
| *[out]* **dest** destination vector
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_div(vec2 a, vec2 b, vec2 dest)
|
||||||
|
|
||||||
|
div vector with another component-wise division: d = a / b
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **a** vector 1
|
||||||
|
| *[in]* **b** vector 2
|
||||||
|
| *[out]* **dest** result = (a[0] / b[0], a[1] / b[1], a[2] / b[2])
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_divs(vec2 v, float s, vec2 dest)
|
||||||
|
|
||||||
|
div vector with scalar: d = v / s
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
| *[in]* **s** scalar
|
||||||
|
| *[out]* **dest** result = (a[0] / s, a[1] / s, a[2] / s])
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_addadd(vec2 a, vec2 b, vec2 dest)
|
||||||
|
|
||||||
|
| add two vectors and add result to sum
|
||||||
|
| it applies += operator so dest must be initialized
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **a** vector 1
|
||||||
|
| *[in]* **b** vector 2
|
||||||
|
| *[out]* **dest** dest += (a + b)
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_subadd(vec2 a, vec2 b, vec2 dest)
|
||||||
|
|
||||||
|
| sub two vectors and add result to sum
|
||||||
|
| it applies += operator so dest must be initialized
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **a** vector 1
|
||||||
|
| *[in]* **b** vector 2
|
||||||
|
| *[out]* **dest** dest += (a - b)
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_muladd(vec2 a, vec2 b, vec2 dest)
|
||||||
|
|
||||||
|
| mul two vectors and add result to sum
|
||||||
|
| it applies += operator so dest must be initialized
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **a** vector 1
|
||||||
|
| *[in]* **b** vector 2
|
||||||
|
| *[out]* **dest** dest += (a * b)
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_muladds(vec2 a, float s, vec2 dest)
|
||||||
|
|
||||||
|
| mul vector with scalar and add result to sum
|
||||||
|
| it applies += operator so dest must be initialized
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **a** vector
|
||||||
|
| *[in]* **s** scalar
|
||||||
|
| *[out]* **dest** dest += (a * b)
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_maxadd(vec2 a, vec2 b, vec2 dest)
|
||||||
|
|
||||||
|
| add max of two vector to result/dest
|
||||||
|
| it applies += operator so dest must be initialized
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **a** vector 1
|
||||||
|
| *[in]* **b** vector 2
|
||||||
|
| *[out]* **dest** dest += (a * b)
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_minadd(vec2 a, vec2 b, vec2 dest)
|
||||||
|
|
||||||
|
| add min of two vector to result/dest
|
||||||
|
| it applies += operator so dest must be initialized
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **a** vector 1
|
||||||
|
| *[in]* **b** vector 2
|
||||||
|
| *[out]* **dest** dest += (a * b)
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_negate(vec2 v)
|
||||||
|
|
||||||
|
negate vector components
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in, out]* **v** vector
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_negate_to(vec2 v, vec2 dest)
|
||||||
|
|
||||||
|
negate vector components and store result in dest
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
| *[out]* **dest** negated vector
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_normalize(vec2 v)
|
||||||
|
|
||||||
|
normalize vec2 and store result in same vec
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in, out]* **v** vector
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_normalize_to(vec2 vec, vec2 dest)
|
||||||
|
|
||||||
|
normalize vec2 to dest
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **vec** source
|
||||||
|
| *[out]* **dest** destination
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_rotate(vec2 v, float angle, vec2 dest)
|
||||||
|
|
||||||
|
rotate vec2 around axis by angle using Rodrigues' rotation formula
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v** vector
|
||||||
|
| *[in]* **axis** axis vector
|
||||||
|
| *[out]* **dest** destination
|
||||||
|
|
||||||
|
.. c:function:: float glm_vec2_distance2(vec2 v1, vec2 v2)
|
||||||
|
|
||||||
|
squared distance between two vectors
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **mat** vector1
|
||||||
|
| *[in]* **row1** vector2
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
| squared distance (distance * distance)
|
||||||
|
|
||||||
|
.. c:function:: float glm_vec2_distance(vec2 v1, vec2 v2)
|
||||||
|
|
||||||
|
distance between two vectors
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **mat** vector1
|
||||||
|
| *[in]* **row1** vector2
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
| distance
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_maxv(vec2 v1, vec2 v2, vec2 dest)
|
||||||
|
|
||||||
|
max values of vectors
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v1** vector1
|
||||||
|
| *[in]* **v2** vector2
|
||||||
|
| *[out]* **dest** destination
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_minv(vec2 v1, vec2 v2, vec2 dest)
|
||||||
|
|
||||||
|
min values of vectors
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **v1** vector1
|
||||||
|
| *[in]* **v2** vector2
|
||||||
|
| *[out]* **dest** destination
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_clamp(vec2 v, float minVal, float maxVal)
|
||||||
|
|
||||||
|
constrain a value to lie between two further values
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in, out]* **v** vector
|
||||||
|
| *[in]* **minVal** minimum value
|
||||||
|
| *[in]* **maxVal** maximum value
|
||||||
|
|
||||||
|
.. c:function:: void glm_vec2_lerp(vec2 from, vec2 to, float t, vec2 dest)
|
||||||
|
|
||||||
|
linear interpolation between two vector
|
||||||
|
|
||||||
|
| formula: from + s * (to - from)
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
| *[in]* **from** from value
|
||||||
|
| *[in]* **to** to value
|
||||||
|
| *[in]* **t** interpolant (amount) clamped between 0 and 1
|
||||||
|
| *[out]* **dest** destination
|
||||||
@@ -392,7 +392,7 @@ Functions documentation
|
|||||||
Parameters:
|
Parameters:
|
||||||
| *[in, out]* **v** vector
|
| *[in, out]* **v** vector
|
||||||
| *[in]* **axis** axis vector (will be normalized)
|
| *[in]* **axis** axis vector (will be normalized)
|
||||||
| *[out]* **angle** angle (radians)
|
| *[in]* **angle** angle (radians)
|
||||||
|
|
||||||
.. c:function:: void glm_vec3_rotate_m4(mat4 m, vec3 v, vec3 dest)
|
.. c:function:: void glm_vec3_rotate_m4(mat4 m, vec3 v, vec3 dest)
|
||||||
|
|
||||||
@@ -435,8 +435,8 @@ Functions documentation
|
|||||||
squared distance between two vectors
|
squared distance between two vectors
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **mat** vector1
|
| *[in]* **v1** vector1
|
||||||
| *[in]* **row1** vector2
|
| *[in]* **v2** vector2
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
| squared distance (distance * distance)
|
| squared distance (distance * distance)
|
||||||
@@ -446,8 +446,8 @@ Functions documentation
|
|||||||
distance between two vectors
|
distance between two vectors
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **mat** vector1
|
| *[in]* **v1** vector1
|
||||||
| *[in]* **row1** vector2
|
| *[in]* **v2** vector2
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
| distance
|
| distance
|
||||||
@@ -474,8 +474,11 @@ Functions documentation
|
|||||||
|
|
||||||
possible orthogonal/perpendicular vector
|
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:
|
Parameters:
|
||||||
| *[in]* **mat** vector
|
| *[in]* **v** vector
|
||||||
| *[out]* **dest** orthogonal/perpendicular vector
|
| *[out]* **dest** orthogonal/perpendicular vector
|
||||||
|
|
||||||
.. c:function:: void glm_vec3_clamp(vec3 v, float minVal, float maxVal)
|
.. c:function:: void glm_vec3_clamp(vec3 v, float minVal, float maxVal)
|
||||||
|
|||||||
15
docs/source/version.rst
Normal file
15
docs/source/version.rst
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
.. default-domain:: C
|
||||||
|
|
||||||
|
version
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
Header: cglm/version.h
|
||||||
|
|
||||||
|
**cglm** uses semantic versioning (http://semver.org) which is MAJOR.MINOR.PATCH
|
||||||
|
|
||||||
|
| **CGLM_VERSION_MAJOR** is major number of the version.
|
||||||
|
| **CGLM_VERSION_MINOR** is minor number of the version.
|
||||||
|
| **CGLM_VERSION_PATCH** is patch number of the version.
|
||||||
|
|
||||||
|
every release increases these numbers. You can check existing version by
|
||||||
|
including `cglm/version.h`
|
||||||
@@ -26,6 +26,10 @@
|
|||||||
# include "simd/avx/affine.h"
|
# include "simd/avx/affine.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CGLM_NEON_FP
|
||||||
|
# include "simd/neon/affine.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief this is similar to glm_mat4_mul but specialized to affine transform
|
* @brief this is similar to glm_mat4_mul but specialized to affine transform
|
||||||
*
|
*
|
||||||
@@ -49,6 +53,8 @@ glm_mul(mat4 m1, mat4 m2, mat4 dest) {
|
|||||||
glm_mul_avx(m1, m2, dest);
|
glm_mul_avx(m1, m2, dest);
|
||||||
#elif defined( __SSE__ ) || defined( __SSE2__ )
|
#elif defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
glm_mul_sse2(m1, m2, dest);
|
glm_mul_sse2(m1, m2, dest);
|
||||||
|
#elif defined(CGLM_NEON_FP)
|
||||||
|
glm_mul_neon(m1, m2, dest);
|
||||||
#else
|
#else
|
||||||
float a00 = m1[0][0], a01 = m1[0][1], a02 = m1[0][2], a03 = m1[0][3],
|
float a00 = m1[0][0], a01 = m1[0][1], a02 = m1[0][2], a03 = m1[0][3],
|
||||||
a10 = m1[1][0], a11 = m1[1][1], a12 = m1[1][2], a13 = m1[1][3],
|
a10 = m1[1][0], a11 = m1[1][1], a12 = m1[1][2], a13 = m1[1][3],
|
||||||
@@ -103,6 +109,8 @@ void
|
|||||||
glm_mul_rot(mat4 m1, mat4 m2, mat4 dest) {
|
glm_mul_rot(mat4 m1, mat4 m2, mat4 dest) {
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
glm_mul_rot_sse2(m1, m2, dest);
|
glm_mul_rot_sse2(m1, m2, dest);
|
||||||
|
#elif defined(CGLM_NEON_FP)
|
||||||
|
glm_mul_rot_neon(m1, m2, dest);
|
||||||
#else
|
#else
|
||||||
float a00 = m1[0][0], a01 = m1[0][1], a02 = m1[0][2], a03 = m1[0][3],
|
float a00 = m1[0][0], a01 = m1[0][1], a02 = m1[0][2], a03 = m1[0][3],
|
||||||
a10 = m1[1][0], a11 = m1[1][1], a12 = m1[1][2], a13 = m1[1][3],
|
a10 = m1[1][0], a11 = m1[1][1], a12 = m1[1][2], a13 = m1[1][3],
|
||||||
@@ -150,6 +158,8 @@ void
|
|||||||
glm_inv_tr(mat4 mat) {
|
glm_inv_tr(mat4 mat) {
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
glm_inv_tr_sse2(mat);
|
glm_inv_tr_sse2(mat);
|
||||||
|
#elif defined(CGLM_NEON_FP)
|
||||||
|
glm_inv_tr_neon(mat);
|
||||||
#else
|
#else
|
||||||
CGLM_ALIGN_MAT mat3 r;
|
CGLM_ALIGN_MAT mat3 r;
|
||||||
CGLM_ALIGN(8) vec3 t;
|
CGLM_ALIGN(8) vec3 t;
|
||||||
|
|||||||
@@ -40,10 +40,6 @@
|
|||||||
#include "mat4.h"
|
#include "mat4.h"
|
||||||
#include "affine-mat.h"
|
#include "affine-mat.h"
|
||||||
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_mat4_mul(mat4 m1, mat4 m2, mat4 dest);
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief translate existing transform matrix by v vector
|
* @brief translate existing transform matrix by v vector
|
||||||
* and stores result in same matrix
|
* and stores result in same matrix
|
||||||
@@ -54,26 +50,22 @@ glm_mat4_mul(mat4 m1, mat4 m2, mat4 dest);
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_translate(mat4 m, vec3 v) {
|
glm_translate(mat4 m, vec3 v) {
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#if defined(CGLM_SIMD)
|
||||||
|
glmm_128 m0, m1, m2, m3;
|
||||||
|
|
||||||
|
m0 = glmm_load(m[0]);
|
||||||
|
m1 = glmm_load(m[1]);
|
||||||
|
m2 = glmm_load(m[2]);
|
||||||
|
m3 = glmm_load(m[3]);
|
||||||
|
|
||||||
glmm_store(m[3],
|
glmm_store(m[3],
|
||||||
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_load(m[0]),
|
glmm_fmadd(m0, glmm_set1(v[0]),
|
||||||
_mm_set1_ps(v[0])),
|
glmm_fmadd(m1, glmm_set1(v[1]),
|
||||||
_mm_mul_ps(glmm_load(m[1]),
|
glmm_fmadd(m2, glmm_set1(v[2]), m3))));
|
||||||
_mm_set1_ps(v[1]))),
|
|
||||||
_mm_add_ps(_mm_mul_ps(glmm_load(m[2]),
|
|
||||||
_mm_set1_ps(v[2])),
|
|
||||||
glmm_load(m[3]))))
|
|
||||||
;
|
|
||||||
#else
|
#else
|
||||||
vec4 v1, v2, v3;
|
glm_vec4_muladds(m[0], v[0], m[3]);
|
||||||
|
glm_vec4_muladds(m[1], v[1], m[3]);
|
||||||
glm_vec4_scale(m[0], v[0], v1);
|
glm_vec4_muladds(m[2], v[2], m[3]);
|
||||||
glm_vec4_scale(m[1], v[1], v2);
|
|
||||||
glm_vec4_scale(m[2], v[2], v3);
|
|
||||||
|
|
||||||
glm_vec4_add(v1, m[3], m[3]);
|
|
||||||
glm_vec4_add(v2, m[3], m[3]);
|
|
||||||
glm_vec4_add(v3, m[3], m[3]);
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -103,12 +95,8 @@ glm_translate_to(mat4 m, vec3 v, mat4 dest) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_translate_x(mat4 m, float x) {
|
glm_translate_x(mat4 m, float x) {
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#if defined(CGLM_SIMD)
|
||||||
glmm_store(m[3],
|
glmm_store(m[3], glmm_fmadd(glmm_load(m[0]), glmm_set1(x), glmm_load(m[3])));
|
||||||
_mm_add_ps(_mm_mul_ps(glmm_load(m[0]),
|
|
||||||
_mm_set1_ps(x)),
|
|
||||||
glmm_load(m[3])))
|
|
||||||
;
|
|
||||||
#else
|
#else
|
||||||
vec4 v1;
|
vec4 v1;
|
||||||
glm_vec4_scale(m[0], x, v1);
|
glm_vec4_scale(m[0], x, v1);
|
||||||
@@ -125,12 +113,8 @@ glm_translate_x(mat4 m, float x) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_translate_y(mat4 m, float y) {
|
glm_translate_y(mat4 m, float y) {
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#if defined(CGLM_SIMD)
|
||||||
glmm_store(m[3],
|
glmm_store(m[3], glmm_fmadd(glmm_load(m[1]), glmm_set1(y), glmm_load(m[3])));
|
||||||
_mm_add_ps(_mm_mul_ps(glmm_load(m[1]),
|
|
||||||
_mm_set1_ps(y)),
|
|
||||||
glmm_load(m[3])))
|
|
||||||
;
|
|
||||||
#else
|
#else
|
||||||
vec4 v1;
|
vec4 v1;
|
||||||
glm_vec4_scale(m[1], y, v1);
|
glm_vec4_scale(m[1], y, v1);
|
||||||
@@ -147,12 +131,8 @@ glm_translate_y(mat4 m, float y) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_translate_z(mat4 m, float z) {
|
glm_translate_z(mat4 m, float z) {
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#if defined(CGLM_SIMD)
|
||||||
glmm_store(m[3],
|
glmm_store(m[3], glmm_fmadd(glmm_load(m[2]), glmm_set1(z), glmm_load(m[3])));
|
||||||
_mm_add_ps(_mm_mul_ps(glmm_load(m[2]),
|
|
||||||
_mm_set1_ps(z)),
|
|
||||||
glmm_load(m[3])))
|
|
||||||
;
|
|
||||||
#else
|
#else
|
||||||
vec4 v1;
|
vec4 v1;
|
||||||
glm_vec4_scale(m[2], z, v1);
|
glm_vec4_scale(m[2], z, v1);
|
||||||
@@ -459,7 +439,7 @@ glm_decompose_rs(mat4 m, mat4 r, vec3 s) {
|
|||||||
glm_vec4_scale(r[1], 1.0f/s[1], r[1]);
|
glm_vec4_scale(r[1], 1.0f/s[1], r[1]);
|
||||||
glm_vec4_scale(r[2], 1.0f/s[2], r[2]);
|
glm_vec4_scale(r[2], 1.0f/s[2], r[2]);
|
||||||
|
|
||||||
/* Note from Apple Open Source (asume that the matrix is orthonormal):
|
/* Note from Apple Open Source (assume that the matrix is orthonormal):
|
||||||
check for a coordinate system flip. If the determinant
|
check for a coordinate system flip. If the determinant
|
||||||
is -1, then negate the matrix and the scaling factors. */
|
is -1, then negate the matrix and the scaling factors. */
|
||||||
glm_vec3_cross(m[0], m[1], v);
|
glm_vec3_cross(m[0], m[1], v);
|
||||||
|
|||||||
268
include/cglm/affine2d.h
Normal file
268
include/cglm/affine2d.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
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Functions:
|
||||||
|
CGLM_INLINE void glm_translate2d(mat3 m, vec2 v)
|
||||||
|
CGLM_INLINE void glm_translate2d_to(mat3 m, vec2 v, mat3 dest)
|
||||||
|
CGLM_INLINE void glm_translate2d_x(mat3 m, float x)
|
||||||
|
CGLM_INLINE void glm_translate2d_y(mat3 m, float y)
|
||||||
|
CGLM_INLINE void glm_translate2d_make(mat3 m, vec2 v)
|
||||||
|
CGLM_INLINE void glm_scale2d_to(mat3 m, vec2 v, mat3 dest)
|
||||||
|
CGLM_INLINE void glm_scale2d_make(mat3 m, vec2 v)
|
||||||
|
CGLM_INLINE void glm_scale2d(mat3 m, vec2 v)
|
||||||
|
CGLM_INLINE void glm_scale2d_uni(mat3 m, float s)
|
||||||
|
CGLM_INLINE void glm_rotate2d_make(mat3 m, float angle)
|
||||||
|
CGLM_INLINE void glm_rotate2d(mat3 m, float angle)
|
||||||
|
CGLM_INLINE void glm_rotate2d_to(mat3 m, float angle, mat3 dest)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglm_affine2d_h
|
||||||
|
#define cglm_affine2d_h
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "util.h"
|
||||||
|
#include "vec2.h"
|
||||||
|
#include "mat3.h"
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief translate existing 2d transform matrix by v vector
|
||||||
|
* and stores result in same matrix
|
||||||
|
*
|
||||||
|
* @param[in, out] m affine transfrom
|
||||||
|
* @param[in] v translate vector [x, y]
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_translate2d(mat3 m, vec2 v) {
|
||||||
|
m[2][0] = m[0][0] * v[0] + m[1][0] * v[1] + m[2][0];
|
||||||
|
m[2][1] = m[0][1] * v[0] + m[1][1] * v[1] + m[2][1];
|
||||||
|
m[2][2] = m[0][2] * v[0] + m[1][2] * v[1] + m[2][2];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief translate existing 2d transform matrix by v vector
|
||||||
|
* and store result in dest
|
||||||
|
*
|
||||||
|
* source matrix will remain same
|
||||||
|
*
|
||||||
|
* @param[in] m affine transfrom
|
||||||
|
* @param[in] v translate vector [x, y]
|
||||||
|
* @param[out] dest translated matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_translate2d_to(mat3 m, vec2 v, mat3 dest) {
|
||||||
|
glm_mat3_copy(m, dest);
|
||||||
|
glm_translate2d(dest, v);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief translate existing 2d transform matrix by x factor
|
||||||
|
*
|
||||||
|
* @param[in, out] m affine transfrom
|
||||||
|
* @param[in] x x factor
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_translate2d_x(mat3 m, float x) {
|
||||||
|
m[2][0] = m[0][0] * x + m[2][0];
|
||||||
|
m[2][1] = m[0][1] * x + m[2][1];
|
||||||
|
m[2][2] = m[0][2] * x + m[2][2];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief translate existing 2d transform matrix by y factor
|
||||||
|
*
|
||||||
|
* @param[in, out] m affine transfrom
|
||||||
|
* @param[in] y y factor
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_translate2d_y(mat3 m, float y) {
|
||||||
|
m[2][0] = m[1][0] * y + m[2][0];
|
||||||
|
m[2][1] = m[1][1] * y + m[2][1];
|
||||||
|
m[2][2] = m[1][2] * y + m[2][2];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief creates NEW translate 2d transform matrix by v vector
|
||||||
|
*
|
||||||
|
* @param[out] m affine transfrom
|
||||||
|
* @param[in] v translate vector [x, y]
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_translate2d_make(mat3 m, vec2 v) {
|
||||||
|
glm_mat3_identity(m);
|
||||||
|
m[2][0] = v[0];
|
||||||
|
m[2][1] = v[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief scale existing 2d transform matrix by v vector
|
||||||
|
* and store result in dest
|
||||||
|
*
|
||||||
|
* @param[in] m affine transfrom
|
||||||
|
* @param[in] v scale vector [x, y]
|
||||||
|
* @param[out] dest scaled matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_scale2d_to(mat3 m, vec2 v, mat3 dest) {
|
||||||
|
dest[0][0] = m[0][0] * v[0];
|
||||||
|
dest[0][1] = m[0][1] * v[0];
|
||||||
|
dest[0][2] = m[0][2] * v[0];
|
||||||
|
|
||||||
|
dest[1][0] = m[1][0] * v[1];
|
||||||
|
dest[1][1] = m[1][1] * v[1];
|
||||||
|
dest[1][2] = m[1][2] * v[1];
|
||||||
|
|
||||||
|
dest[2][0] = m[2][0];
|
||||||
|
dest[2][1] = m[2][1];
|
||||||
|
dest[2][2] = m[2][2];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief creates NEW 2d scale matrix by v vector
|
||||||
|
*
|
||||||
|
* @param[out] m affine transfrom
|
||||||
|
* @param[in] v scale vector [x, y]
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_scale2d_make(mat3 m, vec2 v) {
|
||||||
|
glm_mat3_identity(m);
|
||||||
|
m[0][0] = v[0];
|
||||||
|
m[1][1] = v[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief scales existing 2d transform matrix by v vector
|
||||||
|
* and stores result in same matrix
|
||||||
|
*
|
||||||
|
* @param[in, out] m affine transfrom
|
||||||
|
* @param[in] v scale vector [x, y]
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_scale2d(mat3 m, vec2 v) {
|
||||||
|
m[0][0] = m[0][0] * v[0];
|
||||||
|
m[0][1] = m[0][1] * v[0];
|
||||||
|
m[0][2] = m[0][2] * v[0];
|
||||||
|
|
||||||
|
m[1][0] = m[1][0] * v[1];
|
||||||
|
m[1][1] = m[1][1] * v[1];
|
||||||
|
m[1][2] = m[1][2] * v[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief applies uniform scale to existing 2d transform matrix v = [s, s]
|
||||||
|
* and stores result in same matrix
|
||||||
|
*
|
||||||
|
* @param[in, out] m affine transfrom
|
||||||
|
* @param[in] s scale factor
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_scale2d_uni(mat3 m, float s) {
|
||||||
|
m[0][0] = m[0][0] * s;
|
||||||
|
m[0][1] = m[0][1] * s;
|
||||||
|
m[0][2] = m[0][2] * s;
|
||||||
|
|
||||||
|
m[1][0] = m[1][0] * s;
|
||||||
|
m[1][1] = m[1][1] * s;
|
||||||
|
m[1][2] = m[1][2] * s;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief creates NEW rotation matrix by angle around Z axis
|
||||||
|
*
|
||||||
|
* @param[out] m affine transfrom
|
||||||
|
* @param[in] angle angle (radians)
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_rotate2d_make(mat3 m, float angle) {
|
||||||
|
float c, s;
|
||||||
|
|
||||||
|
s = sinf(angle);
|
||||||
|
c = cosf(angle);
|
||||||
|
|
||||||
|
m[0][0] = c;
|
||||||
|
m[0][1] = s;
|
||||||
|
m[0][2] = 0;
|
||||||
|
|
||||||
|
m[1][0] = -s;
|
||||||
|
m[1][1] = c;
|
||||||
|
m[1][2] = 0;
|
||||||
|
|
||||||
|
m[2][0] = 0.0f;
|
||||||
|
m[2][1] = 0.0f;
|
||||||
|
m[2][2] = 1.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief rotate existing 2d transform matrix around Z axis by angle
|
||||||
|
* and store result in same matrix
|
||||||
|
*
|
||||||
|
* @param[in, out] m affine transfrom
|
||||||
|
* @param[in] angle angle (radians)
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_rotate2d(mat3 m, float angle) {
|
||||||
|
float m00 = m[0][0], m10 = m[1][0],
|
||||||
|
m01 = m[0][1], m11 = m[1][1],
|
||||||
|
m02 = m[0][2], m12 = m[1][2];
|
||||||
|
float c, s;
|
||||||
|
|
||||||
|
s = sinf(angle);
|
||||||
|
c = cosf(angle);
|
||||||
|
|
||||||
|
m[0][0] = m00 * c + m10 * s;
|
||||||
|
m[0][1] = m01 * c + m11 * s;
|
||||||
|
m[0][2] = m02 * c + m12 * s;
|
||||||
|
|
||||||
|
m[1][0] = m00 * -s + m10 * c;
|
||||||
|
m[1][1] = m01 * -s + m11 * c;
|
||||||
|
m[1][2] = m02 * -s + m12 * c;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief rotate existing 2d transform matrix around Z axis by angle
|
||||||
|
* and store result in dest
|
||||||
|
*
|
||||||
|
* @param[in] m affine transfrom
|
||||||
|
* @param[in] angle angle (radians)
|
||||||
|
* @param[out] dest destination
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_rotate2d_to(mat3 m, float angle, mat3 dest) {
|
||||||
|
float m00 = m[0][0], m10 = m[1][0],
|
||||||
|
m01 = m[0][1], m11 = m[1][1],
|
||||||
|
m02 = m[0][2], m12 = m[1][2];
|
||||||
|
float c, s;
|
||||||
|
|
||||||
|
s = sinf(angle);
|
||||||
|
c = cosf(angle);
|
||||||
|
|
||||||
|
dest[0][0] = m00 * c + m10 * s;
|
||||||
|
dest[0][1] = m01 * c + m11 * s;
|
||||||
|
dest[0][2] = m02 * c + m12 * s;
|
||||||
|
|
||||||
|
dest[1][0] = m00 * -s + m10 * c;
|
||||||
|
dest[1][1] = m01 * -s + m11 * c;
|
||||||
|
dest[1][2] = m02 * -s + m12 * c;
|
||||||
|
|
||||||
|
dest[2][0] = m[2][0];
|
||||||
|
dest[2][1] = m[2][1];
|
||||||
|
dest[2][2] = m[2][2];
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* cglm_affine2d_h */
|
||||||
@@ -228,6 +228,8 @@ glm_aabb_aabb(vec3 box[2], vec3 other[2]) {
|
|||||||
* https://github.com/erich666/GraphicsGems/blob/master/gems/BoxSphere.c
|
* https://github.com/erich666/GraphicsGems/blob/master/gems/BoxSphere.c
|
||||||
* Solid Box - Solid Sphere test.
|
* Solid Box - Solid Sphere test.
|
||||||
*
|
*
|
||||||
|
* Sphere Representation in cglm: [center.x, center.y, center.z, radii]
|
||||||
|
*
|
||||||
* @param[in] box solid bounding box
|
* @param[in] box solid bounding box
|
||||||
* @param[in] s solid sphere
|
* @param[in] s solid sphere
|
||||||
*/
|
*/
|
||||||
@@ -237,13 +239,13 @@ glm_aabb_sphere(vec3 box[2], vec4 s) {
|
|||||||
float dmin;
|
float dmin;
|
||||||
int a, b, c;
|
int a, b, c;
|
||||||
|
|
||||||
a = s[0] >= box[0][0];
|
a = (s[0] < box[0][0]) + (s[0] > box[1][0]);
|
||||||
b = s[1] >= box[0][1];
|
b = (s[1] < box[0][1]) + (s[1] > box[1][1]);
|
||||||
c = s[2] >= box[0][2];
|
c = (s[2] < box[0][2]) + (s[2] > box[1][2]);
|
||||||
|
|
||||||
dmin = glm_pow2(s[0] - box[a][0])
|
dmin = glm_pow2((s[0] - box[!(a - 1)][0]) * (a != 0))
|
||||||
+ glm_pow2(s[1] - box[b][1])
|
+ glm_pow2((s[1] - box[!(b - 1)][1]) * (b != 0))
|
||||||
+ glm_pow2(s[2] - box[c][2]);
|
+ glm_pow2((s[2] - box[!(c - 1)][2]) * (c != 0));
|
||||||
|
|
||||||
return dmin <= glm_pow2(s[3]);
|
return dmin <= glm_pow2(s[3]);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,10 +12,12 @@ extern "C" {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "cglm.h"
|
#include "cglm.h"
|
||||||
|
#include "call/vec2.h"
|
||||||
#include "call/vec3.h"
|
#include "call/vec3.h"
|
||||||
#include "call/vec4.h"
|
#include "call/vec4.h"
|
||||||
#include "call/mat4.h"
|
#include "call/mat2.h"
|
||||||
#include "call/mat3.h"
|
#include "call/mat3.h"
|
||||||
|
#include "call/mat4.h"
|
||||||
#include "call/affine.h"
|
#include "call/affine.h"
|
||||||
#include "call/cam.h"
|
#include "call/cam.h"
|
||||||
#include "call/quat.h"
|
#include "call/quat.h"
|
||||||
@@ -29,6 +31,8 @@ extern "C" {
|
|||||||
#include "call/ease.h"
|
#include "call/ease.h"
|
||||||
#include "call/curve.h"
|
#include "call/curve.h"
|
||||||
#include "call/bezier.h"
|
#include "call/bezier.h"
|
||||||
|
#include "call/ray.h"
|
||||||
|
#include "call/affine2d.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|||||||
67
include/cglm/call/affine2d.h
Normal file
67
include/cglm/call/affine2d.h
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglmc_affine2d_h
|
||||||
|
#define cglmc_affine2d_h
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "../cglm.h"
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_translate2d_make(mat3 m, vec2 v);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_translate2d_to(mat3 m, vec2 v, mat3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_translate2d(mat3 m, vec2 v);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_translate2d_x(mat3 m, float to);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_translate2d_y(mat3 m, float to);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_scale2d_to(mat3 m, vec2 v, mat3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_scale2d_make(mat3 m, vec2 v);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_scale2d(mat3 m, vec2 v);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_scale2d_uni(mat3 m, float s);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_rotate2d_make(mat3 m, float angle);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_rotate2d(mat3 m, float angle);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_rotate2d_to(mat3 m, float angle, mat3 dest);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* cglmc_affine2d_h */
|
||||||
@@ -15,23 +15,17 @@ extern "C" {
|
|||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_frustum(float left,
|
glmc_frustum(float left, float right,
|
||||||
float right,
|
float bottom, float top,
|
||||||
float bottom,
|
float nearZ, float farZ,
|
||||||
float top,
|
mat4 dest);
|
||||||
float nearVal,
|
|
||||||
float farVal,
|
|
||||||
mat4 dest);
|
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_ortho(float left,
|
glmc_ortho(float left, float right,
|
||||||
float right,
|
float bottom, float top,
|
||||||
float bottom,
|
float nearZ, float farZ,
|
||||||
float top,
|
mat4 dest);
|
||||||
float nearVal,
|
|
||||||
float farVal,
|
|
||||||
mat4 dest);
|
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
@@ -55,11 +49,7 @@ glmc_ortho_default_s(float aspect, float size, mat4 dest);
|
|||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_perspective(float fovy,
|
glmc_perspective(float fovy, float aspect, float nearZ, float farZ, mat4 dest);
|
||||||
float aspect,
|
|
||||||
float nearVal,
|
|
||||||
float farVal,
|
|
||||||
mat4 dest);
|
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
@@ -88,8 +78,8 @@ glmc_look_anyup(vec3 eye, vec3 dir, mat4 dest);
|
|||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_persp_decomp(mat4 proj,
|
glmc_persp_decomp(mat4 proj,
|
||||||
float * __restrict nearVal,
|
float * __restrict nearZ,
|
||||||
float * __restrict farVal,
|
float * __restrict farZ,
|
||||||
float * __restrict top,
|
float * __restrict top,
|
||||||
float * __restrict bottom,
|
float * __restrict bottom,
|
||||||
float * __restrict left,
|
float * __restrict left,
|
||||||
@@ -114,16 +104,16 @@ glmc_persp_decomp_y(mat4 proj,
|
|||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_persp_decomp_z(mat4 proj,
|
glmc_persp_decomp_z(mat4 proj,
|
||||||
float * __restrict nearVal,
|
float * __restrict nearZ,
|
||||||
float * __restrict farVal);
|
float * __restrict farZ);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_persp_decomp_far(mat4 proj, float * __restrict farVal);
|
glmc_persp_decomp_far(mat4 proj, float * __restrict farZ);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_persp_decomp_near(mat4 proj, float * __restrict nearVal);
|
glmc_persp_decomp_near(mat4 proj, float * __restrict nearZ);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
float
|
float
|
||||||
|
|||||||
46
include/cglm/call/clipspace/ortho_lh_no.h
Normal file
46
include/cglm/call/clipspace/ortho_lh_no.h
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglmc_ortho_lh_no_h
|
||||||
|
#define cglmc_ortho_lh_no_h
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "../../cglm.h"
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_ortho_lh_no(float left, float right,
|
||||||
|
float bottom, float top,
|
||||||
|
float nearZ, float farZ,
|
||||||
|
mat4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_ortho_aabb_lh_no(vec3 box[2], mat4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_ortho_aabb_p_lh_no(vec3 box[2], float padding, mat4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_ortho_aabb_pz_lh_no(vec3 box[2], float padding, mat4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_ortho_default_lh_no(float aspect, mat4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_ortho_default_s_lh_no(float aspect, float size, mat4 dest);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* cglmc_ortho_lh_no_h */
|
||||||
46
include/cglm/call/clipspace/ortho_lh_zo.h
Normal file
46
include/cglm/call/clipspace/ortho_lh_zo.h
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglmc_ortho_lh_zo_h
|
||||||
|
#define cglmc_ortho_lh_zo_h
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "../../cglm.h"
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_ortho_lh_zo(float left, float right,
|
||||||
|
float bottom, float top,
|
||||||
|
float nearZ, float farZ,
|
||||||
|
mat4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_ortho_aabb_lh_zo(vec3 box[2], mat4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_ortho_aabb_p_lh_zo(vec3 box[2], float padding, mat4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_ortho_aabb_pz_lh_zo(vec3 box[2], float padding, mat4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_ortho_default_lh_zo(float aspect, mat4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_ortho_default_s_lh_zo(float aspect, float size, mat4 dest);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* cglmc_ortho_lh_zo_h */
|
||||||
46
include/cglm/call/clipspace/ortho_rh_no.h
Normal file
46
include/cglm/call/clipspace/ortho_rh_no.h
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglmc_ortho_rh_no_h
|
||||||
|
#define cglmc_ortho_rh_no_h
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "../../cglm.h"
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_ortho_rh_no(float left, float right,
|
||||||
|
float bottom, float top,
|
||||||
|
float nearZ, float farZ,
|
||||||
|
mat4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_ortho_aabb_rh_no(vec3 box[2], mat4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_ortho_aabb_p_rh_no(vec3 box[2], float padding, mat4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_ortho_aabb_pz_rh_no(vec3 box[2], float padding, mat4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_ortho_default_rh_no(float aspect, mat4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_ortho_default_s_rh_no(float aspect, float size, mat4 dest);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* cglmc_ortho_rh_no_h */
|
||||||
46
include/cglm/call/clipspace/ortho_rh_zo.h
Normal file
46
include/cglm/call/clipspace/ortho_rh_zo.h
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglmc_ortho_rh_zo_h
|
||||||
|
#define cglmc_ortho_rh_zo_h
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "../../cglm.h"
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_ortho_rh_zo(float left, float right,
|
||||||
|
float bottom, float top,
|
||||||
|
float nearZ, float farZ,
|
||||||
|
mat4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_ortho_aabb_rh_zo(vec3 box[2], mat4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_ortho_aabb_p_rh_zo(vec3 box[2], float padding, mat4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_ortho_aabb_pz_rh_zo(vec3 box[2], float padding, mat4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_ortho_default_rh_zo(float aspect, mat4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_ortho_default_s_rh_zo(float aspect, float size, mat4 dest);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* cglmc_ortho_rh_zo_h */
|
||||||
87
include/cglm/call/clipspace/persp_lh_no.h
Normal file
87
include/cglm/call/clipspace/persp_lh_no.h
Normal file
@@ -0,0 +1,87 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglmc_persp_lh_no_h
|
||||||
|
#define cglmc_persp_lh_no_h
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "../../cglm.h"
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_frustum_lh_no(float left, float right,
|
||||||
|
float bottom, float top,
|
||||||
|
float nearZ, float farZ,
|
||||||
|
mat4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_perspective_lh_no(float fovy,
|
||||||
|
float aspect,
|
||||||
|
float nearVal,
|
||||||
|
float farVal,
|
||||||
|
mat4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_persp_move_far_lh_no(mat4 proj, float deltaFar);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_persp_decomp_lh_no(mat4 proj,
|
||||||
|
float * __restrict nearZ, float * __restrict farZ,
|
||||||
|
float * __restrict top, float * __restrict bottom,
|
||||||
|
float * __restrict left, float * __restrict right);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_persp_decompv_lh_no(mat4 proj, float dest[6]);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_persp_decomp_x_lh_no(mat4 proj,
|
||||||
|
float * __restrict left,
|
||||||
|
float * __restrict right);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_persp_decomp_y_lh_no(mat4 proj,
|
||||||
|
float * __restrict top,
|
||||||
|
float * __restrict bottom);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_persp_decomp_z_lh_no(mat4 proj,
|
||||||
|
float * __restrict nearZ,
|
||||||
|
float * __restrict farZ);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_persp_decomp_far_lh_no(mat4 proj, float * __restrict farZ);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_persp_decomp_near_lh_no(mat4 proj, float * __restrict nearZ);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_persp_sizes_lh_no(mat4 proj, float fovy, vec4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_persp_fovy_lh_no(mat4 proj);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_persp_aspect_lh_no(mat4 proj);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* cglmc_persp_lh_no_h */
|
||||||
87
include/cglm/call/clipspace/persp_lh_zo.h
Normal file
87
include/cglm/call/clipspace/persp_lh_zo.h
Normal file
@@ -0,0 +1,87 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglmc_persp_lh_zo_h
|
||||||
|
#define cglmc_persp_lh_zo_h
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "../../cglm.h"
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_frustum_lh_zo(float left, float right,
|
||||||
|
float bottom, float top,
|
||||||
|
float nearZ, float farZ,
|
||||||
|
mat4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_perspective_lh_zo(float fovy,
|
||||||
|
float aspect,
|
||||||
|
float nearVal,
|
||||||
|
float farVal,
|
||||||
|
mat4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_persp_move_far_lh_zo(mat4 proj, float deltaFar);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_persp_decomp_lh_zo(mat4 proj,
|
||||||
|
float * __restrict nearZ, float * __restrict farZ,
|
||||||
|
float * __restrict top, float * __restrict bottom,
|
||||||
|
float * __restrict left, float * __restrict right);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_persp_decompv_lh_zo(mat4 proj, float dest[6]);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_persp_decomp_x_lh_zo(mat4 proj,
|
||||||
|
float * __restrict left,
|
||||||
|
float * __restrict right);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_persp_decomp_y_lh_zo(mat4 proj,
|
||||||
|
float * __restrict top,
|
||||||
|
float * __restrict bottom);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_persp_decomp_z_lh_zo(mat4 proj,
|
||||||
|
float * __restrict nearZ,
|
||||||
|
float * __restrict farZ);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_persp_decomp_far_lh_zo(mat4 proj, float * __restrict farZ);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_persp_decomp_near_lh_zo(mat4 proj, float * __restrict nearZ);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_persp_sizes_lh_zo(mat4 proj, float fovy, vec4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_persp_fovy_lh_zo(mat4 proj);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_persp_aspect_lh_zo(mat4 proj);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* cglmc_persp_lh_zo_h */
|
||||||
87
include/cglm/call/clipspace/persp_rh_no.h
Normal file
87
include/cglm/call/clipspace/persp_rh_no.h
Normal file
@@ -0,0 +1,87 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglmc_persp_rh_no_h
|
||||||
|
#define cglmc_persp_rh_no_h
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "../../cglm.h"
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_frustum_rh_no(float left, float right,
|
||||||
|
float bottom, float top,
|
||||||
|
float nearZ, float farZ,
|
||||||
|
mat4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_perspective_rh_no(float fovy,
|
||||||
|
float aspect,
|
||||||
|
float nearVal,
|
||||||
|
float farVal,
|
||||||
|
mat4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_persp_move_far_rh_no(mat4 proj, float deltaFar);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_persp_decomp_rh_no(mat4 proj,
|
||||||
|
float * __restrict nearZ, float * __restrict farZ,
|
||||||
|
float * __restrict top, float * __restrict bottom,
|
||||||
|
float * __restrict left, float * __restrict right);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_persp_decompv_rh_no(mat4 proj, float dest[6]);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_persp_decomp_x_rh_no(mat4 proj,
|
||||||
|
float * __restrict left,
|
||||||
|
float * __restrict right);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_persp_decomp_y_rh_no(mat4 proj,
|
||||||
|
float * __restrict top,
|
||||||
|
float * __restrict bottom);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_persp_decomp_z_rh_no(mat4 proj,
|
||||||
|
float * __restrict nearZ,
|
||||||
|
float * __restrict farZ);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_persp_decomp_far_rh_no(mat4 proj, float * __restrict farZ);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_persp_decomp_near_rh_no(mat4 proj, float * __restrict nearZ);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_persp_sizes_rh_no(mat4 proj, float fovy, vec4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_persp_fovy_rh_no(mat4 proj);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_persp_aspect_rh_no(mat4 proj);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* cglmc_persp_rh_no_h */
|
||||||
87
include/cglm/call/clipspace/persp_rh_zo.h
Normal file
87
include/cglm/call/clipspace/persp_rh_zo.h
Normal file
@@ -0,0 +1,87 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglmc_persp_rh_zo_h
|
||||||
|
#define cglmc_persp_rh_zo_h
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "../../cglm.h"
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_frustum_rh_zo(float left, float right,
|
||||||
|
float bottom, float top,
|
||||||
|
float nearZ, float farZ,
|
||||||
|
mat4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_perspective_rh_zo(float fovy,
|
||||||
|
float aspect,
|
||||||
|
float nearVal,
|
||||||
|
float farVal,
|
||||||
|
mat4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_persp_move_far_rh_zo(mat4 proj, float deltaFar);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_persp_decomp_rh_zo(mat4 proj,
|
||||||
|
float * __restrict nearZ, float * __restrict farZ,
|
||||||
|
float * __restrict top, float * __restrict bottom,
|
||||||
|
float * __restrict left, float * __restrict right);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_persp_decompv_rh_zo(mat4 proj, float dest[6]);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_persp_decomp_x_rh_zo(mat4 proj,
|
||||||
|
float * __restrict left,
|
||||||
|
float * __restrict right);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_persp_decomp_y_rh_zo(mat4 proj,
|
||||||
|
float * __restrict top,
|
||||||
|
float * __restrict bottom);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_persp_decomp_z_rh_zo(mat4 proj,
|
||||||
|
float * __restrict nearZ,
|
||||||
|
float * __restrict farZ);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_persp_decomp_far_rh_zo(mat4 proj, float * __restrict farZ);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_persp_decomp_near_rh_zo(mat4 proj, float * __restrict nearZ);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_persp_sizes_rh_zo(mat4 proj, float fovy, vec4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_persp_fovy_rh_zo(mat4 proj);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_persp_aspect_rh_zo(mat4 proj);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* cglmc_persp_rh_zo_h */
|
||||||
27
include/cglm/call/clipspace/project_no.h
Normal file
27
include/cglm/call/clipspace/project_no.h
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglmc_project_no_h
|
||||||
|
#define cglmc_project_no_h
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "../../cglm.h"
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_unprojecti_no(vec3 pos, mat4 invMat, vec4 vp, vec3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_project_no(vec3 pos, mat4 m, vec4 vp, vec3 dest);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* cglmc_project_no_h */
|
||||||
27
include/cglm/call/clipspace/project_zo.h
Normal file
27
include/cglm/call/clipspace/project_zo.h
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglmc_project_zo_h
|
||||||
|
#define cglmc_project_zo_h
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "../../cglm.h"
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_unprojecti_zo(vec3 pos, mat4 invMat, vec4 vp, vec3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_project_zo(vec3 pos, mat4 m, vec4 vp, vec3 dest);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* cglmc_project_zo_h */
|
||||||
31
include/cglm/call/clipspace/view_lh_no.h
Normal file
31
include/cglm/call/clipspace/view_lh_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_view_lh_no_h
|
||||||
|
#define cglmc_view_lh_no_h
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "../../cglm.h"
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_lookat_lh_no(vec3 eye, vec3 center, vec3 up, mat4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_look_lh_no(vec3 eye, vec3 dir, vec3 up, mat4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_look_anyup_lh_no(vec3 eye, vec3 dir, mat4 dest);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* cglmc_view_lh_no_h */
|
||||||
31
include/cglm/call/clipspace/view_lh_zo.h
Normal file
31
include/cglm/call/clipspace/view_lh_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_view_lh_zo_h
|
||||||
|
#define cglmc_view_lh_zo_h
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "../../cglm.h"
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_lookat_lh_zo(vec3 eye, vec3 center, vec3 up, mat4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_look_lh_zo(vec3 eye, vec3 dir, vec3 up, mat4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_look_anyup_lh_zo(vec3 eye, vec3 dir, mat4 dest);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* cglmc_view_lh_zo_h */
|
||||||
31
include/cglm/call/clipspace/view_rh_no.h
Normal file
31
include/cglm/call/clipspace/view_rh_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_view_rh_no_h
|
||||||
|
#define cglmc_view_rh_no_h
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "../../cglm.h"
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_lookat_rh_no(vec3 eye, vec3 center, vec3 up, mat4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_look_rh_no(vec3 eye, vec3 dir, vec3 up, mat4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_look_anyup_rh_no(vec3 eye, vec3 dir, mat4 dest);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* cglmc_view_rh_no_h */
|
||||||
31
include/cglm/call/clipspace/view_rh_zo.h
Normal file
31
include/cglm/call/clipspace/view_rh_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_view_rh_zo_h
|
||||||
|
#define cglmc_view_rh_zo_h
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "../../cglm.h"
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_lookat_rh_zo(vec3 eye, vec3 center, vec3 up, mat4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_look_rh_zo(vec3 eye, vec3 dir, vec3 up, mat4 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_look_anyup_rh_zo(vec3 eye, vec3 dir, mat4 dest);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* cglmc_view_rh_zo_h */
|
||||||
@@ -7,6 +7,7 @@
|
|||||||
|
|
||||||
#ifndef cglmc_io_h
|
#ifndef cglmc_io_h
|
||||||
#define cglmc_io_h
|
#define cglmc_io_h
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
79
include/cglm/call/mat2.h
Normal file
79
include/cglm/call/mat2.h
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglmc_mat2_h
|
||||||
|
#define cglmc_mat2_h
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "../cglm.h"
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat2_copy(mat2 mat, mat2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat2_identity(mat2 mat);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat2_identity_array(mat2 * __restrict mat, size_t count);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat2_zero(mat2 mat);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat2_mul(mat2 m1, mat2 m2, mat2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat2_transpose_to(mat2 m, mat2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat2_transpose(mat2 m);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat2_mulv(mat2 m, vec2 v, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_mat2_trace(mat2 m);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat2_scale(mat2 m, float s);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_mat2_det(mat2 mat);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat2_inv(mat2 mat, mat2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat2_swap_col(mat2 mat, int col1, int col2);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_mat2_swap_row(mat2 mat, int row1, int row2);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_mat2_rmc(vec2 r, mat2 m, vec2 c);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* cglmc_mat2_h */
|
||||||
@@ -25,6 +25,10 @@ CGLM_EXPORT
|
|||||||
void
|
void
|
||||||
glmc_project(vec3 pos, mat4 m, vec4 vp, vec3 dest);
|
glmc_project(vec3 pos, mat4 m, vec4 vp, vec3 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_pickmatrix(vec2 center, vec2 size, vec4 vp, mat4 dest);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -37,6 +37,10 @@ CGLM_EXPORT
|
|||||||
void
|
void
|
||||||
glmc_quat_copy(versor q, versor dest);
|
glmc_quat_copy(versor q, versor dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_quat_from_vecs(vec3 a, vec3 b, versor dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
float
|
float
|
||||||
glmc_quat_norm(versor q);
|
glmc_quat_norm(versor q);
|
||||||
@@ -116,11 +120,15 @@ glmc_quat_mat3t(versor q, mat3 dest);
|
|||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_quat_lerp(versor from, versor to, float t, versor dest);
|
glmc_quat_lerp(versor from, versor to, float t, versor dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_quat_lerpc(versor from, versor to, float t, versor dest);
|
glmc_quat_lerpc(versor from, versor to, float t, versor dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_quat_nlerp(versor q, versor r, float t, versor dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_quat_slerp(versor q, versor r, float t, versor dest);
|
glmc_quat_slerp(versor q, versor r, float t, versor dest);
|
||||||
@@ -131,11 +139,11 @@ glmc_quat_look(vec3 eye, versor ori, mat4 dest);
|
|||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_quat_for(vec3 dir, vec3 fwd, vec3 up, versor dest);
|
glmc_quat_for(vec3 dir, vec3 up, versor dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_quat_forp(vec3 from, vec3 to, vec3 fwd, vec3 up, versor dest);
|
glmc_quat_forp(vec3 from, vec3 to, vec3 up, versor dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
|
|||||||
27
include/cglm/call/ray.h
Normal file
27
include/cglm/call/ray.h
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglmc_ray_h
|
||||||
|
#define cglmc_ray_h
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
#include "../cglm.h"
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
bool
|
||||||
|
glmc_ray_triangle(vec3 origin,
|
||||||
|
vec3 direction,
|
||||||
|
vec3 v0,
|
||||||
|
vec3 v1,
|
||||||
|
vec3 v2,
|
||||||
|
float *d);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* cglmc_ray_h */
|
||||||
167
include/cglm/call/vec2.h
Normal file
167
include/cglm/call/vec2.h
Normal file
@@ -0,0 +1,167 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglmc_vec2_h
|
||||||
|
#define cglmc_vec2_h
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "../cglm.h"
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2(float * __restrict v, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_copy(vec2 a, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_zero(vec2 v);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_one(vec2 v);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_vec2_dot(vec2 a, vec2 b);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_vec2_cross(vec2 a, vec2 b);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_vec2_norm2(vec2 v);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_vec2_norm(vec2 v);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_add(vec2 a, vec2 b, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_adds(vec2 v, float s, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_sub(vec2 a, vec2 b, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_subs(vec2 v, float s, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_mul(vec2 a, vec2 b, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_scale(vec2 v, float s, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_scale_as(vec2 v, float s, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_div(vec2 a, vec2 b, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_divs(vec2 v, float s, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_addadd(vec2 a, vec2 b, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_subadd(vec2 a, vec2 b, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_muladd(vec2 a, vec2 b, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_muladds(vec2 a, float s, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_maxadd(vec2 a, vec2 b, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_minadd(vec2 a, vec2 b, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_negate_to(vec2 v, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_negate(vec2 v);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_normalize(vec2 v);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_normalize_to(vec2 v, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_rotate(vec2 v, float angle, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_vec2_distance2(vec2 a, vec2 b);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
float
|
||||||
|
glmc_vec2_distance(vec2 a, vec2 b);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_maxv(vec2 a, vec2 b, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_minv(vec2 a, vec2 b, vec2 dest);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_clamp(vec2 v, float minval, float maxval);
|
||||||
|
|
||||||
|
CGLM_EXPORT
|
||||||
|
void
|
||||||
|
glmc_vec2_lerp(vec2 from, vec2 to, float t, vec2 dest);
|
||||||
|
|
||||||
|
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
|
||||||
|
#endif /* cglmc_vec2_h */
|
||||||
@@ -99,7 +99,7 @@ glmc_vec4_scale(vec4 v, float s, vec4 dest);
|
|||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec4_scale_as(vec3 v, float s, vec3 dest);
|
glmc_vec4_scale_as(vec4 v, float s, vec4 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
|
|||||||
@@ -7,13 +7,13 @@
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
Functions:
|
Functions:
|
||||||
CGLM_INLINE void glm_frustum(float left, float right,
|
CGLM_INLINE void glm_frustum(float left, float right,
|
||||||
float bottom, float top,
|
float bottom, float top,
|
||||||
float nearVal, float farVal,
|
float nearZ, float farZ,
|
||||||
mat4 dest)
|
mat4 dest)
|
||||||
CGLM_INLINE void glm_ortho(float left, float right,
|
CGLM_INLINE void glm_ortho(float left, float right,
|
||||||
float bottom, float top,
|
float bottom, float top,
|
||||||
float nearVal, float farVal,
|
float nearZ, float farZ,
|
||||||
mat4 dest)
|
mat4 dest)
|
||||||
CGLM_INLINE void glm_ortho_aabb(vec3 box[2], mat4 dest)
|
CGLM_INLINE void glm_ortho_aabb(vec3 box[2], mat4 dest)
|
||||||
CGLM_INLINE void glm_ortho_aabb_p(vec3 box[2], float padding, mat4 dest)
|
CGLM_INLINE void glm_ortho_aabb_p(vec3 box[2], float padding, mat4 dest)
|
||||||
@@ -22,8 +22,8 @@
|
|||||||
CGLM_INLINE void glm_ortho_default_s(float aspect, float size, mat4 dest)
|
CGLM_INLINE void glm_ortho_default_s(float aspect, float size, mat4 dest)
|
||||||
CGLM_INLINE void glm_perspective(float fovy,
|
CGLM_INLINE void glm_perspective(float fovy,
|
||||||
float aspect,
|
float aspect,
|
||||||
float nearVal,
|
float nearZ,
|
||||||
float farVal,
|
float farZ,
|
||||||
mat4 dest)
|
mat4 dest)
|
||||||
CGLM_INLINE void glm_perspective_default(float aspect, mat4 dest)
|
CGLM_INLINE void glm_perspective_default(float aspect, mat4 dest)
|
||||||
CGLM_INLINE void glm_perspective_resize(float aspect, mat4 proj)
|
CGLM_INLINE void glm_perspective_resize(float aspect, mat4 proj)
|
||||||
@@ -31,26 +31,61 @@
|
|||||||
CGLM_INLINE void glm_look(vec3 eye, vec3 dir, vec3 up, mat4 dest)
|
CGLM_INLINE void glm_look(vec3 eye, vec3 dir, vec3 up, mat4 dest)
|
||||||
CGLM_INLINE void glm_look_anyup(vec3 eye, vec3 dir, mat4 dest)
|
CGLM_INLINE void glm_look_anyup(vec3 eye, vec3 dir, mat4 dest)
|
||||||
CGLM_INLINE void glm_persp_decomp(mat4 proj,
|
CGLM_INLINE void glm_persp_decomp(mat4 proj,
|
||||||
float *nearVal, float *farVal,
|
float *nearZ, float *farZ,
|
||||||
float *top, float *bottom,
|
float *top, float *bottom,
|
||||||
float *left, float *right)
|
float *left, float *right)
|
||||||
CGLM_INLINE void glm_persp_decompv(mat4 proj, float dest[6])
|
CGLM_INLINE void glm_persp_decompv(mat4 proj, float dest[6])
|
||||||
CGLM_INLINE void glm_persp_decomp_x(mat4 proj, float *left, float *right)
|
CGLM_INLINE void glm_persp_decomp_x(mat4 proj, float *left, float *right)
|
||||||
CGLM_INLINE void glm_persp_decomp_y(mat4 proj, float *top, float *bottom)
|
CGLM_INLINE void glm_persp_decomp_y(mat4 proj, float *top, float *bottom)
|
||||||
CGLM_INLINE void glm_persp_decomp_z(mat4 proj, float *nearv, float *farv)
|
CGLM_INLINE void glm_persp_decomp_z(mat4 proj, float *nearv, float *farv)
|
||||||
CGLM_INLINE void glm_persp_decomp_far(mat4 proj, float *farVal)
|
CGLM_INLINE void glm_persp_decomp_far(mat4 proj, float *farZ)
|
||||||
CGLM_INLINE void glm_persp_decomp_near(mat4 proj, float *nearVal)
|
CGLM_INLINE void glm_persp_decomp_near(mat4 proj, float *nearZ)
|
||||||
CGLM_INLINE float glm_persp_fovy(mat4 proj)
|
CGLM_INLINE float glm_persp_fovy(mat4 proj)
|
||||||
CGLM_INLINE float glm_persp_aspect(mat4 proj)
|
CGLM_INLINE float glm_persp_aspect(mat4 proj)
|
||||||
CGLM_INLINE void glm_persp_sizes(mat4 proj, float fovy, vec4 dest)
|
CGLM_INLINE void glm_persp_sizes(mat4 proj, float fovy, vec4 dest)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef cglm_vcam_h
|
#ifndef cglm_cam_h
|
||||||
#define cglm_vcam_h
|
#define cglm_cam_h
|
||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "plane.h"
|
#include "plane.h"
|
||||||
|
|
||||||
|
#include "clipspace/persp.h"
|
||||||
|
|
||||||
|
#ifndef CGLM_CLIPSPACE_INCLUDE_ALL
|
||||||
|
# if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
|
||||||
|
# include "clipspace/ortho_lh_zo.h"
|
||||||
|
# include "clipspace/persp_lh_zo.h"
|
||||||
|
# include "clipspace/view_lh_zo.h"
|
||||||
|
# elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
|
||||||
|
# include "clipspace/ortho_lh_no.h"
|
||||||
|
# include "clipspace/persp_lh_no.h"
|
||||||
|
# include "clipspace/view_lh_no.h"
|
||||||
|
# elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
|
||||||
|
# include "clipspace/ortho_rh_zo.h"
|
||||||
|
# include "clipspace/persp_rh_zo.h"
|
||||||
|
# include "clipspace/view_rh_zo.h"
|
||||||
|
# elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
|
||||||
|
# include "clipspace/ortho_rh_no.h"
|
||||||
|
# include "clipspace/persp_rh_no.h"
|
||||||
|
# include "clipspace/view_rh_no.h"
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
# include "clipspace/ortho_lh_zo.h"
|
||||||
|
# include "clipspace/persp_lh_zo.h"
|
||||||
|
# include "clipspace/ortho_lh_no.h"
|
||||||
|
# include "clipspace/persp_lh_no.h"
|
||||||
|
# include "clipspace/ortho_rh_zo.h"
|
||||||
|
# include "clipspace/persp_rh_zo.h"
|
||||||
|
# include "clipspace/ortho_rh_no.h"
|
||||||
|
# include "clipspace/persp_rh_no.h"
|
||||||
|
# include "clipspace/view_lh_zo.h"
|
||||||
|
# include "clipspace/view_lh_no.h"
|
||||||
|
# include "clipspace/view_rh_zo.h"
|
||||||
|
# include "clipspace/view_rh_no.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief set up perspective peprojection matrix
|
* @brief set up perspective peprojection matrix
|
||||||
*
|
*
|
||||||
@@ -58,32 +93,25 @@
|
|||||||
* @param[in] right viewport.right
|
* @param[in] right viewport.right
|
||||||
* @param[in] bottom viewport.bottom
|
* @param[in] bottom viewport.bottom
|
||||||
* @param[in] top viewport.top
|
* @param[in] top viewport.top
|
||||||
* @param[in] nearVal near clipping plane
|
* @param[in] nearZ near clipping plane
|
||||||
* @param[in] farVal far clipping plane
|
* @param[in] farZ far clipping plane
|
||||||
* @param[out] dest result matrix
|
* @param[out] dest result matrix
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_frustum(float left, float right,
|
glm_frustum(float left, float right,
|
||||||
float bottom, float top,
|
float bottom, float top,
|
||||||
float nearVal, float farVal,
|
float nearZ, float farZ,
|
||||||
mat4 dest) {
|
mat4 dest) {
|
||||||
float rl, tb, fn, nv;
|
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
|
||||||
|
glm_frustum_lh_zo(left, right, bottom, top, nearZ, farZ, dest);
|
||||||
glm_mat4_zero(dest);
|
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
|
||||||
|
glm_frustum_lh_no(left, right, bottom, top, nearZ, farZ, dest);
|
||||||
rl = 1.0f / (right - left);
|
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
|
||||||
tb = 1.0f / (top - bottom);
|
glm_frustum_rh_zo(left, right, bottom, top, nearZ, farZ, dest);
|
||||||
fn =-1.0f / (farVal - nearVal);
|
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
|
||||||
nv = 2.0f * nearVal;
|
glm_frustum_rh_no(left, right, bottom, top, nearZ, farZ, dest);
|
||||||
|
#endif
|
||||||
dest[0][0] = nv * rl;
|
|
||||||
dest[1][1] = nv * tb;
|
|
||||||
dest[2][0] = (right + left) * rl;
|
|
||||||
dest[2][1] = (top + bottom) * tb;
|
|
||||||
dest[2][2] = (farVal + nearVal) * fn;
|
|
||||||
dest[2][3] =-1.0f;
|
|
||||||
dest[3][2] = farVal * nv * fn;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -93,31 +121,25 @@ glm_frustum(float left, float right,
|
|||||||
* @param[in] right viewport.right
|
* @param[in] right viewport.right
|
||||||
* @param[in] bottom viewport.bottom
|
* @param[in] bottom viewport.bottom
|
||||||
* @param[in] top viewport.top
|
* @param[in] top viewport.top
|
||||||
* @param[in] nearVal near clipping plane
|
* @param[in] nearZ near clipping plane
|
||||||
* @param[in] farVal far clipping plane
|
* @param[in] farZ far clipping plane
|
||||||
* @param[out] dest result matrix
|
* @param[out] dest result matrix
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_ortho(float left, float right,
|
glm_ortho(float left, float right,
|
||||||
float bottom, float top,
|
float bottom, float top,
|
||||||
float nearVal, float farVal,
|
float nearZ, float farZ,
|
||||||
mat4 dest) {
|
mat4 dest) {
|
||||||
float rl, tb, fn;
|
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
|
||||||
|
glm_ortho_lh_zo(left, right, bottom, top, nearZ, farZ, dest);
|
||||||
glm_mat4_zero(dest);
|
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
|
||||||
|
glm_ortho_lh_no(left, right, bottom, top, nearZ, farZ, dest);
|
||||||
rl = 1.0f / (right - left);
|
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
|
||||||
tb = 1.0f / (top - bottom);
|
glm_ortho_rh_zo(left, right, bottom, top, nearZ, farZ, dest);
|
||||||
fn =-1.0f / (farVal - nearVal);
|
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
|
||||||
|
glm_ortho_rh_no(left, right, bottom, top, nearZ, farZ, dest);
|
||||||
dest[0][0] = 2.0f * rl;
|
#endif
|
||||||
dest[1][1] = 2.0f * tb;
|
|
||||||
dest[2][2] = 2.0f * fn;
|
|
||||||
dest[3][0] =-(right + left) * rl;
|
|
||||||
dest[3][1] =-(top + bottom) * tb;
|
|
||||||
dest[3][2] = (farVal + nearVal) * fn;
|
|
||||||
dest[3][3] = 1.0f;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -131,10 +153,15 @@ glm_ortho(float left, float right,
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_ortho_aabb(vec3 box[2], mat4 dest) {
|
glm_ortho_aabb(vec3 box[2], mat4 dest) {
|
||||||
glm_ortho(box[0][0], box[1][0],
|
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
|
||||||
box[0][1], box[1][1],
|
glm_ortho_aabb_lh_zo(box, dest);
|
||||||
-box[1][2], -box[0][2],
|
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
|
||||||
dest);
|
glm_ortho_aabb_lh_no(box, dest);
|
||||||
|
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
|
||||||
|
glm_ortho_aabb_rh_zo(box, dest);
|
||||||
|
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
|
||||||
|
glm_ortho_aabb_rh_no(box, dest);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -149,10 +176,15 @@ glm_ortho_aabb(vec3 box[2], mat4 dest) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_ortho_aabb_p(vec3 box[2], float padding, mat4 dest) {
|
glm_ortho_aabb_p(vec3 box[2], float padding, mat4 dest) {
|
||||||
glm_ortho(box[0][0] - padding, box[1][0] + padding,
|
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
|
||||||
box[0][1] - padding, box[1][1] + padding,
|
glm_ortho_aabb_p_lh_zo(box, padding, dest);
|
||||||
-(box[1][2] + padding), -(box[0][2] - padding),
|
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
|
||||||
dest);
|
glm_ortho_aabb_p_lh_no(box, padding, dest);
|
||||||
|
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
|
||||||
|
glm_ortho_aabb_p_rh_zo(box, padding, dest);
|
||||||
|
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
|
||||||
|
glm_ortho_aabb_p_rh_no(box, padding, dest);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -167,10 +199,15 @@ glm_ortho_aabb_p(vec3 box[2], float padding, mat4 dest) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_ortho_aabb_pz(vec3 box[2], float padding, mat4 dest) {
|
glm_ortho_aabb_pz(vec3 box[2], float padding, mat4 dest) {
|
||||||
glm_ortho(box[0][0], box[1][0],
|
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
|
||||||
box[0][1], box[1][1],
|
glm_ortho_aabb_pz_lh_zo(box, padding, dest);
|
||||||
-(box[1][2] + padding), -(box[0][2] - padding),
|
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
|
||||||
dest);
|
glm_ortho_aabb_pz_lh_no(box, padding, dest);
|
||||||
|
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
|
||||||
|
glm_ortho_aabb_pz_rh_zo(box, padding, dest);
|
||||||
|
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
|
||||||
|
glm_ortho_aabb_pz_rh_no(box, padding, dest);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -182,14 +219,15 @@ glm_ortho_aabb_pz(vec3 box[2], float padding, mat4 dest) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_ortho_default(float aspect, mat4 dest) {
|
glm_ortho_default(float aspect, mat4 dest) {
|
||||||
if (aspect >= 1.0f) {
|
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
|
||||||
glm_ortho(-aspect, aspect, -1.0f, 1.0f, -100.0f, 100.0f, dest);
|
glm_ortho_default_lh_zo(aspect, dest);
|
||||||
return;
|
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
|
||||||
}
|
glm_ortho_default_lh_no(aspect, dest);
|
||||||
|
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
|
||||||
aspect = 1.0f / aspect;
|
glm_ortho_default_rh_zo(aspect, dest);
|
||||||
|
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
|
||||||
glm_ortho(-1.0f, 1.0f, -aspect, aspect, -100.0f, 100.0f, dest);
|
glm_ortho_default_rh_no(aspect, dest);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -202,24 +240,15 @@ glm_ortho_default(float aspect, mat4 dest) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_ortho_default_s(float aspect, float size, mat4 dest) {
|
glm_ortho_default_s(float aspect, float size, mat4 dest) {
|
||||||
if (aspect >= 1.0f) {
|
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
|
||||||
glm_ortho(-size * aspect,
|
glm_ortho_default_s_lh_zo(aspect, size, dest);
|
||||||
size * aspect,
|
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
|
||||||
-size,
|
glm_ortho_default_s_lh_no(aspect, size, dest);
|
||||||
size,
|
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
|
||||||
-size - 100.0f,
|
glm_ortho_default_s_rh_zo(aspect, size, dest);
|
||||||
size + 100.0f,
|
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
|
||||||
dest);
|
glm_ortho_default_s_rh_no(aspect, size, dest);
|
||||||
return;
|
#endif
|
||||||
}
|
|
||||||
|
|
||||||
glm_ortho(-size,
|
|
||||||
size,
|
|
||||||
-size / aspect,
|
|
||||||
size / aspect,
|
|
||||||
-size - 100.0f,
|
|
||||||
size + 100.0f,
|
|
||||||
dest);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -227,29 +256,22 @@ glm_ortho_default_s(float aspect, float size, mat4 dest) {
|
|||||||
*
|
*
|
||||||
* @param[in] fovy field of view angle
|
* @param[in] fovy field of view angle
|
||||||
* @param[in] aspect aspect ratio ( width / height )
|
* @param[in] aspect aspect ratio ( width / height )
|
||||||
* @param[in] nearVal near clipping plane
|
* @param[in] nearZ near clipping plane
|
||||||
* @param[in] farVal far clipping planes
|
* @param[in] farZ far clipping planes
|
||||||
* @param[out] dest result matrix
|
* @param[out] dest result matrix
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_perspective(float fovy,
|
glm_perspective(float fovy, float aspect, float nearZ, float farZ, mat4 dest) {
|
||||||
float aspect,
|
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
|
||||||
float nearVal,
|
glm_perspective_lh_zo(fovy, aspect, nearZ, farZ, dest);
|
||||||
float farVal,
|
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
|
||||||
mat4 dest) {
|
glm_perspective_lh_no(fovy, aspect, nearZ, farZ, dest);
|
||||||
float f, fn;
|
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
|
||||||
|
glm_perspective_rh_zo(fovy, aspect, nearZ, farZ, dest);
|
||||||
glm_mat4_zero(dest);
|
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
|
||||||
|
glm_perspective_rh_no(fovy, aspect, nearZ, farZ, dest);
|
||||||
f = 1.0f / tanf(fovy * 0.5f);
|
#endif
|
||||||
fn = 1.0f / (nearVal - farVal);
|
|
||||||
|
|
||||||
dest[0][0] = f / aspect;
|
|
||||||
dest[1][1] = f;
|
|
||||||
dest[2][2] = (nearVal + farVal) * fn;
|
|
||||||
dest[2][3] =-1.0f;
|
|
||||||
dest[3][2] = 2.0f * nearVal * farVal * fn;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -263,17 +285,15 @@ glm_perspective(float fovy,
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_persp_move_far(mat4 proj, float deltaFar) {
|
glm_persp_move_far(mat4 proj, float deltaFar) {
|
||||||
float fn, farVal, nearVal, p22, p32;
|
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
|
||||||
|
glm_persp_move_far_lh_zo(proj, deltaFar);
|
||||||
p22 = proj[2][2];
|
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
|
||||||
p32 = proj[3][2];
|
glm_persp_move_far_lh_no(proj, deltaFar);
|
||||||
|
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
|
||||||
nearVal = p32 / (p22 - 1.0f);
|
glm_persp_move_far_rh_zo(proj, deltaFar);
|
||||||
farVal = p32 / (p22 + 1.0f) + deltaFar;
|
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
|
||||||
fn = 1.0f / (nearVal - farVal);
|
glm_persp_move_far_rh_no(proj, deltaFar);
|
||||||
|
#endif
|
||||||
proj[2][2] = (nearVal + farVal) * fn;
|
|
||||||
proj[3][2] = 2.0f * nearVal * farVal * fn;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -286,7 +306,15 @@ glm_persp_move_far(mat4 proj, float deltaFar) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_perspective_default(float aspect, mat4 dest) {
|
glm_perspective_default(float aspect, mat4 dest) {
|
||||||
glm_perspective(GLM_PI_4f, aspect, 0.01f, 100.0f, dest);
|
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
|
||||||
|
glm_perspective_default_lh_zo(aspect, dest);
|
||||||
|
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
|
||||||
|
glm_perspective_default_lh_no(aspect, dest);
|
||||||
|
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
|
||||||
|
glm_perspective_default_rh_zo(aspect, dest);
|
||||||
|
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
|
||||||
|
glm_perspective_default_rh_no(aspect, dest);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -319,32 +347,12 @@ glm_perspective_resize(float aspect, mat4 proj) {
|
|||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_lookat(vec3 eye,
|
glm_lookat(vec3 eye, vec3 center, vec3 up, mat4 dest) {
|
||||||
vec3 center,
|
#if CGLM_CONFIG_CLIP_CONTROL & CGLM_CLIP_CONTROL_LH_BIT
|
||||||
vec3 up,
|
glm_lookat_lh(eye, center, up, dest);
|
||||||
mat4 dest) {
|
#elif CGLM_CONFIG_CLIP_CONTROL & CGLM_CLIP_CONTROL_RH_BIT
|
||||||
CGLM_ALIGN(8) vec3 f, u, s;
|
glm_lookat_rh(eye, center, up, dest);
|
||||||
|
#endif
|
||||||
glm_vec3_sub(center, eye, f);
|
|
||||||
glm_vec3_normalize(f);
|
|
||||||
|
|
||||||
glm_vec3_crossn(f, up, s);
|
|
||||||
glm_vec3_cross(s, f, u);
|
|
||||||
|
|
||||||
dest[0][0] = s[0];
|
|
||||||
dest[0][1] = u[0];
|
|
||||||
dest[0][2] =-f[0];
|
|
||||||
dest[1][0] = s[1];
|
|
||||||
dest[1][1] = u[1];
|
|
||||||
dest[1][2] =-f[1];
|
|
||||||
dest[2][0] = s[2];
|
|
||||||
dest[2][1] = u[2];
|
|
||||||
dest[2][2] =-f[2];
|
|
||||||
dest[3][0] =-glm_vec3_dot(s, eye);
|
|
||||||
dest[3][1] =-glm_vec3_dot(u, eye);
|
|
||||||
dest[3][2] = glm_vec3_dot(f, eye);
|
|
||||||
dest[0][3] = dest[1][3] = dest[2][3] = 0.0f;
|
|
||||||
dest[3][3] = 1.0f;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -364,9 +372,11 @@ glm_lookat(vec3 eye,
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_look(vec3 eye, vec3 dir, vec3 up, mat4 dest) {
|
glm_look(vec3 eye, vec3 dir, vec3 up, mat4 dest) {
|
||||||
CGLM_ALIGN(8) vec3 target;
|
#if CGLM_CONFIG_CLIP_CONTROL & CGLM_CLIP_CONTROL_LH_BIT
|
||||||
glm_vec3_add(eye, dir, target);
|
glm_look_lh(eye, dir, up, dest);
|
||||||
glm_lookat(eye, target, up, dest);
|
#elif CGLM_CONFIG_CLIP_CONTROL & CGLM_CLIP_CONTROL_RH_BIT
|
||||||
|
glm_look_rh(eye, dir, up, dest);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -382,17 +392,19 @@ glm_look(vec3 eye, vec3 dir, vec3 up, mat4 dest) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_look_anyup(vec3 eye, vec3 dir, mat4 dest) {
|
glm_look_anyup(vec3 eye, vec3 dir, mat4 dest) {
|
||||||
CGLM_ALIGN(8) vec3 up;
|
#if CGLM_CONFIG_CLIP_CONTROL & CGLM_CLIP_CONTROL_LH_BIT
|
||||||
glm_vec3_ortho(dir, up);
|
glm_look_anyup_lh(eye, dir, dest);
|
||||||
glm_look(eye, dir, up, dest);
|
#elif CGLM_CONFIG_CLIP_CONTROL & CGLM_CLIP_CONTROL_RH_BIT
|
||||||
|
glm_look_anyup_rh(eye, dir, dest);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief decomposes frustum values of perspective projection.
|
* @brief decomposes frustum values of perspective projection.
|
||||||
*
|
*
|
||||||
* @param[in] proj perspective projection matrix
|
* @param[in] proj perspective projection matrix
|
||||||
* @param[out] nearVal near
|
* @param[out] nearZ near
|
||||||
* @param[out] farVal far
|
* @param[out] farZ far
|
||||||
* @param[out] top top
|
* @param[out] top top
|
||||||
* @param[out] bottom bottom
|
* @param[out] bottom bottom
|
||||||
* @param[out] left left
|
* @param[out] left left
|
||||||
@@ -401,31 +413,18 @@ glm_look_anyup(vec3 eye, vec3 dir, mat4 dest) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_persp_decomp(mat4 proj,
|
glm_persp_decomp(mat4 proj,
|
||||||
float * __restrict nearVal, float * __restrict farVal,
|
float * __restrict nearZ, float * __restrict farZ,
|
||||||
float * __restrict top, float * __restrict bottom,
|
float * __restrict top, float * __restrict bottom,
|
||||||
float * __restrict left, float * __restrict right) {
|
float * __restrict left, float * __restrict right) {
|
||||||
float m00, m11, m20, m21, m22, m32, n, f;
|
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
|
||||||
float n_m11, n_m00;
|
glm_persp_decomp_lh_zo(proj, nearZ, farZ, top, bottom, left, right);
|
||||||
|
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
|
||||||
m00 = proj[0][0];
|
glm_persp_decomp_lh_no(proj, nearZ, farZ, top, bottom, left, right);
|
||||||
m11 = proj[1][1];
|
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
|
||||||
m20 = proj[2][0];
|
glm_persp_decomp_rh_zo(proj, nearZ, farZ, top, bottom, left, right);
|
||||||
m21 = proj[2][1];
|
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
|
||||||
m22 = proj[2][2];
|
glm_persp_decomp_rh_no(proj, nearZ, farZ, top, bottom, left, right);
|
||||||
m32 = proj[3][2];
|
#endif
|
||||||
|
|
||||||
n = m32 / (m22 - 1.0f);
|
|
||||||
f = m32 / (m22 + 1.0f);
|
|
||||||
|
|
||||||
n_m11 = n / m11;
|
|
||||||
n_m00 = n / m00;
|
|
||||||
|
|
||||||
*nearVal = n;
|
|
||||||
*farVal = f;
|
|
||||||
*bottom = n_m11 * (m21 - 1.0f);
|
|
||||||
*top = n_m11 * (m21 + 1.0f);
|
|
||||||
*left = n_m00 * (m20 - 1.0f);
|
|
||||||
*right = n_m00 * (m20 + 1.0f);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -438,8 +437,15 @@ glm_persp_decomp(mat4 proj,
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_persp_decompv(mat4 proj, float dest[6]) {
|
glm_persp_decompv(mat4 proj, float dest[6]) {
|
||||||
glm_persp_decomp(proj, &dest[0], &dest[1], &dest[2],
|
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
|
||||||
&dest[3], &dest[4], &dest[5]);
|
glm_persp_decompv_lh_zo(proj, dest);
|
||||||
|
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
|
||||||
|
glm_persp_decompv_lh_no(proj, dest);
|
||||||
|
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
|
||||||
|
glm_persp_decompv_rh_zo(proj, dest);
|
||||||
|
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
|
||||||
|
glm_persp_decompv_rh_no(proj, dest);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -455,14 +461,15 @@ void
|
|||||||
glm_persp_decomp_x(mat4 proj,
|
glm_persp_decomp_x(mat4 proj,
|
||||||
float * __restrict left,
|
float * __restrict left,
|
||||||
float * __restrict right) {
|
float * __restrict right) {
|
||||||
float nearVal, m20, m00;
|
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
|
||||||
|
glm_persp_decomp_x_lh_zo(proj, left, right);
|
||||||
m00 = proj[0][0];
|
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
|
||||||
m20 = proj[2][0];
|
glm_persp_decomp_x_lh_no(proj, left, right);
|
||||||
|
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
|
||||||
nearVal = proj[3][2] / (proj[3][3] - 1.0f);
|
glm_persp_decomp_x_rh_zo(proj, left, right);
|
||||||
*left = nearVal * (m20 - 1.0f) / m00;
|
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
|
||||||
*right = nearVal * (m20 + 1.0f) / m00;
|
glm_persp_decomp_x_rh_no(proj, left, right);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -478,14 +485,15 @@ void
|
|||||||
glm_persp_decomp_y(mat4 proj,
|
glm_persp_decomp_y(mat4 proj,
|
||||||
float * __restrict top,
|
float * __restrict top,
|
||||||
float * __restrict bottom) {
|
float * __restrict bottom) {
|
||||||
float nearVal, m21, m11;
|
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
|
||||||
|
glm_persp_decomp_y_lh_zo(proj, top, bottom);
|
||||||
m21 = proj[2][1];
|
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
|
||||||
m11 = proj[1][1];
|
glm_persp_decomp_y_lh_no(proj, top, bottom);
|
||||||
|
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
|
||||||
nearVal = proj[3][2] / (proj[3][3] - 1.0f);
|
glm_persp_decomp_y_rh_zo(proj, top, bottom);
|
||||||
*bottom = nearVal * (m21 - 1) / m11;
|
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
|
||||||
*top = nearVal * (m21 + 1) / m11;
|
glm_persp_decomp_y_rh_no(proj, top, bottom);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -493,70 +501,61 @@ glm_persp_decomp_y(mat4 proj,
|
|||||||
* z stands for z axis (near / far axis)
|
* z stands for z axis (near / far axis)
|
||||||
*
|
*
|
||||||
* @param[in] proj perspective projection matrix
|
* @param[in] proj perspective projection matrix
|
||||||
* @param[out] nearVal near
|
* @param[out] nearZ near
|
||||||
* @param[out] farVal far
|
* @param[out] farZ far
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_persp_decomp_z(mat4 proj,
|
glm_persp_decomp_z(mat4 proj, float * __restrict nearZ, float * __restrict farZ) {
|
||||||
float * __restrict nearVal,
|
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
|
||||||
float * __restrict farVal) {
|
glm_persp_decomp_z_lh_zo(proj, nearZ, farZ);
|
||||||
float m32, m22;
|
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
|
||||||
|
glm_persp_decomp_z_lh_no(proj, nearZ, farZ);
|
||||||
m32 = proj[3][2];
|
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
|
||||||
m22 = proj[2][2];
|
glm_persp_decomp_z_rh_zo(proj, nearZ, farZ);
|
||||||
|
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
|
||||||
*nearVal = m32 / (m22 - 1.0f);
|
glm_persp_decomp_z_rh_no(proj, nearZ, farZ);
|
||||||
*farVal = m32 / (m22 + 1.0f);
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief decomposes far value of perspective projection.
|
* @brief decomposes far value of perspective projection.
|
||||||
*
|
*
|
||||||
* @param[in] proj perspective projection matrix
|
* @param[in] proj perspective projection matrix
|
||||||
* @param[out] farVal far
|
* @param[out] farZ far
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_persp_decomp_far(mat4 proj, float * __restrict farVal) {
|
glm_persp_decomp_far(mat4 proj, float * __restrict farZ) {
|
||||||
*farVal = proj[3][2] / (proj[2][2] + 1.0f);
|
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
|
||||||
|
glm_persp_decomp_far_lh_zo(proj, farZ);
|
||||||
|
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
|
||||||
|
glm_persp_decomp_far_lh_no(proj, farZ);
|
||||||
|
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
|
||||||
|
glm_persp_decomp_far_rh_zo(proj, farZ);
|
||||||
|
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
|
||||||
|
glm_persp_decomp_far_rh_no(proj, farZ);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief decomposes near value of perspective projection.
|
* @brief decomposes near value of perspective projection.
|
||||||
*
|
*
|
||||||
* @param[in] proj perspective projection matrix
|
* @param[in] proj perspective projection matrix
|
||||||
* @param[out] nearVal near
|
* @param[out] nearZ near
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_persp_decomp_near(mat4 proj, float * __restrict nearVal) {
|
glm_persp_decomp_near(mat4 proj, float * __restrict nearZ) {
|
||||||
*nearVal = proj[3][2] / (proj[2][2] - 1.0f);
|
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
|
||||||
}
|
glm_persp_decomp_near_lh_zo(proj, nearZ);
|
||||||
|
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
|
||||||
/*!
|
glm_persp_decomp_near_lh_no(proj, nearZ);
|
||||||
* @brief returns field of view angle along the Y-axis (in radians)
|
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
|
||||||
*
|
glm_persp_decomp_near_rh_zo(proj, nearZ);
|
||||||
* if you need to degrees, use glm_deg to convert it or use this:
|
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
|
||||||
* fovy_deg = glm_deg(glm_persp_fovy(projMatrix))
|
glm_persp_decomp_near_rh_no(proj, nearZ);
|
||||||
*
|
#endif
|
||||||
* @param[in] proj perspective projection matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
float
|
|
||||||
glm_persp_fovy(mat4 proj) {
|
|
||||||
return 2.0f * atanf(1.0f / proj[1][1]);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief returns aspect ratio of perspective projection
|
|
||||||
*
|
|
||||||
* @param[in] proj perspective projection matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
float
|
|
||||||
glm_persp_aspect(mat4 proj) {
|
|
||||||
return proj[1][1] / proj[0][0];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -569,17 +568,15 @@ glm_persp_aspect(mat4 proj) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_persp_sizes(mat4 proj, float fovy, vec4 dest) {
|
glm_persp_sizes(mat4 proj, float fovy, vec4 dest) {
|
||||||
float t, a, nearVal, farVal;
|
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
|
||||||
|
glm_persp_sizes_lh_zo(proj, fovy, dest);
|
||||||
t = 2.0f * tanf(fovy * 0.5f);
|
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
|
||||||
a = glm_persp_aspect(proj);
|
glm_persp_sizes_lh_no(proj, fovy, dest);
|
||||||
|
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
|
||||||
glm_persp_decomp_z(proj, &nearVal, &farVal);
|
glm_persp_sizes_rh_zo(proj, fovy, dest);
|
||||||
|
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
|
||||||
dest[1] = t * nearVal;
|
glm_persp_sizes_rh_no(proj, fovy, dest);
|
||||||
dest[3] = t * farVal;
|
#endif
|
||||||
dest[0] = a * dest[1];
|
|
||||||
dest[2] = a * dest[3];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* cglm_vcam_h */
|
#endif /* cglm_cam_h */
|
||||||
|
|||||||
@@ -9,10 +9,12 @@
|
|||||||
#define cglm_h
|
#define cglm_h
|
||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
#include "vec2.h"
|
||||||
#include "vec3.h"
|
#include "vec3.h"
|
||||||
#include "vec4.h"
|
#include "vec4.h"
|
||||||
#include "mat4.h"
|
#include "mat4.h"
|
||||||
#include "mat3.h"
|
#include "mat3.h"
|
||||||
|
#include "mat2.h"
|
||||||
#include "affine.h"
|
#include "affine.h"
|
||||||
#include "cam.h"
|
#include "cam.h"
|
||||||
#include "frustum.h"
|
#include "frustum.h"
|
||||||
@@ -28,5 +30,7 @@
|
|||||||
#include "ease.h"
|
#include "ease.h"
|
||||||
#include "curve.h"
|
#include "curve.h"
|
||||||
#include "bezier.h"
|
#include "bezier.h"
|
||||||
|
#include "ray.h"
|
||||||
|
#include "affine2d.h"
|
||||||
|
|
||||||
#endif /* cglm_h */
|
#endif /* cglm_h */
|
||||||
|
|||||||
183
include/cglm/clipspace/ortho_lh_no.h
Normal file
183
include/cglm/clipspace/ortho_lh_no.h
Normal file
@@ -0,0 +1,183 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Functions:
|
||||||
|
CGLM_INLINE void glm_ortho_lh_no(float left, float right,
|
||||||
|
float bottom, float top,
|
||||||
|
float nearZ, float farZ,
|
||||||
|
mat4 dest)
|
||||||
|
CGLM_INLINE void glm_ortho_aabb_lh_no(vec3 box[2], mat4 dest)
|
||||||
|
CGLM_INLINE void glm_ortho_aabb_p_lh_no(vec3 box[2],
|
||||||
|
float padding,
|
||||||
|
mat4 dest)
|
||||||
|
CGLM_INLINE void glm_ortho_aabb_pz_lh_no(vec3 box[2],
|
||||||
|
float padding,
|
||||||
|
mat4 dest)
|
||||||
|
CGLM_INLINE void glm_ortho_default_lh_no(float aspect,
|
||||||
|
mat4 dest)
|
||||||
|
CGLM_INLINE void glm_ortho_default_s_lh_no(float aspect,
|
||||||
|
float size,
|
||||||
|
mat4 dest)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglm_ortho_lh_no_h
|
||||||
|
#define cglm_ortho_lh_no_h
|
||||||
|
|
||||||
|
#include "../common.h"
|
||||||
|
#include "../plane.h"
|
||||||
|
#include "../mat4.h"
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief set up orthographic projection matrix
|
||||||
|
* with a left-hand coordinate system and a
|
||||||
|
* clip-space of [-1, 1].
|
||||||
|
*
|
||||||
|
* @param[in] left viewport.left
|
||||||
|
* @param[in] right viewport.right
|
||||||
|
* @param[in] bottom viewport.bottom
|
||||||
|
* @param[in] top viewport.top
|
||||||
|
* @param[in] nearZ near clipping plane
|
||||||
|
* @param[in] farZ far clipping plane
|
||||||
|
* @param[out] dest result matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_ortho_lh_no(float left, float right,
|
||||||
|
float bottom, float top,
|
||||||
|
float nearZ, float farZ,
|
||||||
|
mat4 dest) {
|
||||||
|
float rl, tb, fn;
|
||||||
|
|
||||||
|
glm_mat4_zero(dest);
|
||||||
|
|
||||||
|
rl = 1.0f / (right - left);
|
||||||
|
tb = 1.0f / (top - bottom);
|
||||||
|
fn =-1.0f / (farZ - nearZ);
|
||||||
|
|
||||||
|
dest[0][0] = 2.0f * rl;
|
||||||
|
dest[1][1] = 2.0f * tb;
|
||||||
|
dest[2][2] =-2.0f * fn;
|
||||||
|
dest[3][0] =-(right + left) * rl;
|
||||||
|
dest[3][1] =-(top + bottom) * tb;
|
||||||
|
dest[3][2] = (farZ + nearZ) * fn;
|
||||||
|
dest[3][3] = 1.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief set up orthographic projection matrix using bounding box
|
||||||
|
* with a left-hand coordinate system and a
|
||||||
|
* clip-space of [-1, 1].
|
||||||
|
*
|
||||||
|
* bounding box (AABB) must be in view space
|
||||||
|
*
|
||||||
|
* @param[in] box AABB
|
||||||
|
* @param[out] dest result matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_ortho_aabb_lh_no(vec3 box[2], mat4 dest) {
|
||||||
|
glm_ortho_lh_no(box[0][0], box[1][0],
|
||||||
|
box[0][1], box[1][1],
|
||||||
|
-box[1][2], -box[0][2],
|
||||||
|
dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief set up orthographic projection matrix using bounding box
|
||||||
|
* with a left-hand coordinate system and a
|
||||||
|
* clip-space of [-1, 1].
|
||||||
|
*
|
||||||
|
* bounding box (AABB) must be in view space
|
||||||
|
*
|
||||||
|
* @param[in] box AABB
|
||||||
|
* @param[in] padding padding
|
||||||
|
* @param[out] dest result matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_ortho_aabb_p_lh_no(vec3 box[2], float padding, mat4 dest) {
|
||||||
|
glm_ortho_lh_no(box[0][0] - padding, box[1][0] + padding,
|
||||||
|
box[0][1] - padding, box[1][1] + padding,
|
||||||
|
-(box[1][2] + padding), -(box[0][2] - padding),
|
||||||
|
dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief set up orthographic projection matrix using bounding box
|
||||||
|
* with a left-hand coordinate system and a
|
||||||
|
* clip-space of [-1, 1].
|
||||||
|
*
|
||||||
|
* bounding box (AABB) must be in view space
|
||||||
|
*
|
||||||
|
* @param[in] box AABB
|
||||||
|
* @param[in] padding padding for near and far
|
||||||
|
* @param[out] dest result matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_ortho_aabb_pz_lh_no(vec3 box[2], float padding, mat4 dest) {
|
||||||
|
glm_ortho_lh_no(box[0][0], box[1][0],
|
||||||
|
box[0][1], box[1][1],
|
||||||
|
-(box[1][2] + padding), -(box[0][2] - padding),
|
||||||
|
dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief set up unit orthographic projection matrix
|
||||||
|
* with a left-hand coordinate system and a
|
||||||
|
* clip-space of [-1, 1].
|
||||||
|
*
|
||||||
|
* @param[in] aspect aspect ration ( width / height )
|
||||||
|
* @param[out] dest result matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_ortho_default_lh_no(float aspect, mat4 dest) {
|
||||||
|
if (aspect >= 1.0f) {
|
||||||
|
glm_ortho_lh_no(-aspect, aspect, -1.0f, 1.0f, -100.0f, 100.0f, dest);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
aspect = 1.0f / aspect;
|
||||||
|
|
||||||
|
glm_ortho_lh_no(-1.0f, 1.0f, -aspect, aspect, -100.0f, 100.0f, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief set up orthographic projection matrix with given CUBE size
|
||||||
|
* with a left-hand coordinate system and a
|
||||||
|
* clip-space of [-1, 1].
|
||||||
|
*
|
||||||
|
* @param[in] aspect aspect ratio ( width / height )
|
||||||
|
* @param[in] size cube size
|
||||||
|
* @param[out] dest result matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_ortho_default_s_lh_no(float aspect, float size, mat4 dest) {
|
||||||
|
if (aspect >= 1.0f) {
|
||||||
|
glm_ortho_lh_no(-size * aspect,
|
||||||
|
size * aspect,
|
||||||
|
-size,
|
||||||
|
size,
|
||||||
|
-size - 100.0f,
|
||||||
|
size + 100.0f,
|
||||||
|
dest);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
glm_ortho_lh_no(-size,
|
||||||
|
size,
|
||||||
|
-size / aspect,
|
||||||
|
size / aspect,
|
||||||
|
-size - 100.0f,
|
||||||
|
size + 100.0f,
|
||||||
|
dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /*cglm_ortho_lh_no_h*/
|
||||||
177
include/cglm/clipspace/ortho_lh_zo.h
Normal file
177
include/cglm/clipspace/ortho_lh_zo.h
Normal file
@@ -0,0 +1,177 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Functions:
|
||||||
|
CGLM_INLINE void glm_ortho_lh_zo(float left, float right,
|
||||||
|
float bottom, float top,
|
||||||
|
float nearZ, float farZ,
|
||||||
|
mat4 dest)
|
||||||
|
CGLM_INLINE void glm_ortho_aabb_lh_zo(vec3 box[2], mat4 dest)
|
||||||
|
CGLM_INLINE void glm_ortho_aabb_p_lh_zo(vec3 box[2],
|
||||||
|
float padding,
|
||||||
|
mat4 dest)
|
||||||
|
CGLM_INLINE void glm_ortho_aabb_pz_lh_zo(vec3 box[2],
|
||||||
|
float padding,
|
||||||
|
mat4 dest)
|
||||||
|
CGLM_INLINE void glm_ortho_default_lh_zo(float aspect,
|
||||||
|
mat4 dest)
|
||||||
|
CGLM_INLINE void glm_ortho_default_s_lh_zo(float aspect,
|
||||||
|
float size,
|
||||||
|
mat4 dest)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglm_ortho_lh_zo_h
|
||||||
|
#define cglm_ortho_lh_zo_h
|
||||||
|
|
||||||
|
#include "../common.h"
|
||||||
|
#include "../plane.h"
|
||||||
|
#include "../mat4.h"
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief set up orthographic projection matrix with a left-hand coordinate
|
||||||
|
* system and a clip-space of [0, 1].
|
||||||
|
*
|
||||||
|
* @param[in] left viewport.left
|
||||||
|
* @param[in] right viewport.right
|
||||||
|
* @param[in] bottom viewport.bottom
|
||||||
|
* @param[in] top viewport.top
|
||||||
|
* @param[in] nearZ near clipping plane
|
||||||
|
* @param[in] farZ far clipping plane
|
||||||
|
* @param[out] dest result matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_ortho_lh_zo(float left, float right,
|
||||||
|
float bottom, float top,
|
||||||
|
float nearZ, float farZ,
|
||||||
|
mat4 dest) {
|
||||||
|
float rl, tb, fn;
|
||||||
|
|
||||||
|
glm_mat4_zero(dest);
|
||||||
|
|
||||||
|
rl = 1.0f / (right - left);
|
||||||
|
tb = 1.0f / (top - bottom);
|
||||||
|
fn =-1.0f / (farZ - nearZ);
|
||||||
|
|
||||||
|
dest[0][0] = 2.0f * rl;
|
||||||
|
dest[1][1] = 2.0f * tb;
|
||||||
|
dest[2][2] =-fn;
|
||||||
|
dest[3][0] =-(right + left) * rl;
|
||||||
|
dest[3][1] =-(top + bottom) * tb;
|
||||||
|
dest[3][2] = nearZ * fn;
|
||||||
|
dest[3][3] = 1.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief set up orthographic projection matrix using bounding box
|
||||||
|
* with a left-hand coordinate system and a clip-space of [0, 1].
|
||||||
|
*
|
||||||
|
* bounding box (AABB) must be in view space
|
||||||
|
*
|
||||||
|
* @param[in] box AABB
|
||||||
|
* @param[out] dest result matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_ortho_aabb_lh_zo(vec3 box[2], mat4 dest) {
|
||||||
|
glm_ortho_lh_zo(box[0][0], box[1][0],
|
||||||
|
box[0][1], box[1][1],
|
||||||
|
-box[1][2], -box[0][2],
|
||||||
|
dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief set up orthographic projection matrix using bounding box
|
||||||
|
* with a left-hand coordinate system and a clip-space of [0, 1].
|
||||||
|
*
|
||||||
|
* bounding box (AABB) must be in view space
|
||||||
|
*
|
||||||
|
* @param[in] box AABB
|
||||||
|
* @param[in] padding padding
|
||||||
|
* @param[out] dest result matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_ortho_aabb_p_lh_zo(vec3 box[2], float padding, mat4 dest) {
|
||||||
|
glm_ortho_lh_zo(box[0][0] - padding, box[1][0] + padding,
|
||||||
|
box[0][1] - padding, box[1][1] + padding,
|
||||||
|
-(box[1][2] + padding), -(box[0][2] - padding),
|
||||||
|
dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief set up orthographic projection matrix using bounding box
|
||||||
|
* with a left-hand coordinate system and a clip-space of [0, 1].
|
||||||
|
*
|
||||||
|
* bounding box (AABB) must be in view space
|
||||||
|
*
|
||||||
|
* @param[in] box AABB
|
||||||
|
* @param[in] padding padding for near and far
|
||||||
|
* @param[out] dest result matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_ortho_aabb_pz_lh_zo(vec3 box[2], float padding, mat4 dest) {
|
||||||
|
glm_ortho_lh_zo(box[0][0], box[1][0],
|
||||||
|
box[0][1], box[1][1],
|
||||||
|
-(box[1][2] + padding), -(box[0][2] - padding),
|
||||||
|
dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief set up unit orthographic projection matrix
|
||||||
|
* with a left-hand coordinate system and a clip-space of [0, 1].
|
||||||
|
*
|
||||||
|
* @param[in] aspect aspect ration ( width / height )
|
||||||
|
* @param[out] dest result matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_ortho_default_lh_zo(float aspect, mat4 dest) {
|
||||||
|
if (aspect >= 1.0f) {
|
||||||
|
glm_ortho_lh_zo(-aspect, aspect, -1.0f, 1.0f, -100.0f, 100.0f, dest);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
aspect = 1.0f / aspect;
|
||||||
|
|
||||||
|
glm_ortho_lh_zo(-1.0f, 1.0f, -aspect, aspect, -100.0f, 100.0f, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief set up orthographic projection matrix with given CUBE size
|
||||||
|
* with a left-hand coordinate system and a clip-space of [0, 1].
|
||||||
|
*
|
||||||
|
* @param[in] aspect aspect ratio ( width / height )
|
||||||
|
* @param[in] size cube size
|
||||||
|
* @param[out] dest result matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_ortho_default_s_lh_zo(float aspect, float size, mat4 dest) {
|
||||||
|
if (aspect >= 1.0f) {
|
||||||
|
glm_ortho_lh_zo(-size * aspect,
|
||||||
|
size * aspect,
|
||||||
|
-size,
|
||||||
|
size,
|
||||||
|
-size - 100.0f,
|
||||||
|
size + 100.0f,
|
||||||
|
dest);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
glm_ortho_lh_zo(-size,
|
||||||
|
size,
|
||||||
|
-size / aspect,
|
||||||
|
size / aspect,
|
||||||
|
-size - 100.0f,
|
||||||
|
size + 100.0f,
|
||||||
|
dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /*cglm_ortho_lh_zo_h*/
|
||||||
183
include/cglm/clipspace/ortho_rh_no.h
Normal file
183
include/cglm/clipspace/ortho_rh_no.h
Normal file
@@ -0,0 +1,183 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Functions:
|
||||||
|
CGLM_INLINE void glm_ortho_rh_no(float left, float right,
|
||||||
|
float bottom, float top,
|
||||||
|
float nearZ, float farZ,
|
||||||
|
mat4 dest)
|
||||||
|
CGLM_INLINE void glm_ortho_aabb_rh_no(vec3 box[2], mat4 dest)
|
||||||
|
CGLM_INLINE void glm_ortho_aabb_p_rh_no(vec3 box[2],
|
||||||
|
float padding,
|
||||||
|
mat4 dest)
|
||||||
|
CGLM_INLINE void glm_ortho_aabb_pz_rh_no(vec3 box[2],
|
||||||
|
float padding,
|
||||||
|
mat4 dest)
|
||||||
|
CGLM_INLINE void glm_ortho_default_rh_no(float aspect,
|
||||||
|
mat4 dest)
|
||||||
|
CGLM_INLINE void glm_ortho_default_s_rh_no(float aspect,
|
||||||
|
float size,
|
||||||
|
mat4 dest)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglm_ortho_rh_no_h
|
||||||
|
#define cglm_ortho_rh_no_h
|
||||||
|
|
||||||
|
#include "../common.h"
|
||||||
|
#include "../plane.h"
|
||||||
|
#include "../mat4.h"
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief set up orthographic projection matrix
|
||||||
|
* with a right-hand coordinate system and a
|
||||||
|
* clip-space of [-1, 1].
|
||||||
|
*
|
||||||
|
* @param[in] left viewport.left
|
||||||
|
* @param[in] right viewport.right
|
||||||
|
* @param[in] bottom viewport.bottom
|
||||||
|
* @param[in] top viewport.top
|
||||||
|
* @param[in] nearZ near clipping plane
|
||||||
|
* @param[in] farZ far clipping plane
|
||||||
|
* @param[out] dest result matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_ortho_rh_no(float left, float right,
|
||||||
|
float bottom, float top,
|
||||||
|
float nearZ, float farZ,
|
||||||
|
mat4 dest) {
|
||||||
|
float rl, tb, fn;
|
||||||
|
|
||||||
|
glm_mat4_zero(dest);
|
||||||
|
|
||||||
|
rl = 1.0f / (right - left);
|
||||||
|
tb = 1.0f / (top - bottom);
|
||||||
|
fn =-1.0f / (farZ - nearZ);
|
||||||
|
|
||||||
|
dest[0][0] = 2.0f * rl;
|
||||||
|
dest[1][1] = 2.0f * tb;
|
||||||
|
dest[2][2] = 2.0f * fn;
|
||||||
|
dest[3][0] =-(right + left) * rl;
|
||||||
|
dest[3][1] =-(top + bottom) * tb;
|
||||||
|
dest[3][2] = (farZ + nearZ) * fn;
|
||||||
|
dest[3][3] = 1.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief set up orthographic projection matrix using bounding box
|
||||||
|
* with a right-hand coordinate system and a
|
||||||
|
* clip-space of [-1, 1].
|
||||||
|
*
|
||||||
|
* bounding box (AABB) must be in view space
|
||||||
|
*
|
||||||
|
* @param[in] box AABB
|
||||||
|
* @param[out] dest result matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_ortho_aabb_rh_no(vec3 box[2], mat4 dest) {
|
||||||
|
glm_ortho_rh_no(box[0][0], box[1][0],
|
||||||
|
box[0][1], box[1][1],
|
||||||
|
-box[1][2], -box[0][2],
|
||||||
|
dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief set up orthographic projection matrix using bounding box
|
||||||
|
* with a right-hand coordinate system and a
|
||||||
|
* clip-space of [-1, 1].
|
||||||
|
*
|
||||||
|
* bounding box (AABB) must be in view space
|
||||||
|
*
|
||||||
|
* @param[in] box AABB
|
||||||
|
* @param[in] padding padding
|
||||||
|
* @param[out] dest result matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_ortho_aabb_p_rh_no(vec3 box[2], float padding, mat4 dest) {
|
||||||
|
glm_ortho_rh_no(box[0][0] - padding, box[1][0] + padding,
|
||||||
|
box[0][1] - padding, box[1][1] + padding,
|
||||||
|
-(box[1][2] + padding), -(box[0][2] - padding),
|
||||||
|
dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief set up orthographic projection matrix using bounding box
|
||||||
|
* with a right-hand coordinate system and a
|
||||||
|
* clip-space of [-1, 1].
|
||||||
|
*
|
||||||
|
* bounding box (AABB) must be in view space
|
||||||
|
*
|
||||||
|
* @param[in] box AABB
|
||||||
|
* @param[in] padding padding for near and far
|
||||||
|
* @param[out] dest result matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_ortho_aabb_pz_rh_no(vec3 box[2], float padding, mat4 dest) {
|
||||||
|
glm_ortho_rh_no(box[0][0], box[1][0],
|
||||||
|
box[0][1], box[1][1],
|
||||||
|
-(box[1][2] + padding), -(box[0][2] - padding),
|
||||||
|
dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief set up unit orthographic projection matrix
|
||||||
|
* with a right-hand coordinate system and a
|
||||||
|
* clip-space of [-1, 1].
|
||||||
|
*
|
||||||
|
* @param[in] aspect aspect ration ( width / height )
|
||||||
|
* @param[out] dest result matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_ortho_default_rh_no(float aspect, mat4 dest) {
|
||||||
|
if (aspect >= 1.0f) {
|
||||||
|
glm_ortho_rh_no(-aspect, aspect, -1.0f, 1.0f, -100.0f, 100.0f, dest);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
aspect = 1.0f / aspect;
|
||||||
|
|
||||||
|
glm_ortho_rh_no(-1.0f, 1.0f, -aspect, aspect, -100.0f, 100.0f, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief set up orthographic projection matrix with given CUBE size
|
||||||
|
* with a right-hand coordinate system and a
|
||||||
|
* clip-space of [-1, 1].
|
||||||
|
*
|
||||||
|
* @param[in] aspect aspect ratio ( width / height )
|
||||||
|
* @param[in] size cube size
|
||||||
|
* @param[out] dest result matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_ortho_default_s_rh_no(float aspect, float size, mat4 dest) {
|
||||||
|
if (aspect >= 1.0f) {
|
||||||
|
glm_ortho_rh_no(-size * aspect,
|
||||||
|
size * aspect,
|
||||||
|
-size,
|
||||||
|
size,
|
||||||
|
-size - 100.0f,
|
||||||
|
size + 100.0f,
|
||||||
|
dest);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
glm_ortho_rh_no(-size,
|
||||||
|
size,
|
||||||
|
-size / aspect,
|
||||||
|
size / aspect,
|
||||||
|
-size - 100.0f,
|
||||||
|
size + 100.0f,
|
||||||
|
dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /*cglm_ortho_rh_no_h*/
|
||||||
181
include/cglm/clipspace/ortho_rh_zo.h
Normal file
181
include/cglm/clipspace/ortho_rh_zo.h
Normal file
@@ -0,0 +1,181 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Functions:
|
||||||
|
CGLM_INLINE void glm_ortho_rh_zo(float left, float right,
|
||||||
|
float bottom, float top,
|
||||||
|
float nearZ, float farZ,
|
||||||
|
mat4 dest)
|
||||||
|
CGLM_INLINE void glm_ortho_aabb_rh_zo(vec3 box[2], mat4 dest)
|
||||||
|
CGLM_INLINE void glm_ortho_aabb_p_rh_zo(vec3 box[2],
|
||||||
|
float padding,
|
||||||
|
mat4 dest)
|
||||||
|
CGLM_INLINE void glm_ortho_aabb_pz_rh_zo(vec3 box[2],
|
||||||
|
float padding,
|
||||||
|
mat4 dest)
|
||||||
|
CGLM_INLINE void glm_ortho_default_rh_zo(float aspect,
|
||||||
|
mat4 dest)
|
||||||
|
CGLM_INLINE void glm_ortho_default_s_rh_zo(float aspect,
|
||||||
|
float size,
|
||||||
|
mat4 dest)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglm_ortho_rh_zo_h
|
||||||
|
#define cglm_ortho_rh_zo_h
|
||||||
|
|
||||||
|
#include "../common.h"
|
||||||
|
#include "../plane.h"
|
||||||
|
#include "../mat4.h"
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief set up orthographic projection matrix with a right-hand coordinate
|
||||||
|
* system and a clip-space of [0, 1].
|
||||||
|
*
|
||||||
|
* @param[in] left viewport.left
|
||||||
|
* @param[in] right viewport.right
|
||||||
|
* @param[in] bottom viewport.bottom
|
||||||
|
* @param[in] top viewport.top
|
||||||
|
* @param[in] nearZ near clipping plane
|
||||||
|
* @param[in] farZ far clipping plane
|
||||||
|
* @param[out] dest result matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_ortho_rh_zo(float left, float right,
|
||||||
|
float bottom, float top,
|
||||||
|
float nearZ, float farZ,
|
||||||
|
mat4 dest) {
|
||||||
|
float rl, tb, fn;
|
||||||
|
|
||||||
|
glm_mat4_zero(dest);
|
||||||
|
|
||||||
|
rl = 1.0f / (right - left);
|
||||||
|
tb = 1.0f / (top - bottom);
|
||||||
|
fn =-1.0f / (farZ - nearZ);
|
||||||
|
|
||||||
|
dest[0][0] = 2.0f * rl;
|
||||||
|
dest[1][1] = 2.0f * tb;
|
||||||
|
dest[2][2] = fn;
|
||||||
|
dest[3][0] =-(right + left) * rl;
|
||||||
|
dest[3][1] =-(top + bottom) * tb;
|
||||||
|
dest[3][2] = nearZ * fn;
|
||||||
|
dest[3][3] = 1.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief set up orthographic projection matrix using bounding box
|
||||||
|
* with a right-hand coordinate system and a clip-space with depth
|
||||||
|
* values from zero to one.
|
||||||
|
*
|
||||||
|
* bounding box (AABB) must be in view space
|
||||||
|
*
|
||||||
|
* @param[in] box AABB
|
||||||
|
* @param[out] dest result matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_ortho_aabb_rh_zo(vec3 box[2], mat4 dest) {
|
||||||
|
glm_ortho_rh_zo(box[0][0], box[1][0],
|
||||||
|
box[0][1], box[1][1],
|
||||||
|
-box[1][2], -box[0][2],
|
||||||
|
dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief set up orthographic projection matrix using bounding box
|
||||||
|
* with a right-hand coordinate system and a clip-space with depth
|
||||||
|
* values from zero to one.
|
||||||
|
*
|
||||||
|
* bounding box (AABB) must be in view space
|
||||||
|
*
|
||||||
|
* @param[in] box AABB
|
||||||
|
* @param[in] padding padding
|
||||||
|
* @param[out] dest result matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_ortho_aabb_p_rh_zo(vec3 box[2], float padding, mat4 dest) {
|
||||||
|
glm_ortho_rh_zo(box[0][0] - padding, box[1][0] + padding,
|
||||||
|
box[0][1] - padding, box[1][1] + padding,
|
||||||
|
-(box[1][2] + padding), -(box[0][2] - padding),
|
||||||
|
dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief set up orthographic projection matrix using bounding box
|
||||||
|
* with a right-hand coordinate system and a clip-space with depth
|
||||||
|
* values from zero to one.
|
||||||
|
*
|
||||||
|
* bounding box (AABB) must be in view space
|
||||||
|
*
|
||||||
|
* @param[in] box AABB
|
||||||
|
* @param[in] padding padding for near and far
|
||||||
|
* @param[out] dest result matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_ortho_aabb_pz_rh_zo(vec3 box[2], float padding, mat4 dest) {
|
||||||
|
glm_ortho_rh_zo(box[0][0], box[1][0],
|
||||||
|
box[0][1], box[1][1],
|
||||||
|
-(box[1][2] + padding), -(box[0][2] - padding),
|
||||||
|
dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief set up unit orthographic projection matrix with a right-hand
|
||||||
|
* coordinate system and a clip-space of [0, 1].
|
||||||
|
*
|
||||||
|
* @param[in] aspect aspect ration ( width / height )
|
||||||
|
* @param[out] dest result matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_ortho_default_rh_zo(float aspect, mat4 dest) {
|
||||||
|
if (aspect >= 1.0f) {
|
||||||
|
glm_ortho_rh_zo(-aspect, aspect, -1.0f, 1.0f, -100.0f, 100.0f, dest);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
aspect = 1.0f / aspect;
|
||||||
|
|
||||||
|
glm_ortho_rh_zo(-1.0f, 1.0f, -aspect, aspect, -100.0f, 100.0f, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief set up orthographic projection matrix with given CUBE size
|
||||||
|
* with a right-hand coordinate system and a clip-space with depth
|
||||||
|
* values from zero to one.
|
||||||
|
*
|
||||||
|
* @param[in] aspect aspect ratio ( width / height )
|
||||||
|
* @param[in] size cube size
|
||||||
|
* @param[out] dest result matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_ortho_default_s_rh_zo(float aspect, float size, mat4 dest) {
|
||||||
|
if (aspect >= 1.0f) {
|
||||||
|
glm_ortho_rh_zo(-size * aspect,
|
||||||
|
size * aspect,
|
||||||
|
-size,
|
||||||
|
size,
|
||||||
|
-size - 100.0f,
|
||||||
|
size + 100.0f,
|
||||||
|
dest);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
glm_ortho_rh_zo(-size,
|
||||||
|
size,
|
||||||
|
-size / aspect,
|
||||||
|
size / aspect,
|
||||||
|
-size - 100.0f,
|
||||||
|
size + 100.0f,
|
||||||
|
dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /*cglm_ortho_rh_zo_h*/
|
||||||
48
include/cglm/clipspace/persp.h
Normal file
48
include/cglm/clipspace/persp.h
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Functions:
|
||||||
|
CGLM_INLINE void glm_persp_decomp_far(mat4 proj, float *farZ)
|
||||||
|
CGLM_INLINE float glm_persp_fovy(mat4 proj)
|
||||||
|
CGLM_INLINE float glm_persp_aspect(mat4 proj)
|
||||||
|
CGLM_INLINE void glm_persp_sizes(mat4 proj, float fovy, vec4 dest)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglm_persp_h
|
||||||
|
#define cglm_persp_h
|
||||||
|
|
||||||
|
#include "../common.h"
|
||||||
|
#include "../plane.h"
|
||||||
|
#include "../mat4.h"
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief returns field of view angle along the Y-axis (in radians)
|
||||||
|
*
|
||||||
|
* if you need to degrees, use glm_deg to convert it or use this:
|
||||||
|
* fovy_deg = glm_deg(glm_persp_fovy(projMatrix))
|
||||||
|
*
|
||||||
|
* @param[in] proj perspective projection matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_persp_fovy(mat4 proj) {
|
||||||
|
return 2.0f * atanf(1.0f / proj[1][1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief returns aspect ratio of perspective projection
|
||||||
|
*
|
||||||
|
* @param[in] proj perspective projection matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_persp_aspect(mat4 proj) {
|
||||||
|
return proj[1][1] / proj[0][0];
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* cglm_persp_h */
|
||||||
395
include/cglm/clipspace/persp_lh_no.h
Normal file
395
include/cglm/clipspace/persp_lh_no.h
Normal file
@@ -0,0 +1,395 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Functions:
|
||||||
|
CGLM_INLINE void glm_frustum_lh_no(float left, float right,
|
||||||
|
float bottom, float top,
|
||||||
|
float nearZ, float farZ,
|
||||||
|
mat4 dest)
|
||||||
|
CGLM_INLINE void glm_perspective_lh_no(float fovy,
|
||||||
|
float aspect,
|
||||||
|
float nearZ,
|
||||||
|
float farZ,
|
||||||
|
mat4 dest)
|
||||||
|
CGLM_INLINE void glm_perspective_default_lh_no(float aspect, mat4 dest)
|
||||||
|
CGLM_INLINE void glm_perspective_resize_lh_no(float aspect, mat4 proj)
|
||||||
|
CGLM_INLINE void glm_persp_move_far_lh_no(mat4 proj,
|
||||||
|
float deltaFar)
|
||||||
|
CGLM_INLINE void glm_persp_decomp_lh_no(mat4 proj,
|
||||||
|
float * __restrict nearZ,
|
||||||
|
float * __restrict farZ,
|
||||||
|
float * __restrict top,
|
||||||
|
float * __restrict bottom,
|
||||||
|
float * __restrict left,
|
||||||
|
float * __restrict right)
|
||||||
|
CGLM_INLINE void glm_persp_decompv_lh_no(mat4 proj,
|
||||||
|
float dest[6])
|
||||||
|
CGLM_INLINE void glm_persp_decomp_x_lh_no(mat4 proj,
|
||||||
|
float * __restrict left,
|
||||||
|
float * __restrict right)
|
||||||
|
CGLM_INLINE void glm_persp_decomp_y_lh_no(mat4 proj,
|
||||||
|
float * __restrict top,
|
||||||
|
float * __restrict bottom)
|
||||||
|
CGLM_INLINE void glm_persp_decomp_z_lh_no(mat4 proj,
|
||||||
|
float * __restrict nearZ,
|
||||||
|
float * __restrict farZ)
|
||||||
|
CGLM_INLINE void glm_persp_decomp_far_lh_no(mat4 proj, float * __restrict farZ)
|
||||||
|
CGLM_INLINE void glm_persp_decomp_near_lh_no(mat4 proj, float * __restrict nearZ)
|
||||||
|
CGLM_INLINE void glm_persp_sizes_lh_no(mat4 proj, float fovy, vec4 dest)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglm_persp_lh_no_h
|
||||||
|
#define cglm_persp_lh_no_h
|
||||||
|
|
||||||
|
#include "../common.h"
|
||||||
|
#include "persp.h"
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief set up perspective peprojection matrix
|
||||||
|
* with a left-hand coordinate system and a
|
||||||
|
* clip-space of [-1, 1].
|
||||||
|
*
|
||||||
|
* @param[in] left viewport.left
|
||||||
|
* @param[in] right viewport.right
|
||||||
|
* @param[in] bottom viewport.bottom
|
||||||
|
* @param[in] top viewport.top
|
||||||
|
* @param[in] nearZ near clipping plane
|
||||||
|
* @param[in] farZ far clipping plane
|
||||||
|
* @param[out] dest result matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_frustum_lh_no(float left, float right,
|
||||||
|
float bottom, float top,
|
||||||
|
float nearZ, float farZ,
|
||||||
|
mat4 dest) {
|
||||||
|
float rl, tb, fn, nv;
|
||||||
|
|
||||||
|
glm_mat4_zero(dest);
|
||||||
|
|
||||||
|
rl = 1.0f / (right - left);
|
||||||
|
tb = 1.0f / (top - bottom);
|
||||||
|
fn =-1.0f / (farZ - nearZ);
|
||||||
|
nv = 2.0f * nearZ;
|
||||||
|
|
||||||
|
dest[0][0] = nv * rl;
|
||||||
|
dest[1][1] = nv * tb;
|
||||||
|
dest[2][0] = (right + left) * rl;
|
||||||
|
dest[2][1] = (top + bottom) * tb;
|
||||||
|
dest[2][2] =-(farZ + nearZ) * fn;
|
||||||
|
dest[2][3] = 1.0f;
|
||||||
|
dest[3][2] = farZ * nv * fn;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief set up perspective projection matrix
|
||||||
|
* with a left-hand coordinate system and a
|
||||||
|
* clip-space of [-1, 1].
|
||||||
|
*
|
||||||
|
* @param[in] fovy field of view angle
|
||||||
|
* @param[in] aspect aspect ratio ( width / height )
|
||||||
|
* @param[in] nearZ near clipping plane
|
||||||
|
* @param[in] farZ far clipping planes
|
||||||
|
* @param[out] dest result matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_perspective_lh_no(float fovy,
|
||||||
|
float aspect,
|
||||||
|
float nearZ,
|
||||||
|
float farZ,
|
||||||
|
mat4 dest) {
|
||||||
|
float f, fn;
|
||||||
|
|
||||||
|
glm_mat4_zero(dest);
|
||||||
|
|
||||||
|
f = 1.0f / tanf(fovy * 0.5f);
|
||||||
|
fn = 1.0f / (nearZ - farZ);
|
||||||
|
|
||||||
|
dest[0][0] = f / aspect;
|
||||||
|
dest[1][1] = f;
|
||||||
|
dest[2][2] =-(nearZ + farZ) * fn;
|
||||||
|
dest[2][3] = 1.0f;
|
||||||
|
dest[3][2] = 2.0f * nearZ * farZ * fn;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief set up perspective projection matrix with default near/far
|
||||||
|
* and angle values with a left-hand coordinate system and a
|
||||||
|
* clip-space of [-1, 1].
|
||||||
|
*
|
||||||
|
* @param[in] aspect aspect ratio ( width / height )
|
||||||
|
* @param[out] dest result matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_perspective_default_lh_no(float aspect, mat4 dest) {
|
||||||
|
glm_perspective_lh_no(GLM_PI_4f, aspect, 0.01f, 100.0f, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief resize perspective matrix by aspect ratio ( width / height )
|
||||||
|
* this makes very easy to resize proj matrix when window /viewport
|
||||||
|
* resized with a left-hand coordinate system and a
|
||||||
|
* clip-space of [-1, 1].
|
||||||
|
*
|
||||||
|
* @param[in] aspect aspect ratio ( width / height )
|
||||||
|
* @param[in, out] proj perspective projection matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_perspective_resize_lh_no(float aspect, mat4 proj) {
|
||||||
|
if (proj[0][0] == 0.0f)
|
||||||
|
return;
|
||||||
|
|
||||||
|
proj[0][0] = proj[1][1] / aspect;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief extend perspective projection matrix's far distance
|
||||||
|
* with a left-hand coordinate system and a
|
||||||
|
* clip-space of [-1, 1].
|
||||||
|
*
|
||||||
|
* this function does not guarantee far >= near, be aware of that!
|
||||||
|
*
|
||||||
|
* @param[in, out] proj projection matrix to extend
|
||||||
|
* @param[in] deltaFar distance from existing far (negative to shink)
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_persp_move_far_lh_no(mat4 proj, float deltaFar) {
|
||||||
|
float fn, farZ, nearZ, p22, p32;
|
||||||
|
|
||||||
|
p22 = -proj[2][2];
|
||||||
|
p32 = proj[3][2];
|
||||||
|
|
||||||
|
nearZ = p32 / (p22 - 1.0f);
|
||||||
|
farZ = p32 / (p22 + 1.0f) + deltaFar;
|
||||||
|
fn = 1.0f / (nearZ - farZ);
|
||||||
|
|
||||||
|
proj[2][2] = -(farZ + nearZ) * fn;
|
||||||
|
proj[3][2] = 2.0f * nearZ * farZ * fn;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief decomposes frustum values of perspective projection
|
||||||
|
* with a left-hand coordinate system and a
|
||||||
|
* clip-space of [-1, 1].
|
||||||
|
*
|
||||||
|
* @param[in] proj perspective projection matrix
|
||||||
|
* @param[out] nearZ near
|
||||||
|
* @param[out] farZ far
|
||||||
|
* @param[out] top top
|
||||||
|
* @param[out] bottom bottom
|
||||||
|
* @param[out] left left
|
||||||
|
* @param[out] right right
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_persp_decomp_lh_no(mat4 proj,
|
||||||
|
float * __restrict nearZ, float * __restrict farZ,
|
||||||
|
float * __restrict top, float * __restrict bottom,
|
||||||
|
float * __restrict left, float * __restrict right) {
|
||||||
|
float m00, m11, m20, m21, m22, m32, n, f;
|
||||||
|
float n_m11, n_m00;
|
||||||
|
|
||||||
|
m00 = proj[0][0];
|
||||||
|
m11 = proj[1][1];
|
||||||
|
m20 = proj[2][0];
|
||||||
|
m21 = proj[2][1];
|
||||||
|
m22 =-proj[2][2];
|
||||||
|
m32 = proj[3][2];
|
||||||
|
|
||||||
|
n = m32 / (m22 - 1.0f);
|
||||||
|
f = m32 / (m22 + 1.0f);
|
||||||
|
|
||||||
|
n_m11 = n / m11;
|
||||||
|
n_m00 = n / m00;
|
||||||
|
|
||||||
|
*nearZ = n;
|
||||||
|
*farZ = f;
|
||||||
|
*bottom = n_m11 * (m21 - 1.0f);
|
||||||
|
*top = n_m11 * (m21 + 1.0f);
|
||||||
|
*left = n_m00 * (m20 - 1.0f);
|
||||||
|
*right = n_m00 * (m20 + 1.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief decomposes frustum values of perspective projection
|
||||||
|
* with a left-hand coordinate system and a
|
||||||
|
* clip-space of [-1, 1].
|
||||||
|
* this makes easy to get all values at once
|
||||||
|
*
|
||||||
|
* @param[in] proj perspective projection matrix
|
||||||
|
* @param[out] dest array
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_persp_decompv_lh_no(mat4 proj, float dest[6]) {
|
||||||
|
glm_persp_decomp_lh_no(proj, &dest[0], &dest[1], &dest[2],
|
||||||
|
&dest[3], &dest[4], &dest[5]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief decomposes left and right values of perspective projection
|
||||||
|
* with a left-hand coordinate system and a
|
||||||
|
* clip-space of [-1, 1].
|
||||||
|
* x stands for x axis (left / right axis)
|
||||||
|
*
|
||||||
|
* @param[in] proj perspective projection matrix
|
||||||
|
* @param[out] left left
|
||||||
|
* @param[out] right right
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_persp_decomp_x_lh_no(mat4 proj,
|
||||||
|
float * __restrict left,
|
||||||
|
float * __restrict right) {
|
||||||
|
float nearZ, m20, m00, m22;
|
||||||
|
|
||||||
|
m00 = proj[0][0];
|
||||||
|
m20 = proj[2][0];
|
||||||
|
m22 =-proj[2][2];
|
||||||
|
|
||||||
|
nearZ = proj[3][2] / (m22 - 1.0f);
|
||||||
|
*left = nearZ * (m20 - 1.0f) / m00;
|
||||||
|
*right = nearZ * (m20 + 1.0f) / m00;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief decomposes top and bottom values of perspective projection
|
||||||
|
* with a left-hand coordinate system and a
|
||||||
|
* clip-space of [-1, 1].
|
||||||
|
* y stands for y axis (top / botom axis)
|
||||||
|
*
|
||||||
|
* @param[in] proj perspective projection matrix
|
||||||
|
* @param[out] top top
|
||||||
|
* @param[out] bottom bottom
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_persp_decomp_y_lh_no(mat4 proj,
|
||||||
|
float * __restrict top,
|
||||||
|
float * __restrict bottom) {
|
||||||
|
float nearZ, m21, m11, m22;
|
||||||
|
|
||||||
|
m21 = proj[2][1];
|
||||||
|
m11 = proj[1][1];
|
||||||
|
m22 =-proj[2][2];
|
||||||
|
|
||||||
|
nearZ = proj[3][2] / (m22 - 1.0f);
|
||||||
|
*bottom = nearZ * (m21 - 1.0f) / m11;
|
||||||
|
*top = nearZ * (m21 + 1.0f) / m11;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief decomposes near and far values of perspective projection
|
||||||
|
* with a left-hand coordinate system and a
|
||||||
|
* clip-space of [-1, 1].
|
||||||
|
* z stands for z axis (near / far axis)
|
||||||
|
*
|
||||||
|
* @param[in] proj perspective projection matrix
|
||||||
|
* @param[out] nearZ near
|
||||||
|
* @param[out] farZ far
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_persp_decomp_z_lh_no(mat4 proj,
|
||||||
|
float * __restrict nearZ,
|
||||||
|
float * __restrict farZ) {
|
||||||
|
float m32, m22;
|
||||||
|
|
||||||
|
m32 = proj[3][2];
|
||||||
|
m22 =-proj[2][2];
|
||||||
|
|
||||||
|
*nearZ = m32 / (m22 - 1.0f);
|
||||||
|
*farZ = m32 / (m22 + 1.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief decomposes far value of perspective projection
|
||||||
|
* with a left-hand coordinate system and a
|
||||||
|
* clip-space of [-1, 1].
|
||||||
|
*
|
||||||
|
* @param[in] proj perspective projection matrix
|
||||||
|
* @param[out] farZ far
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_persp_decomp_far_lh_no(mat4 proj, float * __restrict farZ) {
|
||||||
|
*farZ = proj[3][2] / (-proj[2][2] + 1.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief decomposes near value of perspective projection
|
||||||
|
* with a left-hand coordinate system and a
|
||||||
|
* clip-space of [-1, 1].
|
||||||
|
*
|
||||||
|
* @param[in] proj perspective projection matrix
|
||||||
|
* @param[out] nearZ near
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_persp_decomp_near_lh_no(mat4 proj, float * __restrict nearZ) {
|
||||||
|
*nearZ = proj[3][2] / (-proj[2][2] - 1.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief returns sizes of near and far planes of perspective projection
|
||||||
|
* with a left-hand coordinate system and a
|
||||||
|
* clip-space of [-1, 1].
|
||||||
|
*
|
||||||
|
* @param[in] proj perspective projection matrix
|
||||||
|
* @param[in] fovy fovy (see brief)
|
||||||
|
* @param[out] dest sizes order: [Wnear, Hnear, Wfar, Hfar]
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_persp_sizes_lh_no(mat4 proj, float fovy, vec4 dest) {
|
||||||
|
float t, a, nearZ, farZ;
|
||||||
|
|
||||||
|
t = 2.0f * tanf(fovy * 0.5f);
|
||||||
|
a = glm_persp_aspect(proj);
|
||||||
|
|
||||||
|
glm_persp_decomp_z_lh_no(proj, &nearZ, &farZ);
|
||||||
|
|
||||||
|
dest[1] = t * nearZ;
|
||||||
|
dest[3] = t * farZ;
|
||||||
|
dest[0] = a * dest[1];
|
||||||
|
dest[2] = a * dest[3];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief returns field of view angle along the Y-axis (in radians)
|
||||||
|
* with a left-hand coordinate system and a clip-space of [-1, 1].
|
||||||
|
*
|
||||||
|
* if you need to degrees, use glm_deg to convert it or use this:
|
||||||
|
* fovy_deg = glm_deg(glm_persp_fovy(projMatrix))
|
||||||
|
*
|
||||||
|
* @param[in] proj perspective projection matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_persp_fovy_lh_no(mat4 proj) {
|
||||||
|
return glm_persp_fovy(proj);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief returns aspect ratio of perspective projection
|
||||||
|
* with a left-hand coordinate system and a clip-space of [-1, 1].
|
||||||
|
*
|
||||||
|
* @param[in] proj perspective projection matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_persp_aspect_lh_no(mat4 proj) {
|
||||||
|
return glm_persp_aspect(proj);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /*cglm_cam_lh_no_h*/
|
||||||
387
include/cglm/clipspace/persp_lh_zo.h
Normal file
387
include/cglm/clipspace/persp_lh_zo.h
Normal file
@@ -0,0 +1,387 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Functions:
|
||||||
|
CGLM_INLINE void glm_frustum_lh_zo(float left, float right,
|
||||||
|
float bottom, float top,
|
||||||
|
float nearZ, float farZ,
|
||||||
|
mat4 dest)
|
||||||
|
CGLM_INLINE void glm_perspective_lh_zo(float fovy,
|
||||||
|
float aspect,
|
||||||
|
float nearZ,
|
||||||
|
float farZ,
|
||||||
|
mat4 dest)
|
||||||
|
CGLM_INLINE void glm_perspective_default_lh_zo(float aspect, mat4 dest)
|
||||||
|
CGLM_INLINE void glm_perspective_resize_lh_zo(float aspect, mat4 proj)
|
||||||
|
CGLM_INLINE void glm_persp_move_far_lh_zo(mat4 proj,
|
||||||
|
float deltaFar)
|
||||||
|
CGLM_INLINE void glm_persp_decomp_lh_zo(mat4 proj,
|
||||||
|
float * __restrict nearZ,
|
||||||
|
float * __restrict farZ,
|
||||||
|
float * __restrict top,
|
||||||
|
float * __restrict bottom,
|
||||||
|
float * __restrict left,
|
||||||
|
float * __restrict right)
|
||||||
|
CGLM_INLINE void glm_persp_decompv_lh_zo(mat4 proj,
|
||||||
|
float dest[6])
|
||||||
|
CGLM_INLINE void glm_persp_decomp_x_lh_zo(mat4 proj,
|
||||||
|
float * __restrict left,
|
||||||
|
float * __restrict right)
|
||||||
|
CGLM_INLINE void glm_persp_decomp_y_lh_zo(mat4 proj,
|
||||||
|
float * __restrict top,
|
||||||
|
float * __restrict bottom)
|
||||||
|
CGLM_INLINE void glm_persp_decomp_z_lh_zo(mat4 proj,
|
||||||
|
float * __restrict nearZ,
|
||||||
|
float * __restrict farZ)
|
||||||
|
CGLM_INLINE void glm_persp_decomp_far_lh_zo(mat4 proj, float * __restrict farZ)
|
||||||
|
CGLM_INLINE void glm_persp_decomp_near_lh_zo(mat4 proj, float * __restrict nearZ)
|
||||||
|
CGLM_INLINE void glm_persp_sizes_lh_zo(mat4 proj, float fovy, vec4 dest)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglm_persp_lh_zo_h
|
||||||
|
#define cglm_persp_lh_zo_h
|
||||||
|
|
||||||
|
#include "../common.h"
|
||||||
|
#include "persp.h"
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief set up perspective peprojection matrix with a left-hand coordinate
|
||||||
|
* system and a clip-space of [0, 1].
|
||||||
|
*
|
||||||
|
* @param[in] left viewport.left
|
||||||
|
* @param[in] right viewport.right
|
||||||
|
* @param[in] bottom viewport.bottom
|
||||||
|
* @param[in] top viewport.top
|
||||||
|
* @param[in] nearZ near clipping plane
|
||||||
|
* @param[in] farZ far clipping plane
|
||||||
|
* @param[out] dest result matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_frustum_lh_zo(float left, float right,
|
||||||
|
float bottom, float top,
|
||||||
|
float nearZ, float farZ,
|
||||||
|
mat4 dest) {
|
||||||
|
float rl, tb, fn, nv;
|
||||||
|
|
||||||
|
glm_mat4_zero(dest);
|
||||||
|
|
||||||
|
rl = 1.0f / (right - left);
|
||||||
|
tb = 1.0f / (top - bottom);
|
||||||
|
fn =-1.0f / (farZ - nearZ);
|
||||||
|
nv = 2.0f * nearZ;
|
||||||
|
|
||||||
|
dest[0][0] = nv * rl;
|
||||||
|
dest[1][1] = nv * tb;
|
||||||
|
dest[2][0] = (right + left) * rl;
|
||||||
|
dest[2][1] = (top + bottom) * tb;
|
||||||
|
dest[2][2] =-farZ * fn;
|
||||||
|
dest[2][3] = 1.0f;
|
||||||
|
dest[3][2] = farZ * nearZ * fn;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief set up perspective projection matrix with a left-hand coordinate
|
||||||
|
* system and a clip-space of [0, 1].
|
||||||
|
*
|
||||||
|
* @param[in] fovy field of view angle
|
||||||
|
* @param[in] aspect aspect ratio ( width / height )
|
||||||
|
* @param[in] nearZ near clipping plane
|
||||||
|
* @param[in] farZ far clipping planes
|
||||||
|
* @param[out] dest result matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_perspective_lh_zo(float fovy,
|
||||||
|
float aspect,
|
||||||
|
float nearZ,
|
||||||
|
float farZ,
|
||||||
|
mat4 dest) {
|
||||||
|
float f, fn;
|
||||||
|
|
||||||
|
glm_mat4_zero(dest);
|
||||||
|
|
||||||
|
f = 1.0f / tanf(fovy * 0.5f);
|
||||||
|
fn = 1.0f / (nearZ - farZ);
|
||||||
|
|
||||||
|
dest[0][0] = f / aspect;
|
||||||
|
dest[1][1] = f;
|
||||||
|
dest[2][2] =-farZ * fn;
|
||||||
|
dest[2][3] = 1.0f;
|
||||||
|
dest[3][2] = nearZ * farZ * fn;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief extend perspective projection matrix's far distance with a
|
||||||
|
* left-hand coordinate system and a clip-space with depth values
|
||||||
|
* from zero to one.
|
||||||
|
*
|
||||||
|
* this function does not guarantee far >= near, be aware of that!
|
||||||
|
*
|
||||||
|
* @param[in, out] proj projection matrix to extend
|
||||||
|
* @param[in] deltaFar distance from existing far (negative to shink)
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_persp_move_far_lh_zo(mat4 proj, float deltaFar) {
|
||||||
|
float fn, farZ, nearZ, p22, p32;
|
||||||
|
|
||||||
|
p22 = -proj[2][2];
|
||||||
|
p32 = proj[3][2];
|
||||||
|
|
||||||
|
nearZ = p32 / p22;
|
||||||
|
farZ = p32 / (p22 + 1.0f) + deltaFar;
|
||||||
|
fn = 1.0f / (nearZ - farZ);
|
||||||
|
|
||||||
|
proj[2][2] = -farZ * fn;
|
||||||
|
proj[3][2] = nearZ * farZ * fn;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief set up perspective projection matrix with default near/far
|
||||||
|
* and angle values with a left-hand coordinate system and a
|
||||||
|
* clip-space of [0, 1].
|
||||||
|
*
|
||||||
|
* @param[in] aspect aspect ratio ( width / height )
|
||||||
|
* @param[out] dest result matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_perspective_default_lh_zo(float aspect, mat4 dest) {
|
||||||
|
glm_perspective_lh_zo(GLM_PI_4f, aspect, 0.01f, 100.0f, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief resize perspective matrix by aspect ratio ( width / height )
|
||||||
|
* this makes very easy to resize proj matrix when window /viewport
|
||||||
|
* reized
|
||||||
|
*
|
||||||
|
* @param[in] aspect aspect ratio ( width / height )
|
||||||
|
* @param[in, out] proj perspective projection matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_perspective_resize_lh_zo(float aspect, mat4 proj) {
|
||||||
|
if (proj[0][0] == 0.0f)
|
||||||
|
return;
|
||||||
|
|
||||||
|
proj[0][0] = proj[1][1] / aspect;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief decomposes frustum values of perspective projection
|
||||||
|
* with angle values with a left-hand coordinate system and a
|
||||||
|
* clip-space of [0, 1].
|
||||||
|
*
|
||||||
|
* @param[in] proj perspective projection matrix
|
||||||
|
* @param[out] nearZ near
|
||||||
|
* @param[out] farZ far
|
||||||
|
* @param[out] top top
|
||||||
|
* @param[out] bottom bottom
|
||||||
|
* @param[out] left left
|
||||||
|
* @param[out] right right
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_persp_decomp_lh_zo(mat4 proj,
|
||||||
|
float * __restrict nearZ, float * __restrict farZ,
|
||||||
|
float * __restrict top, float * __restrict bottom,
|
||||||
|
float * __restrict left, float * __restrict right) {
|
||||||
|
float m00, m11, m20, m21, m22, m32, n, f;
|
||||||
|
float n_m11, n_m00;
|
||||||
|
|
||||||
|
m00 = proj[0][0];
|
||||||
|
m11 = proj[1][1];
|
||||||
|
m20 = proj[2][0];
|
||||||
|
m21 = proj[2][1];
|
||||||
|
m22 =-proj[2][2];
|
||||||
|
m32 = proj[3][2];
|
||||||
|
|
||||||
|
n = m32 / m22;
|
||||||
|
f = m32 / (m22 + 1.0f);
|
||||||
|
|
||||||
|
n_m11 = n / m11;
|
||||||
|
n_m00 = n / m00;
|
||||||
|
|
||||||
|
*nearZ = n;
|
||||||
|
*farZ = f;
|
||||||
|
*bottom = n_m11 * (m21 - 1.0f);
|
||||||
|
*top = n_m11 * (m21 + 1.0f);
|
||||||
|
*left = n_m00 * (m20 - 1.0f);
|
||||||
|
*right = n_m00 * (m20 + 1.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief decomposes frustum values of perspective projection
|
||||||
|
* with angle values with a left-hand coordinate system and a
|
||||||
|
* clip-space of [0, 1].
|
||||||
|
* this makes easy to get all values at once
|
||||||
|
*
|
||||||
|
* @param[in] proj perspective projection matrix
|
||||||
|
* @param[out] dest array
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_persp_decompv_lh_zo(mat4 proj, float dest[6]) {
|
||||||
|
glm_persp_decomp_lh_zo(proj, &dest[0], &dest[1], &dest[2],
|
||||||
|
&dest[3], &dest[4], &dest[5]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief decomposes left and right values of perspective projection (ZO).
|
||||||
|
* x stands for x axis (left / right axis)
|
||||||
|
*
|
||||||
|
* @param[in] proj perspective projection matrix
|
||||||
|
* @param[out] left left
|
||||||
|
* @param[out] right right
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_persp_decomp_x_lh_zo(mat4 proj,
|
||||||
|
float * __restrict left,
|
||||||
|
float * __restrict right) {
|
||||||
|
float nearZ, m20, m00;
|
||||||
|
|
||||||
|
m00 = proj[0][0];
|
||||||
|
m20 = proj[2][0];
|
||||||
|
|
||||||
|
nearZ = proj[3][2] / (proj[3][3]);
|
||||||
|
*left = nearZ * (m20 - 1.0f) / m00;
|
||||||
|
*right = nearZ * (m20 + 1.0f) / m00;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief decomposes top and bottom values of perspective projection
|
||||||
|
* with angle values with a left-hand coordinate system and a
|
||||||
|
* clip-space of [0, 1].
|
||||||
|
* y stands for y axis (top / bottom axis)
|
||||||
|
*
|
||||||
|
* @param[in] proj perspective projection matrix
|
||||||
|
* @param[out] top top
|
||||||
|
* @param[out] bottom bottom
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_persp_decomp_y_lh_zo(mat4 proj,
|
||||||
|
float * __restrict top,
|
||||||
|
float * __restrict bottom) {
|
||||||
|
float nearZ, m21, m11;
|
||||||
|
|
||||||
|
m21 = proj[2][1];
|
||||||
|
m11 = proj[1][1];
|
||||||
|
|
||||||
|
nearZ = proj[3][2] / (proj[3][3]);
|
||||||
|
*bottom = nearZ * (m21 - 1) / m11;
|
||||||
|
*top = nearZ * (m21 + 1) / m11;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief decomposes near and far values of perspective projection
|
||||||
|
* with angle values with a left-hand coordinate system and a
|
||||||
|
* clip-space of [0, 1].
|
||||||
|
* z stands for z axis (near / far axis)
|
||||||
|
*
|
||||||
|
* @param[in] proj perspective projection matrix
|
||||||
|
* @param[out] nearZ near
|
||||||
|
* @param[out] farZ far
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_persp_decomp_z_lh_zo(mat4 proj,
|
||||||
|
float * __restrict nearZ,
|
||||||
|
float * __restrict farZ) {
|
||||||
|
float m32, m22;
|
||||||
|
|
||||||
|
m32 = proj[3][2];
|
||||||
|
m22 = -proj[2][2];
|
||||||
|
|
||||||
|
*nearZ = m32 / m22;
|
||||||
|
*farZ = m32 / (m22 + 1.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief decomposes far value of perspective projection
|
||||||
|
* with angle values with a left-hand coordinate system and a
|
||||||
|
* clip-space of [0, 1].
|
||||||
|
*
|
||||||
|
* @param[in] proj perspective projection matrix
|
||||||
|
* @param[out] farZ far
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_persp_decomp_far_lh_zo(mat4 proj, float * __restrict farZ) {
|
||||||
|
*farZ = proj[3][2] / (-proj[2][2] + 1.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief decomposes near value of perspective projection
|
||||||
|
* with angle values with a left-hand coordinate system and a
|
||||||
|
* clip-space of [0, 1].
|
||||||
|
*
|
||||||
|
* @param[in] proj perspective projection matrix
|
||||||
|
* @param[out] nearZ near
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_persp_decomp_near_lh_zo(mat4 proj, float * __restrict nearZ) {
|
||||||
|
*nearZ = proj[3][2] / -proj[2][2];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief returns sizes of near and far planes of perspective projection
|
||||||
|
* with a left-hand coordinate system and a
|
||||||
|
* clip-space of [0, 1].
|
||||||
|
*
|
||||||
|
* @param[in] proj perspective projection matrix
|
||||||
|
* @param[in] fovy fovy (see brief)
|
||||||
|
* @param[out] dest sizes order: [Wnear, Hnear, Wfar, Hfar]
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_persp_sizes_lh_zo(mat4 proj, float fovy, vec4 dest) {
|
||||||
|
float t, a, nearZ, farZ;
|
||||||
|
|
||||||
|
t = 2.0f * tanf(fovy * 0.5f);
|
||||||
|
a = glm_persp_aspect(proj);
|
||||||
|
|
||||||
|
glm_persp_decomp_z_lh_zo(proj, &nearZ, &farZ);
|
||||||
|
|
||||||
|
dest[1] = t * nearZ;
|
||||||
|
dest[3] = t * farZ;
|
||||||
|
dest[0] = a * dest[1];
|
||||||
|
dest[2] = a * dest[3];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief returns field of view angle along the Y-axis (in radians)
|
||||||
|
* with a left-hand coordinate system and a clip-space of [0, 1].
|
||||||
|
*
|
||||||
|
* if you need to degrees, use glm_deg to convert it or use this:
|
||||||
|
* fovy_deg = glm_deg(glm_persp_fovy(projMatrix))
|
||||||
|
*
|
||||||
|
* @param[in] proj perspective projection matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_persp_fovy_lh_zo(mat4 proj) {
|
||||||
|
return glm_persp_fovy(proj);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief returns aspect ratio of perspective projection
|
||||||
|
* with a left-hand coordinate system and a clip-space of [0, 1].
|
||||||
|
*
|
||||||
|
* @param[in] proj perspective projection matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_persp_aspect_lh_zo(mat4 proj) {
|
||||||
|
return glm_persp_aspect(proj);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /*cglm_persp_lh_zo_h*/
|
||||||
395
include/cglm/clipspace/persp_rh_no.h
Normal file
395
include/cglm/clipspace/persp_rh_no.h
Normal file
@@ -0,0 +1,395 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Functions:
|
||||||
|
CGLM_INLINE void glm_frustum_rh_no(float left, float right,
|
||||||
|
float bottom, float top,
|
||||||
|
float nearZ, float farZ,
|
||||||
|
mat4 dest)
|
||||||
|
CGLM_INLINE void glm_perspective_rh_no(float fovy,
|
||||||
|
float aspect,
|
||||||
|
float nearZ,
|
||||||
|
float farZ,
|
||||||
|
mat4 dest)
|
||||||
|
CGLM_INLINE void glm_perspective_default_rh_no(float aspect, mat4 dest)
|
||||||
|
CGLM_INLINE void glm_perspective_resize_rh_no(float aspect, mat4 proj)
|
||||||
|
CGLM_INLINE void glm_persp_move_far_rh_no(mat4 proj,
|
||||||
|
float deltaFar)
|
||||||
|
CGLM_INLINE void glm_persp_decomp_rh_no(mat4 proj,
|
||||||
|
float * __restrict nearZ,
|
||||||
|
float * __restrict farZ,
|
||||||
|
float * __restrict top,
|
||||||
|
float * __restrict bottom,
|
||||||
|
float * __restrict left,
|
||||||
|
float * __restrict right)
|
||||||
|
CGLM_INLINE void glm_persp_decompv_rh_no(mat4 proj,
|
||||||
|
float dest[6])
|
||||||
|
CGLM_INLINE void glm_persp_decomp_x_rh_no(mat4 proj,
|
||||||
|
float * __restrict left,
|
||||||
|
float * __restrict right)
|
||||||
|
CGLM_INLINE void glm_persp_decomp_y_rh_no(mat4 proj,
|
||||||
|
float * __restrict top,
|
||||||
|
float * __restrict bottom)
|
||||||
|
CGLM_INLINE void glm_persp_decomp_z_rh_no(mat4 proj,
|
||||||
|
float * __restrict nearZ,
|
||||||
|
float * __restrict farZ)
|
||||||
|
CGLM_INLINE void glm_persp_decomp_far_rh_no(mat4 proj, float * __restrict farZ)
|
||||||
|
CGLM_INLINE void glm_persp_decomp_near_rh_no(mat4 proj, float * __restrict nearZ)
|
||||||
|
CGLM_INLINE void glm_persp_sizes_rh_no(mat4 proj, float fovy, vec4 dest)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglm_persp_rh_no_h
|
||||||
|
#define cglm_persp_rh_no_h
|
||||||
|
|
||||||
|
#include "../common.h"
|
||||||
|
#include "persp.h"
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief set up perspective peprojection matrix
|
||||||
|
* with a right-hand coordinate system and a
|
||||||
|
* clip-space of [-1, 1].
|
||||||
|
*
|
||||||
|
* @param[in] left viewport.left
|
||||||
|
* @param[in] right viewport.right
|
||||||
|
* @param[in] bottom viewport.bottom
|
||||||
|
* @param[in] top viewport.top
|
||||||
|
* @param[in] nearZ near clipping plane
|
||||||
|
* @param[in] farZ far clipping plane
|
||||||
|
* @param[out] dest result matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_frustum_rh_no(float left, float right,
|
||||||
|
float bottom, float top,
|
||||||
|
float nearZ, float farZ,
|
||||||
|
mat4 dest) {
|
||||||
|
float rl, tb, fn, nv;
|
||||||
|
|
||||||
|
glm_mat4_zero(dest);
|
||||||
|
|
||||||
|
rl = 1.0f / (right - left);
|
||||||
|
tb = 1.0f / (top - bottom);
|
||||||
|
fn =-1.0f / (farZ - nearZ);
|
||||||
|
nv = 2.0f * nearZ;
|
||||||
|
|
||||||
|
dest[0][0] = nv * rl;
|
||||||
|
dest[1][1] = nv * tb;
|
||||||
|
dest[2][0] = (right + left) * rl;
|
||||||
|
dest[2][1] = (top + bottom) * tb;
|
||||||
|
dest[2][2] = (farZ + nearZ) * fn;
|
||||||
|
dest[2][3] =-1.0f;
|
||||||
|
dest[3][2] = farZ * nv * fn;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief set up perspective projection matrix
|
||||||
|
* with a right-hand coordinate system and a
|
||||||
|
* clip-space of [-1, 1].
|
||||||
|
*
|
||||||
|
* @param[in] fovy field of view angle
|
||||||
|
* @param[in] aspect aspect ratio ( width / height )
|
||||||
|
* @param[in] nearZ near clipping plane
|
||||||
|
* @param[in] farZ far clipping planes
|
||||||
|
* @param[out] dest result matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_perspective_rh_no(float fovy,
|
||||||
|
float aspect,
|
||||||
|
float nearZ,
|
||||||
|
float farZ,
|
||||||
|
mat4 dest) {
|
||||||
|
float f, fn;
|
||||||
|
|
||||||
|
glm_mat4_zero(dest);
|
||||||
|
|
||||||
|
f = 1.0f / tanf(fovy * 0.5f);
|
||||||
|
fn = 1.0f / (nearZ - farZ);
|
||||||
|
|
||||||
|
dest[0][0] = f / aspect;
|
||||||
|
dest[1][1] = f;
|
||||||
|
dest[2][2] = (nearZ + farZ) * fn;
|
||||||
|
dest[2][3] =-1.0f;
|
||||||
|
dest[3][2] = 2.0f * nearZ * farZ * fn;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief set up perspective projection matrix with default near/far
|
||||||
|
* and angle values with a right-hand coordinate system and a
|
||||||
|
* clip-space of [-1, 1].
|
||||||
|
*
|
||||||
|
* @param[in] aspect aspect ratio ( width / height )
|
||||||
|
* @param[out] dest result matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_perspective_default_rh_no(float aspect, mat4 dest) {
|
||||||
|
glm_perspective_rh_no(GLM_PI_4f, aspect, 0.01f, 100.0f, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief resize perspective matrix by aspect ratio ( width / height )
|
||||||
|
* this makes very easy to resize proj matrix when window /viewport
|
||||||
|
* resized with a right-hand coordinate system and a
|
||||||
|
* clip-space of [-1, 1].
|
||||||
|
*
|
||||||
|
* @param[in] aspect aspect ratio ( width / height )
|
||||||
|
* @param[in, out] proj perspective projection matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_perspective_resize_rh_no(float aspect, mat4 proj) {
|
||||||
|
if (proj[0][0] == 0.0f)
|
||||||
|
return;
|
||||||
|
|
||||||
|
proj[0][0] = proj[1][1] / aspect;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief extend perspective projection matrix's far distance
|
||||||
|
* with a right-hand coordinate system and a
|
||||||
|
* clip-space of [-1, 1].
|
||||||
|
*
|
||||||
|
* this function does not guarantee far >= near, be aware of that!
|
||||||
|
*
|
||||||
|
* @param[in, out] proj projection matrix to extend
|
||||||
|
* @param[in] deltaFar distance from existing far (negative to shink)
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_persp_move_far_rh_no(mat4 proj, float deltaFar) {
|
||||||
|
float fn, farZ, nearZ, p22, p32;
|
||||||
|
|
||||||
|
p22 = proj[2][2];
|
||||||
|
p32 = proj[3][2];
|
||||||
|
|
||||||
|
nearZ = p32 / (p22 - 1.0f);
|
||||||
|
farZ = p32 / (p22 + 1.0f) + deltaFar;
|
||||||
|
fn = 1.0f / (nearZ - farZ);
|
||||||
|
|
||||||
|
proj[2][2] = (farZ + nearZ) * fn;
|
||||||
|
proj[3][2] = 2.0f * nearZ * farZ * fn;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief decomposes frustum values of perspective projection
|
||||||
|
* with a right-hand coordinate system and a
|
||||||
|
* clip-space of [-1, 1].
|
||||||
|
*
|
||||||
|
* @param[in] proj perspective projection matrix
|
||||||
|
* @param[out] nearZ near
|
||||||
|
* @param[out] farZ far
|
||||||
|
* @param[out] top top
|
||||||
|
* @param[out] bottom bottom
|
||||||
|
* @param[out] left left
|
||||||
|
* @param[out] right right
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_persp_decomp_rh_no(mat4 proj,
|
||||||
|
float * __restrict nearZ, float * __restrict farZ,
|
||||||
|
float * __restrict top, float * __restrict bottom,
|
||||||
|
float * __restrict left, float * __restrict right) {
|
||||||
|
float m00, m11, m20, m21, m22, m32, n, f;
|
||||||
|
float n_m11, n_m00;
|
||||||
|
|
||||||
|
m00 = proj[0][0];
|
||||||
|
m11 = proj[1][1];
|
||||||
|
m20 = proj[2][0];
|
||||||
|
m21 = proj[2][1];
|
||||||
|
m22 = proj[2][2];
|
||||||
|
m32 = proj[3][2];
|
||||||
|
|
||||||
|
n = m32 / (m22 - 1.0f);
|
||||||
|
f = m32 / (m22 + 1.0f);
|
||||||
|
|
||||||
|
n_m11 = n / m11;
|
||||||
|
n_m00 = n / m00;
|
||||||
|
|
||||||
|
*nearZ = n;
|
||||||
|
*farZ = f;
|
||||||
|
*bottom = n_m11 * (m21 - 1.0f);
|
||||||
|
*top = n_m11 * (m21 + 1.0f);
|
||||||
|
*left = n_m00 * (m20 - 1.0f);
|
||||||
|
*right = n_m00 * (m20 + 1.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief decomposes frustum values of perspective projection
|
||||||
|
* with a right-hand coordinate system and a
|
||||||
|
* clip-space of [-1, 1].
|
||||||
|
* this makes easy to get all values at once
|
||||||
|
*
|
||||||
|
* @param[in] proj perspective projection matrix
|
||||||
|
* @param[out] dest array
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_persp_decompv_rh_no(mat4 proj, float dest[6]) {
|
||||||
|
glm_persp_decomp_rh_no(proj, &dest[0], &dest[1], &dest[2],
|
||||||
|
&dest[3], &dest[4], &dest[5]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief decomposes left and right values of perspective projection
|
||||||
|
* with a right-hand coordinate system and a
|
||||||
|
* clip-space of [-1, 1].
|
||||||
|
* x stands for x axis (left / right axis)
|
||||||
|
*
|
||||||
|
* @param[in] proj perspective projection matrix
|
||||||
|
* @param[out] left left
|
||||||
|
* @param[out] right right
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_persp_decomp_x_rh_no(mat4 proj,
|
||||||
|
float * __restrict left,
|
||||||
|
float * __restrict right) {
|
||||||
|
float nearZ, m20, m00, m22;
|
||||||
|
|
||||||
|
m00 = proj[0][0];
|
||||||
|
m20 = proj[2][0];
|
||||||
|
m22 = proj[2][2];
|
||||||
|
|
||||||
|
nearZ = proj[3][2] / (m22 - 1.0f);
|
||||||
|
*left = nearZ * (m20 - 1.0f) / m00;
|
||||||
|
*right = nearZ * (m20 + 1.0f) / m00;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief decomposes top and bottom values of perspective projection
|
||||||
|
* with a right-hand coordinate system and a
|
||||||
|
* clip-space of [-1, 1].
|
||||||
|
* y stands for y axis (top / botom axis)
|
||||||
|
*
|
||||||
|
* @param[in] proj perspective projection matrix
|
||||||
|
* @param[out] top top
|
||||||
|
* @param[out] bottom bottom
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_persp_decomp_y_rh_no(mat4 proj,
|
||||||
|
float * __restrict top,
|
||||||
|
float * __restrict bottom) {
|
||||||
|
float nearZ, m21, m11, m22;
|
||||||
|
|
||||||
|
m21 = proj[2][1];
|
||||||
|
m11 = proj[1][1];
|
||||||
|
m22 = proj[2][2];
|
||||||
|
|
||||||
|
nearZ = proj[3][2] / (m22 - 1.0f);
|
||||||
|
*bottom = nearZ * (m21 - 1.0f) / m11;
|
||||||
|
*top = nearZ * (m21 + 1.0f) / m11;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief decomposes near and far values of perspective projection
|
||||||
|
* with a right-hand coordinate system and a
|
||||||
|
* clip-space of [-1, 1].
|
||||||
|
* z stands for z axis (near / far axis)
|
||||||
|
*
|
||||||
|
* @param[in] proj perspective projection matrix
|
||||||
|
* @param[out] nearZ near
|
||||||
|
* @param[out] farZ far
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_persp_decomp_z_rh_no(mat4 proj,
|
||||||
|
float * __restrict nearZ,
|
||||||
|
float * __restrict farZ) {
|
||||||
|
float m32, m22;
|
||||||
|
|
||||||
|
m32 = proj[3][2];
|
||||||
|
m22 = proj[2][2];
|
||||||
|
|
||||||
|
*nearZ = m32 / (m22 - 1.0f);
|
||||||
|
*farZ = m32 / (m22 + 1.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief decomposes far value of perspective projection
|
||||||
|
* with a right-hand coordinate system and a
|
||||||
|
* clip-space of [-1, 1].
|
||||||
|
*
|
||||||
|
* @param[in] proj perspective projection matrix
|
||||||
|
* @param[out] farZ far
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_persp_decomp_far_rh_no(mat4 proj, float * __restrict farZ) {
|
||||||
|
*farZ = proj[3][2] / (proj[2][2] + 1.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief decomposes near value of perspective projection
|
||||||
|
* with a right-hand coordinate system and a
|
||||||
|
* clip-space of [-1, 1].
|
||||||
|
*
|
||||||
|
* @param[in] proj perspective projection matrix
|
||||||
|
* @param[out] nearZ near
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_persp_decomp_near_rh_no(mat4 proj, float * __restrict nearZ) {
|
||||||
|
*nearZ = proj[3][2] / (proj[2][2] - 1.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief returns sizes of near and far planes of perspective projection
|
||||||
|
* with a right-hand coordinate system and a
|
||||||
|
* clip-space of [-1, 1].
|
||||||
|
*
|
||||||
|
* @param[in] proj perspective projection matrix
|
||||||
|
* @param[in] fovy fovy (see brief)
|
||||||
|
* @param[out] dest sizes order: [Wnear, Hnear, Wfar, Hfar]
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_persp_sizes_rh_no(mat4 proj, float fovy, vec4 dest) {
|
||||||
|
float t, a, nearZ, farZ;
|
||||||
|
|
||||||
|
t = 2.0f * tanf(fovy * 0.5f);
|
||||||
|
a = glm_persp_aspect(proj);
|
||||||
|
|
||||||
|
glm_persp_decomp_z_rh_no(proj, &nearZ, &farZ);
|
||||||
|
|
||||||
|
dest[1] = t * nearZ;
|
||||||
|
dest[3] = t * farZ;
|
||||||
|
dest[0] = a * dest[1];
|
||||||
|
dest[2] = a * dest[3];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief returns field of view angle along the Y-axis (in radians)
|
||||||
|
* with a right-hand coordinate system and a clip-space of [-1, 1].
|
||||||
|
*
|
||||||
|
* if you need to degrees, use glm_deg to convert it or use this:
|
||||||
|
* fovy_deg = glm_deg(glm_persp_fovy(projMatrix))
|
||||||
|
*
|
||||||
|
* @param[in] proj perspective projection matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_persp_fovy_rh_no(mat4 proj) {
|
||||||
|
return glm_persp_fovy(proj);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief returns aspect ratio of perspective projection
|
||||||
|
* with a right-hand coordinate system and a clip-space of [-1, 1].
|
||||||
|
*
|
||||||
|
* @param[in] proj perspective projection matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_persp_aspect_rh_no(mat4 proj) {
|
||||||
|
return glm_persp_aspect(proj);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /*cglm_cam_rh_no_h*/
|
||||||
389
include/cglm/clipspace/persp_rh_zo.h
Normal file
389
include/cglm/clipspace/persp_rh_zo.h
Normal file
@@ -0,0 +1,389 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Functions:
|
||||||
|
CGLM_INLINE void glm_frustum_rh_zo(float left, float right,
|
||||||
|
float bottom, float top,
|
||||||
|
float nearZ, float farZ,
|
||||||
|
mat4 dest)
|
||||||
|
CGLM_INLINE void glm_perspective_rh_zo(float fovy,
|
||||||
|
float aspect,
|
||||||
|
float nearZ,
|
||||||
|
float farZ,
|
||||||
|
mat4 dest)
|
||||||
|
CGLM_INLINE void glm_perspective_default_rh_zo(float aspect, mat4 dest)
|
||||||
|
CGLM_INLINE void glm_perspective_resize_rh_zo(float aspect, mat4 proj)
|
||||||
|
CGLM_INLINE void glm_persp_move_far_rh_zo(mat4 proj,
|
||||||
|
float deltaFar)
|
||||||
|
CGLM_INLINE void glm_persp_decomp_rh_zo(mat4 proj,
|
||||||
|
float * __restrict nearZ,
|
||||||
|
float * __restrict farZ,
|
||||||
|
float * __restrict top,
|
||||||
|
float * __restrict bottom,
|
||||||
|
float * __restrict left,
|
||||||
|
float * __restrict right)
|
||||||
|
CGLM_INLINE void glm_persp_decompv_rh_zo(mat4 proj,
|
||||||
|
float dest[6])
|
||||||
|
CGLM_INLINE void glm_persp_decomp_x_rh_zo(mat4 proj,
|
||||||
|
float * __restrict left,
|
||||||
|
float * __restrict right)
|
||||||
|
CGLM_INLINE void glm_persp_decomp_y_rh_zo(mat4 proj,
|
||||||
|
float * __restrict top,
|
||||||
|
float * __restrict bottom)
|
||||||
|
CGLM_INLINE void glm_persp_decomp_z_rh_zo(mat4 proj,
|
||||||
|
float * __restrict nearZ,
|
||||||
|
float * __restrict farZ)
|
||||||
|
CGLM_INLINE void glm_persp_decomp_far_rh_zo(mat4 proj, float * __restrict farZ)
|
||||||
|
CGLM_INLINE void glm_persp_decomp_near_rh_zo(mat4 proj, float * __restrict nearZ)
|
||||||
|
CGLM_INLINE void glm_persp_sizes_rh_zo(mat4 proj, float fovy, vec4 dest)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglm_persp_rh_zo_h
|
||||||
|
#define cglm_persp_rh_zo_h
|
||||||
|
|
||||||
|
#include "../common.h"
|
||||||
|
#include "persp.h"
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief set up perspective peprojection matrix with a right-hand coordinate
|
||||||
|
* system and a clip-space of [0, 1].
|
||||||
|
*
|
||||||
|
* @param[in] left viewport.left
|
||||||
|
* @param[in] right viewport.right
|
||||||
|
* @param[in] bottom viewport.bottom
|
||||||
|
* @param[in] top viewport.top
|
||||||
|
* @param[in] nearZ near clipping plane
|
||||||
|
* @param[in] farZ far clipping plane
|
||||||
|
* @param[out] dest result matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_frustum_rh_zo(float left, float right,
|
||||||
|
float bottom, float top,
|
||||||
|
float nearZ, float farZ,
|
||||||
|
mat4 dest) {
|
||||||
|
float rl, tb, fn, nv;
|
||||||
|
|
||||||
|
glm_mat4_zero(dest);
|
||||||
|
|
||||||
|
rl = 1.0f / (right - left);
|
||||||
|
tb = 1.0f / (top - bottom);
|
||||||
|
fn =-1.0f / (farZ - nearZ);
|
||||||
|
nv = 2.0f * nearZ;
|
||||||
|
|
||||||
|
dest[0][0] = nv * rl;
|
||||||
|
dest[1][1] = nv * tb;
|
||||||
|
dest[2][0] = (right + left) * rl;
|
||||||
|
dest[2][1] = (top + bottom) * tb;
|
||||||
|
dest[2][2] = farZ * fn;
|
||||||
|
dest[2][3] =-1.0f;
|
||||||
|
dest[3][2] = farZ * nearZ * fn;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief set up perspective projection matrix with a right-hand coordinate
|
||||||
|
* system and a clip-space of [0, 1].
|
||||||
|
*
|
||||||
|
* @param[in] fovy field of view angle
|
||||||
|
* @param[in] aspect aspect ratio ( width / height )
|
||||||
|
* @param[in] nearZ near clipping plane
|
||||||
|
* @param[in] farZ far clipping planes
|
||||||
|
* @param[out] dest result matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_perspective_rh_zo(float fovy,
|
||||||
|
float aspect,
|
||||||
|
float nearZ,
|
||||||
|
float farZ,
|
||||||
|
mat4 dest) {
|
||||||
|
float f, fn;
|
||||||
|
|
||||||
|
glm_mat4_zero(dest);
|
||||||
|
|
||||||
|
f = 1.0f / tanf(fovy * 0.5f);
|
||||||
|
fn = 1.0f / (nearZ - farZ);
|
||||||
|
|
||||||
|
dest[0][0] = f / aspect;
|
||||||
|
dest[1][1] = f;
|
||||||
|
dest[2][2] = farZ * fn;
|
||||||
|
dest[2][3] =-1.0f;
|
||||||
|
dest[3][2] = nearZ * farZ * fn;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief set up perspective projection matrix with default near/far
|
||||||
|
* and angle values with a right-hand coordinate system and a
|
||||||
|
* clip-space of [0, 1].
|
||||||
|
*
|
||||||
|
* @param[in] aspect aspect ratio ( width / height )
|
||||||
|
* @param[out] dest result matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_perspective_default_rh_zo(float aspect, mat4 dest) {
|
||||||
|
glm_perspective_rh_zo(GLM_PI_4f, aspect, 0.01f, 100.0f, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief resize perspective matrix by aspect ratio ( width / height )
|
||||||
|
* this makes very easy to resize proj matrix when window /viewport
|
||||||
|
* resized with a right-hand coordinate system and a clip-space of
|
||||||
|
* [0, 1].
|
||||||
|
*
|
||||||
|
* @param[in] aspect aspect ratio ( width / height )
|
||||||
|
* @param[in, out] proj perspective projection matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_perspective_resize_rh_zo(float aspect, mat4 proj) {
|
||||||
|
if (proj[0][0] == 0.0f)
|
||||||
|
return;
|
||||||
|
|
||||||
|
proj[0][0] = proj[1][1] / aspect;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief extend perspective projection matrix's far distance with a
|
||||||
|
* right-hand coordinate system and a clip-space of [0, 1].
|
||||||
|
*
|
||||||
|
* this function does not guarantee far >= near, be aware of that!
|
||||||
|
*
|
||||||
|
* @param[in, out] proj projection matrix to extend
|
||||||
|
* @param[in] deltaFar distance from existing far (negative to shink)
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_persp_move_far_rh_zo(mat4 proj, float deltaFar) {
|
||||||
|
float fn, farZ, nearZ, p22, p32;
|
||||||
|
|
||||||
|
p22 = proj[2][2];
|
||||||
|
p32 = proj[3][2];
|
||||||
|
|
||||||
|
nearZ = p32 / p22;
|
||||||
|
farZ = p32 / (p22 + 1.0f) + deltaFar;
|
||||||
|
fn = 1.0f / (nearZ - farZ);
|
||||||
|
|
||||||
|
proj[2][2] = farZ * fn;
|
||||||
|
proj[3][2] = nearZ * farZ * fn;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief decomposes frustum values of perspective projection
|
||||||
|
* with angle values with a right-hand coordinate system and a
|
||||||
|
* clip-space of [0, 1].
|
||||||
|
*
|
||||||
|
* @param[in] proj perspective projection matrix
|
||||||
|
* @param[out] nearZ near
|
||||||
|
* @param[out] farZ far
|
||||||
|
* @param[out] top top
|
||||||
|
* @param[out] bottom bottom
|
||||||
|
* @param[out] left left
|
||||||
|
* @param[out] right right
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_persp_decomp_rh_zo(mat4 proj,
|
||||||
|
float * __restrict nearZ, float * __restrict farZ,
|
||||||
|
float * __restrict top, float * __restrict bottom,
|
||||||
|
float * __restrict left, float * __restrict right) {
|
||||||
|
float m00, m11, m20, m21, m22, m32, n, f;
|
||||||
|
float n_m11, n_m00;
|
||||||
|
|
||||||
|
m00 = proj[0][0];
|
||||||
|
m11 = proj[1][1];
|
||||||
|
m20 = proj[2][0];
|
||||||
|
m21 = proj[2][1];
|
||||||
|
m22 = proj[2][2];
|
||||||
|
m32 = proj[3][2];
|
||||||
|
|
||||||
|
n = m32 / m22;
|
||||||
|
f = m32 / (m22 + 1.0f);
|
||||||
|
|
||||||
|
n_m11 = n / m11;
|
||||||
|
n_m00 = n / m00;
|
||||||
|
|
||||||
|
*nearZ = n;
|
||||||
|
*farZ = f;
|
||||||
|
*bottom = n_m11 * (m21 - 1.0f);
|
||||||
|
*top = n_m11 * (m21 + 1.0f);
|
||||||
|
*left = n_m00 * (m20 - 1.0f);
|
||||||
|
*right = n_m00 * (m20 + 1.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief decomposes frustum values of perspective projection
|
||||||
|
* with angle values with a right-hand coordinate system and a
|
||||||
|
* clip-space of [0, 1].
|
||||||
|
* this makes easy to get all values at once
|
||||||
|
*
|
||||||
|
* @param[in] proj perspective projection matrix
|
||||||
|
* @param[out] dest array
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_persp_decompv_rh_zo(mat4 proj, float dest[6]) {
|
||||||
|
glm_persp_decomp_rh_zo(proj, &dest[0], &dest[1], &dest[2],
|
||||||
|
&dest[3], &dest[4], &dest[5]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief decomposes left and right values of perspective projection (ZO).
|
||||||
|
* x stands for x axis (left / right axis)
|
||||||
|
*
|
||||||
|
* @param[in] proj perspective projection matrix
|
||||||
|
* @param[out] left left
|
||||||
|
* @param[out] right right
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_persp_decomp_x_rh_zo(mat4 proj,
|
||||||
|
float * __restrict left,
|
||||||
|
float * __restrict right) {
|
||||||
|
float nearZ, m20, m00, m22;
|
||||||
|
|
||||||
|
m00 = proj[0][0];
|
||||||
|
m20 = proj[2][0];
|
||||||
|
m22 = proj[2][2];
|
||||||
|
|
||||||
|
nearZ = proj[3][2] / m22;
|
||||||
|
*left = nearZ * (m20 - 1.0f) / m00;
|
||||||
|
*right = nearZ * (m20 + 1.0f) / m00;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief decomposes top and bottom values of perspective projection
|
||||||
|
* with angle values with a right-hand coordinate system and a
|
||||||
|
* clip-space of [0, 1].
|
||||||
|
* y stands for y axis (top / bottom axis)
|
||||||
|
*
|
||||||
|
* @param[in] proj perspective projection matrix
|
||||||
|
* @param[out] top top
|
||||||
|
* @param[out] bottom bottom
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_persp_decomp_y_rh_zo(mat4 proj,
|
||||||
|
float * __restrict top,
|
||||||
|
float * __restrict bottom) {
|
||||||
|
float nearZ, m21, m11, m22;
|
||||||
|
|
||||||
|
m21 = proj[2][1];
|
||||||
|
m11 = proj[1][1];
|
||||||
|
m22 = proj[2][2];
|
||||||
|
|
||||||
|
nearZ = proj[3][2] / m22;
|
||||||
|
*bottom = nearZ * (m21 - 1) / m11;
|
||||||
|
*top = nearZ * (m21 + 1) / m11;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief decomposes near and far values of perspective projection
|
||||||
|
* with angle values with a right-hand coordinate system and a
|
||||||
|
* clip-space of [0, 1].
|
||||||
|
* z stands for z axis (near / far axis)
|
||||||
|
*
|
||||||
|
* @param[in] proj perspective projection matrix
|
||||||
|
* @param[out] nearZ near
|
||||||
|
* @param[out] farZ far
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_persp_decomp_z_rh_zo(mat4 proj,
|
||||||
|
float * __restrict nearZ,
|
||||||
|
float * __restrict farZ) {
|
||||||
|
float m32, m22;
|
||||||
|
|
||||||
|
m32 = proj[3][2];
|
||||||
|
m22 = proj[2][2];
|
||||||
|
|
||||||
|
*nearZ = m32 / m22;
|
||||||
|
*farZ = m32 / (m22 + 1.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief decomposes far value of perspective projection
|
||||||
|
* with angle values with a right-hand coordinate system and a
|
||||||
|
* clip-space of [0, 1].
|
||||||
|
*
|
||||||
|
* @param[in] proj perspective projection matrix
|
||||||
|
* @param[out] farZ far
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_persp_decomp_far_rh_zo(mat4 proj, float * __restrict farZ) {
|
||||||
|
*farZ = proj[3][2] / (proj[2][2] + 1.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief decomposes near value of perspective projection
|
||||||
|
* with angle values with a right-hand coordinate system and a
|
||||||
|
* clip-space of [0, 1].
|
||||||
|
*
|
||||||
|
* @param[in] proj perspective projection matrix
|
||||||
|
* @param[out] nearZ near
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_persp_decomp_near_rh_zo(mat4 proj, float * __restrict nearZ) {
|
||||||
|
*nearZ = proj[3][2] / proj[2][2];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief returns sizes of near and far planes of perspective projection
|
||||||
|
* with a right-hand coordinate system and a
|
||||||
|
* clip-space of [0, 1].
|
||||||
|
*
|
||||||
|
* @param[in] proj perspective projection matrix
|
||||||
|
* @param[in] fovy fovy (see brief)
|
||||||
|
* @param[out] dest sizes order: [Wnear, Hnear, Wfar, Hfar]
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_persp_sizes_rh_zo(mat4 proj, float fovy, vec4 dest) {
|
||||||
|
float t, a, nearZ, farZ;
|
||||||
|
|
||||||
|
t = 2.0f * tanf(fovy * 0.5f);
|
||||||
|
a = glm_persp_aspect(proj);
|
||||||
|
|
||||||
|
glm_persp_decomp_z_rh_zo(proj, &nearZ, &farZ);
|
||||||
|
|
||||||
|
dest[1] = t * nearZ;
|
||||||
|
dest[3] = t * farZ;
|
||||||
|
dest[0] = a * dest[1];
|
||||||
|
dest[2] = a * dest[3];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief returns field of view angle along the Y-axis (in radians)
|
||||||
|
* with a right-hand coordinate system and a clip-space of [0, 1].
|
||||||
|
*
|
||||||
|
* if you need to degrees, use glm_deg to convert it or use this:
|
||||||
|
* fovy_deg = glm_deg(glm_persp_fovy(projMatrix))
|
||||||
|
*
|
||||||
|
* @param[in] proj perspective projection matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_persp_fovy_rh_zo(mat4 proj) {
|
||||||
|
return glm_persp_fovy(proj);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief returns aspect ratio of perspective projection
|
||||||
|
* with a right-hand coordinate system and a clip-space of [0, 1].
|
||||||
|
*
|
||||||
|
* @param[in] proj perspective projection matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_persp_aspect_rh_zo(mat4 proj) {
|
||||||
|
return glm_persp_aspect(proj);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /*cglm_persp_rh_zo_h*/
|
||||||
86
include/cglm/clipspace/project_no.h
Normal file
86
include/cglm/clipspace/project_no.h
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
/*
|
||||||
|
* 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];
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* cglm_project_no_h */
|
||||||
88
include/cglm/clipspace/project_zo.h
Normal file
88
include/cglm/clipspace/project_zo.h
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
/*
|
||||||
|
* 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];
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* cglm_project_zo_h */
|
||||||
99
include/cglm/clipspace/view_lh.h
Normal file
99
include/cglm/clipspace/view_lh.h
Normal file
@@ -0,0 +1,99 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Functions:
|
||||||
|
CGLM_INLINE void glm_lookat_lh(vec3 eye, vec3 center, vec3 up, mat4 dest)
|
||||||
|
CGLM_INLINE void glm_look_lh(vec3 eye, vec3 dir, vec3 up, mat4 dest)
|
||||||
|
CGLM_INLINE void glm_look_anyup_lh(vec3 eye, vec3 dir, mat4 dest)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglm_view_lh_h
|
||||||
|
#define cglm_view_lh_h
|
||||||
|
|
||||||
|
#include "../common.h"
|
||||||
|
#include "../plane.h"
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief set up view matrix (LH)
|
||||||
|
*
|
||||||
|
* NOTE: The UP vector must not be parallel to the line of sight from
|
||||||
|
* the eye point to the reference point
|
||||||
|
*
|
||||||
|
* @param[in] eye eye vector
|
||||||
|
* @param[in] center center vector
|
||||||
|
* @param[in] up up vector
|
||||||
|
* @param[out] dest result matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_lookat_lh(vec3 eye, vec3 center, vec3 up, mat4 dest) {
|
||||||
|
CGLM_ALIGN(8) vec3 f, u, s;
|
||||||
|
|
||||||
|
glm_vec3_sub(center, eye, f);
|
||||||
|
glm_vec3_normalize(f);
|
||||||
|
|
||||||
|
glm_vec3_crossn(f, up, s);
|
||||||
|
glm_vec3_cross(s, f, u);
|
||||||
|
|
||||||
|
dest[0][0] = s[0];
|
||||||
|
dest[0][1] = u[0];
|
||||||
|
dest[0][2] = f[0];
|
||||||
|
dest[1][0] = s[1];
|
||||||
|
dest[1][1] = u[1];
|
||||||
|
dest[1][2] = f[1];
|
||||||
|
dest[2][0] = s[2];
|
||||||
|
dest[2][1] = u[2];
|
||||||
|
dest[2][2] = f[2];
|
||||||
|
dest[3][0] =-glm_vec3_dot(s, eye);
|
||||||
|
dest[3][1] =-glm_vec3_dot(u, eye);
|
||||||
|
dest[3][2] =-glm_vec3_dot(f, eye);
|
||||||
|
dest[0][3] = dest[1][3] = dest[2][3] = 0.0f;
|
||||||
|
dest[3][3] = 1.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief set up view matrix with left handed coordinate system
|
||||||
|
*
|
||||||
|
* convenient wrapper for lookat: if you only have direction not target self
|
||||||
|
* then this might be useful. Because you need to get target from direction.
|
||||||
|
*
|
||||||
|
* NOTE: The UP vector must not be parallel to the line of sight from
|
||||||
|
* the eye point to the reference point
|
||||||
|
*
|
||||||
|
* @param[in] eye eye vector
|
||||||
|
* @param[in] dir direction vector
|
||||||
|
* @param[in] up up vector
|
||||||
|
* @param[out] dest result matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_look_lh(vec3 eye, vec3 dir, vec3 up, mat4 dest) {
|
||||||
|
CGLM_ALIGN(8) vec3 target;
|
||||||
|
glm_vec3_add(eye, dir, target);
|
||||||
|
glm_lookat_lh(eye, target, up, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief set up view matrix with left handed coordinate system
|
||||||
|
*
|
||||||
|
* convenient wrapper for look: if you only have direction and if you don't
|
||||||
|
* care what UP vector is then this might be useful to create view matrix
|
||||||
|
*
|
||||||
|
* @param[in] eye eye vector
|
||||||
|
* @param[in] dir direction vector
|
||||||
|
* @param[out] dest result matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_look_anyup_lh(vec3 eye, vec3 dir, mat4 dest) {
|
||||||
|
CGLM_ALIGN(8) vec3 up;
|
||||||
|
glm_vec3_ortho(dir, up);
|
||||||
|
glm_look_lh(eye, dir, up, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /*cglm_view_lh_h*/
|
||||||
74
include/cglm/clipspace/view_lh_no.h
Normal file
74
include/cglm/clipspace/view_lh_no.h
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Functions:
|
||||||
|
CGLM_INLINE void glm_lookat_lh_no(vec3 eye, vec3 center, vec3 up, mat4 dest)
|
||||||
|
CGLM_INLINE void glm_look_lh_no(vec3 eye, vec3 dir, vec3 up, mat4 dest)
|
||||||
|
CGLM_INLINE void glm_look_anyup_lh_no(vec3 eye, vec3 dir, mat4 dest)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglm_view_lh_no_h
|
||||||
|
#define cglm_view_lh_no_h
|
||||||
|
|
||||||
|
#include "../common.h"
|
||||||
|
#include "view_lh.h"
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief set up view matrix with left handed coordinate system.
|
||||||
|
*
|
||||||
|
* NOTE: The UP vector must not be parallel to the line of sight from
|
||||||
|
* the eye point to the reference point
|
||||||
|
*
|
||||||
|
* @param[in] eye eye vector
|
||||||
|
* @param[in] center center vector
|
||||||
|
* @param[in] up up vector
|
||||||
|
* @param[out] dest result matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_lookat_lh_no(vec3 eye, vec3 center, vec3 up, mat4 dest) {
|
||||||
|
glm_lookat_lh(eye, center, up, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief set up view matrix with left handed coordinate system.
|
||||||
|
*
|
||||||
|
* convenient wrapper for lookat: if you only have direction not target self
|
||||||
|
* then this might be useful. Because you need to get target from direction.
|
||||||
|
*
|
||||||
|
* NOTE: The UP vector must not be parallel to the line of sight from
|
||||||
|
* the eye point to the reference point
|
||||||
|
*
|
||||||
|
* @param[in] eye eye vector
|
||||||
|
* @param[in] dir direction vector
|
||||||
|
* @param[in] up up vector
|
||||||
|
* @param[out] dest result matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_look_lh_no(vec3 eye, vec3 dir, vec3 up, mat4 dest) {
|
||||||
|
glm_look_lh(eye, dir, up, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief set up view matrix with left handed coordinate system.
|
||||||
|
*
|
||||||
|
* convenient wrapper for look: if you only have direction and if you don't
|
||||||
|
* care what UP vector is then this might be useful to create view matrix
|
||||||
|
*
|
||||||
|
* @param[in] eye eye vector
|
||||||
|
* @param[in] dir direction vector
|
||||||
|
* @param[out] dest result matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_look_anyup_lh_no(vec3 eye, vec3 dir, mat4 dest) {
|
||||||
|
glm_look_anyup_lh(eye, dir, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /*cglm_view_lh_no_h*/
|
||||||
74
include/cglm/clipspace/view_lh_zo.h
Normal file
74
include/cglm/clipspace/view_lh_zo.h
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Functions:
|
||||||
|
CGLM_INLINE void glm_lookat_lh_zo(vec3 eye, vec3 center, vec3 up, mat4 dest)
|
||||||
|
CGLM_INLINE void glm_look_lh_zo(vec3 eye, vec3 dir, vec3 up, mat4 dest)
|
||||||
|
CGLM_INLINE void glm_look_anyup_lh_zo(vec3 eye, vec3 dir, mat4 dest)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglm_view_lh_zo_h
|
||||||
|
#define cglm_view_lh_zo_h
|
||||||
|
|
||||||
|
#include "../common.h"
|
||||||
|
#include "view_lh.h"
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief set up view matrix with left handed coordinate system.
|
||||||
|
*
|
||||||
|
* NOTE: The UP vector must not be parallel to the line of sight from
|
||||||
|
* the eye point to the reference point
|
||||||
|
*
|
||||||
|
* @param[in] eye eye vector
|
||||||
|
* @param[in] center center vector
|
||||||
|
* @param[in] up up vector
|
||||||
|
* @param[out] dest result matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_lookat_lh_zo(vec3 eye, vec3 center, vec3 up, mat4 dest) {
|
||||||
|
glm_lookat_lh(eye, center, up, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief set up view matrix with left handed coordinate system.
|
||||||
|
*
|
||||||
|
* convenient wrapper for lookat: if you only have direction not target self
|
||||||
|
* then this might be useful. Because you need to get target from direction.
|
||||||
|
*
|
||||||
|
* NOTE: The UP vector must not be parallel to the line of sight from
|
||||||
|
* the eye point to the reference point
|
||||||
|
*
|
||||||
|
* @param[in] eye eye vector
|
||||||
|
* @param[in] dir direction vector
|
||||||
|
* @param[in] up up vector
|
||||||
|
* @param[out] dest result matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_look_lh_zo(vec3 eye, vec3 dir, vec3 up, mat4 dest) {
|
||||||
|
glm_look_lh(eye, dir, up, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief set up view matrix with left handed coordinate system.
|
||||||
|
*
|
||||||
|
* convenient wrapper for look: if you only have direction and if you don't
|
||||||
|
* care what UP vector is then this might be useful to create view matrix
|
||||||
|
*
|
||||||
|
* @param[in] eye eye vector
|
||||||
|
* @param[in] dir direction vector
|
||||||
|
* @param[out] dest result matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_look_anyup_lh_zo(vec3 eye, vec3 dir, mat4 dest) {
|
||||||
|
glm_look_anyup_lh(eye, dir, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /*cglm_view_lh_zo_h*/
|
||||||
99
include/cglm/clipspace/view_rh.h
Normal file
99
include/cglm/clipspace/view_rh.h
Normal file
@@ -0,0 +1,99 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Functions:
|
||||||
|
CGLM_INLINE void glm_lookat_rh(vec3 eye, vec3 center, vec3 up, mat4 dest)
|
||||||
|
CGLM_INLINE void glm_look_rh(vec3 eye, vec3 dir, vec3 up, mat4 dest)
|
||||||
|
CGLM_INLINE void glm_look_anyup_rh(vec3 eye, vec3 dir, mat4 dest)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglm_view_rh_h
|
||||||
|
#define cglm_view_rh_h
|
||||||
|
|
||||||
|
#include "../common.h"
|
||||||
|
#include "../plane.h"
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief set up view matrix with right handed coordinate system.
|
||||||
|
*
|
||||||
|
* NOTE: The UP vector must not be parallel to the line of sight from
|
||||||
|
* the eye point to the reference point
|
||||||
|
*
|
||||||
|
* @param[in] eye eye vector
|
||||||
|
* @param[in] center center vector
|
||||||
|
* @param[in] up up vector
|
||||||
|
* @param[out] dest result matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_lookat_rh(vec3 eye, vec3 center, vec3 up, mat4 dest) {
|
||||||
|
CGLM_ALIGN(8) vec3 f, u, s;
|
||||||
|
|
||||||
|
glm_vec3_sub(center, eye, f);
|
||||||
|
glm_vec3_normalize(f);
|
||||||
|
|
||||||
|
glm_vec3_crossn(f, up, s);
|
||||||
|
glm_vec3_cross(s, f, u);
|
||||||
|
|
||||||
|
dest[0][0] = s[0];
|
||||||
|
dest[0][1] = u[0];
|
||||||
|
dest[0][2] =-f[0];
|
||||||
|
dest[1][0] = s[1];
|
||||||
|
dest[1][1] = u[1];
|
||||||
|
dest[1][2] =-f[1];
|
||||||
|
dest[2][0] = s[2];
|
||||||
|
dest[2][1] = u[2];
|
||||||
|
dest[2][2] =-f[2];
|
||||||
|
dest[3][0] =-glm_vec3_dot(s, eye);
|
||||||
|
dest[3][1] =-glm_vec3_dot(u, eye);
|
||||||
|
dest[3][2] = glm_vec3_dot(f, eye);
|
||||||
|
dest[0][3] = dest[1][3] = dest[2][3] = 0.0f;
|
||||||
|
dest[3][3] = 1.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief set up view matrix with right handed coordinate system.
|
||||||
|
*
|
||||||
|
* convenient wrapper for lookat: if you only have direction not target self
|
||||||
|
* then this might be useful. Because you need to get target from direction.
|
||||||
|
*
|
||||||
|
* NOTE: The UP vector must not be parallel to the line of sight from
|
||||||
|
* the eye point to the reference point
|
||||||
|
*
|
||||||
|
* @param[in] eye eye vector
|
||||||
|
* @param[in] dir direction vector
|
||||||
|
* @param[in] up up vector
|
||||||
|
* @param[out] dest result matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_look_rh(vec3 eye, vec3 dir, vec3 up, mat4 dest) {
|
||||||
|
CGLM_ALIGN(8) vec3 target;
|
||||||
|
glm_vec3_add(eye, dir, target);
|
||||||
|
glm_lookat_rh(eye, target, up, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief set up view matrix with right handed coordinate system.
|
||||||
|
*
|
||||||
|
* convenient wrapper for look: if you only have direction and if you don't
|
||||||
|
* care what UP vector is then this might be useful to create view matrix
|
||||||
|
*
|
||||||
|
* @param[in] eye eye vector
|
||||||
|
* @param[in] dir direction vector
|
||||||
|
* @param[out] dest result matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_look_anyup_rh(vec3 eye, vec3 dir, mat4 dest) {
|
||||||
|
CGLM_ALIGN(8) vec3 up;
|
||||||
|
glm_vec3_ortho(dir, up);
|
||||||
|
glm_look_rh(eye, dir, up, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /*cglm_view_rh_h*/
|
||||||
74
include/cglm/clipspace/view_rh_no.h
Normal file
74
include/cglm/clipspace/view_rh_no.h
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Functions:
|
||||||
|
CGLM_INLINE void glm_lookat_rh_no(vec3 eye, vec3 center, vec3 up, mat4 dest)
|
||||||
|
CGLM_INLINE void glm_look_rh_no(vec3 eye, vec3 dir, vec3 up, mat4 dest)
|
||||||
|
CGLM_INLINE void glm_look_anyup_rh_no(vec3 eye, vec3 dir, mat4 dest)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglm_view_rh_no_h
|
||||||
|
#define cglm_view_rh_no_h
|
||||||
|
|
||||||
|
#include "../common.h"
|
||||||
|
#include "view_rh.h"
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief set up view matrix with right handed coordinate system.
|
||||||
|
*
|
||||||
|
* NOTE: The UP vector must not be parallel to the line of sight from
|
||||||
|
* the eye point to the reference point
|
||||||
|
*
|
||||||
|
* @param[in] eye eye vector
|
||||||
|
* @param[in] center center vector
|
||||||
|
* @param[in] up up vector
|
||||||
|
* @param[out] dest result matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_lookat_rh_no(vec3 eye, vec3 center, vec3 up, mat4 dest) {
|
||||||
|
glm_lookat_rh(eye, center, up, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief set up view matrix with right handed coordinate system.
|
||||||
|
*
|
||||||
|
* convenient wrapper for lookat: if you only have direction not target self
|
||||||
|
* then this might be useful. Because you need to get target from direction.
|
||||||
|
*
|
||||||
|
* NOTE: The UP vector must not be parallel to the line of sight from
|
||||||
|
* the eye point to the reference point
|
||||||
|
*
|
||||||
|
* @param[in] eye eye vector
|
||||||
|
* @param[in] dir direction vector
|
||||||
|
* @param[in] up up vector
|
||||||
|
* @param[out] dest result matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_look_rh_no(vec3 eye, vec3 dir, vec3 up, mat4 dest) {
|
||||||
|
glm_look_rh(eye, dir, up, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief set up view matrix with right handed coordinate system.
|
||||||
|
*
|
||||||
|
* convenient wrapper for look: if you only have direction and if you don't
|
||||||
|
* care what UP vector is then this might be useful to create view matrix
|
||||||
|
*
|
||||||
|
* @param[in] eye eye vector
|
||||||
|
* @param[in] dir direction vector
|
||||||
|
* @param[out] dest result matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_look_anyup_rh_no(vec3 eye, vec3 dir, mat4 dest) {
|
||||||
|
glm_look_anyup_rh(eye, dir, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /*cglm_view_rh_no_h*/
|
||||||
74
include/cglm/clipspace/view_rh_zo.h
Normal file
74
include/cglm/clipspace/view_rh_zo.h
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Functions:
|
||||||
|
CGLM_INLINE void glm_lookat_rh_zo(vec3 eye, vec3 center, vec3 up, mat4 dest)
|
||||||
|
CGLM_INLINE void glm_look_rh_zo(vec3 eye, vec3 dir, vec3 up, mat4 dest)
|
||||||
|
CGLM_INLINE void glm_look_anyup_rh_zo(vec3 eye, vec3 dir, mat4 dest)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglm_view_rh_zo_h
|
||||||
|
#define cglm_view_rh_zo_h
|
||||||
|
|
||||||
|
#include "../common.h"
|
||||||
|
#include "view_rh.h"
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief set up view matrix with right handed coordinate system.
|
||||||
|
*
|
||||||
|
* NOTE: The UP vector must not be parallel to the line of sight from
|
||||||
|
* the eye point to the reference point
|
||||||
|
*
|
||||||
|
* @param[in] eye eye vector
|
||||||
|
* @param[in] center center vector
|
||||||
|
* @param[in] up up vector
|
||||||
|
* @param[out] dest result matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_lookat_rh_zo(vec3 eye, vec3 center, vec3 up, mat4 dest) {
|
||||||
|
glm_lookat_rh(eye, center, up, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief set up view matrix with right handed coordinate system.
|
||||||
|
*
|
||||||
|
* convenient wrapper for lookat: if you only have direction not target self
|
||||||
|
* then this might be useful. Because you need to get target from direction.
|
||||||
|
*
|
||||||
|
* NOTE: The UP vector must not be parallel to the line of sight from
|
||||||
|
* the eye point to the reference point
|
||||||
|
*
|
||||||
|
* @param[in] eye eye vector
|
||||||
|
* @param[in] dir direction vector
|
||||||
|
* @param[in] up up vector
|
||||||
|
* @param[out] dest result matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_look_rh_zo(vec3 eye, vec3 dir, vec3 up, mat4 dest) {
|
||||||
|
glm_look_rh(eye, dir, up, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief set up view matrix with right handed coordinate system.
|
||||||
|
*
|
||||||
|
* convenient wrapper for look: if you only have direction and if you don't
|
||||||
|
* care what UP vector is then this might be useful to create view matrix
|
||||||
|
*
|
||||||
|
* @param[in] eye eye vector
|
||||||
|
* @param[in] dir direction vector
|
||||||
|
* @param[out] dest result matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_look_anyup_rh_zo(vec3 eye, vec3 dir, mat4 dest) {
|
||||||
|
glm_look_anyup_rh(eye, dir, dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /*cglm_view_rh_zo_h*/
|
||||||
@@ -8,7 +8,13 @@
|
|||||||
#ifndef cglm_common_h
|
#ifndef cglm_common_h
|
||||||
#define cglm_common_h
|
#define cglm_common_h
|
||||||
|
|
||||||
#define _USE_MATH_DEFINES /* for windows */
|
#ifndef _USE_MATH_DEFINES
|
||||||
|
# define _USE_MATH_DEFINES /* for windows */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef _CRT_SECURE_NO_WARNINGS
|
||||||
|
# define _CRT_SECURE_NO_WARNINGS /* for windows */
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
@@ -17,7 +23,9 @@
|
|||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
#if defined(_MSC_VER)
|
#if defined(_MSC_VER)
|
||||||
# ifdef CGLM_DLL
|
# ifdef CGLM_STATIC
|
||||||
|
# define CGLM_EXPORT
|
||||||
|
# elif defined(CGLM_EXPORTS)
|
||||||
# define CGLM_EXPORT __declspec(dllexport)
|
# define CGLM_EXPORT __declspec(dllexport)
|
||||||
# else
|
# else
|
||||||
# define CGLM_EXPORT __declspec(dllimport)
|
# define CGLM_EXPORT __declspec(dllimport)
|
||||||
@@ -34,4 +42,43 @@
|
|||||||
#include "types.h"
|
#include "types.h"
|
||||||
#include "simd/intrin.h"
|
#include "simd/intrin.h"
|
||||||
|
|
||||||
|
#ifndef CGLM_USE_DEFAULT_EPSILON
|
||||||
|
# ifndef GLM_FLT_EPSILON
|
||||||
|
# define GLM_FLT_EPSILON 1e-5
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
# define GLM_FLT_EPSILON FLT_EPSILON
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Clip control: define GLM_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
|
||||||
|
* CGLM to use the left handed coordinate system by default.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define CGLM_CLIP_CONTROL_ZO_BIT (1 << 0) /* ZERO_TO_ONE */
|
||||||
|
#define CGLM_CLIP_CONTROL_NO_BIT (1 << 1) /* NEGATIVE_ONE_TO_ONE */
|
||||||
|
#define CGLM_CLIP_CONTROL_LH_BIT (1 << 2) /* LEFT_HANDED, For DirectX, Metal, Vulkan */
|
||||||
|
#define CGLM_CLIP_CONTROL_RH_BIT (1 << 3) /* RIGHT_HANDED, For OpenGL, default in GLM */
|
||||||
|
|
||||||
|
#define CGLM_CLIP_CONTROL_LH_ZO (CGLM_CLIP_CONTROL_LH_BIT | CGLM_CLIP_CONTROL_ZO_BIT)
|
||||||
|
#define CGLM_CLIP_CONTROL_LH_NO (CGLM_CLIP_CONTROL_LH_BIT | CGLM_CLIP_CONTROL_NO_BIT)
|
||||||
|
#define CGLM_CLIP_CONTROL_RH_ZO (CGLM_CLIP_CONTROL_RH_BIT | CGLM_CLIP_CONTROL_ZO_BIT)
|
||||||
|
#define CGLM_CLIP_CONTROL_RH_NO (CGLM_CLIP_CONTROL_RH_BIT | CGLM_CLIP_CONTROL_NO_BIT)
|
||||||
|
|
||||||
|
#ifdef CGLM_FORCE_DEPTH_ZERO_TO_ONE
|
||||||
|
# ifdef CGLM_FORCE_LEFT_HANDED
|
||||||
|
# define CGLM_CONFIG_CLIP_CONTROL CGLM_CLIP_CONTROL_LH_ZO
|
||||||
|
# else
|
||||||
|
# define CGLM_CONFIG_CLIP_CONTROL CGLM_CLIP_CONTROL_RH_ZO
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
# ifdef CGLM_FORCE_LEFT_HANDED
|
||||||
|
# define CGLM_CONFIG_CLIP_CONTROL CGLM_CLIP_CONTROL_LH_NO
|
||||||
|
# else
|
||||||
|
# define CGLM_CONFIG_CLIP_CONTROL CGLM_CLIP_CONTROL_RH_NO
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* cglm_common_h */
|
#endif /* cglm_common_h */
|
||||||
|
|||||||
@@ -55,8 +55,6 @@ typedef enum glm_euler_seq {
|
|||||||
GLM_EULER_ZYX = 2 << 0 | 1 << 2 | 0 << 4
|
GLM_EULER_ZYX = 2 << 0 | 1 << 2 | 0 << 4
|
||||||
} glm_euler_seq;
|
} glm_euler_seq;
|
||||||
|
|
||||||
typedef glm_euler_seq glm_euler_sq;
|
|
||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
glm_euler_seq
|
glm_euler_seq
|
||||||
glm_euler_order(int ord[3]) {
|
glm_euler_order(int ord[3]) {
|
||||||
|
|||||||
@@ -15,39 +15,130 @@
|
|||||||
CGLM_INLINE void glm_versor_print(versor vec, FILE *ostream);
|
CGLM_INLINE void glm_versor_print(versor vec, FILE *ostream);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
cglm tried to enable print functions in debug mode and disable them in
|
||||||
|
release/production mode to eliminate printing costs.
|
||||||
|
|
||||||
|
if you need to force enable then define CGLM_DEFINE_PRINTS macro not DEBUG one
|
||||||
|
|
||||||
|
Print functions are enabled if:
|
||||||
|
|
||||||
|
- DEBUG or _DEBUG macro is defined (mostly defined automatically in debugging)
|
||||||
|
- CGLM_DEFINE_PRINTS macro is defined including release/production
|
||||||
|
which makes enabled printing always
|
||||||
|
- glmc_ calls for io are always prints
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* DEPRECATED: CGLM_NO_PRINTS_NOOP (use CGLM_DEFINE_PRINTS) */
|
||||||
|
|
||||||
#ifndef cglm_io_h
|
#ifndef cglm_io_h
|
||||||
#define cglm_io_h
|
#define cglm_io_h
|
||||||
|
#if defined(DEBUG) || defined(_DEBUG) \
|
||||||
|
|| defined(CGLM_DEFINE_PRINTS) || defined(CGLM_LIB_SRC) \
|
||||||
|
|| defined(CGLM_NO_PRINTS_NOOP)
|
||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#ifndef CGLM_PRINT_PRECISION
|
||||||
|
# define CGLM_PRINT_PRECISION 5
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef CGLM_PRINT_MAX_TO_SHORT
|
||||||
|
# define CGLM_PRINT_MAX_TO_SHORT 1e5
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef CGLM_PRINT_COLOR
|
||||||
|
# define CGLM_PRINT_COLOR "\033[36m"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef CGLM_PRINT_COLOR_RESET
|
||||||
|
# define CGLM_PRINT_COLOR_RESET "\033[0m"
|
||||||
|
#endif
|
||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat4_print(mat4 matrix,
|
glm_mat4_print(mat4 matrix,
|
||||||
FILE * __restrict ostream) {
|
FILE * __restrict ostream) {
|
||||||
int i;
|
char buff[16];
|
||||||
int j;
|
int i, j, cw[4], cwi;
|
||||||
|
|
||||||
#define m 4
|
#define m 4
|
||||||
#define n 4
|
#define n 4
|
||||||
|
|
||||||
fprintf(ostream, "Matrix (float%dx%d):\n", m, n);
|
fprintf(ostream, "Matrix (float%dx%d): " CGLM_PRINT_COLOR "\n" , m, n);
|
||||||
|
|
||||||
|
cw[0] = cw[1] = cw[2] = cw[3] = 0;
|
||||||
|
|
||||||
for (i = 0; i < m; i++) {
|
for (i = 0; i < m; i++) {
|
||||||
fprintf(ostream, "\t|");
|
|
||||||
for (j = 0; j < n; j++) {
|
for (j = 0; j < n; j++) {
|
||||||
fprintf(ostream, "%0.4f", matrix[j][i]);;
|
if (matrix[i][j] < CGLM_PRINT_MAX_TO_SHORT)
|
||||||
|
cwi = sprintf(buff, "% .*f", CGLM_PRINT_PRECISION, matrix[i][j]);
|
||||||
if (j != n - 1)
|
else
|
||||||
fprintf(ostream, "\t");
|
cwi = sprintf(buff, "% g", matrix[i][j]);
|
||||||
|
cw[i] = GLM_MAX(cw[i], cwi);
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(ostream, "|\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(ostream, "\n");
|
for (i = 0; i < m; i++) {
|
||||||
|
fprintf(ostream, " |");
|
||||||
|
|
||||||
|
for (j = 0; j < n; j++)
|
||||||
|
if (matrix[i][j] < CGLM_PRINT_MAX_TO_SHORT)
|
||||||
|
fprintf(ostream, " % *.*f", cw[j], CGLM_PRINT_PRECISION, matrix[j][i]);
|
||||||
|
else
|
||||||
|
fprintf(ostream, " % *g", cw[j], matrix[j][i]);
|
||||||
|
|
||||||
|
fprintf(ostream, " |\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(ostream, CGLM_PRINT_COLOR_RESET "\n");
|
||||||
|
|
||||||
|
#undef m
|
||||||
|
#undef n
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat3_print(mat3 matrix,
|
||||||
|
FILE * __restrict ostream) {
|
||||||
|
char buff[16];
|
||||||
|
int i, j, cw[4], cwi;
|
||||||
|
|
||||||
|
#define m 3
|
||||||
|
#define n 3
|
||||||
|
|
||||||
|
fprintf(ostream, "Matrix (float%dx%d): " CGLM_PRINT_COLOR "\n", m, n);
|
||||||
|
|
||||||
|
cw[0] = cw[1] = cw[2] = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < m; i++) {
|
||||||
|
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]);
|
||||||
|
else
|
||||||
|
cwi = sprintf(buff, "% g", matrix[i][j]);
|
||||||
|
cw[i] = GLM_MAX(cw[i], cwi);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < m; i++) {
|
||||||
|
fprintf(ostream, " |");
|
||||||
|
|
||||||
|
for (j = 0; j < n; j++)
|
||||||
|
if (matrix[i][j] < CGLM_PRINT_MAX_TO_SHORT)
|
||||||
|
fprintf(ostream, " % *.*f", cw[j], CGLM_PRINT_PRECISION, matrix[j][i]);
|
||||||
|
else
|
||||||
|
fprintf(ostream, " % *g", cw[j], matrix[j][i]);
|
||||||
|
|
||||||
|
fprintf(ostream, " |\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(ostream, CGLM_PRINT_COLOR_RESET "\n");
|
||||||
|
|
||||||
#undef m
|
#undef m
|
||||||
#undef n
|
#undef n
|
||||||
@@ -55,29 +146,41 @@ glm_mat4_print(mat4 matrix,
|
|||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat3_print(mat3 matrix,
|
glm_mat2_print(mat2 matrix,
|
||||||
FILE * __restrict ostream) {
|
FILE * __restrict ostream) {
|
||||||
int i;
|
char buff[16];
|
||||||
int j;
|
int i, j, cw[4], cwi;
|
||||||
|
|
||||||
#define m 3
|
#define m 2
|
||||||
#define n 3
|
#define n 2
|
||||||
|
|
||||||
fprintf(ostream, "Matrix (float%dx%d):\n", m, n);
|
fprintf(ostream, "Matrix (float%dx%d): " CGLM_PRINT_COLOR "\n", m, n);
|
||||||
|
|
||||||
|
cw[0] = cw[1] = 0;
|
||||||
|
|
||||||
for (i = 0; i < m; i++) {
|
for (i = 0; i < m; i++) {
|
||||||
fprintf(ostream, "\t|");
|
|
||||||
for (j = 0; j < n; j++) {
|
for (j = 0; j < n; j++) {
|
||||||
fprintf(ostream, "%0.4f", matrix[j][i]);;
|
if (matrix[i][j] < CGLM_PRINT_MAX_TO_SHORT)
|
||||||
|
cwi = sprintf(buff, "% .*f", CGLM_PRINT_PRECISION, matrix[i][j]);
|
||||||
if (j != n - 1)
|
else
|
||||||
fprintf(ostream, "\t");
|
cwi = sprintf(buff, "% g", matrix[i][j]);
|
||||||
|
cw[i] = GLM_MAX(cw[i], cwi);
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(ostream, "|\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(ostream, "\n");
|
for (i = 0; i < m; i++) {
|
||||||
|
fprintf(ostream, " |");
|
||||||
|
|
||||||
|
for (j = 0; j < n; j++)
|
||||||
|
if (matrix[i][j] < CGLM_PRINT_MAX_TO_SHORT)
|
||||||
|
fprintf(ostream, " % *.*f", cw[j], CGLM_PRINT_PRECISION, matrix[j][i]);
|
||||||
|
else
|
||||||
|
fprintf(ostream, " % *g", cw[j], matrix[j][i]);
|
||||||
|
|
||||||
|
fprintf(ostream, " |\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(ostream, CGLM_PRINT_COLOR_RESET "\n");
|
||||||
|
|
||||||
#undef m
|
#undef m
|
||||||
#undef n
|
#undef n
|
||||||
@@ -91,16 +194,16 @@ glm_vec4_print(vec4 vec,
|
|||||||
|
|
||||||
#define m 4
|
#define m 4
|
||||||
|
|
||||||
fprintf(ostream, "Vector (float%d):\n\t|", m);
|
fprintf(ostream, "Vector (float%d): " CGLM_PRINT_COLOR "\n (", m);
|
||||||
|
|
||||||
for (i = 0; i < m; i++) {
|
for (i = 0; i < m; i++) {
|
||||||
fprintf(ostream, "%0.4f", vec[i]);
|
if (vec[i] < CGLM_PRINT_MAX_TO_SHORT)
|
||||||
|
fprintf(ostream, " % .*f", CGLM_PRINT_PRECISION, vec[i]);
|
||||||
if (i != m - 1)
|
else
|
||||||
fprintf(ostream, "\t");
|
fprintf(ostream, " % g", vec[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(ostream, "|\n\n");
|
fprintf(ostream, " )" CGLM_PRINT_COLOR_RESET "\n\n");
|
||||||
|
|
||||||
#undef m
|
#undef m
|
||||||
}
|
}
|
||||||
@@ -113,16 +216,16 @@ glm_vec3_print(vec3 vec,
|
|||||||
|
|
||||||
#define m 3
|
#define m 3
|
||||||
|
|
||||||
fprintf(ostream, "Vector (float%d):\n\t|", m);
|
fprintf(ostream, "Vector (float%d): " CGLM_PRINT_COLOR "\n (", m);
|
||||||
|
|
||||||
for (i = 0; i < m; i++) {
|
for (i = 0; i < m; i++) {
|
||||||
fprintf(ostream, "%0.4f", vec[i]);
|
if (vec[i] < CGLM_PRINT_MAX_TO_SHORT)
|
||||||
|
fprintf(ostream, " % .*f", CGLM_PRINT_PRECISION, vec[i]);
|
||||||
if (i != m - 1)
|
else
|
||||||
fprintf(ostream, "\t");
|
fprintf(ostream, " % g", vec[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(ostream, "|\n\n");
|
fprintf(ostream, " )" CGLM_PRINT_COLOR_RESET "\n\n");
|
||||||
|
|
||||||
#undef m
|
#undef m
|
||||||
}
|
}
|
||||||
@@ -135,17 +238,35 @@ glm_ivec3_print(ivec3 vec,
|
|||||||
|
|
||||||
#define m 3
|
#define m 3
|
||||||
|
|
||||||
fprintf(ostream, "Vector (int%d):\n\t|", m);
|
fprintf(ostream, "Vector (int%d): " CGLM_PRINT_COLOR "\n (", m);
|
||||||
|
|
||||||
|
for (i = 0; i < m; i++)
|
||||||
|
fprintf(ostream, " % d", vec[i]);
|
||||||
|
|
||||||
|
fprintf(ostream, " )" CGLM_PRINT_COLOR_RESET "\n\n");
|
||||||
|
|
||||||
|
#undef m
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_vec2_print(vec2 vec,
|
||||||
|
FILE * __restrict ostream) {
|
||||||
|
int i;
|
||||||
|
|
||||||
|
#define m 2
|
||||||
|
|
||||||
|
fprintf(ostream, "Vector (float%d): " CGLM_PRINT_COLOR "\n (", m);
|
||||||
|
|
||||||
for (i = 0; i < m; i++) {
|
for (i = 0; i < m; i++) {
|
||||||
fprintf(ostream, "%d", vec[i]);
|
if (vec[i] < CGLM_PRINT_MAX_TO_SHORT)
|
||||||
|
fprintf(ostream, " % .*f", CGLM_PRINT_PRECISION, vec[i]);
|
||||||
if (i != m - 1)
|
else
|
||||||
fprintf(ostream, "\t");
|
fprintf(ostream, " % g", vec[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(ostream, "|\n\n");
|
fprintf(ostream, " )" CGLM_PRINT_COLOR_RESET "\n\n");
|
||||||
|
|
||||||
#undef m
|
#undef m
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -157,16 +278,17 @@ glm_versor_print(versor vec,
|
|||||||
|
|
||||||
#define m 4
|
#define m 4
|
||||||
|
|
||||||
fprintf(ostream, "Versor (float%d):\n\t|", m);
|
fprintf(ostream, "Quaternion (float%d): " CGLM_PRINT_COLOR "\n (", m);
|
||||||
|
|
||||||
for (i = 0; i < m; i++) {
|
for (i = 0; i < m; i++) {
|
||||||
fprintf(ostream, "%0.4f", vec[i]);
|
if (vec[i] < CGLM_PRINT_MAX_TO_SHORT)
|
||||||
|
fprintf(ostream, " % .*f", CGLM_PRINT_PRECISION, vec[i]);
|
||||||
if (i != m - 1)
|
else
|
||||||
fprintf(ostream, "\t");
|
fprintf(ostream, " % g", vec[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(ostream, "|\n\n");
|
|
||||||
|
fprintf(ostream, " )" CGLM_PRINT_COLOR_RESET "\n\n");
|
||||||
|
|
||||||
#undef m
|
#undef m
|
||||||
}
|
}
|
||||||
@@ -180,24 +302,43 @@ glm_aabb_print(vec3 bbox[2],
|
|||||||
|
|
||||||
#define m 3
|
#define m 3
|
||||||
|
|
||||||
fprintf(ostream, "AABB (%s):\n", tag ? tag: "float");
|
fprintf(ostream, "AABB (%s): " CGLM_PRINT_COLOR "\n", tag ? tag: "float");
|
||||||
|
|
||||||
for (i = 0; i < 2; i++) {
|
for (i = 0; i < 2; i++) {
|
||||||
fprintf(ostream, "\t|");
|
fprintf(ostream, " (");
|
||||||
|
|
||||||
for (j = 0; j < m; j++) {
|
for (j = 0; j < m; j++) {
|
||||||
fprintf(ostream, "%0.4f", bbox[i][j]);
|
if (bbox[i][j] < CGLM_PRINT_MAX_TO_SHORT)
|
||||||
|
fprintf(ostream, " % .*f", CGLM_PRINT_PRECISION, bbox[i][j]);
|
||||||
if (j != m - 1)
|
else
|
||||||
fprintf(ostream, "\t");
|
fprintf(ostream, " % g", bbox[i][j]);
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(ostream, "|\n");
|
fprintf(ostream, " )\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(ostream, "\n");
|
fprintf(ostream, CGLM_PRINT_COLOR_RESET "\n");
|
||||||
|
|
||||||
#undef m
|
#undef m
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
/* NOOP: Remove print from DEBUG */
|
||||||
|
#define glm_mat4_print(v, s) (void)v; (void)s;
|
||||||
|
#define glm_mat3_print(v, s) (void)v; (void)s;
|
||||||
|
#define glm_mat2_print(v, s) (void)v; (void)s;
|
||||||
|
#define glm_vec4_print(v, s) (void)v; (void)s;
|
||||||
|
#define glm_vec3_print(v, s) (void)v; (void)s;
|
||||||
|
#define glm_ivec3_print(v, s) (void)v; (void)s;
|
||||||
|
#define glm_vec2_print(v, s) (void)v; (void)s;
|
||||||
|
#define glm_versor_print(v, s) (void)v; (void)s;
|
||||||
|
#define glm_aabb_print(v, t, s) (void)v; (void)t; (void)s;
|
||||||
|
|
||||||
|
#endif
|
||||||
#endif /* cglm_io_h */
|
#endif /* cglm_io_h */
|
||||||
|
|||||||
337
include/cglm/mat2.h
Normal file
337
include/cglm/mat2.h
Normal file
@@ -0,0 +1,337 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Macros:
|
||||||
|
GLM_MAT2_IDENTITY_INIT
|
||||||
|
GLM_MAT2_ZERO_INIT
|
||||||
|
GLM_MAT2_IDENTITY
|
||||||
|
GLM_MAT2_ZERO
|
||||||
|
|
||||||
|
Functions:
|
||||||
|
CGLM_INLINE void glm_mat2_copy(mat2 mat, mat2 dest)
|
||||||
|
CGLM_INLINE void glm_mat2_identity(mat2 mat)
|
||||||
|
CGLM_INLINE void glm_mat2_identity_array(mat2 * restrict mat, size_t count)
|
||||||
|
CGLM_INLINE void glm_mat2_zero(mat2 mat)
|
||||||
|
CGLM_INLINE void glm_mat2_mul(mat2 m1, mat2 m2, mat2 dest)
|
||||||
|
CGLM_INLINE void glm_mat2_transpose_to(mat2 m, mat2 dest)
|
||||||
|
CGLM_INLINE void glm_mat2_transpose(mat2 m)
|
||||||
|
CGLM_INLINE void glm_mat2_mulv(mat2 m, vec2 v, vec2 dest)
|
||||||
|
CGLM_INLINE float glm_mat2_trace(mat2 m)
|
||||||
|
CGLM_INLINE void glm_mat2_scale(mat2 m, float s)
|
||||||
|
CGLM_INLINE float glm_mat2_det(mat2 mat)
|
||||||
|
CGLM_INLINE void glm_mat2_inv(mat2 mat, mat2 dest)
|
||||||
|
CGLM_INLINE void glm_mat2_swap_col(mat2 mat, int col1, int col2)
|
||||||
|
CGLM_INLINE void glm_mat2_swap_row(mat2 mat, int row1, int row2)
|
||||||
|
CGLM_INLINE float glm_mat2_rmc(vec2 r, mat2 m, vec2 c)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglm_mat2_h
|
||||||
|
#define cglm_mat2_h
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "vec2.h"
|
||||||
|
|
||||||
|
#ifdef CGLM_SSE_FP
|
||||||
|
# include "simd/sse2/mat2.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CGLM_NEON_FP
|
||||||
|
# include "simd/neon/mat2.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define GLM_MAT2_IDENTITY_INIT {{1.0f, 0.0f}, {0.0f, 1.0f}}
|
||||||
|
#define GLM_MAT2_ZERO_INIT {{0.0f, 0.0f}, {0.0f, 0.0f}}
|
||||||
|
|
||||||
|
/* for C only */
|
||||||
|
#define GLM_MAT2_IDENTITY ((mat2)GLM_MAT2_IDENTITY_INIT)
|
||||||
|
#define GLM_MAT2_ZERO ((mat2)GLM_MAT2_ZERO_INIT)
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief copy all members of [mat] to [dest]
|
||||||
|
*
|
||||||
|
* @param[in] mat source
|
||||||
|
* @param[out] dest destination
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat2_copy(mat2 mat, mat2 dest) {
|
||||||
|
glm_vec4_ucopy(mat[0], dest[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief make given matrix identity. It is identical with below,
|
||||||
|
* but it is more easy to do that with this func especially for members
|
||||||
|
* e.g. glm_mat2_identity(aStruct->aMatrix);
|
||||||
|
*
|
||||||
|
* @code
|
||||||
|
* glm_mat2_copy(GLM_MAT2_IDENTITY, mat); // C only
|
||||||
|
*
|
||||||
|
* // or
|
||||||
|
* mat2 mat = GLM_MAT2_IDENTITY_INIT;
|
||||||
|
* @endcode
|
||||||
|
*
|
||||||
|
* @param[in, out] mat destination
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat2_identity(mat2 mat) {
|
||||||
|
CGLM_ALIGN_MAT mat2 t = GLM_MAT2_IDENTITY_INIT;
|
||||||
|
glm_mat2_copy(t, mat);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief make given matrix array's each element identity matrix
|
||||||
|
*
|
||||||
|
* @param[in, out] mat matrix array (must be aligned (16)
|
||||||
|
* if alignment is not disabled)
|
||||||
|
*
|
||||||
|
* @param[in] count count of matrices
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat2_identity_array(mat2 * __restrict mat, size_t count) {
|
||||||
|
CGLM_ALIGN_MAT mat2 t = GLM_MAT2_IDENTITY_INIT;
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
for (i = 0; i < count; i++) {
|
||||||
|
glm_mat2_copy(t, mat[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief make given matrix zero.
|
||||||
|
*
|
||||||
|
* @param[in, out] mat matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat2_zero(mat2 mat) {
|
||||||
|
CGLM_ALIGN_MAT mat2 t = GLM_MAT2_ZERO_INIT;
|
||||||
|
glm_mat2_copy(t, mat);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief multiply m1 and m2 to dest
|
||||||
|
*
|
||||||
|
* m1, m2 and dest matrices can be same matrix, it is possible to write this:
|
||||||
|
*
|
||||||
|
* @code
|
||||||
|
* mat2 m = GLM_MAT2_IDENTITY_INIT;
|
||||||
|
* glm_mat2_mul(m, m, m);
|
||||||
|
* @endcode
|
||||||
|
*
|
||||||
|
* @param[in] m1 left matrix
|
||||||
|
* @param[in] m2 right matrix
|
||||||
|
* @param[out] dest destination matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat2_mul(mat2 m1, mat2 m2, mat2 dest) {
|
||||||
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
|
glm_mat2_mul_sse2(m1, m2, dest);
|
||||||
|
#elif defined(CGLM_NEON_FP)
|
||||||
|
glm_mat2_mul_neon(m1, m2, dest);
|
||||||
|
#else
|
||||||
|
float a00 = m1[0][0], a01 = m1[0][1],
|
||||||
|
a10 = m1[1][0], a11 = m1[1][1],
|
||||||
|
b00 = m2[0][0], b01 = m2[0][1],
|
||||||
|
b10 = m2[1][0], b11 = m2[1][1];
|
||||||
|
|
||||||
|
dest[0][0] = a00 * b00 + a10 * b01;
|
||||||
|
dest[0][1] = a01 * b00 + a11 * b01;
|
||||||
|
dest[1][0] = a00 * b10 + a10 * b11;
|
||||||
|
dest[1][1] = a01 * b10 + a11 * b11;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief transpose mat2 and store in dest
|
||||||
|
*
|
||||||
|
* source matrix will not be transposed unless dest is m
|
||||||
|
*
|
||||||
|
* @param[in] m matrix
|
||||||
|
* @param[out] dest result
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat2_transpose_to(mat2 m, mat2 dest) {
|
||||||
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
|
glm_mat2_transp_sse2(m, dest);
|
||||||
|
#else
|
||||||
|
dest[0][0] = m[0][0];
|
||||||
|
dest[0][1] = m[1][0];
|
||||||
|
dest[1][0] = m[0][1];
|
||||||
|
dest[1][1] = m[1][1];
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief tranpose mat2 and store result in same matrix
|
||||||
|
*
|
||||||
|
* @param[in, out] m source and dest
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat2_transpose(mat2 m) {
|
||||||
|
float tmp;
|
||||||
|
tmp = m[0][1];
|
||||||
|
m[0][1] = m[1][0];
|
||||||
|
m[1][0] = tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief multiply mat2 with vec2 (column vector) and store in dest vector
|
||||||
|
*
|
||||||
|
* @param[in] m mat2 (left)
|
||||||
|
* @param[in] v vec2 (right, column vector)
|
||||||
|
* @param[out] dest vec2 (result, column vector)
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat2_mulv(mat2 m, vec2 v, vec2 dest) {
|
||||||
|
dest[0] = m[0][0] * v[0] + m[1][0] * v[1];
|
||||||
|
dest[1] = m[0][1] * v[0] + m[1][1] * v[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief trace of matrix
|
||||||
|
*
|
||||||
|
* sum of the elements on the main diagonal from upper left to the lower right
|
||||||
|
*
|
||||||
|
* @param[in] m matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_mat2_trace(mat2 m) {
|
||||||
|
return m[0][0] + m[1][1];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief scale (multiply with scalar) matrix
|
||||||
|
*
|
||||||
|
* multiply matrix with scalar
|
||||||
|
*
|
||||||
|
* @param[in, out] m matrix
|
||||||
|
* @param[in] s scalar
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat2_scale(mat2 m, float s) {
|
||||||
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
|
glmm_store(m[0], _mm_mul_ps(_mm_loadu_ps(m[0]), _mm_set1_ps(s)));
|
||||||
|
#elif defined(CGLM_NEON_FP)
|
||||||
|
vst1q_f32(m[0], vmulq_f32(vld1q_f32(m[0]), vdupq_n_f32(s)));
|
||||||
|
#else
|
||||||
|
m[0][0] = m[0][0] * s;
|
||||||
|
m[0][1] = m[0][1] * s;
|
||||||
|
m[1][0] = m[1][0] * s;
|
||||||
|
m[1][1] = m[1][1] * s;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief mat2 determinant
|
||||||
|
*
|
||||||
|
* @param[in] mat matrix
|
||||||
|
*
|
||||||
|
* @return determinant
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_mat2_det(mat2 mat) {
|
||||||
|
return mat[0][0] * mat[1][1] - mat[1][0] * mat[0][1];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief inverse mat2 and store in dest
|
||||||
|
*
|
||||||
|
* @param[in] mat matrix
|
||||||
|
* @param[out] dest inverse matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat2_inv(mat2 mat, mat2 dest) {
|
||||||
|
float det;
|
||||||
|
float a = mat[0][0], b = mat[0][1],
|
||||||
|
c = mat[1][0], d = mat[1][1];
|
||||||
|
|
||||||
|
det = 1.0f / (a * d - b * c);
|
||||||
|
|
||||||
|
dest[0][0] = d * det;
|
||||||
|
dest[0][1] = -b * det;
|
||||||
|
dest[1][0] = -c * det;
|
||||||
|
dest[1][1] = a * det;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief swap two matrix columns
|
||||||
|
*
|
||||||
|
* @param[in,out] mat matrix
|
||||||
|
* @param[in] col1 col1
|
||||||
|
* @param[in] col2 col2
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat2_swap_col(mat2 mat, int col1, int col2) {
|
||||||
|
float a, b;
|
||||||
|
|
||||||
|
a = mat[col1][0];
|
||||||
|
b = mat[col1][1];
|
||||||
|
|
||||||
|
mat[col1][0] = mat[col2][0];
|
||||||
|
mat[col1][1] = mat[col2][1];
|
||||||
|
|
||||||
|
mat[col2][0] = a;
|
||||||
|
mat[col2][1] = b;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief swap two matrix rows
|
||||||
|
*
|
||||||
|
* @param[in,out] mat matrix
|
||||||
|
* @param[in] row1 row1
|
||||||
|
* @param[in] row2 row2
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat2_swap_row(mat2 mat, int row1, int row2) {
|
||||||
|
float a, b;
|
||||||
|
|
||||||
|
a = mat[0][row1];
|
||||||
|
b = mat[1][row1];
|
||||||
|
|
||||||
|
mat[0][row1] = mat[0][row2];
|
||||||
|
mat[1][row1] = mat[1][row2];
|
||||||
|
|
||||||
|
mat[0][row2] = a;
|
||||||
|
mat[1][row2] = b;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief helper for R (row vector) * M (matrix) * C (column vector)
|
||||||
|
*
|
||||||
|
* rmc stands for Row * Matrix * Column
|
||||||
|
*
|
||||||
|
* the result is scalar because R * M = Matrix1x2 (row vector),
|
||||||
|
* then Matrix1x2 * Vec2 (column vector) = Matrix1x1 (Scalar)
|
||||||
|
*
|
||||||
|
* @param[in] r row vector or matrix1x2
|
||||||
|
* @param[in] m matrix2x2
|
||||||
|
* @param[in] c column vector or matrix2x1
|
||||||
|
*
|
||||||
|
* @return scalar value e.g. Matrix1x1
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_mat2_rmc(vec2 r, mat2 m, vec2 c) {
|
||||||
|
vec2 tmp;
|
||||||
|
glm_mat2_mulv(m, c, tmp);
|
||||||
|
return glm_vec2_dot(r, tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* cglm_mat2_h */
|
||||||
@@ -228,9 +228,11 @@ glm_mat3_transpose(mat3 m) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat3_mulv(mat3 m, vec3 v, vec3 dest) {
|
glm_mat3_mulv(mat3 m, vec3 v, vec3 dest) {
|
||||||
dest[0] = m[0][0] * v[0] + m[1][0] * v[1] + m[2][0] * v[2];
|
vec3 res;
|
||||||
dest[1] = m[0][1] * v[0] + m[1][1] * v[1] + m[2][1] * v[2];
|
res[0] = m[0][0] * v[0] + m[1][0] * v[1] + m[2][0] * v[2];
|
||||||
dest[2] = m[0][2] * v[0] + m[1][2] * v[1] + m[2][2] * v[2];
|
res[1] = m[0][1] * v[0] + m[1][1] * v[1] + m[2][1] * v[2];
|
||||||
|
res[2] = m[0][2] * v[0] + m[1][2] * v[1] + m[2][2] * v[2];
|
||||||
|
glm_vec3_copy(res, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
|||||||
@@ -187,8 +187,29 @@ glm_mat4_identity_array(mat4 * __restrict mat, size_t count) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat4_zero(mat4 mat) {
|
glm_mat4_zero(mat4 mat) {
|
||||||
|
#ifdef __AVX__
|
||||||
|
__m256 y0;
|
||||||
|
y0 = _mm256_setzero_ps();
|
||||||
|
glmm_store256(mat[0], y0);
|
||||||
|
glmm_store256(mat[2], y0);
|
||||||
|
#elif defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
|
glmm_128 x0;
|
||||||
|
x0 = _mm_setzero_ps();
|
||||||
|
glmm_store(mat[0], x0);
|
||||||
|
glmm_store(mat[1], x0);
|
||||||
|
glmm_store(mat[2], x0);
|
||||||
|
glmm_store(mat[3], x0);
|
||||||
|
#elif defined(CGLM_NEON_FP)
|
||||||
|
glmm_128 x0;
|
||||||
|
x0 = vdupq_n_f32(0.0f);
|
||||||
|
vst1q_f32(mat[0], x0);
|
||||||
|
vst1q_f32(mat[1], x0);
|
||||||
|
vst1q_f32(mat[2], x0);
|
||||||
|
vst1q_f32(mat[3], x0);
|
||||||
|
#else
|
||||||
CGLM_ALIGN_MAT mat4 t = GLM_MAT4_ZERO_INIT;
|
CGLM_ALIGN_MAT mat4 t = GLM_MAT4_ZERO_INIT;
|
||||||
glm_mat4_copy(t, mat);
|
glm_mat4_copy(t, mat);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -358,6 +379,8 @@ void
|
|||||||
glm_mat4_mulv(mat4 m, vec4 v, vec4 dest) {
|
glm_mat4_mulv(mat4 m, vec4 v, vec4 dest) {
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
glm_mat4_mulv_sse2(m, v, dest);
|
glm_mat4_mulv_sse2(m, v, dest);
|
||||||
|
#elif defined(CGLM_NEON_FP)
|
||||||
|
glm_mat4_mulv_neon(m, v, dest);
|
||||||
#else
|
#else
|
||||||
vec4 res;
|
vec4 res;
|
||||||
res[0] = m[0][0] * v[0] + m[1][0] * v[1] + m[2][0] * v[2] + m[3][0] * v[3];
|
res[0] = m[0][0] * v[0] + m[1][0] * v[1] + m[2][0] * v[2] + m[3][0] * v[3];
|
||||||
@@ -476,6 +499,8 @@ void
|
|||||||
glm_mat4_transpose_to(mat4 m, mat4 dest) {
|
glm_mat4_transpose_to(mat4 m, mat4 dest) {
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
glm_mat4_transp_sse2(m, dest);
|
glm_mat4_transp_sse2(m, dest);
|
||||||
|
#elif defined(CGLM_NEON_FP)
|
||||||
|
glm_mat4_transp_neon(m, dest);
|
||||||
#else
|
#else
|
||||||
dest[0][0] = m[0][0]; dest[1][0] = m[0][1];
|
dest[0][0] = m[0][0]; dest[1][0] = m[0][1];
|
||||||
dest[0][1] = m[1][0]; dest[1][1] = m[1][1];
|
dest[0][1] = m[1][0]; dest[1][1] = m[1][1];
|
||||||
@@ -498,6 +523,8 @@ void
|
|||||||
glm_mat4_transpose(mat4 m) {
|
glm_mat4_transpose(mat4 m) {
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
glm_mat4_transp_sse2(m, m);
|
glm_mat4_transp_sse2(m, m);
|
||||||
|
#elif defined(CGLM_NEON_FP)
|
||||||
|
glm_mat4_transp_neon(m, m);
|
||||||
#else
|
#else
|
||||||
mat4 d;
|
mat4 d;
|
||||||
glm_mat4_transpose_to(m, d);
|
glm_mat4_transpose_to(m, d);
|
||||||
@@ -533,15 +560,12 @@ glm_mat4_scale_p(mat4 m, float s) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat4_scale(mat4 m, float s) {
|
glm_mat4_scale(mat4 m, float s) {
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#ifdef __AVX__
|
||||||
|
glm_mat4_scale_avx(m, s);
|
||||||
|
#elif defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
glm_mat4_scale_sse2(m, s);
|
glm_mat4_scale_sse2(m, s);
|
||||||
#elif defined(CGLM_NEON_FP)
|
#elif defined(CGLM_NEON_FP)
|
||||||
float32x4_t v0;
|
glm_mat4_scale_neon(m, s);
|
||||||
v0 = vdupq_n_f32(s);
|
|
||||||
vst1q_f32(m[0], vmulq_f32(vld1q_f32(m[0]), v0));
|
|
||||||
vst1q_f32(m[1], vmulq_f32(vld1q_f32(m[1]), v0));
|
|
||||||
vst1q_f32(m[2], vmulq_f32(vld1q_f32(m[2]), v0));
|
|
||||||
vst1q_f32(m[3], vmulq_f32(vld1q_f32(m[3]), v0));
|
|
||||||
#else
|
#else
|
||||||
glm_mat4_scale_p(m, s);
|
glm_mat4_scale_p(m, s);
|
||||||
#endif
|
#endif
|
||||||
@@ -559,6 +583,8 @@ float
|
|||||||
glm_mat4_det(mat4 mat) {
|
glm_mat4_det(mat4 mat) {
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
return glm_mat4_det_sse2(mat);
|
return glm_mat4_det_sse2(mat);
|
||||||
|
#elif defined(CGLM_NEON_FP)
|
||||||
|
return glm_mat4_det_neon(mat);
|
||||||
#else
|
#else
|
||||||
/* [square] det(A) = det(At) */
|
/* [square] det(A) = det(At) */
|
||||||
float t[6];
|
float t[6];
|
||||||
@@ -592,6 +618,8 @@ void
|
|||||||
glm_mat4_inv(mat4 mat, mat4 dest) {
|
glm_mat4_inv(mat4 mat, mat4 dest) {
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
glm_mat4_inv_sse2(mat, dest);
|
glm_mat4_inv_sse2(mat, dest);
|
||||||
|
#elif defined(CGLM_NEON_FP)
|
||||||
|
glm_mat4_inv_neon(mat, dest);
|
||||||
#else
|
#else
|
||||||
float t[6];
|
float t[6];
|
||||||
float det;
|
float det;
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
#define cglm_plane_h
|
#define cglm_plane_h
|
||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
#include "vec3.h"
|
||||||
#include "vec4.h"
|
#include "vec4.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -30,7 +31,14 @@
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_plane_normalize(vec4 plane) {
|
glm_plane_normalize(vec4 plane) {
|
||||||
glm_vec4_scale(plane, 1.0f / glm_vec3_norm(plane), plane);
|
float norm;
|
||||||
|
|
||||||
|
if ((norm = glm_vec3_norm(plane)) == 0.0f) {
|
||||||
|
glm_vec4_zero(plane);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
glm_vec4_scale(plane, 1.0f / norm, plane);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* cglm_plane_h */
|
#endif /* cglm_plane_h */
|
||||||
|
|||||||
@@ -13,6 +13,17 @@
|
|||||||
#include "vec4.h"
|
#include "vec4.h"
|
||||||
#include "mat4.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]
|
* @brief maps the specified viewport coordinates into specified space [1]
|
||||||
* the matrix should contain projection matrix.
|
* the matrix should contain projection matrix.
|
||||||
@@ -42,16 +53,11 @@
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_unprojecti(vec3 pos, mat4 invMat, vec4 vp, vec3 dest) {
|
glm_unprojecti(vec3 pos, mat4 invMat, vec4 vp, vec3 dest) {
|
||||||
vec4 v;
|
#if CGLM_CONFIG_CLIP_CONTROL & CGLM_CLIP_CONTROL_ZO_BIT
|
||||||
|
glm_unprojecti_zo(pos, invMat, vp, dest);
|
||||||
v[0] = 2.0f * (pos[0] - vp[0]) / vp[2] - 1.0f;
|
#elif CGLM_CONFIG_CLIP_CONTROL & CGLM_CLIP_CONTROL_NO_BIT
|
||||||
v[1] = 2.0f * (pos[1] - vp[1]) / vp[3] - 1.0f;
|
glm_unprojecti_no(pos, invMat, vp, dest);
|
||||||
v[2] = 2.0f * pos[2] - 1.0f;
|
#endif
|
||||||
v[3] = 1.0f;
|
|
||||||
|
|
||||||
glm_mat4_mulv(invMat, v, v);
|
|
||||||
glm_vec4_scale(v, 1.0f / v[3], v);
|
|
||||||
glm_vec3(v, dest);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -101,18 +107,44 @@ glm_unproject(vec3 pos, mat4 m, vec4 vp, vec3 dest) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_project(vec3 pos, mat4 m, vec4 vp, vec3 dest) {
|
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 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(vec3 center, vec2 size, vec4 vp, mat4 dest) {
|
||||||
|
mat4 res;
|
||||||
|
vec3 v;
|
||||||
|
|
||||||
glm_mat4_mulv(m, pos4, pos4);
|
if (size[0] <= 0.0f || size[1] <= 0.0f)
|
||||||
glm_vec4_scale(pos4, 1.0f / pos4[3], pos4); /* pos = pos / pos.w */
|
return;
|
||||||
glm_vec4_add(pos4, vone, pos4);
|
|
||||||
glm_vec4_scale(pos4, 0.5f, pos4);
|
/* 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;
|
||||||
|
|
||||||
dest[0] = pos4[0] * vp[2] + vp[0];
|
glm_translate_make(res, v);
|
||||||
dest[1] = pos4[1] * vp[3] + vp[1];
|
|
||||||
dest[2] = pos4[2];
|
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 */
|
#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_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_quatv(versor q, float angle, vec3 axis);
|
||||||
CGLM_INLINE void glm_quat_copy(versor q, versor dest);
|
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 float glm_quat_norm(versor q);
|
||||||
CGLM_INLINE void glm_quat_normalize(versor q);
|
CGLM_INLINE void glm_quat_normalize(versor q);
|
||||||
CGLM_INLINE void glm_quat_normalize_to(versor q, versor dest);
|
CGLM_INLINE void glm_quat_normalize_to(versor q, versor dest);
|
||||||
@@ -38,6 +39,7 @@
|
|||||||
CGLM_INLINE void glm_quat_lerp(versor from, versor to, float t, versor dest);
|
CGLM_INLINE void glm_quat_lerp(versor from, versor to, float t, versor dest);
|
||||||
CGLM_INLINE void glm_quat_lerpc(versor from, versor to, float t, versor dest);
|
CGLM_INLINE void glm_quat_lerpc(versor from, versor to, float t, versor dest);
|
||||||
CGLM_INLINE void glm_quat_slerp(versor q, versor r, float t, versor dest);
|
CGLM_INLINE void glm_quat_slerp(versor q, versor r, float t, versor dest);
|
||||||
|
CGLM_INLINE void glm_quat_nlerp(versor q, versor r, float t, versor dest);
|
||||||
CGLM_INLINE void glm_quat_look(vec3 eye, versor ori, mat4 dest);
|
CGLM_INLINE void glm_quat_look(vec3 eye, versor ori, mat4 dest);
|
||||||
CGLM_INLINE void glm_quat_for(vec3 dir, vec3 fwd, vec3 up, versor dest);
|
CGLM_INLINE void glm_quat_for(vec3 dir, vec3 fwd, vec3 up, versor dest);
|
||||||
CGLM_INLINE void glm_quat_forp(vec3 from,
|
CGLM_INLINE void glm_quat_forp(vec3 from,
|
||||||
@@ -58,26 +60,17 @@
|
|||||||
#include "mat4.h"
|
#include "mat4.h"
|
||||||
#include "mat3.h"
|
#include "mat3.h"
|
||||||
#include "affine-mat.h"
|
#include "affine-mat.h"
|
||||||
|
#include "affine.h"
|
||||||
|
|
||||||
#ifdef CGLM_SSE_FP
|
#ifdef CGLM_SSE_FP
|
||||||
# include "simd/sse2/quat.h"
|
# include "simd/sse2/quat.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
CGLM_INLINE
|
#ifdef CGLM_NEON_FP
|
||||||
void
|
# include "simd/neon/quat.h"
|
||||||
glm_mat4_identity(mat4 mat);
|
#endif
|
||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE void glm_quat_normalize(versor q);
|
||||||
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);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* IMPORTANT:
|
* IMPORTANT:
|
||||||
@@ -194,10 +187,41 @@ glm_quat_copy(versor q, versor dest) {
|
|||||||
glm_vec4_copy(q, 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
|
* @brief returns norm (magnitude) of quaternion
|
||||||
*
|
*
|
||||||
* @param[out] q quaternion
|
* @param[in] q quaternion
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
float
|
float
|
||||||
@@ -416,6 +440,8 @@ glm_quat_mul(versor p, versor q, versor dest) {
|
|||||||
*/
|
*/
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
glm_quat_mul_sse2(p, q, dest);
|
glm_quat_mul_sse2(p, q, dest);
|
||||||
|
#elif defined(CGLM_NEON_FP)
|
||||||
|
glm_quat_mul_neon(p, q, dest);
|
||||||
#else
|
#else
|
||||||
dest[0] = p[3] * q[0] + p[0] * q[3] + p[1] * q[2] - p[2] * q[1];
|
dest[0] = p[3] * q[0] + p[0] * q[3] + p[1] * q[2] - p[2] * q[1];
|
||||||
dest[1] = p[3] * q[1] - p[0] * q[2] + p[1] * q[3] + p[2] * q[0];
|
dest[1] = p[3] * q[1] - p[0] * q[2] + p[1] * q[3] + p[2] * q[0];
|
||||||
@@ -626,6 +652,29 @@ glm_quat_lerpc(versor from, versor to, float t, versor dest) {
|
|||||||
glm_vec4_lerpc(from, to, t, dest);
|
glm_vec4_lerpc(from, to, t, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief interpolates between two quaternions
|
||||||
|
* taking the shortest rotation path using
|
||||||
|
* normalized linear interpolation (NLERP)
|
||||||
|
*
|
||||||
|
* @param[in] from from
|
||||||
|
* @param[in] to to
|
||||||
|
* @param[in] t interpolant (amount)
|
||||||
|
* @param[out] dest result quaternion
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_quat_nlerp(versor from, versor to, float t, versor dest) {
|
||||||
|
versor target;
|
||||||
|
float dot;
|
||||||
|
|
||||||
|
dot = glm_vec4_dot(from, to);
|
||||||
|
|
||||||
|
glm_vec4_scale(to, (dot >= 0) ? 1.0f : -1.0f, target);
|
||||||
|
glm_quat_lerp(from, target, t, dest);
|
||||||
|
glm_quat_normalize(dest);
|
||||||
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief interpolates between two quaternions
|
* @brief interpolates between two quaternions
|
||||||
* using spherical linear interpolation (SLERP)
|
* using spherical linear interpolation (SLERP)
|
||||||
@@ -693,32 +742,23 @@ glm_quat_look(vec3 eye, versor ori, mat4 dest) {
|
|||||||
* @brief creates look rotation quaternion
|
* @brief creates look rotation quaternion
|
||||||
*
|
*
|
||||||
* @param[in] dir direction to look
|
* @param[in] dir direction to look
|
||||||
* @param[in] fwd forward vector
|
|
||||||
* @param[in] up up vector
|
* @param[in] up up vector
|
||||||
* @param[out] dest destination quaternion
|
* @param[out] dest destination quaternion
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_quat_for(vec3 dir, vec3 fwd, vec3 up, versor dest) {
|
glm_quat_for(vec3 dir, vec3 up, versor dest) {
|
||||||
CGLM_ALIGN(8) vec3 axis;
|
CGLM_ALIGN_MAT mat3 m;
|
||||||
float dot, angle;
|
|
||||||
|
|
||||||
dot = glm_vec3_dot(dir, fwd);
|
glm_vec3_normalize_to(dir, m[2]);
|
||||||
if (fabsf(dot + 1.0f) < 0.000001f) {
|
|
||||||
glm_quat_init(dest, up[0], up[1], up[2], GLM_PIf);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fabsf(dot - 1.0f) < 0.000001f) {
|
/* No need to negate in LH, but we use RH here */
|
||||||
glm_quat_identity(dest);
|
glm_vec3_negate(m[2]);
|
||||||
return;
|
|
||||||
}
|
glm_vec3_crossn(up, m[2], m[0]);
|
||||||
|
glm_vec3_cross(m[2], m[0], m[1]);
|
||||||
|
|
||||||
angle = acosf(dot);
|
glm_mat3_quat(m, dest);
|
||||||
glm_cross(fwd, dir, axis);
|
|
||||||
glm_normalize(axis);
|
|
||||||
|
|
||||||
glm_quatv(dest, angle, axis);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -727,16 +767,15 @@ glm_quat_for(vec3 dir, vec3 fwd, vec3 up, versor dest) {
|
|||||||
*
|
*
|
||||||
* @param[in] from source point
|
* @param[in] from source point
|
||||||
* @param[in] to destination point
|
* @param[in] to destination point
|
||||||
* @param[in] fwd forward vector
|
|
||||||
* @param[in] up up vector
|
* @param[in] up up vector
|
||||||
* @param[out] dest destination quaternion
|
* @param[out] dest destination quaternion
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_quat_forp(vec3 from, vec3 to, vec3 fwd, vec3 up, versor dest) {
|
glm_quat_forp(vec3 from, vec3 to, vec3 up, versor dest) {
|
||||||
CGLM_ALIGN(8) vec3 dir;
|
CGLM_ALIGN(8) vec3 dir;
|
||||||
glm_vec3_sub(to, from, dir);
|
glm_vec3_sub(to, from, dir);
|
||||||
glm_quat_for(dir, fwd, up, dest);
|
glm_quat_for(dir, up, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
|||||||
77
include/cglm/ray.h
Normal file
77
include/cglm/ray.h
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Functions:
|
||||||
|
CGLM_INLINE bool glm_line_triangle_intersect(vec3 origin,
|
||||||
|
vec3 direction,
|
||||||
|
vec3 v0,
|
||||||
|
vec3 v1,
|
||||||
|
vec3 v2,
|
||||||
|
float *d);
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglm_ray_h
|
||||||
|
#define cglm_ray_h
|
||||||
|
|
||||||
|
#include "vec3.h"
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Möller–Trumbore ray-triangle intersection algorithm
|
||||||
|
*
|
||||||
|
* @param[in] origin origin of ray
|
||||||
|
* @param[in] direction direction of ray
|
||||||
|
* @param[in] v0 first vertex of triangle
|
||||||
|
* @param[in] v1 second vertex of triangle
|
||||||
|
* @param[in] v2 third vertex of triangle
|
||||||
|
* @param[in, out] d distance to intersection
|
||||||
|
* @return whether there is intersection
|
||||||
|
*/
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
bool
|
||||||
|
glm_ray_triangle(vec3 origin,
|
||||||
|
vec3 direction,
|
||||||
|
vec3 v0,
|
||||||
|
vec3 v1,
|
||||||
|
vec3 v2,
|
||||||
|
float *d) {
|
||||||
|
vec3 edge1, edge2, p, t, q;
|
||||||
|
float det, inv_det, u, v, dist;
|
||||||
|
const float epsilon = 0.000001f;
|
||||||
|
|
||||||
|
glm_vec3_sub(v1, v0, edge1);
|
||||||
|
glm_vec3_sub(v2, v0, edge2);
|
||||||
|
glm_vec3_cross(direction, edge2, p);
|
||||||
|
|
||||||
|
det = glm_vec3_dot(edge1, p);
|
||||||
|
if (det > -epsilon && det < epsilon)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
inv_det = 1.0f / det;
|
||||||
|
|
||||||
|
glm_vec3_sub(origin, v0, t);
|
||||||
|
|
||||||
|
u = inv_det * glm_vec3_dot(t, p);
|
||||||
|
if (u < 0.0f || u > 1.0f)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
glm_vec3_cross(t, edge1, q);
|
||||||
|
|
||||||
|
v = inv_det * glm_vec3_dot(direction, q);
|
||||||
|
if (v < 0.0f || u + v > 1.0f)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
dist = inv_det * glm_vec3_dot(edge2, q);
|
||||||
|
|
||||||
|
if (d)
|
||||||
|
*d = dist;
|
||||||
|
|
||||||
|
return dist > epsilon;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -10,19 +10,56 @@
|
|||||||
#include "intrin.h"
|
#include "intrin.h"
|
||||||
#ifdef CGLM_SIMD_ARM
|
#ifdef CGLM_SIMD_ARM
|
||||||
|
|
||||||
|
#if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || defined(__aarch64__)
|
||||||
|
# define CGLM_ARM64 1
|
||||||
|
#endif
|
||||||
|
|
||||||
#define glmm_load(p) vld1q_f32(p)
|
#define glmm_load(p) vld1q_f32(p)
|
||||||
#define glmm_store(p, a) vst1q_f32(p, a)
|
#define glmm_store(p, a) vst1q_f32(p, a)
|
||||||
|
|
||||||
|
#define glmm_set1(x) vdupq_n_f32(x)
|
||||||
|
#define glmm_128 float32x4_t
|
||||||
|
|
||||||
|
#define glmm_splat_x(x) vdupq_lane_f32(vget_low_f32(x), 0)
|
||||||
|
#define glmm_splat_y(x) vdupq_lane_f32(vget_low_f32(x), 1)
|
||||||
|
#define glmm_splat_z(x) vdupq_lane_f32(vget_high_f32(x), 0)
|
||||||
|
#define glmm_splat_w(x) vdupq_lane_f32(vget_high_f32(x), 1)
|
||||||
|
|
||||||
|
#define glmm_xor(a, b) \
|
||||||
|
vreinterpretq_f32_s32(veorq_s32(vreinterpretq_s32_f32(a), \
|
||||||
|
vreinterpretq_s32_f32(b)))
|
||||||
|
|
||||||
|
#define glmm_swplane(v) vextq_f32(v, v, 2)
|
||||||
|
#define glmm_low(x) vget_low_f32(x)
|
||||||
|
#define glmm_high(x) vget_high_f32(x)
|
||||||
|
|
||||||
|
#define glmm_combine_ll(x, y) vcombine_f32(vget_low_f32(x), vget_low_f32(y))
|
||||||
|
#define glmm_combine_hl(x, y) vcombine_f32(vget_high_f32(x), vget_low_f32(y))
|
||||||
|
#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))
|
||||||
|
|
||||||
static inline
|
static inline
|
||||||
float32x4_t
|
float32x4_t
|
||||||
glmm_abs(float32x4_t v) {
|
glmm_abs(float32x4_t v) {
|
||||||
return vabsq_f32(v);
|
return vabsq_f32(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
float32x4_t
|
||||||
|
glmm_vhadd(float32x4_t v) {
|
||||||
|
return vaddq_f32(vaddq_f32(glmm_splat_x(v), glmm_splat_y(v)),
|
||||||
|
vaddq_f32(glmm_splat_z(v), glmm_splat_w(v)));
|
||||||
|
/*
|
||||||
|
this seems slower:
|
||||||
|
v = vaddq_f32(v, vrev64q_f32(v));
|
||||||
|
return vaddq_f32(v, vcombine_f32(vget_high_f32(v), vget_low_f32(v)));
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
static inline
|
static inline
|
||||||
float
|
float
|
||||||
glmm_hadd(float32x4_t v) {
|
glmm_hadd(float32x4_t v) {
|
||||||
#if defined(__aarch64__)
|
#if CGLM_ARM64
|
||||||
return vaddvq_f32(v);
|
return vaddvq_f32(v);
|
||||||
#else
|
#else
|
||||||
v = vaddq_f32(v, vrev64q_f32(v));
|
v = vaddq_f32(v, vrev64q_f32(v));
|
||||||
@@ -79,5 +116,58 @@ glmm_norm_inf(float32x4_t a) {
|
|||||||
return glmm_hmax(glmm_abs(a));
|
return glmm_hmax(glmm_abs(a));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
float32x4_t
|
||||||
|
glmm_div(float32x4_t a, float32x4_t b) {
|
||||||
|
#if CGLM_ARM64
|
||||||
|
return vdivq_f32(a, b);
|
||||||
|
#else
|
||||||
|
/* 2 iterations of Newton-Raphson refinement of reciprocal */
|
||||||
|
float32x4_t r0, r1;
|
||||||
|
r0 = vrecpeq_f32(b);
|
||||||
|
r1 = vrecpsq_f32(r0, b);
|
||||||
|
r0 = vmulq_f32(r1, r0);
|
||||||
|
r1 = vrecpsq_f32(r0, b);
|
||||||
|
r0 = vmulq_f32(r1, r0);
|
||||||
|
return vmulq_f32(a, r0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
float32x4_t
|
||||||
|
glmm_fmadd(float32x4_t a, float32x4_t b, float32x4_t c) {
|
||||||
|
#if CGLM_ARM64
|
||||||
|
return vfmaq_f32(c, a, b); /* why vfmaq_f32 is slower than vmlaq_f32 ??? */
|
||||||
|
#else
|
||||||
|
return vmlaq_f32(c, a, b);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
float32x4_t
|
||||||
|
glmm_fnmadd(float32x4_t a, float32x4_t b, float32x4_t c) {
|
||||||
|
#if CGLM_ARM64
|
||||||
|
return vfmsq_f32(c, a, b);
|
||||||
|
#else
|
||||||
|
return vmlsq_f32(c, a, b);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
float32x4_t
|
||||||
|
glmm_fmsub(float32x4_t a, float32x4_t b, float32x4_t c) {
|
||||||
|
#if CGLM_ARM64
|
||||||
|
return vfmsq_f32(c, a, b);
|
||||||
|
#else
|
||||||
|
return vmlsq_f32(c, a, b);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
float32x4_t
|
||||||
|
glmm_fnmsub(float32x4_t a, float32x4_t b, float32x4_t c) {
|
||||||
|
return vsubq_f32(vdupq_n_f32(0.0f), glmm_fmadd(a, b, c));
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
#endif /* cglm_simd_arm_h */
|
#endif /* cglm_simd_arm_h */
|
||||||
|
|||||||
@@ -14,6 +14,16 @@
|
|||||||
|
|
||||||
#include <immintrin.h>
|
#include <immintrin.h>
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat4_scale_avx(mat4 m, float s) {
|
||||||
|
__m256 y0;
|
||||||
|
y0 = _mm256_set1_ps(s);
|
||||||
|
|
||||||
|
glmm_store256(m[0], _mm256_mul_ps(y0, glmm_load256(m[0])));
|
||||||
|
glmm_store256(m[2], _mm256_mul_ps(y0, glmm_load256(m[2])));
|
||||||
|
}
|
||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat4_mul_avx(mat4 m1, mat4 m2, mat4 dest) {
|
glm_mat4_mul_avx(mat4 m1, mat4 m2, mat4 dest) {
|
||||||
|
|||||||
@@ -34,7 +34,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(__SSE3__)
|
#if defined(__SSE3__)
|
||||||
# include <x86intrin.h>
|
# include <pmmintrin.h>
|
||||||
# ifndef CGLM_SIMD_x86
|
# ifndef CGLM_SIMD_x86
|
||||||
# define CGLM_SIMD_x86
|
# define CGLM_SIMD_x86
|
||||||
# endif
|
# endif
|
||||||
|
|||||||
122
include/cglm/simd/neon/affine.h
Normal file
122
include/cglm/simd/neon/affine.h
Normal file
@@ -0,0 +1,122 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglm_affine_neon_h
|
||||||
|
#define cglm_affine_neon_h
|
||||||
|
#if defined(__ARM_NEON_FP)
|
||||||
|
|
||||||
|
#include "../../common.h"
|
||||||
|
#include "../intrin.h"
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mul_neon(mat4 m1, mat4 m2, mat4 dest) {
|
||||||
|
/* D = R * L (Column-Major) */
|
||||||
|
|
||||||
|
glmm_128 l, r0, r1, r2, r3, v0, v1, v2, v3;
|
||||||
|
|
||||||
|
l = glmm_load(m1[0]);
|
||||||
|
r0 = glmm_load(m2[0]);
|
||||||
|
r1 = glmm_load(m2[1]);
|
||||||
|
r2 = glmm_load(m2[2]);
|
||||||
|
r3 = glmm_load(m2[3]);
|
||||||
|
|
||||||
|
v0 = vmulq_f32(glmm_splat_x(r0), l);
|
||||||
|
v1 = vmulq_f32(glmm_splat_x(r1), l);
|
||||||
|
v2 = vmulq_f32(glmm_splat_x(r2), l);
|
||||||
|
v3 = vmulq_f32(glmm_splat_x(r3), l);
|
||||||
|
|
||||||
|
l = glmm_load(m1[1]);
|
||||||
|
v0 = glmm_fmadd(glmm_splat_y(r0), l, v0);
|
||||||
|
v1 = glmm_fmadd(glmm_splat_y(r1), l, v1);
|
||||||
|
v2 = glmm_fmadd(glmm_splat_y(r2), l, v2);
|
||||||
|
v3 = glmm_fmadd(glmm_splat_y(r3), l, v3);
|
||||||
|
|
||||||
|
l = glmm_load(m1[2]);
|
||||||
|
v0 = glmm_fmadd(glmm_splat_z(r0), l, v0);
|
||||||
|
v1 = glmm_fmadd(glmm_splat_z(r1), l, v1);
|
||||||
|
v2 = glmm_fmadd(glmm_splat_z(r2), l, v2);
|
||||||
|
v3 = glmm_fmadd(glmm_splat_z(r3), l, v3);
|
||||||
|
|
||||||
|
v3 = glmm_fmadd(glmm_splat_w(r3), glmm_load(m1[3]), v3);
|
||||||
|
|
||||||
|
glmm_store(dest[0], v0);
|
||||||
|
glmm_store(dest[1], v1);
|
||||||
|
glmm_store(dest[2], v2);
|
||||||
|
glmm_store(dest[3], v3);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mul_rot_neon(mat4 m1, mat4 m2, mat4 dest) {
|
||||||
|
/* D = R * L (Column-Major) */
|
||||||
|
|
||||||
|
glmm_128 l, r0, r1, r2, v0, v1, v2;
|
||||||
|
|
||||||
|
l = glmm_load(m1[0]);
|
||||||
|
r0 = glmm_load(m2[0]);
|
||||||
|
r1 = glmm_load(m2[1]);
|
||||||
|
r2 = glmm_load(m2[2]);
|
||||||
|
|
||||||
|
v0 = vmulq_f32(glmm_splat_x(r0), l);
|
||||||
|
v1 = vmulq_f32(glmm_splat_x(r1), l);
|
||||||
|
v2 = vmulq_f32(glmm_splat_x(r2), l);
|
||||||
|
|
||||||
|
l = glmm_load(m1[1]);
|
||||||
|
v0 = glmm_fmadd(glmm_splat_y(r0), l, v0);
|
||||||
|
v1 = glmm_fmadd(glmm_splat_y(r1), l, v1);
|
||||||
|
v2 = glmm_fmadd(glmm_splat_y(r2), l, v2);
|
||||||
|
|
||||||
|
l = glmm_load(m1[2]);
|
||||||
|
v0 = glmm_fmadd(glmm_splat_z(r0), l, v0);
|
||||||
|
v1 = glmm_fmadd(glmm_splat_z(r1), l, v1);
|
||||||
|
v2 = glmm_fmadd(glmm_splat_z(r2), l, v2);
|
||||||
|
|
||||||
|
glmm_store(dest[0], v0);
|
||||||
|
glmm_store(dest[1], v1);
|
||||||
|
glmm_store(dest[2], v2);
|
||||||
|
glmm_store(dest[3], glmm_load(m1[3]));
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_inv_tr_neon(mat4 mat) {
|
||||||
|
float32x4x4_t vmat;
|
||||||
|
glmm_128 r0, r1, r2, r3, 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),
|
||||||
|
vmulq_f32(r2, glmm_splat_w(r2))));
|
||||||
|
x0 = vnegq_f32(x0);
|
||||||
|
|
||||||
|
glmm_store(mat[0], r0);
|
||||||
|
glmm_store(mat[1], r1);
|
||||||
|
glmm_store(mat[2], r2);
|
||||||
|
glmm_store(mat[3], x0);
|
||||||
|
|
||||||
|
mat[0][3] = 0.0f;
|
||||||
|
mat[1][3] = 0.0f;
|
||||||
|
mat[2][3] = 0.0f;
|
||||||
|
mat[3][3] = 1.0f;
|
||||||
|
|
||||||
|
/* TODO: ?
|
||||||
|
zo = vget_high_f32(r3);
|
||||||
|
vst1_lane_f32(&mat[0][3], zo, 0);
|
||||||
|
vst1_lane_f32(&mat[1][3], zo, 0);
|
||||||
|
vst1_lane_f32(&mat[2][3], zo, 0);
|
||||||
|
vst1_lane_f32(&mat[3][3], zo, 1);
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif /* cglm_affine_neon_h */
|
||||||
44
include/cglm/simd/neon/mat2.h
Normal file
44
include/cglm/simd/neon/mat2.h
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglm_mat2_neon_h
|
||||||
|
#define cglm_mat2_neon_h
|
||||||
|
#if defined(__ARM_NEON_FP)
|
||||||
|
|
||||||
|
#include "../../common.h"
|
||||||
|
#include "../intrin.h"
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat2_mul_neon(mat2 m1, mat2 m2, mat2 dest) {
|
||||||
|
float32x4x2_t a1;
|
||||||
|
glmm_128 x0, x1, x2;
|
||||||
|
float32x2_t dc, ba;
|
||||||
|
|
||||||
|
x1 = glmm_load(m1[0]); /* d c b a */
|
||||||
|
x2 = glmm_load(m2[0]); /* h g f e */
|
||||||
|
|
||||||
|
dc = vget_high_f32(x1);
|
||||||
|
ba = vget_low_f32(x1);
|
||||||
|
|
||||||
|
/* g g e e, h h f f */
|
||||||
|
a1 = vtrnq_f32(x2, x2);
|
||||||
|
|
||||||
|
/*
|
||||||
|
dest[0][0] = a * e + c * f;
|
||||||
|
dest[0][1] = b * e + d * f;
|
||||||
|
dest[1][0] = a * g + c * h;
|
||||||
|
dest[1][1] = b * g + d * h;
|
||||||
|
*/
|
||||||
|
x0 = glmm_fmadd(vcombine_f32(ba, ba), a1.val[0],
|
||||||
|
vmulq_f32(vcombine_f32(dc, dc), a1.val[1]));
|
||||||
|
|
||||||
|
glmm_store(dest[0], x0);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif /* cglm_mat2_neon_h */
|
||||||
@@ -12,45 +12,305 @@
|
|||||||
#include "../../common.h"
|
#include "../../common.h"
|
||||||
#include "../intrin.h"
|
#include "../intrin.h"
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat4_scale_neon(mat4 m, float s) {
|
||||||
|
float32x4_t v0;
|
||||||
|
|
||||||
|
v0 = vdupq_n_f32(s);
|
||||||
|
|
||||||
|
vst1q_f32(m[0], vmulq_f32(vld1q_f32(m[0]), v0));
|
||||||
|
vst1q_f32(m[1], vmulq_f32(vld1q_f32(m[1]), v0));
|
||||||
|
vst1q_f32(m[2], vmulq_f32(vld1q_f32(m[2]), v0));
|
||||||
|
vst1q_f32(m[3], vmulq_f32(vld1q_f32(m[3]), v0));
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat4_transp_neon(mat4 m, mat4 dest) {
|
||||||
|
float32x4x4_t vmat;
|
||||||
|
|
||||||
|
vmat = vld4q_f32(m[0]);
|
||||||
|
|
||||||
|
vst1q_f32(dest[0], vmat.val[0]);
|
||||||
|
vst1q_f32(dest[1], vmat.val[1]);
|
||||||
|
vst1q_f32(dest[2], vmat.val[2]);
|
||||||
|
vst1q_f32(dest[3], vmat.val[3]);
|
||||||
|
}
|
||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat4_mul_neon(mat4 m1, mat4 m2, mat4 dest) {
|
glm_mat4_mul_neon(mat4 m1, mat4 m2, mat4 dest) {
|
||||||
/* D = R * L (Column-Major) */
|
/* D = R * L (Column-Major) */
|
||||||
float32x4_t l0, l1, l2, l3, r, d0, d1, d2, d3;
|
|
||||||
|
|
||||||
l0 = vld1q_f32(m2[0]);
|
glmm_128 l, r0, r1, r2, r3, v0, v1, v2, v3;
|
||||||
l1 = vld1q_f32(m2[1]);
|
|
||||||
l2 = vld1q_f32(m2[2]);
|
|
||||||
l3 = vld1q_f32(m2[3]);
|
|
||||||
|
|
||||||
r = vld1q_f32(m1[0]);
|
l = glmm_load(m1[0]);
|
||||||
d0 = vmulq_lane_f32(r, vget_low_f32(l0), 0);
|
r0 = glmm_load(m2[0]);
|
||||||
d1 = vmulq_lane_f32(r, vget_low_f32(l1), 0);
|
r1 = glmm_load(m2[1]);
|
||||||
d2 = vmulq_lane_f32(r, vget_low_f32(l2), 0);
|
r2 = glmm_load(m2[2]);
|
||||||
d3 = vmulq_lane_f32(r, vget_low_f32(l3), 0);
|
r3 = glmm_load(m2[3]);
|
||||||
|
|
||||||
r = vld1q_f32(m1[1]);
|
v0 = vmulq_f32(glmm_splat_x(r0), l);
|
||||||
d0 = vmlaq_lane_f32(d0, r, vget_low_f32(l0), 1);
|
v1 = vmulq_f32(glmm_splat_x(r1), l);
|
||||||
d1 = vmlaq_lane_f32(d1, r, vget_low_f32(l1), 1);
|
v2 = vmulq_f32(glmm_splat_x(r2), l);
|
||||||
d2 = vmlaq_lane_f32(d2, r, vget_low_f32(l2), 1);
|
v3 = vmulq_f32(glmm_splat_x(r3), l);
|
||||||
d3 = vmlaq_lane_f32(d3, r, vget_low_f32(l3), 1);
|
|
||||||
|
|
||||||
r = vld1q_f32(m1[2]);
|
l = glmm_load(m1[1]);
|
||||||
d0 = vmlaq_lane_f32(d0, r, vget_high_f32(l0), 0);
|
v0 = glmm_fmadd(glmm_splat_y(r0), l, v0);
|
||||||
d1 = vmlaq_lane_f32(d1, r, vget_high_f32(l1), 0);
|
v1 = glmm_fmadd(glmm_splat_y(r1), l, v1);
|
||||||
d2 = vmlaq_lane_f32(d2, r, vget_high_f32(l2), 0);
|
v2 = glmm_fmadd(glmm_splat_y(r2), l, v2);
|
||||||
d3 = vmlaq_lane_f32(d3, r, vget_high_f32(l3), 0);
|
v3 = glmm_fmadd(glmm_splat_y(r3), l, v3);
|
||||||
|
|
||||||
r = vld1q_f32(m1[3]);
|
l = glmm_load(m1[2]);
|
||||||
d0 = vmlaq_lane_f32(d0, r, vget_high_f32(l0), 1);
|
v0 = glmm_fmadd(glmm_splat_z(r0), l, v0);
|
||||||
d1 = vmlaq_lane_f32(d1, r, vget_high_f32(l1), 1);
|
v1 = glmm_fmadd(glmm_splat_z(r1), l, v1);
|
||||||
d2 = vmlaq_lane_f32(d2, r, vget_high_f32(l2), 1);
|
v2 = glmm_fmadd(glmm_splat_z(r2), l, v2);
|
||||||
d3 = vmlaq_lane_f32(d3, r, vget_high_f32(l3), 1);
|
v3 = glmm_fmadd(glmm_splat_z(r3), l, v3);
|
||||||
|
|
||||||
vst1q_f32(dest[0], d0);
|
l = glmm_load(m1[3]);
|
||||||
vst1q_f32(dest[1], d1);
|
v0 = glmm_fmadd(glmm_splat_w(r0), l, v0);
|
||||||
vst1q_f32(dest[2], d2);
|
v1 = glmm_fmadd(glmm_splat_w(r1), l, v1);
|
||||||
vst1q_f32(dest[3], d3);
|
v2 = glmm_fmadd(glmm_splat_w(r2), l, v2);
|
||||||
|
v3 = glmm_fmadd(glmm_splat_w(r3), l, v3);
|
||||||
|
|
||||||
|
glmm_store(dest[0], v0);
|
||||||
|
glmm_store(dest[1], v1);
|
||||||
|
glmm_store(dest[2], v2);
|
||||||
|
glmm_store(dest[3], v3);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat4_mulv_neon(mat4 m, vec4 v, vec4 dest) {
|
||||||
|
float32x4_t l0, l1, l2, l3;
|
||||||
|
float32x2_t vlo, vhi;
|
||||||
|
|
||||||
|
l0 = vld1q_f32(m[0]);
|
||||||
|
l1 = vld1q_f32(m[1]);
|
||||||
|
l2 = vld1q_f32(m[2]);
|
||||||
|
l3 = vld1q_f32(m[3]);
|
||||||
|
|
||||||
|
vlo = vld1_f32(&v[0]);
|
||||||
|
vhi = vld1_f32(&v[2]);
|
||||||
|
|
||||||
|
l0 = vmulq_lane_f32(l0, vlo, 0);
|
||||||
|
l0 = vmlaq_lane_f32(l0, l1, vlo, 1);
|
||||||
|
l0 = vmlaq_lane_f32(l0, l2, vhi, 0);
|
||||||
|
l0 = vmlaq_lane_f32(l0, l3, vhi, 1);
|
||||||
|
|
||||||
|
vst1q_f32(dest, l0);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
float
|
||||||
|
glm_mat4_det_neon(mat4 mat) {
|
||||||
|
float32x4_t r0, r1, r2, r3, x0, x1, x2;
|
||||||
|
float32x2_t ij, op, mn, kl, nn, mm, jj, ii, gh, ef, t12, t34;
|
||||||
|
float32x4x2_t a1;
|
||||||
|
float32x4_t x3 = { 0.f, -0.f, 0.f, -0.f };
|
||||||
|
|
||||||
|
/* 127 <- 0, [square] det(A) = det(At) */
|
||||||
|
r0 = glmm_load(mat[0]); /* d c b a */
|
||||||
|
r1 = vrev64q_f32(glmm_load(mat[1])); /* g h e f */
|
||||||
|
r2 = vrev64q_f32(glmm_load(mat[2])); /* l k i j */
|
||||||
|
r3 = vrev64q_f32(glmm_load(mat[3])); /* o p m n */
|
||||||
|
|
||||||
|
gh = vget_high_f32(r1);
|
||||||
|
ef = vget_low_f32(r1);
|
||||||
|
kl = vget_high_f32(r2);
|
||||||
|
ij = vget_low_f32(r2);
|
||||||
|
op = vget_high_f32(r3);
|
||||||
|
mn = vget_low_f32(r3);
|
||||||
|
mm = vdup_lane_f32(mn, 1);
|
||||||
|
nn = vdup_lane_f32(mn, 0);
|
||||||
|
ii = vdup_lane_f32(ij, 1);
|
||||||
|
jj = vdup_lane_f32(ij, 0);
|
||||||
|
|
||||||
|
/*
|
||||||
|
t[1] = j * p - n * l;
|
||||||
|
t[2] = j * o - n * k;
|
||||||
|
t[3] = i * p - m * l;
|
||||||
|
t[4] = i * o - m * k;
|
||||||
|
*/
|
||||||
|
x0 = glmm_fnmadd(vcombine_f32(kl, kl), vcombine_f32(nn, mm),
|
||||||
|
vmulq_f32(vcombine_f32(op, op), vcombine_f32(jj, ii)));
|
||||||
|
|
||||||
|
t12 = vget_low_f32(x0);
|
||||||
|
t34 = vget_high_f32(x0);
|
||||||
|
|
||||||
|
/* 1 3 1 3 2 4 2 4 */
|
||||||
|
a1 = vuzpq_f32(x0, x0);
|
||||||
|
|
||||||
|
/*
|
||||||
|
t[0] = k * p - o * l;
|
||||||
|
t[0] = k * p - o * l;
|
||||||
|
t[5] = i * n - m * j;
|
||||||
|
t[5] = i * n - m * j;
|
||||||
|
*/
|
||||||
|
x1 = glmm_fnmadd(vcombine_f32(vdup_lane_f32(kl, 0), jj),
|
||||||
|
vcombine_f32(vdup_lane_f32(op, 1), mm),
|
||||||
|
vmulq_f32(vcombine_f32(vdup_lane_f32(op, 0), nn),
|
||||||
|
vcombine_f32(vdup_lane_f32(kl, 1), ii)));
|
||||||
|
|
||||||
|
/*
|
||||||
|
a * (f * t[0] - g * t[1] + h * t[2])
|
||||||
|
- b * (e * t[0] - g * t[3] + h * t[4])
|
||||||
|
+ c * (e * t[1] - f * t[3] + h * t[5])
|
||||||
|
- d * (e * t[2] - f * t[4] + g * t[5])
|
||||||
|
*/
|
||||||
|
x2 = glmm_fnmadd(vcombine_f32(vdup_lane_f32(gh, 1), vdup_lane_f32(ef, 0)),
|
||||||
|
vcombine_f32(vget_low_f32(a1.val[0]), t34),
|
||||||
|
vmulq_f32(vcombine_f32(ef, vdup_lane_f32(ef, 1)),
|
||||||
|
vcombine_f32(vget_low_f32(x1), t12)));
|
||||||
|
|
||||||
|
x2 = glmm_fmadd(vcombine_f32(vdup_lane_f32(gh, 0), gh),
|
||||||
|
vcombine_f32(vget_low_f32(a1.val[1]), vget_high_f32(x1)), x2);
|
||||||
|
|
||||||
|
x2 = glmm_xor(x2, x3);
|
||||||
|
|
||||||
|
return glmm_hadd(vmulq_f32(x2, r0));
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat4_inv_neon(mat4 mat, mat4 dest) {
|
||||||
|
float32x4_t r0, r1, r2, r3,
|
||||||
|
v0, v1, v2, v3,
|
||||||
|
t0, t1, t2, t3, t4, t5,
|
||||||
|
x0, x1, x2, x3, x4, x5, x6, x7, x8;
|
||||||
|
float32x4x2_t a1;
|
||||||
|
float32x2_t lp, ko, hg, jn, im, fe, ae, bf, cg, dh;
|
||||||
|
float32x4_t x9 = { -0.f, 0.f, -0.f, 0.f };
|
||||||
|
|
||||||
|
x8 = vrev64q_f32(x9);
|
||||||
|
|
||||||
|
/* 127 <- 0 */
|
||||||
|
r0 = glmm_load(mat[0]); /* d c b a */
|
||||||
|
r1 = glmm_load(mat[1]); /* h g f e */
|
||||||
|
r2 = glmm_load(mat[2]); /* l k j i */
|
||||||
|
r3 = glmm_load(mat[3]); /* p o n m */
|
||||||
|
|
||||||
|
/* l p k o, j n i m */
|
||||||
|
a1 = vzipq_f32(r3, r2);
|
||||||
|
|
||||||
|
jn = vget_high_f32(a1.val[0]);
|
||||||
|
im = vget_low_f32(a1.val[0]);
|
||||||
|
lp = vget_high_f32(a1.val[1]);
|
||||||
|
ko = vget_low_f32(a1.val[1]);
|
||||||
|
hg = vget_high_f32(r1);
|
||||||
|
|
||||||
|
x1 = vcombine_f32(vdup_lane_f32(lp, 0), lp); /* l p p p */
|
||||||
|
x2 = vcombine_f32(vdup_lane_f32(ko, 0), ko); /* k o o o */
|
||||||
|
x0 = vcombine_f32(vdup_lane_f32(lp, 1), vdup_lane_f32(hg, 1)); /* h h l l */
|
||||||
|
x3 = vcombine_f32(vdup_lane_f32(ko, 1), vdup_lane_f32(hg, 0)); /* g g k k */
|
||||||
|
|
||||||
|
/* t1[0] = k * p - o * l;
|
||||||
|
t1[0] = k * p - o * l;
|
||||||
|
t2[0] = g * p - o * h;
|
||||||
|
t3[0] = g * l - k * h; */
|
||||||
|
t0 = glmm_fnmadd(x2, x0, vmulq_f32(x3, x1));
|
||||||
|
|
||||||
|
fe = vget_low_f32(r1);
|
||||||
|
x4 = vcombine_f32(vdup_lane_f32(jn, 0), jn); /* j n n n */
|
||||||
|
x5 = vcombine_f32(vdup_lane_f32(jn, 1), vdup_lane_f32(fe, 1)); /* f f j j */
|
||||||
|
|
||||||
|
/* t1[1] = j * p - n * l;
|
||||||
|
t1[1] = j * p - n * l;
|
||||||
|
t2[1] = f * p - n * h;
|
||||||
|
t3[1] = f * l - j * h; */
|
||||||
|
t1 = glmm_fnmadd(x4, x0, vmulq_f32(x5, x1));
|
||||||
|
|
||||||
|
/* t1[2] = j * o - n * k
|
||||||
|
t1[2] = j * o - n * k;
|
||||||
|
t2[2] = f * o - n * g;
|
||||||
|
t3[2] = f * k - j * g; */
|
||||||
|
t2 = glmm_fnmadd(x4, x3, vmulq_f32(x5, x2));
|
||||||
|
|
||||||
|
x6 = vcombine_f32(vdup_lane_f32(im, 1), vdup_lane_f32(fe, 0)); /* e e i i */
|
||||||
|
x7 = vcombine_f32(vdup_lane_f32(im, 0), im); /* i m m m */
|
||||||
|
|
||||||
|
/* t1[3] = i * p - m * l;
|
||||||
|
t1[3] = i * p - m * l;
|
||||||
|
t2[3] = e * p - m * h;
|
||||||
|
t3[3] = e * l - i * h; */
|
||||||
|
t3 = glmm_fnmadd(x7, x0, vmulq_f32(x6, x1));
|
||||||
|
|
||||||
|
/* t1[4] = i * o - m * k;
|
||||||
|
t1[4] = i * o - m * k;
|
||||||
|
t2[4] = e * o - m * g;
|
||||||
|
t3[4] = e * k - i * g; */
|
||||||
|
t4 = glmm_fnmadd(x7, x3, vmulq_f32(x6, x2));
|
||||||
|
|
||||||
|
/* t1[5] = i * n - m * j;
|
||||||
|
t1[5] = i * n - m * j;
|
||||||
|
t2[5] = e * n - m * f;
|
||||||
|
t3[5] = e * j - i * f; */
|
||||||
|
t5 = glmm_fnmadd(x7, x5, vmulq_f32(x6, x4));
|
||||||
|
|
||||||
|
/* h d f b, g c e a */
|
||||||
|
a1 = vtrnq_f32(r0, r1);
|
||||||
|
|
||||||
|
x4 = vrev64q_f32(a1.val[0]); /* c g a e */
|
||||||
|
x5 = vrev64q_f32(a1.val[1]); /* d h b f */
|
||||||
|
|
||||||
|
ae = vget_low_f32(x4);
|
||||||
|
cg = vget_high_f32(x4);
|
||||||
|
bf = vget_low_f32(x5);
|
||||||
|
dh = vget_high_f32(x5);
|
||||||
|
|
||||||
|
x0 = vcombine_f32(ae, vdup_lane_f32(ae, 1)); /* a a a e */
|
||||||
|
x1 = vcombine_f32(bf, vdup_lane_f32(bf, 1)); /* b b b f */
|
||||||
|
x2 = vcombine_f32(cg, vdup_lane_f32(cg, 1)); /* c c c g */
|
||||||
|
x3 = vcombine_f32(dh, vdup_lane_f32(dh, 1)); /* d d d h */
|
||||||
|
|
||||||
|
/*
|
||||||
|
dest[0][0] = f * t1[0] - g * t1[1] + h * t1[2];
|
||||||
|
dest[0][1] =-(b * t1[0] - c * t1[1] + d * t1[2]);
|
||||||
|
dest[0][2] = b * t2[0] - c * t2[1] + d * t2[2];
|
||||||
|
dest[0][3] =-(b * t3[0] - c * t3[1] + d * t3[2]); */
|
||||||
|
v0 = glmm_xor(glmm_fmadd(x3, t2, glmm_fnmadd(x2, t1, vmulq_f32(x1, t0))), x8);
|
||||||
|
|
||||||
|
/*
|
||||||
|
dest[2][0] = e * t1[1] - f * t1[3] + h * t1[5];
|
||||||
|
dest[2][1] =-(a * t1[1] - b * t1[3] + d * t1[5]);
|
||||||
|
dest[2][2] = a * t2[1] - b * t2[3] + d * t2[5];
|
||||||
|
dest[2][3] =-(a * t3[1] - b * t3[3] + d * t3[5]);*/
|
||||||
|
v2 = glmm_xor(glmm_fmadd(x3, t5, glmm_fnmadd(x1, t3, vmulq_f32(x0, t1))), x8);
|
||||||
|
|
||||||
|
/*
|
||||||
|
dest[1][0] =-(e * t1[0] - g * t1[3] + h * t1[4]);
|
||||||
|
dest[1][1] = a * t1[0] - c * t1[3] + d * t1[4];
|
||||||
|
dest[1][2] =-(a * t2[0] - c * t2[3] + d * t2[4]);
|
||||||
|
dest[1][3] = a * t3[0] - c * t3[3] + d * t3[4]; */
|
||||||
|
v1 = glmm_xor(glmm_fmadd(x3, t4, glmm_fnmadd(x2, t3, vmulq_f32(x0, t0))), x9);
|
||||||
|
|
||||||
|
/*
|
||||||
|
dest[3][0] =-(e * t1[2] - f * t1[4] + g * t1[5]);
|
||||||
|
dest[3][1] = a * t1[2] - b * t1[4] + c * t1[5];
|
||||||
|
dest[3][2] =-(a * t2[2] - b * t2[4] + c * t2[5]);
|
||||||
|
dest[3][3] = a * t3[2] - b * t3[4] + c * t3[5]; */
|
||||||
|
v3 = glmm_xor(glmm_fmadd(x2, t5, glmm_fnmadd(x1, t4, vmulq_f32(x0, t2))), x9);
|
||||||
|
|
||||||
|
/* determinant */
|
||||||
|
x0 = vcombine_f32(vget_low_f32(vzipq_f32(v0, v1).val[0]),
|
||||||
|
vget_low_f32(vzipq_f32(v2, v3).val[0]));
|
||||||
|
|
||||||
|
/*
|
||||||
|
x0 = glmm_div(glmm_set1(1.0f), glmm_vhadd(vmulq_f32(x0, r0)));
|
||||||
|
|
||||||
|
glmm_store(dest[0], vmulq_f32(v0, x0));
|
||||||
|
glmm_store(dest[1], vmulq_f32(v1, x0));
|
||||||
|
glmm_store(dest[2], vmulq_f32(v2, x0));
|
||||||
|
glmm_store(dest[3], vmulq_f32(v3, x0));
|
||||||
|
*/
|
||||||
|
|
||||||
|
x0 = glmm_vhadd(vmulq_f32(x0, r0));
|
||||||
|
|
||||||
|
glmm_store(dest[0], glmm_div(v0, x0));
|
||||||
|
glmm_store(dest[1], glmm_div(v1, x0));
|
||||||
|
glmm_store(dest[2], glmm_div(v2, x0));
|
||||||
|
glmm_store(dest[3], glmm_div(v3, x0));
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
56
include/cglm/simd/neon/quat.h
Normal file
56
include/cglm/simd/neon/quat.h
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglm_quat_neon_h
|
||||||
|
#define cglm_quat_neon_h
|
||||||
|
#if defined(__ARM_NEON_FP)
|
||||||
|
|
||||||
|
#include "../../common.h"
|
||||||
|
#include "../intrin.h"
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_quat_mul_neon(versor p, versor q, versor dest) {
|
||||||
|
/*
|
||||||
|
+ (a1 b2 + b1 a2 + c1 d2 − d1 c2)i
|
||||||
|
+ (a1 c2 − b1 d2 + c1 a2 + d1 b2)j
|
||||||
|
+ (a1 d2 + b1 c2 − c1 b2 + d1 a2)k
|
||||||
|
a1 a2 − b1 b2 − c1 c2 − d1 d2
|
||||||
|
*/
|
||||||
|
|
||||||
|
glmm_128 xp, xq, xqr, r, x, y, z, s2, s3;
|
||||||
|
glmm_128 s1 = {-0.f, 0.f, 0.f, -0.f};
|
||||||
|
float32x2_t qh, ql;
|
||||||
|
|
||||||
|
xp = glmm_load(p); /* 3 2 1 0 */
|
||||||
|
xq = glmm_load(q);
|
||||||
|
|
||||||
|
r = vmulq_f32(glmm_splat_w(xp), xq);
|
||||||
|
x = glmm_splat_x(xp);
|
||||||
|
y = glmm_splat_y(xp);
|
||||||
|
z = glmm_splat_z(xp);
|
||||||
|
|
||||||
|
ql = vget_high_f32(s1);
|
||||||
|
s3 = vcombine_f32(ql, ql);
|
||||||
|
s2 = vzipq_f32(s3, s3).val[0];
|
||||||
|
|
||||||
|
xqr = vrev64q_f32(xq);
|
||||||
|
qh = vget_high_f32(xqr);
|
||||||
|
ql = vget_low_f32(xqr);
|
||||||
|
|
||||||
|
r = glmm_fmadd(glmm_xor(x, s3), vcombine_f32(qh, ql), r);
|
||||||
|
|
||||||
|
r = glmm_fmadd(glmm_xor(y, s2), vcombine_f32(vget_high_f32(xq),
|
||||||
|
vget_low_f32(xq)), r);
|
||||||
|
|
||||||
|
r = glmm_fmadd(glmm_xor(z, s1), vcombine_f32(ql, qh), r);
|
||||||
|
|
||||||
|
glmm_store(dest, r);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif /* cglm_quat_neon_h */
|
||||||
@@ -16,75 +16,76 @@ CGLM_INLINE
|
|||||||
void
|
void
|
||||||
glm_mul_sse2(mat4 m1, mat4 m2, mat4 dest) {
|
glm_mul_sse2(mat4 m1, mat4 m2, mat4 dest) {
|
||||||
/* D = R * L (Column-Major) */
|
/* D = R * L (Column-Major) */
|
||||||
__m128 l0, l1, l2, l3, r;
|
glmm_128 l, r0, r1, r2, r3, v0, v1, v2, v3;
|
||||||
|
|
||||||
l0 = glmm_load(m1[0]);
|
l = glmm_load(m1[0]);
|
||||||
l1 = glmm_load(m1[1]);
|
r0 = glmm_load(m2[0]);
|
||||||
l2 = glmm_load(m1[2]);
|
r1 = glmm_load(m2[1]);
|
||||||
l3 = glmm_load(m1[3]);
|
r2 = glmm_load(m2[2]);
|
||||||
|
r3 = glmm_load(m2[3]);
|
||||||
|
|
||||||
r = glmm_load(m2[0]);
|
v0 = _mm_mul_ps(glmm_splat_x(r0), l);
|
||||||
glmm_store(dest[0],
|
v1 = _mm_mul_ps(glmm_splat_x(r1), l);
|
||||||
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 0), l0),
|
v2 = _mm_mul_ps(glmm_splat_x(r2), l);
|
||||||
_mm_mul_ps(glmm_shuff1x(r, 1), l1)),
|
v3 = _mm_mul_ps(glmm_splat_x(r3), l);
|
||||||
_mm_mul_ps(glmm_shuff1x(r, 2), l2)));
|
|
||||||
|
|
||||||
r = glmm_load(m2[1]);
|
l = glmm_load(m1[1]);
|
||||||
glmm_store(dest[1],
|
v0 = glmm_fmadd(glmm_splat_y(r0), l, v0);
|
||||||
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 0), l0),
|
v1 = glmm_fmadd(glmm_splat_y(r1), l, v1);
|
||||||
_mm_mul_ps(glmm_shuff1x(r, 1), l1)),
|
v2 = glmm_fmadd(glmm_splat_y(r2), l, v2);
|
||||||
_mm_mul_ps(glmm_shuff1x(r, 2), l2)));
|
v3 = glmm_fmadd(glmm_splat_y(r3), l, v3);
|
||||||
|
|
||||||
r = glmm_load(m2[2]);
|
l = glmm_load(m1[2]);
|
||||||
glmm_store(dest[2],
|
v0 = glmm_fmadd(glmm_splat_z(r0), l, v0);
|
||||||
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 0), l0),
|
v1 = glmm_fmadd(glmm_splat_z(r1), l, v1);
|
||||||
_mm_mul_ps(glmm_shuff1x(r, 1), l1)),
|
v2 = glmm_fmadd(glmm_splat_z(r2), l, v2);
|
||||||
_mm_mul_ps(glmm_shuff1x(r, 2), l2)));
|
v3 = glmm_fmadd(glmm_splat_z(r3), l, v3);
|
||||||
|
|
||||||
r = glmm_load(m2[3]);
|
l = glmm_load(m1[3]);
|
||||||
glmm_store(dest[3],
|
v3 = glmm_fmadd(glmm_splat_w(r3), l, v3);
|
||||||
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 0), l0),
|
|
||||||
_mm_mul_ps(glmm_shuff1x(r, 1), l1)),
|
glmm_store(dest[0], v0);
|
||||||
_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 2), l2),
|
glmm_store(dest[1], v1);
|
||||||
_mm_mul_ps(glmm_shuff1x(r, 3), l3))));
|
glmm_store(dest[2], v2);
|
||||||
|
glmm_store(dest[3], v3);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mul_rot_sse2(mat4 m1, mat4 m2, mat4 dest) {
|
glm_mul_rot_sse2(mat4 m1, mat4 m2, mat4 dest) {
|
||||||
/* D = R * L (Column-Major) */
|
/* D = R * L (Column-Major) */
|
||||||
__m128 l0, l1, l2, l3, r;
|
|
||||||
|
|
||||||
l0 = glmm_load(m1[0]);
|
glmm_128 l, r0, r1, r2, v0, v1, v2;
|
||||||
l1 = glmm_load(m1[1]);
|
|
||||||
l2 = glmm_load(m1[2]);
|
|
||||||
l3 = glmm_load(m1[3]);
|
|
||||||
|
|
||||||
r = glmm_load(m2[0]);
|
l = glmm_load(m1[0]);
|
||||||
glmm_store(dest[0],
|
r0 = glmm_load(m2[0]);
|
||||||
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 0), l0),
|
r1 = glmm_load(m2[1]);
|
||||||
_mm_mul_ps(glmm_shuff1x(r, 1), l1)),
|
r2 = glmm_load(m2[2]);
|
||||||
_mm_mul_ps(glmm_shuff1x(r, 2), l2)));
|
|
||||||
|
|
||||||
r = glmm_load(m2[1]);
|
v0 = _mm_mul_ps(glmm_splat_x(r0), l);
|
||||||
glmm_store(dest[1],
|
v1 = _mm_mul_ps(glmm_splat_x(r1), l);
|
||||||
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 0), l0),
|
v2 = _mm_mul_ps(glmm_splat_x(r2), l);
|
||||||
_mm_mul_ps(glmm_shuff1x(r, 1), l1)),
|
|
||||||
_mm_mul_ps(glmm_shuff1x(r, 2), l2)));
|
|
||||||
|
|
||||||
r = glmm_load(m2[2]);
|
l = glmm_load(m1[1]);
|
||||||
glmm_store(dest[2],
|
v0 = glmm_fmadd(glmm_splat_y(r0), l, v0);
|
||||||
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 0), l0),
|
v1 = glmm_fmadd(glmm_splat_y(r1), l, v1);
|
||||||
_mm_mul_ps(glmm_shuff1x(r, 1), l1)),
|
v2 = glmm_fmadd(glmm_splat_y(r2), l, v2);
|
||||||
_mm_mul_ps(glmm_shuff1x(r, 2), l2)));
|
|
||||||
|
|
||||||
glmm_store(dest[3], l3);
|
l = glmm_load(m1[2]);
|
||||||
|
v0 = glmm_fmadd(glmm_splat_z(r0), l, v0);
|
||||||
|
v1 = glmm_fmadd(glmm_splat_z(r1), l, v1);
|
||||||
|
v2 = glmm_fmadd(glmm_splat_z(r2), l, v2);
|
||||||
|
|
||||||
|
glmm_store(dest[0], v0);
|
||||||
|
glmm_store(dest[1], v1);
|
||||||
|
glmm_store(dest[2], v2);
|
||||||
|
glmm_store(dest[3], glmm_load(m1[3]));
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_inv_tr_sse2(mat4 mat) {
|
glm_inv_tr_sse2(mat4 mat) {
|
||||||
__m128 r0, r1, r2, r3, x0, x1;
|
__m128 r0, r1, r2, r3, x0, x1, x2, x3, x4, x5;
|
||||||
|
|
||||||
r0 = glmm_load(mat[0]);
|
r0 = glmm_load(mat[0]);
|
||||||
r1 = glmm_load(mat[1]);
|
r1 = glmm_load(mat[1]);
|
||||||
@@ -94,10 +95,13 @@ glm_inv_tr_sse2(mat4 mat) {
|
|||||||
|
|
||||||
_MM_TRANSPOSE4_PS(r0, r1, r2, x1);
|
_MM_TRANSPOSE4_PS(r0, r1, r2, x1);
|
||||||
|
|
||||||
x0 = _mm_add_ps(_mm_mul_ps(r0, glmm_shuff1(r3, 0, 0, 0, 0)),
|
x2 = glmm_shuff1(r3, 0, 0, 0, 0);
|
||||||
_mm_mul_ps(r1, glmm_shuff1(r3, 1, 1, 1, 1)));
|
x3 = glmm_shuff1(r3, 1, 1, 1, 1);
|
||||||
x0 = _mm_add_ps(x0, _mm_mul_ps(r2, glmm_shuff1(r3, 2, 2, 2, 2)));
|
x4 = glmm_shuff1(r3, 2, 2, 2, 2);
|
||||||
x0 = _mm_xor_ps(x0, _mm_set1_ps(-0.f));
|
x5 = _mm_set1_ps(-0.f);
|
||||||
|
|
||||||
|
x0 = glmm_fmadd(r0, x2, glmm_fmadd(r1, x3, _mm_mul_ps(r2, x4)));
|
||||||
|
x0 = _mm_xor_ps(x0, x5);
|
||||||
|
|
||||||
x0 = _mm_add_ps(x0, x1);
|
x0 = _mm_add_ps(x0, x1);
|
||||||
|
|
||||||
|
|||||||
48
include/cglm/simd/sse2/mat2.h
Normal file
48
include/cglm/simd/sse2/mat2.h
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c), Recep Aslantas.
|
||||||
|
*
|
||||||
|
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||||||
|
* Full license can be found in the LICENSE file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef cglm_mat2_sse_h
|
||||||
|
#define cglm_mat2_sse_h
|
||||||
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
|
|
||||||
|
#include "../../common.h"
|
||||||
|
#include "../intrin.h"
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat2_mul_sse2(mat2 m1, mat2 m2, mat2 dest) {
|
||||||
|
__m128 x0, x1, x2, x3, x4;
|
||||||
|
|
||||||
|
x1 = glmm_load(m1[0]); /* d c b a */
|
||||||
|
x2 = glmm_load(m2[0]); /* h g f e */
|
||||||
|
|
||||||
|
x3 = glmm_shuff1(x2, 2, 2, 0, 0);
|
||||||
|
x4 = glmm_shuff1(x2, 3, 3, 1, 1);
|
||||||
|
x0 = _mm_movelh_ps(x1, x1);
|
||||||
|
x2 = _mm_movehl_ps(x1, x1);
|
||||||
|
|
||||||
|
/*
|
||||||
|
dest[0][0] = a * e + c * f;
|
||||||
|
dest[0][1] = b * e + d * f;
|
||||||
|
dest[1][0] = a * g + c * h;
|
||||||
|
dest[1][1] = b * g + d * h;
|
||||||
|
*/
|
||||||
|
x0 = glmm_fmadd(x0, x3, _mm_mul_ps(x2, x4));
|
||||||
|
|
||||||
|
glmm_store(dest[0], x0);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mat2_transp_sse2(mat2 m, mat2 dest) {
|
||||||
|
/* d c b a */
|
||||||
|
/* d b c a */
|
||||||
|
glmm_store(dest[0], glmm_shuff1(glmm_load(m[0]), 3, 1, 2, 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif /* cglm_mat2_sse_h */
|
||||||
@@ -15,44 +15,61 @@
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat3_mul_sse2(mat3 m1, mat3 m2, mat3 dest) {
|
glm_mat3_mul_sse2(mat3 m1, mat3 m2, mat3 dest) {
|
||||||
__m128 l0, l1, l2;
|
__m128 l0, l1, l2, r0, r1, r2, x0, x1, x2, x3, x4, x5, x6, x7, x8, x9;
|
||||||
__m128 r0, r1, r2;
|
|
||||||
__m128 x0, x1, x2;
|
|
||||||
|
|
||||||
l0 = _mm_loadu_ps(m1[0]);
|
l0 = _mm_loadu_ps(m1[0]);
|
||||||
l1 = _mm_loadu_ps(&m1[1][1]);
|
l1 = _mm_loadu_ps(&m1[1][1]);
|
||||||
l2 = _mm_set1_ps(m1[2][2]);
|
|
||||||
|
|
||||||
r0 = _mm_loadu_ps(m2[0]);
|
r0 = _mm_loadu_ps(m2[0]);
|
||||||
r1 = _mm_loadu_ps(&m2[1][1]);
|
r1 = _mm_loadu_ps(&m2[1][1]);
|
||||||
r2 = _mm_set1_ps(m2[2][2]);
|
|
||||||
|
|
||||||
x1 = glmm_shuff2(l0, l1, 1, 0, 3, 3, 0, 3, 2, 0);
|
x8 = glmm_shuff1(l0, 0, 2, 1, 0); /* a00 a02 a01 a00 */
|
||||||
x2 = glmm_shuff2(l1, l2, 0, 0, 3, 2, 0, 2, 1, 0);
|
x1 = glmm_shuff1(r0, 3, 0, 0, 0); /* b10 b00 b00 b00 */
|
||||||
|
x2 = _mm_shuffle_ps(l0, l1, _MM_SHUFFLE(1, 0, 3, 3)); /* a12 a11 a10 a10 */
|
||||||
|
x3 = _mm_shuffle_ps(r0, r1, _MM_SHUFFLE(2, 0, 3, 1)); /* b20 b11 b10 b01 */
|
||||||
|
x0 = _mm_mul_ps(x8, x1);
|
||||||
|
|
||||||
x0 = _mm_add_ps(_mm_mul_ps(glmm_shuff1(l0, 0, 2, 1, 0),
|
x6 = glmm_shuff1(l0, 1, 0, 2, 1); /* a01 a00 a02 a01 */
|
||||||
glmm_shuff1(r0, 3, 0, 0, 0)),
|
x7 = glmm_shuff1(x3, 3, 3, 1, 1); /* b20 b20 b10 b10 */
|
||||||
_mm_mul_ps(x1, glmm_shuff2(r0, r1, 0, 0, 1, 1, 2, 0, 0, 0)));
|
l2 = _mm_load_ss(&m1[2][2]);
|
||||||
|
r2 = _mm_load_ss(&m2[2][2]);
|
||||||
|
x1 = _mm_mul_ps(x6, x7);
|
||||||
|
l2 = glmm_shuff1(l2, 0, 0, 1, 0); /* a22 a22 0.f a22 */
|
||||||
|
r2 = glmm_shuff1(r2, 0, 0, 1, 0); /* b22 b22 0.f b22 */
|
||||||
|
|
||||||
x0 = _mm_add_ps(x0,
|
x4 = glmm_shuff1(x2, 0, 3, 2, 0); /* a10 a12 a11 a10 */
|
||||||
_mm_mul_ps(x2, glmm_shuff2(r0, r1, 1, 1, 2, 2, 2, 0, 0, 0)));
|
x5 = glmm_shuff1(x2, 2, 0, 3, 2); /* a11 a10 a12 a11 */
|
||||||
|
x6 = glmm_shuff1(x3, 2, 0, 0, 0); /* b11 b01 b01 b01 */
|
||||||
|
x2 = glmm_shuff1(r1, 3, 3, 0, 0); /* b21 b21 b11 b11 */
|
||||||
|
|
||||||
_mm_storeu_ps(dest[0], x0);
|
x8 = _mm_unpackhi_ps(x8, x4); /* a10 a00 a12 a02 */
|
||||||
|
x9 = _mm_unpackhi_ps(x7, x2); /* b21 b20 b21 b20 */
|
||||||
|
|
||||||
x0 = _mm_add_ps(_mm_mul_ps(glmm_shuff1(l0, 1, 0, 2, 1),
|
x0 = glmm_fmadd(x4, x6, x0);
|
||||||
_mm_shuffle_ps(r0, r1, _MM_SHUFFLE(2, 2, 3, 3))),
|
x1 = glmm_fmadd(x5, x2, x1);
|
||||||
_mm_mul_ps(glmm_shuff1(x1, 1, 0, 2, 1),
|
|
||||||
glmm_shuff1(r1, 3, 3, 0, 0)));
|
|
||||||
|
|
||||||
x0 = _mm_add_ps(x0,
|
x2 = _mm_movehl_ps(l2, l1); /* a22 a22 a21 a20 */
|
||||||
_mm_mul_ps(glmm_shuff1(x2, 1, 0, 2, 1),
|
x3 = glmm_shuff1(x2, 0, 2, 1, 0); /* a20 a22 a21 a20 */
|
||||||
_mm_shuffle_ps(r1, r2, _MM_SHUFFLE(0, 0, 1, 1))));
|
x2 = glmm_shuff1(x2, 1, 0, 2, 1); /* a21 a20 a22 a21 */
|
||||||
|
x4 = _mm_shuffle_ps(r0, r1, _MM_SHUFFLE(1, 1, 2, 2)); /* b12 b12 b02 b02 */
|
||||||
|
|
||||||
|
x5 = glmm_shuff1(x4, 3, 0, 0, 0); /* b12 b02 b02 b02 */
|
||||||
|
x4 = _mm_movehl_ps(r2, x4); /* b22 b22 b12 b12 */
|
||||||
|
x0 = glmm_fmadd(x3, x5, x0);
|
||||||
|
x1 = glmm_fmadd(x2, x4, x1);
|
||||||
|
|
||||||
_mm_storeu_ps(&dest[1][1], x0);
|
/*
|
||||||
|
Dot Product : dest[2][2] = a02 * b20 +
|
||||||
|
a12 * b21 +
|
||||||
|
a22 * b22 +
|
||||||
|
0 * 00 */
|
||||||
|
x2 = _mm_movelh_ps(x8, l2); /* 0.f a22 a12 a02 */
|
||||||
|
x3 = _mm_movelh_ps(x9, r2); /* 0.f b22 b21 b20 */
|
||||||
|
x2 = glmm_vdots(x2, x3);
|
||||||
|
|
||||||
dest[2][2] = m1[0][2] * m2[2][0]
|
_mm_storeu_ps(&dest[0][0], x0);
|
||||||
+ m1[1][2] * m2[2][1]
|
_mm_storeu_ps(&dest[1][1], x1);
|
||||||
+ m1[2][2] * m2[2][2];
|
_mm_store_ss (&dest[2][2], x2);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user