mirror of
https://github.com/recp/cglm.git
synced 2026-02-17 03:39:05 +00:00
Compare commits
4 Commits
ivec
...
flt-epsilo
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6626d2b74f | ||
|
|
5bda762df6 | ||
|
|
f9824a8dc6 | ||
|
|
ccd3058adc |
3
.gitignore
vendored
3
.gitignore
vendored
@@ -76,6 +76,3 @@ build/
|
|||||||
conftest.dir/*
|
conftest.dir/*
|
||||||
confdefs.h
|
confdefs.h
|
||||||
*.xcuserdatad
|
*.xcuserdatad
|
||||||
.idea
|
|
||||||
cmake-build-debug
|
|
||||||
*.o.tmp
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
cmake_minimum_required(VERSION 3.8.2)
|
cmake_minimum_required(VERSION 3.8.2)
|
||||||
project(cglm VERSION 0.8.5 LANGUAGES C)
|
project(cglm VERSION 0.8.0 LANGUAGES C)
|
||||||
|
|
||||||
set(CMAKE_C_STANDARD 11)
|
set(CMAKE_C_STANDARD 11)
|
||||||
set(CMAKE_C_STANDARD_REQUIRED YES)
|
set(CMAKE_C_STANDARD_REQUIRED YES)
|
||||||
@@ -18,7 +18,7 @@ else(CGLM_STATIC)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(CGLM_USE_C99)
|
if(CGLM_USE_C99)
|
||||||
set(CMAKE_C_STANDARD 99)
|
set(C_STANDARD 99)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(MSVC)
|
if(MSVC)
|
||||||
@@ -47,10 +47,7 @@ include(GNUInstallDirs)
|
|||||||
|
|
||||||
set(CPACK_PROJECT_NAME ${PROJECT_NAME})
|
set(CPACK_PROJECT_NAME ${PROJECT_NAME})
|
||||||
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
|
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
|
||||||
|
|
||||||
if(NOT CPack_CMake_INCLUDED)
|
|
||||||
include(CPack)
|
include(CPack)
|
||||||
endif()
|
|
||||||
|
|
||||||
# Target Start
|
# Target Start
|
||||||
add_library(${PROJECT_NAME}
|
add_library(${PROJECT_NAME}
|
||||||
@@ -76,18 +73,6 @@ add_library(${PROJECT_NAME}
|
|||||||
src/bezier.c
|
src/bezier.c
|
||||||
src/ray.c
|
src/ray.c
|
||||||
src/affine2d.c
|
src/affine2d.c
|
||||||
src/clipspace/persp_lh_zo.c
|
|
||||||
src/clipspace/persp_rh_zo.c
|
|
||||||
src/clipspace/persp_lh_no.c
|
|
||||||
src/clipspace/persp_rh_no.c
|
|
||||||
src/clipspace/ortho_lh_zo.c
|
|
||||||
src/clipspace/ortho_rh_zo.c
|
|
||||||
src/clipspace/ortho_lh_no.c
|
|
||||||
src/clipspace/ortho_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)
|
if(CGLM_SHARED)
|
||||||
@@ -100,12 +85,6 @@ set_target_properties(${PROJECT_NAME} PROPERTIES
|
|||||||
VERSION ${PROJECT_VERSION}
|
VERSION ${PROJECT_VERSION}
|
||||||
SOVERSION ${PROJECT_VERSION_MAJOR})
|
SOVERSION ${PROJECT_VERSION_MAJOR})
|
||||||
|
|
||||||
if(WIN32)
|
|
||||||
# Because SOVERSION has no effect to file naming on Windows
|
|
||||||
set_target_properties(${PROJECT_NAME} PROPERTIES
|
|
||||||
RUNTIME_OUTPUT_NAME ${PROJECT_NAME}-${PROJECT_VERSION_MAJOR})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
target_include_directories(${PROJECT_NAME}
|
target_include_directories(${PROJECT_NAME}
|
||||||
PUBLIC
|
PUBLIC
|
||||||
$<INSTALL_INTERFACE:include>
|
$<INSTALL_INTERFACE:include>
|
||||||
@@ -114,11 +93,6 @@ target_include_directories(${PROJECT_NAME}
|
|||||||
${CMAKE_CURRENT_SOURCE_DIR}/src
|
${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
|
# Test Configuration
|
||||||
if(CGLM_USE_TEST)
|
if(CGLM_USE_TEST)
|
||||||
include(CTest)
|
include(CTest)
|
||||||
@@ -131,7 +105,7 @@ install(TARGETS ${PROJECT_NAME}
|
|||||||
EXPORT ${PROJECT_NAME}
|
EXPORT ${PROJECT_NAME}
|
||||||
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||||
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||||
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
|
RUNTIME DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
||||||
|
|
||||||
install(DIRECTORY include/${PROJECT_NAME} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
|
install(DIRECTORY include/${PROJECT_NAME} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
|
||||||
PATTERN ".*" EXCLUDE)
|
PATTERN ".*" EXCLUDE)
|
||||||
@@ -143,17 +117,6 @@ export(TARGETS ${PROJECT_NAME}
|
|||||||
)
|
)
|
||||||
|
|
||||||
install(EXPORT ${PROJECT_NAME}
|
install(EXPORT ${PROJECT_NAME}
|
||||||
FILE "${PROJECT_NAME}Config.cmake"
|
|
||||||
NAMESPACE ${PROJECT_NAME}::
|
NAMESPACE ${PROJECT_NAME}::
|
||||||
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME})
|
DESTINATION ${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME}/cmake)
|
||||||
|
|
||||||
set(PACKAGE_NAME ${PROJECT_NAME})
|
|
||||||
set(prefix ${CMAKE_INSTALL_PREFIX})
|
|
||||||
set(exec_prefix ${CMAKE_INSTALL_PREFIX})
|
|
||||||
set(includedir "\${prefix}/${CMAKE_INSTALL_INCLUDEDIR}")
|
|
||||||
set(libdir "\${prefix}/${CMAKE_INSTALL_LIBDIR}")
|
|
||||||
set(PACKAGE_VERSION "${PROJECT_VERSION}")
|
|
||||||
configure_file(${CMAKE_CURRENT_LIST_DIR}/cglm.pc.in ${CMAKE_BINARY_DIR}/cglm.pc @ONLY)
|
|
||||||
|
|
||||||
install(FILES ${CMAKE_BINARY_DIR}/cglm.pc
|
|
||||||
DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
|
|
||||||
|
|||||||
8
CREDITS
8
CREDITS
@@ -74,11 +74,3 @@ Link to paper: http://webserver2.tecgraf.puc-rio.br/~mgattass/cg/trbRR/Fast%20Mi
|
|||||||
|
|
||||||
14. ARM NEON: Matrix Vector Multiplication
|
14. ARM NEON: Matrix Vector Multiplication
|
||||||
https://stackoverflow.com/a/57793352/2676533
|
https://stackoverflow.com/a/57793352/2676533
|
||||||
|
|
||||||
16. ARM NEON Div
|
|
||||||
|
|
||||||
http://github.com/microsoft/DirectXMath
|
|
||||||
|
|
||||||
17. Pick Matrix
|
|
||||||
|
|
||||||
glu project -> project.c
|
|
||||||
|
|||||||
74
Makefile.am
74
Makefile.am
@@ -69,25 +69,6 @@ cglm_HEADERS = include/cglm/version.h \
|
|||||||
include/cglm/ray.h \
|
include/cglm/ray.h \
|
||||||
include/cglm/affine2d.h
|
include/cglm/affine2d.h
|
||||||
|
|
||||||
cglm_clipspacedir=$(includedir)/cglm/clipspace
|
|
||||||
cglm_clipspace_HEADERS = include/cglm/clipspace/persp.h \
|
|
||||||
include/cglm/clipspace/persp_lh_zo.h \
|
|
||||||
include/cglm/clipspace/persp_rh_zo.h \
|
|
||||||
include/cglm/clipspace/persp_lh_no.h \
|
|
||||||
include/cglm/clipspace/persp_rh_no.h \
|
|
||||||
include/cglm/clipspace/ortho_lh_zo.h \
|
|
||||||
include/cglm/clipspace/ortho_rh_zo.h \
|
|
||||||
include/cglm/clipspace/ortho_lh_no.h \
|
|
||||||
include/cglm/clipspace/ortho_rh_no.h \
|
|
||||||
include/cglm/clipspace/view_lh.h \
|
|
||||||
include/cglm/clipspace/view_rh.h \
|
|
||||||
include/cglm/clipspace/view_lh_zo.h \
|
|
||||||
include/cglm/clipspace/view_rh_zo.h \
|
|
||||||
include/cglm/clipspace/view_lh_no.h \
|
|
||||||
include/cglm/clipspace/view_rh_no.h \
|
|
||||||
include/cglm/clipspace/project_zo.h \
|
|
||||||
include/cglm/clipspace/project_no.h
|
|
||||||
|
|
||||||
cglm_calldir=$(includedir)/cglm/call
|
cglm_calldir=$(includedir)/cglm/call
|
||||||
cglm_call_HEADERS = include/cglm/call/mat4.h \
|
cglm_call_HEADERS = include/cglm/call/mat4.h \
|
||||||
include/cglm/call/mat3.h \
|
include/cglm/call/mat3.h \
|
||||||
@@ -111,22 +92,6 @@ cglm_call_HEADERS = include/cglm/call/mat4.h \
|
|||||||
include/cglm/call/ray.h \
|
include/cglm/call/ray.h \
|
||||||
include/cglm/call/affine2d.h
|
include/cglm/call/affine2d.h
|
||||||
|
|
||||||
cglm_call_clipspacedir=$(includedir)/cglm/call/clipspace
|
|
||||||
cglm_call_clipspace_HEADERS = include/cglm/call/clipspace/persp_lh_zo.h \
|
|
||||||
include/cglm/call/clipspace/persp_rh_zo.h \
|
|
||||||
include/cglm/call/clipspace/persp_lh_no.h \
|
|
||||||
include/cglm/call/clipspace/persp_rh_no.h \
|
|
||||||
include/cglm/call/clipspace/ortho_lh_zo.h \
|
|
||||||
include/cglm/call/clipspace/ortho_rh_zo.h \
|
|
||||||
include/cglm/call/clipspace/ortho_lh_no.h \
|
|
||||||
include/cglm/call/clipspace/ortho_rh_no.h \
|
|
||||||
include/cglm/call/clipspace/view_lh_zo.h \
|
|
||||||
include/cglm/call/clipspace/view_rh_zo.h \
|
|
||||||
include/cglm/call/clipspace/view_lh_no.h \
|
|
||||||
include/cglm/call/clipspace/view_rh_no.h \
|
|
||||||
include/cglm/call/clipspace/project_no.h \
|
|
||||||
include/cglm/call/clipspace/project_zo.h
|
|
||||||
|
|
||||||
cglm_simddir=$(includedir)/cglm/simd
|
cglm_simddir=$(includedir)/cglm/simd
|
||||||
cglm_simd_HEADERS = include/cglm/simd/intrin.h \
|
cglm_simd_HEADERS = include/cglm/simd/intrin.h \
|
||||||
include/cglm/simd/x86.h \
|
include/cglm/simd/x86.h \
|
||||||
@@ -144,10 +109,7 @@ 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 \
|
||||||
@@ -173,20 +135,6 @@ cglm_struct_HEADERS = include/cglm/struct/mat4.h \
|
|||||||
include/cglm/struct/curve.h \
|
include/cglm/struct/curve.h \
|
||||||
include/cglm/struct/affine2d.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 \
|
||||||
src/affine.c \
|
src/affine.c \
|
||||||
@@ -208,31 +156,13 @@ libcglm_la_SOURCES=\
|
|||||||
src/curve.c \
|
src/curve.c \
|
||||||
src/bezier.c \
|
src/bezier.c \
|
||||||
src/ray.c \
|
src/ray.c \
|
||||||
src/affine2d.c \
|
src/affine2d.c
|
||||||
src/clipspace/ortho_lh_no.c \
|
|
||||||
src/clipspace/ortho_lh_zo.c \
|
|
||||||
src/clipspace/ortho_rh_no.c \
|
|
||||||
src/clipspace/ortho_rh_zo.c \
|
|
||||||
src/clipspace/persp_lh_no.c \
|
|
||||||
src/clipspace/persp_lh_zo.c \
|
|
||||||
src/clipspace/persp_rh_no.c \
|
|
||||||
src/clipspace/persp_rh_zo.c \
|
|
||||||
src/clipspace/view_lh_no.c \
|
|
||||||
src/clipspace/view_lh_zo.c \
|
|
||||||
src/clipspace/view_rh_no.c \
|
|
||||||
src/clipspace/view_rh_zo.c \
|
|
||||||
src/clipspace/project_no.c \
|
|
||||||
src/clipspace/project_zo.c
|
|
||||||
|
|
||||||
test_tests_SOURCES=\
|
test_tests_SOURCES=\
|
||||||
test/runner.c \
|
test/runner.c \
|
||||||
test/src/test_common.c \
|
test/src/test_common.c \
|
||||||
test/src/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 \
|
||||||
|
|||||||
104
README.md
104
README.md
@@ -1,59 +1,19 @@
|
|||||||
# 🎥 OpenGL Mathematics (glm) for `C`
|
# 🎥 OpenGL Mathematics (glm) for `C`
|
||||||
|
[](https://travis-ci.org/recp/cglm)
|
||||||
|
[](https://ci.appveyor.com/project/recp/cglm/branch/master)
|
||||||
|
[](http://cglm.readthedocs.io/en/latest/?badge=latest)
|
||||||
|
[](https://coveralls.io/github/recp/cglm?branch=master)
|
||||||
|
[](https://codecov.io/gh/recp/cglm)
|
||||||
|
[](https://www.codacy.com/app/recp/cglm?utm_source=github.com&utm_medium=referral&utm_content=recp/cglm&utm_campaign=Badge_Grade)
|
||||||
|
[](#backers)
|
||||||
|
[](#sponsors)
|
||||||
|
|
||||||
<p align="center">
|
#### Documentation
|
||||||
<img alt="" src="cglm.png" width="550" />
|
|
||||||
</p>
|
|
||||||
<br>
|
|
||||||
<p align="center">
|
|
||||||
<a href="https://travis-ci.com/recp/cglm">
|
|
||||||
<img src="https://travis-ci.com/recp/cglm.svg?branch=master"
|
|
||||||
alt="Build Status">
|
|
||||||
</a>
|
|
||||||
<a href="https://ci.appveyor.com/project/recp/cglm/branch/master">
|
|
||||||
<img src="https://ci.appveyor.com/api/projects/status/av7l3gc0yhfex8y4/branch/master?svg=true"
|
|
||||||
alt="Windows Build Status">
|
|
||||||
</a>
|
|
||||||
<a href="http://cglm.readthedocs.io/en/latest/?badge=latest">
|
|
||||||
<img src="https://readthedocs.org/projects/cglm/badge/?version=latest"
|
|
||||||
alt="Documentation Status">
|
|
||||||
</a>
|
|
||||||
<a href="https://www.codacy.com/app/recp/cglm?utm_source=github.com&utm_medium=referral&utm_content=recp/cglm&utm_campaign=Badge_Grade">
|
|
||||||
<img src="https://api.codacy.com/project/badge/Grade/6a62b37d5f214f178ebef269dc4a6bf1"
|
|
||||||
alt="Codacy Badge"/>
|
|
||||||
</a>
|
|
||||||
<a href="https://coveralls.io/github/recp/cglm?branch=master">
|
|
||||||
<img src="https://coveralls.io/repos/github/recp/cglm/badge.svg?branch=master"
|
|
||||||
alt="Coverage Status"/>
|
|
||||||
</a>
|
|
||||||
<a href="https://codecov.io/gh/recp/cglm">
|
|
||||||
<img src="https://codecov.io/gh/recp/cglm/branch/master/graph/badge.svg"
|
|
||||||
alt="Coverage Status"/>
|
|
||||||
</a>
|
|
||||||
<br /><br />
|
|
||||||
<a href="#sponsors">
|
|
||||||
<img src="https://opencollective.com/cglm/sponsors/badge.svg"
|
|
||||||
alt="Sponsors on Open Collective"/>
|
|
||||||
</a>
|
|
||||||
<a href="#backers">
|
|
||||||
<img src="https://opencollective.com/cglm/backers/badge.svg"
|
|
||||||
alt="Backers on Open Collective"/>
|
|
||||||
</a>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<br>
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
Highly optimized 2D|3D math library, also known as <b>OpenGL Mathematics (glm) for `C`</b>. <b>cglm</b> provides lot of utils to help math operations to be fast and quick to write. It is community friendly, feel free to bring any issues, bugs you faced.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
#### 📚 Documentation
|
|
||||||
|
|
||||||
Almost all functions (inline versions) and parameters are documented inside the corresponding headers. <br />
|
Almost all functions (inline versions) and parameters are documented inside the corresponding headers. <br />
|
||||||
Complete documentation: http://cglm.readthedocs.io
|
Complete documentation: http://cglm.readthedocs.io
|
||||||
|
|
||||||
#### 📌 Note for previous versions:
|
#### Note for previous versions:
|
||||||
|
|
||||||
- _dup (duplicate) is changed to _copy. For instance `glm_vec_dup -> glm_vec3_copy`
|
- _dup (duplicate) is changed to _copy. For instance `glm_vec_dup -> glm_vec3_copy`
|
||||||
- OpenGL related functions are dropped to make this lib platform/third-party independent
|
- OpenGL related functions are dropped to make this lib platform/third-party independent
|
||||||
@@ -66,29 +26,31 @@ you have the latest version
|
|||||||
- **[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.7.3, inline print functions are disabled in release/production mode to eliminate print costs (see options in documentation). Print output also improved. You can disable colors if you need (see documentation)
|
||||||
- **[major change]** by starting v0.8.3, **cglm** supports alternative clipspace configuations e.g. Left Handed, Zero-to-One (_zo)... `CGLM_FORCE_DEPTH_ZERO_TO_ONE` and `CGLM_FORCE_LEFT_HANDED` is provided to control clipspace. You should be able to use **cglm** with Vulkan, DirectX and Metal now... see https://cglm.readthedocs.io/en/latest/opt.html#clipspace-option-s
|
|
||||||
|
|
||||||
#### 📌 Note for C++ developers:
|
#### Note for C++ developers:
|
||||||
If you are not aware of the original GLM library yet, you may also want to look at:
|
If you are not aware of the original GLM library yet, you may also want to look at:
|
||||||
https://github.com/g-truc/glm
|
https://github.com/g-truc/glm
|
||||||
|
|
||||||
#### 📌 Note for new comers (Important):
|
#### Note for new comers (Important):
|
||||||
- `vec4` and `mat4` variables must be aligned. (There will be unaligned versions later)
|
- `vec4` and `mat4` variables must be aligned. (There will be unaligned versions later)
|
||||||
- **in** and **[in, out]** parameters must be initialized (please). But **[out]** parameters not, initializing out param is also redundant
|
- **in** and **[in, out]** parameters must be initialized (please). But **[out]** parameters not, initializing out param is also redundant
|
||||||
- All functions are inline if you don't want to use pre-compiled versions with glmc_ prefix, you can ignore build process. Just include headers.
|
- All functions are inline if you don't want to use pre-compiled versions with glmc_ prefix, you can ignore build process. Just include headers.
|
||||||
- if your debugger takes you to cglm headers then make sure you are not trying to copy vec4 to vec3 or alig issues...
|
- if your debugger takes you to cglm headers then make sure you are not trying to copy vec4 to vec3 or alig issues...
|
||||||
- Welcome!
|
- Welcome!
|
||||||
|
|
||||||
#### 📌 Note for experienced developers:
|
#### Note for experienced developers:
|
||||||
- Since I'm testing this library in my projects, sometimes bugs occurs; finding that bug[s] and making improvements would be more easy with multiple developer/contributor and their projects or knowledge. Consider to make some tests if you suspect something is wrong and any feedbacks, contributions and bug reports are always welcome.
|
- Since I'm testing this library in my projects, sometimes bugs occurs; finding that bug[s] and making improvements would be more easy with multiple developer/contributor and their projects or knowledge. Consider to make some tests if you suspect something is wrong and any feedbacks, contributions and bug reports are always welcome.
|
||||||
|
|
||||||
#### 📌 Allocations?
|
#### Allocations?
|
||||||
`cglm` doesn't alloc any memory on heap. So it doesn't provide any allocator. You should alloc memory for **out** parameters too if you pass pointer of memory location. Don't forget that **vec4** (also quat/**versor**) and **mat4** must be aligned (16-bytes), because *cglm* uses SIMD instructions to optimize most operations if available.
|
`cglm` doesn't alloc any memory on heap. So it doesn't provide any allocator. You should alloc memory for **out** parameters too if you pass pointer of memory location. Don't forget that **vec4** (also quat/**versor**) and **mat4** must be aligned (16-bytes), because *cglm* uses SIMD instructions to optimize most operations if available.
|
||||||
|
|
||||||
#### 📌 Returning vector or matrix... ?
|
#### Returning vector or matrix... ?
|
||||||
|
|
||||||
**cglm** supports both *ARRAY API* and *STRUCT API*, so you can return structs if you utilize struct api (`glms_`).
|
**cglm** supports both *ARRAY API* and *STRUCT API*, so you can return structs if you utilize struct api (`glms_`).
|
||||||
|
|
||||||
|
#### Other APIs like Vulkan, Metal, Dx?
|
||||||
|
Currently *cglm* uses default clip space configuration (-1, 1) for camera functions (perspective, extract corners...), in the future other clip space configurations will be supported
|
||||||
|
|
||||||
<hr/>
|
<hr/>
|
||||||
|
|
||||||
<table>
|
<table>
|
||||||
@@ -106,9 +68,7 @@ https://github.com/g-truc/glm
|
|||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
## 🚀 Features
|
## Features
|
||||||
- **scalar** and **simd** (sse, avx, neon...) optimizations
|
|
||||||
- option to use different clipspaces e.g. Left Handed, Zero-to-One... (currrently right handed negative-one is default)
|
|
||||||
- array api and struct api, you can use arrays or structs.
|
- array api and struct api, you can use arrays or structs.
|
||||||
- general purpose matrix operations (mat4, mat3)
|
- general purpose matrix operations (mat4, mat3)
|
||||||
- chain matrix multiplication (square only)
|
- chain matrix multiplication (square only)
|
||||||
@@ -135,9 +95,9 @@ https://github.com/g-truc/glm
|
|||||||
|
|
||||||
<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 */
|
||||||
@@ -188,7 +148,7 @@ Struct functions generally take their parameters as *values* and *return* their
|
|||||||
|
|
||||||
The types used are actually unions that allow access to the same data multiple ways. One of those ways involves anonymous structures, available since C11. MSVC also supports it for earlier C versions out of the box and GCC/Clang do if you enable `-fms-extensions`. To explicitly enable these anonymous structures, `#define CGLM_USE_ANONYMOUS_STRUCT` to `1`, to disable them, to `0`. For backward compatibility, you can also `#define CGLM_NO_ANONYMOUS_STRUCT` (value is irrelevant) to disable them. If you don't specify explicitly, cglm will do a best guess based on your compiler and the C version you're using.
|
The types used are actually unions that allow access to the same data multiple ways. One of those ways involves anonymous structures, available since C11. MSVC also supports it for earlier C versions out of the box and GCC/Clang do if you enable `-fms-extensions`. To explicitly enable these anonymous structures, `#define CGLM_USE_ANONYMOUS_STRUCT` to `1`, to disable them, to `0`. For backward compatibility, you can also `#define CGLM_NO_ANONYMOUS_STRUCT` (value is irrelevant) to disable them. If you don't specify explicitly, cglm will do a best guess based on your compiler and the C version you're using.
|
||||||
|
|
||||||
## 🔨 Build
|
## Build
|
||||||
|
|
||||||
### CMake (All platforms)
|
### CMake (All platforms)
|
||||||
```bash
|
```bash
|
||||||
@@ -208,24 +168,6 @@ option(CGLM_USE_C99 "" OFF) # C11
|
|||||||
option(CGLM_USE_TEST "Enable Tests" OFF) # for make check - make test
|
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
|
#### Use with your CMake project
|
||||||
* Example:
|
* Example:
|
||||||
```cmake
|
```cmake
|
||||||
@@ -440,7 +382,7 @@ You can pass matrices the same way to other APIs e.g. Vulkan, DX...
|
|||||||
- [x] Add version info
|
- [x] Add version info
|
||||||
- [ ] Unaligned operations (e.g. `glm_umat4_mul`)
|
- [ ] Unaligned operations (e.g. `glm_umat4_mul`)
|
||||||
- [x] Extra documentation
|
- [x] Extra documentation
|
||||||
- [x] ARM Neon Arch
|
- [ ] ARM Neon Arch (In Progress)
|
||||||
|
|
||||||
|
|
||||||
## Contributors
|
## Contributors
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ Pod::Spec.new do |s|
|
|||||||
|
|
||||||
# Description
|
# Description
|
||||||
s.name = "cglm"
|
s.name = "cglm"
|
||||||
s.version = "0.8.4"
|
s.version = "0.7.9"
|
||||||
s.summary = "📽 Highly Optimized Graphics Math (glm) for C"
|
s.summary = "📽 Highly Optimized Graphics Math (glm) for C"
|
||||||
s.description = <<-DESC
|
s.description = <<-DESC
|
||||||
cglm is math library for graphics programming for C. See the documentation or README for all features.
|
cglm is math library for graphics programming for C. See the documentation or README for all features.
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
#*****************************************************************************
|
#*****************************************************************************
|
||||||
|
|
||||||
AC_PREREQ([2.69])
|
AC_PREREQ([2.69])
|
||||||
AC_INIT([cglm], [0.8.5], [info@recp.me])
|
AC_INIT([cglm], [0.8.0], [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.
|
||||||
|
|||||||
@@ -32,22 +32,6 @@ If you don't want to install **cglm** to your system's folder you can get static
|
|||||||
option(CGLM_USE_C99 "" OFF) # C11
|
option(CGLM_USE_C99 "" OFF) # C11
|
||||||
option(CGLM_USE_TEST "Enable Tests" OFF) # for make check - make test
|
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**
|
**Use with your CMake project example**
|
||||||
|
|
||||||
.. code-block:: CMake
|
.. code-block:: CMake
|
||||||
|
|||||||
@@ -140,7 +140,7 @@ Functions documentation
|
|||||||
| set up perspective projection matrix
|
| set up perspective projection matrix
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **fovy** field of view angle (in radians)
|
| *[in]* **fovy** field of view angle
|
||||||
| *[in]* **aspect** aspect ratio ( width / height )
|
| *[in]* **aspect** aspect ratio ( width / height )
|
||||||
| *[in]* **nearVal** near clipping plane
|
| *[in]* **nearVal** near clipping plane
|
||||||
| *[in]* **farVal** far clipping planes
|
| *[in]* **farVal** far clipping planes
|
||||||
|
|||||||
@@ -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.5'
|
version = u'0.8.0'
|
||||||
# The full version, including alpha/beta/rc tags.
|
# The full version, including alpha/beta/rc tags.
|
||||||
release = u'0.8.5'
|
release = u'0.8.0'
|
||||||
|
|
||||||
# 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.
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
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)
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -32,7 +32,6 @@ Functions:
|
|||||||
#. :c:func:`glm_quat`
|
#. :c:func:`glm_quat`
|
||||||
#. :c:func:`glm_quatv`
|
#. :c:func:`glm_quatv`
|
||||||
#. :c:func:`glm_quat_copy`
|
#. :c:func:`glm_quat_copy`
|
||||||
#. :c:func:`glm_quat_from_vecs`
|
|
||||||
#. :c:func:`glm_quat_norm`
|
#. :c:func:`glm_quat_norm`
|
||||||
#. :c:func:`glm_quat_normalize`
|
#. :c:func:`glm_quat_normalize`
|
||||||
#. :c:func:`glm_quat_normalize_to`
|
#. :c:func:`glm_quat_normalize_to`
|
||||||
@@ -53,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`
|
||||||
@@ -124,20 +122,6 @@ Functions documentation
|
|||||||
| *[in]* **q** source quaternion
|
| *[in]* **q** source quaternion
|
||||||
| *[out]* **dest** destination quaternion
|
| *[out]* **dest** destination quaternion
|
||||||
|
|
||||||
.. c:function:: void glm_quat_from_vecs(vec3 a, vec3 b, versor dest)
|
|
||||||
|
|
||||||
| compute unit quaternion needed to rotate a into b
|
|
||||||
|
|
||||||
References:
|
|
||||||
* `Finding quaternion representing the rotation from one vector to another <https://stackoverflow.com/a/11741520/183120>`_
|
|
||||||
* `Quaternion from two vectors <http://lolengine.net/blog/2014/02/24/quaternion-from-two-vectors-final>`_
|
|
||||||
* `Angle between vectors <http://www.euclideanspace.com/maths/algebra/vectors/angleBetween/minorlogic.htm>`_
|
|
||||||
|
|
||||||
Parameters:
|
|
||||||
| *[in]* **a** unit vector
|
|
||||||
| *[in]* **b** unit vector
|
|
||||||
| *[in]* **dest** unit quaternion
|
|
||||||
|
|
||||||
.. c:function:: float glm_quat_norm(versor q)
|
.. c:function:: float glm_quat_norm(versor q)
|
||||||
|
|
||||||
| returns norm (magnitude) of quaternion
|
| returns norm (magnitude) of quaternion
|
||||||
@@ -320,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
|
||||||
|
|||||||
@@ -474,9 +474,6 @@ Functions documentation
|
|||||||
|
|
||||||
possible orthogonal/perpendicular vector
|
possible orthogonal/perpendicular vector
|
||||||
|
|
||||||
References:
|
|
||||||
* `On picking an orthogonal vector (and combing coconuts) <http://lolengine.net/blog/2013/09/21/picking-orthogonal-vector-combing-coconuts>`_
|
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
| *[in]* **v** vector
|
| *[in]* **v** vector
|
||||||
| *[out]* **dest** orthogonal/perpendicular vector
|
| *[out]* **dest** orthogonal/perpendicular vector
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -50,22 +50,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 +99,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 +121,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 +143,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);
|
||||||
@@ -409,7 +425,7 @@ bool
|
|||||||
glm_uniscaled(mat4 m) {
|
glm_uniscaled(mat4 m) {
|
||||||
CGLM_ALIGN(8) vec3 s;
|
CGLM_ALIGN(8) vec3 s;
|
||||||
glm_decompose_scalev(m, s);
|
glm_decompose_scalev(m, s);
|
||||||
return glm_vec3_eq_all(s);
|
return glm_vec3_eq_eps(s, s[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -439,7 +455,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);
|
||||||
|
|||||||
@@ -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]);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,16 +15,22 @@ 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,
|
||||||
|
float top,
|
||||||
|
float nearVal,
|
||||||
|
float farVal,
|
||||||
mat4 dest);
|
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,
|
||||||
|
float top,
|
||||||
|
float nearVal,
|
||||||
|
float farVal,
|
||||||
mat4 dest);
|
mat4 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
@@ -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,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_project_no_h
|
|
||||||
#define cglmc_project_no_h
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "../../cglm.h"
|
|
||||||
|
|
||||||
CGLM_EXPORT
|
|
||||||
void
|
|
||||||
glmc_unprojecti_no(vec3 pos, mat4 invMat, vec4 vp, vec3 dest);
|
|
||||||
|
|
||||||
CGLM_EXPORT
|
|
||||||
void
|
|
||||||
glmc_project_no(vec3 pos, mat4 m, vec4 vp, vec3 dest);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#endif /* cglmc_project_no_h */
|
|
||||||
@@ -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_project_zo_h
|
|
||||||
#define cglmc_project_zo_h
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "../../cglm.h"
|
|
||||||
|
|
||||||
CGLM_EXPORT
|
|
||||||
void
|
|
||||||
glmc_unprojecti_zo(vec3 pos, mat4 invMat, vec4 vp, vec3 dest);
|
|
||||||
|
|
||||||
CGLM_EXPORT
|
|
||||||
void
|
|
||||||
glmc_project_zo(vec3 pos, mat4 m, vec4 vp, vec3 dest);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#endif /* cglmc_project_zo_h */
|
|
||||||
@@ -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 */
|
|
||||||
@@ -25,10 +25,6 @@ CGLM_EXPORT
|
|||||||
void
|
void
|
||||||
glmc_project(vec3 pos, mat4 m, vec4 vp, vec3 dest);
|
glmc_project(vec3 pos, mat4 m, vec4 vp, vec3 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
|
||||||
void
|
|
||||||
glmc_pickmatrix(vec2 center, vec2 size, vec4 vp, mat4 dest);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -37,10 +37,6 @@ CGLM_EXPORT
|
|||||||
void
|
void
|
||||||
glmc_quat_copy(versor q, versor dest);
|
glmc_quat_copy(versor q, versor dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
|
||||||
void
|
|
||||||
glmc_quat_from_vecs(vec3 a, vec3 b, versor dest);
|
|
||||||
|
|
||||||
CGLM_EXPORT
|
CGLM_EXPORT
|
||||||
float
|
float
|
||||||
glmc_quat_norm(versor q);
|
glmc_quat_norm(versor q);
|
||||||
@@ -125,10 +121,6 @@ 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);
|
||||||
|
|||||||
@@ -149,18 +149,6 @@ CGLM_EXPORT
|
|||||||
void
|
void
|
||||||
glmc_vec2_lerp(vec2 from, vec2 to, float t, vec2 dest);
|
glmc_vec2_lerp(vec2 from, vec2 to, float t, vec2 dest);
|
||||||
|
|
||||||
CGLM_EXPORT
|
|
||||||
void
|
|
||||||
glmc_vec2_complex_mul(vec2 a, vec2 b, vec2 dest);
|
|
||||||
|
|
||||||
CGLM_EXPORT
|
|
||||||
void
|
|
||||||
glmc_vec2_complex_div(vec2 a, vec2 b, vec2 dest);
|
|
||||||
|
|
||||||
CGLM_EXPORT
|
|
||||||
void
|
|
||||||
glmc_vec2_complex_conjugate(vec2 a, vec2 dest);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -9,11 +9,11 @@
|
|||||||
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 */
|
||||||
|
|||||||
@@ -1,183 +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"
|
|
||||||
#include "../mat4.h"
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief set up orthographic projection matrix
|
|
||||||
* with a left-hand coordinate system and a
|
|
||||||
* clip-space of [-1, 1].
|
|
||||||
*
|
|
||||||
* @param[in] left viewport.left
|
|
||||||
* @param[in] right viewport.right
|
|
||||||
* @param[in] bottom viewport.bottom
|
|
||||||
* @param[in] top viewport.top
|
|
||||||
* @param[in] nearZ near clipping plane
|
|
||||||
* @param[in] farZ far clipping plane
|
|
||||||
* @param[out] dest result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_ortho_lh_no(float left, float right,
|
|
||||||
float bottom, float top,
|
|
||||||
float nearZ, float farZ,
|
|
||||||
mat4 dest) {
|
|
||||||
float rl, tb, fn;
|
|
||||||
|
|
||||||
glm_mat4_zero(dest);
|
|
||||||
|
|
||||||
rl = 1.0f / (right - left);
|
|
||||||
tb = 1.0f / (top - bottom);
|
|
||||||
fn =-1.0f / (farZ - nearZ);
|
|
||||||
|
|
||||||
dest[0][0] = 2.0f * rl;
|
|
||||||
dest[1][1] = 2.0f * tb;
|
|
||||||
dest[2][2] =-2.0f * fn;
|
|
||||||
dest[3][0] =-(right + left) * rl;
|
|
||||||
dest[3][1] =-(top + bottom) * tb;
|
|
||||||
dest[3][2] = (farZ + nearZ) * fn;
|
|
||||||
dest[3][3] = 1.0f;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief set up orthographic projection matrix using bounding box
|
|
||||||
* with a left-hand coordinate system and a
|
|
||||||
* clip-space of [-1, 1].
|
|
||||||
*
|
|
||||||
* bounding box (AABB) must be in view space
|
|
||||||
*
|
|
||||||
* @param[in] box AABB
|
|
||||||
* @param[out] dest result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_ortho_aabb_lh_no(vec3 box[2], mat4 dest) {
|
|
||||||
glm_ortho_lh_no(box[0][0], box[1][0],
|
|
||||||
box[0][1], box[1][1],
|
|
||||||
-box[1][2], -box[0][2],
|
|
||||||
dest);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief set up orthographic projection matrix using bounding box
|
|
||||||
* with a left-hand coordinate system and a
|
|
||||||
* clip-space of [-1, 1].
|
|
||||||
*
|
|
||||||
* bounding box (AABB) must be in view space
|
|
||||||
*
|
|
||||||
* @param[in] box AABB
|
|
||||||
* @param[in] padding padding
|
|
||||||
* @param[out] dest result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_ortho_aabb_p_lh_no(vec3 box[2], float padding, mat4 dest) {
|
|
||||||
glm_ortho_lh_no(box[0][0] - padding, box[1][0] + padding,
|
|
||||||
box[0][1] - padding, box[1][1] + padding,
|
|
||||||
-(box[1][2] + padding), -(box[0][2] - padding),
|
|
||||||
dest);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief set up orthographic projection matrix using bounding box
|
|
||||||
* with a left-hand coordinate system and a
|
|
||||||
* clip-space of [-1, 1].
|
|
||||||
*
|
|
||||||
* bounding box (AABB) must be in view space
|
|
||||||
*
|
|
||||||
* @param[in] box AABB
|
|
||||||
* @param[in] padding padding for near and far
|
|
||||||
* @param[out] dest result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_ortho_aabb_pz_lh_no(vec3 box[2], float padding, mat4 dest) {
|
|
||||||
glm_ortho_lh_no(box[0][0], box[1][0],
|
|
||||||
box[0][1], box[1][1],
|
|
||||||
-(box[1][2] + padding), -(box[0][2] - padding),
|
|
||||||
dest);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief set up unit orthographic projection matrix
|
|
||||||
* with a left-hand coordinate system and a
|
|
||||||
* clip-space of [-1, 1].
|
|
||||||
*
|
|
||||||
* @param[in] aspect aspect ration ( width / height )
|
|
||||||
* @param[out] dest result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_ortho_default_lh_no(float aspect, mat4 dest) {
|
|
||||||
if (aspect >= 1.0f) {
|
|
||||||
glm_ortho_lh_no(-aspect, aspect, -1.0f, 1.0f, -100.0f, 100.0f, dest);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
aspect = 1.0f / aspect;
|
|
||||||
|
|
||||||
glm_ortho_lh_no(-1.0f, 1.0f, -aspect, aspect, -100.0f, 100.0f, dest);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief set up orthographic projection matrix with given CUBE size
|
|
||||||
* with a left-hand coordinate system and a
|
|
||||||
* clip-space of [-1, 1].
|
|
||||||
*
|
|
||||||
* @param[in] aspect aspect ratio ( width / height )
|
|
||||||
* @param[in] size cube size
|
|
||||||
* @param[out] dest result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_ortho_default_s_lh_no(float aspect, float size, mat4 dest) {
|
|
||||||
if (aspect >= 1.0f) {
|
|
||||||
glm_ortho_lh_no(-size * aspect,
|
|
||||||
size * aspect,
|
|
||||||
-size,
|
|
||||||
size,
|
|
||||||
-size - 100.0f,
|
|
||||||
size + 100.0f,
|
|
||||||
dest);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
glm_ortho_lh_no(-size,
|
|
||||||
size,
|
|
||||||
-size / aspect,
|
|
||||||
size / aspect,
|
|
||||||
-size - 100.0f,
|
|
||||||
size + 100.0f,
|
|
||||||
dest);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /*cglm_ortho_lh_no_h*/
|
|
||||||
@@ -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 void glm_ortho_lh_zo(float left, float right,
|
|
||||||
float bottom, float top,
|
|
||||||
float nearZ, float farZ,
|
|
||||||
mat4 dest)
|
|
||||||
CGLM_INLINE void glm_ortho_aabb_lh_zo(vec3 box[2], mat4 dest)
|
|
||||||
CGLM_INLINE void glm_ortho_aabb_p_lh_zo(vec3 box[2],
|
|
||||||
float padding,
|
|
||||||
mat4 dest)
|
|
||||||
CGLM_INLINE void glm_ortho_aabb_pz_lh_zo(vec3 box[2],
|
|
||||||
float padding,
|
|
||||||
mat4 dest)
|
|
||||||
CGLM_INLINE void glm_ortho_default_lh_zo(float aspect,
|
|
||||||
mat4 dest)
|
|
||||||
CGLM_INLINE void glm_ortho_default_s_lh_zo(float aspect,
|
|
||||||
float size,
|
|
||||||
mat4 dest)
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef cglm_ortho_lh_zo_h
|
|
||||||
#define cglm_ortho_lh_zo_h
|
|
||||||
|
|
||||||
#include "../common.h"
|
|
||||||
#include "../plane.h"
|
|
||||||
#include "../mat4.h"
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief set up orthographic projection matrix with a left-hand coordinate
|
|
||||||
* system and a clip-space of [0, 1].
|
|
||||||
*
|
|
||||||
* @param[in] left viewport.left
|
|
||||||
* @param[in] right viewport.right
|
|
||||||
* @param[in] bottom viewport.bottom
|
|
||||||
* @param[in] top viewport.top
|
|
||||||
* @param[in] nearZ near clipping plane
|
|
||||||
* @param[in] farZ far clipping plane
|
|
||||||
* @param[out] dest result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_ortho_lh_zo(float left, float right,
|
|
||||||
float bottom, float top,
|
|
||||||
float nearZ, float farZ,
|
|
||||||
mat4 dest) {
|
|
||||||
float rl, tb, fn;
|
|
||||||
|
|
||||||
glm_mat4_zero(dest);
|
|
||||||
|
|
||||||
rl = 1.0f / (right - left);
|
|
||||||
tb = 1.0f / (top - bottom);
|
|
||||||
fn =-1.0f / (farZ - nearZ);
|
|
||||||
|
|
||||||
dest[0][0] = 2.0f * rl;
|
|
||||||
dest[1][1] = 2.0f * tb;
|
|
||||||
dest[2][2] =-fn;
|
|
||||||
dest[3][0] =-(right + left) * rl;
|
|
||||||
dest[3][1] =-(top + bottom) * tb;
|
|
||||||
dest[3][2] = nearZ * fn;
|
|
||||||
dest[3][3] = 1.0f;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief set up orthographic projection matrix using bounding box
|
|
||||||
* with a left-hand coordinate system and a clip-space of [0, 1].
|
|
||||||
*
|
|
||||||
* bounding box (AABB) must be in view space
|
|
||||||
*
|
|
||||||
* @param[in] box AABB
|
|
||||||
* @param[out] dest result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_ortho_aabb_lh_zo(vec3 box[2], mat4 dest) {
|
|
||||||
glm_ortho_lh_zo(box[0][0], box[1][0],
|
|
||||||
box[0][1], box[1][1],
|
|
||||||
-box[1][2], -box[0][2],
|
|
||||||
dest);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief set up orthographic projection matrix using bounding box
|
|
||||||
* with a left-hand coordinate system and a clip-space of [0, 1].
|
|
||||||
*
|
|
||||||
* bounding box (AABB) must be in view space
|
|
||||||
*
|
|
||||||
* @param[in] box AABB
|
|
||||||
* @param[in] padding padding
|
|
||||||
* @param[out] dest result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_ortho_aabb_p_lh_zo(vec3 box[2], float padding, mat4 dest) {
|
|
||||||
glm_ortho_lh_zo(box[0][0] - padding, box[1][0] + padding,
|
|
||||||
box[0][1] - padding, box[1][1] + padding,
|
|
||||||
-(box[1][2] + padding), -(box[0][2] - padding),
|
|
||||||
dest);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief set up orthographic projection matrix using bounding box
|
|
||||||
* with a left-hand coordinate system and a clip-space of [0, 1].
|
|
||||||
*
|
|
||||||
* bounding box (AABB) must be in view space
|
|
||||||
*
|
|
||||||
* @param[in] box AABB
|
|
||||||
* @param[in] padding padding for near and far
|
|
||||||
* @param[out] dest result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_ortho_aabb_pz_lh_zo(vec3 box[2], float padding, mat4 dest) {
|
|
||||||
glm_ortho_lh_zo(box[0][0], box[1][0],
|
|
||||||
box[0][1], box[1][1],
|
|
||||||
-(box[1][2] + padding), -(box[0][2] - padding),
|
|
||||||
dest);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief set up unit orthographic projection matrix
|
|
||||||
* with a left-hand coordinate system and a clip-space of [0, 1].
|
|
||||||
*
|
|
||||||
* @param[in] aspect aspect ration ( width / height )
|
|
||||||
* @param[out] dest result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_ortho_default_lh_zo(float aspect, mat4 dest) {
|
|
||||||
if (aspect >= 1.0f) {
|
|
||||||
glm_ortho_lh_zo(-aspect, aspect, -1.0f, 1.0f, -100.0f, 100.0f, dest);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
aspect = 1.0f / aspect;
|
|
||||||
|
|
||||||
glm_ortho_lh_zo(-1.0f, 1.0f, -aspect, aspect, -100.0f, 100.0f, dest);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief set up orthographic projection matrix with given CUBE size
|
|
||||||
* with a left-hand coordinate system and a clip-space of [0, 1].
|
|
||||||
*
|
|
||||||
* @param[in] aspect aspect ratio ( width / height )
|
|
||||||
* @param[in] size cube size
|
|
||||||
* @param[out] dest result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_ortho_default_s_lh_zo(float aspect, float size, mat4 dest) {
|
|
||||||
if (aspect >= 1.0f) {
|
|
||||||
glm_ortho_lh_zo(-size * aspect,
|
|
||||||
size * aspect,
|
|
||||||
-size,
|
|
||||||
size,
|
|
||||||
-size - 100.0f,
|
|
||||||
size + 100.0f,
|
|
||||||
dest);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
glm_ortho_lh_zo(-size,
|
|
||||||
size,
|
|
||||||
-size / aspect,
|
|
||||||
size / aspect,
|
|
||||||
-size - 100.0f,
|
|
||||||
size + 100.0f,
|
|
||||||
dest);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /*cglm_ortho_lh_zo_h*/
|
|
||||||
@@ -1,183 +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"
|
|
||||||
#include "../mat4.h"
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief set up orthographic projection matrix
|
|
||||||
* with a right-hand coordinate system and a
|
|
||||||
* clip-space of [-1, 1].
|
|
||||||
*
|
|
||||||
* @param[in] left viewport.left
|
|
||||||
* @param[in] right viewport.right
|
|
||||||
* @param[in] bottom viewport.bottom
|
|
||||||
* @param[in] top viewport.top
|
|
||||||
* @param[in] nearZ near clipping plane
|
|
||||||
* @param[in] farZ far clipping plane
|
|
||||||
* @param[out] dest result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_ortho_rh_no(float left, float right,
|
|
||||||
float bottom, float top,
|
|
||||||
float nearZ, float farZ,
|
|
||||||
mat4 dest) {
|
|
||||||
float rl, tb, fn;
|
|
||||||
|
|
||||||
glm_mat4_zero(dest);
|
|
||||||
|
|
||||||
rl = 1.0f / (right - left);
|
|
||||||
tb = 1.0f / (top - bottom);
|
|
||||||
fn =-1.0f / (farZ - nearZ);
|
|
||||||
|
|
||||||
dest[0][0] = 2.0f * rl;
|
|
||||||
dest[1][1] = 2.0f * tb;
|
|
||||||
dest[2][2] = 2.0f * fn;
|
|
||||||
dest[3][0] =-(right + left) * rl;
|
|
||||||
dest[3][1] =-(top + bottom) * tb;
|
|
||||||
dest[3][2] = (farZ + nearZ) * fn;
|
|
||||||
dest[3][3] = 1.0f;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief set up orthographic projection matrix using bounding box
|
|
||||||
* with a right-hand coordinate system and a
|
|
||||||
* clip-space of [-1, 1].
|
|
||||||
*
|
|
||||||
* bounding box (AABB) must be in view space
|
|
||||||
*
|
|
||||||
* @param[in] box AABB
|
|
||||||
* @param[out] dest result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_ortho_aabb_rh_no(vec3 box[2], mat4 dest) {
|
|
||||||
glm_ortho_rh_no(box[0][0], box[1][0],
|
|
||||||
box[0][1], box[1][1],
|
|
||||||
-box[1][2], -box[0][2],
|
|
||||||
dest);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief set up orthographic projection matrix using bounding box
|
|
||||||
* with a right-hand coordinate system and a
|
|
||||||
* clip-space of [-1, 1].
|
|
||||||
*
|
|
||||||
* bounding box (AABB) must be in view space
|
|
||||||
*
|
|
||||||
* @param[in] box AABB
|
|
||||||
* @param[in] padding padding
|
|
||||||
* @param[out] dest result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_ortho_aabb_p_rh_no(vec3 box[2], float padding, mat4 dest) {
|
|
||||||
glm_ortho_rh_no(box[0][0] - padding, box[1][0] + padding,
|
|
||||||
box[0][1] - padding, box[1][1] + padding,
|
|
||||||
-(box[1][2] + padding), -(box[0][2] - padding),
|
|
||||||
dest);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief set up orthographic projection matrix using bounding box
|
|
||||||
* with a right-hand coordinate system and a
|
|
||||||
* clip-space of [-1, 1].
|
|
||||||
*
|
|
||||||
* bounding box (AABB) must be in view space
|
|
||||||
*
|
|
||||||
* @param[in] box AABB
|
|
||||||
* @param[in] padding padding for near and far
|
|
||||||
* @param[out] dest result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_ortho_aabb_pz_rh_no(vec3 box[2], float padding, mat4 dest) {
|
|
||||||
glm_ortho_rh_no(box[0][0], box[1][0],
|
|
||||||
box[0][1], box[1][1],
|
|
||||||
-(box[1][2] + padding), -(box[0][2] - padding),
|
|
||||||
dest);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief set up unit orthographic projection matrix
|
|
||||||
* with a right-hand coordinate system and a
|
|
||||||
* clip-space of [-1, 1].
|
|
||||||
*
|
|
||||||
* @param[in] aspect aspect ration ( width / height )
|
|
||||||
* @param[out] dest result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_ortho_default_rh_no(float aspect, mat4 dest) {
|
|
||||||
if (aspect >= 1.0f) {
|
|
||||||
glm_ortho_rh_no(-aspect, aspect, -1.0f, 1.0f, -100.0f, 100.0f, dest);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
aspect = 1.0f / aspect;
|
|
||||||
|
|
||||||
glm_ortho_rh_no(-1.0f, 1.0f, -aspect, aspect, -100.0f, 100.0f, dest);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief set up orthographic projection matrix with given CUBE size
|
|
||||||
* with a right-hand coordinate system and a
|
|
||||||
* clip-space of [-1, 1].
|
|
||||||
*
|
|
||||||
* @param[in] aspect aspect ratio ( width / height )
|
|
||||||
* @param[in] size cube size
|
|
||||||
* @param[out] dest result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_ortho_default_s_rh_no(float aspect, float size, mat4 dest) {
|
|
||||||
if (aspect >= 1.0f) {
|
|
||||||
glm_ortho_rh_no(-size * aspect,
|
|
||||||
size * aspect,
|
|
||||||
-size,
|
|
||||||
size,
|
|
||||||
-size - 100.0f,
|
|
||||||
size + 100.0f,
|
|
||||||
dest);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
glm_ortho_rh_no(-size,
|
|
||||||
size,
|
|
||||||
-size / aspect,
|
|
||||||
size / aspect,
|
|
||||||
-size - 100.0f,
|
|
||||||
size + 100.0f,
|
|
||||||
dest);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /*cglm_ortho_rh_no_h*/
|
|
||||||
@@ -1,181 +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"
|
|
||||||
#include "../mat4.h"
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief set up orthographic projection matrix with a right-hand coordinate
|
|
||||||
* system and a clip-space of [0, 1].
|
|
||||||
*
|
|
||||||
* @param[in] left viewport.left
|
|
||||||
* @param[in] right viewport.right
|
|
||||||
* @param[in] bottom viewport.bottom
|
|
||||||
* @param[in] top viewport.top
|
|
||||||
* @param[in] nearZ near clipping plane
|
|
||||||
* @param[in] farZ far clipping plane
|
|
||||||
* @param[out] dest result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_ortho_rh_zo(float left, float right,
|
|
||||||
float bottom, float top,
|
|
||||||
float nearZ, float farZ,
|
|
||||||
mat4 dest) {
|
|
||||||
float rl, tb, fn;
|
|
||||||
|
|
||||||
glm_mat4_zero(dest);
|
|
||||||
|
|
||||||
rl = 1.0f / (right - left);
|
|
||||||
tb = 1.0f / (top - bottom);
|
|
||||||
fn =-1.0f / (farZ - nearZ);
|
|
||||||
|
|
||||||
dest[0][0] = 2.0f * rl;
|
|
||||||
dest[1][1] = 2.0f * tb;
|
|
||||||
dest[2][2] = fn;
|
|
||||||
dest[3][0] =-(right + left) * rl;
|
|
||||||
dest[3][1] =-(top + bottom) * tb;
|
|
||||||
dest[3][2] = nearZ * fn;
|
|
||||||
dest[3][3] = 1.0f;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief set up orthographic projection matrix using bounding box
|
|
||||||
* with a right-hand coordinate system and a clip-space with depth
|
|
||||||
* values from zero to one.
|
|
||||||
*
|
|
||||||
* bounding box (AABB) must be in view space
|
|
||||||
*
|
|
||||||
* @param[in] box AABB
|
|
||||||
* @param[out] dest result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_ortho_aabb_rh_zo(vec3 box[2], mat4 dest) {
|
|
||||||
glm_ortho_rh_zo(box[0][0], box[1][0],
|
|
||||||
box[0][1], box[1][1],
|
|
||||||
-box[1][2], -box[0][2],
|
|
||||||
dest);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief set up orthographic projection matrix using bounding box
|
|
||||||
* with a right-hand coordinate system and a clip-space with depth
|
|
||||||
* values from zero to one.
|
|
||||||
*
|
|
||||||
* bounding box (AABB) must be in view space
|
|
||||||
*
|
|
||||||
* @param[in] box AABB
|
|
||||||
* @param[in] padding padding
|
|
||||||
* @param[out] dest result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_ortho_aabb_p_rh_zo(vec3 box[2], float padding, mat4 dest) {
|
|
||||||
glm_ortho_rh_zo(box[0][0] - padding, box[1][0] + padding,
|
|
||||||
box[0][1] - padding, box[1][1] + padding,
|
|
||||||
-(box[1][2] + padding), -(box[0][2] - padding),
|
|
||||||
dest);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief set up orthographic projection matrix using bounding box
|
|
||||||
* with a right-hand coordinate system and a clip-space with depth
|
|
||||||
* values from zero to one.
|
|
||||||
*
|
|
||||||
* bounding box (AABB) must be in view space
|
|
||||||
*
|
|
||||||
* @param[in] box AABB
|
|
||||||
* @param[in] padding padding for near and far
|
|
||||||
* @param[out] dest result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_ortho_aabb_pz_rh_zo(vec3 box[2], float padding, mat4 dest) {
|
|
||||||
glm_ortho_rh_zo(box[0][0], box[1][0],
|
|
||||||
box[0][1], box[1][1],
|
|
||||||
-(box[1][2] + padding), -(box[0][2] - padding),
|
|
||||||
dest);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief set up unit orthographic projection matrix with a right-hand
|
|
||||||
* coordinate system and a clip-space of [0, 1].
|
|
||||||
*
|
|
||||||
* @param[in] aspect aspect ration ( width / height )
|
|
||||||
* @param[out] dest result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_ortho_default_rh_zo(float aspect, mat4 dest) {
|
|
||||||
if (aspect >= 1.0f) {
|
|
||||||
glm_ortho_rh_zo(-aspect, aspect, -1.0f, 1.0f, -100.0f, 100.0f, dest);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
aspect = 1.0f / aspect;
|
|
||||||
|
|
||||||
glm_ortho_rh_zo(-1.0f, 1.0f, -aspect, aspect, -100.0f, 100.0f, dest);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief set up orthographic projection matrix with given CUBE size
|
|
||||||
* with a right-hand coordinate system and a clip-space with depth
|
|
||||||
* values from zero to one.
|
|
||||||
*
|
|
||||||
* @param[in] aspect aspect ratio ( width / height )
|
|
||||||
* @param[in] size cube size
|
|
||||||
* @param[out] dest result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_ortho_default_s_rh_zo(float aspect, float size, mat4 dest) {
|
|
||||||
if (aspect >= 1.0f) {
|
|
||||||
glm_ortho_rh_zo(-size * aspect,
|
|
||||||
size * aspect,
|
|
||||||
-size,
|
|
||||||
size,
|
|
||||||
-size - 100.0f,
|
|
||||||
size + 100.0f,
|
|
||||||
dest);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
glm_ortho_rh_zo(-size,
|
|
||||||
size,
|
|
||||||
-size / aspect,
|
|
||||||
size / aspect,
|
|
||||||
-size - 100.0f,
|
|
||||||
size + 100.0f,
|
|
||||||
dest);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /*cglm_ortho_rh_zo_h*/
|
|
||||||
@@ -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,395 +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 "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,387 +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 "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,395 +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 "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,389 +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 "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,86 +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_project_no_h
|
|
||||||
#define cglm_project_no_h
|
|
||||||
|
|
||||||
#include "../common.h"
|
|
||||||
#include "../vec3.h"
|
|
||||||
#include "../vec4.h"
|
|
||||||
#include "../mat4.h"
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief maps the specified viewport coordinates into specified space [1]
|
|
||||||
* the matrix should contain projection matrix.
|
|
||||||
*
|
|
||||||
* if you don't have ( and don't want to have ) an inverse matrix then use
|
|
||||||
* glm_unproject version. You may use existing inverse of matrix in somewhere
|
|
||||||
* else, this is why glm_unprojecti exists to save save inversion cost
|
|
||||||
*
|
|
||||||
* [1] space:
|
|
||||||
* 1- if m = invProj: View Space
|
|
||||||
* 2- if m = invViewProj: World Space
|
|
||||||
* 3- if m = invMVP: Object Space
|
|
||||||
*
|
|
||||||
* You probably want to map the coordinates into object space
|
|
||||||
* so use invMVP as m
|
|
||||||
*
|
|
||||||
* Computing viewProj:
|
|
||||||
* glm_mat4_mul(proj, view, viewProj);
|
|
||||||
* glm_mat4_mul(viewProj, model, MVP);
|
|
||||||
* glm_mat4_inv(viewProj, invMVP);
|
|
||||||
*
|
|
||||||
* @param[in] pos point/position in viewport coordinates
|
|
||||||
* @param[in] invMat matrix (see brief)
|
|
||||||
* @param[in] vp viewport as [x, y, width, height]
|
|
||||||
* @param[out] dest unprojected coordinates
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_unprojecti_no(vec3 pos, mat4 invMat, vec4 vp, vec3 dest) {
|
|
||||||
vec4 v;
|
|
||||||
|
|
||||||
v[0] = 2.0f * (pos[0] - vp[0]) / vp[2] - 1.0f;
|
|
||||||
v[1] = 2.0f * (pos[1] - vp[1]) / vp[3] - 1.0f;
|
|
||||||
v[2] = 2.0f * pos[2] - 1.0f;
|
|
||||||
v[3] = 1.0f;
|
|
||||||
|
|
||||||
glm_mat4_mulv(invMat, v, v);
|
|
||||||
glm_vec4_scale(v, 1.0f / v[3], v);
|
|
||||||
glm_vec3(v, dest);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief map object coordinates to window coordinates
|
|
||||||
*
|
|
||||||
* Computing MVP:
|
|
||||||
* glm_mat4_mul(proj, view, viewProj);
|
|
||||||
* glm_mat4_mul(viewProj, model, MVP);
|
|
||||||
*
|
|
||||||
* @param[in] pos object coordinates
|
|
||||||
* @param[in] m MVP matrix
|
|
||||||
* @param[in] vp viewport as [x, y, width, height]
|
|
||||||
* @param[out] dest projected coordinates
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_project_no(vec3 pos, mat4 m, vec4 vp, vec3 dest) {
|
|
||||||
CGLM_ALIGN(16) vec4 pos4;
|
|
||||||
|
|
||||||
glm_vec4(pos, 1.0f, pos4);
|
|
||||||
|
|
||||||
glm_mat4_mulv(m, pos4, pos4);
|
|
||||||
glm_vec4_scale(pos4, 1.0f / pos4[3], pos4); /* pos = pos / pos.w */
|
|
||||||
glm_vec4_scale(pos4, 0.5f, pos4);
|
|
||||||
glm_vec4_adds(pos4, 0.5f, pos4);
|
|
||||||
|
|
||||||
dest[0] = pos4[0] * vp[2] + vp[0];
|
|
||||||
dest[1] = pos4[1] * vp[3] + vp[1];
|
|
||||||
dest[2] = pos4[2];
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* cglm_project_no_h */
|
|
||||||
@@ -1,88 +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_project_zo_h
|
|
||||||
#define cglm_project_zo_h
|
|
||||||
|
|
||||||
#include "../common.h"
|
|
||||||
#include "../vec3.h"
|
|
||||||
#include "../vec4.h"
|
|
||||||
#include "../mat4.h"
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief maps the specified viewport coordinates into specified space [1]
|
|
||||||
* the matrix should contain projection matrix.
|
|
||||||
*
|
|
||||||
* if you don't have ( and don't want to have ) an inverse matrix then use
|
|
||||||
* glm_unproject version. You may use existing inverse of matrix in somewhere
|
|
||||||
* else, this is why glm_unprojecti exists to save save inversion cost
|
|
||||||
*
|
|
||||||
* [1] space:
|
|
||||||
* 1- if m = invProj: View Space
|
|
||||||
* 2- if m = invViewProj: World Space
|
|
||||||
* 3- if m = invMVP: Object Space
|
|
||||||
*
|
|
||||||
* You probably want to map the coordinates into object space
|
|
||||||
* so use invMVP as m
|
|
||||||
*
|
|
||||||
* Computing viewProj:
|
|
||||||
* glm_mat4_mul(proj, view, viewProj);
|
|
||||||
* glm_mat4_mul(viewProj, model, MVP);
|
|
||||||
* glm_mat4_inv(viewProj, invMVP);
|
|
||||||
*
|
|
||||||
* @param[in] pos point/position in viewport coordinates
|
|
||||||
* @param[in] invMat matrix (see brief)
|
|
||||||
* @param[in] vp viewport as [x, y, width, height]
|
|
||||||
* @param[out] dest unprojected coordinates
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_unprojecti_zo(vec3 pos, mat4 invMat, vec4 vp, vec3 dest) {
|
|
||||||
vec4 v;
|
|
||||||
|
|
||||||
v[0] = 2.0f * (pos[0] - vp[0]) / vp[2] - 1.0f;
|
|
||||||
v[1] = 2.0f * (pos[1] - vp[1]) / vp[3] - 1.0f;
|
|
||||||
v[2] = pos[2];
|
|
||||||
v[3] = 1.0f;
|
|
||||||
|
|
||||||
glm_mat4_mulv(invMat, v, v);
|
|
||||||
glm_vec4_scale(v, 1.0f / v[3], v);
|
|
||||||
glm_vec3(v, dest);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief map object coordinates to window coordinates
|
|
||||||
*
|
|
||||||
* Computing MVP:
|
|
||||||
* glm_mat4_mul(proj, view, viewProj);
|
|
||||||
* glm_mat4_mul(viewProj, model, MVP);
|
|
||||||
*
|
|
||||||
* @param[in] pos object coordinates
|
|
||||||
* @param[in] m MVP matrix
|
|
||||||
* @param[in] vp viewport as [x, y, width, height]
|
|
||||||
* @param[out] dest projected coordinates
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_project_zo(vec3 pos, mat4 m, vec4 vp, vec3 dest) {
|
|
||||||
CGLM_ALIGN(16) vec4 pos4;
|
|
||||||
|
|
||||||
glm_vec4(pos, 1.0f, pos4);
|
|
||||||
|
|
||||||
glm_mat4_mulv(m, pos4, pos4);
|
|
||||||
glm_vec4_scale(pos4, 1.0f / pos4[3], pos4); /* pos = pos / pos.w */
|
|
||||||
|
|
||||||
dest[2] = pos4[2];
|
|
||||||
|
|
||||||
glm_vec4_scale(pos4, 0.5f, pos4);
|
|
||||||
glm_vec4_adds(pos4, 0.5f, pos4);
|
|
||||||
|
|
||||||
dest[0] = pos4[0] * vp[2] + vp[0];
|
|
||||||
dest[1] = pos4[1] * vp[3] + vp[1];
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* cglm_project_zo_h */
|
|
||||||
@@ -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,74 +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 "../common.h"
|
|
||||||
#include "view_lh.h"
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief set up view matrix with left handed coordinate system.
|
|
||||||
*
|
|
||||||
* NOTE: The UP vector must not be parallel to the line of sight from
|
|
||||||
* the eye point to the reference point
|
|
||||||
*
|
|
||||||
* @param[in] eye eye vector
|
|
||||||
* @param[in] center center vector
|
|
||||||
* @param[in] up up vector
|
|
||||||
* @param[out] dest result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_lookat_lh_no(vec3 eye, vec3 center, vec3 up, mat4 dest) {
|
|
||||||
glm_lookat_lh(eye, center, up, dest);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief set up view matrix with left handed coordinate system.
|
|
||||||
*
|
|
||||||
* convenient wrapper for lookat: if you only have direction not target self
|
|
||||||
* then this might be useful. Because you need to get target from direction.
|
|
||||||
*
|
|
||||||
* NOTE: The UP vector must not be parallel to the line of sight from
|
|
||||||
* the eye point to the reference point
|
|
||||||
*
|
|
||||||
* @param[in] eye eye vector
|
|
||||||
* @param[in] dir direction vector
|
|
||||||
* @param[in] up up vector
|
|
||||||
* @param[out] dest result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_look_lh_no(vec3 eye, vec3 dir, vec3 up, mat4 dest) {
|
|
||||||
glm_look_lh(eye, dir, up, dest);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief set up view matrix with left handed coordinate system.
|
|
||||||
*
|
|
||||||
* convenient wrapper for look: if you only have direction and if you don't
|
|
||||||
* care what UP vector is then this might be useful to create view matrix
|
|
||||||
*
|
|
||||||
* @param[in] eye eye vector
|
|
||||||
* @param[in] dir direction vector
|
|
||||||
* @param[out] dest result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_look_anyup_lh_no(vec3 eye, vec3 dir, mat4 dest) {
|
|
||||||
glm_look_anyup_lh(eye, dir, dest);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /*cglm_view_lh_no_h*/
|
|
||||||
@@ -1,74 +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 "../common.h"
|
|
||||||
#include "view_lh.h"
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief set up view matrix with left handed coordinate system.
|
|
||||||
*
|
|
||||||
* NOTE: The UP vector must not be parallel to the line of sight from
|
|
||||||
* the eye point to the reference point
|
|
||||||
*
|
|
||||||
* @param[in] eye eye vector
|
|
||||||
* @param[in] center center vector
|
|
||||||
* @param[in] up up vector
|
|
||||||
* @param[out] dest result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_lookat_lh_zo(vec3 eye, vec3 center, vec3 up, mat4 dest) {
|
|
||||||
glm_lookat_lh(eye, center, up, dest);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief set up view matrix with left handed coordinate system.
|
|
||||||
*
|
|
||||||
* convenient wrapper for lookat: if you only have direction not target self
|
|
||||||
* then this might be useful. Because you need to get target from direction.
|
|
||||||
*
|
|
||||||
* NOTE: The UP vector must not be parallel to the line of sight from
|
|
||||||
* the eye point to the reference point
|
|
||||||
*
|
|
||||||
* @param[in] eye eye vector
|
|
||||||
* @param[in] dir direction vector
|
|
||||||
* @param[in] up up vector
|
|
||||||
* @param[out] dest result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_look_lh_zo(vec3 eye, vec3 dir, vec3 up, mat4 dest) {
|
|
||||||
glm_look_lh(eye, dir, up, dest);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief set up view matrix with left handed coordinate system.
|
|
||||||
*
|
|
||||||
* convenient wrapper for look: if you only have direction and if you don't
|
|
||||||
* care what UP vector is then this might be useful to create view matrix
|
|
||||||
*
|
|
||||||
* @param[in] eye eye vector
|
|
||||||
* @param[in] dir direction vector
|
|
||||||
* @param[out] dest result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_look_anyup_lh_zo(vec3 eye, vec3 dir, mat4 dest) {
|
|
||||||
glm_look_anyup_lh(eye, dir, dest);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /*cglm_view_lh_zo_h*/
|
|
||||||
@@ -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,74 +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 "../common.h"
|
|
||||||
#include "view_rh.h"
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief set up view matrix with right handed coordinate system.
|
|
||||||
*
|
|
||||||
* NOTE: The UP vector must not be parallel to the line of sight from
|
|
||||||
* the eye point to the reference point
|
|
||||||
*
|
|
||||||
* @param[in] eye eye vector
|
|
||||||
* @param[in] center center vector
|
|
||||||
* @param[in] up up vector
|
|
||||||
* @param[out] dest result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_lookat_rh_no(vec3 eye, vec3 center, vec3 up, mat4 dest) {
|
|
||||||
glm_lookat_rh(eye, center, up, dest);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief set up view matrix with right handed coordinate system.
|
|
||||||
*
|
|
||||||
* convenient wrapper for lookat: if you only have direction not target self
|
|
||||||
* then this might be useful. Because you need to get target from direction.
|
|
||||||
*
|
|
||||||
* NOTE: The UP vector must not be parallel to the line of sight from
|
|
||||||
* the eye point to the reference point
|
|
||||||
*
|
|
||||||
* @param[in] eye eye vector
|
|
||||||
* @param[in] dir direction vector
|
|
||||||
* @param[in] up up vector
|
|
||||||
* @param[out] dest result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_look_rh_no(vec3 eye, vec3 dir, vec3 up, mat4 dest) {
|
|
||||||
glm_look_rh(eye, dir, up, dest);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief set up view matrix with right handed coordinate system.
|
|
||||||
*
|
|
||||||
* convenient wrapper for look: if you only have direction and if you don't
|
|
||||||
* care what UP vector is then this might be useful to create view matrix
|
|
||||||
*
|
|
||||||
* @param[in] eye eye vector
|
|
||||||
* @param[in] dir direction vector
|
|
||||||
* @param[out] dest result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_look_anyup_rh_no(vec3 eye, vec3 dir, mat4 dest) {
|
|
||||||
glm_look_anyup_rh(eye, dir, dest);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /*cglm_view_rh_no_h*/
|
|
||||||
@@ -1,74 +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 "../common.h"
|
|
||||||
#include "view_rh.h"
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief set up view matrix with right handed coordinate system.
|
|
||||||
*
|
|
||||||
* NOTE: The UP vector must not be parallel to the line of sight from
|
|
||||||
* the eye point to the reference point
|
|
||||||
*
|
|
||||||
* @param[in] eye eye vector
|
|
||||||
* @param[in] center center vector
|
|
||||||
* @param[in] up up vector
|
|
||||||
* @param[out] dest result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_lookat_rh_zo(vec3 eye, vec3 center, vec3 up, mat4 dest) {
|
|
||||||
glm_lookat_rh(eye, center, up, dest);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief set up view matrix with right handed coordinate system.
|
|
||||||
*
|
|
||||||
* convenient wrapper for lookat: if you only have direction not target self
|
|
||||||
* then this might be useful. Because you need to get target from direction.
|
|
||||||
*
|
|
||||||
* NOTE: The UP vector must not be parallel to the line of sight from
|
|
||||||
* the eye point to the reference point
|
|
||||||
*
|
|
||||||
* @param[in] eye eye vector
|
|
||||||
* @param[in] dir direction vector
|
|
||||||
* @param[in] up up vector
|
|
||||||
* @param[out] dest result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_look_rh_zo(vec3 eye, vec3 dir, vec3 up, mat4 dest) {
|
|
||||||
glm_look_rh(eye, dir, up, dest);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief set up view matrix with right handed coordinate system.
|
|
||||||
*
|
|
||||||
* convenient wrapper for look: if you only have direction and if you don't
|
|
||||||
* care what UP vector is then this might be useful to create view matrix
|
|
||||||
*
|
|
||||||
* @param[in] eye eye vector
|
|
||||||
* @param[in] dir direction vector
|
|
||||||
* @param[out] dest result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_look_anyup_rh_zo(vec3 eye, vec3 dir, mat4 dest) {
|
|
||||||
glm_look_anyup_rh(eye, dir, dest);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /*cglm_view_rh_zo_h*/
|
|
||||||
@@ -42,42 +42,17 @@
|
|||||||
#include "types.h"
|
#include "types.h"
|
||||||
#include "simd/intrin.h"
|
#include "simd/intrin.h"
|
||||||
|
|
||||||
#ifndef CGLM_USE_DEFAULT_EPSILON
|
/** CGLM_USE_DEFAULT_EPSILON is removed, to override float epsilon,
|
||||||
# ifndef GLM_FLT_EPSILON
|
* just define GLM_FLT_EPSILON with epsilon value like below
|
||||||
# define GLM_FLT_EPSILON 1e-5
|
*
|
||||||
# endif
|
* #define GLM_FLT_EPSILON 1e-6f
|
||||||
#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 */
|
#ifndef GLM_FLT_EPSILON
|
||||||
#define CGLM_CLIP_CONTROL_NO_BIT (1 << 1) /* NEGATIVE_ONE_TO_ONE */
|
# ifndef FLT_EPSILON
|
||||||
#define CGLM_CLIP_CONTROL_LH_BIT (1 << 2) /* LEFT_HANDED, For DirectX, Metal, Vulkan */
|
# define GLM_FLT_EPSILON 1e-6f
|
||||||
#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
|
# else
|
||||||
# define CGLM_CONFIG_CLIP_CONTROL CGLM_CLIP_CONTROL_RH_ZO
|
# define GLM_FLT_EPSILON FLT_EPSILON
|
||||||
# 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
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -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}}
|
||||||
|
|
||||||
@@ -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],
|
||||||
|
|||||||
@@ -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
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -560,9 +539,7 @@ 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);
|
glm_mat4_scale_neon(m, s);
|
||||||
@@ -583,8 +560,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 +593,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"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -13,17 +13,6 @@
|
|||||||
#include "vec4.h"
|
#include "vec4.h"
|
||||||
#include "mat4.h"
|
#include "mat4.h"
|
||||||
|
|
||||||
#ifndef CGLM_CLIPSPACE_INCLUDE_ALL
|
|
||||||
# if CGLM_CONFIG_CLIP_CONTROL & CGLM_CLIP_CONTROL_ZO_BIT
|
|
||||||
# include "clipspace/project_zo.h"
|
|
||||||
# elif CGLM_CONFIG_CLIP_CONTROL & CGLM_CLIP_CONTROL_NO_BIT
|
|
||||||
# include "clipspace/project_no.h"
|
|
||||||
# endif
|
|
||||||
#else
|
|
||||||
# include "clipspace/project_zo.h"
|
|
||||||
# include "clipspace/project_no.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief maps the specified viewport coordinates into specified space [1]
|
* @brief maps the specified viewport coordinates into specified space [1]
|
||||||
* the matrix should contain projection matrix.
|
* the matrix should contain projection matrix.
|
||||||
@@ -53,11 +42,16 @@
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_unprojecti(vec3 pos, mat4 invMat, vec4 vp, vec3 dest) {
|
glm_unprojecti(vec3 pos, mat4 invMat, vec4 vp, vec3 dest) {
|
||||||
#if CGLM_CONFIG_CLIP_CONTROL & CGLM_CLIP_CONTROL_ZO_BIT
|
vec4 v;
|
||||||
glm_unprojecti_zo(pos, invMat, vp, dest);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL & CGLM_CLIP_CONTROL_NO_BIT
|
v[0] = 2.0f * (pos[0] - vp[0]) / vp[2] - 1.0f;
|
||||||
glm_unprojecti_no(pos, invMat, vp, dest);
|
v[1] = 2.0f * (pos[1] - vp[1]) / vp[3] - 1.0f;
|
||||||
#endif
|
v[2] = 2.0f * pos[2] - 1.0f;
|
||||||
|
v[3] = 1.0f;
|
||||||
|
|
||||||
|
glm_mat4_mulv(invMat, v, v);
|
||||||
|
glm_vec4_scale(v, 1.0f / v[3], v);
|
||||||
|
glm_vec3(v, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -107,44 +101,18 @@ glm_unproject(vec3 pos, mat4 m, vec4 vp, vec3 dest) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_project(vec3 pos, mat4 m, vec4 vp, vec3 dest) {
|
glm_project(vec3 pos, mat4 m, vec4 vp, vec3 dest) {
|
||||||
#if CGLM_CONFIG_CLIP_CONTROL & CGLM_CLIP_CONTROL_ZO_BIT
|
CGLM_ALIGN(16) vec4 pos4, vone = GLM_VEC4_ONE_INIT;
|
||||||
glm_project_zo(pos, m, vp, dest);
|
|
||||||
#elif CGLM_CONFIG_CLIP_CONTROL & CGLM_CLIP_CONTROL_NO_BIT
|
|
||||||
glm_project_no(pos, m, vp, dest);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
glm_vec4(pos, 1.0f, pos4);
|
||||||
* @brief define a picking region
|
|
||||||
*
|
|
||||||
* @param[in] center center [x, y] of a picking region in window coordinates
|
|
||||||
* @param[in] size size [width, height] of the picking region in window coordinates
|
|
||||||
* @param[in] vp viewport as [x, y, width, height]
|
|
||||||
* @param[out] dest projected coordinates
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_pickmatrix(vec3 center, vec2 size, vec4 vp, mat4 dest) {
|
|
||||||
mat4 res;
|
|
||||||
vec3 v;
|
|
||||||
|
|
||||||
if (size[0] <= 0.0f || size[1] <= 0.0f)
|
glm_mat4_mulv(m, pos4, pos4);
|
||||||
return;
|
glm_vec4_scale(pos4, 1.0f / pos4[3], pos4); /* pos = pos / pos.w */
|
||||||
|
glm_vec4_add(pos4, vone, pos4);
|
||||||
|
glm_vec4_scale(pos4, 0.5f, pos4);
|
||||||
|
|
||||||
/* Translate and scale the picked region to the entire window */
|
dest[0] = pos4[0] * vp[2] + vp[0];
|
||||||
v[0] = (vp[2] - 2.0f * (center[0] - vp[0])) / size[0];
|
dest[1] = pos4[1] * vp[3] + vp[1];
|
||||||
v[1] = (vp[3] - 2.0f * (center[1] - vp[1])) / size[1];
|
dest[2] = pos4[2];
|
||||||
v[2] = 0.0f;
|
|
||||||
|
|
||||||
glm_translate_make(res, v);
|
|
||||||
|
|
||||||
v[0] = vp[2] / size[0];
|
|
||||||
v[1] = vp[3] / size[1];
|
|
||||||
v[2] = 1.0f;
|
|
||||||
|
|
||||||
glm_scale(res, v);
|
|
||||||
|
|
||||||
glm_mat4_copy(res, dest);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* cglm_project_h */
|
#endif /* cglm_project_h */
|
||||||
|
|||||||
@@ -16,7 +16,6 @@
|
|||||||
CGLM_INLINE void glm_quat(versor q, float angle, float x, float y, float z);
|
CGLM_INLINE void glm_quat(versor q, float angle, float x, float y, float z);
|
||||||
CGLM_INLINE void glm_quatv(versor q, float angle, vec3 axis);
|
CGLM_INLINE void glm_quatv(versor q, float angle, vec3 axis);
|
||||||
CGLM_INLINE void glm_quat_copy(versor q, versor dest);
|
CGLM_INLINE void glm_quat_copy(versor q, versor dest);
|
||||||
CGLM_INLINE void glm_quat_from_vecs(vec3 a, vec3 b, versor dest);
|
|
||||||
CGLM_INLINE float glm_quat_norm(versor q);
|
CGLM_INLINE float glm_quat_norm(versor q);
|
||||||
CGLM_INLINE void glm_quat_normalize(versor q);
|
CGLM_INLINE void glm_quat_normalize(versor q);
|
||||||
CGLM_INLINE void glm_quat_normalize_to(versor q, versor dest);
|
CGLM_INLINE void glm_quat_normalize_to(versor q, versor dest);
|
||||||
@@ -39,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,
|
||||||
@@ -60,17 +58,22 @@
|
|||||||
#include "mat4.h"
|
#include "mat4.h"
|
||||||
#include "mat3.h"
|
#include "mat3.h"
|
||||||
#include "affine-mat.h"
|
#include "affine-mat.h"
|
||||||
#include "affine.h"
|
|
||||||
|
|
||||||
#ifdef CGLM_SSE_FP
|
#ifdef CGLM_SSE_FP
|
||||||
# include "simd/sse2/quat.h"
|
# include "simd/sse2/quat.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CGLM_NEON_FP
|
CGLM_INLINE
|
||||||
# include "simd/neon/quat.h"
|
void
|
||||||
#endif
|
glm_mat4_mulv(mat4 m, vec4 v, vec4 dest);
|
||||||
|
|
||||||
CGLM_INLINE void glm_quat_normalize(versor q);
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_mul_rot(mat4 m1, mat4 m2, mat4 dest);
|
||||||
|
|
||||||
|
CGLM_INLINE
|
||||||
|
void
|
||||||
|
glm_translate(mat4 m, vec3 v);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* IMPORTANT:
|
* IMPORTANT:
|
||||||
@@ -187,41 +190,10 @@ glm_quat_copy(versor q, versor dest) {
|
|||||||
glm_vec4_copy(q, dest);
|
glm_vec4_copy(q, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief compute quaternion rotating vector A to vector B
|
|
||||||
*
|
|
||||||
* @param[in] a vec3 (must have unit length)
|
|
||||||
* @param[in] b vec3 (must have unit length)
|
|
||||||
* @param[out] dest quaternion (of unit length)
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_quat_from_vecs(vec3 a, vec3 b, versor dest) {
|
|
||||||
CGLM_ALIGN(8) vec3 axis;
|
|
||||||
float cos_theta;
|
|
||||||
float cos_half_theta;
|
|
||||||
|
|
||||||
cos_theta = glm_vec3_dot(a, b);
|
|
||||||
if (cos_theta >= 1.f - GLM_FLT_EPSILON) { /* a ∥ b */
|
|
||||||
glm_quat_identity(dest);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (cos_theta < -1.f + GLM_FLT_EPSILON) { /* angle(a, b) = π */
|
|
||||||
glm_vec3_ortho(a, axis);
|
|
||||||
cos_half_theta = 0.f; /* cos π/2 */
|
|
||||||
} else {
|
|
||||||
glm_vec3_cross(a, b, axis);
|
|
||||||
cos_half_theta = 1.0f + cos_theta; /* cos 0 + cos θ */
|
|
||||||
}
|
|
||||||
|
|
||||||
glm_quat_init(dest, axis[0], axis[1], axis[2], cos_half_theta);
|
|
||||||
glm_quat_normalize(dest);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief returns norm (magnitude) of quaternion
|
* @brief returns norm (magnitude) of quaternion
|
||||||
*
|
*
|
||||||
* @param[in] q quaternion
|
* @param[out] q quaternion
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
float
|
float
|
||||||
@@ -440,8 +412,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];
|
||||||
@@ -652,29 +622,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)
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -34,7 +34,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(__SSE3__)
|
#if defined(__SSE3__)
|
||||||
# include <pmmintrin.h>
|
# include <x86intrin.h>
|
||||||
# ifndef CGLM_SIMD_x86
|
# ifndef CGLM_SIMD_x86
|
||||||
# define CGLM_SIMD_x86
|
# define CGLM_SIMD_x86
|
||||||
# endif
|
# endif
|
||||||
|
|||||||
@@ -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 */
|
|
||||||
@@ -42,42 +42,41 @@ 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
|
CGLM_INLINE
|
||||||
@@ -102,216 +101,5 @@ glm_mat4_mulv_neon(mat4 m, vec4 v, vec4 dest) {
|
|||||||
vst1q_f32(dest, l0);
|
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
|
||||||
#endif /* cglm_mat4_neon_h */
|
#endif /* cglm_mat4_neon_h */
|
||||||
|
|||||||
@@ -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 */
|
_mm_storeu_ps(&dest[1][1], x0);
|
||||||
x4 = _mm_movehl_ps(r2, x4); /* b22 b22 b12 b12 */
|
|
||||||
x0 = glmm_fmadd(x3, x5, x0);
|
|
||||||
x1 = glmm_fmadd(x2, x4, x1);
|
|
||||||
|
|
||||||
/*
|
dest[2][2] = m1[0][2] * m2[2][0]
|
||||||
Dot Product : dest[2][2] = a02 * b20 +
|
+ m1[1][2] * m2[2][1]
|
||||||
a12 * b21 +
|
+ m1[2][2] * m2[2][2];
|
||||||
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);
|
|
||||||
_mm_storeu_ps(&dest[1][1], x1);
|
|
||||||
_mm_store_ss (&dest[2][2], x2);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#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,10 +159,7 @@ 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 */
|
||||||
@@ -175,118 +167,109 @@ glm_mat4_inv_fast_sse2(mat4 mat, mat4 dest) {
|
|||||||
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 */
|
x0 = _mm_shuffle_ps(r2, r3, _MM_SHUFFLE(3, 2, 3, 2)); /* 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 */
|
x1 = glmm_shuff1(x0, 1, 3, 3, 3); /* l p p p */
|
||||||
x2 = glmm_shuff1(x0, 0, 2, 2, 2); /* k o o o */
|
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 */
|
|
||||||
x5 = _mm_shuffle_ps(r2, r1, _MM_SHUFFLE(1, 1, 1, 1)); /* f f j j */
|
|
||||||
x3 = _mm_shuffle_ps(r2, r1, _MM_SHUFFLE(2, 2, 2, 2)); /* g g k k */
|
|
||||||
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,10 +283,7 @@ 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 */
|
||||||
@@ -311,118 +291,109 @@ glm_mat4_inv_sse2(mat4 mat, mat4 dest) {
|
|||||||
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 */
|
x0 = _mm_shuffle_ps(r2, r3, _MM_SHUFFLE(3, 2, 3, 2)); /* 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 */
|
x1 = glmm_shuff1(x0, 1, 3, 3, 3); /* l p p p */
|
||||||
x2 = glmm_shuff1(x0, 0, 2, 2, 2); /* k o o o */
|
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 */
|
|
||||||
x5 = _mm_shuffle_ps(r2, r1, _MM_SHUFFLE(1, 1, 1, 1)); /* f f j j */
|
|
||||||
x3 = _mm_shuffle_ps(r2, r1, _MM_SHUFFLE(2, 2, 2, 2)); /* g g k k */
|
|
||||||
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);
|
r = _mm_mul_ps(glmm_shuff1x(xp, 3), xq);
|
||||||
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);
|
x0 = _mm_xor_ps(glmm_shuff1x(xp, 0), _mm_set_ps(-0.f, 0.f, -0.f, 0.f));
|
||||||
y = _mm_xor_ps(y, x2);
|
r = _mm_add_ps(r, _mm_mul_ps(x0, glmm_shuff1(xq, 0, 1, 2, 3)));
|
||||||
z = _mm_xor_ps(z, x3);
|
|
||||||
|
|
||||||
x1 = glmm_shuff1(xq, 0, 1, 2, 3);
|
x0 = _mm_xor_ps(glmm_shuff1x(xp, 1), _mm_set_ps(-0.f, -0.f, 0.f, 0.f));
|
||||||
x2 = glmm_shuff1(xq, 1, 0, 3, 2);
|
r = _mm_add_ps(r, _mm_mul_ps(x0, glmm_shuff1(xq, 1, 0, 3, 2)));
|
||||||
x3 = glmm_shuff1(xq, 2, 3, 0, 1);
|
|
||||||
|
|
||||||
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -209,99 +188,5 @@ glmm_store3(float v[3], __m128 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 */
|
||||||
|
|||||||
@@ -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 */
|
|
||||||
@@ -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_zo(float left, float right,
|
|
||||||
float bottom, float top,
|
|
||||||
float nearZ, float farZ)
|
|
||||||
CGLM_INLINE mat4s glms_perspective_lh_zo(float fovy,
|
|
||||||
float aspect,
|
|
||||||
float nearZ,
|
|
||||||
float farZ)
|
|
||||||
CGLM_INLINE void glms_persp_move_far_lh_zo(mat4s proj, float deltaFar)
|
|
||||||
CGLM_INLINE mat4s glms_perspective_default_lh_zo(float aspect)
|
|
||||||
CGLM_INLINE void glms_perspective_resize_lh_zo(mat4s proj, float aspect)
|
|
||||||
CGLM_INLINE void glms_persp_decomp_lh_zo(mat4s proj,
|
|
||||||
float *nearv, float *farv,
|
|
||||||
float *top, float *bottom,
|
|
||||||
float *left, float *right)
|
|
||||||
CGLM_INLINE void glms_persp_decompv_lh_zo(mat4s proj, float dest[6])
|
|
||||||
CGLM_INLINE void glms_persp_decomp_x_lh_zo(mat4s proj, float *left, float *right)
|
|
||||||
CGLM_INLINE void glms_persp_decomp_y_lh_zo(mat4s proj, float *top, float *bottom)
|
|
||||||
CGLM_INLINE void glms_persp_decomp_z_lh_zo(mat4s proj, float *nearv, float *farv)
|
|
||||||
CGLM_INLINE void glms_persp_decomp_far_lh_zo(mat4s proj, float *farZ)
|
|
||||||
CGLM_INLINE void glms_persp_decomp_near_lh_zo(mat4s proj, float *nearZ)
|
|
||||||
CGLM_INLINE float glms_persp_fovy_lh_zo(mat4s proj)
|
|
||||||
CGLM_INLINE float glms_persp_aspect_lh_zo(mat4s proj)
|
|
||||||
CGLM_INLINE vec4s glms_persp_sizes_lh_zo(mat4s proj, float fovy)
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef cglms_persp_lh_zo_h
|
|
||||||
#define cglms_persp_lh_zo_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 [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_frustum_lh_zo(float left, float right,
|
|
||||||
float bottom, float top,
|
|
||||||
float nearZ, float farZ) {
|
|
||||||
mat4s dest;
|
|
||||||
glm_frustum_lh_zo(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 [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
|
|
||||||
* @returns result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
mat4s
|
|
||||||
glms_perspective_lh_zo(float fovy, float aspect, float nearZ, float farZ) {
|
|
||||||
mat4s dest;
|
|
||||||
glm_perspective_lh_zo(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 [0, 1].
|
|
||||||
*
|
|
||||||
* NOTE: if you dodn't want to create new matrix then use array api on struct.raw
|
|
||||||
* like glms_persp_move_far_lh_zo(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_zo(mat4s proj, float deltaFar) {
|
|
||||||
mat4s dest;
|
|
||||||
dest = proj;
|
|
||||||
glm_persp_move_far_lh_zo(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 [0, 1].
|
|
||||||
*
|
|
||||||
* @param[in] aspect aspect ratio ( width / height )
|
|
||||||
* @returns result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
mat4s
|
|
||||||
glms_perspective_default_lh_zo(float aspect) {
|
|
||||||
mat4s dest;
|
|
||||||
glm_perspective_default_lh_zo(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 [0, 1].
|
|
||||||
*
|
|
||||||
* NOTE: if you dodn't want to create new matrix then use array api on struct.raw
|
|
||||||
* like glms_perspective_resize_lh_zo(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_zo(mat4s proj, float aspect) {
|
|
||||||
mat4s dest;
|
|
||||||
dest = proj;
|
|
||||||
glm_perspective_resize_lh_zo(aspect, dest.raw);
|
|
||||||
return dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief decomposes frustum values of perspective projection.
|
|
||||||
* 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
|
|
||||||
glms_persp_decomp_lh_zo(mat4s proj,
|
|
||||||
float * __restrict nearZ, float * __restrict farZ,
|
|
||||||
float * __restrict top, float * __restrict bottom,
|
|
||||||
float * __restrict left, float * __restrict right) {
|
|
||||||
glm_persp_decomp_lh_zo(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 [0, 1].
|
|
||||||
*
|
|
||||||
* @param[in] proj perspective projection matrix
|
|
||||||
* @param[out] dest array
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glms_persp_decompv_lh_zo(mat4s proj, float dest[6]) {
|
|
||||||
glm_persp_decompv_lh_zo(proj.raw, dest);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief decomposes left and right values of perspective projection
|
|
||||||
* with a left-hand coordinate system and a
|
|
||||||
* clip-space of [0, 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_zo(mat4s proj,
|
|
||||||
float * __restrict left,
|
|
||||||
float * __restrict right) {
|
|
||||||
glm_persp_decomp_x_lh_zo(proj.raw, left, right);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief decomposes top and bottom values of perspective projection
|
|
||||||
* with a left-hand coordinate system and a
|
|
||||||
* clip-space of [0, 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_zo(mat4s proj,
|
|
||||||
float * __restrict top,
|
|
||||||
float * __restrict bottom) {
|
|
||||||
glm_persp_decomp_y_lh_zo(proj.raw, top, bottom);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief decomposes near and far values of perspective projection
|
|
||||||
* 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
|
|
||||||
glms_persp_decomp_z_lh_zo(mat4s proj,
|
|
||||||
float * __restrict nearZ,
|
|
||||||
float * __restrict farZ) {
|
|
||||||
glm_persp_decomp_z_lh_zo(proj.raw, nearZ, farZ);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief decomposes far value of perspective projection
|
|
||||||
* 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
|
|
||||||
glms_persp_decomp_far_lh_zo(mat4s proj, float * __restrict farZ) {
|
|
||||||
glm_persp_decomp_far_lh_zo(proj.raw, farZ);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief decomposes near value of perspective projection
|
|
||||||
* 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
|
|
||||||
glms_persp_decomp_near_lh_zo(mat4s proj, float * __restrict nearZ) {
|
|
||||||
glm_persp_decomp_near_lh_zo(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 [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
|
|
||||||
glms_persp_fovy_lh_zo(mat4s proj) {
|
|
||||||
return glm_persp_fovy_lh_zo(proj.raw);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @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
|
|
||||||
glms_persp_aspect_lh_zo(mat4s proj) {
|
|
||||||
return glm_persp_aspect_lh_zo(proj.raw);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @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)
|
|
||||||
* @returns sizes as vector, sizes order: [Wnear, Hnear, Wfar, Hfar]
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
vec4s
|
|
||||||
glms_persp_sizes_lh_zo(mat4s proj, float fovy) {
|
|
||||||
vec4s dest;
|
|
||||||
glm_persp_sizes_lh_zo(proj.raw, fovy, dest.raw);
|
|
||||||
return dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* cglms_persp_lh_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_rh_no(float left, float right,
|
|
||||||
float bottom, float top,
|
|
||||||
float nearZ, float farZ)
|
|
||||||
CGLM_INLINE mat4s glms_perspective_rh_no(float fovy,
|
|
||||||
float aspect,
|
|
||||||
float nearZ,
|
|
||||||
float farZ)
|
|
||||||
CGLM_INLINE void glms_persp_move_far_rh_no(mat4s proj, float deltaFar)
|
|
||||||
CGLM_INLINE mat4s glms_perspective_default_rh_no(float aspect)
|
|
||||||
CGLM_INLINE void glms_perspective_resize_rh_no(mat4s proj, float aspect)
|
|
||||||
CGLM_INLINE void glms_persp_decomp_rh_no(mat4s proj,
|
|
||||||
float *nearv, float *farv,
|
|
||||||
float *top, float *bottom,
|
|
||||||
float *left, float *right)
|
|
||||||
CGLM_INLINE void glms_persp_decompv_rh_no(mat4s proj, float dest[6])
|
|
||||||
CGLM_INLINE void glms_persp_decomp_x_rh_no(mat4s proj, float *left, float *right)
|
|
||||||
CGLM_INLINE void glms_persp_decomp_y_rh_no(mat4s proj, float *top, float *bottom)
|
|
||||||
CGLM_INLINE void glms_persp_decomp_z_rh_no(mat4s proj, float *nearv, float *farv)
|
|
||||||
CGLM_INLINE void glms_persp_decomp_far_rh_no(mat4s proj, float *farZ)
|
|
||||||
CGLM_INLINE void glms_persp_decomp_near_rh_no(mat4s proj, float *nearZ)
|
|
||||||
CGLM_INLINE float glms_persp_fovy_rh_no(mat4s proj)
|
|
||||||
CGLM_INLINE float glms_persp_aspect_rh_no(mat4s proj)
|
|
||||||
CGLM_INLINE vec4s glms_persp_sizes_rh_no(mat4s proj, float fovy)
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef cglms_persp_rh_no_h
|
|
||||||
#define cglms_persp_rh_no_h
|
|
||||||
|
|
||||||
#include "../../common.h"
|
|
||||||
#include "../../types-struct.h"
|
|
||||||
#include "../../plane.h"
|
|
||||||
#include "../../cam.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
|
|
||||||
* @returns result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
mat4s
|
|
||||||
glms_frustum_rh_no(float left, float right,
|
|
||||||
float bottom, float top,
|
|
||||||
float nearZ, float farZ) {
|
|
||||||
mat4s dest;
|
|
||||||
glm_frustum_rh_no(left, right, bottom, top, nearZ, farZ, dest.raw);
|
|
||||||
return dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @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
|
|
||||||
* @returns result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
mat4s
|
|
||||||
glms_perspective_rh_no(float fovy, float aspect, float nearZ, float farZ) {
|
|
||||||
mat4s dest;
|
|
||||||
glm_perspective_rh_no(fovy, aspect, nearZ, farZ, dest.raw);
|
|
||||||
return dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief extend perspective projection matrix's far distance
|
|
||||||
* with a right-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_rh_no(prooj.raw, deltaFar) to avoid create new mat4
|
|
||||||
* each time
|
|
||||||
* s
|
|
||||||
* 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_rh_no(mat4s proj, float deltaFar) {
|
|
||||||
mat4s dest;
|
|
||||||
dest = proj;
|
|
||||||
glm_persp_move_far_rh_no(dest.raw, deltaFar);
|
|
||||||
return dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @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 )
|
|
||||||
* @returns result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
mat4s
|
|
||||||
glms_perspective_default_rh_no(float aspect) {
|
|
||||||
mat4s dest;
|
|
||||||
glm_perspective_default_rh_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 right-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_rh_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_rh_no(mat4s proj, float aspect) {
|
|
||||||
mat4s dest;
|
|
||||||
dest = proj;
|
|
||||||
glm_perspective_resize_rh_no(aspect, dest.raw);
|
|
||||||
return dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @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
|
|
||||||
glms_persp_decomp_rh_no(mat4s proj,
|
|
||||||
float * __restrict nearZ, float * __restrict farZ,
|
|
||||||
float * __restrict top, float * __restrict bottom,
|
|
||||||
float * __restrict left, float * __restrict right) {
|
|
||||||
glm_persp_decomp_rh_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 right-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_rh_no(mat4s proj, float dest[6]) {
|
|
||||||
glm_persp_decompv_rh_no(proj.raw, dest);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @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
|
|
||||||
glms_persp_decomp_x_rh_no(mat4s proj,
|
|
||||||
float * __restrict left,
|
|
||||||
float * __restrict right) {
|
|
||||||
glm_persp_decomp_x_rh_no(proj.raw, left, right);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @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
|
|
||||||
glms_persp_decomp_y_rh_no(mat4s proj,
|
|
||||||
float * __restrict top,
|
|
||||||
float * __restrict bottom) {
|
|
||||||
glm_persp_decomp_y_rh_no(proj.raw, top, bottom);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @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
|
|
||||||
glms_persp_decomp_z_rh_no(mat4s proj,
|
|
||||||
float * __restrict nearZ,
|
|
||||||
float * __restrict farZ) {
|
|
||||||
glm_persp_decomp_z_rh_no(proj.raw, nearZ, farZ);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @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
|
|
||||||
glms_persp_decomp_far_rh_no(mat4s proj, float * __restrict farZ) {
|
|
||||||
glm_persp_decomp_far_rh_no(proj.raw, farZ);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @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
|
|
||||||
glms_persp_decomp_near_rh_no(mat4s proj, float * __restrict nearZ) {
|
|
||||||
glm_persp_decomp_near_rh_no(proj.raw, nearZ);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @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
|
|
||||||
glms_persp_fovy_rh_no(mat4s proj) {
|
|
||||||
return glm_persp_fovy_rh_no(proj.raw);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @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
|
|
||||||
glms_persp_aspect_rh_no(mat4s proj) {
|
|
||||||
return glm_persp_aspect_rh_no(proj.raw);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @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)
|
|
||||||
* @returns sizes as vector, sizes order: [Wnear, Hnear, Wfar, Hfar]
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
vec4s
|
|
||||||
glms_persp_sizes_rh_no(mat4s proj, float fovy) {
|
|
||||||
vec4s dest;
|
|
||||||
glm_persp_sizes_rh_no(proj.raw, fovy, dest.raw);
|
|
||||||
return dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* cglms_persp_rh_no_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_rh_zo(float left, float right,
|
|
||||||
float bottom, float top,
|
|
||||||
float nearZ, float farZ)
|
|
||||||
CGLM_INLINE mat4s glms_perspective_rh_zo(float fovy,
|
|
||||||
float aspect,
|
|
||||||
float nearZ,
|
|
||||||
float farZ)
|
|
||||||
CGLM_INLINE void glms_persp_move_far_rh_zo(mat4s proj, float deltaFar)
|
|
||||||
CGLM_INLINE mat4s glms_perspective_default_rh_zo(float aspect)
|
|
||||||
CGLM_INLINE void glms_perspective_resize_rh_zo(mat4s proj, float aspect)
|
|
||||||
CGLM_INLINE void glms_persp_decomp_rh_zo(mat4s proj,
|
|
||||||
float *nearv, float *farv,
|
|
||||||
float *top, float *bottom,
|
|
||||||
float *left, float *right)
|
|
||||||
CGLM_INLINE void glms_persp_decompv_rh_zo(mat4s proj, float dest[6])
|
|
||||||
CGLM_INLINE void glms_persp_decomp_x_rh_zo(mat4s proj, float *left, float *right)
|
|
||||||
CGLM_INLINE void glms_persp_decomp_y_rh_zo(mat4s proj, float *top, float *bottom)
|
|
||||||
CGLM_INLINE void glms_persp_decomp_z_rh_zo(mat4s proj, float *nearv, float *farv)
|
|
||||||
CGLM_INLINE void glms_persp_decomp_far_rh_zo(mat4s proj, float *farZ)
|
|
||||||
CGLM_INLINE void glms_persp_decomp_near_rh_zo(mat4s proj, float *nearZ)
|
|
||||||
CGLM_INLINE float glms_persp_fovy_rh_zo(mat4s proj)
|
|
||||||
CGLM_INLINE float glms_persp_aspect_rh_zo(mat4s proj)
|
|
||||||
CGLM_INLINE vec4s glms_persp_sizes_rh_zo(mat4s proj, float fovy)
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef cglms_persp_rh_zo_h
|
|
||||||
#define cglms_persp_rh_zo_h
|
|
||||||
|
|
||||||
#include "../../common.h"
|
|
||||||
#include "../../types-struct.h"
|
|
||||||
#include "../../plane.h"
|
|
||||||
#include "../../cam.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
|
|
||||||
* @returns result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
mat4s
|
|
||||||
glms_frustum_rh_zo(float left, float right,
|
|
||||||
float bottom, float top,
|
|
||||||
float nearZ, float farZ) {
|
|
||||||
mat4s dest;
|
|
||||||
glm_frustum_rh_zo(left, right, bottom, top, nearZ, farZ, dest.raw);
|
|
||||||
return dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @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
|
|
||||||
* @returns result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
mat4s
|
|
||||||
glms_perspective_rh_zo(float fovy, float aspect, float nearZ, float farZ) {
|
|
||||||
mat4s dest;
|
|
||||||
glm_perspective_rh_zo(fovy, aspect, nearZ, farZ, dest.raw);
|
|
||||||
return dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief extend perspective projection matrix's far distance
|
|
||||||
* with a right-hand coordinate system and a
|
|
||||||
* clip-space of [0, 1].
|
|
||||||
*
|
|
||||||
* NOTE: if you dodn't want to create new matrix then use array api on struct.raw
|
|
||||||
* like glms_persp_move_far_rh_zo(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_rh_zo(mat4s proj, float deltaFar) {
|
|
||||||
mat4s dest;
|
|
||||||
dest = proj;
|
|
||||||
glm_persp_move_far_rh_zo(dest.raw, deltaFar);
|
|
||||||
return dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @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 )
|
|
||||||
* @returns result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
mat4s
|
|
||||||
glms_perspective_default_rh_zo(float aspect) {
|
|
||||||
mat4s dest;
|
|
||||||
glm_perspective_default_rh_zo(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 right-hand coordinate system and a
|
|
||||||
* clip-space of [0, 1].
|
|
||||||
*
|
|
||||||
* NOTE: if you dodn't want to create new matrix then use array api on struct.raw
|
|
||||||
* like glm_perspective_resize_rh_zo(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_rh_zo(mat4s proj, float aspect) {
|
|
||||||
mat4s dest;
|
|
||||||
dest = proj;
|
|
||||||
glm_perspective_resize_rh_zo(aspect, dest.raw);
|
|
||||||
return dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief decomposes frustum values of perspective projection.
|
|
||||||
* 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
|
|
||||||
glms_persp_decomp_rh_zo(mat4s proj,
|
|
||||||
float * __restrict nearZ, float * __restrict farZ,
|
|
||||||
float * __restrict top, float * __restrict bottom,
|
|
||||||
float * __restrict left, float * __restrict right) {
|
|
||||||
glm_persp_decomp_rh_zo(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 right-hand coordinate system and a
|
|
||||||
* clip-space of [0, 1].
|
|
||||||
*
|
|
||||||
* @param[in] proj perspective projection matrix
|
|
||||||
* @param[out] dest array
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glms_persp_decompv_rh_zo(mat4s proj, float dest[6]) {
|
|
||||||
glm_persp_decompv_rh_zo(proj.raw, dest);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief decomposes left and right values of perspective projection
|
|
||||||
* with a right-hand coordinate system and a
|
|
||||||
* clip-space of [0, 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_rh_zo(mat4s proj,
|
|
||||||
float * __restrict left,
|
|
||||||
float * __restrict right) {
|
|
||||||
glm_persp_decomp_x_rh_zo(proj.raw, left, right);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief decomposes top and bottom values of perspective projection
|
|
||||||
* with a right-hand coordinate system and a
|
|
||||||
* clip-space of [0, 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_rh_zo(mat4s proj,
|
|
||||||
float * __restrict top,
|
|
||||||
float * __restrict bottom) {
|
|
||||||
glm_persp_decomp_y_rh_zo(proj.raw, top, bottom);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief decomposes near and far values of perspective projection
|
|
||||||
* 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
|
|
||||||
glms_persp_decomp_z_rh_zo(mat4s proj,
|
|
||||||
float * __restrict nearZ,
|
|
||||||
float * __restrict farZ) {
|
|
||||||
glm_persp_decomp_z_rh_zo(proj.raw, nearZ, farZ);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief decomposes far value of perspective projection
|
|
||||||
* 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
|
|
||||||
glms_persp_decomp_far_rh_zo(mat4s proj, float * __restrict farZ) {
|
|
||||||
glm_persp_decomp_far_rh_zo(proj.raw, farZ);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief decomposes near value of perspective projection
|
|
||||||
* 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
|
|
||||||
glms_persp_decomp_near_rh_zo(mat4s proj, float * __restrict nearZ) {
|
|
||||||
glm_persp_decomp_near_rh_zo(proj.raw, nearZ);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @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
|
|
||||||
glms_persp_fovy_rh_zo(mat4s proj) {
|
|
||||||
return glm_persp_fovy_rh_zo(proj.raw);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @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
|
|
||||||
glms_persp_aspect_rh_zo(mat4s proj) {
|
|
||||||
return glm_persp_aspect_rh_zo(proj.raw);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @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)
|
|
||||||
* @returns sizes as vector, sizes order: [Wnear, Hnear, Wfar, Hfar]
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
vec4s
|
|
||||||
glms_persp_sizes_rh_zo(mat4s proj, float fovy) {
|
|
||||||
vec4s dest;
|
|
||||||
glm_persp_sizes_rh_zo(proj.raw, fovy, dest.raw);
|
|
||||||
return dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* cglms_persp_rh_zo_h */
|
|
||||||
@@ -1,88 +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_lookat_lh_no(vec3s eye, vec3s center, vec3s up)
|
|
||||||
CGLM_INLINE mat4s glms_look_lh_no(vec3s eye, vec3s dir, vec3s up)
|
|
||||||
CGLM_INLINE mat4s glms_look_anyup_lh_no(vec3s eye, vec3s dir)
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef cglms_view_lh_no_h
|
|
||||||
#define cglms_view_lh_no_h
|
|
||||||
|
|
||||||
#include "../../common.h"
|
|
||||||
#include "../../types-struct.h"
|
|
||||||
#include "../../plane.h"
|
|
||||||
#include "../../cam.h"
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief set up view matrix
|
|
||||||
* with a left-hand coordinate system and a
|
|
||||||
* clip-space of [-1, 1].
|
|
||||||
*
|
|
||||||
* 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
|
|
||||||
* @returns result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
mat4s
|
|
||||||
glms_lookat_lh_no(vec3s eye, vec3s center, vec3s up) {
|
|
||||||
mat4s dest;
|
|
||||||
glm_lookat_lh_no(eye.raw, center.raw, up.raw, dest.raw);
|
|
||||||
return dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief set up view matrix
|
|
||||||
* with a left-hand coordinate system and a
|
|
||||||
* clip-space of [-1, 1].
|
|
||||||
*
|
|
||||||
* 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
|
|
||||||
* @returns result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
mat4s
|
|
||||||
glms_look_lh_no(vec3s eye, vec3s dir, vec3s up) {
|
|
||||||
mat4s dest;
|
|
||||||
glm_look_lh_no(eye.raw, dir.raw, up.raw, dest.raw);
|
|
||||||
return dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief set up view matrix
|
|
||||||
* with a left-hand coordinate system and a
|
|
||||||
* clip-space of [-1, 1].
|
|
||||||
*
|
|
||||||
* 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
|
|
||||||
* @returns result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
mat4s
|
|
||||||
glms_look_anyup_lh_no(vec3s eye, vec3s dir) {
|
|
||||||
mat4s dest;
|
|
||||||
glm_look_anyup_lh_no(eye.raw, dir.raw, dest.raw);
|
|
||||||
return dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* cglms_view_lh_no_h */
|
|
||||||
@@ -1,88 +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_lookat_lh_zo(vec3s eye, vec3s center, vec3s up)
|
|
||||||
CGLM_INLINE mat4s glms_look_lh_zo(vec3s eye, vec3s dir, vec3s up)
|
|
||||||
CGLM_INLINE mat4s glms_look_anyup_lh_zo(vec3s eye, vec3s dir)
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef cglms_view_lh_zo_h
|
|
||||||
#define cglms_view_lh_zo_h
|
|
||||||
|
|
||||||
#include "../../common.h"
|
|
||||||
#include "../../types-struct.h"
|
|
||||||
#include "../../plane.h"
|
|
||||||
#include "../../cam.h"
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief set up view matrix
|
|
||||||
* with a left-hand coordinate system and a
|
|
||||||
* clip-space of [0, 1].
|
|
||||||
*
|
|
||||||
* 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
|
|
||||||
* @returns result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
mat4s
|
|
||||||
glms_lookat_lh_zo(vec3s eye, vec3s center, vec3s up) {
|
|
||||||
mat4s dest;
|
|
||||||
glm_lookat_lh_zo(eye.raw, center.raw, up.raw, dest.raw);
|
|
||||||
return dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief set up view matrix
|
|
||||||
* with a left-hand coordinate system and a
|
|
||||||
* clip-space of [0, 1].
|
|
||||||
*
|
|
||||||
* 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
|
|
||||||
* @returns result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
mat4s
|
|
||||||
glms_look_lh_zo(vec3s eye, vec3s dir, vec3s up) {
|
|
||||||
mat4s dest;
|
|
||||||
glm_look_lh_zo(eye.raw, dir.raw, up.raw, dest.raw);
|
|
||||||
return dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief set up view matrix
|
|
||||||
* with a left-hand coordinate system and a
|
|
||||||
* clip-space of [0, 1].
|
|
||||||
*
|
|
||||||
* 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
|
|
||||||
* @returns result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
mat4s
|
|
||||||
glms_look_anyup_lh_zo(vec3s eye, vec3s dir) {
|
|
||||||
mat4s dest;
|
|
||||||
glm_look_anyup_lh_zo(eye.raw, dir.raw, dest.raw);
|
|
||||||
return dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* cglms_view_lh_zo_h */
|
|
||||||
@@ -1,88 +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_lookat_rh_no(vec3s eye, vec3s center, vec3s up)
|
|
||||||
CGLM_INLINE mat4s glms_look_rh_no(vec3s eye, vec3s dir, vec3s up)
|
|
||||||
CGLM_INLINE mat4s glms_look_anyup_rh_no(vec3s eye, vec3s dir)
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef cglms_view_rh_no_h
|
|
||||||
#define cglms_view_rh_no_h
|
|
||||||
|
|
||||||
#include "../../common.h"
|
|
||||||
#include "../../types-struct.h"
|
|
||||||
#include "../../plane.h"
|
|
||||||
#include "../../cam.h"
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief set up view matrix
|
|
||||||
* with a right-hand coordinate system and a
|
|
||||||
* clip-space of [-1, 1].
|
|
||||||
*
|
|
||||||
* 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
|
|
||||||
* @returns result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
mat4s
|
|
||||||
glms_lookat_rh_no(vec3s eye, vec3s center, vec3s up) {
|
|
||||||
mat4s dest;
|
|
||||||
glm_lookat_rh_no(eye.raw, center.raw, up.raw, dest.raw);
|
|
||||||
return dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief set up view matrix
|
|
||||||
* with a right-hand coordinate system and a
|
|
||||||
* clip-space of [-1, 1].
|
|
||||||
*
|
|
||||||
* 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
|
|
||||||
* @returns result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
mat4s
|
|
||||||
glms_look_rh_no(vec3s eye, vec3s dir, vec3s up) {
|
|
||||||
mat4s dest;
|
|
||||||
glm_look_rh_no(eye.raw, dir.raw, up.raw, dest.raw);
|
|
||||||
return dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief set up view matrix
|
|
||||||
* with a right-hand coordinate system and a
|
|
||||||
* clip-space of [-1, 1].
|
|
||||||
*
|
|
||||||
* 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
|
|
||||||
* @returns result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
mat4s
|
|
||||||
glms_look_anyup_rh_no(vec3s eye, vec3s dir) {
|
|
||||||
mat4s dest;
|
|
||||||
glm_look_anyup_rh_no(eye.raw, dir.raw, dest.raw);
|
|
||||||
return dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* cglms_view_rh_no_h */
|
|
||||||
@@ -1,88 +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_lookat_rh_zo(vec3s eye, vec3s center, vec3s up)
|
|
||||||
CGLM_INLINE mat4s glms_look_rh_zo(vec3s eye, vec3s dir, vec3s up)
|
|
||||||
CGLM_INLINE mat4s glms_look_anyup_rh_zo(vec3s eye, vec3s dir)
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef cglms_view_rh_zo_h
|
|
||||||
#define cglms_view_rh_zo_h
|
|
||||||
|
|
||||||
#include "../../common.h"
|
|
||||||
#include "../../types-struct.h"
|
|
||||||
#include "../../plane.h"
|
|
||||||
#include "../../cam.h"
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief set up view matrix
|
|
||||||
* with a right-hand coordinate system and a
|
|
||||||
* clip-space of [0, 1].
|
|
||||||
*
|
|
||||||
* 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
|
|
||||||
* @returns result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
mat4s
|
|
||||||
glms_lookat_rh_zo(vec3s eye, vec3s center, vec3s up) {
|
|
||||||
mat4s dest;
|
|
||||||
glm_lookat_rh_zo(eye.raw, center.raw, up.raw, dest.raw);
|
|
||||||
return dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief set up view matrix
|
|
||||||
* with a right-hand coordinate system and a
|
|
||||||
* clip-space of [0, 1].
|
|
||||||
*
|
|
||||||
* 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
|
|
||||||
* @returns result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
mat4s
|
|
||||||
glms_look_rh_zo(vec3s eye, vec3s dir, vec3s up) {
|
|
||||||
mat4s dest;
|
|
||||||
glm_look_rh_zo(eye.raw, dir.raw, up.raw, dest.raw);
|
|
||||||
return dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief set up view matrix
|
|
||||||
* with a right-hand coordinate system and a
|
|
||||||
* clip-space of [0, 1].
|
|
||||||
*
|
|
||||||
* 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
|
|
||||||
* @returns result matrix
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
mat4s
|
|
||||||
glms_look_anyup_rh_zo(vec3s eye, vec3s dir) {
|
|
||||||
mat4s dest;
|
|
||||||
glm_look_anyup_rh_zo(eye.raw, dir.raw, dest.raw);
|
|
||||||
return dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* cglms_view_rh_zo_h */
|
|
||||||
@@ -101,20 +101,4 @@ glms_project(vec3s pos, mat4s m, vec4s vp) {
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief define a picking region
|
|
||||||
*
|
|
||||||
* @param[in] center center [x, y] of a picking region in window coordinates
|
|
||||||
* @param[in] size size [width, height] of the picking region in window coordinates
|
|
||||||
* @param[in] vp viewport as [x, y, width, height]
|
|
||||||
* @returns projected coordinates
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
mat4s
|
|
||||||
glms_pickmatrix(vec3s center, vec2s size, vec4s vp) {
|
|
||||||
mat4s res;
|
|
||||||
glm_pickmatrix(center.raw, size.raw, vp.raw, res.raw);
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* cglms_projects_h */
|
#endif /* cglms_projects_h */
|
||||||
|
|||||||
@@ -16,7 +16,6 @@
|
|||||||
CGLM_INLINE versors glms_quat_init(float x, float y, float z, float w)
|
CGLM_INLINE versors glms_quat_init(float x, float y, float z, float w)
|
||||||
CGLM_INLINE versors glms_quatv(float angle, vec3s axis)
|
CGLM_INLINE versors glms_quatv(float angle, vec3s axis)
|
||||||
CGLM_INLINE versors glms_quat(float angle, float x, float y, float z)
|
CGLM_INLINE versors glms_quat(float angle, float x, float y, float z)
|
||||||
CGLM_INLINE versors glms_quat_from_vecs(vec3s a, vec3s b)
|
|
||||||
CGLM_INLINE float glms_quat_norm(versors q)
|
CGLM_INLINE float glms_quat_norm(versors q)
|
||||||
CGLM_INLINE versors glms_quat_normalize(versors q)
|
CGLM_INLINE versors glms_quat_normalize(versors q)
|
||||||
CGLM_INLINE float glms_quat_dot(versors p, versors q)
|
CGLM_INLINE float glms_quat_dot(versors p, versors q)
|
||||||
@@ -35,7 +34,6 @@
|
|||||||
CGLM_INLINE mat3s glms_quat_mat3t(versors q)
|
CGLM_INLINE mat3s glms_quat_mat3t(versors q)
|
||||||
CGLM_INLINE versors glms_quat_lerp(versors from, versors to, float t)
|
CGLM_INLINE versors glms_quat_lerp(versors from, versors to, float t)
|
||||||
CGLM_INLINE versors glms_quat_lerpc(versors from, versors to, float t)
|
CGLM_INLINE versors glms_quat_lerpc(versors from, versors to, float t)
|
||||||
CGLM_INLINE versors glms_quat_nlerp(versors from, versors to, float t)
|
|
||||||
CGLM_INLINE versors glms_quat_slerp(versors from, versors to, float t)
|
CGLM_INLINE versors glms_quat_slerp(versors from, versors to, float t)
|
||||||
CGLM_INLINE mat4s. glms_quat_look(vec3s eye, versors ori)
|
CGLM_INLINE mat4s. glms_quat_look(vec3s eye, versors ori)
|
||||||
CGLM_INLINE versors glms_quat_for(vec3s dir, vec3s fwd, vec3s up)
|
CGLM_INLINE versors glms_quat_for(vec3s dir, vec3s fwd, vec3s up)
|
||||||
@@ -148,25 +146,10 @@ glms_quat(float angle, float x, float y, float z) {
|
|||||||
return dest;
|
return dest;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief compute quaternion rotating vector A to vector B
|
|
||||||
*
|
|
||||||
* @param[in] a vec3 (must have unit length)
|
|
||||||
* @param[in] b vec3 (must have unit length)
|
|
||||||
* @returns quaternion (of unit length)
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
versors
|
|
||||||
glms_quat_from_vecs(vec3s a, vec3s b) {
|
|
||||||
versors dest;
|
|
||||||
glm_quat_from_vecs(a.raw, b.raw, dest.raw);
|
|
||||||
return dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief returns norm (magnitude) of quaternion
|
* @brief returns norm (magnitude) of quaternion
|
||||||
*
|
*
|
||||||
* @param[in] q quaternion
|
* @param[out] q quaternion
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
float
|
float
|
||||||
@@ -418,24 +401,6 @@ glms_quat_lerpc(versors from, versors to, float t) {
|
|||||||
return dest;
|
return 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)
|
|
||||||
* @returns result quaternion
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
versors
|
|
||||||
glms_quat_nlerp(versors from, versors to, float t) {
|
|
||||||
versors dest;
|
|
||||||
glm_quat_nlerp(from.raw, to.raw, t, dest.raw);
|
|
||||||
return dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief interpolates between two quaternions
|
* @brief interpolates between two quaternions
|
||||||
* using spherical linear interpolation (SLERP)
|
* using spherical linear interpolation (SLERP)
|
||||||
|
|||||||
@@ -195,45 +195,4 @@ glms_vec2_sqrt(vec2s v) {
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief treat vectors as complex numbers and multiply them as such.
|
|
||||||
*
|
|
||||||
* @param[in] a left number
|
|
||||||
* @param[in] b right number
|
|
||||||
* @param[out] dest destination number
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
vec2s
|
|
||||||
glms_vec2_complex_mul(vec2s a, vec2s b, vec2s dest) {
|
|
||||||
glm_vec2_complex_mul(a.raw, b.raw, dest.raw);
|
|
||||||
return dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief treat vectors as complex numbers and divide them as such.
|
|
||||||
*
|
|
||||||
* @param[in] a left number (numerator)
|
|
||||||
* @param[in] b right number (denominator)
|
|
||||||
* @param[out] dest destination number
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
vec2s
|
|
||||||
glms_vec2_complex_div(vec2s a, vec2s b, vec2s dest) {
|
|
||||||
glm_vec2_complex_div(a.raw, b.raw, dest.raw);
|
|
||||||
return dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief treat the vector as a complex number and conjugate it as such.
|
|
||||||
*
|
|
||||||
* @param[in] a the number
|
|
||||||
* @param[out] dest destination number
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
vec2s
|
|
||||||
glms_vec2_complex_conjugate(vec2s a, vec2s dest) {
|
|
||||||
glm_vec2_complex_conjugate(a.raw, dest.raw);
|
|
||||||
return dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* cglms_vec2s_ext_h */
|
#endif /* cglms_vec2s_ext_h */
|
||||||
|
|||||||
@@ -47,21 +47,6 @@ typedef union vec2s {
|
|||||||
float x;
|
float x;
|
||||||
float y;
|
float y;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct {
|
|
||||||
float r;
|
|
||||||
float i;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct {
|
|
||||||
float u;
|
|
||||||
float v;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct {
|
|
||||||
float s;
|
|
||||||
float t;
|
|
||||||
};
|
|
||||||
#endif
|
#endif
|
||||||
} vec2s;
|
} vec2s;
|
||||||
|
|
||||||
@@ -73,40 +58,9 @@ typedef union vec3s {
|
|||||||
float y;
|
float y;
|
||||||
float z;
|
float z;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct {
|
|
||||||
float r;
|
|
||||||
float g;
|
|
||||||
float b;
|
|
||||||
};
|
|
||||||
#endif
|
#endif
|
||||||
} vec3s;
|
} vec3s;
|
||||||
|
|
||||||
typedef union ivec2s {
|
|
||||||
ivec2 raw;
|
|
||||||
#if CGLM_USE_ANONYMOUS_STRUCT
|
|
||||||
struct {
|
|
||||||
int x;
|
|
||||||
int y;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct {
|
|
||||||
int r;
|
|
||||||
int i;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct {
|
|
||||||
int u;
|
|
||||||
int v;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct {
|
|
||||||
int s;
|
|
||||||
int t;
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
} ivec2s;
|
|
||||||
|
|
||||||
typedef union ivec3s {
|
typedef union ivec3s {
|
||||||
ivec3 raw;
|
ivec3 raw;
|
||||||
#if CGLM_USE_ANONYMOUS_STRUCT
|
#if CGLM_USE_ANONYMOUS_STRUCT
|
||||||
@@ -115,34 +69,9 @@ typedef union ivec3s {
|
|||||||
int y;
|
int y;
|
||||||
int z;
|
int z;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct {
|
|
||||||
int r;
|
|
||||||
int g;
|
|
||||||
int b;
|
|
||||||
};
|
|
||||||
#endif
|
#endif
|
||||||
} ivec3s;
|
} ivec3s;
|
||||||
|
|
||||||
typedef union ivec4s {
|
|
||||||
ivec4 raw;
|
|
||||||
#if CGLM_USE_ANONYMOUS_STRUCT
|
|
||||||
struct {
|
|
||||||
int x;
|
|
||||||
int y;
|
|
||||||
int z;
|
|
||||||
int w;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct {
|
|
||||||
int r;
|
|
||||||
int g;
|
|
||||||
int b;
|
|
||||||
int a;
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
} ivec4s;
|
|
||||||
|
|
||||||
typedef union CGLM_ALIGN_IF(16) vec4s {
|
typedef union CGLM_ALIGN_IF(16) vec4s {
|
||||||
vec4 raw;
|
vec4 raw;
|
||||||
#if CGLM_USE_ANONYMOUS_STRUCT
|
#if CGLM_USE_ANONYMOUS_STRUCT
|
||||||
@@ -152,13 +81,6 @@ typedef union CGLM_ALIGN_IF(16) vec4s {
|
|||||||
float z;
|
float z;
|
||||||
float w;
|
float w;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct {
|
|
||||||
float r;
|
|
||||||
float g;
|
|
||||||
float b;
|
|
||||||
float a;
|
|
||||||
};
|
|
||||||
#endif
|
#endif
|
||||||
} vec4s;
|
} vec4s;
|
||||||
|
|
||||||
|
|||||||
@@ -42,12 +42,9 @@
|
|||||||
#define CGLM_CASTPTR_ASSUME_ALIGNED(expr, type) \
|
#define CGLM_CASTPTR_ASSUME_ALIGNED(expr, type) \
|
||||||
((type*)CGLM_ASSUME_ALIGNED((expr), __alignof__(type)))
|
((type*)CGLM_ASSUME_ALIGNED((expr), __alignof__(type)))
|
||||||
|
|
||||||
typedef int ivec2[2];
|
|
||||||
typedef int ivec3[3];
|
|
||||||
typedef int ivec4[4];
|
|
||||||
|
|
||||||
typedef float vec2[2];
|
typedef float vec2[2];
|
||||||
typedef float vec3[3];
|
typedef float vec3[3];
|
||||||
|
typedef int ivec3[3];
|
||||||
typedef CGLM_ALIGN_IF(16) float vec4[4];
|
typedef CGLM_ALIGN_IF(16) float vec4[4];
|
||||||
typedef vec4 versor; /* |x, y, z, w| -> w is the last */
|
typedef vec4 versor; /* |x, y, z, w| -> w is the last */
|
||||||
typedef vec3 mat3[3];
|
typedef vec3 mat3[3];
|
||||||
|
|||||||
@@ -20,9 +20,6 @@
|
|||||||
CGLM_INLINE bool glm_vec2_isvalid(vec2 v);
|
CGLM_INLINE bool glm_vec2_isvalid(vec2 v);
|
||||||
CGLM_INLINE void glm_vec2_sign(vec2 v, vec2 dest);
|
CGLM_INLINE void glm_vec2_sign(vec2 v, vec2 dest);
|
||||||
CGLM_INLINE void glm_vec2_sqrt(vec2 v, vec2 dest);
|
CGLM_INLINE void glm_vec2_sqrt(vec2 v, vec2 dest);
|
||||||
CGLM_INLINE void glm_vec2_complex_mul(vec2 a, vec2 b, vec2 dest)
|
|
||||||
CGLM_INLINE void glm_vec2_complex_div(vec2 a, vec2 b, vec2 dest)
|
|
||||||
CGLM_INLINE void glm_vec2_complex_conjugate(vec2 a, vec2 dest)
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef cglm_vec2_ext_h
|
#ifndef cglm_vec2_ext_h
|
||||||
@@ -189,53 +186,4 @@ glm_vec2_sqrt(vec2 v, vec2 dest) {
|
|||||||
dest[1] = sqrtf(v[1]);
|
dest[1] = sqrtf(v[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief treat vectors as complex numbers and multiply them as such.
|
|
||||||
*
|
|
||||||
* @param[in] a left number
|
|
||||||
* @param[in] b right number
|
|
||||||
* @param[out] dest destination number
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_vec2_complex_mul(vec2 a, vec2 b, vec2 dest) {
|
|
||||||
float tr, ti;
|
|
||||||
tr = a[0] * b[0] - a[1] * b[1];
|
|
||||||
ti = a[0] * b[1] + a[1] * b[0];
|
|
||||||
dest[0] = tr;
|
|
||||||
dest[1] = ti;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief treat vectors as complex numbers and divide them as such.
|
|
||||||
*
|
|
||||||
* @param[in] a left number (numerator)
|
|
||||||
* @param[in] b right number (denominator)
|
|
||||||
* @param[out] dest destination number
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_vec2_complex_div(vec2 a, vec2 b, vec2 dest) {
|
|
||||||
float tr, ti;
|
|
||||||
float const ibnorm2 = 1.0f / (b[0] * b[0] + b[1] * b[1]);
|
|
||||||
tr = ibnorm2 * (a[0] * b[0] + a[1] * b[1]);
|
|
||||||
ti = ibnorm2 * (a[1] * b[0] - a[0] * b[1]);
|
|
||||||
dest[0] = tr;
|
|
||||||
dest[1] = ti;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief treat the vector as a complex number and conjugate it as such.
|
|
||||||
*
|
|
||||||
* @param[in] a the number
|
|
||||||
* @param[out] dest destination number
|
|
||||||
*/
|
|
||||||
CGLM_INLINE
|
|
||||||
void
|
|
||||||
glm_vec2_complex_conjugate(vec2 a, vec2 dest) {
|
|
||||||
dest[0] = a[0];
|
|
||||||
dest[1] = -a[1];
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* cglm_vec2_ext_h */
|
#endif /* cglm_vec2_ext_h */
|
||||||
|
|||||||
@@ -237,9 +237,9 @@ glm_vec3_abs(vec3 v, vec3 dest) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec3_fract(vec3 v, vec3 dest) {
|
glm_vec3_fract(vec3 v, vec3 dest) {
|
||||||
dest[0] = fminf(v[0] - floorf(v[0]), 0.999999940395355224609375f);
|
dest[0] = fminf(v[0] - floorf(v[0]), 0x1.fffffep-1f);
|
||||||
dest[1] = fminf(v[1] - floorf(v[1]), 0.999999940395355224609375f);
|
dest[1] = fminf(v[1] - floorf(v[1]), 0x1.fffffep-1f);
|
||||||
dest[2] = fminf(v[2] - floorf(v[2]), 0.999999940395355224609375f);
|
dest[2] = fminf(v[2] - floorf(v[2]), 0x1.fffffep-1f);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
|||||||
@@ -578,12 +578,10 @@ glm_vec3_normalize_to(vec3 v, vec3 dest) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec3_cross(vec3 a, vec3 b, vec3 dest) {
|
glm_vec3_cross(vec3 a, vec3 b, vec3 dest) {
|
||||||
vec3 c;
|
|
||||||
/* (u2.v3 - u3.v2, u3.v1 - u1.v3, u1.v2 - u2.v1) */
|
/* (u2.v3 - u3.v2, u3.v1 - u1.v3, u1.v2 - u2.v1) */
|
||||||
c[0] = a[1] * b[2] - a[2] * b[1];
|
dest[0] = a[1] * b[2] - a[2] * b[1];
|
||||||
c[1] = a[2] * b[0] - a[0] * b[2];
|
dest[1] = a[2] * b[0] - a[0] * b[2];
|
||||||
c[2] = a[0] * b[1] - a[1] * b[0];
|
dest[2] = a[0] * b[1] - a[1] * b[0];
|
||||||
glm_vec3_copy(c, dest);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -809,10 +807,9 @@ glm_vec3_minv(vec3 a, vec3 b, vec3 dest) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec3_ortho(vec3 v, vec3 dest) {
|
glm_vec3_ortho(vec3 v, vec3 dest) {
|
||||||
float ignore;
|
dest[0] = v[1] - v[2];
|
||||||
float f = modff(fabsf(v[0]) + 0.5f, &ignore);
|
dest[1] = v[2] - v[0];
|
||||||
vec3 result = {-v[1], v[0] - f * v[2], f * v[1]};
|
dest[2] = v[0] - v[1];
|
||||||
glm_vec3_copy(result, dest);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
|||||||
@@ -224,10 +224,10 @@ glm_vec4_sign(vec4 v, vec4 dest) {
|
|||||||
|
|
||||||
x0 = glmm_load(v);
|
x0 = glmm_load(v);
|
||||||
x1 = _mm_set_ps(0.0f, 0.0f, 1.0f, -1.0f);
|
x1 = _mm_set_ps(0.0f, 0.0f, 1.0f, -1.0f);
|
||||||
x2 = glmm_splat(x1, 2);
|
x2 = glmm_shuff1x(x1, 2);
|
||||||
|
|
||||||
x3 = _mm_and_ps(_mm_cmpgt_ps(x0, x2), glmm_splat(x1, 1));
|
x3 = _mm_and_ps(_mm_cmpgt_ps(x0, x2), glmm_shuff1x(x1, 1));
|
||||||
x4 = _mm_and_ps(_mm_cmplt_ps(x0, x2), glmm_splat(x1, 0));
|
x4 = _mm_and_ps(_mm_cmplt_ps(x0, x2), glmm_shuff1x(x1, 0));
|
||||||
|
|
||||||
glmm_store(dest, _mm_or_ps(x3, x4));
|
glmm_store(dest, _mm_or_ps(x3, x4));
|
||||||
#else
|
#else
|
||||||
@@ -268,10 +268,10 @@ glm_vec4_abs(vec4 v, vec4 dest) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec4_fract(vec4 v, vec4 dest) {
|
glm_vec4_fract(vec4 v, vec4 dest) {
|
||||||
dest[0] = fminf(v[0] - floorf(v[0]), 0.999999940395355224609375f);
|
dest[0] = fminf(v[0] - floorf(v[0]), 0x1.fffffep-1f);
|
||||||
dest[1] = fminf(v[1] - floorf(v[1]), 0.999999940395355224609375f);
|
dest[1] = fminf(v[1] - floorf(v[1]), 0x1.fffffep-1f);
|
||||||
dest[2] = fminf(v[2] - floorf(v[2]), 0.999999940395355224609375f);
|
dest[2] = fminf(v[2] - floorf(v[2]), 0x1.fffffep-1f);
|
||||||
dest[3] = fminf(v[3] - floorf(v[3]), 0.999999940395355224609375f);
|
dest[3] = fminf(v[3] - floorf(v[3]), 0x1.fffffep-1f);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
|||||||
@@ -473,8 +473,8 @@ glm_vec4_scale_as(vec4 v, float s, vec4 dest) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec4_div(vec4 a, vec4 b, vec4 dest) {
|
glm_vec4_div(vec4 a, vec4 b, vec4 dest) {
|
||||||
#if defined(CGLM_SIMD)
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
glmm_store(dest, glmm_div(glmm_load(a), glmm_load(b)));
|
glmm_store(dest, _mm_div_ps(glmm_load(a), glmm_load(b)));
|
||||||
#else
|
#else
|
||||||
dest[0] = a[0] / b[0];
|
dest[0] = a[0] / b[0];
|
||||||
dest[1] = a[1] / b[1];
|
dest[1] = a[1] / b[1];
|
||||||
@@ -568,8 +568,14 @@ glm_vec4_subadd(vec4 a, vec4 b, vec4 dest) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec4_muladd(vec4 a, vec4 b, vec4 dest) {
|
glm_vec4_muladd(vec4 a, vec4 b, vec4 dest) {
|
||||||
#if defined(CGLM_SIMD)
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
glmm_store(dest, glmm_fmadd(glmm_load(a), glmm_load(b), glmm_load(dest)));
|
glmm_store(dest, _mm_add_ps(glmm_load(dest),
|
||||||
|
_mm_mul_ps(glmm_load(a),
|
||||||
|
glmm_load(b))));
|
||||||
|
#elif defined(CGLM_NEON_FP)
|
||||||
|
vst1q_f32(dest, vaddq_f32(vld1q_f32(dest),
|
||||||
|
vmulq_f32(vld1q_f32(a),
|
||||||
|
vld1q_f32(b))));
|
||||||
#else
|
#else
|
||||||
dest[0] += a[0] * b[0];
|
dest[0] += a[0] * b[0];
|
||||||
dest[1] += a[1] * b[1];
|
dest[1] += a[1] * b[1];
|
||||||
@@ -590,8 +596,14 @@ glm_vec4_muladd(vec4 a, vec4 b, vec4 dest) {
|
|||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
glm_vec4_muladds(vec4 a, float s, vec4 dest) {
|
glm_vec4_muladds(vec4 a, float s, vec4 dest) {
|
||||||
#if defined(CGLM_SIMD)
|
#if defined( __SSE__ ) || defined( __SSE2__ )
|
||||||
glmm_store(dest, glmm_fmadd(glmm_load(a), glmm_set1(s), glmm_load(dest)));
|
glmm_store(dest, _mm_add_ps(glmm_load(dest),
|
||||||
|
_mm_mul_ps(glmm_load(a),
|
||||||
|
_mm_set1_ps(s))));
|
||||||
|
#elif defined(CGLM_NEON_FP)
|
||||||
|
vst1q_f32(dest, vaddq_f32(vld1q_f32(dest),
|
||||||
|
vmulq_f32(vld1q_f32(a),
|
||||||
|
vdupq_n_f32(s))));
|
||||||
#else
|
#else
|
||||||
dest[0] += a[0] * s;
|
dest[0] += a[0] * s;
|
||||||
dest[1] += a[1] * s;
|
dest[1] += a[1] * s;
|
||||||
|
|||||||
@@ -10,6 +10,6 @@
|
|||||||
|
|
||||||
#define CGLM_VERSION_MAJOR 0
|
#define CGLM_VERSION_MAJOR 0
|
||||||
#define CGLM_VERSION_MINOR 8
|
#define CGLM_VERSION_MINOR 8
|
||||||
#define CGLM_VERSION_PATCH 5
|
#define CGLM_VERSION_PATCH 0
|
||||||
|
|
||||||
#endif /* cglm_version_h */
|
#endif /* cglm_version_h */
|
||||||
|
|||||||
30
meson.build
30
meson.build
@@ -1,5 +1,5 @@
|
|||||||
project('cglm', 'c',
|
project('cglm', 'c',
|
||||||
version : '0.8.5',
|
version : '0.8.0',
|
||||||
license : 'mit',
|
license : 'mit',
|
||||||
default_options : [
|
default_options : [
|
||||||
'c_std=c11',
|
'c_std=c11',
|
||||||
@@ -48,28 +48,14 @@ cglm_src = files(
|
|||||||
'src/sphere.c',
|
'src/sphere.c',
|
||||||
'src/vec2.c',
|
'src/vec2.c',
|
||||||
'src/vec3.c',
|
'src/vec3.c',
|
||||||
'src/vec4.c',
|
'src/vec4.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',
|
|
||||||
)
|
)
|
||||||
|
|
||||||
cglm_lib = library('cglm',
|
cglm_lib = library('cglm',
|
||||||
cglm_src,
|
cglm_src,
|
||||||
install : cglm_install,
|
install : cglm_install,
|
||||||
dependencies : cglm_deps,
|
dependencies : cglm_deps,
|
||||||
c_args : [ build_args, cglm_args ],
|
c_args : [ build_args, cglm_args ]
|
||||||
version : meson.project_version(),
|
|
||||||
soversion : '0'
|
|
||||||
)
|
)
|
||||||
|
|
||||||
cglm_dep = declare_dependency(
|
cglm_dep = declare_dependency(
|
||||||
@@ -102,17 +88,13 @@ if get_option('build_tests') == true
|
|||||||
|
|
||||||
test_src = files(
|
test_src = files(
|
||||||
'test/runner.c',
|
'test/runner.c',
|
||||||
|
'test/src/test_euler.c',
|
||||||
'test/src/test_bezier.c',
|
'test/src/test_bezier.c',
|
||||||
'test/src/test_cam.c',
|
'test/src/test_cam.c',
|
||||||
'test/src/test_cam_lh_no.c',
|
'test/src/test_struct.c',
|
||||||
'test/src/test_cam_lh_zo.c',
|
|
||||||
'test/src/test_cam_rh_no.c',
|
|
||||||
'test/src/test_cam_rh_zo.c',
|
|
||||||
'test/src/test_clamp.c',
|
'test/src/test_clamp.c',
|
||||||
'test/src/test_common.c',
|
'test/src/test_common.c',
|
||||||
'test/src/test_euler.c',
|
'test/src/tests.c'
|
||||||
'test/src/tests.c',
|
|
||||||
'test/src/test_struct.c',
|
|
||||||
)
|
)
|
||||||
|
|
||||||
test_exe = executable('tests',
|
test_exe = executable('tests',
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user