mirror of
https://github.com/recp/cglm.git
synced 2026-02-17 03:39:05 +00:00
Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3335c04a34 | ||
|
|
af2c866c6d | ||
|
|
5698653f54 | ||
|
|
980b42a865 | ||
|
|
cc6660aa00 |
1
.gitattributes
vendored
1
.gitattributes
vendored
@@ -1 +0,0 @@
|
|||||||
*.h linguist-language=C
|
|
||||||
6
.gitignore
vendored
6
.gitignore
vendored
@@ -72,9 +72,3 @@ 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
|
|
||||||
|
|||||||
@@ -4,12 +4,6 @@ os:
|
|||||||
- linux
|
- linux
|
||||||
- osx
|
- osx
|
||||||
|
|
||||||
arch:
|
|
||||||
- amd64
|
|
||||||
- ppc64le
|
|
||||||
- s390x
|
|
||||||
- arm64
|
|
||||||
|
|
||||||
sudo: required
|
sudo: required
|
||||||
dist: trusty
|
dist: trusty
|
||||||
|
|
||||||
|
|||||||
4
.vscode/settings.json
vendored
4
.vscode/settings.json
vendored
@@ -1,4 +0,0 @@
|
|||||||
{
|
|
||||||
"C_Cpp.default.configurationProvider": "vector-of-bool.cmake-tools",
|
|
||||||
"restructuredtext.confPath": "${workspaceFolder}/docs/source"
|
|
||||||
}
|
|
||||||
149
CMakeLists.txt
149
CMakeLists.txt
@@ -1,149 +0,0 @@
|
|||||||
cmake_minimum_required(VERSION 3.8.2)
|
|
||||||
project(cglm VERSION 0.8.3 LANGUAGES C)
|
|
||||||
|
|
||||||
set(CMAKE_C_STANDARD 11)
|
|
||||||
set(CMAKE_C_STANDARD_REQUIRED YES)
|
|
||||||
set(DEFAULT_BUILD_TYPE "Release")
|
|
||||||
|
|
||||||
set(CGLM_BUILD)
|
|
||||||
option(CGLM_SHARED "Shared build" ON)
|
|
||||||
option(CGLM_STATIC "Static build" OFF)
|
|
||||||
option(CGLM_USE_C99 "" OFF)
|
|
||||||
option(CGLM_USE_TEST "Enable Tests" OFF)
|
|
||||||
|
|
||||||
if(NOT CGLM_STATIC AND CGLM_SHARED)
|
|
||||||
set(CGLM_BUILD SHARED)
|
|
||||||
else(CGLM_STATIC)
|
|
||||||
set(CGLM_BUILD STATIC)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(CGLM_USE_C99)
|
|
||||||
set(CMAKE_C_STANDARD 99)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(MSVC)
|
|
||||||
add_definitions(-DNDEBUG -D_WINDOWS -D_USRDLL)
|
|
||||||
add_compile_options(/W3 /Ox /Gy /Oi /TC)
|
|
||||||
|
|
||||||
# Ref: https://skia.googlesource.com/third_party/sdl/+/refs/heads/master/CMakeLists.txt#225
|
|
||||||
# Make sure /RTC1 is disabled, otherwise it will use functions from the CRT
|
|
||||||
foreach(flag_var
|
|
||||||
CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
|
|
||||||
CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO)
|
|
||||||
string(REGEX REPLACE "/RTC(su|[1su])" "" ${flag_var} "${${flag_var}}")
|
|
||||||
endforeach(flag_var)
|
|
||||||
else()
|
|
||||||
add_compile_options(-Wall -Werror -O3)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
|
|
||||||
message(STATUS "Setting build type to '${DEFAULT_BUILD_TYPE}' as none was specified.")
|
|
||||||
set(CMAKE_BUILD_TYPE "${DEFAULT_BUILD_TYPE}" CACHE STRING "Choose the type of build." FORCE)
|
|
||||||
# Set the possible values of build type for cmake-gui
|
|
||||||
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
include(GNUInstallDirs)
|
|
||||||
|
|
||||||
set(CPACK_PROJECT_NAME ${PROJECT_NAME})
|
|
||||||
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
|
|
||||||
include(CPack)
|
|
||||||
|
|
||||||
# Target Start
|
|
||||||
add_library(${PROJECT_NAME}
|
|
||||||
${CGLM_BUILD}
|
|
||||||
src/euler.c
|
|
||||||
src/affine.c
|
|
||||||
src/io.c
|
|
||||||
src/quat.c
|
|
||||||
src/cam.c
|
|
||||||
src/vec2.c
|
|
||||||
src/vec3.c
|
|
||||||
src/vec4.c
|
|
||||||
src/mat2.c
|
|
||||||
src/mat3.c
|
|
||||||
src/mat4.c
|
|
||||||
src/plane.c
|
|
||||||
src/frustum.c
|
|
||||||
src/box.c
|
|
||||||
src/project.c
|
|
||||||
src/sphere.c
|
|
||||||
src/ease.c
|
|
||||||
src/curve.c
|
|
||||||
src/bezier.c
|
|
||||||
src/ray.c
|
|
||||||
src/affine2d.c
|
|
||||||
src/clipspace/persp_lh_zo.c
|
|
||||||
src/clipspace/persp_rh_zo.c
|
|
||||||
src/clipspace/persp_lh_no.c
|
|
||||||
src/clipspace/persp_rh_no.c
|
|
||||||
src/clipspace/ortho_lh_zo.c
|
|
||||||
src/clipspace/ortho_rh_zo.c
|
|
||||||
src/clipspace/ortho_lh_no.c
|
|
||||||
src/clipspace/ortho_rh_no.c
|
|
||||||
src/clipspace/view_lh_zo.c
|
|
||||||
src/clipspace/view_rh_zo.c
|
|
||||||
src/clipspace/view_lh_no.c
|
|
||||||
src/clipspace/view_rh_no.c
|
|
||||||
)
|
|
||||||
|
|
||||||
if(CGLM_SHARED)
|
|
||||||
add_definitions(-DCGLM_EXPORTS)
|
|
||||||
else()
|
|
||||||
target_compile_definitions(${PROJECT_NAME} PUBLIC -DCGLM_STATIC)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set_target_properties(${PROJECT_NAME} PROPERTIES
|
|
||||||
VERSION ${PROJECT_VERSION}
|
|
||||||
SOVERSION ${PROJECT_VERSION_MAJOR})
|
|
||||||
|
|
||||||
target_include_directories(${PROJECT_NAME}
|
|
||||||
PUBLIC
|
|
||||||
$<INSTALL_INTERFACE:include>
|
|
||||||
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
|
|
||||||
PRIVATE
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/src
|
|
||||||
)
|
|
||||||
|
|
||||||
# Target for header-only usage
|
|
||||||
add_library(${PROJECT_NAME}_headers INTERFACE)
|
|
||||||
target_include_directories(${PROJECT_NAME}_headers INTERFACE
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/include)
|
|
||||||
|
|
||||||
# Test Configuration
|
|
||||||
if(CGLM_USE_TEST)
|
|
||||||
include(CTest)
|
|
||||||
enable_testing()
|
|
||||||
add_subdirectory(test)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Install
|
|
||||||
install(TARGETS ${PROJECT_NAME}
|
|
||||||
EXPORT ${PROJECT_NAME}
|
|
||||||
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
|
||||||
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
|
||||||
RUNTIME DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
|
||||||
|
|
||||||
install(DIRECTORY include/${PROJECT_NAME} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
|
|
||||||
PATTERN ".*" EXCLUDE)
|
|
||||||
|
|
||||||
# Config
|
|
||||||
export(TARGETS ${PROJECT_NAME}
|
|
||||||
NAMESPACE ${PROJECT_NAME}::
|
|
||||||
FILE "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
|
|
||||||
)
|
|
||||||
|
|
||||||
install(EXPORT ${PROJECT_NAME}
|
|
||||||
FILE "${PROJECT_NAME}Config.cmake"
|
|
||||||
NAMESPACE ${PROJECT_NAME}::
|
|
||||||
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME})
|
|
||||||
|
|
||||||
set(PACKAGE_NAME ${PROJECT_NAME})
|
|
||||||
set(prefix ${CMAKE_INSTALL_PREFIX})
|
|
||||||
set(exec_prefix ${CMAKE_INSTALL_PREFIX})
|
|
||||||
set(includedir "\${prefix}/${CMAKE_INSTALL_INCLUDEDIR}")
|
|
||||||
set(libdir "\${prefix}/${CMAKE_INSTALL_LIBDIR}")
|
|
||||||
configure_file(${CMAKE_CURRENT_LIST_DIR}/cglm.pc.in ${CMAKE_BINARY_DIR}/cglm.pc @ONLY)
|
|
||||||
|
|
||||||
install(FILES ${CMAKE_BINARY_DIR}/cglm.pc
|
|
||||||
DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
|
|
||||||
27
CREDITS
27
CREDITS
@@ -65,16 +65,19 @@ https://forums.khronos.org/showthread.php/10651-Animation-TCB-Spline-Interpolati
|
|||||||
12. vec2 cross product
|
12. vec2 cross product
|
||||||
http://allenchou.net/2013/07/cross-product-of-2d-vectors/
|
http://allenchou.net/2013/07/cross-product-of-2d-vectors/
|
||||||
|
|
||||||
13. Ray triangle intersect
|
13. Ken Shoemake's algorithm Implementation and Euler
|
||||||
Möller–Trumbore ray-triangle intersection algorithm, from "Fast, Minimum Storage Ray/Triangle Intersection"
|
Ken Shoemake's algorithm impl. is taken from this repo by permission:
|
||||||
Authors:
|
https://github.com/erich666/GraphicsGems/blob/master/gemsiv/euler_angle
|
||||||
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
|
* -------------------------- GraphicsGems EULA ----------------------------- *
|
||||||
https://stackoverflow.com/a/57793352/2676533
|
| http://www.realtimerendering.com/resources/GraphicsGems/ |
|
||||||
|
| |
|
||||||
16. ARM NEON Div
|
| EULA: The Graphics Gems code is copyright-protected. In other words, you |
|
||||||
|
| cannot claim the text of the code as your own and resell it. Using the |
|
||||||
http://github.com/microsoft/DirectXMath
|
| code is permitted in any program, product, or library, non-commercial or |
|
||||||
|
| commercial. Giving credit is not required, though is a nice gesture. |
|
||||||
|
| The code comes as-is, and if there are any flaws or problems with any Gems |
|
||||||
|
| code, nobody involved with Gems - authors, editors, publishers, or |
|
||||||
|
| webmasters - are to be held responsible. Basically, don't be a jerk, and |
|
||||||
|
| remember that anything free comes with no guarantee. |
|
||||||
|
* -------------------------------- END --------------------------------------*/
|
||||||
|
|||||||
77
Makefile.am
77
Makefile.am
@@ -12,6 +12,7 @@ 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
|
||||||
@@ -21,10 +22,7 @@ checkLDFLAGS = -L./.libs \
|
|||||||
-lm \
|
-lm \
|
||||||
-lcglm
|
-lcglm
|
||||||
checkCFLAGS = $(AM_CFLAGS) \
|
checkCFLAGS = $(AM_CFLAGS) \
|
||||||
-std=gnu11 \
|
-I./include
|
||||||
-O3 \
|
|
||||||
-DCGLM_DEFINE_PRINTS \
|
|
||||||
-I./include
|
|
||||||
|
|
||||||
check_PROGRAMS = test/tests
|
check_PROGRAMS = test/tests
|
||||||
TESTS = $(check_PROGRAMS)
|
TESTS = $(check_PROGRAMS)
|
||||||
@@ -65,27 +63,8 @@ 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
|
|
||||||
|
|
||||||
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 \
|
||||||
@@ -105,9 +84,7 @@ 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_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 \
|
||||||
@@ -118,7 +95,6 @@ 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
|
||||||
@@ -126,15 +102,11 @@ 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.h \
|
||||||
include/cglm/struct/vec2-ext.h \
|
include/cglm/struct/vec2-ext.h \
|
||||||
include/cglm/struct/vec3.h \
|
include/cglm/struct/vec3.h \
|
||||||
@@ -152,22 +124,7 @@ 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 \
|
||||||
@@ -188,31 +145,13 @@ 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
|
|
||||||
|
|
||||||
test_tests_SOURCES=\
|
test_tests_SOURCES=\
|
||||||
test/runner.c \
|
test/runner.c \
|
||||||
test/src/test_common.c \
|
test/src/test_common.c \
|
||||||
test/src/tests.c \
|
test/src/tests.c \
|
||||||
test/src/test_cam.c \
|
test/src/test_cam.c \
|
||||||
test/src/test_cam_lh_zo.c \
|
|
||||||
test/src/test_cam_rh_zo.c \
|
|
||||||
test/src/test_cam_lh_no.c \
|
|
||||||
test/src/test_cam_rh_no.c \
|
|
||||||
test/src/test_clamp.c \
|
test/src/test_clamp.c \
|
||||||
test/src/test_euler.c \
|
test/src/test_euler.c \
|
||||||
test/src/test_bezier.c \
|
test/src/test_bezier.c \
|
||||||
|
|||||||
@@ -1,44 +0,0 @@
|
|||||||
// 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
|
|
||||||
)
|
|
||||||
130
README.md
130
README.md
@@ -1,6 +1,6 @@
|
|||||||
# 🎥 OpenGL Mathematics (glm) for `C`
|
# 🎥 OpenGL Mathematics (glm) for `C`
|
||||||
[](https://travis-ci.com/recp/cglm)
|
[](https://travis-ci.org/recp/cglm)
|
||||||
[](https://ci.appveyor.com/project/recp/cglm/branch/master)
|
[](https://ci.appveyor.com/project/recp/cglm/branch/master)
|
||||||
[](http://cglm.readthedocs.io/en/latest/?badge=latest)
|
[](http://cglm.readthedocs.io/en/latest/?badge=latest)
|
||||||
[](https://coveralls.io/github/recp/cglm?branch=master)
|
[](https://coveralls.io/github/recp/cglm?branch=master)
|
||||||
[](https://codecov.io/gh/recp/cglm)
|
[](https://codecov.io/gh/recp/cglm)
|
||||||
@@ -25,8 +25,6 @@ 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:
|
||||||
@@ -70,8 +68,6 @@ Currently *cglm* uses default clip space configuration (-1, 1) for camera functi
|
|||||||
</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)
|
||||||
@@ -86,21 +82,20 @@ 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 options to call a function/operation: inline or library call (link)
|
You have two option 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 versions, just use `glmc_` (c stands for 'call') instead of `glm_`.
|
To call pre-compiled version, just use `glmc_` (c stands for 'call') instead of `glm_`.
|
||||||
|
|
||||||
```C
|
```C
|
||||||
#include <cglm/cglm.h> /* for inline */
|
#include <cglm/cglm.h> /* for inline */
|
||||||
@@ -153,119 +148,6 @@ The types used are actually unions that allow access to the same data multiple w
|
|||||||
|
|
||||||
## 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)
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
@@ -409,7 +291,7 @@ You can pass matrices the same way to other APIs e.g. Vulkan, DX...
|
|||||||
## 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="https://github.com/recp/cglm/graphs/contributors"><img src="https://opencollective.com/cglm/contributors.svg?width=890&button=false" /></a>
|
<a href="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.8.2"
|
s.version = "0.6.1"
|
||||||
s.summary = "📽 Highly Optimized Graphics Math (glm) for C"
|
s.summary = "📽 Optimized OpenGL/Graphics Math (glm) for C"
|
||||||
s.description = <<-DESC
|
s.description = <<-DESC
|
||||||
cglm is math library for graphics programming for C. See the documentation or README for all features.
|
cglm is math library for graphics programming for C. 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.
|
||||||
DESC
|
DESC
|
||||||
|
|
||||||
s.documentation_url = "http://cglm.readthedocs.io"
|
s.documentation_url = "http://cglm.readthedocs.io"
|
||||||
@@ -25,13 +25,4 @@ cglm is math library for graphics programming for C. See the documentation or RE
|
|||||||
|
|
||||||
# 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.8.3], [info@recp.me])
|
AC_INIT([cglm], [0.7.1], [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
|
||||||
|
|
||||||
3D Affine Transform Matrix (specialized functions)
|
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
|
||||||
|
|
||||||
3D Affine Transforms
|
affine transforms
|
||||||
================================================================================
|
================================================================================
|
||||||
|
|
||||||
Header: cglm/affine.h
|
Header: cglm/affine.h
|
||||||
@@ -45,8 +45,6 @@ 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
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
|||||||
@@ -1,140 +0,0 @@
|
|||||||
.. 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,7 +28,6 @@ Follow the :doc:`build` documentation for this
|
|||||||
|
|
||||||
affine
|
affine
|
||||||
affine-mat
|
affine-mat
|
||||||
affine2d
|
|
||||||
cam
|
cam
|
||||||
frustum
|
frustum
|
||||||
box
|
box
|
||||||
@@ -52,5 +51,3 @@ Follow the :doc:`build` documentation for this
|
|||||||
sphere
|
sphere
|
||||||
curve
|
curve
|
||||||
bezier
|
bezier
|
||||||
version
|
|
||||||
ray
|
|
||||||
|
|||||||
@@ -7,97 +7,6 @@ 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):
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
|||||||
@@ -198,7 +198,7 @@ Functions documentation
|
|||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **eye** eye vector
|
| *[in]* **eye** eye vector
|
||||||
| *[in]* **dir** direction vector
|
| *[in]* **center** 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]* **dir** direction vector
|
| *[in]* **center** 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 = '3.0'
|
# needs_sphinx = '1.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.8.3'
|
version = u'0.7.1'
|
||||||
# The full version, including alpha/beta/rc tags.
|
# The full version, including alpha/beta/rc tags.
|
||||||
release = u'0.8.3'
|
release = u'0.7.1'
|
||||||
|
|
||||||
# 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,7 +197,3 @@ 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,13 +1,10 @@
|
|||||||
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 transformations
|
* affine transforms
|
||||||
* 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)
|
||||||
@@ -23,6 +20,4 @@ Features
|
|||||||
* easing functions
|
* easing functions
|
||||||
* curves
|
* curves
|
||||||
* curve interpolation helpers (SMC, deCasteljau...)
|
* curve interpolation helpers (SMC, deCasteljau...)
|
||||||
* helpers to convert cglm types to Apple's simd library to pass cglm types to Metal GL without packing them on both sides
|
* and other...
|
||||||
* ray intersection helpers
|
|
||||||
* and others...
|
|
||||||
|
|||||||
@@ -28,23 +28,6 @@ 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):
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
|||||||
@@ -156,22 +156,16 @@ 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, float last, vec3 dest)
|
.. c:function:: void glm_mat4_mulv3(mat4 m, vec3 v, vec3 dest)
|
||||||
|
|
||||||
| multiply **vec3** with **mat4** and get **vec3** as result
|
multiply vector with mat4's mat3 part(rotation)
|
||||||
|
|
|
||||||
| 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(affine transform)
|
| *[in]* **m** mat4 (left)
|
||||||
| *[in]* **v** vec3
|
| *[in]* **v** vec3 (right, column vector)
|
||||||
| *[in]* **last** 4th item to make it vec4
|
| *[out]* **dest** vec3 (result, column vector)
|
||||||
| *[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 accepts pointer. But you may got warnings for matrix because it is
|
function which accecpts 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 versions then you
|
to define it in build system. If you use pre-compiled verisons 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,45 +35,6 @@ 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.
|
||||||
@@ -89,36 +50,3 @@ 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.
|
|
||||||
|
|||||||
@@ -52,7 +52,6 @@ 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`
|
||||||
@@ -305,25 +304,6 @@ 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
|
||||||
@@ -394,7 +374,7 @@ Functions documentation
|
|||||||
| *[in]* **q** quaternion
|
| *[in]* **q** quaternion
|
||||||
| *[in]* **pivot** pivot
|
| *[in]* **pivot** pivot
|
||||||
|
|
||||||
.. c:function:: void glm_quat_rotate_atm(mat4 m, versor q, vec3 pivot)
|
.. c:function:: void glm_quat_rotate(mat4 m, versor q, mat4 dest)
|
||||||
|
|
||||||
| 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
|
||||||
|
|||||||
@@ -1,31 +0,0 @@
|
|||||||
.. 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,19 +80,6 @@ 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,7 +23,6 @@ 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
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
@@ -147,7 +146,7 @@ Functions documentation
|
|||||||
| *[in]* **b** b
|
| *[in]* **b** b
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
true if a and b are equal
|
true if a and b equals
|
||||||
|
|
||||||
.. c:function:: float glm_percent(float from, float to, float current)
|
.. c:function:: float glm_percent(float from, float to, float current)
|
||||||
|
|
||||||
@@ -159,7 +158,7 @@ Functions documentation
|
|||||||
| *[in]* **current** value between from and to values
|
| *[in]* **current** value between from and to values
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
percentage of current value
|
clamped normalized percent (0-100 in 0-1)
|
||||||
|
|
||||||
.. c:function:: float glm_percentc(float from, float to, float current)
|
.. c:function:: float glm_percentc(float from, float to, float current)
|
||||||
|
|
||||||
@@ -172,11 +171,3 @@ 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
|
|
||||||
|
|||||||
@@ -55,12 +55,12 @@ Functions:
|
|||||||
Functions documentation
|
Functions documentation
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
.. c:function:: void glm_vec2(float * v, vec2 dest)
|
.. c:function:: void glm_vec2(vec4 v4, vec2 dest)
|
||||||
|
|
||||||
init vec2 using vec3 or vec4
|
init vec2 using vec3
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **v** vector
|
| *[in]* **v3** vector3
|
||||||
| *[out]* **dest** destination
|
| *[out]* **dest** destination
|
||||||
|
|
||||||
.. c:function:: void glm_vec2_copy(vec2 a, vec2 dest)
|
.. c:function:: void glm_vec2_copy(vec2 a, vec2 dest)
|
||||||
|
|||||||
@@ -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)
|
||||||
| *[in]* **angle** angle (radians)
|
| *[out]* **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]* **v1** vector1
|
| *[in]* **mat** vector1
|
||||||
| *[in]* **v2** vector2
|
| *[in]* **row1** 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]* **v1** vector1
|
| *[in]* **mat** vector1
|
||||||
| *[in]* **v2** vector2
|
| *[in]* **row1** vector2
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
| distance
|
| distance
|
||||||
@@ -475,7 +475,7 @@ Functions documentation
|
|||||||
possible orthogonal/perpendicular vector
|
possible orthogonal/perpendicular vector
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **v** vector
|
| *[in]* **mat** 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)
|
||||||
|
|||||||
@@ -1,15 +0,0 @@
|
|||||||
.. 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,10 +26,6 @@
|
|||||||
# 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
|
||||||
*
|
*
|
||||||
@@ -53,8 +49,6 @@ 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],
|
||||||
@@ -109,8 +103,6 @@ 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],
|
||||||
@@ -158,8 +150,6 @@ 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,6 +40,10 @@
|
|||||||
#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
|
||||||
@@ -50,22 +54,26 @@
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_translate(mat4 m, vec3 v) {
|
glm_translate(mat4 m, vec3 v) {
|
||||||
#if defined(CGLM_SIMD)
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
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],
|
||||||
glmm_fmadd(m0, glmm_set1(v[0]),
|
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_load(m[0]),
|
||||||
glmm_fmadd(m1, glmm_set1(v[1]),
|
_mm_set1_ps(v[0])),
|
||||||
glmm_fmadd(m2, glmm_set1(v[2]), m3))));
|
_mm_mul_ps(glmm_load(m[1]),
|
||||||
|
_mm_set1_ps(v[1]))),
|
||||||
|
_mm_add_ps(_mm_mul_ps(glmm_load(m[2]),
|
||||||
|
_mm_set1_ps(v[2])),
|
||||||
|
glmm_load(m[3]))))
|
||||||
|
;
|
||||||
#else
|
#else
|
||||||
glm_vec4_muladds(m[0], v[0], m[3]);
|
vec4 v1, v2, v3;
|
||||||
glm_vec4_muladds(m[1], v[1], m[3]);
|
|
||||||
glm_vec4_muladds(m[2], v[2], m[3]);
|
glm_vec4_scale(m[0], v[0], v1);
|
||||||
|
glm_vec4_scale(m[1], v[1], v2);
|
||||||
|
glm_vec4_scale(m[2], v[2], v3);
|
||||||
|
|
||||||
|
glm_vec4_add(v1, m[3], m[3]);
|
||||||
|
glm_vec4_add(v2, m[3], m[3]);
|
||||||
|
glm_vec4_add(v3, m[3], m[3]);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -95,8 +103,12 @@ 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(CGLM_SIMD)
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
glmm_store(m[3], glmm_fmadd(glmm_load(m[0]), glmm_set1(x), glmm_load(m[3])));
|
glmm_store(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);
|
||||||
@@ -113,8 +125,12 @@ 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(CGLM_SIMD)
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
glmm_store(m[3], glmm_fmadd(glmm_load(m[1]), glmm_set1(y), glmm_load(m[3])));
|
glmm_store(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);
|
||||||
@@ -131,8 +147,12 @@ 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(CGLM_SIMD)
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
glmm_store(m[3], glmm_fmadd(glmm_load(m[2]), glmm_set1(z), glmm_load(m[3])));
|
glmm_store(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);
|
||||||
@@ -439,7 +459,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 (assume that the matrix is orthonormal):
|
/* Note from Apple Open Source (asume 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);
|
||||||
|
|||||||
@@ -1,268 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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,8 +228,6 @@ 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
|
||||||
*/
|
*/
|
||||||
@@ -239,13 +237,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]) + (s[0] > box[1][0]);
|
a = s[0] >= box[0][0];
|
||||||
b = (s[1] < box[0][1]) + (s[1] > box[1][1]);
|
b = s[1] >= box[0][1];
|
||||||
c = (s[2] < box[0][2]) + (s[2] > box[1][2]);
|
c = s[2] >= box[0][2];
|
||||||
|
|
||||||
dmin = glm_pow2((s[0] - box[!(a - 1)][0]) * (a != 0))
|
dmin = glm_pow2(s[0] - box[a][0])
|
||||||
+ glm_pow2((s[1] - box[!(b - 1)][1]) * (b != 0))
|
+ glm_pow2(s[1] - box[b][1])
|
||||||
+ glm_pow2((s[2] - box[!(c - 1)][2]) * (c != 0));
|
+ glm_pow2(s[2] - box[c][2]);
|
||||||
|
|
||||||
return dmin <= glm_pow2(s[3]);
|
return dmin <= glm_pow2(s[3]);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,8 +31,6 @@ 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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,67 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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,17 +15,23 @@ extern "C" {
|
|||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_frustum(float left, float right,
|
glmc_frustum(float left,
|
||||||
float bottom, float top,
|
float right,
|
||||||
float nearZ, float farZ,
|
float bottom,
|
||||||
mat4 dest);
|
float top,
|
||||||
|
float nearVal,
|
||||||
|
float farVal,
|
||||||
|
mat4 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_ortho(float left, float right,
|
glmc_ortho(float left,
|
||||||
float bottom, float top,
|
float right,
|
||||||
float nearZ, float farZ,
|
float bottom,
|
||||||
mat4 dest);
|
float top,
|
||||||
|
float nearVal,
|
||||||
|
float farVal,
|
||||||
|
mat4 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
@@ -49,7 +55,11 @@ glmc_ortho_default_s(float aspect, float size, mat4 dest);
|
|||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_perspective(float fovy, float aspect, float nearZ, float farZ, mat4 dest);
|
glmc_perspective(float fovy,
|
||||||
|
float aspect,
|
||||||
|
float nearVal,
|
||||||
|
float farVal,
|
||||||
|
mat4 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
@@ -78,8 +88,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 nearZ,
|
float * __restrict nearVal,
|
||||||
float * __restrict farZ,
|
float * __restrict farVal,
|
||||||
float * __restrict top,
|
float * __restrict top,
|
||||||
float * __restrict bottom,
|
float * __restrict bottom,
|
||||||
float * __restrict left,
|
float * __restrict left,
|
||||||
@@ -104,16 +114,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 nearZ,
|
float * __restrict nearVal,
|
||||||
float * __restrict farZ);
|
float * __restrict farVal);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_persp_decomp_far(mat4 proj, float * __restrict farZ);
|
glmc_persp_decomp_far(mat4 proj, float * __restrict farVal);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_persp_decomp_near(mat4 proj, float * __restrict nearZ);
|
glmc_persp_decomp_near(mat4 proj, float * __restrict nearVal);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
float
|
float
|
||||||
|
|||||||
@@ -1,46 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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 */
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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 */
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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 */
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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 */
|
|
||||||
@@ -1,87 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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 */
|
|
||||||
@@ -1,87 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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 */
|
|
||||||
@@ -1,87 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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 */
|
|
||||||
@@ -1,87 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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 */
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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 */
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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 */
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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 */
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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,7 +7,6 @@
|
|||||||
|
|
||||||
#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
|
||||||
|
|||||||
@@ -116,15 +116,11 @@ 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);
|
||||||
|
|||||||
@@ -1,27 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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 */
|
|
||||||
@@ -99,7 +99,7 @@ glmc_vec4_scale(vec4 v, float s, vec4 dest);
|
|||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
void
|
void
|
||||||
glmc_vec4_scale_as(vec4 v, float s, vec4 dest);
|
glmc_vec4_scale_as(vec3 v, float s, vec3 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 nearZ, float farZ,
|
float nearVal, float farVal,
|
||||||
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 nearZ, float farZ,
|
float nearVal, float farVal,
|
||||||
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 nearZ,
|
float nearVal,
|
||||||
float farZ,
|
float farVal,
|
||||||
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,61 +31,26 @@
|
|||||||
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 *nearZ, float *farZ,
|
float *nearVal, float *farVal,
|
||||||
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 *farZ)
|
CGLM_INLINE void glm_persp_decomp_far(mat4 proj, float *farVal)
|
||||||
CGLM_INLINE void glm_persp_decomp_near(mat4 proj, float *nearZ)
|
CGLM_INLINE void glm_persp_decomp_near(mat4 proj, float *nearVal)
|
||||||
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_cam_h
|
#ifndef cglm_vcam_h
|
||||||
#define cglm_cam_h
|
#define cglm_vcam_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
|
||||||
*
|
*
|
||||||
@@ -93,25 +58,32 @@
|
|||||||
* @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] nearZ near clipping plane
|
* @param[in] nearVal near clipping plane
|
||||||
* @param[in] farZ far clipping plane
|
* @param[in] farVal 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 nearZ, float farZ,
|
float nearVal, float farVal,
|
||||||
mat4 dest) {
|
mat4 dest) {
|
||||||
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
|
float rl, tb, fn, nv;
|
||||||
glm_frustum_lh_zo(left, right, bottom, top, nearZ, farZ, dest);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
|
glm_mat4_zero(dest);
|
||||||
glm_frustum_lh_no(left, right, bottom, top, nearZ, farZ, dest);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
|
rl = 1.0f / (right - left);
|
||||||
glm_frustum_rh_zo(left, right, bottom, top, nearZ, farZ, dest);
|
tb = 1.0f / (top - bottom);
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
|
fn =-1.0f / (farVal - nearVal);
|
||||||
glm_frustum_rh_no(left, right, bottom, top, nearZ, farZ, dest);
|
nv = 2.0f * nearVal;
|
||||||
#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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -121,25 +93,31 @@ 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] nearZ near clipping plane
|
* @param[in] nearVal near clipping plane
|
||||||
* @param[in] farZ far clipping plane
|
* @param[in] farVal 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 nearZ, float farZ,
|
float nearVal, float farVal,
|
||||||
mat4 dest) {
|
mat4 dest) {
|
||||||
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
|
float rl, tb, fn;
|
||||||
glm_ortho_lh_zo(left, right, bottom, top, nearZ, farZ, dest);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
|
glm_mat4_zero(dest);
|
||||||
glm_ortho_lh_no(left, right, bottom, top, nearZ, farZ, dest);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
|
rl = 1.0f / (right - left);
|
||||||
glm_ortho_rh_zo(left, right, bottom, top, nearZ, farZ, dest);
|
tb = 1.0f / (top - bottom);
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
|
fn =-1.0f / (farVal - nearVal);
|
||||||
glm_ortho_rh_no(left, right, bottom, top, nearZ, farZ, dest);
|
|
||||||
#endif
|
dest[0][0] = 2.0f * rl;
|
||||||
|
dest[1][1] = 2.0f * tb;
|
||||||
|
dest[2][2] = 2.0f * fn;
|
||||||
|
dest[3][0] =-(right + left) * rl;
|
||||||
|
dest[3][1] =-(top + bottom) * tb;
|
||||||
|
dest[3][2] = (farVal + nearVal) * fn;
|
||||||
|
dest[3][3] = 1.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -153,15 +131,10 @@ 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) {
|
||||||
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
|
glm_ortho(box[0][0], box[1][0],
|
||||||
glm_ortho_aabb_lh_zo(box, dest);
|
box[0][1], box[1][1],
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
|
-box[1][2], -box[0][2],
|
||||||
glm_ortho_aabb_lh_no(box, dest);
|
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
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -176,15 +149,10 @@ 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) {
|
||||||
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
|
glm_ortho(box[0][0] - padding, box[1][0] + padding,
|
||||||
glm_ortho_aabb_p_lh_zo(box, padding, dest);
|
box[0][1] - padding, box[1][1] + padding,
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
|
-(box[1][2] + padding), -(box[0][2] - padding),
|
||||||
glm_ortho_aabb_p_lh_no(box, padding, dest);
|
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
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -199,15 +167,10 @@ 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) {
|
||||||
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
|
glm_ortho(box[0][0], box[1][0],
|
||||||
glm_ortho_aabb_pz_lh_zo(box, padding, dest);
|
box[0][1], box[1][1],
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
|
-(box[1][2] + padding), -(box[0][2] - padding),
|
||||||
glm_ortho_aabb_pz_lh_no(box, padding, dest);
|
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
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -219,15 +182,14 @@ 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 CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
|
if (aspect >= 1.0f) {
|
||||||
glm_ortho_default_lh_zo(aspect, dest);
|
glm_ortho(-aspect, aspect, -1.0f, 1.0f, -100.0f, 100.0f, dest);
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
|
return;
|
||||||
glm_ortho_default_lh_no(aspect, dest);
|
}
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
|
|
||||||
glm_ortho_default_rh_zo(aspect, dest);
|
aspect = 1.0f / aspect;
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
|
|
||||||
glm_ortho_default_rh_no(aspect, dest);
|
glm_ortho(-1.0f, 1.0f, -aspect, aspect, -100.0f, 100.0f, dest);
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -240,15 +202,24 @@ 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 CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
|
if (aspect >= 1.0f) {
|
||||||
glm_ortho_default_s_lh_zo(aspect, size, dest);
|
glm_ortho(-size * aspect,
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
|
size * aspect,
|
||||||
glm_ortho_default_s_lh_no(aspect, size, dest);
|
-size,
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
|
size,
|
||||||
glm_ortho_default_s_rh_zo(aspect, size, dest);
|
-size - 100.0f,
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
|
size + 100.0f,
|
||||||
glm_ortho_default_s_rh_no(aspect, size, dest);
|
dest);
|
||||||
#endif
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
glm_ortho(-size,
|
||||||
|
size,
|
||||||
|
-size / aspect,
|
||||||
|
size / aspect,
|
||||||
|
-size - 100.0f,
|
||||||
|
size + 100.0f,
|
||||||
|
dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -256,22 +227,29 @@ 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] nearZ near clipping plane
|
* @param[in] nearVal near clipping plane
|
||||||
* @param[in] farZ far clipping planes
|
* @param[in] farVal far clipping planes
|
||||||
* @param[out] dest result matrix
|
* @param[out] dest result matrix
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_perspective(float fovy, float aspect, float nearZ, float farZ, mat4 dest) {
|
glm_perspective(float fovy,
|
||||||
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
|
float aspect,
|
||||||
glm_perspective_lh_zo(fovy, aspect, nearZ, farZ, dest);
|
float nearVal,
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
|
float farVal,
|
||||||
glm_perspective_lh_no(fovy, aspect, nearZ, farZ, dest);
|
mat4 dest) {
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
|
float f, fn;
|
||||||
glm_perspective_rh_zo(fovy, aspect, nearZ, farZ, dest);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
|
glm_mat4_zero(dest);
|
||||||
glm_perspective_rh_no(fovy, aspect, nearZ, farZ, dest);
|
|
||||||
#endif
|
f = 1.0f / tanf(fovy * 0.5f);
|
||||||
|
fn = 1.0f / (nearVal - farVal);
|
||||||
|
|
||||||
|
dest[0][0] = f / aspect;
|
||||||
|
dest[1][1] = f;
|
||||||
|
dest[2][2] = (nearVal + farVal) * fn;
|
||||||
|
dest[2][3] =-1.0f;
|
||||||
|
dest[3][2] = 2.0f * nearVal * farVal * fn;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -285,15 +263,17 @@ glm_perspective(float fovy, float aspect, float nearZ, float farZ, mat4 dest) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_persp_move_far(mat4 proj, float deltaFar) {
|
glm_persp_move_far(mat4 proj, float deltaFar) {
|
||||||
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
|
float fn, farVal, nearVal, p22, p32;
|
||||||
glm_persp_move_far_lh_zo(proj, deltaFar);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
|
p22 = proj[2][2];
|
||||||
glm_persp_move_far_lh_no(proj, deltaFar);
|
p32 = proj[3][2];
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
|
|
||||||
glm_persp_move_far_rh_zo(proj, deltaFar);
|
nearVal = p32 / (p22 - 1.0f);
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
|
farVal = p32 / (p22 + 1.0f) + deltaFar;
|
||||||
glm_persp_move_far_rh_no(proj, deltaFar);
|
fn = 1.0f / (nearVal - farVal);
|
||||||
#endif
|
|
||||||
|
proj[2][2] = (nearVal + farVal) * fn;
|
||||||
|
proj[3][2] = 2.0f * nearVal * farVal * fn;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -306,15 +286,7 @@ 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) {
|
||||||
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
|
glm_perspective(GLM_PI_4f, aspect, 0.01f, 100.0f, dest);
|
||||||
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
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -348,11 +320,28 @@ glm_perspective_resize(float aspect, mat4 proj) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_lookat(vec3 eye, vec3 center, vec3 up, mat4 dest) {
|
glm_lookat(vec3 eye, vec3 center, vec3 up, mat4 dest) {
|
||||||
#if CGLM_CONFIG_CLIP_CONTROL & CGLM_CLIP_CONTROL_LH_BIT
|
CGLM_ALIGN(8) vec3 f, u, s;
|
||||||
glm_lookat_lh(eye, center, up, dest);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL & CGLM_CLIP_CONTROL_RH_BIT
|
glm_vec3_sub(center, eye, f);
|
||||||
glm_lookat_rh(eye, center, up, dest);
|
glm_vec3_normalize(f);
|
||||||
#endif
|
|
||||||
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -372,11 +361,9 @@ glm_lookat(vec3 eye, vec3 center, vec3 up, mat4 dest) {
|
|||||||
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) {
|
||||||
#if CGLM_CONFIG_CLIP_CONTROL & CGLM_CLIP_CONTROL_LH_BIT
|
CGLM_ALIGN(8) vec3 target;
|
||||||
glm_look_lh(eye, dir, up, dest);
|
glm_vec3_add(eye, dir, target);
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL & CGLM_CLIP_CONTROL_RH_BIT
|
glm_lookat(eye, target, up, dest);
|
||||||
glm_look_rh(eye, dir, up, dest);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -392,19 +379,17 @@ 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) {
|
||||||
#if CGLM_CONFIG_CLIP_CONTROL & CGLM_CLIP_CONTROL_LH_BIT
|
CGLM_ALIGN(8) vec3 up;
|
||||||
glm_look_anyup_lh(eye, dir, dest);
|
glm_vec3_ortho(dir, up);
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL & CGLM_CLIP_CONTROL_RH_BIT
|
glm_look(eye, dir, up, dest);
|
||||||
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] nearZ near
|
* @param[out] nearVal near
|
||||||
* @param[out] farZ far
|
* @param[out] farVal 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
|
||||||
@@ -413,18 +398,31 @@ 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 nearZ, float * __restrict farZ,
|
float * __restrict nearVal, float * __restrict farVal,
|
||||||
float * __restrict top, float * __restrict bottom,
|
float * __restrict top, float * __restrict bottom,
|
||||||
float * __restrict left, float * __restrict right) {
|
float * __restrict left, float * __restrict right) {
|
||||||
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
|
float m00, m11, m20, m21, m22, m32, n, f;
|
||||||
glm_persp_decomp_lh_zo(proj, nearZ, farZ, top, bottom, left, right);
|
float n_m11, n_m00;
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
|
|
||||||
glm_persp_decomp_lh_no(proj, nearZ, farZ, top, bottom, left, right);
|
m00 = proj[0][0];
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
|
m11 = proj[1][1];
|
||||||
glm_persp_decomp_rh_zo(proj, nearZ, farZ, top, bottom, left, right);
|
m20 = proj[2][0];
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
|
m21 = proj[2][1];
|
||||||
glm_persp_decomp_rh_no(proj, nearZ, farZ, top, bottom, left, right);
|
m22 = proj[2][2];
|
||||||
#endif
|
m32 = proj[3][2];
|
||||||
|
|
||||||
|
n = m32 / (m22 - 1.0f);
|
||||||
|
f = m32 / (m22 + 1.0f);
|
||||||
|
|
||||||
|
n_m11 = n / m11;
|
||||||
|
n_m00 = n / m00;
|
||||||
|
|
||||||
|
*nearVal = n;
|
||||||
|
*farVal = f;
|
||||||
|
*bottom = n_m11 * (m21 - 1.0f);
|
||||||
|
*top = n_m11 * (m21 + 1.0f);
|
||||||
|
*left = n_m00 * (m20 - 1.0f);
|
||||||
|
*right = n_m00 * (m20 + 1.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -437,15 +435,8 @@ 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]) {
|
||||||
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
|
glm_persp_decomp(proj, &dest[0], &dest[1], &dest[2],
|
||||||
glm_persp_decompv_lh_zo(proj, dest);
|
&dest[3], &dest[4], &dest[5]);
|
||||||
#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
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -461,15 +452,14 @@ 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) {
|
||||||
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
|
float nearVal, m20, m00;
|
||||||
glm_persp_decomp_x_lh_zo(proj, left, right);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
|
m00 = proj[0][0];
|
||||||
glm_persp_decomp_x_lh_no(proj, left, right);
|
m20 = proj[2][0];
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
|
|
||||||
glm_persp_decomp_x_rh_zo(proj, left, right);
|
nearVal = proj[3][2] / (proj[3][3] - 1.0f);
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
|
*left = nearVal * (m20 - 1.0f) / m00;
|
||||||
glm_persp_decomp_x_rh_no(proj, left, right);
|
*right = nearVal * (m20 + 1.0f) / m00;
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -485,15 +475,14 @@ 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) {
|
||||||
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
|
float nearVal, m21, m11;
|
||||||
glm_persp_decomp_y_lh_zo(proj, top, bottom);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
|
m21 = proj[2][1];
|
||||||
glm_persp_decomp_y_lh_no(proj, top, bottom);
|
m11 = proj[1][1];
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
|
|
||||||
glm_persp_decomp_y_rh_zo(proj, top, bottom);
|
nearVal = proj[3][2] / (proj[3][3] - 1.0f);
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
|
*bottom = nearVal * (m21 - 1) / m11;
|
||||||
glm_persp_decomp_y_rh_no(proj, top, bottom);
|
*top = nearVal * (m21 + 1) / m11;
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -501,61 +490,70 @@ 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] nearZ near
|
* @param[out] nearVal near
|
||||||
* @param[out] farZ far
|
* @param[out] farVal far
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_persp_decomp_z(mat4 proj, float * __restrict nearZ, float * __restrict farZ) {
|
glm_persp_decomp_z(mat4 proj,
|
||||||
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
|
float * __restrict nearVal,
|
||||||
glm_persp_decomp_z_lh_zo(proj, nearZ, farZ);
|
float * __restrict farVal) {
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
|
float m32, m22;
|
||||||
glm_persp_decomp_z_lh_no(proj, nearZ, farZ);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
|
m32 = proj[3][2];
|
||||||
glm_persp_decomp_z_rh_zo(proj, nearZ, farZ);
|
m22 = proj[2][2];
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
|
|
||||||
glm_persp_decomp_z_rh_no(proj, nearZ, farZ);
|
*nearVal = m32 / (m22 - 1.0f);
|
||||||
#endif
|
*farVal = m32 / (m22 + 1.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @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] farZ far
|
* @param[out] farVal far
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_persp_decomp_far(mat4 proj, float * __restrict farZ) {
|
glm_persp_decomp_far(mat4 proj, float * __restrict farVal) {
|
||||||
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
|
*farVal = proj[3][2] / (proj[2][2] + 1.0f);
|
||||||
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] nearZ near
|
* @param[out] nearVal near
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_persp_decomp_near(mat4 proj, float * __restrict nearZ) {
|
glm_persp_decomp_near(mat4 proj, float * __restrict nearVal) {
|
||||||
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
|
*nearVal = proj[3][2] / (proj[2][2] - 1.0f);
|
||||||
glm_persp_decomp_near_lh_zo(proj, nearZ);
|
}
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
|
|
||||||
glm_persp_decomp_near_lh_no(proj, nearZ);
|
/*!
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
|
* @brief returns field of view angle along the Y-axis (in radians)
|
||||||
glm_persp_decomp_near_rh_zo(proj, nearZ);
|
*
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
|
* if you need to degrees, use glm_deg to convert it or use this:
|
||||||
glm_persp_decomp_near_rh_no(proj, nearZ);
|
* fovy_deg = glm_deg(glm_persp_fovy(projMatrix))
|
||||||
#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];
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -568,15 +566,17 @@ glm_persp_decomp_near(mat4 proj, float * __restrict nearZ) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_persp_sizes(mat4 proj, float fovy, vec4 dest) {
|
glm_persp_sizes(mat4 proj, float fovy, vec4 dest) {
|
||||||
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
|
float t, a, nearVal, farVal;
|
||||||
glm_persp_sizes_lh_zo(proj, fovy, dest);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
|
t = 2.0f * tanf(fovy * 0.5f);
|
||||||
glm_persp_sizes_lh_no(proj, fovy, dest);
|
a = glm_persp_aspect(proj);
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
|
|
||||||
glm_persp_sizes_rh_zo(proj, fovy, dest);
|
glm_persp_decomp_z(proj, &nearVal, &farVal);
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
|
|
||||||
glm_persp_sizes_rh_no(proj, fovy, dest);
|
dest[1] = t * nearVal;
|
||||||
#endif
|
dest[3] = t * farVal;
|
||||||
|
dest[0] = a * dest[1];
|
||||||
|
dest[2] = a * dest[3];
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* cglm_cam_h */
|
#endif /* cglm_vcam_h */
|
||||||
|
|||||||
@@ -30,7 +30,5 @@
|
|||||||
#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 */
|
||||||
|
|||||||
@@ -1,182 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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"
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @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*/
|
|
||||||
@@ -1,176 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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"
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @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*/
|
|
||||||
@@ -1,182 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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"
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @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*/
|
|
||||||
@@ -1,180 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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"
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @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*/
|
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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 */
|
|
||||||
@@ -1,396 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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 "../plane.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*/
|
|
||||||
@@ -1,388 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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 "../plane.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*/
|
|
||||||
@@ -1,396 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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 "../plane.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*/
|
|
||||||
@@ -1,390 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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 "../plane.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*/
|
|
||||||
@@ -1,99 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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*/
|
|
||||||
@@ -1,73 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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 "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*/
|
|
||||||
@@ -1,73 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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 "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*/
|
|
||||||
@@ -1,99 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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*/
|
|
||||||
@@ -1,73 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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 "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*/
|
|
||||||
@@ -1,73 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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 "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,13 +8,7 @@
|
|||||||
#ifndef cglm_common_h
|
#ifndef cglm_common_h
|
||||||
#define cglm_common_h
|
#define cglm_common_h
|
||||||
|
|
||||||
#ifndef _USE_MATH_DEFINES
|
#define _USE_MATH_DEFINES /* for windows */
|
||||||
# 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>
|
||||||
@@ -23,9 +17,7 @@
|
|||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
#if defined(_MSC_VER)
|
#if defined(_MSC_VER)
|
||||||
# ifdef CGLM_STATIC
|
# ifdef CGLM_DLL
|
||||||
# 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)
|
||||||
@@ -42,43 +34,4 @@
|
|||||||
#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-6
|
|
||||||
# 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 */
|
||||||
|
|||||||
@@ -18,24 +18,160 @@
|
|||||||
enum glm_euler_seq
|
enum glm_euler_seq
|
||||||
|
|
||||||
Functions:
|
Functions:
|
||||||
CGLM_INLINE glm_euler_seq glm_euler_order(int newOrder[3]);
|
CGLM_INLINE glm_eul_mat4(vec3 ea, int order, mat4 dest)
|
||||||
CGLM_INLINE void glm_euler_angles(mat4 m, vec3 dest);
|
|
||||||
CGLM_INLINE void glm_euler(vec3 angles, mat4 dest);
|
|
||||||
CGLM_INLINE void glm_euler_xyz(vec3 angles, mat4 dest);
|
|
||||||
CGLM_INLINE void glm_euler_zyx(vec3 angles, mat4 dest);
|
|
||||||
CGLM_INLINE void glm_euler_zxy(vec3 angles, mat4 dest);
|
|
||||||
CGLM_INLINE void glm_euler_xzy(vec3 angles, mat4 dest);
|
|
||||||
CGLM_INLINE void glm_euler_yzx(vec3 angles, mat4 dest);
|
|
||||||
CGLM_INLINE void glm_euler_yxz(vec3 angles, mat4 dest);
|
|
||||||
CGLM_INLINE void glm_euler_by_order(vec3 angles,
|
|
||||||
glm_euler_seq ord,
|
|
||||||
mat4 dest);
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef cglm_euler_h
|
#ifndef cglm_euler_h
|
||||||
#define cglm_euler_h
|
#define cglm_euler_h
|
||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
#include "util.h"
|
||||||
|
|
||||||
|
/* ---------- Notice for Ken Shoemake's algorithm Implementation -------------*
|
||||||
|
| Ken Shoemake's algorithm impl. is taken from this repo by permission: |
|
||||||
|
| https://github.com/erich666/GraphicsGems/blob/master/gemsiv/euler_angle |
|
||||||
|
| |
|
||||||
|
| cglm doesn't claim the ownership of GraphicsGems source codes |
|
||||||
|
| and the algorithm itself. But cglm may change variable names or some piece |
|
||||||
|
| of codes in order to apply optimizations or to make it usable in cglm. |
|
||||||
|
| |
|
||||||
|
| Related issue: https://github.com/recp/cglm/issues/30 |
|
||||||
|
| |
|
||||||
|
* -------------------------- GraphicsGems EULA ----------------------------- *
|
||||||
|
| Related EULA for GraphicsGems can be found at below, plus in CREDITS: |
|
||||||
|
| http://www.realtimerendering.com/resources/GraphicsGems/ |
|
||||||
|
| |
|
||||||
|
| EULA: The Graphics Gems code is copyright-protected. In other words, you |
|
||||||
|
| cannot claim the text of the code as your own and resell it. Using the |
|
||||||
|
| code is permitted in any program, product, or library, non-commercial or |
|
||||||
|
| commercial. Giving credit is not required, though is a nice gesture. |
|
||||||
|
| The code comes as-is, and if there are any flaws or problems with any Gems |
|
||||||
|
| code, nobody involved with Gems - authors, editors, publishers, or |
|
||||||
|
| webmasters - are to be held responsible. Basically, don't be a jerk, and |
|
||||||
|
| remember that anything free comes with no guarantee. |
|
||||||
|
* -------------------------------- END --------------------------------------*/
|
||||||
|
|
||||||
|
/* Order type constants, constructors, extractors
|
||||||
|
* There are 24 possible conventions, designated by:
|
||||||
|
* o EulAxI = axis used initially
|
||||||
|
* o EulPar = parity of axis permutation
|
||||||
|
* o EulRep = repetition of initial axis as last
|
||||||
|
* o EulFrm = frame from which axes are taken
|
||||||
|
* Axes I,J,K will be a permutation of X,Y,Z.
|
||||||
|
* Axis H will be either I or K, depending on EulRep.
|
||||||
|
* Frame S takes axes from initial static frame.
|
||||||
|
* If ord = (AxI=X, Par=Even, Rep=No, Frm=S), then
|
||||||
|
* {a,b,c,ord} means Rz(c)Ry(b)Rx(a), where Rz(c)v
|
||||||
|
* rotates v around Z by c radians.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define EulRep(ord) (((unsigned)(ord)>>1)&1)
|
||||||
|
#define EulFrm(ord) ((unsigned)(ord)&1)
|
||||||
|
#define EulPar(ord) (((unsigned)(ord)>>2)&1)
|
||||||
|
|
||||||
|
/*! this code is merely a quick (and legal!) way to set arrays,
|
||||||
|
EulSafe being 0,1,2,0 */
|
||||||
|
#define EulSafe "\000\001\002\000"
|
||||||
|
#define EulNext "\001\002\000\001"
|
||||||
|
#define EulAxI(ord) ((int)(EulSafe[(((unsigned)(ord)>>3)&3)]))
|
||||||
|
#define EulAxJ(ord) ((int)(EulNext[EulAxI(ord)+(EulPar(ord)==EulParOdd)]))
|
||||||
|
#define EulAxK(ord) ((int)(EulNext[EulAxI(ord)+(EulPar(ord)!=EulParOdd)]))
|
||||||
|
#define EulAxH(ord) ((EulRep(ord)==EulRepNo)?EulAxK(ord):EulAxI(ord))
|
||||||
|
|
||||||
|
/*! EulGetOrd unpacks all useful information about order simultaneously. */
|
||||||
|
#define EulGetOrd(ord,i,j,k,h,n,s,f) \
|
||||||
|
{unsigned o=(unsigned)ord;f=o&1;o>>=1;s=o&1;o>>=1;\
|
||||||
|
n=o&1;o>>=1;i=EulSafe[o&3];j=EulNext[i+n];k=EulNext[i+1-n];h=s?k:i;}
|
||||||
|
|
||||||
|
typedef enum glm_eul_order {
|
||||||
|
/*! Static axes */
|
||||||
|
GLM_EUL_XYZs = 0,
|
||||||
|
GLM_EUL_XYXs = 2,
|
||||||
|
GLM_EUL_XZYs = 4,
|
||||||
|
GLM_EUL_XZXs = 6,
|
||||||
|
GLM_EUL_YZXs = 8,
|
||||||
|
GLM_EUL_YZYs = 10,
|
||||||
|
GLM_EUL_YXZs = 12,
|
||||||
|
GLM_EUL_YXYs = 14,
|
||||||
|
GLM_EUL_ZXYs = 16,
|
||||||
|
GLM_EUL_ZXZs = 18,
|
||||||
|
GLM_EUL_ZYXs = 20,
|
||||||
|
GLM_EUL_ZYZs = 22,
|
||||||
|
|
||||||
|
/*! Rotating axes */
|
||||||
|
GLM_EUL_ZYXr = 1,
|
||||||
|
GLM_EUL_XYXr = 3,
|
||||||
|
GLM_EUL_YZXr = 5,
|
||||||
|
GLM_EUL_XZXr = 7,
|
||||||
|
GLM_EUL_XZYr = 9,
|
||||||
|
GLM_EUL_YZYr = 11,
|
||||||
|
GLM_EUL_ZXYr = 13,
|
||||||
|
GLM_EUL_YXYr = 15,
|
||||||
|
GLM_EUL_YXZr = 17,
|
||||||
|
GLM_EUL_ZXZr = 19,
|
||||||
|
GLM_EUL_XYZr = 21,
|
||||||
|
GLM_EUL_ZYZr = 23
|
||||||
|
} glm_eul_order;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief build matrix from euler angles
|
||||||
|
*
|
||||||
|
* @param[in] ea [Xangle, Yangle, Zangle]
|
||||||
|
* @param[out] dest rotation matrix
|
||||||
|
*/
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_eul_mat4(vec3 ea, glm_eul_order order, mat4 dest) {
|
||||||
|
float ti, tj, th, ci, cj, ch, si, sj, sh, cc, cs, sc, ss;
|
||||||
|
int i, j, k, h, parOdd, repYes, frmR;
|
||||||
|
|
||||||
|
EulGetOrd(order, i, j, k, h, parOdd, repYes, frmR);
|
||||||
|
|
||||||
|
if (frmR == 1)
|
||||||
|
glm_swapf(&ea[0], &ea[2]);
|
||||||
|
|
||||||
|
if (parOdd == 1)
|
||||||
|
glm_vec3_negate(ea);
|
||||||
|
|
||||||
|
ti = ea[0]; tj = ea[1]; th = ea[2];
|
||||||
|
|
||||||
|
ci = cosf(ti); cj = cosf(tj);
|
||||||
|
ch = cosf(th); si = sinf(ti);
|
||||||
|
sj = sinf(tj); sh = sinf(th);
|
||||||
|
|
||||||
|
cc = ci * ch; cs = ci * sh;
|
||||||
|
sc = si * ch; ss = si * sh;
|
||||||
|
|
||||||
|
if (repYes == 1) {
|
||||||
|
dest[i][i] = cj;
|
||||||
|
dest[i][j] = sj * si;
|
||||||
|
dest[i][k] = sj * ci;
|
||||||
|
dest[j][i] = sj * sh;
|
||||||
|
dest[j][j] = -cj * ss + cc;
|
||||||
|
dest[j][k] = -cj * cs - sc;
|
||||||
|
dest[k][i] = -sj * ch;
|
||||||
|
dest[k][j] = cj * sc + cs;
|
||||||
|
dest[k][k] = cj * cc - ss;
|
||||||
|
} else {
|
||||||
|
dest[i][i] = cj * ch;
|
||||||
|
dest[i][j] = sj * sc - cs;
|
||||||
|
dest[i][k] = sj * cc + ss;
|
||||||
|
dest[j][i] = cj * sh;
|
||||||
|
dest[j][j] = sj * ss + cc;
|
||||||
|
dest[j][k] = sj * cs - sc;
|
||||||
|
dest[k][i] = -sj;
|
||||||
|
dest[k][j] = cj * si;
|
||||||
|
dest[k][k] = cj * ci;
|
||||||
|
}
|
||||||
|
|
||||||
|
dest[3][0] = 0.f;
|
||||||
|
dest[3][1] = 0.f;
|
||||||
|
dest[3][2] = 0.f;
|
||||||
|
dest[0][3] = 0.f;
|
||||||
|
dest[1][3] = 0.f;
|
||||||
|
dest[2][3] = 0.f;
|
||||||
|
dest[3][3] = 1.f;
|
||||||
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* if you have axis order like vec3 orderVec = [0, 1, 2] or [0, 2, 1]...
|
* if you have axis order like vec3 orderVec = [0, 1, 2] or [0, 2, 1]...
|
||||||
@@ -55,6 +191,8 @@ 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,130 +15,69 @@
|
|||||||
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) {
|
||||||
char buff[16];
|
int i;
|
||||||
int i, j, cw[4], cwi;
|
int j;
|
||||||
|
|
||||||
#define m 4
|
#define m 4
|
||||||
#define n 4
|
#define n 4
|
||||||
|
|
||||||
fprintf(ostream, "Matrix (float%dx%d): " CGLM_PRINT_COLOR "\n" , m, n);
|
fprintf(ostream, "Matrix (float%dx%d):\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++) {
|
||||||
if (matrix[i][j] < CGLM_PRINT_MAX_TO_SHORT)
|
fprintf(ostream, "%0.4f", matrix[j][i]);;
|
||||||
cwi = sprintf(buff, "% .*f", CGLM_PRINT_PRECISION, matrix[i][j]);
|
|
||||||
else
|
if (j != n - 1)
|
||||||
cwi = sprintf(buff, "% g", matrix[i][j]);
|
fprintf(ostream, "\t");
|
||||||
cw[i] = GLM_MAX(cw[i], cwi);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fprintf(ostream, "|\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < m; i++) {
|
fprintf(ostream, "\n");
|
||||||
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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat3_print(mat3 matrix,
|
glm_mat3_print(mat3 matrix,
|
||||||
FILE * __restrict ostream) {
|
FILE * __restrict ostream) {
|
||||||
char buff[16];
|
int i;
|
||||||
int i, j, cw[4], cwi;
|
int j;
|
||||||
|
|
||||||
#define m 3
|
#define m 3
|
||||||
#define n 3
|
#define n 3
|
||||||
|
|
||||||
fprintf(ostream, "Matrix (float%dx%d): " CGLM_PRINT_COLOR "\n", m, n);
|
fprintf(ostream, "Matrix (float%dx%d):\n", m, n);
|
||||||
|
|
||||||
cw[0] = cw[1] = cw[2] = 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++) {
|
||||||
if (matrix[i][j] < CGLM_PRINT_MAX_TO_SHORT)
|
fprintf(ostream, "%0.4f", matrix[j][i]);;
|
||||||
cwi = sprintf(buff, "% .*f", CGLM_PRINT_PRECISION, matrix[i][j]);
|
|
||||||
else
|
if (j != n - 1)
|
||||||
cwi = sprintf(buff, "% g", matrix[i][j]);
|
fprintf(ostream, "\t");
|
||||||
cw[i] = GLM_MAX(cw[i], cwi);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fprintf(ostream, "|\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < m; i++) {
|
fprintf(ostream, "\n");
|
||||||
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
|
||||||
@@ -148,39 +87,27 @@ CGLM_INLINE
|
|||||||
void
|
void
|
||||||
glm_mat2_print(mat2 matrix,
|
glm_mat2_print(mat2 matrix,
|
||||||
FILE * __restrict ostream) {
|
FILE * __restrict ostream) {
|
||||||
char buff[16];
|
int i;
|
||||||
int i, j, cw[4], cwi;
|
int j;
|
||||||
|
|
||||||
#define m 2
|
#define m 2
|
||||||
#define n 2
|
#define n 2
|
||||||
|
|
||||||
fprintf(ostream, "Matrix (float%dx%d): " CGLM_PRINT_COLOR "\n", m, n);
|
fprintf(ostream, "Matrix (float%dx%d):\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++) {
|
||||||
if (matrix[i][j] < CGLM_PRINT_MAX_TO_SHORT)
|
fprintf(ostream, "%0.4f", matrix[j][i]);;
|
||||||
cwi = sprintf(buff, "% .*f", CGLM_PRINT_PRECISION, matrix[i][j]);
|
|
||||||
else
|
if (j != n - 1)
|
||||||
cwi = sprintf(buff, "% g", matrix[i][j]);
|
fprintf(ostream, "\t");
|
||||||
cw[i] = GLM_MAX(cw[i], cwi);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fprintf(ostream, "|\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < m; i++) {
|
fprintf(ostream, "\n");
|
||||||
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
|
||||||
@@ -194,16 +121,16 @@ glm_vec4_print(vec4 vec,
|
|||||||
|
|
||||||
#define m 4
|
#define m 4
|
||||||
|
|
||||||
fprintf(ostream, "Vector (float%d): " CGLM_PRINT_COLOR "\n (", m);
|
fprintf(ostream, "Vector (float%d):\n\t|", m);
|
||||||
|
|
||||||
for (i = 0; i < m; i++) {
|
for (i = 0; i < m; i++) {
|
||||||
if (vec[i] < CGLM_PRINT_MAX_TO_SHORT)
|
fprintf(ostream, "%0.4f", vec[i]);
|
||||||
fprintf(ostream, " % .*f", CGLM_PRINT_PRECISION, vec[i]);
|
|
||||||
else
|
if (i != m - 1)
|
||||||
fprintf(ostream, " % g", vec[i]);
|
fprintf(ostream, "\t");
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(ostream, " )" CGLM_PRINT_COLOR_RESET "\n\n");
|
fprintf(ostream, "|\n\n");
|
||||||
|
|
||||||
#undef m
|
#undef m
|
||||||
}
|
}
|
||||||
@@ -216,16 +143,16 @@ glm_vec3_print(vec3 vec,
|
|||||||
|
|
||||||
#define m 3
|
#define m 3
|
||||||
|
|
||||||
fprintf(ostream, "Vector (float%d): " CGLM_PRINT_COLOR "\n (", m);
|
fprintf(ostream, "Vector (float%d):\n\t|", m);
|
||||||
|
|
||||||
for (i = 0; i < m; i++) {
|
for (i = 0; i < m; i++) {
|
||||||
if (vec[i] < CGLM_PRINT_MAX_TO_SHORT)
|
fprintf(ostream, "%0.4f", vec[i]);
|
||||||
fprintf(ostream, " % .*f", CGLM_PRINT_PRECISION, vec[i]);
|
|
||||||
else
|
if (i != m - 1)
|
||||||
fprintf(ostream, " % g", vec[i]);
|
fprintf(ostream, "\t");
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(ostream, " )" CGLM_PRINT_COLOR_RESET "\n\n");
|
fprintf(ostream, "|\n\n");
|
||||||
|
|
||||||
#undef m
|
#undef m
|
||||||
}
|
}
|
||||||
@@ -238,12 +165,16 @@ glm_ivec3_print(ivec3 vec,
|
|||||||
|
|
||||||
#define m 3
|
#define m 3
|
||||||
|
|
||||||
fprintf(ostream, "Vector (int%d): " CGLM_PRINT_COLOR "\n (", m);
|
fprintf(ostream, "Vector (int%d):\n\t|", m);
|
||||||
|
|
||||||
for (i = 0; i < m; i++)
|
for (i = 0; i < m; i++) {
|
||||||
fprintf(ostream, " % d", vec[i]);
|
fprintf(ostream, "%d", vec[i]);
|
||||||
|
|
||||||
fprintf(ostream, " )" CGLM_PRINT_COLOR_RESET "\n\n");
|
if (i != m - 1)
|
||||||
|
fprintf(ostream, "\t");
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(ostream, "|\n\n");
|
||||||
|
|
||||||
#undef m
|
#undef m
|
||||||
}
|
}
|
||||||
@@ -256,16 +187,16 @@ glm_vec2_print(vec2 vec,
|
|||||||
|
|
||||||
#define m 2
|
#define m 2
|
||||||
|
|
||||||
fprintf(ostream, "Vector (float%d): " CGLM_PRINT_COLOR "\n (", m);
|
fprintf(ostream, "Vector (float%d):\n\t|", m);
|
||||||
|
|
||||||
for (i = 0; i < m; i++) {
|
for (i = 0; i < m; i++) {
|
||||||
if (vec[i] < CGLM_PRINT_MAX_TO_SHORT)
|
fprintf(ostream, "%0.4f", vec[i]);
|
||||||
fprintf(ostream, " % .*f", CGLM_PRINT_PRECISION, vec[i]);
|
|
||||||
else
|
if (i != m - 1)
|
||||||
fprintf(ostream, " % g", vec[i]);
|
fprintf(ostream, "\t");
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(ostream, " )" CGLM_PRINT_COLOR_RESET "\n\n");
|
fprintf(ostream, "|\n\n");
|
||||||
|
|
||||||
#undef m
|
#undef m
|
||||||
}
|
}
|
||||||
@@ -278,17 +209,16 @@ glm_versor_print(versor vec,
|
|||||||
|
|
||||||
#define m 4
|
#define m 4
|
||||||
|
|
||||||
fprintf(ostream, "Quaternion (float%d): " CGLM_PRINT_COLOR "\n (", m);
|
fprintf(ostream, "Versor (float%d):\n\t|", m);
|
||||||
|
|
||||||
for (i = 0; i < m; i++) {
|
for (i = 0; i < m; i++) {
|
||||||
if (vec[i] < CGLM_PRINT_MAX_TO_SHORT)
|
fprintf(ostream, "%0.4f", vec[i]);
|
||||||
fprintf(ostream, " % .*f", CGLM_PRINT_PRECISION, vec[i]);
|
|
||||||
else
|
if (i != m - 1)
|
||||||
fprintf(ostream, " % g", vec[i]);
|
fprintf(ostream, "\t");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fprintf(ostream, "|\n\n");
|
||||||
fprintf(ostream, " )" CGLM_PRINT_COLOR_RESET "\n\n");
|
|
||||||
|
|
||||||
#undef m
|
#undef m
|
||||||
}
|
}
|
||||||
@@ -302,43 +232,24 @@ glm_aabb_print(vec3 bbox[2],
|
|||||||
|
|
||||||
#define m 3
|
#define m 3
|
||||||
|
|
||||||
fprintf(ostream, "AABB (%s): " CGLM_PRINT_COLOR "\n", tag ? tag: "float");
|
fprintf(ostream, "AABB (%s):\n", tag ? tag: "float");
|
||||||
|
|
||||||
for (i = 0; i < 2; i++) {
|
for (i = 0; i < 2; i++) {
|
||||||
fprintf(ostream, " (");
|
fprintf(ostream, "\t|");
|
||||||
|
|
||||||
for (j = 0; j < m; j++) {
|
for (j = 0; j < m; j++) {
|
||||||
if (bbox[i][j] < CGLM_PRINT_MAX_TO_SHORT)
|
fprintf(ostream, "%0.4f", bbox[i][j]);
|
||||||
fprintf(ostream, " % .*f", CGLM_PRINT_PRECISION, bbox[i][j]);
|
|
||||||
else
|
if (j != m - 1)
|
||||||
fprintf(ostream, " % g", bbox[i][j]);
|
fprintf(ostream, "\t");
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(ostream, " )\n");
|
fprintf(ostream, "|\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(ostream, CGLM_PRINT_COLOR_RESET "\n");
|
fprintf(ostream, "\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 */
|
||||||
|
|||||||
@@ -40,10 +40,6 @@
|
|||||||
# include "simd/sse2/mat2.h"
|
# include "simd/sse2/mat2.h"
|
||||||
#endif
|
#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_IDENTITY_INIT {{1.0f, 0.0f}, {0.0f, 1.0f}}
|
||||||
#define GLM_MAT2_ZERO_INIT {{0.0f, 0.0f}, {0.0f, 0.0f}}
|
#define GLM_MAT2_ZERO_INIT {{0.0f, 0.0f}, {0.0f, 0.0f}}
|
||||||
|
|
||||||
@@ -60,7 +56,7 @@
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat2_copy(mat2 mat, mat2 dest) {
|
glm_mat2_copy(mat2 mat, mat2 dest) {
|
||||||
glm_vec4_ucopy(mat[0], dest[0]);
|
glm_vec4_copy(mat[0], dest[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -134,8 +130,6 @@ void
|
|||||||
glm_mat2_mul(mat2 m1, mat2 m2, mat2 dest) {
|
glm_mat2_mul(mat2 m1, mat2 m2, mat2 dest) {
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
glm_mat2_mul_sse2(m1, m2, dest);
|
glm_mat2_mul_sse2(m1, m2, dest);
|
||||||
#elif defined(CGLM_NEON_FP)
|
|
||||||
glm_mat2_mul_neon(m1, m2, dest);
|
|
||||||
#else
|
#else
|
||||||
float a00 = m1[0][0], a01 = m1[0][1],
|
float a00 = m1[0][0], a01 = m1[0][1],
|
||||||
a10 = m1[1][0], a11 = m1[1][1],
|
a10 = m1[1][0], a11 = m1[1][1],
|
||||||
@@ -222,16 +216,7 @@ glm_mat2_trace(mat2 m) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat2_scale(mat2 m, float s) {
|
glm_mat2_scale(mat2 m, float s) {
|
||||||
#if defined( __SSE__ ) || defined( __SSE2__ )
|
glm_vec4_scale(m[0], s, m[0]);
|
||||||
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
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
|||||||
@@ -228,11 +228,9 @@ 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) {
|
||||||
vec3 res;
|
dest[0] = m[0][0] * v[0] + m[1][0] * v[1] + m[2][0] * v[2];
|
||||||
res[0] = m[0][0] * v[0] + m[1][0] * v[1] + m[2][0] * v[2];
|
dest[1] = m[0][1] * v[0] + m[1][1] * v[1] + m[2][1] * v[2];
|
||||||
res[1] = m[0][1] * v[0] + m[1][1] * v[1] + m[2][1] * v[2];
|
dest[2] = m[0][2] * v[0] + m[1][2] * v[1] + m[2][2] * v[2];
|
||||||
res[2] = m[0][2] * v[0] + m[1][2] * v[1] + m[2][2] * v[2];
|
|
||||||
glm_vec3_copy(res, dest);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
|||||||
@@ -187,29 +187,8 @@ 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
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -379,8 +358,6 @@ 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];
|
||||||
@@ -499,8 +476,6 @@ 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];
|
||||||
@@ -523,8 +498,6 @@ 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);
|
||||||
@@ -560,12 +533,15 @@ 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) {
|
||||||
#ifdef __AVX__
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
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)
|
||||||
glm_mat4_scale_neon(m, 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));
|
||||||
#else
|
#else
|
||||||
glm_mat4_scale_p(m, s);
|
glm_mat4_scale_p(m, s);
|
||||||
#endif
|
#endif
|
||||||
@@ -583,8 +559,6 @@ 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];
|
||||||
@@ -618,8 +592,6 @@ 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,7 +9,6 @@
|
|||||||
#define cglm_plane_h
|
#define cglm_plane_h
|
||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "vec3.h"
|
|
||||||
#include "vec4.h"
|
#include "vec4.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -38,7 +38,6 @@
|
|||||||
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,
|
||||||
@@ -64,9 +63,9 @@
|
|||||||
# include "simd/sse2/quat.h"
|
# include "simd/sse2/quat.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CGLM_NEON_FP
|
CGLM_INLINE
|
||||||
# include "simd/neon/quat.h"
|
void
|
||||||
#endif
|
glm_mat4_identity(mat4 mat);
|
||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
@@ -417,8 +416,6 @@ 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];
|
||||||
@@ -629,29 +626,6 @@ 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)
|
||||||
|
|||||||
@@ -1,77 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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,56 +10,19 @@
|
|||||||
#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 CGLM_ARM64
|
#if defined(__aarch64__)
|
||||||
return vaddvq_f32(v);
|
return vaddvq_f32(v);
|
||||||
#else
|
#else
|
||||||
v = vaddq_f32(v, vrev64q_f32(v));
|
v = vaddq_f32(v, vrev64q_f32(v));
|
||||||
@@ -116,58 +79,5 @@ 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,16 +14,6 @@
|
|||||||
|
|
||||||
#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) {
|
||||||
|
|||||||
@@ -1,122 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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 */
|
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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,305 +12,45 @@
|
|||||||
#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;
|
||||||
|
|
||||||
glmm_128 l, r0, r1, r2, r3, v0, v1, v2, v3;
|
l0 = vld1q_f32(m2[0]);
|
||||||
|
l1 = vld1q_f32(m2[1]);
|
||||||
|
l2 = vld1q_f32(m2[2]);
|
||||||
|
l3 = vld1q_f32(m2[3]);
|
||||||
|
|
||||||
l = glmm_load(m1[0]);
|
r = vld1q_f32(m1[0]);
|
||||||
r0 = glmm_load(m2[0]);
|
d0 = vmulq_lane_f32(r, vget_low_f32(l0), 0);
|
||||||
r1 = glmm_load(m2[1]);
|
d1 = vmulq_lane_f32(r, vget_low_f32(l1), 0);
|
||||||
r2 = glmm_load(m2[2]);
|
d2 = vmulq_lane_f32(r, vget_low_f32(l2), 0);
|
||||||
r3 = glmm_load(m2[3]);
|
d3 = vmulq_lane_f32(r, vget_low_f32(l3), 0);
|
||||||
|
|
||||||
v0 = vmulq_f32(glmm_splat_x(r0), l);
|
r = vld1q_f32(m1[1]);
|
||||||
v1 = vmulq_f32(glmm_splat_x(r1), l);
|
d0 = vmlaq_lane_f32(d0, r, vget_low_f32(l0), 1);
|
||||||
v2 = vmulq_f32(glmm_splat_x(r2), l);
|
d1 = vmlaq_lane_f32(d1, r, vget_low_f32(l1), 1);
|
||||||
v3 = vmulq_f32(glmm_splat_x(r3), l);
|
d2 = vmlaq_lane_f32(d2, r, vget_low_f32(l2), 1);
|
||||||
|
d3 = vmlaq_lane_f32(d3, r, vget_low_f32(l3), 1);
|
||||||
|
|
||||||
l = glmm_load(m1[1]);
|
r = vld1q_f32(m1[2]);
|
||||||
v0 = glmm_fmadd(glmm_splat_y(r0), l, v0);
|
d0 = vmlaq_lane_f32(d0, r, vget_high_f32(l0), 0);
|
||||||
v1 = glmm_fmadd(glmm_splat_y(r1), l, v1);
|
d1 = vmlaq_lane_f32(d1, r, vget_high_f32(l1), 0);
|
||||||
v2 = glmm_fmadd(glmm_splat_y(r2), l, v2);
|
d2 = vmlaq_lane_f32(d2, r, vget_high_f32(l2), 0);
|
||||||
v3 = glmm_fmadd(glmm_splat_y(r3), l, v3);
|
d3 = vmlaq_lane_f32(d3, r, vget_high_f32(l3), 0);
|
||||||
|
|
||||||
l = glmm_load(m1[2]);
|
r = vld1q_f32(m1[3]);
|
||||||
v0 = glmm_fmadd(glmm_splat_z(r0), l, v0);
|
d0 = vmlaq_lane_f32(d0, r, vget_high_f32(l0), 1);
|
||||||
v1 = glmm_fmadd(glmm_splat_z(r1), l, v1);
|
d1 = vmlaq_lane_f32(d1, r, vget_high_f32(l1), 1);
|
||||||
v2 = glmm_fmadd(glmm_splat_z(r2), l, v2);
|
d2 = vmlaq_lane_f32(d2, r, vget_high_f32(l2), 1);
|
||||||
v3 = glmm_fmadd(glmm_splat_z(r3), l, v3);
|
d3 = vmlaq_lane_f32(d3, r, vget_high_f32(l3), 1);
|
||||||
|
|
||||||
l = glmm_load(m1[3]);
|
vst1q_f32(dest[0], d0);
|
||||||
v0 = glmm_fmadd(glmm_splat_w(r0), l, v0);
|
vst1q_f32(dest[1], d1);
|
||||||
v1 = glmm_fmadd(glmm_splat_w(r1), l, v1);
|
vst1q_f32(dest[2], d2);
|
||||||
v2 = glmm_fmadd(glmm_splat_w(r2), l, v2);
|
vst1q_f32(dest[3], d3);
|
||||||
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
|
||||||
|
|||||||
@@ -1,56 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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,76 +16,75 @@ 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) */
|
||||||
glmm_128 l, r0, r1, r2, r3, v0, v1, v2, v3;
|
__m128 l0, l1, l2, l3, r;
|
||||||
|
|
||||||
l = glmm_load(m1[0]);
|
l0 = glmm_load(m1[0]);
|
||||||
r0 = glmm_load(m2[0]);
|
l1 = glmm_load(m1[1]);
|
||||||
r1 = glmm_load(m2[1]);
|
l2 = glmm_load(m1[2]);
|
||||||
r2 = glmm_load(m2[2]);
|
l3 = glmm_load(m1[3]);
|
||||||
r3 = glmm_load(m2[3]);
|
|
||||||
|
|
||||||
v0 = _mm_mul_ps(glmm_splat_x(r0), l);
|
r = glmm_load(m2[0]);
|
||||||
v1 = _mm_mul_ps(glmm_splat_x(r1), l);
|
glmm_store(dest[0],
|
||||||
v2 = _mm_mul_ps(glmm_splat_x(r2), l);
|
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 0), l0),
|
||||||
v3 = _mm_mul_ps(glmm_splat_x(r3), l);
|
_mm_mul_ps(glmm_shuff1x(r, 1), l1)),
|
||||||
|
_mm_mul_ps(glmm_shuff1x(r, 2), l2)));
|
||||||
|
|
||||||
l = glmm_load(m1[1]);
|
r = glmm_load(m2[1]);
|
||||||
v0 = glmm_fmadd(glmm_splat_y(r0), l, v0);
|
glmm_store(dest[1],
|
||||||
v1 = glmm_fmadd(glmm_splat_y(r1), l, v1);
|
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 0), l0),
|
||||||
v2 = glmm_fmadd(glmm_splat_y(r2), l, v2);
|
_mm_mul_ps(glmm_shuff1x(r, 1), l1)),
|
||||||
v3 = glmm_fmadd(glmm_splat_y(r3), l, v3);
|
_mm_mul_ps(glmm_shuff1x(r, 2), l2)));
|
||||||
|
|
||||||
l = glmm_load(m1[2]);
|
r = glmm_load(m2[2]);
|
||||||
v0 = glmm_fmadd(glmm_splat_z(r0), l, v0);
|
glmm_store(dest[2],
|
||||||
v1 = glmm_fmadd(glmm_splat_z(r1), l, v1);
|
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 0), l0),
|
||||||
v2 = glmm_fmadd(glmm_splat_z(r2), l, v2);
|
_mm_mul_ps(glmm_shuff1x(r, 1), l1)),
|
||||||
v3 = glmm_fmadd(glmm_splat_z(r3), l, v3);
|
_mm_mul_ps(glmm_shuff1x(r, 2), l2)));
|
||||||
|
|
||||||
l = glmm_load(m1[3]);
|
r = glmm_load(m2[3]);
|
||||||
v3 = glmm_fmadd(glmm_splat_w(r3), l, v3);
|
glmm_store(dest[3],
|
||||||
|
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 0), l0),
|
||||||
glmm_store(dest[0], v0);
|
_mm_mul_ps(glmm_shuff1x(r, 1), l1)),
|
||||||
glmm_store(dest[1], v1);
|
_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 2), l2),
|
||||||
glmm_store(dest[2], v2);
|
_mm_mul_ps(glmm_shuff1x(r, 3), l3))));
|
||||||
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;
|
||||||
|
|
||||||
glmm_128 l, r0, r1, r2, v0, v1, v2;
|
l0 = glmm_load(m1[0]);
|
||||||
|
l1 = glmm_load(m1[1]);
|
||||||
|
l2 = glmm_load(m1[2]);
|
||||||
|
l3 = glmm_load(m1[3]);
|
||||||
|
|
||||||
l = glmm_load(m1[0]);
|
r = glmm_load(m2[0]);
|
||||||
r0 = glmm_load(m2[0]);
|
glmm_store(dest[0],
|
||||||
r1 = glmm_load(m2[1]);
|
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 0), l0),
|
||||||
r2 = glmm_load(m2[2]);
|
_mm_mul_ps(glmm_shuff1x(r, 1), l1)),
|
||||||
|
_mm_mul_ps(glmm_shuff1x(r, 2), l2)));
|
||||||
|
|
||||||
v0 = _mm_mul_ps(glmm_splat_x(r0), l);
|
r = glmm_load(m2[1]);
|
||||||
v1 = _mm_mul_ps(glmm_splat_x(r1), l);
|
glmm_store(dest[1],
|
||||||
v2 = _mm_mul_ps(glmm_splat_x(r2), l);
|
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 0), l0),
|
||||||
|
_mm_mul_ps(glmm_shuff1x(r, 1), l1)),
|
||||||
|
_mm_mul_ps(glmm_shuff1x(r, 2), l2)));
|
||||||
|
|
||||||
l = glmm_load(m1[1]);
|
r = glmm_load(m2[2]);
|
||||||
v0 = glmm_fmadd(glmm_splat_y(r0), l, v0);
|
glmm_store(dest[2],
|
||||||
v1 = glmm_fmadd(glmm_splat_y(r1), l, v1);
|
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 0), l0),
|
||||||
v2 = glmm_fmadd(glmm_splat_y(r2), l, v2);
|
_mm_mul_ps(glmm_shuff1x(r, 1), l1)),
|
||||||
|
_mm_mul_ps(glmm_shuff1x(r, 2), l2)));
|
||||||
|
|
||||||
l = glmm_load(m1[2]);
|
glmm_store(dest[3], l3);
|
||||||
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, x2, x3, x4, x5;
|
__m128 r0, r1, r2, r3, x0, x1;
|
||||||
|
|
||||||
r0 = glmm_load(mat[0]);
|
r0 = glmm_load(mat[0]);
|
||||||
r1 = glmm_load(mat[1]);
|
r1 = glmm_load(mat[1]);
|
||||||
@@ -95,13 +94,10 @@ glm_inv_tr_sse2(mat4 mat) {
|
|||||||
|
|
||||||
_MM_TRANSPOSE4_PS(r0, r1, r2, x1);
|
_MM_TRANSPOSE4_PS(r0, r1, r2, x1);
|
||||||
|
|
||||||
x2 = glmm_shuff1(r3, 0, 0, 0, 0);
|
x0 = _mm_add_ps(_mm_mul_ps(r0, glmm_shuff1(r3, 0, 0, 0, 0)),
|
||||||
x3 = glmm_shuff1(r3, 1, 1, 1, 1);
|
_mm_mul_ps(r1, glmm_shuff1(r3, 1, 1, 1, 1)));
|
||||||
x4 = glmm_shuff1(r3, 2, 2, 2, 2);
|
x0 = _mm_add_ps(x0, _mm_mul_ps(r2, glmm_shuff1(r3, 2, 2, 2, 2)));
|
||||||
x5 = _mm_set1_ps(-0.f);
|
x0 = _mm_xor_ps(x0, _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);
|
||||||
|
|
||||||
|
|||||||
@@ -15,25 +15,22 @@
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat2_mul_sse2(mat2 m1, mat2 m2, mat2 dest) {
|
glm_mat2_mul_sse2(mat2 m1, mat2 m2, mat2 dest) {
|
||||||
__m128 x0, x1, x2, x3, x4;
|
__m128 x0, x1, x2;
|
||||||
|
|
||||||
x1 = glmm_load(m1[0]); /* d c b a */
|
x1 = glmm_load(m1[0]); /* d c b a */
|
||||||
x2 = glmm_load(m2[0]); /* h g f e */
|
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][0] = a * e + c * f;
|
||||||
dest[0][1] = b * e + d * f;
|
dest[0][1] = b * e + d * f;
|
||||||
dest[1][0] = a * g + c * h;
|
dest[1][0] = a * g + c * h;
|
||||||
dest[1][1] = b * g + d * h;
|
dest[1][1] = b * g + d * h;
|
||||||
*/
|
*/
|
||||||
x0 = glmm_fmadd(x0, x3, _mm_mul_ps(x2, x4));
|
x0 = _mm_mul_ps(_mm_movelh_ps(x1, x1), glmm_shuff1(x2, 2, 2, 0, 0));
|
||||||
|
x1 = _mm_mul_ps(_mm_movehl_ps(x1, x1), glmm_shuff1(x2, 3, 3, 1, 1));
|
||||||
|
x1 = _mm_add_ps(x0, x1);
|
||||||
|
|
||||||
glmm_store(dest[0], x0);
|
glmm_store(dest[0], x1);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
|
|||||||
@@ -15,61 +15,44 @@
|
|||||||
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, r0, r1, r2, x0, x1, x2, x3, x4, x5, x6, x7, x8, x9;
|
__m128 l0, l1, l2;
|
||||||
|
__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]);
|
||||||
|
|
||||||
x8 = glmm_shuff1(l0, 0, 2, 1, 0); /* a00 a02 a01 a00 */
|
x1 = glmm_shuff2(l0, l1, 1, 0, 3, 3, 0, 3, 2, 0);
|
||||||
x1 = glmm_shuff1(r0, 3, 0, 0, 0); /* b10 b00 b00 b00 */
|
x2 = glmm_shuff2(l1, l2, 0, 0, 3, 2, 0, 2, 1, 0);
|
||||||
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);
|
|
||||||
|
|
||||||
x6 = glmm_shuff1(l0, 1, 0, 2, 1); /* a01 a00 a02 a01 */
|
x0 = _mm_add_ps(_mm_mul_ps(glmm_shuff1(l0, 0, 2, 1, 0),
|
||||||
x7 = glmm_shuff1(x3, 3, 3, 1, 1); /* b20 b20 b10 b10 */
|
glmm_shuff1(r0, 3, 0, 0, 0)),
|
||||||
l2 = _mm_load_ss(&m1[2][2]);
|
_mm_mul_ps(x1, glmm_shuff2(r0, r1, 0, 0, 1, 1, 2, 0, 0, 0)));
|
||||||
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 */
|
|
||||||
|
|
||||||
x4 = glmm_shuff1(x2, 0, 3, 2, 0); /* a10 a12 a11 a10 */
|
x0 = _mm_add_ps(x0,
|
||||||
x5 = glmm_shuff1(x2, 2, 0, 3, 2); /* a11 a10 a12 a11 */
|
_mm_mul_ps(x2, glmm_shuff2(r0, r1, 1, 1, 2, 2, 2, 0, 0, 0)));
|
||||||
x6 = glmm_shuff1(x3, 2, 0, 0, 0); /* b11 b01 b01 b01 */
|
|
||||||
x2 = glmm_shuff1(r1, 3, 3, 0, 0); /* b21 b21 b11 b11 */
|
|
||||||
|
|
||||||
x8 = _mm_unpackhi_ps(x8, x4); /* a10 a00 a12 a02 */
|
_mm_storeu_ps(dest[0], x0);
|
||||||
x9 = _mm_unpackhi_ps(x7, x2); /* b21 b20 b21 b20 */
|
|
||||||
|
|
||||||
x0 = glmm_fmadd(x4, x6, x0);
|
x0 = _mm_add_ps(_mm_mul_ps(glmm_shuff1(l0, 1, 0, 2, 1),
|
||||||
x1 = glmm_fmadd(x5, x2, x1);
|
_mm_shuffle_ps(r0, r1, _MM_SHUFFLE(2, 2, 3, 3))),
|
||||||
|
_mm_mul_ps(glmm_shuff1(x1, 1, 0, 2, 1),
|
||||||
|
glmm_shuff1(r1, 3, 3, 0, 0)));
|
||||||
|
|
||||||
x2 = _mm_movehl_ps(l2, l1); /* a22 a22 a21 a20 */
|
x0 = _mm_add_ps(x0,
|
||||||
x3 = glmm_shuff1(x2, 0, 2, 1, 0); /* a20 a22 a21 a20 */
|
_mm_mul_ps(glmm_shuff1(x2, 1, 0, 2, 1),
|
||||||
x2 = glmm_shuff1(x2, 1, 0, 2, 1); /* a21 a20 a22 a21 */
|
_mm_shuffle_ps(r1, r2, _MM_SHUFFLE(0, 0, 1, 1))));
|
||||||
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);
|
|
||||||
|
|
||||||
_mm_storeu_ps(&dest[0][0], x0);
|
dest[2][2] = m1[0][2] * m2[2][0]
|
||||||
_mm_storeu_ps(&dest[1][1], x1);
|
+ m1[1][2] * m2[2][1]
|
||||||
_mm_store_ss (&dest[2][2], x2);
|
+ m1[2][2] * m2[2][2];
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -49,65 +49,53 @@ void
|
|||||||
glm_mat4_mul_sse2(mat4 m1, mat4 m2, mat4 dest) {
|
glm_mat4_mul_sse2(mat4 m1, mat4 m2, mat4 dest) {
|
||||||
/* D = R * L (Column-Major) */
|
/* D = R * L (Column-Major) */
|
||||||
|
|
||||||
glmm_128 l, r0, r1, r2, r3, v0, v1, v2, v3;
|
__m128 l0, l1, l2, l3, r;
|
||||||
|
|
||||||
l = glmm_load(m1[0]);
|
l0 = glmm_load(m1[0]);
|
||||||
r0 = glmm_load(m2[0]);
|
l1 = glmm_load(m1[1]);
|
||||||
r1 = glmm_load(m2[1]);
|
l2 = glmm_load(m1[2]);
|
||||||
r2 = glmm_load(m2[2]);
|
l3 = glmm_load(m1[3]);
|
||||||
r3 = glmm_load(m2[3]);
|
|
||||||
|
|
||||||
v0 = _mm_mul_ps(glmm_splat_x(r0), l);
|
r = glmm_load(m2[0]);
|
||||||
v1 = _mm_mul_ps(glmm_splat_x(r1), l);
|
glmm_store(dest[0],
|
||||||
v2 = _mm_mul_ps(glmm_splat_x(r2), l);
|
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 0), l0),
|
||||||
v3 = _mm_mul_ps(glmm_splat_x(r3), l);
|
_mm_mul_ps(glmm_shuff1x(r, 1), l1)),
|
||||||
|
_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 2), l2),
|
||||||
|
_mm_mul_ps(glmm_shuff1x(r, 3), l3))));
|
||||||
|
r = glmm_load(m2[1]);
|
||||||
|
glmm_store(dest[1],
|
||||||
|
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 0), l0),
|
||||||
|
_mm_mul_ps(glmm_shuff1x(r, 1), l1)),
|
||||||
|
_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 2), l2),
|
||||||
|
_mm_mul_ps(glmm_shuff1x(r, 3), l3))));
|
||||||
|
r = glmm_load(m2[2]);
|
||||||
|
glmm_store(dest[2],
|
||||||
|
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 0), l0),
|
||||||
|
_mm_mul_ps(glmm_shuff1x(r, 1), l1)),
|
||||||
|
_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 2), l2),
|
||||||
|
_mm_mul_ps(glmm_shuff1x(r, 3), l3))));
|
||||||
|
|
||||||
l = glmm_load(m1[1]);
|
r = glmm_load(m2[3]);
|
||||||
v0 = glmm_fmadd(glmm_splat_y(r0), l, v0);
|
glmm_store(dest[3],
|
||||||
v1 = glmm_fmadd(glmm_splat_y(r1), l, v1);
|
_mm_add_ps(_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 0), l0),
|
||||||
v2 = glmm_fmadd(glmm_splat_y(r2), l, v2);
|
_mm_mul_ps(glmm_shuff1x(r, 1), l1)),
|
||||||
v3 = glmm_fmadd(glmm_splat_y(r3), l, v3);
|
_mm_add_ps(_mm_mul_ps(glmm_shuff1x(r, 2), l2),
|
||||||
|
_mm_mul_ps(glmm_shuff1x(r, 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);
|
|
||||||
v3 = glmm_fmadd(glmm_splat_z(r3), l, v3);
|
|
||||||
|
|
||||||
l = glmm_load(m1[3]);
|
|
||||||
v0 = glmm_fmadd(glmm_splat_w(r0), l, v0);
|
|
||||||
v1 = glmm_fmadd(glmm_splat_w(r1), l, v1);
|
|
||||||
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
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_mat4_mulv_sse2(mat4 m, vec4 v, vec4 dest) {
|
glm_mat4_mulv_sse2(mat4 m, vec4 v, vec4 dest) {
|
||||||
__m128 x0, x1, m0, m1, m2, m3, v0, v1, v2, v3;
|
__m128 x0, x1, x2;
|
||||||
|
|
||||||
m0 = glmm_load(m[0]);
|
|
||||||
m1 = glmm_load(m[1]);
|
|
||||||
m2 = glmm_load(m[2]);
|
|
||||||
m3 = glmm_load(m[3]);
|
|
||||||
|
|
||||||
x0 = glmm_load(v);
|
x0 = glmm_load(v);
|
||||||
v0 = glmm_splat_x(x0);
|
x1 = _mm_add_ps(_mm_mul_ps(glmm_load(m[0]), glmm_shuff1x(x0, 0)),
|
||||||
v1 = glmm_splat_y(x0);
|
_mm_mul_ps(glmm_load(m[1]), glmm_shuff1x(x0, 1)));
|
||||||
v2 = glmm_splat_z(x0);
|
|
||||||
v3 = glmm_splat_w(x0);
|
|
||||||
|
|
||||||
x1 = _mm_mul_ps(m3, v3);
|
x2 = _mm_add_ps(_mm_mul_ps(glmm_load(m[2]), glmm_shuff1x(x0, 2)),
|
||||||
x1 = glmm_fmadd(m2, v2, x1);
|
_mm_mul_ps(glmm_load(m[3]), glmm_shuff1x(x0, 3)));
|
||||||
x1 = glmm_fmadd(m1, v1, x1);
|
|
||||||
x1 = glmm_fmadd(m0, v0, x1);
|
|
||||||
|
|
||||||
glmm_store(dest, x1);
|
glmm_store(dest, _mm_add_ps(x1, x2));
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
@@ -127,18 +115,20 @@ glm_mat4_det_sse2(mat4 mat) {
|
|||||||
t[3] = i * p - m * l;
|
t[3] = i * p - m * l;
|
||||||
t[4] = i * o - m * k;
|
t[4] = i * o - m * k;
|
||||||
*/
|
*/
|
||||||
x0 = glmm_fnmadd(glmm_shuff1(r3, 0, 0, 1, 1), glmm_shuff1(r2, 2, 3, 2, 3),
|
x0 = _mm_sub_ps(_mm_mul_ps(glmm_shuff1(r2, 0, 0, 1, 1),
|
||||||
_mm_mul_ps(glmm_shuff1(r2, 0, 0, 1, 1),
|
glmm_shuff1(r3, 2, 3, 2, 3)),
|
||||||
glmm_shuff1(r3, 2, 3, 2, 3)));
|
_mm_mul_ps(glmm_shuff1(r3, 0, 0, 1, 1),
|
||||||
|
glmm_shuff1(r2, 2, 3, 2, 3)));
|
||||||
/*
|
/*
|
||||||
t[0] = k * p - o * l;
|
t[0] = k * p - o * l;
|
||||||
t[0] = k * p - o * l;
|
t[0] = k * p - o * l;
|
||||||
t[5] = i * n - m * j;
|
t[5] = i * n - m * j;
|
||||||
t[5] = i * n - m * j;
|
t[5] = i * n - m * j;
|
||||||
*/
|
*/
|
||||||
x1 = glmm_fnmadd(glmm_shuff1(r3, 0, 0, 2, 2), glmm_shuff1(r2, 1, 1, 3, 3),
|
x1 = _mm_sub_ps(_mm_mul_ps(glmm_shuff1(r2, 0, 0, 2, 2),
|
||||||
_mm_mul_ps(glmm_shuff1(r2, 0, 0, 2, 2),
|
glmm_shuff1(r3, 1, 1, 3, 3)),
|
||||||
glmm_shuff1(r3, 1, 1, 3, 3)));
|
_mm_mul_ps(glmm_shuff1(r3, 0, 0, 2, 2),
|
||||||
|
glmm_shuff1(r2, 1, 1, 3, 3)));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
a * (f * t[0] - g * t[1] + h * t[2])
|
a * (f * t[0] - g * t[1] + h * t[2])
|
||||||
@@ -146,16 +136,21 @@ glm_mat4_det_sse2(mat4 mat) {
|
|||||||
+ c * (e * t[1] - f * t[3] + h * t[5])
|
+ c * (e * t[1] - f * t[3] + h * t[5])
|
||||||
- d * (e * t[2] - f * t[4] + g * t[5])
|
- d * (e * t[2] - f * t[4] + g * t[5])
|
||||||
*/
|
*/
|
||||||
x2 = glmm_fnmadd(glmm_shuff1(r1, 1, 1, 2, 2), glmm_shuff1(x0, 3, 2, 2, 0),
|
x2 = _mm_sub_ps(_mm_mul_ps(glmm_shuff1(r1, 0, 0, 0, 1),
|
||||||
_mm_mul_ps(glmm_shuff1(r1, 0, 0, 0, 1),
|
_mm_shuffle_ps(x1, x0, _MM_SHUFFLE(1, 0, 0, 0))),
|
||||||
_mm_shuffle_ps(x1, x0, _MM_SHUFFLE(1, 0, 0, 0))));
|
_mm_mul_ps(glmm_shuff1(r1, 1, 1, 2, 2),
|
||||||
x2 = glmm_fmadd(glmm_shuff1(r1, 2, 3, 3, 3),
|
glmm_shuff1(x0, 3, 2, 2, 0)));
|
||||||
_mm_shuffle_ps(x0, x1, _MM_SHUFFLE(2, 2, 3, 1)),
|
|
||||||
x2);
|
x2 = _mm_add_ps(x2,
|
||||||
|
_mm_mul_ps(glmm_shuff1(r1, 2, 3, 3, 3),
|
||||||
|
_mm_shuffle_ps(x0, x1, _MM_SHUFFLE(2, 2, 3, 1))));
|
||||||
x2 = _mm_xor_ps(x2, _mm_set_ps(-0.f, 0.f, -0.f, 0.f));
|
x2 = _mm_xor_ps(x2, _mm_set_ps(-0.f, 0.f, -0.f, 0.f));
|
||||||
|
|
||||||
return glmm_hadd(_mm_mul_ps(x2, r0));
|
x0 = _mm_mul_ps(r0, x2);
|
||||||
|
x0 = _mm_add_ps(x0, glmm_shuff1(x0, 0, 1, 2, 3));
|
||||||
|
x0 = _mm_add_ps(x0, glmm_shuff1(x0, 1, 3, 3, 1));
|
||||||
|
|
||||||
|
return _mm_cvtss_f32(x0);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
@@ -164,129 +159,117 @@ glm_mat4_inv_fast_sse2(mat4 mat, mat4 dest) {
|
|||||||
__m128 r0, r1, r2, r3,
|
__m128 r0, r1, r2, r3,
|
||||||
v0, v1, v2, v3,
|
v0, v1, v2, v3,
|
||||||
t0, t1, t2, t3, t4, t5,
|
t0, t1, t2, t3, t4, t5,
|
||||||
x0, x1, x2, x3, x4, x5, x6, x7, x8, x9;
|
x0, x1, x2, x3, x4, x5, x6, x7;
|
||||||
|
|
||||||
x8 = _mm_set_ps(-0.f, 0.f, -0.f, 0.f);
|
|
||||||
x9 = glmm_shuff1(x8, 2, 1, 2, 1);
|
|
||||||
|
|
||||||
/* 127 <- 0 */
|
/* 127 <- 0 */
|
||||||
r0 = glmm_load(mat[0]); /* d c b a */
|
r0 = glmm_load(mat[0]); /* d c b a */
|
||||||
r1 = glmm_load(mat[1]); /* h g f e */
|
r1 = glmm_load(mat[1]); /* h g f e */
|
||||||
r2 = glmm_load(mat[2]); /* l k j i */
|
r2 = glmm_load(mat[2]); /* l k j i */
|
||||||
r3 = glmm_load(mat[3]); /* p o n m */
|
r3 = glmm_load(mat[3]); /* p o n m */
|
||||||
|
|
||||||
x0 = _mm_movehl_ps(r3, r2); /* p o l k */
|
|
||||||
x3 = _mm_movelh_ps(r2, r3); /* n m j i */
|
|
||||||
x1 = glmm_shuff1(x0, 1, 3, 3 ,3); /* l p p p */
|
|
||||||
x2 = glmm_shuff1(x0, 0, 2, 2, 2); /* k o o o */
|
|
||||||
x4 = glmm_shuff1(x3, 1, 3, 3, 3); /* j n n n */
|
|
||||||
x7 = glmm_shuff1(x3, 0, 2, 2, 2); /* i m m m */
|
|
||||||
|
|
||||||
x6 = _mm_shuffle_ps(r2, r1, _MM_SHUFFLE(0, 0, 0, 0)); /* e e i i */
|
x0 = _mm_shuffle_ps(r2, r3, _MM_SHUFFLE(3, 2, 3, 2)); /* p o l k */
|
||||||
x5 = _mm_shuffle_ps(r2, r1, _MM_SHUFFLE(1, 1, 1, 1)); /* f f j j */
|
x1 = glmm_shuff1(x0, 1, 3, 3, 3); /* l p p p */
|
||||||
x3 = _mm_shuffle_ps(r2, r1, _MM_SHUFFLE(2, 2, 2, 2)); /* g g k k */
|
x2 = glmm_shuff1(x0, 0, 2, 2, 2); /* k o o o */
|
||||||
x0 = _mm_shuffle_ps(r2, r1, _MM_SHUFFLE(3, 3, 3, 3)); /* h h l l */
|
x0 = _mm_shuffle_ps(r2, r1, _MM_SHUFFLE(3, 3, 3, 3)); /* h h l l */
|
||||||
|
x3 = _mm_shuffle_ps(r2, r1, _MM_SHUFFLE(2, 2, 2, 2)); /* g g k k */
|
||||||
t0 = _mm_mul_ps(x3, x1);
|
|
||||||
t1 = _mm_mul_ps(x5, x1);
|
|
||||||
t2 = _mm_mul_ps(x5, x2);
|
|
||||||
t3 = _mm_mul_ps(x6, x1);
|
|
||||||
t4 = _mm_mul_ps(x6, x2);
|
|
||||||
t5 = _mm_mul_ps(x6, x4);
|
|
||||||
|
|
||||||
/* t1[0] = k * p - o * l;
|
/* t1[0] = k * p - o * l;
|
||||||
t1[0] = k * p - o * l;
|
t1[0] = k * p - o * l;
|
||||||
t2[0] = g * p - o * h;
|
t2[0] = g * p - o * h;
|
||||||
t3[0] = g * l - k * h; */
|
t3[0] = g * l - k * h; */
|
||||||
t0 = glmm_fnmadd(x2, x0, t0);
|
t0 = _mm_sub_ps(_mm_mul_ps(x3, x1), _mm_mul_ps(x2, x0));
|
||||||
|
|
||||||
|
x4 = _mm_shuffle_ps(r2, r3, _MM_SHUFFLE(2, 1, 2, 1)); /* o n k j */
|
||||||
|
x4 = glmm_shuff1(x4, 0, 2, 2, 2); /* j n n n */
|
||||||
|
x5 = _mm_shuffle_ps(r2, r1, _MM_SHUFFLE(1, 1, 1, 1)); /* f f j j */
|
||||||
|
|
||||||
/* t1[1] = j * p - n * l;
|
/* t1[1] = j * p - n * l;
|
||||||
t1[1] = j * p - n * l;
|
t1[1] = j * p - n * l;
|
||||||
t2[1] = f * p - n * h;
|
t2[1] = f * p - n * h;
|
||||||
t3[1] = f * l - j * h; */
|
t3[1] = f * l - j * h; */
|
||||||
t1 = glmm_fnmadd(x4, x0, t1);
|
t1 = _mm_sub_ps(_mm_mul_ps(x5, x1), _mm_mul_ps(x4, x0));
|
||||||
|
|
||||||
/* t1[2] = j * o - n * k
|
/* t1[2] = j * o - n * k
|
||||||
t1[2] = j * o - n * k;
|
t1[2] = j * o - n * k;
|
||||||
t2[2] = f * o - n * g;
|
t2[2] = f * o - n * g;
|
||||||
t3[2] = f * k - j * g; */
|
t3[2] = f * k - j * g; */
|
||||||
t2 = glmm_fnmadd(x4, x3, t2);
|
t2 = _mm_sub_ps(_mm_mul_ps(x5, x2), _mm_mul_ps(x4, x3));
|
||||||
|
|
||||||
|
x6 = _mm_shuffle_ps(r2, r1, _MM_SHUFFLE(0, 0, 0, 0)); /* e e i i */
|
||||||
|
x7 = glmm_shuff2(r3, r2, 0, 0, 0, 0, 2, 0, 0, 0); /* i m m m */
|
||||||
|
|
||||||
/* t1[3] = i * p - m * l;
|
/* t1[3] = i * p - m * l;
|
||||||
t1[3] = i * p - m * l;
|
t1[3] = i * p - m * l;
|
||||||
t2[3] = e * p - m * h;
|
t2[3] = e * p - m * h;
|
||||||
t3[3] = e * l - i * h; */
|
t3[3] = e * l - i * h; */
|
||||||
t3 = glmm_fnmadd(x7, x0, t3);
|
t3 = _mm_sub_ps(_mm_mul_ps(x6, x1), _mm_mul_ps(x7, x0));
|
||||||
|
|
||||||
/* t1[4] = i * o - m * k;
|
/* t1[4] = i * o - m * k;
|
||||||
t1[4] = i * o - m * k;
|
t1[4] = i * o - m * k;
|
||||||
t2[4] = e * o - m * g;
|
t2[4] = e * o - m * g;
|
||||||
t3[4] = e * k - i * g; */
|
t3[4] = e * k - i * g; */
|
||||||
t4 = glmm_fnmadd(x7, x3, t4);
|
t4 = _mm_sub_ps(_mm_mul_ps(x6, x2), _mm_mul_ps(x7, x3));
|
||||||
|
|
||||||
/* t1[5] = i * n - m * j;
|
/* t1[5] = i * n - m * j;
|
||||||
t1[5] = i * n - m * j;
|
t1[5] = i * n - m * j;
|
||||||
t2[5] = e * n - m * f;
|
t2[5] = e * n - m * f;
|
||||||
t3[5] = e * j - i * f; */
|
t3[5] = e * j - i * f; */
|
||||||
t5 = glmm_fnmadd(x7, x5, t5);
|
t5 = _mm_sub_ps(_mm_mul_ps(x6, x4), _mm_mul_ps(x7, x5));
|
||||||
|
|
||||||
x4 = _mm_movelh_ps(r0, r1); /* f e b a */
|
x0 = glmm_shuff2(r1, r0, 0, 0, 0, 0, 2, 2, 2, 0); /* a a a e */
|
||||||
x5 = _mm_movehl_ps(r1, r0); /* h g d c */
|
x1 = glmm_shuff2(r1, r0, 1, 1, 1, 1, 2, 2, 2, 0); /* b b b f */
|
||||||
|
x2 = glmm_shuff2(r1, r0, 2, 2, 2, 2, 2, 2, 2, 0); /* c c c g */
|
||||||
x0 = glmm_shuff1(x4, 0, 0, 0, 2); /* a a a e */
|
x3 = glmm_shuff2(r1, r0, 3, 3, 3, 3, 2, 2, 2, 0); /* d d d h */
|
||||||
x1 = glmm_shuff1(x4, 1, 1, 1, 3); /* b b b f */
|
|
||||||
x2 = glmm_shuff1(x5, 0, 0, 0, 2); /* c c c g */
|
|
||||||
x3 = glmm_shuff1(x5, 1, 1, 1, 3); /* d d d h */
|
|
||||||
|
|
||||||
v2 = _mm_mul_ps(x0, t1);
|
|
||||||
v1 = _mm_mul_ps(x0, t0);
|
|
||||||
v3 = _mm_mul_ps(x0, t2);
|
|
||||||
v0 = _mm_mul_ps(x1, t0);
|
|
||||||
|
|
||||||
v2 = glmm_fnmadd(x1, t3, v2);
|
|
||||||
v3 = glmm_fnmadd(x1, t4, v3);
|
|
||||||
v0 = glmm_fnmadd(x2, t1, v0);
|
|
||||||
v1 = glmm_fnmadd(x2, t3, v1);
|
|
||||||
|
|
||||||
v3 = glmm_fmadd(x2, t5, v3);
|
|
||||||
v0 = glmm_fmadd(x3, t2, v0);
|
|
||||||
v2 = glmm_fmadd(x3, t5, v2);
|
|
||||||
v1 = glmm_fmadd(x3, t4, v1);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
dest[0][0] = f * t1[0] - g * t1[1] + h * t1[2];
|
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][1] =-(b * t1[0] - c * t1[1] + d * t1[2]);
|
||||||
dest[0][2] = b * t2[0] - c * t2[1] + d * t2[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]); */
|
dest[0][3] =-(b * t3[0] - c * t3[1] + d * t3[2]); */
|
||||||
v0 = _mm_xor_ps(v0, x8);
|
v0 = _mm_add_ps(_mm_mul_ps(x3, t2),
|
||||||
|
_mm_sub_ps(_mm_mul_ps(x1, t0),
|
||||||
/*
|
_mm_mul_ps(x2, t1)));
|
||||||
dest[2][0] = e * t1[1] - f * t1[3] + h * t1[5];
|
v0 = _mm_xor_ps(v0, _mm_set_ps(-0.f, 0.f, -0.f, 0.f));
|
||||||
dest[2][1] =-(a * t1[1] - b * t1[3] + d * t1[5]);
|
|
||||||
dest[2][2] = a * t2[1] - b * t2[3] + d * t2[5];
|
|
||||||
dest[2][3] =-(a * t3[1] - b * t3[3] + d * t3[5]);*/
|
|
||||||
v2 = _mm_xor_ps(v2, x8);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
dest[1][0] =-(e * t1[0] - g * t1[3] + h * t1[4]);
|
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][1] = a * t1[0] - c * t1[3] + d * t1[4];
|
||||||
dest[1][2] =-(a * t2[0] - c * t2[3] + d * t2[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]; */
|
dest[1][3] = a * t3[0] - c * t3[3] + d * t3[4]; */
|
||||||
v1 = _mm_xor_ps(v1, x9);
|
v1 = _mm_add_ps(_mm_mul_ps(x3, t4),
|
||||||
|
_mm_sub_ps(_mm_mul_ps(x0, t0),
|
||||||
|
_mm_mul_ps(x2, t3)));
|
||||||
|
v1 = _mm_xor_ps(v1, _mm_set_ps(0.f, -0.f, 0.f, -0.f));
|
||||||
|
|
||||||
|
/*
|
||||||
|
dest[2][0] = e * t1[1] - f * t1[3] + h * t1[5];
|
||||||
|
dest[2][1] =-(a * t1[1] - b * t1[3] + d * t1[5]);
|
||||||
|
dest[2][2] = a * t2[1] - b * t2[3] + d * t2[5];
|
||||||
|
dest[2][3] =-(a * t3[1] - b * t3[3] + d * t3[5]);*/
|
||||||
|
v2 = _mm_add_ps(_mm_mul_ps(x3, t5),
|
||||||
|
_mm_sub_ps(_mm_mul_ps(x0, t1),
|
||||||
|
_mm_mul_ps(x1, t3)));
|
||||||
|
v2 = _mm_xor_ps(v2, _mm_set_ps(-0.f, 0.f, -0.f, 0.f));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
dest[3][0] =-(e * t1[2] - f * t1[4] + g * t1[5]);
|
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][1] = a * t1[2] - b * t1[4] + c * t1[5];
|
||||||
dest[3][2] =-(a * t2[2] - b * t2[4] + c * t2[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]; */
|
dest[3][3] = a * t3[2] - b * t3[4] + c * t3[5]; */
|
||||||
v3 = _mm_xor_ps(v3, x9);
|
v3 = _mm_add_ps(_mm_mul_ps(x2, t5),
|
||||||
|
_mm_sub_ps(_mm_mul_ps(x0, t2),
|
||||||
|
_mm_mul_ps(x1, t4)));
|
||||||
|
v3 = _mm_xor_ps(v3, _mm_set_ps(0.f, -0.f, 0.f, -0.f));
|
||||||
|
|
||||||
/* determinant */
|
/* determinant */
|
||||||
x0 = _mm_shuffle_ps(v0, v1, _MM_SHUFFLE(0, 0, 0, 0));
|
x0 = _mm_shuffle_ps(v0, v1, _MM_SHUFFLE(0, 0, 0, 0));
|
||||||
x1 = _mm_shuffle_ps(v2, v3, _MM_SHUFFLE(0, 0, 0, 0));
|
x1 = _mm_shuffle_ps(v2, v3, _MM_SHUFFLE(0, 0, 0, 0));
|
||||||
x0 = _mm_shuffle_ps(x0, x1, _MM_SHUFFLE(2, 0, 2, 0));
|
x0 = _mm_shuffle_ps(x0, x1, _MM_SHUFFLE(2, 0, 2, 0));
|
||||||
|
|
||||||
x0 = _mm_rcp_ps(glmm_vhadd(_mm_mul_ps(x0, r0)));
|
x0 = _mm_mul_ps(x0, r0);
|
||||||
|
x0 = _mm_add_ps(x0, glmm_shuff1(x0, 0, 1, 2, 3));
|
||||||
|
x0 = _mm_add_ps(x0, glmm_shuff1(x0, 1, 0, 0, 1));
|
||||||
|
x0 = _mm_rcp_ps(x0);
|
||||||
|
|
||||||
glmm_store(dest[0], _mm_mul_ps(v0, x0));
|
glmm_store(dest[0], _mm_mul_ps(v0, x0));
|
||||||
glmm_store(dest[1], _mm_mul_ps(v1, x0));
|
glmm_store(dest[1], _mm_mul_ps(v1, x0));
|
||||||
@@ -300,129 +283,117 @@ glm_mat4_inv_sse2(mat4 mat, mat4 dest) {
|
|||||||
__m128 r0, r1, r2, r3,
|
__m128 r0, r1, r2, r3,
|
||||||
v0, v1, v2, v3,
|
v0, v1, v2, v3,
|
||||||
t0, t1, t2, t3, t4, t5,
|
t0, t1, t2, t3, t4, t5,
|
||||||
x0, x1, x2, x3, x4, x5, x6, x7, x8, x9;
|
x0, x1, x2, x3, x4, x5, x6, x7;
|
||||||
|
|
||||||
x8 = _mm_set_ps(-0.f, 0.f, -0.f, 0.f);
|
|
||||||
x9 = glmm_shuff1(x8, 2, 1, 2, 1);
|
|
||||||
|
|
||||||
/* 127 <- 0 */
|
/* 127 <- 0 */
|
||||||
r0 = glmm_load(mat[0]); /* d c b a */
|
r0 = glmm_load(mat[0]); /* d c b a */
|
||||||
r1 = glmm_load(mat[1]); /* h g f e */
|
r1 = glmm_load(mat[1]); /* h g f e */
|
||||||
r2 = glmm_load(mat[2]); /* l k j i */
|
r2 = glmm_load(mat[2]); /* l k j i */
|
||||||
r3 = glmm_load(mat[3]); /* p o n m */
|
r3 = glmm_load(mat[3]); /* p o n m */
|
||||||
|
|
||||||
x0 = _mm_movehl_ps(r3, r2); /* p o l k */
|
|
||||||
x3 = _mm_movelh_ps(r2, r3); /* n m j i */
|
|
||||||
x1 = glmm_shuff1(x0, 1, 3, 3 ,3); /* l p p p */
|
|
||||||
x2 = glmm_shuff1(x0, 0, 2, 2, 2); /* k o o o */
|
|
||||||
x4 = glmm_shuff1(x3, 1, 3, 3, 3); /* j n n n */
|
|
||||||
x7 = glmm_shuff1(x3, 0, 2, 2, 2); /* i m m m */
|
|
||||||
|
|
||||||
x6 = _mm_shuffle_ps(r2, r1, _MM_SHUFFLE(0, 0, 0, 0)); /* e e i i */
|
x0 = _mm_shuffle_ps(r2, r3, _MM_SHUFFLE(3, 2, 3, 2)); /* p o l k */
|
||||||
x5 = _mm_shuffle_ps(r2, r1, _MM_SHUFFLE(1, 1, 1, 1)); /* f f j j */
|
x1 = glmm_shuff1(x0, 1, 3, 3, 3); /* l p p p */
|
||||||
x3 = _mm_shuffle_ps(r2, r1, _MM_SHUFFLE(2, 2, 2, 2)); /* g g k k */
|
x2 = glmm_shuff1(x0, 0, 2, 2, 2); /* k o o o */
|
||||||
x0 = _mm_shuffle_ps(r2, r1, _MM_SHUFFLE(3, 3, 3, 3)); /* h h l l */
|
x0 = _mm_shuffle_ps(r2, r1, _MM_SHUFFLE(3, 3, 3, 3)); /* h h l l */
|
||||||
|
x3 = _mm_shuffle_ps(r2, r1, _MM_SHUFFLE(2, 2, 2, 2)); /* g g k k */
|
||||||
t0 = _mm_mul_ps(x3, x1);
|
|
||||||
t1 = _mm_mul_ps(x5, x1);
|
|
||||||
t2 = _mm_mul_ps(x5, x2);
|
|
||||||
t3 = _mm_mul_ps(x6, x1);
|
|
||||||
t4 = _mm_mul_ps(x6, x2);
|
|
||||||
t5 = _mm_mul_ps(x6, x4);
|
|
||||||
|
|
||||||
/* t1[0] = k * p - o * l;
|
/* t1[0] = k * p - o * l;
|
||||||
t1[0] = k * p - o * l;
|
t1[0] = k * p - o * l;
|
||||||
t2[0] = g * p - o * h;
|
t2[0] = g * p - o * h;
|
||||||
t3[0] = g * l - k * h; */
|
t3[0] = g * l - k * h; */
|
||||||
t0 = glmm_fnmadd(x2, x0, t0);
|
t0 = _mm_sub_ps(_mm_mul_ps(x3, x1), _mm_mul_ps(x2, x0));
|
||||||
|
|
||||||
|
x4 = _mm_shuffle_ps(r2, r3, _MM_SHUFFLE(2, 1, 2, 1)); /* o n k j */
|
||||||
|
x4 = glmm_shuff1(x4, 0, 2, 2, 2); /* j n n n */
|
||||||
|
x5 = _mm_shuffle_ps(r2, r1, _MM_SHUFFLE(1, 1, 1, 1)); /* f f j j */
|
||||||
|
|
||||||
/* t1[1] = j * p - n * l;
|
/* t1[1] = j * p - n * l;
|
||||||
t1[1] = j * p - n * l;
|
t1[1] = j * p - n * l;
|
||||||
t2[1] = f * p - n * h;
|
t2[1] = f * p - n * h;
|
||||||
t3[1] = f * l - j * h; */
|
t3[1] = f * l - j * h; */
|
||||||
t1 = glmm_fnmadd(x4, x0, t1);
|
t1 = _mm_sub_ps(_mm_mul_ps(x5, x1), _mm_mul_ps(x4, x0));
|
||||||
|
|
||||||
/* t1[2] = j * o - n * k
|
/* t1[2] = j * o - n * k
|
||||||
t1[2] = j * o - n * k;
|
t1[2] = j * o - n * k;
|
||||||
t2[2] = f * o - n * g;
|
t2[2] = f * o - n * g;
|
||||||
t3[2] = f * k - j * g; */
|
t3[2] = f * k - j * g; */
|
||||||
t2 = glmm_fnmadd(x4, x3, t2);
|
t2 = _mm_sub_ps(_mm_mul_ps(x5, x2), _mm_mul_ps(x4, x3));
|
||||||
|
|
||||||
|
x6 = _mm_shuffle_ps(r2, r1, _MM_SHUFFLE(0, 0, 0, 0)); /* e e i i */
|
||||||
|
x7 = glmm_shuff2(r3, r2, 0, 0, 0, 0, 2, 0, 0, 0); /* i m m m */
|
||||||
|
|
||||||
/* t1[3] = i * p - m * l;
|
/* t1[3] = i * p - m * l;
|
||||||
t1[3] = i * p - m * l;
|
t1[3] = i * p - m * l;
|
||||||
t2[3] = e * p - m * h;
|
t2[3] = e * p - m * h;
|
||||||
t3[3] = e * l - i * h; */
|
t3[3] = e * l - i * h; */
|
||||||
t3 = glmm_fnmadd(x7, x0, t3);
|
t3 = _mm_sub_ps(_mm_mul_ps(x6, x1), _mm_mul_ps(x7, x0));
|
||||||
|
|
||||||
/* t1[4] = i * o - m * k;
|
/* t1[4] = i * o - m * k;
|
||||||
t1[4] = i * o - m * k;
|
t1[4] = i * o - m * k;
|
||||||
t2[4] = e * o - m * g;
|
t2[4] = e * o - m * g;
|
||||||
t3[4] = e * k - i * g; */
|
t3[4] = e * k - i * g; */
|
||||||
t4 = glmm_fnmadd(x7, x3, t4);
|
t4 = _mm_sub_ps(_mm_mul_ps(x6, x2), _mm_mul_ps(x7, x3));
|
||||||
|
|
||||||
/* t1[5] = i * n - m * j;
|
/* t1[5] = i * n - m * j;
|
||||||
t1[5] = i * n - m * j;
|
t1[5] = i * n - m * j;
|
||||||
t2[5] = e * n - m * f;
|
t2[5] = e * n - m * f;
|
||||||
t3[5] = e * j - i * f; */
|
t3[5] = e * j - i * f; */
|
||||||
t5 = glmm_fnmadd(x7, x5, t5);
|
t5 = _mm_sub_ps(_mm_mul_ps(x6, x4), _mm_mul_ps(x7, x5));
|
||||||
|
|
||||||
x4 = _mm_movelh_ps(r0, r1); /* f e b a */
|
x0 = glmm_shuff2(r1, r0, 0, 0, 0, 0, 2, 2, 2, 0); /* a a a e */
|
||||||
x5 = _mm_movehl_ps(r1, r0); /* h g d c */
|
x1 = glmm_shuff2(r1, r0, 1, 1, 1, 1, 2, 2, 2, 0); /* b b b f */
|
||||||
|
x2 = glmm_shuff2(r1, r0, 2, 2, 2, 2, 2, 2, 2, 0); /* c c c g */
|
||||||
x0 = glmm_shuff1(x4, 0, 0, 0, 2); /* a a a e */
|
x3 = glmm_shuff2(r1, r0, 3, 3, 3, 3, 2, 2, 2, 0); /* d d d h */
|
||||||
x1 = glmm_shuff1(x4, 1, 1, 1, 3); /* b b b f */
|
|
||||||
x2 = glmm_shuff1(x5, 0, 0, 0, 2); /* c c c g */
|
|
||||||
x3 = glmm_shuff1(x5, 1, 1, 1, 3); /* d d d h */
|
|
||||||
|
|
||||||
v2 = _mm_mul_ps(x0, t1);
|
|
||||||
v1 = _mm_mul_ps(x0, t0);
|
|
||||||
v3 = _mm_mul_ps(x0, t2);
|
|
||||||
v0 = _mm_mul_ps(x1, t0);
|
|
||||||
|
|
||||||
v2 = glmm_fnmadd(x1, t3, v2);
|
|
||||||
v3 = glmm_fnmadd(x1, t4, v3);
|
|
||||||
v0 = glmm_fnmadd(x2, t1, v0);
|
|
||||||
v1 = glmm_fnmadd(x2, t3, v1);
|
|
||||||
|
|
||||||
v3 = glmm_fmadd(x2, t5, v3);
|
|
||||||
v0 = glmm_fmadd(x3, t2, v0);
|
|
||||||
v2 = glmm_fmadd(x3, t5, v2);
|
|
||||||
v1 = glmm_fmadd(x3, t4, v1);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
dest[0][0] = f * t1[0] - g * t1[1] + h * t1[2];
|
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][1] =-(b * t1[0] - c * t1[1] + d * t1[2]);
|
||||||
dest[0][2] = b * t2[0] - c * t2[1] + d * t2[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]); */
|
dest[0][3] =-(b * t3[0] - c * t3[1] + d * t3[2]); */
|
||||||
v0 = _mm_xor_ps(v0, x8);
|
v0 = _mm_add_ps(_mm_mul_ps(x3, t2),
|
||||||
|
_mm_sub_ps(_mm_mul_ps(x1, t0),
|
||||||
/*
|
_mm_mul_ps(x2, t1)));
|
||||||
dest[2][0] = e * t1[1] - f * t1[3] + h * t1[5];
|
v0 = _mm_xor_ps(v0, _mm_set_ps(-0.f, 0.f, -0.f, 0.f));
|
||||||
dest[2][1] =-(a * t1[1] - b * t1[3] + d * t1[5]);
|
|
||||||
dest[2][2] = a * t2[1] - b * t2[3] + d * t2[5];
|
|
||||||
dest[2][3] =-(a * t3[1] - b * t3[3] + d * t3[5]);*/
|
|
||||||
v2 = _mm_xor_ps(v2, x8);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
dest[1][0] =-(e * t1[0] - g * t1[3] + h * t1[4]);
|
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][1] = a * t1[0] - c * t1[3] + d * t1[4];
|
||||||
dest[1][2] =-(a * t2[0] - c * t2[3] + d * t2[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]; */
|
dest[1][3] = a * t3[0] - c * t3[3] + d * t3[4]; */
|
||||||
v1 = _mm_xor_ps(v1, x9);
|
v1 = _mm_add_ps(_mm_mul_ps(x3, t4),
|
||||||
|
_mm_sub_ps(_mm_mul_ps(x0, t0),
|
||||||
|
_mm_mul_ps(x2, t3)));
|
||||||
|
v1 = _mm_xor_ps(v1, _mm_set_ps(0.f, -0.f, 0.f, -0.f));
|
||||||
|
|
||||||
|
/*
|
||||||
|
dest[2][0] = e * t1[1] - f * t1[3] + h * t1[5];
|
||||||
|
dest[2][1] =-(a * t1[1] - b * t1[3] + d * t1[5]);
|
||||||
|
dest[2][2] = a * t2[1] - b * t2[3] + d * t2[5];
|
||||||
|
dest[2][3] =-(a * t3[1] - b * t3[3] + d * t3[5]);*/
|
||||||
|
v2 = _mm_add_ps(_mm_mul_ps(x3, t5),
|
||||||
|
_mm_sub_ps(_mm_mul_ps(x0, t1),
|
||||||
|
_mm_mul_ps(x1, t3)));
|
||||||
|
v2 = _mm_xor_ps(v2, _mm_set_ps(-0.f, 0.f, -0.f, 0.f));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
dest[3][0] =-(e * t1[2] - f * t1[4] + g * t1[5]);
|
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][1] = a * t1[2] - b * t1[4] + c * t1[5];
|
||||||
dest[3][2] =-(a * t2[2] - b * t2[4] + c * t2[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]; */
|
dest[3][3] = a * t3[2] - b * t3[4] + c * t3[5]; */
|
||||||
v3 = _mm_xor_ps(v3, x9);
|
v3 = _mm_add_ps(_mm_mul_ps(x2, t5),
|
||||||
|
_mm_sub_ps(_mm_mul_ps(x0, t2),
|
||||||
|
_mm_mul_ps(x1, t4)));
|
||||||
|
v3 = _mm_xor_ps(v3, _mm_set_ps(0.f, -0.f, 0.f, -0.f));
|
||||||
|
|
||||||
/* determinant */
|
/* determinant */
|
||||||
x0 = _mm_shuffle_ps(v0, v1, _MM_SHUFFLE(0, 0, 0, 0));
|
x0 = _mm_shuffle_ps(v0, v1, _MM_SHUFFLE(0, 0, 0, 0));
|
||||||
x1 = _mm_shuffle_ps(v2, v3, _MM_SHUFFLE(0, 0, 0, 0));
|
x1 = _mm_shuffle_ps(v2, v3, _MM_SHUFFLE(0, 0, 0, 0));
|
||||||
x0 = _mm_shuffle_ps(x0, x1, _MM_SHUFFLE(2, 0, 2, 0));
|
x0 = _mm_shuffle_ps(x0, x1, _MM_SHUFFLE(2, 0, 2, 0));
|
||||||
|
|
||||||
x0 = _mm_div_ps(_mm_set1_ps(1.0f), glmm_vhadd(_mm_mul_ps(x0, r0)));
|
x0 = _mm_mul_ps(x0, r0);
|
||||||
|
x0 = _mm_add_ps(x0, glmm_shuff1(x0, 0, 1, 2, 3));
|
||||||
|
x0 = _mm_add_ps(x0, glmm_shuff1(x0, 1, 0, 0, 1));
|
||||||
|
x0 = _mm_div_ps(_mm_set1_ps(1.0f), x0);
|
||||||
|
|
||||||
glmm_store(dest[0], _mm_mul_ps(v0, x0));
|
glmm_store(dest[0], _mm_mul_ps(v0, x0));
|
||||||
glmm_store(dest[1], _mm_mul_ps(v1, x0));
|
glmm_store(dest[1], _mm_mul_ps(v1, x0));
|
||||||
|
|||||||
@@ -22,33 +22,25 @@ glm_quat_mul_sse2(versor p, versor q, versor dest) {
|
|||||||
a1 a2 − b1 b2 − c1 c2 − d1 d2
|
a1 a2 − b1 b2 − c1 c2 − d1 d2
|
||||||
*/
|
*/
|
||||||
|
|
||||||
__m128 xp, xq, x1, x2, x3, r, x, y, z;
|
__m128 xp, xq, x0, r;
|
||||||
|
|
||||||
xp = glmm_load(p); /* 3 2 1 0 */
|
xp = glmm_load(p); /* 3 2 1 0 */
|
||||||
xq = glmm_load(q);
|
xq = glmm_load(q);
|
||||||
x1 = _mm_set_ps(-0.f, 0.f, -0.f, 0.f); /* TODO: _mm_set1_ss() + shuff ? */
|
|
||||||
r = _mm_mul_ps(glmm_splat_w(xp), xq);
|
|
||||||
|
|
||||||
x2 = _mm_unpackhi_ps(x1, x1);
|
|
||||||
x3 = glmm_shuff1(x1, 3, 2, 0, 1);
|
|
||||||
x = glmm_splat_x(xp);
|
|
||||||
y = glmm_splat_y(xp);
|
|
||||||
z = glmm_splat_z(xp);
|
|
||||||
|
|
||||||
x = _mm_xor_ps(x, x1);
|
r = _mm_mul_ps(glmm_shuff1x(xp, 3), xq);
|
||||||
y = _mm_xor_ps(y, x2);
|
|
||||||
z = _mm_xor_ps(z, x3);
|
x0 = _mm_xor_ps(glmm_shuff1x(xp, 0), _mm_set_ps(-0.f, 0.f, -0.f, 0.f));
|
||||||
|
r = _mm_add_ps(r, _mm_mul_ps(x0, glmm_shuff1(xq, 0, 1, 2, 3)));
|
||||||
x1 = glmm_shuff1(xq, 0, 1, 2, 3);
|
|
||||||
x2 = glmm_shuff1(xq, 1, 0, 3, 2);
|
x0 = _mm_xor_ps(glmm_shuff1x(xp, 1), _mm_set_ps(-0.f, -0.f, 0.f, 0.f));
|
||||||
x3 = glmm_shuff1(xq, 2, 3, 0, 1);
|
r = _mm_add_ps(r, _mm_mul_ps(x0, glmm_shuff1(xq, 1, 0, 3, 2)));
|
||||||
|
|
||||||
r = glmm_fmadd(x, x1, r);
|
x0 = _mm_xor_ps(glmm_shuff1x(xp, 2), _mm_set_ps(-0.f, 0.f, 0.f, -0.f));
|
||||||
r = glmm_fmadd(y, x2, r);
|
r = _mm_add_ps(r, _mm_mul_ps(x0, glmm_shuff1(xq, 2, 3, 0, 1)));
|
||||||
r = glmm_fmadd(z, x3, r);
|
|
||||||
|
|
||||||
glmm_store(dest, r);
|
glmm_store(dest, r);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
#endif /* cglm_quat_simd_h */
|
#endif /* cglm_quat_simd_h */
|
||||||
|
|||||||
@@ -18,9 +18,6 @@
|
|||||||
# define glmm_store(p, a) _mm_store_ps(p, a)
|
# define glmm_store(p, a) _mm_store_ps(p, a)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define glmm_set1(x) _mm_set1_ps(x)
|
|
||||||
#define glmm_128 __m128
|
|
||||||
|
|
||||||
#ifdef CGLM_USE_INT_DOMAIN
|
#ifdef CGLM_USE_INT_DOMAIN
|
||||||
# define glmm_shuff1(xmm, z, y, x, w) \
|
# define glmm_shuff1(xmm, z, y, x, w) \
|
||||||
_mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(xmm), \
|
_mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(xmm), \
|
||||||
@@ -30,16 +27,7 @@
|
|||||||
_mm_shuffle_ps(xmm, xmm, _MM_SHUFFLE(z, y, x, w))
|
_mm_shuffle_ps(xmm, xmm, _MM_SHUFFLE(z, y, x, w))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define glmm_splat(x, lane) glmm_shuff1(x, lane, lane, lane, lane)
|
|
||||||
|
|
||||||
#define glmm_splat_x(x) glmm_splat(x, 0)
|
|
||||||
#define glmm_splat_y(x) glmm_splat(x, 1)
|
|
||||||
#define glmm_splat_z(x) glmm_splat(x, 2)
|
|
||||||
#define glmm_splat_w(x) glmm_splat(x, 3)
|
|
||||||
|
|
||||||
/* glmm_shuff1x() is DEPRECATED!, use glmm_splat() */
|
|
||||||
#define glmm_shuff1x(xmm, x) glmm_shuff1(xmm, x, x, x, x)
|
#define glmm_shuff1x(xmm, x) glmm_shuff1(xmm, x, x, x, x)
|
||||||
|
|
||||||
#define glmm_shuff2(a, b, z0, y0, x0, w0, z1, y1, x1, w1) \
|
#define glmm_shuff2(a, b, z0, y0, x0, w0, z1, y1, x1, w1) \
|
||||||
glmm_shuff1(_mm_shuffle_ps(a, b, _MM_SHUFFLE(z0, y0, x0, w0)), \
|
glmm_shuff1(_mm_shuffle_ps(a, b, _MM_SHUFFLE(z0, y0, x0, w0)), \
|
||||||
z1, y1, x1, w1)
|
z1, y1, x1, w1)
|
||||||
@@ -60,15 +48,6 @@ glmm_abs(__m128 x) {
|
|||||||
return _mm_andnot_ps(_mm_set1_ps(-0.0f), x);
|
return _mm_andnot_ps(_mm_set1_ps(-0.0f), x);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline
|
|
||||||
__m128
|
|
||||||
glmm_vhadd(__m128 v) {
|
|
||||||
__m128 x0;
|
|
||||||
x0 = _mm_add_ps(v, glmm_shuff1(v, 0, 1, 2, 3));
|
|
||||||
x0 = _mm_add_ps(x0, glmm_shuff1(x0, 1, 0, 0, 1));
|
|
||||||
return x0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline
|
static inline
|
||||||
__m128
|
__m128
|
||||||
glmm_vhadds(__m128 v) {
|
glmm_vhadds(__m128 v) {
|
||||||
@@ -101,7 +80,7 @@ glmm_vhmin(__m128 v) {
|
|||||||
__m128 x0, x1, x2;
|
__m128 x0, x1, x2;
|
||||||
x0 = _mm_movehl_ps(v, v); /* [2, 3, 2, 3] */
|
x0 = _mm_movehl_ps(v, v); /* [2, 3, 2, 3] */
|
||||||
x1 = _mm_min_ps(x0, v); /* [0|2, 1|3, 2|2, 3|3] */
|
x1 = _mm_min_ps(x0, v); /* [0|2, 1|3, 2|2, 3|3] */
|
||||||
x2 = glmm_splat(x1, 1); /* [1|3, 1|3, 1|3, 1|3] */
|
x2 = glmm_shuff1x(x1, 1); /* [1|3, 1|3, 1|3, 1|3] */
|
||||||
return _mm_min_ss(x1, x2);
|
return _mm_min_ss(x1, x2);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -117,7 +96,7 @@ glmm_vhmax(__m128 v) {
|
|||||||
__m128 x0, x1, x2;
|
__m128 x0, x1, x2;
|
||||||
x0 = _mm_movehl_ps(v, v); /* [2, 3, 2, 3] */
|
x0 = _mm_movehl_ps(v, v); /* [2, 3, 2, 3] */
|
||||||
x1 = _mm_max_ps(x0, v); /* [0|2, 1|3, 2|2, 3|3] */
|
x1 = _mm_max_ps(x0, v); /* [0|2, 1|3, 2|2, 3|3] */
|
||||||
x2 = glmm_splat(x1, 1); /* [1|3, 1|3, 1|3, 1|3] */
|
x2 = glmm_shuff1x(x1, 1); /* [1|3, 1|3, 1|3, 1|3] */
|
||||||
return _mm_max_ss(x1, x2);
|
return _mm_max_ss(x1, x2);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -196,7 +175,7 @@ glmm_load3(float v[3]) {
|
|||||||
__m128i xy;
|
__m128i xy;
|
||||||
__m128 z;
|
__m128 z;
|
||||||
|
|
||||||
xy = _mm_loadl_epi64(CGLM_CASTPTR_ASSUME_ALIGNED(v, const __m128i));
|
xy = _mm_loadl_epi64((const __m128i *)v);
|
||||||
z = _mm_load_ss(&v[2]);
|
z = _mm_load_ss(&v[2]);
|
||||||
|
|
||||||
return _mm_movelh_ps(_mm_castsi128_ps(xy), z);
|
return _mm_movelh_ps(_mm_castsi128_ps(xy), z);
|
||||||
@@ -205,103 +184,9 @@ glmm_load3(float v[3]) {
|
|||||||
static inline
|
static inline
|
||||||
void
|
void
|
||||||
glmm_store3(float v[3], __m128 vx) {
|
glmm_store3(float v[3], __m128 vx) {
|
||||||
_mm_storel_pi(CGLM_CASTPTR_ASSUME_ALIGNED(v, __m64), vx);
|
_mm_storel_pi((__m64 *)&v[0], vx);
|
||||||
_mm_store_ss(&v[2], glmm_shuff1(vx, 2, 2, 2, 2));
|
_mm_store_ss(&v[2], glmm_shuff1(vx, 2, 2, 2, 2));
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline
|
|
||||||
__m128
|
|
||||||
glmm_div(__m128 a, __m128 b) {
|
|
||||||
return _mm_div_ps(a, b);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* enable FMA macro for MSVC? */
|
|
||||||
#if defined(_MSC_VER) && !defined(__FMA__) && defined(__AVX2__)
|
|
||||||
# define __FMA__ 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static inline
|
|
||||||
__m128
|
|
||||||
glmm_fmadd(__m128 a, __m128 b, __m128 c) {
|
|
||||||
#ifdef __FMA__
|
|
||||||
return _mm_fmadd_ps(a, b, c);
|
|
||||||
#else
|
|
||||||
return _mm_add_ps(c, _mm_mul_ps(a, b));
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline
|
|
||||||
__m128
|
|
||||||
glmm_fnmadd(__m128 a, __m128 b, __m128 c) {
|
|
||||||
#ifdef __FMA__
|
|
||||||
return _mm_fnmadd_ps(a, b, c);
|
|
||||||
#else
|
|
||||||
return _mm_sub_ps(c, _mm_mul_ps(a, b));
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline
|
|
||||||
__m128
|
|
||||||
glmm_fmsub(__m128 a, __m128 b, __m128 c) {
|
|
||||||
#ifdef __FMA__
|
|
||||||
return _mm_fmsub_ps(a, b, c);
|
|
||||||
#else
|
|
||||||
return _mm_sub_ps(_mm_mul_ps(a, b), c);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline
|
|
||||||
__m128
|
|
||||||
glmm_fnmsub(__m128 a, __m128 b, __m128 c) {
|
|
||||||
#ifdef __FMA__
|
|
||||||
return _mm_fnmsub_ps(a, b, c);
|
|
||||||
#else
|
|
||||||
return _mm_xor_ps(_mm_add_ps(_mm_mul_ps(a, b), c), _mm_set1_ps(-0.0f));
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined(__AVX__)
|
|
||||||
static inline
|
|
||||||
__m256
|
|
||||||
glmm256_fmadd(__m256 a, __m256 b, __m256 c) {
|
|
||||||
#ifdef __FMA__
|
|
||||||
return _mm256_fmadd_ps(a, b, c);
|
|
||||||
#else
|
|
||||||
return _mm256_add_ps(c, _mm256_mul_ps(a, b));
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline
|
|
||||||
__m256
|
|
||||||
glmm256_fnmadd(__m256 a, __m256 b, __m256 c) {
|
|
||||||
#ifdef __FMA__
|
|
||||||
return _mm256_fnmadd_ps(a, b, c);
|
|
||||||
#else
|
|
||||||
return _mm256_sub_ps(c, _mm256_mul_ps(a, b));
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline
|
|
||||||
__m256
|
|
||||||
glmm256_fmsub(__m256 a, __m256 b, __m256 c) {
|
|
||||||
#ifdef __FMA__
|
|
||||||
return _mm256_fmsub_ps(a, b, c);
|
|
||||||
#else
|
|
||||||
return _mm256_sub_ps(_mm256_mul_ps(a, b), c);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline
|
|
||||||
__m256
|
|
||||||
glmm256_fnmsub(__m256 a, __m256 b, __m256 c) {
|
|
||||||
#ifdef __FMA__
|
|
||||||
return _mm256_fmsub_ps(a, b, c);
|
|
||||||
#else
|
|
||||||
return _mm256_xor_ps(_mm256_sub_ps(_mm256_mul_ps(a, b), c),
|
|
||||||
_mm256_set1_ps(-0.0f));
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
#endif /* cglm_simd_x86_h */
|
#endif /* cglm_simd_x86_h */
|
||||||
|
|||||||
@@ -31,7 +31,6 @@ extern "C" {
|
|||||||
#include "struct/project.h"
|
#include "struct/project.h"
|
||||||
#include "struct/sphere.h"
|
#include "struct/sphere.h"
|
||||||
#include "struct/curve.h"
|
#include "struct/curve.h"
|
||||||
#include "struct/affine2d.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,6 +39,10 @@
|
|||||||
#include "vec4.h"
|
#include "vec4.h"
|
||||||
#include "mat4.h"
|
#include "mat4.h"
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
mat4s
|
||||||
|
glms_mat4_mul(mat4s m1, mat4s m2);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @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
|
||||||
|
|||||||
@@ -1,177 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c), Recep Aslantas.
|
|
||||||
*
|
|
||||||
* MIT License (MIT), http://opensource.org/licenses/MIT
|
|
||||||
* Full license can be found in the LICENSE file
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
Functions:
|
|
||||||
CGLM_INLINE mat3s glms_translate2d(mat3 m, vec2 v)
|
|
||||||
CGLM_INLINE mat3s glms_translate2d_x(mat3s m, float x)
|
|
||||||
CGLM_INLINE mat3s glms_translate2d_y(mat3s m, float y)
|
|
||||||
CGLM_INLINE mat3s glms_translate2d_make(vec2s v)
|
|
||||||
CGLM_INLINE mat3s glms_scale2d_make(vec2s v)
|
|
||||||
CGLM_INLINE mat3s glms_scale2d(mat3s m, vec2s v)
|
|
||||||
CGLM_INLINE mat3s glms_scale2d_uni(mat3s m, float s)
|
|
||||||
CGLM_INLINE mat3s glms_rotate2d_make(float angle)
|
|
||||||
CGLM_INLINE mat3s glms_rotate2d(mat3s m, float angle)
|
|
||||||
CGLM_INLINE mat3s glms_rotate2d_to(mat3s m, float angle)
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef cglms_affine2ds_h
|
|
||||||
#define cglms_affine2ds_h
|
|
||||||
|
|
||||||
#include "../common.h"
|
|
||||||
#include "../types-struct.h"
|
|
||||||
#include "../affine2d.h"
|
|
||||||
#include "vec3.h"
|
|
||||||
#include "mat3.h"
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief translate existing 2d transform matrix by v vector
|
|
||||||
* and stores result in same matrix
|
|
||||||
*
|
|
||||||
* @param[in] m affine transfrom
|
|
||||||
* @param[in] v translate vector [x, y]
|
|
||||||
* @returns affine transfrom
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
mat3s
|
|
||||||
glms_translate2d(mat3s m, vec2s v) {
|
|
||||||
glm_translate2d(m.raw, v.raw);
|
|
||||||
return m;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief translate existing 2d transform matrix by x factor
|
|
||||||
*
|
|
||||||
* @param[in] m affine transfrom
|
|
||||||
* @param[in] x x factor
|
|
||||||
* @returns affine transfrom
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
mat3s
|
|
||||||
glms_translate2d_x(mat3s m, float x) {
|
|
||||||
glm_translate2d_x(m.raw, x);
|
|
||||||
return m;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief translate existing 2d transform matrix by y factor
|
|
||||||
*
|
|
||||||
* @param[in] m affine transfrom
|
|
||||||
* @param[in] y y factor
|
|
||||||
* @returns affine transfrom
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
mat3s
|
|
||||||
glms_translate2d_y(mat3s m, float y) {
|
|
||||||
glm_translate2d_y(m.raw, y);
|
|
||||||
return m;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief creates NEW translate 2d transform matrix by v vector
|
|
||||||
*
|
|
||||||
* @param[in] v translate vector [x, y]
|
|
||||||
* @returns affine transfrom
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
mat3s
|
|
||||||
glms_translate2d_make(vec2s v) {
|
|
||||||
mat3s m;
|
|
||||||
glm_translate2d_make(m.raw, v.raw);
|
|
||||||
return m;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief creates NEW 2d scale matrix by v vector
|
|
||||||
*
|
|
||||||
* @param[in] v scale vector [x, y]
|
|
||||||
* @returns affine transfrom
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
mat3s
|
|
||||||
glms_scale2d_make(vec2s v) {
|
|
||||||
mat3s m;
|
|
||||||
glm_scale2d_make(m.raw, v.raw);
|
|
||||||
return m;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief scales existing 2d transform matrix by v vector
|
|
||||||
* and stores result in same matrix
|
|
||||||
*
|
|
||||||
* @param[in] m affine transfrom
|
|
||||||
* @param[in] v scale vector [x, y, z]
|
|
||||||
* @returns affine transfrom
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
mat3s
|
|
||||||
glms_scale2d(mat3s m, vec2s v) {
|
|
||||||
mat3s r;
|
|
||||||
glm_scale2d_to(m.raw, v.raw, r.raw);
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief applies uniform scale to existing 2d transform matrix v = [s, s, s]
|
|
||||||
* and stores result in same matrix
|
|
||||||
*
|
|
||||||
* @param[in] m affine transfrom
|
|
||||||
* @param[in] s scale factor
|
|
||||||
* @returns affine transfrom
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
mat3s
|
|
||||||
glms_scale2d_uni(mat3s m, float s) {
|
|
||||||
glm_scale2d_uni(m.raw, s);
|
|
||||||
return m;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief creates NEW 2d rotation matrix by angle and axis
|
|
||||||
*
|
|
||||||
* axis will be normalized so you don't need to normalize it
|
|
||||||
*
|
|
||||||
* @param[in] angle angle (radians)
|
|
||||||
* @returns affine transfrom
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
mat3s
|
|
||||||
glms_rotate2d_make(float angle) {
|
|
||||||
mat3s m;
|
|
||||||
glm_rotate2d_make(m.raw, angle);
|
|
||||||
return m;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief rotate existing 2d transform matrix around given axis by angle
|
|
||||||
*
|
|
||||||
* @param[in] m affine transfrom
|
|
||||||
* @param[in] angle angle (radians)
|
|
||||||
* @returns affine transfrom
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
mat3s
|
|
||||||
glms_rotate2d(mat3s m, float angle) {
|
|
||||||
glm_rotate2d(m.raw, angle);
|
|
||||||
return m;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief rotate existing 2d transform matrix around given axis by angle
|
|
||||||
*
|
|
||||||
* @param[in] m affine transfrom
|
|
||||||
* @param[in] angle angle (radians)
|
|
||||||
* @returns affine transfrom
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
mat3s
|
|
||||||
glms_rotate2d_to(mat3s m, float angle) {
|
|
||||||
glm_rotate2d(m.raw, angle);
|
|
||||||
return m;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* cglms_affine2ds_h */
|
|
||||||
@@ -9,10 +9,10 @@
|
|||||||
Functions:
|
Functions:
|
||||||
CGLM_INLINE mat4s glms_frustum(float left, float right,
|
CGLM_INLINE mat4s glms_frustum(float left, float right,
|
||||||
float bottom, float top,
|
float bottom, float top,
|
||||||
float nearZ, float farZ)
|
float nearVal, float farVal)
|
||||||
CGLM_INLINE mat4s glms_ortho(float left, float right,
|
CGLM_INLINE mat4s glms_ortho(float left, float right,
|
||||||
float bottom, float top,
|
float bottom, float top,
|
||||||
float nearZ, float farZ)
|
float nearVal, float farVal)
|
||||||
CGLM_INLINE mat4s glms_ortho_aabb(vec3s box[2]);
|
CGLM_INLINE mat4s glms_ortho_aabb(vec3s box[2]);
|
||||||
CGLM_INLINE mat4s glms_ortho_aabb_p(vec3s box[2], float padding);
|
CGLM_INLINE mat4s glms_ortho_aabb_p(vec3s box[2], float padding);
|
||||||
CGLM_INLINE mat4s glms_ortho_aabb_pz(vec3s box[2], float padding);
|
CGLM_INLINE mat4s glms_ortho_aabb_pz(vec3s box[2], float padding);
|
||||||
@@ -20,8 +20,8 @@
|
|||||||
CGLM_INLINE mat4s glms_ortho_default_s(float aspect, float size)
|
CGLM_INLINE mat4s glms_ortho_default_s(float aspect, float size)
|
||||||
CGLM_INLINE mat4s glms_perspective(float fovy,
|
CGLM_INLINE mat4s glms_perspective(float fovy,
|
||||||
float aspect,
|
float aspect,
|
||||||
float nearZ,
|
float nearVal,
|
||||||
float farZ)
|
float farVal)
|
||||||
CGLM_INLINE void glms_persp_move_far(mat4s proj, float deltaFar)
|
CGLM_INLINE void glms_persp_move_far(mat4s proj, float deltaFar)
|
||||||
CGLM_INLINE mat4s glms_perspective_default(float aspect)
|
CGLM_INLINE mat4s glms_perspective_default(float aspect)
|
||||||
CGLM_INLINE void glms_perspective_resize(mat4s proj, float aspect)
|
CGLM_INLINE void glms_perspective_resize(mat4s proj, float aspect)
|
||||||
@@ -36,8 +36,8 @@
|
|||||||
CGLM_INLINE void glms_persp_decomp_x(mat4s proj, float *left, float *right)
|
CGLM_INLINE void glms_persp_decomp_x(mat4s proj, float *left, float *right)
|
||||||
CGLM_INLINE void glms_persp_decomp_y(mat4s proj, float *top, float *bottom)
|
CGLM_INLINE void glms_persp_decomp_y(mat4s proj, float *top, float *bottom)
|
||||||
CGLM_INLINE void glms_persp_decomp_z(mat4s proj, float *nearv, float *farv)
|
CGLM_INLINE void glms_persp_decomp_z(mat4s proj, float *nearv, float *farv)
|
||||||
CGLM_INLINE void glms_persp_decomp_far(mat4s proj, float *farZ)
|
CGLM_INLINE void glms_persp_decomp_far(mat4s proj, float *farVal)
|
||||||
CGLM_INLINE void glms_persp_decomp_near(mat4s proj, float *nearZ)
|
CGLM_INLINE void glms_persp_decomp_near(mat4s proj, float *nearVal)
|
||||||
CGLM_INLINE float glms_persp_fovy(mat4s proj)
|
CGLM_INLINE float glms_persp_fovy(mat4s proj)
|
||||||
CGLM_INLINE float glms_persp_aspect(mat4s proj)
|
CGLM_INLINE float glms_persp_aspect(mat4s proj)
|
||||||
CGLM_INLINE vec4s glms_persp_sizes(mat4s proj, float fovy)
|
CGLM_INLINE vec4s glms_persp_sizes(mat4s proj, float fovy)
|
||||||
@@ -51,39 +51,6 @@
|
|||||||
#include "../plane.h"
|
#include "../plane.h"
|
||||||
#include "../cam.h"
|
#include "../cam.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
|
||||||
*
|
*
|
||||||
@@ -91,24 +58,18 @@
|
|||||||
* @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] nearZ near clipping plane
|
* @param[in] nearVal near clipping plane
|
||||||
* @param[in] farZ far clipping plane
|
* @param[in] farVal far clipping plane
|
||||||
* @returns result matrix
|
* @returns result matrix
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
mat4s
|
mat4s
|
||||||
glms_frustum(float left, float right,
|
glms_frustum(float left, float right,
|
||||||
float bottom, float top,
|
float bottom, float top,
|
||||||
float nearZ, float farZ) {
|
float nearVal, float farVal) {
|
||||||
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
|
mat4s dest;
|
||||||
return glms_frustum_lh_zo(left, right, bottom, top, nearZ, farZ);
|
glm_frustum(left, right, bottom, top, nearVal, farVal, dest.raw);
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
|
return dest;
|
||||||
return glms_frustum_lh_no(left, right, bottom, top, nearZ, farZ);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
|
|
||||||
return glms_frustum_rh_zo(left, right, bottom, top, nearZ, farZ);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
|
|
||||||
return glms_frustum_rh_no(left, right, bottom, top, nearZ, farZ);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -118,24 +79,18 @@ glms_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] nearZ near clipping plane
|
* @param[in] nearVal near clipping plane
|
||||||
* @param[in] farZ far clipping plane
|
* @param[in] farVal far clipping plane
|
||||||
* @returns result matrix
|
* @returns result matrix
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
mat4s
|
mat4s
|
||||||
glms_ortho(float left, float right,
|
glms_ortho(float left, float right,
|
||||||
float bottom, float top,
|
float bottom, float top,
|
||||||
float nearZ, float farZ) {
|
float nearVal, float farVal) {
|
||||||
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
|
mat4s dest;
|
||||||
return glms_ortho_lh_zo(left, right, bottom, top, nearZ, farZ);
|
glm_ortho(left, right, bottom, top, nearVal, farVal, dest.raw);
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
|
return dest;
|
||||||
return glms_ortho_lh_no(left, right, bottom, top, nearZ, farZ);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
|
|
||||||
return glms_ortho_rh_zo(left, right, bottom, top, nearZ, farZ);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
|
|
||||||
return glms_ortho_rh_no(left, right, bottom, top, nearZ, farZ);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -149,15 +104,13 @@ glms_ortho(float left, float right,
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
mat4s
|
mat4s
|
||||||
glms_ortho_aabb(vec3s box[2]) {
|
glms_ortho_aabb(vec3s box[2]) {
|
||||||
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
|
mat4s dest;
|
||||||
return glms_ortho_aabb_lh_zo(box);
|
vec3 rawBox[2];
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
|
|
||||||
return glms_ortho_aabb_lh_no(box);
|
glms_vec3_unpack(rawBox, box, 2);
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
|
glm_ortho_aabb(rawBox, dest.raw);
|
||||||
return glms_ortho_aabb_rh_zo(box);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
|
return dest;
|
||||||
return glms_ortho_aabb_rh_no(box);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -172,15 +125,13 @@ glms_ortho_aabb(vec3s box[2]) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
mat4s
|
mat4s
|
||||||
glms_ortho_aabb_p(vec3s box[2], float padding) {
|
glms_ortho_aabb_p(vec3s box[2], float padding) {
|
||||||
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
|
mat4s dest;
|
||||||
return glms_ortho_aabb_p_lh_zo(box, padding);
|
vec3 rawBox[2];
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
|
|
||||||
return glms_ortho_aabb_p_lh_no(box, padding);
|
glms_vec3_unpack(rawBox, box, 2);
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
|
glm_ortho_aabb_p(rawBox, padding, dest.raw);
|
||||||
return glms_ortho_aabb_p_rh_zo(box, padding);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
|
return dest;
|
||||||
return glms_ortho_aabb_p_rh_no(box, padding);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -195,15 +146,13 @@ glms_ortho_aabb_p(vec3s box[2], float padding) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
mat4s
|
mat4s
|
||||||
glms_ortho_aabb_pz(vec3s box[2], float padding) {
|
glms_ortho_aabb_pz(vec3s box[2], float padding) {
|
||||||
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
|
mat4s dest;
|
||||||
return glms_ortho_aabb_pz_lh_zo(box, padding);
|
vec3 rawBox[2];
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
|
|
||||||
return glms_ortho_aabb_pz_lh_no(box, padding);
|
glms_vec3_unpack(rawBox, box, 2);
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
|
glm_ortho_aabb_pz(rawBox, padding, dest.raw);
|
||||||
return glms_ortho_aabb_pz_rh_zo(box, padding);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
|
return dest;
|
||||||
return glms_ortho_aabb_pz_rh_no(box, padding);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -215,15 +164,9 @@ glms_ortho_aabb_pz(vec3s box[2], float padding) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
mat4s
|
mat4s
|
||||||
glms_ortho_default(float aspect) {
|
glms_ortho_default(float aspect) {
|
||||||
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
|
mat4s dest;
|
||||||
return glms_ortho_default_lh_zo(aspect);
|
glm_ortho_default(aspect, dest.raw);
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
|
return dest;
|
||||||
return glms_ortho_default_lh_no(aspect);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
|
|
||||||
return glms_ortho_default_rh_zo(aspect);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
|
|
||||||
return glms_ortho_default_rh_no(aspect);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -236,15 +179,9 @@ glms_ortho_default(float aspect) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
mat4s
|
mat4s
|
||||||
glms_ortho_default_s(float aspect, float size) {
|
glms_ortho_default_s(float aspect, float size) {
|
||||||
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
|
mat4s dest;
|
||||||
return glms_ortho_default_s_lh_zo(aspect, size);
|
glm_ortho_default_s(aspect, size, dest.raw);
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
|
return dest;
|
||||||
return glms_ortho_default_s_lh_no(aspect, size);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
|
|
||||||
return glms_ortho_default_s_rh_zo(aspect, size);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
|
|
||||||
return glms_ortho_default_s_rh_no(aspect, size);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -252,48 +189,30 @@ glms_ortho_default_s(float aspect, float size) {
|
|||||||
*
|
*
|
||||||
* @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] nearZ near clipping plane
|
* @param[in] nearVal near clipping plane
|
||||||
* @param[in] farZ far clipping planes
|
* @param[in] farVal far clipping planes
|
||||||
* @returns result matrix
|
* @returns result matrix
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
mat4s
|
mat4s
|
||||||
glms_perspective(float fovy, float aspect, float nearZ, float farZ) {
|
glms_perspective(float fovy, float aspect, float nearVal, float farVal) {
|
||||||
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
|
mat4s dest;
|
||||||
return glms_perspective_lh_zo(fovy, aspect, nearZ, farZ);
|
glm_perspective(fovy, aspect, nearVal, farVal, dest.raw);
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
|
return dest;
|
||||||
return glms_perspective_lh_no(fovy, aspect, nearZ, farZ);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
|
|
||||||
return glms_perspective_rh_zo(fovy, aspect, nearZ, farZ);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
|
|
||||||
return glms_perspective_rh_no(fovy, aspect, nearZ, farZ);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief extend perspective projection matrix's far distance
|
* @brief extend perspective projection matrix's far distance
|
||||||
*
|
*
|
||||||
* NOTE: if you dodn't want to create new matrix then use array api on struct.raw
|
|
||||||
* like glm_persp_move_far(prooj.raw, deltaFar) to avoid create new mat4
|
|
||||||
* each time
|
|
||||||
*
|
|
||||||
* this function does not guarantee far >= near, be aware of that!
|
* this function does not guarantee far >= near, be aware of that!
|
||||||
*
|
*
|
||||||
* @param[in, out] proj projection matrix to extend
|
* @param[in, out] proj projection matrix to extend
|
||||||
* @param[in] deltaFar distance from existing far (negative to shink)
|
* @param[in] deltaFar distance from existing far (negative to shink)
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
mat4s
|
void
|
||||||
glms_persp_move_far(mat4s proj, float deltaFar) {
|
glms_persp_move_far(mat4s proj, float deltaFar) {
|
||||||
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
|
glm_persp_move_far(proj.raw, deltaFar);
|
||||||
return glms_persp_move_far_lh_zo(proj, deltaFar);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
|
|
||||||
return glms_persp_move_far_lh_no(proj, deltaFar);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
|
|
||||||
return glms_persp_move_far_rh_zo(proj, deltaFar);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
|
|
||||||
return glms_persp_move_far_rh_no(proj, deltaFar);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -306,15 +225,9 @@ glms_persp_move_far(mat4s proj, float deltaFar) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
mat4s
|
mat4s
|
||||||
glms_perspective_default(float aspect) {
|
glms_perspective_default(float aspect) {
|
||||||
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
|
mat4s dest;
|
||||||
return glms_perspective_default_lh_zo(aspect);
|
glm_perspective_default(aspect, dest.raw);
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
|
return dest;
|
||||||
return glms_perspective_default_lh_no(aspect);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
|
|
||||||
return glms_perspective_default_rh_zo(aspect);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
|
|
||||||
return glms_perspective_default_rh_no(aspect);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -322,25 +235,13 @@ glms_perspective_default(float aspect) {
|
|||||||
* this makes very easy to resize proj matrix when window /viewport
|
* this makes very easy to resize proj matrix when window /viewport
|
||||||
* reized
|
* reized
|
||||||
*
|
*
|
||||||
* NOTE: if you dodn't want to create new matrix then use array api on struct.raw
|
|
||||||
* like glms_perspective_resize(proj.raw, aspect) to avoid create new mat4
|
|
||||||
* each time
|
|
||||||
*
|
|
||||||
* @param[in, out] proj perspective projection matrix
|
* @param[in, out] proj perspective projection matrix
|
||||||
* @param[in] aspect aspect ratio ( width / height )
|
* @param[in] aspect aspect ratio ( width / height )
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
mat4s
|
void
|
||||||
glms_perspective_resize(mat4s proj, float aspect) {
|
glms_perspective_resize(mat4s proj, float aspect) {
|
||||||
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
|
glm_perspective_resize(aspect, proj.raw);
|
||||||
return glms_perspective_resize_lh_zo(proj, aspect);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
|
|
||||||
return glms_perspective_resize_lh_no(proj, aspect);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
|
|
||||||
return glms_perspective_resize_rh_zo(proj, aspect);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
|
|
||||||
return glms_perspective_resize_rh_no(proj, aspect);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -357,15 +258,9 @@ glms_perspective_resize(mat4s proj, float aspect) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
mat4s
|
mat4s
|
||||||
glms_lookat(vec3s eye, vec3s center, vec3s up) {
|
glms_lookat(vec3s eye, vec3s center, vec3s up) {
|
||||||
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
|
mat4s dest;
|
||||||
return glms_lookat_lh_zo(eye, center, up);
|
glm_lookat(eye.raw, center.raw, up.raw, dest.raw);
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
|
return dest;
|
||||||
return glms_lookat_lh_no(eye, center, up);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
|
|
||||||
return glms_lookat_rh_zo(eye, center, up);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
|
|
||||||
return glms_lookat_rh_no(eye, center, up);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -385,15 +280,9 @@ glms_lookat(vec3s eye, vec3s center, vec3s up) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
mat4s
|
mat4s
|
||||||
glms_look(vec3s eye, vec3s dir, vec3s up) {
|
glms_look(vec3s eye, vec3s dir, vec3s up) {
|
||||||
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
|
mat4s dest;
|
||||||
return glms_look_lh_zo(eye, dir, up);
|
glm_look(eye.raw, dir.raw, up.raw, dest.raw);
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
|
return dest;
|
||||||
return glms_look_lh_no(eye, dir, up);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
|
|
||||||
return glms_look_rh_zo(eye, dir, up);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
|
|
||||||
return glms_look_rh_no(eye, dir, up);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -409,23 +298,17 @@ glms_look(vec3s eye, vec3s dir, vec3s up) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
mat4s
|
mat4s
|
||||||
glms_look_anyup(vec3s eye, vec3s dir) {
|
glms_look_anyup(vec3s eye, vec3s dir) {
|
||||||
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
|
mat4s dest;
|
||||||
return glms_look_anyup_lh_zo(eye, dir);
|
glm_look_anyup(eye.raw, dir.raw, dest.raw);
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
|
return dest;
|
||||||
return glms_look_anyup_lh_no(eye, dir);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
|
|
||||||
return glms_look_anyup_rh_zo(eye, dir);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
|
|
||||||
return glms_look_anyup_rh_no(eye, dir);
|
|
||||||
#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] nearZ near
|
* @param[out] nearVal near
|
||||||
* @param[out] farZ far
|
* @param[out] farVal 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
|
||||||
@@ -434,18 +317,10 @@ glms_look_anyup(vec3s eye, vec3s dir) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glms_persp_decomp(mat4s proj,
|
glms_persp_decomp(mat4s proj,
|
||||||
float * __restrict nearZ, float * __restrict farZ,
|
float * __restrict nearVal, float * __restrict farVal,
|
||||||
float * __restrict top, float * __restrict bottom,
|
float * __restrict top, float * __restrict bottom,
|
||||||
float * __restrict left, float * __restrict right) {
|
float * __restrict left, float * __restrict right) {
|
||||||
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
|
glm_persp_decomp(proj.raw, nearVal, farVal, top, bottom, left, right);
|
||||||
glms_persp_decomp_lh_zo(proj, nearZ, farZ, top, bottom, left, right);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
|
|
||||||
glms_persp_decomp_lh_no(proj, nearZ, farZ, top, bottom, left, right);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
|
|
||||||
glms_persp_decomp_rh_zo(proj, nearZ, farZ, top, bottom, left, right);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
|
|
||||||
glms_persp_decomp_rh_no(proj, nearZ, farZ, top, bottom, left, right);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -458,15 +333,7 @@ glms_persp_decomp(mat4s proj,
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glms_persp_decompv(mat4s proj, float dest[6]) {
|
glms_persp_decompv(mat4s proj, float dest[6]) {
|
||||||
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
|
glm_persp_decompv(proj.raw, dest);
|
||||||
glms_persp_decompv_lh_zo(proj, dest);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
|
|
||||||
glms_persp_decompv_lh_no(proj, dest);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
|
|
||||||
glms_persp_decompv_rh_zo(proj, dest);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
|
|
||||||
glms_persp_decompv_rh_no(proj, dest);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -482,15 +349,7 @@ void
|
|||||||
glms_persp_decomp_x(mat4s proj,
|
glms_persp_decomp_x(mat4s proj,
|
||||||
float * __restrict left,
|
float * __restrict left,
|
||||||
float * __restrict right) {
|
float * __restrict right) {
|
||||||
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
|
glm_persp_decomp_x(proj.raw, left, right);
|
||||||
glms_persp_decomp_x_lh_zo(proj, left, right);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
|
|
||||||
glms_persp_decomp_x_lh_no(proj, left, right);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
|
|
||||||
glms_persp_decomp_x_rh_zo(proj, left, right);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
|
|
||||||
glms_persp_decomp_x_rh_no(proj, left, right);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -506,15 +365,7 @@ void
|
|||||||
glms_persp_decomp_y(mat4s proj,
|
glms_persp_decomp_y(mat4s proj,
|
||||||
float * __restrict top,
|
float * __restrict top,
|
||||||
float * __restrict bottom) {
|
float * __restrict bottom) {
|
||||||
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
|
glm_persp_decomp_y(proj.raw, top, bottom);
|
||||||
glms_persp_decomp_y_lh_zo(proj, top, bottom);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
|
|
||||||
glms_persp_decomp_y_lh_no(proj, top, bottom);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
|
|
||||||
glms_persp_decomp_y_rh_zo(proj, top, bottom);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
|
|
||||||
glms_persp_decomp_y_rh_no(proj, top, bottom);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -522,63 +373,39 @@ glms_persp_decomp_y(mat4s 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] nearZ near
|
* @param[out] nearVal near
|
||||||
* @param[out] farZ far
|
* @param[out] farVal far
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glms_persp_decomp_z(mat4s proj,
|
glms_persp_decomp_z(mat4s proj,
|
||||||
float * __restrict nearZ,
|
float * __restrict nearVal,
|
||||||
float * __restrict farZ) {
|
float * __restrict farVal) {
|
||||||
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
|
glm_persp_decomp_z(proj.raw, nearVal, farVal);
|
||||||
glms_persp_decomp_z_lh_zo(proj, nearZ, farZ);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
|
|
||||||
glms_persp_decomp_z_lh_no(proj, nearZ, farZ);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
|
|
||||||
glms_persp_decomp_z_rh_zo(proj, nearZ, farZ);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
|
|
||||||
glms_persp_decomp_z_rh_no(proj, nearZ, farZ);
|
|
||||||
#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] farZ far
|
* @param[out] farVal far
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glms_persp_decomp_far(mat4s proj, float * __restrict farZ) {
|
glms_persp_decomp_far(mat4s proj, float * __restrict farVal) {
|
||||||
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
|
glm_persp_decomp_far(proj.raw, farVal);
|
||||||
glms_persp_decomp_far_lh_zo(proj, farZ);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
|
|
||||||
glms_persp_decomp_far_lh_no(proj, farZ);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
|
|
||||||
glms_persp_decomp_far_rh_zo(proj, farZ);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
|
|
||||||
glms_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] nearZ near
|
* @param[out] nearVal near
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glms_persp_decomp_near(mat4s proj, float * __restrict nearZ) {
|
glms_persp_decomp_near(mat4s proj, float * __restrict nearVal) {
|
||||||
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
|
glm_persp_decomp_near(proj.raw, nearVal);
|
||||||
glms_persp_decomp_near_lh_zo(proj, nearZ);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
|
|
||||||
glms_persp_decomp_near_lh_no(proj, nearZ);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
|
|
||||||
glms_persp_decomp_near_rh_zo(proj, nearZ);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
|
|
||||||
glms_persp_decomp_near_rh_no(proj, nearZ);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -592,15 +419,7 @@ glms_persp_decomp_near(mat4s proj, float * __restrict nearZ) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
float
|
float
|
||||||
glms_persp_fovy(mat4s proj) {
|
glms_persp_fovy(mat4s proj) {
|
||||||
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
|
return glm_persp_fovy(proj.raw);
|
||||||
return glms_persp_fovy_lh_zo(proj);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
|
|
||||||
return glms_persp_fovy_lh_no(proj);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
|
|
||||||
return glms_persp_fovy_rh_zo(proj);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
|
|
||||||
return glms_persp_fovy_rh_no(proj);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -611,15 +430,7 @@ glms_persp_fovy(mat4s proj) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
float
|
float
|
||||||
glms_persp_aspect(mat4s proj) {
|
glms_persp_aspect(mat4s proj) {
|
||||||
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
|
return glm_persp_aspect(proj.raw);
|
||||||
return glms_persp_aspect_lh_zo(proj);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
|
|
||||||
return glms_persp_aspect_lh_no(proj);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
|
|
||||||
return glms_persp_aspect_rh_zo(proj);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
|
|
||||||
return glms_persp_aspect_rh_no(proj);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -632,15 +443,9 @@ glms_persp_aspect(mat4s proj) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
vec4s
|
vec4s
|
||||||
glms_persp_sizes(mat4s proj, float fovy) {
|
glms_persp_sizes(mat4s proj, float fovy) {
|
||||||
#if CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_ZO
|
vec4s dest;
|
||||||
return glms_persp_sizes_lh_zo(proj, fovy);
|
glm_persp_sizes(proj.raw, fovy, dest.raw);
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_LH_NO
|
return dest;
|
||||||
return glms_persp_sizes_lh_no(proj, fovy);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_ZO
|
|
||||||
return glms_persp_sizes_rh_zo(proj, fovy);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL == CGLM_CLIP_CONTROL_RH_NO
|
|
||||||
return glms_persp_sizes_rh_no(proj, fovy);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* cglms_cam_h */
|
#endif /* cglms_cam_h */
|
||||||
|
|||||||
@@ -1,152 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c), Recep Aslantas.
|
|
||||||
*
|
|
||||||
* MIT License (MIT), htt../opensource.org/licenses/MIT
|
|
||||||
* Full license can be found in the LICENSE file
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
Functions:
|
|
||||||
CGLM_INLINE mat4s glms_ortho_lh_no(float left, float right,
|
|
||||||
float bottom, float top,
|
|
||||||
float nearZ, float farZ)
|
|
||||||
CGLM_INLINE mat4s glms_ortho_aabb_lh_no(vec3s box[2]);
|
|
||||||
CGLM_INLINE mat4s glms_ortho_aabb_p_lh_no(vec3s box[2], float padding);
|
|
||||||
CGLM_INLINE mat4s glms_ortho_aabb_pz_lh_no(vec3s box[2], float padding);
|
|
||||||
CGLM_INLINE mat4s glms_ortho_default_lh_no(float aspect)
|
|
||||||
CGLM_INLINE mat4s glms_ortho_default_s_lh_no(float aspect, float size)
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef cglms_ortho_lh_no_h
|
|
||||||
#define cglms_ortho_lh_no_h
|
|
||||||
|
|
||||||
#include "../../common.h"
|
|
||||||
#include "../../types-struct.h"
|
|
||||||
#include "../../plane.h"
|
|
||||||
#include "../../cam.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
|
|
||||||
* @returns result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
mat4s
|
|
||||||
glms_ortho_lh_no(float left, float right,
|
|
||||||
float bottom, float top,
|
|
||||||
float nearZ, float farZ) {
|
|
||||||
mat4s dest;
|
|
||||||
glm_ortho_lh_no(left, right, bottom, top, nearZ, farZ, dest.raw);
|
|
||||||
return 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
|
|
||||||
* @returns result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
mat4s
|
|
||||||
glms_ortho_aabb_lh_no(vec3s box[2]) {
|
|
||||||
mat4s dest;
|
|
||||||
vec3 rawBox[2];
|
|
||||||
|
|
||||||
glms_vec3_unpack(rawBox, box, 2);
|
|
||||||
glm_ortho_aabb_lh_no(rawBox, dest.raw);
|
|
||||||
|
|
||||||
return 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
|
|
||||||
* @returns result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
mat4s
|
|
||||||
glms_ortho_aabb_p_lh_no(vec3s box[2], float padding) {
|
|
||||||
mat4s dest;
|
|
||||||
vec3 rawBox[2];
|
|
||||||
|
|
||||||
glms_vec3_unpack(rawBox, box, 2);
|
|
||||||
glm_ortho_aabb_p_lh_no(rawBox, padding, dest.raw);
|
|
||||||
|
|
||||||
return 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
|
|
||||||
* @returns result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
mat4s
|
|
||||||
glms_ortho_aabb_pz_lh_no(vec3s box[2], float padding) {
|
|
||||||
mat4s dest;
|
|
||||||
vec3 rawBox[2];
|
|
||||||
|
|
||||||
glms_vec3_unpack(rawBox, box, 2);
|
|
||||||
glm_ortho_aabb_pz_lh_no(rawBox, padding, dest.raw);
|
|
||||||
|
|
||||||
return 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 )
|
|
||||||
* @returns result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
mat4s
|
|
||||||
glms_ortho_default_lh_no(float aspect) {
|
|
||||||
mat4s dest;
|
|
||||||
glm_ortho_default_lh_no(aspect, dest.raw);
|
|
||||||
return 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
|
|
||||||
* @returns result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
mat4s
|
|
||||||
glms_ortho_default_s_lh_no(float aspect, float size) {
|
|
||||||
mat4s dest;
|
|
||||||
glm_ortho_default_s_lh_no(aspect, size, dest.raw);
|
|
||||||
return dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* cglms_ortho_lh_no_h */
|
|
||||||
@@ -1,152 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c), Recep Aslantas.
|
|
||||||
*
|
|
||||||
* MIT License (MIT), htt../opensource.org/licenses/MIT
|
|
||||||
* Full license can be found in the LICENSE file
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
Functions:
|
|
||||||
CGLM_INLINE mat4s glms_ortho_lh_zo(float left, float right,
|
|
||||||
float bottom, float top,
|
|
||||||
float nearZ, float farZ)
|
|
||||||
CGLM_INLINE mat4s glms_ortho_aabb_lh_zo(vec3s box[2]);
|
|
||||||
CGLM_INLINE mat4s glms_ortho_aabb_p_lh_zo(vec3s box[2], float padding);
|
|
||||||
CGLM_INLINE mat4s glms_ortho_aabb_pz_lh_zo(vec3s box[2], float padding);
|
|
||||||
CGLM_INLINE mat4s glms_ortho_default_lh_zo(float aspect)
|
|
||||||
CGLM_INLINE mat4s glms_ortho_default_s_lh_zo(float aspect, float size)
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef cglms_ortho_lh_zo_h
|
|
||||||
#define cglms_ortho_lh_zo_h
|
|
||||||
|
|
||||||
#include "../../common.h"
|
|
||||||
#include "../../types-struct.h"
|
|
||||||
#include "../../plane.h"
|
|
||||||
#include "../../cam.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
|
|
||||||
* @returns result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
mat4s
|
|
||||||
glms_ortho_lh_zo(float left, float right,
|
|
||||||
float bottom, float top,
|
|
||||||
float nearZ, float farZ) {
|
|
||||||
mat4s dest;
|
|
||||||
glm_ortho_lh_zo(left, right, bottom, top, nearZ, farZ, dest.raw);
|
|
||||||
return 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
|
|
||||||
* @returns result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
mat4s
|
|
||||||
glms_ortho_aabb_lh_zo(vec3s box[2]) {
|
|
||||||
mat4s dest;
|
|
||||||
vec3 rawBox[2];
|
|
||||||
|
|
||||||
glms_vec3_unpack(rawBox, box, 2);
|
|
||||||
glm_ortho_aabb_lh_zo(rawBox, dest.raw);
|
|
||||||
|
|
||||||
return 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
|
|
||||||
* @returns result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
mat4s
|
|
||||||
glms_ortho_aabb_p_lh_zo(vec3s box[2], float padding) {
|
|
||||||
mat4s dest;
|
|
||||||
vec3 rawBox[2];
|
|
||||||
|
|
||||||
glms_vec3_unpack(rawBox, box, 2);
|
|
||||||
glm_ortho_aabb_p_lh_zo(rawBox, padding, dest.raw);
|
|
||||||
|
|
||||||
return 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
|
|
||||||
* @returns result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
mat4s
|
|
||||||
glms_ortho_aabb_pz_lh_zo(vec3s box[2], float padding) {
|
|
||||||
mat4s dest;
|
|
||||||
vec3 rawBox[2];
|
|
||||||
|
|
||||||
glms_vec3_unpack(rawBox, box, 2);
|
|
||||||
glm_ortho_aabb_pz_lh_zo(rawBox, padding, dest.raw);
|
|
||||||
|
|
||||||
return 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 )
|
|
||||||
* @returns result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
mat4s
|
|
||||||
glms_ortho_default_lh_zo(float aspect) {
|
|
||||||
mat4s dest;
|
|
||||||
glm_ortho_default_lh_zo(aspect, dest.raw);
|
|
||||||
return 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
|
|
||||||
* @returns result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
mat4s
|
|
||||||
glms_ortho_default_s_lh_zo(float aspect, float size) {
|
|
||||||
mat4s dest;
|
|
||||||
glm_ortho_default_s_lh_zo(aspect, size, dest.raw);
|
|
||||||
return dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* cglms_ortho_lh_zo_h */
|
|
||||||
@@ -1,152 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c), Recep Aslantas.
|
|
||||||
*
|
|
||||||
* MIT License (MIT), htt../opensource.org/licenses/MIT
|
|
||||||
* Full license can be found in the LICENSE file
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
Functions:
|
|
||||||
CGLM_INLINE mat4s glms_ortho_rh_no(float left, float right,
|
|
||||||
float bottom, float top,
|
|
||||||
float nearZ, float farZ)
|
|
||||||
CGLM_INLINE mat4s glms_ortho_aabb_rh_no(vec3s box[2]);
|
|
||||||
CGLM_INLINE mat4s glms_ortho_aabb_p_rh_no(vec3s box[2], float padding);
|
|
||||||
CGLM_INLINE mat4s glms_ortho_aabb_pz_rh_no(vec3s box[2], float padding);
|
|
||||||
CGLM_INLINE mat4s glms_ortho_default_rh_no(float aspect)
|
|
||||||
CGLM_INLINE mat4s glms_ortho_default_s_rh_no(float aspect, float size)
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef cglms_ortho_rh_no_h
|
|
||||||
#define cglms_ortho_rh_no_h
|
|
||||||
|
|
||||||
#include "../../common.h"
|
|
||||||
#include "../../types-struct.h"
|
|
||||||
#include "../../plane.h"
|
|
||||||
#include "../../cam.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
|
|
||||||
* @returns result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
mat4s
|
|
||||||
glms_ortho_rh_no(float left, float right,
|
|
||||||
float bottom, float top,
|
|
||||||
float nearZ, float farZ) {
|
|
||||||
mat4s dest;
|
|
||||||
glm_ortho_rh_no(left, right, bottom, top, nearZ, farZ, dest.raw);
|
|
||||||
return 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
|
|
||||||
* @returns result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
mat4s
|
|
||||||
glms_ortho_aabb_rh_no(vec3s box[2]) {
|
|
||||||
mat4s dest;
|
|
||||||
vec3 rawBox[2];
|
|
||||||
|
|
||||||
glms_vec3_unpack(rawBox, box, 2);
|
|
||||||
glm_ortho_aabb_rh_no(rawBox, dest.raw);
|
|
||||||
|
|
||||||
return 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
|
|
||||||
* @returns result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
mat4s
|
|
||||||
glms_ortho_aabb_p_rh_no(vec3s box[2], float padding) {
|
|
||||||
mat4s dest;
|
|
||||||
vec3 rawBox[2];
|
|
||||||
|
|
||||||
glms_vec3_unpack(rawBox, box, 2);
|
|
||||||
glm_ortho_aabb_p_rh_no(rawBox, padding, dest.raw);
|
|
||||||
|
|
||||||
return 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
|
|
||||||
* @returns result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
mat4s
|
|
||||||
glms_ortho_aabb_pz_rh_no(vec3s box[2], float padding) {
|
|
||||||
mat4s dest;
|
|
||||||
vec3 rawBox[2];
|
|
||||||
|
|
||||||
glms_vec3_unpack(rawBox, box, 2);
|
|
||||||
glm_ortho_aabb_pz_rh_no(rawBox, padding, dest.raw);
|
|
||||||
|
|
||||||
return 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 )
|
|
||||||
* @returns result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
mat4s
|
|
||||||
glms_ortho_default_rh_no(float aspect) {
|
|
||||||
mat4s dest;
|
|
||||||
glm_ortho_default_rh_no(aspect, dest.raw);
|
|
||||||
return 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
|
|
||||||
* @returns result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
mat4s
|
|
||||||
glms_ortho_default_s_rh_no(float aspect, float size) {
|
|
||||||
mat4s dest;
|
|
||||||
glm_ortho_default_s_rh_no(aspect, size, dest.raw);
|
|
||||||
return dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* cglms_ortho_rh_no_h */
|
|
||||||
@@ -1,152 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c), Recep Aslantas.
|
|
||||||
*
|
|
||||||
* MIT License (MIT), htt../opensource.org/licenses/MIT
|
|
||||||
* Full license can be found in the LICENSE file
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
Functions:
|
|
||||||
CGLM_INLINE mat4s glms_ortho_rh_zo(float left, float right,
|
|
||||||
float bottom, float top,
|
|
||||||
float nearZ, float farZ)
|
|
||||||
CGLM_INLINE mat4s glms_ortho_aabb_rh_zo(vec3s box[2]);
|
|
||||||
CGLM_INLINE mat4s glms_ortho_aabb_p_rh_zo(vec3s box[2], float padding);
|
|
||||||
CGLM_INLINE mat4s glms_ortho_aabb_pz_rh_zo(vec3s box[2], float padding);
|
|
||||||
CGLM_INLINE mat4s glms_ortho_default_rh_zo(float aspect)
|
|
||||||
CGLM_INLINE mat4s glms_ortho_default_s_rh_zo(float aspect, float size)
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef cglms_ortho_rh_zo_h
|
|
||||||
#define cglms_ortho_rh_zo_h
|
|
||||||
|
|
||||||
#include "../../common.h"
|
|
||||||
#include "../../types-struct.h"
|
|
||||||
#include "../../plane.h"
|
|
||||||
#include "../../cam.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
|
|
||||||
* @returns result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
mat4s
|
|
||||||
glms_ortho_rh_zo(float left, float right,
|
|
||||||
float bottom, float top,
|
|
||||||
float nearZ, float farZ) {
|
|
||||||
mat4s dest;
|
|
||||||
glm_ortho_rh_zo(left, right, bottom, top, nearZ, farZ, dest.raw);
|
|
||||||
return dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief set up orthographic projection matrix using bounding box
|
|
||||||
* with a right-hand coordinate system and a
|
|
||||||
* clip-space of [0, 1].
|
|
||||||
*
|
|
||||||
* bounding box (AABB) must be in view space
|
|
||||||
*
|
|
||||||
* @param[in] box AABB
|
|
||||||
* @returns result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
mat4s
|
|
||||||
glms_ortho_aabb_rh_zo(vec3s box[2]) {
|
|
||||||
mat4s dest;
|
|
||||||
vec3 rawBox[2];
|
|
||||||
|
|
||||||
glms_vec3_unpack(rawBox, box, 2);
|
|
||||||
glm_ortho_aabb_rh_zo(rawBox, dest.raw);
|
|
||||||
|
|
||||||
return dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief set up orthographic projection matrix using bounding box
|
|
||||||
* with a right-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
|
|
||||||
* @returns result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
mat4s
|
|
||||||
glms_ortho_aabb_p_rh_zo(vec3s box[2], float padding) {
|
|
||||||
mat4s dest;
|
|
||||||
vec3 rawBox[2];
|
|
||||||
|
|
||||||
glms_vec3_unpack(rawBox, box, 2);
|
|
||||||
glm_ortho_aabb_p_rh_zo(rawBox, padding, dest.raw);
|
|
||||||
|
|
||||||
return dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief set up orthographic projection matrix using bounding box
|
|
||||||
* with a right-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
|
|
||||||
* @returns result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
mat4s
|
|
||||||
glms_ortho_aabb_pz_rh_zo(vec3s box[2], float padding) {
|
|
||||||
mat4s dest;
|
|
||||||
vec3 rawBox[2];
|
|
||||||
|
|
||||||
glms_vec3_unpack(rawBox, box, 2);
|
|
||||||
glm_ortho_aabb_pz_rh_zo(rawBox, padding, dest.raw);
|
|
||||||
|
|
||||||
return 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 )
|
|
||||||
* @returns result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
mat4s
|
|
||||||
glms_ortho_default_rh_zo(float aspect) {
|
|
||||||
mat4s dest;
|
|
||||||
glm_ortho_default_rh_zo(aspect, dest.raw);
|
|
||||||
return dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief set up orthographic projection matrix with given CUBE size
|
|
||||||
* with a right-hand coordinate system and a
|
|
||||||
* clip-space of [0, 1].
|
|
||||||
*
|
|
||||||
* @param[in] aspect aspect ratio ( width / height )
|
|
||||||
* @param[in] size cube size
|
|
||||||
* @returns result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
mat4s
|
|
||||||
glms_ortho_default_s_rh_zo(float aspect, float size) {
|
|
||||||
mat4s dest;
|
|
||||||
glm_ortho_default_s_rh_zo(aspect, size, dest.raw);
|
|
||||||
return dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* cglms_ortho_rh_zo_h */
|
|
||||||
@@ -1,311 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c), Recep Aslantas.
|
|
||||||
*
|
|
||||||
* MIT License (MIT), htt../opensource.org/licenses/MIT
|
|
||||||
* Full license can be found in the LICENSE file
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
Functions:
|
|
||||||
CGLM_INLINE mat4s glms_frustum_lh_no(float left, float right,
|
|
||||||
float bottom, float top,
|
|
||||||
float nearZ, float farZ)
|
|
||||||
CGLM_INLINE mat4s glms_perspective_lh_no(float fovy,
|
|
||||||
float aspect,
|
|
||||||
float nearZ,
|
|
||||||
float farZ)
|
|
||||||
CGLM_INLINE void glms_persp_move_far_lh_no(mat4s proj, float deltaFar)
|
|
||||||
CGLM_INLINE mat4s glms_perspective_default_lh_no(float aspect)
|
|
||||||
CGLM_INLINE void glms_perspective_resize_lh_no(mat4s proj, float aspect)
|
|
||||||
CGLM_INLINE void glms_persp_decomp_lh_no(mat4s proj,
|
|
||||||
float *nearv, float *farv,
|
|
||||||
float *top, float *bottom,
|
|
||||||
float *left, float *right)
|
|
||||||
CGLM_INLINE void glms_persp_decompv_lh_no(mat4s proj, float dest[6])
|
|
||||||
CGLM_INLINE void glms_persp_decomp_x_lh_no(mat4s proj, float *left, float *right)
|
|
||||||
CGLM_INLINE void glms_persp_decomp_y_lh_no(mat4s proj, float *top, float *bottom)
|
|
||||||
CGLM_INLINE void glms_persp_decomp_z_lh_no(mat4s proj, float *nearv, float *farv)
|
|
||||||
CGLM_INLINE void glms_persp_decomp_far_lh_no(mat4s proj, float *farZ)
|
|
||||||
CGLM_INLINE void glms_persp_decomp_near_lh_no(mat4s proj, float *nearZ)
|
|
||||||
CGLM_INLINE float glms_persp_fovy_lh_no(mat4s proj)
|
|
||||||
CGLM_INLINE float glms_persp_aspect_lh_no(mat4s proj)
|
|
||||||
CGLM_INLINE vec4s glms_persp_sizes_lh_no(mat4s proj, float fovy)
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef cglms_persp_lh_no_h
|
|
||||||
#define cglms_persp_lh_no_h
|
|
||||||
|
|
||||||
#include "../../common.h"
|
|
||||||
#include "../../types-struct.h"
|
|
||||||
#include "../../plane.h"
|
|
||||||
#include "../../cam.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
|
|
||||||
* @returns result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
mat4s
|
|
||||||
glms_frustum_lh_no(float left, float right,
|
|
||||||
float bottom, float top,
|
|
||||||
float nearZ, float farZ) {
|
|
||||||
mat4s dest;
|
|
||||||
glm_frustum_lh_no(left, right, bottom, top, nearZ, farZ, dest.raw);
|
|
||||||
return dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @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
|
|
||||||
* @returns result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
mat4s
|
|
||||||
glms_perspective_lh_no(float fovy, float aspect, float nearZ, float farZ) {
|
|
||||||
mat4s dest;
|
|
||||||
glm_perspective_lh_no(fovy, aspect, nearZ, farZ, dest.raw);
|
|
||||||
return dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief extend perspective projection matrix's far distance
|
|
||||||
* with a left-hand coordinate system and a
|
|
||||||
* clip-space of [-1, 1].
|
|
||||||
*
|
|
||||||
* NOTE: if you dodn't want to create new matrix then use array api on struct.raw
|
|
||||||
* like glms_persp_move_far_lh_no(prooj.raw, deltaFar) to avoid create new mat4
|
|
||||||
* each time
|
|
||||||
*
|
|
||||||
* 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
|
|
||||||
mat4s
|
|
||||||
glms_persp_move_far_lh_no(mat4s proj, float deltaFar) {
|
|
||||||
mat4s dest;
|
|
||||||
dest = proj;
|
|
||||||
glm_persp_move_far_lh_no(dest.raw, deltaFar);
|
|
||||||
return dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @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 )
|
|
||||||
* @returns result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
mat4s
|
|
||||||
glms_perspective_default_lh_no(float aspect) {
|
|
||||||
mat4s dest;
|
|
||||||
glm_perspective_default_lh_no(aspect, dest.raw);
|
|
||||||
return dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief resize perspective matrix by aspect ratio ( width / height )
|
|
||||||
* this makes very easy to resize proj matrix when window /viewport
|
|
||||||
* reized with a left-hand coordinate system and a
|
|
||||||
* clip-space of [-1, 1].
|
|
||||||
*
|
|
||||||
* NOTE: if you dodn't want to create new matrix then use array api on struct.raw
|
|
||||||
* like glm_perspective_resize_lh_no(proj.raw, aspect) to avoid create new mat4
|
|
||||||
* each time
|
|
||||||
*
|
|
||||||
* @param[in, out] proj perspective projection matrix
|
|
||||||
* @param[in] aspect aspect ratio ( width / height )
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
mat4s
|
|
||||||
glms_perspective_resize_lh_no(mat4s proj, float aspect) {
|
|
||||||
mat4s dest;
|
|
||||||
dest = proj;
|
|
||||||
glm_perspective_resize_lh_no(aspect, dest.raw);
|
|
||||||
return dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @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
|
|
||||||
glms_persp_decomp_lh_no(mat4s proj,
|
|
||||||
float * __restrict nearZ, float * __restrict farZ,
|
|
||||||
float * __restrict top, float * __restrict bottom,
|
|
||||||
float * __restrict left, float * __restrict right) {
|
|
||||||
glm_persp_decomp_lh_no(proj.raw, nearZ, farZ, top, bottom, left, right);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief decomposes frustum values of perspective projection.
|
|
||||||
* this makes easy to get all values at once
|
|
||||||
* with a left-hand coordinate system and a
|
|
||||||
* clip-space of [-1, 1].
|
|
||||||
*
|
|
||||||
* @param[in] proj perspective projection matrix
|
|
||||||
* @param[out] dest array
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glms_persp_decompv_lh_no(mat4s proj, float dest[6]) {
|
|
||||||
glm_persp_decompv_lh_no(proj.raw, dest);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @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
|
|
||||||
glms_persp_decomp_x_lh_no(mat4s proj,
|
|
||||||
float * __restrict left,
|
|
||||||
float * __restrict right) {
|
|
||||||
glm_persp_decomp_x_lh_no(proj.raw, left, right);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @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
|
|
||||||
glms_persp_decomp_y_lh_no(mat4s proj,
|
|
||||||
float * __restrict top,
|
|
||||||
float * __restrict bottom) {
|
|
||||||
glm_persp_decomp_y_lh_no(proj.raw, top, bottom);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @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
|
|
||||||
glms_persp_decomp_z_lh_no(mat4s proj,
|
|
||||||
float * __restrict nearZ,
|
|
||||||
float * __restrict farZ) {
|
|
||||||
glm_persp_decomp_z_lh_no(proj.raw, nearZ, farZ);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @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
|
|
||||||
glms_persp_decomp_far_lh_no(mat4s proj, float * __restrict farZ) {
|
|
||||||
glm_persp_decomp_far_lh_no(proj.raw, farZ);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @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
|
|
||||||
glms_persp_decomp_near_lh_no(mat4s proj, float * __restrict nearZ) {
|
|
||||||
glm_persp_decomp_near_lh_no(proj.raw, nearZ);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @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
|
|
||||||
glms_persp_fovy_lh_no(mat4s proj) {
|
|
||||||
return glm_persp_fovy_lh_no(proj.raw);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @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
|
|
||||||
glms_persp_aspect_lh_no(mat4s proj) {
|
|
||||||
return glm_persp_aspect_lh_no(proj.raw);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @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)
|
|
||||||
* @returns sizes as vector, sizes order: [Wnear, Hnear, Wfar, Hfar]
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
vec4s
|
|
||||||
glms_persp_sizes_lh_no(mat4s proj, float fovy) {
|
|
||||||
vec4s dest;
|
|
||||||
glm_persp_sizes_lh_no(proj.raw, fovy, dest.raw);
|
|
||||||
return dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* cglms_persp_lh_no_h */
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user